Fix ICE due to incorrectly tightening a JsVarargs parameter.
Avoid tightening JsVarargs parameters.
Change-Id: Ieea8953bca082c74e6088d0d82b3151907717f0e
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
index 6227e40..4b2b068 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
@@ -563,8 +563,12 @@
public void endVisit(JParameter x, Context ctx) {
JMethod currentMethod = getCurrentMethod();
if (program.codeGenTypes.contains(currentMethod.getEnclosingType())
- || currentMethod.canBeReferencedExternally()) {
- // We cannot tighten this parameter as we don't know all callers.
+ // We cannot tighten this parameter as we don't know all callers.
+ || currentMethod.canBeReferencedExternally()
+ // And do not tighten JsVararg parameters because the implementation of the JsVarargs
+ // calling convention creates an array of the parameter type hence requires that it is
+ // preserved.
+ || x.isVarargs() && currentMethod.isJsMethodVarargs()) {
return;
}
tighten(x);
diff --git a/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java b/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
index 68322a7..81b95c6 100644
--- a/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
+++ b/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
@@ -301,11 +301,12 @@
}
@JsMethod(namespace = JsPackage.GLOBAL)
- public static UninstantiatedClass[] varargJsMethodUninstantiatedVararg(UninstantiatedClass... varargs) {
- return varargs;
+ public static int varargJsMethodUninstantiatedVararg(
+ UninstantiatedClass... varargs) {
+ return varargs.length;
}
public native void testVarargsCall_uninstantiatedVararg() /*-{
- @GWTTestCase::assertEquals(II)(0, $global.varargJsMethodUninstantiatedVararg().length);
+ @GWTTestCase::assertEquals(II)(0, $global.varargJsMethodUninstantiatedVararg());
}-*/;
}