From 09da67767eee323665efa01c9c624c24f05db719 Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Wed, 24 Nov 2021 15:07:33 +0100 Subject: [PATCH] [JVM_IR] Fix mangling of inline class inherited interface methods. ^KT-49864 Fixed --- .../codegen/FirBlackBoxCodegenTestGenerated.java | 12 ++++++++++++ .../backend/jvm/MemoizedInlineClassReplacements.kt | 5 ++--- .../inlineClassInheritingDefaultMethod.kt | 10 ++++++++++ .../inlineClassInheritingDefaultMethodAll.kt | 11 +++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 12 ++++++++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 12 ++++++++++++ .../codegen/LightAnalysisModeTestGenerated.java | 10 ++++++++++ .../blackboxtest/NativeExtBlackBoxTestGenerated.java | 12 ++++++++++++ 8 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt create mode 100644 compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index a4fdc5c448a..10d99f1d20b 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -21219,6 +21219,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("inlineClassInheritingDefaultMethod.kt") + public void testInlineClassInheritingDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt"); + } + + @Test + @TestMetadata("inlineClassInheritingDefaultMethodAll.kt") + public void testInlineClassInheritingDefaultMethodAll() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt"); + } + @Test @TestMetadata("javaDefaultMethod.kt") public void testJavaDefaultMethod() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt index a9051951bf4..4c0fbdc7ef3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt @@ -72,9 +72,8 @@ class MemoizedInlineClassReplacements( when { it.isRemoveAtSpecialBuiltinStub() -> null - it.isInlineClassMemberFakeOverriddenFromJvmDefaultInterfaceMethod() -> - null - it.origin == IrDeclarationOrigin.IR_BUILTINS_STUB -> + it.isInlineClassMemberFakeOverriddenFromJvmDefaultInterfaceMethod() || + it.origin == IrDeclarationOrigin.IR_BUILTINS_STUB -> createMethodReplacement(it) else -> createStaticReplacement(it) diff --git a/compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt b/compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt new file mode 100644 index 00000000000..7a043fa7331 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt @@ -0,0 +1,10 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 + +interface I { + fun foo(): A = A("OK") +} + +inline class A(val x: String): I { } + +fun box() = A("").foo().x diff --git a/compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt b/compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt new file mode 100644 index 00000000000..2d5215e0c7e --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt @@ -0,0 +1,11 @@ +// !JVM_DEFAULT_MODE: all +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 + +interface I { + fun foo(): A = A("OK") +} + +inline class A(val x: String): I { } + +fun box() = A("").foo().x diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 8ec267cae2a..83ac0291bdb 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -21057,6 +21057,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } + @Test + @TestMetadata("inlineClassInheritingDefaultMethod.kt") + public void testInlineClassInheritingDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt"); + } + + @Test + @TestMetadata("inlineClassInheritingDefaultMethodAll.kt") + public void testInlineClassInheritingDefaultMethodAll() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt"); + } + @Test @TestMetadata("javaDefaultMethod.kt") public void testJavaDefaultMethod() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 2f95c95b414..761424ba6ee 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -21219,6 +21219,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("inlineClassInheritingDefaultMethod.kt") + public void testInlineClassInheritingDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt"); + } + + @Test + @TestMetadata("inlineClassInheritingDefaultMethodAll.kt") + public void testInlineClassInheritingDefaultMethodAll() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt"); + } + @Test @TestMetadata("javaDefaultMethod.kt") public void testJavaDefaultMethod() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index b05176d2686..8868a3ee78f 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -17550,6 +17550,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } + @TestMetadata("inlineClassInheritingDefaultMethod.kt") + public void testInlineClassInheritingDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt"); + } + + @TestMetadata("inlineClassInheritingDefaultMethodAll.kt") + public void testInlineClassInheritingDefaultMethodAll() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt"); + } + @TestMetadata("javaDefaultMethod.kt") public void testJavaDefaultMethod() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/javaDefaultMethod.kt"); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java index 8a7aa527d2d..50be559e5e7 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java @@ -21440,6 +21440,18 @@ public class NativeExtBlackBoxTestGenerated extends AbstractNativeBlackBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("inlineClassInheritingDefaultMethod.kt") + public void testInlineClassInheritingDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethod.kt"); + } + + @Test + @TestMetadata("inlineClassInheritingDefaultMethodAll.kt") + public void testInlineClassInheritingDefaultMethodAll() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvm8DefaultInterfaceMethods/inlineClassInheritingDefaultMethodAll.kt"); + } + @Test @TestMetadata("javaDefaultMethod.kt") public void testJavaDefaultMethod() throws Exception {