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

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

  }

}

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

  }

}

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

  }

  override fun bar(): MutableList<Int> {
    return mutableListOf<Int>()
  }

  override fun bar2(): Queue<String> {
    return LinkedList<@FlexibleNullability String?>()
  }

  override fun bar3(): MutableSet<Any> {
    return mutableSetOf<Any>()
  }

  override fun bar4(): IntArray {
    return intArrayOf()
  }

  override fun bar5(): Array<String> {
    return arrayOf<String>(elements = [""])
  }

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

  override fun foo2(b: Queue<String>) {
  }

  override fun foo3(c: MutableSet<Any>) {
  }

  override fun foo4(d: IntArray) {
  }

  override fun foo5(e: Array<out String>) {
  }

}

fun test(a: A, b: B, c: C) {
  a.#a = listOf<Int>(element = 1)
  a.#b = LinkedList<@FlexibleNullability String?>()
  a.#c = setOf<Int?>(elements = [null, 1])
  a.#d = intArrayOf(elements = [1])
  a.#e = arrayOf<@FlexibleNullability String?>(elements = [null])
  a.foo(a = null)
  a.foo(a = listOf<Int>(elements = [1, 2]))
  a.foo2(b = null)
  a.foo2(b = LinkedList<@FlexibleNullability String?>())
  a.foo3(c = null)
  a.foo3(c = setOf<Any>(elements = ["", 1]))
  a.foo4(d = null)
  a.foo4(d = intArrayOf(elements = [1]))
  a.foo5(e = null)
  a.foo5(e = arrayOf<String>(elements = [""]))
  val k: List<Int> = a.bar() /*!! @FlexibleMutability MutableList<@FlexibleNullability Int?> */
  val k2: Queue<String> = a.bar2() /*!! Queue<@FlexibleNullability String?> */
  val k3: Set<Any> = a.bar3() /*!! @FlexibleMutability MutableSet<@FlexibleNullability Any?> */
  val k4: IntArray = a.bar4() /*!! IntArray */
  val k5: Array<String> = a.bar5() /*!! @FlexibleArrayElementVariance Array<out @FlexibleNullability String?> */
  b.#a = listOf<Int>(element = 1)
  b.#b = LinkedList<@FlexibleNullability String?>()
  b.#c = setOf<Int?>(elements = [null, 1])
  b.#d = intArrayOf(elements = [1])
  b.#e = arrayOf<String>(elements = [""])
  b.foo(a = null)
  b.foo(a = listOf<Int>(elements = [1, 2]))
  b.foo2(b = null)
  b.foo2(b = LinkedList<@FlexibleNullability String?>())
  b.foo3(c = null)
  b.foo3(c = setOf<Any>(elements = ["", 1]))
  b.foo4(d = null)
  b.foo4(d = intArrayOf(elements = [1]))
  b.foo5(e = null)
  b.foo5(e = arrayOf<String>(elements = [""]))
  val k6: List<Int> = b.bar() /*!! @FlexibleMutability MutableList<@FlexibleNullability Int?> */
  val k7: Queue<String> = b.bar2() /*!! Queue<@FlexibleNullability String?> */
  val k8: Set<Any> = b.bar3() /*!! @FlexibleMutability MutableSet<@FlexibleNullability Any?> */
  val k9: IntArray = b.bar4() /*!! IntArray */
  val k10: Array<String> = b.bar5() /*!! @FlexibleArrayElementVariance Array<out @FlexibleNullability String?> */
  c.#a = listOf<Int>(element = 1)
  c.#b = LinkedList<@FlexibleNullability String?>()
  c.#c = setOf<Int?>(elements = [null, 1])
  c.#d = intArrayOf(elements = [1])
  c.#e = arrayOf<String>(elements = [""])
  c.foo(a = mutableListOf<Int>())
  c.foo2(b = LinkedList<@FlexibleNullability String?>())
  c.foo3(c = mutableSetOf<Any>())
  c.foo4(d = intArrayOf(elements = [1]))
  c.foo5(e = arrayOf<String>(elements = [""]))
  val k11: List<Int> = c.bar()
  val k12: Queue<String> = c.bar2()
  val k13: Set<Any> = c.bar3()
  val k14: IntArray = c.bar4()
  val k15: Array<String> = c.bar5()
}
