Bug 110738 - [1.5][compiler] Internal compiler error while processing Currency
Summary: [1.5][compiler] Internal compiler error while processing Currency
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.1.1   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.1.1   Edit
Assignee: Kent Johnson CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-09-26 17:54 EDT by Philipe Mulet CLA
Modified: 2005-09-27 15:30 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Philipe Mulet CLA 2005-09-26 17:54:56 EDT
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
Comment 1 Philipe Mulet CLA 2005-09-26 17:57:08 EDT
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];
Comment 2 Philipe Mulet CLA 2005-09-26 18:11:19 EDT
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; }	
}
Comment 3 Philipe Mulet CLA 2005-09-26 18:14:21 EDT
Released patch to 3.1 maintenance stream, still we shouldn't reject the code.
Comment 4 Philipe Mulet CLA 2005-09-26 18:26:50 EDT
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"; }	
}
Comment 5 Philipe Mulet CLA 2005-09-26 18:36:13 EDT
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--)




Comment 6 Kent Johnson CLA 2005-09-27 13:27:09 EDT
Add Varargs test37

Released into 3.1.1 stream AND HEAD.
Comment 7 Olivier Thomann CLA 2005-09-27 15:30:58 EDT
Verified in  M20050923-1430 + JDT/Core 3.1.1RC3 candidate