[jdk18] Integrated: 8278834: Error "Cannot read field "sym" because "this.lvar[od]" is null" when compiling

Jan Lahoda jlahoda at openjdk.java.net
Wed Jan 19 19:06:29 UTC 2022


On Wed, 19 Jan 2022 13:29:44 GMT, Jan Lahoda <jlahoda at openjdk.org> wrote:

> For code like:
> 
> public class TestInstanceOf {
> 
>     public static void main(String[] args) {
>         Number abc = 1;
>         new Object() {
>             {
>                 if (abc instanceof Integer integer) {
>                     System.out.println(integer.intValue());
>                 }
>             }
>         };
>     }
> 
> }
> 
> 
> `javac` crashes with:
> 
> An exception has occurred in the compiler (17-internal). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://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[3]" is null
>         at jdk.compiler/com.sun.tools.javac.jvm.Code.emitop0(Code.java:577)
>         at jdk.compiler/com.sun.tools.javac.jvm.Items$LocalItem.load(Items.java:399)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genArgs(Gen.java:902)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitNewClass(Gen.java:1961)
>         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1852)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:877)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitExec(Gen.java:1742)
>         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1584)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:610)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:645)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:631)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStats(Gen.java:682)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitBlock(Gen.java:1097)
>         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1091)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:610)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:645)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genMethod(Gen.java:967)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitMethodDef(Gen.java:930)
>         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:921)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:610)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genClass(Gen.java:2414)
>         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.genCode(JavaCompiler.java:737)
>         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1617)
>         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1585)
>         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:946)
>         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)
> 
> 
> The cause is in `TransPatterns` - it tracks the current class and method, so that it can define correct owners for temporary variables. But if there's a class nested in a method, the current method field is not cleared, and consequently the temporary variables get a wrong owner (the method enclosing the class, not a method inside the current class), which then crashes subsequent phases, like Gen.
> 
> The proposed fix is to clear `currentMethod` when entering a class AST node.

This pull request has now been integrated.

Changeset: be0538d7
Author:    Jan Lahoda <jlahoda at openjdk.org>
URL:       https://git.openjdk.java.net/jdk18/commit/be0538d7c8e2cbfa599dbcb4c5c69533678a8421
Stats:     167 lines in 2 files changed: 167 ins; 0 del; 0 mod

8278834: Error "Cannot read field "sym" because "this.lvar[od]" is null" when compiling

Reviewed-by: vromero

-------------

PR: https://git.openjdk.java.net/jdk18/pull/110


More information about the compiler-dev mailing list