// check-pass #![feature(associated_type_bounds)] trait TraitA<'a> { type AsA; } trait TraitB<'a, 'b> { type AsB; } trait TraitC<'a, 'b, 'c> {} struct X; impl<'a, 'b, 'c> TraitC<'a, 'b, 'c> for X {} struct Y; impl<'a, 'b> TraitB<'a, 'b> for Y { type AsB = X; } struct Z; impl<'a> TraitA<'a> for Z { type AsA = Y; } fn foo() where for<'a> T: TraitA<'a, AsA: for<'b> TraitB<'a, 'b, AsB: for<'c> TraitC<'a, 'b, 'c>>>, { } fn main() { foo::(); }