35 lines
980 B
Rust
35 lines
980 B
Rust
// RPITITs don't have variances in their GATs, so they always relate invariantly
|
|
// and act as if they capture all their args.
|
|
// To fix this soundly, we need to make sure that all the trait header args
|
|
// remain captured, since they affect trait selection.
|
|
|
|
#![feature(precise_capturing_in_traits)]
|
|
|
|
fn eq_types<T>(_: T, _: T) {}
|
|
|
|
trait TraitLt<'a: 'a> {
|
|
fn hello() -> impl Sized + use<Self>;
|
|
//~^ ERROR `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list
|
|
}
|
|
fn trait_lt<'a, 'b, T: for<'r> TraitLt<'r>> () {
|
|
eq_types(
|
|
//~^ ERROR lifetime may not live long enough
|
|
//~| ERROR lifetime may not live long enough
|
|
<T as TraitLt<'a>>::hello(),
|
|
<T as TraitLt<'b>>::hello(),
|
|
);
|
|
}
|
|
|
|
trait MethodLt {
|
|
fn hello<'a: 'a>() -> impl Sized + use<Self>;
|
|
}
|
|
fn method_lt<'a, 'b, T: MethodLt> () {
|
|
eq_types(
|
|
T::hello::<'a>(),
|
|
T::hello::<'b>(),
|
|
);
|
|
// Good!
|
|
}
|
|
|
|
fn main() {}
|