summaryrefslogtreecommitdiffstats
path: root/src/test/ui/match/match-ref-mut-stability.rs
blob: 52120360be71e68816502a6e0431d390f61464a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 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();
}