From 1148daec9c6aeba69d5d37fde877ab20b310db5b Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Thu, 30 Sep 2010 20:53:04 +0000 Subject: 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?) --- src/compiler/scala/tools/nsc/matching/Matrix.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') 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) } -- cgit v1.2.3