Enum unboxing: add regression tests
- add regression and fix a bug for method
collision in enum unboxing
- add regression for accessibility errors
in enum unboxing
Bug: 160854837
Bug: 160769257
Change-Id: I3f62ce600a47dc2f2c228907c9df33e08a759856
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index 1ffca3d..3be53b2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -771,7 +771,7 @@
factory.createString(
enumUnboxerRewriter.compatibleName(method.holder)
+ "$"
- + (encodedMethod.isDirectMethod() ? "d" : "v")
+ + (encodedMethod.isStatic() ? "s" : "v")
+ "$"
+ method.name.toString());
DexProto proto =
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/VirtualMethodsEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/VirtualMethodsEnumUnboxingTest.java
index 6323e8b..2e3466f 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/VirtualMethodsEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/VirtualMethodsEnumUnboxingTest.java
@@ -4,8 +4,11 @@
package com.android.tools.r8.enumunboxing;
+import static org.hamcrest.CoreMatchers.containsString;
+
import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.R8TestCompileResult;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestParameters;
import java.util.List;
@@ -36,10 +39,11 @@
@Test
public void testEnumUnboxing() throws Exception {
Class<?> classToTest = VirtualMethods.class;
- R8TestRunResult run =
+ R8TestCompileResult compile =
testForR8(parameters.getBackend())
.addInnerClasses(VirtualMethodsEnumUnboxingTest.class)
.addKeepMainRule(classToTest)
+ .addKeepMainRule(VirtualMethodsFail.class)
.addKeepRules(enumKeepRules.getKeepRules())
.enableNeverClassInliningAnnotations()
.enableInliningAnnotations()
@@ -51,10 +55,16 @@
m -> {
assertEnumIsUnboxed(MyEnum.class, classToTest.getSimpleName(), m);
assertEnumIsUnboxed(MyEnum2.class, classToTest.getSimpleName(), m);
- })
- .run(parameters.getRuntime(), classToTest)
- .assertSuccess();
+ assertEnumIsUnboxed(MyEnumWithCollisions.class, classToTest.getSimpleName(), m);
+ assertEnumIsUnboxed(
+ MyEnumWithPackagePrivateCall.class, classToTest.getSimpleName(), m);
+ });
+ R8TestRunResult run = compile.run(parameters.getRuntime(), classToTest).assertSuccess();
assertLines2By2Correct(run.getStdOut());
+ // TODO(b/160854837): This test should actually be successful.
+ compile
+ .run(parameters.getRuntime(), VirtualMethodsFail.class)
+ .assertFailureWithErrorThatMatches(containsString("IllegalAccessError"));
}
@SuppressWarnings("SameParameterValue")
@@ -102,6 +112,7 @@
}
// Use two enums to test collision.
+ @NeverClassInline
enum MyEnum2 {
A,
B,
@@ -123,6 +134,76 @@
}
}
+ @NeverClassInline
+ enum MyEnumWithCollisions {
+ A,
+ B,
+ C;
+
+ @NeverInline
+ public int get() {
+ return get(this);
+ }
+
+ @NeverInline
+ public static int get(MyEnumWithCollisions e) {
+ switch (e) {
+ case A:
+ return 5;
+ case B:
+ return 2;
+ case C:
+ return 1;
+ }
+ return -1;
+ }
+ }
+
+ @NeverClassInline
+ static class PackagePrivateClass {
+ @NeverInline
+ static void print() {
+ System.out.println("print");
+ }
+ }
+
+ @NeverClassInline
+ enum MyEnumWithPackagePrivateCall {
+ A,
+ B,
+ C;
+
+ @NeverInline
+ public static void callPackagePrivate() {
+ PackagePrivateClass.print();
+ }
+ }
+
+ static class VirtualMethodsFail {
+ public static void main(String[] args) {
+ testCollisions();
+ testPackagePrivate();
+ }
+
+ @NeverInline
+ private static void testPackagePrivate() {
+ System.out.println(MyEnumWithPackagePrivateCall.A.ordinal());
+ System.out.println(0);
+ MyEnumWithPackagePrivateCall.callPackagePrivate();
+ System.out.println("print");
+ }
+
+ @NeverInline
+ private static void testCollisions() {
+ System.out.println(MyEnumWithCollisions.A.get());
+ System.out.println(5);
+ System.out.println(MyEnumWithCollisions.B.get());
+ System.out.println(2);
+ System.out.println(MyEnumWithCollisions.C.get());
+ System.out.println(1);
+ }
+ }
+
static class VirtualMethods {
public static void main(String[] args) {