diff options
author | Martin Odersky <odersky@gmail.com> | 2014-02-03 16:59:26 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-02-03 17:00:10 +0100 |
commit | 01fc1813929bfea3235bb0739131f675f57c7309 (patch) | |
tree | 4e4043e019551387b363f47971911706867330c5 /src/dotty/tools/dotc | |
parent | 4fab474454be9d2ac615ca39517a9f6c262bf187 (diff) | |
download | dotty-01fc1813929bfea3235bb0739131f675f57c7309.tar.gz dotty-01fc1813929bfea3235bb0739131f675f57c7309.tar.bz2 dotty-01fc1813929bfea3235bb0739131f675f57c7309.zip |
Fix problems with TypeVar instantiation
1) Simplify skipped one level over arguments of AndType/OrType.
2) variances needs to follow instantiated typevars
Diffstat (limited to 'src/dotty/tools/dotc')
-rw-r--r-- | src/dotty/tools/dotc/core/TypeComparer.scala | 13 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 6 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Typer.scala | 4 |
3 files changed, 13 insertions, 10 deletions
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala index 15a3d746d..9e6982847 100644 --- a/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/src/dotty/tools/dotc/core/TypeComparer.scala @@ -631,11 +631,14 @@ class TypeComparer(initctx: Context) extends DotClass { def comparePolyParam = { tp1 == tp2 || isSubTypeWhenFrozen(bounds(tp1).hi, tp2) || { - if (!frozenConstraint && - (tp2 isRef defn.NothingClass) && - ctx.typerState.isGlobalCommittable) - ctx.log(s"!!! instantiating to Nothing: $tp1") - if (isConstrained(tp1)) addConstraint(tp1, tp2, fromBelow = false) + if (isConstrained(tp1)) + addConstraint(tp1, tp2, fromBelow = false) && { + if ((!frozenConstraint) && + (tp2 isRef defn.NothingClass) && + ctx.typerState.isGlobalCommittable) + ctx.log(s"!!! instantiated to Nothing: $tp1, constraint = ${constraint.show}") + true + } else (ctx.mode is Mode.TypevarsMissContext) || thirdTry(tp1, tp2) } } diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala index 71e38fb8c..2a6a5017f 100644 --- a/src/dotty/tools/dotc/core/Types.scala +++ b/src/dotty/tools/dotc/core/Types.scala @@ -828,7 +828,7 @@ object Types { def variances(include: TypeVar => Boolean)(implicit ctx: Context): VarianceMap = track("variances") { val accu = new TypeAccumulator[VarianceMap] { def apply(vmap: VarianceMap, t: Type): VarianceMap = t match { - case t: TypeVar if include(t) => + case t: TypeVar if !t.isInstantiated && include(t) => val v = vmap(t) if (v == null) vmap.updated(t, variance) else if (v == variance) vmap @@ -852,9 +852,9 @@ object Types { class Simplify extends TypeMap { def apply(tp: Type): Type = tp match { case AndType(l, r) => - mapOver(l) & mapOver(r) + this(l) & this(r) case OrType(l, r) => - mapOver(l) | mapOver(r) + this(l) | this(r) case tp: PolyParam => ctx.typerState.constraint.typeVarOfParam(tp) orElse tp case _ => diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala index 8498e5e54..a814aa469 100644 --- a/src/dotty/tools/dotc/typer/Typer.scala +++ b/src/dotty/tools/dotc/typer/Typer.scala @@ -1225,8 +1225,8 @@ class Typer extends Namer with Applications with Implicits { if (tree.tpe <:< pt) tree else if (ctx.mode is Mode.Pattern) tree // no subtype check for pattern else { - typr.println(s"adapt to subtype ${tree.tpe} !<:< $pt") - typr.println(TypeComparer.explained(implicit ctx => tree.tpe <:< pt)) + typr.println(s"adapt to subtype ${tree.tpe.show} !<:< ${pt.show}") + //typr.println(TypeComparer.explained(implicit ctx => tree.tpe <:< pt)) adaptToSubType(wtp) } } |