diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 322baa28c48..7dba4fceac3 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -15345,6 +15345,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/ir/kt40083.kt"); } + @TestMetadata("kt41765.kt") + public void testKt41765() throws Exception { + runTest("compiler/testData/codegen/box/ir/kt41765.kt"); + } + @TestMetadata("objectClass.kt") public void testObjectClass() throws Exception { runTest("compiler/testData/codegen/box/ir/objectClass.kt"); diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt index 8e00b628a79..d0c8e83958d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt @@ -6,17 +6,14 @@ package org.jetbrains.kotlin.ir.overrides import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibility +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns -import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor -import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.ir.symbols.* -import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl -import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.util.collectAndFilterRealOverrides import org.jetbrains.kotlin.ir.util.isReal import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo @@ -284,7 +281,11 @@ class IrOverridingUtil( if (!hasOpen && hasAbstract) { return if (transformAbstractToClassModality) current.modality else Modality.ABSTRACT } - return getMinimalModality(members, transformAbstractToClassModality, current.modality) + + val realOverrides = members + .map{ originals[it]!! } + .collectAndFilterRealOverrides() + return getMinimalModality(realOverrides, transformAbstractToClassModality, current.modality) } private fun areEquivalent(a: IrOverridableMember, b: IrOverridableMember) = (a == b) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt index 14d6b005f6f..3e91a6faf67 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt @@ -33,27 +33,47 @@ val IrFunction.target: IrFunction get() = when (this) { fun IrSimpleFunction.collectRealOverrides(toSkip: (IrSimpleFunction) -> Boolean = { false }): Set { if (isReal && !toSkip(this)) return setOf(this) - val visited = mutableSetOf() - val realOverrides = mutableSetOf() + return this.overriddenSymbols + .map { it.owner } + .collectAndFilterRealOverrides { + require(it is IrSimpleFunction) { "Expected IrSimpleFunction: ${it.render()}" } + toSkip(it) + } + .map { it as IrSimpleFunction } + .toSet() +} - fun collectRealOverrides(func: IrSimpleFunction) { - if (!visited.add(func)) return +fun Collection.collectAndFilterRealOverrides(toSkip: (IrOverridableMember) -> Boolean = { false }): Set { - if (func.isReal && !toSkip(func)) { - realOverrides += func + val visited = mutableSetOf() + val realOverrides = mutableSetOf() + + fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) { + is IrSimpleFunction -> declaration.overriddenSymbols + is IrProperty -> (declaration.getter ?: declaration.setter) + ?.overriddenSymbols?.mapNotNull { it.owner.correspondingPropertySymbol } + ?: emptyList() + else -> error("Unexpected overridable member: ${declaration.render()}") + } + + fun collectRealOverrides(member: IrOverridableMember) { + if (!visited.add(member)) return + + if (member.isReal && !toSkip(member)) { + realOverrides += member } else { - func.overriddenSymbols.forEach { collectRealOverrides(it.owner) } + overriddenSymbols(member).forEach { collectRealOverrides(it.owner as IrOverridableMember) } } } - overriddenSymbols.forEach { collectRealOverrides(it.owner) } + this.forEach { collectRealOverrides(it) } - fun excludeRepeated(func: IrSimpleFunction) { - if (!visited.add(func)) return + fun excludeRepeated(member: IrOverridableMember) { + if (!visited.add(member)) return - func.overriddenSymbols.forEach { + overriddenSymbols(member).forEach { realOverrides.remove(it.owner) - excludeRepeated(it.owner) + excludeRepeated(it.owner as IrOverridableMember) } } diff --git a/compiler/testData/codegen/box/ir/kt41765.kt b/compiler/testData/codegen/box/ir/kt41765.kt new file mode 100644 index 00000000000..7ea4e75c1ce --- /dev/null +++ b/compiler/testData/codegen/box/ir/kt41765.kt @@ -0,0 +1,25 @@ +// MODULE: lib +// FILE: lib.kt + +// KT-41765 + +interface X { + override fun toString() :String +} + +interface Y + +abstract class A: Y, X + +// MODULE: main(lib) +// FILE: main.kt + +class B: A() { + override fun toString() = "BBB" +} + +fun box(): String { + if (B().toString() == "BBB") return "OK" + return "FAIL" +} + diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index b5d87cf82da..3c5f1162308 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -16740,6 +16740,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/ir/kt40083.kt"); } + @TestMetadata("kt41765.kt") + public void testKt41765() throws Exception { + runTest("compiler/testData/codegen/box/ir/kt41765.kt"); + } + @TestMetadata("objectClass.kt") public void testObjectClass() throws Exception { runTest("compiler/testData/codegen/box/ir/objectClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index a59a89b7df3..0faec63e919 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -16740,6 +16740,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/ir/kt40083.kt"); } + @TestMetadata("kt41765.kt") + public void testKt41765() throws Exception { + runTest("compiler/testData/codegen/box/ir/kt41765.kt"); + } + @TestMetadata("objectClass.kt") public void testObjectClass() throws Exception { runTest("compiler/testData/codegen/box/ir/objectClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 3acefb95544..e211723ed85 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -15345,6 +15345,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/ir/kt40083.kt"); } + @TestMetadata("kt41765.kt") + public void testKt41765() throws Exception { + runTest("compiler/testData/codegen/box/ir/kt41765.kt"); + } + @TestMetadata("objectClass.kt") public void testObjectClass() throws Exception { runTest("compiler/testData/codegen/box/ir/objectClass.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 74b1dd2feeb..3bcb9a6de01 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -13355,6 +13355,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/ir/kt40083.kt"); } + @TestMetadata("kt41765.kt") + public void testKt41765() throws Exception { + runTest("compiler/testData/codegen/box/ir/kt41765.kt"); + } + @TestMetadata("objectClass.kt") public void testObjectClass() throws Exception { runTest("compiler/testData/codegen/box/ir/objectClass.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 6c673e1ac95..00d03c436a7 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 @@ -13355,6 +13355,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/ir/kt40083.kt"); } + @TestMetadata("kt41765.kt") + public void testKt41765() throws Exception { + runTest("compiler/testData/codegen/box/ir/kt41765.kt"); + } + @TestMetadata("objectClass.kt") public void testObjectClass() throws Exception { runTest("compiler/testData/codegen/box/ir/objectClass.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 58925b3024e..7b7156966ae 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 @@ -13420,6 +13420,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/ir/kt40083.kt"); } + @TestMetadata("kt41765.kt") + public void testKt41765() throws Exception { + runTest("compiler/testData/codegen/box/ir/kt41765.kt"); + } + @TestMetadata("objectClass.kt") public void testObjectClass() throws Exception { runTest("compiler/testData/codegen/box/ir/objectClass.kt");