1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Jun 19 15:52:31 2008 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Jun 20 11:25:03 2008 +0100 1.3 @@ -1367,13 +1367,47 @@ 1.4 types.isSameType(rt1, rt2) || 1.5 rt1.tag >= CLASS && rt2.tag >= CLASS && 1.6 (types.covariantReturnType(rt1, rt2, Warner.noWarnings) || 1.7 - types.covariantReturnType(rt2, rt1, Warner.noWarnings)); 1.8 + types.covariantReturnType(rt2, rt1, Warner.noWarnings)) || 1.9 + checkCommonOverriderIn(s1,s2,site); 1.10 if (!compat) return s2; 1.11 } 1.12 } 1.13 } 1.14 return null; 1.15 } 1.16 + //WHERE 1.17 + boolean checkCommonOverriderIn(Symbol s1, Symbol s2, Type site) { 1.18 + Map<TypeSymbol,Type> supertypes = new HashMap<TypeSymbol,Type>(); 1.19 + Type st1 = types.memberType(site, s1); 1.20 + Type st2 = types.memberType(site, s2); 1.21 + closure(site, supertypes); 1.22 + for (Type t : supertypes.values()) { 1.23 + for (Scope.Entry e = t.tsym.members().lookup(s1.name); e.scope != null; e = e.next()) { 1.24 + Symbol s3 = e.sym; 1.25 + if (s3 == s1 || s3 == s2 || s3.kind != MTH || (s3.flags() & (BRIDGE|SYNTHETIC)) != 0) continue; 1.26 + Type st3 = types.memberType(site,s3); 1.27 + if (types.overrideEquivalent(st3, st1) && types.overrideEquivalent(st3, st2)) { 1.28 + if (s3.owner == site.tsym) { 1.29 + return true; 1.30 + } 1.31 + List<Type> tvars1 = st1.getTypeArguments(); 1.32 + List<Type> tvars2 = st2.getTypeArguments(); 1.33 + List<Type> tvars3 = st3.getTypeArguments(); 1.34 + Type rt1 = st1.getReturnType(); 1.35 + Type rt2 = st2.getReturnType(); 1.36 + Type rt13 = types.subst(st3.getReturnType(), tvars3, tvars1); 1.37 + Type rt23 = types.subst(st3.getReturnType(), tvars3, tvars2); 1.38 + boolean compat = 1.39 + rt13.tag >= CLASS && rt23.tag >= CLASS && 1.40 + (types.covariantReturnType(rt13, rt1, Warner.noWarnings) && 1.41 + types.covariantReturnType(rt23, rt2, Warner.noWarnings)); 1.42 + if (compat) 1.43 + return true; 1.44 + } 1.45 + } 1.46 + } 1.47 + return false; 1.48 + } 1.49 1.50 /** Check that a given method conforms with any method it overrides. 1.51 * @param tree The tree from which positions are extracted