aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-12-22 11:01:52 +0100
committerMartin Odersky <odersky@gmail.com>2014-12-22 11:01:52 +0100
commit9d8e473739ed4f5618d55738475717872453018a (patch)
tree055b8ae728fea6c7a499b0b111a567665b4246a3
parent7c40b03aa9210dc1989cc08c0f03f7d4dd4e9e47 (diff)
downloaddotty-9d8e473739ed4f5618d55738475717872453018a.tar.gz
dotty-9d8e473739ed4f5618d55738475717872453018a.tar.bz2
dotty-9d8e473739ed4f5618d55738475717872453018a.zip
Handle subtyping cases involving null.
Cases handled are: Null <: (A & B) { ... } Null <: (A | B) { ... }
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index cae4500e4..7eb1af127 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -661,11 +661,11 @@ class TypeComparer(initctx: Context) extends DotClass {
}
compareNamed
case tp2 @ RefinedType(parent2, name2) =>
- def qualifies(m: SingleDenotation) = isSubType(m.info, tp2.refinedInfo)
- def memberMatches(mbr: Denotation): Boolean = mbr match { // inlined hasAltWith for performance
- case mbr: SingleDenotation => qualifies(mbr)
- case _ => mbr hasAltWith qualifies
- }
+ def qualifies(m: SingleDenotation) = isSubType(m.info, tp2.refinedInfo)
+ def memberMatches(mbr: Denotation): Boolean = mbr match { // inlined hasAltWith for performance
+ case mbr: SingleDenotation => qualifies(mbr)
+ case _ => mbr hasAltWith qualifies
+ }
def compareRefinedSlow: Boolean = {
def hasMatchingMember(name: Name): Boolean = /*>|>*/ ctx.traceIndented(s"hasMatchingMember($name) ${tp1.member(name).info.show}", subtyping) /*<|<*/ {
val tp1r = rebaseQual(tp1, name)
@@ -786,7 +786,9 @@ class TypeComparer(initctx: Context) extends DotClass {
def isNullable(tp: Type): Boolean = tp.dealias match {
case tp: TypeRef => tp.symbol.isNullableClass
case RefinedType(parent, _) => isNullable(parent)
- case _ => false
+ case AndType(tp1, tp2) => isNullable(tp1) && isNullable(tp2)
+ case OrType(tp1, tp2) => isNullable(tp1) || isNullable(tp2)
+ case _ => println(i"$tp of class ${tp.getClass} is not nullable"); false
}
(tp1.symbol eq NothingClass) && tp2.isInstanceOf[ValueType] ||
(tp1.symbol eq NullClass) && isNullable(tp2)