Skip to content

Commit 5e67cd0

Browse files
committed
Properly handle while loops in Tailrec
A while loop condition or body is not in tail position.
1 parent 585fd48 commit 5e67cd0

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
@@ -377,6 +377,12 @@ class TailRec extends MiniPhase {
377377
noTailTransform(tree.finalizer)
378378
)
379379

380+
case tree @ WhileDo(cond, body) =>
381+
cpy.WhileDo(tree)(
382+
noTailTransform(cond),
383+
noTailTransform(body)
384+
)
385+
380386
case _: Alternative | _: Bind =>
381387
assert(false, "We should never have gotten inside a pattern")
382388
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)