Fix incorrect accessibility check in ResolutionResult
Bug: 149831282
Change-Id: I8063f9d41ac902b2ebd44b216505240063f1f349
diff --git a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
index a9fc188..1002cd5 100644
--- a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
@@ -155,21 +155,11 @@
public DexEncodedMethod lookupInvokeSpecialTarget(
DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
// If the resolution is non-accessible then no target exists.
- if (!isAccessibleFrom(context, appInfo)) {
- return null;
+ if (isAccessibleFrom(context, appInfo)) {
+ return internalInvokeSpecialOrSuper(
+ context, appInfo, (sup, sub) -> isSuperclass(sup, sub, appInfo));
}
- DexEncodedMethod target =
- internalInvokeSpecialOrSuper(
- context, appInfo, (sup, sub) -> isSuperclass(sup, sub, appInfo));
- if (target == null) {
- return null;
- }
- // Should we check access control again?
- DexClass holder = appInfo.definitionFor(target.method.holder);
- if (!AccessControl.isMethodAccessible(target, holder, context, appInfo)) {
- return null;
- }
- return target;
+ return null;
}
/**
@@ -191,7 +181,7 @@
public DexEncodedMethod lookupInvokeSuperTarget(
DexProgramClass context, AppInfoWithClassHierarchy appInfo) {
// TODO(b/147848950): Investigate and remove the Compilation error. It could compile to
- // throw IAE.
+ // throw IAE.
if (resolvedMethod.isInstanceInitializer()
|| (appInfo.hasSubtyping()
&& initialResolutionHolder != context
@@ -199,19 +189,10 @@
throw new CompilationError(
"Illegal invoke-super to " + resolvedMethod.toSourceString(), context.getOrigin());
}
- if (!isAccessibleFrom(context, appInfo)) {
- return null;
+ if (isAccessibleFrom(context, appInfo)) {
+ return internalInvokeSpecialOrSuper(context, appInfo, (sup, sub) -> true);
}
- DexEncodedMethod target = internalInvokeSpecialOrSuper(context, appInfo, (sup, sub) -> true);
- if (target == null) {
- return null;
- }
- // Should we check access control again?
- DexClass holder = appInfo.definitionFor(target.method.holder);
- if (!AccessControl.isMethodAccessible(target, holder, context, appInfo)) {
- return null;
- }
- return target;
+ return null;
}
/**
diff --git a/src/test/java/com/android/tools/r8/shaking/B149831282.java b/src/test/java/com/android/tools/r8/shaking/B149831282.java
index 64254f0..910d44b 100644
--- a/src/test/java/com/android/tools/r8/shaking/B149831282.java
+++ b/src/test/java/com/android/tools/r8/shaking/B149831282.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.shaking;
-import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.NeverClassInline;
@@ -52,9 +51,7 @@
.setMinApi(parameters.getApiLevel())
.compile()
.run(parameters.getRuntime(), TestClass.class)
- // TODO(b/149831282): Should succeed with "In A.m()".
- .assertFailureWithErrorThatMatches(
- containsString(NullPointerException.class.getTypeName()));
+ .assertSuccessWithOutputLines("In A.m()");
}
private void addProgramInputs(TestBuilder<?, ?> builder) throws Exception {