6969184: poor error recovery after symbol not found

Thu, 03 Feb 2011 09:37:28 +0000

author
mcimadamore
date
Thu, 03 Feb 2011 09:37:28 +0000
changeset 854
03cf47d4de15
parent 853
875262e89b52
child 855
afe226180744

6969184: poor error recovery after symbol not found
Summary: generic type-well formedness check should ignore erroneous symbols
Reviewed-by: jjg

src/share/classes/com/sun/tools/javac/comp/Check.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6969184/T6969184.java file | annotate | diff | comparison | revisions
test/tools/javac/generics/6969184/T6969184.out file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java	Thu Feb 03 09:36:28 2011 +0000
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java	Thu Feb 03 09:37:28 2011 +0000
     1.3 @@ -807,8 +807,9 @@
     1.4                  Type actual = types.subst(args.head,
     1.5                      type.tsym.type.getTypeArguments(),
     1.6                      tvars_buf.toList());
     1.7 -                if (!checkExtends(actual, (TypeVar)tvars.head) &&
     1.8 -                        !tvars.head.getUpperBound().isErroneous()) {
     1.9 +                if (!isTypeArgErroneous(actual) &&
    1.10 +                        !tvars.head.getUpperBound().isErroneous() &&
    1.11 +                        !checkExtends(actual, (TypeVar)tvars.head)) {
    1.12                      return args.head;
    1.13                  }
    1.14                  args = args.tail;
    1.15 @@ -821,14 +822,39 @@
    1.16              for (Type arg : types.capture(type).getTypeArguments()) {
    1.17                  if (arg.tag == TYPEVAR &&
    1.18                          arg.getUpperBound().isErroneous() &&
    1.19 -                        !tvars.head.getUpperBound().isErroneous()) {
    1.20 +                        !tvars.head.getUpperBound().isErroneous() &&
    1.21 +                        !isTypeArgErroneous(args.head)) {
    1.22                      return args.head;
    1.23                  }
    1.24                  tvars = tvars.tail;
    1.25 +                args = args.tail;
    1.26              }
    1.27  
    1.28              return null;
    1.29          }
    1.30 +        //where
    1.31 +        boolean isTypeArgErroneous(Type t) {
    1.32 +            return isTypeArgErroneous.visit(t);
    1.33 +        }
    1.34 +
    1.35 +        Types.UnaryVisitor<Boolean> isTypeArgErroneous = new Types.UnaryVisitor<Boolean>() {
    1.36 +            public Boolean visitType(Type t, Void s) {
    1.37 +                return t.isErroneous();
    1.38 +            }
    1.39 +            @Override
    1.40 +            public Boolean visitTypeVar(TypeVar t, Void s) {
    1.41 +                return visit(t.getUpperBound());
    1.42 +            }
    1.43 +            @Override
    1.44 +            public Boolean visitCapturedType(CapturedType t, Void s) {
    1.45 +                return visit(t.getUpperBound()) ||
    1.46 +                        visit(t.getLowerBound());
    1.47 +            }
    1.48 +            @Override
    1.49 +            public Boolean visitWildcardType(WildcardType t, Void s) {
    1.50 +                return visit(t.type);
    1.51 +            }
    1.52 +        };
    1.53  
    1.54      /** Check that given modifiers are legal for given symbol and
    1.55       *  return modifiers together with any implicit modififiers for that symbol.
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/test/tools/javac/generics/6969184/T6969184.java	Thu Feb 03 09:37:28 2011 +0000
     2.3 @@ -0,0 +1,29 @@
     2.4 +/*
     2.5 + * @test /nodynamiccopyright/
     2.6 + * @bug 6956758
     2.7 + *
     2.8 + * @summary  poor error recovery after symbol not found
     2.9 + * @author Maurizio Cimadamore
    2.10 + * @compile/fail/ref=T6969184.out -XDrawDiagnostics T6969184.java
    2.11 + *
    2.12 + */
    2.13 +
    2.14 +class T6969184 {
    2.15 +    static class C1<X> {
    2.16 +        void m1(C1<? extends NonExistentClass> n) {}
    2.17 +        void m2(C1<? super NonExistentClass> n) {}
    2.18 +        void m3(C1<?> n) {}
    2.19 +    }
    2.20 +
    2.21 +    static class C2<X extends NonExistentBound> {
    2.22 +        void m1(C2<? extends NonExistentClass> n) {}
    2.23 +        void m2(C2<? super NonExistentClass> n) {}
    2.24 +        void m3(C2<?> n) {}
    2.25 +    }
    2.26 +
    2.27 +    static class C3<X extends NonExistentBound1 & NonExistentBound2> {
    2.28 +        void m1(C3<? extends NonExistentClass> n) {}
    2.29 +        void m2(C3<? super NonExistentClass> n) {}
    2.30 +        void m3(C3<?> n) {}
    2.31 +    }
    2.32 +}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/test/tools/javac/generics/6969184/T6969184.out	Thu Feb 03 09:37:28 2011 +0000
     3.3 @@ -0,0 +1,10 @@
     3.4 +T6969184.java:13:30: compiler.err.cant.resolve.location: kindname.class, NonExistentClass, , , (compiler.misc.location: kindname.class, T6969184.C1<X>, null)
     3.5 +T6969184.java:14:28: compiler.err.cant.resolve.location: kindname.class, NonExistentClass, , , (compiler.misc.location: kindname.class, T6969184.C1<X>, null)
     3.6 +T6969184.java:18:31: compiler.err.cant.resolve.location: kindname.class, NonExistentBound, , , (compiler.misc.location: kindname.class, T6969184, null)
     3.7 +T6969184.java:19:30: compiler.err.cant.resolve.location: kindname.class, NonExistentClass, , , (compiler.misc.location: kindname.class, T6969184.C2<X>, null)
     3.8 +T6969184.java:20:28: compiler.err.cant.resolve.location: kindname.class, NonExistentClass, , , (compiler.misc.location: kindname.class, T6969184.C2<X>, null)
     3.9 +T6969184.java:24:31: compiler.err.cant.resolve.location: kindname.class, NonExistentBound1, , , (compiler.misc.location: kindname.class, T6969184, null)
    3.10 +T6969184.java:24:51: compiler.err.cant.resolve.location: kindname.class, NonExistentBound2, , , (compiler.misc.location: kindname.class, T6969184, null)
    3.11 +T6969184.java:25:30: compiler.err.cant.resolve.location: kindname.class, NonExistentClass, , , (compiler.misc.location: kindname.class, T6969184.C3<X>, null)
    3.12 +T6969184.java:26:28: compiler.err.cant.resolve.location: kindname.class, NonExistentClass, , , (compiler.misc.location: kindname.class, T6969184.C3<X>, null)
    3.13 +9 errors

mercurial