diff options
author | pradel <pradel@epfl.ch> | 2008-04-07 07:04:55 +0000 |
---|---|---|
committer | pradel <pradel@epfl.ch> | 2008-04-07 07:04:55 +0000 |
commit | a197e61bc8068f97767a62f1bf5cf6b35ccfba86 (patch) | |
tree | 5eaeda1bd29859040f9fae9f7b25f546fd68102c /src | |
parent | b6f12c08007eb558bffe6fd89a8aad3b2fab27f3 (diff) | |
download | scala-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.scala | 24 |
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_)))) } } ) |