summaryrefslogtreecommitdiffstats
path: root/src/test/ui/nll/issue-27282-move-match-input-into-guard.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/nll/issue-27282-move-match-input-into-guard.rs')
-rw-r--r--src/test/ui/nll/issue-27282-move-match-input-into-guard.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/test/ui/nll/issue-27282-move-match-input-into-guard.rs b/src/test/ui/nll/issue-27282-move-match-input-into-guard.rs
new file mode 100644
index 000000000..4109c10e2
--- /dev/null
+++ b/src/test/ui/nll/issue-27282-move-match-input-into-guard.rs
@@ -0,0 +1,20 @@
+// Issue 27282: Example 2: This sidesteps the AST checks disallowing
+// mutable borrows in match guards by hiding the mutable borrow in a
+// guard behind a move (of the mutably borrowed match input) within a
+// closure.
+//
+// This example is not rejected by AST borrowck (and then reliably
+// reaches the panic code when executed, despite the compiler warning
+// about that match arm being unreachable.
+
+fn main() {
+ let b = &mut true;
+ match b {
+ //~^ ERROR use of moved value: `b` [E0382]
+ &mut false => {},
+ _ if { (|| { let bar = b; *bar = false; })();
+ false } => { },
+ &mut true => { println!("You might think we should get here"); },
+ _ => panic!("surely we could never get here, since rustc warns it is unreachable."),
+ }
+}