From 07440ee4a1d2b7f93b2faec360fb8172a588af03 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Mon, 15 Nov 2021 16:19:45 +0300 Subject: [PATCH] FIR: Fix incorrect inference errors for ::class Do not use outer expect type for --- .../resolve/FirExpressionsResolveTransformer.kt | 8 ++++---- .../expressionWithNullableType.fir.kt | 16 ---------------- .../classLiteral/expressionWithNullableType.kt | 1 + .../declarationChecks/kClassInSignature.fir.kt | 4 ++-- 4 files changed, 7 insertions(+), 22 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/classLiteral/expressionWithNullableType.fir.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index d16809d1767..e13f7417a9c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -825,19 +825,19 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform override fun transformGetClassCall(getClassCall: FirGetClassCall, data: ResolutionMode): FirStatement { val arg = getClassCall.argument - val dataWithExpectedType = if (arg is FirConstExpression<*>) { + val dataForLhs = if (arg is FirConstExpression<*>) { withExpectedType(arg.typeRef.resolvedTypeFromPrototype(arg.kind.expectedConeType(session))) } else { - data + ResolutionMode.ContextIndependent } val transformedGetClassCall = run { val argument = getClassCall.argument val replacedArgument: FirExpression = if (argument is FirPropertyAccessExpression) - transformQualifiedAccessExpression(argument, dataWithExpectedType, isUsedAsReceiver = true) as FirExpression + transformQualifiedAccessExpression(argument, dataForLhs, isUsedAsReceiver = true) as FirExpression else - argument.transform(this, dataWithExpectedType) + argument.transform(this, dataForLhs) getClassCall.argumentList.transformArguments(object : FirTransformer() { @Suppress("UNCHECKED_CAST") diff --git a/compiler/testData/diagnostics/tests/classLiteral/expressionWithNullableType.fir.kt b/compiler/testData/diagnostics/tests/classLiteral/expressionWithNullableType.fir.kt deleted file mode 100644 index 56cb3b7bc20..00000000000 --- a/compiler/testData/diagnostics/tests/classLiteral/expressionWithNullableType.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -// FILE: J.java - -public interface J { - String platformString(); -} - -// FILE: test.kt - -fun f1(x: Int?): Any = x::class -fun f2(t: T): Any = t::class -fun f21(t: T): Any where T : Any?, T : Comparable = t::class -fun f3(s: S): Any = s::class -fun f4(u: U?): Any = u::class -fun f5(c: List<*>): Any = c[0]::class - -fun f6(j: J): Any = j.platformString()::class diff --git a/compiler/testData/diagnostics/tests/classLiteral/expressionWithNullableType.kt b/compiler/testData/diagnostics/tests/classLiteral/expressionWithNullableType.kt index b222cb09911..c4623c60434 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/expressionWithNullableType.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/expressionWithNullableType.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: J.java public interface J { diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kClassInSignature.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/kClassInSignature.fir.kt index 53df97bcf8a..25916061f1b 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/kClassInSignature.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/kClassInSignature.fir.kt @@ -8,8 +8,8 @@ val test4 get() = T:: fun test5() = listOf(T::class) -fun test6(): kotlin.reflect.KClass<T> = T::class -fun test7(): kotlin.reflect.KClass<*> = T::class +fun test6(): kotlin.reflect.KClass<T> = T::class +fun test7(): kotlin.reflect.KClass<*> = T::class fun test8() = String?::class fun test9() where T : Any?, T : Comparable = T::class