提交 0998b4f0 编写于 作者: J jfranck

8027375: javac asserts on nested erroneous annotations

Summary: make sure JCAnnotation trees have type != null before annotation processing
Reviewed-by: jjg
上级 aa881977
......@@ -255,6 +255,9 @@ public class Annotate {
: attr.attribType(a.annotationType, env));
a.type = chk.checkType(a.annotationType.pos(), at, expected);
if (a.type.isErroneous()) {
// Need to make sure nested (anno)trees does not have null as .type
attr.postAttr(a);
if (typeAnnotation) {
return new Attribute.TypeCompound(a.type, List.<Pair<MethodSymbol,Attribute>>nil(),
new TypeAnnotationPosition());
......@@ -265,6 +268,10 @@ public class Annotate {
if ((a.type.tsym.flags() & Flags.ANNOTATION) == 0) {
log.error(a.annotationType.pos(),
"not.annotation.type", a.type.toString());
// Need to make sure nested (anno)trees does not have null as .type
attr.postAttr(a);
if (typeAnnotation) {
return new Attribute.TypeCompound(a.type, List.<Pair<MethodSymbol,Attribute>>nil(), null);
} else {
......@@ -278,7 +285,7 @@ public class Annotate {
Assign(make.Ident(names.value), args.head);
}
ListBuffer<Pair<MethodSymbol,Attribute>> buf =
new ListBuffer<Pair<MethodSymbol,Attribute>>();
new ListBuffer<>();
for (List<JCExpression> tl = args; tl.nonEmpty(); tl = tl.tail) {
JCExpression t = tl.head;
if (!t.hasTag(ASSIGN)) {
......@@ -304,8 +311,7 @@ public class Annotate {
Type result = method.type.getReturnType();
Attribute value = enterAttributeValue(result, assign.rhs, env);
if (!method.type.isErroneous())
buf.append(new Pair<MethodSymbol,Attribute>
((MethodSymbol)method, value));
buf.append(new Pair<>((MethodSymbol)method, value));
t.type = result;
}
if (typeAnnotation) {
......
/* @test /nodynamiccopyright/
* @bug 8027375
* @summary Test that javac doesn't assert/crash when there are what looks to
* be annotations nested inside erroneous annotations.
* @compile/fail/ref=TestCrashNestedAnnos.out -XDrawDiagnostics TestCrashNestedAnnos.java
*/
public class TestCrashNestedAnnos {
// A and B are not annotation types
@A(@A1()) int foo() {}
@B(@B1()) int bar() {}
}
class B {}
class B1 {}
TestCrashNestedAnnos.java:9:6: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, TestCrashNestedAnnos, null)
TestCrashNestedAnnos.java:10:6: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: B, java.lang.annotation.Annotation)
2 errors
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册