Fix Pay-as-you-go emulated interfaces
Bug: 182381011
Change-Id: I0a31212bc4fcb0cb100723e075fd127dbd396bd9
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
index 04b702a..3e665db 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
@@ -126,7 +126,7 @@
ClassInfo parent,
ImmutableList<DexClassAndMethod> forwardedMethodTargets,
EmulatedInterfaceInfo emulatedInterfaceInfo) {
- return forwardedMethodTargets.isEmpty()
+ return forwardedMethodTargets.isEmpty() && emulatedInterfaceInfo.isEmpty()
? parent
: new ClassInfo(parent, forwardedMethodTargets, emulatedInterfaceInfo);
}
@@ -725,8 +725,8 @@
SignaturesInfo signatures = visitLibraryClassInfo(clazz.superType);
// The class may inherit emulated interface info from its program superclass if the latter
// did not require to resolve the forwarding methods for emualted interfaces.
- signatures = signatures.withEmulatedInterfaceInfo(superInfo.emulatedInterfaceInfo);
assert superInfo.isEmpty() || signatures.isEmpty();
+ signatures = signatures.withEmulatedInterfaceInfo(superInfo.emulatedInterfaceInfo);
for (DexType iface : clazz.interfaces.values) {
signatures = signatures.merge(visitInterfaceInfo(iface, thisContext));
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
index 9984eb3..57d8867 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
@@ -24,10 +24,13 @@
@RunWith(Parameterized.class)
public class CustomMapHierarchyTest extends DesugaredLibraryTestBase {
+ private static final String EXPECTED =
+ StringUtils.lines("B::getOrDefault", "default 1", "B::getOrDefault", "default 2");
+
private final TestParameters parameters;
private final boolean shrinkDesugaredLibrary;
- @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}")
+ @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
public static List<Object[]> data() {
return buildParameters(
getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(),
@@ -67,13 +70,7 @@
keepRuleConsumer.get(),
shrinkDesugaredLibrary)
.run(parameters.getRuntime(), Main.class)
- // TODO(b/182381011): Should always be EXPECTED.
- .assertSuccessWithOutput(
- parameters
- .getApiLevel()
- .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
- ? EXPECTED
- : NOT_EXPECTED);
+ .assertSuccessWithOutput(EXPECTED);
}
@Test
@@ -109,25 +106,13 @@
desugaredLibraryKeepRules,
shrinkDesugaredLibrary)
.run(parameters.getRuntime(), Main.class)
- // TODO(b/182381011): Should always be EXPECTED.
- .assertSuccessWithOutput(
- parameters
- .getApiLevel()
- .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
- ? EXPECTED
- : NOT_EXPECTED);
+ .assertSuccessWithOutput(EXPECTED);
} else {
testForJvm()
.addProgramFiles(jar)
.addRunClasspathFiles(getDesugaredLibraryInCF(parameters, options -> {}))
.run(parameters.getRuntime(), Main.class)
- // TODO(b/182381011): Should always be EXPECTED.
- .assertSuccessWithOutput(
- parameters
- .getApiLevel()
- .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
- ? EXPECTED
- : NOT_EXPECTED);
+ .assertSuccessWithOutput(EXPECTED);
}
}
@@ -145,12 +130,6 @@
ProguardKeepAttributes.ENCLOSING_METHOD)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
- // TODO(b/182381011): Should not happen.
- .applyIf(
- parameters
- .getApiLevel()
- .isLessThan(TestBase.apiLevelWithDefaultInterfaceMethodsSupport()),
- b -> b.addDontWarn("java.util.Map$-CC"))
.compile()
.addDesugaredCoreLibraryRunClassPath(
this::buildDesugaredLibrary,
@@ -158,19 +137,9 @@
keepRuleConsumer.get(),
shrinkDesugaredLibrary)
.run(parameters.getRuntime(), Main.class)
- // TODO(b/182381011): Should always be EXPECTED.
- .assertSuccessWithOutput(
- parameters
- .getApiLevel()
- .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
- ? EXPECTED
- : NOT_EXPECTED);
+ .assertSuccessWithOutput(EXPECTED);
}
- final String EXPECTED =
- StringUtils.lines("B::getOrDefault", "default 1", "B::getOrDefault", "default 2");
- final String NOT_EXPECTED = StringUtils.lines("B::getOrDefault", "default 1", "default 2");
-
public static class Main {
public static void main(String[] args) {
System.out.println(new B<String>().getOrDefault("Not found", "default 1"));