about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2020-02-19 23:38:31 +0100
committerJonas Schievink <jonasschievink@gmail.com>2020-02-19 23:38:31 +0100
commit689615724535d00c093c6c5dff0accaf6e38d9bc (patch)
tree55aa14a3636edca630c1d82d0ab7b47c2bdc93d8
parent71c4f76153590fc1744c7f73b94d2d39ae2e2f23 (diff)
downloadrust-689615724535d00c093c6c5dff0accaf6e38d9bc.tar.gz
rust-689615724535d00c093c6c5dff0accaf6e38d9bc.zip
Remap the resume place if necessary
-rw-r--r--src/librustc_mir/transform/generator.rs9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs
index b3dc87d1a16..a94f03301f3 100644
--- a/src/librustc_mir/transform/generator.rs
+++ b/src/librustc_mir/transform/generator.rs
@@ -325,6 +325,15 @@ impl MutVisitor<'tcx> for TransformVisitor<'tcx> {
                 // Yield
                 let state = 3 + self.suspension_points.len();
 
+                // The resume arg target location might itself be remapped if its base local is
+                // live across a yield.
+                let resume_arg =
+                    if let Some(&(ty, variant, idx)) = self.remap.get(&resume_arg.local) {
+                        self.make_field(variant, idx, ty)
+                    } else {
+                        resume_arg
+                    };
+
                 self.suspension_points.push(SuspensionPoint {
                     state,
                     resume,