From a53fa4f6f8724de18df7bf59d24f3ee05aaa5557 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 4 Jun 2018 12:09:31 +0200 Subject: [PATCH] Properly calculate shift for default args in enum constructor call --- .../kotlin/backend/jvm/codegen/ExpressionCodegen.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index f098fec2a5b..d83b9c62ead 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumClass import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.inline.InlineUtil import org.jetbrains.kotlin.resolve.jvm.AsmTypes @@ -231,6 +232,8 @@ class ExpressionCodegen( callGenerator.beforeValueParametersStart() val defaultMask = DefaultCallArgs(callable.valueParameterTypes.size) + val enumConstructorDefaultArgsShift = + if (expression.descriptor is ConstructorDescriptor && isEnumClass(expression.descriptor.containingDeclaration)) 2 else 0 expression.descriptor.valueParameters.forEachIndexed { i, parameterDescriptor -> val arg = expression.getValueArgument(i) val parameterType = callable.valueParameterTypes[i] @@ -246,7 +249,7 @@ class ExpressionCodegen( i, this@ExpressionCodegen ) - defaultMask.mark(i) + defaultMask.mark(i - enumConstructorDefaultArgsShift/*TODO switch to separate lower*/) } else -> { assert(parameterDescriptor.varargElementType != null)