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:
parent
b6421898b4
commit
d63a0e032d
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue