Don't lint against named labels in naked_asm!

Naked functions are allowed to define global labels, just like
`global_asm!`.
This commit is contained in:
Amanieu d'Antras
2025-05-09 21:27:18 +01:00
parent b56aaec52b
commit 1f4561b63d
4 changed files with 48 additions and 32 deletions

View File

@@ -2849,7 +2849,7 @@ impl InlineAsmOperand {
} }
} }
#[derive(Clone, Copy, Encodable, Decodable, Debug, HashStable_Generic, Walkable)] #[derive(Clone, Copy, Encodable, Decodable, Debug, HashStable_Generic, Walkable, PartialEq, Eq)]
pub enum AsmMacro { pub enum AsmMacro {
/// The `asm!` macro /// The `asm!` macro
Asm, Asm,

View File

@@ -2870,7 +2870,7 @@ impl<'tcx> LateLintPass<'tcx> for AsmLabels {
if let hir::Expr { if let hir::Expr {
kind: kind:
hir::ExprKind::InlineAsm(hir::InlineAsm { hir::ExprKind::InlineAsm(hir::InlineAsm {
asm_macro: AsmMacro::Asm | AsmMacro::NakedAsm, asm_macro: asm_macro @ (AsmMacro::Asm | AsmMacro::NakedAsm),
template_strs, template_strs,
options, options,
.. ..
@@ -2878,6 +2878,15 @@ impl<'tcx> LateLintPass<'tcx> for AsmLabels {
.. ..
} = expr } = expr
{ {
// Non-generic naked functions are allowed to define arbitrary
// labels.
if *asm_macro == AsmMacro::NakedAsm {
let def_id = expr.hir_id.owner.def_id;
if !cx.tcx.generics_of(def_id).requires_monomorphization(cx.tcx) {
return;
}
}
// asm with `options(raw)` does not do replacement with `{` and `}`. // asm with `options(raw)` does not do replacement with `{` and `}`.
let raw = options.contains(InlineAsmOptions::RAW); let raw = options.contains(InlineAsmOptions::RAW);

View File

@@ -171,12 +171,10 @@ fn main() {
} }
} }
// Trigger on naked fns too, even though they can't be inlined, reusing a // Don't trigger on naked functions.
// label or LTO can cause labels to break
#[unsafe(naked)] #[unsafe(naked)]
pub extern "C" fn foo() -> i32 { pub extern "C" fn foo() -> i32 {
naked_asm!(".Lfoo: mov rax, {}; ret;", "nop", const 1) naked_asm!(".Lfoo: mov rax, {}; ret;", "nop", const 1)
//~^ ERROR avoid using named labels
} }
// Make sure that non-naked attributes *do* still let the lint happen // Make sure that non-naked attributes *do* still let the lint happen
@@ -190,7 +188,18 @@ pub extern "C" fn bar() {
pub extern "C" fn aaa() { pub extern "C" fn aaa() {
fn _local() {} fn _local() {}
naked_asm!(".Laaa: nop; ret;") //~ ERROR avoid using named labels naked_asm!(".Laaa: nop; ret;")
}
#[unsafe(naked)]
pub extern "C" fn bbb<'a>(a: &'a u32) {
naked_asm!(".Lbbb: nop; ret;")
}
#[unsafe(naked)]
pub extern "C" fn ccc<T>(a: &T) {
naked_asm!(".Lccc: nop; ret;")
//~^ ERROR avoid using named labels
} }
pub fn normal() { pub fn normal() {
@@ -200,7 +209,7 @@ pub fn normal() {
pub extern "C" fn bbb() { pub extern "C" fn bbb() {
fn _very_local() {} fn _very_local() {}
naked_asm!(".Lbbb: nop; ret;") //~ ERROR avoid using named labels naked_asm!(".Lbbb: nop; ret;")
} }
fn _local2() {} fn _local2() {}
@@ -230,3 +239,10 @@ fn closures() {
// Don't trigger on global asm // Don't trigger on global asm
global_asm!("aaaaaaaa: nop"); global_asm!("aaaaaaaa: nop");
trait Foo {
#[unsafe(naked)]
extern "C" fn bbb<'a>(a: &'a u32) {
naked_asm!(".Lbbb: nop; ret;") //~ ERROR avoid using named labels
}
}

View File

@@ -475,16 +475,7 @@ LL | #[warn(named_asm_labels)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
error: avoid using named labels in inline assembly error: avoid using named labels in inline assembly
--> $DIR/named-asm-labels.rs:178:17 --> $DIR/named-asm-labels.rs:183:20
|
LL | naked_asm!(".Lfoo: mov rax, {}; ret;", "nop", const 1)
| ^^^^^
|
= help: only local labels of the form `<number>:` should be used in inline asm
= note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information
error: avoid using named labels in inline assembly
--> $DIR/named-asm-labels.rs:185:20
| |
LL | unsafe { asm!(".Lbar: mov rax, {}; ret;", "nop", const 1, options(noreturn)) } LL | unsafe { asm!(".Lbar: mov rax, {}; ret;", "nop", const 1, options(noreturn)) }
| ^^^^^ | ^^^^^
@@ -493,25 +484,16 @@ LL | unsafe { asm!(".Lbar: mov rax, {}; ret;", "nop", const 1, options(noret
= note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information = note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information
error: avoid using named labels in inline assembly error: avoid using named labels in inline assembly
--> $DIR/named-asm-labels.rs:193:17 --> $DIR/named-asm-labels.rs:201:17
| |
LL | naked_asm!(".Laaa: nop; ret;") LL | naked_asm!(".Lccc: nop; ret;")
| ^^^^^ | ^^^^^
| |
= help: only local labels of the form `<number>:` should be used in inline asm = help: only local labels of the form `<number>:` should be used in inline asm
= note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information = note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information
error: avoid using named labels in inline assembly error: avoid using named labels in inline assembly
--> $DIR/named-asm-labels.rs:203:21 --> $DIR/named-asm-labels.rs:221:15
|
LL | naked_asm!(".Lbbb: nop; ret;")
| ^^^^^
|
= help: only local labels of the form `<number>:` should be used in inline asm
= note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information
error: avoid using named labels in inline assembly
--> $DIR/named-asm-labels.rs:212:15
| |
LL | asm!("closure1: nop"); LL | asm!("closure1: nop");
| ^^^^^^^^ | ^^^^^^^^
@@ -520,7 +502,7 @@ LL | asm!("closure1: nop");
= note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information = note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information
error: avoid using named labels in inline assembly error: avoid using named labels in inline assembly
--> $DIR/named-asm-labels.rs:216:15 --> $DIR/named-asm-labels.rs:225:15
| |
LL | asm!("closure2: nop"); LL | asm!("closure2: nop");
| ^^^^^^^^ | ^^^^^^^^
@@ -529,7 +511,7 @@ LL | asm!("closure2: nop");
= note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information = note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information
error: avoid using named labels in inline assembly error: avoid using named labels in inline assembly
--> $DIR/named-asm-labels.rs:226:19 --> $DIR/named-asm-labels.rs:235:19
| |
LL | asm!("closure3: nop"); LL | asm!("closure3: nop");
| ^^^^^^^^ | ^^^^^^^^
@@ -537,5 +519,14 @@ LL | asm!("closure3: nop");
= help: only local labels of the form `<number>:` should be used in inline asm = help: only local labels of the form `<number>:` should be used in inline asm
= note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information = note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information
error: aborting due to 56 previous errors; 1 warning emitted error: avoid using named labels in inline assembly
--> $DIR/named-asm-labels.rs:246:21
|
LL | naked_asm!(".Lbbb: nop; ret;")
| ^^^^^
|
= help: only local labels of the form `<number>:` should be used in inline asm
= note: see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information
error: aborting due to 55 previous errors; 1 warning emitted