1 #![feature(rustc_private)]
3 #![allow(private_in_public)]
4 #![deny(improper_ctypes_definitions)]
8 use std::default::Default;
9 use std::marker::PhantomData;
11 trait Mirror { type It: ?Sized; }
13 impl<T: ?Sized> Mirror for T { type It = Self; }
16 pub struct StructWithProjection(*mut <StructWithProjection as Mirror>::It);
19 pub struct StructWithProjectionAndLifetime<'a>(
20 &'a mut <StructWithProjectionAndLifetime<'a> as Mirror>::It
23 pub type I32Pair = (i32, i32);
28 pub type RustFn = fn();
30 pub type RustBadRet = extern "C" fn() -> Box<u32>;
32 pub type CVoidRet = ();
37 pub struct TransparentI128(i128);
40 pub struct TransparentStr(&'static str);
43 pub struct TransparentBadFn(RustBadRet);
46 pub struct TransparentInt(u32);
49 pub struct TransparentRef<'a>(&'a TransparentInt);
52 pub struct TransparentLifetime<'a>(*const u8, PhantomData<&'a ()>);
55 pub struct TransparentUnit<U>(f32, PhantomData<U>);
58 pub struct TransparentCustomZst(i32, ZeroSize);
61 pub struct ZeroSizeWithPhantomData(PhantomData<i32>);
63 pub extern "C" fn ptr_type1(size: *const Foo) { }
65 pub extern "C" fn ptr_type2(size: *const Foo) { }
67 pub extern "C" fn slice_type(p: &[u32]) { }
68 //~^ ERROR: uses type `[u32]`
70 pub extern "C" fn str_type(p: &str) { }
71 //~^ ERROR: uses type `str`
73 pub extern "C" fn box_type(p: Box<u32>) { }
75 pub extern "C" fn opt_box_type(p: Option<Box<u32>>) { }
77 pub extern "C" fn char_type(p: char) { }
78 //~^ ERROR uses type `char`
80 pub extern "C" fn i128_type(p: i128) { }
81 //~^ ERROR uses type `i128`
83 pub extern "C" fn u128_type(p: u128) { }
84 //~^ ERROR uses type `u128`
86 pub extern "C" fn tuple_type(p: (i32, i32)) { }
87 //~^ ERROR uses type `(i32, i32)`
89 pub extern "C" fn tuple_type2(p: I32Pair) { }
90 //~^ ERROR uses type `(i32, i32)`
92 pub extern "C" fn zero_size(p: ZeroSize) { }
93 //~^ ERROR uses type `ZeroSize`
95 pub extern "C" fn zero_size_phantom(p: ZeroSizeWithPhantomData) { }
96 //~^ ERROR uses type `ZeroSizeWithPhantomData`
98 pub extern "C" fn zero_size_phantom_toplevel() -> PhantomData<bool> {
99 //~^ ERROR uses type `PhantomData<bool>`
103 pub extern "C" fn fn_type(p: RustFn) { }
104 //~^ ERROR uses type `fn()`
106 pub extern "C" fn fn_type2(p: fn()) { }
107 //~^ ERROR uses type `fn()`
109 pub extern "C" fn fn_contained(p: RustBadRet) { }
111 pub extern "C" fn transparent_i128(p: TransparentI128) { }
112 //~^ ERROR: uses type `i128`
114 pub extern "C" fn transparent_str(p: TransparentStr) { }
115 //~^ ERROR: uses type `str`
117 pub extern "C" fn transparent_fn(p: TransparentBadFn) { }
119 pub extern "C" fn good3(fptr: Option<extern "C" fn()>) { }
121 pub extern "C" fn good4(aptr: &[u8; 4 as usize]) { }
123 pub extern "C" fn good5(s: StructWithProjection) { }
125 pub extern "C" fn good6(s: StructWithProjectionAndLifetime) { }
127 pub extern "C" fn good7(fptr: extern "C" fn() -> ()) { }
129 pub extern "C" fn good8(fptr: extern "C" fn() -> !) { }
131 pub extern "C" fn good9() -> () { }
133 pub extern "C" fn good10() -> CVoidRet { }
135 pub extern "C" fn good11(size: isize) { }
137 pub extern "C" fn good12(size: usize) { }
139 pub extern "C" fn good13(n: TransparentInt) { }
141 pub extern "C" fn good14(p: TransparentRef) { }
143 pub extern "C" fn good15(p: TransparentLifetime) { }
145 pub extern "C" fn good16(p: TransparentUnit<ZeroSize>) { }
147 pub extern "C" fn good17(p: TransparentCustomZst) { }
149 #[allow(improper_ctypes_definitions)]
150 pub extern "C" fn good18(_: &String) { }
152 #[cfg(not(target_arch = "wasm32"))]
153 pub extern "C" fn good1(size: *const libc::c_int) { }
155 #[cfg(not(target_arch = "wasm32"))]
156 pub extern "C" fn good2(size: *const libc::c_uint) { }
158 pub extern "C" fn unused_generic1<T>(size: *const Foo) { }
160 pub extern "C" fn unused_generic2<T>() -> PhantomData<bool> {
161 //~^ ERROR uses type `PhantomData<bool>`
165 pub extern "C" fn used_generic1<T>(x: T) { }
167 pub extern "C" fn used_generic2<T>(x: T, size: *const Foo) { }
169 pub extern "C" fn used_generic3<T: Default>() -> T {
173 pub extern "C" fn used_generic4<T>(x: Vec<T>) { }
174 //~^ ERROR: uses type `Vec<T>`
176 pub extern "C" fn used_generic5<T>() -> Vec<T> {
177 //~^ ERROR: uses type `Vec<T>`