harden & split borrowck-pat-at-and-box

This commit is contained in:
Mazdak Farrokhzad 2019-12-15 04:29:34 +01:00
parent 48f2766522
commit e39abcfad9
4 changed files with 139 additions and 62 deletions

View File

@ -0,0 +1,77 @@
// check-pass
// Test `@` patterns combined with `box` patterns.
#![feature(bindings_after_at)]
//~^ WARN the feature `bindings_after_at` is incomplete and may cause the compiler to crash
#![feature(box_patterns)]
#![feature(slice_patterns)]
#[derive(Copy, Clone)]
struct C;
fn c() -> C { C }
struct NC;
fn nc() -> NC { NC }
fn main() {
let ref a @ box b = Box::new(C); // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
let ref a @ box b = Box::new(c()); // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
fn f3(ref a @ box b: Box<C>) { // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
}
match Box::new(c()) {
ref a @ box b => { // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
}
}
let ref a @ box ref b = Box::new(NC); // OK.
drop(a);
drop(b);
fn f4(ref a @ box ref b: Box<NC>) { // OK.
drop(a);
drop(b)
}
match Box::new(nc()) {
ref a @ box ref b => { // OK.
drop(a);
drop(b);
}
}
match Box::new([Ok(c()), Err(nc()), Ok(c())]) {
box [Ok(a), ref xs @ .., Err(ref b)] => {
let _: C = a;
let _: &[Result<C, NC>; 1] = xs;
let _: &NC = b;
}
_ => {}
}
match [Ok(Box::new(c())), Err(Box::new(nc())), Ok(Box::new(c())), Ok(Box::new(c()))] {
[Ok(box a), ref xs @ .., Err(box ref b), Err(box ref c)] => {
let _: C = a;
let _: &[Result<Box<C>, Box<NC>>; 1] = xs;
let _: &NC = b;
let _: &NC = c;
}
_ => {}
}
}

View File

@ -0,0 +1,8 @@
warning: the feature `bindings_after_at` is incomplete and may cause the compiler to crash
--> $DIR/borrowck-pat-at-and-box-pass.rs:5:12
|
LL | #![feature(bindings_after_at)]
| ^^^^^^^^^^^^^^^^^
|
= note: `#[warn(incomplete_features)]` on by default

View File

@ -3,6 +3,7 @@
#![feature(bindings_after_at)]
//~^ WARN the feature `bindings_after_at` is incomplete and may cause the compiler to crash
#![feature(box_patterns)]
#![feature(slice_patterns)]
#[derive(Copy, Clone)]
struct C;
@ -34,47 +35,8 @@ fn main() {
//~^ ERROR cannot bind by-move with sub-bindings
//~| ERROR use of moved value
let ref a @ box b = Box::new(C); // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
let ref a @ box b = Box::new(c()); // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
fn f3(ref a @ box b: Box<C>) { // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
}
match Box::new(c()) {
ref a @ box b => { // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
}
}
let ref a @ box b = Box::new(NC); //~ ERROR cannot bind by-move and by-ref in the same pattern
let ref a @ box ref b = Box::new(NC); // OK.
drop(a);
drop(b);
fn f4(ref a @ box ref b: Box<NC>) { // OK.
drop(a);
drop(b)
}
match Box::new(nc()) {
ref a @ box ref b => { // OK.
drop(a);
drop(b);
}
}
let ref a @ box ref mut b = Box::new(nc());
//~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable
let ref a @ box ref mut b = Box::new(NC);
@ -109,4 +71,16 @@ fn main() {
drop(b);
}
}
match Box::new([Ok(c()), Err(nc()), Ok(c())]) {
box [Ok(a), ref xs @ .., Err(b)] => {}
//~^ ERROR cannot bind by-move and by-ref in the same pattern
_ => {}
}
match [Ok(Box::new(c())), Err(Box::new(nc())), Ok(Box::new(c())), Ok(Box::new(c()))] {
[Ok(box ref a), ref xs @ .., Err(box b), Err(box ref mut c)] => {}
//~^ ERROR cannot bind by-move and by-ref in the same pattern
_ => {}
}
}

View File

@ -7,25 +7,25 @@ LL | #![feature(bindings_after_at)]
= note: `#[warn(incomplete_features)]` on by default
error[E0007]: cannot bind by-move with sub-bindings
--> $DIR/borrowck-pat-at-and-box.rs:17:9
--> $DIR/borrowck-pat-at-and-box.rs:18:9
|
LL | let a @ box &b = Box::new(&C);
| ^^^^^^^^^^ binds an already bound by-move value by moving it
error[E0007]: cannot bind by-move with sub-bindings
--> $DIR/borrowck-pat-at-and-box.rs:21:9
--> $DIR/borrowck-pat-at-and-box.rs:22:9
|
LL | let a @ box b = Box::new(C);
| ^^^^^^^^^ binds an already bound by-move value by moving it
error[E0007]: cannot bind by-move with sub-bindings
--> $DIR/borrowck-pat-at-and-box.rs:33:25
--> $DIR/borrowck-pat-at-and-box.rs:34:25
|
LL | match Box::new(C) { a @ box b => {} }
| ^^^^^^^^^ binds an already bound by-move value by moving it
error[E0009]: cannot bind by-move and by-ref in the same pattern
--> $DIR/borrowck-pat-at-and-box.rs:60:21
--> $DIR/borrowck-pat-at-and-box.rs:38:21
|
LL | let ref a @ box b = Box::new(NC);
| ------------^
@ -34,7 +34,7 @@ LL | let ref a @ box b = Box::new(NC);
| by-ref pattern here
error: cannot borrow `a` as mutable because it is also borrowed as immutable
--> $DIR/borrowck-pat-at-and-box.rs:78:9
--> $DIR/borrowck-pat-at-and-box.rs:40:9
|
LL | let ref a @ box ref mut b = Box::new(nc());
| -----^^^^^^^---------
@ -43,7 +43,7 @@ LL | let ref a @ box ref mut b = Box::new(nc());
| immutable borrow occurs here
error: cannot borrow `a` as mutable because it is also borrowed as immutable
--> $DIR/borrowck-pat-at-and-box.rs:80:9
--> $DIR/borrowck-pat-at-and-box.rs:42:9
|
LL | let ref a @ box ref mut b = Box::new(NC);
| -----^^^^^^^---------
@ -52,7 +52,7 @@ LL | let ref a @ box ref mut b = Box::new(NC);
| immutable borrow occurs here
error: cannot borrow `a` as mutable because it is also borrowed as immutable
--> $DIR/borrowck-pat-at-and-box.rs:82:9
--> $DIR/borrowck-pat-at-and-box.rs:44:9
|
LL | let ref a @ box ref mut b = Box::new(NC);
| -----^^^^^^^---------
@ -61,7 +61,7 @@ LL | let ref a @ box ref mut b = Box::new(NC);
| immutable borrow occurs here
error: cannot borrow `a` as mutable because it is also borrowed as immutable
--> $DIR/borrowck-pat-at-and-box.rs:85:9
--> $DIR/borrowck-pat-at-and-box.rs:47:9
|
LL | let ref a @ box ref mut b = Box::new(NC);
| -----^^^^^^^---------
@ -70,7 +70,7 @@ LL | let ref a @ box ref mut b = Box::new(NC);
| immutable borrow occurs here
error: cannot borrow `a` as immutable because it is also borrowed as mutable
--> $DIR/borrowck-pat-at-and-box.rs:91:9
--> $DIR/borrowck-pat-at-and-box.rs:53:9
|
LL | let ref mut a @ box ref b = Box::new(NC);
| ---------^^^^^^^-----
@ -79,7 +79,7 @@ LL | let ref mut a @ box ref b = Box::new(NC);
| mutable borrow occurs here
error: cannot borrow `a` as immutable because it is also borrowed as mutable
--> $DIR/borrowck-pat-at-and-box.rs:105:9
--> $DIR/borrowck-pat-at-and-box.rs:67:9
|
LL | ref mut a @ box ref b => {
| ---------^^^^^^^-----
@ -87,20 +87,38 @@ LL | ref mut a @ box ref b => {
| | immutable borrow occurs here
| mutable borrow occurs here
error[E0009]: cannot bind by-move and by-ref in the same pattern
--> $DIR/borrowck-pat-at-and-box.rs:76:38
|
LL | box [Ok(a), ref xs @ .., Err(b)] => {}
| ----------- ^ by-move pattern here
| |
| by-ref pattern here
error[E0009]: cannot bind by-move and by-ref in the same pattern
--> $DIR/borrowck-pat-at-and-box.rs:82:46
|
LL | [Ok(box ref a), ref xs @ .., Err(box b), Err(box ref mut c)] => {}
| ----- ----------- ^ --------- by-ref pattern here
| | | |
| | | by-move pattern here
| | by-ref pattern here
| by-ref pattern here
error[E0007]: cannot bind by-move with sub-bindings
--> $DIR/borrowck-pat-at-and-box.rs:25:11
--> $DIR/borrowck-pat-at-and-box.rs:26:11
|
LL | fn f1(a @ box &b: Box<&C>) {}
| ^^^^^^^^^^ binds an already bound by-move value by moving it
error[E0007]: cannot bind by-move with sub-bindings
--> $DIR/borrowck-pat-at-and-box.rs:29:11
--> $DIR/borrowck-pat-at-and-box.rs:30:11
|
LL | fn f2(a @ box b: Box<C>) {}
| ^^^^^^^^^ binds an already bound by-move value by moving it
error: cannot borrow `a` as immutable because it is also borrowed as mutable
--> $DIR/borrowck-pat-at-and-box.rs:97:11
--> $DIR/borrowck-pat-at-and-box.rs:59:11
|
LL | fn f5(ref mut a @ box ref b: Box<NC>) {
| ---------^^^^^^^-----
@ -109,7 +127,7 @@ LL | fn f5(ref mut a @ box ref b: Box<NC>) {
| mutable borrow occurs here
error[E0382]: use of moved value
--> $DIR/borrowck-pat-at-and-box.rs:17:18
--> $DIR/borrowck-pat-at-and-box.rs:18:18
|
LL | let a @ box &b = Box::new(&C);
| ---------^ ------------ move occurs because value has type `std::boxed::Box<&C>`, which does not implement the `Copy` trait
@ -118,7 +136,7 @@ LL | let a @ box &b = Box::new(&C);
| value moved here
error[E0382]: use of moved value
--> $DIR/borrowck-pat-at-and-box.rs:21:17
--> $DIR/borrowck-pat-at-and-box.rs:22:17
|
LL | let a @ box b = Box::new(C);
| --------^ ----------- move occurs because value has type `std::boxed::Box<C>`, which does not implement the `Copy` trait
@ -127,7 +145,7 @@ LL | let a @ box b = Box::new(C);
| value moved here
error[E0382]: use of moved value
--> $DIR/borrowck-pat-at-and-box.rs:33:33
--> $DIR/borrowck-pat-at-and-box.rs:34:33
|
LL | match Box::new(C) { a @ box b => {} }
| ----------- --------^
@ -137,7 +155,7 @@ LL | match Box::new(C) { a @ box b => {} }
| move occurs because value has type `std::boxed::Box<C>`, which does not implement the `Copy` trait
error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable
--> $DIR/borrowck-pat-at-and-box.rs:85:21
--> $DIR/borrowck-pat-at-and-box.rs:47:21
|
LL | let ref a @ box ref mut b = Box::new(NC);
| ------------^^^^^^^^^
@ -149,7 +167,7 @@ LL | drop(a);
| - immutable borrow later used here
error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable
--> $DIR/borrowck-pat-at-and-box.rs:91:25
--> $DIR/borrowck-pat-at-and-box.rs:53:25
|
LL | let ref mut a @ box ref b = Box::new(NC);
| ----------------^^^^^
@ -161,7 +179,7 @@ LL | *a = Box::new(NC);
| -- mutable borrow later used here
error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable
--> $DIR/borrowck-pat-at-and-box.rs:105:25
--> $DIR/borrowck-pat-at-and-box.rs:67:25
|
LL | ref mut a @ box ref b => {
| ----------------^^^^^
@ -173,7 +191,7 @@ LL | *a = Box::new(NC);
| -- mutable borrow later used here
error[E0382]: use of moved value
--> $DIR/borrowck-pat-at-and-box.rs:25:20
--> $DIR/borrowck-pat-at-and-box.rs:26:20
|
LL | fn f1(a @ box &b: Box<&C>) {}
| ---------^
@ -183,7 +201,7 @@ LL | fn f1(a @ box &b: Box<&C>) {}
| move occurs because value has type `std::boxed::Box<&C>`, which does not implement the `Copy` trait
error[E0382]: use of moved value
--> $DIR/borrowck-pat-at-and-box.rs:29:19
--> $DIR/borrowck-pat-at-and-box.rs:30:19
|
LL | fn f2(a @ box b: Box<C>) {}
| --------^
@ -193,7 +211,7 @@ LL | fn f2(a @ box b: Box<C>) {}
| move occurs because value has type `std::boxed::Box<C>`, which does not implement the `Copy` trait
error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable
--> $DIR/borrowck-pat-at-and-box.rs:97:27
--> $DIR/borrowck-pat-at-and-box.rs:59:27
|
LL | fn f5(ref mut a @ box ref b: Box<NC>) {
| ----------------^^^^^
@ -204,7 +222,7 @@ LL | fn f5(ref mut a @ box ref b: Box<NC>) {
LL | *a = Box::new(NC);
| -- mutable borrow later used here
error: aborting due to 22 previous errors
error: aborting due to 24 previous errors
Some errors have detailed explanations: E0007, E0009, E0382, E0502.
For more information about an error, try `rustc --explain E0007`.