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