Skip to content

Commit

Permalink
Fix incorrect register conflict detection in asm!
Browse files Browse the repository at this point in the history
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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.