Skip to content

Commit c8f0f17

Browse files
committed
add tests
1 parent 323069f commit c8f0f17

6 files changed

+128
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
error[E0308]: mismatched types
2+
--> $DIR/higher-ranked-upcasting-ok.rs:17:5
3+
|
4+
LL | x
5+
| ^ one type is more general than the other
6+
|
7+
= note: expected existential trait ref `for<'a, 'b> Supertrait<'a, 'b>`
8+
found existential trait ref `for<'a> Supertrait<'a, 'a>`
9+
10+
error[E0308]: mismatched types
11+
--> $DIR/higher-ranked-upcasting-ok.rs:17:5
12+
|
13+
LL | x
14+
| ^ one type is more general than the other
15+
|
16+
= note: expected existential trait ref `for<'a, 'b> Supertrait<'a, 'b>`
17+
found existential trait ref `for<'a> Supertrait<'a, 'a>`
18+
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
19+
20+
error: aborting due to 2 previous errors
21+
22+
For more information about this error, try `rustc --explain E0308`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error[E0308]: mismatched types
2+
--> $DIR/higher-ranked-upcasting-ok.rs:17:5
3+
|
4+
LL | fn ok(x: &dyn for<'a, 'b> Subtrait<'a, 'b>) -> &dyn for<'a> Supertrait<'a, 'a> {
5+
| ------------------------------- expected `&dyn for<'a> Supertrait<'a, 'a>` because of return type
6+
LL | x
7+
| ^ expected trait `Supertrait`, found trait `Subtrait`
8+
|
9+
= note: expected reference `&dyn for<'a> Supertrait<'a, 'a>`
10+
found reference `&dyn for<'a, 'b> Subtrait<'a, 'b>`
11+
12+
error: aborting due to 1 previous error
13+
14+
For more information about this error, try `rustc --explain E0308`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//@ revisions: current next
2+
//@ ignore-compare-mode-next-solver (explicit revisions)
3+
//@[next] compile-flags: -Znext-solver
4+
5+
// We should be able to instantiate a binder during trait upcasting.
6+
// This test could be `check-pass`, but we should make sure that we
7+
// do so in both trait solvers.
8+
#![feature(trait_upcasting)]
9+
#![crate_type = "rlib"]
10+
trait Supertrait<'a, 'b> {}
11+
12+
trait Subtrait<'a, 'b>: Supertrait<'a, 'b> {}
13+
14+
impl<'a> Supertrait<'a, 'a> for () {}
15+
impl<'a> Subtrait<'a, 'a> for () {}
16+
fn ok(x: &dyn for<'a, 'b> Subtrait<'a, 'b>) -> &dyn for<'a> Supertrait<'a, 'a> {
17+
x //~ ERROR mismatched types
18+
//[current]~^ ERROR mismatched types
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
error[E0308]: mismatched types
2+
--> $DIR/higher-ranked-upcasting-ub.rs:22:5
3+
|
4+
LL | x
5+
| ^ one type is more general than the other
6+
|
7+
= note: expected existential trait ref `for<'a> Supertrait<'a, 'a>`
8+
found existential trait ref `for<'a, 'b> Supertrait<'a, 'b>`
9+
10+
error[E0308]: mismatched types
11+
--> $DIR/higher-ranked-upcasting-ub.rs:22:5
12+
|
13+
LL | x
14+
| ^ one type is more general than the other
15+
|
16+
= note: expected existential trait ref `for<'a> Supertrait<'a, 'a>`
17+
found existential trait ref `for<'a, 'b> Supertrait<'a, 'b>`
18+
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
19+
20+
error: aborting due to 2 previous errors
21+
22+
For more information about this error, try `rustc --explain E0308`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error[E0308]: mismatched types
2+
--> $DIR/higher-ranked-upcasting-ub.rs:22:5
3+
|
4+
LL | fn unsound(x: &dyn for<'a> Subtrait<'a, 'a>) -> &dyn for<'a, 'b> Supertrait<'a, 'b> {
5+
| ----------------------------------- expected `&dyn for<'a, 'b> Supertrait<'a, 'b>` because of return type
6+
LL | x
7+
| ^ expected trait `Supertrait`, found trait `Subtrait`
8+
|
9+
= note: expected reference `&dyn for<'a, 'b> Supertrait<'a, 'b>`
10+
found reference `&dyn for<'a> Subtrait<'a, 'a>`
11+
12+
error: aborting due to 1 previous error
13+
14+
For more information about this error, try `rustc --explain E0308`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//@ revisions: current next
2+
//@ ignore-compare-mode-next-solver (explicit revisions)
3+
//@[next] compile-flags: -Znext-solver
4+
5+
// We previously wrongly instantiated binders during trait upcasting,
6+
// allowing the super trait to be more generic than the sub trait.
7+
// This was unsound.
8+
#![feature(trait_upcasting)]
9+
trait Supertrait<'a, 'b> {
10+
fn cast(&self, x: &'a str) -> &'b str;
11+
}
12+
13+
trait Subtrait<'a, 'b>: Supertrait<'a, 'b> {}
14+
15+
impl<'a> Supertrait<'a, 'a> for () {
16+
fn cast(&self, x: &'a str) -> &'a str {
17+
x
18+
}
19+
}
20+
impl<'a> Subtrait<'a, 'a> for () {}
21+
fn unsound(x: &dyn for<'a> Subtrait<'a, 'a>) -> &dyn for<'a, 'b> Supertrait<'a, 'b> {
22+
x //~ ERROR mismatched types
23+
//[current]~^ ERROR mismatched types
24+
}
25+
26+
fn transmute<'a, 'b>(x: &'a str) -> &'b str {
27+
unsound(&()).cast(x)
28+
}
29+
30+
fn main() {
31+
let x;
32+
{
33+
let mut temp = String::from("hello there");
34+
x = transmute(temp.as_str());
35+
}
36+
println!("{x}");
37+
}

0 commit comments

Comments
 (0)