Skip to content

Commit d96485d

Browse files
committed
Add more tests for borrowck and dropck slice pattern handling
1 parent cab7af9 commit d96485d

13 files changed

+849
-75
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// check-pass
2+
3+
#![feature(slice_patterns)]
4+
5+
fn array() -> [(String, String); 3] {
6+
Default::default()
7+
}
8+
9+
// Const Index + Const Index
10+
11+
fn move_out_from_begin_and_one_from_end() {
12+
let a = array();
13+
let [_, _, _x] = a;
14+
let [.., _y, _] = a;
15+
}
16+
17+
fn move_out_from_begin_field_and_end_field() {
18+
let a = array();
19+
let [_, _, (_x, _)] = a;
20+
let [.., (_, _y)] = a;
21+
}
22+
23+
// Const Index + Slice
24+
25+
fn move_out_by_const_index_and_subslice() {
26+
let a = array();
27+
let [_x, _, _] = a;
28+
let [_, _y @ ..] = a;
29+
}
30+
31+
fn move_out_by_const_index_end_and_subslice() {
32+
let a = array();
33+
let [.., _x] = a;
34+
let [_y @ .., _] = a;
35+
}
36+
37+
fn move_out_by_const_index_field_and_subslice() {
38+
let a = array();
39+
let [(_x, _), _, _] = a;
40+
let [_, _y @ ..] = a;
41+
}
42+
43+
fn move_out_by_const_index_end_field_and_subslice() {
44+
let a = array();
45+
let [.., (_x, _)] = a;
46+
let [_y @ .., _] = a;
47+
}
48+
49+
fn move_out_by_const_subslice_and_index_field() {
50+
let a = array();
51+
let [_, _y @ ..] = a;
52+
let [(_x, _), _, _] = a;
53+
}
54+
55+
fn move_out_by_const_subslice_and_end_index_field() {
56+
let a = array();
57+
let [_y @ .., _] = a;
58+
let [.., (_x, _)] = a;
59+
}
60+
61+
// Slice + Slice
62+
63+
fn move_out_by_subslice_and_subslice() {
64+
let a = array();
65+
let [x @ .., _, _] = a;
66+
let [_, _y @ ..] = a;
67+
}
68+
69+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// check-pass
2+
3+
#![feature(slice_patterns)]
4+
5+
fn array() -> [(String, String); 3] {
6+
Default::default()
7+
}
8+
9+
// Const Index + Const Index
10+
11+
fn move_out_from_begin_and_one_from_end() {
12+
let a = array();
13+
let [_, _, _x] = a;
14+
let [.., ref _y, _] = a;
15+
}
16+
17+
fn move_out_from_begin_field_and_end_field() {
18+
let a = array();
19+
let [_, _, (_x, _)] = a;
20+
let [.., (_, ref _y)] = a;
21+
}
22+
23+
// Const Index + Slice
24+
25+
fn move_out_by_const_index_and_subslice() {
26+
let a = array();
27+
let [_x, _, _] = a;
28+
let [_, ref _y @ ..] = a;
29+
}
30+
31+
fn move_out_by_const_index_end_and_subslice() {
32+
let a = array();
33+
let [.., _x] = a;
34+
let [ref _y @ .., _] = a;
35+
}
36+
37+
fn move_out_by_const_index_field_and_subslice() {
38+
let a = array();
39+
let [(_x, _), _, _] = a;
40+
let [_, ref _y @ ..] = a;
41+
}
42+
43+
fn move_out_by_const_index_end_field_and_subslice() {
44+
let a = array();
45+
let [.., (_x, _)] = a;
46+
let [ref _y @ .., _] = a;
47+
}
48+
49+
fn move_out_by_const_subslice_and_index_field() {
50+
let a = array();
51+
let [_, _y @ ..] = a;
52+
let [(ref _x, _), _, _] = a;
53+
}
54+
55+
fn move_out_by_const_subslice_and_end_index_field() {
56+
let a = array();
57+
let [_y @ .., _] = a;
58+
let [.., (ref _x, _)] = a;
59+
}
60+
61+
// Slice + Slice
62+
63+
fn move_out_by_subslice_and_subslice() {
64+
let a = array();
65+
let [x @ .., _, _] = a;
66+
let [_, ref _y @ ..] = a;
67+
}
68+
69+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
#![feature(slice_patterns)]
2+
3+
fn array() -> [(String, String); 3] {
4+
Default::default()
5+
}
6+
7+
// Const Index + Const Index
8+
9+
fn move_out_from_begin_and_end() {
10+
let a = array();
11+
let [_, _, _x] = a;
12+
let [.., ref _y] = a; //~ ERROR [E0382]
13+
}
14+
15+
fn move_out_from_begin_field_and_end() {
16+
let a = array();
17+
let [_, _, (_x, _)] = a;
18+
let [.., ref _y] = a; //~ ERROR [E0382]
19+
}
20+
21+
fn move_out_from_begin_field_and_end_field() {
22+
let a = array();
23+
let [_, _, (_x, _)] = a;
24+
let [.., (ref _y, _)] = a; //~ ERROR [E0382]
25+
}
26+
27+
// Const Index + Slice
28+
29+
fn move_out_by_const_index_and_subslice() {
30+
let a = array();
31+
let [_x, _, _] = a;
32+
let [ref _y @ .., _, _] = a; //~ ERROR [E0382]
33+
}
34+
35+
fn move_out_by_const_index_end_and_subslice() {
36+
let a = array();
37+
let [.., _x] = a;
38+
let [_, _, ref _y @ ..] = a; //~ ERROR [E0382]
39+
}
40+
41+
fn move_out_by_const_index_field_and_subslice() {
42+
let a = array();
43+
let [(_x, _), _, _] = a;
44+
let [ref _y @ .., _, _] = a; //~ ERROR [E0382]
45+
}
46+
47+
fn move_out_by_const_index_end_field_and_subslice() {
48+
let a = array();
49+
let [.., (_x, _)] = a;
50+
let [_, _, ref _y @ ..] = a; //~ ERROR [E0382]
51+
}
52+
53+
fn move_out_by_subslice_and_const_index_field() {
54+
let a = array();
55+
let [_y @ .., _, _] = a;
56+
let [(ref _x, _), _, _] = a; //~ ERROR [E0382]
57+
}
58+
59+
fn move_out_by_subslice_and_const_index_end_field() {
60+
let a = array();
61+
let [_, _, _y @ ..] = a;
62+
let [.., (ref _x, _)] = a; //~ ERROR [E0382]
63+
}
64+
65+
// Slice + Slice
66+
67+
fn move_out_by_subslice_and_subslice() {
68+
let a = array();
69+
let [x @ .., _] = a;
70+
let [_, ref _y @ ..] = a; //~ ERROR [E0382]
71+
}
72+
73+
// Move + Assign
74+
75+
fn move_out_and_assign_end() {
76+
let mut a = array();
77+
let [_, _, _x] = a;
78+
a[2] = Default::default(); //~ ERROR [E0382]
79+
}
80+
81+
fn move_out_and_assign_end_field() {
82+
let mut a = array();
83+
let [_, _, (_x, _)] = a;
84+
a[2].1 = Default::default(); //~ ERROR [E0382]
85+
}
86+
87+
fn move_out_slice_and_assign_end() {
88+
let mut a = array();
89+
let [_, _, _x @ ..] = a;
90+
a[0] = Default::default(); //~ ERROR [E0382]
91+
}
92+
93+
fn move_out_slice_and_assign_end_field() {
94+
let mut a = array();
95+
let [_, _, _x @ ..] = a;
96+
a[0].1 = Default::default(); //~ ERROR [E0382]
97+
}
98+
99+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
error[E0382]: borrow of moved value: `a[..]`
2+
--> $DIR/borrowck-move-out-from-array-use.rs:12:14
3+
|
4+
LL | let [_, _, _x] = a;
5+
| -- value moved here
6+
LL | let [.., ref _y] = a;
7+
| ^^^^^^ value borrowed here after move
8+
|
9+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
10+
11+
error[E0382]: borrow of moved value: `a[..]`
12+
--> $DIR/borrowck-move-out-from-array-use.rs:18:14
13+
|
14+
LL | let [_, _, (_x, _)] = a;
15+
| -- value moved here
16+
LL | let [.., ref _y] = a;
17+
| ^^^^^^ value borrowed here after partial move
18+
|
19+
= note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait
20+
21+
error[E0382]: borrow of moved value: `a[..].0`
22+
--> $DIR/borrowck-move-out-from-array-use.rs:24:15
23+
|
24+
LL | let [_, _, (_x, _)] = a;
25+
| -- value moved here
26+
LL | let [.., (ref _y, _)] = a;
27+
| ^^^^^^ value borrowed here after move
28+
|
29+
= note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait
30+
31+
error[E0382]: borrow of moved value: `a`
32+
--> $DIR/borrowck-move-out-from-array-use.rs:32:10
33+
|
34+
LL | let [_x, _, _] = a;
35+
| -- value moved here
36+
LL | let [ref _y @ .., _, _] = a;
37+
| ^^^^^^^^^^^ value borrowed here after partial move
38+
|
39+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
40+
41+
error[E0382]: borrow of moved value: `a`
42+
--> $DIR/borrowck-move-out-from-array-use.rs:38:16
43+
|
44+
LL | let [.., _x] = a;
45+
| -- value moved here
46+
LL | let [_, _, ref _y @ ..] = a;
47+
| ^^^^^^^^^^^ value borrowed here after partial move
48+
|
49+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
50+
51+
error[E0382]: borrow of moved value: `a`
52+
--> $DIR/borrowck-move-out-from-array-use.rs:44:10
53+
|
54+
LL | let [(_x, _), _, _] = a;
55+
| -- value moved here
56+
LL | let [ref _y @ .., _, _] = a;
57+
| ^^^^^^^^^^^ value borrowed here after partial move
58+
|
59+
= note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait
60+
61+
error[E0382]: borrow of moved value: `a`
62+
--> $DIR/borrowck-move-out-from-array-use.rs:50:16
63+
|
64+
LL | let [.., (_x, _)] = a;
65+
| -- value moved here
66+
LL | let [_, _, ref _y @ ..] = a;
67+
| ^^^^^^^^^^^ value borrowed here after partial move
68+
|
69+
= note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait
70+
71+
error[E0382]: borrow of moved value: `a[..]`
72+
--> $DIR/borrowck-move-out-from-array-use.rs:56:11
73+
|
74+
LL | let [_y @ .., _, _] = a;
75+
| ------- value moved here
76+
LL | let [(ref _x, _), _, _] = a;
77+
| ^^^^^^ value borrowed here after move
78+
|
79+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
80+
81+
error[E0382]: borrow of moved value: `a[..]`
82+
--> $DIR/borrowck-move-out-from-array-use.rs:62:15
83+
|
84+
LL | let [_, _, _y @ ..] = a;
85+
| ------- value moved here
86+
LL | let [.., (ref _x, _)] = a;
87+
| ^^^^^^ value borrowed here after move
88+
|
89+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
90+
91+
error[E0382]: borrow of moved value: `a`
92+
--> $DIR/borrowck-move-out-from-array-use.rs:70:13
93+
|
94+
LL | let [x @ .., _] = a;
95+
| ------ value moved here
96+
LL | let [_, ref _y @ ..] = a;
97+
| ^^^^^^^^^^^ value borrowed here after partial move
98+
|
99+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
100+
101+
error[E0382]: use of moved value: `a`
102+
--> $DIR/borrowck-move-out-from-array-use.rs:78:5
103+
|
104+
LL | let [_, _, _x] = a;
105+
| -- value moved here
106+
LL | a[2] = Default::default();
107+
| ^^^^ value used here after partial move
108+
|
109+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
110+
111+
error[E0382]: use of moved value: `a`
112+
--> $DIR/borrowck-move-out-from-array-use.rs:84:5
113+
|
114+
LL | let [_, _, (_x, _)] = a;
115+
| -- value moved here
116+
LL | a[2].1 = Default::default();
117+
| ^^^^ value used here after partial move
118+
|
119+
= note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait
120+
121+
error[E0382]: use of moved value: `a`
122+
--> $DIR/borrowck-move-out-from-array-use.rs:90:5
123+
|
124+
LL | let [_, _, _x @ ..] = a;
125+
| ------- value moved here
126+
LL | a[0] = Default::default();
127+
| ^^^^ value used here after partial move
128+
|
129+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
130+
131+
error[E0382]: use of moved value: `a`
132+
--> $DIR/borrowck-move-out-from-array-use.rs:96:5
133+
|
134+
LL | let [_, _, _x @ ..] = a;
135+
| ------- value moved here
136+
LL | a[0].1 = Default::default();
137+
| ^^^^ value used here after partial move
138+
|
139+
= note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
140+
141+
error: aborting due to 14 previous errors
142+
143+
For more information about this error, try `rustc --explain E0382`.

0 commit comments

Comments
 (0)