Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix incorrect register conflict detection in asm!
This would previously incorrectly reject two subregisters that were
distinct but part of the same larger register, for example `al` and
`ah`.
  • Loading branch information
Amanieu committed Feb 10, 2022
1 parent 502d6aa commit 20e6c1d
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 1 deletion.
4 changes: 3 additions & 1 deletion compiler/rustc_ast_lowering/src/asm.rs
Expand Up @@ -373,7 +373,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
err.emit();
}
Entry::Vacant(v) => {
v.insert(idx);
if r == reg {
v.insert(idx);
}
}
}
};
Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/asm/reg-conflict.rs
@@ -0,0 +1,20 @@
// compile-flags: --target armv7-unknown-linux-gnueabihf
// needs-llvm-components: arm

#![feature(no_core, lang_items, rustc_attrs)]
#![no_core]

#[rustc_builtin_macro]
macro_rules! asm {
() => {};
}
#[lang = "sized"]
trait Sized {}

fn main() {
unsafe {
asm!("", out("d0") _, out("d1") _);
asm!("", out("d0") _, out("s1") _);
//~^ ERROR register `s1` conflicts with register `d0`
}
}
10 changes: 10 additions & 0 deletions src/test/ui/asm/reg-conflict.stderr
@@ -0,0 +1,10 @@
error: register `s1` conflicts with register `d0`
--> $DIR/reg-conflict.rs:17:31
|
LL | asm!("", out("d0") _, out("s1") _);
| ----------- ^^^^^^^^^^^ register `s1`
| |
| register `d0`

error: aborting due to previous error

0 comments on commit 20e6c1d

Please sign in to comment.