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) {