summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpradel <pradel@epfl.ch>2008-04-07 07:04:55 +0000
committerpradel <pradel@epfl.ch>2008-04-07 07:04:55 +0000
commita197e61bc8068f97767a62f1bf5cf6b35ccfba86 (patch)
tree5eaeda1bd29859040f9fae9f7b25f546fd68102c /src
parentb6f12c08007eb558bffe6fd89a8aad3b2fab27f3 (diff)
downloadscala-a197e61bc8068f97767a62f1bf5cf6b35ccfba86.tar.gz
scala-a197e61bc8068f97767a62f1bf5cf6b35ccfba86.tar.bz2
scala-a197e61bc8068f97767a62f1bf5cf6b35ccfba86.zip
test and fix for #631
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
index 89b4b85cb0..dcb1ff70d9 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala
@@ -123,11 +123,12 @@ trait SyntheticMethods { self: Analyzer =>
/** The equality method for case classes and modules:
* def equals(that: Any) =
- * (this eq that) ||
+ * that.isInstanceOf[AnyRef] &&
+ * ((this eq that.asInstanceOf[AnyRef]) ||
* (that match {
* case this.C(this.arg_1, ..., this.arg_n) => true
* case _ => false
- * })
+ * }))
*/
def equalsMethod: Tree = {
val method = syntheticMethod(
@@ -173,11 +174,20 @@ trait SyntheticMethods { self: Analyzer =>
}
)
}
- Match(
- that,
- List(
- CaseDef(pat, guard, Literal(Constant(true))),
- CaseDef(Ident(nme.WILDCARD), EmptyTree, Literal(Constant(false)))))
+ val isAnyRef = TypeApply(
+ Select(that, Any_isInstanceOf),
+ List(TypeTree(AnyRefClass.tpe)))
+ val cast = TypeApply(
+ Select(that, Any_asInstanceOf),
+ List(TypeTree(AnyRefClass.tpe)))
+ val eq_ = Apply(Select( This(clazz) , nme.eq), List(that setType AnyRefClass.tpe))
+ val match_ = Match(that, List(
+ CaseDef(pat, guard, Literal(Constant(true))),
+ CaseDef(Ident(nme.WILDCARD), EmptyTree, Literal(Constant(false)))))
+ Apply(
+ Select(isAnyRef, Boolean_and),
+ List(Apply(Select(eq_, Boolean_or),
+ List(match_))))
}
}
)