From faae5f9b38562ebe16ec65ea661cabe6efb0fe14 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Wed, 4 Oct 2023 11:16:10 +0200 Subject: [PATCH] [IR] Fix annotation arguments comparison when expression is `expect` enum ...actualized via typealias. This caused false-positive report of `ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE`. In such case it's incorrect to compare signatures, because classes have different `ClassId`s. Instead, classes could be compared using `areCompatibleExpectActualTypes` which actualizes both types, and then enum value names compared. ^KT-62104 ^KT-59940 --- ...DiagnosticsWithLightTreeTestGenerated.java | 6 +++++ ...endMPPDiagnosticsWithPsiTestGenerated.java | 6 +++++ .../irConstExpressionValuesEqualityChecker.kt | 3 ++- ...ionsViaActualTypeAliasExpectEnumArg.fir.kt | 27 +++++++++++++++++++ ...otationsViaActualTypeAliasExpectEnumArg.kt | 27 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ 6 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.fir.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java index b8f3a4e6973..e5999f26b9d 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java @@ -1024,6 +1024,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt"); } + @Test + @TestMetadata("annotationsViaActualTypeAliasExpectEnumArg.kt") + public void testAnnotationsViaActualTypeAliasExpectEnumArg() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt"); + } + @Test @TestMetadata("companionMethodViaActualTypealias.kt") public void testCompanionMethodViaActualTypealias() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java index 608efc4b51f..5989e20ac71 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java @@ -1024,6 +1024,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt"); } + @Test + @TestMetadata("annotationsViaActualTypeAliasExpectEnumArg.kt") + public void testAnnotationsViaActualTypeAliasExpectEnumArg() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt"); + } + @Test @TestMetadata("companionMethodViaActualTypealias.kt") public void testCompanionMethodViaActualTypealias() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/irConstExpressionValuesEqualityChecker.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/irConstExpressionValuesEqualityChecker.kt index c28c6ed504c..afb54dc5924 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/irConstExpressionValuesEqualityChecker.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/checker/irConstExpressionValuesEqualityChecker.kt @@ -28,7 +28,8 @@ internal fun IrExpectActualMatchingContext.areIrExpressionConstValuesEqual( getClassIdAfterActualization(classId) } - a is IrGetEnumValue && b is IrGetEnumValue -> equalBy(a, b) { it.symbol.signature?.toString() } + a is IrGetEnumValue && b is IrGetEnumValue -> + areCompatibleExpectActualTypes(a.type, b.type) && equalBy(a, b) { it.symbol.owner.name } a is IrVararg && b is IrVararg -> { collectionArgumentsCompatibilityCheckStrategy.areCompatible(a.elements, b.elements) { f, s -> diff --git a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.fir.kt new file mode 100644 index 00000000000..50a41ee878f --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.fir.kt @@ -0,0 +1,27 @@ +// MODULE: m1-common +// FILE: common.kt +expect enum class E { + FOO, BAR +} + +expect annotation class Matching(val e: E = E.FOO) + +expect annotation class NonMatching(val e: E = E.BAR) + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt +actual typealias E = EJava +actual typealias Matching = AJava +actual typealias NonMatching = AJava + +// FILE: EJava.java +public enum EJava { + FOO, BAR; + + EJava() {} +} + +// FILE: AJava.java +public @interface AJava { + EJava e() default EJava.FOO; +} diff --git a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt new file mode 100644 index 00000000000..811decd5006 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt @@ -0,0 +1,27 @@ +// MODULE: m1-common +// FILE: common.kt +expect enum class E { + FOO, BAR +} + +expect annotation class Matching(val e: E = E.FOO) + +expect annotation class NonMatching(val e: E = E.BAR) + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt +actual typealias E = EJava +actual typealias Matching = AJava +actual typealias NonMatching = AJava + +// FILE: EJava.java +public enum EJava { + FOO, BAR; + + EJava() {} +} + +// FILE: AJava.java +public @interface AJava { + EJava e() default EJava.FOO; +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 6953bec6b30..48ad8aa9ce5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -24061,6 +24061,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt"); } + @Test + @TestMetadata("annotationsViaActualTypeAliasExpectEnumArg.kt") + public void testAnnotationsViaActualTypeAliasExpectEnumArg() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt"); + } + @Test @TestMetadata("companionMethodViaActualTypealias.kt") public void testCompanionMethodViaActualTypealias() throws Exception {