Community
Participate
Working Groups
Build 3.1.1rc2 When compiling java/util/Currency.java from sources 1.6 against JRE1.6, the compiler terminates with following exception: Severity Description Resource In Folder Location Creation Time Id 2 Internal compiler error java.lang.ArrayIndexOutOfBoundsException: 3 at org.eclipse.jdt.internal.compiler.lookup.Scope.parameterCompatibilityLevel(Scope.java:3494) at org.eclipse.jdt.internal.compiler.lookup.Scope.findMethod(Scope.java:1211) at org.eclipse.jdt.internal.compiler.lookup.Scope.getMethod(Scope.java:2102) at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:314) at org.eclipse.jdt.internal.compiler.ast.LocalDeclaration.resolve(LocalDeclaration.java:199) at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:101) at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolve(IfStatement.java:225) at org.eclipse.jdt.internal.compiler.ast.Block.resolveUsing(Block.java:115) at org.eclipse.jdt.internal.compiler.ast.TryStatement.resolve(TryStatement.java:504) at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:418) at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java:178) at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:396) at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1072) at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1121) at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:305) at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:512) at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:329) at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:248) at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:221) at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:50) at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:213) at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:136) at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:593) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1044) at org.eclipse.core.runtime.Platform.run(Platform.java:783) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:168) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:202) at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:231) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1044) at org.eclipse.core.runtime.Platform.run(Platform.java:783) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:234) at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:253) at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:282) at org.eclipse.core.internal.resources.Workspace.build(Workspace.java:211) at org.eclipse.ui.actions.GlobalBuildAction$1.run(GlobalBuildAction.java:182) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:76) Currency.java JRE Source libs 1.6/src/java/util line 0 September 26, 2005 11:11:52 PM 10068114
It seems the following check is missing; but still javac 1.6 accepts the code and we reject it complaining about an ambiguous method; though it should be fine due to presence of varargs method, only one allowing a 4 args invocation. Index: Scope.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java,v retrieving revision 1.231.2.12 diff -u -r1.231.2.12 Scope.java --- Scope.java 26 Sep 2005 14:13:48 -0000 1.231.2.12 +++ Scope.java 26 Sep 2005 21:55:40 -0000 @@ -3488,8 +3488,10 @@ } level = VARARGS_COMPATIBLE; // varargs support needed } - // now compare standard arguments from 0 to lastIndex + } else if (paramLength != argLength) { + return NOT_COMPATIBLE; } + // now compare standard arguments from 0 to lastIndex for (int i = 0; i < lastIndex; i++) { TypeBinding param = parameters[i]; TypeBinding arg = arguments[i];
Simpler testcase: public class X { void bar() { this.foo("", this, null, ""); } Object foo(String s, X x, Object... obs) { return s; } Object foo(String s, X x, String r, Object o, Object... obs) { return s; } }
Released patch to 3.1 maintenance stream, still we shouldn't reject the code.
It seems precedence is given to varargs methods with <= parameters than arguments, for instance the following produces ambiguity due to first 2 methods: public class X { void bar() { System.out.println(this.foo(null, "")); } Object foo(Object... obs) { return "1"; } Object foo(String r, Object... obs) { return "2"; } Object foo(String r, Object o, Object... obs) { return "3"; } }
Proposed patch: Index: Scope.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java,v retrieving revision 1.231.2.13 diff -u -r1.231.2.13 Scope.java --- Scope.java 26 Sep 2005 22:18:15 -0000 1.231.2.13 +++ Scope.java 26 Sep 2005 22:35:13 -0000 @@ -40,7 +40,7 @@ public final static int COMPATIBLE = 0; public final static int AUTOBOX_COMPATIBLE = 1; public final static int VARARGS_COMPATIBLE = 2; - + public int kind; public Scope parent; @@ -2798,9 +2798,9 @@ return true; } - if (one.isVarargs() && two.isVarargs() && oneParamsLength - 1 == twoParamsLength) { + if (one.isVarargs() && two.isVarargs() && oneParamsLength > twoParamsLength) { // special case when autoboxing makes (int, int...) better than (Object...) but not (int...) or (Integer, int...) - if (((ArrayBinding) twoParams[twoParamsLength - 1]).elementsType().id != TypeIds.T_JavaLangObject) + if (oneParamsLength - 1 == twoParamsLength && ((ArrayBinding) twoParams[twoParamsLength - 1]).elementsType().id != TypeIds.T_JavaLangObject) return false; // check that each parameter before the vararg parameters are compatible (no autoboxing allowed here) for (int i = twoParamsLength - 2; i >= 0; i--)
Add Varargs test37 Released into 3.1.1 stream AND HEAD.
Verified in M20050923-1430 + JDT/Core 3.1.1RC3 candidate