From 36c0c2c76b74e3a01c5415df36e8894398477bbb Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 14 Sep 2023 10:25:50 +0200 Subject: [PATCH] [FIR] Fix false negative TYPE_PARAMETER_AS_REIFIED_ARRAY ... in presence of typealiases. #KT-61921 --- .../checkers/expression/FirReifiedChecker.kt | 14 ++++++++++---- .../tpAsReified/GenericArrayAsReifiedArgument.kt | 6 ++++++ .../tpAsReified/GenericArrayAsReifiedArgument.txt | 5 ----- 3 files changed, 16 insertions(+), 9 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.txt 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 e28cf0b1c0d..43115ee744c 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,9 +11,11 @@ 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.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* @@ -58,11 +60,15 @@ object FirReifiedChecker : FirQualifiedAccessExpressionChecker() { isExplicit: Boolean, isArray: Boolean, context: CheckerContext, - reporter: DiagnosticReporter + reporter: DiagnosticReporter, ) { - if (typeArgument.classId == StandardClassIds.Array) { - val nestedTypeArgument = typeArgument.typeArguments[0].type ?: return - checkArgumentAndReport(nestedTypeArgument, source, isExplicit, isArray = true, context, reporter) + val fullyExpandedType = typeArgument.fullyExpandedType(context.session) + if (fullyExpandedType.classId == StandardClassIds.Array) { + // Type aliases can transform type arguments arbitrarily (drop, nest, etc...). + // Therefore, we check the arguments of the expanded type, not the ones that went into the type alias. + fullyExpandedType.typeArguments.forEach { + if (it is ConeKotlinType) checkArgumentAndReport(it, source, isExplicit, isArray = true, context, reporter) + } return } diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.kt index da4d103de70..267e234ad65 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.kt @@ -4,10 +4,16 @@ inline fun foo() {} +typealias TA = Array + fun bar() { foo<T>() foo<Array>() foo<Array>>() + foo>() + foo<TA>() + foo, String>>() + foo<TA>>() foo>() foo>>() foo() diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.txt b/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.txt deleted file mode 100644 index ca3e0fed575..00000000000 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/GenericArrayAsReifiedArgument.txt +++ /dev/null @@ -1,5 +0,0 @@ -package - -public fun bar(): kotlin.Unit -public inline fun foo(): kotlin.Unit -public fun test(/*0*/ x: kotlin.Array, /*1*/ y: kotlin.Array<*>): kotlin.Unit