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:
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user