Consider all implemented interfaces when removing unused arguments

To ensure that it is possible to remove unused arguments for a virtual
method all overriding methods are considered both above and below in the
hierachy. This check was missing interfaces which could be implemented
on classes below in the hierachy.

This is conservative, as it is not checked if a given method is
actually the only implementation of an interface method.

Bug: 143934502
Change-Id: Ie02f66544b4d437e41e67f6c7a85087206dda9a7
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MemberPoolCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/MemberPoolCollection.java
index 3b1284d..8b74c30 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberPoolCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberPoolCollection.java
@@ -222,7 +222,9 @@
     }
 
     private boolean hasSeenBelow(Wrapper<T> member, boolean inclusive) {
-      if (inclusive && hasSeenDirectly(member)) {
+      if (inclusive
+          && (hasSeenDirectly(member)
+              || interfaces.stream().anyMatch(itf -> itf.hasSeenAbove(member, true)))) {
         return true;
       }
       return subTypes.stream().anyMatch(subType -> subType.hasSeenBelow(member, true));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInMethodThatImplementsInterfaceMethodOnSubTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInMethodThatImplementsInterfaceMethodOnSubTest.java
index 25c2a61..9001472 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInMethodThatImplementsInterfaceMethodOnSubTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInMethodThatImplementsInterfaceMethodOnSubTest.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.ir.optimize.unusedarguments;
 
-import static org.hamcrest.core.StringContains.containsString;
-
 import com.android.tools.r8.NeverMerge;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
@@ -37,8 +35,7 @@
         .enableMergeAnnotations()
         .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), TestClass.class)
-        // TODO(b/143934502): Should succeed with "Hello from A", "Hello from C".
-        .assertFailureWithErrorThatMatches(containsString("AbstractMethodError"));
+        .assertSuccessWithOutputLines("Hello from A", "Hello from C");
   }
 
   static class TestClass {