Allow conversion from Object to an array type in lambda desugaring.

R=sgjesse@google.com, zerny@google.com

Bug: 116542124
Change-Id: Ic67a547b8533cb043be8d9369c5f24c09f934b54
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
index d719d8f..9d815ce 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
@@ -120,6 +120,11 @@
       return b == factory.objectType || b.isArrayType();
     }
 
+    if (b.isArrayType()) {
+      // If A is typed object it can be convertible to an array type.
+      return a == factory.objectType;
+    }
+
     if (a.isPrimitiveType()) {
       if (b.isPrimitiveType()) {
         return isSameOrAdaptableTo(a.descriptor.content[0], b.descriptor.content[0]);
@@ -357,7 +362,8 @@
       return register;
     }
 
-    if (fromType.isClassType() && toType.isClassType()) {
+    if ((fromType.isClassType() && toType.isClassType())
+        || (fromType == factory().objectType && toType.isArrayType())) {
       if (returnType) {
         // For return type adjustment in case `fromType` and `toType` are both reference types,
         // `fromType` does NOT have to be deriving from `toType` and we need to add a cast.
diff --git a/src/test/examplesAndroidO/lambdadesugaring/ValueAdjustments.java b/src/test/examplesAndroidO/lambdadesugaring/ValueAdjustments.java
index 1d6772a..c533684 100644
--- a/src/test/examplesAndroidO/lambdadesugaring/ValueAdjustments.java
+++ b/src/test/examplesAndroidO/lambdadesugaring/ValueAdjustments.java
@@ -462,6 +462,42 @@
     builder.append(a.greet()).append('\n');
   }
 
+  // Make the test independent of libraries by not using java.util.function.Function.
+  interface MyFunction<T, R> {
+    R apply(T var1);
+  }
+
+  static class Observable<T> {
+  }
+
+  static class Handler<T> {
+    T elements;
+
+    Handler(T e) {
+      elements = e;
+    }
+
+    public T handleErrors(T result) {
+      System.out.println(result.getClass().getName());
+      return null;
+    }
+
+    public final Observable<T> map(MyFunction<? super T, ? extends T> mapper) {
+      System.out.println("Handler.map");
+      mapper.apply(elements);
+      return null;
+    }
+  }
+
+
+  static class B116542124 {
+    private Handler<String[]> approvalManagersHandler = new Handler<>(new String[] { "asdf" });
+
+    public void test() {
+      approvalManagersHandler.map(approvalManagersHandler::handleErrors);
+    }
+  }
+
   public static void main(String[] args) {
     StringBuffer builder = new StringBuffer();
 
@@ -482,7 +518,7 @@
 
     checkMisc(builder);
     bB70348575(builder);
-
+    new B116542124().test();
     System.out.println(builder.toString());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index 15dc55a..101fbb8 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -37,7 +37,6 @@
       "-allowaccessmodification"
   );
 
-
   private static final ArrayList<String> PROGUARD_OPTIONS_N_PLUS = Lists.newArrayList(
       "-keepclasseswithmembers public class * {",
       "    public static void main(java.lang.String[]);",
@@ -101,7 +100,7 @@
         .withOptionConsumer(opts -> opts.enableClassInlining = false)
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
-        .withDexCheck(inspector -> checkLambdaCount(inspector, 179, "lambdadesugaring"))
+        .withDexCheck(inspector -> checkLambdaCount(inspector, 180, "lambdadesugaring"))
         .run();
 
     test("lambdadesugaring", "lambdadesugaring", "LambdaDesugaring")
@@ -109,7 +108,7 @@
         .withOptionConsumer(opts -> opts.enableClassInlining = true)
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
-        .withDexCheck(inspector -> checkLambdaCount(inspector, 23, "lambdadesugaring"))
+        .withDexCheck(inspector -> checkLambdaCount(inspector, 24, "lambdadesugaring"))
         .run();
   }
 
@@ -121,7 +120,7 @@
         .withOptionConsumer(opts -> opts.enableClassInlining = false)
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
-        .withDexCheck(inspector -> checkLambdaCount(inspector, 179, "lambdadesugaring"))
+        .withDexCheck(inspector -> checkLambdaCount(inspector, 180, "lambdadesugaring"))
         .run();
 
     test("lambdadesugaring", "lambdadesugaring", "LambdaDesugaring")
@@ -129,7 +128,7 @@
         .withOptionConsumer(opts -> opts.enableClassInlining = true)
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
-        .withDexCheck(inspector -> checkLambdaCount(inspector, 23, "lambdadesugaring"))
+        .withDexCheck(inspector -> checkLambdaCount(inspector, 24, "lambdadesugaring"))
         .run();
   }