diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2012-10-17 08:18:50 +0200 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2012-10-17 08:20:06 +0200 |
commit | 3440d1bdbda4746756fa2c905aa2cc41eadbe5cf (patch) | |
tree | 63259c1c1fc6935efc6eef6cfd7c5cb3daabf417 /src | |
parent | 25ad7876a97aafb7a33283843b05023e48cedc55 (diff) | |
download | scala-3440d1bdbda4746756fa2c905aa2cc41eadbe5cf.tar.gz scala-3440d1bdbda4746756fa2c905aa2cc41eadbe5cf.tar.bz2 scala-3440d1bdbda4746756fa2c905aa2cc41eadbe5cf.zip |
SI-6526 Tail call elimination should descend deeper.
It wasn't traversing into Select nodes nor into the receiver of
a tail call.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/TailCalls.scala | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/TailCalls.scala b/src/compiler/scala/tools/nsc/transform/TailCalls.scala index 0ad6d6c677..c8ea43269a 100644 --- a/src/compiler/scala/tools/nsc/transform/TailCalls.scala +++ b/src/compiler/scala/tools/nsc/transform/TailCalls.scala @@ -208,7 +208,7 @@ abstract class TailCalls extends Transform { debuglog("Cannot rewrite recursive call at: " + fun.pos + " because: " + reason) ctx.failReason = reason - treeCopy.Apply(tree, target, transformArgs) + treeCopy.Apply(tree, noTailTransform(target), transformArgs) } /** Position of failure is that of the tree being considered. */ @@ -220,7 +220,7 @@ abstract class TailCalls extends Transform { debuglog("Rewriting tail recursive call: " + fun.pos.lineContent.trim) accessed += ctx.label - typedPos(fun.pos)(Apply(Ident(ctx.label), recv :: transformArgs)) + typedPos(fun.pos)(Apply(Ident(ctx.label), noTailTransform(recv) :: transformArgs)) } if (!ctx.isEligible) fail("it is neither private nor final so can be overridden") @@ -361,7 +361,9 @@ abstract class TailCalls extends Transform { case Alternative(_) | Star(_) | Bind(_, _) => sys.error("We should've never gotten inside a pattern") - case EmptyTree | Super(_, _) | This(_) | Select(_, _) | Ident(_) | Literal(_) | Function(_, _) | TypeTree() => + case Select(qual, name) => + treeCopy.Select(tree, noTailTransform(qual), name) + case EmptyTree | Super(_, _) | This(_) | Ident(_) | Literal(_) | Function(_, _) | TypeTree() => tree case _ => super.transform(tree) |