--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Aug 11 01:12:40 2009 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Aug 11 01:13:14 2009 +0100
@@ -65,6 +65,7 @@
private final Types types;
private final JCDiagnostic.Factory diags;
private final boolean skipAnnotations;
+ private boolean warnOnSyntheticConflicts;
private final TreeInfo treeinfo;
// The set of lint options currently in effect. It is initialized
@@ -99,6 +100,7 @@
allowAnnotations = source.allowAnnotations();
complexInference = options.get("-complexinference") != null;
skipAnnotations = options.get("skipAnnotations") != null;
+ warnOnSyntheticConflicts = options.get("warnOnSyntheticConflicts") != null;
boolean verboseDeprecated = lint.isEnabled(LintCategory.DEPRECATION);
boolean verboseUnchecked = lint.isEnabled(LintCategory.UNCHECKED);
@@ -1709,6 +1711,35 @@
checkCompatibleConcretes(pos, c);
}
+ void checkConflicts(DiagnosticPosition pos, Symbol sym, TypeSymbol c) {
+ for (Type ct = c.type; ct != Type.noType ; ct = types.supertype(ct)) {
+ for (Scope.Entry e = ct.tsym.members().lookup(sym.name); e.scope == ct.tsym.members(); e = e.next()) {
+ // VM allows methods and variables with differing types
+ if (sym.kind == e.sym.kind &&
+ types.isSameType(types.erasure(sym.type), types.erasure(e.sym.type)) &&
+ sym != e.sym &&
+ (sym.flags() & Flags.SYNTHETIC) != (e.sym.flags() & Flags.SYNTHETIC) &&
+ (sym.flags() & BRIDGE) == 0 && (e.sym.flags() & BRIDGE) == 0) {
+ syntheticError(pos, (e.sym.flags() & SYNTHETIC) == 0 ? e.sym : sym);
+ return;
+ }
+ }
+ }
+ }
+
+ /** Report a conflict between a user symbol and a synthetic symbol.
+ */
+ private void syntheticError(DiagnosticPosition pos, Symbol sym) {
+ if (!sym.type.isErroneous()) {
+ if (warnOnSyntheticConflicts) {
+ log.warning(pos, "synthetic.name.conflict", sym, sym.location());
+ }
+ else {
+ log.error(pos, "synthetic.name.conflict", sym, sym.location());
+ }
+ }
+ }
+
/** Check that class c does not implement directly or indirectly
* the same parameterized interface with two different argument lists.
* @param pos Position to be used for error reporting.