Thu, 03 Feb 2011 09:37:28 +0000
6969184: poor error recovery after symbol not found
Summary: generic type-well formedness check should ignore erroneous symbols
Reviewed-by: jjg
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