diff -r 2a31b2340763 -r 4e6ee38974b2 langtools/src/share/classes/com/sun/tools/javac/comp/Check.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Jan 28 00:09:38 2011 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Jan 28 12:01:07 2011 +0000 @@ -2121,7 +2121,7 @@ public boolean accepts(Symbol s) { return s.kind == MTH && - (s.flags() & SYNTHETIC) == 0 && + (s.flags() & (SYNTHETIC | CLASH)) == 0 && s.isInheritedIn(site.tsym, types) && !s.isConstructor(); } @@ -2581,28 +2581,42 @@ if (sym.owner.name == names.any) return false; for (Scope.Entry e = s.lookup(sym.name); e.scope == s; e = e.next()) { if (sym != e.sym && + (e.sym.flags() & CLASH) == 0 && sym.kind == e.sym.kind && sym.name != names.error && (sym.kind != MTH || types.hasSameArgs(types.erasure(sym.type), types.erasure(e.sym.type)))) { - if ((sym.flags() & VARARGS) != (e.sym.flags() & VARARGS)) + if ((sym.flags() & VARARGS) != (e.sym.flags() & VARARGS)) { varargsDuplicateError(pos, sym, e.sym); - else if (sym.kind == MTH && !types.overrideEquivalent(sym.type, e.sym.type)) + return true; + } else if (sym.kind == MTH && !hasSameSignature(sym.type, e.sym.type)) { duplicateErasureError(pos, sym, e.sym); - else + sym.flags_field |= CLASH; + return true; + } else { duplicateError(pos, e.sym); - return false; + return false; + } } } return true; } //where - /** Report duplicate declaration error. - */ - void duplicateErasureError(DiagnosticPosition pos, Symbol sym1, Symbol sym2) { - if (!sym1.type.isErroneous() && !sym2.type.isErroneous()) { - log.error(pos, "name.clash.same.erasure", sym1, sym2); + boolean hasSameSignature(Type mt1, Type mt2) { + if (mt1.tag == FORALL && mt2.tag == FORALL) { + ForAll fa1 = (ForAll)mt1; + ForAll fa2 = (ForAll)mt2; + mt2 = types.subst(fa2, fa2.tvars, fa1.tvars); + } + return types.hasSameArgs(mt1.asMethodType(), mt2.asMethodType()); } - } + + /** Report duplicate declaration error. + */ + void duplicateErasureError(DiagnosticPosition pos, Symbol sym1, Symbol sym2) { + if (!sym1.type.isErroneous() && !sym2.type.isErroneous()) { + log.error(pos, "name.clash.same.erasure", sym1, sym2); + } + } /** Check that single-type import is not already imported or top-level defined, * but make an exception for two single-type imports which denote the same type.