diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index a3ad4829eab..e8e784a834f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -12194,6 +12194,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); } + @TestMetadata("noOptimizedCallableReferences.kt") + public void testNoOptimizedCallableReferences() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt"); + } + @TestMetadata("nonAbstractMethod.kt") public void testNonAbstractMethod() throws Exception { runTest("compiler/testData/codegen/box/funInterface/nonAbstractMethod.kt"); diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index 63a4d1bf247..9ca3ff6074c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -245,7 +245,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) if (!useOptimizedSuperClass) { // This is the case of a fun interface wrapper over a (maybe adapted) function reference, - // with `-Xno-optimized-callable-referenced` enabled. We can't use constructors of FunctionReferenceImpl, + // with `-Xno-optimized-callable-references` enabled. We can't use constructors of FunctionReferenceImpl, // so we'd need to basically generate a full class for a reference inheriting from FunctionReference, // effectively disabling the optimization of fun interface wrappers over references. // This scenario is probably not very popular because it involves using equals/hashCode on function references @@ -254,8 +254,11 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) // TODO: generate getFunctionDelegate, equals and hashCode properly in this case functionReferenceClass.addFunction("equals", backendContext.irBuiltIns.booleanType, Modality.ABSTRACT).apply { addValueParameter("other", backendContext.irBuiltIns.anyNType) + overriddenSymbols = listOf(functionSuperClass.functions.single { isEqualsFromAny(it.owner) }) + } + functionReferenceClass.addFunction("hashCode", backendContext.irBuiltIns.intType, Modality.ABSTRACT).apply { + overriddenSymbols = listOf(functionSuperClass.functions.single { isHashCodeFromAny(it.owner) }) } - functionReferenceClass.addFunction("hashCode", backendContext.irBuiltIns.intType, Modality.ABSTRACT) return } @@ -274,6 +277,13 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) }.generate() } + private fun isEqualsFromAny(f: IrSimpleFunction): Boolean = + f.name.asString() == "equals" && f.extensionReceiverParameter == null && + f.valueParameters.singleOrNull()?.type?.isNullableAny() == true + + private fun isHashCodeFromAny(f: IrSimpleFunction): Boolean = + f.name.asString() == "hashCode" && f.extensionReceiverParameter == null && f.valueParameters.isEmpty() + private fun createConstructor(): IrConstructor = functionReferenceClass.addConstructor { origin = JvmLoweredDeclarationOrigin.GENERATED_MEMBER_IN_CALLABLE_REFERENCE diff --git a/compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt b/compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt new file mode 100644 index 00000000000..e68d85f0124 --- /dev/null +++ b/compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt @@ -0,0 +1,11 @@ +// KOTLIN_CONFIGURATION_FLAGS: +JVM.NO_OPTIMIZED_CALLABLE_REFERENCES + +fun interface P { + fun get(): String +} + +class G(val p: P) + +fun f(): String = "OK" + +fun box(): String = G(::f).p.get() diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index b8f21d40e9c..badd8b6490c 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13594,6 +13594,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); } + @TestMetadata("noOptimizedCallableReferences.kt") + public void testNoOptimizedCallableReferences() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt"); + } + @TestMetadata("nonAbstractMethod.kt") public void testNonAbstractMethod() throws Exception { runTest("compiler/testData/codegen/box/funInterface/nonAbstractMethod.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 9a01f7b60b2..1dd9aaaecad 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13594,6 +13594,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); } + @TestMetadata("noOptimizedCallableReferences.kt") + public void testNoOptimizedCallableReferences() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt"); + } + @TestMetadata("nonAbstractMethod.kt") public void testNonAbstractMethod() throws Exception { runTest("compiler/testData/codegen/box/funInterface/nonAbstractMethod.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index b131d788a67..a0604634d0d 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12194,6 +12194,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); } + @TestMetadata("noOptimizedCallableReferences.kt") + public void testNoOptimizedCallableReferences() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt"); + } + @TestMetadata("nonAbstractMethod.kt") public void testNonAbstractMethod() throws Exception { runTest("compiler/testData/codegen/box/funInterface/nonAbstractMethod.kt"); diff --git a/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 07e72051ebe..e506471fd8d 100644 --- a/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -10434,6 +10434,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); } + @TestMetadata("noOptimizedCallableReferences.kt") + public void testNoOptimizedCallableReferences() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt"); + } + @TestMetadata("nonAbstractMethod.kt") public void testNonAbstractMethod() throws Exception { runTest("compiler/testData/codegen/box/funInterface/nonAbstractMethod.kt"); diff --git a/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 96c6229aec8..769144f048c 100644 --- a/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -10434,6 +10434,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); } + @TestMetadata("noOptimizedCallableReferences.kt") + public void testNoOptimizedCallableReferences() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt"); + } + @TestMetadata("nonAbstractMethod.kt") public void testNonAbstractMethod() throws Exception { runTest("compiler/testData/codegen/box/funInterface/nonAbstractMethod.kt"); diff --git a/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 77ac1fe9313..1d5724cd6ad 100644 --- a/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -10434,6 +10434,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/funInterface/multimodule.kt"); } + @TestMetadata("noOptimizedCallableReferences.kt") + public void testNoOptimizedCallableReferences() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt"); + } + @TestMetadata("nonAbstractMethod.kt") public void testNonAbstractMethod() throws Exception { runTest("compiler/testData/codegen/box/funInterface/nonAbstractMethod.kt"); diff --git a/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 86efc618ee6..c4bbcb442e3 100644 --- a/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/test-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -5214,6 +5214,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/funInterface/funConversionInVararg.kt"); } + @TestMetadata("noOptimizedCallableReferences.kt") + public void testNoOptimizedCallableReferences() throws Exception { + runTest("compiler/testData/codegen/box/funInterface/noOptimizedCallableReferences.kt"); + } + @TestMetadata("partialSam.kt") public void testPartialSam() throws Exception { runTest("compiler/testData/codegen/box/funInterface/partialSam.kt");