// run-pass // This test illustrates that under NLL, we can remove our overly // conservative approach for disallowing mutations of match inputs. // See further discussion on rust-lang/rust#24535, // rust-lang/rfcs#1006, and rust-lang/rfcs#107 fn main() { rust_issue_24535(); rfcs_issue_1006_1(); rfcs_issue_1006_2(); } fn rust_issue_24535() { fn compare(a: &u8, b: &mut u8) -> bool { a == b } let a = 3u8; match a { 0 => panic!("nope"), 3 if compare(&a, &mut 3) => (), _ => panic!("nope"), } } fn rfcs_issue_1006_1() { let v = vec!["1".to_string(), "2".to_string(), "3".to_string()]; match Some(&v) { Some(iv) if iv.iter().any(|x| &x[..]=="2") => true, _ => panic!("nope"), }; } fn rfcs_issue_1006_2() { #[inline(always)] fn check<'a, I: Iterator>(mut i: I) -> bool { i.any(|&x| x == 2) } let slice = [1, 2, 3]; match 42 { _ if slice.iter().any(|&x| x == 2) => { true }, _ => { panic!("nope"); } }; // (This match is just illustrating how easy it was to circumvent // the checking performed for the previous `match`.) match 42 { _ if check(slice.iter()) => { true }, _ => { panic!("nope"); } }; }