| // 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() {} |