Skip to content

Commit ff54133

Browse files
mbovelmichelou
authored andcommitted
Allow return in tailrec position
1 parent a10b8cf commit ff54133

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
@@ -456,7 +456,7 @@ class TailRec extends MiniPhase {
456456

457457
case Return(expr, from) =>
458458
val fromSym = from.symbol
459-
val inTailPosition = fromSym.is(Label) && tailPositionLabeledSyms.contains(fromSym)
459+
val inTailPosition = !fromSym.is(Label) || tailPositionLabeledSyms.contains(fromSym)
460460
cpy.Return(tree)(transform(expr, inTailPosition), from)
461461

462462
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)