/* * @test /nodynamiccopyright/ * @bug 8006775 * @summary Ensure unresolved upper bound annotation is handled correctly * @author Werner Dietl * @compile/fail/ref=BrokenAnnotation.out -XDrawDiagnostics BrokenAnnotation.java */ // No import, making the annotation @A invalid. // import java.lang.annotation.*; // Works: @Broke.A class... // Works: class Broke<@Broke.A T> { // Used to fail: class BrokenAnnotation<T extends @BrokenAnnotation.A Object> { @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @interface A { } } // If the Annotation is e.g. on the top-level class, we // get something like this: // // Broke.java:6: cannot find symbol // symbol : class Target // location: class Broke // @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) // ^ // 1 error // // When the annotation is in the upper bound, one used to get // the following stack trace: // // An exception has occurred in the compiler (1.7.0-jsr308-1.2.7). Please report this bug so we can fix it. For instructions, see http://types.cs.washington.edu/checker-framework/current/README-jsr308.html#reporting-bugs . Thank you. // java.lang.NullPointerException // at com.sun.tools.javac.code.Type.isCompound(Type.java:346) // at com.sun.tools.javac.code.Types.getBounds(Types.java:1940) // at com.sun.tools.javac.util.RichDiagnosticFormatter$1.visitTypeVar(RichDiagnosticFormatter.java:534) // at com.sun.tools.javac.util.RichDiagnosticFormatter$1.visitTypeVar(RichDiagnosticFormatter.java:1) // at com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1049) // at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3809) // at com.sun.tools.javac.util.RichDiagnosticFormatter$1.visit(RichDiagnosticFormatter.java:450) // at com.sun.tools.javac.util.RichDiagnosticFormatter$1.visitClassType(RichDiagnosticFormatter.java:518) // at com.sun.tools.javac.util.RichDiagnosticFormatter$1.visitClassType(RichDiagnosticFormatter.java:1) // at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:596) // at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3809) // at com.sun.tools.javac.util.RichDiagnosticFormatter.preprocessType(RichDiagnosticFormatter.java:442) // at com.sun.tools.javac.util.RichDiagnosticFormatter.preprocessArgument(RichDiagnosticFormatter.java:172) // at com.sun.tools.javac.util.RichDiagnosticFormatter.preprocessDiagnostic(RichDiagnosticFormatter.java:155) // at com.sun.tools.javac.util.RichDiagnosticFormatter.preprocessArgument(RichDiagnosticFormatter.java:178) // at com.sun.tools.javac.util.RichDiagnosticFormatter.preprocessDiagnostic(RichDiagnosticFormatter.java:155) // at com.sun.tools.javac.util.RichDiagnosticFormatter.format(RichDiagnosticFormatter.java:111) // at com.sun.tools.javac.util.RichDiagnosticFormatter.format(RichDiagnosticFormatter.java:1) // at com.sun.tools.javac.util.Log.writeDiagnostic(Log.java:514) // at com.sun.tools.javac.util.Log.report(Log.java:496) // at com.sun.tools.javac.comp.Resolve.logResolveError(Resolve.java:2160) // at com.sun.tools.javac.comp.Resolve.access(Resolve.java:1553) // at com.sun.tools.javac.comp.Resolve.access(Resolve.java:1580) // at com.sun.tools.javac.comp.Resolve.access(Resolve.java:1592) // at com.sun.tools.javac.comp.Resolve.resolveIdent(Resolve.java:1653) // at com.sun.tools.javac.comp.Attr.visitIdent(Attr.java:2191) // at com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:1873) // at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:467) // at com.sun.tools.javac.comp.Attr.attribType(Attr.java:503) // at com.sun.tools.javac.comp.Attr.attribType(Attr.java:496) // at com.sun.tools.javac.comp.Attr.attribAnnotationTypes(Attr.java:605) // at com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:944) // at com.sun.tools.javac.code.Symbol.complete(Symbol.java:432) // at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:832) // at com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:775) // at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:350) // at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:346) // at com.sun.tools.javac.comp.Resolve.findMemberType(Resolve.java:1346) // at com.sun.tools.javac.comp.Resolve.findIdentInType(Resolve.java:1512) // at com.sun.tools.javac.comp.Attr.selectSym(Attr.java:2434) // at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:2312) // at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1805) // at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:467) // at com.sun.tools.javac.comp.Attr.attribType(Attr.java:503) // at com.sun.tools.javac.comp.Attr.attribType(Attr.java:496) // at com.sun.tools.javac.comp.Attr.attribAnnotationTypes(Attr.java:605) // at com.sun.tools.javac.comp.Attr.visitAnnotatedType(Attr.java:3016) // at com.sun.tools.javac.tree.JCTree$JCAnnotatedType.accept(JCTree.java:2253) // at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:467) // at com.sun.tools.javac.comp.Attr.attribType(Attr.java:503) // at com.sun.tools.javac.comp.Attr.attribType(Attr.java:496) // at com.sun.tools.javac.comp.Attr.attribTypeVariables(Attr.java:569) // at com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:955) // at com.sun.tools.javac.code.Symbol.complete(Symbol.java:432) // at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:832) // at com.sun.tools.javac.comp.Enter.complete(Enter.java:500) // at com.sun.tools.javac.comp.Enter.main(Enter.java:478) // at com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:950) // at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:841) // at com.sun.tools.javac.main.Main.compile(Main.java:441) // at com.sun.tools.javac.main.Main.compile(Main.java:358) // at com.sun.tools.javac.main.Main.compile(Main.java:347) // at com.sun.tools.javac.main.Main.compile(Main.java:338) // at com.sun.tools.javac.Main.compile(Main.java:76) // at com.sun.tools.javac.Main.main(Main.java:61)