diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index cf8832e73f1..6be454af10e 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1177,6 +1177,8 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val DECLARATION_CANT_BE_INLINED by error(PositioningStrategy.DECLARATION_SIGNATURE) val OVERRIDE_BY_INLINE by warning(PositioningStrategy.DECLARATION_SIGNATURE) + + val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error(PositioningStrategy.REIFIED_MODIFIER) } val IMPORTS by object : DiagnosticGroup("Imports") { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index c61212001fd..aa77ca6ed7a 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -610,6 +610,7 @@ object FirErrors { val SUPER_CALL_FROM_PUBLIC_INLINE by warning1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val DECLARATION_CANT_BE_INLINED by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val OVERRIDE_BY_INLINE by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error0(SourceElementPositioningStrategies.REIFIED_MODIFIER) // Imports val CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON by error1(SourceElementPositioningStrategies.IMPORT_LAST_NAME) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt index abbd2baac83..8be4f741d7f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt @@ -364,6 +364,14 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { } } + if (overriddenSymbols.isNotEmpty()) { + for (param in function.typeParameters) { + if (param.isReified) { + reporter.reportOn(param.source, FirErrors.REIFIED_TYPE_PARAMETER_IN_OVERRIDE, context) + } + } + } + //check for inherited default values val paramsWithDefaults = overriddenSymbols.flatMap { if (it !is FirFunctionSymbol<*>) return@flatMap emptyList() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index be56bf21669..214b22e6964 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -338,6 +338,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_SINGLE_ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_VISIBILITY_MODIFIER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_FORBIDDEN_SUBSTITUTION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_IN_CATCH_CLAUSE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_PARAMETER_IN_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_PARAMETER_NO_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REPEATED_BOUND import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REPEATED_MODIFIER @@ -932,6 +933,7 @@ class FirDefaultErrorMessages { map.put(INLINE_CLASS_CANNOT_BE_RECURSIVE, "Inline class cannot be recursive") map.put(DECLARATION_CANT_BE_INLINED, "'inline' modifier is not allowed on virtual members. Only private or final members can be inlined") map.put(OVERRIDE_BY_INLINE, "Override by an inline function") + map.put(REIFIED_TYPE_PARAMETER_IN_OVERRIDE, "Override by a function with reified type parameter") map.put(RESERVED_MEMBER_INSIDE_INLINE_CLASS, "Member with the name ''{0}'' is reserved for future releases", TO_STRING) map.put( SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS, diff --git a/compiler/testData/diagnostics/tests/inline/overrideWithInline.fir.kt b/compiler/testData/diagnostics/tests/inline/overrideWithInline.fir.kt deleted file mode 100644 index d1b83c2a22d..00000000000 --- a/compiler/testData/diagnostics/tests/inline/overrideWithInline.fir.kt +++ /dev/null @@ -1,60 +0,0 @@ -// !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER - -interface IBase { - fun foo() - fun bar() - fun qux(x: T) -} - -class CDerived : IBase { - override inline final fun foo() {} - override inline fun bar() {} - override inline final fun qux(x: T) {} - - class CNested : IBase { - override inline final fun foo() {} - override inline fun bar() {} - override inline final fun qux(x: T) {} - } - - val anObject = object : IBase { - override inline final fun foo() {} - override inline fun bar() {} - override inline final fun qux(x: T) {} - } - - fun aMethod() { - class CLocal : IBase { - override inline final fun foo() {} - override inline fun bar() {} - override inline final fun qux(x: T) {} - } - } -} - -open class COpen : IBase { - override inline final fun foo() {} - override inline fun bar() {} - override inline final fun qux(x: T) {} - - open class COpenNested : IBase { - override inline final fun foo() {} - override inline fun bar() {} - override inline final fun qux(x: T) {} - } - - val anObject = object : IBase { - override inline final fun foo() {} - override inline fun bar() {} - override inline final fun qux(x: T) {} - } - - fun aMethod() { - open class COpenLocal : IBase { - override inline final fun foo() {} - override inline fun bar() {} - override inline final fun qux(x: T) {} - } - } -} - diff --git a/compiler/testData/diagnostics/tests/inline/overrideWithInline.kt b/compiler/testData/diagnostics/tests/inline/overrideWithInline.kt index 5b519286a02..99f0e329137 100644 --- a/compiler/testData/diagnostics/tests/inline/overrideWithInline.kt +++ b/compiler/testData/diagnostics/tests/inline/overrideWithInline.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER interface IBase { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 6043e0cd7f3..a8a810c1846 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3179,6 +3179,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.REIFIED_TYPE_PARAMETER_IN_OVERRIDE) { firDiagnostic -> + ReifiedTypeParameterInOverrideImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON) { firDiagnostic -> CannotAllUnderImportFromSingletonImpl( firDiagnostic.a, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index ac0eabbefe3..d416ef7e69b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2218,6 +2218,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = OverrideByInline::class } + abstract class ReifiedTypeParameterInOverride : KtFirDiagnostic() { + override val diagnosticClass get() = ReifiedTypeParameterInOverride::class + } + abstract class CannotAllUnderImportFromSingleton : KtFirDiagnostic() { override val diagnosticClass get() = CannotAllUnderImportFromSingleton::class abstract val objectName: Name diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index c42535b9769..16b7488cbc3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3581,6 +3581,13 @@ internal class OverrideByInlineImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class ReifiedTypeParameterInOverrideImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.ReifiedTypeParameterInOverride(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class CannotAllUnderImportFromSingletonImpl( override val objectName: Name, firDiagnostic: FirPsiDiagnostic,