// CHECK:
//   Mangled name: {}test1
//   Public signature: /test1|6005685442305498193[0]
//   Public signature debug description: {}test1
val test1: Box1<Int>
  // CHECK JVM_IR:
  //   Mangled name: #<get-test1>(){}Box1<kotlin.Int>
  //   Public signature: /test1.<get-test1>|-5747887246888681086[0]
  //   Public signature debug description: <get-test1>(){}Box1<kotlin.Int>
  get

// CHECK:
//   Mangled name: {}test2
//   Public signature: /test2|2517758057000911509[0]
//   Public signature debug description: {}test2
val test2: Box2<Int, Int>
  // CHECK JVM_IR:
  //   Mangled name: #<get-test2>(){}Box2<kotlin.Int,kotlin.Int>
  //   Public signature: /test2.<get-test2>|-8093967936013127700[0]
  //   Public signature debug description: <get-test2>(){}Box2<kotlin.Int,kotlin.Int>
  get

// CHECK:
//   Mangled name: {}test3
//   Public signature: /test3|7677556066983021166[0]
//   Public signature debug description: {}test3
val test3: Box2<Int, String>
  // CHECK JVM_IR:
  //   Mangled name: #<get-test3>(){}Box2<kotlin.Int,kotlin.String>
  //   Public signature: /test3.<get-test3>|7330124542622364329[0]
  //   Public signature debug description: <get-test3>(){}Box2<kotlin.Int,kotlin.String>
  get

// CHECK:
//   Mangled name: {}test4
//   Public signature: /test4|-9115637610245762085[0]
//   Public signature debug description: {}test4
val test4: Box2<String, Int>
  // CHECK JVM_IR:
  //   Mangled name: #<get-test4>(){}Box2<kotlin.String,kotlin.Int>
  //   Public signature: /test4.<get-test4>|8274992131610048705[0]
  //   Public signature debug description: <get-test4>(){}Box2<kotlin.String,kotlin.Int>
  get

// CHECK:
//   Mangled name: {}test5
//   Public signature: /test5|4734809624271551895[0]
//   Public signature debug description: {}test5
val test5: Box1<Int>
  // CHECK JVM_IR:
  //   Mangled name: #<get-test5>(){}Box1<kotlin.Int>
  //   Public signature: /test5.<get-test5>|-4135615187810921358[0]
  //   Public signature debug description: <get-test5>(){}Box1<kotlin.Int>
  get

// CHECK:
//   Mangled name: {}test6
//   Public signature: /test6|-2606527149405855403[0]
//   Public signature debug description: {}test6
val test6: Box1<Int>
  // CHECK JVM_IR:
  //   Mangled name: #<get-test6>(){}Box1<kotlin.Int>
  //   Public signature: /test6.<get-test6>|4872700098972426138[0]
  //   Public signature debug description: <get-test6>(){}Box1<kotlin.Int>
  get

// CHECK:
//   Mangled name: {}test7
//   Public signature: /test7|1362036650170262859[0]
//   Public signature debug description: {}test7
val test7: Box2<Int, Int>
  // CHECK JVM_IR:
  //   Mangled name: #<get-test7>(){}Box2<kotlin.Int,kotlin.Int>
  //   Public signature: /test7.<get-test7>|-3283424550561018351[0]
  //   Public signature debug description: <get-test7>(){}Box2<kotlin.Int,kotlin.Int>
  get

// CHECK:
//   Mangled name: {}test8
//   Public signature: /test8|5640428216506241852[0]
//   Public signature debug description: {}test8
val test8: Box2<String, String>
  // CHECK JVM_IR:
  //   Mangled name: #<get-test8>(){}Box2<kotlin.String,kotlin.String>
  //   Public signature: /test8.<get-test8>|3315637717268921363[0]
  //   Public signature debug description: <get-test8>(){}Box2<kotlin.String,kotlin.String>
  get

// CHECK:
//   Mangled name: Box1
//   Public signature: /Box1|null[0]
class Box1<T : Any?> {
  // CHECK:
  //   Mangled name: Box1#<init>(){}
  //   Public signature: /Box1.<init>|-5645683436151566731[0]
  //   Public signature debug description: <init>(){}
  constructor() /* primary */

}

// CHECK:
//   Mangled name: Box2
//   Public signature: /Box2|null[0]
class Box2<T : Any?, R : Any?> {
  // CHECK:
  //   Mangled name: Box2#<init>(){}
  //   Public signature: /Box2.<init>|-5645683436151566731[0]
  //   Public signature debug description: <init>(){}
  constructor() /* primary */

}

// CHECK:
//   Mangled name: OneToOne
//   Public signature: /OneToOne|null[0]
typealias OneToOne<A : Any?> = Box1<A>
// CHECK:
//   Mangled name: OneToOneTransitive
//   Public signature: /OneToOneTransitive|null[0]
typealias OneToOneTransitive<A : Any?> = Box1<A>
// CHECK:
//   Mangled name: OneToTwo
//   Public signature: /OneToTwo|null[0]
typealias OneToTwo<A : Any?> = Box2<A, A>
// CHECK:
//   Mangled name: TwoToOne
//   Public signature: /TwoToOne|null[0]
typealias TwoToOne<A : Any?, B : Any?> = Box1<A>
// CHECK:
//   Mangled name: TwoToTwo
//   Public signature: /TwoToTwo|null[0]
typealias TwoToTwo<A : Any?, B : Any?> = Box2<A, B>
// CHECK:
//   Mangled name: TwoToTwoReversed
//   Public signature: /TwoToTwoReversed|null[0]
typealias TwoToTwoReversed<A : Any?, B : Any?> = Box2<B, A>
// CHECK:
//   Mangled name: TwoToTwoTransitive
//   Public signature: /TwoToTwoTransitive|null[0]
typealias TwoToTwoTransitive<A : Any?, B : Any?> = Box2<A, A>
// CHECK:
//   Mangled name: TwoToTwoTransitive2
//   Public signature: /TwoToTwoTransitive2|null[0]
typealias TwoToTwoTransitive2<A : Any?, B : Any?> = Box2<B, B>
