Compile failure with AP and explicit record accessor for type parameter

Arnold Alejo Nunag arnoldnunag12 at gmail.com
Thu Jun 9 15:46:45 UTC 2022


Hello,

Our team at Minecraft Forge (a modding platform for Minecraft: Java 
Edition) recently found a compiler bug regarding records, type 
parameters, and explicit types while trying to implement a new feature. 
I'm led to believe that this is the appropriate place to at least 
publicize and discuss this compiler-related issue. If not, please point 
me in the appropriate place to report this, thank you.

In summary, an explicitly declared accessor method for a record 
component whose type is a type parameter of the record fails to compile 
/only/ when an annotation processor is present during compilation. 
Removal of the explicit accessor or the annotation processor(s) makes 
the class compile as expected.

We've assembled a small reproducible case for this issue:

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.TypeElement;
import java.util.Set;

public class EmptyProcessor extends AbstractProcessor {
     @Override
     public boolean process(Set<? extends TypeElement> annotations, 
RoundEnvironment roundEnv) {
         return false;
     }
}

public record TestRecord<T>(T someValue) {
     public T someValue() {
         return this.someValue;
     }
}

Put each snippet into the source files `EmptyProcessor.java` and 
`TestRecord.java` respectively, compile the AP class using `javac 
EmptyProcessor.java`, and try to compile the record class with the AP 
present using `javac -processor EmptyProcessor TestRecord.java`. The 
warnings about the processor's lack of source version and supported 
annotations can be safely ignored (we used them to confirm that the 
annotation processor is present). Here is the output from running the 
above on Java 17:

D:\Dev\Sandbox\javacbug> javac -processor EmptyProcessor TestRecord.java
warning: No SupportedSourceVersion annotation found on EmptyProcessor, 
returning RELEASE_6.
warning: Supported source version 'RELEASE_6' from annotation processor 
'EmptyProcessor' less than -source '17'
warning: No SupportedAnnotationTypes annotation found on EmptyProcessor, 
returning an empty set.
TestRecord.java:3: error: invalid accessor method in record TestRecord
     public T someValue() {
              ^
   (return type of accessor method someValue() must match the type of 
record component someValue)
   where T is a type-variable:
     T extends Object declared in record TestRecord
1 error
3 warnings

We've tested this on Windows against Java 16, 17, 18, as well as the 19 
EA (build 25, 2022/6/2), all reference implementations from 
jdk.java.net, as well as the latest Java 17 for Eclipse Temurin 
(17.0.3_7) and the test case fails on all those versions. We've also 
tested this against the Eclipse Compiler for Java, and it compiles 
successfully both with and without the presence of the AP.

Regards,
Arnold (@sciwhiz12)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20220609/b5c30259/attachment.htm>


More information about the compiler-dev mailing list