// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // The old backend thinks `toArray(): Array` is the same as `toArray(): Array` // IGNORE_BACKEND: JVM // WITH_RUNTIME // FILE: MyListWithCustomToArray.java public abstract class MyListWithCustomToArray extends java.util.AbstractList { public Object[] toArray() { return new Object[]{null}; } public T[] toArray(T[] a) { return a; } } // FILE: a.kt class MyList(val list: List): java.util.AbstractList() { override fun get(index: Int): T = list[index] override val size: Int get() = list.size } class MyListSubclass(val list: List): MyListWithCustomToArray() { override fun get(index: Int): T = list[index] override val size: Int get() = list.size } class MyCollection(val list: List) : Collection by list { fun toArray(): Array = arrayOfNulls(0) } fun box(): String { val list1 = MyList(listOf(2, 3, 9)) as java.util.Collection<*> list1.toArray().contentToString().let { if (it != "[2, 3, 9]") return "fail 1: $it" } list1.toArray(arrayOfNulls(0)).contentToString().let { if (it != "[2, 3, 9]") return "fail 2: $it" } val list2 = MyListSubclass(listOf(2, 3, 9)) as java.util.Collection<*> list2.toArray().contentToString().let { if (it != "[null]") return "fail 3: $it" } list2.toArray(arrayOfNulls(1)).contentToString().let { if (it != "[null]") return "fail 4: $it" } val list3 = MyCollection(listOf(2, 3, 9)) as java.util.Collection<*> list3.toArray().contentToString().let { if (it != "[2, 3, 9]") return "fail 5: $it" } list3.toArray(arrayOfNulls(0)).contentToString().let { if (it != "[2, 3, 9]") return "fail 6: $it" } return "OK" }