Ensure repackaging do not pick types that has been pruned
Bug: 183111898
Change-Id: I6125dba726cad04e09e41718dd1cea5c38efd749
diff --git a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
index 48227b4..c6612c5 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -427,7 +427,7 @@
}
// Ensure that the generated name is unique.
DexType finalRepackagedDexType = repackagedDexType;
- for (int i = 1; mappings.inverse().containsKey(finalRepackagedDexType); i++) {
+ for (int i = 1; isRepackageTypeUsed(finalRepackagedDexType, mappings, appView); i++) {
finalRepackagedDexType =
repackagedDexType.addSuffix(
Character.toString(INNER_CLASS_SEPARATOR) + i, dexItemFactory);
@@ -436,6 +436,12 @@
}
}
+ private static boolean isRepackageTypeUsed(
+ DexType type, BiMap<DexType, DexType> mappings, AppView<?> appView) {
+ return mappings.inverse().containsKey(type)
+ || (appView.hasLiveness() && appView.withLiveness().appInfo().wasPruned(type));
+ }
+
/** Testing only. */
public static class SuffixRenamingRepackagingConfiguration implements RepackagingConfiguration {
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/MergeWithRepackageNameCollissionTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/MergeWithRepackageNameCollissionTest.java
index 7f7e655..f3772a7 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/MergeWithRepackageNameCollissionTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/MergeWithRepackageNameCollissionTest.java
@@ -4,9 +4,6 @@
package com.android.tools.r8.classmerging.horizontal;
-import static org.hamcrest.CoreMatchers.containsString;
-
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.NoHorizontalClassMerging;
import com.android.tools.r8.TestParameters;
@@ -27,7 +24,7 @@
super(parameters);
}
- @Test(expected = CompilationFailedException.class)
+ @Test
public void testR8() throws Exception {
testForR8(parameters.getBackend())
.addProgramClassFileData(getProgramFileData())
@@ -37,12 +34,8 @@
.setMinApi(parameters.getApiLevel())
.enableNoHorizontalClassMergingAnnotations()
.enableInliningAnnotations()
- .compileWithExpectedDiagnostics(
- diagnostics -> {
- // TODO(b/183111898): Should not fail.
- diagnostics.assertErrorMessageThatMatches(
- containsString("The lens and app is inconsistent"));
- });
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("C::baz", "Hello World");
}
private Collection<byte[]> getProgramFileData() throws Exception {