int determineFunctionConflict(Function[] functions, int type, int latestMyChanges,
			int originalLatestChanges, int originalMyChanges, TaskMonitor monitor) {
		if (((latestMyChanges & type) != 0) && ((originalMyChanges & type) != 0)) {
			// Mine changed function type
			if ((originalLatestChanges & type) != 0) {
				// Latest Changed function type
				StackFrame latestStack = functions[LATEST].getStackFrame();
				StackFrame myStack = functions[MY].getStackFrame();

				// See if both changed to same value.
				switch (type) {
					case FUNC_RETURN_ADDRESS_OFFSET:
						return (latestStack.getReturnAddressOffset() == myStack
								.getReturnAddressOffset()) ? 0 : type;
// For now, we are not allowing you to set the parameter offset or local size outright.
//					case FUNC_PARAMETER_OFFSET:
//						return (latestStack.getParameterOffset() == myStack.getParameterOffset()) ? 0
//								: type;
//					case FUNC_LOCAL_SIZE:
//						return (latestStack.getLocalSize() == myStack.getLocalSize()) ? 0 : type;
					case FUNC_STACK_PURGE_SIZE:
						return (functions[LATEST].getStackPurgeSize() == functions[MY]
								.getStackPurgeSize()) ? 0 : type;
					case FUNC_NAME:
						return hasUnresolvedFunctionNameConflict(functions, monitor) ? type : 0;
					case FUNC_INLINE:
						return (functions[LATEST].isInline() == functions[MY].isInline()) ? 0
								: type;
					case FUNC_NO_RETURN:
						return (functions[LATEST].hasNoReturn() == functions[MY].hasNoReturn()) ? 0
								: type;
//					case FUNC_CUSTOM_STORAGE:
//						return (functions[LATEST].hasCustomVariableStorage() == functions[MY].hasCustomVariableStorage()) ? 0
//								: type;
					case FUNC_CALLING_CONVENTION:
						return (functions[LATEST].getCallingConventionName()
								.equals(functions[MY].getCallingConventionName())) ? 0 : type;
					case FUNC_SIGNATURE_SOURCE:
						return (functions[LATEST].getSignatureSource() == functions[MY]
								.getSignatureSource()) ? 0 : type;
					default:
						throw new IllegalArgumentException("type = " + type);
				}
			}
			// AutoMerge
			Address myEntryPoint = functions[MY].getEntryPoint();
			mergeFunctionDetail(type, myEntryPoint, getMergeMy(), monitor);
		}
		return 0; // No conflict
	}
Determines whether or not the part of the function, indicated by the type value, is in
conflict for the matching set of functions. If not, then the function change is auto merged.
@param functions the matching set of functions from Result, Latest, My, and Original 
(Some may be null.)
@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 bit mask indicating the types of differences between Latest and My function.
@param originalLatestChanges bit mask indicating the types of differences between Original and Latest function.
@param originalMyChanges bit mask indicating the types of differences between Original and My function.
@param monitor the merge status monitor for cancelling the merge and for reporting status.
@return 0 if there isn't a conflict. Otherwise, if that type of conflict exists then 
the type is returned.
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/AbstractFunctionMerger.java