open class A : Java1 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

}

class B : A {
  constructor() /* primary */ {
    super/*A*/()
    /* <init>() */

  }

}

open class C : Java1 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

  override fun foo(s: String?) {
  }

  override fun getNullableString(): String {
    return "C"
  }

}

class D : C {
  constructor() /* primary */ {
    super/*C*/()
    /* <init>() */

  }

}

class E : C {
  constructor() /* primary */ {
    super/*C*/()
    /* <init>() */

  }

  override fun foo(s: String?) {
  }

  override fun getNullableString(): String {
    return "E"
  }

}

fun test(b: B, d: D, e: E) {
  b.foo(s = null)
  b.foo(s = "")
  b.#nullableString = "B"
  val k1: String = b.getNullableString() /*!! String */
  val k2: String = b.#nullableString /*!! String */
  d.foo(s = null)
  d.foo(s = "")
  d.#nullableString = "C"
  val k3: String = d.getNullableString()
  val k4: String = d.#nullableString /*!! String */
  e.foo(s = null)
  e.foo(s = "")
  e.#nullableString = "E"
  val k5: String = e.getNullableString()
  val k6: String = e.#nullableString /*!! String */
}
