Skip to content

Commit bf446c8

Browse files
committed
Add address stability test for matches
1 parent 87ec3b2 commit bf446c8

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Check that `ref mut` variables don't change address between the match guard
2+
// and the arm expression.
3+
4+
// run-pass
5+
6+
#![feature(nll, bind_by_move_pattern_guards)]
7+
8+
// Test that z always point to the same temporary.
9+
fn referent_stability() {
10+
let p;
11+
match 0 {
12+
ref mut z if { p = z as *const _; true } => assert_eq!(p, z as *const _),
13+
_ => unreachable!(),
14+
};
15+
}
16+
17+
// Test that z is always effectively the same variable.
18+
fn variable_stability() {
19+
let p;
20+
match 0 {
21+
ref mut z if { p = &z as *const _; true } => assert_eq!(p, &z as *const _),
22+
_ => unreachable!(),
23+
};
24+
}
25+
26+
// Test that a borrow of *z can cross from the guard to the arm.
27+
fn persist_borrow() {
28+
let r;
29+
match 0 {
30+
ref mut z if { r = z as &_; true } => assert_eq!(*r, 0),
31+
_ => unreachable!(),
32+
}
33+
}
34+
35+
fn main() {
36+
referent_stability();
37+
variable_stability();
38+
persist_borrow();
39+
}

0 commit comments

Comments
 (0)