diff --git a/src/test/ui/lint/lint-ctypes-66202.rs b/src/test/ui/lint/lint-ctypes-66202.rs new file mode 100644 index 0000000000000..df8170d8d968c --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-66202.rs @@ -0,0 +1,17 @@ +#![deny(improper_ctypes)] + +// This test checks that return types are normalized before being checked for FFI-safety, and that +// transparent newtype wrappers are FFI-safe if the type being wrapped is FFI-safe. + +#[repr(transparent)] +pub struct W(T); + +extern "C" { + pub fn bare() -> (); + pub fn normalize() -> <() as ToOwned>::Owned; + //~^ ERROR uses type `()` + pub fn transparent() -> W<()>; + //~^ ERROR uses type `W<()>` +} + +fn main() {} diff --git a/src/test/ui/lint/lint-ctypes-66202.stderr b/src/test/ui/lint/lint-ctypes-66202.stderr new file mode 100644 index 0000000000000..3268d4cefbf4d --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-66202.stderr @@ -0,0 +1,29 @@ +error: `extern` block uses type `()`, which is not FFI-safe + --> $DIR/lint-ctypes-66202.rs:11:27 + | +LL | pub fn normalize() -> <() as ToOwned>::Owned; + | ^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | +note: the lint level is defined here + --> $DIR/lint-ctypes-66202.rs:1:9 + | +LL | #![deny(improper_ctypes)] + | ^^^^^^^^^^^^^^^ + = help: consider using a struct instead + = note: tuples have unspecified layout + +error: `extern` block uses type `W<()>`, which is not FFI-safe + --> $DIR/lint-ctypes-66202.rs:13:29 + | +LL | pub fn transparent() -> W<()>; + | ^^^^^ not FFI-safe + | + = note: composed only of `PhantomData` +note: the type is defined here + --> $DIR/lint-ctypes-66202.rs:7:1 + | +LL | pub struct W(T); + | ^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors +