Update invoke-special desugaring to account for staticized methods
Bug: b/245096779
Change-Id: I1a2a4bf50e354e22eb78c987d836e73951cef38d
diff --git a/src/main/java/com/android/tools/r8/ir/code/Invoke.java b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
index 786a73e..80bb77b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Invoke.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
@@ -116,6 +116,10 @@
MethodLookupResult lookupResult =
graphLens.lookupMethod(invokedMethod, context.getReference(), Type.DIRECT);
+ if (lookupResult.getType().isStatic()) {
+ // This method has been staticized. The original invoke-type is DIRECT.
+ return Type.DIRECT;
+ }
if (lookupResult.getType().isVirtual()) {
// This method has been publicized. The original invoke-type is DIRECT.
return Type.DIRECT;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index e19e0b6..44eed32 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -125,7 +125,7 @@
localUtilityClass.getDefinition().setDirectMethods(localUtilityMethods);
localUtilityClass.getDefinition().setStaticFields(localUtilityFields);
} else {
- clazz.getMethodCollection().replaceMethods(method -> fixupEncodedMethod(clazz, method));
+ clazz.getMethodCollection().replaceMethods(this::fixupEncodedMethod);
fixupFields(clazz.staticFields(), clazz::setStaticField);
fixupFields(clazz.instanceFields(), clazz::setInstanceField);
}
@@ -561,7 +561,7 @@
&& !field.getDefinition().getOptimizationInfo().isDead());
}
- private DexEncodedMethod fixupEncodedMethod(DexProgramClass holder, DexEncodedMethod method) {
+ private DexEncodedMethod fixupEncodedMethod(DexEncodedMethod method) {
DexProto oldProto = method.getProto();
DexProto newProto = fixupProto(oldProto);
if (newProto == method.getProto()) {
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/PrivateEnumWithPrivateInvokeSpecialTest.java b/src/test/java/com/android/tools/r8/enumunboxing/PrivateEnumWithPrivateInvokeSpecialTest.java
index 5f8421c..3943993 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/PrivateEnumWithPrivateInvokeSpecialTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/PrivateEnumWithPrivateInvokeSpecialTest.java
@@ -4,11 +4,6 @@
package com.android.tools.r8.enumunboxing;
-import static org.junit.Assert.assertThrows;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.DiagnosticsMatcher;
-import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -18,7 +13,7 @@
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
-/** This is a reproducation of b/245096779 */
+/** This is a reproduction of b/245096779 */
@RunWith(Parameterized.class)
public class PrivateEnumWithPrivateInvokeSpecialTest extends TestBase {
@@ -31,26 +26,12 @@
@Test
public void testR8() throws Exception {
- R8FullTestBuilder r8FullTestBuilder =
- testForR8(parameters.getBackend())
- .addInnerClasses(getClass())
- .setMinApi(parameters.getApiLevel())
- .addKeepMainRule(Main.class);
- if (parameters.isCfRuntime()) {
- // TODO(b/245096779): Should not throw an error.
- assertThrows(
- CompilationFailedException.class,
- () -> {
- r8FullTestBuilder.compileWithExpectedDiagnostics(
- diagnostics ->
- diagnostics.assertErrorThatMatches(
- DiagnosticsMatcher.diagnosticException(AssertionError.class)));
- });
- } else {
- r8FullTestBuilder
- .run(parameters.getRuntime(), Main.class)
- .assertSuccessWithOutputLines("FOO");
- }
+ testForR8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(Main.class)
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("FOO");
}
private static class Main {