diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 8cd80d679a6..2adb559c666 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -112,6 +112,7 @@ val jvmPhases = namedIrFilePhase( propertiesPhase then renameFieldsPhase then annotationPhase then + tailrecPhase then defaultArgumentStubPhase then @@ -145,7 +146,6 @@ val jvmPhases = namedIrFilePhase( jvmStaticAnnotationPhase then staticDefaultFunctionPhase then - tailrecPhase then toArrayPhase then flattenStringConcatenationPhase then foldConstantLoweringPhase then diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt index 3579e3d0a42..65fe86aabdf 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // DONT_RUN_GENERATED_CODE: JS tailrec fun test(x : Int = 0, e : Any = "a") { diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt new file mode 100644 index 00000000000..c5aee1184be --- /dev/null +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt @@ -0,0 +1,15 @@ +// DONT_RUN_GENERATED_CODE: JS + +tailrec fun test(x : Int = 0, e : Any = "a") { + if (x < 100000 && !e.equals("a")) { + throw IllegalArgumentException() + } + if (x > 0) { + test(x - 1) + } +} + +fun box() : String { + test(100000, "b") + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.txt new file mode 100644 index 00000000000..1e8d7ae0b64 --- /dev/null +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.txt @@ -0,0 +1,4 @@ +package + +public fun box(): kotlin.String +public tailrec fun test(/*0*/ x: kotlin.Int = ..., /*1*/ e: kotlin.Any = ...): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt new file mode 100644 index 00000000000..15acc41f2ad --- /dev/null +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt @@ -0,0 +1,34 @@ +// DONT_RUN_GENERATED_CODE: JS +// IGNORE_BACKEND: JVM + +var counter = 0 +fun inc() = counter++ + +tailrec fun test(x: Int = 0, y: Int = inc(), z: Int = inc()) { + if (x * 2 != y || z - y != 1) + throw IllegalArgumentException("x=$x y=$y z=$z") + + if (x < 100000) + test(x + 1) +} + +fun box() : String { + test() + + counter = 4 + test(x = 1, y = 2, z = 3) + + counter = 0 + test(-1, -2, -1) + + counter = 3 + test(1, 2) + + counter = 1 + test(y = 0) + + counter = 2 + test(x = 1) + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.txt new file mode 100644 index 00000000000..1018f5a15e5 --- /dev/null +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.txt @@ -0,0 +1,6 @@ +package + +public var counter: kotlin.Int +public fun box(): kotlin.String +public fun inc(): kotlin.Int +public tailrec fun test(/*0*/ x: kotlin.Int = ..., /*1*/ y: kotlin.Int = ..., /*2*/ z: kotlin.Int = ...): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt new file mode 100644 index 00000000000..c8c22b22b82 --- /dev/null +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt @@ -0,0 +1,22 @@ +// DONT_RUN_GENERATED_CODE: JS + +var counter = 0 +fun inc() = counter++ + +tailrec fun test(x: Int = 0, y: Int = inc(), z: Int = inc()) { + if (x * 2 != y + 1 || z - y != -1) + throw IllegalArgumentException("x=$x y=$y z=$z") + + if (x < 100000) + test(z = inc(), x = (counter - 1)/2 + 1) +} + +fun box() : String { + counter = 4 + test(1, 1, 0) + + counter = 0 + test(-1, -3, -4) + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.txt new file mode 100644 index 00000000000..1018f5a15e5 --- /dev/null +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.txt @@ -0,0 +1,6 @@ +package + +public var counter: kotlin.Int +public fun box(): kotlin.String +public fun inc(): kotlin.Int +public tailrec fun test(/*0*/ x: kotlin.Int = ..., /*1*/ y: kotlin.Int = ..., /*2*/ z: kotlin.Int = ...): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 610a877aae6..ae7e5c896b7 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -23686,11 +23686,26 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt"); } + @TestMetadata("defaultArgs2.kt") + public void testDefaultArgs2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt"); + } + @TestMetadata("defaultArgsOverridden.kt") public void testDefaultArgsOverridden() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsOverridden.kt"); } + @TestMetadata("defaultArgsWithSideEffects.kt") + public void testDefaultArgsWithSideEffects() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt"); + } + + @TestMetadata("defaultArgsWithSideEffects2.kt") + public void testDefaultArgsWithSideEffects2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt"); + } + @TestMetadata("extensionTailCall.kt") public void testExtensionTailCall() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 2026a77a3ba..e6bc7729bb5 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -23606,11 +23606,26 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt"); } + @TestMetadata("defaultArgs2.kt") + public void testDefaultArgs2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt"); + } + @TestMetadata("defaultArgsOverridden.kt") public void testDefaultArgsOverridden() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsOverridden.kt"); } + @TestMetadata("defaultArgsWithSideEffects.kt") + public void testDefaultArgsWithSideEffects() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt"); + } + + @TestMetadata("defaultArgsWithSideEffects2.kt") + public void testDefaultArgsWithSideEffects2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt"); + } + @TestMetadata("extensionTailCall.kt") public void testExtensionTailCall() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 33e573996f9..93ef920df8b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -9851,11 +9851,26 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt"); } + @TestMetadata("defaultArgs2.kt") + public void testDefaultArgs2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt"); + } + @TestMetadata("defaultArgsOverridden.kt") public void testDefaultArgsOverridden() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsOverridden.kt"); } + @TestMetadata("defaultArgsWithSideEffects.kt") + public void testDefaultArgsWithSideEffects() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt"); + } + + @TestMetadata("defaultArgsWithSideEffects2.kt") + public void testDefaultArgsWithSideEffects2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt"); + } + @TestMetadata("extensionTailCall.kt") public void testExtensionTailCall() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index be86f112d5d..e7b2a981f85 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -9838,6 +9838,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class TailRecursion extends AbstractLightAnalysisModeTest { + @TestMetadata("defaultArgsWithSideEffects.kt") + public void ignoreDefaultArgsWithSideEffects() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt"); + } + private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); } @@ -9851,11 +9856,21 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt"); } + @TestMetadata("defaultArgs2.kt") + public void testDefaultArgs2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt"); + } + @TestMetadata("defaultArgsOverridden.kt") public void testDefaultArgsOverridden() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsOverridden.kt"); } + @TestMetadata("defaultArgsWithSideEffects2.kt") + public void testDefaultArgsWithSideEffects2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt"); + } + @TestMetadata("extensionTailCall.kt") public void testExtensionTailCall() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index aa0a6ba80a3..cd4c1fe53b1 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -9851,11 +9851,26 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt"); } + @TestMetadata("defaultArgs2.kt") + public void testDefaultArgs2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt"); + } + @TestMetadata("defaultArgsOverridden.kt") public void testDefaultArgsOverridden() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsOverridden.kt"); } + @TestMetadata("defaultArgsWithSideEffects.kt") + public void testDefaultArgsWithSideEffects() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt"); + } + + @TestMetadata("defaultArgsWithSideEffects2.kt") + public void testDefaultArgsWithSideEffects2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt"); + } + @TestMetadata("extensionTailCall.kt") public void testExtensionTailCall() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index b37ff725df1..ca992224838 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -7581,11 +7581,26 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt"); } + @TestMetadata("defaultArgs2.kt") + public void testDefaultArgs2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt"); + } + @TestMetadata("defaultArgsOverridden.kt") public void testDefaultArgsOverridden() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsOverridden.kt"); } + @TestMetadata("defaultArgsWithSideEffects.kt") + public void testDefaultArgsWithSideEffects() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt"); + } + + @TestMetadata("defaultArgsWithSideEffects2.kt") + public void testDefaultArgsWithSideEffects2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt"); + } + @TestMetadata("extensionTailCall.kt") public void testExtensionTailCall() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 5cce8aa90ac..219cf5c4a75 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -8666,11 +8666,26 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt"); } + @TestMetadata("defaultArgs2.kt") + public void testDefaultArgs2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs2.kt"); + } + @TestMetadata("defaultArgsOverridden.kt") public void testDefaultArgsOverridden() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsOverridden.kt"); } + @TestMetadata("defaultArgsWithSideEffects.kt") + public void testDefaultArgsWithSideEffects() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects.kt"); + } + + @TestMetadata("defaultArgsWithSideEffects2.kt") + public void testDefaultArgsWithSideEffects2() throws Exception { + runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgsWithSideEffects2.kt"); + } + @TestMetadata("extensionTailCall.kt") public void testExtensionTailCall() throws Exception { runTest("compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt");