// MODULE: separate
// MODULE: main
// FILE: 1.kt

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

  }

}

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

  }

}

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

  }

  override fun foo(s: String?) {
  }

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

}

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

  }

  override fun foo(s: String?) {
  }

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

}

fun test() {
  val param: String? = "1"
  val k1: String = A().#nullableString /*!! String */
  val k2: String? = A().#nullableString
  val k3: String = A().getNullableString() /*!! String */
  val k4: Unit = A().foo(s = param)
  val k5: String = B().#nullableString /*!! String */
  val k6: String? = B().#nullableString
  val k7: String = B().getNullableString() /*!! String */
  val k8: Unit = B().foo(s = param)
  val k9: String = C().#nullableString /*!! String */
  val k10: String? = C().#nullableString
  val k11: String = C().getNullableString()
  val k12: Unit = C().foo(s = param)
  val k13: String = D().#nullableString /*!! String */
  val k14: String = D().#nullableString /*!! String */
  val k15: String = D().getNullableString()
  val k16: Unit = D().foo(s = param)
}
