Desugared lib: fix overrides
Bug: 160905482
Change-Id: Ie5dde6080174e16b9007272a0d8eea6420ce80b8
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 3971c88..7dc7daa 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
@@ -320,8 +320,10 @@
return;
}
- // If target is a non-interface library class it may be an emulated interface.
- if (!libraryHolder.isInterface()) {
+ // If target is a non-interface library class it may be an emulated interface,
+ // except on a rewritten type, where L8 has already dealt with the desugaring.
+ if (!libraryHolder.isInterface()
+ && !appView.rewritePrefix.hasRewrittenType(libraryHolder.type, appView)) {
// Here we use step-3 of resolution to find a maximally specific default interface method.
DexClassAndMethod result = appInfo.lookupMaximallySpecificMethod(libraryHolder, method);
if (result != null && rewriter.isEmulatedInterface(result.getHolder().type)) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
index f13eddb..ae709f3 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.StringUtils;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
@@ -18,6 +19,9 @@
@RunWith(Parameterized.class)
public class ConcurrentHashMapSubclassTest extends DesugaredLibraryTestBase {
+ private static final String EXPECTED_RESULT =
+ StringUtils.lines("1.0", "2.0", "10.0", "1.0", "2.0", "10.0", "1.0", "2.0", "10.0");
+
private final TestParameters parameters;
private final boolean shrinkDesugaredLibrary;
@@ -46,7 +50,7 @@
keepRuleConsumer.get(),
shrinkDesugaredLibrary)
.run(parameters.getRuntime(), Executor.class)
- .assertSuccessWithOutputLines("1.0", "10.0", "1.0", "10.0", "1.0", "10.0");
+ .assertSuccessWithOutput(EXPECTED_RESULT);
}
@Test
@@ -64,7 +68,7 @@
keepRuleConsumer.get(),
shrinkDesugaredLibrary)
.run(parameters.getRuntime(), Executor.class)
- .assertSuccessWithOutputLines("1.0", "10.0", "1.0", "10.0", "1.0", "10.0");
+ .assertSuccessWithOutput(EXPECTED_RESULT);
}
@SuppressWarnings("unchecked")
@@ -78,24 +82,33 @@
static void itfType() {
Map map = new NullableConcurrentHashMap<Integer, Double>();
map.put(1, 1.0);
+ map.putIfAbsent(2, 2.0);
+ map.putIfAbsent(2, 3.0);
map.putAll(example());
System.out.println(map.get(1));
+ System.out.println(map.get(2));
System.out.println(map.get(10));
}
static void classType() {
ConcurrentHashMap map = new NullableConcurrentHashMap<Integer, Double>();
map.put(1, 1.0);
+ map.putIfAbsent(2, 2.0);
+ map.putIfAbsent(2, 3.0);
map.putAll(example());
System.out.println(map.get(1));
+ System.out.println(map.get(2));
System.out.println(map.get(10));
}
static void directType() {
NullableConcurrentHashMap map = new NullableConcurrentHashMap<Integer, Double>();
map.put(1, 1.0);
+ map.putIfAbsent(2, 2.0);
+ map.putIfAbsent(2, 3.0);
map.putAll(example());
System.out.println(map.get(1));
+ System.out.println(map.get(2));
System.out.println(map.get(10));
}