Update test to force error under NLL.

In each of the three cases in this test, there is a mutable borrow
of some field of the union and then a shared borrow of some other field
immediately following.

Under NLL, the mutable borrow is killed straight away as it isn't
used later - therefore not causing a conflict with the shared borrow.
This commit adds a use of the first mutable borrow to force the intended
errors to appear under NLL.
This commit is contained in:
David Wood 2018-11-04 18:36:30 +01:00
parent 1854dde30a
commit ba09ed5208
No known key found for this signature in database
GPG key ID: 01760B4F9F53F154
3 changed files with 65 additions and 26 deletions

View file

@ -1,33 +1,64 @@
error[E0502]: cannot borrow `u.y` as immutable because it is also borrowed as mutable
--> $DIR/union-borrow-move-parent-sibling.rs:25:13
|
LL | let a = &mut u.x.0;
| ---------- mutable borrow occurs here
LL | let b = &u.y; //~ ERROR cannot borrow `u.y`
| ^^^^ immutable borrow occurs here
LL | use_borrow(a);
| - mutable borrow later used here
error[E0382]: use of moved value: `u`
--> $DIR/union-borrow-move-parent-sibling.rs:29:13
--> $DIR/union-borrow-move-parent-sibling.rs:32:13
|
LL | let a = u.x.0;
| ----- value moved here
LL | let a = u.y; //~ ERROR use of moved value: `u.y`
LL | let b = u.y; //~ ERROR use of moved value: `u.y`
| ^^^ value used here after move
|
= note: move occurs because `u` has type `U`, which does not implement the `Copy` trait
error[E0502]: cannot borrow `u.y` as immutable because it is also borrowed as mutable
--> $DIR/union-borrow-move-parent-sibling.rs:38:13
|
LL | let a = &mut (u.x.0).0;
| -------------- mutable borrow occurs here
LL | let b = &u.y; //~ ERROR cannot borrow `u.y`
| ^^^^ immutable borrow occurs here
LL | use_borrow(a);
| - mutable borrow later used here
error[E0382]: use of moved value: `u`
--> $DIR/union-borrow-move-parent-sibling.rs:41:13
--> $DIR/union-borrow-move-parent-sibling.rs:45:13
|
LL | let a = (u.x.0).0;
| --------- value moved here
LL | let a = u.y; //~ ERROR use of moved value: `u.y`
LL | let b = u.y; //~ ERROR use of moved value: `u.y`
| ^^^ value used here after move
|
= note: move occurs because `u` has type `U`, which does not implement the `Copy` trait
error[E0502]: cannot borrow `u.x` as immutable because it is also borrowed as mutable
--> $DIR/union-borrow-move-parent-sibling.rs:51:13
|
LL | let a = &mut *u.y;
| --------- mutable borrow occurs here
LL | let b = &u.x; //~ ERROR cannot borrow `u` (via `u.x`)
| ^^^^ immutable borrow occurs here
LL | use_borrow(a);
| - mutable borrow later used here
error[E0382]: use of moved value: `u`
--> $DIR/union-borrow-move-parent-sibling.rs:53:13
--> $DIR/union-borrow-move-parent-sibling.rs:58:13
|
LL | let a = *u.y;
| ---- value moved here
LL | let a = u.x; //~ ERROR use of moved value: `u.x`
LL | let b = u.x; //~ ERROR use of moved value: `u.x`
| ^^^ value used here after move
|
= note: move occurs because `u` has type `U`, which does not implement the `Copy` trait
error: aborting due to 3 previous errors
error: aborting due to 6 previous errors
For more information about this error, try `rustc --explain E0382`.
Some errors occurred: E0382, E0502.
For more information about an error, try `rustc --explain E0382`.

View file

@ -17,40 +17,45 @@ union U {
y: Box<Vec<u8>>,
}
fn use_borrow<T>(_: &T) {}
unsafe fn parent_sibling_borrow() {
let mut u = U { x: ((Vec::new(), Vec::new()), Vec::new()) };
let a = &mut u.x.0;
let a = &u.y; //~ ERROR cannot borrow `u.y`
let b = &u.y; //~ ERROR cannot borrow `u.y`
use_borrow(a);
}
unsafe fn parent_sibling_move() {
let u = U { x: ((Vec::new(), Vec::new()), Vec::new()) };
let a = u.x.0;
let a = u.y; //~ ERROR use of moved value: `u.y`
let b = u.y; //~ ERROR use of moved value: `u.y`
}
unsafe fn grandparent_sibling_borrow() {
let mut u = U { x: ((Vec::new(), Vec::new()), Vec::new()) };
let a = &mut (u.x.0).0;
let a = &u.y; //~ ERROR cannot borrow `u.y`
let b = &u.y; //~ ERROR cannot borrow `u.y`
use_borrow(a);
}
unsafe fn grandparent_sibling_move() {
let u = U { x: ((Vec::new(), Vec::new()), Vec::new()) };
let a = (u.x.0).0;
let a = u.y; //~ ERROR use of moved value: `u.y`
let b = u.y; //~ ERROR use of moved value: `u.y`
}
unsafe fn deref_sibling_borrow() {
let mut u = U { y: Box::default() };
let a = &mut *u.y;
let a = &u.x; //~ ERROR cannot borrow `u` (via `u.x`)
let b = &u.x; //~ ERROR cannot borrow `u` (via `u.x`)
use_borrow(a);
}
unsafe fn deref_sibling_move() {
let u = U { x: ((Vec::new(), Vec::new()), Vec::new()) };
let a = *u.y;
let a = u.x; //~ ERROR use of moved value: `u.x`
let b = u.x; //~ ERROR use of moved value: `u.x`
}

View file

@ -1,59 +1,62 @@
error[E0502]: cannot borrow `u.y` as immutable because `u.x.0` is also borrowed as mutable
--> $DIR/union-borrow-move-parent-sibling.rs:23:14
--> $DIR/union-borrow-move-parent-sibling.rs:25:14
|
LL | let a = &mut u.x.0;
| ----- mutable borrow occurs here
LL | let a = &u.y; //~ ERROR cannot borrow `u.y`
LL | let b = &u.y; //~ ERROR cannot borrow `u.y`
| ^^^ immutable borrow occurs here
LL | use_borrow(a);
LL | }
| - mutable borrow ends here
error[E0382]: use of moved value: `u.y`
--> $DIR/union-borrow-move-parent-sibling.rs:29:9
--> $DIR/union-borrow-move-parent-sibling.rs:32:9
|
LL | let a = u.x.0;
| - value moved here
LL | let a = u.y; //~ ERROR use of moved value: `u.y`
LL | let b = u.y; //~ ERROR use of moved value: `u.y`
| ^ value used here after move
|
= note: move occurs because `u.y` has type `[type error]`, which does not implement the `Copy` trait
error[E0502]: cannot borrow `u.y` as immutable because `u.x.0.0` is also borrowed as mutable
--> $DIR/union-borrow-move-parent-sibling.rs:35:14
--> $DIR/union-borrow-move-parent-sibling.rs:38:14
|
LL | let a = &mut (u.x.0).0;
| --------- mutable borrow occurs here
LL | let a = &u.y; //~ ERROR cannot borrow `u.y`
LL | let b = &u.y; //~ ERROR cannot borrow `u.y`
| ^^^ immutable borrow occurs here
LL | use_borrow(a);
LL | }
| - mutable borrow ends here
error[E0382]: use of moved value: `u.y`
--> $DIR/union-borrow-move-parent-sibling.rs:41:9
--> $DIR/union-borrow-move-parent-sibling.rs:45:9
|
LL | let a = (u.x.0).0;
| - value moved here
LL | let a = u.y; //~ ERROR use of moved value: `u.y`
LL | let b = u.y; //~ ERROR use of moved value: `u.y`
| ^ value used here after move
|
= note: move occurs because `u.y` has type `[type error]`, which does not implement the `Copy` trait
error[E0502]: cannot borrow `u` (via `u.x`) as immutable because `u` is also borrowed as mutable (via `*u.y`)
--> $DIR/union-borrow-move-parent-sibling.rs:47:14
--> $DIR/union-borrow-move-parent-sibling.rs:51:14
|
LL | let a = &mut *u.y;
| ---- mutable borrow occurs here (via `*u.y`)
LL | let a = &u.x; //~ ERROR cannot borrow `u` (via `u.x`)
LL | let b = &u.x; //~ ERROR cannot borrow `u` (via `u.x`)
| ^^^ immutable borrow occurs here (via `u.x`)
LL | use_borrow(a);
LL | }
| - mutable borrow ends here
error[E0382]: use of moved value: `u.x`
--> $DIR/union-borrow-move-parent-sibling.rs:53:9
--> $DIR/union-borrow-move-parent-sibling.rs:58:9
|
LL | let a = *u.y;
| - value moved here
LL | let a = u.x; //~ ERROR use of moved value: `u.x`
LL | let b = u.x; //~ ERROR use of moved value: `u.x`
| ^ value used here after move
|
= note: move occurs because `u.x` has type `[type error]`, which does not implement the `Copy` trait