summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-09-30 20:53:04 +0000
committerPaul Phillips <paulp@improving.org>2010-09-30 20:53:04 +0000
commit1148daec9c6aeba69d5d37fde877ab20b310db5b (patch)
tree0e5293ca55a211083c46ad644faf5fe56334bab4 /src
parentd3c453d15c318c7c8da73d6a2ea2ae59a14da196 (diff)
downloadscala-1148daec9c6aeba69d5d37fde877ab20b310db5b.tar.gz
scala-1148daec9c6aeba69d5d37fde877ab20b310db5b.tar.bz2
scala-1148daec9c6aeba69d5d37fde877ab20b310db5b.zip
Still giddy with the thrill of fixing #266, I v...
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?)
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/matching/Matrix.scala8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/Matrix.scala b/src/compiler/scala/tools/nsc/matching/Matrix.scala
index 2c9d974d61..0bd9caf506 100644
--- a/src/compiler/scala/tools/nsc/matching/Matrix.scala
+++ b/src/compiler/scala/tools/nsc/matching/Matrix.scala
@@ -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)
}