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

  }

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

  override fun bar2(): IntArray {
    return CHECK_NOT_NULL<Nothing>(arg0 = null)
  }

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

  override fun foo(a: MutableList<Int>) {
  }

  override fun foo2(a: IntArray?) {
  }

  override fun foo3(a: Array<out String>?) {
  }

}

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

  }

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

  override fun bar2(): IntArray {
    return CHECK_NOT_NULL<Nothing>(arg0 = null)
  }

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

  override fun foo(o: ArrayList<Int>) {
  }

  override fun foo2(a: IntArray?) {
  }

  override fun foo3(a: Array<out String>?) {
  }

}

interface A : Java1, Java2 {
}

interface C : Java2, KotlinInterface {
}

interface KotlinInterface {
  abstract fun bar(): ArrayList<Int>

  abstract fun foo(o: ArrayList<Int>)

}

fun test(a: A, b: B, c: C, d: D) {
  a.foo(a = listOf<Int?>(elements = [1, null]))
  a.foo(a = arrayListOf<@FlexibleNullability Int?>(elements = [1, null]))
  a.foo2(a = null)
  a.foo2(a = intArrayOf())
  a.foo3(a = null)
  a.foo3(a = arrayOf<@FlexibleNullability String?>(elements = [null]))
  val k: MutableList<Int> = a.bar() /*!! ArrayList<@FlexibleNullability Int?> */
  val k2: ArrayList<Int> = a.bar() /*!! ArrayList<@FlexibleNullability Int?> */
  val k3: IntArray = a.bar2() /*!! IntArray */
  val k4: Array<String> = a.bar3() /*!! @FlexibleArrayElementVariance Array<out @FlexibleNullability String?> */
  b.foo(a = mutableListOf<Int>(elements = [1]))
  b.foo(a = arrayListOf<@FlexibleNullability Int?>(elements = [1, null]))
  b.foo2(a = null)
  b.foo2(a = intArrayOf())
  b.foo3(a = null)
  b.foo3(a = arrayOf<String>(elements = [""]))
  val k5: MutableList<Int> = b.bar()
  val k6: ArrayList<Int> = b.bar()
  val k7: IntArray = b.bar2()
  val k8: Array<String> = b.bar3()
  c.foo(a = arrayListOf<@FlexibleNullability Int?>(elements = [1, null]))
  c.foo(a = null)
  c.foo2(a = intArrayOf(elements = [1]))
  c.foo2(a = null)
  c.foo3(a = arrayOf<@FlexibleNullability String?>(elements = [null]))
  c.foo3(a = null)
  val k9: MutableList<Int> = c.bar()
  val k10: ArrayList<Int> = c.bar()
  val k11: IntArray = c.bar2() /*!! IntArray */
  val k12: Array<String> = c.bar3() /*!! @FlexibleArrayElementVariance Array<out @FlexibleNullability String?> */
  d.foo(o = arrayListOf<Int>(elements = [1]))
  d.foo2(a = intArrayOf(elements = [1]))
  d.foo2(a = null)
  d.foo3(a = arrayOf<String>(elements = [""]))
  d.foo3(a = null)
  val k13: MutableList<Int> = d.bar()
  val k14: ArrayList<Int> = d.bar()
  val k15: IntArray = d.bar2()
  val k16: Array<String> = d.bar3()
}
