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

  }

}

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

  }

  override operator fun get(i: Any?): Any {
    return 2
  }

  override operator fun get(i: Int?): Int {
    return 3
  }

  override operator fun invoke() {
  }

  override operator fun plus(i: Any?): Java2 {
    return CHECK_NOT_NULL<Nothing>(arg0 = null)
  }

  override operator fun plus(i: Int?): Java1 {
    return CHECK_NOT_NULL<Nothing>(arg0 = null)
  }

}

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

  }

}

class D : Java1, KotlinInterface {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  override operator fun get(i: Int?): Int {
    return 4
  }

  override operator fun invoke() {
  }

  override operator fun plus(i: Int?): Java1 {
    return CHECK_NOT_NULL<Nothing>(arg0 = null)
  }

}

interface KotlinInterface {
  abstract operator fun get(i: Int?): Int

  abstract operator fun invoke()

}

fun test(a: A, b: B, c: C, d: D) {
  val k: Unit = a.invoke()
  val k1: Java1 = a.plus(i = 1) /*!! Java1 */
  val k2: Int? = a.get(i = 1)
  val k3: Unit = b.invoke()
  val k4: Java1 = b.plus(i = 1)
  val k5: Java1 = b.plus(i = null)
  val k6: Java2 = b.plus(i = "")
  val k7: Int = b.get(i = 1)
  val k8: Int = b.get(i = null)
  val k9: Any = b.get(i = "")
  val k10: Unit = c.invoke()
  val k11: Int = c.get(i = 1)
  val k12: Int = c.get(i = null)
  val k13: Java1 = c.plus(i = 1) /*!! Java1 */
  val k14: Unit = d.invoke()
  val k15: Int = d.get(i = 1)
  val k16: Int = d.get(i = null)
  val k17: Java1 = d.plus(i = 1)
}
