about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_typeck/src/check/generator_interior/drop_ranges/record_consumed_borrow.rs8
-rw-r--r--src/test/ui/generator/drop-tracking-yielding-in-match-guards.rs14
2 files changed, 20 insertions, 2 deletions
diff --git a/compiler/rustc_typeck/src/check/generator_interior/drop_ranges/record_consumed_borrow.rs b/compiler/rustc_typeck/src/check/generator_interior/drop_ranges/record_consumed_borrow.rs
index e89a8961996..ec83acf08b7 100644
--- a/compiler/rustc_typeck/src/check/generator_interior/drop_ranges/record_consumed_borrow.rs
+++ b/compiler/rustc_typeck/src/check/generator_interior/drop_ranges/record_consumed_borrow.rs
@@ -171,7 +171,13 @@ impl<'tcx> expr_use_visitor::Delegate<'tcx> for ExprUseDelegate<'tcx> {
             .insert(TrackedValue::from_place_with_projections_allowed(place_with_id));
 
         // For copied we treat this mostly like a borrow except that we don't add the place
-        // to borrowed_temporaries because the copy is consumed.
+        // to borrowed_temporaries if it is not a local because the copy is consumed.
+        match place_with_id.place.base {
+            PlaceBase::Rvalue | PlaceBase::StaticItem | PlaceBase::Upvar(_) => (),
+            PlaceBase::Local(_) => {
+                self.places.borrowed_temporaries.insert(place_with_id.hir_id);
+            }
+        }
     }
 
     fn mutate(
diff --git a/src/test/ui/generator/drop-tracking-yielding-in-match-guards.rs b/src/test/ui/generator/drop-tracking-yielding-in-match-guards.rs
index c818963e466..9efe64a62e7 100644
--- a/src/test/ui/generator/drop-tracking-yielding-in-match-guards.rs
+++ b/src/test/ui/generator/drop-tracking-yielding-in-match-guards.rs
@@ -14,8 +14,20 @@
 #![feature(generators)]
 
 fn main() {
-    let _ = static |x: u8| match x {
+    let _a = static |x: u8| match x {
         y if { yield } == y + 1 => (),
         _ => (),
     };
+
+    static STATIC: u8 = 42;
+    let _b = static |x: u8| match x {
+        y if { yield } == STATIC + 1 => (),
+        _ => (),
+    };
+
+    let upvar = 42u8;
+    let _c = static |x: u8| match x {
+        y if { yield } == upvar + 1 => (),
+        _ => (),
+    };
 }