diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index a14617a1ec5..21543155713 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -26103,6 +26103,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/hmpp"), Pattern.compile("^(.+)\\.(kt|kts)$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("ambiguousActuals.kt") + public void testAmbiguousActuals() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 6abecf5fad7..0401375242a 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -26103,6 +26103,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/hmpp"), Pattern.compile("^(.+)\\.(kt|kts)$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("ambiguousActuals.kt") + public void testAmbiguousActuals() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() throws Exception { 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 538e51d6db7..0e304792c2b 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 @@ -1800,6 +1800,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/hmpp"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("ambiguousActuals.kt") + public void testAmbiguousActuals() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() 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 055cd3f969c..2d2b6fa8a7e 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 @@ -1800,6 +1800,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/hmpp"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("ambiguousActuals.kt") + public void testAmbiguousActuals() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() throws Exception { diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt index 86b49710bb9..6d4561b932c 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt @@ -309,12 +309,12 @@ private class ExpectActualLinkCollector : IrElementVisitor) : IrElementVisitorVoid { +internal class FakeOverridesActualizer( + private val expectActualMap: MutableMap, + private val diagnosticReporter: IrDiagnosticReporter +) : IrElementVisitorVoid { override fun visitClass(declaration: IrClass) { if (!declaration.isExpect) { actualizeFakeOverrides(declaration) @@ -47,7 +50,7 @@ internal class FakeOverridesActualizer(private val expectActualMap: MutableMap() + val AMBIGUOUS_ACTUALS by error2() val EXPECT_ACTUAL_MISMATCH by error3() val EXPECT_ACTUAL_INCOMPATIBILITY by error3>() val ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT by warning3>() @@ -34,6 +35,12 @@ internal object IrActualizationErrors { internal object KtDefaultIrActualizationErrorMessages : BaseDiagnosticRendererFactory() { override val MAP = KtDiagnosticFactoryToRendererMap("KT").also { map -> + map.put( + IrActualizationErrors.AMBIGUOUS_ACTUALS, + "{0} has several compatible actual declarations in modules {1}", + CommonRenderers.STRING, + IrActualizationDiagnosticRenderers.MODULE_WITH_PLATFORM, + ) map.put( IrActualizationErrors.NO_ACTUAL_FOR_EXPECT, "Expected {0} has no actual declaration in module {1}", diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt index ee8bbca3733..acc4574a4b4 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt @@ -83,7 +83,7 @@ class IrActualizer( if (!useIrFakeOverrideBuilder) { // 2. Actualize expect fake overrides in non-expect classes inside common or multi-platform module. // It's probably important to run FakeOverridesActualizer before ActualFakeOverridesAdder - FakeOverridesActualizer(expectActualMap).apply { dependentFragments.forEach { visitModuleFragment(it) } } + FakeOverridesActualizer(expectActualMap, ktDiagnosticReporter).apply { dependentFragments.forEach { visitModuleFragment(it) } } // 3. Add fake overrides to non-expect classes inside common or multi-platform module, // taken from these non-expect classes actualized super classes. diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt index 52c83f46978..88e35043e53 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt @@ -55,18 +55,13 @@ internal fun recordActualForExpectDeclaration( expectSymbol: IrSymbol, actualSymbol: IrSymbol, destination: MutableMap, + diagnosticsReporter: IrDiagnosticReporter, ) { val expectDeclaration = expectSymbol.owner as IrDeclarationBase val actualDeclaration = actualSymbol.owner as IrDeclaration val registeredActual = destination.put(expectSymbol, actualSymbol) - require(registeredActual == null || registeredActual == actualSymbol) { - """ - Expect symbol already has registered mapping - - Expect declaration: ${expectDeclaration.render()} - Actual declaration: ${actualDeclaration.render()} - Already registered: ${registeredActual!!.owner.render()} - """.trimIndent() + if (registeredActual != null && registeredActual != actualSymbol) { + diagnosticsReporter.reportAmbiguousActuals(expectDeclaration) } if (expectDeclaration is IrTypeParametersContainer) { recordTypeParametersMapping(destination, expectDeclaration, actualDeclaration as IrTypeParametersContainer) @@ -107,6 +102,15 @@ internal fun IrDiagnosticReporter.reportMissingActual(irDeclaration: IrDeclarati ) } +@OptIn(ObsoleteDescriptorBasedAPI::class) +internal fun IrDiagnosticReporter.reportAmbiguousActuals(expectSymbol: IrDeclaration) { + at(expectSymbol).report( + IrActualizationErrors.AMBIGUOUS_ACTUALS, + (expectSymbol as? IrDeclarationWithName)?.name?.asString().orEmpty(), + expectSymbol.module + ) +} + internal fun IrDiagnosticReporter.reportExpectActualIncompatibility( expectSymbol: IrSymbol, actualSymbol: IrSymbol, diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualMatcher.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualMatcher.kt index da24c58f312..63f75e04f6b 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualMatcher.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualMatcher.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualMatchingCompatibil import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker import org.jetbrains.kotlin.utils.SmartList +import org.jetbrains.kotlin.utils.addToStdlib.partitionIsInstance import org.jetbrains.kotlin.utils.keysToMap import org.jetbrains.kotlin.utils.zipIfSizesAreEqual @@ -107,20 +108,22 @@ object AbstractExpectActualMatcher { } } - val incompatibilityMap = mutableMapOf>() + val matched = ArrayList() + val mismatched = HashMap>() for ((actualMember, compatibility) in mapping) { when (compatibility) { ExpectActualMatchingCompatibility.MatchedSuccessfully -> { onMatchedMembers(expectMember, actualMember, expectClassSymbol, actualClassSymbol) - return actualMember + matched.add(actualMember) } - - is ExpectActualMatchingCompatibility.Mismatch -> incompatibilityMap.getOrPut(compatibility) { SmartList() }.add(actualMember) + is ExpectActualMatchingCompatibility.Mismatch -> mismatched.getOrPut(compatibility) { SmartList() }.add(actualMember) } } - mismatchedMembers?.add(expectMember to incompatibilityMap) - onMismatchedMembersFromClassScope(expectMember, incompatibilityMap, expectClassSymbol, actualClassSymbol) + matched.singleOrNull()?.let { return it } + + mismatchedMembers?.add(expectMember to mismatched) + onMismatchedMembersFromClassScope(expectMember, mismatched, expectClassSymbol, actualClassSymbol) return null } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectContextReceiverOverload.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectContextReceiverOverload.fir.kt index a7f8b22e43e..5e911ee7d21 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectContextReceiverOverload.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectContextReceiverOverload.fir.kt @@ -9,7 +9,7 @@ expect open class Foo { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo { +actual open class Foo { actual fun foo() {} // Expected: NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING. diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.fir.kt new file mode 100644 index 00000000000..dff2f6f3810 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.fir.kt @@ -0,0 +1,10 @@ +// MODULE: common +// TARGET_PLATFORM: Common +expect fun foo() + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common +actual fun foo() {} + +// MODULE: main()()(common, intermediate) +actual fun foo() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt new file mode 100644 index 00000000000..59be8b8aeb0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt @@ -0,0 +1,10 @@ +// MODULE: common +// TARGET_PLATFORM: Common +expect fun foo() + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common +actual fun foo() {} + +// MODULE: main()()(common, intermediate) +actual fun foo() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.ll.kt new file mode 100644 index 00000000000..ebd0a0fc9f5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.ll.kt @@ -0,0 +1,10 @@ +// MODULE: common +// TARGET_PLATFORM: Common +expect fun foo() + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common +actual fun foo() {} + +// MODULE: main()()(common, intermediate) +actual fun foo() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/implicitActualFakeOverride_AbstractMap.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/implicitActualFakeOverride_AbstractMap.fir.kt index 51a4179d4f1..b89335b2cb1 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/implicitActualFakeOverride_AbstractMap.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/implicitActualFakeOverride_AbstractMap.fir.kt @@ -12,4 +12,4 @@ import java.util.AbstractMap -public actual abstract class AbstractMutableMap() : MutableMap, AbstractMap() +public actual abstract class AbstractMutableMap() : MutableMap, AbstractMap() diff --git a/compiler/testData/diagnostics/tests/multiplatform/implicitActualFakeOverride_AbstractMap.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/implicitActualFakeOverride_AbstractMap.ll.kt index 3a83499727c..edfc21b21c6 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/implicitActualFakeOverride_AbstractMap.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/implicitActualFakeOverride_AbstractMap.ll.kt @@ -12,4 +12,4 @@ public expect abstract class AbstractMutableMap : MutableMap { import java.util.AbstractMap -public actual abstract class AbstractMutableMap() : MutableMap, AbstractMap() +public actual abstract class AbstractMutableMap() : MutableMap, AbstractMap() diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPrivateFieldAndPublicMethod.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPrivateFieldAndPublicMethod.fir.kt index 6f23493c40c..7d00c2e4c0a 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPrivateFieldAndPublicMethod.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPrivateFieldAndPublicMethod.fir.kt @@ -5,6 +5,8 @@ interface I { } expect class Foo : I { + // AMBIGUOUS_ACTUALS in K1, green code in K2. + // Reason: expect-actual matcher doesn't match fields in K2 KT-63667 override val foo: Int } diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPrivateFieldAndPublicMethod.kt b/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPrivateFieldAndPublicMethod.kt index 9b7ebeeabef..5ec85495fe0 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPrivateFieldAndPublicMethod.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPrivateFieldAndPublicMethod.kt @@ -5,6 +5,8 @@ interface I { } expect class Foo : I { + // AMBIGUOUS_ACTUALS in K1, green code in K2. + // Reason: expect-actual matcher doesn't match fields in K2 KT-63667 override val foo: Int } diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPublicFieldAndPublicGetter.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPublicFieldAndPublicGetter.fir.kt index a15fdc9398f..d157638ca94 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPublicFieldAndPublicGetter.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPublicFieldAndPublicGetter.fir.kt @@ -1,6 +1,8 @@ // MODULE: m1-common // FILE: common.kt expect class Foo { + // AMBIGUOUS_ACTUALS in K1, green code in K2. + // Reason: expect-actual matcher doesn't match fields in K2 KT-63667 val foo: Int } diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPublicFieldAndPublicGetter.kt b/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPublicFieldAndPublicGetter.kt index 2cfd2d1d3ce..878a7863758 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPublicFieldAndPublicGetter.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/java/propertyAgainstJavaPublicFieldAndPublicGetter.kt @@ -1,6 +1,8 @@ // MODULE: m1-common // FILE: common.kt expect class Foo { + // AMBIGUOUS_ACTUALS in K1, green code in K2. + // Reason: expect-actual matcher doesn't match fields in K2 KT-63667 val foo: Int } diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/varPropertyAgainstJavaGetterAndNonFinalField.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/java/varPropertyAgainstJavaGetterAndNonFinalField.fir.kt index c8548f9ccb0..bcd21838fd8 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/java/varPropertyAgainstJavaGetterAndNonFinalField.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/java/varPropertyAgainstJavaGetterAndNonFinalField.fir.kt @@ -1,6 +1,8 @@ // MODULE: m1-common // FILE: common.kt expect class Foo { + // AMBIGUOUS_ACTUALS in K1, green code in K2. + // Reason: expect-actual matcher doesn't match fields in K2 KT-63667 var foo: Int } diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/varPropertyAgainstJavaGetterAndNonFinalField.kt b/compiler/testData/diagnostics/tests/multiplatform/java/varPropertyAgainstJavaGetterAndNonFinalField.kt index 3ac46537cdb..0ce0ff2a2b4 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/java/varPropertyAgainstJavaGetterAndNonFinalField.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/java/varPropertyAgainstJavaGetterAndNonFinalField.kt @@ -1,6 +1,8 @@ // MODULE: m1-common // FILE: common.kt expect class Foo { + // AMBIGUOUS_ACTUALS in K1, green code in K2. + // Reason: expect-actual matcher doesn't match fields in K2 KT-63667 var foo: Int } diff --git a/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/conflictingImplDeclarations.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/conflictingImplDeclarations.fir.kt index bddb9607ec1..1ad9727242a 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/conflictingImplDeclarations.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/conflictingImplDeclarations.fir.kt @@ -1,7 +1,7 @@ // MODULE: m1-common // FILE: common.kt -expect fun foo() +expect fun foo() // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt diff --git a/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/conflictingImplDeclarations.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/conflictingImplDeclarations.ll.kt new file mode 100644 index 00000000000..bddb9607ec1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/conflictingImplDeclarations.ll.kt @@ -0,0 +1,16 @@ +// MODULE: m1-common +// FILE: common.kt + +expect fun foo() + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +actual fun foo() {} +actual fun foo() {} + +// MODULE: m3-js()()(m1-common) +// FILE: js.kt + +actual fun foo() {} +actual fun 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 55f0c0e4dfb..6880368a628 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 @@ -26103,6 +26103,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/hmpp"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); } + @Test + @TestMetadata("ambiguousActuals.kt") + public void testAmbiguousActuals() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() throws Exception {