JVM_IR KT-45187 use Arrays.copyOf to copy an array in spread operator
Creating a new array (and copying data into it with System.arraycopy) doesn't work in generic case, because the actual array class depends on call site.
This commit is contained in:
committed by
TeamCityServer
parent
334d0a8b5a
commit
7d62f0b5aa
+13
@@ -0,0 +1,13 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
|
||||
fun box(): String =
|
||||
object : A<Void, Void>() {
|
||||
override fun f(vararg params: Void): Void? = null
|
||||
}.execute()
|
||||
|
||||
abstract class A<P, R> {
|
||||
protected abstract fun f(vararg params: P): R?
|
||||
|
||||
fun execute(vararg params: P): String =
|
||||
if (f(*params) == null) "OK" else "Fail"
|
||||
}
|
||||
+49
-1
@@ -8,7 +8,15 @@ fun <T> copyArray(vararg data: T): Array<out T> = data
|
||||
|
||||
inline fun <reified T> reifiedCopyArray(vararg data: T): Array<out T> = data
|
||||
|
||||
fun copyBooleanArray(vararg data: Boolean): BooleanArray = data
|
||||
fun copyByteArray(vararg data: Byte): ByteArray = data
|
||||
fun copyCharArray(vararg data: Char): CharArray = data
|
||||
fun copyShortArray(vararg data: Short): ShortArray = data
|
||||
fun copyIntArray(vararg data: Int): IntArray = data
|
||||
fun copyLongArray(vararg data: Long): LongArray = data
|
||||
fun copyFloatArray(vararg data: Float): FloatArray = data
|
||||
fun copyDoubleArray(vararg data: Double): DoubleArray = data
|
||||
fun copyStringArray(vararg data: String): Array<out String> = data
|
||||
|
||||
fun box(): String {
|
||||
val sarr = arrayOf("OK")
|
||||
@@ -21,11 +29,51 @@ fun box(): String {
|
||||
rsarr[0] = "Array was not copied"
|
||||
assertEquals(rsarr2[0], "OK", "Failed: Array<String>, reified copy")
|
||||
|
||||
val boolArray = booleanArrayOf(true)
|
||||
val boolArray2 = copyBooleanArray(*boolArray)
|
||||
boolArray[0] = false
|
||||
assertEquals(boolArray2[0], true, "Failed: BooleanArray")
|
||||
|
||||
val byteArray = byteArrayOf(1)
|
||||
val byteArray2 = copyByteArray(*byteArray)
|
||||
byteArray[0] = 42
|
||||
assertEquals(1, byteArray2[0], "Failed: ByteArray")
|
||||
|
||||
val charArray = charArrayOf('a')
|
||||
val charArray2 = copyCharArray(*charArray)
|
||||
charArray[0] = 'b'
|
||||
assertEquals(charArray2[0], 'a', "Failed: CharArray")
|
||||
|
||||
val shortArray = shortArrayOf(1)
|
||||
val shortArray2 = copyShortArray(*shortArray)
|
||||
shortArray[0] = 42
|
||||
assertEquals(1, shortArray2[0], "Failed: ShortArray")
|
||||
|
||||
val iarr = IntArray(1)
|
||||
iarr[0] = 1
|
||||
val iarr2 = copyIntArray(*iarr)
|
||||
iarr[0] = 42
|
||||
assertEquals(iarr2[0], 1, "Failed: IntArray")
|
||||
assertEquals(1, iarr2[0], "Failed: IntArray")
|
||||
|
||||
val longArray = longArrayOf(1L)
|
||||
val longArray2 = copyLongArray(*longArray)
|
||||
longArray[0] = 42L
|
||||
assertEquals(1L, longArray2[0], "Failed: LongArray")
|
||||
|
||||
val floatArray = floatArrayOf(1.0f)
|
||||
val floatArray2 = copyFloatArray(*floatArray)
|
||||
floatArray[0] = 42.0f
|
||||
assertEquals(1.0f, floatArray2[0], "Failed: FloatArray")
|
||||
|
||||
val doubleArray = doubleArrayOf(1.0)
|
||||
val doubleArray2 = copyDoubleArray(*doubleArray)
|
||||
doubleArray[0] = 42.0
|
||||
assertEquals(1.0, doubleArray2[0], "Failed: DoubleArray")
|
||||
|
||||
val stringArray = arrayOf("abc")
|
||||
val stringArray2 = copyStringArray(*stringArray)
|
||||
stringArray[0] = "def"
|
||||
assertEquals("abc", stringArray2[0], "Failed: Array<String>")
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user