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