OpenJDK / jdk / jdk10
changeset 21713:b3fcc9c0fea3
8027375: javac asserts on nested erroneous annotations
Summary: make sure JCAnnotation trees have type != null before annotation processing
Reviewed-by: jjg
author | jfranck |
---|---|
date | Mon, 11 Nov 2013 17:26:09 +0100 |
parents | d363f367d4c0 |
children | f5b7edec4304 |
files | langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java langtools/test/tools/javac/annotations/testCrashNestedAnnos/TestCrashNestedAnnos.java langtools/test/tools/javac/annotations/testCrashNestedAnnos/TestCrashNestedAnnos.out |
diffstat | 3 files changed, 26 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java Mon Nov 11 09:47:46 2013 -0500 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java Mon Nov 11 17:26:09 2013 +0100 @@ -255,6 +255,9 @@ : 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 @@ 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 @@ 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 @@ 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) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/annotations/testCrashNestedAnnos/TestCrashNestedAnnos.java Mon Nov 11 17:26:09 2013 +0100 @@ -0,0 +1,14 @@ +/* @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 {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/annotations/testCrashNestedAnnos/TestCrashNestedAnnos.out Mon Nov 11 17:26:09 2013 +0100 @@ -0,0 +1,3 @@ +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