aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/TypeComparer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-10-23 22:16:40 +0200
committerMartin Odersky <odersky@gmail.com>2013-10-23 22:16:40 +0200
commit8a41f33a44693fa777a59fcb8b06c1fb8414fdf5 (patch)
tree9af50765c4d89380d7f70da1796e184332c5e911 /src/dotty/tools/dotc/core/TypeComparer.scala
parent6d70392b11a658bdcbc4a21898370ca58c707c44 (diff)
downloaddotty-8a41f33a44693fa777a59fcb8b06c1fb8414fdf5.tar.gz
dotty-8a41f33a44693fa777a59fcb8b06c1fb8414fdf5.tar.bz2
dotty-8a41f33a44693fa777a59fcb8b06c1fb8414fdf5.zip
Added missing case matching against hk type in refinement.
Diffstat (limited to 'src/dotty/tools/dotc/core/TypeComparer.scala')
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index 727b18e77..b7027023d 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -2,7 +2,7 @@ package dotty.tools
package dotc
package core
-import Types._, Contexts._, Symbols._, Flags._, Names._
+import Types._, Contexts._, Symbols._, Flags._, Names._, NameOps._
import Decorators.sourcePos
import StdNames.{nme, tpnme}
import collection.mutable
@@ -256,9 +256,17 @@ class TypeComparer(initctx: Context) extends DotClass {
// optimized case; all info on t1.name2 is in refinement tp1.refinedInfo.
isSubType(tp1, parent2) && isSubType(tp1.refinedInfo, tp2.refinedInfo)
case _ =>
+ def hasMatchingMember(name: Name): Boolean = traceIndented(s"hasMatchingMember($name)") {
+ tp1.member(name).hasAltWith(alt => isSubType(alt.info, tp2.refinedInfo)) ||
+ name.isHkParamName && {
+ val idx = name.hkParamIndex
+ val tparams = tp1.typeParams
+ idx < tparams.length && hasMatchingMember(tparams(idx).name)
+ }
+ }
isSubType(tp1, parent2) && (
name2 == nme.WILDCARD
- || tp1.member(name2).hasAltWith(alt => isSubType(alt.info, tp2.refinedInfo))
+ || hasMatchingMember(name2)
|| fourthTry(tp1, tp2))
}
case AndType(tp21, tp22) =>