public static MDDataType parseSpecialExtendedType(MDMang dmang, boolean isHighest)
			throws MDException {
		MDDataType dt;
		char code = dmang.getAndIncrement();
		if (code != '$') {
			throw new MDException("ExtendedType invalid character: " + code);
		}
		code = dmang.getAndIncrement();
		switch (code) {
			case 'A':
				dt = new MDFunctionIndirectType(dmang);
				break;
			case 'B':
				dt = new MDPointerRefDataType(dmang);
				break;
			case 'C':
				dt = new MDDataReferenceType(dmang);
				break;
			case 'Q':
				dt = new MDDataRightReferenceType(dmang, isHighest, false, false);
				break;
			case 'R':
				dt = new MDDataRightReferenceType(dmang, isHighest, false, true);
				break;
			case 'T':
				dt = new MDStdNullPtrType(dmang);
				break;
			case 'Y': // UINFO: QualifiedName only (no type)
				// TODO: implementation. Try symbol like "?var@@3$$Yabc@@"
				dt = new MDNamedUnspecifiedType(dmang);
				break;
			case 'V': // Empty type parameter pack?
				dt = new MDEmptyParameterType(dmang);
				break;
			case 'Z': // End template parameter pack?
				dt = new MDEndParameterType(dmang);
				break;
			case 'S': // invalid (UINFO)
			case 'F': // Investigate $$F in CVMod processing... does it belong here?
			default:
				throw new MDException("SpecialDataType: unrecognized code: " + code);
		}
		return dt;
	}
This method parses special extended data types that Microsoft had not originally planned
for, which include function indirect, pointer reference data type, data reference type,
data reference reference type, std::nullptr_t, and (soon) other missing types
@param dmang - the MDMang driver
@param isHighest - boolean indicating whether something else modifies or names the data
 type to be parsed, which impacts when certain overloaded CV modifiers can be applied.
@return - a type derived from MDDataType
@throws MDException on parsing error
Ghidra/Features/MicrosoftDmang/src/main/java/mdemangler/datatype/MDDataTypeParser.java