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 5adce461a90..70428d3df36 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 @@ -15686,6 +15686,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/funInterface/kt45444_privateFunInterface.kt"); } + @Test + @TestMetadata("kt46512_indyFunInterfaceOverCallableReference.kt") + public void testKt46512_indyFunInterfaceOverCallableReference() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt"); + } + @Test @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/indy/SamDelegatingLambdaBlock.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/indy/SamDelegatingLambdaBlock.kt index b279f393a07..fafec3bba1b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/indy/SamDelegatingLambdaBlock.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/indy/SamDelegatingLambdaBlock.kt @@ -167,7 +167,13 @@ internal class SamDelegatingLambdaBuilder(private val jvmContext: JvmBackendCont .irBlockBody { +irReturn( irCall(invokeFunction).also { invokeCall -> - invokeCall.dispatchReceiver = irGet(tmp) + // We need to cast receiver to the function type because it might have an imaginary type like KFunction2 which + // is mapped to KFunction in the codegen by default, which has no 'invoke'. Looks like correct type arguments + // are not needed here, so we use "raw" type for simplicity. If that stops working, we'll need to compute the + // correct substitution of invocableFunctionClass by visiting tmp.type's hierarchy. + val rawFunctionType = invocableFunctionClass.typeWith() + + invokeCall.dispatchReceiver = irImplicitCast(irGet(tmp), rawFunctionType) var parameterIndex = 0 invokeFunction.extensionReceiverParameter?.let { invokeCall.extensionReceiver = irGet(lambda.valueParameters[parameterIndex++]) diff --git a/compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt b/compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt new file mode 100644 index 00000000000..cebc730b293 --- /dev/null +++ b/compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt @@ -0,0 +1,11 @@ +// WITH_RUNTIME +// IGNORE_BACKEND: WASM + +class C : Comparable { + override fun compareTo(other: C): Int = 0 +} + +fun box(): String { + val comparator = Comparable::compareTo + return if (nullsFirst(comparator).compare(C(), C()) == 0) "OK" else "Fail" +} 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 2c2d356e71b..18938071c74 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 @@ -15662,6 +15662,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/funInterface/kt45444_privateFunInterface.kt"); } + @Test + @TestMetadata("kt46512_indyFunInterfaceOverCallableReference.kt") + public void testKt46512_indyFunInterfaceOverCallableReference() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt"); + } + @Test @TestMetadata("multimodule.kt") public void testMultimodule() 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 47613ad3a32..79eb6a400ce 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 @@ -15686,6 +15686,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/funInterface/kt45444_privateFunInterface.kt"); } + @Test + @TestMetadata("kt46512_indyFunInterfaceOverCallableReference.kt") + public void testKt46512_indyFunInterfaceOverCallableReference() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt"); + } + @Test @TestMetadata("multimodule.kt") public void testMultimodule() 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 85575d4b057..940d1401cc6 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12911,6 +12911,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/funInterface/kt44827_funInterface.kt"); } + @TestMetadata("kt46512_indyFunInterfaceOverCallableReference.kt") + public void testKt46512_indyFunInterfaceOverCallableReference() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.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 75cafc2bca3..81e5e02366a 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 @@ -11400,6 +11400,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/funInterface/kt45444_privateFunInterface.kt"); } + @TestMetadata("kt46512_indyFunInterfaceOverCallableReference.kt") + public void testKt46512_indyFunInterfaceOverCallableReference() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.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 50c0b8d57a9..11ad13d4901 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 @@ -10811,6 +10811,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/funInterface/kt45444_privateFunInterface.kt"); } + @TestMetadata("kt46512_indyFunInterfaceOverCallableReference.kt") + public void testKt46512_indyFunInterfaceOverCallableReference() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.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 84c89001a76..d1ba779e0d1 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 @@ -10811,6 +10811,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/funInterface/kt45444_privateFunInterface.kt"); } + @TestMetadata("kt46512_indyFunInterfaceOverCallableReference.kt") + public void testKt46512_indyFunInterfaceOverCallableReference() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt"); + } + @TestMetadata("multimodule.kt") public void testMultimodule() throws Exception { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 39aa1d9e85a..f9e2a48e616 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -5431,6 +5431,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt"); } + @TestMetadata("kt46512_indyFunInterfaceOverCallableReference.kt") + public void testKt46512_indyFunInterfaceOverCallableReference() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/kt46512_indyFunInterfaceOverCallableReference.kt"); + } + @TestMetadata("compiler/testData/codegen/box/funInterface/equality") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)