Don't assume no library desugaring for desugared CF input
Bug: 190075882
Change-Id: I7468efaca90171b77a6418a10b3192d8c77d08d9
diff --git a/src/main/java/com/android/tools/r8/dex/Marker.java b/src/main/java/com/android/tools/r8/dex/Marker.java
index b892c4a..4770922 100644
--- a/src/main/java/com/android/tools/r8/dex/Marker.java
+++ b/src/main/java/com/android/tools/r8/dex/Marker.java
@@ -81,10 +81,17 @@
.allMatch(m -> m.tool == Tool.L8 || m.getDesugaredLibraryIdentifiers().length == 0);
} else {
String[] identifiers = marker.getDesugaredLibraryIdentifiers();
- String identifier;
+ String identifier = null;
switch (identifiers.length) {
case 0:
- identifier = NO_LIBRARY_DESUGARING;
+ // Only add the <no-library-desugaring> identifier for DEX. A marker from CF is
+ // assumed to go though desugaring for compiling to DEX, and that will introduce the
+ // DEX marker with the final library desugaring identifier.
+ if (marker.isDexBackend()) {
+ identifier = NO_LIBRARY_DESUGARING;
+ } else {
+ assert marker.isCfBackend();
+ }
break;
case 1:
identifier = identifiers[0];
@@ -95,10 +102,10 @@
new StringDiagnostic(
"Merging program compiled with multiple desugared libraries."));
}
- if (marker.isDesugared()) {
+ if (marker.isDesugared() && identifier != null) {
desugaredLibraryIdentifiers.add(identifier);
} else {
- assert identifier.equals(NO_LIBRARY_DESUGARING);
+ assert identifier == null || identifier.equals(NO_LIBRARY_DESUGARING);
}
}
}
@@ -211,11 +218,19 @@
public String getBackend() {
if (!hasBackend()) {
// Before adding backend we would always compile to dex if min-api was specified.
- return hasMinApi() ? "dex" : "cf";
+ return hasMinApi() ? Backend.DEX.name().toLowerCase() : Backend.CF.name().toLowerCase();
}
return jsonObject.get(BACKEND).getAsString();
}
+ public boolean isCfBackend() {
+ return getBackend().equals(Backend.CF.name().toLowerCase());
+ }
+
+ public boolean isDexBackend() {
+ return getBackend().equals(Backend.DEX.name().toLowerCase());
+ }
+
public Marker setBackend(Backend backend) {
assert !hasBackend();
jsonObject.addProperty(BACKEND, backend.name().toLowerCase());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
index 3e8c332..5f50a47 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
@@ -90,26 +90,12 @@
.writeToZip();
// Combine CF desugared input without library desugaring with dexing with library desugaring.
- try {
- testForD8()
- .addProgramFiles(desugaredLibrary)
- .addProgramClasses(TestRunner.class)
- .setMinApi(apiLevel)
- .enableCoreLibraryDesugaring(apiLevel)
- .compileWithExpectedDiagnostics(
- diagnostics -> {
- if (apiLevel.isLessThan(AndroidApiLevel.O)) {
- // This is the failure reported in b/190075882.
- diagnostics.assertOnlyErrors();
- diagnostics.assertErrorsMatch(
- diagnosticType(DesugaredLibraryMismatchDiagnostic.class));
- } else {
- diagnostics.assertNoMessages();
- }
- });
-
- } catch (CompilationFailedException e) {
- }
+ testForD8()
+ .addProgramFiles(desugaredLibrary)
+ .addProgramClasses(TestRunner.class)
+ .setMinApi(apiLevel)
+ .enableCoreLibraryDesugaring(apiLevel)
+ .compile();
}
@Test
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
index 7c46fe3..be9ae1a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
@@ -160,31 +160,27 @@
// Build an app using library desugaring merging with library not using library desugaring.
Path app;
- try {
- app =
- testForD8()
- .addProgramFiles(buildPart1DesugaredLibrary(), desugaredLibDex)
- .setMinApi(parameters.getApiLevel())
- .compile()
- .writeToZip();
+ app =
+ testForD8()
+ .addProgramFiles(buildPart1DesugaredLibrary(), desugaredLibDex)
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .writeToZip();
- // When there is no class-file resources we are adding the marker for the last compilation.
- assertMarkersMatch(
- ExtractMarker.extractMarkerFromDexFile(app),
- ImmutableList.of(
- markerMatcher,
- allOf(
- markerTool(Tool.D8),
- markerCompilationMode(CompilationMode.DEBUG),
- markerBackend(Backend.DEX),
- markerIsDesugared(),
- markerMinApi(parameters.getApiLevel()),
- not(markerHasDesugaredLibraryIdentifier()))));
- } catch (CompilationFailedException e) {
- assertTrue(someLibraryDesugaringRequired());
- return;
- }
- assert !someLibraryDesugaringRequired();
+ // When there is no class-file resources we are adding the marker for the last compilation.
+ assertMarkersMatch(
+ ExtractMarker.extractMarkerFromDexFile(app),
+ ImmutableList.of(
+ markerMatcher,
+ allOf(
+ markerTool(Tool.D8),
+ markerCompilationMode(CompilationMode.DEBUG),
+ markerBackend(Backend.DEX),
+ markerIsDesugared(),
+ markerMinApi(parameters.getApiLevel()),
+ someLibraryDesugaringRequired()
+ ? markerHasDesugaredLibraryIdentifier()
+ : not(markerHasDesugaredLibraryIdentifier()))));
}
private void assertError(TestDiagnosticMessages m) {