Maintain interface bits in desugaring even when compiling for dex
Change-Id: I456d64ea51b337a9a4d727480caa1fdec4e0513a
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index f41bdce..d203a12 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -540,16 +540,6 @@
boolean holderIsInterface() {
InternalOptions options = appView.options();
- if (!options.isGeneratingClassFiles()) {
- // When generating dex the value of this flag on invokes does not matter (unused).
- // We cannot know if definitionFor(implMethod.holder) is null or not in that case,
- // so we cannot set the flag and just return false.
- return false;
- }
- // The only case where we do Lambda desugaring with Cf to Cf is in L8.
- // If the compilation is not coreLibraryCompilation, then the assertion
- // implMethodHolder != null may fail, hence the assertion.
- assert options.cfToCfDesugar;
DexMethod implMethod = descriptor.implHandle.asMethod();
DexClass implMethodHolder = appView.definitionFor(implMethod.holder);
if (implMethodHolder == null) {
diff --git a/src/test/java/com/android/tools/r8/desugar/b72538146/B72538146.java b/src/test/java/com/android/tools/r8/desugar/b72538146/B72538146.java
index bfc400d..fbb29e8 100644
--- a/src/test/java/com/android/tools/r8/desugar/b72538146/B72538146.java
+++ b/src/test/java/com/android/tools/r8/desugar/b72538146/B72538146.java
@@ -4,47 +4,73 @@
package com.android.tools.r8.desugar.b72538146;
-import static org.junit.Assert.assertEquals;
-import com.android.tools.r8.OutputMode;
import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.VmTestRunner;
-import com.android.tools.r8.VmTestRunner.IgnoreIfVmOlderOrEqualThan;
-import com.android.tools.r8.utils.AndroidApp;
+import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
-@RunWith(VmTestRunner.class)
+@RunWith(Parameterized.class)
public class B72538146 extends TestBase {
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters()
+ .withDexRuntimesStartingFromIncluding(Version.V7_0_0)
+ .withAllApiLevels()
+ .build();
+ }
+
+ public B72538146(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
@Test
- @IgnoreIfVmOlderOrEqualThan(Version.V6_0_1)
public void test() throws Exception {
- // Build the main app from source compiled separately using the Android API for classloading.
- AndroidApp.Builder builder = AndroidApp.builder();
- builder.addProgramFile(
- Paths.get("build/test/examplesAndroidApi/classes/classloader/Runner.class"));
- AndroidApp app = compileWithD8(builder.build());
-
// Compile the parent and child applications into separate dex applications.
- Path parent = temp.newFolder("parent").toPath().resolve("classes.zip");
- Path child = temp.newFolder("child").toPath().resolve("classes.zip");
- AndroidApp parentApp = readClasses(
- Parent.class,
- Parent.Inner1.class,
- Parent.Inner2.class,
- Parent.Inner3.class,
- Parent.Inner4.class);
- compileWithD8(parentApp).write(parent, OutputMode.DexIndexed);
+ List<Class<?>> parentClasses =
+ ImmutableList.of(
+ Parent.class,
+ Parent.Inner1.class,
+ Parent.Inner2.class,
+ Parent.Inner3.class,
+ Parent.Inner4.class);
- AndroidApp childApp = readClasses(Child.class);
- compileWithD8(childApp).write(child, OutputMode.DexIndexed);
+ Path parent =
+ testForD8()
+ .addProgramClasses(parentClasses)
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .writeToZip();
+
+ Path child =
+ testForD8()
+ .addProgramClasses(Child.class)
+ .addClasspathClasses(parentClasses)
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .writeToZip();
// Run the classloader test loading the two dex applications.
- String result = runOnArt(app, "classloader.Runner",
- parent.toString(), child.toString(), "com.android.tools.r8.desugar.b72538146.Child");
- assertEquals("SUCCESS", result);
+ testForD8()
+ .addProgramFiles(
+ Paths.get("build/test/examplesAndroidApi/classes/classloader/Runner.class"))
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .run(
+ parameters.getRuntime(),
+ "classloader.Runner",
+ parent.toString(),
+ child.toString(),
+ Child.class.getTypeName())
+ .assertSuccessWithOutput("SUCCESS");
}
}