add error message when #[naked] is used with #[test]

This commit is contained in:
Folkert 2024-07-17 00:03:33 +02:00
parent 7e6c083873
commit 4d082b77af
No known key found for this signature in database
GPG Key ID: 1F17F6FFD112B97C
7 changed files with 112 additions and 0 deletions

View File

@ -216,6 +216,11 @@ builtin_macros_multiple_defaults = multiple declared defaults
.note = only one variant can be default .note = only one variant can be default
.suggestion = make `{$ident}` 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 builtin_macros_no_default_variant = no default declared
.help = make a unit variant default by placing `#[default]` above it .help = make a unit variant default by placing `#[default]` above it
.suggestion = make `{$ident}` default .suggestion = make `{$ident}` default

View File

@ -912,3 +912,13 @@ pub(crate) struct ExpectedItem<'a> {
pub span: Span, pub span: Span,
pub token: &'a str, 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,
}

View File

@ -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 // 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 // will fail. We shouldn't try to expand in this case because the errors
// would be spurious. // would be spurious.

View File

@ -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

View File

@ -536,6 +536,7 @@ macro_rules! error_codes {
E0795: 0795, E0795: 0795,
E0796: 0796, E0796: 0796,
E0797: 0797, E0797: 0797,
E0798: 0798,
); );
) )
} }

View File

@ -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)) };
}

View File

@ -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`.