Skip to content

Commit b5aa65a

Browse files
committed
Properly handle while loops in Tailrec
A while loop condition or body is not in tail position.
1 parent 57ee4fa commit b5aa65a

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,12 @@ class TailRec extends MiniPhase {
373373
noTailTransform(tree.finalizer)
374374
)
375375

376+
case tree @ WhileDo(cond, body) =>
377+
cpy.WhileDo(tree)(
378+
noTailTransform(cond),
379+
noTailTransform(body)
380+
)
381+
376382
case _: Alternative | _: Bind =>
377383
assert(false, "We should never have gotten inside a pattern")
378384
tree

tests/neg-tailcall/while-loops.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import annotation.tailrec
2+
3+
object WhileLoops {
4+
def cond: Boolean = ???
5+
6+
@tailrec def rec1: Unit = { // error: tailrec not applicable
7+
while (cond) {
8+
rec1 // error: not in tail position
9+
}
10+
}
11+
12+
@tailrec def rec2: Boolean = { // error: tailrec not applicable
13+
while (rec2) { } // error: not in tail position
14+
true
15+
}
16+
}

0 commit comments

Comments
 (0)