Don't fail if platform backports trigger on program targets.
Bug: b/265925988
Change-Id: Ic38a3f10e5c9de7d9f7df5c580abda5b9049e8b7
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 7396bf6..3826986 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -168,11 +168,19 @@
}
if (provider != null && appView.options().disableBackports) {
if (appView.options().disableBackportsWithErrorDiagnostics) {
- appView
- .reporter()
- .error(
- new BackportDiagnostic(
- provider.method, context.getOrigin(), MethodPosition.create(context)));
+ // If the provided backport is defined on a holder that is part of the program compilation
+ // unit, assume that the compilation is the defining instance and no backport is needed.
+ DexClass clazz =
+ appView
+ .contextIndependentDefinitionForWithResolutionResult(provider.method.holder)
+ .toSingleClassWithProgramOverLibrary();
+ if (!clazz.isProgramDefinition()) {
+ appView
+ .reporter()
+ .error(
+ new BackportDiagnostic(
+ provider.method, context.getOrigin(), MethodPosition.create(context)));
+ }
}
return null;
}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportPlatformTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportPlatformTest.java
index bd8016c..f4c77f3 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportPlatformTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportPlatformTest.java
@@ -86,6 +86,21 @@
.compileWithExpectedDiagnostics(this::checkDiagnostics);
}
+ @Test
+ public void testPlatformDefinitionD8() throws Exception {
+ testForD8(parameters.getBackend())
+ .apply(b -> b.getBuilder().setAndroidPlatformBuild(true))
+ .addOptionsModification(o -> o.disableBackportsWithErrorDiagnostics = true)
+ .addProgramClasses(CLASSES)
+ .addProgramClassFileData(
+ transformer(BooleanDefinition.class)
+ .setClassDescriptor("Ljava/lang/Boolean;")
+ .transform())
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutput(EXPECTED);
+ }
+
private void checkDiagnostics(TestDiagnosticMessages diagnostics) {
diagnostics
.assertAllErrorsMatch(
@@ -97,6 +112,14 @@
.assertOnlyErrors();
}
+ // Implementation of java.lang.Boolean.compare to test no error is triggered for
+ // compilation units "defining" the backport method.
+ public static class BooleanDefinition {
+ public int compare(boolean a, boolean b) {
+ return (a ? 1 : 0) - (b ? 1 : 0);
+ }
+ }
+
static class User {
private static void testBooleanCompare() {