Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tests transcribed from nikos blog post.
- Loading branch information
Showing
3 changed files
with
101 additions
and
0 deletions.
There are no files selected for viewing
37 changes: 37 additions & 0 deletions
37
src/test/compile-fail/borrowck/two-phase-allow-access-during-reservation.rs
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,37 @@ | ||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// revisions: lxl nll | ||
//[lxl]compile-flags: -Z borrowck=mir -Z two-phase-borrows | ||
//[nll]compile-flags: -Z borrowck=mir -Z two-phase-borrows -Z nll | ||
|
||
// This is the second counter-example from Niko's blog post | ||
// smallcultfollowing.com/babysteps/blog/2017/03/01/nested-method-calls-via-two-phase-borrowing/ | ||
// | ||
// It is "artificial". It is meant to illustrate directly that we | ||
// should allow an aliasing access during reservation, but *not* while | ||
// the mutable borrow is active. | ||
|
||
fn main() { | ||
/*0*/ let mut i = 0; | ||
|
||
/*1*/ let p = &mut i; // (reservation of `i` starts here) | ||
|
||
/*2*/ let j = i; // OK: `i` is only reserved here | ||
|
||
/*3*/ *p += 1; // (mutable borrow of `i` starts here, since `p` is used) | ||
|
||
/*4*/ let k = i; //[lxl]~ ERROR cannot use `i` because it was mutably borrowed [E0503] | ||
//[nll]~^ ERROR cannot use `i` because it was mutably borrowed [E0503] | ||
|
||
/*5*/ *p += 1; | ||
|
||
let _ = (j, k, p); | ||
} |
34 changes: 34 additions & 0 deletions
34
src/test/compile-fail/borrowck/two-phase-cannot-nest-mut-self-calls.rs
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,34 @@ | ||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// revisions: lxl nll | ||
//[lxl]compile-flags: -Z borrowck=mir -Z two-phase-borrows | ||
//[nll]compile-flags: -Z borrowck=mir -Z two-phase-borrows -Z nll | ||
|
||
// This is the third counter-example from Niko's blog post | ||
// smallcultfollowing.com/babysteps/blog/2017/03/01/nested-method-calls-via-two-phase-borrowing/ | ||
// | ||
// It shows that not all nested method calls on `self` are magically | ||
// allowed by this change. In particular, a nested `&mut` borrow is | ||
// still disallowed. | ||
|
||
fn main() { | ||
|
||
|
||
let mut vec = vec![0, 1]; | ||
vec.get({ | ||
|
||
vec.push(2); | ||
//[lxl]~^ ERROR cannot borrow `vec` as mutable because it is also borrowed as immutable | ||
//[nll]~^^ ERROR cannot borrow `vec` as mutable because it is also borrowed as immutable | ||
|
||
0 | ||
}); | ||
} |
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,30 @@ | ||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// revisions: lxl nll | ||
//[lxl]compile-flags: -Z borrowck=mir -Z two-phase-borrows | ||
//[nll]compile-flags: -Z borrowck=mir -Z two-phase-borrows -Z nll | ||
|
||
// This is the first counter-example from Niko's blog post | ||
// smallcultfollowing.com/babysteps/blog/2017/03/01/nested-method-calls-via-two-phase-borrowing/ | ||
// of a danger for code to crash if we just turned off the check for whether | ||
// a mutable-borrow aliases another borrow. | ||
|
||
fn main() { | ||
let mut v: Vec<String> = vec![format!("Hello, ")]; | ||
v[0].push_str({ | ||
|
||
v.push(format!("foo")); | ||
//[lxl]~^ ERROR cannot borrow `v` as mutable more than once at a time [E0499] | ||
//[nll]~^^ ERROR cannot borrow `v` as mutable more than once at a time [E0499] | ||
|
||
"World!" | ||
}); | ||
} |