about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNathaniel McCallum <nathaniel@congru.us>2021-08-03 17:43:21 -0400
committerNathaniel McCallum <nathaniel@congru.us>2021-08-03 17:50:50 -0400
commita96fd577a44845df221c81ff24b35819135b4a0d (patch)
treeb6f5f467f4eeeba471b47311a77e5240ecee4581
parentc6bc102fea9f9274202d0bc55a0fef8a3bc92426 (diff)
downloadrust-a96fd577a44845df221c81ff24b35819135b4a0d.tar.gz
rust-a96fd577a44845df221c81ff24b35819135b4a0d.zip
Validate FFI-safety warnings on naked functions
Test that FFI-safety warnings don't get accidentally dropped on naked
functions. The big picture is that if you implement a naked function
with the Rust ABI you'll get a warning. Further, if you implement a
naked function with a standardized ABI, but use non-FFI-safe types you
will still get a warning.

rust-lang/rfcs#2774
rust-lang/rfcs#2972
-rw-r--r--src/test/ui/asm/naked-functions-ffi.rs12
-rw-r--r--src/test/ui/asm/naked-functions-ffi.stderr20
2 files changed, 32 insertions, 0 deletions
diff --git a/src/test/ui/asm/naked-functions-ffi.rs b/src/test/ui/asm/naked-functions-ffi.rs
new file mode 100644
index 00000000000..5b2a8ed3034
--- /dev/null
+++ b/src/test/ui/asm/naked-functions-ffi.rs
@@ -0,0 +1,12 @@
+// check-pass
+// only-x86_64
+#![feature(asm)]
+#![feature(naked_functions)]
+#![crate_type = "lib"]
+
+#[naked]
+pub extern "C" fn naked(p: char) -> u128 {
+    //~^ WARN uses type `char`
+    //~| WARN uses type `u128`
+    unsafe { asm!("", options(noreturn)); }
+}
diff --git a/src/test/ui/asm/naked-functions-ffi.stderr b/src/test/ui/asm/naked-functions-ffi.stderr
new file mode 100644
index 00000000000..a6772badeb6
--- /dev/null
+++ b/src/test/ui/asm/naked-functions-ffi.stderr
@@ -0,0 +1,20 @@
+warning: `extern` fn uses type `char`, which is not FFI-safe
+  --> $DIR/naked-functions-ffi.rs:8:28
+   |
+LL | pub extern "C" fn naked(p: char) -> u128 {
+   |                            ^^^^ not FFI-safe
+   |
+   = note: `#[warn(improper_ctypes_definitions)]` on by default
+   = help: consider using `u32` or `libc::wchar_t` instead
+   = note: the `char` type has no C equivalent
+
+warning: `extern` fn uses type `u128`, which is not FFI-safe
+  --> $DIR/naked-functions-ffi.rs:8:37
+   |
+LL | pub extern "C" fn naked(p: char) -> u128 {
+   |                                     ^^^^ not FFI-safe
+   |
+   = note: 128-bit integers don't currently have a known stable ABI
+
+warning: 2 warnings emitted
+