Make sure unreferenced native arrays are considered live.

Bug: #9337
Bug-Link: https://github.com/gwtproject/gwt/issues/9337
Change-Id: I9bc542dbc246b5c0aba4a575ae6186efaf29023c
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 b36c6af..2c44b59 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
@@ -1059,6 +1059,12 @@
       }
     }
 
+    for (JArrayType arrayType : program.getAllArrayTypes()) {
+      if (arrayType.canBeImplementedExternally()) {
+        rescuer.rescue(arrayType, true);
+      }
+    }
+
     if (program.getRunAsyncs().size() > 0) {
       /*
        * Explicitly rescue AsyncFragmentLoader.onLoad(). It is never explicitly
diff --git a/user/test/com/google/gwt/core/interop/NativeJsTypeTest.java b/user/test/com/google/gwt/core/interop/NativeJsTypeTest.java
index 49990b9..de5c20f 100644
--- a/user/test/com/google/gwt/core/interop/NativeJsTypeTest.java
+++ b/user/test/com/google/gwt/core/interop/NativeJsTypeTest.java
@@ -345,4 +345,15 @@
     assertFalse(aBoxedNumber instanceof NativeFunction);
     assertFalse(aBoxedNumber instanceof NativeString);
   }
+
+  @JsType(isNative = true)
+  private static class UnreferencedNativeType { }
+
+  private static native Object createArray() /*-{
+    return [];
+  }-*/;
+
+  public void testUnreferencedNativeArrayInstanceOf() {
+    assertTrue(createArray() instanceof UnreferencedNativeType[]);
+  }
 }