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

  // CHECK:
  //   Mangled name: A{}a
  //   Public signature: /A.a|-1200697420457237799[0]
  //   Public signature debug description: {}a
  abstract val a: A?
    // CHECK JVM_IR:
    //   Mangled name: A#<get-a>(){}A?
    //   Public signature: /A.a.<get-a>|-5866676359912206759[0]
    //   Public signature debug description: <get-a>(){}A?
    abstract get

}

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

  // CHECK JVM_IR:
  //   Mangled name: B#getA(){}X?
  //   Public signature: /B.getA|-186252691497860920[0]
  //   Public signature debug description: getA(){}X?
  override fun getA(): X?

  // CHECK:
  //   Mangled name: B{}a
  //   Public signature: /B.a|-1200697420457237799[0]
  //   Public signature debug description: {}a
  /* fake */ override val a: @EnhancedNullability AX?
    // CHECK JVM_IR:
    //   Mangled name: B#<get-a>(){}AX?{EnhancedNullability}
    //   Public signature: /B.a.<get-a>|1682004550888840418[0]
    //   Public signature debug description: <get-a>(){}AX?{EnhancedNullability}
    @Override
    /* fake */ override get(): @EnhancedNullability AX?

}
