Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8320144

Compilation crashes when a custom annotation with invalid default value is used

    XMLWordPrintable

Details

    • b27
    • generic
    • generic

    Description

      ADDITIONAL SYSTEM INFORMATION :
      Fedora Linux 39 64bit openjdk version "21" 2023-09-19

      A DESCRIPTION OF THE PROBLEM :
      I tried to create my own custom annotation and I wrote this (invalid) code:
        public String[] excludeModules() default new String[0];

      I tried to compile this via maven and I could see exception from javac:
      --- compiler:3.11.0:compile (default-compile) @ mavenproject1 ---
      Changes detected - recompiling the module! :source
      Compiling 3 source files with javac [debug release 21] to target/classes
      An exception has occurred in the compiler (21). Please file a bug against the Java compiler via the Java bug reporting page (https://bugreport.java.com) after checking the Bug Database (https://bugs.java.com) for duplicates. Include your program, the following diagnostic, and the parameters passed to the Java compiler in your report. Thank you.
      java.lang.NullPointerException: Cannot invoke "com.sun.tools.javac.util.List.nonEmpty()" because "l" is null
      at jdk.compiler/com.sun.tools.javac.comp.Annotate.getAnnotationArrayValue(Annotate.java:710)
      at jdk.compiler/com.sun.tools.javac.comp.Annotate.attributeAnnotationValue(Annotate.java:553)
      at jdk.compiler/com.sun.tools.javac.comp.Annotate.enterDefaultValue(Annotate.java:317)
      at jdk.compiler/com.sun.tools.javac.comp.Annotate.lambda$annotateDefaultValueLater$2(Annotate.java:295)
      at jdk.compiler/com.sun.tools.javac.comp.Annotate.flush(Annotate.java:191)
      at jdk.compiler/com.sun.tools.javac.comp.Annotate.unblockAnnotations(Annotate.java:144)
      at jdk.compiler/com.sun.tools.javac.comp.Annotate.enterDone(Annotate.java:157)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.enterDone(JavaCompiler.java:1819)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:1076)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:949)
      at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
      at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152)
      at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
      at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
      at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:136)
      at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:183)
      at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1140)
      at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:193)
      at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:126)
      at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:328)
      at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:316)
      at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
      at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:174)
      at org.apache.maven.lifecycle.internal.MojoExecutor.access$000(MojoExecutor.java:75)
      at org.apache.maven.lifecycle.internal.MojoExecutor$1.run(MojoExecutor.java:162)
      at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute(DefaultMojosExecutionStrategy.java:39)
      at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:159)
      at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:105)
      at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:73)
      at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:53)
      at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:118)
      at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:261)
      at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:173)
      at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:101)
      at org.apache.maven.cli.MavenCli.execute(MavenCli.java:906)
      at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:283)
      at org.apache.maven.cli.MavenCli.main(MavenCli.java:206)
      at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
      at java.base/java.lang.reflect.Method.invoke(Method.java:580)
      at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:283)
      at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:226)
      at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:407)
      at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:348)
      Annotation processing is enabled because one or more processors were found
        on the class path. A future release of javac may disable annotation processing
        unless at least one processor is specified by name (-processor), or a search
        path is specified (--processor-path, --processor-module-path), or annotation
        processing is enabled explicitly (-proc:only, -proc:full).
        Use -Xlint:-options to suppress this message.
        Use -proc:none to disable annotation processing.
      ------------------------------------------------------------------------
      BUILD FAILURE
      ------------------------------------------------------------------------
      Total time: 0.411 s
      Finished at: 2023-11-07T22:31:16+01:00

      This exception I can see only if there is some annotation processor for example I used one from querydsl project.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1) recreate a maven project from attached source codes (3 java files + pom.xml)
      2) mvn clean install

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Compilation error that I cannot create default value with a new keyword.
      ACTUAL -
      Exception from javac

      ---------- BEGIN SOURCE ----------
      <pom.xml>
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.mycompany</groupId>
        <artifactId>mavenproject1</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
        <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <maven.compiler.source>21</maven.compiler.source>
          <maven.compiler.target>21</maven.compiler.target>
          <exec.mainClass>com.mycompany.mavenproject1.Mavenproject1</exec.mainClass>
        </properties>
        <dependencies>
          <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <classifier>jakarta</classifier>
            <version>5.0.0</version>
          </dependency>
          <dependency>
            <groupId>jakarta.persistence</groupId>
            <artifactId>jakarta.persistence-api</artifactId>
            <version>3.1.0</version>
            <type>jar</type>
          </dependency>
        </dependencies>
        <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.11.0</version>
              <configuration>
                <encoding>UTF8</encoding>
                <release>21</release>
              </configuration>
              <inherited>true</inherited>
            </plugin>
          </plugins>
        </build>
      </project>

      <TestAnnotation.java>
      package com.mycompany.mavenproject1;

      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      import org.springframework.boot.test.context.SpringBootTest;

      @Retention(RetentionPolicy.RUNTIME)
      @Target({ElementType.TYPE})
      public @interface TestAnnotation {

        public String[] excludeModules() default new String[0];
      }

      <Test.java>
      package com.mycompany.mavenproject1;

      @TestAnnotation
      public class Test {
        
      }

      <TestEntity.java>
      package com.mycompany.mavenproject1;

      import jakarta.persistence.Column;
      import jakarta.persistence.Entity;
      import jakarta.persistence.Id;

      @Entity
      public class EntityTest {
        
        @Id
        @Column()
        private Long id;

        public Long getId() {
          return id;
        }

        public void setId(Long id) {
          this.id = id;
        }
        
      }

      ---------- END SOURCE ----------

      FREQUENCY : always


      Attachments

        Issue Links

          Activity

            People

              abimpoudis Angelos Bimpoudis
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: