| //@ 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() {} |