Additional info for report form bug 9075022: local (sub)classes and lambdas

Arnold Alejo Nunag arnoldnunag12 at gmail.com
Mon Mar 27 19:11:26 UTC 2023


Hello,

A few hours ago, I reported a compiler bug through the Bug Report form 
at bugreport.java.com. Since then, a developer friend who discovered the 
issue dug into it and found a bit more information.

The bug number given to me by the form was 9075022. To summarize the 
issue, for reference: if a local class is defined in a method which uses 
a parameter from said method (whether in methods or field initializers), 
and within the method is a lambda which contains a (local) subclass of 
that local class, then attempting to instantiate the local class or 
local subclass within the lambda causes a compiler crash.

Here is example source code which shows the crash when tried to be 
compiled by Java 12 and later:

public abstract class JavacBug {

     public abstract void consume(Runnable r);

     public void doThing(String parameter) {
         class LocalClass {

             @Override
             public String toString() {
                 return parameter;
             }
         }

         consume(() -> {
             class LambdaLocalClass extends LocalClass {
             }

             new LocalClass();
         });
     }
}

Compiling the above results in the following crash on Java 21 EA 
(similar stacktraces are shown for all other affected Java versions):

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.check(Assert.java:46)
         at jdk.compiler/com.sun.tools.javac.jvm.Items$LocalItem.<init>(Items.java:392)
         at jdk.compiler/com.sun.tools.javac.jvm.Items.makeLocalItem(Items.java:133)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitIdent(Gen.java:2327)
         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:2681)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:884)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genArgs(Gen.java:909)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitApply(Gen.java:1925)
         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1817)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:884)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitExec(Gen.java:1793)
         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1604)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:613)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:648)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:634)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStats(Gen.java:685)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.doVisitBlock(Gen.java:1127)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitBlock(Gen.java:1120)
         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1088)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:613)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:648)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genMethod(Gen.java:974)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitMethodDef(Gen.java:937)
         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:912)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:613)
         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genClass(Gen.java:2471)
         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.genCode(JavaCompiler.java:751)
         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1681)
         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1649)
         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:960)
         at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)
         at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
         at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)
         at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)

As described in my original bug report, the issue exists in Java 12 and 
above.

As mentioned above, my developer friend dug into the issue and bisected 
JDK 12 to find the commit that introduced the regression, which seems to 
be 
https://github.com/openjdk/jdk12/commit/1ed6b88a9965efb2992f158bdb96b86d38cb9a45.

I hope this information will be useful in debugging and fixing the issue.

(As an aside, it does seem a bit unfriendly that there is no way to add 
on additional information to a report after being submitted through the 
online form, nor is the report made accessible to the reporter, whether 
through the site or even a copy sent to the reporter's email address. 
Where would I bring this up for further discussion?)

Regards,
Arnold (@sciwhiz12)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/compiler-dev/attachments/20230328/c4aa1271/attachment-0001.htm>


More information about the compiler-dev mailing list