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