about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <jtitor@2k36.org>2021-08-06 11:21:31 +0900
committerGitHub <noreply@github.com>2021-08-06 11:21:31 +0900
commit71ad503fd9ce83d47aba75e0569598ee9406df78 (patch)
tree289346ff69ac7a6c79b2f8a67feede414f039e80
parent5b4396068744e810d090de038e6f456432d203a2 (diff)
parenta96fd577a44845df221c81ff24b35819135b4a0d (diff)
downloadrust-71ad503fd9ce83d47aba75e0569598ee9406df78.tar.gz
rust-71ad503fd9ce83d47aba75e0569598ee9406df78.zip
Rollup merge of #87742 - npmccallum:naked_ffi, r=Amanieu
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

cc ``````@joshtriplett`````` ``````@Amanieu`````` ``````@haraldh``````
-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
+