diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReifiedChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReifiedChecker.kt index 43115ee744c..1ea3f273a00 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReifiedChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirReifiedChecker.kt @@ -11,8 +11,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.chooseFactory import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClassId -import org.jetbrains.kotlin.fir.analysis.diagnostics.* +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.resolve.fullyExpandedType @@ -54,6 +53,12 @@ object FirReifiedChecker : FirQualifiedAccessExpressionChecker() { containingDeclaration is FirRegularClassSymbol && containingDeclaration.classId == StandardClassIds.Array } + private fun ConeKotlinType.cannotBeReified() = when (this) { + is ConeCapturedType -> true + is ConeDynamicType -> true + else -> isNothing || isNullableNothing + } + private fun checkArgumentAndReport( typeArgument: ConeKotlinType, source: KtSourceElement, @@ -85,7 +90,7 @@ object FirReifiedChecker : FirQualifiedAccessExpressionChecker() { } else if (typeArgument is ConeDefinitelyNotNullType && isExplicit) { // We sometimes infer type arguments to DNN types, which seems to be ok. Only report explicit DNN types written by user. reporter.reportOn(source, FirErrors.DEFINITELY_NON_NULLABLE_AS_REIFIED, context) - } else if (typeArgument.isNothing || typeArgument.isNullableNothing || typeArgument is ConeCapturedType) { + } else if (typeArgument.cannotBeReified()) { reporter.reportOn(source, FirErrors.REIFIED_TYPE_FORBIDDEN_SUBSTITUTION, typeArgument, context) } } diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/reified.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/reified.fir.kt deleted file mode 100644 index f42ace2fe27..00000000000 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/reified.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER -REIFIED_TYPE_PARAMETER_NO_INLINE - -fun foo(t: T) {} -class C(t: T) - -fun test(d: dynamic) { - foo(d) - foo(d) - - C(d) - C(d) -} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/reified.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/reified.kt index d72e046ca0a..a92a3bb2d80 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/reified.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/reified.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER -REIFIED_TYPE_PARAMETER_NO_INLINE fun foo(t: T) {}