about summary refs log tree commit diff
path: root/tests/ui/pattern
diff options
context:
space:
mode:
authordianne <diannes.gm@gmail.com>2025-03-13 22:34:26 -0700
committerdianne <diannes.gm@gmail.com>2025-04-16 15:42:12 -0700
commitff0d4bc743086111c841812ec9925efb075d1243 (patch)
tree3ed45163c0601ff83abd8a9544089e36efa4c736 /tests/ui/pattern
parent977c9ab7a2ead006e06b1b78cc1b6ac63245560b (diff)
downloadrust-ff0d4bc743086111c841812ec9925efb075d1243.tar.gz
rust-ff0d4bc743086111c841812ec9925efb075d1243.zip
upvar inference for implicit deref patterns
Diffstat (limited to 'tests/ui/pattern')
-rw-r--r--tests/ui/pattern/deref-patterns/closure_capture.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/tests/ui/pattern/deref-patterns/closure_capture.rs b/tests/ui/pattern/deref-patterns/closure_capture.rs
index fc0ddedac2b..08586b6c7ab 100644
--- a/tests/ui/pattern/deref-patterns/closure_capture.rs
+++ b/tests/ui/pattern/deref-patterns/closure_capture.rs
@@ -11,6 +11,15 @@ fn main() {
     assert_eq!(b.len(), 3);
     f();
 
+    let v = vec![1, 2, 3];
+    let f = || {
+        // this should count as a borrow of `v` as a whole
+        let [.., x] = v else { unreachable!() };
+        assert_eq!(x, 3);
+    };
+    assert_eq!(v, [1, 2, 3]);
+    f();
+
     let mut b = Box::new("aaa".to_string());
     let mut f = || {
         let deref!(ref mut s) = b else { unreachable!() };
@@ -18,4 +27,22 @@ fn main() {
     };
     f();
     assert_eq!(b.len(), 5);
+
+    let mut v = vec![1, 2, 3];
+    let mut f = || {
+        // this should count as a mutable borrow of `v` as a whole
+        let [.., ref mut x] = v else { unreachable!() };
+        *x = 4;
+    };
+    f();
+    assert_eq!(v, [1, 2, 4]);
+
+    let mut v = vec![1, 2, 3];
+    let mut f = || {
+        // here, `[.., x]` is adjusted by both an overloaded deref and a builtin deref
+        let [.., x] = &mut v else { unreachable!() };
+        *x = 4;
+    };
+    f();
+    assert_eq!(v, [1, 2, 4]);
 }