diff options
author | Paul Phillips <paulp@improving.org> | 2012-04-10 06:30:08 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-04-10 06:42:45 -0700 |
commit | 00e9446bfca132bf6ec89b9d75a2b90ad5ea098d (patch) | |
tree | 12cae02ad348ce037cd25feeb95c372856356062 | |
parent | bed400c5a8d4fc5f5ee4b270f757cdfae94c3f6a (diff) | |
download | scala-00e9446bfca132bf6ec89b9d75a2b90ad5ea098d.tar.gz scala-00e9446bfca132bf6ec89b9d75a2b90ad5ea098d.tar.bz2 scala-00e9446bfca132bf6ec89b9d75a2b90ad5ea098d.zip |
Fix for SI-5648.
More care in warning about bad comparisons.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 11 | ||||
-rw-r--r-- | test/files/run/t5648.check | 4 | ||||
-rw-r--r-- | test/files/run/t5648.flags | 1 | ||||
-rw-r--r-- | test/files/run/t5648.scala | 10 |
4 files changed, 24 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index 68a722aab4..806ee480f0 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -1053,10 +1053,17 @@ abstract class RefChecks extends InfoTransform with reflect.internal.transform.R /** Symbols which limit the warnings we can issue since they may be value types */ val isMaybeValue = Set(AnyClass, AnyRefClass, AnyValClass, ObjectClass, ComparableClass, JavaSerializableClass) - // Whether def equals(other: Any) is overridden or synthetic + // Whether def equals(other: Any) has known behavior: it is the default + // inherited from java.lang.Object, or it is a synthetically generated + // case equals. TODO - more cases are warnable if the target is a synthetic + // equals. def isUsingWarnableEquals = { val m = receiver.info.member(nme.equals_) - (m == Object_equals) || (m == Any_equals) || (m.isSynthetic && m.owner.isCase) + def n = actual.info.member(nme.equals_) + ( (m == Object_equals) + || (m == Any_equals) + || (m.isSynthetic && m.owner.isCase && !n.owner.isCase) + ) } // Whether this == or != is one of those defined in Any/AnyRef or an overload from elsewhere. def isUsingDefaultScalaOp = { diff --git a/test/files/run/t5648.check b/test/files/run/t5648.check new file mode 100644 index 0000000000..1140ff52e2 --- /dev/null +++ b/test/files/run/t5648.check @@ -0,0 +1,4 @@ +true +true +true +true diff --git a/test/files/run/t5648.flags b/test/files/run/t5648.flags new file mode 100644 index 0000000000..e8fb65d50c --- /dev/null +++ b/test/files/run/t5648.flags @@ -0,0 +1 @@ +-Xfatal-warnings
\ No newline at end of file diff --git a/test/files/run/t5648.scala b/test/files/run/t5648.scala new file mode 100644 index 0000000000..c5cea9e1cb --- /dev/null +++ b/test/files/run/t5648.scala @@ -0,0 +1,10 @@ +case class C(val s: Int*) + +object Test { + def main(args: Array[String]): Unit = { + println(new C(1, 3, 7) == new C(1, 3, 7)) + println(new C(1, 3, 7) == C(1, 3, 7)) + println(C(1, 3, 7) == new C(1, 3, 7)) + println(C(1, 3, 7) == C(1, 3, 7)) + } +} |