Calling the constructor of a capturing local class in a static context throws a NPE

Remi Forax forax at univ-mlv.fr
Wed Feb 1 22:59:36 UTC 2023


ping !

----- Original Message -----
> From: "Remi Forax" <forax at univ-mlv.fr>
> To: "compiler-dev" <compiler-dev at openjdk.org>
> Sent: Sunday, December 18, 2022 2:25:39 PM
> Subject: Calling the constructor of a capturing local class in a static context throws a NPE

> Hi everybody,
> a Christmas bug :)
> 
> public class StaticFieldInsideCapturingLocalClass {
>  public static void test(int value) {
>    class Foo {
>      private static final Foo FOO = new Foo();
> 
>      public void m() {
>        System.out.println(value);
>      }
>    }
>    Foo.FOO.m();
>  }
> }
> 
> For me, "new Foo()" should not be allowed in a static context given that Foo
> capture the local variable "value".
> 
> I was able to reproduce the issue with Java 16, 17, 19 and 20 but not with Java
> 11 and 15.
> This bug seems to have been introduced in Java 16 when Java starts to allow
> static final field in local class.
> 
> 
> ~/jdk/jdk-20-valhalla.jdk/Contents/Home/bin/javac
> StaticFieldInsideCapturingLocalClass.java
> An exception has occurred in the compiler (20-valhalla). 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 read field "sym" because "this.lvar[0]"
> is null
>        at jdk.compiler/com.sun.tools.javac.jvm.Code.emitop0(Code.java:570)
>        at jdk.compiler/com.sun.tools.javac.jvm.Items$SelfItem.load(Items.java:369)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitIdent(Gen.java:2354)
>        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:2735)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:902)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genArgs(Gen.java:927)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitNewClass(Gen.java:2031)
>        at
>        jdk.compiler/com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1925)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:902)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitAssign(Gen.java:2087)
>        at
>        jdk.compiler/com.sun.tools.javac.tree.JCTree$JCAssign.accept(JCTree.java:2114)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:902)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitExec(Gen.java:1812)
>        at
>        jdk.compiler/com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1657)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:631)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:666)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:652)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStats(Gen.java:703)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitBlock(Gen.java:1130)
>        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1097)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:631)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:666)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genMethod(Gen.java:992)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitMethodDef(Gen.java:955)
>        at
>        jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:923)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:631)
>        at jdk.compiler/com.sun.tools.javac.jvm.Gen.genClass(Gen.java:2505)
>        at
>        jdk.compiler/com.sun.tools.javac.main.JavaCompiler.genCode(JavaCompiler.java:738)
>        at
>        jdk.compiler/com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1636)
>        at
>        jdk.compiler/com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1604)
>        at
>        jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:947)
>        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)
> 
> happy Christmas,
> Rémi


More information about the compiler-dev mailing list