// TARGET_BACKEND: JVM // WITH_RUNTIME // WITH_COROUTINES // FILE: flow.kt package flow interface FlowCollector { suspend fun emit(value: T) } interface Flow { suspend fun collect(collector: FlowCollector) } public inline fun flow(crossinline block: suspend FlowCollector.() -> Unit): Flow = object : Flow { override suspend fun collect(collector: FlowCollector) = collector.block() } inline suspend fun Flow.collect(crossinline action: suspend (T) -> Unit): Unit = collect(object : FlowCollector { override suspend fun emit(value: T) = action(value) }) inline suspend fun inlineMe(crossinline block: suspend () -> Unit) = suspend { block() } // FILE: Test.kt import flow.* import helpers.* import kotlin.coroutines.* import kotlin.coroutines.intrinsics.* fun builder(c: suspend () -> Unit) { c.startCoroutine(EmptyContinuation) } fun box(): String { var str = "FAIL" builder { flow { var continuation: Continuation? = null suspendCoroutineUninterceptedOrReturn { continuation = it; Unit } str = "$continuation" }.collect { } } if ("(Test.kt:" !in str) return str builder { inlineMe { var continuation: Continuation? = null suspendCoroutineUninterceptedOrReturn { continuation = it; Unit } str = "$continuation" }() } if ("(Test.kt:" !in str) return str return "OK" }