Merge commit '7a328103151def6d726dc4dc3a33ea34e0e5737b' into dev-release
diff --git a/src/main/java/com/android/tools/r8/errors/BackportDiagnostic.java b/src/main/java/com/android/tools/r8/errors/BackportDiagnostic.java
new file mode 100644
index 0000000..b775cc1
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/errors/BackportDiagnostic.java
@@ -0,0 +1,38 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.errors;
+
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+
+@Keep
+public class BackportDiagnostic implements DesugarDiagnostic {
+
+  private final DexMethod backport;
+  private final Origin origin;
+  private final Position position;
+
+  public BackportDiagnostic(DexMethod backport, Origin origin, Position position) {
+    this.backport = backport;
+    this.origin = origin;
+    this.position = position;
+  }
+
+  @Override
+  public Origin getOrigin() {
+    return origin;
+  }
+
+  @Override
+  public Position getPosition() {
+    return position;
+  }
+
+  @Override
+  public String getDiagnosticMessage() {
+    return "Attempt to backport " + backport.toSourceString();
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index bc11f33..60c67a1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.errors.BackportDiagnostic;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppView;
@@ -51,6 +52,7 @@
 import com.android.tools.r8.ir.desugar.backports.OptionalMethodRewrites;
 import com.android.tools.r8.ir.desugar.backports.SparseArrayMethodRewrites;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeter;
+import com.android.tools.r8.position.MethodPosition;
 import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
 import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
@@ -102,7 +104,7 @@
     }
 
     CfInvoke invoke = instruction.asInvoke();
-    MethodProvider methodProvider = getMethodProviderOrNull(invoke.getMethod());
+    MethodProvider methodProvider = getMethodProviderOrNull(invoke.getMethod(), context);
     return methodProvider != null
         ? methodProvider.rewriteInvoke(
             invoke, appView, eventConsumer, methodProcessingContext, localStackAllocator)
@@ -112,7 +114,7 @@
   @Override
   public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
     return instruction.isInvoke()
-        && getMethodProviderOrNull(instruction.asInvoke().getMethod()) != null
+        && getMethodProviderOrNull(instruction.asInvoke().getMethod(), context) != null
         && !appView
             .getSyntheticItems()
             .isSyntheticOfKind(context.getContextType(), kinds -> kinds.BACKPORT_WITH_FORWARDING);
@@ -146,7 +148,7 @@
     BackportedMethods.registerSynthesizedCodeReferences(options.itemFactory);
   }
 
-  private MethodProvider getMethodProviderOrNull(DexMethod method) {
+  private MethodProvider getMethodProviderOrNull(DexMethod method, ProgramMethod context) {
     DexMethod original = appView.graphLens().getOriginalMethodSignature(method);
     assert original != null;
     MethodProvider provider = rewritableMethods.getProvider(original);
@@ -164,6 +166,14 @@
           appView.dexItemFactory().createMethod(newHolder, method.proto, method.name);
       provider = rewritableMethods.getProvider(backportedMethod);
     }
+    if (provider != null && appView.options().disableBackportsWithErrorDiagnostics) {
+      appView
+          .reporter()
+          .error(
+              new BackportDiagnostic(
+                  provider.method, context.getOrigin(), MethodPosition.create(context)));
+      return null;
+    }
     return provider;
   }
 
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 51a5873..f49f0d4 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -272,22 +272,15 @@
     horizontalClassMergerOptions.setRestrictToSynthetics();
   }
 
+  // Configure options according to platform build assumptions.
+  // See go/r8platformflag and b/232073181.
   public void configureAndroidPlatformBuild(boolean isAndroidPlatformBuild) {
-    assert !androidPlatformBuild;
+    assert !addAndroidPlatformBuildToMarker;
     if (isAndroidPlatformBuild || minApiLevel.isPlatform()) {
       apiModelingOptions().disableApiModeling();
+      disableBackportsWithErrorDiagnostics = true;
+      addAndroidPlatformBuildToMarker = isAndroidPlatformBuild;
     }
-    if (!isAndroidPlatformBuild) {
-      return;
-    }
-    // Configure options according to platform build assumptions.
-    // See go/r8platformflag and b/232073181.
-    androidPlatformBuild = isAndroidPlatformBuild;
-    enableBackportMethods = false;
-  }
-
-  public boolean isAndroidPlatformBuild() {
-    return androidPlatformBuild;
   }
 
   public boolean printTimes = System.getProperty("com.android.tools.r8.printtimes") != null;
@@ -476,7 +469,7 @@
     if (tool == Tool.R8) {
       marker.setR8Mode(forceProguardCompatibility ? "compatibility" : "full");
     }
-    if (androidPlatformBuild) {
+    if (addAndroidPlatformBuildToMarker) {
       marker.setAndroidPlatformBuild();
     }
     return marker;
@@ -610,7 +603,7 @@
   // Skipping min_api check and compiling an intermediate result intended for later merging.
   // Intermediate builds also emits or update synthesized classes mapping.
   public boolean intermediate = false;
-  private boolean androidPlatformBuild = false;
+  private boolean addAndroidPlatformBuildToMarker = false;
   public boolean retainCompileTimeAnnotations = true;
   public boolean ignoreBootClasspathEnumsForMaindexTracing =
       System.getProperty("com.android.tools.r8.ignoreBootClasspathEnumsForMaindexTracing") != null;
@@ -624,8 +617,8 @@
   public DesugarState desugarState = DesugarState.ON;
   // Flag to turn on/off partial VarHandle desugaring.
   public boolean enableVarHandleDesugaring = false;
-  // Flag to turn on/off backport methods.
-  public boolean enableBackportMethods = true;
+  // Flag to turn off backport methods (and report errors if triggered).
+  public boolean disableBackportsWithErrorDiagnostics = false;
   // Flag to turn on/off reduction of nest to improve class merging optimizations.
   public boolean enableNestReduction = true;
   // Defines interface method rewriter behavior.
@@ -2390,14 +2383,7 @@
   }
 
   public boolean enableBackportedMethodRewriting() {
-    // Disable rewriting if there are no methods to rewrite or if the API level is higher than
-    // the highest known API level when the compiler is built. This ensures that when this is used
-    // by the Android Platform build (which normally use an API level of 10000) there will be
-    // no rewriting of backported methods. See b/147480264.
-    return enableBackportMethods
-        && desugarState.isOn()
-        // TODO(b/232073181): This platform check should rather be controlled via the platform flag.
-        && getMinApiLevel().isLessThanOrEqualTo(AndroidApiLevel.LATEST);
+    return desugarState.isOn();
   }
 
   public boolean enableTryWithResourcesDesugaring() {
diff --git a/src/test/java/com/android/tools/r8/L8TestBuilder.java b/src/test/java/com/android/tools/r8/L8TestBuilder.java
index 2a1d0f5..190e87b 100644
--- a/src/test/java/com/android/tools/r8/L8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/L8TestBuilder.java
@@ -191,7 +191,7 @@
           ImmutableList.<String>builder()
               .addAll(keepRules)
               .addAll(
-                  generatedKeepRules != null
+                  generatedKeepRules != null && !generatedKeepRules.isEmpty()
                       ? ImmutableList.of(generatedKeepRules)
                       : Collections.emptyList())
               .build();
diff --git a/src/test/java/com/android/tools/r8/PositionMatcher.java b/src/test/java/com/android/tools/r8/PositionMatcher.java
index 4fca1c6..888ad03 100644
--- a/src/test/java/com/android/tools/r8/PositionMatcher.java
+++ b/src/test/java/com/android/tools/r8/PositionMatcher.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
+import com.android.tools.r8.position.MethodPosition;
 import com.android.tools.r8.position.Position;
 import com.android.tools.r8.position.TextPosition;
 import org.hamcrest.Description;
@@ -24,4 +25,19 @@
       }
     };
   }
+
+  public static Matcher<Position> positionMethodName(String methodName) {
+    return new PositionMatcher() {
+      @Override
+      protected boolean matchesSafely(Position position) {
+        return position instanceof MethodPosition
+            && ((MethodPosition) position).getName().equals(methodName);
+      }
+
+      @Override
+      public void describeTo(Description description) {
+        description.appendText("with method " + methodName);
+      }
+    };
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportPlatformTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportPlatformTest.java
new file mode 100644
index 0000000..94fb0ce
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportPlatformTest.java
@@ -0,0 +1,112 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.desugar.backports;
+
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticPosition;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.containsString;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.PositionMatcher;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessages;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.desugar.backports.AbstractBackportTest.MiniAssert;
+import com.android.tools.r8.errors.BackportDiagnostic;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class BackportPlatformTest extends TestBase {
+
+  static final String EXPECTED = StringUtils.lines("Hello, world");
+
+  static final List<Class<?>> CLASSES =
+      ImmutableList.of(MiniAssert.class, TestClass.class, User.class);
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withDefaultDexRuntime().withApiLevel(AndroidApiLevel.J).build();
+  }
+
+  public BackportPlatformTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramClasses(CLASSES)
+        .addKeepMainRule(TestClass.class)
+        .addKeepClassAndMembersRules(MiniAssert.class)
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED);
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    testForD8(parameters.getBackend())
+        .addProgramClasses(CLASSES)
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED);
+  }
+
+  @Test(expected = CompilationFailedException.class)
+  public void testPlatformR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .apply(b -> b.getBuilder().setAndroidPlatformBuild(true))
+        .addProgramClasses(CLASSES)
+        .addKeepMainRule(TestClass.class)
+        .addKeepClassAndMembersRules(MiniAssert.class)
+        .setMinApi(parameters.getApiLevel())
+        .compileWithExpectedDiagnostics(this::checkDiagnostics);
+  }
+
+  @Test(expected = CompilationFailedException.class)
+  public void testPlatformD8() throws Exception {
+    testForD8(parameters.getBackend())
+        .apply(b -> b.getBuilder().setAndroidPlatformBuild(true))
+        .addProgramClasses(CLASSES)
+        .setMinApi(parameters.getApiLevel())
+        .compileWithExpectedDiagnostics(this::checkDiagnostics);
+  }
+
+  private void checkDiagnostics(TestDiagnosticMessages diagnostics) {
+    diagnostics
+        .assertAllErrorsMatch(
+            allOf(
+                diagnosticType(BackportDiagnostic.class),
+                diagnosticMessage(
+                    containsString("int java.lang.Boolean.compare(boolean, boolean)")),
+                diagnosticPosition(PositionMatcher.positionMethodName("testBooleanCompare"))))
+        .assertOnlyErrors();
+  }
+
+  static class User {
+
+    private static void testBooleanCompare() {
+      MiniAssert.assertTrue(Boolean.compare(true, false) > 0);
+    }
+  }
+
+  static class TestClass {
+
+    public static void main(String[] args) {
+      User.testBooleanCompare();
+      System.out.println("Hello, world");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
index 40942f7..116b62a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
@@ -14,8 +14,10 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.errors.UnusedProguardKeepRuleDiagnostic;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -95,7 +97,11 @@
               } else {
                 diagnosticsHandler.assertNoWarnings();
               }
-              diagnosticsHandler.assertNoInfos();
+              // The L8 compilation has always the extra keep rules from the json files, which may
+              // be unused, leading to infos.
+              Assert.assertTrue(
+                  diagnosticsHandler.getInfos().stream()
+                      .allMatch(info -> info instanceof UnusedProguardKeepRuleDiagnostic));
             });
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
index 0cf1b01..9cd3753 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
@@ -19,7 +19,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.SortedSet;
-import org.junit.Assert;
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -58,7 +57,7 @@
         .addKeepClassAndMembersRules(Executor.class)
         .compile()
         .inspect(this::assertNoForwardingStreamMethod)
-        .inspectKeepRules(Assert::assertNull)
+        .inspectKeepRules(kr -> assertTrue(kr == null || kr.isEmpty()))
         .run(parameters.getRuntime(), Executor.class)
         .assertSuccessWithOutputLines("1", "0");
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
index 5e6c723..2faea77 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
@@ -109,7 +109,7 @@
                   if (parameters.getApiLevel().getLevel() < AndroidApiLevel.N.getLevel()) {
                     keepRules.set(String.join("\n", kr));
                   } else {
-                    assert kr == null;
+                    assert kr == null || kr.isEmpty();
                     keepRules.set("");
                   }
                 })
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FileChannelSizeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FileChannelSizeTest.java
new file mode 100644
index 0000000..651f108
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FileChannelSizeTest.java
@@ -0,0 +1,109 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
+
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class FileChannelSizeTest extends DesugaredLibraryTestBase {
+
+  private static final String EXPECTED_RESULT =
+      StringUtils.lines("class java.io.FileNotFoundException");
+  private static final String EXPECTED_KEEP_RULES =
+      StringUtils.lines(
+          "-keep class j$.nio.channels.DesugarChannels {",
+          "    java.nio.channels.FileChannel"
+              + " convertMaybeLegacyFileChannelFromLibrary(java.nio.channels.FileChannel);",
+          "}");
+
+  private final TestParameters parameters;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+  private final CompilationSpecification compilationSpecification;
+
+  @Parameters(name = "{0}, spec: {1}, {2}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        // Skip Android 4.4.4 due to missing libjavacrypto.
+        getTestParameters()
+            .withDexRuntime(Version.V4_0_4)
+            .withDexRuntimesStartingFromIncluding(Version.V5_1_1)
+            .withAllApiLevels()
+            .build(),
+        ImmutableList.of(JDK11_PATH),
+        DEFAULT_SPECIFICATIONS);
+  }
+
+  public FileChannelSizeTest(
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
+    this.parameters = parameters;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
+    this.compilationSpecification = compilationSpecification;
+  }
+
+  @Test
+  public void test() throws Throwable {
+    testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .compile()
+        .inspectKeepRules(
+            kr -> {
+              if (parameters.getApiLevel().isLessThan(AndroidApiLevel.N)) {
+                assertEquals(EXPECTED_KEEP_RULES, kr.get(0));
+              }
+            })
+        .inspectL8(
+            i -> {
+              if (compilationSpecification.isL8Shrink()) {
+                assertTrue(i.allClasses().size() <= 6);
+                if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)) {
+                  assertEquals(0, i.allClasses().size());
+                }
+              }
+            })
+        .withArt6Plus64BitsLib()
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  public static class TestClass {
+
+    public static void main(String[] args) throws IOException {
+      try {
+        String toWrite = "Hello World! ";
+        ByteBuffer byteBuffer = ByteBuffer.allocate(toWrite.length());
+        FileInputStream fileInputStream = new FileInputStream(new File("notexisting.txt"));
+        fileInputStream.getChannel().read(byteBuffer);
+        fileInputStream.close();
+        System.out.println(new String(byteBuffer.array()));
+      } catch (IOException e) {
+        System.out.println(e.getClass());
+      }
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
index 3d76b78..42ade2a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
@@ -269,10 +269,10 @@
         .applyIf(
             l8Shrink,
             builder -> {
-              if (keepRule != null && !keepRule.trim().isEmpty()) {
-                String totalKeepRules = keepRule + "\n" + getExtraKeepRules();
-                builder.addGeneratedKeepRules(totalKeepRules);
-              }
+              assert keepRule != null;
+              String totalKeepRules =
+                  keepRule + (getExtraKeepRules().isEmpty() ? "" : ("\n" + getExtraKeepRules()));
+              builder.addGeneratedKeepRules(totalKeepRules);
             },
             L8TestBuilder::setDebug);
   }
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
index d52bbc5..247f833 100644
--- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
+++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1,2 @@
-024c0b5aa78dba1442189dc55367551825cc4085
\ No newline at end of file
+aa4b6c72e66addc2d7453eedc62a6d810994af6d
+