Version 1.2.49.

Merge: Allow conversion from Object to an array type in lambda desugaring.
CL: https://r8-review.googlesource.com/c/r8/+/27324

R=sgjesse@google.com

Bug: 116542124
Change-Id: Ia67bcab63b2a24897893bd4de1faf3a545bd67fa
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index c1d5255..d573eb6 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.2.48";
+  public static final String LABEL = "1.2.49";
 
   private Version() {
   }
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 45c08fb..9b0e9f2 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
@@ -119,6 +119,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]);
@@ -356,7 +361,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());
   }
 }