diff options
author | Martin Odersky <odersky@gmail.com> | 2015-09-12 11:38:00 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-09-12 12:36:57 +0200 |
commit | 5386c88b6e8d2f2ccf68e7d4e14b5fde6faf562f (patch) | |
tree | dd65496a2fae68a8efefd9e877c4c356ec2650a5 /src/dotty/tools/dotc/ast/Desugar.scala | |
parent | 6fc42dd9ea03e30f475e4eaec3e1bf95c35de0d0 (diff) | |
download | dotty-5386c88b6e8d2f2ccf68e7d4e14b5fde6faf562f.tar.gz dotty-5386c88b6e8d2f2ccf68e7d4e14b5fde6faf562f.tar.bz2 dotty-5386c88b6e8d2f2ccf68e7d4e14b5fde6faf562f.zip |
Fix desugaring problem
Desugaring worked incorrectly when both context bounds and default parameters were present.
Diffstat (limited to 'src/dotty/tools/dotc/ast/Desugar.scala')
-rw-r--r-- | src/dotty/tools/dotc/ast/Desugar.scala | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala index 30467f185..b834211ac 100644 --- a/src/dotty/tools/dotc/ast/Desugar.scala +++ b/src/dotty/tools/dotc/ast/Desugar.scala @@ -118,11 +118,11 @@ object desugar { * * Expand default arguments to default getters. E.g, * - * def f(x: Int = 1)(y: String = x + "m") = ... + * def f[T: B](x: Int = 1)(y: String = x + "m") = ... * ==> - * def f(x: Int)(y: String) = ... - * def f$default$1 = 1 - * def f$default$2(x: Int) = x + "m" + * def f[T](x: Int)(y: String)(implicit evidence$0: B[T]) = ... + * def f$default$1[T] = 1 + * def f$default$2[T](x: Int) = x + "m" */ def defDef(meth: DefDef, isPrimaryConstructor: Boolean = false)(implicit ctx: Context): Tree = { val DefDef(name, tparams, vparamss, tpt, rhs) = meth @@ -162,15 +162,20 @@ object desugar { Nil } - def normalizedVparamss = vparamss map (_ map (vparam => + def normalizedVparamss = meth1.vparamss map (_ map (vparam => cpy.ValDef(vparam)(rhs = EmptyTree))) + def dropContextBound(tparam: TypeDef) = tparam.rhs match { + case ContextBounds(tbounds, _) => cpy.TypeDef(tparam)(rhs = tbounds) + case _ => tparam + } + def defaultGetters(vparamss: List[List[ValDef]], n: Int): List[DefDef] = vparamss match { case (vparam :: vparams) :: vparamss1 => def defaultGetter: DefDef = DefDef( name = meth.name.defaultGetterName(n), - tparams = meth.tparams map toDefParam, + tparams = meth.tparams.map(tparam => dropContextBound(toDefParam(tparam))), vparamss = takeUpTo(normalizedVparamss, n), tpt = TypeTree(), rhs = vparam.rhs |