mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 19:14:38 +02:00
6881115: javac permits nested anno w/o mandatory attrs => IncompleteAnnotationException
Default annotation value is not attributed Reviewed-by: jjg, darcy
This commit is contained in:
parent
0c1962f5de
commit
156e82c164
4 changed files with 61 additions and 12 deletions
|
@ -675,24 +675,32 @@ public class Attr extends JCTree.Visitor {
|
||||||
|
|
||||||
// Check that type parameters are well-formed.
|
// Check that type parameters are well-formed.
|
||||||
chk.validate(tree.typarams, localEnv);
|
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.
|
// Check that result type is well-formed.
|
||||||
chk.validate(tree.restype, localEnv);
|
chk.validate(tree.restype, localEnv);
|
||||||
if ((owner.flags() & ANNOTATION) != 0)
|
|
||||||
chk.validateAnnotationType(tree.restype);
|
|
||||||
|
|
||||||
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);
|
||||||
|
// ensure that annotation method does not clash with members of Object/Annotation
|
||||||
chk.validateAnnotationMethod(tree.pos(), m);
|
chk.validateAnnotationMethod(tree.pos(), m);
|
||||||
|
|
||||||
// Check that all exceptions mentioned in the throws clause extend
|
// if default value is an annotation, check it is a well-formed
|
||||||
// java.lang.Throwable.
|
// annotation value (e.g. no duplicate values, no missing values, etc.)
|
||||||
if ((owner.flags() & ANNOTATION) != 0 && tree.thrown.nonEmpty())
|
chk.validateAnnotationDefaultValue(tree.defaultValue);
|
||||||
log.error(tree.thrown.head.pos(),
|
}
|
||||||
"throws.not.allowed.in.intf.annotation");
|
|
||||||
for (List<JCExpression> l = tree.thrown; l.nonEmpty(); l = l.tail)
|
for (List<JCExpression> l = tree.thrown; l.nonEmpty(); l = l.tail)
|
||||||
chk.checkType(l.head.pos(), l.head.type, syms.throwableType);
|
chk.checkType(l.head.pos(), l.head.type, syms.throwableType);
|
||||||
|
|
||||||
|
|
|
@ -1929,6 +1929,23 @@ public class Check {
|
||||||
* Check annotations
|
* 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
|
/** Annotation types are restricted to primitives, String, an
|
||||||
* enum, an annotation, Class, Class<?>, Class<? extends
|
* enum, an annotation, Class, Class<?>, Class<? extends
|
||||||
* Anything>, arrays of the preceding.
|
* Anything>, arrays of the preceding.
|
||||||
|
|
18
langtools/test/tools/javac/annotations/6881115/T6881115.java
Normal file
18
langtools/test/tools/javac/annotations/6881115/T6881115.java
Normal file
|
@ -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 {}
|
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue