// 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<T>()
where
    for<'a> T: TraitA<'a, AsA: for<'b> TraitB<'a, 'b, AsB: for<'c> TraitC<'a, 'b, 'c>>>,
{
}

fn main() {
    foo::<Z>();
}
