| // Check that `ref mut` variables don't change address between the match guard | |
| // and the arm expression. | |
| //@ run-pass | |
| // Test that z always point to the same temporary. | |
| fn referent_stability() { | |
| let p; | |
| match 0 { | |
| ref mut z if { p = z as *const _; true } => assert_eq!(p, z as *const _), | |
| _ => unreachable!(), | |
| }; | |
| } | |
| // Test that z is always effectively the same variable. | |
| fn variable_stability() { | |
| let p; | |
| match 0 { | |
| ref mut z if { p = &z as *const _; true } => assert_eq!(p, &z as *const _), | |
| _ => unreachable!(), | |
| }; | |
| } | |
| // Test that a borrow of *z can cross from the guard to the arm. | |
| fn persist_borrow() { | |
| let r; | |
| match 0 { | |
| ref mut z if { r = z as &_; true } => assert_eq!(*r, 0), | |
| _ => unreachable!(), | |
| } | |
| } | |
| fn main() { | |
| referent_stability(); | |
| variable_stability(); | |
| persist_borrow(); | |
| } |