@Target(allowedTargets = [AnnotationTarget.TYPE])
open annotation class TypeAnn : Annotation {
  constructor(name: String) /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  val name: String
    field = name
    get

}

@Target(allowedTargets = [AnnotationTarget.TYPE_PARAMETER])
open annotation class TypeParameterAnn : Annotation {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

@Target(allowedTargets = [AnnotationTarget.TYPE_PARAMETER])
@Retention(value = AnnotationRetention.BINARY)
open annotation class TypeParameterAnnBinary : Annotation {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

interface Simple {

}

class SimpleClass {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

interface Generic<G : Any?> {

}

class GenericClass<G : Any?> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

class SimpleParameter<@TypeParameterAnn @TypeParameterAnnBinary T : Any?> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

class InterfaceBound<@TypeParameterAnn T : @TypeAnn(name = "Simple") Simple> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

class ClassBound<@TypeParameterAnn T : @TypeAnn(name = "Simple") SimpleClass> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

class InterfaceBoundGeneric<T : @TypeAnn(name = "Generic") Generic<@TypeAnn(name = "Simple") Simple>> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

class ClassBoundGeneric<T : @TypeAnn(name = "GenericClass") GenericClass<@TypeAnn(name = "SimpleClass") SimpleClass>> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

class TypeParameterAsBound<Y : Any?, @TypeParameterAnn T : @TypeAnn(name = "Y as Bound") Y> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}
