Merge "Fix inlining constraints in presence of non-rebound field access"
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index efec070..796d5d6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -274,6 +274,21 @@
ConstraintWithTarget fieldConstraintWithTarget =
ConstraintWithTarget.deriveConstraint(
invocationContext, fieldHolder, target.accessFlags, appView);
+
+ // If the field has not been member-rebound, then we also need to make sure that the
+ // `invocationContext` has access to the definition of the field.
+ //
+ // See, for example, InlineNonReboundFieldTest (b/128604123).
+ if (field.holder != target.field.holder) {
+ DexType actualFieldHolder = graphLense.lookupType(target.field.holder);
+ fieldConstraintWithTarget =
+ ConstraintWithTarget.meet(
+ fieldConstraintWithTarget,
+ ConstraintWithTarget.deriveConstraint(
+ invocationContext, actualFieldHolder, target.accessFlags, appView),
+ appView);
+ }
+
ConstraintWithTarget classConstraintWithTarget =
ConstraintWithTarget.deriveConstraint(
invocationContext, fieldHolder, fieldClass.accessFlags, appView);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java
index 9c16de6..fffb84a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java
@@ -4,11 +4,10 @@
package com.android.tools.r8.ir.optimize.inliner;
-import static org.hamcrest.CoreMatchers.containsString;
-
import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ir.optimize.inliner.testclasses.Greeting;
+import com.android.tools.r8.utils.StringUtils;
import org.junit.Test;
/** Regression test for b/128604123. */
@@ -16,6 +15,7 @@
@Test
public void test() throws Exception {
+ String expectedOutput = StringUtils.lines("Greeter: Hello world!");
testForR8(Backend.DEX)
.addProgramClasses(
TestClass.class, Greeter.class, Greeting.class, Greeting.getGreetingBase())
@@ -23,7 +23,7 @@
.enableClassInliningAnnotations()
.enableMergeAnnotations()
.run(TestClass.class)
- .assertFailureWithErrorThatMatches(containsString("IllegalAccessError"));
+ .assertSuccessWithOutput(expectedOutput);
}
static class TestClass {