Fix AbstractMethodError from experimental injection of super classes Bug: b/309575527 Change-Id: I48a0aacb02f9032fbabad95b8b99491a663e68d7
diff --git a/src/main/java/com/android/tools/r8/optimize/BridgeHoistingToSharedSyntheticSuperClass.java b/src/main/java/com/android/tools/r8/optimize/BridgeHoistingToSharedSyntheticSuperClass.java index dd9b315..50dfefc 100644 --- a/src/main/java/com/android/tools/r8/optimize/BridgeHoistingToSharedSyntheticSuperClass.java +++ b/src/main/java/com/android/tools/r8/optimize/BridgeHoistingToSharedSyntheticSuperClass.java
@@ -146,13 +146,24 @@ method -> { IRCode code = method.buildIR(appView, MethodConversionOptions.nonConverting()); BridgeInfo bridgeInfo = BridgeAnalyzer.analyzeMethod(method.getDefinition(), code); - if (bridgeInfo != null) { - getSimpleFeedback().setBridgeInfo(method, bridgeInfo); - if (bridgeInfo.isVirtualBridgeInfo()) { - bridgeSpecification.addBridge( - method.getMethodSignature(), bridgeInfo.asVirtualBridgeInfo()); - } + if (bridgeInfo == null) { + return; } + getSimpleFeedback().setBridgeInfo(method, bridgeInfo); + if (!bridgeInfo.isVirtualBridgeInfo()) { + return; + } + VirtualBridgeInfo virtualBridgeInfo = bridgeInfo.asVirtualBridgeInfo(); + boolean isInvokedMethodPresentOnSuper = + appView + .appInfo() + .resolveMethodOnClass(clazz.getSuperType(), virtualBridgeInfo.getInvokedMethod()) + .isSingleResolution(); + if (isInvokedMethodPresentOnSuper) { + // No need to insert a method on a synthetic super class in this case. + return; + } + bridgeSpecification.addBridge(method.getMethodSignature(), virtualBridgeInfo); }); return bridgeSpecification; }