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 {