Skip to content

Commit 124ada5

Browse files
committed
Add tests for *const Trait<'a> -> *const Trait<'b> and similar casts
1 parent 0557a4f commit 124ada5

5 files changed

+99
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// check-pass
2+
3+
trait Trait<'a> {}
4+
5+
fn add_auto<'a>(x: *mut dyn Trait<'a>) -> *mut (dyn Trait<'a> + Send) {
6+
x as _
7+
}
8+
9+
fn main() {}

tests/ui/cast/ptr-to-trait-obj-different-args.rs

+8
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,11 @@ fn generic<T>(x: *const dyn Trait<X>, t: *const dyn Trait<T>) {
2828
let _: *const dyn Trait<T> = x as _; //~ error: casting `*const (dyn Trait<X> + 'static)` as `*const dyn Trait<T>` is invalid
2929
let _: *const dyn Trait<X> = t as _; //~ error: casting `*const (dyn Trait<T> + 'static)` as `*const dyn Trait<X>` is invalid
3030
}
31+
32+
trait Assocked {
33+
type Assoc: ?Sized;
34+
}
35+
36+
fn change_assoc(x: *mut dyn Assocked<Assoc = u8>) -> *mut dyn Assocked<Assoc = u32> {
37+
x as _
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// check-pass
2+
//
3+
// issue: <https://github.com/rust-lang/rust/issues/120217>
4+
5+
#![feature(arbitrary_self_types)]
6+
7+
trait Static<'a> {
8+
fn proof(self: *const Self, s: &'a str) -> &'static str;
9+
}
10+
11+
fn bad_cast<'a>(x: *const dyn Static<'static>) -> *const dyn Static<'a> {
12+
x as _
13+
}
14+
15+
impl Static<'static> for () {
16+
fn proof(self: *const Self, s: &'static str) -> &'static str {
17+
s
18+
}
19+
}
20+
21+
fn extend_lifetime(s: &str) -> &'static str {
22+
bad_cast(&()).proof(s)
23+
}
24+
25+
fn main() {
26+
let s = String::from("Hello World");
27+
let slice = extend_lifetime(&s);
28+
println!("Now it exists: {slice}");
29+
drop(s);
30+
println!("Now it’s gone: {slice}");
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// check-pass
2+
3+
trait Trait<'a> {}
4+
5+
fn change_lt<'a, 'b>(x: *mut dyn Trait<'a>) -> *mut dyn Trait<'b> {
6+
x as _
7+
}
8+
9+
fn change_lt_ab<'a: 'b, 'b>(x: *mut dyn Trait<'a>) -> *mut dyn Trait<'b> {
10+
x as _
11+
}
12+
13+
fn change_lt_ba<'a, 'b: 'a>(x: *mut dyn Trait<'a>) -> *mut dyn Trait<'b> {
14+
x as _
15+
}
16+
17+
trait Assocked {
18+
type Assoc: ?Sized;
19+
}
20+
21+
fn change_assoc_0<'a, 'b>(
22+
x: *mut dyn Assocked<Assoc = dyn Send + 'a>,
23+
) -> *mut dyn Assocked<Assoc = dyn Send + 'b> {
24+
x as _
25+
}
26+
27+
fn change_assoc_1<'a, 'b>(
28+
x: *mut dyn Assocked<Assoc = dyn Trait<'a>>,
29+
) -> *mut dyn Assocked<Assoc = dyn Trait<'b>> {
30+
x as _
31+
}
32+
33+
34+
fn main() {}

tests/ui/cast/ptr-to-trait-obj-ok.rs

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// check-pass
2+
3+
trait Trait<'a> {}
4+
5+
fn remove_auto<'a>(x: *mut (dyn Trait<'a> + Send)) -> *mut dyn Trait<'a> {
6+
x as _
7+
}
8+
9+
fn cast_inherent_lt<'a, 'b>(x: *mut (dyn Trait<'static> + 'a)) -> *mut (dyn Trait<'static> + 'b) {
10+
x as _
11+
}
12+
13+
fn unprincipled<'a, 'b>(x: *mut (dyn Send + 'a)) -> *mut (dyn Sync + 'b) {
14+
x as _
15+
}
16+
17+
fn main() {}

0 commit comments

Comments
 (0)