Synthesize throwing body when merging abstract method to non-abstract class
Change-Id: I4a94a2b75ea79e3f7001d9afcddc675dc1f009d6
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index b44ad18..0b8569c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -590,6 +590,12 @@
return generateCodeFromTemplate(1, 0, insn);
}
+ public DexEncodedMethod toEmptyThrowingMethod(InternalOptions options) {
+ return options.isGeneratingClassFiles()
+ ? toEmptyThrowingMethodCf()
+ : toEmptyThrowingMethodDex();
+ }
+
public DexEncodedMethod toEmptyThrowingMethodDex() {
checkIfObsolete();
assert !shouldNotHaveCode();
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 96403ab..e1f379e 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -953,6 +953,12 @@
// Update the holder of [virtualMethod] using renameMethod().
DexEncodedMethod resultingVirtualMethod =
renameMethod(virtualMethod, availableMethodSignatures, Rename.NEVER);
+ if (appView.options().canHaveDalvikAbstractMethodOnNonAbstractClassVerificationBug()
+ && !target.isAbstract()) {
+ resultingVirtualMethod.accessFlags.unsetAbstract();
+ resultingVirtualMethod =
+ resultingVirtualMethod.toEmptyThrowingMethod(appView.options());
+ }
deferredRenamings.map(virtualMethod.method, resultingVirtualMethod.method);
deferredRenamings.recordMove(virtualMethod.method, resultingVirtualMethod.method);
add(virtualMethods, resultingVirtualMethod, MethodSignatureEquivalence.get());