protected boolean determineReturnConflict(Function[] functions, boolean autoMerge,
			TaskMonitor monitor) {
		Address entry = (functions[LATEST] != null) ? functions[LATEST].getEntryPoint()
				: ((functions[MY] != null) ? functions[MY].getEntryPoint()
						: functions[ORIGINAL].getEntryPoint());

		try {
			int conflicts = funcConflicts.get(entry);
			if ((conflicts & FUNC_SIGNATURE) != 0) {
				return false; // skip check if signature difference already detected
			}
		}
		catch (NoValueException e) {
			// ignore
		}

		boolean latestMyDiffers = functionReturnDiffers(functions[LATEST], functions[MY]);
		if (!latestMyDiffers) {
			return false;
		}
		boolean originalLatestDiffers =
			functionReturnDiffers(functions[ORIGINAL], functions[LATEST]);
		boolean originalMyDiffers = functionReturnDiffers(functions[ORIGINAL], functions[MY]);

		if (latestMyDiffers && originalMyDiffers) {
			if (originalLatestDiffers) {

				Parameter latestReturn = functions[LATEST].getReturn();
				Parameter myReturn = functions[MY].getReturn();

				boolean storageDiffers = false;

				// RESULT is checked for custom storage state since this must be resolved
				// prior to invoking this method - no need to check storage if custom
				// storage is not used
				if (functions[RESULT].hasCustomVariableStorage()) {
					storageDiffers =
						!latestReturn.getVariableStorage().equals(myReturn.getVariableStorage());
				}
				if (!storageDiffers) {
					long latestID =
						programs[LATEST].getDataTypeManager().getID(latestReturn.getDataType());
					long myID = programs[MY].getDataTypeManager().getID(myReturn.getDataType());
					DataType latestResultDt = getResultDataType(latestID, programs[LATEST]);
					DataType myResultDt = getResultDataType(myID, programs[MY]);
					if (latestResultDt == myResultDt) {
						return false;
					}
				}
				saveFunctionDetailConflict(functions, FUNC_RETURN);
				return true;
			}
			else if (autoMerge) {
				getMergeMy().mergeFunctionReturn(entry);
			}
		}
		return false;
	}
Compares the functions (Latest, Original, My) to determine if a parameter signature 
conflict exists and auto-merges any signature change if possible, otherwise 
the {@link #FUNC_SIGNATURE} conflict flag may be set for the current function
signaling the merger for later resolution and processing.
@param functions the matching set of functions from Result, Latest, My, and Original.
@param monitor the merge status monitor
@return true if signatures match and a check should be performed for parameter detail 
conflicts, otherwise false is returned and the {@link #FUNC_SIGNATURE} conflict flag
may be set for the current function
@throws CancelledException if merge has been cancelled.
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/AbstractFunctionMerger.java