Validate that #[naked] is applied to a function definition

This commit is contained in:
Tomasz Miąsko 2020-11-24 00:00:00 +00:00
parent bdc1d9774b
commit 75e00e8cf4
5 changed files with 115 additions and 13 deletions

View file

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

View file

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

View file

@ -12,10 +12,4 @@ impl S {
fn g() {}
}
extern "Rust" {
#[track_caller] //~ ERROR cannot use `#[track_caller]` with `#[naked]`
#[naked]
fn h();
}
fn main() {}

View file

@ -4,18 +4,12 @@ error[E0736]: cannot use `#[track_caller]` with `#[naked]`
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`.