From 9254b1b461eca53092793ee062f5efcc3be5ad44 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 4 Sep 2015 16:30:25 +0300 Subject: [PATCH] Deprecate `tailRecursive` in favor of `tailrec` --- compiler/testData/builtin-classes.txt | 7 ++++--- compiler/testData/cfg/tailCalls/finally.instructions | 2 +- compiler/testData/cfg/tailCalls/finally.kt | 2 +- compiler/testData/cfg/tailCalls/finally.values | 2 +- .../testData/cfg/tailCalls/finallyWithReturn.instructions | 2 +- compiler/testData/cfg/tailCalls/finallyWithReturn.kt | 2 +- compiler/testData/cfg/tailCalls/finallyWithReturn.values | 2 +- compiler/testData/cfg/tailCalls/sum.instructions | 2 +- compiler/testData/cfg/tailCalls/sum.kt | 2 +- compiler/testData/cfg/tailCalls/sum.values | 2 +- compiler/testData/cfg/tailCalls/try.instructions | 2 +- compiler/testData/cfg/tailCalls/try.kt | 2 +- compiler/testData/cfg/tailCalls/try.values | 2 +- .../box/diagnostics/functions/tailRecursion/defaultArgs.kt | 2 +- .../diagnostics/functions/tailRecursion/defaultArgs.txt | 2 +- .../functions/tailRecursion/extensionTailCall.kt | 2 +- .../functions/tailRecursion/extensionTailCall.txt | 2 +- .../functions/tailRecursion/functionWithNoTails.kt | 2 +- .../functions/tailRecursion/functionWithNoTails.txt | 2 +- .../tailRecursion/functionWithNonTailRecursions.kt | 2 +- .../tailRecursion/functionWithNonTailRecursions.txt | 2 +- .../box/diagnostics/functions/tailRecursion/infixCall.kt | 2 +- .../box/diagnostics/functions/tailRecursion/infixCall.txt | 2 +- .../functions/tailRecursion/infixRecursiveCall.kt | 2 +- .../functions/tailRecursion/infixRecursiveCall.txt | 2 +- .../box/diagnostics/functions/tailRecursion/insideElvis.kt | 2 +- .../diagnostics/functions/tailRecursion/insideElvis.txt | 2 +- .../functions/tailRecursion/labeledThisReferences.kt | 4 ++-- .../functions/tailRecursion/labeledThisReferences.txt | 4 ++-- .../box/diagnostics/functions/tailRecursion/loops.kt | 2 +- .../box/diagnostics/functions/tailRecursion/loops.txt | 2 +- .../functions/tailRecursion/multilevelBlocks.kt | 2 +- .../functions/tailRecursion/multilevelBlocks.txt | 2 +- .../functions/tailRecursion/realIteratorFoldl.kt | 2 +- .../functions/tailRecursion/realIteratorFoldl.txt | 2 +- .../functions/tailRecursion/realStringEscape.kt | 2 +- .../functions/tailRecursion/realStringEscape.txt | 2 +- .../functions/tailRecursion/realStringRepeat.kt | 2 +- .../functions/tailRecursion/realStringRepeat.txt | 2 +- .../functions/tailRecursion/recursiveCallInLambda.kt | 2 +- .../functions/tailRecursion/recursiveCallInLambda.txt | 2 +- .../tailRecursion/recursiveCallInLocalFunction.kt | 2 +- .../tailRecursion/recursiveCallInLocalFunction.txt | 2 +- .../functions/tailRecursion/recursiveInnerFunction.kt | 2 +- .../box/diagnostics/functions/tailRecursion/returnIf.kt | 2 +- .../box/diagnostics/functions/tailRecursion/returnIf.txt | 2 +- .../diagnostics/functions/tailRecursion/returnInCatch.kt | 2 +- .../diagnostics/functions/tailRecursion/returnInCatch.txt | 2 +- .../diagnostics/functions/tailRecursion/returnInFinally.kt | 2 +- .../functions/tailRecursion/returnInFinally.txt | 2 +- .../functions/tailRecursion/returnInIfInFinally.kt | 2 +- .../functions/tailRecursion/returnInIfInFinally.txt | 2 +- .../functions/tailRecursion/returnInParentheses.kt | 2 +- .../functions/tailRecursion/returnInParentheses.txt | 2 +- .../box/diagnostics/functions/tailRecursion/returnInTry.kt | 2 +- .../diagnostics/functions/tailRecursion/returnInTry.txt | 2 +- .../box/diagnostics/functions/tailRecursion/simpleBlock.kt | 2 +- .../diagnostics/functions/tailRecursion/simpleBlock.txt | 2 +- .../diagnostics/functions/tailRecursion/simpleReturn.kt | 2 +- .../diagnostics/functions/tailRecursion/simpleReturn.txt | 2 +- .../functions/tailRecursion/simpleReturnWithElse.kt | 2 +- .../functions/tailRecursion/simpleReturnWithElse.txt | 2 +- .../codegen/box/diagnostics/functions/tailRecursion/sum.kt | 2 +- .../box/diagnostics/functions/tailRecursion/sum.txt | 2 +- .../tailRecursion/tailCallInBlockInParentheses.kt | 2 +- .../tailRecursion/tailCallInBlockInParentheses.txt | 2 +- .../functions/tailRecursion/tailCallInParentheses.kt | 2 +- .../functions/tailRecursion/tailCallInParentheses.txt | 2 +- .../functions/tailRecursion/tailRecursionInFinally.kt | 2 +- .../functions/tailRecursion/tailRecursionInFinally.txt | 2 +- .../diagnostics/functions/tailRecursion/thisReferences.kt | 6 +++--- .../diagnostics/functions/tailRecursion/thisReferences.txt | 6 +++--- .../box/diagnostics/functions/tailRecursion/unitBlocks.kt | 2 +- .../box/diagnostics/functions/tailRecursion/unitBlocks.txt | 2 +- .../functions/tailRecursion/whenWithCondition.kt | 2 +- .../functions/tailRecursion/whenWithCondition.txt | 2 +- .../diagnostics/functions/tailRecursion/whenWithInRange.kt | 2 +- .../functions/tailRecursion/whenWithInRange.txt | 2 +- .../box/diagnostics/functions/tailRecursion/whenWithIs.kt | 2 +- .../box/diagnostics/functions/tailRecursion/whenWithIs.txt | 2 +- .../functions/tailRecursion/whenWithoutCondition.kt | 2 +- .../functions/tailRecursion/whenWithoutCondition.txt | 2 +- core/builtins/src/kotlin/Annotations.kt | 3 +++ .../src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java | 6 ++++-- 84 files changed, 98 insertions(+), 92 deletions(-) diff --git a/compiler/testData/builtin-classes.txt b/compiler/testData/builtin-classes.txt index 96afcc0a65b..64bc54b30a9 100644 --- a/compiler/testData/builtin-classes.txt +++ b/compiler/testData/builtin-classes.txt @@ -1249,6 +1249,10 @@ kotlin.annotation.target(allowedTargets = {AnnotationTarget.CLASSIFIER, Annotati internal final fun (): kotlin.Array } +kotlin.annotation.target(allowedTargets = {AnnotationTarget.FUNCTION}) kotlin.annotation.annotation(retention = AnnotationRetention.SOURCE) public final class TailRecursive : kotlin.Annotation { + /*primary*/ public constructor TailRecursive() +} + public open class Throwable { /*primary*/ public constructor Throwable(/*0*/ message: kotlin.String? = ..., /*1*/ cause: kotlin.Throwable? = ...) public final fun getCause(): kotlin.Throwable? @@ -1287,6 +1291,3 @@ kotlin.annotation.target(allowedTargets = {AnnotationTarget.VALUE_PARAMETER}) ko kotlin.annotation.target(allowedTargets = {AnnotationTarget.VALUE_PARAMETER}) kotlin.annotation.annotation(mustBeDocumented = true, retention = AnnotationRetention.RUNTIME) public final class noinline : kotlin.Annotation { /*primary*/ public constructor noinline() } -kotlin.annotation.target(allowedTargets = {AnnotationTarget.FUNCTION}) kotlin.annotation.annotation(retention = AnnotationRetention.SOURCE) public final class tailRecursive : kotlin.Annotation { - /*primary*/ public constructor tailRecursive() -} diff --git a/compiler/testData/cfg/tailCalls/finally.instructions b/compiler/testData/cfg/tailCalls/finally.instructions index e266b16db59..0300ad56801 100644 --- a/compiler/testData/cfg/tailCalls/finally.instructions +++ b/compiler/testData/cfg/tailCalls/finally.instructions @@ -1,5 +1,5 @@ == test == -tailRecursive fun test() : Int { +tailrec fun test() : Int { try { // do nothing } finally { diff --git a/compiler/testData/cfg/tailCalls/finally.kt b/compiler/testData/cfg/tailCalls/finally.kt index 6b1b19b9c6c..1c470ca3581 100644 --- a/compiler/testData/cfg/tailCalls/finally.kt +++ b/compiler/testData/cfg/tailCalls/finally.kt @@ -1,4 +1,4 @@ -tailRecursive fun test() : Int { +tailrec fun test() : Int { try { // do nothing } finally { diff --git a/compiler/testData/cfg/tailCalls/finally.values b/compiler/testData/cfg/tailCalls/finally.values index b15c35b8255..28e2866c667 100644 --- a/compiler/testData/cfg/tailCalls/finally.values +++ b/compiler/testData/cfg/tailCalls/finally.values @@ -1,5 +1,5 @@ == test == -tailRecursive fun test() : Int { +tailrec fun test() : Int { try { // do nothing } finally { diff --git a/compiler/testData/cfg/tailCalls/finallyWithReturn.instructions b/compiler/testData/cfg/tailCalls/finallyWithReturn.instructions index a9a02389f11..069a6a2ab55 100644 --- a/compiler/testData/cfg/tailCalls/finallyWithReturn.instructions +++ b/compiler/testData/cfg/tailCalls/finallyWithReturn.instructions @@ -1,5 +1,5 @@ == test == -tailRecursive fun test() : Int { +tailrec fun test() : Int { try { // do nothing } finally { diff --git a/compiler/testData/cfg/tailCalls/finallyWithReturn.kt b/compiler/testData/cfg/tailCalls/finallyWithReturn.kt index d5d8d1f78c4..42544d0cf5c 100644 --- a/compiler/testData/cfg/tailCalls/finallyWithReturn.kt +++ b/compiler/testData/cfg/tailCalls/finallyWithReturn.kt @@ -1,4 +1,4 @@ -tailRecursive fun test() : Int { +tailrec fun test() : Int { try { // do nothing } finally { diff --git a/compiler/testData/cfg/tailCalls/finallyWithReturn.values b/compiler/testData/cfg/tailCalls/finallyWithReturn.values index 64005d8310f..3993f997e6f 100644 --- a/compiler/testData/cfg/tailCalls/finallyWithReturn.values +++ b/compiler/testData/cfg/tailCalls/finallyWithReturn.values @@ -1,5 +1,5 @@ == test == -tailRecursive fun test() : Int { +tailrec fun test() : Int { try { // do nothing } finally { diff --git a/compiler/testData/cfg/tailCalls/sum.instructions b/compiler/testData/cfg/tailCalls/sum.instructions index 41c04a83b62..b0602c35377 100644 --- a/compiler/testData/cfg/tailCalls/sum.instructions +++ b/compiler/testData/cfg/tailCalls/sum.instructions @@ -1,5 +1,5 @@ == sum == -tailRecursive fun sum(x: Long, sum: Long): Long { +tailrec fun sum(x: Long, sum: Long): Long { if (x == 0.toLong()) return sum return sum(x - 1, sum + x) } diff --git a/compiler/testData/cfg/tailCalls/sum.kt b/compiler/testData/cfg/tailCalls/sum.kt index 9585320d039..903542975a0 100644 --- a/compiler/testData/cfg/tailCalls/sum.kt +++ b/compiler/testData/cfg/tailCalls/sum.kt @@ -1,4 +1,4 @@ -tailRecursive fun sum(x: Long, sum: Long): Long { +tailrec fun sum(x: Long, sum: Long): Long { if (x == 0.toLong()) return sum return sum(x - 1, sum + x) } \ No newline at end of file diff --git a/compiler/testData/cfg/tailCalls/sum.values b/compiler/testData/cfg/tailCalls/sum.values index 0970e6e57cf..a56298af703 100644 --- a/compiler/testData/cfg/tailCalls/sum.values +++ b/compiler/testData/cfg/tailCalls/sum.values @@ -1,5 +1,5 @@ == sum == -tailRecursive fun sum(x: Long, sum: Long): Long { +tailrec fun sum(x: Long, sum: Long): Long { if (x == 0.toLong()) return sum return sum(x - 1, sum + x) } diff --git a/compiler/testData/cfg/tailCalls/try.instructions b/compiler/testData/cfg/tailCalls/try.instructions index cb82c5d952a..e9f47805f08 100644 --- a/compiler/testData/cfg/tailCalls/try.instructions +++ b/compiler/testData/cfg/tailCalls/try.instructions @@ -1,5 +1,5 @@ == foo == -tailRecursive fun foo() { +tailrec fun foo() { try { return foo() } diff --git a/compiler/testData/cfg/tailCalls/try.kt b/compiler/testData/cfg/tailCalls/try.kt index 6e6dc6c08ce..0d71d55aee6 100644 --- a/compiler/testData/cfg/tailCalls/try.kt +++ b/compiler/testData/cfg/tailCalls/try.kt @@ -1,4 +1,4 @@ -tailRecursive fun foo() { +tailrec fun foo() { try { return foo() } diff --git a/compiler/testData/cfg/tailCalls/try.values b/compiler/testData/cfg/tailCalls/try.values index fe7782aa584..6e7d42a8918 100644 --- a/compiler/testData/cfg/tailCalls/try.values +++ b/compiler/testData/cfg/tailCalls/try.values @@ -1,5 +1,5 @@ == foo == -tailRecursive fun foo() { +tailrec fun foo() { try { return foo() } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt index c611fd0b6da..b4f8f9f77d7 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(x : Int = 0, e : Any = "a") { +tailrec fun test(x : Int = 0, e : Any = "a") { if (!e.equals("a")) { throw IllegalArgumentException() } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.txt index bddc7042c85..5ee040eb332 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/defaultArgs.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ x: kotlin.Int = ..., /*1*/ e: kotlin.Any = ...): kotlin.Unit +kotlin.tailrec() internal fun test(/*0*/ x: kotlin.Int = ..., /*1*/ e: kotlin.Any = ...): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt index d19d8560b56..ca069b14ab2 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.kt @@ -1,5 +1,5 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -tailRecursive fun Int.foo(x: Int) { +tailrec fun Int.foo(x: Int) { if (x == 0) return return 1.foo(x - 1) } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.txt index 724d7ac7655..95099cbef86 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/extensionTailCall.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun kotlin.Int.foo(/*0*/ x: kotlin.Int): kotlin.Unit +kotlin.tailrec() internal fun kotlin.Int.foo(/*0*/ x: kotlin.Int): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNoTails.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNoTails.kt index 014b945fa6c..56968fce192 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNoTails.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNoTails.kt @@ -1,4 +1,4 @@ -tailRecursive fun noTails() { +tailrec fun noTails() { // nothing here } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNoTails.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNoTails.txt index f9a8c4ce341..620a7704676 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNoTails.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNoTails.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun noTails(): kotlin.Unit +kotlin.tailrec() internal fun noTails(): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNonTailRecursions.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNonTailRecursions.kt index c9046ee83df..c23608d11f2 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNonTailRecursions.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNonTailRecursions.kt @@ -1,4 +1,4 @@ -tailRecursive fun badTails(x : Int) : Int { +tailrec fun badTails(x : Int) : Int { if (x < 50 && x != 10 && x > 0) { return 1 + badTails(x - 1) } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNonTailRecursions.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNonTailRecursions.txt index 7e9d7cd5cc0..e107f9631cc 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNonTailRecursions.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/functionWithNonTailRecursions.txt @@ -1,4 +1,4 @@ package -kotlin.tailRecursive() internal fun badTails(/*0*/ x: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun badTails(/*0*/ x: kotlin.Int): kotlin.Int internal fun box(): kotlin.String diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixCall.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixCall.kt index 30b97057ad3..84a5188e061 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixCall.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixCall.kt @@ -1,4 +1,4 @@ -tailRecursive fun Int.test(x : Int) : Int { +tailrec fun Int.test(x : Int) : Int { if (this > 1) { return (this - 1) test x } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixCall.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixCall.txt index 5208ef16797..fba4bfc71fd 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixCall.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixCall.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun kotlin.Int.test(/*0*/ x: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun kotlin.Int.test(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixRecursiveCall.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixRecursiveCall.kt index d58b2cca341..ba17e93ec7c 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixRecursiveCall.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixRecursiveCall.kt @@ -1,5 +1,5 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -tailRecursive fun Int.foo(x: Int) { +tailrec fun Int.foo(x: Int) { if (x == 0) return val xx = x - 1 return 1 foo xx diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixRecursiveCall.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixRecursiveCall.txt index 724d7ac7655..95099cbef86 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixRecursiveCall.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/infixRecursiveCall.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun kotlin.Int.foo(/*0*/ x: kotlin.Int): kotlin.Unit +kotlin.tailrec() internal fun kotlin.Int.foo(/*0*/ x: kotlin.Int): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/insideElvis.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/insideElvis.kt index 396271f0923..95877b9f869 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/insideElvis.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/insideElvis.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(counter : Int) : Int? { +tailrec fun test(counter : Int) : Int? { if (counter < 0) return null if (counter == 0) return 777 diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/insideElvis.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/insideElvis.txt index 0c4551905dd..a15d3256ec5 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/insideElvis.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/insideElvis.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int? +kotlin.tailrec() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int? diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/labeledThisReferences.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/labeledThisReferences.kt index 3ee17320796..bbcfd94835f 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/labeledThisReferences.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/labeledThisReferences.kt @@ -2,13 +2,13 @@ class B { inner class C { - tailRecursive fun h(counter : Int) { + tailrec fun h(counter : Int) { if (counter > 0) { this@C.h(counter - 1) } } - tailRecursive fun h2(x : Any) { + tailrec fun h2(x : Any) { this@B.h2("no recursion") // keep vigilance } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/labeledThisReferences.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/labeledThisReferences.txt index aa17ea743b4..bbe9336a78f 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/labeledThisReferences.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/labeledThisReferences.txt @@ -13,8 +13,8 @@ internal final class B { internal final inner class C { public constructor C() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - kotlin.tailRecursive() internal final fun h(/*0*/ counter: kotlin.Int): kotlin.Unit - kotlin.tailRecursive() internal final fun h2(/*0*/ x: kotlin.Any): kotlin.Unit + kotlin.tailrec() internal final fun h(/*0*/ counter: kotlin.Int): kotlin.Unit + kotlin.tailrec() internal final fun h2(/*0*/ x: kotlin.Any): kotlin.Unit public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/loops.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/loops.kt index 0589d46f14c..98fc8036e0a 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/loops.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/loops.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(x : Int) : Int { +tailrec fun test(x : Int) : Int { var z = if (x > 3) 3 else x while (z > 0) { if (z > 10) { diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/loops.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/loops.txt index 9ce75e941bc..c19a08a6ff3 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/loops.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/loops.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/multilevelBlocks.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/multilevelBlocks.kt index bc8532965c4..825c497c8a7 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/multilevelBlocks.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/multilevelBlocks.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(x : Int) : Int { +tailrec fun test(x : Int) : Int { if (x == 1) { if (x != 1) { test(0) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/multilevelBlocks.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/multilevelBlocks.txt index 9ce75e941bc..c19a08a6ff3 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/multilevelBlocks.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/multilevelBlocks.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realIteratorFoldl.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realIteratorFoldl.kt index c0f19b5b79d..9a60279b09d 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realIteratorFoldl.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realIteratorFoldl.kt @@ -1,4 +1,4 @@ -tailRecursive fun Iterator.foldl(acc : A, foldFunction : (e : T, acc : A) -> A) : A = +tailrec fun Iterator.foldl(acc : A, foldFunction : (e : T, acc : A) -> A) : A = if (!hasNext()) acc else foldl(foldFunction(next(), acc), foldFunction) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realIteratorFoldl.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realIteratorFoldl.txt index 51b637e168e..18454112376 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realIteratorFoldl.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realIteratorFoldl.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun kotlin.Iterator.foldl(/*0*/ acc: A, /*1*/ foldFunction: (T, A) -> A): A +kotlin.tailrec() internal fun kotlin.Iterator.foldl(/*0*/ acc: A, /*1*/ foldFunction: (T, A) -> A): A diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringEscape.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringEscape.kt index dc6b192088b..2aeeaa87138 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringEscape.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringEscape.kt @@ -5,7 +5,7 @@ fun escapeChar(c : Char) : String? = when (c) { else -> "" + c } -tailRecursive fun String.escape(i : Int = 0, result : StringBuilder = StringBuilder()) : String = +tailrec fun String.escape(i : Int = 0, result : StringBuilder = StringBuilder()) : String = if (i == length()) result.toString() else escape(i + 1, result.append(escapeChar(get(i)))) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringEscape.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringEscape.txt index f2d33ec4a7a..7b9450cfc79 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringEscape.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringEscape.txt @@ -2,4 +2,4 @@ package internal fun box(): kotlin.String internal fun escapeChar(/*0*/ c: kotlin.Char): kotlin.String? -kotlin.tailRecursive() internal fun kotlin.String.escape(/*0*/ i: kotlin.Int = ..., /*1*/ result: java.lang.StringBuilder = ...): kotlin.String +kotlin.tailrec() internal fun kotlin.String.escape(/*0*/ i: kotlin.Int = ..., /*1*/ result: java.lang.StringBuilder = ...): kotlin.String diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringRepeat.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringRepeat.kt index 238624e022c..068cf1a576b 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringRepeat.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringRepeat.kt @@ -1,4 +1,4 @@ -tailRecursive fun String.repeat(num : Int, acc : StringBuilder = StringBuilder()) : String = +tailrec fun String.repeat(num : Int, acc : StringBuilder = StringBuilder()) : String = if (num == 0) acc.toString() else repeat(num - 1, acc.append(this)) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringRepeat.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringRepeat.txt index fc61176584e..5cf69f07bd7 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringRepeat.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/realStringRepeat.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun kotlin.String.repeat(/*0*/ num: kotlin.Int, /*1*/ acc: java.lang.StringBuilder = ...): kotlin.String +kotlin.tailrec() internal fun kotlin.String.repeat(/*0*/ num: kotlin.Int, /*1*/ acc: java.lang.StringBuilder = ...): kotlin.String diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLambda.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLambda.kt index f46d34487a8..d38fd628fd7 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLambda.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLambda.kt @@ -1,5 +1,5 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -tailRecursive fun foo() { +tailrec fun foo() { bar { foo() } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLambda.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLambda.txt index 41bbe8d033e..b5354b22476 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLambda.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLambda.txt @@ -2,4 +2,4 @@ package internal fun bar(/*0*/ a: kotlin.Any): kotlin.Unit internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun foo(): kotlin.Unit +kotlin.tailrec() internal fun foo(): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLocalFunction.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLocalFunction.kt index 46ed4271d49..ccbd077fde6 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLocalFunction.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLocalFunction.kt @@ -1,4 +1,4 @@ -tailRecursive fun foo() { +tailrec fun foo() { fun bar() { foo() } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLocalFunction.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLocalFunction.txt index c8f07089cb1..65a835f995a 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLocalFunction.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveCallInLocalFunction.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun foo(): kotlin.Unit +kotlin.tailrec() internal fun foo(): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveInnerFunction.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveInnerFunction.kt index 4dc15487722..9413b8efec2 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveInnerFunction.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/recursiveInnerFunction.kt @@ -1,5 +1,5 @@ fun test() { - @tailRecursive fun g3(counter : Int) { + @tailrec fun g3(counter : Int) { if (counter > 0) { g3(counter - 1) } } g3(1000000) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnIf.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnIf.kt index 6a6b85964c6..63c29c57bca 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnIf.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnIf.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(x : Int) : Int { +tailrec fun test(x : Int) : Int { return if (x == 1) { test(x - 1) 1 + test(x - 1) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnIf.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnIf.txt index 9ce75e941bc..c19a08a6ff3 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnIf.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnIf.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInCatch.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInCatch.kt index ab6ea508b17..42f0c57623b 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInCatch.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInCatch.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(counter : Int) : Int { +tailrec fun test(counter : Int) : Int { if (counter == 0) return 0 try { diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInCatch.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInCatch.txt index 6713ddd446e..b1aad911621 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInCatch.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInCatch.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInFinally.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInFinally.kt index d9f49071900..d86a1d5415f 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInFinally.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInFinally.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(counter : Int) : Int { +tailrec fun test(counter : Int) : Int { if (counter == 0) return 0 try { diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInFinally.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInFinally.txt index 6713ddd446e..b1aad911621 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInFinally.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInFinally.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInIfInFinally.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInIfInFinally.kt index bc009b1ab68..e69ef9b131e 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInIfInFinally.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInIfInFinally.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(counter : Int) : Int { +tailrec fun test(counter : Int) : Int { if (counter == 0) return 0 try { diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInIfInFinally.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInIfInFinally.txt index 6713ddd446e..b1aad911621 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInIfInFinally.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInIfInFinally.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInParentheses.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInParentheses.kt index cfe2cb42c29..27b5f92f913 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInParentheses.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInParentheses.kt @@ -1,4 +1,4 @@ -tailRecursive fun foo(x: Int) { +tailrec fun foo(x: Int) { if (x == 0) return (return foo(x - 1)) } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInParentheses.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInParentheses.txt index 159f3131ce2..10ce40dec1d 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInParentheses.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInParentheses.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun foo(/*0*/ x: kotlin.Int): kotlin.Unit +kotlin.tailrec() internal fun foo(/*0*/ x: kotlin.Int): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInTry.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInTry.kt index 838b3566934..7266c10ae5a 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInTry.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInTry.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(counter : Int) : Int { +tailrec fun test(counter : Int) : Int { if (counter == 0) return 0 try { diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInTry.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInTry.txt index 6713ddd446e..b1aad911621 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInTry.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/returnInTry.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ counter: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleBlock.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleBlock.kt index e80aa190cfb..768d4a310ab 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleBlock.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleBlock.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(x : Int) : Int = +tailrec fun test(x : Int) : Int = if (x == 1) { test(x - 1) 1 + test(x - 1) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleBlock.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleBlock.txt index 9ce75e941bc..c19a08a6ff3 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleBlock.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleBlock.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturn.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturn.kt index a5f038742f5..d014a06c7dc 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturn.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturn.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(x : Int) : Int { +tailrec fun test(x : Int) : Int { if (x == 10) { return 1 + test(x - 1) } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturn.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturn.txt index 9ce75e941bc..c19a08a6ff3 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturn.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturn.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturnWithElse.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturnWithElse.kt index 631f3d20066..564c7cd3db7 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturnWithElse.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturnWithElse.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(x : Int) : Int { +tailrec fun test(x : Int) : Int { if (x == 0) { return 0 } else if (x == 10) { diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturnWithElse.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturnWithElse.txt index 9ce75e941bc..c19a08a6ff3 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturnWithElse.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/simpleReturnWithElse.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun test(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/sum.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/sum.kt index 084de2c706d..f188b722623 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/sum.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/sum.kt @@ -1,4 +1,4 @@ -tailRecursive fun sum(x: Long, sum: Long): Long { +tailrec fun sum(x: Long, sum: Long): Long { if (x == 0.toLong()) return sum return sum(x - 1, sum + x) } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/sum.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/sum.txt index 6ec2bb61775..8ed25b77df1 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/sum.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/sum.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun sum(/*0*/ x: kotlin.Long, /*1*/ sum: kotlin.Long): kotlin.Long +kotlin.tailrec() internal fun sum(/*0*/ x: kotlin.Long, /*1*/ sum: kotlin.Long): kotlin.Long diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInBlockInParentheses.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInBlockInParentheses.kt index 222571ed482..e413deef2d1 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInBlockInParentheses.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInBlockInParentheses.kt @@ -1,4 +1,4 @@ -tailRecursive fun foo(x: Int) { +tailrec fun foo(x: Int) { return if (x > 0) { (foo(x - 1)) } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInBlockInParentheses.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInBlockInParentheses.txt index 159f3131ce2..10ce40dec1d 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInBlockInParentheses.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInBlockInParentheses.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun foo(/*0*/ x: kotlin.Int): kotlin.Unit +kotlin.tailrec() internal fun foo(/*0*/ x: kotlin.Int): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInParentheses.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInParentheses.kt index fba563157f5..4cd6b0c0716 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInParentheses.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInParentheses.kt @@ -1,4 +1,4 @@ -tailRecursive fun foo(x: Int) { +tailrec fun foo(x: Int) { if (x == 0) return return (foo(x - 1)) } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInParentheses.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInParentheses.txt index 159f3131ce2..10ce40dec1d 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInParentheses.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailCallInParentheses.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun foo(/*0*/ x: kotlin.Int): kotlin.Unit +kotlin.tailrec() internal fun foo(/*0*/ x: kotlin.Int): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailRecursionInFinally.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailRecursionInFinally.kt index d6bff3784c0..c527524a684 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailRecursionInFinally.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailRecursionInFinally.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(go: Boolean) : Unit { +tailrec fun test(go: Boolean) : Unit { if (!go) return try { test(false) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailRecursionInFinally.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailRecursionInFinally.txt index 3a8f5fbb4e9..015abbf8f63 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailRecursionInFinally.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/tailRecursionInFinally.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ go: kotlin.Boolean): kotlin.Unit +kotlin.tailrec() internal fun test(/*0*/ go: kotlin.Boolean): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/thisReferences.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/thisReferences.kt index 14e8ec62ff9..f42d59b498c 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/thisReferences.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/thisReferences.kt @@ -1,17 +1,17 @@ class A { - tailRecursive fun f1(c : Int) { + tailrec fun f1(c : Int) { if (c > 0) { this.f1(c - 1) } } - tailRecursive fun f2(c : Int) { + tailrec fun f2(c : Int) { if (c > 0) { f2(c - 1) } } - tailRecursive fun f3(a : A) { + tailrec fun f3(a : A) { a.f3(a) // non-tail recursion, could be potentially resolved by condition if (a == this) f3() else a.f3() } } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/thisReferences.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/thisReferences.txt index ca7f36da8bb..5b79f459e1c 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/thisReferences.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/thisReferences.txt @@ -5,9 +5,9 @@ internal fun box(): kotlin.String internal final class A { public constructor A() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - kotlin.tailRecursive() internal final fun f1(/*0*/ c: kotlin.Int): kotlin.Unit - kotlin.tailRecursive() internal final fun f2(/*0*/ c: kotlin.Int): kotlin.Unit - kotlin.tailRecursive() internal final fun f3(/*0*/ a: A): kotlin.Unit + kotlin.tailrec() internal final fun f1(/*0*/ c: kotlin.Int): kotlin.Unit + kotlin.tailrec() internal final fun f2(/*0*/ c: kotlin.Int): kotlin.Unit + kotlin.tailrec() internal final fun f3(/*0*/ a: A): kotlin.Unit public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/unitBlocks.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/unitBlocks.kt index fcce077c836..0e2ed22c070 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/unitBlocks.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/unitBlocks.kt @@ -1,4 +1,4 @@ -tailRecursive fun test(x : Int) : Unit { +tailrec fun test(x : Int) : Unit { if (x == 1) { test(x - 1) } else if (x == 2) { diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/unitBlocks.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/unitBlocks.txt index a84ae3cd561..1799a40638e 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/unitBlocks.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/unitBlocks.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun test(/*0*/ x: kotlin.Int): kotlin.Unit +kotlin.tailrec() internal fun test(/*0*/ x: kotlin.Int): kotlin.Unit diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithCondition.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithCondition.kt index 05f60f6be52..36c27674b4b 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithCondition.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithCondition.kt @@ -1,4 +1,4 @@ -tailRecursive fun withWhen(counter : Int) : Int = +tailrec fun withWhen(counter : Int) : Int = when (counter) { 0 -> counter 50 -> 1 + withWhen(counter - 1) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithCondition.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithCondition.txt index fd077e95570..8963d5fa9ce 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithCondition.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithCondition.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun withWhen(/*0*/ counter: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun withWhen(/*0*/ counter: kotlin.Int): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithInRange.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithInRange.kt index 6aaec2be201..c8c7da7ef9f 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithInRange.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithInRange.kt @@ -1,6 +1,6 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -tailRecursive fun withWhen(counter : Int, d : Any) : Int = +tailrec fun withWhen(counter : Int, d : Any) : Int = when (counter) { 0 -> counter 1, 2 -> withWhen(counter - 1, "1,2") diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithInRange.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithInRange.txt index 6a977426658..93de333076d 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithInRange.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithInRange.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun withWhen(/*0*/ counter: kotlin.Int, /*1*/ d: kotlin.Any): kotlin.Int +kotlin.tailrec() internal fun withWhen(/*0*/ counter: kotlin.Int, /*1*/ d: kotlin.Any): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithIs.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithIs.kt index bed9765a9e1..45be5ef4ec1 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithIs.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithIs.kt @@ -1,4 +1,4 @@ -tailRecursive fun withWhen(counter : Int, d : Any) : Int = +tailrec fun withWhen(counter : Int, d : Any) : Int = if (counter == 0) { 0 } diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithIs.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithIs.txt index 6a977426658..93de333076d 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithIs.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithIs.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun withWhen(/*0*/ counter: kotlin.Int, /*1*/ d: kotlin.Any): kotlin.Int +kotlin.tailrec() internal fun withWhen(/*0*/ counter: kotlin.Int, /*1*/ d: kotlin.Any): kotlin.Int diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithoutCondition.kt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithoutCondition.kt index 019e71f9cd9..1c6856174eb 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithoutCondition.kt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithoutCondition.kt @@ -1,4 +1,4 @@ -tailRecursive fun withWhen2(counter : Int) : Int = +tailrec fun withWhen2(counter : Int) : Int = when { counter == 0 -> counter counter == 50 -> 1 + withWhen2(counter - 1) diff --git a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithoutCondition.txt b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithoutCondition.txt index 4d243595461..407e854a5cf 100644 --- a/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithoutCondition.txt +++ b/compiler/testData/codegen/box/diagnostics/functions/tailRecursion/whenWithoutCondition.txt @@ -1,4 +1,4 @@ package internal fun box(): kotlin.String -kotlin.tailRecursive() internal fun withWhen2(/*0*/ counter: kotlin.Int): kotlin.Int +kotlin.tailrec() internal fun withWhen2(/*0*/ counter: kotlin.Int): kotlin.Int diff --git a/core/builtins/src/kotlin/Annotations.kt b/core/builtins/src/kotlin/Annotations.kt index 4ad34e08f76..36afa713a40 100644 --- a/core/builtins/src/kotlin/Annotations.kt +++ b/core/builtins/src/kotlin/Annotations.kt @@ -78,6 +78,9 @@ public annotation(retention = SOURCE) class Suppress(vararg val names: String) target(FUNCTION) public annotation(retention = SOURCE) class tailRecursive +target(FUNCTION) +public annotation(retention = SOURCE) class tailrec + /** * Hides the annotated function, property or constructor from the overload resolution, * thus preventing its usages from newly compiled code, but keeps compiling it diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 752d620d85a..fda2f55a4c0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -171,7 +171,8 @@ public class KotlinBuiltIns { public final FqName data = fqName("data"); public final FqName deprecated = fqName("deprecated"); - public final FqName tailRecursive = fqName("tailRecursive"); + public final FqName tailRecursive = fqName("tailrec"); + public final FqName tailRecursiveDeprecated = fqName("tailRecursive"); public final FqName inline = fqName("inline"); public final FqName noinline = fqName("noinline"); public final FqName inlineOptions = fqName("inlineOptions"); @@ -1031,7 +1032,8 @@ public class KotlinBuiltIns { } public static boolean isTailRecursive(@NotNull DeclarationDescriptor declarationDescriptor) { - return containsAnnotation(declarationDescriptor, FQ_NAMES.tailRecursive); + return containsAnnotation(declarationDescriptor, FQ_NAMES.tailRecursive) + || containsAnnotation(declarationDescriptor, FQ_NAMES.tailRecursiveDeprecated); } /** Checks that the symbol represented by the descriptor is annotated with the {@code kotlin.noinline} annotation */