34 lines
454 B
Rust
34 lines
454 B
Rust
// 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() {}
|