diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java index 33a33d0f1d2..b87a414e4a8 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LoweredIrInterpreterTestGenerated.java @@ -100,6 +100,12 @@ public class LoweredIrInterpreterTestGenerated extends AbstractLoweredIrInterpre runTest("compiler/testData/ir/loweredIr/interpreter/kCallableName.kt"); } + @Test + @TestMetadata("kt53272.kt") + public void testKt53272() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/kt53272.kt"); + } + @Test @TestMetadata("longOperations.kt") public void testLongOperations() throws Exception { diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/InstructionsUnfolder.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/InstructionsUnfolder.kt index 0cc3c682784..973904b28d4 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/InstructionsUnfolder.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/InstructionsUnfolder.kt @@ -259,7 +259,7 @@ private fun unfoldGetEnumValue(expression: IrGetEnumValue, environment: IrInterp callStack.pushSimpleInstruction(expression) val enumEntry = expression.symbol.owner val enumClass = enumEntry.symbol.owner.parentAsClass - enumClass.declarations.filterIsInstance().forEach { + enumClass.declarations.filterIsInstance().reversed().forEach { callStack.pushSimpleInstruction(it) } } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt index d9d1711d0db..bfa431b51ad 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt @@ -398,6 +398,7 @@ class IrInterpreter(internal val environment: IrInterpreterEnvironment, internal ?: (enumInitializer as IrBlock).statements.filterIsInstance().single() val enumSuperCall = enumConstructorCall.getSuperEnumCall() + // TODO must call this function even after exception has occurred or else data will be corrupted val cleanEnumSuperCall = fun() { enumSuperCall.apply { (0 until this.valueArgumentsCount).forEach { putValueArgument(it, null) } } // restore to null callStack.popState() // result of constructor must be dropped, because next instruction will be `IrGetEnumValue` diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt index 6b5dfbaa41f..5b1032906d0 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt @@ -37,7 +37,7 @@ class IrConstTransformer( onError(original, this) return when (mode) { // need to pass any const value to be able to get some bytecode and then report error - EvaluationMode.ONLY_INTRINSIC_CONST -> IrConstImpl.int(startOffset, endOffset, type, 0) + EvaluationMode.ONLY_INTRINSIC_CONST -> IrConstImpl.constNull(startOffset, endOffset, type) else -> original } } diff --git a/compiler/testData/ir/loweredIr/interpreter/kt53272.kt b/compiler/testData/ir/loweredIr/interpreter/kt53272.kt new file mode 100644 index 00000000000..3d2290c30ea --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/kt53272.kt @@ -0,0 +1,11 @@ +// FILE: 1.kt + +const val name = E.OK.name +fun box(): String = name + +// FILE: 2.kt + +enum class E(val parent: E?) { + X(null), + OK(X), +} \ No newline at end of file