about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2017-09-11 12:15:35 +0200
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2017-09-13 23:28:11 +0200
commitd97a7d259432e50bb1c9daaeb9e1174d51f2aaee (patch)
tree7d5aa5e27a1c4abdac2d66efa7ebc04e5855eaa3
parentefc7d46188c6696ae873b2b71ead7e34fc4501ab (diff)
downloadrust-d97a7d259432e50bb1c9daaeb9e1174d51f2aaee.tar.gz
rust-d97a7d259432e50bb1c9daaeb9e1174d51f2aaee.zip
Make sure we aren't using dead locals
-rw-r--r--src/librustc_mir/transform/generator.rs11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs
index 3be21b72731..0517963a1a0 100644
--- a/src/librustc_mir/transform/generator.rs
+++ b/src/librustc_mir/transform/generator.rs
@@ -244,6 +244,12 @@ impl<'a, 'tcx> MutVisitor<'tcx> for TransformVisitor<'a, 'tcx> {
 
         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 @@ impl<'a, 'tcx> MutVisitor<'tcx> for TransformVisitor<'a, 'tcx> {
                  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;
         }