summaryrefslogtreecommitdiff
path: root/test/files/run
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2014-01-28 17:19:49 -0800
committerAdriaan Moors <adriaan.moors@typesafe.com>2014-02-18 20:36:54 -0800
commit971358bf0a90d7bbb6af7cc34eb282e9ade66460 (patch)
treee59545c508bf2c46c61dd226abd54ddc1b531833 /test/files/run
parent3dbcb1b9d4daa5cba98747bbc66f898ba0f864fd (diff)
downloadscala-971358bf0a90d7bbb6af7cc34eb282e9ade66460.tar.gz
scala-971358bf0a90d7bbb6af7cc34eb282e9ade66460.tar.bz2
scala-971358bf0a90d7bbb6af7cc34eb282e9ade66460.zip
SI-4577 singleton type pattern test should use `eq`, not `==`
I find it hard to imagine anyone is relying on `case x: foo.type =>` erroneously being compiled to `foo == x` instead of the spec'ed `foo eq x`, so let's finally fix this.
Diffstat (limited to 'test/files/run')
-rw-r--r--test/files/run/t4577.scala38
1 files changed, 38 insertions, 0 deletions
diff --git a/test/files/run/t4577.scala b/test/files/run/t4577.scala
new file mode 100644
index 0000000000..b08100d3ea
--- /dev/null
+++ b/test/files/run/t4577.scala
@@ -0,0 +1,38 @@
+object Test {
+ val bippy = new Symbol("bippy")
+ val imposter = new Symbol("bippy")
+ val notBippy = new Symbol("not-bippy")
+ val syms = List(bippy, imposter, notBippy)
+
+ // the equals method should only be used for case `bippy`,
+ // for the singleton type pattern, case _: bippy.type, the spec mandates `bippy eq _` as the test
+ class Symbol(val name: String) {
+ override def equals(other: Any) = other match {
+ case x: Symbol => name == x.name
+ case _ => false
+ }
+ override def toString = name
+ }
+
+ // TODO: test bytecode equality for f and fDirect (and g and gDirect),
+ // for now the optimizer doesn't quite get from `f` to `fDirect`
+ def f(s: Symbol) = s match {
+ case _: bippy.type => true
+ case _ => false
+ }
+ def fDirect(s: Symbol) = bippy eq s
+
+ def g(s: Symbol) = s match {
+ case _: bippy.type => 1
+ case `bippy` => 2
+ case _ => 3
+ }
+ def gDirect(s: Symbol) = if (bippy eq s) 1 else if (bippy == s) 2 else 3
+
+ def main(args: Array[String]): Unit = {
+ // `syms map f` should be: true false false
+ assert(syms forall (s => f(s) == fDirect(s)))
+ // `syms map g` should be: 1 2 3
+ assert(syms forall (s => g(s) == gDirect(s)))
+ }
+} \ No newline at end of file