//@ compile-flags: -Zunstable-options -Csymbol-mangling-version=v0 #![crate_type = "sdylib"] #![allow(incomplete_features, improper_ctypes_definitions)] #![feature(export_stable)] #![feature(inherent_associated_types)] mod m { #[export_stable] pub struct S; //~^ ERROR private items are not exportable pub fn foo() -> i32 { 0 } //~^ ERROR only functions with "C" ABI are exportable } #[export_stable] pub use m::foo; #[export_stable] pub mod m1 { #[repr(C)] pub struct S1; // OK, public type with stable repr struct S2; pub struct S3; //~^ ERROR types with unstable layout are not exportable } pub mod fn_sig { #[export_stable] pub fn foo1() {} //~^ ERROR only functions with "C" ABI are exportable #[export_stable] #[repr(C)] pub struct S; #[export_stable] pub extern "C" fn foo2(x: S) -> i32 { 0 } #[export_stable] pub extern "C" fn foo3(x: Box) -> i32 { 0 } //~^ ERROR function with `#[export_stable]` attribute uses type `Box`, which is not exportable } pub mod impl_item { pub struct S; impl S { #[export_stable] pub extern "C" fn foo1(&self) -> i32 { 0 } //~^ ERROR method with `#[export_stable]` attribute uses type `&impl_item::S`, which is not exportable #[export_stable] pub extern "C" fn foo2(self) -> i32 { 0 } //~^ ERROR method with `#[export_stable]` attribute uses type `impl_item::S`, which is not exportable } pub struct S2(T); impl S2 { #[export_stable] pub extern "C" fn foo1(&self) {} //~^ ERROR generic functions are not exportable } } pub mod tys { pub trait Trait { type Type; } pub struct S; impl Trait for S { type Type = (u32,); } #[export_stable] pub extern "C" fn foo1(x: ::Type) -> u32 { x.0 } //~^ ERROR function with `#[export_stable]` attribute uses type `(u32,)`, which is not exportable #[export_stable] pub type Type = [i32; 4]; #[export_stable] pub extern "C" fn foo2(_x: Type) {} //~^ ERROR function with `#[export_stable]` attribute uses type `[i32; 4]`, which is not exportable impl S { #[export_stable] pub type Type = extern "C" fn(); } #[export_stable] pub extern "C" fn foo3(_x: S::Type) {} //~^ ERROR function with `#[export_stable]` attribute uses type `extern "C" fn()`, which is not exportable #[export_stable] pub extern "C" fn foo4() -> impl Copy { //~^ ERROR function with `#[export_stable]` attribute uses type `impl Copy`, which is not exportable 0 } } pub mod privacy { #[export_stable] #[repr(C)] pub struct S1 { pub x: i32 } #[export_stable] #[repr(C)] pub struct S2 { //~^ ERROR ADT types with private fields are not exportable x: i32 } #[export_stable] #[repr(i32)] enum E { //~^ ERROR private items are not exportable Variant1 { x: i32 } } } pub mod use_site { #[export_stable] pub trait Trait {} //~^ ERROR trait's are not exportable #[export_stable] pub const C: i32 = 0; //~^ ERROR constant's are not exportable } fn main() {}