Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Add address stability test for matches
- Loading branch information
1 parent
87ec3b2
commit bf446c8
Showing
1 changed file
with
39 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
// Check that `ref mut` variables don't change address between the match guard | ||
// and the arm expression. | ||
|
||
// run-pass | ||
|
||
#![feature(nll, bind_by_move_pattern_guards)] | ||
|
||
// 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(); | ||
} |