Use common supertype when merging instance fields in class merger
Change-Id: I3885990d8690f607e715d88558f5ffd17467efa0
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
index a8b8d30..682da64 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
@@ -8,6 +8,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.DexTypeUtils;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMergerGraphLens.Builder;
import com.android.tools.r8.horizontalclassmerging.policies.SameInstanceFields.InstanceFieldInfo;
import com.android.tools.r8.utils.IterableUtils;
@@ -149,12 +151,15 @@
DexEncodedField newField;
if (needsRelaxedType(targetField, sourceFields)) {
+ DexType newFieldType =
+ DexTypeUtils.computeLeastUpperBound(
+ appView,
+ Iterables.transform(
+ Iterables.concat(IterableUtils.singleton(targetField), sourceFields),
+ DexEncodedField::getType));
newField =
targetField.toTypeSubstitutedField(
- appView,
- targetField
- .getReference()
- .withType(appView.dexItemFactory().objectType, appView.dexItemFactory()));
+ appView, targetField.getReference().withType(newFieldType, appView.dexItemFactory()));
} else {
newField = targetField;
}