From 15ff74209ccc2225343667dea127ab1083826c52 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 6 Feb 2020 16:46:49 +0100 Subject: [PATCH] JVM IR: do not resolve fake override in InterfaceSuperCallsLowering This leads to problems after 4dd794c2d2, because the immediate super function's DefaultImpls and the implementation's DefaultImpls have differing type parameters. Looks like resolveFakeOverride was used here (maybe unintentionally) as a workaround to the problem caused by the incorrect origin check in isDefinitelyNotDefaultImplsMethod. --- .../InheritedDefaultMethodsOnClassesLowering.kt | 11 ++++------- ...lToNonGenericImplThroughGenericDefaultImpls.kt | 15 +++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 8 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/codegen/box/super/superCallToNonGenericImplThroughGenericDefaultImpls.kt 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");