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 ff60bda04c3..e68cc3e83a0 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 @@ -24066,6 +24066,18 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() 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 0b812e9982c..99f3f067e19 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 @@ -24066,6 +24066,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() 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 a31da5151b1..8fc23bd866f 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 @@ -313,6 +313,18 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() 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 42aff062c05..659de132cc8 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 @@ -313,6 +313,18 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() throws Exception { diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt index 0e7adabd6e6..d5cd1123a25 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt @@ -373,20 +373,21 @@ object AbstractExpectActualChecker { // "parameters" checks are required only for functions, because only functions can have parameters actualDeclaration is FunctionSymbolMarker && expectDeclaration is FunctionSymbolMarker ) { - val expectOverriddenDeclarations = - expectDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(expectContainingClass).toSet() - val actualOverriddenDeclarations = - actualDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(actualContainingClass).toSet() if (languageVersionSettings.supportsFeature(LanguageFeature.ProhibitDefaultArgumentsInExpectActualizedByFakeOverride) && + // If expect declaration is a fake-override then default params came from common + // supertypes of actual class and expect class. It's a valid code. + !expectDeclaration.isFakeOverride(expectContainingClass) && (actualDeclaration.isFakeOverride(actualContainingClass) || actualDeclaration.isDelegatedMember) && - // If default params came from common supertypes of actual class and expect class then it's a valid code. - // Here we filter out such default params. - (expectOverriddenDeclarations - actualOverriddenDeclarations).flatMap { it.valueParameters } - .any { it.hasDefaultValueNonRecursive } + expectDeclaration.valueParameters.any { it.hasDefaultValueNonRecursive } ) { return ExpectActualCheckingCompatibility.DefaultArgumentsInExpectActualizedByFakeOverride } + val expectOverriddenDeclarations = + expectDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(expectContainingClass).toSet() + val actualOverriddenDeclarations = + actualDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(actualContainingClass) + // Actual annotation constructors can have default argument values; their consistency with arguments in the expected annotation // is checked in ExpectedActualDeclarationChecker.checkAnnotationConstructors if (!actualDeclaration.isAnnotationConstructor() && diff --git a/compiler/testData/diagnostics/tests/multiplatform/kt63860.kt b/compiler/testData/diagnostics/tests/multiplatform/kt63860.kt new file mode 100644 index 00000000000..97869a300ad --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/kt63860.kt @@ -0,0 +1,26 @@ +// FIR_IDENTICAL +// MODULE: m1-common +// FILE: common.kt + +expect interface SdkBufferedSink { + public fun write(arg: String = "default") +} + +abstract class AbstractBufferedSinkAdapter() : SdkBufferedSink { + override fun write(arg: String) { + } +} + +expect class BufferedSinkAdapter() : SdkBufferedSink { + override fun write(arg: String) +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +actual interface SdkBufferedSink { + public actual fun write(arg: String): Unit +} + +actual class BufferedSinkAdapter actual constructor() : AbstractBufferedSinkAdapter(), SdkBufferedSink { +} diff --git a/compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt b/compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt new file mode 100644 index 00000000000..d723064224a --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt @@ -0,0 +1,26 @@ +// FIR_IDENTICAL +// MODULE: m1-common +// FILE: common.kt + +expect interface SdkBufferedSink { + public fun write(arg: String = "default") +} + +abstract class AbstractBufferedSinkAdapter() { + fun write(arg: String) { + } +} + +expect class BufferedSinkAdapter() : SdkBufferedSink { + override fun write(arg: String) +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +actual interface SdkBufferedSink { + public actual fun write(arg: String): Unit +} + +actual class BufferedSinkAdapter actual constructor() : AbstractBufferedSinkAdapter(), SdkBufferedSink { +} 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 51ec04892dd..c52776e552a 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 @@ -24066,6 +24066,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() throws Exception {