Skip to content

Commit

Permalink
Update test to force error under NLL.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
davidtwco committed Nov 4, 2018
1 parent 1854dde commit ba09ed5
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 26 deletions.
47 changes: 39 additions & 8 deletions src/test/ui/union/union-borrow-move-parent-sibling.nll.stderr
@@ -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`.
17 changes: 11 additions & 6 deletions src/test/ui/union/union-borrow-move-parent-sibling.rs
Expand Up @@ -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`
}


Expand Down
27 changes: 15 additions & 12 deletions src/test/ui/union/union-borrow-move-parent-sibling.stderr
@@ -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
Expand Down

0 comments on commit ba09ed5

Please sign in to comment.