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 e3365d0f079..8d19d056508 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 @@ -50,10 +50,10 @@ private class InheritedDefaultMethodsOnClassesLowering(val context: JvmBackendCo } override fun lower(declaration: IrClass) { - super.visitClass(declaration) - if (declaration.isJvmInterface) return + if (!declaration.isJvmInterface) + generateInterfaceMethods(declaration) - generateInterfaceMethods(declaration) + super.visitClass(declaration) } private fun generateInterfaceMethods(irClass: IrClass) { @@ -80,13 +80,14 @@ private class InheritedDefaultMethodsOnClassesLowering(val context: JvmBackendCo if (origin != IrDeclarationOrigin.FAKE_OVERRIDE) return null parent.let { if (it is IrClass && it.isJvmInterface) return null } + val implementation = resolveFakeOverride() ?: return null + // Only generate interface delegation for functions immediately inherited from an interface. // (Otherwise, delegation will be present in the parent class) - if (overriddenSymbols.any { !it.owner.parentAsClass.isInterface && it.owner.modality != Modality.ABSTRACT }) { + if (overriddenSymbols.any { !it.owner.parentAsClass.isInterface && it.owner.modality != Modality.ABSTRACT && it.owner.resolveFakeOverride() == implementation }) { return null } - val implementation = resolveFakeOverride() ?: return null if (!implementation.hasInterfaceParent() || Visibilities.isPrivate(implementation.visibility) || implementation.isDefinitelyNotDefaultImplsMethod() diff --git a/compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt b/compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt new file mode 100644 index 00000000000..f5c6f74b578 --- /dev/null +++ b/compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt @@ -0,0 +1,16 @@ +// IGNORE_BACKEND_FIR: JVM_IR + +interface A { + val result: Any get() = "Fail" +} + +interface B : A { + override val result: String get() = "OK" +} + +abstract class AImpl : A + +class BImpl : AImpl(), B + +fun box(): String = + (BImpl() as A).result.toString() diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index a7ffe312568..a174d23914c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -1537,6 +1537,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/bridges/propertyDiamond.kt"); } + @TestMetadata("propertyDiamondFakeOverride.kt") + public void testPropertyDiamondFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt"); + } + @TestMetadata("propertyInConstructor.kt") public void testPropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/bridges/propertyInConstructor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index bd73837a4a4..692b4ed350f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -1537,6 +1537,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/bridges/propertyDiamond.kt"); } + @TestMetadata("propertyDiamondFakeOverride.kt") + public void testPropertyDiamondFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt"); + } + @TestMetadata("propertyInConstructor.kt") public void testPropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/bridges/propertyInConstructor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index cf4af520f83..7f69cdde39f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -1517,6 +1517,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/bridges/propertyDiamond.kt"); } + @TestMetadata("propertyDiamondFakeOverride.kt") + public void testPropertyDiamondFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt"); + } + @TestMetadata("propertyInConstructor.kt") public void testPropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/bridges/propertyInConstructor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index ea1f7477fc2..0c440bfe342 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -1517,6 +1517,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/bridges/propertyDiamond.kt"); } + @TestMetadata("propertyDiamondFakeOverride.kt") + public void testPropertyDiamondFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt"); + } + @TestMetadata("propertyInConstructor.kt") public void testPropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/bridges/propertyInConstructor.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 3a4ae6af46a..209fd04d257 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 @@ -1152,6 +1152,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/bridges/propertyDiamond.kt"); } + @TestMetadata("propertyDiamondFakeOverride.kt") + public void testPropertyDiamondFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt"); + } + @TestMetadata("propertyInConstructor.kt") public void testPropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/bridges/propertyInConstructor.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 3e13287a89e..b4b9f1bb3a7 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 @@ -1152,6 +1152,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/bridges/propertyDiamond.kt"); } + @TestMetadata("propertyDiamondFakeOverride.kt") + public void testPropertyDiamondFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/bridges/propertyDiamondFakeOverride.kt"); + } + @TestMetadata("propertyInConstructor.kt") public void testPropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/bridges/propertyInConstructor.kt");