diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index e4dadbb2cd7..a6acab5cf3c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2343,10 +2343,10 @@ public class ExpressionCodegen extends KtVisitor impleme @NotNull CallGenerator callGenerator, @NotNull ArgumentGenerator argumentGenerator ) { - boolean isSuspendCall = CoroutineCodegenUtilKt.isSuspendNoInlineCall(resolvedCall); + boolean isSuspendNoInlineCall = CoroutineCodegenUtilKt.isSuspendNoInlineCall(resolvedCall); boolean isConstructor = resolvedCall.getResultingDescriptor() instanceof ConstructorDescriptor; if (!(callableMethod instanceof IntrinsicWithSpecialReceiver)) { - putReceiverAndInlineMarkerIfNeeded(callableMethod, resolvedCall, receiver, isSuspendCall, isConstructor); + putReceiverAndInlineMarkerIfNeeded(callableMethod, resolvedCall, receiver, isSuspendNoInlineCall, isConstructor); } callGenerator.processAndPutHiddenParameters(false); @@ -2380,13 +2380,13 @@ public class ExpressionCodegen extends KtVisitor impleme } } - if (isSuspendCall) { + if (isSuspendNoInlineCall) { addSuspendMarker(v, true); } callGenerator.genCall(callableMethod, resolvedCall, defaultMaskWasGenerated, this); - if (isSuspendCall) { + if (isSuspendNoInlineCall) { addReturnsUnitMarkerIfNecessary(v, resolvedCall); addSuspendMarker(v, false); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt index 5856b1a3ccf..5ea68904f3f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/coroutineCodegenUtil.kt @@ -175,11 +175,16 @@ private fun NewResolvedCallImpl.asDummyOldResolvedCall(bindi ) } -fun ResolvedCall<*>.isSuspendNoInlineCall() = - resultingDescriptor.safeAs() +fun ResolvedCall<*>.isSuspendNoInlineCall(): Boolean { + val isCrossinline = + safeAs()?.variableCall?.resultingDescriptor?.safeAs()?.isCrossinline + ?: false + return resultingDescriptor.safeAs() ?.let { - it.isSuspend && (!it.isInline || it.isBuiltInSuspendCoroutineOrReturnInJvm() || it.isBuiltInSuspendCoroutineUninterceptedOrReturnInJvm()) + val inline = it.isInline || isCrossinline + it.isSuspend && (!inline || it.isBuiltInSuspendCoroutineOrReturnInJvm() || it.isBuiltInSuspendCoroutineUninterceptedOrReturnInJvm()) } == true +} fun CallableDescriptor.isSuspendFunctionNotSuspensionView(): Boolean { if (this !is FunctionDescriptor) return false