Keep original interface method forwarding bridge
When using put we override the DexEncodedMethod which no longer
contains information about it being a library override.
Bug: 177207079
Change-Id: I99af0a8d15a311ae52d31e52350377c9d4810768
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 55837f3..0f4aa9c 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -3672,24 +3672,21 @@
if (rootSet.noShrinking.containsMethod(singleTarget.getReference())) {
return;
}
- if (methodToKeep != singleTarget) {
+ if (methodToKeep != singleTarget
+ && !syntheticInterfaceMethodBridges.containsKey(methodToKeep.getDefinition().method)) {
assert null == methodToKeep.getHolder().lookupMethod(methodToKeep.getDefinition().method);
- ProgramMethod old =
- syntheticInterfaceMethodBridges.put(methodToKeep.getDefinition().method, methodToKeep);
- if (old == null) {
- if (singleTargetMethod.isLibraryMethodOverride().isTrue()) {
- methodToKeep.getDefinition().setLibraryMethodOverride(OptionalBool.TRUE);
- }
- DexProgramClass singleTargetHolder = singleTarget.getHolder();
- assert singleTargetHolder.isInterface();
- markVirtualMethodAsReachable(
- singleTargetMethod.method,
- singleTargetHolder.isInterface(),
- singleTarget,
- graphReporter.fakeReportShouldNotBeUsed());
- enqueueMarkMethodLiveAction(
- singleTarget, singleTarget, graphReporter.fakeReportShouldNotBeUsed());
+ if (singleTargetMethod.isLibraryMethodOverride().isTrue()) {
+ methodToKeep.getDefinition().setLibraryMethodOverride(OptionalBool.TRUE);
}
+ DexProgramClass singleTargetHolder = singleTarget.getHolder();
+ assert singleTargetHolder.isInterface();
+ markVirtualMethodAsReachable(
+ singleTargetMethod.method,
+ singleTargetHolder.isInterface(),
+ singleTarget,
+ graphReporter.fakeReportShouldNotBeUsed());
+ enqueueMarkMethodLiveAction(
+ singleTarget, singleTarget, graphReporter.fakeReportShouldNotBeUsed());
}
action.getAction().accept(builder);
}