Skip to content

Commit a349775

Browse files
committed
Allow return in tailrec position
1 parent c94b333 commit a349775

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed

compiler/src/dotty/tools/dotc/transform/TailRec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ class TailRec extends MiniPhase {
444444

445445
case Return(expr, from) =>
446446
val fromSym = from.symbol
447-
val inTailPosition = fromSym.is(Label) && tailPositionLabeledSyms.contains(fromSym)
447+
val inTailPosition = !fromSym.is(Label) || tailPositionLabeledSyms.contains(fromSym)
448448
cpy.Return(tree)(transform(expr, inTailPosition), from)
449449

450450
case _ =>

tests/run/tailrec-return.check

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
6
2+
false

tests/run/tailrec-return.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
object Test:
2+
3+
@annotation.tailrec
4+
def sum(n: Int, acc: Int = 0): Int =
5+
if n != 0 then return sum(n - 1, acc + n)
6+
acc
7+
8+
@annotation.tailrec
9+
def isEven(n: Int): Boolean =
10+
if n != 0 && n != 1 then return isEven(n - 2)
11+
if n == 1 then return false
12+
true
13+
14+
def main(args: Array[String]): Unit =
15+
println(sum(3))
16+
println(isEven(5))

0 commit comments

Comments
 (0)