private void processChangedAddresses(AddressSetView changedAddresses,
			Collection<? extends FunctionTag> deletedTags, Program programAddedTo)
			throws IOException {

		FunctionManagerDB functionManager = (FunctionManagerDB) resultPgm.getFunctionManager();

		AddressIterator iter = changedAddresses.getAddresses(true);
		while (iter.hasNext()) {
			Address addr = iter.next();
			Function function = functionManager.getFunctionAt(addr);
			if (function == null) {
				continue;
			}

			// Get all the tags added to the function and compare against
			// the delete list.
			Collection<FunctionTag> tags = getTagsAddedToFunction(programAddedTo, addr);
			for (FunctionTag tag : tags) {

				if (deletedTags.contains(tag)) {
					addToConflicts(addr, tag);
					continue;
				}

				// Not a conflict, so add to Result.
				function.addTag(tag.getName());
			}
		}
	}
Determines if any deleted tags from one program were added to a function in
the other. If so, updates the conflict list with the offending tag/address.

If there is no conflict for a particular address, the changes are automatically
merged.

@param changedAddresses list of addresses to inspect
@param deletedTags all tags deleted in the 'other' program
@param programAddedTo the program in which the adds reside
@throws IOException
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/FunctionTagListingMerger.java