diff options
author | Martin Odersky <odersky@gmail.com> | 2014-12-22 11:01:52 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-12-22 11:01:52 +0100 |
commit | 9d8e473739ed4f5618d55738475717872453018a (patch) | |
tree | 055b8ae728fea6c7a499b0b111a567665b4246a3 | |
parent | 7c40b03aa9210dc1989cc08c0f03f7d4dd4e9e47 (diff) | |
download | dotty-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.scala | 14 |
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) |