aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/TypeComparer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-07-19 17:05:16 +0200
committerMartin Odersky <odersky@gmail.com>2013-07-19 17:05:16 +0200
commit702c4fc89f3ff2abbc7457fd72ab19b5bbdbb782 (patch)
tree9e36761227f5290b742e30072a728950f68e2aa4 /src/dotty/tools/dotc/core/TypeComparer.scala
parentea640a32264cb78efbf267d5c2be89e3e99dcccf (diff)
downloaddotty-702c4fc89f3ff2abbc7457fd72ab19b5bbdbb782.tar.gz
dotty-702c4fc89f3ff2abbc7457fd72ab19b5bbdbb782.tar.bz2
dotty-702c4fc89f3ff2abbc7457fd72ab19b5bbdbb782.zip
Handling bounded wildcard types.
Diffstat (limited to 'src/dotty/tools/dotc/core/TypeComparer.scala')
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index 479793326..ecd8ec0c4 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -123,30 +123,40 @@ class TypeComparer(implicit val ctx: Context) extends DotClass {
case _ =>
secondTry(tp1, tp2)
}
- case WildcardType | ErrorType =>
- true
- case tp2: TypeVar =>
- firstTry(tp1, tp2.thisInstance)
case tp2: PolyParam =>
constraint(tp2) match {
case TypeBounds(lo, _) => isSubType(tp1, lo) || addConstraint(tp2, TypeBounds.lower(tp1))
case _ => secondTry(tp1, tp2)
}
+ case tp2: TypeVar =>
+ firstTry(tp1, tp2.thisInstance)
+ case tp2: WildcardType =>
+ tp2.optBounds match {
+ case TypeBounds(_, hi) => isSubType(tp1, hi)
+ case NoType => true
+ }
+ case ErrorType =>
+ true
case _ =>
secondTry(tp1, tp2)
}
}
def secondTry(tp1: Type, tp2: Type): Boolean = tp1 match {
- case WildcardType | ErrorType =>
- true
- case tp1: TypeVar =>
- secondTry(tp1.thisInstance, tp2)
case tp1: PolyParam =>
constraint(tp1) match {
case TypeBounds(_, hi) => isSubType(hi, tp2) || addConstraint(tp1, TypeBounds.upper(tp2))
case _ => thirdTry(tp1, tp2)
}
+ case tp1: TypeVar =>
+ secondTry(tp1.thisInstance, tp2)
+ case tp1: WildcardType =>
+ tp1.optBounds match {
+ case TypeBounds(lo, _) => isSubType(lo, tp2)
+ case _ => true
+ }
+ case ErrorType =>
+ true
case _ =>
thirdTry(tp1, tp2)
}