about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFolkert <folkert@folkertdev.nl>2024-07-17 00:03:33 +0200
committerFolkert <folkert@folkertdev.nl>2024-07-17 00:04:00 +0200
commit4d082b77af1f714df6c407785e1961a9dddd554c (patch)
treec73cb2325d16e38d91e13de25cd951574242d56f
parent7e6c083873b7b98aa52d47896107af11560aeaf5 (diff)
downloadrust-4d082b77af1f714df6c407785e1961a9dddd554c.tar.gz
rust-4d082b77af1f714df6c407785e1961a9dddd554c.zip
add error message when `#[naked]` is used with `#[test]`
-rw-r--r--compiler/rustc_builtin_macros/messages.ftl5
-rw-r--r--compiler/rustc_builtin_macros/src/errors.rs10
-rw-r--r--compiler/rustc_builtin_macros/src/test.rs8
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0798.md14
-rw-r--r--compiler/rustc_error_codes/src/lib.rs1
-rw-r--r--tests/ui/asm/naked-functions-testattrs.rs39
-rw-r--r--tests/ui/asm/naked-functions-testattrs.stderr35
7 files changed, 112 insertions, 0 deletions
diff --git a/compiler/rustc_builtin_macros/messages.ftl b/compiler/rustc_builtin_macros/messages.ftl
index b56bfa98357..21c0f0802f7 100644
--- a/compiler/rustc_builtin_macros/messages.ftl
+++ b/compiler/rustc_builtin_macros/messages.ftl
@@ -216,6 +216,11 @@ builtin_macros_multiple_defaults = multiple declared defaults
     .note = only one variant can be default
     .suggestion = make `{$ident}` default
 
+builtin_macros_naked_functions_testing_attribute =
+    cannot use `#[naked]` with testing attributes
+    .label = function marked with testing attribute here
+    .naked_attribute = `#[naked]` is incompatible with testing attributes
+
 builtin_macros_no_default_variant = no default declared
     .help = make a unit variant default by placing `#[default]` above it
     .suggestion = make `{$ident}` default
diff --git a/compiler/rustc_builtin_macros/src/errors.rs b/compiler/rustc_builtin_macros/src/errors.rs
index 49d640436c2..24706a3b054 100644
--- a/compiler/rustc_builtin_macros/src/errors.rs
+++ b/compiler/rustc_builtin_macros/src/errors.rs
@@ -912,3 +912,13 @@ pub(crate) struct ExpectedItem<'a> {
     pub span: Span,
     pub token: &'a str,
 }
+
+#[derive(Diagnostic)]
+#[diag(builtin_macros_naked_functions_testing_attribute, code = E0798)]
+pub struct NakedFunctionTestingAttribute {
+    #[primary_span]
+    #[label(builtin_macros_naked_attribute)]
+    pub naked_span: Span,
+    #[label]
+    pub testing_span: Span,
+}
diff --git a/compiler/rustc_builtin_macros/src/test.rs b/compiler/rustc_builtin_macros/src/test.rs
index c0310a2f4b0..bb00c8de1b8 100644
--- a/compiler/rustc_builtin_macros/src/test.rs
+++ b/compiler/rustc_builtin_macros/src/test.rs
@@ -133,6 +133,14 @@ pub(crate) fn expand_test_or_bench(
         };
     };
 
+    if let Some(attr) = attr::find_by_name(&item.attrs, sym::naked) {
+        cx.dcx().emit_err(errors::NakedFunctionTestingAttribute {
+            testing_span: attr_sp,
+            naked_span: attr.span,
+        });
+        return vec![Annotatable::Item(item)];
+    }
+
     // check_*_signature will report any errors in the type so compilation
     // will fail. We shouldn't try to expand in this case because the errors
     // would be spurious.
diff --git a/compiler/rustc_error_codes/src/error_codes/E0798.md b/compiler/rustc_error_codes/src/error_codes/E0798.md
new file mode 100644
index 00000000000..96f25eb4f0e
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0798.md
@@ -0,0 +1,14 @@
+Testing attributes cannot be applied to functions marked with `#[naked]`.
+
+Erroneous code example:
+
+```ignore (requires test runner)
+#[test]
+#[should_panic]
+#[naked]
+fn foo() {}
+```
+
+See [the reference page for testing attributes] for more information.
+
+[the reference page for testing attributes]: https://doc.rust-lang.org/reference/attributes/testing.html
diff --git a/compiler/rustc_error_codes/src/lib.rs b/compiler/rustc_error_codes/src/lib.rs
index d13d5e1bca2..2a7bc2501c0 100644
--- a/compiler/rustc_error_codes/src/lib.rs
+++ b/compiler/rustc_error_codes/src/lib.rs
@@ -536,6 +536,7 @@ E0794: 0794,
 E0795: 0795,
 E0796: 0796,
 E0797: 0797,
+E0798: 0798,
         );
     )
 }
diff --git a/tests/ui/asm/naked-functions-testattrs.rs b/tests/ui/asm/naked-functions-testattrs.rs
new file mode 100644
index 00000000000..593cf3ad459
--- /dev/null
+++ b/tests/ui/asm/naked-functions-testattrs.rs
@@ -0,0 +1,39 @@
+//@ needs-asm-support
+//@ compile-flags: --test
+
+#![allow(undefined_naked_function_abi)]
+#![feature(naked_functions)]
+#![feature(test)]
+#![crate_type = "lib"]
+
+use std::arch::asm;
+
+#[test]
+#[naked]
+//~^ ERROR [E0798]
+fn test_naked() {
+    unsafe { asm!("", options(noreturn)) };
+}
+
+#[should_panic]
+#[test]
+#[naked]
+//~^ ERROR [E0798]
+fn test_naked_should_panic() {
+    unsafe { asm!("", options(noreturn)) };
+}
+
+#[ignore]
+#[test]
+#[naked]
+//~^ ERROR [E0798]
+fn test_naked_ignore() {
+    unsafe { asm!("", options(noreturn)) };
+}
+
+#[bench]
+#[naked]
+//~^ ERROR [E0798]
+fn bench_naked() {
+    unsafe { asm!("", options(noreturn)) };
+}
diff --git a/tests/ui/asm/naked-functions-testattrs.stderr b/tests/ui/asm/naked-functions-testattrs.stderr
new file mode 100644
index 00000000000..87647b0ca37
--- /dev/null
+++ b/tests/ui/asm/naked-functions-testattrs.stderr
@@ -0,0 +1,35 @@
+error[E0798]: cannot use `#[naked]` with testing attributes
+  --> $DIR/naked-functions-testattrs.rs:12:1
+   |
+LL | #[test]
+   | ------- function marked with testing attribute here
+LL | #[naked]
+   | ^^^^^^^^ `#[naked]` is incompatible with testing attributes
+
+error[E0798]: cannot use `#[naked]` with testing attributes
+  --> $DIR/naked-functions-testattrs.rs:20:1
+   |
+LL | #[test]
+   | ------- function marked with testing attribute here
+LL | #[naked]
+   | ^^^^^^^^ `#[naked]` is incompatible with testing attributes
+
+error[E0798]: cannot use `#[naked]` with testing attributes
+  --> $DIR/naked-functions-testattrs.rs:28:1
+   |
+LL | #[test]
+   | ------- function marked with testing attribute here
+LL | #[naked]
+   | ^^^^^^^^ `#[naked]` is incompatible with testing attributes
+
+error[E0798]: cannot use `#[naked]` with testing attributes
+  --> $DIR/naked-functions-testattrs.rs:35:1
+   |
+LL | #[bench]
+   | -------- function marked with testing attribute here
+LL | #[naked]
+   | ^^^^^^^^ `#[naked]` is incompatible with testing attributes
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0798`.