1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Feb 15 18:40:38 2013 -0800 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Mon Feb 18 14:33:25 2013 +0000 1.3 @@ -1588,6 +1588,7 @@ 1.4 (other.flags() & STATIC) == 0) { 1.5 log.error(TreeInfo.diagnosticPositionFor(m, tree), "override.static", 1.6 cannotOverride(m, other)); 1.7 + m.flags_field |= BAD_OVERRIDE; 1.8 return; 1.9 } 1.10 1.11 @@ -1599,6 +1600,7 @@ 1.12 log.error(TreeInfo.diagnosticPositionFor(m, tree), "override.meth", 1.13 cannotOverride(m, other), 1.14 asFlagSet(other.flags() & (FINAL | STATIC))); 1.15 + m.flags_field |= BAD_OVERRIDE; 1.16 return; 1.17 } 1.18 1.19 @@ -1615,6 +1617,7 @@ 1.20 other.flags() == 0 ? 1.21 Flag.PACKAGE : 1.22 asFlagSet(other.flags() & AccessFlags)); 1.23 + m.flags_field |= BAD_OVERRIDE; 1.24 return; 1.25 } 1.26 1.27 @@ -1642,6 +1645,7 @@ 1.28 "override.incompatible.ret", 1.29 cannotOverride(m, other), 1.30 mtres, otres); 1.31 + m.flags_field |= BAD_OVERRIDE; 1.32 return; 1.33 } 1.34 } else if (overrideWarner.hasNonSilentLint(LintCategory.UNCHECKED)) { 1.35 @@ -1661,6 +1665,7 @@ 1.36 "override.meth.doesnt.throw", 1.37 cannotOverride(m, other), 1.38 unhandledUnerased.head); 1.39 + m.flags_field |= BAD_OVERRIDE; 1.40 return; 1.41 } 1.42 else if (unhandledUnerased.nonEmpty()) { 1.43 @@ -1956,6 +1961,33 @@ 1.44 } 1.45 } 1.46 1.47 + public void checkClassOverrideEqualsAndHash(ClassSymbol someClass) { 1.48 + if (lint.isEnabled(LintCategory.OVERRIDES)) { 1.49 + boolean hasEquals = false; 1.50 + boolean hasHashCode = false; 1.51 + 1.52 + Scope.Entry equalsAtObject = syms.objectType.tsym.members().lookup(names.equals); 1.53 + Scope.Entry hashCodeAtObject = syms.objectType.tsym.members().lookup(names.hashCode); 1.54 + for (Symbol s: someClass.members().getElements(new Filter<Symbol>() { 1.55 + public boolean accepts(Symbol s) { 1.56 + return s.kind == Kinds.MTH && 1.57 + (s.flags() & BAD_OVERRIDE) == 0; 1.58 + } 1.59 + })) { 1.60 + MethodSymbol m = (MethodSymbol)s; 1.61 + hasEquals |= m.name.equals(names.equals) && 1.62 + m.overrides(equalsAtObject.sym, someClass, types, false); 1.63 + 1.64 + hasHashCode |= m.name.equals(names.hashCode) && 1.65 + m.overrides(hashCodeAtObject.sym, someClass, types, false); 1.66 + } 1.67 + if (hasEquals && !hasHashCode) { 1.68 + log.warning(LintCategory.OVERRIDES, (DiagnosticPosition) null, 1.69 + "override.equals.but.not.hashcode", someClass.fullname); 1.70 + } 1.71 + } 1.72 + } 1.73 + 1.74 private boolean checkNameClash(ClassSymbol origin, Symbol s1, Symbol s2) { 1.75 ClashFilter cf = new ClashFilter(origin.type); 1.76 return (cf.accepts(s1) &&