Assign api level to methods rewritten with configuration debugging

Bug: b/298965633
Change-Id: I89745aa8b041fd00c48a449b3dae94896ae61e71
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d8a8834..e1e8b82 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -867,8 +867,7 @@
 
   private static boolean allReferencesAssignedApiLevel(
       AppView<? extends AppInfoWithClassHierarchy> appView) {
-    if (!appView.options().apiModelingOptions().isCheckAllApiReferencesAreSet()
-        || appView.options().configurationDebugging) {
+    if (!appView.options().apiModelingOptions().isCheckAllApiReferencesAreSet()) {
       return true;
     }
     // This will assert false if we find anything in the library which is not modeled.
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 4811185..d4db53d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -1004,7 +1004,9 @@
                     : toDexCodeThatLogsError(appView.dexItemFactory()))
             .setIsLibraryMethodOverrideIf(
                 belongsToVirtualPool() && !isLibraryMethodOverride().isUnknown(),
-                isLibraryMethodOverride());
+                isLibraryMethodOverride())
+            .setApiLevelForCode(appView.computedMinApiLevel())
+            .setApiLevelForDefinition(ComputedApiLevel.unknown());
     setObsolete();
     return builder.build();
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index 0c0da4e..d813a668 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -5,6 +5,7 @@
 
 import static com.google.common.base.Predicates.alwaysFalse;
 
+import com.android.tools.r8.androidapi.ComputedApiLevel;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DefaultInstanceInitializerCode;
 import com.android.tools.r8.graph.DexClass;
@@ -362,10 +363,12 @@
         reachableMethods.add(method);
       } else if (options.configurationDebugging) {
         // Keep the method but rewrite its body, if it has one.
-        reachableMethods.add(
-            method.shouldNotHaveCode() && !method.hasCode()
-                ? method
-                : method.toMethodThatLogsError(appView));
+        if (method.shouldNotHaveCode() && !method.hasCode()) {
+          method.setApiLevelForDefinition(ComputedApiLevel.unknown());
+          reachableMethods.add(method);
+        } else {
+          reachableMethods.add(method.toMethodThatLogsError(appView));
+        }
         methodsToKeepForConfigurationDebugging.add(method.getReference());
       } else if (appInfo.isTargetedMethod(method.getReference())) {
         // If the method is already abstract, and doesn't have code, let it be.
diff --git a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingWithInliningTest.java b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingWithInliningTest.java
index 6256a35..edd31ba 100644
--- a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingWithInliningTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingWithInliningTest.java
@@ -5,9 +5,7 @@
 package com.android.tools.r8.shaking.addconfigurationdebugging;
 
 import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThrows;
 
-import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
@@ -31,20 +29,26 @@
 
   @Test
   public void testForR8() throws Exception {
-    assertThrows(
-        CompilationFailedException.class,
-        () ->
-            testForR8(parameters.getBackend())
-                .addProgramClasses(Main.class, Bar.class)
-                .addKeepRules("-addconfigurationdebugging")
-                .addKeepMainRule(Main.class)
-                .setMinApi(parameters)
-                .enableInliningAnnotations()
-                // TODO(b/298965633): We should not fail.
-                .compileWithExpectedDiagnostics(
-                    diagnostics ->
-                        diagnostics.assertErrorMessageThatMatches(
-                            containsString("Cannot compute relationship for not set"))));
+    testForR8(parameters.getBackend())
+        .addProgramClasses(Main.class, Bar.class)
+        .addKeepRules("-addconfigurationdebugging")
+        .addKeepMainRule(Main.class)
+        .setMinApi(parameters)
+        .enableInliningAnnotations()
+        .compile()
+        .run(parameters.getRuntime(), Main.class)
+        // AddConfigurationDebugging will insert a call to android.util.log.
+        .applyIf(
+            parameters.isDexRuntime(),
+            result ->
+                result
+                    .assertFailureWithErrorThatThrows(NoClassDefFoundError.class)
+                    .assertFailureWithErrorThatMatches(containsString("Landroid/util/Log;")))
+        .applyIf(
+            parameters.isCfRuntime(),
+            result ->
+                result.assertFailureWithErrorThatMatches(
+                    containsString("Missing method in " + typeName(Bar.class))));
   }
 
   public static class Main {