about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2020-11-24 00:00:00 +0000
committerTomasz Miąsko <tomasz.miasko@gmail.com>2020-11-24 00:00:00 +0000
commit75e00e8cf40faafbe8a19d2f35df66c0ca681bcb (patch)
tree298e54204ee336bb9cdb9da75ba37548053696c4 /src
parentbdc1d9774b7f963e87c3ca1946e00a44d5bdbfe5 (diff)
downloadrust-75e00e8cf40faafbe8a19d2f35df66c0ca681bcb.tar.gz
rust-75e00e8cf40faafbe8a19d2f35df66c0ca681bcb.zip
Validate that `#[naked]` is applied to a function definition
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/asm/naked-invalid-attr.rs51
-rw-r--r--src/test/ui/asm/naked-invalid-attr.stderr42
-rw-r--r--src/test/ui/rfc-2091-track-caller/error-with-naked.rs6
-rw-r--r--src/test/ui/rfc-2091-track-caller/error-with-naked.stderr8
4 files changed, 94 insertions, 13 deletions
diff --git a/src/test/ui/asm/naked-invalid-attr.rs b/src/test/ui/asm/naked-invalid-attr.rs
new file mode 100644
index 00000000000..cdb6c17454b
--- /dev/null
+++ b/src/test/ui/asm/naked-invalid-attr.rs
@@ -0,0 +1,51 @@
+// Checks that #[naked] attribute can be placed on function definitions only.
+//
+// ignore-wasm32 asm unsupported
+#![feature(asm)]
+#![feature(naked_functions)]
+#![naked] //~ ERROR should be applied to a function definition
+
+extern "C" {
+    #[naked] //~ ERROR should be applied to a function definition
+    fn f();
+}
+
+#[naked] //~ ERROR should be applied to a function definition
+#[repr(C)]
+struct S {
+    a: u32,
+    b: u32,
+}
+
+trait Invoke {
+    #[naked] //~ ERROR should be applied to a function definition
+    extern "C" fn invoke(&self);
+}
+
+impl Invoke for S {
+    #[naked]
+    extern "C" fn invoke(&self) {
+        unsafe { asm!("", options(noreturn)) }
+    }
+}
+
+#[naked]
+extern "C" fn ok() {
+    unsafe { asm!("", options(noreturn)) }
+}
+
+impl S {
+    #[naked]
+    extern "C" fn g() {
+        unsafe { asm!("", options(noreturn)) }
+    }
+
+    #[naked]
+    extern "C" fn h(&self) {
+        unsafe { asm!("", options(noreturn)) }
+    }
+}
+
+fn main() {
+    #[naked] || {}; //~ ERROR should be applied to a function definition
+}
diff --git a/src/test/ui/asm/naked-invalid-attr.stderr b/src/test/ui/asm/naked-invalid-attr.stderr
new file mode 100644
index 00000000000..beaa34140c9
--- /dev/null
+++ b/src/test/ui/asm/naked-invalid-attr.stderr
@@ -0,0 +1,42 @@
+error: attribute should be applied to a function definition
+  --> $DIR/naked-invalid-attr.rs:9:5
+   |
+LL |     #[naked]
+   |     ^^^^^^^^
+LL |     fn f();
+   |     ------- not a function definition
+
+error: attribute should be applied to a function definition
+  --> $DIR/naked-invalid-attr.rs:13:1
+   |
+LL |   #[naked]
+   |   ^^^^^^^^
+LL |   #[repr(C)]
+LL | / struct S {
+LL | |     a: u32,
+LL | |     b: u32,
+LL | | }
+   | |_- not a function definition
+
+error: attribute should be applied to a function definition
+  --> $DIR/naked-invalid-attr.rs:50:5
+   |
+LL |     #[naked] || {};
+   |     ^^^^^^^^ ----- not a function definition
+
+error: attribute should be applied to a function definition
+  --> $DIR/naked-invalid-attr.rs:21:5
+   |
+LL |     #[naked]
+   |     ^^^^^^^^
+LL |     extern "C" fn invoke(&self);
+   |     ---------------------------- not a function definition
+
+error: attribute should be applied to a function definition
+  --> $DIR/naked-invalid-attr.rs:6:1
+   |
+LL | #![naked]
+   | ^^^^^^^^^
+
+error: aborting due to 5 previous errors
+
diff --git a/src/test/ui/rfc-2091-track-caller/error-with-naked.rs b/src/test/ui/rfc-2091-track-caller/error-with-naked.rs
index 2b110c9a325..c60ff7dc934 100644
--- a/src/test/ui/rfc-2091-track-caller/error-with-naked.rs
+++ b/src/test/ui/rfc-2091-track-caller/error-with-naked.rs
@@ -12,10 +12,4 @@ impl S {
     fn g() {}
 }
 
-extern "Rust" {
-    #[track_caller] //~ ERROR cannot use `#[track_caller]` with `#[naked]`
-    #[naked]
-    fn h();
-}
-
 fn main() {}
diff --git a/src/test/ui/rfc-2091-track-caller/error-with-naked.stderr b/src/test/ui/rfc-2091-track-caller/error-with-naked.stderr
index 1249d1df071..211cd3f16ba 100644
--- a/src/test/ui/rfc-2091-track-caller/error-with-naked.stderr
+++ b/src/test/ui/rfc-2091-track-caller/error-with-naked.stderr
@@ -5,17 +5,11 @@ LL | #[track_caller]
    | ^^^^^^^^^^^^^^^
 
 error[E0736]: cannot use `#[track_caller]` with `#[naked]`
-  --> $DIR/error-with-naked.rs:16:5
-   |
-LL |     #[track_caller]
-   |     ^^^^^^^^^^^^^^^
-
-error[E0736]: cannot use `#[track_caller]` with `#[naked]`
   --> $DIR/error-with-naked.rs:10:5
    |
 LL |     #[track_caller]
    |     ^^^^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0736`.