summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-11-05 10:58:42 +0100
committerJason Zaugg <jzaugg@gmail.com>2014-01-31 22:12:27 +0100
commiteb2627c4d282b5e4727e7e67fc7656409119cc96 (patch)
tree18a8dacca342ea3391d7b6a34a3f6bc39519f09d
parenta6f2704619a1f724693b456dadcb1836e2f71328 (diff)
downloadscala-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.scala7
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")