diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2016-10-23 14:33:29 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2016-10-23 14:33:29 +0200 |
commit | bcb652bc562caadc828ad42236c6d267481fd751 (patch) | |
tree | 30a55cf4f23a81b6363ed09481ba6fbcc31114ca /src/dotty/tools/dotc/transform | |
parent | cdb83f92f107b87f709f10cdeca3f60e8296acac (diff) | |
download | dotty-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.scala | 6 |
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", |