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 eec286d934a..5b5252a50f2 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 @@ -256,6 +256,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/differentOrder.kt"); } + @Test + @TestMetadata("fakeOverrides.kt") + public void testFakeOverrides() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.kt"); + } + @Test @TestMetadata("floatNumbersComparison.kt") public void testFloatNumbersComparison() 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 f7eb49be59a..23e3463b7f6 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 @@ -256,6 +256,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/differentOrder.kt"); } + @Test + @TestMetadata("fakeOverrides.kt") + public void testFakeOverrides() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.kt"); + } + @Test @TestMetadata("floatNumbersComparison.kt") public void testFloatNumbersComparison() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualAnnotationMatchingChecker.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualAnnotationMatchingChecker.kt index 3e154a865a8..9d86e821ad9 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualAnnotationMatchingChecker.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualAnnotationMatchingChecker.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.util.classIdOrFail +import org.jetbrains.kotlin.ir.util.isFakeOverride import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualAnnotationMatchChecker internal class IrExpectActualAnnotationMatchingChecker( @@ -34,6 +35,9 @@ internal class IrExpectActualAnnotationMatchingChecker( fun check() { for ((expectSymbol, actualSymbol) in matchedExpectToActual.entries) { + if (expectSymbol.isFakeOverride || actualSymbol.isFakeOverride) { + continue + } val incompatibility = AbstractExpectActualAnnotationMatchChecker.areAnnotationsCompatible(expectSymbol, actualSymbol, context) ?: continue @@ -46,6 +50,9 @@ internal class IrExpectActualAnnotationMatchingChecker( } } + private val IrSymbol.isFakeOverride: Boolean + get() = (owner as IrDeclaration).isFakeOverride + private fun getTypealiasSymbolIfActualizedViaTypealias(expectSymbol: IrSymbol): IrTypeAliasSymbol? { val expectDeclaration = expectSymbol.owner as IrDeclaration val topLevelExpectClass = expectDeclaration.parentsWithSelf.filterIsInstance().lastOrNull() ?: return null diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.kt new file mode 100644 index 00000000000..ae0133254b0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.kt @@ -0,0 +1,32 @@ +// FIR_IDENTICAL +// MODULE: m1-common +// FILE: common.kt +annotation class Ann + +interface I { + @Ann + fun noAnnotationOnActual() +} + +expect class FakeOverrideExpect : I + +interface I2 { + fun noAnnotationOnActual() +} + +expect class FakeOverrideActual : I2 { + @Ann + override fun noAnnotationOnActual() +} + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt +actual class FakeOverrideExpect : I { + override fun noAnnotationOnActual() {} +} + +abstract class Intermediate : I2 { + override fun noAnnotationOnActual() {} +} + +actual class FakeOverrideActual : Intermediate(), I2 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 de59b11fb95..8dfc2b4e25b 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 @@ -22801,6 +22801,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/differentOrder.kt"); } + @Test + @TestMetadata("fakeOverrides.kt") + public void testFakeOverrides() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.kt"); + } + @Test @TestMetadata("floatNumbersComparison.kt") public void testFloatNumbersComparison() throws Exception {