Report warnings in D8 and R8 for deprecated use of --main-dex-list.

Bug: 181858113
Change-Id: Icc2fdc2189ae18d4e7e25df9fa8f9d4ce6b43dff
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 30579d8..e6cc1f5 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -284,7 +284,7 @@
       {
         ApplicationReader applicationReader = new ApplicationReader(inputApp, options, timing);
         DirectMappedDexApplication application = applicationReader.read(executorService).toDirect();
-        MainDexInfo mainDexInfo = applicationReader.readMainDexClasses(application);
+        MainDexInfo mainDexInfo = applicationReader.readMainDexClassesForR8(application);
 
         // Now that the dex-application is fully loaded, close any internal archive providers.
         inputApp.closeInternalArchiveProviders();
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index 21de6ac..df1a88b 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -17,6 +17,7 @@
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.graph.ClassKind;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexClass;
@@ -29,6 +30,7 @@
 import com.android.tools.r8.graph.JarClassFileReader;
 import com.android.tools.r8.graph.LazyLoadedDexApplication;
 import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.MainDexInfo;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
@@ -65,6 +67,9 @@
   private final Timing timing;
   private final AndroidApp inputApp;
 
+  private boolean hasReadProgramResourcesFromCf = false;
+  private boolean hasReadProgramResourcesFromDex = false;
+
   public interface ProgramClassConflictResolver {
     DexProgramClass resolveClassConflict(DexProgramClass a, DexProgramClass b);
   }
@@ -151,7 +156,9 @@
       // TODO: try and preload less classes.
       readProguardMap(proguardMap, builder, executorService, futures);
       ClassReader classReader = new ClassReader(executorService, futures);
-      JarClassFileReader<DexProgramClass> jcf = classReader.readSources();
+      classReader.readSources();
+      hasReadProgramResourcesFromCf = classReader.hasReadProgramResourceFromCf;
+      hasReadProgramResourcesFromDex = classReader.hasReadProgramResourceFromDex;
       ThreadUtils.awaitFutures(futures);
       classReader.initializeLazyClassCollection(builder);
       for (ProgramResourceProvider provider : inputApp.getProgramResourceProviders()) {
@@ -199,17 +206,35 @@
   }
 
   public MainDexInfo readMainDexClasses(DexApplication app) {
+    return readMainDexClasses(app, hasReadProgramResourcesFromCf);
+  }
+
+  public MainDexInfo readMainDexClassesForR8(DexApplication app) {
+    // Officially R8 only support reading CF program inputs, thus we always generate a deprecated
+    // diagnostic if main-dex list is used.
+    return readMainDexClasses(app, true);
+  }
+
+  private MainDexInfo readMainDexClasses(DexApplication app, boolean emitDeprecatedDiagnostics) {
     MainDexInfo.Builder builder = MainDexInfo.none().builder();
     if (inputApp.hasMainDexList()) {
       for (StringResource resource : inputApp.getMainDexListResources()) {
+        if (emitDeprecatedDiagnostics) {
+          options.reporter.warning(new UnsupportedMainDexListUsageDiagnostic(resource.getOrigin()));
+        }
         addToMainDexClasses(app, builder, MainDexListParser.parseList(resource, itemFactory));
       }
-      addToMainDexClasses(
-          app,
-          builder,
-          inputApp.getMainDexClasses().stream()
-              .map(clazz -> itemFactory.createType(DescriptorUtils.javaTypeToDescriptor(clazz)))
-              .collect(Collectors.toList()));
+      if (!inputApp.getMainDexClasses().isEmpty()) {
+        if (emitDeprecatedDiagnostics) {
+          options.reporter.warning(new UnsupportedMainDexListUsageDiagnostic(Origin.unknown()));
+        }
+        addToMainDexClasses(
+            app,
+            builder,
+            inputApp.getMainDexClasses().stream()
+                .map(clazz -> itemFactory.createType(DescriptorUtils.javaTypeToDescriptor(clazz)))
+                .collect(Collectors.toList()));
+      }
     }
     return builder.buildList();
   }
@@ -291,6 +316,13 @@
     // Jar application reader to share across all class readers.
     private final JarApplicationReader application = new JarApplicationReader(options);
 
+    // Flag of which input resource types have flowen into the program classes.
+    // Note that this is just at the level of the resources having been given.
+    // It is possible to have, e.g., an empty dex file, so no classes, but this will still be true
+    // as there was a dex resource.
+    private boolean hasReadProgramResourceFromCf = false;
+    private boolean hasReadProgramResourceFromDex = false;
+
     ClassReader(ExecutorService executorService, List<Future<?>> futures) {
       this.executorService = executorService;
       this.futures = futures;
@@ -298,36 +330,42 @@
 
     private void readDexSources(List<ProgramResource> dexSources, Queue<DexProgramClass> classes)
         throws IOException, ResourceException {
-      if (dexSources.size() > 0) {
-        List<DexParser<DexProgramClass>> dexParsers = new ArrayList<>(dexSources.size());
-        int computedMinApiLevel = options.minApiLevel;
-        for (ProgramResource input : dexSources) {
-          DexReader dexReader = new DexReader(input);
-          if (options.passthroughDexCode) {
-            computedMinApiLevel = validateOrComputeMinApiLevel(computedMinApiLevel, dexReader);
-          }
-          dexParsers.add(new DexParser<>(dexReader, PROGRAM, options));
+      if (dexSources.isEmpty()) {
+        return;
+      }
+      hasReadProgramResourceFromDex = true;
+      List<DexParser<DexProgramClass>> dexParsers = new ArrayList<>(dexSources.size());
+      int computedMinApiLevel = options.minApiLevel;
+      for (ProgramResource input : dexSources) {
+        DexReader dexReader = new DexReader(input);
+        if (options.passthroughDexCode) {
+          computedMinApiLevel = validateOrComputeMinApiLevel(computedMinApiLevel, dexReader);
         }
+        dexParsers.add(new DexParser<>(dexReader, PROGRAM, options));
+      }
 
-        options.minApiLevel = computedMinApiLevel;
+      options.minApiLevel = computedMinApiLevel;
+      for (DexParser<DexProgramClass> dexParser : dexParsers) {
+        dexParser.populateIndexTables();
+      }
+      // Read the DexCode items and DexProgramClass items in parallel.
+      if (!options.skipReadingDexCode) {
         for (DexParser<DexProgramClass> dexParser : dexParsers) {
-          dexParser.populateIndexTables();
-        }
-        // Read the DexCode items and DexProgramClass items in parallel.
-        if (!options.skipReadingDexCode) {
-          for (DexParser<DexProgramClass> dexParser : dexParsers) {
-            futures.add(
-                executorService.submit(
-                    () -> {
-                      dexParser.addClassDefsTo(classes::add); // Depends on Methods, Code items etc.
-                    }));
-          }
+          futures.add(
+              executorService.submit(
+                  () -> {
+                    dexParser.addClassDefsTo(classes::add); // Depends on Methods, Code items etc.
+                  }));
         }
       }
     }
 
-    private JarClassFileReader<DexProgramClass> readClassSources(
+    private void readClassSources(
         List<ProgramResource> classSources, Queue<DexProgramClass> classes) {
+      if (classSources.isEmpty()) {
+        return;
+      }
+      hasReadProgramResourceFromCf = true;
       JarClassFileReader<DexProgramClass> reader =
           new JarClassFileReader<>(application, classes::add, PROGRAM);
       // Read classes in parallel.
@@ -341,10 +379,9 @@
                   return null;
                 }));
       }
-      return reader;
     }
 
-    JarClassFileReader<DexProgramClass> readSources() throws IOException, ResourceException {
+    void readSources() throws IOException, ResourceException {
       Collection<ProgramResource> resources = inputApp.computeAllProgramResources();
       List<ProgramResource> dexResources = new ArrayList<>(resources.size());
       List<ProgramResource> cfResources = new ArrayList<>(resources.size());
@@ -357,7 +394,7 @@
         }
       }
       readDexSources(dexResources, programClasses);
-      return readClassSources(cfResources, programClasses);
+      readClassSources(cfResources, programClasses);
     }
 
     private <T extends DexClass> ClassProvider<T> buildClassProvider(
diff --git a/src/main/java/com/android/tools/r8/errors/UnsupportedMainDexListUsageDiagnostic.java b/src/main/java/com/android/tools/r8/errors/UnsupportedMainDexListUsageDiagnostic.java
new file mode 100644
index 0000000..9bcbcba
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/errors/UnsupportedMainDexListUsageDiagnostic.java
@@ -0,0 +1,40 @@
+// Copyright (c) 2021, 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.errors;
+
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+
+/**
+ * Diagnostic to issue warnings/errors for unsupported usage of main-dex list.
+ *
+ * <p>See b/181858113 for context.
+ */
+@Keep
+public class UnsupportedMainDexListUsageDiagnostic implements Diagnostic {
+  private final Origin origin;
+
+  public UnsupportedMainDexListUsageDiagnostic(Origin origin) {
+    this.origin = origin;
+  }
+
+  @Override
+  public Origin getOrigin() {
+    return origin;
+  }
+
+  @Override
+  public Position getPosition() {
+    return Position.UNKNOWN;
+  }
+
+  @Override
+  public String getDiagnosticMessage() {
+    return "Unsupported usage of main-dex list. "
+        + "The usage of main-dex-list content for the compilation of non-DEX inputs is deprecated. "
+        + "See issue https://issuetracker.google.com/181858113 for context.";
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java b/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
index 8e33480..8e5dd69 100644
--- a/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
+++ b/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
@@ -95,7 +95,17 @@
     ProcessBuilder builder = new ProcessBuilder(command);
     ProcessResult result = ToolHelper.runProcess(builder);
     assertEquals(result.stderr + "\n" + result.stdout, 0, result.exitCode);
-    Assert.assertTrue(result.stdout, result.stdout.isEmpty());
-    Assert.assertTrue(result.stderr, result.stderr.isEmpty());
+    Assert.assertEquals("", filterOutMainDexListWarnings(result.stdout));
+    Assert.assertEquals("", result.stderr);
+  }
+
+  public static String filterOutMainDexListWarnings(String output) {
+    StringBuilder builder = new StringBuilder();
+    for (String line : output.split("\n")) {
+      if (!line.contains("Unsupported usage of main-dex list")) {
+        builder.append(line).append("\n");
+      }
+    }
+    return builder.toString();
   }
 }
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
index 0700a5f..03ba4b8 100644
--- a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
@@ -89,4 +89,9 @@
   public GenerateMainDexListTestBuilder addDataEntryResources(DataEntryResource... resources) {
     return addDataResources(Arrays.asList(resources));
   }
+
+  public GenerateMainDexListTestBuilder setMainDexListOutputPath(Path output) {
+    builder.setMainDexListOutputPath(output);
+    return self();
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/R8ApiBinaryCompatibilityTests.java b/src/test/java/com/android/tools/r8/R8ApiBinaryCompatibilityTests.java
index ac3d89f..67753da 100644
--- a/src/test/java/com/android/tools/r8/R8ApiBinaryCompatibilityTests.java
+++ b/src/test/java/com/android/tools/r8/R8ApiBinaryCompatibilityTests.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -82,7 +81,7 @@
     ProcessBuilder builder = new ProcessBuilder(command);
     ProcessResult result = ToolHelper.runProcess(builder);
     assertEquals(result.stderr + "\n" + result.stdout, 0, result.exitCode);
-    assertTrue(result.stdout, result.stdout.isEmpty());
-    assertTrue(result.stderr, result.stderr.isEmpty());
+    assertEquals("", D8ApiBinaryCompatibilityTests.filterOutMainDexListWarnings(result.stdout));
+    assertEquals("", result.stderr);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index e1d8658..0d90a34 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -229,7 +229,7 @@
     return addMainDexRuleFiles(Arrays.asList(files));
   }
 
-  public T addMainDexClassRules(Class<?>... classes) {
+  public T addMainDexKeepClassRules(Class<?>... classes) {
     for (Class<?> clazz : classes) {
       addMainDexRules("-keep class " + clazz.getTypeName());
     }
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexListTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexListTest.java
index 613cc0b..2aeacb8 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexListTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexListTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.classmerging.horizontal;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsNot.not;
@@ -13,9 +14,7 @@
 import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.A;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.B;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.Main;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -36,6 +35,8 @@
         .build();
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
+  //  Ensure the main-dex-rules variant of this test (PreventMergeMainDexTracingTest) is sufficient.
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
@@ -45,7 +46,13 @@
         .addOptionsModification(options -> options.minimalMainDex = true)
         .enableNeverClassInliningAnnotations()
         .setMinApi(parameters.getApiLevel())
-        .compile()
+        .allowDiagnosticMessages()
+        .compileWithExpectedDiagnostics(
+            diagnostics ->
+                diagnostics
+                    .assertOnlyWarnings()
+                    .assertWarningsMatch(
+                        diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)))
         .apply(this::checkCompileResult)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("main dex");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexTracingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexTracingTest.java
index a97e6f5..de0bd57 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexTracingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/PreventMergeMainDexTracingTest.java
@@ -40,7 +40,7 @@
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
         .addKeepClassAndMembersRules(Other.class)
-        .addMainDexClassRules(Main.class)
+        .addMainDexKeepClassRules(Main.class)
         .addOptionsModification(options -> options.minimalMainDex = true)
         .enableNeverClassInliningAnnotations()
         .enableNoHorizontalClassMergingAnnotations()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
index 43f53ab..624e8a0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
@@ -11,6 +11,8 @@
 import com.android.tools.r8.GenerateLintFiles;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.ir.desugar.DesugaredLibraryConfiguration;
@@ -26,9 +28,22 @@
 import java.util.List;
 import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class LintFilesTest extends TestBase {
 
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public LintFilesTest(TestParameters parameters) {
+    parameters.assertNoneRuntime();
+  }
+
   private void checkFileContent(AndroidApiLevel minApiLevel, Path lintFile) throws Exception {
     // Just do some light probing in the generated lint files.
     List<String> methods = FileUtils.readAllLines(lintFile);
diff --git a/src/test/java/com/android/tools/r8/dump/DumpMainDexInputsTest.java b/src/test/java/com/android/tools/r8/dump/DumpMainDexInputsTest.java
index 7c8eafe..1d01be7 100644
--- a/src/test/java/com/android/tools/r8/dump/DumpMainDexInputsTest.java
+++ b/src/test/java/com/android/tools/r8/dump/DumpMainDexInputsTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.dump;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static java.util.stream.Collectors.toList;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -12,7 +13,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -89,19 +89,32 @@
         "pre-native-multidex only",
         parameters.getApiLevel().isLessThanOrEqualTo(AndroidApiLevel.K));
     Path dumpDir = temp.newFolder().toPath();
+    // Pre-compile to DEX and do main-dex list on DEX inputs only.
+    Path dexed =
+        testForD8()
+            .addInnerClasses(DumpMainDexInputsTest.class)
+            .setMinApi(parameters.getApiLevel())
+            .compile()
+            .writeToZip();
+
     testForD8()
+        .addProgramFiles(dexed)
         .setMinApi(parameters.getApiLevel())
-        .addInnerClasses(DumpMainDexInputsTest.class)
         .addMainDexListFiles(
             mainDexListForMainDexFile1AndMainDexFile2(), mainDexListForMainDexFile3())
         .addMainDexListClasses(MainDexClass1.class, MainDexClass2.class, TestClass.class)
-        .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
         .addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString())
-        .compile()
-        .assertAllInfoMessagesMatch(containsString("Dumped compilation inputs to:"))
-        .assertAllWarningMessagesMatch(
-            containsString(
-                "Dumping main dex list resources may have side effects due to I/O on Paths."))
+        .compileWithExpectedDiagnostics(
+            diagnostics ->
+                diagnostics
+                    .assertNoErrors()
+                    .assertInfosMatch(
+                        diagnosticMessage(containsString("Dumped compilation inputs to:")))
+                    .assertWarningsMatch(
+                        diagnosticMessage(
+                            containsString(
+                                "Dumping main dex list resources may have side effects due to I/O"
+                                    + " on Paths."))))
         .run(parameters.getRuntime(), TestClass.class)
         .assertSuccessWithOutputLines("Hello, world");
     verifyDumpDir(dumpDir, true);
@@ -117,7 +130,7 @@
         .setMinApi(parameters.getApiLevel())
         .addInnerClasses(DumpMainDexInputsTest.class)
         .addMainDexRulesFiles(newMainDexRulesPath1(), newMainDexRulesPath2())
-        .addMainDexListClasses(MainDexClass1.class, MainDexClass2.class, TestClass.class)
+        .addMainDexKeepClassRules(MainDexClass1.class, MainDexClass2.class, TestClass.class)
         .addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString())
         .compile()
         .assertAllInfoMessagesMatch(containsString("Dumped compilation inputs to:"))
@@ -136,7 +149,7 @@
         .setMinApi(parameters.getApiLevel())
         .addInnerClasses(DumpMainDexInputsTest.class)
         .addMainDexRuleFiles(newMainDexRulesPath1(), newMainDexRulesPath2())
-        .addMainDexListClasses(MainDexClass1.class, MainDexClass2.class, TestClass.class)
+        .addMainDexKeepClassRules(MainDexClass1.class, MainDexClass2.class, TestClass.class)
         .addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString())
         .addKeepAllClassesRule()
         .allowDiagnosticMessages()
@@ -168,9 +181,10 @@
     assertTrue(Files.exists(unzipped.resolve("r8-version")));
     assertTrue(Files.exists(unzipped.resolve("program.jar")));
     assertTrue(Files.exists(unzipped.resolve("library.jar")));
-    assertTrue(Files.exists(unzipped.resolve("main-dex-list.txt")));
     if (checkMainDexList) {
-      String mainDex = new String(Files.readAllBytes(unzipped.resolve("main-dex-list.txt")));
+      Path mainDexListFile = unzipped.resolve("main-dex-list.txt");
+      assertTrue(Files.exists(mainDexListFile));
+      String mainDex = new String(Files.readAllBytes(mainDexListFile));
       List<String> mainDexLines =
           Arrays.stream(mainDex.split("\n")).filter(s -> !s.isEmpty()).collect(toList());
       assertEquals(6, mainDexLines.size());
@@ -186,7 +200,9 @@
               .collect(toList());
       assertEquals(expected, mainDexLines);
     } else {
-      String mainDexRules = new String(Files.readAllBytes(unzipped.resolve("main-dex-rules.txt")));
+      Path mainDexRulesFile = unzipped.resolve("main-dex-rules.txt");
+      assertTrue(Files.exists(mainDexRulesFile));
+      String mainDexRules = new String(Files.readAllBytes(mainDexRulesFile));
       assertThat(mainDexRules, containsString(mainDexRulesForMainDexFile1AndMainDexFile2));
       assertThat(mainDexRules, containsString(mainDexRulesForMainDexFile3));
     }
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
index 6cb7ab4..ad0cf84 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
@@ -79,13 +79,16 @@
         });
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
   @Test
   public void testMainDexClasses() throws Exception {
     assumeTrue(parameters.isDexRuntime());
     assumeTrue(parameters.getDexRuntimeVersion().isDalvik());
     runTest(
         r8FullTestBuilder ->
-            r8FullTestBuilder.addMainDexListClasses(I.class, Provider.class, Main.class),
+            r8FullTestBuilder
+                .addMainDexListClasses(I.class, Provider.class, Main.class)
+                .allowDiagnosticWarningMessages(),
         this::inspect);
   }
 
@@ -94,7 +97,7 @@
     assumeTrue(parameters.isDexRuntime());
     assumeTrue(parameters.getDexRuntimeVersion().isDalvik());
     runTest(
-        r8FullTestBuilder -> r8FullTestBuilder.addMainDexClassRules(Main.class, I.class),
+        r8FullTestBuilder -> r8FullTestBuilder.addMainDexKeepClassRules(Main.class, I.class),
         this::inspect);
   }
 
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
index 5f21fee..3290031 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.maindexlist;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethod;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -15,6 +16,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -59,6 +61,7 @@
     this.parameters = parameters;
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
   @Test
   public void test() throws Exception {
     // The generated main dex list should contain Main (which is a root) and A (which is a direct
@@ -82,7 +85,13 @@
             .enableNoHorizontalClassMergingAnnotations()
             .setMinApi(parameters.getApiLevel())
             .noMinification()
-            .compile();
+            .allowDiagnosticMessages()
+            .compileWithExpectedDiagnostics(
+                diagnostics ->
+                    diagnostics
+                        .assertOnlyWarnings()
+                        .assertWarningsMatch(
+                            diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
     CodeInspector inspector = compileResult.inspector();
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
     assertThat(mainClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
index 98ec426..013fdd3 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.maindexlist;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethod;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -16,6 +17,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -61,6 +63,7 @@
     this.parameters = parameters;
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
   @Test
   public void test() throws Exception {
     // The generated main dex list should contain Main (which is a root) and A (which is a direct
@@ -80,7 +83,13 @@
             .enableNoHorizontalClassMergingAnnotations()
             .enableNoHorizontalClassMergingAnnotations()
             .setMinApi(parameters.getApiLevel())
-            .compile();
+            .allowDiagnosticMessages()
+            .compileWithExpectedDiagnostics(
+                diagnostics ->
+                    diagnostics
+                        .assertOnlyWarnings()
+                        .assertWarningsMatch(
+                            diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
 
     CodeInspector inspector = compileResult.inspector();
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
index f5971f9..bb3b81c 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.maindexlist;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethod;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -16,6 +17,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -61,6 +63,7 @@
     this.parameters = parameters;
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
   @Test
   public void test() throws Exception {
     // The generated main dex list should contain Main (which is a root) and A (which is a direct
@@ -84,7 +87,13 @@
             .enableNoHorizontalClassMergingAnnotations()
             .noMinification()
             .setMinApi(parameters.getApiLevel())
-            .compile();
+            .allowDiagnosticMessages()
+            .compileWithExpectedDiagnostics(
+                diagnostics ->
+                    diagnostics
+                        .assertOnlyWarnings()
+                        .assertWarningsMatch(
+                            diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
 
     CodeInspector inspector = compileResult.inspector();
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
index c2c96ec..4d59d9b 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
@@ -65,6 +65,7 @@
     this.parameters = parameters;
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
   @Test
   public void testMainDexList() throws Exception {
     assertEquals(3, mainDexList.size());
@@ -73,7 +74,9 @@
     assertTrue(mainDexReferences.contains(A.class.getTypeName()));
     assertTrue(mainDexReferences.contains(B.class.getTypeName()));
     assertTrue(mainDexReferences.contains(Main.class.getTypeName()));
-    runTest(builder -> builder.addMainDexListClassReferences(mainDexList));
+    runTest(
+        builder ->
+            builder.addMainDexListClassReferences(mainDexList).allowDiagnosticWarningMessages());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
index ec50d1e..480abb7 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
@@ -65,6 +65,7 @@
     this.parameters = parameters;
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
   @Test
   public void testMainDexList() throws Exception {
     assertEquals(3, mainDexList.size());
@@ -73,7 +74,9 @@
     assertTrue(mainDexReferences.contains(A.class.getTypeName()));
     assertTrue(mainDexReferences.contains(B.class.getTypeName()));
     assertTrue(mainDexReferences.contains(Main.class.getTypeName()));
-    runTest(builder -> builder.addMainDexListClassReferences(mainDexList));
+    runTest(
+        builder ->
+            builder.addMainDexListClassReferences(mainDexList).allowDiagnosticWarningMessages());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListInliningTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListInliningTest.java
index 09df9d4..731d0ec 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListInliningTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListInliningTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.maindexlist;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertFalse;
@@ -14,6 +15,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import org.junit.Test;
@@ -37,6 +39,7 @@
     this.parameters = parameters;
   }
 
+  // TODO(b/181858113): This test should be converted to a main-dex-rules test.
   @Test
   public void test() throws Exception {
     R8TestCompileResult compileResult =
@@ -47,7 +50,13 @@
             .collectMainDexClasses()
             .enableNoHorizontalClassMergingAnnotations()
             .setMinApi(parameters.getApiLevel())
-            .compile();
+            .allowDiagnosticMessages()
+            .compileWithExpectedDiagnostics(
+                diagnostics ->
+                    diagnostics
+                        .assertOnlyWarnings()
+                        .assertWarningsMatch(
+                            diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
 
     CodeInspector inspector = compileResult.inspector();
 
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListNoDirectDependenciesTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListNoDirectDependenciesTest.java
index 8f5d997..e72cc3e 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListNoDirectDependenciesTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListNoDirectDependenciesTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.maindexlist;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -11,6 +12,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import org.junit.Test;
@@ -34,17 +36,24 @@
     this.parameters = parameters;
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
   @Test
   public void test() throws Exception {
     R8TestCompileResult compileResult =
         testForR8(parameters.getBackend())
             .addInnerClasses(getClass())
             .addMainDexListClasses(A.class)
-            .addMainDexClassRules(B.class)
+            .addMainDexKeepClassRules(B.class)
             .collectMainDexClasses()
             .noTreeShaking()
             .setMinApi(parameters.getApiLevel())
-            .compile();
+            .allowDiagnosticMessages()
+            .compileWithExpectedDiagnostics(
+                diagnostics ->
+                    diagnostics
+                        .assertOnlyWarnings()
+                        .assertWarningsMatch(
+                            diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)));
 
     CodeInspector inspector = compileResult.inspector();
 
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexPrunedReferenceTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexPrunedReferenceTest.java
index e2d7dd2..c10a7a6 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexPrunedReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexPrunedReferenceTest.java
@@ -48,11 +48,12 @@
     testMainDex(builder -> {}, Assert::assertNull);
   }
 
+  // TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
   @Test
   public void testMainDexClassesList() throws Exception {
     assumeTrue(parameters.getDexRuntimeVersion().isDalvik());
     testMainDex(
-        builder -> builder.addMainDexListClasses(Main.class),
+        builder -> builder.addMainDexListClasses(Main.class).allowDiagnosticWarningMessages(),
         mainDexClasses -> assertEquals(ImmutableSet.of(Main.class.getTypeName()), mainDexClasses));
   }
 
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexWithSynthesizedClassesTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexWithSynthesizedClassesTest.java
index 8252f4d..16dc8db 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexWithSynthesizedClassesTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexWithSynthesizedClassesTest.java
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.maindexlist;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticOrigin;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
+import static org.hamcrest.CoreMatchers.allOf;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
@@ -11,11 +14,17 @@
 import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestCompileResult;
+import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Files;
@@ -81,23 +90,67 @@
     checkCompilationResult(compileResult);
   }
 
+  @Test
+  public void testSupportedMainDexListD8() throws Exception {
+    assumeTrue(parameters.isDexRuntime());
+    // It remains a supported mode to first compile to DEX and then use tracing on the compiled
+    // output. Neither the compilation, the trace or the merge should issue any diagnostics.
+    Path dexed =
+        testForD8()
+            .addInnerClasses(MainDexWithSynthesizedClassesTest.class)
+            .setMinApi(parameters.getApiLevel())
+            .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages)
+            .writeToZip();
+
+    Path mainDexFile = temp.newFile("maindex.list").toPath();
+    testForMainDexListGenerator()
+        .addLibraryFiles(ToolHelper.getFirstSupportedAndroidJar(parameters.getApiLevel()))
+        .addProgramFiles(dexed)
+        .addMainDexRules("-keep class " + typeName(TestClass.class) + "{ *; }")
+        .setMainDexListOutputPath(mainDexFile)
+        .run();
+
+    D8TestCompileResult compileResult =
+        testForD8()
+            .addProgramFiles(dexed)
+            .addMainDexListFiles(mainDexFile)
+            .setMinApi(parameters.getApiLevel())
+            .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages);
+    checkCompilationResult(compileResult);
+  }
+
   /**
    * This test checks for maintained support of including synthetics from main-dex-list entries in
    * the main-dex file. This test simulates that the tracing done at the class-file level has
    * determined that TestClass and A are both traced. Thus the synthetic lambda from A will be
    * included in the main-dex file.
    *
-   * <p>TODO(b/181858113): Remove once deprecated main-dex-list is removed.
+   * <p>TODO(b/181858113): Update to assert an error is raised once deprecated period is over.
    */
   @Test
   public void testDeprecatedSyntheticsFromMainDexListD8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
+    Path mainDexFile = temp.newFile("maindex.list").toPath();
+    FileUtils.writeTextFile(mainDexFile, binaryName(A.class) + ".class");
     D8TestCompileResult compileResult =
         testForD8()
             .addInnerClasses(MainDexWithSynthesizedClassesTest.class)
-            .addMainDexListClasses(TestClass.class, A.class)
+            .addMainDexListClasses(TestClass.class)
+            .addMainDexListFiles(mainDexFile)
             .setMinApi(parameters.getApiLevel())
-            .compile();
+            .compileWithExpectedDiagnostics(
+                diagnostics ->
+                    diagnostics
+                        .assertOnlyWarnings()
+                        .assertWarningsMatch(
+                            // The "classes" addition has no origin.
+                            allOf(
+                                diagnosticType(UnsupportedMainDexListUsageDiagnostic.class),
+                                diagnosticOrigin(Origin.unknown())),
+                            // The "file" addition must have the file origin.
+                            allOf(
+                                diagnosticType(UnsupportedMainDexListUsageDiagnostic.class),
+                                diagnosticOrigin(new PathOrigin(mainDexFile)))));
     checkCompilationResult(compileResult);
   }
 
@@ -112,15 +165,31 @@
   @Test
   public void testDeprecatedSyntheticsFromMainDexListR8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
+    Path mainDexFile = temp.newFile("maindex.list").toPath();
+    FileUtils.writeTextFile(mainDexFile, binaryName(A.class) + ".class");
     R8TestCompileResult compileResult =
         testForR8(parameters.getBackend())
             .addInnerClasses(MainDexWithSynthesizedClassesTest.class)
             .setMinApi(parameters.getApiLevel())
             .addOptionsModification(o -> o.minimalMainDex = true)
-            .addMainDexListClasses(TestClass.class, A.class)
+            .addMainDexListClasses(TestClass.class)
+            .addMainDexListFiles(mainDexFile)
             .noMinification()
             .noTreeShaking()
-            .compile();
+            .allowDiagnosticWarningMessages()
+            .compileWithExpectedDiagnostics(
+                diagnostics ->
+                    diagnostics
+                        .assertOnlyWarnings()
+                        .assertWarningsMatch(
+                            // The "classes" addition has no origin.
+                            allOf(
+                                diagnosticType(UnsupportedMainDexListUsageDiagnostic.class),
+                                diagnosticOrigin(Origin.unknown())),
+                            // The "file" addition must have the file origin.
+                            allOf(
+                                diagnosticType(UnsupportedMainDexListUsageDiagnostic.class),
+                                diagnosticOrigin(new PathOrigin(mainDexFile)))));
     checkCompilationResult(compileResult, compileResult.app);
   }
 
@@ -128,7 +197,7 @@
     checkCompilationResult(compileResult, compileResult.app);
   }
 
-  private void checkCompilationResult(TestCompileResult compileResult, AndroidApp app)
+  private void checkCompilationResult(TestCompileResult<?, ?> compileResult, AndroidApp app)
       throws Exception {
     if (parameters.getRuntime().asDex().getMinApiLevel().getLevel()
         < nativeMultiDexLevel.getLevel()) {
diff --git a/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java b/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
index 22bad85..19e75b3 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/warnings/MainDexWarningsTest.java
@@ -56,7 +56,7 @@
         .addProgramClasses(testClasses)
         .addKeepMainRule(mainClass)
         // Include main dex rule for class Static.
-        .addMainDexClassRules(Main.class, Static.class)
+        .addMainDexKeepClassRules(Main.class, Static.class)
         .enableForceInliningAnnotations()
         .setMinApi(parameters.getApiLevel())
         .compile()
@@ -93,7 +93,7 @@
         // Include explicit main dex entry for class Static.
         .addMainDexListClasses(Main.class, Static.class)
         // Include main dex rule for class Static2.
-        .addMainDexClassRules(Static2.class)
+        .addMainDexKeepClassRules(Static2.class)
         .addDontWarn(Static.class)
         .allowDiagnosticWarningMessages()
         .enableForceInliningAnnotations()
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithDexItemBasedConstStringTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithDexItemBasedConstStringTest.java
index e374f2a..624bdfe 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithDexItemBasedConstStringTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithDexItemBasedConstStringTest.java
@@ -46,7 +46,7 @@
     testForR8(parameters.getBackend())
         .addInnerClasses(getClass())
         .addKeepMainRule(TestClass.class)
-        .addMainDexClassRules(TestClass.class)
+        .addMainDexKeepClassRules(TestClass.class)
         .apply(this::configureRepackaging)
         .setMinApi(parameters.getApiLevel())
         .compile()
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithMainDexListTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithMainDexListTest.java
index 4fc28f5..81183f5 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithMainDexListTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithMainDexListTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.repackage;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 import static com.android.tools.r8.shaking.ProguardConfigurationParser.FLATTEN_PACKAGE_HIERARCHY;
 import static com.android.tools.r8.shaking.ProguardConfigurationParser.REPACKAGE_CLASSES;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
@@ -13,6 +14,7 @@
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
@@ -22,6 +24,7 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
+// TODO(b/181858113): This test is likely obsolete once main-dex-list support is removed.
 @RunWith(Parameterized.class)
 public class RepackageWithMainDexListTest extends RepackageTestBase {
 
@@ -54,7 +57,13 @@
         // Debug mode to enable minimal main dex.
         .debug()
         .setMinApi(parameters.getApiLevel())
-        .compile()
+        .allowDiagnosticMessages()
+        .compileWithExpectedDiagnostics(
+            diagnostics ->
+                diagnostics
+                    .assertOnlyWarnings()
+                    .assertWarningsMatch(
+                        diagnosticType(UnsupportedMainDexListUsageDiagnostic.class)))
         .apply(this::checkCompileResult)
         .run(parameters.getRuntime(), TestClass.class)
         .assertSuccessWithOutputLines("Hello world!");