Fix IllegalAccessError from synthetic bridge insertion

Fixed: b/426351560

Change-Id: I0729eb8f2a5ee27a1a1f5e063ceceacb695cf24c
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index cbe7634..9492af5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.desugar.itf;
 
+import static com.android.tools.r8.graph.InvalidCode.isInvalidCode;
 import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodDesugaringEventConsumer.emptyInterfaceMethodDesugaringEventConsumer;
 
 import com.android.tools.r8.cf.CfVersion;
@@ -558,14 +559,21 @@
     assert method.getHolder().isInterface();
     assert definition.isNonAbstractNonNativeMethod();
     assert definition.getCode() != null;
-    assert !InvalidCode.isInvalidCode(definition.getCode());
     if (definition.isStatic()) {
+      assert !isInvalidCode(definition.getCode())
+          || appView.definitionFor(staticAsMethodOfCompanionClass(method)) != null;
       return ensureStaticAsMethodOfProgramCompanionClassStub(method, eventConsumer);
-    }
-    if (definition.isPrivate()) {
+    } else if (definition.isPrivate()) {
+      assert !isInvalidCode(definition.getCode())
+          || appView.definitionFor(privateAsMethodOfCompanionClass(method)) != null;
       return ensurePrivateAsMethodOfProgramCompanionClassStub(method, eventConsumer);
+    } else {
+      assert !isInvalidCode(definition.getCode())
+          || appView.definitionFor(
+                  defaultAsMethodOfCompanionClass(method.getReference(), appView.dexItemFactory()))
+              != null;
+      return ensureDefaultAsMethodOfProgramCompanionClassStub(method, eventConsumer);
     }
-    return ensureDefaultAsMethodOfProgramCompanionClassStub(method, eventConsumer);
   }
 
   private void ensureCompanionClassInitializesInterface(
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index b20df20..e18fa27 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -229,7 +229,7 @@
                       builder -> {
                         if (!targetDefinition.isAbstract()
                             && targetDefinition.getApiLevelForCode().isNotSetApiLevel()) {
-                          assert target.isLibraryMethod()
+                          assert !target.isProgramMethod()
                               || !appView.options().apiModelingOptions().isApiModelingEnabled();
                           builder.setApiLevelForCode(
                               appView
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index 0da300d..622d966 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.errors.InlinableStaticFinalFieldPreconditionDiagnostic;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.errors.UnusedProguardKeepRuleDiagnostic;
+import com.android.tools.r8.graph.AccessControl;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.BottomUpClassHierarchyTraversal;
@@ -43,6 +44,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
 import com.android.tools.r8.graph.ImmediateAppSubtypingInfo;
+import com.android.tools.r8.graph.InvalidCode;
 import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.graph.ProgramField;
@@ -855,7 +857,7 @@
         }
         ProgramMethod resolutionMethod = resolutionResult.getResolvedProgramMethod();
         ProgramMethod methodToKeep;
-        if (canInsertForwardingMethod(originalClazz, resolutionMethod.getDefinition())) {
+        if (canInsertForwardingMethod(originalClazz, resolutionMethod)) {
           DexMethod methodToKeepReference =
               resolutionMethod.getReference().withHolder(originalClazz, appView.dexItemFactory());
           methodToKeep =
@@ -885,9 +887,14 @@
       }
     }
 
-    private boolean canInsertForwardingMethod(DexClass holder, DexEncodedMethod target) {
+    private boolean canInsertForwardingMethod(DexProgramClass holder, ProgramMethod method) {
+      DexProgramClass resolvedHolder = method.getHolder();
+      if (AccessControl.isMemberAccessible(method, resolvedHolder, holder, appView)
+          .isPossiblyFalse()) {
+        return false;
+      }
       return appView.options().isGeneratingDex()
-          || ArrayUtils.contains(holder.interfaces.values, target.getHolderType());
+          || ArrayUtils.contains(holder.interfaces.values, resolvedHolder.getType());
     }
 
     private void markMatchingOverriddenMethods(
@@ -1877,7 +1884,9 @@
             interfaceDesugaringSyntheticHelper.ensureMethodOfProgramCompanionClassStub(
                 method, eventConsumer);
         // Add the method to the inverse map as tracing will now directly target the CC method.
-        pendingMethodMoveInverse.put(companion, method);
+        if (InvalidCode.isInvalidCode(companion.getDefinition().getCode())) {
+          pendingMethodMoveInverse.put(companion, method);
+        }
 
         LazyBox<Joiner<?, ?, ?>> companionJoiner =
             new LazyBox<>(
diff --git a/src/test/java/com/android/tools/r8/regress/b426351560/Regress426351560Test.java b/src/test/java/com/android/tools/r8/regress/b426351560/Regress426351560Test.java
index 7c5ec5f..9da5d33 100644
--- a/src/test/java/com/android/tools/r8/regress/b426351560/Regress426351560Test.java
+++ b/src/test/java/com/android/tools/r8/regress/b426351560/Regress426351560Test.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.regress.b426351560.testclasses.Regress426351560TestClasses;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -38,11 +37,7 @@
         .addInnerClasses(Regress426351560TestClasses.class, getClass())
         .addKeepRules("-keep class " + Main.class.getTypeName() + " { *; }")
         .run(parameters.getRuntime(), Main.class)
-        .applyIf(
-            parameters.isDexRuntime()
-                && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N),
-            rr -> rr.assertFailureWithErrorThatThrows(IllegalAccessError.class),
-            rr -> rr.assertSuccessWithOutput(EXPECTED_OUTPUT));
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
   public static class Main extends Regress426351560TestClasses.A {