Mercurial > hg > release > icedtea7-forest-2.4 > langtools
changeset 651:0fe472f4a332
6881115: javac permits nested anno w/o mandatory attrs => IncompleteAnnotationException
Summary: default annotation value is not attributed
Reviewed-by: jjg, darcy
author | mcimadamore |
---|---|
date | Thu, 05 Aug 2010 09:44:54 +0100 |
parents | 6318230cdb82 |
children | 237f3bd52242 |
files | src/share/classes/com/sun/tools/javac/comp/Attr.java src/share/classes/com/sun/tools/javac/comp/Check.java test/tools/javac/annotations/6881115/T6881115.java test/tools/javac/annotations/6881115/T6881115.out |
diffstat | 4 files changed, 61 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/comp/Attr.java Mon Aug 02 16:29:54 2010 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Aug 05 09:44:54 2010 +0100 @@ -675,24 +675,32 @@ // Check that type parameters are well-formed. chk.validate(tree.typarams, localEnv); - if ((owner.flags() & ANNOTATION) != 0 && - tree.typarams.nonEmpty()) - log.error(tree.typarams.head.pos(), - "intf.annotation.members.cant.have.type.params"); // Check that result type is well-formed. chk.validate(tree.restype, localEnv); - if ((owner.flags() & ANNOTATION) != 0) + + // annotation method checks + if ((owner.flags() & ANNOTATION) != 0) { + // annotation method cannot have throws clause + if (tree.thrown.nonEmpty()) { + log.error(tree.thrown.head.pos(), + "throws.not.allowed.in.intf.annotation"); + } + // annotation method cannot declare type-parameters + if (tree.typarams.nonEmpty()) { + log.error(tree.typarams.head.pos(), + "intf.annotation.members.cant.have.type.params"); + } + // validate annotation method's return type (could be an annotation type) chk.validateAnnotationType(tree.restype); - - if ((owner.flags() & ANNOTATION) != 0) + // ensure that annotation method does not clash with members of Object/Annotation chk.validateAnnotationMethod(tree.pos(), m); - // Check that all exceptions mentioned in the throws clause extend - // java.lang.Throwable. - if ((owner.flags() & ANNOTATION) != 0 && tree.thrown.nonEmpty()) - log.error(tree.thrown.head.pos(), - "throws.not.allowed.in.intf.annotation"); + // if default value is an annotation, check it is a well-formed + // annotation value (e.g. no duplicate values, no missing values, etc.) + chk.validateAnnotationDefaultValue(tree.defaultValue); + } + for (List<JCExpression> l = tree.thrown; l.nonEmpty(); l = l.tail) chk.checkType(l.head.pos(), l.head.type, syms.throwableType);
--- a/src/share/classes/com/sun/tools/javac/comp/Check.java Mon Aug 02 16:29:54 2010 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Aug 05 09:44:54 2010 +0100 @@ -1929,6 +1929,23 @@ * Check annotations **************************************************************************/ + /** + * Validate annotations in default values + */ + void validateAnnotationDefaultValue(JCTree defaultValue) { + class DefaultValueValidator extends TreeScanner { + @Override + public void visitAnnotation(JCAnnotation tree) { + super.visitAnnotation(tree); + validateAnnotation(tree); + } + } + // defaultValue may be null if an error occurred, so don't bother validating it + if (defaultValue != null) { + defaultValue.accept(new DefaultValueValidator()); + } + } + /** Annotation types are restricted to primitives, String, an * enum, an annotation, Class, Class<?>, Class<? extends * Anything>, arrays of the preceding.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/6881115/T6881115.java Thu Aug 05 09:44:54 2010 +0100 @@ -0,0 +1,18 @@ +/* + * @test /nodynamiccopyright/ + * @bug 6881115 + * @summary javac permits nested anno w/o mandatory attrs => IncompleteAnnotationException + * @author mcimadamore + * @compile/fail/ref=T6881115.out -XDrawDiagnostics T6881115.java + */ + +@interface A { + B b() default @B(b2 = 1, b2 = 2); + B[] b_arr() default {@B(), @B(b2 = 1, b2 = 2)}; +} +@interface B { + String b1(); + int b2(); +} +@A +class T6881115 {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/6881115/T6881115.out Thu Aug 05 09:44:54 2010 +0100 @@ -0,0 +1,6 @@ +T6881115.java:10:30: compiler.err.duplicate.annotation.member.value: b2, B +T6881115.java:10:19: compiler.err.annotation.missing.default.value: B, b1 +T6881115.java:11:26: compiler.err.annotation.missing.default.value: B, b1 +T6881115.java:11:43: compiler.err.duplicate.annotation.member.value: b2, B +T6881115.java:11:32: compiler.err.annotation.missing.default.value: B, b1 +5 errors