| // Test for https://github.com/rust-lang/rust/issues/86232 |
| // Due to AST-to-HIR lowering nuances, we used to allow unsupported ABIs to "leak" into the HIR |
| // without being checked, as we would check after generating the ExternAbi. |
| // Checking afterwards only works if we examine every HIR construct that contains an ExternAbi, |
| // and those may be very different in HIR, even if they read the same in source. |
| // This made it very easy to make mistakes. |
| // |
| // Here we test that an unsupported ABI in various impl-related positions will be rejected, |
| // both in the original declarations and the actual implementations. |
| |
| #![feature(rustc_attrs)] |
| //@ compile-flags: --crate-type lib |
| |
| pub struct FnPtrBearer { |
| pub ptr: extern "rust-invalid" fn(), |
| //~^ ERROR: is not a supported ABI |
| } |
| |
| impl FnPtrBearer { |
| pub extern "rust-invalid" fn inherent_fn(self) { |
| //~^ ERROR: is not a supported ABI |
| (self.ptr)() |
| } |
| } |
| |
| pub trait Trait { |
| extern "rust-invalid" fn trait_fn(self); |
| //~^ ERROR: is not a supported ABI |
| } |
| |
| impl Trait for FnPtrBearer { |
| extern "rust-invalid" fn trait_fn(self) { |
| //~^ ERROR: is not a supported ABI |
| self.inherent_fn() |
| } |
| } |