// Test that we get implied bounds from complex projections after normalization. // check-pass // implementations wil ensure that // WF(>::Ty) implies T: 'a trait Combine<'a> { type Ty; } impl<'a, T: 'a> Combine<'a> for Box { type Ty = &'a T; } // ======= Wrappers ====== // normalizes to a projection struct WrapA(T); impl<'a, T> Combine<'a> for WrapA where T: Combine<'a>, { type Ty = T::Ty; } // as Combine<'a>>::Ty normalizes to a type variable ?X // with constraint `>::Ty == ?X` struct WrapB(T); impl<'a, X, T> Combine<'a> for WrapB where T: Combine<'a, Ty = X>, { type Ty = X; } // as Combine<'a>>::Ty normalizes to `&'a &'?x ()` // with constraint `>::Ty == &'a &'?x ()` struct WrapC(T); impl<'a, 'x: 'a, T> Combine<'a> for WrapC where T: Combine<'a, Ty = &'a &'x ()>, { type Ty = &'a &'x (); } //==== Test implied bounds ====== fn test_wrap<'a, 'b, 'c1, 'c2, A, B>( _: > as Combine<'a>>::Ty, // normalized: &'a A _: > as Combine<'b>>::Ty, // normalized: &'b B _: > as Combine<'c2>>::Ty, // normalized: &'c2 &'c1 () ) { None::<&'a A>; None::<&'b B>; None::<&'c2 &'c1 ()>; } fn main() {}