6985719: Alike methods in interfaces (Inheritance and Overriding)

Mon, 15 Nov 2010 13:50:53 +0000

author
mcimadamore
date
Mon, 15 Nov 2010 13:50:53 +0000
changeset 746
a7ea58fa3e9a
parent 745
4328728e0409
child 747
1dd813a529cf

6985719: Alike methods in interfaces (Inheritance and Overriding)
Summary: javac should report error when interface inherits unrelated method with same erasure
Reviewed-by: jjg

src/share/classes/com/sun/tools/javac/comp/Check.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719a.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719a.out file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719b.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719b.out file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719c.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719c.out file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719d.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719d.out file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719e.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719e.out file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719f.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719f.out file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719g.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719g.out file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719h.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6985719/T6985719h.out file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java	Sun Nov 14 07:16:46 2010 -0800
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java	Mon Nov 15 13:50:53 2010 +0000
     1.3 @@ -1510,14 +1510,7 @@
     1.4                                              Type t1,
     1.5                                              Type t2,
     1.6                                              Type site) {
     1.7 -        Symbol sym = firstIncompatibility(t1, t2, site);
     1.8 -        if (sym != null) {
     1.9 -            log.error(pos, "types.incompatible.diff.ret",
    1.10 -                      t1, t2, sym.name +
    1.11 -                      "(" + types.memberType(t2, sym).getParameterTypes() + ")");
    1.12 -            return false;
    1.13 -        }
    1.14 -        return true;
    1.15 +        return firstIncompatibility(pos, t1, t2, site) == null;
    1.16      }
    1.17  
    1.18      /** Return the first method which is defined with same args
    1.19 @@ -1528,7 +1521,7 @@
    1.20       *  @param site   The most derived type.
    1.21       *  @returns symbol from t2 that conflicts with one in t1.
    1.22       */
    1.23 -    private Symbol firstIncompatibility(Type t1, Type t2, Type site) {
    1.24 +    private Symbol firstIncompatibility(DiagnosticPosition pos, Type t1, Type t2, Type site) {
    1.25          Map<TypeSymbol,Type> interfaces1 = new HashMap<TypeSymbol,Type>();
    1.26          closure(t1, interfaces1);
    1.27          Map<TypeSymbol,Type> interfaces2;
    1.28 @@ -1539,7 +1532,7 @@
    1.29  
    1.30          for (Type t3 : interfaces1.values()) {
    1.31              for (Type t4 : interfaces2.values()) {
    1.32 -                Symbol s = firstDirectIncompatibility(t3, t4, site);
    1.33 +                Symbol s = firstDirectIncompatibility(pos, t3, t4, site);
    1.34                  if (s != null) return s;
    1.35              }
    1.36          }
    1.37 @@ -1568,7 +1561,7 @@
    1.38      }
    1.39  
    1.40      /** Return the first method in t2 that conflicts with a method from t1. */
    1.41 -    private Symbol firstDirectIncompatibility(Type t1, Type t2, Type site) {
    1.42 +    private Symbol firstDirectIncompatibility(DiagnosticPosition pos, Type t1, Type t2, Type site) {
    1.43          for (Scope.Entry e1 = t1.tsym.members().elems; e1 != null; e1 = e1.sibling) {
    1.44              Symbol s1 = e1.sym;
    1.45              Type st1 = null;
    1.46 @@ -1592,7 +1585,18 @@
    1.47                          (types.covariantReturnType(rt1, rt2, Warner.noWarnings) ||
    1.48                           types.covariantReturnType(rt2, rt1, Warner.noWarnings)) ||
    1.49                           checkCommonOverriderIn(s1,s2,site);
    1.50 -                    if (!compat) return s2;
    1.51 +                    if (!compat) {
    1.52 +                        log.error(pos, "types.incompatible.diff.ret",
    1.53 +                            t1, t2, s2.name +
    1.54 +                            "(" + types.memberType(t2, s2).getParameterTypes() + ")");
    1.55 +                        return s2;
    1.56 +                    }
    1.57 +                } else if (!checkNameClash((ClassSymbol)site.tsym, s1, s2)) {
    1.58 +                    log.error(pos,
    1.59 +                            "name.clash.same.erasure.no.override",
    1.60 +                            s1, s1.location(),
    1.61 +                            s2, s2.location());
    1.62 +                    return s2;
    1.63                  }
    1.64              }
    1.65          }
    1.66 @@ -1644,32 +1648,52 @@
    1.67                  log.error(tree.pos(), "enum.no.finalize");
    1.68                  return;
    1.69              }
    1.70 -        for (Type t = types.supertype(origin.type); t.tag == CLASS;
    1.71 +        for (Type t = origin.type; t.tag == CLASS;
    1.72               t = types.supertype(t)) {
    1.73 -            TypeSymbol c = t.tsym;
    1.74 -            Scope.Entry e = c.members().lookup(m.name);
    1.75 -            while (e.scope != null) {
    1.76 -                if (m.overrides(e.sym, origin, types, false))
    1.77 -                    checkOverride(tree, m, (MethodSymbol)e.sym, origin);
    1.78 -                else if (e.sym.kind == MTH &&
    1.79 -                        e.sym.isInheritedIn(origin, types) &&
    1.80 -                        (e.sym.flags() & SYNTHETIC) == 0 &&
    1.81 -                        !m.isConstructor()) {
    1.82 -                    Type er1 = m.erasure(types);
    1.83 -                    Type er2 = e.sym.erasure(types);
    1.84 -                    if (types.isSameTypes(er1.getParameterTypes(),
    1.85 -                            er2.getParameterTypes())) {
    1.86 -                            log.error(TreeInfo.diagnosticPositionFor(m, tree),
    1.87 -                                    "name.clash.same.erasure.no.override",
    1.88 -                                    m, m.location(),
    1.89 -                                    e.sym, e.sym.location());
    1.90 -                    }
    1.91 -                }
    1.92 -                e = e.next();
    1.93 +            if (t != origin.type) {
    1.94 +                checkOverride(tree, t, origin, m);
    1.95 +            }
    1.96 +            for (Type t2 : types.interfaces(t)) {
    1.97 +                checkOverride(tree, t2, origin, m);
    1.98              }
    1.99          }
   1.100      }
   1.101  
   1.102 +    void checkOverride(JCTree tree, Type site, ClassSymbol origin, MethodSymbol m) {
   1.103 +        TypeSymbol c = site.tsym;
   1.104 +        Scope.Entry e = c.members().lookup(m.name);
   1.105 +        while (e.scope != null) {
   1.106 +            if (m.overrides(e.sym, origin, types, false)) {
   1.107 +                if ((e.sym.flags() & ABSTRACT) == 0) {
   1.108 +                    checkOverride(tree, m, (MethodSymbol)e.sym, origin);
   1.109 +                }
   1.110 +            }
   1.111 +            else if (!checkNameClash(origin, e.sym, m)) {
   1.112 +                log.error(tree,
   1.113 +                            "name.clash.same.erasure.no.override",
   1.114 +                            m, m.location(),
   1.115 +                            e.sym, e.sym.location());
   1.116 +            }
   1.117 +            e = e.next();
   1.118 +        }
   1.119 +    }
   1.120 +
   1.121 +    private boolean checkNameClash(ClassSymbol origin, Symbol s1, Symbol s2) {
   1.122 +        if (s1.kind == MTH &&
   1.123 +                    s1.isInheritedIn(origin, types) &&
   1.124 +                    (s1.flags() & SYNTHETIC) == 0 &&
   1.125 +                    !s2.isConstructor()) {
   1.126 +            Type er1 = s2.erasure(types);
   1.127 +            Type er2 = s1.erasure(types);
   1.128 +            if (types.isSameTypes(er1.getParameterTypes(),
   1.129 +                    er2.getParameterTypes())) {
   1.130 +                    return false;
   1.131 +            }
   1.132 +        }
   1.133 +        return true;
   1.134 +    }
   1.135 +
   1.136 +
   1.137      /** Check that all abstract members of given class have definitions.
   1.138       *  @param pos          Position to be used for error reporting.
   1.139       *  @param c            The class.
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/test/tools/javac/generics/6985719/T6985719a.java	Mon Nov 15 13:50:53 2010 +0000
     2.3 @@ -0,0 +1,15 @@
     2.4 +/*
     2.5 + * @test /nodynamiccopyright/
     2.6 + * @bug     6985719
     2.7 + * @summary Alike methods in interfaces (Inheritance and Overriding)
     2.8 + * @author  mcimadamore
     2.9 + * @compile/fail/ref=T6985719a.out -XDrawDiagnostics T6985719a.java
    2.10 + */
    2.11 +
    2.12 +import java.util.List;
    2.13 +
    2.14 +class T6985719a {
    2.15 +    interface A { void f(List<String> ls); }
    2.16 +    interface B { void f(List<Integer> ls); }
    2.17 +    interface C extends A,B {}
    2.18 +}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/test/tools/javac/generics/6985719/T6985719a.out	Mon Nov 15 13:50:53 2010 +0000
     3.3 @@ -0,0 +1,2 @@
     3.4 +T6985719a.java:14:5: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719a.B, f(java.util.List<java.lang.String>), T6985719a.A
     3.5 +1 error
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/test/tools/javac/generics/6985719/T6985719b.java	Mon Nov 15 13:50:53 2010 +0000
     4.3 @@ -0,0 +1,15 @@
     4.4 +/*
     4.5 + * @test /nodynamiccopyright/
     4.6 + * @bug     6985719
     4.7 + * @summary Alike methods in interfaces (Inheritance and Overriding)
     4.8 + * @author  mcimadamore
     4.9 + * @compile/fail/ref=T6985719b.out -XDrawDiagnostics T6985719b.java
    4.10 + */
    4.11 +
    4.12 +import java.util.List;
    4.13 +
    4.14 +class T6985719b {
    4.15 +    abstract class A { abstract void f(List<String> ls); }
    4.16 +    interface B { void f(List<Integer> ls); }
    4.17 +    abstract class C extends A implements B {}
    4.18 +}
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/test/tools/javac/generics/6985719/T6985719b.out	Mon Nov 15 13:50:53 2010 +0000
     5.3 @@ -0,0 +1,2 @@
     5.4 +T6985719b.java:14:14: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719b.B, f(java.util.List<java.lang.String>), T6985719b.A
     5.5 +1 error
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/test/tools/javac/generics/6985719/T6985719c.java	Mon Nov 15 13:50:53 2010 +0000
     6.3 @@ -0,0 +1,15 @@
     6.4 +/*
     6.5 + * @test /nodynamiccopyright/
     6.6 + * @bug     6985719
     6.7 + * @summary Alike methods in interfaces (Inheritance and Overriding)
     6.8 + * @author  mcimadamore
     6.9 + * @compile/fail/ref=T6985719c.out -XDrawDiagnostics T6985719c.java
    6.10 + */
    6.11 +
    6.12 +import java.util.List;
    6.13 +
    6.14 +class T6985719c {
    6.15 +    interface A { void f(List<String> ls); }
    6.16 +    interface B<X> { void f(List<X> ls); }
    6.17 +    interface C extends A,B<Integer> {}
    6.18 +}
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/test/tools/javac/generics/6985719/T6985719c.out	Mon Nov 15 13:50:53 2010 +0000
     7.3 @@ -0,0 +1,2 @@
     7.4 +T6985719c.java:14:5: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<X>), T6985719c.B, f(java.util.List<java.lang.String>), T6985719c.A
     7.5 +1 error
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/test/tools/javac/generics/6985719/T6985719d.java	Mon Nov 15 13:50:53 2010 +0000
     8.3 @@ -0,0 +1,15 @@
     8.4 +/*
     8.5 + * @test /nodynamiccopyright/
     8.6 + * @bug     6985719
     8.7 + * @summary Alike methods in interfaces (Inheritance and Overriding)
     8.8 + * @author  mcimadamore
     8.9 + * @compile/fail/ref=T6985719d.out -XDrawDiagnostics T6985719d.java
    8.10 + */
    8.11 +
    8.12 +import java.util.List;
    8.13 +
    8.14 +class T6985719d {
    8.15 +    abstract class A { abstract void f(List<String> ls); }
    8.16 +    interface B<X> { void f(List<X> ls); }
    8.17 +    abstract class C extends A implements B<Integer> {}
    8.18 +}
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/test/tools/javac/generics/6985719/T6985719d.out	Mon Nov 15 13:50:53 2010 +0000
     9.3 @@ -0,0 +1,2 @@
     9.4 +T6985719d.java:14:14: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<X>), T6985719d.B, f(java.util.List<java.lang.String>), T6985719d.A
     9.5 +1 error
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/test/tools/javac/generics/6985719/T6985719e.java	Mon Nov 15 13:50:53 2010 +0000
    10.3 @@ -0,0 +1,14 @@
    10.4 +/*
    10.5 + * @test /nodynamiccopyright/
    10.6 + * @bug     6985719
    10.7 + * @summary Alike methods in interfaces (Inheritance and Overriding)
    10.8 + * @author  mcimadamore
    10.9 + * @compile/fail/ref=T6985719e.out -XDrawDiagnostics T6985719e.java
   10.10 + */
   10.11 +
   10.12 +import java.util.List;
   10.13 +
   10.14 +class T6985719e {
   10.15 +    interface A { void f(List<String> ls); }
   10.16 +    interface B extends A { void f(List<Integer> ls); }
   10.17 +}
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/test/tools/javac/generics/6985719/T6985719e.out	Mon Nov 15 13:50:53 2010 +0000
    11.3 @@ -0,0 +1,2 @@
    11.4 +T6985719e.java:13:34: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719e.B, f(java.util.List<java.lang.String>), T6985719e.A
    11.5 +1 error
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/test/tools/javac/generics/6985719/T6985719f.java	Mon Nov 15 13:50:53 2010 +0000
    12.3 @@ -0,0 +1,14 @@
    12.4 +/*
    12.5 + * @test /nodynamiccopyright/
    12.6 + * @bug     6985719
    12.7 + * @summary Alike methods in interfaces (Inheritance and Overriding)
    12.8 + * @author  mcimadamore
    12.9 + * @compile/fail/ref=T6985719f.out -XDrawDiagnostics T6985719f.java
   12.10 + */
   12.11 +
   12.12 +import java.util.List;
   12.13 +
   12.14 +class T6985719f {
   12.15 +    abstract class A { abstract void f(List<String> ls); }
   12.16 +    abstract class B extends A { void f(List<Integer> ls); }
   12.17 +}
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/test/tools/javac/generics/6985719/T6985719f.out	Mon Nov 15 13:50:53 2010 +0000
    13.3 @@ -0,0 +1,2 @@
    13.4 +T6985719f.java:13:39: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719f.B, f(java.util.List<java.lang.String>), T6985719f.A
    13.5 +1 error
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/test/tools/javac/generics/6985719/T6985719g.java	Mon Nov 15 13:50:53 2010 +0000
    14.3 @@ -0,0 +1,14 @@
    14.4 +/*
    14.5 + * @test /nodynamiccopyright/
    14.6 + * @bug     6985719
    14.7 + * @summary Alike methods in interfaces (Inheritance and Overriding)
    14.8 + * @author  mcimadamore
    14.9 + * @compile/fail/ref=T6985719g.out -XDrawDiagnostics T6985719g.java
   14.10 + */
   14.11 +
   14.12 +import java.util.List;
   14.13 +
   14.14 +class T6985719g {
   14.15 +    interface A<X> { void f(List<X> ls); }
   14.16 +    interface B extends A<String> { void f(List<Integer> ls); }
   14.17 +}
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/test/tools/javac/generics/6985719/T6985719g.out	Mon Nov 15 13:50:53 2010 +0000
    15.3 @@ -0,0 +1,2 @@
    15.4 +T6985719g.java:13:42: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719g.B, f(java.util.List<X>), T6985719g.A
    15.5 +1 error
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/test/tools/javac/generics/6985719/T6985719h.java	Mon Nov 15 13:50:53 2010 +0000
    16.3 @@ -0,0 +1,14 @@
    16.4 +/*
    16.5 + * @test /nodynamiccopyright/
    16.6 + * @bug     6985719
    16.7 + * @summary Alike methods in interfaces (Inheritance and Overriding)
    16.8 + * @author  mcimadamore
    16.9 + * @compile/fail/ref=T6985719h.out -XDrawDiagnostics T6985719h.java
   16.10 + */
   16.11 +
   16.12 +import java.util.List;
   16.13 +
   16.14 +class T6985719h {
   16.15 +    abstract class A<X> { abstract void f(List<X> ls); }
   16.16 +    abstract class B extends A<String> { abstract void f(List<Integer> ls); }
   16.17 +}
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/test/tools/javac/generics/6985719/T6985719h.out	Mon Nov 15 13:50:53 2010 +0000
    17.3 @@ -0,0 +1,2 @@
    17.4 +T6985719h.java:13:56: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719h.B, f(java.util.List<X>), T6985719h.A
    17.5 +1 error

mercurial