From 2801db0e595059df7374b3c2ee32611719835533 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Mon, 18 Sep 2023 13:18:01 +0300 Subject: [PATCH] [FIR] Unwrap substitution overrides for multiple default values Otherwise, duplicate diagnostics may be reported on subtypes of the type that actually declares the problematic override. --- ...tipleDefaultsInheritedFromSupertypesChecker.kt | 7 +++++-- ...ultipleDefaultsAndSubstitutionOverrides.fir.kt | 15 --------------- .../MultipleDefaultsAndSubstitutionOverrides.kt | 1 + 3 files changed, 6 insertions(+), 17 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/override/MultipleDefaultsAndSubstitutionOverrides.fir.kt 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 57d7f2e567d..b68131dce4d 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 @@ -20,16 +20,19 @@ import org.jetbrains.kotlin.fir.isSubstitutionOverride import org.jetbrains.kotlin.fir.scopes.processAllFunctions import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol +import org.jetbrains.kotlin.fir.unwrapSubstitutionOverrides import org.jetbrains.kotlin.name.Name object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecker() { override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { declaration.unsubstitutedScope(context).processAllFunctions { - if (it.containingClassLookupTag() != declaration.symbol.toLookupTag()) { + val originalIfSubstitutionOverride = it.unwrapSubstitutionOverrides() + + if (originalIfSubstitutionOverride.containingClassLookupTag() != declaration.symbol.toLookupTag()) { return@processAllFunctions } - checkFunction(declaration, it, context, reporter) + checkFunction(declaration, originalIfSubstitutionOverride, context, reporter) } } diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndSubstitutionOverrides.fir.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndSubstitutionOverrides.fir.kt deleted file mode 100644 index 69171a53300..00000000000 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndSubstitutionOverrides.fir.kt +++ /dev/null @@ -1,15 +0,0 @@ -interface A { - fun foo(x: Int = 42): Int -} - -open class B { - fun foo(x: Int = 239) = x -} - -interface C { - fun foo(x: Int): Int -} - -open class Z : A, B(), C - -class N : Z() diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndSubstitutionOverrides.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndSubstitutionOverrides.kt index 4dd2340c5ce..0fe6cdf4fbb 100644 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndSubstitutionOverrides.kt +++ b/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndSubstitutionOverrides.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface A { fun foo(x: Int = 42): Int }