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 0204455..bdd4968 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
@@ -315,8 +315,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. target = appView
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)); }