// WF check for impl Trait in associated type position. // //@ revisions: pass pass_next fail //@ [pass] check-pass //@ [pass_next] compile-flags: -Znext-solver //@ [pass_next] check-pass //@ [fail] check-fail #![feature(impl_trait_in_assoc_type)] // The hidden type here (`&'a T`) requires proving `T: 'a`. // We know it holds because of implied bounds from the impl header. #[cfg(any(pass, pass_next))] mod pass { trait Trait { type Opaque1; fn constrain_opaque1(req: Req) -> Self::Opaque1; } impl<'a, T> Trait<&'a T> for () { type Opaque1 = impl IntoIterator; fn constrain_opaque1(req: &'a T) -> Self::Opaque1 { [req] } } } // The hidden type here (`&'a T`) requires proving `T: 'a`, // but that is not known to hold in the impl. #[cfg(fail)] mod fail { trait Trait<'a, T> { type Opaque; fn constrain_opaque(req: &'a T) -> Self::Opaque; } impl<'a, T> Trait<'a, T> for () { type Opaque = impl Sized + 'a; fn constrain_opaque(req: &'a T) -> Self::Opaque { req //[fail]~^ ERROR the parameter type `T` may not live long enough //[fail]~| ERROR the parameter type `T` may not live long enough } } } fn main() {}