diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index ca0a1ac4cfa..8faf2c7eca4 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -7538,6 +7538,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/contracts/kt45236.kt"); } + @Test + @TestMetadata("kt47168.kt") + public void testKt47168() throws Exception { + runTest("compiler/testData/codegen/box/contracts/kt47168.kt"); + } + @Test @TestMetadata("lambdaParameter.kt") public void testLambdaParameter() throws Exception { diff --git a/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt b/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt index a719f6a369f..47e32c52474 100644 --- a/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt +++ b/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt @@ -1574,19 +1574,18 @@ class ControlFlowProcessor( } } - if (resolvedCall.resultingDescriptor is VariableDescriptor) { + val callInstruction = if (resolvedCall.resultingDescriptor is VariableDescriptor) { // If a callee of the call is just a variable (without 'invoke'), 'read variable' is generated. // todo : process arguments for such a case (KT-5387) val callExpression = callElement as? KtExpression ?: error("Variable-based call without callee expression: " + callElement.text) assert(parameterValues.isEmpty()) { "Variable-based call with non-empty argument list: " + callElement.text } - return builder.readVariable(callExpression, resolvedCall, receivers) + builder.readVariable(callExpression, resolvedCall, receivers) + } else { + mark(resolvedCall.call.callElement) + builder.call(callElement, resolvedCall, receivers, parameterValues) } - - mark(resolvedCall.call.callElement) - val callInstruction = builder.call(callElement, resolvedCall, receivers, parameterValues) - val deferredGeneratorsForCall = deferredGeneratorsStack.pop() - deferredGeneratorsForCall.forEach { it.invoke(builder) } + deferredGeneratorsStack.pop().forEach { it.invoke(builder) } return callInstruction } diff --git a/compiler/testData/codegen/box/contracts/kt47168.kt b/compiler/testData/codegen/box/contracts/kt47168.kt new file mode 100644 index 00000000000..7f50b9057a3 --- /dev/null +++ b/compiler/testData/codegen/box/contracts/kt47168.kt @@ -0,0 +1,16 @@ +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts +// IGNORE_BACKEND: NATIVE +import kotlin.contracts.* + +inline fun foo(x: () -> String, y: () -> String): String { + contract { + callsInPlace(x, InvocationKind.EXACTLY_ONCE) + callsInPlace(y, InvocationKind.EXACTLY_ONCE) + } + return x() + y() +} + +fun box(): String { + val y = { "K" } + return foo({ "O" }, y) +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index a04aabf3fa3..6ff73a672c6 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -7538,6 +7538,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/contracts/kt45236.kt"); } + @Test + @TestMetadata("kt47168.kt") + public void testKt47168() throws Exception { + runTest("compiler/testData/codegen/box/contracts/kt47168.kt"); + } + @Test @TestMetadata("lambdaParameter.kt") public void testLambdaParameter() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 48efad5c2f6..7a79b9a8c48 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -7538,6 +7538,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/contracts/kt45236.kt"); } + @Test + @TestMetadata("kt47168.kt") + public void testKt47168() throws Exception { + runTest("compiler/testData/codegen/box/contracts/kt47168.kt"); + } + @Test @TestMetadata("lambdaParameter.kt") public void testLambdaParameter() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 84be58fe4ad..0331460182d 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -5744,6 +5744,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/contracts/kt45236.kt"); } + @TestMetadata("kt47168.kt") + public void testKt47168() throws Exception { + runTest("compiler/testData/codegen/box/contracts/kt47168.kt"); + } + @TestMetadata("lambdaParameter.kt") public void testLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/contracts/lambdaParameter.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 6aabdad9305..344afa3981e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -5018,6 +5018,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/contracts/kt45236.kt"); } + @TestMetadata("kt47168.kt") + public void testKt47168() throws Exception { + runTest("compiler/testData/codegen/box/contracts/kt47168.kt"); + } + @TestMetadata("lambdaParameter.kt") public void testLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/contracts/lambdaParameter.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 1a00ea47577..96d203a86f7 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -4424,6 +4424,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/contracts/kt45236.kt"); } + @TestMetadata("kt47168.kt") + public void testKt47168() throws Exception { + runTest("compiler/testData/codegen/box/contracts/kt47168.kt"); + } + @TestMetadata("lambdaParameter.kt") public void testLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/contracts/lambdaParameter.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 219482468bf..88bfb463b6d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -4424,6 +4424,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/contracts/kt45236.kt"); } + @TestMetadata("kt47168.kt") + public void testKt47168() throws Exception { + runTest("compiler/testData/codegen/box/contracts/kt47168.kt"); + } + @TestMetadata("lambdaParameter.kt") public void testLambdaParameter() throws Exception { runTest("compiler/testData/codegen/box/contracts/lambdaParameter.kt");