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() {