javac with annotation processor throws AssertionError: Cannot add metadata to this type: METHOD when dealing with local classes

XMLWordPrintable

    • Type: Bug
    • Resolution: Unresolved
    • Priority: P4
    • None
    • Affects Version/s: 23.0.1, 24.0.2, 25.0.5
    • Component/s: tools
    • Environment:
    • x86_64
    • linux

      Depending on order of local classes in a JAR, using javax.lang.model.util.Elements to access enclosed elements of a module/package in an annotation processor may lead to `com.sun.tools.javac.code.Type.cloneWithMetadata` throwing `java.lang.AssertionError: Cannot add metadata to this type: METHOD` when loading representations of these elements:

      ```
      package a;

      import java.io.Serializable;

      public class ProblematicClass implements Serializable {
      public static <X> X myMethod() {
      record B(String a){}
      record C(@Nullable B b) {}
      return null;
      }
      }
      ```

      Affects JDK 25, 24, 23, but not 21. Did not test on 22.

      Minimal reproducer: https://github.com/yrodiere/jdk-playground/tree/cloneWithMetadata-cannot-add-metadata
      See README.md for instructions.

      Originally uncovered by Christian Beikov while working on Hibernate ORM. Initial investigation and reproducer are his.

      The reproducer mentions a second problem; I'm unsure if it deserves a dedicated report so please let me know if so.

      Stack trace:

      ```
      An annotation processor threw an uncaught exception.
      Consult the following stack trace for details.
      java.lang.AssertionError: Cannot add metadata to this type: METHOD
              at jdk.compiler/com.sun.tools.javac.code.Type.cloneWithMetadata(Type.java:351)
              at jdk.compiler/com.sun.tools.javac.code.Type.addMetadata(Type.java:389)
              at jdk.compiler/com.sun.tools.javac.code.Type.annotatedType(Type.java:472)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationStructuralTypeMapping.reannotate(ClassReader.java:2616)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationStructuralTypeMapping.visitType(ClassReader.java:2601)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationStructuralTypeMapping.visitType(ClassReader.java:2532)
              at jdk.compiler/com.sun.tools.javac.code.Types$DefaultTypeVisitor.visitMethodType(Types.java:4940)
              at jdk.compiler/com.sun.tools.javac.code.Type$MethodType.accept(Type.java:1502)
              at jdk.compiler/com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4936)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationStructuralTypeMapping.visitClassType(ClassReader.java:2553)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationStructuralTypeMapping.visitClassType(ClassReader.java:2532)
              at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1056)
              at jdk.compiler/com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4936)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationSymbolVisitor.addTypeAnnotations(ClassReader.java:2499)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationSymbolVisitor.addTypeAnnotations(ClassReader.java:2471)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationSymbolVisitor.visitVarSymbol(ClassReader.java:2421)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationSymbolVisitor.visitVarSymbol(ClassReader.java:2347)
              at jdk.compiler/com.sun.tools.javac.code.Symbol$VarSymbol.accept(Symbol.java:1839)
              at jdk.compiler/com.sun.tools.javac.code.Types$DefaultSymbolVisitor.visit(Types.java:4963)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.addTypeAnnotationsToSymbol(ClassReader.java:2336)
              at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$TypeAnnotationCompleter.run(ClassReader.java:2319)
              at jdk.compiler/com.sun.tools.javac.comp.Annotate.flush(Annotate.java:195)
              at jdk.compiler/com.sun.tools.javac.code.ClassFinder.complete(ClassFinder.java:322)
              at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:703)
              at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1472)
              at jdk.compiler/com.sun.tools.javac.code.Symbol.apiComplete(Symbol.java:709)
              at jdk.compiler/com.sun.tools.javac.code.Symbol$TypeSymbol.getEnclosedElements(Symbol.java:880)
              at jdk.compiler/com.sun.tools.javac.code.Symbol$TypeSymbol.getEnclosedElements(Symbol.java:818)
              at a.processor.MyProcessor.triggerProblem(MyProcessor.java:43)
              at a.processor.MyProcessor.process(MyProcessor.java:35)
              at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:956)
              at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:872)
              at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1188)
              at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1301)
              at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1262)
              at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:938)
              at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:319)
              at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:178)
              at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:66)
              at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:52)
      ```

            Assignee:
            Unassigned
            Reporter:
            Yoann Rodiere
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: