Fix non-suspending labeled loop in suspend function

Fix bug when labeled loop, which does not contain suspend calls
in its body, was losing its label
This commit is contained in:
Alexey Andreev
2017-04-27 17:37:17 +03:00
parent 6047746c90
commit c8c3d24b45
6 changed files with 82 additions and 1 deletions
@@ -0,0 +1,50 @@
// IGNORE_BACKEND: NATIVE
// WITH_RUNTIME
// WITH_COROUTINES
import kotlin.coroutines.experimental.*
import kotlin.coroutines.experimental.intrinsics.*
fun builder(c: suspend () -> Unit): Unit {
c.startCoroutine(handleResultContinuation {
finished = true
})
}
fun box(): String {
builder {
var i = 0
var j = 0
outer@while (i < 10) {
while (j < 10) {
if (i + j > 3) break@outer
log += "$i,$j;"
suspendAndContinue()
j++
}
log += "i++;"
i++
}
log += "done;"
suspendAndContinue()
}
while (!finished) {
log += "@;"
postponed()
}
if (log != "0,0;@;0,1;@;0,2;@;0,3;@;done;@;") return "fail: $log"
return "OK"
}
suspend fun suspendAndContinue(): Unit = suspendCoroutineOrReturn { c ->
postponed = {
c.resume(Unit)
}
COROUTINE_SUSPENDED
}
var postponed: () -> Unit = {}
var finished = false
var log = ""