Don't lookup methods on array types in tracereferences
Bug: 169127026
Bug: 169546956
Change-Id: Ie75b0f077dd84da5f0dd6a8a6bd2f8e0bb81ee80
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
index 110fb8b..72db701 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -369,6 +369,10 @@
@Override
public void registerInvokeVirtual(DexMethod method) {
+ if (method.holder.isArrayType()) {
+ addType(method.holder);
+ return;
+ }
ResolutionResult resolutionResult = appInfo.unsafeResolveMethodDueToDexFormat(method);
DexEncodedMethod target =
resolutionResult.isVirtualTarget() ? resolutionResult.getSingleTarget() : null;
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesArrayTypesTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesArrayTypesTest.java
index 35f215e..0074a89 100644
--- a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesArrayTypesTest.java
+++ b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesArrayTypesTest.java
@@ -81,7 +81,9 @@
ToolHelper.getClassFileForTestClass(TargetReturnType.class),
ToolHelper.getClassFileForTestClass(TargetInstantiatedType.class),
ToolHelper.getClassFileForTestClass(TargetInstanceOfType.class),
- ToolHelper.getClassFileForTestClass(TargetCheckCastType.class))
+ ToolHelper.getClassFileForTestClass(TargetCheckCastType.class),
+ ToolHelper.getClassFileForTestClass(TargetArrayCloneType.class),
+ ToolHelper.getClassFileForTestClass(TargetArrayCloneType2.class))
.build();
Path sourceJar =
ZipBuilder.builder(dir.resolve("source.jar"))
@@ -101,7 +103,6 @@
.build());
assertEquals(
- consumer.tracedTypes,
ImmutableSet.of(
Reference.classFromClass(Target.class),
Reference.classFromClass(TargetFieldType.class),
@@ -109,7 +110,10 @@
Reference.classFromClass(TargetReturnType.class),
Reference.classFromClass(TargetInstantiatedType.class),
Reference.classFromClass(TargetInstanceOfType.class),
- Reference.classFromClass(TargetCheckCastType.class)));
+ Reference.classFromClass(TargetCheckCastType.class),
+ Reference.classFromClass(TargetArrayCloneType.class),
+ Reference.classFromClass(TargetArrayCloneType2.class)),
+ consumer.tracedTypes);
assertTrue(consumer.acceptFieldCalled);
assertTrue(consumer.acceptMethodCalled);
}
@@ -126,6 +130,10 @@
static class TargetCheckCastType {}
+ static class TargetArrayCloneType {}
+
+ static class TargetArrayCloneType2 {}
+
static class Target {
public static TargetFieldType[] field;
@@ -141,6 +149,8 @@
Object x = new TargetInstantiatedType[] {};
boolean y = null instanceof TargetInstanceOfType;
Object z = (TargetCheckCastType) null;
+ Object c = ((TargetArrayCloneType[]) null).clone();
+ Object c2 = ((TargetArrayCloneType2[][][][]) null).clone();
}
}
}