diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt index 98c890a9cee..3a833ae9b9d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt @@ -68,6 +68,7 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP private lateinit var valueOfFunction: IrFunction fun run() { + insertInstanceInitializer() assignOrdinalsToEnumEntries() lowerEnumConstructors(irClass) lowerEnumEntries() @@ -75,6 +76,35 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP lowerEnumClassBody() } + // Make sure that an instance initializer call exists, so that field initialization code will be generated. + // TODO: This function is identical to the one used in the JS lowerings. Share them. + private fun insertInstanceInitializer() { + irClass.transformChildrenVoid(object : IrElementTransformerVoid() { + override fun visitClass(declaration: IrClass) = declaration + + override fun visitConstructor(declaration: IrConstructor): IrStatement { + declaration.transformChildrenVoid(this) + + val blockBody = declaration.body as IrBlockBody + + if (!blockBody.statements.any { it is IrInstanceInitializerCall }) { + blockBody.statements.transformFlat { + if (it is IrEnumConstructorCall) + listOf( + it, IrInstanceInitializerCallImpl( + declaration.startOffset, declaration.startOffset, + irClass.symbol, context.irBuiltIns.unitType + ) + ) + else null + } + } + + return declaration + } + }) + } + private fun assignOrdinalsToEnumEntries() { var ordinal = 0 irClass.declarations.forEach { diff --git a/compiler/testData/codegen/box/secondaryConstructors/enums.kt b/compiler/testData/codegen/box/secondaryConstructors/enums.kt index 17845d971d8..062c8c32926 100644 --- a/compiler/testData/codegen/box/secondaryConstructors/enums.kt +++ b/compiler/testData/codegen/box/secondaryConstructors/enums.kt @@ -1,5 +1,5 @@ // IGNORE_BACKEND_FIR: JVM_IR -// IGNORE_BACKEND: JVM_IR + enum class A1(val prop1: String) { X("asd"), Y() {