2018-05-15 21:23:00 +00:00
|
|
|
// 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.
|
|
|
|
|
2022-12-21 15:29:35 +00:00
|
|
|
#![feature(if_let_guard)]
|
|
|
|
|
2018-05-15 21:23:00 +00:00
|
|
|
fn main() {
|
|
|
|
let b = &mut true;
|
|
|
|
match b {
|
2021-07-23 22:55:36 +00:00
|
|
|
//~^ ERROR use of moved value: `b` [E0382]
|
2018-05-15 21:23:00 +00:00
|
|
|
&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."),
|
|
|
|
}
|
2022-12-21 15:29:35 +00:00
|
|
|
|
|
|
|
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 => {}
|
|
|
|
_ => {}
|
|
|
|
}
|
2018-05-15 21:23:00 +00:00
|
|
|
}
|