Fix for b/191926899

Check for library desugared input when adding library
retarget marker interface.

Fixes: 191926899
Change-Id: Ia930b804992298c5f319ff0e7f8a02a2a8b7e864
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index c23b48c..671fb6b 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -454,6 +454,9 @@
       internal.enableSwitchRewriting = false;
       assert internal.enableStringSwitchConversion;
       internal.enableStringSwitchConversion = false;
+    } else {
+      assert !internal.desugarSpecificOptions().allowAllDesugaredInput
+          || getDesugarState() == DesugarState.OFF;
     }
     internal.mainDexListConsumer = getMainDexListConsumer();
     internal.minimalMainDex = internal.debug || minimalMainDex;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
index d25015b..64d3cc6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
@@ -114,6 +114,9 @@
     // methods.
     // We cannot use the ClassProcessor since this applies up to 26, while the ClassProcessor
     // applies up to 24.
+    if (appView.isAlreadyLibraryDesugared(clazz)) {
+      return;
+    }
     for (DexClassAndMethod method : methods) {
       DexClass newInterface =
           syntheticHelper.ensureEmulatedInterfaceDispatchMethod(method, eventConsumer);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
index cff586f..e1592c0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary;
 
-import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -61,40 +60,41 @@
                 options -> options.desugarSpecificOptions().allowAllDesugaredInput = true)
             .compile()
             .writeToZip();
+
+    String stdout;
     if (parameters.getRuntime().isDex()) {
       // Convert to DEX without desugaring and run.
-      testForD8()
-          .addProgramFiles(desugaredTwice)
-          .setMinApi(parameters.getApiLevel())
-          .disableDesugaring()
-          .compile()
-          .addDesugaredCoreLibraryRunClassPath(
-              this::buildDesugaredLibrary,
-              parameters.getApiLevel(),
-              keepRuleConsumer.get(),
-              shrinkDesugaredLibrary)
-          .run(
-              parameters.getRuntime(),
-              Executor.class,
-              Boolean.toString(parameters.getRuntime().isCf()))
-          .applyIf(
-              parameters.getApiLevel().isLessThan(AndroidApiLevel.O),
-              SingleTestRunResult::assertFailure,
-              SingleTestRunResult::assertSuccess);
+      stdout =
+          testForD8(Backend.DEX)
+              .addProgramFiles(desugaredTwice)
+              .setMinApi(parameters.getApiLevel())
+              .disableDesugaring()
+              .compile()
+              .addDesugaredCoreLibraryRunClassPath(
+                  this::buildDesugaredLibrary,
+                  parameters.getApiLevel(),
+                  keepRuleConsumer.get(),
+                  shrinkDesugaredLibrary)
+              .run(
+                  parameters.getRuntime(),
+                  Executor.class,
+                  Boolean.toString(parameters.getRuntime().isCf()))
+              .assertSuccess()
+              .getStdOut();
     } else {
       // Run on the JVM with desugared library on classpath.
-      testForJvm()
-          .addProgramFiles(desugaredTwice)
-          .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel()))
-          .run(
-              parameters.getRuntime(),
-              Executor.class,
-              Boolean.toString(parameters.getRuntime().isCf()))
-          .applyIf(
-              parameters.getApiLevel().isLessThan(AndroidApiLevel.O),
-              SingleTestRunResult::assertFailure,
-              SingleTestRunResult::assertSuccess);
+      stdout =
+          testForJvm()
+              .addProgramFiles(desugaredTwice)
+              .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel()))
+              .run(
+                  parameters.getRuntime(),
+                  Executor.class,
+                  Boolean.toString(parameters.getRuntime().isCf()))
+              .assertSuccess()
+              .getStdOut();
     }
+    assertLines2By2Correct(stdout);
   }
 
   @Test
@@ -152,27 +152,31 @@
 
     public static void main(String[] args) {
       boolean isJvm = Boolean.parseBoolean(args[0]);
-      directTypes();
-      polyTypes();
+      directTypes(isJvm);
+      polyTypes(isJvm);
       baseTypes(isJvm);
     }
 
-    public static void directTypes() {
+    public static void directTypes(boolean isJvm) {
       MyCalendarOverride myCal = new MyCalendarOverride(1990, 2, 22);
-      System.out.println(myCal.toZonedDateTime());
-      System.out.println("1990-11-22T00:00Z[GMT]");
-      System.out.println(myCal.toInstant());
-      System.out.println("1990-03-22T00:00:00Z");
+      if (!isJvm) {
+        System.out.println(myCal.toZonedDateTime());
+        System.out.println("1990-11-22T00:00Z[GMT]");
+        System.out.println(myCal.toInstant());
+        System.out.println("1990-03-22T00:00:00Z");
+      }
 
       MyCalendarNoOverride myCalN = new MyCalendarNoOverride(1990, 2, 22);
-      System.out.println(myCalN.toZonedDateTime());
-      System.out.println("1990-03-22T00:00Z[GMT]");
-      System.out.println(myCalN.superToZonedDateTime());
-      System.out.println("1990-03-22T00:00Z[GMT]");
-      System.out.println(myCalN.toInstant());
-      System.out.println("1990-03-22T00:00:00Z");
-      System.out.println(myCalN.superToInstant());
-      System.out.println("1990-03-22T00:00:00Z");
+      if (!isJvm) {
+        System.out.println(myCalN.toZonedDateTime());
+        System.out.println("1990-03-22T00:00Z[GMT]");
+        System.out.println(myCalN.superToZonedDateTime());
+        System.out.println("1990-03-22T00:00Z[GMT]");
+        System.out.println(myCalN.toInstant());
+        System.out.println("1990-03-22T00:00:00Z");
+        System.out.println(myCalN.superToInstant());
+        System.out.println("1990-03-22T00:00:00Z");
+      }
 
       MyDateDoubleOverride myDateCast2 = new MyDateDoubleOverride(123456789);
       System.out.println(myDateCast2.toInstant());
@@ -197,12 +201,13 @@
       System.out.println("145");
 
       Date date1 = MyDateNoOverride.from(myCal.toInstant());
-      System.out.println(date1.toInstant());
-      System.out.println("1990-03-22T00:00:00Z");
-      Date date2 = MyDateOverride.from(myCal.toInstant());
-      System.out.println(date2.toInstant());
-      System.out.println("1990-03-22T00:00:00Z");
-
+      if (!isJvm) {
+        System.out.println(date1.toInstant());
+        System.out.println("1990-03-22T00:00:00Z");
+        Date date2 = MyDateOverride.from(myCal.toInstant());
+        System.out.println(date2.toInstant());
+        System.out.println("1990-03-22T00:00:00Z");
+      }
       System.out.println(MyDateDoubleOverride.from(myCal.toInstant()).toInstant());
       System.out.println("1970-01-02T10:17:36.788Z");
 
@@ -210,7 +215,7 @@
       System.out.println("1970-01-02T10:17:36.788Z");
     }
 
-    public static void polyTypes() {
+    public static void polyTypes(boolean isJvm) {
       Date myDateCast = new MyDateOverride(123456789);
       System.out.println(myDateCast.toInstant());
       System.out.println("1970-01-02T10:17:45.789Z");
@@ -224,29 +229,35 @@
       System.out.println("1970-01-02T10:17:36.789Z");
 
       GregorianCalendar myCalCast = new MyCalendarOverride(1990, 2, 22);
-      System.out.println(myCalCast.toZonedDateTime());
-      System.out.println("1990-11-22T00:00Z[GMT]");
-      System.out.println(myCalCast.toInstant());
-      System.out.println("1990-03-22T00:00:00Z");
+      if (!isJvm) {
+        System.out.println(myCalCast.toZonedDateTime());
+        System.out.println("1990-11-22T00:00Z[GMT]");
+        System.out.println(myCalCast.toInstant());
+        System.out.println("1990-03-22T00:00:00Z");
+      }
 
       GregorianCalendar myCalN = new MyCalendarNoOverride(1990, 2, 22);
-      System.out.println(myCalN.toZonedDateTime());
-      System.out.println("1990-03-22T00:00Z[GMT]");
-      System.out.println(myCalN.toInstant());
-      System.out.println("1990-03-22T00:00:00Z");
+      if (!isJvm) {
+        System.out.println(myCalN.toZonedDateTime());
+        System.out.println("1990-03-22T00:00Z[GMT]");
+        System.out.println(myCalN.toInstant());
+        System.out.println("1990-03-22T00:00:00Z");
+      }
     }
 
     public static void baseTypes(boolean isJvm) {
       java.sql.Date date = new java.sql.Date(123456789);
-      // The following one is not working on JVMs, but works on Android...
       if (!isJvm) {
+        // The following one is not working on JVMs, but works on Android...
         System.out.println(date.toInstant());
         System.out.println("1970-01-02T10:17:36.789Z");
       }
 
       GregorianCalendar gregCal = new GregorianCalendar(1990, 2, 22);
-      System.out.println(gregCal.toInstant());
-      System.out.println("1990-03-22T00:00:00Z");
+      if (!isJvm) {
+        System.out.println(gregCal.toInstant());
+        System.out.println("1990-03-22T00:00:00Z");
+      }
     }
   }