protected List<ParamInfoConflict> determineParameterInfoConflicts(Function[] functions,
			boolean autoMerge, TaskMonitor monitor) {
		ArrayList<ParamInfoConflict> paramConflictList = null;
		Address entry = (functions[LATEST] != null) ? functions[LATEST].getEntryPoint()
				: ((functions[MY] != null) ? functions[MY].getEntryPoint()
						: functions[ORIGINAL].getEntryPoint());

		// TODO: How should we deal with auto-params which are immutable ??
		// assume we are only here is LATEST and MY have "same" sig/storage which for 
		// dynamic storage means same number of non-auto params

		Parameter[] origParms =
			(functions[ORIGINAL] != null) ? functions[ORIGINAL].getParameters() : new Parameter[0];
		Parameter[] latestParms =
			(functions[LATEST] != null) ? functions[LATEST].getParameters() : new Parameter[0];
		Parameter[] myParms =
			(functions[MY] != null) ? functions[MY].getParameters() : new Parameter[0];

		int numParms = myParms.length;
		for (int ordinal = 0; ordinal < numParms; ordinal++) {
			Parameter originalParameter = (ordinal < origParms.length) ? origParms[ordinal] : null;
			Parameter latestParameter =
				(ordinal < latestParms.length) ? latestParms[ordinal] : null;
			if (latestParameter != null && latestParameter.isAutoParameter()) {
				continue; // can't mutate auto-param
			}
			Parameter myParameter = (ordinal < myParms.length) ? myParms[ordinal] : null;
			int latestMyChanges = getVariableDiffs(latestParameter, myParameter);
			if (latestMyChanges == 0) {
				continue;
			}
			int originalLatestChanges = getVariableDiffs(originalParameter, latestParameter);
			int originalMyChanges = getVariableDiffs(originalParameter, myParameter);
			int paramConflicts = 0;
//			paramConflicts |=
//				determineVariableConflict(entry, VAR_TYPE, myParameter, latestMyChanges,
//					originalLatestChanges, originalMyChanges, monitor);
			if (paramConflicts == 0) {
				paramConflicts |= determineVariableConflict(entry, VAR_NAME, myParameter,
					latestMyChanges, originalLatestChanges, originalMyChanges, autoMerge, monitor);
				paramConflicts |= determineVariableConflict(entry, VAR_DATATYPE, myParameter,
					latestMyChanges, originalLatestChanges, originalMyChanges, autoMerge, monitor);
//				paramConflicts |= determineVariableConflict(entry, VAR_LENGTH,    myP, latestMyChanges, 
//															originalLatestChanges, originalMyChanges, monitor);
				paramConflicts |= determineVariableConflict(entry, VAR_COMMENT, myParameter,
					latestMyChanges, originalLatestChanges, originalMyChanges, autoMerge, monitor);
//				paramConflicts |=
//					determineVariableConflict(entry, VAR_STORAGE, myParameter, latestMyChanges,
//						originalLatestChanges, originalMyChanges, autoMerge, monitor);
//				paramConflicts |= determineVariableConflict(entry, VAR_FIRST_USE, myP, latestMyChanges, 
//															originalLatestChanges, originalMyChanges, monitor);
//				paramConflicts |= determineVariableConflict(entry, VAR_OFFSET,    myP, latestMyChanges, 
//															originalLatestChanges, originalMyChanges, monitor);
//				paramConflicts |= determineVariableConflict(entry, VAR_ORDINAL,   myP, latestMyChanges, 
//															originalLatestChanges, originalMyChanges, monitor);
//				paramConflicts |= determineVariableConflict(entry, VAR_REGISTER,  myP, latestMyChanges, 
//															originalLatestChanges, originalMyChanges, monitor);
			}
			if (paramConflicts != 0) {
				if (paramConflictList == null) {
					paramConflictList = new ArrayList<>();
				}
				paramConflictList.add(new ParamInfoConflict(entry, ordinal, paramConflicts));
			}
		}
		if (paramConflictList != null) {
			saveFunctionDetailConflict(functions, FUNC_PARAM_DETAILS);
		}
		return paramConflictList;
	}
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