Account for array results in memberrebinding
Bug: b/233048876
Change-Id: Ifef024aa5f3ad677c13ce344f59d223f0620cc43
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index a03ff91..0f67814 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -291,6 +291,14 @@
return;
}
+ if (method.getHolderType().isArrayType()) {
+ assert resolutionResult.getResolvedHolder().getType()
+ == appView.dexItemFactory().objectType;
+ lensBuilder.map(
+ method, resolutionResult.getResolvedMethod().getReference(), invokeType);
+ return;
+ }
+
// TODO(b/128404854) Rebind to the lowest library class or program class. For now we allow
// searching in library for methods, but this should be done on classpath instead.
DexClassAndMethod resolvedMethod = resolutionResult.getResolutionPair();
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingArrayTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingArrayTest.java
index 8e0f6e8..62de8e6 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingArrayTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingArrayTest.java
@@ -4,10 +4,6 @@
package com.android.tools.r8.memberrebinding;
-import static org.hamcrest.core.StringContains.containsString;
-import static org.junit.Assert.assertThrows;
-
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -40,21 +36,14 @@
@Test
public void testR8() throws Exception {
- // TODO(b/233048876): We should not fail for arrays.
- assertThrows(
- CompilationFailedException.class,
- () -> {
- testForR8(parameters.getBackend())
- .addProgramClassFileData(getMainWithRewrittenEqualsAndHashCode())
- .addKeepMainRule(Main.class)
- .setMinApi(parameters.getApiLevel())
- .addOptionsModification(
- options -> options.apiModelingOptions().disableApiCallerIdentification())
- .compileWithExpectedDiagnostics(
- diagnostics ->
- diagnostics.assertErrorMessageThatMatches(
- containsString("Cannot lookup definition for type: java.lang.String[]")));
- });
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(getMainWithRewrittenEqualsAndHashCode())
+ .addKeepMainRule(Main.class)
+ .setMinApi(parameters.getApiLevel())
+ .addOptionsModification(
+ options -> options.apiModelingOptions().disableApiCallerIdentification())
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines(EXPECTED);
}
private byte[] getMainWithRewrittenEqualsAndHashCode() throws Exception {