From 79060e7f40d89c009294652cadf7ded4402add87 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 12 Feb 2020 18:37:09 +0300 Subject: [PATCH] IR: handle conflicts in resolveFakeOverride() --- .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 7 ++++++- .../box/traits/multipleImplFromJava.kt | 20 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ 6 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/traits/multipleImplFromJava.kt diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index abf4b22e0d9..471cb17ba84 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -296,7 +296,12 @@ fun IrSimpleFunction.collectRealOverrides(toSkip: (IrSimpleFunction) -> Boolean // This implementation is from kotlin-native // TODO: use this implementation instead of any other fun IrSimpleFunction.resolveFakeOverride(toSkip: (IrSimpleFunction) -> Boolean = { false }): IrSimpleFunction? { - return collectRealOverrides(toSkip).singleOrNull { it.modality != Modality.ABSTRACT } + return collectRealOverrides(toSkip) + .filter { it.modality != Modality.ABSTRACT } + .let { realOverrides -> + // Kotlin forbids conflicts between overrides, but they may trickle down from Java. + realOverrides.singleOrNull { it.parent.safeAs()?.isInterface != true } ?: realOverrides.singleOrNull() + } } fun IrSimpleFunction.isOrOverridesSynthesized(): Boolean { diff --git a/compiler/testData/codegen/box/traits/multipleImplFromJava.kt b/compiler/testData/codegen/box/traits/multipleImplFromJava.kt new file mode 100644 index 00000000000..748dceeecb8 --- /dev/null +++ b/compiler/testData/codegen/box/traits/multipleImplFromJava.kt @@ -0,0 +1,20 @@ +// TARGET_BACKEND: JVM +// SKIP_JDK6 +// FILE: I.java +interface I { + default String ifun() { return "fail"; } +} + +// FILE: Z.java +public class Z { + public String ifun() { return "OK"; } +} + +// FILE: Zz.java +public class Zz extends Z implements I {} + +// FILE: multipleImplFromJava.kt + +class Cc : Zz() + +fun box(): String = Zz().ifun() diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index f27ed97c869..33ee6b34a9b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -28157,6 +28157,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/traits/multiple.kt"); } + @TestMetadata("multipleImplFromJava.kt") + public void testMultipleImplFromJava() throws Exception { + runTest("compiler/testData/codegen/box/traits/multipleImplFromJava.kt"); + } + @TestMetadata("noPrivateDelegation.kt") public void testNoPrivateDelegation() throws Exception { runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 94e8ffa336c..2ef6509333b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -26974,6 +26974,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/traits/multiple.kt"); } + @TestMetadata("multipleImplFromJava.kt") + public void testMultipleImplFromJava() throws Exception { + runTest("compiler/testData/codegen/box/traits/multipleImplFromJava.kt"); + } + @TestMetadata("noPrivateDelegation.kt") public void testNoPrivateDelegation() throws Exception { runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 71ab01c75f5..74226fab5bb 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -26661,6 +26661,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/traits/multiple.kt"); } + @TestMetadata("multipleImplFromJava.kt") + public void testMultipleImplFromJava() throws Exception { + runTest("compiler/testData/codegen/box/traits/multipleImplFromJava.kt"); + } + @TestMetadata("noPrivateDelegation.kt") public void testNoPrivateDelegation() throws Exception { runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 9ceaeacb58a..3350f53f768 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -26661,6 +26661,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/traits/multiple.kt"); } + @TestMetadata("multipleImplFromJava.kt") + public void testMultipleImplFromJava() throws Exception { + runTest("compiler/testData/codegen/box/traits/multipleImplFromJava.kt"); + } + @TestMetadata("noPrivateDelegation.kt") public void testNoPrivateDelegation() throws Exception { runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");