From c464322b3a5e14c24f4afa7c78b8c5cf0e450f1c Mon Sep 17 00:00:00 2001 From: Juan Chen Date: Wed, 8 Jan 2020 02:46:19 +0300 Subject: [PATCH] [FIR2IR] Fix translation of library func parameters with default values In the existing implementation, the information that a library function parameter has a default value is lost during Fir2Ir translation, and thus later on, calls to such functions are not converted to the corresponding stubs. Test cases such as kt5844, which calls kotlin.test.assertEquals, fail with messages like "java.lang.IllegalArgumentException: Null argument in ExpressionCodegen for parameter VALUE_PARAMETER name:message index:2 type:kotlin.String?", due to nonnull checks in ExpressionCodegen.visitFunctionAccess (ExpressionCodegen.kt:421) Functions defined in the code to be compiled don't have this problem, only those from deserializing jars. This commit sets default values in IrValueParameterImpl for such parameters during Fir2Ir translation. Now kt5844 passes the nonnull check in ExpressionCodegen.visitFunctionAccess but still fails in a later stage (java.lang.ClassNotFoundException: kotlin.internal.ir.Intrinsic). --- .../kotlin/fir/backend/Fir2IrDeclarationStorage.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 560a04ce495..a0f9ea9d3d3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -24,11 +24,14 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.* import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl @@ -682,6 +685,14 @@ class Fir2IrDeclarationStorage( null, valueParameter.isCrossinline, valueParameter.isNoinline ).apply { descriptor.bind(this) + if (valueParameter.defaultValue != null) { + this.defaultValue = IrExpressionBodyImpl( + IrErrorExpressionImpl( + UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, + "Stub expression for default value of ${valueParameter.name}" + ) + ) + } } } }