about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAman Arora <me@aman-arora.com>2021-08-29 15:37:03 -0400
committerAman Arora <me@aman-arora.com>2021-08-29 15:37:03 -0400
commitfbd775ff2949c4cc7bcdd7a648e8698ddfa4d410 (patch)
treed34086c57722ced65d088df21adf768c5e137ce0
parentef524710669a003cf2b24361dc6b04b566e560fa (diff)
downloadrust-fbd775ff2949c4cc7bcdd7a648e8698ddfa4d410.tar.gz
rust-fbd775ff2949c4cc7bcdd7a648e8698ddfa4d410.zip
2229: Handle update to capture kind properly
-rw-r--r--compiler/rustc_typeck/src/check/upvar.rs5
-rw-r--r--src/test/ui/closures/2229_closure_analysis/run_pass/issue-88372.rs19
2 files changed, 24 insertions, 0 deletions
diff --git a/compiler/rustc_typeck/src/check/upvar.rs b/compiler/rustc_typeck/src/check/upvar.rs
index ae6bebcf727..bb8d2ecdcf0 100644
--- a/compiler/rustc_typeck/src/check/upvar.rs
+++ b/compiler/rustc_typeck/src/check/upvar.rs
@@ -400,6 +400,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
             };
 
             capture_info.capture_kind = capture_kind;
+            let capture_info = if let Some(existing) = processed.get(&place) {
+                determine_capture_info(*existing, capture_info)
+            } else {
+                capture_info
+            };
             processed.insert(place, capture_info);
         }
 
diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/issue-88372.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/issue-88372.rs
new file mode 100644
index 00000000000..25fbb6cb906
--- /dev/null
+++ b/src/test/ui/closures/2229_closure_analysis/run_pass/issue-88372.rs
@@ -0,0 +1,19 @@
+// edition:2021
+// run-pass
+
+
+fn solve<F>(validate: F) -> Option<u64>
+where
+    F: Fn(&mut [i8; 1]),
+{
+    let mut position: [i8; 1] = [1];
+    Some(0).map(|_| {
+        validate(&mut position);
+        let [_x] = position;
+        0
+    })
+}
+
+fn main() {
+    solve(|_| ());
+}