mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 10:13:54 +00:00
Rollup merge of #69817 - thekuom:test/borrow-checking-pattern-features, r=Centril
test(patterns): add patterns feature tests to borrowck test suite Addresses request here: https://github.com/rust-lang/rust/pull/69690#issuecomment-595763571 Fixes https://github.com/rust-lang/rust/issues/67311. r? @Centril
This commit is contained in:
commit
08095f4978
@ -0,0 +1,224 @@
|
||||
// Tests using a combination of pattern features has the expected borrow checking behavior
|
||||
#![feature(bindings_after_at)]
|
||||
#![feature(or_patterns)]
|
||||
#![feature(box_patterns)]
|
||||
|
||||
#![feature(move_ref_pattern)]
|
||||
|
||||
enum Test {
|
||||
Foo,
|
||||
Bar,
|
||||
_Baz,
|
||||
}
|
||||
|
||||
// bindings_after_at + slice_patterns
|
||||
|
||||
fn bindings_after_at_slice_patterns_move_binding(x: [String; 4]) {
|
||||
match x {
|
||||
a @ [.., _] => (),
|
||||
_ => (),
|
||||
};
|
||||
|
||||
&x;
|
||||
//~^ ERROR borrow of moved value
|
||||
}
|
||||
|
||||
fn bindings_after_at_slice_patterns_borrows_binding_mut(mut x: [String; 4]) {
|
||||
let r = match x {
|
||||
ref mut foo @ [.., _] => Some(foo),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn bindings_after_at_slice_patterns_borrows_slice_mut1(mut x: [String; 4]) {
|
||||
let r = match x {
|
||||
ref foo @ [.., ref mut bar] => (),
|
||||
//~^ ERROR cannot borrow
|
||||
_ => (),
|
||||
};
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn bindings_after_at_slice_patterns_borrows_slice_mut2(mut x: [String; 4]) {
|
||||
let r = match x {
|
||||
[ref foo @ .., ref bar] => Some(foo),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn bindings_after_at_slice_patterns_borrows_both(mut x: [String; 4]) {
|
||||
let r = match x {
|
||||
ref foo @ [.., ref bar] => Some(foo),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
// bindings_after_at + or_patterns
|
||||
|
||||
fn bindings_after_at_or_patterns_move(x: Option<Test>) {
|
||||
match x {
|
||||
foo @ Some(Test::Foo | Test::Bar) => (),
|
||||
_ => (),
|
||||
}
|
||||
|
||||
&x;
|
||||
//~^ ERROR borrow of moved value
|
||||
}
|
||||
|
||||
fn bindings_after_at_or_patterns_borrows(mut x: Option<Test>) {
|
||||
let r = match x {
|
||||
ref foo @ Some(Test::Foo | Test::Bar) => Some(foo),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn bindings_after_at_or_patterns_borrows_mut(mut x: Option<Test>) {
|
||||
let r = match x {
|
||||
ref mut foo @ Some(Test::Foo | Test::Bar) => Some(foo),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
// bindings_after_at + box_patterns
|
||||
|
||||
fn bindings_after_at_box_patterns_borrows_both(mut x: Option<Box<String>>) {
|
||||
let r = match x {
|
||||
ref foo @ Some(box ref s) => Some(foo),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn bindings_after_at_box_patterns_borrows_mut(mut x: Option<Box<String>>) {
|
||||
match x {
|
||||
ref foo @ Some(box ref mut s) => (),
|
||||
//~^ ERROR cannot borrow
|
||||
_ => (),
|
||||
};
|
||||
}
|
||||
|
||||
// bindings_after_at + slice_patterns + or_patterns
|
||||
|
||||
fn bindings_after_at_slice_patterns_or_patterns_moves(x: [Option<Test>; 4]) {
|
||||
match x {
|
||||
a @ [.., Some(Test::Foo | Test::Bar)] => (),
|
||||
_ => (),
|
||||
};
|
||||
|
||||
&x;
|
||||
//~^ ERROR borrow of moved value
|
||||
}
|
||||
|
||||
fn bindings_after_at_slice_patterns_or_patterns_borrows_binding(mut x: [Option<Test>; 4]) {
|
||||
let r = match x {
|
||||
ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(a),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn bindings_after_at_slice_patterns_or_patterns_borrows_slice(mut x: [Option<Test>; 4]) {
|
||||
let r = match x {
|
||||
ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(b),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
// bindings_after_at + slice_patterns + box_patterns
|
||||
|
||||
fn bindings_after_at_slice_patterns_box_patterns_borrows(mut x: [Option<Box<String>>; 4]) {
|
||||
let r = match x {
|
||||
[_, ref a @ Some(box ref b), ..] => Some(a),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
// bindings_after_at + slice_patterns + or_patterns + box_patterns
|
||||
|
||||
fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows(
|
||||
mut x: [Option<Box<Test>>; 4]
|
||||
) {
|
||||
let r = match x {
|
||||
[_, ref a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows_mut(
|
||||
mut x: [Option<Box<Test>>; 4]
|
||||
) {
|
||||
let r = match x {
|
||||
[_, ref mut a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows_binding(
|
||||
mut x: [Option<Box<Test>>; 4]
|
||||
) {
|
||||
let r = match x {
|
||||
ref a @ [_, ref b @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
&mut x;
|
||||
//~^ ERROR cannot borrow
|
||||
|
||||
drop(r);
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,208 @@
|
||||
error: cannot borrow value as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:40:9
|
||||
|
|
||||
LL | ref foo @ [.., ref mut bar] => (),
|
||||
| -------^^^^^^^^-----------^
|
||||
| | |
|
||||
| | mutable borrow, by `bar`, occurs here
|
||||
| immutable borrow, by `foo`, occurs here
|
||||
|
||||
error: cannot borrow value as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:124:9
|
||||
|
|
||||
LL | ref foo @ Some(box ref mut s) => (),
|
||||
| -------^^^^^^^^^^^^---------^
|
||||
| | |
|
||||
| | mutable borrow, by `s`, occurs here
|
||||
| immutable borrow, by `foo`, occurs here
|
||||
|
||||
error[E0382]: borrow of moved value: `x`
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:22:5
|
||||
|
|
||||
LL | fn bindings_after_at_slice_patterns_move_binding(x: [String; 4]) {
|
||||
| - move occurs because `x` has type `[std::string::String; 4]`, which does not implement the `Copy` trait
|
||||
LL | match x {
|
||||
LL | a @ [.., _] => (),
|
||||
| ----------- value moved here
|
||||
...
|
||||
LL | &x;
|
||||
| ^^ value borrowed here after move
|
||||
|
||||
error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:32:5
|
||||
|
|
||||
LL | ref mut foo @ [.., _] => Some(foo),
|
||||
| --------------------- mutable borrow occurs here
|
||||
...
|
||||
LL | &x;
|
||||
| ^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:54:5
|
||||
|
|
||||
LL | [ref foo @ .., ref bar] => Some(foo),
|
||||
| ------------ immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:66:5
|
||||
|
|
||||
LL | ref foo @ [.., ref bar] => Some(foo),
|
||||
| ----------------------- immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0382]: borrow of moved value: `x`
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:80:5
|
||||
|
|
||||
LL | fn bindings_after_at_or_patterns_move(x: Option<Test>) {
|
||||
| - move occurs because `x` has type `std::option::Option<Test>`, which does not implement the `Copy` trait
|
||||
LL | match x {
|
||||
LL | foo @ Some(Test::Foo | Test::Bar) => (),
|
||||
| ---------------------------------
|
||||
| |
|
||||
| value moved here
|
||||
| value moved here
|
||||
...
|
||||
LL | &x;
|
||||
| ^^ value borrowed here after move
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:90:5
|
||||
|
|
||||
LL | ref foo @ Some(Test::Foo | Test::Bar) => Some(foo),
|
||||
| ------------------------------------- immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:102:5
|
||||
|
|
||||
LL | ref mut foo @ Some(Test::Foo | Test::Bar) => Some(foo),
|
||||
| ----------------------------------------- mutable borrow occurs here
|
||||
...
|
||||
LL | &x;
|
||||
| ^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:116:5
|
||||
|
|
||||
LL | ref foo @ Some(box ref s) => Some(foo),
|
||||
| ------------------------- immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0382]: borrow of moved value: `x`
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:138:5
|
||||
|
|
||||
LL | fn bindings_after_at_slice_patterns_or_patterns_moves(x: [Option<Test>; 4]) {
|
||||
| - move occurs because `x` has type `[std::option::Option<Test>; 4]`, which does not implement the `Copy` trait
|
||||
LL | match x {
|
||||
LL | a @ [.., Some(Test::Foo | Test::Bar)] => (),
|
||||
| -------------------------------------
|
||||
| |
|
||||
| value moved here
|
||||
| value moved here
|
||||
...
|
||||
LL | &x;
|
||||
| ^^ value borrowed here after move
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:148:5
|
||||
|
|
||||
LL | ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(a),
|
||||
| ------------------------------------------------- immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:160:5
|
||||
|
|
||||
LL | ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(b),
|
||||
| ---------- immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:174:5
|
||||
|
|
||||
LL | [_, ref a @ Some(box ref b), ..] => Some(a),
|
||||
| ----------------------- immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:190:5
|
||||
|
|
||||
LL | [_, ref a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||||
| ------------------------------------------- immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:204:5
|
||||
|
|
||||
LL | [_, ref mut a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||||
| ----------------------------------------------- mutable borrow occurs here
|
||||
...
|
||||
LL | &x;
|
||||
| ^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:218:5
|
||||
|
|
||||
LL | ref a @ [_, ref b @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||||
| ------------------------------------------------------------ immutable borrow occurs here
|
||||
...
|
||||
LL | &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | drop(r);
|
||||
| - immutable borrow later used here
|
||||
|
||||
error: aborting due to 17 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0382, E0502.
|
||||
For more information about an error, try `rustc --explain E0382`.
|
Loading…
Reference in New Issue
Block a user