Skip to content

Commit 3a83512

Browse files
authored
Merge pull request #14744 from dotty-staging/revert-14067-backport
Revert "Allow return in tailrec position" #14067
2 parents d960a74 + 342849c commit 3a83512

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
@@ -277,11 +277,23 @@ class TailRec extends MiniPhase {
277277
def yesTailTransform(tree: Tree)(using Context): Tree =
278278
transform(tree, tailPosition = true)
279279

280+
/** If not in tail position a tree traversal may not be needed.
281+
*
282+
* A recursive call may still be in tail position if within the return
283+
* expression of a labeled block.
284+
* A tree traversal may also be needed to report a failure to transform
285+
* a recursive call of a @tailrec annotated method (i.e. `isMandatory`).
286+
*/
287+
private def isTraversalNeeded =
288+
isMandatory || tailPositionLabeledSyms.size > 0
289+
280290
def noTailTransform(tree: Tree)(using Context): Tree =
281-
transform(tree, tailPosition = false)
291+
if (isTraversalNeeded) transform(tree, tailPosition = false)
292+
else tree
282293

283294
def noTailTransforms[Tr <: Tree](trees: List[Tr])(using Context): List[Tr] =
284-
trees.mapConserve(noTailTransform).asInstanceOf[List[Tr]]
295+
if (isTraversalNeeded) trees.mapConserve(noTailTransform).asInstanceOf[List[Tr]]
296+
else trees
285297

286298
override def transform(tree: Tree)(using Context): Tree = {
287299
/* Rewrite an Apply to be considered for tail call transformation. */
@@ -432,7 +444,7 @@ class TailRec extends MiniPhase {
432444

433445
case Return(expr, from) =>
434446
val fromSym = from.symbol
435-
val inTailPosition = !fromSym.is(Label) || tailPositionLabeledSyms.contains(fromSym)
447+
val inTailPosition = fromSym.is(Label) && tailPositionLabeledSyms.contains(fromSym)
436448
cpy.Return(tree)(transform(expr, inTailPosition), from)
437449

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