IR: handle conflicts in resolveFakeOverride()
This commit is contained in:
@@ -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<IrClass>()?.isInterface != true } ?: realOverrides.singleOrNull()
|
||||
}
|
||||
}
|
||||
|
||||
fun IrSimpleFunction.isOrOverridesSynthesized(): Boolean {
|
||||
|
||||
@@ -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()
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user