aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2016-10-23 14:33:29 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2016-10-23 14:33:29 +0200
commitbcb652bc562caadc828ad42236c6d267481fd751 (patch)
tree30a55cf4f23a81b6363ed09481ba6fbcc31114ca /src/dotty/tools/dotc/transform
parentcdb83f92f107b87f709f10cdeca3f60e8296acac (diff)
downloaddotty-bcb652bc562caadc828ad42236c6d267481fd751.tar.gz
dotty-bcb652bc562caadc828ad42236c6d267481fd751.tar.bz2
dotty-bcb652bc562caadc828ad42236c6d267481fd751.zip
Fix #1614: correctly handle polymorphic inner methods
Even if outer class & method isn't polymorpnic, inner method might be. Need to handle this correctly.
Diffstat (limited to 'src/dotty/tools/dotc/transform')
-rw-r--r--src/dotty/tools/dotc/transform/TailRec.scala6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/transform/TailRec.scala b/src/dotty/tools/dotc/transform/TailRec.scala
index d99a48af3..fde4db811 100644
--- a/src/dotty/tools/dotc/transform/TailRec.scala
+++ b/src/dotty/tools/dotc/transform/TailRec.scala
@@ -143,7 +143,11 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
newOwners = label :: Nil
).transform(rhsSemiTransformed)
})
- Block(List(labelDef), ref(label).appliedToArgss(vparamss0.map(_.map(x=> ref(x.symbol)))))
+ val callIntoLabel = (
+ if (dd.tparams.isEmpty) ref(label)
+ else ref(label).appliedToTypes(dd.tparams.map(_.tpe))
+ ).appliedToArgss(vparamss0.map(_.map(x=> ref(x.symbol))))
+ Block(List(labelDef), callIntoLabel)
}} else {
if (mandatory) ctx.error(
"TailRec optimisation not applicable, method not tail recursive",