| // WITH_COROUTINES |
| // WITH_STDLIB |
| // FILE: test.kt |
| |
| import kotlin.coroutines.* |
| import helpers.* |
| |
| // Block is allowed to be called from nested classes/lambdas (as common crossinlines) |
| // Are suspend calls possible inside lambda matching to the parameter |
| // Start coroutine call is possible |
| // Block is allowed to be called directly inside inline function |
| |
| suspend inline fun test1(noinline c: suspend () -> Unit) { |
| val l : suspend () -> Unit = { c() } |
| builder { l() } |
| } |
| |
| |
| suspend inline fun test2(noinline c: suspend () -> Unit) { |
| c.startCoroutine(EmptyContinuation) |
| } |
| |
| suspend inline fun test3(noinline c: suspend () -> Unit) { |
| c() |
| } |
| |
| fun builder(c: suspend () -> Unit) { |
| c.startCoroutine(EmptyContinuation) |
| } |
| |
| interface SuspendRunnable { |
| suspend fun run() |
| } |
| |
| suspend inline fun test4(noinline c: suspend () -> Unit) { |
| val sr = object: SuspendRunnable { |
| override suspend fun run() { |
| c() |
| } |
| } |
| sr.run() |
| } |
| |
| // FILE: box.kt |
| import kotlin.coroutines.* |
| import helpers.* |
| |
| suspend fun calculate() = "OK" |
| |
| fun box(): String { |
| var res = "FAIL 1" |
| builder { |
| test1 { |
| res = calculate() |
| } |
| } |
| if (res != "OK") return res |
| res = "FAIL 2" |
| builder { |
| test2 { |
| res = "OK" |
| } |
| } |
| if (res != "OK") return res |
| res = "FAIL 3" |
| builder { |
| test3 { |
| res = "OK" |
| } |
| } |
| if (res != "OK") return res |
| res = "FAIL 4" |
| builder { |
| test4 { |
| res = "OK" |
| } |
| } |
| if (res != "OK") return res |
| res = "FAIL 5" |
| builder { |
| test1 { |
| test1 { |
| test1 { |
| test1 { |
| test1 { |
| res = calculate() |
| } |
| } |
| } |
| } |
| } |
| } |
| if (res != "OK") return res |
| res = "FAIL 6" |
| builder { |
| test2 { |
| test2 { |
| test2 { |
| test2 { |
| test2 { |
| res = calculate() |
| } |
| } |
| } |
| } |
| } |
| } |
| if (res != "OK") return res |
| res = "FAIL 7" |
| builder { |
| test3 { |
| test3 { |
| test3 { |
| test3 { |
| test3 { |
| res = calculate() |
| } |
| } |
| } |
| } |
| } |
| } |
| if (res != "OK") return res |
| res = "FAIL 8" |
| builder { |
| test4 { |
| test4 { |
| test4 { |
| test4 { |
| test4 { |
| res = calculate() |
| } |
| } |
| } |
| } |
| } |
| } |
| if (res != "OK") return res |
| res = "FAIL 9" |
| builder { |
| test1 { |
| test2 { |
| test3 { |
| test4 { |
| test1 { |
| res = calculate() |
| } |
| } |
| } |
| } |
| } |
| } |
| return res |
| } |