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

  }

}

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

  }

  override fun bar(): String {
    return CHECK_NOT_NULL<Nothing>(arg0 = null)
  }

  override fun foo(s: String?) {
  }

}

abstract class C : Java2 {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

}

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

  }

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

  override fun foo(s: String) {
  }

}

fun test(a: A, b: B, c: C, d: D) {
  val k: String? = a(super<A>).#nullableString
  val k2: String? = a.bar()
  a.foo(s = null)
  a.foo(s = "")
  val k3: String? = b(super<B>).#nullableString
  val k4: String = b.bar()
  b.foo(s = null)
  b.foo(s = "")
  val k5: String = c.bar() /*!! String */
  c.foo(s = "")
  val k6: String = d.bar()
  d.foo(s = "")
}
