//@ run-rustfix #![allow(dead_code, mismatched_lifetime_syntaxes)] #![deny(no_mangle_generic_items)] #[export_name = "foo"] pub fn foo() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "bar"] pub extern "C" fn bar() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "baz"] pub fn baz(x: &i32) -> &i32 { x } #[export_name = "qux"] pub fn qux<'a>(x: &'a i32) -> &i32 { x } pub struct Foo; impl Foo { #[export_name = "foo"] pub fn foo() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "bar"] pub extern "C" fn bar() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "baz"] pub fn baz(x: &i32) -> &i32 { x } #[export_name = "qux"] pub fn qux<'a>(x: &'a i32) -> &i32 { x } } trait Trait1 { fn foo(); extern "C" fn bar(); fn baz(x: &i32) -> &i32; fn qux<'a>(x: &'a i32) -> &i32; } impl Trait1 for Foo { #[export_name = "foo"] fn foo() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "bar"] extern "C" fn bar() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "baz"] fn baz(x: &i32) -> &i32 { x } #[export_name = "qux"] fn qux<'a>(x: &'a i32) -> &i32 { x } } trait Trait2 { fn foo(); fn foo2(); extern "C" fn bar(); fn baz(x: &i32) -> &i32; fn qux<'a>(x: &'a i32) -> &i32; } impl Trait2 for Foo { #[export_name = "foo"] fn foo() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "foo2"] fn foo2() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "baz"] extern "C" fn bar() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "baz"] fn baz(x: &i32) -> &i32 { x } //~ ERROR functions generic over types or consts must be mangled #[export_name = "qux"] fn qux<'a>(x: &'a i32) -> &i32 { x } //~ ERROR functions generic over types or consts must be mangled } pub struct Bar(#[allow(dead_code)] T); impl Bar { #[export_name = "foo"] pub fn foo() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "bar"] pub extern "C" fn bar() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "baz"] pub fn baz() {} //~ ERROR functions generic over types or consts must be mangled } impl Bar { #[export_name = "qux"] pub fn qux() {} } trait Trait3 { fn foo(); extern "C" fn bar(); fn baz(); } impl Trait3 for Bar { #[export_name = "foo"] fn foo() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "bar"] extern "C" fn bar() {} //~ ERROR functions generic over types or consts must be mangled #[export_name = "baz"] fn baz() {} //~ ERROR functions generic over types or consts must be mangled } pub struct Baz<'a>(#[allow(dead_code)] &'a i32); impl<'a> Baz<'a> { #[export_name = "foo"] pub fn foo() {} #[export_name = "bar"] pub fn bar<'b>(x: &'b i32) -> &i32 { x } } trait Trait4 { fn foo(); fn bar<'a>(x: &'a i32) -> &i32; } impl Trait4 for Bar { #[export_name = "foo"] fn foo() {} #[export_name = "bar"] fn bar<'b>(x: &'b i32) -> &i32 { x } } impl<'a> Trait4 for Baz<'a> { #[export_name = "foo"] fn foo() {} #[export_name = "bar"] fn bar<'b>(x: &'b i32) -> &i32 { x } } trait Trait5 { fn foo(); } impl Trait5 for Foo { #[export_name = "foo"] fn foo() {} } impl Trait5 for Bar { #[export_name = "foo"] fn foo() {} } fn main() {}