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

Javac throws "inconsistent stack types at join point" exception

XMLWordPrintable

    • b22
    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      zgmnkv@zgmnkv-latitude-5521:~$ uname -a
      Linux zgmnkv-latitude-5521 6.8.0-52-generic #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
      zgmnkv@zgmnkv-latitude-5521:~$ cat /etc/lsb-release
      DISTRIB_ID=Ubuntu
      DISTRIB_RELEASE=22.04
      DISTRIB_CODENAME=jammy
      DISTRIB_DESCRIPTION="Ubuntu 22.04.5 LTS"
      zgmnkv@zgmnkv-latitude-5521:~$ which javac
      /usr/bin/javac
      zgmnkv@zgmnkv-latitude-5521:~$ ls -la /usr/bin/javac
      lrwxrwxrwx 1 root root 23 дек 14 2022 /usr/bin/javac -> /etc/alternatives/javac
      zgmnkv@zgmnkv-latitude-5521:~$ ls -la /etc/alternatives/javac
      lrwxrwxrwx 1 root root 44 апр 1 19:38 /etc/alternatives/javac -> /usr/lib/jvm/java-21-openjdk-amd64/bin/javac
      zgmnkv@zgmnkv-latitude-5521:~$ dpkg -l | grep openjdk-21-jdk
      ii openjdk-21-jdk:amd64 21.0.6+7-1~22.04.1 amd64 OpenJDK Development Kit (JDK)
      ii openjdk-21-jdk-headless:amd64 21.0.6+7-1~22.04.1 amd64 OpenJDK Development Kit (JDK) (headless)
      zgmnkv@zgmnkv-latitude-5521:~$ javac -version
      javac 21.0.6
      zgmnkv@zgmnkv-latitude-5521:~$ java -version
      openjdk version "21.0.6" 2025-01-21
      OpenJDK Runtime Environment (build 21.0.6+7-Ubuntu-122.04.1)
      OpenJDK 64-Bit Server VM (build 21.0.6+7-Ubuntu-122.04.1, mixed mode, sharing)
      zgmnkv@zgmnkv-latitude-5521:~$

      A DESCRIPTION OF THE PROBLEM :
      Javac throws a "java.lang.AssertionError: inconsistent stack types at join point" exception when I use nested switch expressions and make an unsafe cast to a type parameter (see test case code).
      Workaround: move unsafe cast to a separated method.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Run "javac Main.java"

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Javac compiler successfully compiles java code into a class file(s)
      ACTUAL -
      Javac compiler throws an exception:

      zgmnkv@zgmnkv-latitude-5521:~$ javac Main.java
      Note: Main.java uses unchecked or unsafe operations.
      Note: Recompile with -Xlint:unchecked for details.
      An exception has occurred in the compiler (21.0.6). 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:1822)
      at jdk.compiler/com.sun.tools.javac.jvm.Code$State.join(Code.java:1812)
      at jdk.compiler/com.sun.tools.javac.jvm.Code.resolve(Code.java:1523)
      at jdk.compiler/com.sun.tools.javac.jvm.Code.resolvePending(Code.java:1554)
      at jdk.compiler/com.sun.tools.javac.jvm.Code.emitop(Code.java:380)
      at jdk.compiler/com.sun.tools.javac.jvm.Code.emitop0(Code.java:507)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitReturn(Gen.java:1907)
      at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1728)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:614)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:649)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:635)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStats(Gen.java:686)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.doVisitBlock(Gen.java:1128)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitBlock(Gen.java:1121)
      at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1092)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:614)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:649)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genMethod(Gen.java:975)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitMethodDef(Gen.java:938)
      at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:916)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:614)
      at jdk.compiler/com.sun.tools.javac.jvm.Gen.genClass(Gen.java:2482)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.genCode(JavaCompiler.java:769)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1710)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1678)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:976)
      at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:319)
      at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:178)
      at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)
      at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)
      printing javac parameters to: /home/zgmnkv/javac.20250401_200814.args
      zgmnkv@zgmnkv-latitude-5521:~$


      ---------- BEGIN SOURCE ----------
      public class Main {

          public static <T extends SomeObject> T getObjectByType(SomeType someType, String subType) {
              return (T) switch (someType) {
                  case SHAPES -> switch (ShapeSubType.valueOf(subType)) {
                      case CIRCLE -> new CircleObject();
                      case RECTANGLE -> new RectangleObject();
                  };
                  case COLORS -> switch (ColorSubType.valueOf(subType)) {
                      case GREEN -> new GreenObject();
                      case RED -> new RedObject();
                  };
              };
          }

          public enum SomeType {
              SHAPES,
              COLORS
          }

          public enum ShapeSubType {
              CIRCLE,
              RECTANGLE
          }

          public enum ColorSubType {
              GREEN,
              RED
          }

          public static abstract class SomeObject {
          }
          
          public static abstract class ShapeObject extends SomeObject {
          }
          
          public static abstract class ColorObject extends SomeObject {
          }

          public static class CircleObject extends ShapeObject {
          }

          public static class RectangleObject extends ShapeObject {
          }

          public static class GreenObject extends ColorObject {
          }

          public static class RedObject extends ColorObject {
          }
      }

      ---------- END SOURCE ----------

            jlahoda Jan Lahoda
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: