Skip to content

Commit

Permalink
Rollup merge of #113163 - JohnTitor:issue-112895, r=compiler-errors
Browse files Browse the repository at this point in the history
Add a regression test for #112895

Closes #112895 if the second option is enough to close the issue
r? `@compiler-errors`
  • Loading branch information
fee1-dead committed Jul 6, 2023
2 parents baba904 + 40f2fbf commit a105aa2
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// This test checks that we correctly reject the following unsound code.

trait Lengthen<T> {
fn lengthen(self) -> T;
}

impl<'a> Lengthen<&'a str> for &'a str {
fn lengthen(self) -> &'a str { self }
}

trait Gat {
type Gat<'a>: for<'b> Lengthen<Self::Gat<'b>>;

fn lengthen(s: Self::Gat<'_>) -> Self::Gat<'static> {
s.lengthen()
}
}

impl Gat for () {
type Gat<'a> = &'a str; //~ ERROR: implementation of `Lengthen` is not general enough
}

fn main() {
let s = "hello, garbage".to_string();
let borrow: &'static str = <() as Gat>::lengthen(&s);
drop(s);

println!("{borrow}");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error: implementation of `Lengthen` is not general enough
--> $DIR/gat-bounds-not-checked-with-right-substitutions.rs:20:20
|
LL | type Gat<'a> = &'a str;
| ^^^^^^^ implementation of `Lengthen` is not general enough
|
= note: `Lengthen<&'0 str>` would have to be implemented for the type `&'a str`, for any lifetime `'0`...
= note: ...but `Lengthen<&'1 str>` is actually implemented for the type `&'1 str`, for some specific lifetime `'1`

error: aborting due to previous error

0 comments on commit a105aa2

Please sign in to comment.