Enum unboxing: fix library override
- fix red bot
Change-Id: Ibe8d69c04a93d78cb34fca81488698ffeaf510e6
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 8fafcb7..12b42aa 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
@@ -77,6 +77,7 @@
import com.android.tools.r8.origin.SynthesizedOrigin;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.OptionalBool;
import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.StringDiagnostic;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
@@ -1276,14 +1277,23 @@
return encodedMethod;
}
assert !encodedMethod.isClassInitializer();
- DexMethod newMethod =
- factory.createMethod(encodedMethod.holder(), newProto, encodedMethod.getName());
+ // We add the $enumunboxing$ suffix to make sure we do not create a library override.
+ String newMethodName =
+ encodedMethod.getName().toString()
+ + (encodedMethod.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
+ DexMethod newMethod = factory.createMethod(encodedMethod.holder(), newProto, newMethodName);
newMethod = ensureUniqueMethod(encodedMethod, newMethod);
int numberOfExtraNullParameters = newMethod.getArity() - encodedMethod.method.getArity();
boolean isStatic = encodedMethod.isStatic();
lensBuilder.move(
encodedMethod.method, isStatic, newMethod, isStatic, numberOfExtraNullParameters);
- return encodedMethod.toTypeSubstitutedMethod(newMethod);
+ DexEncodedMethod newEncodedMethod = encodedMethod.toTypeSubstitutedMethod(newMethod);
+ assert !encodedMethod.isLibraryMethodOverride().isTrue()
+ : "Enum unboxing is changing the signature of a library override in a non unboxed class.";
+ if (newEncodedMethod.isNonPrivateVirtualMethod()) {
+ newEncodedMethod.setLibraryMethodOverride(OptionalBool.FALSE);
+ }
+ return newEncodedMethod;
}
private DexMethod ensureUniqueMethod(DexEncodedMethod encodedMethod, DexMethod newMethod) {