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()); }-*/; }