Fix inadequate tracing of lambda captures

Bug: 210597220
Change-Id: I4f7c8ec6c800cb9b8a89185960e8b814bda508ec
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 6ca6a5c..89cb107 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1011,6 +1011,7 @@
     markLambdaAsInstantiated(descriptor, context);
     transitionMethodsForInstantiatedLambda(descriptor);
     callSites.computeIfAbsent(callSite, ignore -> ProgramMethodSet.create()).add(context);
+    descriptor.captures.forEach(type -> markTypeAsLive(type, context));
 
     // For call sites representing a lambda, we link the targeted method
     // or field as if it were referenced from the current method.
diff --git a/src/test/java/com/android/tools/r8/shaking/LambdaCaptureShrinkingTest.java b/src/test/java/com/android/tools/r8/shaking/LambdaCaptureShrinkingTest.java
index 8806890..4efaeb4 100644
--- a/src/test/java/com/android/tools/r8/shaking/LambdaCaptureShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/LambdaCaptureShrinkingTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.codeinspector.AssertUtils;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.util.Arrays;
@@ -38,29 +37,25 @@
 
   @Test
   public void test() throws Exception {
-    AssertUtils.assertFailsCompilationIf(
-        parameters.isCfRuntime(),
-        () ->
-            testForR8(parameters.getBackend())
-                .addInnerClasses(getClass())
-                .addKeepMainRule(Main.class)
-                .enableNoVerticalClassMergingAnnotations()
-                .setMinApi(parameters.getApiLevel())
-                .compile()
-                .applyIf(
-                    parameters.isCfRuntime(),
-                    compileResult ->
-                        compileResult.inspect(
-                            inspector -> {
-                              MethodSubject mainMethodSubject =
-                                  inspector.clazz(Main.class).mainMethod();
-                              assertTrue(
-                                  mainMethodSubject
-                                      .streamInstructions()
-                                      .anyMatch(InstructionSubject::isInvokeDynamic));
-                            }))
-                .run(parameters.getRuntime(), Main.class)
-                .assertSuccessWithOutputLines("true"));
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(Main.class)
+        .enableNoVerticalClassMergingAnnotations()
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .applyIf(
+            parameters.isCfRuntime(),
+            compileResult ->
+                compileResult.inspect(
+                    inspector -> {
+                      MethodSubject mainMethodSubject = inspector.clazz(Main.class).mainMethod();
+                      assertTrue(
+                          mainMethodSubject
+                              .streamInstructions()
+                              .anyMatch(InstructionSubject::isInvokeDynamic));
+                    }))
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("true");
   }
 
   static class Main {