| An externally implementable item is not compatible with its declaration. | |
| Erroneous code example: | |
| ```rust,edition2021,compile_fail,E0806 | |
| #![feature(extern_item_impls)] | |
| #[eii(foo)] | |
| fn x(); | |
| #[foo] | |
| fn y(a: u64) -> u64 { | |
| //~^ ERROR E0806 | |
| a | |
| } | |
| fn main() {} | |
| ``` | |
| The error here is caused by the fact that `y` implements the | |
| externally implementable item `foo`. | |
| It can only do so if the signature of the implementation `y` matches | |
| that of the declaration of `foo`. | |
| So, to fix this, `y`'s signature must be changed to match that of `x`: | |
| ```rust,edition2021 | |
| #![feature(extern_item_impls)] | |
| #[eii(foo)] | |
| fn x(); | |
| #[foo] | |
| fn y() {} | |
| fn main() {} | |
| ``` | |
| One common way this can be triggered is by using the wrong | |
| signature for `#[panic_handler]`. | |
| The signature is provided by `core`. | |
| ```rust,edition2021,ignore | |
| #![no_std] | |
| #[panic_handler] | |
| fn on_panic() -> ! { | |
| //~^ ERROR E0806 | |
| loop {} | |
| } | |
| fn main() {} | |
| ``` | |
| Should be: | |
| ```rust,edition2021,ignore | |
| #![no_std] | |
| #[panic_handler] | |
| fn on_panic(info: &core::panic::PanicInfo<'_>) -> ! { | |
| loop {} | |
| } | |
| fn main() {} | |
| ``` |