aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Typer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-04-07 17:58:52 +0200
committerMartin Odersky <odersky@gmail.com>2016-04-07 17:59:27 +0200
commit03e8c54c0165d129b12bdde29b2482dd1758e418 (patch)
treeddca733ac77e4c19a4465788c54302bdccb9e7e9 /src/dotty/tools/dotc/typer/Typer.scala
parent306d422f1e3017731d1f9266f9d445e77ea73105 (diff)
downloaddotty-03e8c54c0165d129b12bdde29b2482dd1758e418.tar.gz
dotty-03e8c54c0165d129b12bdde29b2482dd1758e418.tar.bz2
dotty-03e8c54c0165d129b12bdde29b2482dd1758e418.zip
Treat type parameters of secondary constructors as aliases
... of class parameters using the gadt mechanism. Previously they were encoded as aliases by hardcoding alias bounds in the type parameter declaration, but that then leads to weird behavior and failures in unpickling. To make this work, we also need to propagate gadt bounds into the this-call context. Test case in pickling/i1202a.scala.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Typer.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 3d36905f2..10d7516e6 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -1022,17 +1022,20 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
val DefDef(name, tparams, vparamss, tpt, _) = ddef
completeAnnotations(ddef, sym)
val tparams1 = tparams mapconserve (typed(_).asInstanceOf[TypeDef])
- // for secondary constructors we need to use that their type parameters
- // are aliases of the class type parameters. See pos/i941.scala
- if (sym.isConstructor && !sym.isPrimaryConstructor)
- (sym.owner.typeParams, tparams1).zipped.foreach {(tparam, tdef) =>
- tdef.symbol.info = TypeAlias(tparam.typeRef)
- }
-
val vparamss1 = vparamss nestedMapconserve (typed(_).asInstanceOf[ValDef])
if (sym is Implicit) checkImplicitParamsNotSingletons(vparamss1)
val tpt1 = checkSimpleKinded(typedType(tpt))
- val rhs1 = typedExpr(ddef.rhs, tpt1.tpe)
+
+ var rhsCtx = ctx
+ if (sym.isConstructor && !sym.isPrimaryConstructor && tparams1.nonEmpty) {
+ // for secondary constructors we need a context that "knows"
+ // that their type parameters are aliases of the class type parameters.
+ // See pos/i941.scala
+ rhsCtx = ctx.fresh.setFreshGADTBounds
+ (tparams1, sym.owner.typeParams).zipped.foreach ((tdef, tparam) =>
+ rhsCtx.gadt.setBounds(tdef.symbol, TypeAlias(tparam.typeRef)))
+ }
+ val rhs1 = typedExpr(ddef.rhs, tpt1.tpe)(rhsCtx)
assignType(cpy.DefDef(ddef)(name, tparams1, vparamss1, tpt1, rhs1), sym)
//todo: make sure dependent method types do not depend on implicits or by-name params
}