Account for missing type in class name minification

Bug: 196406764
Change-Id: Ia547424f8b89f1a6c88af254938c6675b00631ff
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
index e53f285..ca54e1b 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -93,6 +93,10 @@
         registerClassAsUsed(clazz.type, descriptor);
       }
     }
+    appView
+        .appInfo()
+        .getMissingClasses()
+        .forEach(missingClass -> registerClassAsUsed(missingClass, missingClass.getDescriptor()));
     timing.end();
 
     timing.begin("rename-classes");
diff --git a/src/main/java/com/android/tools/r8/shaking/MissingClasses.java b/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
index 0ec8c27..c301a4e 100644
--- a/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
+++ b/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
@@ -33,6 +33,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.function.Consumer;
 import java.util.function.Predicate;
 
 public class MissingClasses {
@@ -58,6 +59,10 @@
         .build();
   }
 
+  public void forEach(Consumer<DexType> missingClassConsumer) {
+    missingClasses.forEach(missingClassConsumer);
+  }
+
   public boolean contains(DexType type) {
     return missingClasses.contains(type);
   }
diff --git a/src/test/java/com/android/tools/r8/naming/MissingReferenceNamingClashTest.java b/src/test/java/com/android/tools/r8/naming/MissingReferenceNamingClashTest.java
index 6977142..1082d2e 100644
--- a/src/test/java/com/android/tools/r8/naming/MissingReferenceNamingClashTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MissingReferenceNamingClashTest.java
@@ -6,12 +6,9 @@
 
 import static com.android.tools.r8.utils.DescriptorUtils.descriptorToJavaType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
 
-import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -44,40 +41,27 @@
   public void testR8() throws Exception {
     // The references to Missing will be rewritten to a.a but the definition will not be present.
     String newDescriptor = "La/a;";
-    R8TestCompileResult compileResult =
-        testForR8(parameters.getBackend())
-            .addProgramClasses(A.class, Main.class)
-            .addProgramClassFileData(
-                transformer(Anno.class)
-                    .replaceClassDescriptorInMembers(descriptor(Missing.class), newDescriptor)
-                    .transform())
-            .setMinApi(parameters.getApiLevel())
-            .addKeepMainRule(Main.class)
-            .addKeepClassAndMembersRules(Anno.class)
-            .addKeepClassRulesWithAllowObfuscation(A.class)
-            .addKeepRuntimeVisibleAnnotations()
-            .addDontWarn(descriptorToJavaType(newDescriptor))
-            .compile();
-    if (parameters.isCfRuntime()) {
-      compileResult
-          .inspect(
-              inspector -> {
-                ClassSubject aSubject = inspector.clazz(A.class);
-                assertThat(aSubject, isPresent());
-                assertEquals(newDescriptor, aSubject.getFinalDescriptor());
-              })
-          .run(parameters.getRuntime(), Main.class)
-          .assertSuccessWithOutputLines("A::foo");
-    } else {
-      // TODO(b/196406764): This should not fail.
-      AssertionError assertionError =
-          assertThrows(
-              AssertionError.class,
-              () -> {
-                compileResult.run(parameters.getRuntime(), Main.class);
-              });
-      assertThat(assertionError.getMessage(), containsString("Out-of-order type ids"));
-    }
+    testForR8(parameters.getBackend())
+        .addProgramClasses(A.class, Main.class)
+        .addProgramClassFileData(
+            transformer(Anno.class)
+                .replaceClassDescriptorInMembers(descriptor(Missing.class), newDescriptor)
+                .transform())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(Main.class)
+        .addKeepClassAndMembersRules(Anno.class)
+        .addKeepClassRulesWithAllowObfuscation(A.class)
+        .addKeepRuntimeVisibleAnnotations()
+        .addDontWarn(descriptorToJavaType(newDescriptor))
+        .compile()
+        .inspect(
+            inspector -> {
+              ClassSubject aSubject = inspector.clazz(A.class);
+              assertThat(aSubject, isPresent());
+              assertEquals("La/b;", aSubject.getFinalDescriptor());
+            })
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("A::foo");
   }
 
   /* Will be missing on input */