Check for class initializer before removing visibility bridge
Bug: 220667525
Change-Id: I0c41da7a8742908d37f48e2e50fd10377d68cae8
diff --git a/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java b/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
index f24cac2..8055dc4 100644
--- a/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
+++ b/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
@@ -52,9 +52,16 @@
return false;
}
// This is a visibility forward, so check for the direct target.
- DexEncodedMethod targetMethod =
- appView.appInfo().unsafeResolveMethodDueToDexFormat(target).getSingleTarget();
- if (targetMethod == null || !targetMethod.accessFlags.isPublic()) {
+ ProgramMethod targetMethod =
+ appView.appInfo().unsafeResolveMethodDueToDexFormat(target).getResolvedProgramMethod();
+ if (targetMethod == null || !targetMethod.getAccessFlags().isPublic()) {
+ return false;
+ }
+ if (definition.isStatic()
+ && method.getHolder().hasClassInitializer()
+ && method
+ .getHolder()
+ .classInitializationMayHaveSideEffectsInContext(appView, targetMethod)) {
return false;
}
if (Log.ENABLED) {
diff --git a/src/test/java/com/android/tools/r8/shaking/RemoveCallToStaticInitTest.java b/src/test/java/com/android/tools/r8/shaking/RemoveCallToStaticInitTest.java
index 0d1fb3d..27c98f6 100644
--- a/src/test/java/com/android/tools/r8/shaking/RemoveCallToStaticInitTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/RemoveCallToStaticInitTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.shaking;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.NeverInline;
@@ -51,14 +50,12 @@
.addKeepMainRule(Main.class)
.enableInliningAnnotations()
.run(parameters.getRuntime(), Main.class)
- // TODO(b/220667525): R8 should emit EXPECTED
- .assertSuccessWithOutputLines(R8_EXPECTED)
+ .assertSuccessWithOutputLines(EXPECTED)
.inspect(
inspector -> {
ClassSubject clazz = inspector.clazz(B.class);
assertThat(clazz, isPresent());
- // TODO(b/220667525): Should not remove bridge due to class init.
- assertThat(clazz.uniqueMethodWithName("foo"), not(isPresent()));
+ assertThat(clazz.uniqueMethodWithName("foo"), isPresent());
});
}