JDK-8071425 : javac fails with java.lang.AssertionError: isSubClass E
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 8u31
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: linux
  • CPU: x86_64
  • Submitted: 2015-01-21
  • Updated: 2015-10-28
  • Resolved: 2015-10-28
Related Reports
Duplicate :  
Duplicate :  
Description
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


Comments
Reopening to properly close as duplicate.
28-10-2015

escape-exclude label is added, since this is a duplicate of JDK-8067111, which is already part of Bug escape analysis.
06-04-2015

The issue is reproducible with JDK 8u25 and 8u31. This is a duplicate of JDK-8067111. Confirms resolved with latest JDK 8u40 (b21).
23-01-2015