// check-pass #![allow(dead_code)] trait Trait1<T, U> { fn f1(self) -> U; } trait Trait2 { type T; type U: Trait2<T = Self::T>; fn f2(f: impl FnOnce(&Self::U)); } fn f3<T: Trait2>() -> impl Trait1<T, T::T> { Struct1 } struct Struct1; impl<T: Trait2> Trait1<T, T::T> for Struct1 { fn f1(self) -> T::T { unimplemented!() } } fn f4<T: Trait2>() { T::f2(|_| { f3::<T::U>().f1(); }); } fn main() {}