Fix IllegalAccessError from vertical class merging
Fixes: b/309727365
Change-Id: If6f4af7f27d93c8145e893d8ac0ab614272a9792
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 2397d02..9baa032 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -465,6 +465,12 @@
if (!target.isPublic()) {
return true;
}
+ for (DexType sourceInterface : source.getInterfaces()) {
+ DexClass sourceInterfaceClass = appView.definitionFor(sourceInterface);
+ if (sourceInterfaceClass != null && !sourceInterfaceClass.isPublic()) {
+ return true;
+ }
+ }
for (DexEncodedField field : source.fields()) {
if (!(field.isPublic() || field.isPrivate())) {
return true;
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/InterfaceAccessibleAfterVerticalClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/InterfaceAccessibleAfterVerticalClassMergingTest.java
index 0eda102..990e2d2 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/InterfaceAccessibleAfterVerticalClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/InterfaceAccessibleAfterVerticalClassMergingTest.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.classmerging.vertical.testclasses.InterfaceAccessibleAfterVerticalClassMergingTestClasses;
import com.android.tools.r8.classmerging.vertical.testclasses.InterfaceAccessibleAfterVerticalClassMergingTestClasses.A;
+import com.android.tools.r8.utils.codeinspector.VerticallyMergedClassesInspector;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -31,17 +32,13 @@
.addInnerClasses(getClass(), InterfaceAccessibleAfterVerticalClassMergingTestClasses.class)
.addKeepMainRule(Main.class)
.addVerticallyMergedClassesInspector(
- inspector -> inspector.assertMergedIntoSubtype(A.class))
+ VerticallyMergedClassesInspector::assertNoClassesMerged)
.enableNoUnusedInterfaceRemovalAnnotations()
.enableNoVerticalClassMergingAnnotations()
.setMinApi(parameters)
.compile()
.run(parameters.getRuntime(), Main.class)
- // TODO(b/309727365): Should succeed.
- .assertFailureWithErrorThatThrows(
- parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isDalvik()
- ? NoClassDefFoundError.class
- : IllegalAccessError.class);
+ .assertSuccessWithOutputLines("B");
}
static class Main {