Compile failure with AP and explicit record accessor for type parameter
Vicente Romero
vicente.romero at oracle.com
Thu Jun 9 16:23:36 UTC 2022
Hi Arnold,
Thanks a lot for the detailed bug report. I have created [1] to track it,
Vicente
[1] https://bugs.openjdk.org/browse/JDK-8288130
On 6/9/22 11:46, Arnold Alejo Nunag wrote:
>
> 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/243f76ed/attachment.htm>
More information about the compiler-dev
mailing list