Fix liveness of array classliterals for JsVarargs.

The pass ImplementJsVarags inserts array creations that refer to the
array class literal. Such class literal must be kept live.

Change-Id: I42ba323691616725a3afceadbda9229dd7b5220c
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
index 1b97a34..b36c6af 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
@@ -636,7 +636,12 @@
             if (param.isVarargs()) {
               assert method.isJsMethodVarargs();
               // Rescue the (array) type of varargs parameters as the array creation is implicit.
-              rescue((JReferenceType) param.getType(), true);
+              JArrayType paramType = (JArrayType) param.getType().getUnderlyingType();
+              rescue(paramType, true);
+              // Rescue the class literal for the array type as it will be needed when
+              // ImplementJsVarargs inserts the method prelude to support the JS vararg calling
+              // convention.
+              rescue(program.getClassLiteralField(paramType.getLeafType()));
             }
           }
         }
diff --git a/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java b/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
index 9ab1c19..68322a7 100644
--- a/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
+++ b/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
@@ -287,6 +287,7 @@
     sideEffectCount++;
     return obj;
   }
+
   public void testVarargsCall_sideEffectingInstance() {
     SubclassNativeWithVarargsConstructor object =
         new SubclassNativeWithVarargsConstructor(0, new Object[0]);
@@ -295,4 +296,16 @@
     assertSame(object, doSideEffect(object).varargsMethod(0, params));
     assertSame(1, sideEffectCount);
   }
+
+  static class UninstantiatedClass {
+  }
+
+  @JsMethod(namespace = JsPackage.GLOBAL)
+  public static UninstantiatedClass[] varargJsMethodUninstantiatedVararg(UninstantiatedClass... varargs) {
+    return varargs;
+  }
+
+  public native void testVarargsCall_uninstantiatedVararg() /*-{
+    @GWTTestCase::assertEquals(II)(0, $global.varargJsMethodUninstantiatedVararg().length);
+  }-*/;
 }