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

  }

}

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

  }

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

  override fun foo(s: String?) {
  }

}

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

  }

}

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

  }

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

  override fun foo(s: String?) {
  }

}

abstract class E : Java2, Java4 {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

}

class F : Java2, Java4 {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

  override fun foo(s: Any?) {
  }

}

abstract class G : Java2, KotlinInterface {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

}

class H : Java2, KotlinInterface {
  override val nullableString: Any
    field = nullableString
    override get

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

  }

  override fun foo(s: Any) {
  }

}

class I : Java5 {
  constructor() /* primary */ {
    super/*Java5*/()
    /* <init>() */

  }

}

interface KotlinInterface {
  abstract fun bar(): Any?

  abstract fun foo(s: Any)

  abstract val nullableString: Any
    abstract get

}

fun test(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I) {
  a.#nullableString /*~> Unit */
  a.foo(s = "")
  a.bar() /*~> Unit */
  b.#nullableString /*~> Unit */
  b.foo(s = "")
  b.bar() /*~> Unit */
  c.#nullableString /*~> Unit */
  c.foo(s = "")
  c.bar() /*~> Unit */
  d.#nullableString /*~> Unit */
  d.foo(s = "")
  d.bar() /*~> Unit */
  e.#nullableString /*~> Unit */
  e.foo(s = "")
  e.foo(s = 1)
  e.bar() /*~> Unit */
  f.#nullableString /*~> Unit */
  f.foo(s = "")
  f.foo(s = 1)
  f.bar() /*~> Unit */
  g.#nullableString /*~> Unit */
  g.foo(s = 1)
  g.bar() /*~> Unit */
  h.<get-nullableString>() /*~> Unit */
  h.foo(s = 1)
  h.bar() /*~> Unit */
  i.#nullableString /*~> Unit */
  i.foo(s = "")
  i.bar() /*~> Unit */
}
