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());