diff options
author | Martin Odersky <odersky@gmail.com> | 2013-10-23 22:16:40 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-10-23 22:16:40 +0200 |
commit | 8a41f33a44693fa777a59fcb8b06c1fb8414fdf5 (patch) | |
tree | 9af50765c4d89380d7f70da1796e184332c5e911 /src/dotty/tools/dotc/core/TypeComparer.scala | |
parent | 6d70392b11a658bdcbc4a21898370ca58c707c44 (diff) | |
download | dotty-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.scala | 12 |
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) => |