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 {