Keep enum values if an enum is referenced on an annotation on CF
Bug: 174826328
Change-Id: I0d04840070f5fc89211880dc41da16481ddd8094
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
index 641ef08..c5f516b 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
@@ -185,7 +185,7 @@
/** Returns true if this field is read by the program. */
@Override
public boolean isRead() {
- return !readsWithContexts.isEmpty() || isReadFromAnnotation();
+ return !readsWithContexts.isEmpty() || isReadFromAnnotation() || isReadFromMethodHandle();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 095ba07..4ee1bc6 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -4431,14 +4431,11 @@
fieldReference, new FieldAccessInfoImpl(fieldReference));
fieldAccessInfo.setReadFromAnnotation();
markStaticFieldAsLive(field, KeepReason.referencedInAnnotation(annotationHolder));
- // When an annotation has a field of an enum type with a default value then Java VM
- // will use the values() method on that enum class.
- if (options.isGeneratingClassFiles()
- && annotationHolder == dexItemFactory.annotationDefault) {
- if (field.getHolder().isEnum()) {
- markEnumValuesAsReachable(
- field.getHolder(), KeepReason.referencedInAnnotation(annotationHolder));
- }
+ // When an annotation has a field of an enum type the JVM will use the values() method on
+ // that enum class if the field is referenced.
+ if (options.isGeneratingClassFiles() && field.getHolder().isEnum()) {
+ markEnumValuesAsReachable(
+ field.getHolder(), KeepReason.referencedInAnnotation(annotationHolder));
}
} else {
// There is no dispatch on annotations, so only keep what is directly referenced.
diff --git a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
index a3b3b86..d42d3ad 100644
--- a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
@@ -46,10 +46,7 @@
.setMinApi(parameters.getApiLevel())
.addKeepRuntimeVisibleAnnotations()
.run(parameters.getRuntime(), Main.class)
- .forCfRuntime(
- result ->
- result.assertFailureWithErrorThatThrows(EnumConstantNotPresentException.class))
- .otherwise(result -> result.assertSuccessWithOutputLines("TEST_ONE"));
+ .assertSuccessWithOutputLines("TEST_ONE");
}
public enum Enum {