summaryrefslogtreecommitdiffstats
path: root/tests/ui/nll/issue-27282-move-match-input-into-guard.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tests/ui/nll/issue-27282-move-match-input-into-guard.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/ui/nll/issue-27282-move-match-input-into-guard.rs b/tests/ui/nll/issue-27282-move-match-input-into-guard.rs
new file mode 100644
index 000000000..85feda582
--- /dev/null
+++ b/tests/ui/nll/issue-27282-move-match-input-into-guard.rs
@@ -0,0 +1,34 @@
+// 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.
+
+#![feature(if_let_guard)]
+
+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."),
+ }
+
+ let b = &mut true;
+ match b {
+ //~^ ERROR use of moved value: `b` [E0382]
+ &mut false => {}
+ _ if let Some(()) = {
+ (|| { let bar = b; *bar = false; })();
+ None
+ } => {}
+ &mut true => {}
+ _ => {}
+ }
+}