71 lines
1.6 KiB
Rust
71 lines
1.6 KiB
Rust
// Test that we have enough false edges to avoid exposing the exact matching
|
|
// algorithm in borrow checking.
|
|
|
|
#![feature(if_let_guard)]
|
|
|
|
fn guard_always_precedes_arm(y: i32) {
|
|
let mut x;
|
|
// x should always be initialized, as the only way to reach the arm is
|
|
// through the guard.
|
|
match y {
|
|
0 | 2 if { x = 2; true } => x,
|
|
_ => 2,
|
|
};
|
|
|
|
let mut x;
|
|
match y {
|
|
0 | 2 if let Some(()) = { x = 2; Some(()) } => x,
|
|
_ => 2,
|
|
};
|
|
}
|
|
|
|
fn guard_may_be_skipped(y: i32) {
|
|
let x;
|
|
// Even though x *is* always initialized, we don't want to have borrowck
|
|
// results be based on whether patterns are exhaustive.
|
|
match y {
|
|
_ if { x = 2; true } => 1,
|
|
_ if {
|
|
x; //~ ERROR E0381
|
|
false
|
|
} => 2,
|
|
_ => 3,
|
|
};
|
|
|
|
let x;
|
|
match y {
|
|
_ if let Some(()) = { x = 2; Some(()) } => 1,
|
|
_ if let Some(()) = {
|
|
x; //~ ERROR E0381
|
|
None
|
|
} => 2,
|
|
_ => 3,
|
|
};
|
|
}
|
|
|
|
fn guard_may_be_taken(y: bool) {
|
|
let x = String::new();
|
|
// Even though x *is* never moved before the use, we don't want to have
|
|
// borrowck results be based on whether patterns are disjoint.
|
|
match y {
|
|
false if { drop(x); true } => 1,
|
|
true => {
|
|
x; //~ ERROR use of moved value: `x`
|
|
2
|
|
}
|
|
false => 3,
|
|
};
|
|
|
|
let x = String::new();
|
|
match y {
|
|
false if let Some(()) = { drop(x); Some(()) } => 1,
|
|
true => {
|
|
x; //~ ERROR use of moved value: `x`
|
|
2
|
|
}
|
|
false => 3,
|
|
};
|
|
}
|
|
|
|
fn main() {}
|