Update test expectation in presence of enum unboxing
Bug: 160939354
Change-Id: Iff8be86178653ab7a6fbb4f9e34194d810b62ad2
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
index 5e9d63f..5a50ca4 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
@@ -68,6 +68,8 @@
instructions.add(new CfLoad(ValueType.fromDexType(factory.intType), 0));
instructions.add(new CfConstNumber(enumValueInfo.convertToInt(), ValueType.INT));
instructions.add(new CfIfCmp(If.Type.NE, ValueType.INT, dest));
+ // TODO(b/160939354): Should use the value passed to the enum constructor, since this
+ // value may be different from the enum field name.
instructions.add(new CfConstString(field.name));
instructions.add(new CfReturn(ValueType.OBJECT));
instructions.add(dest);
@@ -123,6 +125,8 @@
(field, enumValueInfo) -> {
CfLabel dest = new CfLabel();
instructions.add(new CfLoad(ValueType.fromDexType(factory.stringType), 0));
+ // TODO(b/160939354): Should use the value passed to the enum constructor, since this
+ // value may be different from the enum field name.
instructions.add(new CfConstString(field.name));
instructions.add(
new CfInvoke(Opcodes.INVOKEVIRTUAL, factory.stringMembers.equals, false));
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumToStringLibTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumToStringLibTest.java
index 83393bf..1a440cb 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumToStringLibTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumToStringLibTest.java
@@ -65,6 +65,7 @@
.addKeepMainRule(AlwaysCorrectProgram.class)
.addKeepMainRule(AlwaysCorrectProgram2.class)
.addKeepRules(enumKeepRules.getKeepRules())
+ .addKeepAttributeLineNumberTable()
.addOptionsModification(
options -> {
options.enableEnumUnboxing = enumUnboxing;
@@ -75,19 +76,26 @@
.allowDiagnosticInfoMessages(enumUnboxing)
.setMinApi(parameters.getApiLevel())
.compile();
- compile
- .run(parameters.getRuntime(), AlwaysCorrectProgram.class)
- .assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2", "0", "1", "2");
+ if (enumKeepRules.isStudio() && enumValueOptimization && enumUnboxing) {
+ // TODO(b/160939354): Enum unboxing synthesizes a toString() method based on field names.
+ compile
+ .run(parameters.getRuntime(), AlwaysCorrectProgram.class)
+ .assertFailureWithErrorThatMatches(containsString("IllegalArgumentException"));
+ } else {
+ compile
+ .run(parameters.getRuntime(), AlwaysCorrectProgram.class)
+ .assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2", "0", "1", "2");
+ }
if (!enumKeepRules.isSnap() && enumUnboxing) {
- // TODO(b/160667929): Fix toString and enum unboxing.
+ // TODO(b/160939354): Enum unboxing synthesizes a toString() method based on field names.
compile
.run(parameters.getRuntime(), AlwaysCorrectProgram2.class)
.assertFailureWithErrorThatMatches(containsString("IllegalArgumentException"));
- return;
+ } else {
+ compile
+ .run(parameters.getRuntime(), AlwaysCorrectProgram2.class)
+ .assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2");
}
- compile
- .run(parameters.getRuntime(), AlwaysCorrectProgram2.class)
- .assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2");
}
private void assertEnumFieldsMinified(CodeInspector codeInspector) throws Exception {
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingTestBase.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingTestBase.java
index 65aee25..02b5a5f 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingTestBase.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingTestBase.java
@@ -42,6 +42,10 @@
return keepRules;
}
+ public boolean isStudio() {
+ return this == STUDIO;
+ }
+
public boolean isSnap() {
return this == SNAP;
}