diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt index 6629fa2f492..5e9c8f4d85d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt @@ -126,11 +126,8 @@ private class InterfaceSuperCallsLowering(val context: JvmBackendContext) : IrEl return super.visitCall(expression) } - // TODO: This is too eagerly resolving the fake override statically. It - // should cf the old backend call precisely .foo, not - // resolve foo to its implementation. - val superCallee = (expression.symbol.owner as IrSimpleFunction).resolveFakeOverride()!! - if (superCallee.isDefinitelyNotDefaultImplsMethod() || superCallee.hasJvmDefault()) return super.visitCall(expression) + val superCallee = expression.symbol.owner as IrSimpleFunction + if (superCallee.isDefinitelyNotDefaultImplsMethod()) return super.visitCall(expression) val redirectTarget = context.declarationFactory.getDefaultImplsFunction(superCallee) val newCall = createDelegatingCallWithPlaceholderTypeArguments(expression, redirectTarget, context.irBuiltIns) @@ -174,9 +171,10 @@ private class InterfaceDefaultCallsLowering(val context: JvmBackendContext) : Ir } private fun IrSimpleFunction.isDefinitelyNotDefaultImplsMethod() = - resolveFakeOverride()?.let { origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB } == true || + resolveFakeOverride()?.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB || origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER || hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME) || + hasJvmDefault() || (name.asString() == "clone" && parent.safeAs()?.fqNameWhenAvailable?.asString() == "kotlin.Cloneable" && valueParameters.isEmpty()) @@ -237,7 +235,6 @@ internal fun IrSimpleFunction.findInterfaceImplementation(): IrSimpleFunction? { || Visibilities.isPrivate(implementation.visibility) || implementation.isDefinitelyNotDefaultImplsMethod() || implementation.isMethodOfAny() - || implementation.hasJvmDefault() ) { return null } diff --git a/compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt b/compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt new file mode 100644 index 00000000000..be04a2f36a7 --- /dev/null +++ b/compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt @@ -0,0 +1,15 @@ +// IGNORE_BACKEND_FIR: JVM_IR + +interface A { + fun foo(o: String): String = o + "K" +} + +interface B : A + +class C : B { + override fun foo(o: String): String { + return super.foo(o) + } +} + +fun box(): String = C().foo("O") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index ee1b364e5d5..27a6e5d879c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -27638,6 +27638,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt"); } + @TestMetadata("superCallToNonGenericImplThroughGenericDefaultImpls.kt") + public void testSuperCallToNonGenericImplThroughGenericDefaultImpls() throws Exception { + runTest("compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt"); + } + @TestMetadata("traitproperty.kt") public void testTraitproperty() throws Exception { runTest("compiler/testData/codegen/box/super/traitproperty.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f56c8086333..9880966039e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -26455,6 +26455,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt"); } + @TestMetadata("superCallToNonGenericImplThroughGenericDefaultImpls.kt") + public void testSuperCallToNonGenericImplThroughGenericDefaultImpls() throws Exception { + runTest("compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt"); + } + @TestMetadata("traitproperty.kt") public void testTraitproperty() throws Exception { runTest("compiler/testData/codegen/box/super/traitproperty.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 7746e5026a3..6c60e4ea8f8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -26142,6 +26142,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt"); } + @TestMetadata("superCallToNonGenericImplThroughGenericDefaultImpls.kt") + public void testSuperCallToNonGenericImplThroughGenericDefaultImpls() throws Exception { + runTest("compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt"); + } + @TestMetadata("traitproperty.kt") public void testTraitproperty() throws Exception { runTest("compiler/testData/codegen/box/super/traitproperty.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 3f0491c63a4..b75f50376f0 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -26142,6 +26142,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt"); } + @TestMetadata("superCallToNonGenericImplThroughGenericDefaultImpls.kt") + public void testSuperCallToNonGenericImplThroughGenericDefaultImpls() throws Exception { + runTest("compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt"); + } + @TestMetadata("traitproperty.kt") public void testTraitproperty() throws Exception { runTest("compiler/testData/codegen/box/super/traitproperty.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 4e3fde3e8ea..1109f19b8a3 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -21288,6 +21288,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt"); } + @TestMetadata("superCallToNonGenericImplThroughGenericDefaultImpls.kt") + public void testSuperCallToNonGenericImplThroughGenericDefaultImpls() throws Exception { + runTest("compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt"); + } + @TestMetadata("traitproperty.kt") public void testTraitproperty() throws Exception { runTest("compiler/testData/codegen/box/super/traitproperty.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index cf038f9755c..5252e8a073e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -21348,6 +21348,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt"); } + @TestMetadata("superCallToNonGenericImplThroughGenericDefaultImpls.kt") + public void testSuperCallToNonGenericImplThroughGenericDefaultImpls() throws Exception { + runTest("compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt"); + } + @TestMetadata("traitproperty.kt") public void testTraitproperty() throws Exception { runTest("compiler/testData/codegen/box/super/traitproperty.kt");