98 lines
1.7 KiB
Rust
98 lines
1.7 KiB
Rust
#![feature(if_let_guard)]
|
|
#![feature(let_chains)]
|
|
#![allow(irrefutable_let_patterns)]
|
|
|
|
fn same_pattern(c: bool) {
|
|
let x: Box<_> = Box::new(1);
|
|
|
|
let v = (1, 2);
|
|
|
|
match v {
|
|
(1, 2) if let y = x && c => (),
|
|
(1, 2) if let z = x => (), //~ ERROR use of moved value: `x`
|
|
_ => (),
|
|
}
|
|
}
|
|
|
|
fn same_pattern_ok(c: bool) {
|
|
let x: Box<_> = Box::new(1);
|
|
|
|
let v = (1, 2);
|
|
|
|
match v {
|
|
(1, 2) if c && let y = x => (),
|
|
(1, 2) if let z = x => (),
|
|
_ => (),
|
|
}
|
|
}
|
|
|
|
fn different_patterns(c: bool) {
|
|
let x: Box<_> = Box::new(1);
|
|
|
|
let v = (1, 2);
|
|
|
|
match v {
|
|
(1, _) if let y = x && c => (),
|
|
(_, 2) if let z = x => (), //~ ERROR use of moved value: `x`
|
|
_ => (),
|
|
}
|
|
}
|
|
|
|
fn different_patterns_ok(c: bool) {
|
|
let x: Box<_> = Box::new(1);
|
|
|
|
let v = (1, 2);
|
|
|
|
match v {
|
|
(1, _) if c && let y = x => (),
|
|
(_, 2) if let z = x => (),
|
|
_ => (),
|
|
}
|
|
}
|
|
|
|
fn or_pattern(c: bool) {
|
|
let x: Box<_> = Box::new(1);
|
|
|
|
let v = (1, 2);
|
|
|
|
match v {
|
|
(1, _) | (_, 2) if let y = x && c => (), //~ ERROR use of moved value: `x`
|
|
_ => (),
|
|
}
|
|
}
|
|
|
|
fn or_pattern_ok(c: bool) {
|
|
let x: Box<_> = Box::new(1);
|
|
|
|
let v = (1, 2);
|
|
|
|
match v {
|
|
(1, _) | (_, 2) if c && let y = x => (),
|
|
_ => (),
|
|
}
|
|
}
|
|
|
|
fn use_in_arm(c: bool) {
|
|
let x: Box<_> = Box::new(1);
|
|
|
|
let v = (1, 2);
|
|
|
|
match v {
|
|
(1, 2) if let y = x && c => false,
|
|
_ => { *x == 1 }, //~ ERROR use of moved value: `x`
|
|
};
|
|
}
|
|
|
|
fn use_in_arm_ok(c: bool) {
|
|
let x: Box<_> = Box::new(1);
|
|
|
|
let v = (1, 2);
|
|
|
|
match v {
|
|
(1, 2) if c && let y = x => false,
|
|
_ => { *x == 1 },
|
|
};
|
|
}
|
|
|
|
fn main() {}
|