Fix bug in Synthetic classes and intermediate
Bug: 197081367
Change-Id: I0e26ac34e29c3a9b619fcaca516cb5b872f1eeb0
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
index a06fdb7..d660753 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
@@ -109,11 +109,10 @@
private static SyntheticMarker internalStripMarkerFromClass(
DexProgramClass clazz, AppView<?> appView) {
- ClassAccessFlags flags = clazz.accessFlags;
if (clazz.superType != appView.dexItemFactory().objectType) {
return NO_MARKER;
}
- if (!flags.isSynthetic() || flags.isAbstract() || flags.isEnum()) {
+ if (isDefinitelyNotSyntheticProgramClass(clazz)) {
return NO_MARKER;
}
SyntheticKind kind =
@@ -139,6 +138,12 @@
kind, SynthesizingContext.fromSyntheticInputClass(clazz, context, appView));
}
+ // Filters out definitely not synthetic classes to avoid expensive computations on all classes.
+ public static boolean isDefinitelyNotSyntheticProgramClass(DexProgramClass clazz) {
+ ClassAccessFlags flags = clazz.accessFlags;
+ return !flags.isSynthetic() || flags.isEnum();
+ }
+
private static DexType getSyntheticContextType(
DexType type, SyntheticKind kind, DexItemFactory factory) {
String prefix = SyntheticNaming.getPrefixForExternalSyntheticType(kind, type);
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassBuilder.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassBuilder.java
index 8c07884..fa3fc33 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassBuilder.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassBuilder.java
@@ -29,4 +29,11 @@
public SyntheticProgramClassBuilder self() {
return this;
}
+
+ @Override
+ public DexProgramClass build() {
+ DexProgramClass clazz = super.build();
+ assert !SyntheticMarker.isDefinitelyNotSyntheticProgramClass(clazz);
+ return clazz;
+ }
}
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordMergeTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordMergeTest.java
index 7af5f41..8401196 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordMergeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordMergeTest.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfRuntime;
+import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.InternalOptions.TestingOptions;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
@@ -33,12 +34,14 @@
StringUtils.lines("Jane Doe", "42", "Jane Doe", "42");
private final TestParameters parameters;
+ private final boolean intermediate;
- public RecordMergeTest(TestParameters parameters) {
+ public RecordMergeTest(TestParameters parameters, boolean intermediate) {
this.parameters = parameters;
+ this.intermediate = intermediate;
}
- @Parameterized.Parameters(name = "{0}")
+ @Parameterized.Parameters(name = "{0}, intermediate: {1}")
public static List<Object[]> data() {
// TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
return buildParameters(
@@ -46,7 +49,8 @@
.withCustomRuntime(CfRuntime.getCheckedInJdk17())
.withDexRuntimes()
.withAllApiLevelsAlsoForCf()
- .build());
+ .build(),
+ BooleanUtils.values());
}
@Test
@@ -56,6 +60,7 @@
.addProgramClassFileData(PROGRAM_DATA_1)
.setMinApi(parameters.getApiLevel())
.addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+ .setIntermediate(intermediate)
.compile()
.writeToZip();
Path output2 =
@@ -63,6 +68,7 @@
.addProgramClassFileData(PROGRAM_DATA_2)
.setMinApi(parameters.getApiLevel())
.addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+ .setIntermediate(intermediate)
.compile()
.writeToZip();
D8TestCompileResult result =
@@ -82,6 +88,7 @@
.addProgramClassFileData(PROGRAM_DATA_1)
.setMinApi(parameters.getApiLevel())
.addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+ .setIntermediate(intermediate)
.compile()
.writeToZip();
D8TestCompileResult result =
diff --git a/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java b/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
index d29b7df..5e7aa9a 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
@@ -11,7 +11,9 @@
import com.android.tools.r8.TestRuntime.CfRuntime;
import com.android.tools.r8.utils.InternalOptions.TestingOptions;
import com.android.tools.r8.utils.StringUtils;
+import java.nio.file.Path;
import java.util.List;
+import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -63,6 +65,25 @@
}
@Test
+ public void testD8Intermediate() throws Exception {
+ Assume.assumeTrue(parameters.isDexRuntime());
+ Path path =
+ testForD8(Backend.DEX)
+ .addProgramClassFileData(PROGRAM_DATA)
+ .setMinApi(parameters.getApiLevel())
+ .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+ .setIntermediate(true)
+ .compile()
+ .writeToZip();
+ testForD8()
+ .addProgramFiles(path)
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ .run(parameters.getRuntime(), MAIN_TYPE)
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+
+ @Test
public void testR8() throws Exception {
R8FullTestBuilder builder =
testForR8(parameters.getBackend())