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

javac fails with java.lang.AssertionError: isSubClass E

XMLWordPrintable

    • x86_64
    • linux

      FULL PRODUCT VERSION :
      java version "1.8.0_31"
      Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
      Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Linux fbassi 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt4-1 (2015-01-16) x86_64 GNU/Linux


      A DESCRIPTION OF THE PROBLEM :
      The compilation of classes/interfaces that use templates / generic types produce weird errors.
      You can easily reproduce the bug compiling the simple class in "Steps to Reproduce".

      Below you can find an example that can be easily workarounded, but in the real life, it's very difficult to workaround complex applications.

      REGRESSION. Last worked in version 8u11

      ADDITIONAL REGRESSION INFORMATION:
      java version "1.8.0_11"
      Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
      Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)


      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      javac Ident.java

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Compiler should compile without any error.
      ACTUAL -
      > javac Ident.java
      An exception has occurred in the compiler (1.8.0_31). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.
      java.lang.AssertionError: isSubClass E
      at com.sun.tools.javac.code.Symbol.isSubClass(Symbol.java:447)
      at com.sun.tools.javac.code.Symbol.isMemberOf(Symbol.java:456)
      at com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:1469)
      at com.sun.tools.javac.code.Types$ImplementationCache.implementationInternal(Types.java:2671)
      at com.sun.tools.javac.code.Types$ImplementationCache.get(Types.java:2653)
      at com.sun.tools.javac.code.Types.implementation(Types.java:2682)
      at com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1529)
      at com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1518)
      at com.sun.tools.javac.comp.Resolve.notOverriddenIn(Resolve.java:416)
      at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:402)
      at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:362)
      at com.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:1448)
      at com.sun.tools.javac.comp.Resolve.findMethodInScope(Resolve.java:1618)
      at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1689)
      at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1662)
      at com.sun.tools.javac.comp.DeferredAttr$DeferredChecker$2.lookup(DeferredAttr.java:1325)
      at com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3325)
      at com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3310)
      at com.sun.tools.javac.comp.DeferredAttr$DeferredChecker.quicklyResolveMethod(DeferredAttr.java:1333)
      at com.sun.tools.javac.comp.DeferredAttr$DeferredChecker.visitApply(DeferredAttr.java:1223)
      at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465)
      at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
      at com.sun.tools.javac.comp.DeferredAttr$FilterScanner.scan(DeferredAttr.java:901)
      at com.sun.tools.javac.comp.DeferredAttr.isDeferred(DeferredAttr.java:1088)
      at com.sun.tools.javac.comp.Attr.attribArgs(Attr.java:701)
      at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1834)
      at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465)
      at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
      at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:656)
      at com.sun.tools.javac.comp.Attr.visitExec(Attr.java:1611)
      at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1296)
      at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
      at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676)
      at com.sun.tools.javac.comp.Attr.visitForeachLoop(Attr.java:1207)
      at com.sun.tools.javac.tree.JCTree$JCEnhancedForLoop.accept(JCTree.java:1035)
      at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
      at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676)
      at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:692)
      at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1142)
      at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:909)
      at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
      at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676)
      at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1035)
      at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:778)
      at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
      at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676)
      at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:4342)
      at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4252)
      at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4181)
      at com.sun.tools.javac.comp.Attr.attrib(Attr.java:4156)
      at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1248)
      at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901)
      at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860)
      at com.sun.tools.javac.main.Main.compile(Main.java:523)
      at com.sun.tools.javac.main.Main.compile(Main.java:381)
      at com.sun.tools.javac.main.Main.compile(Main.java:370)
      at com.sun.tools.javac.main.Main.compile(Main.java:361)
      at com.sun.tools.javac.Main.compile(Main.java:56)
      at com.sun.tools.javac.Main.main(Main.java:42)


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.util.Map;

      public interface Ident {
      public String getId();

      public static String getId(Ident i) { return i!=null ? i.getId() : null; }

      public static <E extends Ident> Map<String,E> put(Map<String,E> store, Iterable<? extends E> objects) {
      for(E i : objects) store.put(i.getId(), i);
      return store;
      }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      It seems that changing
            public static String getId(Ident i) { return i!=null ? i.getId() : null; }
      with
            public static String getOtherMethodName(Ident i) { return i!=null ? i.getId() : null; }
      fixes the problem

            Unassigned Unassigned
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: