about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_mir_build/src/build/scope.rs25
-rw-r--r--src/test/mir-opt/loop_test.main.SimplifyCfg-promote-consts.after.mir4
2 files changed, 15 insertions, 14 deletions
diff --git a/compiler/rustc_mir_build/src/build/scope.rs b/compiler/rustc_mir_build/src/build/scope.rs
index 2727e70f278..41fc925c049 100644
--- a/compiler/rustc_mir_build/src/build/scope.rs
+++ b/compiler/rustc_mir_build/src/build/scope.rs
@@ -618,16 +618,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
             }
         } else {
             assert!(value.is_none(), "`return` and `break` should have a destination");
-            // `continue` statements generate no MIR statement with the `continue` statement's Span,
-            // and the `InstrumentCoverage` statement will have no way to generate a coverage
-            // code region for the `continue` statement, unless we add a dummy `Assign` here:
-            let mut local_decl = LocalDecl::new(self.tcx.mk_unit(), span);
-            local_decl = local_decl.immutable();
-            let temp = self.local_decls.push(local_decl);
-            let temp_place = Place::from(temp);
-            self.cfg.push(block, Statement { source_info, kind: StatementKind::StorageLive(temp) });
-            self.cfg.push_assign_unit(block, source_info, temp_place, self.tcx);
-            self.cfg.push(block, Statement { source_info, kind: StatementKind::StorageDead(temp) });
+            if self.tcx.sess.instrument_coverage() {
+                // Unlike `break` and `return`, which push an `Assign` statement to MIR, from which
+                // a Coverage code region can be generated, `continue` needs no `Assign`; but
+                // without one, the `InstrumentCoverage` MIR pass cannot generate a code region for
+                // `continue`. Coverage will be missing unless we add a dummy `Assign` to MIR.
+                self.add_dummy_assignment(&span, block, source_info);
+            }
         }
 
         let region_scope = self.scopes.breakable_scopes[break_index].region_scope;
@@ -653,6 +650,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
         self.cfg.start_new_block().unit()
     }
 
+    // Add a dummy `Assign` statement to the CFG, with the span for the source code's `continue`
+    // statement.
+    fn add_dummy_assignment(&mut self, span: &Span, block: BasicBlock, source_info: SourceInfo) {
+        let local_decl = LocalDecl::new(self.tcx.mk_unit(), *span).internal();
+        let temp_place = Place::from(self.local_decls.push(local_decl));
+        self.cfg.push_assign_unit(block, source_info, temp_place, self.tcx);
+    }
+
     crate fn exit_top_scope(
         &mut self,
         mut block: BasicBlock,
diff --git a/src/test/mir-opt/loop_test.main.SimplifyCfg-promote-consts.after.mir b/src/test/mir-opt/loop_test.main.SimplifyCfg-promote-consts.after.mir
index f6120447017..99c7ac8d5b7 100644
--- a/src/test/mir-opt/loop_test.main.SimplifyCfg-promote-consts.after.mir
+++ b/src/test/mir-opt/loop_test.main.SimplifyCfg-promote-consts.after.mir
@@ -8,7 +8,6 @@ fn main() -> () {
     let mut _4: !;                       // in scope 0 at $DIR/loop_test.rs:13:5: 16:6
     let mut _5: ();                      // in scope 0 at $DIR/loop_test.rs:6:1: 17:2
     let _6: i32;                         // in scope 0 at $DIR/loop_test.rs:14:13: 14:14
-    let _7: ();                          // in scope 0 at $DIR/loop_test.rs:15:9: 15:17
     scope 1 {
         debug x => _6;                   // in scope 1 at $DIR/loop_test.rs:14:13: 14:14
     }
@@ -43,9 +42,6 @@ fn main() -> () {
         StorageLive(_6);                 // scope 0 at $DIR/loop_test.rs:14:13: 14:14
         _6 = const 1_i32;                // scope 0 at $DIR/loop_test.rs:14:17: 14:18
         FakeRead(ForLet(None), _6);      // scope 0 at $DIR/loop_test.rs:14:13: 14:14
-        StorageLive(_7);                 // scope 1 at $DIR/loop_test.rs:15:9: 15:17
-        _7 = const ();                   // scope 1 at $DIR/loop_test.rs:15:9: 15:17
-        StorageDead(_7);                 // scope 1 at $DIR/loop_test.rs:15:9: 15:17
         StorageDead(_6);                 // scope 0 at $DIR/loop_test.rs:16:5: 16:6
         goto -> bb3;                     // scope 0 at $DIR/loop_test.rs:1:1: 1:1
     }