Ensure presence of bounds in formal type parameter

Bug: 185372761
Change-Id: If9a0ef892f9960fae16b22f9797ebad98b53ebae
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignature.java b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
index f247b35..e38a163 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
@@ -157,6 +157,7 @@
       this.name = name;
       this.classBound = classBound;
       this.interfaceBounds = interfaceBounds;
+      assert interfaceBounds != null;
     }
 
     public String getName() {
@@ -1078,7 +1079,7 @@
         builder.add(parseFieldTypeSignature());
       }
       if (builder == null) {
-        return new FormalTypeParameter(typeParameterIdentifier, classBound, null);
+        return new FormalTypeParameter(typeParameterIdentifier, classBound, EMPTY_TYPE_ARGUMENTS);
       }
       return new FormalTypeParameter(typeParameterIdentifier, classBound, builder.build());
     }
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
index b9d7386..2c17201 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
@@ -76,7 +76,11 @@
 
   @Override
   public FormalTypeParameter visitFormalTypeParameter(FormalTypeParameter formalTypeParameter) {
-    return formalTypeParameter.visit(this);
+    FormalTypeParameter rewritten = formalTypeParameter.visit(this);
+    // Guard against no information being present in bounds.
+    assert (rewritten.getClassBound() != null && rewritten.getClassBound().hasSignature())
+        || !rewritten.getInterfaceBounds().isEmpty();
+    return rewritten;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
index 21b3591..6df0d8b 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
@@ -27,7 +27,7 @@
   private final Function<DexType, DexType> lookupType;
   private final DexType context;
 
-  private final FieldTypeSignature objectTypeSignature;
+  private final ClassTypeSignature objectTypeSignature;
 
   public GenericSignatureTypeRewriter(AppView<?> appView, DexProgramClass context) {
     this(
@@ -124,7 +124,15 @@
 
     @Override
     public FormalTypeParameter visitFormalTypeParameter(FormalTypeParameter formalTypeParameter) {
-      return formalTypeParameter.visit(this);
+      FormalTypeParameter rewritten = formalTypeParameter.visit(this);
+      // Guard against no information being present in bounds.
+      boolean isEmptyClassBound =
+          rewritten.getClassBound() == null || rewritten.getClassBound().hasNoSignature();
+      if (isEmptyClassBound && rewritten.getInterfaceBounds().isEmpty()) {
+        return new FormalTypeParameter(
+            formalTypeParameter.getName(), objectTypeSignature, rewritten.getInterfaceBounds());
+      }
+      return rewritten;
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java
index 34500a4..dff8d5d 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeVisitor.java
@@ -63,7 +63,7 @@
   @Override
   public List<FormalTypeParameter> visitFormalTypeParameters(
       List<FormalTypeParameter> formalTypeParameters) {
-    formalTypeParameters.forEach(formalTypeParameter -> formalTypeParameter.visit(this));
+    formalTypeParameters.forEach(this::visitFormalTypeParameter);
     return formalTypeParameters;
   }
 
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
index af28d8e..12a819d 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
@@ -8,7 +8,6 @@
 import static com.google.common.base.Predicates.alwaysFalse;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
@@ -187,9 +186,9 @@
     ClassSignature reparsed =
         GenericSignature.parseClassSignature(
             className, rewritten.toString(), Origin.unknown(), factory, testDiagnosticMessages);
-    assertFalse(reparsed.hasSignature());
-    testDiagnosticMessages.assertWarningThatMatches(
-        diagnosticMessage(containsString("Invalid signature")));
+    assertTrue(reparsed.hasSignature());
+    testDiagnosticMessages.assertNoMessages();
+    assertEquals(rewritten.toString(), reparsed.toString());
   }
 
   private void testParsingAndPrintingEqual(String signature) {