JDK-8130342 : ClassCastException in javac while compiling tests
  • Type: Bug
  • Component: hotspot
  • Sub-Component: gc
  • Affected Version: 9
  • Priority: P4
  • Status: Resolved
  • Resolution: Duplicate
  • OS: linux_oracle_6.0
  • CPU: x86_64
  • Submitted: 2015-07-02
  • Updated: 2015-07-10
  • Resolved: 2015-07-10
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 9
9Resolved
Related Reports
Duplicate :  
Description
While compiling some tests the following exception is  being thrown:
java.lang.ClassCastException: [C cannot be cast to com.sun.tools.javac.tree.JCTree
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
	at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:108)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:984)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.visitTry(TreeScanner.java:155)
	at com.sun.tools.javac.tree.JCTree$JCTry.accept(JCTree.java:1278)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
	at com.sun.tools.javac.tree.TreeScanner.visitCase(TreeScanner.java:145)
	at com.sun.tools.javac.tree.JCTree$JCCase.accept(JCTree.java:1212)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
	at com.sun.tools.javac.tree.TreeScanner.visitSwitch(TreeScanner.java:140)
	at com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1183)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
	at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:108)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:984)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.visitTry(TreeScanner.java:155)
	at com.sun.tools.javac.tree.JCTree$JCTry.accept(JCTree.java:1278)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
	at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:108)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:984)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.visitTry(TreeScanner.java:155)
	at com.sun.tools.javac.tree.JCTree$JCTry.accept(JCTree.java:1278)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
	at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:108)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:984)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.visitMethodDef(TreeScanner.java:94)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.visitMethodDef(TreeInfo.java:627)
	at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:836)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.scan(TreeInfo.java:611)
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
	at com.sun.tools.javac.tree.TreeScanner.visitClassDef(TreeScanner.java:83)
	at com.sun.tools.javac.tree.TreeInfo$1DeclScanner.visitClassDef(TreeInfo.java:623)
	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:744)
	at com.sun.tools.javac.tree.TreeInfo.declarationFor(TreeInfo.java:639)
	at com.sun.tools.javac.tree.TreeInfo.diagnosticPositionFor(TreeInfo.java:600)
	at com.sun.tools.javac.comp.Check.checkOverride(Check.java:1779)
	at com.sun.tools.javac.comp.Check.checkImplementations(Check.java:2328)
	at com.sun.tools.javac.comp.Check.checkImplementations(Check.java:2304)
	at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:4358)
	at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4272)
	at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4201)
	at com.sun.tools.javac.comp.Attr.attrib(Attr.java:4176)
	at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1223)
	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:865)
	at com.sun.tools.javac.main.Main.compile(Main.java:253)
	at com.sun.tools.javac.main.Main.compile(Main.java:141)
	at com.sun.tools.javac.Main.compile(Main.java:56)
	at com.sun.tools.javac.Main.main(Main.java:42)
Comments
Does it reproduce? Does it reproduce with -Xint?
07-07-2015

I'm pretty sure - there's no such cast in that line in the code! It's probably a synthetic cast generated by the compiler - this is what the code looks like: public void scan(List<? extends JCTree> trees) { if (trees != null) for (List<? extends JCTree> l = trees; l.nonEmpty(); l = l.tail) scan(l.head); //<----- cast failing here } And here's the javap for this method: public void scan(com.sun.tools.javac.util.List<? extends com.sun.tools.javac.tree.JCTree>); flags: ACC_PUBLIC Code: stack=2, locals=3, args_size=2 0: aload_1 1: ifnull 32 4: aload_1 5: astore_2 6: aload_2 7: invokevirtual #3 // Method com/sun/tools/javac/util/List.nonEmpty:()Z 10: ifeq 32 13: aload_0 14: aload_2 15: getfield #4 // Field com/sun/tools/javac/util/List.head:Ljava/lang/Object; 18: checkcast #5 // class com/sun/tools/javac/tree/JCTree //<------------------------------------------------------------------------------ 21: invokevirtual #6 // Method scan:(Lcom/sun/tools/javac/tree/JCTree;)V 24: aload_2 25: getfield #7 // Field com/sun/tools/javac/util/List.tail:Lcom/sun/tools/javac/util/List; 28: astore_2 29: goto 6 32: return The code looks absolutely normal, and this code hasn't changed in a long time; the cast is added by javac because of generics - the List<JCTree> is just a List<Object> for the VM, so to make the verifier happy, javac (since JDK 5) emits this extra cast, since the source code enforces that the List can only hold JCTree. Which makes it impossible for the list to store [C or [B as the test results are stating.
02-07-2015