diff -r f1f605f85850 -r 2620c953e9fe src/share/classes/com/sun/tools/javac/comp/Check.java --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Feb 15 18:40:38 2013 -0800 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Mon Feb 18 14:33:25 2013 +0000 @@ -1588,6 +1588,7 @@ (other.flags() & STATIC) == 0) { log.error(TreeInfo.diagnosticPositionFor(m, tree), "override.static", cannotOverride(m, other)); + m.flags_field |= BAD_OVERRIDE; return; } @@ -1599,6 +1600,7 @@ log.error(TreeInfo.diagnosticPositionFor(m, tree), "override.meth", cannotOverride(m, other), asFlagSet(other.flags() & (FINAL | STATIC))); + m.flags_field |= BAD_OVERRIDE; return; } @@ -1615,6 +1617,7 @@ other.flags() == 0 ? Flag.PACKAGE : asFlagSet(other.flags() & AccessFlags)); + m.flags_field |= BAD_OVERRIDE; return; } @@ -1642,6 +1645,7 @@ "override.incompatible.ret", cannotOverride(m, other), mtres, otres); + m.flags_field |= BAD_OVERRIDE; return; } } else if (overrideWarner.hasNonSilentLint(LintCategory.UNCHECKED)) { @@ -1661,6 +1665,7 @@ "override.meth.doesnt.throw", cannotOverride(m, other), unhandledUnerased.head); + m.flags_field |= BAD_OVERRIDE; return; } else if (unhandledUnerased.nonEmpty()) { @@ -1956,6 +1961,33 @@ } } + public void checkClassOverrideEqualsAndHash(ClassSymbol someClass) { + if (lint.isEnabled(LintCategory.OVERRIDES)) { + boolean hasEquals = false; + boolean hasHashCode = false; + + Scope.Entry equalsAtObject = syms.objectType.tsym.members().lookup(names.equals); + Scope.Entry hashCodeAtObject = syms.objectType.tsym.members().lookup(names.hashCode); + for (Symbol s: someClass.members().getElements(new Filter() { + public boolean accepts(Symbol s) { + return s.kind == Kinds.MTH && + (s.flags() & BAD_OVERRIDE) == 0; + } + })) { + MethodSymbol m = (MethodSymbol)s; + hasEquals |= m.name.equals(names.equals) && + m.overrides(equalsAtObject.sym, someClass, types, false); + + hasHashCode |= m.name.equals(names.hashCode) && + m.overrides(hashCodeAtObject.sym, someClass, types, false); + } + if (hasEquals && !hasHashCode) { + log.warning(LintCategory.OVERRIDES, (DiagnosticPosition) null, + "override.equals.but.not.hashcode", someClass.fullname); + } + } + } + private boolean checkNameClash(ClassSymbol origin, Symbol s1, Symbol s2) { ClashFilter cf = new ClashFilter(origin.type); return (cf.accepts(s1) &&