diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt index 1c211b3caac..250941f8890 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt @@ -65,6 +65,13 @@ fun ConeKotlinType.lowerBoundIfFlexible(): ConeSimpleKotlinType { } } +fun ConeKotlinType.originalIfDefinitelyNotNullable(): ConeKotlinType { + return when (this) { + is ConeDefinitelyNotNullType -> original + else -> this + } +} + fun ConeIntersectionType.withAlternative(alternativeType: ConeKotlinType): ConeIntersectionType { return ConeIntersectionType(intersectedTypes, alternativeType) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt index 0b47d97e587..1d61383cb85 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.lookupTracker @@ -540,7 +540,7 @@ fun FirExpression.isFunctional( // Make sure the contributed `invoke` is indeed a wanted functional type by checking if types are compatible. val expectedReturnType = classLikeExpectedFunctionType.returnType(session).lowerBoundIfFlexible() val returnTypeCompatible = - expectedReturnType is ConeTypeParameterType || + expectedReturnType.originalIfDefinitelyNotNullable() is ConeTypeParameterType || AbstractTypeChecker.isSubtypeOf( session.typeContext.newTypeCheckerState( errorTypesEqualToAnything = false, @@ -560,7 +560,7 @@ fun FirExpression.isFunctional( invokeSymbol.fir.valueParameters.zip(classLikeExpectedFunctionType.valueParameterTypesIncludingReceiver(session)) return parameterPairs.all { (invokeParameter, expectedParameter) -> val expectedParameterType = expectedParameter.lowerBoundIfFlexible() - expectedParameterType is ConeTypeParameterType || + expectedParameterType.originalIfDefinitelyNotNullable() is ConeTypeParameterType || AbstractTypeChecker.isSubtypeOf( session.typeContext.newTypeCheckerState( errorTypesEqualToAnything = false,