Don't soft pin everything when doing -if class * rules

This only solves the problem for -if class * SUBSEQUENT, not the cases
where the conditional contains member specifications.

Bug: b/316100042
Change-Id: Ie59e96669098f467303df8f5e6dbfdd71070c986
diff --git a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
index 1410247..933cc33 100644
--- a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
+++ b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
@@ -328,7 +328,9 @@
     DexItemFactory dexItemFactory = appView.dexItemFactory();
     ProguardIfRule materializedRule = rule.materialize(dexItemFactory, preconditions);
 
-    if (enqueuer.getMode().isInitialTreeShaking() && !rule.isUsed()) {
+    if (enqueuer.getMode().isInitialTreeShaking()
+        && !rule.isUsed()
+        && !rule.isTrivalAllClassMatch()) {
       // We need to abort class inlining of classes that could be matched by the condition of this
       // -if rule.
       ClassInlineRule neverClassInlineRuleForCondition =
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardAccessFlags.java b/src/main/java/com/android/tools/r8/shaking/ProguardAccessFlags.java
index cdf0264..4c35b96 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardAccessFlags.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardAccessFlags.java
@@ -239,6 +239,10 @@
     return this.flags == ((ProguardAccessFlags) obj).flags;
   }
 
+  public boolean isDefaultFlags() {
+    return flags == 0;
+  }
+
   @Override
   public int hashCode() {
     return flags;
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
index 6099834..01c9118 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.graph.SubtypingInfo;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.Position;
+import com.android.tools.r8.utils.BooleanBox;
 import com.android.tools.r8.utils.IterableUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
@@ -60,6 +61,23 @@
         memberRules);
   }
 
+  public boolean isTrivalAllClassMatch() {
+    BooleanBox booleanBox = new BooleanBox(true);
+    getClassNames()
+        .forEachTypeMatcher(
+            unused -> booleanBox.set(false),
+            proguardTypeMatcher -> !proguardTypeMatcher.isMatchAnyClassPattern());
+    return booleanBox.get()
+        && getClassAnnotations().isEmpty()
+        && getClassAccessFlags().isDefaultFlags()
+        && getNegatedClassAccessFlags().isDefaultFlags()
+        && !getClassTypeNegated()
+        && getClassType() == ProguardClassType.CLASS
+        && getInheritanceAnnotations().isEmpty()
+        && getInheritanceClassName() == null
+        && getMemberRules().isEmpty();
+  }
+
   public boolean isUsed() {
     return used;
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java b/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
index a8233bf..f9aef9b 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
@@ -43,6 +43,10 @@
   // Evaluates this matcher on the given type.
   public abstract boolean matches(DexType type);
 
+  public boolean isMatchAnyClassPattern() {
+    return false;
+  }
+
   // Evaluates this matcher on the given type, and on all types that have been merged into the given
   // type, if any.
   public final boolean matches(DexType type, AppView<?> appView) {
@@ -167,6 +171,11 @@
     }
 
     @Override
+    public boolean isMatchAnyClassPattern() {
+      return true;
+    }
+
+    @Override
     public boolean matches(DexType type) {
       wildcard.setCaptured(type.toSourceString());
       return true;
@@ -249,6 +258,11 @@
     }
 
     @Override
+    public boolean isMatchAnyClassPattern() {
+      return true;
+    }
+
+    @Override
     public boolean matches(DexType type) {
       if (type.isClassType()) {
         wildcard.setCaptured(type.toSourceString());
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/PinningStarPatternTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/PinningStarPatternTest.java
index ecb11d3..d65f8bd 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/PinningStarPatternTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/PinningStarPatternTest.java
@@ -49,11 +49,7 @@
 
   @Test
   public void testR8IfStar() throws Exception {
-    // TODO(b/316100042): We should not keep A.class.
-    testKeepRule(
-        "-if class * -keep class **B { *; }",
-        ImmutableList.of(),
-        ImmutableList.of(B.class, TestClass.class, A.class));
+    testKeepRule("-if class * -keep class **B { *; }", EXPECTED_ABSENT, EXPECTED_PRESENT);
   }
 
   @Test