Revert "Synthesize null-throwing body for abstract methods on non-abstract classes"

This reverts commit 28e9332ccce95f3bc6bdd717e292f76860ae1c91.

Reason for revert: The 800-smali test is failing because we are setting an API level.

Change-Id: I325f1dcbe8f1a22961adec4ac656d7b70fdb8abd
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index a1ca852..43bc47d 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -763,7 +763,7 @@
       }
 
       // Validity checks.
-      assert application.classes().stream().allMatch(clazz -> clazz.isValid(options));
+      assert application.classes().stream().allMatch(DexClass::isValid);
       assert appView.rootSet().verifyKeptItemsAreKept(application, appView.appInfo());
       assert appView
           .graphLense()
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index df86e96..3ef485f 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -600,12 +600,8 @@
     return fields;
   }
 
-  private DexEncodedMethod[] readMethods(
-      int size,
-      DexMethodAnnotation[] annotations,
-      DexParameterAnnotation[] parameters,
-      boolean skipCodes,
-      boolean ensureNonAbstract) {
+  private DexEncodedMethod[] readMethods(int size, DexMethodAnnotation[] annotations,
+      DexParameterAnnotation[] parameters, boolean skipCodes) {
     DexEncodedMethod[] methods = new DexEncodedMethod[size];
     int methodIndex = 0;
     MemberAnnotationIterator<DexMethod, DexAnnotationSet> annotationIterator =
@@ -622,21 +618,8 @@
         code = codes.get(codeOff);
       }
       DexMethod method = indexedItems.getMethod(methodIndex);
-      DexEncodedMethod encodedMethod =
-          new DexEncodedMethod(
-              method,
-              accessFlags,
-              annotationIterator.getNextFor(method),
-              parameterAnnotationsIterator.getNextFor(method),
-              code);
-      if (accessFlags.isAbstract() && ensureNonAbstract) {
-        accessFlags.unsetAbstract();
-        encodedMethod =
-            options.isGeneratingClassFiles()
-                ? encodedMethod.toEmptyThrowingMethodCf()
-                : encodedMethod.toEmptyThrowingMethodDex();
-      }
-      methods[i] = encodedMethod;
+      methods[i] = new DexEncodedMethod(method, accessFlags, annotationIterator.getNextFor(method),
+          parameterAnnotationsIterator.getNextFor(method), code);
     }
     return methods;
   }
@@ -709,17 +692,13 @@
                 directMethodsSize,
                 annotationsDirectory.methods,
                 annotationsDirectory.parameters,
-                classKind != ClassKind.PROGRAM,
-                options.canHaveDalvikAbstractMethodOnNonAbstractClassVerificationBug()
-                    && !flags.isAbstract());
+                classKind != ClassKind.PROGRAM);
         virtualMethods =
             readMethods(
                 virtualMethodsSize,
                 annotationsDirectory.methods,
                 annotationsDirectory.parameters,
-                classKind != ClassKind.PROGRAM,
-                options.canHaveDalvikAbstractMethodOnNonAbstractClassVerificationBug()
-                    && !flags.isAbstract());
+                classKind != ClassKind.PROGRAM);
       }
 
       AttributesAndAnnotations attrs =
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 4a2e1e3..9a1ea4c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -262,19 +262,6 @@
     return true;
   }
 
-  private boolean verifyNoAbstractMethodsOnNonAbstractClasses(
-      Iterable<DexEncodedMethod> methods, InternalOptions options) {
-    if (options.canHaveDalvikAbstractMethodOnNonAbstractClassVerificationBug()) {
-      if (!isAbstract()) {
-        for (DexEncodedMethod method : methods) {
-          assert !method.isAbstract()
-              : "Non-abstract method on abstract class: `" + method.method.toSourceString() + "`";
-        }
-      }
-    }
-    return true;
-  }
-
   private boolean verifyNoDuplicateMethods() {
     Set<DexMethod> unique = Sets.newIdentityHashSet();
     for (DexEncodedMethod method : methods()) {
@@ -585,10 +572,7 @@
     return null;
   }
 
-  public boolean isAbstract() {
-    return accessFlags.isAbstract();
-  }
-
+  // Tells whether this is an interface.
   public boolean isInterface() {
     return accessFlags.isInterface();
   }
@@ -892,9 +876,9 @@
     return getKotlinInfo() != null;
   }
 
-  public boolean isValid(InternalOptions options) {
-    assert verifyNoAbstractMethodsOnNonAbstractClasses(virtualMethods(), options);
-    assert !isInterface() || virtualMethods().stream().noneMatch(DexEncodedMethod::isFinal);
+  public boolean isValid() {
+    assert !isInterface()
+        || Arrays.stream(virtualMethods).noneMatch(method -> method.accessFlags.isFinal());
     assert verifyCorrectnessOfFieldHolders(fields());
     assert verifyNoDuplicateFields();
     assert verifyCorrectnessOfMethodHolders(methods());
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..cb90f1f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -231,14 +231,6 @@
     return compilationState != CompilationState.NOT_PROCESSED;
   }
 
-  public boolean isAbstract() {
-    return accessFlags.isAbstract();
-  }
-
-  public boolean isFinal() {
-    return accessFlags.isFinal();
-  }
-
   public boolean isInitializer() {
     checkIfObsolete();
     return isInstanceInitializer() || isClassInitializer();
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index a65dd20..0d42996 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1250,12 +1250,4 @@
   public boolean canHaveDalvikCatchHandlerVerificationBug() {
     return minApiLevel < AndroidApiLevel.L.getLevel();
   }
-
-  // Having an invoke instruction that targets an abstract method on a non-abstract class will fail
-  // with a verification error.
-  //
-  // See b/132953944.
-  public boolean canHaveDalvikAbstractMethodOnNonAbstractClassVerificationBug() {
-    return minApiLevel < AndroidApiLevel.L.getLevel();
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index ca01e2d..2b32d66 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -118,8 +118,6 @@
   private static Map<String, AndroidApiLevel> needMinSdkVersion =
       new ImmutableMap.Builder<String, AndroidApiLevel>()
           .put("004-JniTest", AndroidApiLevel.N)
-          // Has a non-abstract class with an abstract method.
-          .put("800-smali", AndroidApiLevel.L)
           // Android O
           .put("952-invoke-custom", AndroidApiLevel.O)
           .put("952-invoke-custom-kinds", AndroidApiLevel.O)
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java b/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java
index e9368e9..dc980d7 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java
@@ -85,23 +85,13 @@
 
   public class ClassBuilder extends Builder {
 
-    private boolean isAbstract = false;
-
     ClassBuilder(String name, String superName, List<String> implementedInterfaces) {
       super(name, superName, implementedInterfaces);
     }
 
-    public ClassBuilder setAbstract() {
-      isAbstract = true;
-      return this;
-    }
-
     public String toString() {
       StringBuilder builder = new StringBuilder();
       builder.append(".class public ");
-      if (isAbstract) {
-        builder.append("abstract ");
-      }
       builder.append(DescriptorUtils.javaTypeToDescriptor(name));
       builder.append("\n");
       appendSuper(builder);
@@ -174,12 +164,10 @@
     addClass(name, superName, ImmutableList.of());
   }
 
-  public ClassBuilder addClass(String name, String superName, List<String> implementedInterfaces) {
+  public void addClass(String name, String superName, List<String> implementedInterfaces) {
     assert !classes.containsKey(name);
     currentClassName = name;
-    ClassBuilder classBuilder = new ClassBuilder(name, superName, implementedInterfaces);
-    classes.put(name, classBuilder);
-    return classBuilder;
+    classes.put(name, new ClassBuilder(name, superName, implementedInterfaces));
   }
 
   public void addInterface(String name) {
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliDisassembleTest.java b/src/test/java/com/android/tools/r8/smali/SmaliDisassembleTest.java
index bbeed31..2297ebd 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliDisassembleTest.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliDisassembleTest.java
@@ -380,20 +380,20 @@
   @Test
   public void implementsInterface() {
     SmaliBuilder builder = new SmaliBuilder();
-    builder.addClass("Test", "java.lang.Object", ImmutableList.of("java.util.List")).setAbstract();
+    builder.addClass("Test", "java.lang.Object", ImmutableList.of("java.util.List"));
     builder.addAbstractMethod("int", "test", ImmutableList.of());
     AndroidApp application = buildApplication(builder);
 
     String expected =
-        ".class public abstract LTest;\n"
-            + "\n"
-            + ".super Ljava/lang/Object;\n"
-            + ".implements Ljava/util/List;\n"
-            + "\n"
-            + ".method public abstract test()I\n"
-            + ".end method\n"
-            + "\n"
-            + "# End of class LTest;\n";
+        ".class public LTest;\n" +
+            "\n" +
+            ".super Ljava/lang/Object;\n" +
+            ".implements Ljava/util/List;\n" +
+            "\n" +
+            ".method public abstract test()I\n" +
+            ".end method\n" +
+            "\n" +
+            "# End of class LTest;\n";
 
     assertEquals(expected, SmaliWriter.smali(application, new InternalOptions()));