aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-02-03 16:59:26 +0100
committerMartin Odersky <odersky@gmail.com>2014-02-03 17:00:10 +0100
commit01fc1813929bfea3235bb0739131f675f57c7309 (patch)
tree4e4043e019551387b363f47971911706867330c5 /src/dotty/tools
parent4fab474454be9d2ac615ca39517a9f6c262bf187 (diff)
downloaddotty-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')
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala13
-rw-r--r--src/dotty/tools/dotc/core/Types.scala6
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala4
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)
}
}