Retain package of classes with package private field types

Bug: b/243955191
Change-Id: If89c88ccb88d9caf86f53101d86cfa1f2d3f09da
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java
index 5bc0f58..e3986c8 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexDefinition;
+import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
@@ -62,6 +63,18 @@
       }
     }
 
+    // If any field has a non-public type, then field merging may lead to check-cast instructions
+    // being synthesized. These synthesized accesses depends on the package.
+    for (DexEncodedField field : clazz.fields()) {
+      DexType fieldBaseType = field.getType().toBaseType(appView.dexItemFactory());
+      if (fieldBaseType.isClassType()) {
+        DexClass fieldBaseClass = appView.definitionFor(fieldBaseType);
+        if (fieldBaseClass == null || !fieldBaseClass.isPublic()) {
+          return true;
+        }
+      }
+    }
+
     // Check that all accesses from [clazz] to classes or members from the current package of
     // [clazz] will continue to work. This is guaranteed if the methods of [clazz] do not access
     // any private or protected classes or members from the current package of [clazz].