diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/Matrix.scala | 8 | ||||
-rw-r--r-- | test/files/run/bug1427.scala | 15 |
2 files changed, 21 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) } diff --git a/test/files/run/bug1427.scala b/test/files/run/bug1427.scala new file mode 100644 index 0000000000..ab0a42c7b7 --- /dev/null +++ b/test/files/run/bug1427.scala @@ -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)) + } +} |