private void determineExternalDataTypeConflict(ExternalLocation[] externalLocations,
			int latestMyChanges, int originalLatestChanges, int originalMyChanges,
			TaskMonitor monitor) throws CancelledException {

		Address myExternalAddress = externalLocations[MY].getExternalSpaceAddress();

		DataType latestDataType = getResultDataType(externalLocations[LATEST]);
		DataType myDataType = getResultDataType(externalLocations[MY]);
		boolean latestHasDataType =
			(latestDataType != null) && (latestDataType != DataType.DEFAULT);
		boolean myHasDataType = (myDataType != null) && (myDataType != DataType.DEFAULT);
		boolean differentDataTypes = (latestMyChanges & EXTERNAL_DATA_TYPE) != 0;
		boolean latestChangedDataType = (originalLatestChanges & EXTERNAL_DATA_TYPE) != 0;
		boolean myChangedDataType = (originalMyChanges & EXTERNAL_DATA_TYPE) != 0;
		boolean latestIsFunction = externalLocations[LATEST].isFunction();
		boolean myIsFunction = externalLocations[MY].isFunction();
		boolean latestChangedFunction = (originalLatestChanges & EXTERNAL_FUNCTION) != 0;
		boolean myChangedFunction = (originalMyChanges & EXTERNAL_FUNCTION) != 0;
		// If the data types are different, then did a change to one conflict with a
		// data type or function change to the other?
		if (differentDataTypes) {
			if (myChangedDataType) {
				if (latestChangedDataType) {
					// Both changed the data type differently.
					saveExternalDataTypeConflict(myExternalAddress);
				}
				else if (myHasDataType && latestChangedFunction && latestIsFunction) {
					// MY Data Type conflicts with LATEST function.
					saveExternalFunctionVersusDataTypeConflict(myExternalAddress);
				}
				else {
					// Auto Merge My data type change.
					replaceExternalDataType(externalLocations[RESULT], externalLocations[MY],
						monitor);
				}
			}
			else if (latestChangedDataType) {
				if (myChangedDataType) {
					// Can't get here. This CONFLICT is handled by "if (myChangedDataType)" above.
					throw new AssertException("Shouldn't be here!");
				}
				else if (latestHasDataType && myChangedFunction && myIsFunction) {
					// LATEST data type conflicts with MY function.
					saveExternalFunctionVersusDataTypeConflict(myExternalAddress);
				}
				// Otherwise, RESULT should already have the LATEST data type.
			}
		}
	}
@param entry
@param type (FUNC_RETURN_TYPE, FUNC_RETURN_ADDRESS_OFFSET,
FUNC_PARAMETER_OFFSET, FUNC_LOCAL_SIZE, FUNC_STACK_PURGE_SIZE, FUNC_NAME, FUNC_INLINE,
FUNC_NO_RETURN, FUNC_CALLING_CONVENTION)
@param latestMyChanges
@param originalLatestChanges
@param originalMyChanges
@param monitor
@return
@throws CancelledException
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalFunctionMerger.java