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