about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFabian Wolff <fabian.wolff@alumni.ethz.ch>2021-09-27 23:06:16 +0200
committerFabian Wolff <fabian.wolff@alumni.ethz.ch>2021-09-28 01:38:54 +0200
commitcd0873b50276bca8bfcaf8d12beeb28d3fffb692 (patch)
tree42e26a139d0d89eeb86da9d7d3fdb6659d8b9b65
parenta0648eab3686f100c7ab9b0d38472c740079cce4 (diff)
downloadrust-cd0873b50276bca8bfcaf8d12beeb28d3fffb692.tar.gz
rust-cd0873b50276bca8bfcaf8d12beeb28d3fffb692.zip
Add unit assignment to MIR for `asm!()`
-rw-r--r--compiler/rustc_mir_build/src/build/expr/into.rs9
-rw-r--r--src/test/ui/asm/issue-89305.rs14
-rw-r--r--src/test/ui/asm/issue-89305.stderr15
3 files changed, 35 insertions, 3 deletions
diff --git a/compiler/rustc_mir_build/src/build/expr/into.rs b/compiler/rustc_mir_build/src/build/expr/into.rs
index 1803a18441c..53868f28557 100644
--- a/compiler/rustc_mir_build/src/build/expr/into.rs
+++ b/compiler/rustc_mir_build/src/build/expr/into.rs
@@ -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
diff --git a/src/test/ui/asm/issue-89305.rs b/src/test/ui/asm/issue-89305.rs
new file mode 100644
index 00000000000..bdcf3f305eb
--- /dev/null
+++ b/src/test/ui/asm/issue-89305.rs
@@ -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`
+    }
+}
diff --git a/src/test/ui/asm/issue-89305.stderr b/src/test/ui/asm/issue-89305.stderr
new file mode 100644
index 00000000000..9cc127b44d0
--- /dev/null
+++ b/src/test/ui/asm/issue-89305.stderr
@@ -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
+