// check-pass trait Gats<'a> { type Assoc; type Assoc2; } trait Trait: for<'a> Gats<'a> { fn foo<'a>(_: &mut >::Assoc) -> >::Assoc2; } impl<'a> Gats<'a> for () { type Assoc = &'a u32; type Assoc2 = (); } type GatsAssoc<'a, T> = >::Assoc; type GatsAssoc2<'a, T> = >::Assoc2; impl Trait for () { fn foo<'a>(_: &mut GatsAssoc<'a, Self>) -> GatsAssoc2<'a, Self> {} } fn main() {}