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