Copy over keep info for virtual methods in vertical class merger

Bug: b/231662249
Change-Id: I27979bda40cfcbad772964f0c463cc3afdc3e163
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 5aa62c3..b5898c5 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1157,6 +1157,20 @@
           add(virtualMethods, shadowedBy, MethodSignatureEquivalence.get());
         }
 
+        // Copy over any keep info from the original virtual method.
+        ProgramMethod programMethod = new ProgramMethod(target, shadowedBy);
+        appView
+            .getKeepInfo()
+            .mutate(
+                mutableKeepInfoCollection ->
+                    mutableKeepInfoCollection.joinMethod(
+                        programMethod,
+                        info ->
+                            info.merge(
+                                mutableKeepInfoCollection
+                                    .getMethodInfo(virtualMethod, source)
+                                    .joiner())));
+
         deferredRenamings.map(virtualMethod.getReference(), shadowedBy.getReference());
         deferredRenamings.recordMove(
             virtualMethod.getReference(),
diff --git a/src/test/java/com/android/tools/r8/cf/MethodHandleDifferentNameArgumentPropagationTest.java b/src/test/java/com/android/tools/r8/cf/MethodHandleDifferentNameArgumentPropagationTest.java
index ecacd6d..5106ff8 100644
--- a/src/test/java/com/android/tools/r8/cf/MethodHandleDifferentNameArgumentPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/cf/MethodHandleDifferentNameArgumentPropagationTest.java
@@ -44,8 +44,7 @@
         .addOptionsModification(
             options -> options.apiModelingOptions().disableApiCallerIdentification())
         .run(parameters.getRuntime(), Main.class)
-        // TODO(b/231662249): Should not throw an error.
-        .assertFailureWithErrorThatThrows(BootstrapMethodError.class);
+        .assertSuccessWithOutputLines(EXPECTED);
   }
 
   public interface Foreachable {