private boolean fixUpUnionComponent(Union union, FixUpInfo info) {

		DataType compDt = resolve(info.compID, info.getDataTypeManager(), info.ht);

		int ordinal = info.index;

		DataTypeComponent dtc = null;
		if (ordinal >= 0 && ordinal <= union.getNumComponents()) {
			dtc = union.getComponent(ordinal);
		}

		if (dtc == null) {
			throw new AssertException("Expected bad datatype placeholder");
		}

		if (dtc.isBitFieldComponent()) {
			if (info.bitOffset < 0) {
				throw new AssertException("Expected bitfield fixup location");
			}
			if (compDt == null || compDt.isDeleted()) {
				// bitfield will retain use of the primitive base datatype
				String comment =
					buildDataTypeFailureComment(info.componentDataType, null, dtc.getComment());
				dtc.setComment(comment);
			}
			else if (BitFieldDataType.isValidBaseDataType(compDt)) {
				// replace bitfield base datatype - silent if updated type is not a valid base type
				BitFieldDataType bfDt = (BitFieldDataType) dtc.getDataType();
				union.delete(ordinal);
				try {
					union.insertBitField(ordinal, compDt, bfDt.getDeclaredBitSize(),
						dtc.getFieldName(), dtc.getComment());
					return true;
				}
				catch (InvalidDataTypeException e) {
					// should never occur
					Msg.error(this, "Unexpected datatype merge fixup error", e);
				}
			}
		}
		else {
			if (info.bitOffset >= 0) {
				throw new AssertException("Unexpected bitfield fixup location");
			}
			if (dtc.getDataType() != BadDataType.dataType) {
				throw new AssertException("Expected bad datatype placeholder");
			}
			if (compDt == null || compDt.isDeleted()) {
				String comment =
					buildDataTypeFailureComment(info.componentDataType, null, dtc.getComment());
				dtc.setComment(comment);
				return false;
			}

			// handle non-bitfield component fixup
			int length = compDt.getLength();
			if (length <= 0) {
				length = dtc.getLength();
			}
			union.delete(ordinal);
			try {
				union.insert(ordinal, compDt, length, dtc.getFieldName(), dtc.getComment());
				return true;
			}
			catch (IllegalArgumentException e) {
				displayError(union, e);
				// restore bad placeholder component
				String comment =
					buildDataTypeFailureComment(info.componentDataType, null, dtc.getComment());
				union.insert(ordinal, BadDataType.dataType, dtc.getLength(), dtc.getFieldName(),
					comment);
			}
		}
		Msg.warn(this,
			"Union Merge: Failed to resolve data type '" + info.componentDataType.getName() +
				"' at ordinal " + info.index + " in " + union.getPathName());
		return false;
	}
Fix up the structure using the fix up info for a component.
@param info fixup info
@param struct structure to be fixed-up
@return true if fixup successfully processed else false
Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergeManager.java