Fri, 30 Mar 2012 19:19:50 +0100
7157165: Regression: code with disjunctive type crashes javac
Summary: Bad recovery logic in parser code that checks for generic cast
Reviewed-by: jjg
1.1 --- a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Mar 30 19:19:09 2012 +0100 1.2 +++ b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Mar 30 19:19:50 2012 +0100 1.3 @@ -983,12 +983,13 @@ 1.4 t = lambdaExpressionOrStatement(variableDeclaratorId(mods, t), pos); 1.5 break; 1.6 } 1.7 - } else { 1.8 - Assert.check((mode & EXPR) != 0); 1.9 + } else if ((mode & EXPR) != 0) { 1.10 mode = EXPR; 1.11 JCExpression e = term2Rest(t1, TreeInfo.shiftPrec); 1.12 t = F.at(pos1).Binary(op, t, e); 1.13 t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec))); 1.14 + } else { 1.15 + accept(GT); 1.16 } 1.17 } else if ((mode & TYPE) != 0 && 1.18 (token.kind == IDENTIFIER || token.kind == ELLIPSIS)) {
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/tools/javac/parser/7157165/T7157165.java Fri Mar 30 19:19:50 2012 +0100 2.3 @@ -0,0 +1,12 @@ 2.4 +/* 2.5 + * @test /nodynamiccopyright/ 2.6 + * @bug 7157165 2.7 + * 2.8 + * @summary Regression: code with disjunctive type crashes javac 2.9 + * @compile/fail/ref=T7157165.out -XDrawDiagnostics T7157165.java 2.10 + * 2.11 + */ 2.12 + 2.13 +class T7157165 { 2.14 + Foo<? extends A|B> foo1 = null; 2.15 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/test/tools/javac/parser/7157165/T7157165.out Fri Mar 30 19:19:50 2012 +0100 3.3 @@ -0,0 +1,4 @@ 3.4 +T7157165.java:11:20: compiler.err.expected: > 3.5 +T7157165.java:11:21: compiler.err.expected: ';' 3.6 +T7157165.java:11:22: compiler.err.illegal.start.of.type 3.7 +3 errors