javac crash for annotation on lambda formal parameter type
Alex Buckley
alex.buckley at oracle.com
Thu Dec 5 16:47:10 PST 2013
Starting at JDK8 b91, and continuing through b118, this innocuous
program crashes javac:
--
import java.lang.annotation.*;
import java.util.function.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface TA {}
class LambdaFormal {
IntUnaryOperator x = (@TA int y) -> 1;
}
--
with:
java.lang.NullPointerException
at
com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.separateAnnotationsKinds(TypeAnnotations.java:302)
at
com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.visitLambda(TypeAnnotations.java:1080)
at
com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1607)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
...
This is weird because I'm sure I've annotated lambda formals in this
fashion since b90. It's due to TYPE_USE - if TA's target is PARAMETER,
then the program rightly compiles, while if TA's target is FIELD, you
get the expected applicability error.
Before I file a P2 bug for this, can anyone add some color to the situation?
Alex
P.S. With a TA target of TYPE_USE, b90 produces a class file without the
expected RuntimeVisibleTypeAnnotations attribute for @TA. But that's
less of a concern right now.
More information about the type-annotations-dev
mailing list