mirror of https://github.com/rust-lang/rust
30 lines
628 B
Rust
30 lines
628 B
Rust
// 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}");
|
|
}
|