Skip to content

Commit 5712d2e

Browse files
committed
add a test for pointer casts involving un/re/wrapping trait objects
the errors should not be there, this is a bug/missing feature.
1 parent cdd8af2 commit 5712d2e

8 files changed

+546
-0
lines changed

Diff for: tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.rs

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Combination of `ptr-to-trait-obj-wrap.rs` and `ptr-to-trait-obj-add-auto.rs`.
2+
//
3+
// Checks that you *can't* add auto traits to trait object in pointer casts involving wrapping said
4+
// traits structures.
5+
6+
trait A {}
7+
8+
struct W<T: ?Sized>(T);
9+
struct X<T: ?Sized>(T);
10+
11+
fn unwrap(a: *const W<dyn A>) -> *const (dyn A + Send) {
12+
a as _
13+
//~^ error
14+
//~| error
15+
//~| error
16+
}
17+
18+
fn unwrap_nested(a: *const W<W<dyn A>>) -> *const W<dyn A + Send> {
19+
a as _
20+
//~^ error
21+
//~| error
22+
//~| error
23+
}
24+
25+
fn rewrap(a: *const W<dyn A>) -> *const X<dyn A + Send> {
26+
a as _
27+
//~^ error: cannot add auto trait `Send` to dyn bound via pointer cast
28+
}
29+
30+
fn rewrap_nested(a: *const W<W<dyn A>>) -> *const W<X<dyn A + Send>> {
31+
a as _
32+
//~^ error: cannot add auto trait `Send` to dyn bound via pointer cast
33+
}
34+
35+
fn wrap(a: *const dyn A) -> *const W<dyn A + Send> {
36+
a as _
37+
//~^ error: cannot add auto trait `Send` to dyn bound via pointer cast
38+
}
39+
40+
fn main() {}

Diff for: tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.stderr

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
error[E0277]: the trait bound `W<(dyn A + 'static)>: A` is not satisfied
2+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:12:5
3+
|
4+
LL | a as _
5+
| ^ the trait `A` is not implemented for `W<(dyn A + 'static)>`
6+
|
7+
help: this trait has no implementations, consider adding one
8+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:6:1
9+
|
10+
LL | trait A {}
11+
| ^^^^^^^
12+
= note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A + Send`
13+
14+
error[E0277]: `(dyn A + 'static)` cannot be sent between threads safely
15+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:12:5
16+
|
17+
LL | a as _
18+
| ^ `(dyn A + 'static)` cannot be sent between threads safely
19+
|
20+
= help: within `W<(dyn A + 'static)>`, the trait `Send` is not implemented for `(dyn A + 'static)`
21+
note: required because it appears within the type `W<(dyn A + 'static)>`
22+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:8:8
23+
|
24+
LL | struct W<T: ?Sized>(T);
25+
| ^
26+
= note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A + Send`
27+
28+
error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
29+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:12:5
30+
|
31+
LL | a as _
32+
| ^ doesn't have a size known at compile-time
33+
|
34+
= help: within `W<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)`
35+
note: required because it appears within the type `W<(dyn A + 'static)>`
36+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:8:8
37+
|
38+
LL | struct W<T: ?Sized>(T);
39+
| ^
40+
= note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A + Send`
41+
42+
error[E0277]: the trait bound `W<(dyn A + 'static)>: A` is not satisfied
43+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:19:5
44+
|
45+
LL | a as _
46+
| ^ the trait `A` is not implemented for `W<(dyn A + 'static)>`
47+
|
48+
help: this trait has no implementations, consider adding one
49+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:6:1
50+
|
51+
LL | trait A {}
52+
| ^^^^^^^
53+
= note: required for the cast from `*const W<W<(dyn A + 'static)>>` to `*const W<dyn A + Send>`
54+
55+
error[E0277]: `(dyn A + 'static)` cannot be sent between threads safely
56+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:19:5
57+
|
58+
LL | a as _
59+
| ^ `(dyn A + 'static)` cannot be sent between threads safely
60+
|
61+
= help: within `W<(dyn A + 'static)>`, the trait `Send` is not implemented for `(dyn A + 'static)`
62+
note: required because it appears within the type `W<(dyn A + 'static)>`
63+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:8:8
64+
|
65+
LL | struct W<T: ?Sized>(T);
66+
| ^
67+
= note: required for the cast from `*const W<W<(dyn A + 'static)>>` to `*const W<dyn A + Send>`
68+
69+
error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
70+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:19:5
71+
|
72+
LL | a as _
73+
| ^ doesn't have a size known at compile-time
74+
|
75+
= help: within `W<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)`
76+
note: required because it appears within the type `W<(dyn A + 'static)>`
77+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:8:8
78+
|
79+
LL | struct W<T: ?Sized>(T);
80+
| ^
81+
= note: required for the cast from `*const W<W<(dyn A + 'static)>>` to `*const W<dyn A + Send>`
82+
83+
error[E0804]: cannot add auto trait `Send` to dyn bound via pointer cast
84+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:26:5
85+
|
86+
LL | a as _
87+
| ^^^^^^ unsupported cast
88+
|
89+
= note: this could allow UB elsewhere
90+
= help: use `transmute` if you're sure this is sound
91+
92+
error[E0804]: cannot add auto trait `Send` to dyn bound via pointer cast
93+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:31:5
94+
|
95+
LL | a as _
96+
| ^^^^^^ unsupported cast
97+
|
98+
= note: this could allow UB elsewhere
99+
= help: use `transmute` if you're sure this is sound
100+
101+
error[E0804]: cannot add auto trait `Send` to dyn bound via pointer cast
102+
--> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:36:5
103+
|
104+
LL | a as _
105+
| ^^^^^^ unsupported cast
106+
|
107+
= note: this could allow UB elsewhere
108+
= help: use `transmute` if you're sure this is sound
109+
110+
error: aborting due to 9 previous errors
111+
112+
Some errors have detailed explanations: E0277, E0804.
113+
For more information about an error, try `rustc --explain E0277`.
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Combination of `ptr-to-trait-obj-different-args.rs` and `ptr-to-trait-obj-wrap.rs`.
2+
//
3+
// Checks that you *can't* change type arguments of trait objects in pointer casts involving
4+
// wrapping said traits structures.
5+
6+
trait A<T> {}
7+
8+
struct W<T: ?Sized>(T);
9+
struct X<T: ?Sized>(T);
10+
11+
fn unwrap<F, G>(a: *const W<dyn A<F>>) -> *const dyn A<G> {
12+
a as _
13+
//~^ error
14+
//~| error
15+
}
16+
17+
fn unwrap_nested<F, G>(a: *const W<W<dyn A<F>>>) -> *const W<dyn A<G>> {
18+
a as _
19+
//~^ error
20+
//~| error
21+
}
22+
23+
fn rewrap<F, G>(a: *const W<dyn A<F>>) -> *const X<dyn A<G>> {
24+
a as _
25+
//~^ error: casting `*const W<(dyn A<F> + 'static)>` as `*const X<dyn A<G>>` is invalid
26+
}
27+
28+
fn rewrap_nested<F, G>(a: *const W<W<dyn A<F>>>) -> *const W<X<dyn A<G>>> {
29+
a as _
30+
//~^ error: casting `*const W<W<(dyn A<F> + 'static)>>` as `*const W<X<dyn A<G>>>` is invalid
31+
}
32+
33+
fn wrap<F, G>(a: *const dyn A<F>) -> *const W<dyn A<G>> {
34+
a as _
35+
//~^ error: casting `*const (dyn A<F> + 'static)` as `*const W<dyn A<G>>` is invalid
36+
}
37+
38+
fn main() {}
+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
error[E0277]: the trait bound `W<(dyn A<F> + 'static)>: A<G>` is not satisfied
2+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:12:5
3+
|
4+
LL | a as _
5+
| ^ the trait `A<G>` is not implemented for `W<(dyn A<F> + 'static)>`
6+
|
7+
help: this trait has no implementations, consider adding one
8+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:6:1
9+
|
10+
LL | trait A<T> {}
11+
| ^^^^^^^^^^
12+
= note: required for the cast from `*const W<(dyn A<F> + 'static)>` to `*const dyn A<G>`
13+
14+
error[E0277]: the size for values of type `(dyn A<F> + 'static)` cannot be known at compilation time
15+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:12:5
16+
|
17+
LL | a as _
18+
| ^ doesn't have a size known at compile-time
19+
|
20+
= help: within `W<(dyn A<F> + 'static)>`, the trait `Sized` is not implemented for `(dyn A<F> + 'static)`
21+
note: required because it appears within the type `W<(dyn A<F> + 'static)>`
22+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:8:8
23+
|
24+
LL | struct W<T: ?Sized>(T);
25+
| ^
26+
= note: required for the cast from `*const W<(dyn A<F> + 'static)>` to `*const dyn A<G>`
27+
28+
error[E0277]: the trait bound `W<(dyn A<F> + 'static)>: A<G>` is not satisfied
29+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:18:5
30+
|
31+
LL | a as _
32+
| ^ the trait `A<G>` is not implemented for `W<(dyn A<F> + 'static)>`
33+
|
34+
help: this trait has no implementations, consider adding one
35+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:6:1
36+
|
37+
LL | trait A<T> {}
38+
| ^^^^^^^^^^
39+
= note: required for the cast from `*const W<W<(dyn A<F> + 'static)>>` to `*const W<dyn A<G>>`
40+
41+
error[E0277]: the size for values of type `(dyn A<F> + 'static)` cannot be known at compilation time
42+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:18:5
43+
|
44+
LL | a as _
45+
| ^ doesn't have a size known at compile-time
46+
|
47+
= help: within `W<(dyn A<F> + 'static)>`, the trait `Sized` is not implemented for `(dyn A<F> + 'static)`
48+
note: required because it appears within the type `W<(dyn A<F> + 'static)>`
49+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:8:8
50+
|
51+
LL | struct W<T: ?Sized>(T);
52+
| ^
53+
= note: required for the cast from `*const W<W<(dyn A<F> + 'static)>>` to `*const W<dyn A<G>>`
54+
55+
error[E0606]: casting `*const W<(dyn A<F> + 'static)>` as `*const X<dyn A<G>>` is invalid
56+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:24:5
57+
|
58+
LL | a as _
59+
| ^^^^^^
60+
|
61+
= note: the trait objects may have different vtables
62+
63+
error[E0606]: casting `*const W<W<(dyn A<F> + 'static)>>` as `*const W<X<dyn A<G>>>` is invalid
64+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:29:5
65+
|
66+
LL | a as _
67+
| ^^^^^^
68+
|
69+
= note: the trait objects may have different vtables
70+
71+
error[E0606]: casting `*const (dyn A<F> + 'static)` as `*const W<dyn A<G>>` is invalid
72+
--> $DIR/ptr-to-trait-obj-wrap-different-args.rs:34:5
73+
|
74+
LL | a as _
75+
| ^^^^^^
76+
|
77+
= note: the trait objects may have different vtables
78+
79+
error: aborting due to 7 previous errors
80+
81+
Some errors have detailed explanations: E0277, E0606.
82+
For more information about an error, try `rustc --explain E0277`.
+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Combination of `ptr-to-trait-obj-different-regions-misc.rs` and `ptr-to-trait-obj-wrap.rs`.
2+
//
3+
// Checks that you *can't* change lifetime arguments of trait objects in pointer casts involving
4+
// wrapping said traits structures.
5+
6+
trait A<'a> {}
7+
8+
struct W<T: ?Sized>(T);
9+
struct X<T: ?Sized>(T);
10+
11+
fn unwrap<'a, 'b>(a: *const W<dyn A<'a>>) -> *const dyn A<'b> {
12+
a as _
13+
//~^ error
14+
//~| error
15+
}
16+
17+
fn unwrap_nested<'a, 'b>(a: *const W<W<dyn A<'a>>>) -> *const W<dyn A<'b>> {
18+
a as _
19+
//~^ error
20+
//~| error
21+
}
22+
23+
fn rewrap<'a, 'b>(a: *const W<dyn A<'a>>) -> *const X<dyn A<'b>> {
24+
a as _
25+
//~^ error: lifetime may not live long enough
26+
//~| error: lifetime may not live long enough
27+
}
28+
29+
fn rewrap_nested<'a, 'b>(a: *const W<W<dyn A<'a>>>) -> *const W<X<dyn A<'b>>> {
30+
a as _
31+
//~^ error: lifetime may not live long enough
32+
//~| error: lifetime may not live long enough
33+
}
34+
35+
fn wrap<'a, 'b>(a: *const dyn A<'a>) -> *const W<dyn A<'b>> {
36+
a as _
37+
//~^ error: lifetime may not live long enough
38+
//~| error: lifetime may not live long enough
39+
}
40+
41+
fn main() {}

0 commit comments

Comments
 (0)