aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/core/TypeComparer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-03-18 17:21:46 +0100
committerMartin Odersky <odersky@gmail.com>2017-04-06 13:15:28 +0200
commit8b1340b9b73d319ef7ac8f7f3bdaa75943de277e (patch)
tree36a60cc7d5f05289e39b17059355144e4e718ed3 /compiler/src/dotty/tools/dotc/core/TypeComparer.scala
parente4d499945b93f95bbff7e9fe71aeffc9af4fc8bd (diff)
downloaddotty-8b1340b9b73d319ef7ac8f7f3bdaa75943de277e.tar.gz
dotty-8b1340b9b73d319ef7ac8f7f3bdaa75943de277e.tar.bz2
dotty-8b1340b9b73d319ef7ac8f7f3bdaa75943de277e.zip
Generalize comparisons from PolyTypes to TypeLambdas
Diffstat (limited to 'compiler/src/dotty/tools/dotc/core/TypeComparer.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/core/TypeComparer.scala14
1 files changed, 7 insertions, 7 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala
index 7698986d5..597b28088 100644
--- a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -428,9 +428,9 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
compareRec
case tp2 @ HKApply(tycon2, args2) =>
compareHkApply2(tp1, tp2, tycon2, args2)
- case tp2 @ PolyType(tparams2, body2) =>/*###*/
- def compareHkLambda: Boolean = tp1.stripTypeVar match {
- case tp1 @ PolyType(tparams1, body1) =>/*###*/
+ case tp2: TypeLambda =>
+ def compareTypeLambda: Boolean = tp1.stripTypeVar match {
+ case tp1: TypeLambda if tp1.isInstanceOf[PolyType] == tp2.isInstanceOf[PolyType] =>
/* Don't compare bounds of lambdas under language:Scala2, or t2994 will fail
* The issue is that, logically, bounds should compare contravariantly,
* but that would invalidate a pattern exploited in t2994:
@@ -446,15 +446,15 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
*/
def boundsOK =
ctx.scala2Mode ||
- tparams1.corresponds(tparams2)((tparam1, tparam2) =>
+ tp1.typeParams.corresponds(tp2.typeParams)((tparam1, tparam2) =>
isSubType(tparam2.paramInfo.subst(tp2, tp1), tparam1.paramInfo))
val saved = comparedTypeLambdas
comparedTypeLambdas += tp1
comparedTypeLambdas += tp2
try
- variancesConform(tparams1, tparams2) &&
+ variancesConform(tp1.typeParams, tp2.typeParams) &&
boundsOK &&
- isSubType(body1, body2.subst(tp2, tp1))
+ isSubType(tp1.resType, tp2.resType.subst(tp2, tp1))
finally comparedTypeLambdas = saved
case _ =>
if (!tp1.isHK) {
@@ -466,7 +466,7 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
}
fourthTry(tp1, tp2)
}
- compareHkLambda
+ compareTypeLambda
case OrType(tp21, tp22) =>
// Rewrite T1 <: (T211 & T212) | T22 to T1 <: (T211 | T22) and T1 <: (T212 | T22)
// and analogously for T1 <: T21 | (T221 & T222)