Get rid of CompilationException

Change all users to CompilationError.

Also remove "throws ApiLevelException" inadvertently added by Id4ea6c1e3
f4fc3b0ad ("Processing of @CovariantReturnType annotations", 2018-05-24).

Most changes were made automatically using the following commands:

sed -i \
	-e "s/throws CompilationException {/{/"
	-e "s/\(throws .*\), CompilationException/\1/"
	-e "s/throws CompilationException;/;/" \
	-e "s/throws CompilationException, /throws /" \
	`git grep -l CompilationException`
git diff -U0 | google-java-format-diff.py -p1 -i

Change-Id: I66ef9069a1704341f6dd05ae48c563556b9cef57
diff --git a/src/main/java/com/android/tools/r8/CompatDxHelper.java b/src/main/java/com/android/tools/r8/CompatDxHelper.java
index 627f417..f540ed0 100644
--- a/src/main/java/com/android/tools/r8/CompatDxHelper.java
+++ b/src/main/java/com/android/tools/r8/CompatDxHelper.java
@@ -9,8 +9,7 @@
 import java.io.IOException;
 
 public class CompatDxHelper {
-  public static void run(D8Command command, Boolean minimalMainDex)
-      throws IOException, CompilationException {
+  public static void run(D8Command command, Boolean minimalMainDex) throws IOException {
     AndroidApp app = command.getInputApp();
     InternalOptions options = command.getInternalOptions();
     // DX does not desugar.
diff --git a/src/main/java/com/android/tools/r8/CompilationException.java b/src/main/java/com/android/tools/r8/CompilationException.java
deleted file mode 100644
index 8e1e56c..0000000
--- a/src/main/java/com/android/tools/r8/CompilationException.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
-// 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.
-package com.android.tools.r8;
-
-/**
- * Exception to signal an compilation error.
- *
- * This is always an expected error and considered a user input issue.
- * A user-understandable message must be provided.
- */
-public class CompilationException extends Exception {
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * Construct the exception with a {@link String} message.
-   * @param message the message
-   */
-  public CompilationException(String message) {
-    super(message);
-  }
-
-  /**
-   * Construct the exception with a {@link String} message and a {@link Throwable} cause.
-   * @param message the message
-   * @param cause the cause
-   */
-  public CompilationException(String message, Throwable cause) {
-    super(message, cause);
-  }
-
-  /**
-   * Construct the exception with a {@link Throwable} cause.
-   * @param cause the cause
-   */
-  public CompilationException(Throwable cause) {
-    super(cause.getMessage(), cause);
-  }
-
-  protected CompilationException() {
-    super();
-  }
-
-  public String getMessageForD8() {
-    return super.getMessage();
-  }
-
-  public String getMessageForR8() {
-    return super.getMessage();
-  }
-}
-
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 1db187e..06cf0bb 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -121,8 +121,7 @@
     ExceptionUtils.withMainProgramHandler(() -> run(args));
   }
 
-  static void runForTesting(AndroidApp inputApp, InternalOptions options)
-      throws IOException, CompilationException {
+  static void runForTesting(AndroidApp inputApp, InternalOptions options) throws IOException {
     ExecutorService executor = ThreadUtils.getExecutorService(options);
     try {
       run(inputApp, options, executor);
@@ -149,7 +148,7 @@
   }
 
   private static void run(AndroidApp inputApp, InternalOptions options, ExecutorService executor)
-      throws IOException, CompilationException {
+      throws IOException {
     Timing timing = new Timing("D8");
     try {
       // Disable global optimizations.
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
index 9c76484..5987b99 100644
--- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
+++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -67,7 +67,7 @@
       InternalOptions options,
       Boolean minimalMainDex,
       Map<String, Integer> inputOrdering)
-      throws IOException, CompilationException {
+      throws IOException {
     options.enableDesugaring = false;
     options.enableMainDexListCheck = false;
     options.minimalMainDex = minimalMainDex;
@@ -106,7 +106,7 @@
   }
 
   public static void runD8ForTesting(D8Command command, boolean dontCreateMarkerInD8)
-      throws IOException, CompilationException {
+      throws IOException {
     InternalOptions options = command.getInternalOptions();
     options.testing.dontCreateMarkerInD8 = dontCreateMarkerInD8;
     D8.runForTesting(command.getInputApp(), options);
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
index 1fcd70a..2d52ec9 100644
--- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java
+++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -40,8 +40,7 @@
     try {
       ExceptionUtils.withCompilationHandler(
           command.getReporter(),
-          () -> run(command, featureClassMapping, output, proguardMap, executor),
-          CompilationException::getMessage);
+          () -> run(command, featureClassMapping, output, proguardMap, executor));
     } finally {
       executor.shutdown();
     }
@@ -53,7 +52,7 @@
       String output,
       String proguardMap,
       ExecutorService executor)
-      throws IOException, CompilationException {
+      throws IOException {
     InternalOptions options = command.getInternalOptions();
     options.enableDesugaring = false;
     options.enableMainDexListCheck = false;
@@ -135,7 +134,7 @@
   }
 
   public static void runD8ForTesting(D8Command command, boolean dontCreateMarkerInD8)
-      throws IOException, CompilationException {
+      throws IOException {
     InternalOptions options = command.getInternalOptions();
     options.testing.dontCreateMarkerInD8 = dontCreateMarkerInD8;
     D8.runForTesting(command.getInputApp(), options);
diff --git a/src/main/java/com/android/tools/r8/ExtractMarker.java b/src/main/java/com/android/tools/r8/ExtractMarker.java
index ced0b4c..734dc4a 100644
--- a/src/main/java/com/android/tools/r8/ExtractMarker.java
+++ b/src/main/java/com/android/tools/r8/ExtractMarker.java
@@ -94,7 +94,7 @@
   }
 
   public static void main(String[] args)
-      throws IOException, CompilationException, ExecutionException, ResourceException {
+      throws IOException, ExecutionException, ResourceException {
     ExtractMarkerCommand.Builder builder = ExtractMarkerCommand.parse(args);
     ExtractMarkerCommand command = builder.build();
     if (command.isPrintHelp()) {
diff --git a/src/main/java/com/android/tools/r8/ExtractMarkerCommand.java b/src/main/java/com/android/tools/r8/ExtractMarkerCommand.java
index 9555d3b..598d8e0 100644
--- a/src/main/java/com/android/tools/r8/ExtractMarkerCommand.java
+++ b/src/main/java/com/android/tools/r8/ExtractMarkerCommand.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
+import com.android.tools.r8.errors.CompilationError;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -54,7 +55,7 @@
       return this;
     }
 
-    public ExtractMarkerCommand build() throws CompilationException, IOException {
+    public ExtractMarkerCommand build() throws IOException {
       // If printing versions ignore everything else.
       if (isPrintHelp()) {
         return new ExtractMarkerCommand(isPrintHelp());
@@ -76,15 +77,13 @@
     return new Builder();
   }
 
-  public static Builder parse(String[] args)
-      throws CompilationException, IOException {
+  public static Builder parse(String[] args) throws IOException {
     Builder builder = builder();
     parse(args, builder);
     return builder;
   }
 
-  private static void parse(String[] args, Builder builder)
-      throws CompilationException, IOException {
+  private static void parse(String[] args, Builder builder) throws IOException {
     for (int i = 0; i < args.length; i++) {
       String arg = args[i].trim();
       if (arg.length() == 0) {
@@ -101,7 +100,7 @@
         builder.setPrintHelp(true);
       } else {
         if (arg.startsWith("--")) {
-          throw new CompilationException("Unknown option: " + arg);
+          throw new CompilationError("Unknown option: " + arg);
         }
         builder.addProgramFile(Paths.get(arg));
       }
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 16c9de8..d14f96e 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -214,8 +214,7 @@
     return result;
   }
 
-  static void runForTesting(AndroidApp app, InternalOptions options)
-      throws IOException, CompilationException {
+  static void runForTesting(AndroidApp app, InternalOptions options) throws IOException {
     ExecutorService executor = ThreadUtils.getExecutorService(options);
     try {
       run(app, options, executor);
@@ -224,16 +223,12 @@
     }
   }
 
-  private static void run(
-      AndroidApp app,
-      InternalOptions options,
-      ExecutorService executor)
-      throws IOException, CompilationException {
+  private static void run(AndroidApp app, InternalOptions options, ExecutorService executor)
+      throws IOException {
     new R8(options).run(app, executor);
   }
 
-  private void run(AndroidApp inputApp, ExecutorService executorService)
-      throws IOException, CompilationException {
+  private void run(AndroidApp inputApp, ExecutorService executorService) throws IOException {
     assert options.programConsumer != null;
     if (options.quiet) {
       System.setOut(new PrintStream(ByteStreams.nullOutputStream()));
@@ -503,31 +498,15 @@
     }
   }
 
-  static void unwrapExecutionException(ExecutionException executionException)
-      throws CompilationException {
+  static void unwrapExecutionException(ExecutionException executionException) {
     Throwable cause = executionException.getCause();
     if (cause instanceof CompilationError) {
       // add original exception as suppressed exception to provide the original stack trace
       cause.addSuppressed(executionException);
       throw (CompilationError) cause;
-    } else if (cause instanceof CompilationException) {
-      cause.addSuppressed(executionException);
-      throw (CompilationException) cause;
     } else if (cause instanceof RuntimeException) {
-      // ForkJoinPool wraps checked exceptions in RuntimeExceptions
-      if (cause.getCause() != null
-          && cause.getCause() instanceof CompilationException) {
-        cause.addSuppressed(executionException);
-        throw (CompilationException) cause.getCause();
-      // ForkJoinPool sometimes uses 2 levels of RuntimeExceptions, to provide accurate stack traces
-      } else if (cause.getCause() != null && cause.getCause().getCause() != null
-          && cause.getCause().getCause() instanceof CompilationException) {
-        cause.addSuppressed(executionException);
-        throw (CompilationException) cause.getCause().getCause();
-      } else {
-        cause.addSuppressed(executionException);
-        throw (RuntimeException) cause;
-      }
+      cause.addSuppressed(executionException);
+      throw (RuntimeException) cause;
     } else {
       throw new RuntimeException(executionException.getMessage(), cause);
     }
diff --git a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
index 250ca3b..1336f95 100644
--- a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
+++ b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
@@ -6,7 +6,6 @@
 import static com.android.tools.r8.benchmarks.BenchmarkUtils.printRuntimeNanoseconds;
 
 import com.android.tools.r8.ClassFileResourceProvider;
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
@@ -112,7 +111,7 @@
       boolean desugar,
       Map<String, ProgramResource> outputs,
       ExecutorService executor)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
 
     ProgramConsumer consumer =
         new DexFilePerClassFileConsumer.ForwardingConsumer(null) {
@@ -155,7 +154,7 @@
       boolean desugar,
       Map<String, ProgramResource> outputs,
       ExecutorService executor)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     ProgramConsumer consumer =
         new ForwardingConsumer(null) {
           @Override
@@ -199,7 +198,7 @@
 
   private static void merge(
       boolean desugar, Map<String, ProgramResource> outputs, ExecutorService executor)
-      throws IOException, CompilationException, CompilationFailedException, ResourceException {
+      throws IOException, CompilationFailedException, ResourceException {
     Builder builder =
         D8Command.builder()
             .setMinApiLevel(API)
@@ -221,7 +220,7 @@
   }
 
   public static void main(String[] args)
-      throws IOException, CompilationException, CompilationFailedException, ResourceException {
+      throws IOException, CompilationFailedException, ResourceException {
     boolean desugar = Arrays.asList(args).contains("--desugar");
     Path input = desugar ? JAR_NOT_DESUGARED : JAR_DESUGARED;
     InMemoryClassPathProvider provider = new InMemoryClassPathProvider(input);
diff --git a/src/main/java/com/android/tools/r8/benchmarks/IncrementalDexingBenchmark.java b/src/main/java/com/android/tools/r8/benchmarks/IncrementalDexingBenchmark.java
index 0aaefd9..3f241a0 100644
--- a/src/main/java/com/android/tools/r8/benchmarks/IncrementalDexingBenchmark.java
+++ b/src/main/java/com/android/tools/r8/benchmarks/IncrementalDexingBenchmark.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.benchmarks;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
@@ -20,7 +19,7 @@
   private static final int ITERATIONS = 1000;
 
   public static void compile(ExecutorService executor)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     D8.run(
         D8Command.builder()
             .addProgramFiles(Paths.get("build/test/examples/arithmetic.jar"))
@@ -43,8 +42,7 @@
         executor);
   }
 
-  public static void main(String[] args)
-      throws IOException, CompilationException, CompilationFailedException {
+  public static void main(String[] args) throws IOException, CompilationFailedException {
     int threads = Integer.min(Runtime.getRuntime().availableProcessors(), 16) / 2;
     ExecutorService executor = ThreadUtils.getExecutorService(threads);
     try {
diff --git a/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java b/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
index b270200..6599591 100644
--- a/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
+++ b/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8.compatdexbuilder;
 
 import com.android.tools.r8.CompatDxHelper;
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
@@ -154,7 +153,7 @@
   }
 
   private DexConsumer dexEntry(ZipFile zipFile, ZipEntry classEntry, ExecutorService executor)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     DexConsumer consumer = new DexConsumer();
     D8Command.Builder builder = D8Command.builder();
     CompatDxHelper.ignoreDexInArchive(builder);
diff --git a/src/main/java/com/android/tools/r8/compatdx/CompatDx.java b/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
index b9131e5..f512a34 100644
--- a/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
+++ b/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
@@ -11,7 +11,6 @@
 import static com.android.tools.r8.utils.FileUtils.isZipFile;
 
 import com.android.tools.r8.CompatDxHelper;
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8Command;
@@ -312,9 +311,6 @@
   public static void main(String[] args) throws IOException {
     try {
       run(args);
-    } catch (CompilationException e) {
-      System.err.println(e.getMessage());
-      System.exit(1);
     } catch (DxUsageMessage e) {
       System.err.println(USAGE_HEADER);
       e.printHelpOn(System.err);
@@ -325,7 +321,7 @@
   }
 
   private static void run(String[] args)
-      throws DxUsageMessage, IOException, CompilationException, CompilationFailedException {
+      throws DxUsageMessage, IOException, CompilationFailedException {
     DxCompatOptions dexArgs = DxCompatOptions.parse(args);
     if (dexArgs.help) {
       printHelpOn(System.out);
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index 66931e3..615a3e2 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -5,12 +5,12 @@
 package com.android.tools.r8.compatproguard;
 
 import com.android.tools.r8.CompatProguardCommandBuilder;
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.Version;
+import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.origin.CommandLineOrigin;
 import com.android.tools.r8.utils.AbortException;
 import com.google.common.collect.ImmutableList;
@@ -58,7 +58,7 @@
       this.printHelpAndExit = printHelpAndExit;
     }
 
-    public static CompatProguardOptions parse(String[] args) throws CompilationException {
+    public static CompatProguardOptions parse(String[] args) {
       String output = null;
       int minApi = 1;
       boolean forceProguardCompatibility = false;
@@ -97,7 +97,7 @@
             } else if (arg.equals("--no-locals")) {
               noLocals = true;
             } else if (arg.equals("-outjars")) {
-              throw new CompilationException(
+              throw new CompilationError(
                   "Proguard argument -outjar is not supported. Use R8 compatible --output flag");
             } else {
               if (currentLine.length() > 0) {
@@ -150,8 +150,7 @@
     CompatProguardOptions.print();
   }
 
-  private static void run(String[] args)
-      throws IOException, CompilationException, CompilationFailedException {
+  private static void run(String[] args) throws IOException, CompilationFailedException {
     // Run R8 passing all the options from the command line as a Proguard configuration.
     CompatProguardOptions options = CompatProguardOptions.parse(args);
     if (options.printHelpAndExit || options.output == null) {
@@ -175,9 +174,6 @@
   public static void main(String[] args) throws IOException {
     try {
       run(args);
-    } catch (CompilationException e) {
-      System.err.println(e.getMessage());
-      System.exit(1);
     } catch (CompilationFailedException | AbortException e) {
       // Detail of the errors were already reported
       System.err.println("Compilation failed");
diff --git a/src/main/java/com/android/tools/r8/errors/DexOverflowException.java b/src/main/java/com/android/tools/r8/errors/DexOverflowException.java
index a392080..818c980 100644
--- a/src/main/java/com/android/tools/r8/errors/DexOverflowException.java
+++ b/src/main/java/com/android/tools/r8/errors/DexOverflowException.java
@@ -3,16 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.errors;
 
-import com.android.tools.r8.CompilationException;
-
 /**
  * Signals when there were too many items to fit in a given dex file.
  */
-public class DexOverflowException extends CompilationException {
-
-  protected DexOverflowException() {
-    super();
-  }
+public class DexOverflowException extends CompilationError {
 
   public DexOverflowException(String message) {
     super(message);
diff --git a/src/main/java/com/android/tools/r8/errors/MainDexOverflowException.java b/src/main/java/com/android/tools/r8/errors/MainDexOverflowException.java
index e570c81..7c3d87d 100644
--- a/src/main/java/com/android/tools/r8/errors/MainDexOverflowException.java
+++ b/src/main/java/com/android/tools/r8/errors/MainDexOverflowException.java
@@ -8,32 +8,20 @@
  * legacy and there are too many classes to fit in the main dex.
  */
 public class MainDexOverflowException extends DexOverflowException {
-  private final boolean hasMainDexList;
-  private final long numOfMethods;
-  private final long numOfFields;
-  private final long maxNumOfEntries;
 
   public MainDexOverflowException(
       boolean hasMainDexList, long numOfMethods, long numOfFields, long maxNumOfEntries) {
-    super();
-    this.hasMainDexList = hasMainDexList;
-    this.numOfMethods = numOfMethods;
-    this.numOfFields = numOfFields;
-    this.maxNumOfEntries = maxNumOfEntries;
+    super(getMessage(hasMainDexList, numOfMethods, numOfFields, maxNumOfEntries));
   }
 
-  private StringBuilder getGeneralMessage() {
+  private static String getMessage(
+      boolean hasMainDexList, long numOfMethods, long maxNumOfEntries, long numOfFields) {
     StringBuilder messageBuilder = new StringBuilder();
     // General message: Cannot fit.
     messageBuilder.append("Cannot fit requested classes in ");
     messageBuilder.append(hasMainDexList ? "the main-" : "a single ");
     messageBuilder.append("dex file");
-
-    return messageBuilder;
-  }
-
-  private String getNumberRelatedMessage() {
-    StringBuilder messageBuilder = new StringBuilder();
+    messageBuilder.append(" (");
     // Show the numbers of methods and/or fields that exceed the limit.
     if (numOfMethods > maxNumOfEntries) {
       messageBuilder.append("# methods: ");
@@ -48,41 +36,7 @@
       messageBuilder.append(numOfFields);
       messageBuilder.append(" > ").append(maxNumOfEntries);
     }
-
-    return messageBuilder.toString();
-  }
-
-  @Override
-  public String getMessage() {
-    // Default message
-    return getGeneralMessage()
-        .append(" (")
-        .append(getNumberRelatedMessage())
-        .append(")")
-        .toString();
-  }
-
-  @Override
-  public String getMessageForD8() {
-    StringBuilder messageBuilder = getGeneralMessage();
-    if (!hasMainDexList) {
-      messageBuilder.append(". ");
-      messageBuilder.append("Try supplying a main-dex list");
-    }
-    messageBuilder.append(".").append(System.getProperty("line.separator"));
-    messageBuilder.append(getNumberRelatedMessage());
-    return messageBuilder.toString();
-  }
-
-  @Override
-  public String getMessageForR8() {
-    StringBuilder messageBuilder = getGeneralMessage();
-    if (!hasMainDexList) {
-      messageBuilder.append(". ");
-      messageBuilder.append("Try supplying a main-dex list or main dex rules");
-    }
-    messageBuilder.append(".").append(System.getProperty("line.separator"));
-    messageBuilder.append(getNumberRelatedMessage());
+    messageBuilder.append(")");
     return messageBuilder.toString();
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index fa00cd1..90a9898 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -6,7 +6,6 @@
 import static com.android.tools.r8.ir.desugar.InterfaceMethodRewriter.Flavor.ExcludeDexResources;
 import static com.android.tools.r8.ir.desugar.InterfaceMethodRewriter.Flavor.IncludeAllResources;
 
-import com.android.tools.r8.ApiLevelException;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
@@ -253,7 +252,7 @@
     }
   }
 
-  private void processCovariantReturnTypeAnnotations(Builder<?> builder) throws ApiLevelException {
+  private void processCovariantReturnTypeAnnotations(Builder<?> builder) {
     if (covariantReturnTypeAnnotationTransformer != null) {
       covariantReturnTypeAnnotationTransformer.process(builder);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
index 526bd9f..5b397e0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.ir.desugar;
 
-import com.android.tools.r8.ApiLevelException;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexAnnotationElement;
@@ -56,7 +55,7 @@
     this.factory = factory;
   }
 
-  public void process(DexApplication.Builder<?> builder) throws ApiLevelException {
+  public void process(DexApplication.Builder<?> builder) {
     // List of methods that should be added to the next class.
     List<DexEncodedMethod> methodsWithCovariantReturnTypeAnnotation = new LinkedList<>();
     List<DexEncodedMethod> covariantReturnTypeMethods = new LinkedList<>();
@@ -114,8 +113,7 @@
   private void buildCovariantReturnTypeMethodsForClass(
       DexClass clazz,
       List<DexEncodedMethod> methodsWithCovariantReturnTypeAnnotation,
-      List<DexEncodedMethod> covariantReturnTypeMethods)
-      throws ApiLevelException {
+      List<DexEncodedMethod> covariantReturnTypeMethods) {
     for (DexEncodedMethod method : clazz.virtualMethods()) {
       if (methodHasCovariantReturnTypeAnnotation(method)) {
         methodsWithCovariantReturnTypeAnnotation.add(method);
@@ -137,8 +135,7 @@
   // variantReturnTypes annotations on the given method. Adds the newly constructed, synthetic
   // methods to the list covariantReturnTypeMethods.
   private void buildCovariantReturnTypeMethodsForMethod(
-      DexClass clazz, DexEncodedMethod method, List<DexEncodedMethod> covariantReturnTypeMethods)
-      throws ApiLevelException {
+      DexClass clazz, DexEncodedMethod method, List<DexEncodedMethod> covariantReturnTypeMethods) {
     assert methodHasCovariantReturnTypeAnnotation(method);
     for (DexType covariantReturnType : getCovariantReturnTypes(clazz, method)) {
       DexEncodedMethod covariantReturnTypeMethod =
@@ -153,8 +150,7 @@
   //
   // Note: any "synchronized" or "strictfp" modifier could be dropped safely.
   private DexEncodedMethod buildCovariantReturnTypeMethod(
-      DexClass clazz, DexEncodedMethod method, DexType covariantReturnType)
-      throws ApiLevelException {
+      DexClass clazz, DexEncodedMethod method, DexType covariantReturnType) {
     DexProto newProto =
         factory.createProto(
             covariantReturnType, method.method.proto.shorty, method.method.proto.parameters);
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
index 9c7f525..fe8adfa 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.ResourceException;
@@ -15,7 +14,6 @@
 import java.nio.file.FileSystemException;
 import java.nio.file.Paths;
 import java.util.function.Consumer;
-import java.util.function.Function;
 
 public abstract class ExceptionUtils {
 
@@ -37,31 +35,26 @@
   }
 
   public interface CompileAction {
-    void run() throws IOException, CompilationException, CompilationError, ResourceException;
+    void run() throws IOException, CompilationError, ResourceException;
   }
 
   public static void withD8CompilationHandler(Reporter reporter, CompileAction action)
       throws CompilationFailedException {
-    withCompilationHandler(reporter, action, CompilationException::getMessageForD8);
+    withCompilationHandler(reporter, action);
   }
 
   public static void withR8CompilationHandler(Reporter reporter, CompileAction action)
       throws CompilationFailedException {
-    withCompilationHandler(reporter, action, CompilationException::getMessageForR8);
+    withCompilationHandler(reporter, action);
   }
 
-  public static void withCompilationHandler(
-      Reporter reporter,
-      CompileAction action,
-      Function<CompilationException, String> compilerMessage)
+  public static void withCompilationHandler(Reporter reporter, CompileAction action)
       throws CompilationFailedException {
     try {
       try {
         action.run();
       } catch (IOException e) {
         throw reporter.fatalError(new ExceptionDiagnostic(e, extractIOExceptionOrigin(e)));
-      } catch (CompilationException e) {
-        throw reporter.fatalError(new StringDiagnostic(compilerMessage.apply(e)), e);
       } catch (CompilationError e) {
         throw reporter.fatalError(e);
       } catch (ResourceException e) {
diff --git a/src/test/java/com/android/tools/r8/AsmTestBase.java b/src/test/java/com/android/tools/r8/AsmTestBase.java
index db26fe6..9cc2b48 100644
--- a/src/test/java/com/android/tools/r8/AsmTestBase.java
+++ b/src/test/java/com/android/tools/r8/AsmTestBase.java
@@ -54,8 +54,8 @@
   }
 
   private void ensureSameOutput(String main, AndroidApp app, byte[]... classes)
-      throws IOException, CompilationException, ExecutionException, CompilationFailedException,
-      ProguardRuleParserException {
+      throws IOException, ExecutionException, CompilationFailedException,
+          ProguardRuleParserException {
     ProcessResult javaResult = runOnJava(main, classes);
     ProcessResult d8Result = runOnArtRaw(compileWithD8(app), main);
     ProcessResult r8Result = runOnArtRaw(compileWithR8(app), main);
@@ -88,8 +88,8 @@
   }
 
   protected void ensureSameOutputAfterMerging(String main, byte[]... classes)
-      throws IOException, CompilationException, ExecutionException,
-      CompilationFailedException, ProguardRuleParserException {
+      throws IOException, ExecutionException, CompilationFailedException,
+          ProguardRuleParserException {
     AndroidApp app = buildAndroidApp(classes);
     // Compile to dex files with D8.
     AndroidApp dexApp = compileWithD8(app);
diff --git a/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
index dc4a9b4..1d9ec50 100644
--- a/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
@@ -119,7 +119,7 @@
   }
 
   private AndroidApp mergeDexResources(int minAPILevel, List<ProgramResource> individalDexes)
-      throws IOException, CompilationException, CompilationFailedException, ResourceException {
+      throws IOException, CompilationFailedException, ResourceException {
     D8Command.Builder builder = D8Command.builder()
         .setMinApiLevel(minAPILevel);
     for (ProgramResource resource : individalDexes) {
diff --git a/src/test/java/com/android/tools/r8/D8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8RunExamplesAndroidOTest.java
index 77959d9..ede7e53 100644
--- a/src/test/java/com/android/tools/r8/D8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8RunExamplesAndroidOTest.java
@@ -76,7 +76,7 @@
 
       // compilation should have failed on CompilationError since A is declaring a default method.
       Assert.fail();
-    } catch (CompilationError | CompilationException e) {
+    } catch (CompilationError e) {
       // Expected.
     }
   }
diff --git a/src/test/java/com/android/tools/r8/R8EntryPointTests.java b/src/test/java/com/android/tools/r8/R8EntryPointTests.java
index 6f3473e..edf7f20 100644
--- a/src/test/java/com/android/tools/r8/R8EntryPointTests.java
+++ b/src/test/java/com/android/tools/r8/R8EntryPointTests.java
@@ -131,8 +131,7 @@
     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS)));
   }
 
-  private R8Command getCommand(Path out)
-      throws CompilationException, IOException, CompilationFailedException {
+  private R8Command getCommand(Path out) throws IOException, CompilationFailedException {
     return R8Command.builder()
         .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
         .addProgramFiles(INPUT_JAR)
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index b27569b..b12eb2d 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -1388,7 +1388,7 @@
       boolean disableInlining,
       boolean disableClassInlining,
       boolean hasMissingClasses)
-      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException,
+      throws IOException, ProguardRuleParserException, ExecutionException,
       CompilationFailedException {
     executeCompilerUnderTest(compilerUnderTest, fileNames, resultPath, compilationMode, null,
         disableInlining, disableClassInlining, hasMissingClasses);
@@ -1403,7 +1403,7 @@
       boolean disableInlining,
       boolean disableClassInlining,
       boolean hasMissingClasses)
-      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException,
+      throws IOException, ProguardRuleParserException, ExecutionException,
         CompilationFailedException {
     assert mode != null;
     switch (compilerUnderTest) {
@@ -1434,7 +1434,7 @@
                   }
                 }
               } catch (ResourceException e) {
-                throw new CompilationException(e);
+                throw new CompilationError("", e);
               }
             }
           }
@@ -1621,7 +1621,7 @@
 
   protected void runJctfTest(CompilerUnderTest compilerUnderTest, String classFilePath,
       String fullClassName)
-      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException,
+      throws IOException, ProguardRuleParserException, ExecutionException,
       CompilationFailedException {
     DexVm dexVm = ToolHelper.getDexVm();
 
@@ -1751,7 +1751,7 @@
       CompilationMode mode,
       DexVm dexVm,
       File resultDir)
-      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException,
+      throws IOException, ProguardRuleParserException, ExecutionException,
       CompilationFailedException {
     executeCompilerUnderTest(compilerUnderTest, fileNames, resultDir.getAbsolutePath(), mode,
         specification.disableInlining, specification.disableClassInlining,
@@ -1930,7 +1930,7 @@
             compilerUnderTest, fileNames, resultDir.getCanonicalPath(), compilationMode,
             specification.disableInlining, specification.disableClassInlining,
             specification.hasMissingClasses);
-      } catch (CompilationException | CompilationFailedException e) {
+      } catch (CompilationFailedException e) {
         throw new CompilationError(e.getMessage(), e);
       } catch (ExecutionException e) {
         throw e.getCause();
diff --git a/src/test/java/com/android/tools/r8/R8UnreachableCodeTest.java b/src/test/java/com/android/tools/r8/R8UnreachableCodeTest.java
index a504c7c..36a4f00 100644
--- a/src/test/java/com/android/tools/r8/R8UnreachableCodeTest.java
+++ b/src/test/java/com/android/tools/r8/R8UnreachableCodeTest.java
@@ -30,7 +30,7 @@
 
   @Ignore
   @Test
-  public void UnreachableCode() throws IOException, ExecutionException, CompilationException {
+  public void UnreachableCode() throws IOException, ExecutionException {
     String name = "unreachable-code-1";
     AndroidApp input =
         AndroidApp.builder()
diff --git a/src/test/java/com/android/tools/r8/ResourceShrinkerTest.java b/src/test/java/com/android/tools/r8/ResourceShrinkerTest.java
index 301f78f..d21d156 100644
--- a/src/test/java/com/android/tools/r8/ResourceShrinkerTest.java
+++ b/src/test/java/com/android/tools/r8/ResourceShrinkerTest.java
@@ -73,8 +73,7 @@
   }
 
   @Test
-  public void testEmptyClass()
-      throws CompilationFailedException, IOException, ExecutionException, CompilationException {
+  public void testEmptyClass() throws CompilationFailedException, IOException, ExecutionException {
     TrackAll analysis = runAnalysis(EmptyClass.class);
 
     assertThat(analysis.integers, is(Sets.newHashSet()));
@@ -95,7 +94,7 @@
 
   @Test
   public void testConstsAndFieldAndMethods()
-      throws CompilationFailedException, IOException, ExecutionException, CompilationException {
+      throws CompilationFailedException, IOException, ExecutionException {
     TrackAll analysis = runAnalysis(ConstInCode.class);
 
     assertThat(analysis.integers, is(Sets.newHashSet(10, 11)));
@@ -125,7 +124,7 @@
 
   @Test
   public void testStaticValues()
-      throws CompilationFailedException, IOException, ExecutionException, CompilationException {
+      throws CompilationFailedException, IOException, ExecutionException {
     TrackAll analysis = runAnalysis(StaticFields.class);
 
     assertThat(analysis.integers, hasItems(10, 11, 12, 13));
@@ -163,8 +162,7 @@
   }
 
   @Test
-  public void testAnnotations()
-      throws CompilationFailedException, IOException, ExecutionException, CompilationException {
+  public void testAnnotations() throws CompilationFailedException, IOException, ExecutionException {
     TrackAll analysis = runAnalysis(IntAnnotation.class, OuterAnnotation.class, Annotated.class);
 
     assertThat(analysis.integers, hasItems(10, 11, 12, 13, 14, 15, 42));
@@ -184,7 +182,7 @@
 
   @Test
   public void testWithSkippingSome()
-      throws ExecutionException, CompilationFailedException, CompilationException, IOException {
+      throws ExecutionException, CompilationFailedException, IOException {
     TrackAll analysis = runAnalysis(ResourceClassToSkip.class, ToProcess.class);
 
     assertThat(analysis.integers, hasItems(10, 11, 12));
@@ -222,13 +220,13 @@
   }
 
   private TrackAll runAnalysis(Class<?>... classes)
-      throws IOException, CompilationException, ExecutionException, CompilationFailedException {
+      throws IOException, ExecutionException, CompilationFailedException {
     AndroidApp app = readClasses(classes);
     return runOnApp(app);
   }
 
   private TrackAll runOnApp(AndroidApp app)
-      throws IOException, ExecutionException, CompilationFailedException, CompilationException {
+      throws IOException, ExecutionException, CompilationFailedException {
     AndroidApp outputApp = compileWithD8(app);
     Path outputDex = tmp.newFolder().toPath().resolve("classes.dex");
     outputApp.writeToDirectory(outputDex.getParent(), OutputMode.DexIndexed);
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 96591d8..331af0a 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -215,7 +215,7 @@
    * Compile an application with D8.
    */
   protected AndroidApp compileWithD8(AndroidApp app)
-      throws CompilationException, ExecutionException, IOException, CompilationFailedException {
+      throws ExecutionException, IOException, CompilationFailedException {
     D8Command.Builder builder = ToolHelper.prepareD8CommandBuilder(app);
     AndroidAppConsumers appSink = new AndroidAppConsumers(builder);
     D8.run(builder.build());
@@ -226,7 +226,7 @@
    * Compile an application with D8.
    */
   protected AndroidApp compileWithD8(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
-      throws CompilationException, ExecutionException, IOException, CompilationFailedException {
+      throws ExecutionException, IOException, CompilationFailedException {
     return ToolHelper.runD8(app, optionsConsumer);
   }
 
@@ -234,7 +234,7 @@
    * Compile an application with R8.
    */
   protected AndroidApp compileWithR8(Class... classes)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     return ToolHelper.runR8(readClasses(classes));
   }
@@ -243,7 +243,7 @@
    * Compile an application with R8.
    */
   protected AndroidApp compileWithR8(List<Class> classes)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     R8Command command = ToolHelper.prepareR8CommandBuilder(readClasses(classes)).build();
     return ToolHelper.runR8(command);
@@ -253,7 +253,7 @@
    * Compile an application with R8.
    */
   protected AndroidApp compileWithR8(List<Class> classes, Consumer<InternalOptions> optionsConsumer)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     R8Command command = ToolHelper.prepareR8CommandBuilder(readClasses(classes)).build();
     return ToolHelper.runR8(command, optionsConsumer);
@@ -263,7 +263,7 @@
    * Compile an application with R8.
    */
   protected AndroidApp compileWithR8(AndroidApp app)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     R8Command command = ToolHelper.prepareR8CommandBuilder(app).build();
     return ToolHelper.runR8(command);
@@ -273,7 +273,7 @@
    * Compile an application with R8.
    */
   protected AndroidApp compileWithR8(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     R8Command command = ToolHelper.prepareR8CommandBuilder(app).build();
     return ToolHelper.runR8(command, optionsConsumer);
@@ -283,7 +283,7 @@
    * Compile an application with R8 using the supplied proguard configuration.
    */
   protected AndroidApp compileWithR8(List<Class> classes, String proguardConfig)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     return compileWithR8(readClasses(classes), proguardConfig);
   }
@@ -293,7 +293,7 @@
    */
   protected AndroidApp compileWithR8(
       List<Class> classes, String proguardConfig, Consumer<InternalOptions> optionsConsumer)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     return compileWithR8(readClasses(classes), proguardConfig, optionsConsumer);
   }
@@ -302,7 +302,7 @@
    * Compile an application with R8 using the supplied proguard configuration.
    */
   protected AndroidApp compileWithR8(List<Class> classes, Path proguardConfig)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     return compileWithR8(readClasses(classes), proguardConfig);
   }
@@ -311,7 +311,7 @@
    * Compile an application with R8 using the supplied proguard configuration.
    */
   protected AndroidApp compileWithR8(AndroidApp app, Path proguardConfig)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     R8Command command =
         ToolHelper.prepareR8CommandBuilder(app)
@@ -324,7 +324,7 @@
    * Compile an application with R8 using the supplied proguard configuration.
    */
   protected AndroidApp compileWithR8(AndroidApp app, String proguardConfig)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     return compileWithR8(app, proguardConfig, null);
   }
@@ -334,7 +334,7 @@
    */
   protected AndroidApp compileWithR8(
       AndroidApp app, String proguardConfig, Consumer<InternalOptions> optionsConsumer)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     R8Command command =
         ToolHelper.prepareR8CommandBuilder(app)
@@ -348,7 +348,7 @@
    */
   protected AndroidApp compileWithR8(
       AndroidApp app, Path proguardConfig, Consumer<InternalOptions> optionsConsumer)
-      throws CompilationException, ProguardRuleParserException, ExecutionException, IOException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     R8Command command =
         ToolHelper.prepareR8CommandBuilder(app)
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index afa8c12..6e8ea93 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -768,7 +768,7 @@
 
   public static ProguardConfiguration loadProguardConfiguration(
       DexItemFactory factory, List<Path> configPaths)
-      throws IOException, ProguardRuleParserException, CompilationException {
+      throws IOException, ProguardRuleParserException {
     Reporter reporter = new Reporter(new DefaultDiagnosticsHandler());
     if (configPaths.isEmpty()) {
       return ProguardConfiguration.defaultConfiguration(factory, reporter);
@@ -789,7 +789,7 @@
     return R8Command.builder(app).setProgramConsumer(DexIndexedConsumer.emptyConsumer());
   }
 
-  public static AndroidApp runR8(AndroidApp app) throws IOException, CompilationException {
+  public static AndroidApp runR8(AndroidApp app) throws IOException {
     try {
       return runR8(prepareR8CommandBuilder(app).build());
     } catch (CompilationFailedException e) {
@@ -798,7 +798,7 @@
   }
 
   public static AndroidApp runR8(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
-      throws IOException, CompilationException {
+      throws IOException {
     try {
       return runR8(prepareR8CommandBuilder(app).build(), optionsConsumer);
     } catch (CompilationFailedException e) {
@@ -806,18 +806,17 @@
     }
   }
 
-  public static AndroidApp runR8(R8Command command) throws IOException, CompilationException {
+  public static AndroidApp runR8(R8Command command) throws IOException {
     return runR8(command, null);
   }
 
   public static AndroidApp runR8(R8Command command, Consumer<InternalOptions> optionsConsumer)
-      throws IOException, CompilationException {
+      throws IOException {
     return runR8WithFullResult(command, optionsConsumer);
   }
 
   public static AndroidApp runR8WithFullResult(
-      R8Command command, Consumer<InternalOptions> optionsConsumer)
-      throws IOException, CompilationException {
+      R8Command command, Consumer<InternalOptions> optionsConsumer) throws IOException {
     // TODO(zerny): Should we really be adding the android library in ToolHelper?
     AndroidApp app = command.getInputApp();
     if (app.getLibraryResourceProviders().isEmpty()) {
@@ -848,12 +847,12 @@
             ImmutableList.of("!junit/**", "!android/test/**"))));
   }
 
-  public static AndroidApp runD8(AndroidApp app) throws CompilationException, IOException {
+  public static AndroidApp runD8(AndroidApp app) throws IOException {
     return runD8(app, null);
   }
 
   public static AndroidApp runD8(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
-      throws CompilationException, IOException {
+      throws IOException {
     try {
       return runD8(D8Command.builder(app), optionsConsumer);
     } catch (CompilationFailedException e) {
@@ -862,13 +861,13 @@
   }
 
   public static AndroidApp runD8(D8Command.Builder builder)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     return runD8(builder, null);
   }
 
   public static AndroidApp runD8(
       D8Command.Builder builder, Consumer<InternalOptions> optionsConsumer)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     AndroidAppConsumers compatSink = new AndroidAppConsumers(builder);
     D8Command command = builder.build();
     InternalOptions options = command.getInternalOptions();
diff --git a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
index c6a2bd3..d5d2c39 100644
--- a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
@@ -6,7 +6,6 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8Command;
@@ -43,7 +42,7 @@
   }
 
   private void runR8(Path proguardConfig, Consumer<InternalOptions> optionsConsumer)
-      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException,
+      throws IOException, ProguardRuleParserException, ExecutionException,
       CompilationFailedException {
     ToolHelper.runR8(
         R8Command.builder()
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoTestBase.java b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoTestBase.java
index 479a558..d0ad1df 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoTestBase.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoTestBase.java
@@ -5,7 +5,6 @@
 
 import static org.junit.Assert.assertEquals;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
@@ -32,8 +31,7 @@
   @Rule
   public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
-  static AndroidApp compileWithD8(Class... classes) throws CompilationException, IOException,
-      CompilationFailedException {
+  static AndroidApp compileWithD8(Class... classes) throws IOException, CompilationFailedException {
     D8Command.Builder builder = D8Command.builder();
     for (Class clazz : classes) {
       builder.addProgramFiles(ToolHelper.getClassFileForTestClass(clazz));
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java b/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java
index 2b2a40b..4b3f4fe 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java
@@ -6,7 +6,6 @@
 
 import static org.junit.Assert.assertEquals;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.DexFileMergerHelper;
@@ -39,7 +38,7 @@
   @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   private Path createMergerInputWithTwoClasses(OutputMode outputMode, boolean addMarker)
-      throws CompilationFailedException, CompilationException, IOException {
+      throws CompilationFailedException, IOException {
     // Compile Class1 and Class2
     Path mergerInputZip = temp.newFolder().toPath().resolve("merger-input.zip");
     D8Command command =
@@ -55,8 +54,7 @@
   }
 
   private void testMarker(boolean addMarkerToInput)
-      throws CompilationFailedException, CompilationException, IOException, ResourceException,
-          ExecutionException {
+      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
     Path mergerInputZip = createMergerInputWithTwoClasses(OutputMode.DexIndexed, addMarkerToInput);
 
     Marker inputMarker = ExtractMarker.extractMarkerFromDexFile(mergerInputZip);
@@ -74,20 +72,18 @@
 
   @Test
   public void testMarkerPreserved()
-      throws CompilationFailedException, CompilationException, IOException, ResourceException,
-          ExecutionException {
+      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
     testMarker(true);
   }
 
   @Test
   public void testMarkerNotAdded()
-      throws CompilationFailedException, CompilationException, IOException, ResourceException,
-          ExecutionException {
+      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
     testMarker(false);
   }
 
   @Test
-  public void mergeTwoFiles() throws CompilationFailedException, CompilationException, IOException {
+  public void mergeTwoFiles() throws CompilationFailedException, IOException {
     Path mergerInputZip = createMergerInputWithTwoClasses(OutputMode.DexFilePerClassFile, false);
 
     Path mergerOutputZip = temp.getRoot().toPath().resolve("merger-out.zip");
@@ -107,7 +103,7 @@
   }
 
   private void generateClassesAndTest(int extraMethodCount, int programResourcesSize)
-      throws IOException, ExecutionException, CompilationException, CompilationFailedException {
+      throws IOException, ExecutionException, CompilationFailedException {
     AndroidApp generatedApp =
         MainDexListTests.generateApplication(
             ImmutableList.of("A", "B"),
@@ -125,8 +121,7 @@
   }
 
   @Test(expected = CompilationFailedException.class)
-  public void failIfTooBig()
-      throws IOException, ExecutionException, CompilationException, CompilationFailedException {
+  public void failIfTooBig() throws IOException, ExecutionException, CompilationFailedException {
     // Generates an application with two classes, each with the number of methods just enough not to
     // fit into a single dex file.
     generateClassesAndTest(1, 2);
@@ -134,7 +129,7 @@
 
   @Test
   public void failIfTooBigControl()
-      throws IOException, ExecutionException, CompilationException, CompilationFailedException {
+      throws IOException, ExecutionException, CompilationFailedException {
     // Control test for failIfTooBig to make sure we don't fail with less methods.
     generateClassesAndTest(0, 1);
   }
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
index 5bbb9d5..a0b2515 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
@@ -8,7 +8,6 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.DexSplitterHelper;
@@ -56,7 +55,7 @@
   @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   private Path createInput(boolean dontCreateMarkerInD8)
-      throws IOException, CompilationFailedException, CompilationException {
+      throws IOException, CompilationFailedException {
     // Initial normal compile to create dex files.
     Path inputZip = temp.newFolder().toPath().resolve("input.zip");
     D8Command command =
@@ -76,8 +75,7 @@
   }
 
   private void testMarker(boolean addMarkerToInput)
-      throws CompilationFailedException, CompilationException, IOException, ResourceException,
-          ExecutionException {
+      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
     Path inputZip = createInput(!addMarkerToInput);
 
     Path output = temp.newFolder().toPath().resolve("output");
@@ -102,15 +100,13 @@
 
   @Test
   public void testMarkerPreserved()
-      throws CompilationFailedException, CompilationException, IOException, ResourceException,
-          ExecutionException {
+      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
     testMarker(true);
   }
 
   @Test
   public void testMarkerNotAdded()
-      throws CompilationFailedException, CompilationException, IOException, ResourceException,
-          ExecutionException {
+      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
     testMarker(false);
   }
 
@@ -124,14 +120,13 @@
   @Test
   public void splitFilesNoObfuscation()
       throws CompilationFailedException, IOException, FeatureMappingException, ResourceException,
-      CompilationException, ExecutionException {
+          ExecutionException {
     noObfuscation(false);
     noObfuscation(true);
   }
 
   private void noObfuscation(boolean useOptions)
-      throws IOException, CompilationFailedException, FeatureMappingException,
-      ResourceException, ExecutionException, CompilationException {
+      throws IOException, CompilationFailedException, FeatureMappingException {
     Path inputZip = createInput(false);
     Path output = temp.newFolder().toPath().resolve("output");
     Files.createDirectory(output);
@@ -228,7 +223,7 @@
   @Test
   public void splitFilesFromJar()
       throws IOException, CompilationFailedException, FeatureMappingException, ResourceException,
-      CompilationException, ExecutionException {
+          ExecutionException {
     splitFromJars(true, true);
     splitFromJars(false, true);
     splitFromJars(true, false);
@@ -236,8 +231,7 @@
   }
 
   private void splitFromJars(boolean useOptions, boolean explicitBase)
-      throws IOException, CompilationFailedException, FeatureMappingException, ResourceException,
-      ExecutionException, CompilationException {
+      throws IOException, CompilationFailedException, FeatureMappingException {
     Path inputZip = createInput(false);
     Path output = temp.newFolder().toPath().resolve("output");
     Files.createDirectory(output);
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index a542b70..d30baa9 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -8,7 +8,6 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
@@ -64,14 +63,14 @@
       String referenceApk,
       String pgConf,
       String input)
-      throws ExecutionException, IOException, ProguardRuleParserException, CompilationException,
+      throws ExecutionException, IOException, ProguardRuleParserException,
           CompilationFailedException {
     return runAndCheckVerification(
         compiler, mode, referenceApk, pgConf, null, Collections.singletonList(input));
   }
 
   public AndroidApp runAndCheckVerification(D8Command.Builder builder, String referenceApk)
-      throws IOException, ExecutionException, CompilationException, CompilationFailedException {
+      throws IOException, ExecutionException, CompilationFailedException {
     AndroidAppConsumers appSink = new AndroidAppConsumers(builder);
     D8.run(builder.build());
     AndroidApp result = appSink.build();
@@ -86,7 +85,7 @@
       String pgConf,
       Consumer<InternalOptions> optionsConsumer,
       List<String> inputs)
-      throws ExecutionException, IOException, ProguardRuleParserException, CompilationException,
+      throws ExecutionException, IOException, ProguardRuleParserException,
       CompilationFailedException {
     assertTrue(referenceApk == null || new File(referenceApk).exists());
     AndroidAppConsumers outputApp;
diff --git a/src/test/java/com/android/tools/r8/internal/D8FrameworkDeterministicTest.java b/src/test/java/com/android/tools/r8/internal/D8FrameworkDeterministicTest.java
index e546607..ab430d5 100644
--- a/src/test/java/com/android/tools/r8/internal/D8FrameworkDeterministicTest.java
+++ b/src/test/java/com/android/tools/r8/internal/D8FrameworkDeterministicTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.internal;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
@@ -19,7 +18,7 @@
   private static final String JAR = "third_party/framework/framework_160115954.jar";
 
   private AndroidApp doRun(D8Command.Builder builder)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     builder.setProgramConsumer(null);
     AndroidAppConsumers appSink = new AndroidAppConsumers(builder);
     D8.run(builder.build());
diff --git a/src/test/java/com/android/tools/r8/internal/D8PhotosVerificationTest.java b/src/test/java/com/android/tools/r8/internal/D8PhotosVerificationTest.java
index 0946ded..390105e 100644
--- a/src/test/java/com/android/tools/r8/internal/D8PhotosVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/D8PhotosVerificationTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.internal;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
@@ -17,7 +16,7 @@
       "third_party/photos/2017-06-06/PhotosEnglishOnlyLegacy_proguard.jar";
 
   public void runD8AndCheckVerification(CompilationMode mode, String version)
-      throws ProguardRuleParserException, ExecutionException, IOException, CompilationException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     runAndCheckVerification(CompilerUnderTest.D8, mode, version, null, version);
   }
diff --git a/src/test/java/com/android/tools/r8/internal/GMSCoreCompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/GMSCoreCompilationTestBase.java
index df4bbfe..f0b1ece 100644
--- a/src/test/java/com/android/tools/r8/internal/GMSCoreCompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/GMSCoreCompilationTestBase.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.internal;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
@@ -33,14 +32,14 @@
   static final String REFERENCE_APK = "noshrink_x86_GmsCore_prod_alldpi_release_unsigned.apk";
 
   public void runR8AndCheckVerification(CompilationMode mode, String version)
-      throws ProguardRuleParserException, ExecutionException, IOException, CompilationException,
+      throws ProguardRuleParserException, ExecutionException, IOException,
       CompilationFailedException {
     runAndCheckVerification(CompilerUnderTest.R8, mode, version);
   }
 
   public void runAndCheckVerification(
       CompilerUnderTest compiler, CompilationMode mode, String version)
-      throws ExecutionException, IOException, ProguardRuleParserException, CompilationException,
+      throws ExecutionException, IOException, ProguardRuleParserException,
       CompilationFailedException {
     runAndCheckVerification(
         compiler, mode, version + GMSCORE_APK, null, Paths.get(version, GMSCORE_APK).toString());
diff --git a/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
index 5f635ff..09ce657 100644
--- a/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.internal;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
@@ -19,7 +18,7 @@
 
   public AndroidApp buildFromDeployJar(
       CompilerUnderTest compiler, CompilationMode mode, String base, boolean hasReference)
-      throws ExecutionException, IOException, ProguardRuleParserException, CompilationException,
+      throws ExecutionException, IOException, ProguardRuleParserException,
       CompilationFailedException {
     return runAndCheckVerification(
         compiler, mode, hasReference ? base + REFERENCE_APK : null, null, base + DEPLOY_JAR);
@@ -29,7 +28,7 @@
   public AndroidApp buildFromDeployJar(
       CompilerUnderTest compiler, CompilationMode mode, String base, boolean hasReference,
       Consumer<InternalOptions> optionsConsumer)
-      throws ExecutionException, IOException, ProguardRuleParserException, CompilationException,
+      throws ExecutionException, IOException, ProguardRuleParserException,
       CompilationFailedException {
     return runAndCheckVerification(
         compiler,
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreDeterministicTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreDeterministicTest.java
index 5e1c61f..abc7a73 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreDeterministicTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreDeterministicTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.internal;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.OutputMode;
@@ -33,7 +32,7 @@
   }
 
   private AndroidApp doRun()
-      throws IOException, ProguardRuleParserException, CompilationException, ExecutionException,
+      throws IOException, ProguardRuleParserException, ExecutionException,
       CompilationFailedException {
     R8Command command =
         R8Command.builder()
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
index 47f0db3..a5c7093 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
@@ -6,7 +6,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8Command;
@@ -99,8 +98,7 @@
         });
   }
 
-  private Path runR8(Path proguardConfig)
-      throws IOException, CompilationException, CompilationFailedException {
+  private Path runR8(Path proguardConfig) throws IOException, CompilationFailedException {
     Path dexOutputDir = temp.newFolder().toPath();
     ToolHelper.runR8(
         R8Command.builder()
diff --git a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
index 990fe6e..7b74453 100644
--- a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
+++ b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.jsr45;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
@@ -50,7 +49,7 @@
   public TemporaryFolder tmpOutputDir = ToolHelper.getTemporaryFolderForTest();
 
   private AndroidApp compileWithD8(Path intputPath, Path outputPath)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     D8Command.Builder builder =
         D8Command.builder()
             .setMinApiLevel(AndroidApiLevel.O.getLevel())
@@ -62,7 +61,7 @@
   }
 
   private AndroidApp compileWithR8(Path inputPath, Path outputPath, Path keepRulesPath)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     return ToolHelper.runR8(
         R8Command.builder()
             .addProgramFiles(inputPath)
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index 590baa6..99ffc11 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -10,7 +10,6 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
@@ -25,7 +24,6 @@
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.DexOverflowException;
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.ClassAccessFlags;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DebugLocalInfo;
@@ -498,7 +496,7 @@
   private void doVerifyMainDexContains(
       List<String> mainDex, Path app, boolean singleDexApp, boolean minimalMainDex,
       MultiDexTestMode testMode)
-      throws IOException, CompilationException, ExecutionException, ProguardRuleParserException,
+      throws IOException, ExecutionException, ProguardRuleParserException,
       CompilationFailedException {
     AndroidApp originalApp = AndroidApp.builder().addProgramFiles(app).build();
     DexInspector originalInspector = new DexInspector(originalApp);
@@ -587,13 +585,13 @@
   }
 
   public static AndroidApp generateApplication(List<String> classes, int minApi, int methodCount)
-      throws IOException, ExecutionException, CompilationException {
+      throws IOException, ExecutionException {
     return generateApplication(classes, minApi, false, methodCount);
   }
 
   private static AndroidApp generateApplication(
       List<String> classes, int minApi, boolean intermediate, int methodCount)
-      throws IOException, ExecutionException, CompilationException {
+      throws IOException, ExecutionException {
     Timing timing = new Timing("MainDexListTests");
     InternalOptions options = new InternalOptions();
     options.minApiLevel = minApi;
diff --git a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
index deb90e4..38af4de 100644
--- a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
@@ -9,7 +9,6 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8Command;
@@ -270,8 +269,7 @@
   }
 
   private R8Command.Builder getCommandForInstrumentation(
-      Path out, Path flag, Path mainApp, Path instrApp)
-      throws CompilationException, IOException {
+      Path out, Path flag, Path mainApp, Path instrApp) throws IOException {
     return R8Command.builder()
         .addLibraryFiles(ToolHelper.getDefaultAndroidJar(), mainApp)
         .addProgramFiles(instrApp)
@@ -279,9 +277,8 @@
         .addProguardConfigurationFiles(flag);
   }
 
-  private R8Command.Builder getCommandForApps(
-      Path out, Path flag, Path... jars)
-      throws CompilationException, IOException {
+  private R8Command.Builder getCommandForApps(Path out, Path flag, Path... jars)
+      throws IOException {
     return R8Command.builder()
         .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
         .addProgramFiles(jars)
@@ -290,7 +287,7 @@
   }
 
   private static AndroidApp runR8(R8Command command)
-      throws ProguardRuleParserException, ExecutionException, CompilationException, IOException {
+      throws ProguardRuleParserException, ExecutionException, IOException {
     return ToolHelper.runR8(command, options -> {
       // Disable inlining to make this test not depend on inlining decisions.
       options.enableInlining = false;
diff --git a/src/test/java/com/android/tools/r8/naming/NamingTestBase.java b/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
index b60ede7..d9808c0 100644
--- a/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
+++ b/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
 import com.android.tools.r8.graph.ClassAndMemberPublicizer;
@@ -65,7 +64,7 @@
   }
 
   NamingLens runMinifier(List<Path> configPaths)
-      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException {
+      throws IOException, ProguardRuleParserException, ExecutionException {
     ProguardConfiguration configuration =
         ToolHelper.loadProguardConfiguration(dexItemFactory, configPaths);
     InternalOptions options = new InternalOptions(configuration,
diff --git a/src/test/java/com/android/tools/r8/resource/DataResourceTest.java b/src/test/java/com/android/tools/r8/resource/DataResourceTest.java
index dbd4e23..2df0612 100644
--- a/src/test/java/com/android/tools/r8/resource/DataResourceTest.java
+++ b/src/test/java/com/android/tools/r8/resource/DataResourceTest.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.resource;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8Command;
@@ -25,8 +24,7 @@
   public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   @Test
-  public void dataResourceTest()
-      throws IOException, CompilationFailedException, CompilationException {
+  public void dataResourceTest() throws IOException, CompilationFailedException {
     String packageName = "dataresource";
     String mainClassName = packageName + ".ResourceTest";
     Path inputJar = Paths.get(ToolHelper.EXAMPLES_BUILD_DIR,
diff --git a/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java b/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
index e6c9ada..e0d9ecf 100644
--- a/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
+++ b/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.rewrite.longcompare;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
@@ -35,7 +34,7 @@
   public TemporaryFolder tmpOutputDir = ToolHelper.getTemporaryFolderForTest();
 
   void compileWithD8(Path intputPath, Path outputPath)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     D8.run(
         D8Command.builder()
             .addProgramFiles(intputPath)
diff --git a/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java b/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
index fe74da9..a50a667 100644
--- a/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.rewrite.longcompare;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
@@ -34,7 +33,7 @@
   public TemporaryFolder tmpOutputDir = ToolHelper.getTemporaryFolderForTest();
 
   void compileWithD8(Path intputPath, Path outputPath, CompilationMode mode)
-      throws IOException, CompilationException, CompilationFailedException {
+      throws IOException, CompilationFailedException {
     D8.run(
         D8Command.builder()
             .setMode(mode)
@@ -68,7 +67,7 @@
   }
 
   private void runTest(CompilationMode mode)
-      throws IOException, CompilationException, ExecutionException, CompilationFailedException {
+      throws IOException, ExecutionException, CompilationFailedException {
     final Path inputPath = Paths.get(ToolHelper.EXAMPLES_BUILD_DIR + "/rewrite.jar");
     Path outputPath = tmpOutputDir.newFolder().toPath();
 
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index 3c101ad..1d3fd93 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -6,7 +6,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.OutputMode;
@@ -79,7 +78,7 @@
       Consumer<InternalOptions> optionsConsumer) {
     try {
       return ToolHelper.runR8(application, optionsConsumer);
-    } catch (IOException | CompilationException e) {
+    } catch (IOException e) {
       throw new RuntimeException(e);
     }
   }
@@ -105,7 +104,9 @@
           .addDexProgramData(builder.compile(), EmbeddedOrigin.INSTANCE);
       ToolHelper.runR8WithFullResult(command.build(), optionsConsumer);
       return dexOutputDir.resolve("classes.dex");
-    } catch (CompilationException | IOException | RecognitionException | ExecutionException
+    } catch (IOException
+        | RecognitionException
+        | ExecutionException
         | CompilationFailedException e) {
       throw new RuntimeException(e);
     }