Add more tests for for-in-array

#KT-21354 Fixed Target versions 1.2.20
 #KT-21321 Fixed Target versions 1.2.20
This commit is contained in:
Dmitry Petrov
2017-12-05 12:55:53 +03:00
parent e4ecc13e13
commit 3d473f608e
15 changed files with 294 additions and 150 deletions
@@ -0,0 +1,12 @@
// WITH_RUNTIME
var xs = intArrayOf(1, 2, 3)
fun box(): String {
var sum = 0
for (x in xs) {
sum = sum * 10 + x
xs = IntArray(0)
}
return if (sum == 123) "OK" else "Fail: $sum"
}
@@ -0,0 +1,13 @@
// WITH_RUNTIME
// LANGUAGE_VERSION: 1.2
// IGNORE_BACKEND: JS
fun box(): String {
var xs = intArrayOf(1, 2, 3)
var sum = 0
for (x in xs) {
sum = sum * 10 + x
xs = intArrayOf(4, 5)
}
return if (sum == 15) "OK" else "Fail: $sum"
}
@@ -0,0 +1,23 @@
// WITH_RUNTIME
// LANGUAGE_VERSION: 1.3
// In Kotlin 1.0, in a for-in-array loop, range expression is cached in
// a local variable unless it is already a local variable.
// This caused the following quirky behavior:
// if an array variable is updated in the loop body, it affects the loop
// execution (see https://youtrack.jetbrains.com/issue/KT-21354).
// Most likely it is a bug, however, fixing it right now is a breaking
// change requiring a proper deprecation loop.
// When the design decision is made, it might be required to update this
// test (e.g., by adding a proper LANGUAGE_VERSION directive).
// Note that JS back-end handles this case "correctly".
fun box(): String {
var xs = intArrayOf(1, 2, 3)
var sum = 0
for (x in xs) {
sum = sum * 10 + x
xs = intArrayOf(4, 5)
}
return if (sum == 123) "OK" else "Fail: $sum"
}
@@ -0,0 +1,17 @@
class Del<T>(var x: T) {
operator fun getValue(thisRef: Any?, kProp: Any) = x
operator fun setValue(thisRef: Any?, kProp: Any, value: T) {
x = value
}
}
fun box(): String {
var xs by Del(intArrayOf(1, 2, 3))
var sum = 0
for (x in xs) {
sum = sum * 10 + x
xs = intArrayOf(4, 5, 6)
}
return if (sum == 123) "OK" else "Fail: $sum"
}
@@ -0,0 +1,16 @@
var xs: IntArray = intArrayOf(1, 2, 3)
get() = field
set(ys) {
var sum = 0
for (x in field) {
sum = sum * 10 + x
field = intArrayOf(4, 5, 6)
}
if (sum != 123) throw AssertionError("sum=$sum")
field = ys
}
fun box(): String {
xs = intArrayOf()
return "OK"
}
@@ -0,0 +1,14 @@
fun box() : String {
val a = arrayOfNulls<Int>(5)
var i = 0
var sum = 0
for(el in 0..4) {
a[i] = i++
}
for (el in (a as Array<Int>)) {
sum = sum + el
}
if(sum != 10) return "a failed"
return "OK"
}
@@ -0,0 +1,15 @@
fun box() : String {
val b : Array<Int?> = arrayOfNulls<Int> (5)
var i = 0
var sum = 0
while(i < 5) {
b[i] = i++
}
sum = 0
for (el in b) {
sum = sum + (el ?: 0)
}
if(sum != 10) return "b failed"
return "OK"
}
@@ -0,0 +1,14 @@
fun box() : String {
val a = IntArray (5)
var i = 0
var sum = 0
for(el in 0..4) {
a[i] = i++
}
for (el in a) {
sum = sum + el
}
if(sum != 10) return "a failed"
return "OK"
}