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