Files
kotlin/compiler/testData/diagnostics/testsWithStdLib/forInArrayLoop/capturedRangeVariableAssignmentBefore13.kt
Dmitry Petrov 7a6f80606b Warn on for-in-array range variable assignment in loop body
According to KT-21354, this should be a warning in 1.2 and before, and
no warning (with changed semantics) in 1.3 and later.
NB there are some false positives in this check.

 #KT-21354 In Progress
 #KT-21321 In Progress
2017-12-05 15:45:20 +03:00

103 lines
2.0 KiB
Kotlin
Vendored

// !LANGUAGE: -ProperForInArrayLoopRangeVariableAssignmentSemantic
// !DIAGNOSTICS: -UNUSED_VALUE
// SKIP_TXT
fun testArrayCapturedInLocalFun() {
var xs = arrayOf("a", "b", "c")
fun updateXs() {
xs = arrayOf("d", "e", "f")
}
for (x in xs) {
println(x)
updateXs()
}
}
fun testArrayCapturedInLabmda() {
var xs = arrayOf("a", "b", "c")
val updateXs = { xs = arrayOf("d", "e", "f") }
for (x in xs) {
println(x)
updateXs()
}
}
fun testArrayCapturedInInlineLambda() {
var xs = arrayOf("a", "b", "c")
for (x in xs) {
println(x)
run {
xs = arrayOf("d", "e", "f")
}
}
}
fun testArrayCapturedInLocalObject() {
var xs = arrayOf("a", "b", "c")
val updateXs = object : () -> Unit {
override fun invoke() {
xs = arrayOf("d", "e", "f")
}
}
for (x in xs) {
println(x)
updateXs()
}
}
fun testArrayCapturedInLocalClass() {
var xs = arrayOf("a", "b", "c")
class LocalClass {
fun updateXs() {
xs = arrayOf("d", "e", "f")
}
}
val updater = LocalClass()
for (x in xs) {
println(x)
updater.updateXs()
}
}
fun testCapturedInLambdaAfterLoop() {
// NB false positive
var xs = intArrayOf(1, 2, 3)
for (x in xs) {
println(x)
<!ASSIGNMENT_TO_ARRAY_LOOP_VARIABLE!>xs<!> = intArrayOf(4, 5, 6)
}
val lambda = { xs = intArrayOf() }
lambda()
}
fun testCapturedInLambdaInLoopAfterAssignment() {
// NB false positive
var xs = intArrayOf(1, 2, 3)
for (x in xs) {
println(x)
<!ASSIGNMENT_TO_ARRAY_LOOP_VARIABLE!>xs<!> = intArrayOf(4, 5, 6)
val lambda = { xs = intArrayOf() }
lambda()
}
}
fun testCapturedInNonChangingClosure() {
// NB false positive
var xs = intArrayOf(1, 2, 3)
val lambda = { println(xs) }
for (x in xs) {
println(x)
<!ASSIGNMENT_TO_ARRAY_LOOP_VARIABLE!>xs<!> = intArrayOf(4, 5, 6)
lambda()
}
}