Revert "Substitute type arguments into merge super type type variables"

This reverts commit 60f3815fc92d8a157e7e90175c2dbfc70acf20d6.

Reason for revert: Failing with an assertion

Change-Id: Ib658c71eee9da1b292ade9070e6ec478b00d24eb
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 d7d048a..419125d 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
@@ -15,7 +15,6 @@
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.GenericSignatureFormatError;
 import java.nio.CharBuffer;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Predicate;
 
@@ -294,53 +293,6 @@
     public ClassSignature toObjectBoundWithSameFormals(ClassTypeSignature objectBound) {
       return new ClassSignature(formalTypeParameters, objectBound, getEmptySuperInterfaces());
     }
-
-    public List<FieldTypeSignature> getGenericArgumentsToSuperType(DexType type) {
-      assert hasSignature();
-      if (superClassSignature.type == type) {
-        return superClassSignature.typeArguments;
-      }
-      for (ClassTypeSignature superInterfaceSignature : superInterfaceSignatures) {
-        if (superInterfaceSignature.type == type) {
-          return superInterfaceSignature.typeArguments;
-        }
-      }
-      return null;
-    }
-
-    public static ClassSignatureBuilder builder() {
-      return new ClassSignatureBuilder();
-    }
-
-    public static class ClassSignatureBuilder {
-
-      private List<FormalTypeParameter> formalTypeParameters = new ArrayList<>();
-      private ClassTypeSignature superClassSignature = null;
-      private List<ClassTypeSignature> superInterfaceSignatures = new ArrayList<>();
-
-      private ClassSignatureBuilder() {}
-
-      public ClassSignatureBuilder addFormalTypeParameters(List<FormalTypeParameter> formals) {
-        formalTypeParameters.addAll(formals);
-        return this;
-      }
-
-      public ClassSignatureBuilder setSuperClassSignature(ClassTypeSignature superClassSignature) {
-        this.superClassSignature = superClassSignature;
-        return this;
-      }
-
-      public ClassSignatureBuilder addInterfaces(List<ClassTypeSignature> interfaces) {
-        superInterfaceSignatures.addAll(interfaces);
-        return this;
-      }
-
-      public ClassSignature build() {
-        ClassSignature classSignature =
-            new ClassSignature(formalTypeParameters, superClassSignature, superInterfaceSignatures);
-        return classSignature;
-      }
-    }
   }
 
   private static class InvalidClassSignature extends ClassSignature {
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
index d3a67a2..00534ba 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
@@ -6,10 +6,8 @@
 
 import static com.android.tools.r8.graph.GenericSignatureContextBuilder.TypeParameterContext.empty;
 
-import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
 import com.android.tools.r8.graph.GenericSignature.FormalTypeParameter;
 import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
-import com.android.tools.r8.utils.WorkList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -27,26 +25,26 @@
 
   private static class TypeParameterSubstitutions {
 
-    private final Map<String, FieldTypeSignature> parametersWithBounds;
+    private final Map<String, DexType> parametersWithBounds;
 
-    private TypeParameterSubstitutions(Map<String, FieldTypeSignature> parametersWithBounds) {
+    private TypeParameterSubstitutions(Map<String, DexType> parametersWithBounds) {
       this.parametersWithBounds = parametersWithBounds;
     }
 
     private static TypeParameterSubstitutions create(List<FormalTypeParameter> formals) {
-      Map<String, FieldTypeSignature> map = new HashMap<>();
+      Map<String, DexType> map = new IdentityHashMap<>();
       formals.forEach(
           formal -> {
+            DexType bound = null;
             if (formal.getClassBound() != null
                 && formal.getClassBound().hasSignature()
                 && formal.getClassBound().isClassTypeSignature()) {
-              map.put(formal.getName(), formal.getClassBound());
+              bound = formal.getClassBound().asClassTypeSignature().type;
             } else if (!formal.getInterfaceBounds().isEmpty()
                 && formal.getInterfaceBounds().get(0).isClassTypeSignature()) {
-              map.put(formal.getName(), formal.getInterfaceBounds().get(0));
-            } else {
-              map.put(formal.getName(), null);
+              bound = formal.getInterfaceBounds().get(0).asClassTypeSignature().type;
             }
+            map.put(formal.getName(), bound);
           });
       return new TypeParameterSubstitutions(map);
     }
@@ -57,11 +55,11 @@
     private static final TypeParameterContext EMPTY =
         new TypeParameterContext(Collections.emptyMap(), Collections.emptySet());
 
-    private final Map<String, FieldTypeSignature> prunedParametersWithBounds;
+    private final Map<String, DexType> prunedParametersWithBounds;
     private final Set<String> liveParameters;
 
     private TypeParameterContext(
-        Map<String, FieldTypeSignature> prunedParametersWithBounds, Set<String> liveParameters) {
+        Map<String, DexType> prunedParametersWithBounds, Set<String> liveParameters) {
       this.prunedParametersWithBounds = prunedParametersWithBounds;
       this.liveParameters = liveParameters;
     }
@@ -83,7 +81,7 @@
       return liveParameters.contains(parameterName);
     }
 
-    public FieldTypeSignature getPrunedSubstitution(String parameterName) {
+    public DexType getPrunedSubstitution(String parameterName) {
       assert !isLiveParameter(parameterName);
       return prunedParametersWithBounds.get(parameterName);
     }
@@ -95,7 +93,7 @@
       HashSet<String> newLiveParameters = new HashSet<>();
       newLiveParameters.addAll(liveParameters);
       newLiveParameters.addAll(typeParameters);
-      HashMap<String, FieldTypeSignature> newPruned = new HashMap<>();
+      HashMap<String, DexType> newPruned = new HashMap<>();
       prunedParametersWithBounds.forEach(
           (name, type) -> {
             if (!typeParameters.contains(name)) {
@@ -105,12 +103,11 @@
       return new TypeParameterContext(newPruned, newLiveParameters);
     }
 
-    public TypeParameterContext addPrunedSubstitutions(
-        Map<String, FieldTypeSignature> substitutions) {
+    public TypeParameterContext addPrunedSubstitutions(Map<String, DexType> substitutions) {
       if (substitutions.isEmpty()) {
         return this;
       }
-      HashMap<String, FieldTypeSignature> newPruned = new HashMap<>();
+      HashMap<String, DexType> newPruned = new HashMap<>();
       newPruned.putAll(prunedParametersWithBounds);
       newPruned.putAll(substitutions);
       HashSet<String> newLiveParameters = new HashSet<>();
@@ -124,6 +121,38 @@
     }
   }
 
+  public static class AlwaysLiveTypeParameterContext extends TypeParameterContext {
+
+    private AlwaysLiveTypeParameterContext() {
+      super(Collections.emptyMap(), Collections.emptySet());
+    }
+
+    public static AlwaysLiveTypeParameterContext create() {
+      return new AlwaysLiveTypeParameterContext();
+    }
+
+    @Override
+    public boolean isLiveParameter(String parameterName) {
+      return true;
+    }
+
+    @Override
+    public DexType getPrunedSubstitution(String parameterName) {
+      assert false;
+      return null;
+    }
+
+    @Override
+    public TypeParameterContext addLiveParameters(Collection<String> typeParameters) {
+      return this;
+    }
+
+    @Override
+    public TypeParameterContext addPrunedSubstitutions(Map<String, DexType> substitutions) {
+      return this;
+    }
+  }
+
   private GenericSignatureContextBuilder(
       Map<DexReference, TypeParameterSubstitutions> formalsInfo,
       Map<DexReference, DexReference> enclosingInfo) {
@@ -131,7 +160,7 @@
     this.enclosingInfo = enclosingInfo;
   }
 
-  public static GenericSignatureContextBuilder create(Collection<DexProgramClass> programClasses) {
+  public static GenericSignatureContextBuilder create(List<DexProgramClass> programClasses) {
     Map<DexReference, TypeParameterSubstitutions> formalsInfo = new IdentityHashMap<>();
     Map<DexReference, DexReference> enclosingInfo = new IdentityHashMap<>();
     programClasses.forEach(
@@ -172,24 +201,6 @@
     return new GenericSignatureContextBuilder(formalsInfo, enclosingInfo);
   }
 
-  public static GenericSignatureContextBuilder createForSingleClass(
-      AppView<?> appView, DexProgramClass clazz) {
-    WorkList<DexProgramClass> workList = WorkList.newIdentityWorkList(clazz);
-    while (workList.hasNext()) {
-      DexProgramClass current = workList.next();
-      DexClass outer = null;
-      if (current.getEnclosingMethodAttribute() != null) {
-        outer = appView.definitionFor(current.getEnclosingMethodAttribute().getEnclosingType());
-      } else if (current.getInnerClassAttributeForThisClass() != null) {
-        outer = appView.definitionFor(current.getInnerClassAttributeForThisClass().getOuter());
-      }
-      if (outer != null && outer.isProgramClass()) {
-        workList.addIfNotSeen(outer.asProgramClass());
-      }
-    }
-    return create(workList.getSeenSet());
-  }
-
   public TypeParameterContext computeTypeParameterContext(
       AppView<?> appView, DexReference reference, Predicate<DexType> wasPruned) {
     assert !wasPruned.test(reference.getContextType());
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 b0f4b63..56a6496 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
@@ -210,14 +210,11 @@
       assert fieldSignature.isTypeVariableSignature();
       String typeVariableName = fieldSignature.asTypeVariableSignature().typeVariable();
       if (!typeParameterContext.isLiveParameter(typeVariableName)) {
-        FieldTypeSignature substitution =
-            typeParameterContext.getPrunedSubstitution(typeVariableName);
+        DexType substitution = typeParameterContext.getPrunedSubstitution(typeVariableName);
         if (substitution == null) {
-          substitution = new ClassTypeSignature(appView.dexItemFactory().objectType);
+          substitution = appView.dexItemFactory().objectType;
         }
-        return substitution.isArgument()
-            ? substitution
-            : substitution.asArgument(WildcardIndicator.NONE);
+        return new ClassTypeSignature(substitution).asArgument(WildcardIndicator.NONE);
       }
       return fieldSignature;
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index be26efa..6f390ea 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -7,7 +7,6 @@
 import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
 import static com.android.tools.r8.ir.code.Invoke.Type.DIRECT;
 import static com.android.tools.r8.ir.code.Invoke.Type.STATIC;
-import static com.android.tools.r8.utils.ListUtils.filter;
 
 import com.android.tools.r8.androidapi.AndroidApiReferenceLevelCache;
 import com.android.tools.r8.errors.Unreachable;
@@ -30,16 +29,7 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DexTypeList;
-import com.android.tools.r8.graph.GenericSignature.ClassSignature;
-import com.android.tools.r8.graph.GenericSignature.ClassSignature.ClassSignatureBuilder;
-import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
-import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
-import com.android.tools.r8.graph.GenericSignature.FormalTypeParameter;
 import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
-import com.android.tools.r8.graph.GenericSignatureContextBuilder;
-import com.android.tools.r8.graph.GenericSignatureContextBuilder.TypeParameterContext;
-import com.android.tools.r8.graph.GenericSignatureCorrectnessHelper;
-import com.android.tools.r8.graph.GenericSignaturePartialTypeArgumentApplier;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
 import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
@@ -66,7 +56,6 @@
 import com.android.tools.r8.logging.Log;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.Box;
-import com.android.tools.r8.utils.CollectionUtils;
 import com.android.tools.r8.utils.FieldSignatureEquivalence;
 import com.android.tools.r8.utils.MethodSignatureEquivalence;
 import com.android.tools.r8.utils.OptionalBool;
@@ -1089,9 +1078,6 @@
         return false;
       }
 
-      // Rewrite generic signatures before we merge fields.
-      rewriteGenericSignatures(target, source, directMethods.values(), virtualMethods.values());
-
       // Step 2: Merge fields
       Set<DexString> existingFieldNames = new HashSet<>();
       for (DexEncodedField field : target.fields()) {
@@ -1152,122 +1138,9 @@
       // Step 4: Record merging.
       mergedClasses.put(source.type, target.type);
       assert !abortMerge;
-      assert GenericSignatureCorrectnessHelper.createForVerification(
-              appView, GenericSignatureContextBuilder.createForSingleClass(appView, target))
-          .evaluateSignaturesForClass(target)
-          .isValid();
       return true;
     }
 
-    /**
-     * The rewriting of generic signatures is pretty simple, but require some bookkeeping. We take
-     * the arguments to the base type:
-     *
-     * <pre>
-     *   class Sub<X> extends Base<X, String>
-     * </pre>
-     *
-     * for
-     *
-     * <pre>
-     *   class Base<T,R> extends OtherBase<T> implements I<R> {
-     *     T t() { ... };
-     *   }
-     * </pre>
-     *
-     * and substitute T -> X and R -> String
-     */
-    private void rewriteGenericSignatures(
-        DexProgramClass target,
-        DexProgramClass source,
-        Collection<DexEncodedMethod> directMethods,
-        Collection<DexEncodedMethod> virtualMethods) {
-      ClassSignature targetSignature = target.getClassSignature();
-      if (targetSignature.hasNoSignature()) {
-        return;
-      }
-      GenericSignaturePartialTypeArgumentApplier classApplier =
-          getGenericSignatureArgumentApplier(target, source);
-      if (classApplier == null) {
-        target.clearClassSignature();
-        target.members().forEach(DexEncodedMember::clearGenericSignature);
-        return;
-      }
-      // We could generate a substitution map.
-      ClassSignature rewrittenSource = classApplier.visitClassSignature(source.getClassSignature());
-      // The variables in the class signature is now rewritten to use the targets argument.
-      ClassSignatureBuilder builder = ClassSignature.builder();
-      builder.addFormalTypeParameters(targetSignature.getFormalTypeParameters());
-      if (rewrittenSource.hasSignature()) {
-        builder.setSuperClassSignature(rewrittenSource.superClassSignature());
-      } else if (source.isInterface()) {
-        builder.setSuperClassSignature(targetSignature.superClassSignature());
-      } else {
-        builder.setSuperClassSignature(new ClassTypeSignature(source.superType));
-      }
-      if (source.isInterface()) {
-        builder.addInterfaces(
-            filter(
-                targetSignature.superInterfaceSignatures(), iFace -> iFace.type() != source.type));
-      } else {
-        builder.addInterfaces(targetSignature.superInterfaceSignatures());
-      }
-      builder.addInterfaces(rewrittenSource.superInterfaceSignatures());
-      target.setClassSignature(builder.build());
-
-      // Go through all type-variable references for members and update them.
-      CollectionUtils.forEach(
-          method -> {
-            MethodTypeSignature methodSignature = method.getGenericSignature();
-            if (methodSignature.hasNoSignature()) {
-              return;
-            }
-            method.setGenericSignature(
-                classApplier
-                    .buildForMethod(methodSignature.getFormalTypeParameters())
-                    .visitMethodSignature(methodSignature));
-          },
-          directMethods,
-          virtualMethods);
-
-      source.forEachField(
-          field -> {
-            if (field.getGenericSignature().hasNoSignature()) {
-              return;
-            }
-            field.setGenericSignature(
-                classApplier.visitFieldTypeSignature(field.getGenericSignature()));
-          });
-    }
-
-    private GenericSignaturePartialTypeArgumentApplier getGenericSignatureArgumentApplier(
-        DexProgramClass target, DexProgramClass source) {
-      assert target.getClassSignature().hasSignature();
-      // We can assert proper structure below because the generic signature validator has run
-      // before and pruned invalid signatures.
-      List<FieldTypeSignature> genericArgumentsToSuperType =
-          target.getClassSignature().getGenericArgumentsToSuperType(source.type);
-      if (genericArgumentsToSuperType == null) {
-        assert false : "Type should be present in generic signature";
-        return null;
-      }
-      List<FormalTypeParameter> formals = source.getClassSignature().getFormalTypeParameters();
-      if (genericArgumentsToSuperType.size() != formals.size()) {
-        assert false : "Invalid argument count to formals";
-        return null;
-      }
-      Map<String, FieldTypeSignature> substitutionMap = new HashMap<>();
-      for (int i = 0; i < formals.size(); i++) {
-        // It is OK to override a generic type variable so we just use put.
-        substitutionMap.put(formals.get(i).getName(), genericArgumentsToSuperType.get(i));
-      }
-      return GenericSignaturePartialTypeArgumentApplier.build(
-          appView,
-          TypeParameterContext.empty().addPrunedSubstitutions(substitutionMap),
-          (type1, type2) -> true,
-          type -> true);
-    }
-
     private boolean restoreDebuggingState(Stream<DexEncodedMethod> toBeDiscarded) {
       toBeDiscarded.forEach(
           method -> {
diff --git a/src/main/java/com/android/tools/r8/utils/CollectionUtils.java b/src/main/java/com/android/tools/r8/utils/CollectionUtils.java
index 91b0638..6584f77 100644
--- a/src/main/java/com/android/tools/r8/utils/CollectionUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/CollectionUtils.java
@@ -7,21 +7,12 @@
 import com.google.common.collect.ImmutableSet;
 import java.util.Collection;
 import java.util.Set;
-import java.util.function.Consumer;
 
 public class CollectionUtils {
-
   public static <T> Set<T> mergeSets(Collection<T> first, Collection<T> second) {
     ImmutableSet.Builder<T> builder = ImmutableSet.builder();
     builder.addAll(first);
     builder.addAll(second);
     return builder.build();
   }
-
-  @SafeVarargs
-  public static <T> void forEach(Consumer<T> consumer, Collection<T>... collections) {
-    for (Collection<T> collection : collections) {
-      collection.forEach(consumer);
-    }
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/ListUtils.java b/src/main/java/com/android/tools/r8/utils/ListUtils.java
index 91bfbe6..5781f91 100644
--- a/src/main/java/com/android/tools/r8/utils/ListUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ListUtils.java
@@ -48,17 +48,6 @@
     return result != null ? result : defaultValue;
   }
 
-  public static <T> List<T> filter(List<T> list, Predicate<? super T> predicate) {
-    ArrayList<T> filtered = new ArrayList<>(list.size());
-    list.forEach(
-        t -> {
-          if (predicate.test(t)) {
-            filtered.add(t);
-          }
-        });
-    return filtered;
-  }
-
   public static <T> T first(List<T> list) {
     return list.get(0);
   }
diff --git a/src/main/java/com/android/tools/r8/utils/MapUtils.java b/src/main/java/com/android/tools/r8/utils/MapUtils.java
index c313c48..fc39146 100644
--- a/src/main/java/com/android/tools/r8/utils/MapUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/MapUtils.java
@@ -32,18 +32,18 @@
     return ignore -> supplier.get();
   }
 
-  public static <K1, V1, K2, V2> Map<K2, V2> map(
-      Map<K1, V1> map,
-      IntFunction<Map<K2, V2>> factory,
-      Function<K1, K2> keyMapping,
-      Function<V1, V2> valueMapping,
-      BiFunction<V2, V2, V2> valueMerger) {
-    Map<K2, V2> result = factory.apply(map.size());
+  public static <K, V> Map<K, V> map(
+      Map<K, V> map,
+      IntFunction<Map<K, V>> factory,
+      Function<K, K> keyMapping,
+      Function<V, V> valueMapping,
+      BiFunction<V, V, V> valueMerger) {
+    Map<K, V> result = factory.apply(map.size());
     map.forEach(
         (key, value) -> {
-          K2 newKey = keyMapping.apply(key);
-          V2 newValue = valueMapping.apply(value);
-          V2 existingValue = result.put(newKey, newValue);
+          K newKey = keyMapping.apply(key);
+          V newValue = valueMapping.apply(value);
+          V existingValue = result.put(newKey, newValue);
           if (existingValue != null) {
             result.put(newKey, valueMerger.apply(existingValue, newValue));
           }
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 98f9592..1fb82ab 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
@@ -13,23 +13,19 @@
 import com.android.tools.r8.TestDiagnosticMessagesImpl;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GenericSignature;
-import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
 import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
 import com.android.tools.r8.graph.GenericSignatureContextBuilder.TypeParameterContext;
 import com.android.tools.r8.graph.GenericSignaturePartialTypeArgumentApplier;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.BiPredicateUtils;
-import com.android.tools.r8.utils.MapUtils;
 import com.google.common.collect.ImmutableMap;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.BiPredicate;
@@ -117,15 +113,7 @@
         GenericSignaturePartialTypeArgumentApplier.build(
             appView,
             TypeParameterContext.empty()
-                .addPrunedSubstitutions(
-                    MapUtils.map(
-                        substitutions,
-                        HashMap::new,
-                        s -> s,
-                        ClassTypeSignature::new,
-                        (val1, val2) -> {
-                          throw new Unreachable("No keys should be merged");
-                        }))
+                .addPrunedSubstitutions(substitutions)
                 .addLiveParameters(liveVariables),
             removedLink,
             hasFormalTypeParameters);
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureVerticalMergeTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureVerticalMergeTest.java
index 724dd23..b8d02f6 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureVerticalMergeTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureVerticalMergeTest.java
@@ -4,17 +4,15 @@
 
 package com.android.tools.r8.graph.genericsignature;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.CoreMatchers.containsString;
 
+import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.NeverClassInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NoVerticalClassMerging;
-import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import java.lang.reflect.Type;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,31 +33,26 @@
     this.parameters = parameters;
   }
 
-  @Test
+  @Test(expected = CompilationFailedException.class)
   public void testR8() throws Exception {
-    R8TestRunResult runResult =
-        testForR8Compat(parameters.getBackend())
-            .addInnerClasses(getClass())
-            .setMinApi(parameters.getApiLevel())
-            .addKeepMainRule(Main.class)
-            .addKeepClassRules(I.class, J.class)
-            .addKeepClassAndMembersRulesWithAllowObfuscation(Base.class)
-            .addKeepAttributeInnerClassesAndEnclosingMethod()
-            .addKeepAttributeSignature()
-            .enableInliningAnnotations()
-            .enableNeverClassInliningAnnotations()
-            .enableNoVerticalClassMergingAnnotations()
-            .addVerticallyMergedClassesInspector(
-                inspector -> inspector.assertMergedIntoSubtype(A.class))
-            .run(parameters.getRuntime(), Main.class);
-    ClassSubject baseSubject = runResult.inspector().clazz(Base.class);
-    assertThat(baseSubject, isPresent());
-    runResult.assertSuccessWithOutputLines(
-        baseSubject.getFinalName() + "<" + String.class.getTypeName() + ">",
-        J.class.getTypeName() + "<X>",
-        I.class.getTypeName() + "<X>",
-        "I::t",
-        "B::r");
+    testForR8Compat(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(Main.class)
+        .addKeepClassRules(I.class, J.class)
+        .addKeepClassAndMembersRulesWithAllowObfuscation(Base.class)
+        .addKeepAttributeInnerClassesAndEnclosingMethod()
+        .addKeepAttributeSignature()
+        .enableInliningAnnotations()
+        .enableNeverClassInliningAnnotations()
+        .enableNoVerticalClassMergingAnnotations()
+        .addVerticallyMergedClassesInspector(
+            inspector -> inspector.assertMergedIntoSubtype(A.class))
+        .compileWithExpectedDiagnostics(
+            diagnostics -> {
+              diagnostics.assertErrorMessageThatMatches(
+                  containsString("Super type inconsistency in generic signature"));
+            });
   }
 
   public interface I<T> {