Still giddy with the thrill of fixing #266, I vanquish another

pattern matcher bug from the dawn of time.  If you've always wanted
to write code like this:

  class Bob[K[_]] {
    def foo(other: Any) = other match {
      case x: (Bob[X] forSome { type X[_] })  =>
    }
  }

Now is your chance.  Closes #1427, review by moors.  (Is there
a better way to "shake off" the pattern existential?)

git-svn-id: http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk@23159 5e8d7ff9-d8ef-0310-90f0-a4852d11357a
This commit is contained in:
extempore 2010-09-30 20:53:04 +00:00
parent b6421898b4
commit d63a0e032d
2 changed files with 21 additions and 2 deletions

View File

@ -155,8 +155,12 @@ trait Matrix extends MatrixAdditions {
// XXX how will valsym.tpe differ from sym.tpe ?
def tpe = valsym.tpe
lazy val ident = ID(lhs)
lazy val valDef = tracing("typedVal", typer typedValDef (VAL(lhs) === rhs) setPos lhs.pos)
// See #1427 for an example of a crash which occurs unless we retype:
// in that instance there is an existential in the pattern.
lazy val ident = typer typed { ID(lhs) setType null }
lazy val valDef = typer typedValDef {
(VAL(lhs) withType ident.tpe) === rhs
}
override def toString() = "%s: %s = %s".format(lhs, lhs.info, rhs)
}

View File

@ -0,0 +1,15 @@
class Bob[K[_]] {
def foo(other: Any) = other match {
case x: (Bob[X] forSome { type X[_] }) => true
case _ => false
}
}
object Test {
def main(args: Array[String]): Unit = {
val x = new Bob[List]
val results = List(x, new Bob[Set], 55) map (x foo _)
assert(results == List(true, true, false))
}
}