Test desugaring code for MultiANewArray with class file backend
Change-Id: I50a42d91191f645a77596682dfbedf4226b152e3
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index 0922945..03dd4d6 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -964,7 +964,9 @@
@Override
public void visitMultiANewArrayInsn(String desc, int dims) {
- if (!application.options.isGeneratingDex()) {
+ InternalOptions options = application.options;
+ if (options.isGeneratingClassFiles()
+ && !options.testing.enableMultiANewArrayDesugaringForClassFiles) {
instructions.add(new CfMultiANewArray(factory.createType(desc), dims));
return;
}
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index b4fd639..b7a666d 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1760,6 +1760,7 @@
public boolean enableCheckCastAndInstanceOfRemoval = true;
public boolean enableDeadSwitchCaseElimination = true;
public boolean enableInvokeSuperToInvokeVirtualRewriting = true;
+ public boolean enableMultiANewArrayDesugaringForClassFiles = false;
public boolean enableSwitchToIfRewriting = true;
public boolean enableEnumUnboxingDebugLogs = false;
public boolean forceRedundantConstNumberRemoval = false;
diff --git a/src/test/java/com/android/tools/r8/examples/newarray/NewArrayTestRunner.java b/src/test/java/com/android/tools/r8/examples/newarray/NewArrayTestRunner.java
index d980c97..6e4775b 100644
--- a/src/test/java/com/android/tools/r8/examples/newarray/NewArrayTestRunner.java
+++ b/src/test/java/com/android/tools/r8/examples/newarray/NewArrayTestRunner.java
@@ -3,24 +3,34 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.examples.newarray;
+import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class NewArrayTestRunner extends TestBase {
- static final Class<?> CLASS = NewArray.class;
+ private static final Class<?> CLASS = NewArray.class;
- private final TestParameters parameters;
- private final CompilationMode mode;
+ @Parameter(0)
+ public boolean enableMultiANewArrayDesugaringForClassFiles;
+
+ @Parameter(1)
+ public TestParameters parameters;
+
+ @Parameter(2)
+ public CompilationMode mode;
private static final List<String> EXPECTED =
ImmutableList.of(
@@ -56,20 +66,19 @@
"8,8,8,8",
"2,4,6,8,10,12,14,16,false,0,0,0,0,0.0,0.0,null");
- @Parameterized.Parameters(name = "{0}, {1}")
+ @Parameters(name = "{1}, {2}, force desugaring: {0}")
public static List<Object[]> data() {
return buildParameters(
- getTestParameters().withAllRuntimes().withAllApiLevels().build(), CompilationMode.values());
- }
-
- public NewArrayTestRunner(TestParameters parameters, CompilationMode mode) {
- this.parameters = parameters;
- this.mode = mode;
+ BooleanUtils.values(),
+ getTestParameters().withAllRuntimesAndApiLevels().build(),
+ CompilationMode.values());
}
@Test
public void runReference() throws Exception {
- assumeTrue(parameters.isCfRuntime() && mode == CompilationMode.DEBUG);
+ assumeFalse(enableMultiANewArrayDesugaringForClassFiles);
+ assumeTrue(parameters.isCfRuntime());
+ assumeTrue(mode == CompilationMode.DEBUG);
testForJvm(getStaticTemp())
.addProgramClassesAndInnerClasses(CLASS)
.run(parameters.getRuntime(), CLASS)
@@ -78,6 +87,7 @@
@Test
public void testD8() throws Exception {
+ assumeFalse(enableMultiANewArrayDesugaringForClassFiles);
assumeTrue(parameters.isDexRuntime());
testForD8()
.addProgramClassesAndInnerClasses(CLASS)
@@ -89,12 +99,20 @@
@Test
public void testR8() throws Exception {
+ assumeTrue(parameters.isCfRuntime() || !enableMultiANewArrayDesugaringForClassFiles);
testForR8(parameters.getBackend())
.addProgramClassesAndInnerClasses(CLASS)
.addKeepMainRule(CLASS)
+ .addOptionsModification(
+ options ->
+ options.testing.enableMultiANewArrayDesugaringForClassFiles =
+ enableMultiANewArrayDesugaringForClassFiles)
.setMinApi(parameters.getApiLevel())
.setMode(mode)
.run(parameters.getRuntime(), CLASS)
- .assertSuccessWithOutputLines(EXPECTED);
+ .applyIf(
+ enableMultiANewArrayDesugaringForClassFiles,
+ runResult -> runResult.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
+ runResult -> runResult.assertSuccessWithOutputLines(EXPECTED));
}
}