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

AssertionError compiling pattern matching 'instanceof Record(@Annotation var y)'

XMLWordPrintable

    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      > javac -version
      javac 21.0.2

      A DESCRIPTION OF THE PROBLEM :
      Attempting to compile "instanceof" pattern matching with record destructuring, using 'var' for member type and an annotation on the member makes javac fail with an AssertionError (not a regular compilation error!).

      Example expression which causes compiler to fail - note using an annotation and 'var':

          other instanceof Record(@Annotation var y)

      See also "Steps to Reproduce" for full source code which reproduces the problem.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Attempt to compile the following file (Record.java) using javac, version 21.0.2:

      package com.example.bugreport.java21;

      import java.util.Objects;

      record Record(
              @Annotation long x
      ) {

          public boolean isEqual(Object other) {
              return (other instanceof Record(@Annotation var y)) // Error here: both an annotation and 'var' must be present
                      && x == y;
          }

      }

      @interface Annotation {}


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Code either compiles or a (reasonable) compilation error is printed.
      ACTUAL -
      An exception has occurred in the compiler (21.0.2). 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.AssertionError
              at jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:155)
              at jdk.compiler/com.sun.tools.javac.util.Assert.checkNonNull(Assert.java:62)
              at jdk.compiler/com.sun.tools.javac.comp.Check.validateTypeAnnotation(Check.java:3332)
              at jdk.compiler/com.sun.tools.javac.comp.Attr$TypeAnnotationsValidator.visitAnnotation(Attr.java:5725)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCAnnotation.accept(JCTree.java:3039)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:58)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.visitModifiers(TreeScanner.java:399)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCModifiers.accept(JCTree.java:3068)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.comp.Attr$TypeAnnotationsValidator.visitVarDef(Attr.java:5765)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:1022)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.visitBindingPattern(TreeScanner.java:309)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBindingPattern.accept(JCTree.java:2310)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:58)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.visitRecordPattern(TreeScanner.java:334)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCRecordPattern.accept(JCTree.java:2463)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.visitTypeTest(TreeScanner.java:305)
              at jdk.compiler/com.sun.tools.javac.comp.Attr$TypeAnnotationsValidator.visitTypeTest(Attr.java:5779)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCInstanceOf.accept(JCTree.java:2236)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.visitParens(TreeScanner.java:276)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCParens.accept(JCTree.java:2033)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.visitBinary(TreeScanner.java:294)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBinary.accept(JCTree.java:2175)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.visitReturn(TreeScanner.java:235)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1728)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:58)
              at jdk.compiler/com.sun.tools.javac.comp.Attr$TypeAnnotationsValidator.visitBlock(Attr.java:5822)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1092)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.comp.Attr$TypeAnnotationsValidator.visitMethodDef(Attr.java:5758)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:916)
              at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
              at jdk.compiler/com.sun.tools.javac.comp.Attr$TypeAnnotationsValidator.visitClassDef(Attr.java:5817)
              at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:814)
              at jdk.compiler/com.sun.tools.javac.comp.Attr.validateTypeAnnotations(Attr.java:5714)
              at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:5688)
              at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClass(Attr.java:5543)
              at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClass(Attr.java:5367)
              at jdk.compiler/com.sun.tools.javac.comp.Attr.attrib(Attr.java:5306)
              at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1359)
              at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:976)
              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:126)
              at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:169)
              at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1188)
              at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:212)
              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)


      CUSTOMER SUBMITTED WORKAROUND :
      Use explicit type instead of 'var'.

      FREQUENCY : always


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

              Created:
              Updated:
              Resolved: