Fix incorrect code generation for Nothing-returning suspend calls
#KT-30642 Fixed
This commit is contained in:
committed by
GitHub
parent
b22fa985e0
commit
b870ce987a
+1
-1
@@ -2148,7 +2148,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
private fun call(function: IrFunction, llvmFunction: LLVMValueRef, args: List<LLVMValueRef>,
|
private fun call(function: IrFunction, llvmFunction: LLVMValueRef, args: List<LLVMValueRef>,
|
||||||
resultLifetime: Lifetime): LLVMValueRef {
|
resultLifetime: Lifetime): LLVMValueRef {
|
||||||
val result = call(llvmFunction, args, resultLifetime)
|
val result = call(llvmFunction, args, resultLifetime)
|
||||||
if (function.returnType.isNothing()) {
|
if (!function.isSuspend && function.returnType.isNothing()) {
|
||||||
functionGenerationContext.unreachable()
|
functionGenerationContext.unreachable()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1543,6 +1543,11 @@ task coroutines_controlFlow_while2(type: RunKonanTest) {
|
|||||||
source = "codegen/coroutines/controlFlow_while2.kt"
|
source = "codegen/coroutines/controlFlow_while2.kt"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
task coroutines_returnsNothing1(type: RunKonanTest) {
|
||||||
|
goldValue = "OK\n"
|
||||||
|
source = "codegen/coroutines/returnsNothing1.kt"
|
||||||
|
}
|
||||||
|
|
||||||
task coroutines_returnsUnit1(type: RunKonanTest) {
|
task coroutines_returnsUnit1(type: RunKonanTest) {
|
||||||
goldValue = "117\ns1\n0\n"
|
goldValue = "117\ns1\n0\n"
|
||||||
source = "codegen/coroutines/returnsUnit1.kt"
|
source = "codegen/coroutines/returnsUnit1.kt"
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package codegen.coroutines.returnsNothing1
|
||||||
|
|
||||||
|
import kotlin.test.*
|
||||||
|
|
||||||
|
import kotlin.coroutines.*
|
||||||
|
import kotlin.coroutines.intrinsics.*
|
||||||
|
|
||||||
|
open class EmptyContinuation(override val context: CoroutineContext = EmptyCoroutineContext) : Continuation<Any?> {
|
||||||
|
companion object : EmptyContinuation()
|
||||||
|
override fun resumeWith(result: Result<Any?>) { result.getOrThrow() }
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun suspendForever(): Int = suspendCoroutineUninterceptedOrReturn {
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun foo(): Nothing {
|
||||||
|
suspendForever()
|
||||||
|
throw Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun bar() {
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun builder(c: suspend () -> Unit) {
|
||||||
|
c.startCoroutine(EmptyContinuation)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test fun runTest() {
|
||||||
|
builder {
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
println("OK")
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user