From 24105139ea73687232aa097085e228d1f4d677fa Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Tue, 15 Mar 2022 17:57:53 +0800 Subject: [PATCH] Handle methods descriptor clash in data class 1. Extension functions declared in data classes are generated earlier by `generateMembersDeclaredInClassBody` 2. Extension functions fake override from parent class are generated earlier by `generateFakeOverrideMemberDeclarations` So it is safe to filter out extension functions inside `generateAdditionalMembersForDataClass` #KT-49715 #KT-51798 --- .../kotlin/backend/common/CodegenUtil.kt | 3 +- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../codegen/box/dataClasses/kt49715.kt | 22 ++++++++++++ .../codegen/box/dataClasses/kt49715.txt | 35 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../js/test/JsCodegenBoxTestGenerated.java | 6 ++++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++++ .../IrCodegenBoxWasmTestGenerated.java | 5 +++ .../NativeCodegenBoxTestGenerated.java | 6 ++++ 11 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/dataClasses/kt49715.kt create mode 100644 compiler/testData/codegen/box/dataClasses/kt49715.txt diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt index 60e5320dee0..0d2b8992b89 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt @@ -141,7 +141,8 @@ object CodegenUtil { function.modality != Modality.FINAL && areParametersOk(function.valueParameters) && function.returnType != null && - isReturnTypeOk(function.returnType!!) + isReturnTypeOk(function.returnType!!) && + function.extensionReceiverParameter == null } 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 e7b2f5fd503..d55627b1eae 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 @@ -13137,6 +13137,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/dataClasses/genericParam.kt"); } + @Test + @TestMetadata("kt49715.kt") + public void testKt49715() throws Exception { + runTest("compiler/testData/codegen/box/dataClasses/kt49715.kt"); + } + @Test @TestMetadata("kt5002.kt") public void testKt5002() throws Exception { diff --git a/compiler/testData/codegen/box/dataClasses/kt49715.kt b/compiler/testData/codegen/box/dataClasses/kt49715.kt new file mode 100644 index 00000000000..9f2bf6f9ad7 --- /dev/null +++ b/compiler/testData/codegen/box/dataClasses/kt49715.kt @@ -0,0 +1,22 @@ +// IGNORE_BACKEND_FIR: JVM_IR +// FIR status: [IR VALIDATION] Duplicate IR node: FUN GENERATED_DATA_CLASS_MEMBER name:toString +// CHECK_BYTECODE_LISTING +// WITH_STDLIB + +import kotlin.test.* + +interface A { + fun Any.toString(): String = "hello" +} + +data class B(val x: Int) : A { + fun Any.hi() = "hi" +} + +fun box(): String { + val b = B(1) + assertEquals("B(x=1)", b.toString()) + assertTrue(b == B(1)) + assertTrue(1.hashCode() == b.hashCode()) + return "OK" +} diff --git a/compiler/testData/codegen/box/dataClasses/kt49715.txt b/compiler/testData/codegen/box/dataClasses/kt49715.txt new file mode 100644 index 00000000000..fc254dc34df --- /dev/null +++ b/compiler/testData/codegen/box/dataClasses/kt49715.txt @@ -0,0 +1,35 @@ +@kotlin.Metadata +public final class A$DefaultImpls { + // source: 'kt49715.kt' + public static @org.jetbrains.annotations.NotNull method toString(@org.jetbrains.annotations.NotNull p0: A, @org.jetbrains.annotations.NotNull p1: java.lang.Object): java.lang.String + public final inner class A$DefaultImpls +} + +@kotlin.Metadata +public interface A { + // source: 'kt49715.kt' + public abstract @org.jetbrains.annotations.NotNull method toString(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.String + public final inner class A$DefaultImpls +} + +@kotlin.Metadata +public final class B { + // source: 'kt49715.kt' + private final field x: int + public method (p0: int): void + public final method component1(): int + public synthetic static method copy$default(p0: B, p1: int, p2: int, p3: java.lang.Object): B + public final @org.jetbrains.annotations.NotNull method copy(p0: int): B + public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean + public final method getX(): int + public method hashCode(): int + public final @org.jetbrains.annotations.NotNull method hi(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.String + public @org.jetbrains.annotations.NotNull method toString(): java.lang.String + public @org.jetbrains.annotations.NotNull method toString(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.String +} + +@kotlin.Metadata +public final class Kt49715Kt { + // source: 'kt49715.kt' + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} 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 566bb8a1eef..70034788a88 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 @@ -13011,6 +13011,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/dataClasses/genericParam.kt"); } + @Test + @TestMetadata("kt49715.kt") + public void testKt49715() throws Exception { + runTest("compiler/testData/codegen/box/dataClasses/kt49715.kt"); + } + @Test @TestMetadata("kt5002.kt") public void testKt5002() 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 f2fc91d9dce..3f1991f4c6f 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 @@ -13137,6 +13137,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/dataClasses/genericParam.kt"); } + @Test + @TestMetadata("kt49715.kt") + public void testKt49715() throws Exception { + runTest("compiler/testData/codegen/box/dataClasses/kt49715.kt"); + } + @Test @TestMetadata("kt5002.kt") public void testKt5002() 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 514dbede35e..933e3994b4d 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10537,6 +10537,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/dataClasses/genericParam.kt"); } + @TestMetadata("kt49715.kt") + public void testKt49715() throws Exception { + runTest("compiler/testData/codegen/box/dataClasses/kt49715.kt"); + } + @TestMetadata("kt5002.kt") public void testKt5002() throws Exception { runTest("compiler/testData/codegen/box/dataClasses/kt5002.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index 1a4f9418c69..828c8bd77ef 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -9725,6 +9725,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/dataClasses/genericParam.kt"); } + @Test + @TestMetadata("kt49715.kt") + public void testKt49715() throws Exception { + runTest("compiler/testData/codegen/box/dataClasses/kt49715.kt"); + } + @Test @TestMetadata("mixedParams.kt") public void testMixedParams() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index d273b6e9beb..28b28f76505 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -9767,6 +9767,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/dataClasses/genericParam.kt"); } + @Test + @TestMetadata("kt49715.kt") + public void testKt49715() throws Exception { + runTest("compiler/testData/codegen/box/dataClasses/kt49715.kt"); + } + @Test @TestMetadata("mixedParams.kt") public void testMixedParams() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 356fc313349..234493f9bfb 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -8549,6 +8549,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/dataClasses/genericParam.kt"); } + @TestMetadata("kt49715.kt") + public void testKt49715() throws Exception { + runTest("compiler/testData/codegen/box/dataClasses/kt49715.kt"); + } + @TestMetadata("mixedParams.kt") public void testMixedParams() throws Exception { runTest("compiler/testData/codegen/box/dataClasses/mixedParams.kt"); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index d83be705a19..2eb34ffbe98 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -10681,6 +10681,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/dataClasses/genericParam.kt"); } + @Test + @TestMetadata("kt49715.kt") + public void testKt49715() throws Exception { + runTest("compiler/testData/codegen/box/dataClasses/kt49715.kt"); + } + @Test @TestMetadata("mixedParams.kt") public void testMixedParams() throws Exception {