From a34977551e9e13090e6b5201f7d91879464f991c Mon Sep 17 00:00:00 2001 From: Matt Bovel Date: Thu, 23 Dec 2021 12:56:18 +0100 Subject: [PATCH] Allow return in tailrec position --- .../src/dotty/tools/dotc/transform/TailRec.scala | 2 +- tests/run/tailrec-return.check | 2 ++ tests/run/tailrec-return.scala | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/run/tailrec-return.check create mode 100644 tests/run/tailrec-return.scala diff --git a/compiler/src/dotty/tools/dotc/transform/TailRec.scala b/compiler/src/dotty/tools/dotc/transform/TailRec.scala index 9330016f3292..eb239f00bcce 100644 --- a/compiler/src/dotty/tools/dotc/transform/TailRec.scala +++ b/compiler/src/dotty/tools/dotc/transform/TailRec.scala @@ -444,7 +444,7 @@ class TailRec extends MiniPhase { case Return(expr, from) => val fromSym = from.symbol - val inTailPosition = fromSym.is(Label) && tailPositionLabeledSyms.contains(fromSym) + val inTailPosition = !fromSym.is(Label) || tailPositionLabeledSyms.contains(fromSym) cpy.Return(tree)(transform(expr, inTailPosition), from) case _ => diff --git a/tests/run/tailrec-return.check b/tests/run/tailrec-return.check new file mode 100644 index 000000000000..6b81a566d1a7 --- /dev/null +++ b/tests/run/tailrec-return.check @@ -0,0 +1,2 @@ +6 +false diff --git a/tests/run/tailrec-return.scala b/tests/run/tailrec-return.scala new file mode 100644 index 000000000000..53b5ae73b82d --- /dev/null +++ b/tests/run/tailrec-return.scala @@ -0,0 +1,16 @@ +object Test: + + @annotation.tailrec + def sum(n: Int, acc: Int = 0): Int = + if n != 0 then return sum(n - 1, acc + n) + acc + + @annotation.tailrec + def isEven(n: Int): Boolean = + if n != 0 && n != 1 then return isEven(n - 2) + if n == 1 then return false + true + + def main(args: Array[String]): Unit = + println(sum(3)) + println(isEven(5))