// Because of #109628, when we compute the implied bounds from `Foo`, // we incorrectly get `X: placeholder('x)`. // Make sure we ignore these bogus bounds and not use them for anything useful. // //@ revisions: fail pass //@ [fail] check-fail //@ [pass] check-pass trait Trait { type Ty<'a> where Self: 'a; } impl Trait for T { type Ty<'a> = () where Self: 'a; } struct Foo(T) where for<'x> T::Ty<'x>: Sized; trait AnotherTrait { type Ty2<'a>: 'a; } #[cfg(fail)] mod fail { use super::*; // implied_bound: `'lt: placeholder('x)`. // don't use the bound to prove `'lt: 'static`. fn test_lifetime<'lt, T: Trait>(_: Foo<&'lt u8>) {} //[fail]~^ ERROR `&'lt u8` does not fulfill the required lifetime // implied bound: `T::Ty2<'lt>: placeholder('x)`. // don't use the bound to prove `T::Ty2<'lt>: 'static`. fn test_alias<'lt, T: AnotherTrait>(_: Foo>) {} //[fail]~^ ERROR `::Ty2<'lt>` does not fulfill the required lifetime } mod pass { use super::*; // implied_bound: 'static: placeholder('x). // don't ice. fn test_lifetime(_: Foo<&'static u8>) {} // implied bound: T::Ty2<'static>: placeholder('x). // don't add the bound to the environment, // otherwise we would fail to infer a value for `'_`. fn test_alias(_: Foo>) { None::<&'static T::Ty2<'_>>; } } fn main() {}