about summary refs log tree commit diff
path: root/src/test/ui
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2019-09-10 18:16:35 +0100
committervarkor <github@varkor.com>2019-09-10 18:16:35 +0100
commitdf7e496f855331acd0cb9c6133a77197cd6118cf (patch)
tree82b6cc93c156895bf01fee74df35d3fa05693c2e /src/test/ui
parent740dd4bf056b18e198af5ae242b2eb49b94861d7 (diff)
downloadrust-df7e496f855331acd0cb9c6133a77197cd6118cf.tar.gz
rust-df7e496f855331acd0cb9c6133a77197cd6118cf.zip
Forbid opaque types in extern blocks
Diffstat (limited to 'src/test/ui')
-rw-r--r--src/test/ui/lint/opaque-ty-ffi-unsafe.rs16
-rw-r--r--src/test/ui/lint/opaque-ty-ffi-unsafe.stderr14
2 files changed, 30 insertions, 0 deletions
diff --git a/src/test/ui/lint/opaque-ty-ffi-unsafe.rs b/src/test/ui/lint/opaque-ty-ffi-unsafe.rs
new file mode 100644
index 00000000000..907ad068035
--- /dev/null
+++ b/src/test/ui/lint/opaque-ty-ffi-unsafe.rs
@@ -0,0 +1,16 @@
+#![feature(type_alias_impl_trait)]
+
+#![deny(improper_ctypes)]
+
+type A = impl Fn();
+
+pub fn ret_closure() -> A {
+    || {}
+}
+
+extern "C" {
+    pub fn a(_: A);
+    //~^ ERROR `extern` block uses type `A` which is not FFI-safe: opaque types have no C equivalent
+}
+
+fn main() {}
diff --git a/src/test/ui/lint/opaque-ty-ffi-unsafe.stderr b/src/test/ui/lint/opaque-ty-ffi-unsafe.stderr
new file mode 100644
index 00000000000..6e234aa300b
--- /dev/null
+++ b/src/test/ui/lint/opaque-ty-ffi-unsafe.stderr
@@ -0,0 +1,14 @@
+error: `extern` block uses type `A` which is not FFI-safe: opaque types have no C equivalent
+  --> $DIR/opaque-ty-ffi-unsafe.rs:12:17
+   |
+LL |     pub fn a(_: A);
+   |                 ^
+   |
+note: lint level defined here
+  --> $DIR/opaque-ty-ffi-unsafe.rs:3:9
+   |
+LL | #![deny(improper_ctypes)]
+   |         ^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+