From 093f62caac71f59a4563ad34dff2a26042ecf3bb Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Fri, 8 Jan 2021 12:56:09 -0800 Subject: [PATCH] FIR2IR: check non-parameter Unit type for adapted callable references --- .../kotlin/fir/backend/generators/AdapterGenerator.kt | 8 ++++---- .../box/coroutines/suspendFunctionMethodReference.kt | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt index 4633c6c2675..df955f46770 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.inference.* import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeKotlinType -import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX import org.jetbrains.kotlin.ir.declarations.* @@ -51,8 +50,6 @@ internal class AdapterGenerator( private val conversionScope: Fir2IrConversionScope ) : Fir2IrComponents by components { - private fun FirTypeRef.toIrType(): IrType = with(typeConverter) { toIrType() } - private fun ConeKotlinType.toIrType(): IrType = with(typeConverter) { toIrType() } internal fun needToGenerateAdaptedCallableReference( @@ -85,7 +82,10 @@ internal class AdapterGenerator( */ private fun needCoercionToUnit(type: IrSimpleType, function: IrFunction): Boolean { val expectedReturnType = type.arguments.last().typeOrNull - return expectedReturnType?.isUnit() == true && !function.returnType.isUnit() + val actualReturnType = function.returnType + return expectedReturnType?.isUnit() == true && + // In case of an external function whose return type is a type parameter, e.g., operator fun invoke(T): R + !actualReturnType.isUnit() && !actualReturnType.isTypeParameter() } /** diff --git a/compiler/testData/codegen/box/coroutines/suspendFunctionMethodReference.kt b/compiler/testData/codegen/box/coroutines/suspendFunctionMethodReference.kt index a75eb869d8d..916a4cb3d54 100644 --- a/compiler/testData/codegen/box/coroutines/suspendFunctionMethodReference.kt +++ b/compiler/testData/codegen/box/coroutines/suspendFunctionMethodReference.kt @@ -1,6 +1,5 @@ // WITH_RUNTIME // WITH_COROUTINES -// IGNORE_BACKEND_FIR: JVM_IR import kotlin.coroutines.* import helpers.*