Correctly map container element type in intrinsic for withIndex

In case of arrays, we couldn't distinguish array of boxed Ints
from array of primitive Ints.

 #KT-22904 Fixed Target versions 1.2.40
This commit is contained in:
Dmitry Petrov
2018-02-19 14:53:36 +03:00
parent 2028ec3ce8
commit 99cea07bf4
14 changed files with 321 additions and 5 deletions
@@ -0,0 +1,18 @@
// WITH_RUNTIME
val arr = byteArrayOf(10, 20, 30, 40)
fun foo(xs: Any): String {
if (xs !is ByteArray) return "not a ByteArray"
val s = StringBuilder()
for ((index, x) in xs.withIndex()) {
s.append("$index:$x;")
}
return s.toString()
}
fun box(): String {
val ss = foo(arr)
return if (ss == "0:10;1:20;2:30;3:40;") "OK" else "fail: '$ss'"
}
@@ -0,0 +1,12 @@
// WITH_RUNTIME
val arr = byteArrayOf(10, 20, 30, 40)
fun box(): String {
val s = StringBuilder()
for ((index, x) in arr.withIndex()) {
s.append("$index:$x;")
}
val ss = s.toString()
return if (ss == "0:10;1:20;2:30;3:40;") "OK" else "fail: '$ss'"
}
@@ -0,0 +1,12 @@
// WITH_RUNTIME
val arr = arrayOf(10, 20, 30, 40)
fun box(): String {
val s = StringBuilder()
for ((index, x) in arr.withIndex()) {
s.append("$index:$x;")
}
val ss = s.toString()
return if (ss == "0:10;1:20;2:30;3:40;") "OK" else "fail: '$ss'"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
val arr = arrayOf(10, 20, 30, 40)
fun foo(xs: Any): String {
if (xs !is Array<*>) return "not an Array<*>"
val s = StringBuilder()
for ((index, x) in xs.withIndex()) {
s.append("$index:$x;")
}
return s.toString()
}
fun box(): String {
val ss = foo(arr)
return if (ss == "0:10;1:20;2:30;3:40;") "OK" else "fail: '$ss'"
}
@@ -0,0 +1,16 @@
// WITH_RUNTIME
val arr = arrayOf(10, 20, 30, 40)
fun <T : Number> foo(xs: Array<T>): String {
val s = StringBuilder()
for ((index, x) in xs.withIndex()) {
s.append("$index:$x;")
}
return s.toString()
}
fun box(): String {
val ss = foo(arr)
return if (ss == "0:10;1:20;2:30;3:40;") "OK" else "fail: '$ss'"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
val arr = intArrayOf(10, 20, 30, 40)
fun foo(xs: Any): String {
if (xs !is IntArray) return "not an IntArray"
val s = StringBuilder()
for ((index, x) in xs.withIndex()) {
s.append("$index:$x;")
}
return s.toString()
}
fun box(): String {
val ss = foo(arr)
return if (ss == "0:10;1:20;2:30;3:40;") "OK" else "fail: '$ss'"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
val arr = shortArrayOf(10, 20, 30, 40)
fun foo(xs: Any): String {
if (xs !is ShortArray) return "not a ShortArray"
val s = StringBuilder()
for ((index, x) in xs.withIndex()) {
s.append("$index:$x;")
}
return s.toString()
}
fun box(): String {
val ss = foo(arr)
return if (ss == "0:10;1:20;2:30;3:40;") "OK" else "fail: '$ss'"
}
@@ -0,0 +1,12 @@
// WITH_RUNTIME
val arr = shortArrayOf(10, 20, 30, 40)
fun box(): String {
val s = StringBuilder()
for ((index, x) in arr.withIndex()) {
s.append("$index:$x;")
}
val ss = s.toString()
return if (ss == "0:10;1:20;2:30;3:40;") "OK" else "fail: '$ss'"
}