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");
+ }
}
}