summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-09-28 15:42:35 +0000
committerPaul Phillips <paulp@improving.org>2010-09-28 15:42:35 +0000
commitfda537c771e16655e268e5c006f2dead25aeda30 (patch)
tree11d2c13fdf9982202558e8ce071b052433e80dd5
parent19b42dea4538d20b696de4bdb0b01e7fdef2dd36 (diff)
downloadscala-fda537c771e16655e268e5c006f2dead25aeda30.tar.gz
scala-fda537c771e16655e268e5c006f2dead25aeda30.tar.bz2
scala-fda537c771e16655e268e5c006f2dead25aeda30.zip
Refined crash avoidance related to self type te...
Refined crash avoidance related to self type tests in anonymous classes as introduced for #576. Now it really only excludes anonymous classes. Suddenly, this works: override def equals(other: Any) = other match { case _: this.type => true case _ => false } Who will be the first to roll out some reference equality in the this.type style? No review.
-rw-r--r--src/compiler/scala/tools/nsc/matching/ParallelMatching.scala4
-rw-r--r--test/files/run/bug576-regress.scala17
2 files changed, 19 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/ParallelMatching.scala b/src/compiler/scala/tools/nsc/matching/ParallelMatching.scala
index fb9dffeb66..eb3774b0b5 100644
--- a/src/compiler/scala/tools/nsc/matching/ParallelMatching.scala
+++ b/src/compiler/scala/tools/nsc/matching/ParallelMatching.scala
@@ -616,7 +616,7 @@ trait ParallelMatching extends ast.TreeDSL
// temporary checks so we're less crashy while we determine what to implement.
def checkErroneous(scrut: Scrutinee): Type = {
scrut.tpe match {
- case tpe @ ThisType(_) if tpe.termSymbol == NoSymbol =>
+ case ThisType(clazz) if clazz.isAnonymousClass =>
cunit.error(scrut.pos, "self type test in anonymous class forbidden by implementation.")
ErrorType
case x => x
@@ -628,7 +628,7 @@ trait ParallelMatching extends ast.TreeDSL
j -> (moreSpecific :: subsumed)
lazy val casted = scrut castedTo pmatch.headType
- lazy val cond = condition(checkErroneous(casted), scrut, head.boundVariables.nonEmpty)
+ lazy val cond = condition(checkErroneous(casted).tpe, scrut, head.boundVariables.nonEmpty)
private def isAnyMoreSpecific = yeses exists (x => !x.moreSpecific.isEmpty)
lazy val (subtests, subtestVars) =
diff --git a/test/files/run/bug576-regress.scala b/test/files/run/bug576-regress.scala
new file mode 100644
index 0000000000..b608dd5a42
--- /dev/null
+++ b/test/files/run/bug576-regress.scala
@@ -0,0 +1,17 @@
+class A {
+ override def equals(other: Any) = other match {
+ case _: this.type => true
+ case _ => false
+ }
+}
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ val x1 = new A
+ val x2 = new A
+ assert(x1 == x1)
+ assert(x1 != x2)
+ assert(x1 != ())
+ assert(x2 != x1)
+ }
+} \ No newline at end of file