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 {