Rollup merge of #89311 - FabianWolff:issue-89305, r=oli-obk

Add unit assignment to MIR for `asm!()`

Fixes #89305. `ExprKind::LlvmInlineAsm` gets a `push_assign_unit()` here:
2b6ed3b675/compiler/rustc_mir_build/src/build/expr/into.rs (L475-L479)

The same should probably happen for `ExprKind::InlineAsm`, which fixes the "use of possibly-uninitialized variable" error described in #89305.
This commit is contained in:
Eric Huss 2021-09-29 19:33:39 -07:00 committed by GitHub
commit c5f8675291
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 3 deletions

View File

@ -449,8 +449,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
})
.collect();
let destination = this.cfg.start_new_block();
if !options.contains(InlineAsmOptions::NORETURN) {
this.cfg.push_assign_unit(block, source_info, destination, this.tcx);
}
let destination_block = this.cfg.start_new_block();
this.cfg.terminate(
block,
source_info,
@ -462,11 +465,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
destination: if options.contains(InlineAsmOptions::NORETURN) {
None
} else {
Some(destination)
Some(destination_block)
},
},
);
destination.unit()
destination_block.unit()
}
// These cases don't actually need a destination

View File

@ -0,0 +1,14 @@
// Regression test for #89305, where a variable was erroneously reported
// as both unused and possibly-uninitialized.
// check-pass
#![feature(asm)]
#![warn(unused)]
fn main() {
unsafe {
let x: () = asm!("nop");
//~^ WARNING: unused variable: `x`
}
}

View File

@ -0,0 +1,15 @@
warning: unused variable: `x`
--> $DIR/issue-89305.rs:11:13
|
LL | let x: () = asm!("nop");
| ^ help: if this is intentional, prefix it with an underscore: `_x`
|
note: the lint level is defined here
--> $DIR/issue-89305.rs:7:9
|
LL | #![warn(unused)]
| ^^^^^^
= note: `#[warn(unused_variables)]` implied by `#[warn(unused)]`
warning: 1 warning emitted