Community
Participate
Working Groups
Build ID: M20070921-1145 Steps To Reproduce: 1. Create new (java) project 2. Create new class in project named Test 3. Insert code below public class Test { public final <E extends Exception> E throwE (E ex, Object ... args) throws E { Object [] oar = new Object [0]; return throwE (oar, ex, args); } public final <E extends Exception> E throwE (Object[] oar, E ex, Object ... args) throws E { throw ex; } } 4. Build Project. 5. Instead of actual compilation errors in the source it shows on error on the first line. Note that this is an condensed piece of code from a source that compiles with SUN JDK 5 compiler, and that did not compile with Eclipse compiler; I ripped almost everything so that only this remained. More information: Stackdump: Internal compiler error java.lang.ClassCastException: org.eclipse.jdt.internal.compiler.lookup.ArrayBinding at org.eclipse.jdt.internal.compiler.lookup.Scope.substitute(Scope.java:202) at org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding.<init>(Parameterized GenericMethodBinding.java:307) at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.createParameterizedGenericMethod(Lo okupEnvironment.java:717) at org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding.inferFromArgumentTy pes(ParameterizedGenericMethodBinding.java:175) at org.eclipse.jdt.internal.compiler.lookup.ParameterizedGenericMethodBinding.computeCompatibleMe thod(ParameterizedGenericMethodBinding.java:56) at org.eclipse.jdt.internal.compiler.lookup.Scope.computeCompatibleMethod(Scope.java:428) at org.eclipse.jdt.internal.compiler.lookup.Scope.findMethod(Scope.java:1122) at org.eclipse.jdt.internal.compiler.lookup.Scope.getImplicitMethod(Scope.java:1784) at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:416) at org.eclipse.jdt.internal.compiler.ast.ReturnStatement.resolve(ReturnStatement.java:216) at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMetho dDeclaration.java:429) at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java :196) at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaratio n.java:400) at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java: 1085) at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1164) at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration. java:366) at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:623) at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:392) at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:362) at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:173) at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:299) at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:59) at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:269) at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:177) at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:624) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:166) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:197) at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:246) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:249) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:214) at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:353) at org.eclipse.core.internal.resources.Project.internalBuild(Project.java:494) at org.eclipse.core.internal.resources.Project.build(Project.java:75) at org.eclipse.ui.actions.BuildAction.invokeOperation(BuildAction.java:194) at org.eclipse.ui.actions.WorkspaceAction.execute(WorkspaceAction.java:141) at org.eclipse.ui.actions.WorkspaceAction$1.runInWorkspace(WorkspaceAction.java:460) at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Reproduced with HEAD. Added disabled regression test in org.eclipse.jdt.core.tests.compiler.regression.GenericTypeTest#_test1206
Problem comes from an attempt to substitute a poor method candidate incorrectly (E for Object[] inside a ReferenceBinding[] boom!). The poor candidate is eliminated later on, hence this is still correct code which is mishandled by the compiler.
As a workaround (since blocker), you may want to rename one of the 2 methods 'throwE'; e.g. public class Test { public final <E extends Exception> E throwE2 (E ex, Object ... args) throws E { Object [] oar = new Object [0]; return throwE (oar, ex, args); } public final <E extends Exception> E throwE (Object[] oar, E ex, Object ... args) throws E { throw ex; } } Working on a fix.
Created attachment 81570 [details] Possible patch Not convinced this is the best fix, however it is quite safe. Other approach would be to simply use TypeBinding[] instead of ReferenceBinding[] for thrown exceptions list... need to see the benefits.
Added GenericTypeTest#test1206-1210
Released for 3.4M4. Fixed
Fixed
Created attachment 81958 [details] Patch for 3.3.x
Patch also released for 3.3.2.
Fix is trivial, symptoms are bad.
+1 for 3.3.2
Verified for 3.4M4 using build I20071210-1800.