diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 17bce302afb..e45be44ded4 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -8562,6 +8562,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/fromJava.kt"); } + @Test + @TestMetadata("lambdaParameterUsed.kt") + public void testLambdaParameterUsed() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt"); + } + @Test @TestMetadata("longArgs.kt") public void testLongArgs() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt index bc28565c318..90d6504893c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt @@ -864,7 +864,9 @@ class ControlFlowInformationProvider private constructor( } private fun markImplicitReceiverOfSuspendLambda(instruction: Instruction) { - if (instruction !is MagicInstruction || instruction.kind != MagicKind.IMPLICIT_RECEIVER) return + if (instruction !is MagicInstruction || + (instruction.kind != MagicKind.IMPLICIT_RECEIVER && instruction.kind != MagicKind.UNBOUND_CALLABLE_REFERENCE) + ) return fun CallableDescriptor?.markIfNeeded() { if (this is AnonymousFunctionDescriptor && isSuspend) { @@ -872,31 +874,36 @@ class ControlFlowInformationProvider private constructor( } } - if (instruction.element is KtDestructuringDeclarationEntry || instruction.element is KtCallExpression) { - val visited = mutableSetOf() - fun dfs(insn: Instruction) { - if (!visited.add(insn)) return - if (insn is CallInstruction && insn.element == instruction.element) { - for ((_, receiver) in insn.receiverValues) { - (receiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } + when (val element = instruction.element) { + is KtDestructuringDeclarationEntry, is KtCallExpression -> { + val visited = mutableSetOf() + fun dfs(insn: Instruction) { + if (!visited.add(insn)) return + if (insn is CallInstruction && insn.element == element) { + for ((_, receiver) in insn.receiverValues) { + (receiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } + } + } + for (next in insn.nextInstructions) { + dfs(next) } } - for (next in insn.nextInstructions) { - dfs(next) - } - } - instruction.next?.let { dfs(it) } - } else if (instruction.element is KtNameReferenceExpression || instruction.element is KtBinaryExpression || - instruction.element is KtUnaryExpression - ) { - val call = instruction.element.getResolvedCall(trace.bindingContext) - if (call is VariableAsFunctionResolvedCall) { - (call.variableCall.dispatchReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } - (call.variableCall.extensionReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } + instruction.next?.let { dfs(it) } + } + is KtNameReferenceExpression, is KtBinaryExpression, is KtUnaryExpression -> { + val call = element.getResolvedCall(trace.bindingContext) + if (call is VariableAsFunctionResolvedCall) { + (call.variableCall.dispatchReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } + (call.variableCall.extensionReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } + } + (call?.dispatchReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } + (call?.extensionReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } + } + is KtCallableReferenceExpression -> { + val resolvedCall = element.callableReference.getResolvedCall(trace.bindingContext) + (resolvedCall?.dispatchReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } } - (call?.dispatchReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } - (call?.extensionReceiver as? ExtensionReceiver)?.declarationDescriptor?.apply { markIfNeeded() } } } diff --git a/compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt b/compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt new file mode 100644 index 00000000000..a29fdaff363 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt @@ -0,0 +1,20 @@ +// WITH_RUNTIME +// KJS_WITH_FULL_RUNTIME + +import kotlin.coroutines.* + +fun box(): String = a { (::write)() } + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(Continuation(EmptyCoroutineContext) {}) +} + +fun a(a: suspend Writer.() -> String): String { + var res = "" + builder { res = Writer().a() } + return res +} + +class Writer { + fun write(): String = "OK" +} \ No newline at end of file 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 0961403bd71..de0bf7c0340 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 @@ -8562,6 +8562,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/fromJava.kt"); } + @Test + @TestMetadata("lambdaParameterUsed.kt") + public void testLambdaParameterUsed() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt"); + } + @Test @TestMetadata("longArgs.kt") public void testLongArgs() 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 2c7e979804b..1d4fcac0785 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 @@ -8562,6 +8562,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/fromJava.kt"); } + @Test + @TestMetadata("lambdaParameterUsed.kt") + public void testLambdaParameterUsed() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt"); + } + @Test @TestMetadata("longArgs.kt") public void testLongArgs() 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 e572900f046..8d42b316610 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -7461,6 +7461,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/fromJava.kt"); } + @TestMetadata("lambdaParameterUsed.kt") + public void testLambdaParameterUsed() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt"); + } + @TestMetadata("longArgs.kt") public void testLongArgs() throws Exception { runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/longArgs.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 fb684cfdbdf..0ffa287b7ea 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 @@ -6196,6 +6196,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/bigArity.kt"); } + @TestMetadata("lambdaParameterUsed.kt") + public void testLambdaParameterUsed() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt"); + } + @TestMetadata("longArgs.kt") public void testLongArgs() throws Exception { runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/longArgs.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 3e25c2bbef6..24990b3bda6 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 @@ -6196,6 +6196,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/bigArity.kt"); } + @TestMetadata("lambdaParameterUsed.kt") + public void testLambdaParameterUsed() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt"); + } + @TestMetadata("longArgs.kt") public void testLongArgs() throws Exception { runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/longArgs.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 b44695e942a..b0b919405af 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 @@ -6196,6 +6196,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/bigArity.kt"); } + @TestMetadata("lambdaParameterUsed.kt") + public void testLambdaParameterUsed() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/lambdaParameterUsed.kt"); + } + @TestMetadata("longArgs.kt") public void testLongArgs() throws Exception { runTest("compiler/testData/codegen/box/coroutines/featureIntersection/callableReference/longArgs.kt");