Fix non-public override of interface method after class merging
Bug: 203446070
Change-Id: I701371da31c114b02db4ee8b332b75008c0d68be
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoWeakerAccessPrivileges.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoWeakerAccessPrivileges.java
index 6fcb172..399e807 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoWeakerAccessPrivileges.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoWeakerAccessPrivileges.java
@@ -14,7 +14,6 @@
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.optimize.argumentpropagation.utils.ProgramClassesBidirectedGraph;
import com.android.tools.r8.utils.collections.DexMethodSignatureSet;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
import java.util.Collection;
import java.util.IdentityHashMap;
@@ -44,11 +43,6 @@
@Override
public Collection<MergeGroup> apply(MergeGroup group) {
- // This policy is specific to issues that may arise from merging interfaces.
- if (group.isClassGroup()) {
- return ImmutableList.of(group);
- }
-
List<MergeGroup> newMergeGroups = new LinkedList<>();
Map<MergeGroup, DexMethodSignatureSet> inheritedInterfaceMethodsPerGroup =
new IdentityHashMap<>();
@@ -122,8 +116,10 @@
DexClass::isInterface,
superclass ->
inheritedInterfaceMethods.addAll(getOrComputeInheritedInterfaceMethods(superclass)));
- clazz.forEachClassMethodMatching(
- DexEncodedMethod::belongsToVirtualPool, inheritedInterfaceMethods::add);
+ if (clazz.isInterface()) {
+ clazz.forEachClassMethodMatching(
+ DexEncodedMethod::belongsToVirtualPool, inheritedInterfaceMethods::add);
+ }
inheritedInterfaceMethodsCache.put(clazz, inheritedInterfaceMethods);
return inheritedInterfaceMethods;
}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java
index daaefdf..f540d9d 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java
@@ -9,6 +9,7 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic;
import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.NeverClassInline;
@@ -19,6 +20,7 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.HorizontallyMergedClassesInspector;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -42,8 +44,7 @@
.addInnerClasses(getClass())
.addKeepMainRule(Main.class)
.addHorizontallyMergedClassesInspector(
- inspector ->
- inspector.assertIsCompleteMergeGroup(A.class, X.class).assertNoOtherClassesMerged())
+ HorizontallyMergedClassesInspector::assertNoClassesMerged)
.enableInliningAnnotations()
.enableNeverClassInliningAnnotations()
.enableNoHorizontalClassMergingAnnotations()
@@ -58,21 +59,12 @@
ClassSubject aClassSubject = inspector.clazz(A.class);
assertThat(aClassSubject, isPresent());
- assertThat(aClassSubject, isImplementing(iClassSubject));
+ assertThat(aClassSubject, not(isImplementing(iClassSubject)));
assertThat(
aClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isPackagePrivate()));
})
.run(parameters.getRuntime(), Main.class)
- .applyIf(
- parameters.isCfRuntime(),
- runResult -> runResult.assertSuccessWithOutputLines("A.m()", "Y.m()"),
- runResult ->
- runResult.applyIf(
- parameters.getDexRuntimeVersion().isDalvik(),
- ignore ->
- runResult.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
- ignore ->
- runResult.assertFailureWithErrorThatThrows(IllegalAccessError.class)));
+ .assertSuccessWithOutputLines("A.m()", "Y.m()");
}
static class Main {