Skip to content

Commit 2f7ea4a

Browse files
committed
Add more tests on unsized locals autoderef and borrowck.
1 parent 1c48647 commit 2f7ea4a

File tree

7 files changed

+368
-0
lines changed

7 files changed

+368
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#![feature(unsized_locals)]
2+
3+
pub trait Foo {
4+
fn foo(self) -> String;
5+
}
6+
7+
impl Foo for [char] {
8+
fn foo(self) -> String {
9+
self.iter().collect()
10+
}
11+
}
12+
13+
impl Foo for str {
14+
fn foo(self) -> String {
15+
self.to_owned()
16+
}
17+
}
18+
19+
impl Foo for dyn FnMut() -> String {
20+
fn foo(mut self) -> String {
21+
self()
22+
}
23+
}
24+
25+
26+
fn main() {
27+
let x = *(Box::new(['h', 'e', 'l', 'l', 'o']) as Box<[char]>);
28+
assert_eq!(&x.foo() as &str, "hello");
29+
30+
let x = Box::new(['h', 'e', 'l', 'l', 'o']) as Box<[char]>;
31+
assert_eq!(&x.foo() as &str, "hello");
32+
33+
let x = "hello".to_owned().into_boxed_str();
34+
assert_eq!(&x.foo() as &str, "hello");
35+
36+
let x = *("hello".to_owned().into_boxed_str());
37+
assert_eq!(&x.foo() as &str, "hello");
38+
39+
let x = "hello".to_owned().into_boxed_str();
40+
assert_eq!(&x.foo() as &str, "hello");
41+
42+
let x = *(Box::new(|| "hello".to_owned()) as Box<dyn FnMut() -> String>);
43+
assert_eq!(&x.foo() as &str, "hello");
44+
45+
let x = Box::new(|| "hello".to_owned()) as Box<dyn FnMut() -> String>;
46+
assert_eq!(&x.foo() as &str, "hello");
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
error[E0382]: borrow of moved value: `x`
2+
--> $DIR/borrow-after-move.rs:20:24
3+
|
4+
LL | let y = *x;
5+
| -- value moved here
6+
LL | drop_unsized(y);
7+
LL | println!("{}", &x);
8+
| ^^ value borrowed here after move
9+
10+
error[E0382]: borrow of moved value: `y`
11+
--> $DIR/borrow-after-move.rs:22:24
12+
|
13+
LL | drop_unsized(y);
14+
| - value moved here
15+
...
16+
LL | println!("{}", &y);
17+
| ^^ value borrowed here after move
18+
|
19+
= note: move occurs because `y` has type `str`, which does not implement the `Copy` trait
20+
21+
error[E0382]: borrow of moved value: `x`
22+
--> $DIR/borrow-after-move.rs:30:24
23+
|
24+
LL | let y = *x;
25+
| -- value moved here
26+
LL | y.foo();
27+
LL | println!("{}", &x);
28+
| ^^ value borrowed here after move
29+
30+
error[E0382]: borrow of moved value: `y`
31+
--> $DIR/borrow-after-move.rs:32:24
32+
|
33+
LL | y.foo();
34+
| - value moved here
35+
...
36+
LL | println!("{}", &y);
37+
| ^^ value borrowed here after move
38+
|
39+
= note: move occurs because `y` has type `str`, which does not implement the `Copy` trait
40+
41+
error[E0382]: borrow of moved value: `x`
42+
--> $DIR/borrow-after-move.rs:39:24
43+
|
44+
LL | x.foo();
45+
| - value moved here
46+
LL | println!("{}", &x);
47+
| ^^ value borrowed here after move
48+
49+
error: aborting due to 5 previous errors
50+
51+
For more information about this error, try `rustc --explain E0382`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#![feature(unsized_locals)]
2+
3+
pub trait Foo {
4+
fn foo(self) -> String;
5+
}
6+
7+
impl Foo for str {
8+
fn foo(self) -> String {
9+
self.to_owned()
10+
}
11+
}
12+
13+
fn drop_unsized<T: ?Sized>(_: T) {}
14+
15+
fn main() {
16+
{
17+
let x = "hello".to_owned().into_boxed_str();
18+
let y = *x;
19+
drop_unsized(y);
20+
println!("{}", &x);
21+
//~^ERROR use of moved value
22+
println!("{}", &y);
23+
//~^ERROR use of moved value
24+
}
25+
26+
{
27+
let x = "hello".to_owned().into_boxed_str();
28+
let y = *x;
29+
y.foo();
30+
println!("{}", &x);
31+
//~^ERROR use of moved value
32+
println!("{}", &y);
33+
//~^ERROR use of moved value
34+
}
35+
36+
{
37+
let x = "hello".to_owned().into_boxed_str();
38+
x.foo();
39+
println!("{}", &x);
40+
//~^ERROR use of moved value
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
error[E0382]: use of moved value: `x`
2+
--> $DIR/borrow-after-move.rs:20:25
3+
|
4+
LL | let y = *x;
5+
| - value moved here
6+
LL | drop_unsized(y);
7+
LL | println!("{}", &x);
8+
| ^ value used here after move
9+
|
10+
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
11+
12+
error[E0382]: use of moved value: `y`
13+
--> $DIR/borrow-after-move.rs:22:25
14+
|
15+
LL | drop_unsized(y);
16+
| - value moved here
17+
...
18+
LL | println!("{}", &y);
19+
| ^ value used here after move
20+
|
21+
= note: move occurs because `y` has type `str`, which does not implement the `Copy` trait
22+
23+
error[E0382]: use of moved value: `x`
24+
--> $DIR/borrow-after-move.rs:30:25
25+
|
26+
LL | let y = *x;
27+
| - value moved here
28+
LL | y.foo();
29+
LL | println!("{}", &x);
30+
| ^ value used here after move
31+
|
32+
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
33+
34+
error[E0382]: use of moved value: `y`
35+
--> $DIR/borrow-after-move.rs:32:25
36+
|
37+
LL | y.foo();
38+
| - value moved here
39+
...
40+
LL | println!("{}", &y);
41+
| ^ value used here after move
42+
|
43+
= note: move occurs because `y` has type `str`, which does not implement the `Copy` trait
44+
45+
error[E0382]: use of moved value: `x`
46+
--> $DIR/borrow-after-move.rs:39:25
47+
|
48+
LL | x.foo();
49+
| - value moved here
50+
LL | println!("{}", &x);
51+
| ^ value used here after move
52+
|
53+
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
54+
55+
error: aborting due to 5 previous errors
56+
57+
For more information about this error, try `rustc --explain E0382`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
error[E0382]: use of moved value: `y`
2+
--> $DIR/double-move.rs:20:22
3+
|
4+
LL | drop_unsized(y);
5+
| - value moved here
6+
LL | drop_unsized(y); //~ERROR use of moved value
7+
| ^ value used here after move
8+
|
9+
= note: move occurs because `y` has type `str`, which does not implement the `Copy` trait
10+
11+
error[E0382]: use of moved value: `x`
12+
--> $DIR/double-move.rs:26:22
13+
|
14+
LL | let _y = *x;
15+
| -- value moved here
16+
LL | drop_unsized(x); //~ERROR use of moved value
17+
| ^ value used here after move
18+
19+
error[E0382]: use of moved value: `*x`
20+
--> $DIR/double-move.rs:32:18
21+
|
22+
LL | drop_unsized(x);
23+
| - value moved here
24+
LL | let _y = *x; //~ERROR use of moved value
25+
| ^^ value used here after move
26+
27+
error[E0382]: use of moved value: `y`
28+
--> $DIR/double-move.rs:39:9
29+
|
30+
LL | y.foo();
31+
| - value moved here
32+
LL | y.foo(); //~ERROR use of moved value
33+
| ^ value used here after move
34+
|
35+
= note: move occurs because `y` has type `str`, which does not implement the `Copy` trait
36+
37+
error[E0382]: use of moved value: `*x`
38+
--> $DIR/double-move.rs:45:9
39+
|
40+
LL | let _y = *x;
41+
| -- value moved here
42+
LL | x.foo(); //~ERROR use of moved value
43+
| ^ value used here after move
44+
45+
error[E0382]: use of moved value: `*x`
46+
--> $DIR/double-move.rs:51:18
47+
|
48+
LL | x.foo();
49+
| - value moved here
50+
LL | let _y = *x; //~ERROR use of moved value
51+
| ^^ value used here after move
52+
53+
error: aborting due to 6 previous errors
54+
55+
For more information about this error, try `rustc --explain E0382`.
+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#![feature(unsized_locals)]
2+
3+
pub trait Foo {
4+
fn foo(self) -> String;
5+
}
6+
7+
impl Foo for str {
8+
fn foo(self) -> String {
9+
self.to_owned()
10+
}
11+
}
12+
13+
fn drop_unsized<T: ?Sized>(_: T) {}
14+
15+
fn main() {
16+
{
17+
let x = "hello".to_owned().into_boxed_str();
18+
let y = *x;
19+
drop_unsized(y);
20+
drop_unsized(y); //~ERROR use of moved value
21+
}
22+
23+
{
24+
let x = "hello".to_owned().into_boxed_str();
25+
let _y = *x;
26+
drop_unsized(x); //~ERROR use of moved value
27+
}
28+
29+
{
30+
let x = "hello".to_owned().into_boxed_str();
31+
drop_unsized(x);
32+
let _y = *x; //~ERROR use of moved value
33+
}
34+
35+
{
36+
let x = "hello".to_owned().into_boxed_str();
37+
let y = *x;
38+
y.foo();
39+
y.foo(); //~ERROR use of moved value
40+
}
41+
42+
{
43+
let x = "hello".to_owned().into_boxed_str();
44+
let _y = *x;
45+
x.foo(); //~ERROR use of moved value
46+
}
47+
48+
{
49+
let x = "hello".to_owned().into_boxed_str();
50+
x.foo();
51+
let _y = *x; //~ERROR use of moved value
52+
}
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
error[E0382]: use of moved value: `y`
2+
--> $DIR/double-move.rs:20:22
3+
|
4+
LL | drop_unsized(y);
5+
| - value moved here
6+
LL | drop_unsized(y); //~ERROR use of moved value
7+
| ^ value used here after move
8+
|
9+
= note: move occurs because `y` has type `str`, which does not implement the `Copy` trait
10+
11+
error[E0382]: use of moved value: `x`
12+
--> $DIR/double-move.rs:26:22
13+
|
14+
LL | let _y = *x;
15+
| -- value moved here
16+
LL | drop_unsized(x); //~ERROR use of moved value
17+
| ^ value used here after move
18+
|
19+
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
20+
21+
error[E0382]: use of moved value: `*x`
22+
--> $DIR/double-move.rs:32:13
23+
|
24+
LL | drop_unsized(x);
25+
| - value moved here
26+
LL | let _y = *x; //~ERROR use of moved value
27+
| ^^ value used here after move
28+
|
29+
= note: move occurs because `x` has type `std::boxed::Box<str>`, which does not implement the `Copy` trait
30+
31+
error[E0382]: use of moved value: `y`
32+
--> $DIR/double-move.rs:39:9
33+
|
34+
LL | y.foo();
35+
| - value moved here
36+
LL | y.foo(); //~ERROR use of moved value
37+
| ^ value used here after move
38+
|
39+
= note: move occurs because `y` has type `str`, which does not implement the `Copy` trait
40+
41+
error[E0382]: use of moved value: `*x`
42+
--> $DIR/double-move.rs:45:9
43+
|
44+
LL | let _y = *x;
45+
| -- value moved here
46+
LL | x.foo(); //~ERROR use of moved value
47+
| ^ value used here after move
48+
|
49+
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
50+
51+
error[E0382]: use of moved value: `*x`
52+
--> $DIR/double-move.rs:51:13
53+
|
54+
LL | x.foo();
55+
| - value moved here
56+
LL | let _y = *x; //~ERROR use of moved value
57+
| ^^ value used here after move
58+
|
59+
= note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait
60+
61+
error: aborting due to 6 previous errors
62+
63+
For more information about this error, try `rustc --explain E0382`.

0 commit comments

Comments
 (0)