b4a5eec5f4
As shown in KT-44412 (or KT-45319 or KT-17728):
```
fun test5() {
var i = 0
Outer@while (true) {
++i
var j = 0
Inner@do {
++j
} while (if (j >= 3) false else break) // break@Inner
if (i == 3) break
}
}
```
To properly set the loop target for `break` in do-while loop condition,
the loop target for that do-while loop should be ready before parsing
the loop condition.
Previously, Raw FIR loop building configures loop target after visiting
loop conditions. This commit splits the configuration and lets the
builders prepare the loop target for do-while loop only.
39 lines
783 B
Kotlin
Vendored
39 lines
783 B
Kotlin
Vendored
// See: https://youtrack.jetbrains.com/issue/KT-45319
|
|
// IGNORE_BACKEND: JVM
|
|
// IGNORE_BACKEND: JS
|
|
|
|
fun breakInDoWhileCondition(): String {
|
|
var i = 0
|
|
while (true) {
|
|
++i
|
|
var j = 0
|
|
do {
|
|
++j
|
|
} while (break)
|
|
if (j != 1) return "FAIL1"
|
|
if (i == 3) break
|
|
}
|
|
if (i != 3) return "FAIL2"
|
|
return "OK"
|
|
}
|
|
|
|
fun breakInWhileCondition(): String {
|
|
var i = 0
|
|
while (true) {
|
|
++i
|
|
var j = 0
|
|
while (break) {
|
|
j++
|
|
}
|
|
return "FAIL3"
|
|
}
|
|
if (i != 1) return "FAIL4"
|
|
return "OK"
|
|
}
|
|
|
|
fun box(): String {
|
|
val breakInDoWhileResult = breakInDoWhileCondition()
|
|
if (breakInDoWhileResult != "OK") return breakInDoWhileResult
|
|
return breakInWhileCondition()
|
|
}
|