#![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() {}