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 ----------
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 ----------
- links to
-
Commit(master) openjdk/jdk/a5f4366a
-
Review(master) openjdk/jdk/24617