Only use star wildcard if directly under a type-argument

Bug: 186547736
Change-Id: I4ded5327fc864ced6b45e415d36be859012f115f
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 4420d43..dfa8a95 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
@@ -26,10 +26,6 @@
   private final Set<String> introducedClassTypeVariables = new HashSet<>();
   private final Set<String> introducedMethodTypeVariables = new HashSet<>();
 
-  // Wildcards can only be called be used in certain positions:
-  // https://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
-  private boolean canUseWildcardInArguments = true;
-
   private GenericSignaturePartialTypeArgumentApplier(
       Map<String, DexType> substitutions, DexType objectType) {
     this.substitutions = substitutions;
@@ -96,11 +92,7 @@
     if (interfaceSignatures.isEmpty()) {
       return interfaceSignatures;
     }
-    canUseWildcardInArguments = false;
-    List<ClassTypeSignature> map =
-        ListUtils.mapOrElse(interfaceSignatures, this::visitSuperInterface);
-    canUseWildcardInArguments = true;
-    return map;
+    return ListUtils.mapOrElse(interfaceSignatures, this::visitSuperInterface);
   }
 
   @Override
@@ -108,7 +100,9 @@
     if (typeArguments.isEmpty()) {
       return typeArguments;
     }
-    return ListUtils.mapOrElse(typeArguments, this::visitFieldTypeSignature);
+    // Wildcards can only be called be used in certain positions:
+    // https://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
+    return ListUtils.mapOrElse(typeArguments, arg -> visitFieldTypeSignature(arg, true));
   }
 
   @Override
@@ -171,14 +165,16 @@
 
   @Override
   public ClassTypeSignature visitSuperClass(ClassTypeSignature classTypeSignature) {
-    canUseWildcardInArguments = false;
-    ClassTypeSignature visit = classTypeSignature.visit(this);
-    canUseWildcardInArguments = true;
-    return visit;
+    return classTypeSignature.visit(this);
   }
 
   @Override
   public FieldTypeSignature visitFieldTypeSignature(FieldTypeSignature fieldSignature) {
+    return visitFieldTypeSignature(fieldSignature, false);
+  }
+
+  private FieldTypeSignature visitFieldTypeSignature(
+      FieldTypeSignature fieldSignature, boolean canUseWildcardInArguments) {
     if (fieldSignature.isStar()) {
       return fieldSignature;
     } else if (fieldSignature.isClassTypeSignature()) {
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java
index f566ca2..f3cee7b 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePartialTypeArgumentApplierTest.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.graph.genericsignature;
 
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
-import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestBase;
@@ -45,10 +43,11 @@
 
   @Test
   public void testVariablesInOuterPosition() {
-    // TODO(b/186547736): The expected signature should be (Ljava/lang/Object;)Ljava/lang/Object;
-    runTest(ImmutableMap.of("T", objectType, "R", objectType), "(TT;)TR;", "(*)*")
-        .assertWarningThatMatches(
-            diagnosticMessage(containsString("Invalid signature '(*)*' for method foo")));
+    runTest(
+            ImmutableMap.of("T", objectType, "R", objectType),
+            "(TT;)TR;",
+            "(Ljava/lang/Object;)Ljava/lang/Object;")
+        .assertNoMessages();
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
index 608b8d3..ebca08d 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
@@ -55,20 +55,9 @@
   public void checkSignatures(CodeInspector inspector) {
     checkSignature(
         inspector.clazz(Bar.class.getTypeName() + "$1"),
-        "L"
-            + binaryName(Foo.class)
-            + "<"
-            + descriptor(Object.class)
-            + descriptor(Main.class)
-            + ">;");
+        "L" + binaryName(Foo.class) + "<*" + descriptor(Main.class) + ">;");
     checkSignature(
-        inspector.clazz(Bar.class.getTypeName() + "$2"),
-        "L"
-            + binaryName(Foo.class)
-            + "<"
-            + descriptor(Object.class)
-            + descriptor(Object.class)
-            + ">;");
+        inspector.clazz(Bar.class.getTypeName() + "$2"), "L" + binaryName(Foo.class) + "<**>;");
   }
 
   private void checkSignature(ClassSubject classSubject, String expectedSignature) {