Convert default methods with possible IAEs to abstract when desugaring
Bug: b/335240266
Change-Id: Ic8c7d2b8a4fdfa07de40461665f2575525e22c65
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
index 54dc05d..21b8de8 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -81,14 +81,27 @@
}
public boolean canBeConvertedToAbstractMethod(AppView<AppInfoWithLiveness> appView) {
- return (appView.options().canUseAbstractMethodOnNonAbstractClass()
+ if (!(appView.options().canUseAbstractMethodOnNonAbstractClass()
|| getHolder().isAbstract()
|| getHolder().isInterface())
- && !getAccessFlags().isNative()
- && !getAccessFlags().isPrivate()
- && !getAccessFlags().isStatic()
- && !getDefinition().isInstanceInitializer()
- && !appView.appInfo().isFailedMethodResolutionTarget(getReference());
+ || getAccessFlags().isNative()
+ || getAccessFlags().isPrivate()
+ || getAccessFlags().isStatic()
+ || getDefinition().isInstanceInitializer()) {
+ return false;
+ }
+ // If the method has a failed resolution, then keep the method as non-abstract to preserve
+ // runtime errors, except when interface method desugaring is required.
+ if (appView.appInfo().isFailedMethodResolutionTarget(getReference())) {
+ boolean mustBeConvertedToAbstractMethod =
+ !appView.options().canUseDefaultAndStaticInterfaceMethods()
+ && getHolder().isInterface()
+ && getAccessFlags().belongsToVirtualPool();
+ if (!mustBeConvertedToAbstractMethod) {
+ return false;
+ }
+ }
+ return true;
}
public void convertToAbstractOrThrowNullMethod(AppView<AppInfoWithLiveness> appView) {