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());
}
}