Aladdin - Scala Bugtracking
[#1159] project: compiler priority: low category: bug
submitter assigned to status date submitted
Martin Burak moved to trac 2007-05-31 16:15:34.0
subject pattern matching does not wlways check outer
code
class Outer {
  case class Foo(x: int, y: int) {
    override def equals(other: Any) = other match {
      case Outer.this.Foo(`x`, `y`) => true
      case _ => false
    }
  }
}

object Test extends Application {
  val o1 = new Outer
  val o2 = new Outer
  val x: Any = o1.Foo(1, 2)
  val y: Any = o2.Foo(1, 2)
  println(x equals y)
  x match {
    case o2.Foo(x, y) => println("error 1")
    case o1.Foo(x, y) => println("OK")
    case _ => println("error 2")
  }
}
what happened
true
OK
what expected
false
OK
The example shows that outers are tested in the second match, but not in the first one (i.e. in the equality method of class Foo).
[back to overview]
Changes of this bug report
Martin  edited on  2007-05-31 16:19:52.0
When fixing this, it's tricky not too insert too many outer tests. For instance, if `other' in `equals' had type `Outer.this.Foo' instead of `Any', there should be no outer test, because we know statically that the outer pointers must be the same (if not, the types would not work out).
Gilles  edited on  2007-08-29 09:52:52.0