-
Type:
Bug
-
Resolution: Unresolved
-
Priority:
P4
-
None
-
Affects Version/s: 23.0.1, 24.0.2, 25.0.5
-
Component/s: tools
-
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)
```
```
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)
```