Skip to content

Commit ab885bf

Browse files
authored
Merge pull request #14736 from dotty-staging/revert-14067
Revert "Allow return in tailrec position" #14067
2 parents b5f34a5 + 9c04cfe commit ab885bf

File tree

3 files changed

+15
-76
lines changed

3 files changed

+15
-76
lines changed

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

+15-3
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,23 @@ class TailRec extends MiniPhase {
286286
def yesTailTransform(tree: Tree)(using Context): Tree =
287287
transform(tree, tailPosition = true)
288288

289+
/** If not in tail position a tree traversal may not be needed.
290+
*
291+
* A recursive call may still be in tail position if within the return
292+
* expression of a labeled block.
293+
* A tree traversal may also be needed to report a failure to transform
294+
* a recursive call of a @tailrec annotated method (i.e. `isMandatory`).
295+
*/
296+
private def isTraversalNeeded =
297+
isMandatory || tailPositionLabeledSyms.size > 0
298+
289299
def noTailTransform(tree: Tree)(using Context): Tree =
290-
transform(tree, tailPosition = false)
300+
if (isTraversalNeeded) transform(tree, tailPosition = false)
301+
else tree
291302

292303
def noTailTransforms[Tr <: Tree](trees: List[Tr])(using Context): List[Tr] =
293-
trees.mapConserve(noTailTransform).asInstanceOf[List[Tr]]
304+
if (isTraversalNeeded) trees.mapConserve(noTailTransform).asInstanceOf[List[Tr]]
305+
else trees
294306

295307
override def transform(tree: Tree)(using Context): Tree = {
296308
/* Rewrite an Apply to be considered for tail call transformation. */
@@ -441,7 +453,7 @@ class TailRec extends MiniPhase {
441453

442454
case Return(expr, from) =>
443455
val fromSym = from.symbol
444-
val inTailPosition = !fromSym.is(Label) || tailPositionLabeledSyms.contains(fromSym)
456+
val inTailPosition = fromSym.is(Label) && tailPositionLabeledSyms.contains(fromSym)
445457
cpy.Return(tree)(transform(expr, inTailPosition), from)
446458

447459
case _ =>

tests/run/tailrec-return.check

-7
This file was deleted.

tests/run/tailrec-return.scala

-66
This file was deleted.

0 commit comments

Comments
 (0)