NodeList *Next = nullptr;
};
-static bool isMemberPointer(StringView MangledName) {
+static bool isMemberPointer(StringView MangledName, bool &Error) {
+ Error = false;
switch (MangledName.popFront()) {
case '$':
// This is probably an rvalue reference (e.g. $$Q), and you cannot have an
// what.
break;
default:
- assert(false && "Ty is not a pointer type!");
+ Error = true;
+ return false;
}
// If it starts with a number, then 6 indicates a non-member function
case 'T':
return true;
default:
- assert(false);
+ Error = true;
+ return false;
}
- return false;
}
static SpecialIntrinsicKind
if (isTagType(MangledName))
Ty = demangleClassType(MangledName);
else if (isPointerType(MangledName)) {
- if (isMemberPointer(MangledName))
+ if (isMemberPointer(MangledName, Error))
Ty = demangleMemberPointerType(MangledName);
- else
+ else if (!Error)
Ty = demanglePointerType(MangledName);
+ else
+ return nullptr;
} else if (isArrayType(MangledName))
Ty = demangleArrayType(MangledName);
else if (isFunctionType(MangledName)) {
*Current = Arena.alloc<NodeList>();
TypeNode *TN = demangleType(MangledName, QualifierMangleMode::Drop);
+ if (!TN || Error)
+ return nullptr;
(*Current)->N = TN;
?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z
; CHECK: ?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z
; CHECK-NEXT: error: Invalid mangled name
+
+?f0@@YAXPEU?$AS_@$00$$CAD@__clang@@@Z
+; CHECK-EMPTY:
+; CHECK-NEXT: ?f0@@YAXPEU?$AS_@$00$$CAD@__clang@@@Z
+; CHECK-NEXT: error: Invalid mangled name
\ No newline at end of file