clarify bind-by-move-neither-can-livee..

This commit is contained in:
Mazdak Farrokhzad 2019-12-15 04:09:47 +01:00
parent 6fa8f4a57b
commit 427b1c33e9
2 changed files with 72 additions and 4 deletions

View File

@ -1,3 +1,7 @@
// This test is taken directly from #16053.
// It checks that you cannot use an AND-pattern (`binding @ pat`)
// where one side is by-ref and the other is by-move.
#![feature(bindings_after_at)]
//~^ WARN the feature `bindings_after_at` is incomplete and may cause the compiler to crash
@ -9,4 +13,24 @@ fn main() {
Some(ref _y @ _z) => { }, //~ ERROR cannot bind by-move and by-ref in the same pattern
None => panic!()
}
let x = Some(X { x: () });
match x {
Some(_z @ ref _y) => { }, //~ ERROR cannot bind by-move with sub-bindings
//~^ ERROR borrow of moved value
None => panic!()
}
let mut x = Some(X { x: () });
match x {
Some(ref mut _y @ _z) => { }, //~ ERROR cannot bind by-move and by-ref in the same pattern
None => panic!()
}
let mut x = Some(X { x: () });
match x {
Some(_z @ ref mut _y) => { }, //~ ERROR cannot bind by-move with sub-bindings
//~^ ERROR borrow of moved value
None => panic!()
}
}

View File

@ -1,5 +1,5 @@
warning: the feature `bindings_after_at` is incomplete and may cause the compiler to crash
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:1:12
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:5:12
|
LL | #![feature(bindings_after_at)]
| ^^^^^^^^^^^^^^^^^
@ -7,7 +7,7 @@ LL | #![feature(bindings_after_at)]
= note: `#[warn(incomplete_features)]` on by default
error[E0009]: cannot bind by-move and by-ref in the same pattern
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:9:23
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:13:23
|
LL | Some(ref _y @ _z) => { },
| ---------^^
@ -15,6 +15,50 @@ LL | Some(ref _y @ _z) => { },
| | by-move pattern here
| by-ref pattern here
error: aborting due to previous error
error[E0007]: cannot bind by-move with sub-bindings
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:19:14
|
LL | Some(_z @ ref _y) => { },
| ^^^^^^^^^^^ binds an already bound by-move value by moving it
For more information about this error, try `rustc --explain E0009`.
error[E0009]: cannot bind by-move and by-ref in the same pattern
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:26:27
|
LL | Some(ref mut _y @ _z) => { },
| -------------^^
| | |
| | by-move pattern here
| by-ref pattern here
error[E0007]: cannot bind by-move with sub-bindings
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:32:14
|
LL | Some(_z @ ref mut _y) => { },
| ^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it
error[E0382]: borrow of moved value
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:19:19
|
LL | Some(_z @ ref _y) => { },
| -----^^^^^^
| | |
| | value borrowed here after move
| value moved here
|
= note: move occurs because value has type `X`, which does not implement the `Copy` trait
error[E0382]: borrow of moved value
--> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:32:19
|
LL | Some(_z @ ref mut _y) => { },
| -----^^^^^^^^^^
| | |
| | value borrowed here after move
| value moved here
|
= note: move occurs because value has type `X`, which does not implement the `Copy` trait
error: aborting due to 6 previous errors
Some errors have detailed explanations: E0007, E0009, E0382.
For more information about an error, try `rustc --explain E0007`.