// check-pass use std::marker::PhantomData; trait A<'a> { type B; fn b(self) -> Self::B; } struct T; struct S<'a>(PhantomData<&'a ()>); impl<'a> A<'a> for T { type B = S<'a>; fn b(self) -> Self::B { S(PhantomData) } } fn s(t: TT, f: F) where TT: for<'a> A<'a>, F: for<'a> FnOnce(>::B) { f(t.b()); } fn main() { s(T, |_| {}); }