Merge "Revert "Enforce class access flags to be valid.""
diff --git a/src/main/java/com/android/tools/r8/dex/Constants.java b/src/main/java/com/android/tools/r8/dex/Constants.java
index 7a3d631..12ae77f 100644
--- a/src/main/java/com/android/tools/r8/dex/Constants.java
+++ b/src/main/java/com/android/tools/r8/dex/Constants.java
@@ -14,9 +14,6 @@
   /** vdex file version number for Android O (API level 26) */
   public static final int ANDROID_O_VDEX_VERSION = 10;
 
-  // We apply Java 7 class file constraints on DEX files.
-  public static final int CORRESPONDING_CLASS_FILE_VERSION = 51;
-
   public static final int DEX_MAGIC_SIZE = 8;
 
   public static final int MAGIC_OFFSET = 0;
diff --git a/src/main/java/com/android/tools/r8/dex/DexFileReader.java b/src/main/java/com/android/tools/r8/dex/DexFileReader.java
index 812273b..e3559fe 100644
--- a/src/main/java/com/android/tools/r8/dex/DexFileReader.java
+++ b/src/main/java/com/android/tools/r8/dex/DexFileReader.java
@@ -10,7 +10,6 @@
 
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.code.InstructionFactory;
-import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.graph.ClassAccessFlags;
 import com.android.tools.r8.graph.ClassKind;
 import com.android.tools.r8.graph.Descriptor;
@@ -638,14 +637,10 @@
       DexType superclass = superclassIdx == NO_INDEX ? null : indexedItems.getType(superclassIdx);
       int srcIdx = sourceFileIndices[i];
       DexString source = srcIdx == NO_INDEX ? null : indexedItems.getString(srcIdx);
+      // fix annotations.
       DexType type = indexedItems.getType(classIndices[i]);
       ClassAccessFlags flags = ClassAccessFlags.fromDexAccessFlags(accessFlags[i]);
-      // Check if constraints from
-      // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 are met.
-      if (!flags.areValid(Constants.CORRESPONDING_CLASS_FILE_VERSION)) {
-        throw new CompilationError("Class " + type.toSourceString()
-            + " has illegal access flags. Found: " + flags, origin);
-      }
+      DexClass clazz;
       DexEncodedField[] staticFields = DexEncodedField.EMPTY_ARRAY;
       DexEncodedField[] instanceFields = DexEncodedField.EMPTY_ARRAY;
       DexEncodedMethod[] directMethods = DexEncodedMethod.EMPTY_ARRAY;
@@ -680,21 +675,22 @@
       AttributesAndAnnotations attrs =
           new AttributesAndAnnotations(type, annotationsDirectory.clazz, dexItemFactory);
 
-      DexClass clazz = classKind.create(
-          type,
-          Kind.DEX,
-          origin,
-          flags,
-          superclass,
-          typeListAt(interfacesOffsets[i]),
-          source,
-          attrs.getEnclosingMethodAttribute(),
-          attrs.getInnerClasses(),
-          attrs.getAnnotations(),
-          staticFields,
-          instanceFields,
-          directMethods,
-          virtualMethods);
+      clazz =
+          classKind.create(
+              type,
+              Kind.DEX,
+              origin,
+              flags,
+              superclass,
+              typeListAt(interfacesOffsets[i]),
+              source,
+              attrs.getEnclosingMethodAttribute(),
+              attrs.getInnerClasses(),
+              attrs.getAnnotations(),
+              staticFields,
+              instanceFields,
+              directMethods,
+              virtualMethods);
       classCollection.accept(clazz);  // Update the application object.
     }
   }
@@ -941,7 +937,7 @@
     MethodHandleType type = MethodHandleType.getKind(file.getUshort());
     file.getUshort(); // unused
     int indexFieldOrMethod = file.getUshort();
-    Descriptor<? extends DexItem, ? extends Descriptor<?, ?>> fieldOrMethod;
+    Descriptor<? extends DexItem, ? extends Descriptor<?,?>> fieldOrMethod;
     switch (type) {
       case INSTANCE_GET:
       case INSTANCE_PUT:
diff --git a/src/main/java/com/android/tools/r8/errors/CompilationError.java b/src/main/java/com/android/tools/r8/errors/CompilationError.java
index 4409816..060699e 100644
--- a/src/main/java/com/android/tools/r8/errors/CompilationError.java
+++ b/src/main/java/com/android/tools/r8/errors/CompilationError.java
@@ -3,13 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.errors;
 
-import com.android.tools.r8.origin.Origin;
-
 /**
  * Exception to signal an compilation error.
- * <p>
- * This is always an expected error and considered a user input issue. A user-understandable message
- * must be provided.
+ *
+ * This is always an expected error and considered a user input issue.
+ * A user-understandable message must be provided.
  */
 public class CompilationError extends RuntimeException {
 
@@ -20,8 +18,4 @@
   public CompilationError(String message, Throwable cause) {
     super(message, cause);
   }
-
-  public CompilationError(String message, Origin origin) {
-    super(origin + ": " + message);
-  }
 }
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/graph/AccessFlags.java b/src/main/java/com/android/tools/r8/graph/AccessFlags.java
index e2654aa..9f0471e 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessFlags.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessFlags.java
@@ -166,26 +166,20 @@
 
 
   public String toSmaliString() {
-    return toStringInternal(true);
+    return toString();
   }
 
   @Override
   public String toString() {
-    return toStringInternal(false);
-  }
-
-  private String toStringInternal(boolean ignoreSuper) {
     List<String> names = getNames();
     List<BooleanSupplier> predicates = getPredicates();
     StringBuilder builder = new StringBuilder();
     for (int i = 0; i < names.size(); i++) {
       if (predicates.get(i).getAsBoolean()) {
-        if (!ignoreSuper || !names.get(i).equals("super")) {
-          if (builder.length() > 0) {
-            builder.append(' ');
-          }
-          builder.append(names.get(i));
+        if (builder.length() > 0) {
+          builder.append(' ');
         }
+        builder.append(names.get(i));
       }
     }
     return builder.toString();
diff --git a/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java b/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
index 2ae041e..6430924 100644
--- a/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
+++ b/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
@@ -33,7 +33,6 @@
         .add("abstract")
         .add("annotation")
         .add("enum")
-        .add("super")
         .build();
   }
 
@@ -45,7 +44,6 @@
         .add(this::isAbstract)
         .add(this::isAnnotation)
         .add(this::isEnum)
-        .add(this::isSuper)
         .build();
   }
 
@@ -82,27 +80,6 @@
     return flags;
   }
 
-  /**
-   * Checks whether the constraints from
-   * https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 are met.
-   */
-  public boolean areValid(int majorVersion) {
-    if (isInterface()) {
-      // We ignore the super flags prior to JDK 9, as so did the VM.
-      if ((majorVersion >= 53) && isSuper()) {
-        return false;
-      }
-      // We require interfaces to be abstract from JDK 7 onwards. Old versions of javac seem to
-      // have produces package-info classes that are interfaces but not abstract.
-      if ((majorVersion >= 51) && (!isAbstract())) {
-        return false;
-      }
-      return !isFinal() && !isEnum();
-    } else {
-      return !isAnnotation() && (!isFinal() || !isAbstract());
-    }
-  }
-
   public boolean isInterface() {
     return isSet(Constants.ACC_INTERFACE);
   }
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index ba8a672..868ac10 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -8,7 +8,6 @@
 import static org.objectweb.asm.Opcodes.ASM6;
 
 import com.android.tools.r8.dex.Constants;
-import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexValue.DexValueAnnotation;
 import com.android.tools.r8.graph.DexValue.DexValueArray;
@@ -32,7 +31,6 @@
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Objects;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import org.objectweb.asm.AnnotationVisitor;
@@ -102,7 +100,6 @@
   }
 
   private static class CreateDexClassVisitor extends ClassVisitor {
-
     private final Origin origin;
     private final ClassKind classKind;
     private final JarApplicationReader application;
@@ -166,21 +163,6 @@
       this.version = version;
       accessFlags = ClassAccessFlags.fromCfAccessFlags(cleanAccessFlags(access));
       type = application.getTypeFromName(name);
-      // Check if constraints from
-      // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 are met.
-      if (!accessFlags.areValid(getMajorVersion())) {
-        throw new CompilationError("Illegal class file: Class " + name
-            + " has invalid access flags. Found: " + accessFlags.toString(), origin);
-      }
-      if (superName == null && !name.equals(Constants.JAVA_LANG_OBJECT_NAME)) {
-        throw new CompilationError("Illegal class file: Class " + name
-            + " is missing a super type.", origin);
-      }
-      if (accessFlags.isInterface()
-          && !Objects.equals(superName, Constants.JAVA_LANG_OBJECT_NAME)) {
-        throw new CompilationError("Illegal class file: Interface " + name
-            + " must extend class java.lang.Object. Found: " + Objects.toString(superName), origin);
-      }
       assert superName != null || name.equals(Constants.JAVA_LANG_OBJECT_NAME);
       superType = superName == null ? null : application.getTypeFromName(superName);
       this.interfaces = application.getTypeListFromNames(interfaces);
@@ -196,8 +178,8 @@
       }
       if (debug != null) {
         getAnnotations().add(
-            DexAnnotation.createSourceDebugExtensionAnnotation(
-                new DexValueString(application.getString(debug)), application.getFactory()));
+                DexAnnotation.createSourceDebugExtensionAnnotation(
+                    new DexValueString(application.getString(debug)), application.getFactory()));
       }
     }
 
@@ -278,14 +260,6 @@
       }
       return annotations;
     }
-
-    private int getMajorVersion() {
-      return version & 0xFFFF;
-    }
-
-    private int getMinorVersion() {
-      return ((version >> 16) & 0xFFFF);
-    }
   }
 
   private static DexAnnotationSet createAnnotationSet(List<DexAnnotation> annotations) {
@@ -295,7 +269,6 @@
   }
 
   private static class CreateFieldVisitor extends FieldVisitor {
-
     private final CreateDexClassVisitor parent;
     private final int access;
     private final String name;
@@ -393,7 +366,6 @@
   }
 
   private static class CreateMethodVisitor extends MethodVisitor {
-
     private final int access;
     private final String name;
     private final String desc;
@@ -569,7 +541,6 @@
   }
 
   private static class CreateAnnotationVisitor extends AnnotationVisitor {
-
     private final JarApplicationReader application;
     private final BiConsumer<List<DexString>, List<DexValue>> onVisitEnd;
     private List<DexString> names = null;
@@ -615,7 +586,7 @@
 
     private void addElement(String name, DexValue value) {
       if (name != null) {
-        if (names == null) {
+        if (names == null){
           names = new ArrayList<>();
         }
         names.add(application.getString(name));
diff --git a/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java b/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
index e8ee800..eba7f8e 100644
--- a/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
+++ b/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8.utils;
 
 import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
-import static com.android.tools.r8.utils.FileUtils.isClassFile;
 
 import com.android.tools.r8.ClassFileResourceProvider;
 import com.android.tools.r8.Resource;
@@ -42,9 +41,10 @@
           if (child.isDirectory()) {
             collectClassDescriptors(child.toPath(), result);
           } else {
-            Path relative = root.relativize(child.toPath());
-            if (isClassFile(relative)) {
-              result.add(DescriptorUtils.guessTypeDescriptor(relative));
+            String relative = root.relativize(child.toPath()).toString();
+            if (relative.endsWith(CLASS_EXTENSION)) {
+              result.add("L" + relative.substring(
+                  0, relative.length() - CLASS_EXTENSION.length()) + ";");
             }
           }
         }
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index f0967bf..5eb7168 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -855,7 +855,6 @@
           .put("960-default-smali", TestCondition.match(TestCondition.R8_COMPILER))
           .put("966-default-conflict", TestCondition.match(TestCondition.R8_COMPILER))
           .put("972-iface-super-multidex", TestCondition.match(TestCondition.R8_COMPILER))
-          .put("161-final-abstract-class", TestCondition.any())
           .build();
 
   // Tests that does not have dex input for some toolchains.
diff --git a/src/test/smali/illegal-invokes/Iface.smali b/src/test/smali/illegal-invokes/Iface.smali
index 5f074dce..d66777c 100644
--- a/src/test/smali/illegal-invokes/Iface.smali
+++ b/src/test/smali/illegal-invokes/Iface.smali
@@ -2,7 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-.class interface public abstract LIface;
+.class interface public LIface;
 .super Ljava/lang/Object;
 
 .method public abstract bar()V