]> git.lizzy.rs Git - rust.git/commitdiff
Make sure we aren't using dead locals
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Mon, 11 Sep 2017 10:15:35 +0000 (12:15 +0200)
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Wed, 13 Sep 2017 21:28:11 +0000 (23:28 +0200)
src/librustc_mir/transform/generator.rs

index 3be21b72731e96b5e753c674285e7f7394e15b6f..0517963a1a028ea10cbecae6e143cd38958141b5 100644 (file)
@@ -244,6 +244,12 @@ fn visit_basic_block_data(&mut self,
 
         if let Some((state_idx, resume, v, drop)) = ret_val {
             let source_info = data.terminator().source_info;
+            // We must assign the value first in case it gets declared dead below
+            data.statements.push(Statement {
+                source_info,
+                kind: StatementKind::Assign(Lvalue::Local(RETURN_POINTER),
+                    self.make_state(state_idx, v)),
+            });
             let state = if let Some(resume) = resume { // Yield
                 let state = 3 + self.suspension_points.len() as u32;
 
@@ -272,11 +278,6 @@ fn visit_basic_block_data(&mut self,
                  1 // state for returned
             };
             data.statements.push(self.set_state(state, source_info));
-            data.statements.push(Statement {
-                source_info,
-                kind: StatementKind::Assign(Lvalue::Local(RETURN_POINTER),
-                    self.make_state(state_idx, v)),
-            });
             data.terminator.as_mut().unwrap().kind = TerminatorKind::Return;
         }