diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-11-05 10:58:42 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-01-31 22:12:27 +0100 |
commit | eb2627c4d282b5e4727e7e67fc7656409119cc96 (patch) | |
tree | 18a8dacca342ea3391d7b6a34a3f6bc39519f09d | |
parent | a6f2704619a1f724693b456dadcb1836e2f71328 (diff) | |
download | scala-eb2627c4d282b5e4727e7e67fc7656409119cc96.tar.gz scala-eb2627c4d282b5e4727e7e67fc7656409119cc96.tar.bz2 scala-eb2627c4d282b5e4727e7e67fc7656409119cc96.zip |
Don't try to eliminate tail calls in constructors.
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/TailCalls.scala | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/TailCalls.scala b/src/compiler/scala/tools/nsc/transform/TailCalls.scala index b471d16ddd..cf38390e37 100644 --- a/src/compiler/scala/tools/nsc/transform/TailCalls.scala +++ b/src/compiler/scala/tools/nsc/transform/TailCalls.scala @@ -245,6 +245,11 @@ abstract class TailCalls extends Transform { else if (!receiverIsSame) failHere("it changes type of 'this' on a polymorphic recursive call") else rewriteTailCall(receiver) } + + def isEligible(tree: DefDef) = { + val sym = tree.symbol + !(sym.hasAccessorFlag || sym.isConstructor) + } tree match { case ValDef(_, _, _, _) => @@ -253,7 +258,7 @@ abstract class TailCalls extends Transform { super.transform(tree) - case dd @ DefDef(_, name, _, vparamss0, _, rhs0) if !dd.symbol.hasAccessorFlag => + case dd @ DefDef(_, name, _, vparamss0, _, rhs0) if isEligible(dd) => val newCtx = new DefDefTailContext(dd) if (newCtx.isMandatory && !(newCtx containsRecursiveCall rhs0)) unit.error(tree.pos, "@tailrec annotated method contains no recursive calls") |