Extend outliner test to inspect outline parameter types

Change-Id: I3e762e37628496bfd954798dbd13ca7a7a42a52b
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlinerSharedStringBuilderTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlinerSharedStringBuilderTest.java
index bd357dd..99163fb 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlinerSharedStringBuilderTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlinerSharedStringBuilderTest.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.TestCompileResult;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.ir.analysis.value.AbstractValue;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.BooleanBox;
@@ -22,6 +23,7 @@
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.sun.tools.javac.util.List;
 import java.util.Collection;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -52,7 +54,7 @@
                   options.getThrowBlockOutlinerOptions().enable = true;
                   options.getThrowBlockOutlinerOptions().outlineConsumerForTesting =
                       outlines -> {
-                        inspectOutlines(outlines);
+                        inspectOutlines(outlines, options.dexItemFactory());
                         receivedCallback.set();
                       };
                   options.getThrowBlockOutlinerOptions().outlineStrategyForTesting =
@@ -73,12 +75,13 @@
         .assertFailureWithErrorThatMatches(containsString("j=0, i=1"));
   }
 
-  private void inspectOutlines(Collection<ThrowBlockOutline> outlines) {
+  private void inspectOutlines(Collection<ThrowBlockOutline> outlines, DexItemFactory factory) {
     // Verify that we have a single outline with two users.
     assertEquals(1, outlines.size());
     ThrowBlockOutline outline = outlines.iterator().next();
     assertEquals(2, outline.getNumberOfUsers());
     assertEquals(5, outline.getProto().getArity());
+    assertEquals(4, outline.getOptimizedProto(factory).getArity());
 
     // Verify that the last argument is known to be constant.
     AbstractValue lastArgument = ListUtils.last(outline.getArguments());
@@ -103,6 +106,18 @@
             .anyMatch(i -> i.isNewInstance("java.lang.StringBuilder")));
     assertTrue(outlineMethodSubject.streamInstructions().anyMatch(i -> i.isConstString(", k=42")));
 
+    // Validate that type weakening from java.lang.String to java.lang.Object works.
+    // The first parameter is java.lang.String since it is passed to StringBuilder.<init>(String).
+    // The third argument has been weakened from java.lang.String to java.lang.Object due to
+    // changing append(String) to append(Object).
+    assertEquals(
+        List.of(
+            inspector.getTypeSubject(String.class),
+            inspector.getTypeSubject(int.class),
+            inspector.getTypeSubject(Object.class),
+            inspector.getTypeSubject(int.class)),
+        outlineMethodSubject.getParameters());
+
     // Validate that main() no longer uses StringBuilder and that it calls the outline twice.
     MethodSubject mainMethodSubject = inspector.clazz(Main.class).mainMethod();
     assertThat(mainMethodSubject, isPresent());
diff --git a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 9f24677..74cb241 100644
--- a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -233,6 +233,10 @@
     return dexItemFactory.createType(DescriptorUtils.javaTypeToDescriptorIgnorePrimitives(string));
   }
 
+  public TypeSubject getTypeSubject(Class<?> clazz) {
+    return getTypeSubject(clazz.getTypeName());
+  }
+
   public TypeSubject getTypeSubject(String string) {
     return new TypeSubject(
         this, dexItemFactory.createType(DescriptorUtils.javaTypeToDescriptor(string)));