diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt index 96e04382da8..be6ab080668 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt @@ -11,11 +11,14 @@ import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind import org.jetbrains.kotlin.fir.analysis.checkers.collectOverriddenFunctionsWhere import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.processOverriddenFunctions import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.getSingleMatchedExpectForActualOrNull import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes import org.jetbrains.kotlin.fir.isSubstitutionOverride @@ -58,9 +61,14 @@ sealed class FirMultipleDefaultsInheritedFromSupertypesChecker(mppKind: MppCheck context: CheckerContext, reporter: DiagnosticReporter, ) { - val overriddenFunctions = function.collectOverriddenFunctionsWhere(mutableSetOf(), context) { overridden -> + val overriddenFunctions = mutableSetOf() + function.processOverriddenFunctions(context) { overridden -> + // default values of actual functions are located in corresponding expect functions + val overriddenWithDefaults = overridden.getSingleMatchedExpectForActualOrNull() as? FirNamedFunctionSymbol ?: overridden // Substitution overrides copy default values from originals - !overridden.isSubstitutionOverride && overridden.valueParameterSymbols.any { it.hasDefaultValue } + if (!overriddenWithDefaults.isSubstitutionOverride && overriddenWithDefaults.valueParameterSymbols.any { it.hasDefaultValue }) { + overriddenFunctions += overriddenWithDefaults + } } val isExplicitOverride = function.origin == FirDeclarationOrigin.Source diff --git a/compiler/testData/diagnostics/tests/multiplatform/scopes/multipleDefaultsInhereted.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/scopes/multipleDefaultsInhereted.fir.kt index 9256b1aad85..b88b91af964 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/scopes/multipleDefaultsInhereted.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/scopes/multipleDefaultsInhereted.fir.kt @@ -16,8 +16,8 @@ expect interface I2 { override fun foo(x: Int) } -interface CommonInterface : I1, I2 { - override fun foo(x: Int) +interface CommonInterface : I1, I2 { + override fun foo(x: Int) } // MODULE: m1-jvm()()(m1-common) @@ -33,6 +33,6 @@ actual interface I2 { actual fun bar(x: Int) } -actual interface ExpectInterface : I1, I2 { - actual override fun foo(x: Int) +actual interface ExpectInterface : I1, I2 { + actual override fun foo(x: Int) }