about summary refs log tree commit diff
path: root/tests/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs')
-rw-r--r--tests/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs b/tests/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs
new file mode 100644
index 00000000000..dfd4d02854d
--- /dev/null
+++ b/tests/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs
@@ -0,0 +1,48 @@
+// Ensures the independence of each side in `binding @ subpat`
+// determine their binding modes independently of each other.
+//
+// That is, `binding` does not influence `subpat`.
+// This is important because we might want to allow `p1 @ p2`,
+// where both `p1` and `p2` are syntactically unrestricted patterns.
+// If `binding` is allowed to influence `subpat`,
+// this would create problems for the generalization aforementioned.
+
+
+fn main() {
+    struct NotCopy;
+
+    fn f1(a @ b: &NotCopy) { // OK
+        let _: &NotCopy = a;
+    }
+    fn f2(ref a @ b: &NotCopy) {
+        let _: &&NotCopy = a; // Ok
+    }
+
+    let a @ b = &NotCopy; // OK
+    let _: &NotCopy = a;
+    let ref a @ b = &NotCopy; // OK
+    let _: &&NotCopy = a;
+
+    let ref a @ b = NotCopy; //~ ERROR cannot move out of value because it is borrowed
+    let _a: &NotCopy = a;
+    let _b: NotCopy = b;
+    let ref mut a @ b = NotCopy; //~ ERROR cannot move out of value because it is borrowed
+    //~^ ERROR borrow of moved value
+    let _a: &NotCopy = a;
+    let _b: NotCopy = b;
+    match Ok(NotCopy) {
+        Ok(ref a @ b) | Err(b @ ref a) => {
+            //~^ ERROR cannot move out of value because it is borrowed
+            //~| ERROR borrow of moved value
+            let _a: &NotCopy = a;
+            let _b: NotCopy = b;
+        }
+    }
+    match NotCopy {
+        ref a @ b => {
+            //~^ ERROR cannot move out of value because it is borrowed
+            let _a: &NotCopy = a;
+            let _b: NotCopy = b;
+        }
+    }
+}