// Test that a (partially) mutably borrowed place can be matched on, so long as // we don't have to read any values that are mutably borrowed to determine // which arm to take. // // Test that we don't allow mutating the value being matched on in a way that // changes which patterns it matches, until we have chosen an arm. struct A(i32, i32); fn struct_example(mut a: A) { let x = &mut a.0; match a { // OK, no access of borrowed data _ if false => (), A(_, r) => (), } x; } fn indirect_struct_example(mut b: &mut A) { let x = &mut b.0; match *b { // OK, no access of borrowed data _ if false => (), A(_, r) => (), } x; } fn underscore_example(mut c: i32) { let r = &mut c; match c { // OK, no access of borrowed data (or any data at all) _ if false => (), _ => (), } r; } enum E { V(i32, i32), W, } fn enum_example(mut e: E) { let x = match e { E::V(ref mut x, _) => x, E::W => panic!(), }; match e { // Don't know that E uses a tag for its discriminant //~^ ERROR _ if false => (), E::V(_, r) => (), E::W => (), } x; } fn indirect_enum_example(mut f: &mut E) { let x = match *f { E::V(ref mut x, _) => x, E::W => panic!(), }; match f { // Don't know that E uses a tag for its discriminant //~^ ERROR _ if false => (), E::V(_, r) => (), E::W => (), } x; } fn match_on_muatbly_borrowed_ref(mut p: &bool) { let r = &mut p; match *p { // OK, no access at all _ if false => (), _ => (), } r; } fn match_on_borrowed(mut t: bool) { let x = &mut t; match t { //~^ ERROR true => (), false => (), } x; } enum Never {} fn never_init() { let n: Never; match n {} //~ ERROR } fn main() {}