Warning when desugared conversion on return type
Change-Id: Ifbcc99deb1e7c90fdb28ff15a2e840bcfdf95d6f
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
index 2a79973..8f0e3f6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
@@ -33,25 +33,33 @@
if (appView.rewritePrefix.hasRewrittenType(invokedMethod.holder)) {
continue;
}
+ // In this case, the method has not been rewritten and is not on a rewritten class.
+ // This invoke will (likely) not work at runtime if a desugared type is present.
+ if (appView.rewritePrefix.hasRewrittenType(invokedMethod.proto.returnType)) {
+ warnInvalidInvoke(invokedMethod.proto.returnType, invokedMethod, "return");
+ }
for (DexType argType : invokedMethod.proto.parameters.values) {
if (appView.rewritePrefix.hasRewrittenType(argType)) {
- // In this case, the method has not been rewritten and is not on a rewritten class.
- // This invoke will (likely) not work at runtime.
- appView
- .options()
- .reporter
- .warning(
- new StringDiagnostic(
- "Invoke to "
- + invokedMethod.holder
- + "#"
- + invokedMethod.name
- + " may not work correctly at runtime (Parameter "
- + appView.rewritePrefix.rewrittenType(argType)
- + " is a desugared type)."));
- continue;
+ warnInvalidInvoke(argType, invokedMethod, "parameter");
}
}
}
}
+
+ private void warnInvalidInvoke(DexType type, DexMethod invokedMethod, String debugString) {
+ appView
+ .options()
+ .reporter
+ .warning(
+ new StringDiagnostic(
+ "Invoke to "
+ + invokedMethod.holder
+ + "#"
+ + invokedMethod.name
+ + " may not work correctly at runtime ("
+ + debugString
+ + " type "
+ + appView.rewritePrefix.rewrittenType(type)
+ + " is a desugared type)."));
+ }
}
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/APIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/corelib/APIConversionTest.java
index b060bdb..167ecf7 100644
--- a/src/test/java/com/android/tools/r8/desugar/corelib/APIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/APIConversionTest.java
@@ -13,7 +13,9 @@
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import java.util.Arrays;
+import java.util.Random;
import java.util.function.IntUnaryOperator;
+import java.util.stream.IntStream;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -43,9 +45,11 @@
.setMinApi(parameters.getApiLevel())
.compile()
.assertNoWarningMessageThatMatches(containsString("java.util.Arrays#setAll"))
+ .assertNoWarningMessageThatMatches(containsString("java.util.Random#ints"))
.assertNoWarningMessageThatMatches(endsWith("is a desugared type)."))
.run(parameters.getRuntime(), Executor.class)
- .assertSuccessWithOutput(StringUtils.lines("[5, 6, 7]"));
+ .assertSuccessWithOutput(
+ StringUtils.lines("[5, 6, 7]", "java.util.stream.IntPipeline$Head"));
}
@Test
@@ -57,6 +61,7 @@
.enableCoreLibraryDesugaring(parameters.getApiLevel())
.compile()
.assertWarningMessageThatMatches(containsString("java.util.Arrays#setAll"))
+ .assertWarningMessageThatMatches(containsString("java.util.Random#ints"))
.assertWarningMessageThatMatches(endsWith("is a desugared type)."))
.addDesugaredCoreLibraryRunClassPath(this::buildDesugaredLibrary, parameters.getApiLevel())
.run(parameters.getRuntime(), Executor.class)
@@ -70,6 +75,8 @@
int[] ints = new int[3];
Arrays.setAll(ints, new MyFunction());
System.out.println(Arrays.toString(ints));
+ IntStream intStream = new Random().ints();
+ System.out.println(intStream.getClass().getName());
}
}