Version 1.4.66

Cherry-pick: Rewrite array clone in lense code rewriter
CL: https://r8-review.googlesource.com/c/r8/+/35289

Bug: 124177369
Change-Id: I353977eabefcae16c2bd95c35d5aa19b747c89b2
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 8a35a7d..5d31bab 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "1.4.65";
+  public static final String LABEL = "1.4.66";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index fd968d6..d634827 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -6,6 +6,7 @@
 import static com.android.tools.r8.graph.UseRegistry.MethodHandleUse.ARGUMENT_TO_LAMBDA_METAFACTORY;
 import static com.android.tools.r8.graph.UseRegistry.MethodHandleUse.NOT_ARGUMENT_TO_LAMBDA_METAFACTORY;
 import static com.android.tools.r8.ir.code.Invoke.Type.STATIC;
+import static com.android.tools.r8.ir.code.Invoke.Type.VIRTUAL;
 
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
@@ -149,7 +150,31 @@
           InvokeMethod invoke = current.asInvokeMethod();
           DexMethod invokedMethod = invoke.getInvokedMethod();
           DexType invokedHolder = invokedMethod.getHolder();
+          if (invokedHolder.isArrayType()) {
+            if (invokedMethod.name == appInfo.dexItemFactory.cloneMethodName) {
+              DexType baseType = invokedHolder.toBaseType(appInfo.dexItemFactory);
+              DexType mappedBaseType = graphLense.lookupType(baseType);
+              if (baseType != mappedBaseType) {
+                DexType mappedHolder =
+                    invokedHolder.replaceBaseType(mappedBaseType, appInfo.dexItemFactory);
+                // The clone proto is ()Ljava/lang/Object;, so just reuse it.
+                DexMethod actualTarget =
+                    appInfo.dexItemFactory.createMethod(
+                        mappedHolder, invokedMethod.proto, appInfo.dexItemFactory.cloneMethodName);
+                Invoke newInvoke =
+                    Invoke.create(
+                        VIRTUAL,
+                        actualTarget,
+                        null,
+                        makeOutValue(invoke, code, newSSAValues),
+                        invoke.inValues());
+                iterator.replaceCurrentInstruction(newInvoke);
+              }
+            }
+            continue;
+          }
           if (!invokedHolder.isClassType()) {
+            assert false;
             continue;
           }
           if (invoke.isInvokeDirect()) {
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/InnerEnumValuesTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/InnerEnumValuesTest.java
index 2500be1..08d0ff3 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/InnerEnumValuesTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/InnerEnumValuesTest.java
@@ -79,10 +79,9 @@
                   : "state_X"; // mapped name without minification
           FieldSubject stateA = enumSubject.uniqueFieldWithName(fieldName);
           assertThat(stateA, isPresent());
-        });
-    // TODO(b/124177369): method signature Object Outer$InnerEnum[]#clone() left in values().
-    //  .run(MAIN)
-    //  .assertSuccessWithOutput(EXPECTED_OUTPUT);
+        })
+        .run(MAIN)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 }