RFR: 8353565: Javac throws "inconsistent stack types at join point" exception [v2]

Jan Lahoda jlahoda at openjdk.org
Tue Apr 15 17:45:28 UTC 2025


> Consider code like:
> 
> public class T {
>     private Object computeTypeAtMergePoint1(int i) {
>         return (Object) switch (i) {
>             case 0 -> switch (i) {
>                 case 0 -> { yield new A(); }
>                 default -> { yield new B(); }
>             };
>             default -> switch (i) {
>                 case 0 -> { yield new C(); }
>                 default -> { yield new D(); }
>             };
>         };
>     }
>     enum E {A, B}
>     interface I1 {}
>     class A implements I1 {}
>     class B implements I1 {}
>     interface I2 {}
>     class C implements I2 {}
>     class D implements I2 {}
> 
> }
> 
> 
> Compiling this leads to a crash:
> 
> $ .../jdk-24/bin/javac  /tmp/T.java 
> An exception has occurred in the compiler (24-internal). 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: inconsistent stack types at join point
>         at jdk.compiler/com.sun.tools.javac.jvm.Code$State.error(Code.java:1824)
>         at jdk.compiler/com.sun.tools.javac.jvm.Code$State.join(Code.java:1814)
>         at jdk.compiler/com.sun.tools.javac.jvm.Code.resolve(Code.java:1525)
>         at jdk.compiler/com.sun.tools.javac.jvm.Code.resolvePending(Code.java:1556)
>         at jdk.compiler/com.sun.tools.javac.jvm.Code.emitop(Code.java:382)
>         at jdk.compiler/com.sun.tools.javac.jvm.Code.emitop0(Code.java:511)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitReturn(Gen.java:1905)
>         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1773)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:588)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:623)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:609)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStats(Gen.java:660)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.internalVisitBlock(Gen.java:1121)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitBlock(Gen.java:1085)
>         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1137)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:588)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:623)
>         at jdk.compiler/com.sun.tools.javac.jvm.Gen.genMethod(G...

Jan Lahoda has updated the pull request incrementally with one additional commit since the last revision:

  Reflecting review feedback - moving subtyping checks to commonSuperClass.

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/24617/files
  - new: https://git.openjdk.org/jdk/pull/24617/files/7539bea8..bb08b490

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=24617&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=24617&range=00-01

  Stats: 19 lines in 1 file changed: 8 ins; 4 del; 7 mod
  Patch: https://git.openjdk.org/jdk/pull/24617.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/24617/head:pull/24617

PR: https://git.openjdk.org/jdk/pull/24617


More information about the compiler-dev mailing list