-
Bug
-
Resolution: Not an Issue
-
P4
-
None
-
23
-
generic
-
generic
A DESCRIPTION OF THE PROBLEM :
When trying to compile the following legal code, the compiler crashes with ClassCastException and aborts compilation:
public class X {
public void foo(Boolean b) {
final boolean TRUE = true;
switch (b) {
case TRUE -> { break;}
default -> { break;}
}
}
}
In fact, the failure happens with any two combination of case statements.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Just try to compile the below code:
public class X {
public void foo(Boolean b) {
final boolean TRUE = true;
switch (b) {
case TRUE -> { break;}
default -> { break;}
}
}
}
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The code should compiler and produce the .class file.
ACTUAL -
The following stack trace is printed after exception:
java.lang.ClassCastException: class com.sun.tools.javac.tree.JCTree$JCIdent cannot be cast to class com.sun.tools.javac.tree.JCTree$JCLiteral (com.sun.tools.javac.tree.JCTree$JCIdent and com.sun.tools.javac.tree.JCTree$JCLiteral are in module jdk.compiler of loader 'app')
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.exhausts(Flow.java:802)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitSwitch(Flow.java:738)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1340)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:463)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.scanStat(Flow.java:551)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.scanStats(Flow.java:559)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitBlock(Flow.java:652)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1133)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:463)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.scanStat(Flow.java:551)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitMethodDef(Flow.java:616)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:957)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:463)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitClassDef(Flow.java:596)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:855)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:463)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.analyzeTree(Flow.java:1363)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.analyzeTree(Flow.java:1355)
at jdk.compiler/com.sun.tools.javac.comp.Flow.analyzeTree(Flow.java:230)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1415)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1389)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:977)
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:66)
at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:52)
---------- BEGIN SOURCE ----------
public class X {
public void foo(Boolean b) {
final boolean TRUE = true;
switch (b) {
case TRUE -> { break;}
default -> { break;}
}
}
}
---------- END SOURCE ----------
FREQUENCY : always
When trying to compile the following legal code, the compiler crashes with ClassCastException and aborts compilation:
public class X {
public void foo(Boolean b) {
final boolean TRUE = true;
switch (b) {
case TRUE -> { break;}
default -> { break;}
}
}
}
In fact, the failure happens with any two combination of case statements.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Just try to compile the below code:
public class X {
public void foo(Boolean b) {
final boolean TRUE = true;
switch (b) {
case TRUE -> { break;}
default -> { break;}
}
}
}
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The code should compiler and produce the .class file.
ACTUAL -
The following stack trace is printed after exception:
java.lang.ClassCastException: class com.sun.tools.javac.tree.JCTree$JCIdent cannot be cast to class com.sun.tools.javac.tree.JCTree$JCLiteral (com.sun.tools.javac.tree.JCTree$JCIdent and com.sun.tools.javac.tree.JCTree$JCLiteral are in module jdk.compiler of loader 'app')
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.exhausts(Flow.java:802)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitSwitch(Flow.java:738)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1340)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:463)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.scanStat(Flow.java:551)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.scanStats(Flow.java:559)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitBlock(Flow.java:652)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1133)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:463)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.scanStat(Flow.java:551)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitMethodDef(Flow.java:616)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:957)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:463)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.visitClassDef(Flow.java:596)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:855)
at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:463)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.analyzeTree(Flow.java:1363)
at jdk.compiler/com.sun.tools.javac.comp.Flow$AliveAnalyzer.analyzeTree(Flow.java:1355)
at jdk.compiler/com.sun.tools.javac.comp.Flow.analyzeTree(Flow.java:230)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1415)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1389)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:977)
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:66)
at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:52)
---------- BEGIN SOURCE ----------
public class X {
public void foo(Boolean b) {
final boolean TRUE = true;
switch (b) {
case TRUE -> { break;}
default -> { break;}
}
}
}
---------- END SOURCE ----------
FREQUENCY : always