diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt index bd132f70f1c..057487a1d5b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt @@ -49,13 +49,16 @@ private class FunctionNVarargBridgeLowering(val context: JvmBackendContext) : override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression { if (expression.valueArgumentsCount < FunctionInvokeDescriptor.BIG_ARITY || !expression.symbol.owner.parentAsClass.defaultType.isFunctionOrKFunction() || - expression.symbol.owner.name.asString() != "invoke") - return super.visitFunctionAccess(expression) + expression.symbol.owner.name.asString() != "invoke" + ) return super.visitFunctionAccess(expression) return context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol).run { at(expression) irCall(functionNInvokeFun).apply { - dispatchReceiver = expression.dispatchReceiver + dispatchReceiver = irImplicitCast( + expression.dispatchReceiver!!, + this@FunctionNVarargBridgeLowering.context.ir.symbols.functionN.defaultType + ) putValueArgument(0, irArray(irSymbols.array.typeWith(context.irBuiltIns.anyNType)) { (0 until expression.valueArgumentsCount).forEach { +expression.getValueArgument(it)!! } }) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvoke.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvoke.kt index 8752e677db4..c1d50b80e4a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvoke.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvoke.kt @@ -13,11 +13,14 @@ import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrTypeOperator import org.jetbrains.kotlin.ir.expressions.copyTypeArgumentsFrom import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.isKFunction import org.jetbrains.kotlin.ir.util.isKSuspendFunction +import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.util.OperatorNameConventions @@ -50,7 +53,10 @@ private class ReplaceKFunctionInvokeWithFunctionInvoke : FileLoweringPass, IrEle return expression.run { IrCallImpl(startOffset, endOffset, type, newCallee).apply { copyTypeArgumentsFrom(expression) - dispatchReceiver = expression.dispatchReceiver?.transform(this@ReplaceKFunctionInvokeWithFunctionInvoke, null) + dispatchReceiver = expression.dispatchReceiver?.transform(this@ReplaceKFunctionInvokeWithFunctionInvoke, null)?.let { + val newType = newCallee.owner.parentAsClass.defaultType + IrTypeOperatorCallImpl(startOffset, endOffset, newType, IrTypeOperator.IMPLICIT_CAST, newType, it) + } extensionReceiver = expression.extensionReceiver?.transform(this@ReplaceKFunctionInvokeWithFunctionInvoke, null) for (i in 0 until valueArgumentsCount) { putValueArgument(i, expression.getValueArgument(i)?.transform(this@ReplaceKFunctionInvokeWithFunctionInvoke, null))