[Wasm] Fix SuspendFunctionKind.DELEGATING bug (KT-60700)
When detecting function delegation at the last statement position we need to make sure that delegating call has unit return type, otherwise we would try to return non-Unit value from a parent function returning Unit ^KT-60700 Fixed
This commit is contained in:
committed by
Space Team
parent
ecd06ac47b
commit
432c9fe592
+6
-1
@@ -100,7 +100,12 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
|
|||||||
// This happens a lot in practice because of suspend functions with default arguments.
|
// This happens a lot in practice because of suspend functions with default arguments.
|
||||||
// TODO: use TailRecursionCallsCollector.
|
// TODO: use TailRecursionCallsCollector.
|
||||||
val lastCall = when (val lastStatement = (body as IrBlockBody).statements.lastOrNull()) {
|
val lastCall = when (val lastStatement = (body as IrBlockBody).statements.lastOrNull()) {
|
||||||
is IrCall -> lastStatement
|
is IrCall ->
|
||||||
|
// Delegation to call without return can only be performed to Unit-returning function call from Unit-returning function
|
||||||
|
if (lastStatement.type == context.irBuiltIns.unitType && function.returnType == context.irBuiltIns.unitType)
|
||||||
|
lastStatement
|
||||||
|
else
|
||||||
|
null
|
||||||
is IrReturn -> {
|
is IrReturn -> {
|
||||||
var value: IrElement = lastStatement
|
var value: IrElement = lastStatement
|
||||||
/*
|
/*
|
||||||
|
|||||||
-2
@@ -12,8 +12,6 @@ suspend fun bar(): Int = suspendCoroutineUninterceptedOrReturn<Int> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
return "OK" // KT-60700 Test is hardmuted due to WASM failures on Win&Mac, but not on Linux. So, `// IGNORE_BACKEND: WASM` does not help
|
|
||||||
|
|
||||||
var result = ""
|
var result = ""
|
||||||
suspend {
|
suspend {
|
||||||
foo(::bar)
|
foo(::bar)
|
||||||
|
|||||||
Reference in New Issue
Block a user