diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeWithInterpreterDiagnosticsTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeWithInterpreterDiagnosticsTestGenerated.java index 6a53467ff78..22f32833907 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeWithInterpreterDiagnosticsTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeWithInterpreterDiagnosticsTestGenerated.java @@ -30,4 +30,10 @@ public class FirLightTreeWithInterpreterDiagnosticsTestGenerated extends Abstrac public void testExceptionFromInterpreter() throws Exception { runTest("compiler/testData/diagnostics/irInterpreter/exceptionFromInterpreter.kt"); } + + @Test + @TestMetadata("recursionAccess.kt") + public void testRecursionAccess() throws Exception { + runTest("compiler/testData/diagnostics/irInterpreter/recursionAccess.kt"); + } } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiWithInterpreterDiagnosticsTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiWithInterpreterDiagnosticsTestGenerated.java index 216dbeff007..53cf9fc67d4 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiWithInterpreterDiagnosticsTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiWithInterpreterDiagnosticsTestGenerated.java @@ -30,4 +30,10 @@ public class FirPsiWithInterpreterDiagnosticsTestGenerated extends AbstractFirPs public void testExceptionFromInterpreter() throws Exception { runTest("compiler/testData/diagnostics/irInterpreter/exceptionFromInterpreter.kt"); } + + @Test + @TestMetadata("recursionAccess.kt") + public void testRecursionAccess() throws Exception { + runTest("compiler/testData/diagnostics/irInterpreter/recursionAccess.kt"); + } } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrInterpreterCommonChecker.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrInterpreterCommonChecker.kt index 27c7e0be10a..063e09e5fff 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrInterpreterCommonChecker.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrInterpreterCommonChecker.kt @@ -14,7 +14,10 @@ import org.jetbrains.kotlin.ir.interpreter.fqName import org.jetbrains.kotlin.ir.interpreter.isAccessToNotNullableObject import org.jetbrains.kotlin.ir.interpreter.preprocessor.IrInterpreterKCallableNamePreprocessor.Companion.isEnumName import org.jetbrains.kotlin.ir.interpreter.preprocessor.IrInterpreterKCallableNamePreprocessor.Companion.isKCallableNameCall -import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.types.classifierOrNull +import org.jetbrains.kotlin.ir.types.isAny +import org.jetbrains.kotlin.ir.types.isPrimitiveType +import org.jetbrains.kotlin.ir.types.isStringClassType import org.jetbrains.kotlin.ir.util.fileOrNull import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.statements @@ -180,6 +183,9 @@ class IrInterpreterCommonChecker : IrInterpreterChecker { (owner.type.isPrimitiveType() || owner.type.isStringClassType()) } + // We allow recursion access, but it will fail during interpretation. This way it is easier to implement error reporting. + if (visitedStack.contains(owner)) return true + return owner.asVisited { when { // TODO fix later; used it here because java boolean resolves very strange, diff --git a/compiler/testData/diagnostics/irInterpreter/recursionAccess.fir.ir.diag.txt b/compiler/testData/diagnostics/irInterpreter/recursionAccess.fir.ir.diag.txt new file mode 100644 index 00000000000..33502ef695d --- /dev/null +++ b/compiler/testData/diagnostics/irInterpreter/recursionAccess.fir.ir.diag.txt @@ -0,0 +1,3 @@ +/recursionAccess.kt:(180,194): error: Cannot evaluate constant expression: ??? + +/recursionAccess.kt:(280,283): error: Cannot evaluate constant expression: ??? diff --git a/compiler/testData/diagnostics/irInterpreter/recursionAccess.kt b/compiler/testData/diagnostics/irInterpreter/recursionAccess.kt new file mode 100644 index 00000000000..04db0fe70a0 --- /dev/null +++ b/compiler/testData/diagnostics/irInterpreter/recursionAccess.kt @@ -0,0 +1,15 @@ +// FIR_IDENTICAL +// !RENDER_IR_DIAGNOSTICS_FULL_TEXT +// !LANGUAGE: +IntrinsicConstEvaluation +// TARGET_BACKEND: JVM_IR +// WITH_STDLIB + +object A { + const val recursive1: Int = 1 + B.recursive2 +} + +class B { + companion object { + const val recursive2: Int = A.recursive1 + 2 + } +}