From cc6c378b68ab4333b9830dd62415e4b59b59dbc9 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 28 Apr 2023 15:51:25 +0300 Subject: [PATCH] [FIR] Don't perform suspend conversion for anonymous functions ^KT-58329 Fixed --- .../kotlin/fir/resolve/inference/InferenceUtils.kt | 9 +++++++++ .../inference/coerceFunctionLiteralToSuspend.fir.kt | 6 +++--- .../lambdaInValInitializerWithAnonymousFunctions.fir.kt | 4 ++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt index 3bd8ab07166..417731b2d21 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt @@ -5,13 +5,16 @@ package org.jetbrains.kotlin.fir.resolve.inference +import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction +import org.jetbrains.kotlin.fir.declarations.utils.isSuspend import org.jetbrains.kotlin.fir.diagnostics.ConeCannotInferValueParameterType import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.utils.addToStdlib.runIf /** * @return null if and only if expectedType is not function type (or flexible type with function type as bound) @@ -39,7 +42,13 @@ fun extractLambdaInfoFromFunctionType( ) } val expectedFunctionKind = expectedType.functionTypeKind(session) ?: return null + val actualFunctionKind = session.functionTypeService.extractSingleSpecialKindForFunction(argument.symbol) + ?: runIf(!argument.isLambda) { + // There is no function -> suspend function conversions for non-lambda anonymous functions + // If function is suspend then functionTypeService will return SuspendFunction kind + FunctionTypeKind.Function + } val singleStatement = argument.body?.statements?.singleOrNull() as? FirReturnExpression if (argument.returnType == null && singleStatement != null && diff --git a/compiler/testData/diagnostics/tests/inference/coerceFunctionLiteralToSuspend.fir.kt b/compiler/testData/diagnostics/tests/inference/coerceFunctionLiteralToSuspend.fir.kt index 6bd6ab8fb68..1503e4459f6 100644 --- a/compiler/testData/diagnostics/tests/inference/coerceFunctionLiteralToSuspend.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/coerceFunctionLiteralToSuspend.fir.kt @@ -7,7 +7,7 @@ fun fail2(c: () -> Unit) {} fun success1(c: suspend () -> Unit) {} fun test1() { - fail1(fun () {}) + fail1(fun () {}) fun fail2(c: suspend () -> Unit) {} fail2(fun () {}) fun success1(c: () -> Unit) {} @@ -21,9 +21,9 @@ suspend fun fail4(c: () -> Unit) {} suspend fun success2(c: suspend () -> Unit) {} suspend fun test2() { - fail3(fun () {}) + fail3(fun () {}) fun fail4(c: suspend () -> Unit) {} fail4(fun () {}) fun success2(c: () -> Unit) {} success2(fun() {}) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.fir.kt b/compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.fir.kt index 5a2ef9e81ce..cf2ba10de3f 100644 --- a/compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.fir.kt @@ -1,7 +1,7 @@ typealias SuspendFn = suspend () -> Unit -val test1f: suspend () -> Unit = fun () {} -val test2f: suspend Any.() -> Unit = fun Any.() {} +val test1f: suspend () -> Unit = fun () {} +val test2f: suspend Any.() -> Unit = fun Any.() {} // This is a bug in the old inference and should be fixed in new inference // see "Fix anonymous function literals handling in type checker" for more details