Lines Matching refs:state

209 void UpdateHighWaterMark(State *state) {  in UpdateHighWaterMark()  argument
210 if (state->high_water_mark < state->parse_state.mangled_idx) { in UpdateHighWaterMark()
211 state->high_water_mark = state->parse_state.mangled_idx; in UpdateHighWaterMark()
215 void ReportHighWaterMark(State *state) { in ReportHighWaterMark() argument
220 const size_t input_length = std::strlen(state->mangled_begin); in ReportHighWaterMark()
221 if (input_length + 6 > static_cast<size_t>(state->out_end_idx) || in ReportHighWaterMark()
222 state->too_complex) { in ReportHighWaterMark()
223 if (state->out_end_idx > 0) state->out[0] = '\0'; in ReportHighWaterMark()
226 const size_t high_water_mark = static_cast<size_t>(state->high_water_mark); in ReportHighWaterMark()
227 std::memcpy(state->out, state->mangled_begin, high_water_mark); in ReportHighWaterMark()
228 std::memcpy(state->out + high_water_mark, "--!--", 5); in ReportHighWaterMark()
229 std::memcpy(state->out + high_water_mark + 5, in ReportHighWaterMark()
230 state->mangled_begin + high_water_mark, in ReportHighWaterMark()
232 state->out[input_length + 5] = '\0'; in ReportHighWaterMark()
243 explicit ComplexityGuard(State *state) : state_(state) { in ComplexityGuard() argument
244 ++state->recursion_depth; in ComplexityGuard()
245 ++state->steps; in ComplexityGuard()
316 static void InitState(State* state, in InitState() argument
320 state->mangled_begin = mangled; in InitState()
321 state->out = out; in InitState()
322 state->out_end_idx = static_cast<int>(out_size); in InitState()
323 state->recursion_depth = 0; in InitState()
324 state->steps = 0; in InitState()
326 state->high_water_mark = 0; in InitState()
327 state->too_complex = false; in InitState()
330 state->parse_state.mangled_idx = 0; in InitState()
331 state->parse_state.out_cur_idx = 0; in InitState()
332 state->parse_state.prev_name_idx = 0; in InitState()
333 state->parse_state.prev_name_length = 0; in InitState()
334 state->parse_state.nest_level = -1; in InitState()
335 state->parse_state.append = true; in InitState()
338 static inline const char *RemainingInput(State *state) { in RemainingInput() argument
339 return &state->mangled_begin[state->parse_state.mangled_idx]; in RemainingInput()
345 static bool ParseOneCharToken(State *state, const char one_char_token) { in ParseOneCharToken() argument
346 ComplexityGuard guard(state); in ParseOneCharToken()
348 if (RemainingInput(state)[0] == one_char_token) { in ParseOneCharToken() local
349 ++state->parse_state.mangled_idx; in ParseOneCharToken()
350 UpdateHighWaterMark(state); in ParseOneCharToken()
359 static bool ParseTwoCharToken(State *state, const char *two_char_token) { in ParseTwoCharToken() argument
360 ComplexityGuard guard(state); in ParseTwoCharToken()
362 if (RemainingInput(state)[0] == two_char_token[0] && in ParseTwoCharToken()
363 RemainingInput(state)[1] == two_char_token[1]) { in ParseTwoCharToken()
364 state->parse_state.mangled_idx += 2; in ParseTwoCharToken()
365 UpdateHighWaterMark(state); in ParseTwoCharToken()
374 static bool ParseThreeCharToken(State *state, const char *three_char_token) { in ParseThreeCharToken() argument
375 ComplexityGuard guard(state); in ParseThreeCharToken()
377 if (RemainingInput(state)[0] == three_char_token[0] && in ParseThreeCharToken()
378 RemainingInput(state)[1] == three_char_token[1] && in ParseThreeCharToken()
379 RemainingInput(state)[2] == three_char_token[2]) { in ParseThreeCharToken()
380 state->parse_state.mangled_idx += 3; in ParseThreeCharToken()
381 UpdateHighWaterMark(state); in ParseThreeCharToken()
389 static bool ParseLongToken(State *state, const char *long_token) { in ParseLongToken() argument
390 ComplexityGuard guard(state); in ParseLongToken()
397 if (RemainingInput(state)[i] != long_token[i]) return false; in ParseLongToken() local
399 state->parse_state.mangled_idx += i; in ParseLongToken()
400 UpdateHighWaterMark(state); in ParseLongToken()
406 static bool ParseCharClass(State *state, const char *char_class) { in ParseCharClass() argument
407 ComplexityGuard guard(state); in ParseCharClass()
409 if (RemainingInput(state)[0] == '\0') { in ParseCharClass() local
414 if (RemainingInput(state)[0] == *p) { in ParseCharClass()
415 ++state->parse_state.mangled_idx; in ParseCharClass()
416 UpdateHighWaterMark(state); in ParseCharClass()
423 static bool ParseDigit(State *state, int *digit) { in ParseDigit() argument
424 char c = RemainingInput(state)[0]; in ParseDigit()
425 if (ParseCharClass(state, "0123456789")) { in ParseDigit()
439 static bool OneOrMore(ParseFunc parse_func, State *state) { in OneOrMore() argument
440 if (parse_func(state)) { in OneOrMore()
441 while (parse_func(state)) { in OneOrMore()
452 static bool ZeroOrMore(ParseFunc parse_func, State *state) { in ZeroOrMore() argument
453 while (parse_func(state)) { in ZeroOrMore()
461 static void Append(State *state, const char *const str, const size_t length) { in Append() argument
463 if (state->parse_state.out_cur_idx + 1 < in Append()
464 state->out_end_idx) { // +1 for '\0' in Append()
465 state->out[state->parse_state.out_cur_idx++] = str[i]; in Append()
468 state->parse_state.out_cur_idx = state->out_end_idx + 1; in Append()
472 if (state->parse_state.out_cur_idx < state->out_end_idx) { in Append()
473 state->out[state->parse_state.out_cur_idx] = in Append()
517 static bool EndsWith(State *state, const char chr) { in EndsWith() argument
518 return state->parse_state.out_cur_idx > 0 && in EndsWith()
519 state->parse_state.out_cur_idx < state->out_end_idx && in EndsWith()
520 chr == state->out[state->parse_state.out_cur_idx - 1]; in EndsWith()
524 static void MaybeAppendWithLength(State *state, const char *const str, in MaybeAppendWithLength() argument
526 if (state->parse_state.append && length > 0) { in MaybeAppendWithLength()
529 if (str[0] == '<' && EndsWith(state, '<')) { in MaybeAppendWithLength()
530 Append(state, " ", 1); in MaybeAppendWithLength()
534 if (state->parse_state.out_cur_idx < state->out_end_idx && in MaybeAppendWithLength()
536 state->parse_state.prev_name_idx = state->parse_state.out_cur_idx; in MaybeAppendWithLength()
537 state->parse_state.prev_name_length = static_cast<unsigned int>(length); in MaybeAppendWithLength()
539 Append(state, str, length); in MaybeAppendWithLength()
544 static bool MaybeAppendDecimal(State *state, int val) { in MaybeAppendDecimal() argument
551 if (state->parse_state.append) { in MaybeAppendDecimal()
561 Append(state, p, kMaxLength - static_cast<size_t>(p - buf)); in MaybeAppendDecimal()
569 static bool MaybeAppend(State *state, const char *const str) { in MaybeAppend() argument
570 if (state->parse_state.append) { in MaybeAppend()
572 MaybeAppendWithLength(state, str, length); in MaybeAppend()
578 static bool EnterNestedName(State *state) { in EnterNestedName() argument
579 state->parse_state.nest_level = 0; in EnterNestedName()
584 static bool LeaveNestedName(State *state, int16_t prev_value) { in LeaveNestedName() argument
585 state->parse_state.nest_level = prev_value; in LeaveNestedName()
590 static bool DisableAppend(State *state) { in DisableAppend() argument
591 state->parse_state.append = false; in DisableAppend()
596 static bool RestoreAppend(State *state, bool prev_value) { in RestoreAppend() argument
597 state->parse_state.append = prev_value; in RestoreAppend()
602 static void MaybeIncreaseNestLevel(State *state) { in MaybeIncreaseNestLevel() argument
603 if (state->parse_state.nest_level > -1) { in MaybeIncreaseNestLevel()
604 ++state->parse_state.nest_level; in MaybeIncreaseNestLevel()
609 static void MaybeAppendSeparator(State *state) { in MaybeAppendSeparator() argument
610 if (state->parse_state.nest_level >= 1) { in MaybeAppendSeparator()
611 MaybeAppend(state, "::"); in MaybeAppendSeparator()
616 static void MaybeCancelLastSeparator(State *state) { in MaybeCancelLastSeparator() argument
617 if (state->parse_state.nest_level >= 1 && state->parse_state.append && in MaybeCancelLastSeparator()
618 state->parse_state.out_cur_idx >= 2) { in MaybeCancelLastSeparator()
619 state->parse_state.out_cur_idx -= 2; in MaybeCancelLastSeparator()
620 state->out[state->parse_state.out_cur_idx] = '\0'; in MaybeCancelLastSeparator()
626 static bool IdentifierIsAnonymousNamespace(State *state, size_t length) { in IdentifierIsAnonymousNamespace() argument
630 StrPrefix(RemainingInput(state), anon_prefix)); in IdentifierIsAnonymousNamespace()
634 static bool ParseMangledName(State *state);
635 static bool ParseEncoding(State *state);
636 static bool ParseName(State *state);
637 static bool ParseUnscopedName(State *state);
638 static bool ParseNestedName(State *state);
639 static bool ParsePrefix(State *state);
640 static bool ParseUnqualifiedName(State *state);
641 static bool ParseSourceName(State *state);
642 static bool ParseLocalSourceName(State *state);
643 static bool ParseUnnamedTypeName(State *state);
644 static bool ParseNumber(State *state, int *number_out);
645 static bool ParseFloatNumber(State *state);
646 static bool ParseSeqId(State *state);
647 static bool ParseIdentifier(State *state, size_t length);
648 static bool ParseOperatorName(State *state, int *arity);
649 static bool ParseConversionOperatorType(State *state);
650 static bool ParseSpecialName(State *state);
651 static bool ParseCallOffset(State *state);
652 static bool ParseNVOffset(State *state);
653 static bool ParseVOffset(State *state);
654 static bool ParseAbiTags(State *state);
655 static bool ParseCtorDtorName(State *state);
656 static bool ParseDecltype(State *state);
657 static bool ParseType(State *state);
658 static bool ParseCVQualifiers(State *state);
659 static bool ParseExtendedQualifier(State *state);
660 static bool ParseBuiltinType(State *state);
661 static bool ParseVendorExtendedType(State *state);
662 static bool ParseFunctionType(State *state);
663 static bool ParseBareFunctionType(State *state);
664 static bool ParseOverloadAttribute(State *state);
665 static bool ParseClassEnumType(State *state);
666 static bool ParseArrayType(State *state);
667 static bool ParsePointerToMemberType(State *state);
668 static bool ParseTemplateParam(State *state);
669 static bool ParseTemplateParamDecl(State *state);
670 static bool ParseTemplateTemplateParam(State *state);
671 static bool ParseTemplateArgs(State *state);
672 static bool ParseTemplateArg(State *state);
673 static bool ParseBaseUnresolvedName(State *state);
674 static bool ParseUnresolvedName(State *state);
675 static bool ParseUnresolvedQualifierLevel(State *state);
676 static bool ParseUnionSelector(State* state);
677 static bool ParseFunctionParam(State* state);
678 static bool ParseBracedExpression(State *state);
679 static bool ParseExpression(State *state);
680 static bool ParseInitializer(State *state);
681 static bool ParseExprPrimary(State *state);
682 static bool ParseExprCastValueAndTrailingE(State *state);
683 static bool ParseQRequiresClauseExpr(State *state);
684 static bool ParseRequirement(State *state);
685 static bool ParseTypeConstraint(State *state);
686 static bool ParseLocalName(State *state);
687 static bool ParseLocalNameSuffix(State *state);
688 static bool ParseDiscriminator(State *state);
689 static bool ParseSubstitution(State *state, bool accept_std);
723 static bool ParseMangledName(State *state) { in ParseMangledName() argument
724 ComplexityGuard guard(state); in ParseMangledName()
726 return ParseTwoCharToken(state, "_Z") && ParseEncoding(state); in ParseMangledName()
735 static bool ParseEncoding(State *state) { in ParseEncoding() argument
736 ComplexityGuard guard(state); in ParseEncoding()
745 if (ParseName(state)) { in ParseEncoding()
746 if (!ParseBareFunctionType(state)) { in ParseEncoding()
752 ParseQRequiresClauseExpr(state); // restores state on failure in ParseEncoding()
756 if (ParseSpecialName(state)) { in ParseEncoding()
766 static bool ParseName(State *state) { in ParseName() argument
767 ComplexityGuard guard(state); in ParseName()
769 if (ParseNestedName(state) || ParseLocalName(state)) { in ParseName()
781 ParseState copy = state->parse_state; in ParseName()
783 if (ParseSubstitution(state, /*accept_std=*/false) && in ParseName()
784 ParseTemplateArgs(state)) { in ParseName()
787 state->parse_state = copy; in ParseName()
791 return ParseUnscopedName(state) && Optional(ParseTemplateArgs(state)); in ParseName()
796 static bool ParseUnscopedName(State *state) { in ParseUnscopedName() argument
797 ComplexityGuard guard(state); in ParseUnscopedName()
799 if (ParseUnqualifiedName(state)) { in ParseUnscopedName()
803 ParseState copy = state->parse_state; in ParseUnscopedName()
804 if (ParseTwoCharToken(state, "St") && MaybeAppend(state, "std::") && in ParseUnscopedName()
805 ParseUnqualifiedName(state)) { in ParseUnscopedName()
808 state->parse_state = copy; in ParseUnscopedName()
814 static inline bool ParseRefQualifier(State *state) { in ParseRefQualifier() argument
815 return ParseCharClass(state, "OR"); in ParseRefQualifier()
822 static bool ParseNestedName(State *state) { in ParseNestedName() argument
823 ComplexityGuard guard(state); in ParseNestedName()
825 ParseState copy = state->parse_state; in ParseNestedName()
826 if (ParseOneCharToken(state, 'N') && EnterNestedName(state) && in ParseNestedName()
827 Optional(ParseCVQualifiers(state)) && in ParseNestedName()
828 Optional(ParseRefQualifier(state)) && ParsePrefix(state) && in ParseNestedName()
829 LeaveNestedName(state, copy.nest_level) && in ParseNestedName()
830 ParseOneCharToken(state, 'E')) { in ParseNestedName()
833 state->parse_state = copy; in ParseNestedName()
850 static bool ParsePrefix(State *state) { in ParsePrefix() argument
851 ComplexityGuard guard(state); in ParsePrefix()
855 MaybeAppendSeparator(state); in ParsePrefix()
856 if (ParseTemplateParam(state) || ParseDecltype(state) || in ParsePrefix()
857 ParseSubstitution(state, /*accept_std=*/true) || in ParsePrefix()
862 ParseVendorExtendedType(state) || in ParsePrefix()
863 ParseUnscopedName(state) || in ParsePrefix()
864 (ParseOneCharToken(state, 'M') && ParseUnnamedTypeName(state))) { in ParsePrefix()
866 MaybeIncreaseNestLevel(state); in ParsePrefix()
869 MaybeCancelLastSeparator(state); in ParsePrefix()
870 if (has_something && ParseTemplateArgs(state)) { in ParsePrefix()
871 return ParsePrefix(state); in ParsePrefix()
892 static bool ParseUnqualifiedName(State *state) { in ParseUnqualifiedName() argument
893 ComplexityGuard guard(state); in ParseUnqualifiedName()
895 if (ParseOperatorName(state, nullptr) || ParseCtorDtorName(state) || in ParseUnqualifiedName()
896 ParseSourceName(state) || ParseLocalSourceName(state) || in ParseUnqualifiedName()
897 ParseUnnamedTypeName(state)) { in ParseUnqualifiedName()
898 return ParseAbiTags(state); in ParseUnqualifiedName()
902 ParseState copy = state->parse_state; in ParseUnqualifiedName()
903 if (ParseTwoCharToken(state, "DC") && OneOrMore(ParseSourceName, state) && in ParseUnqualifiedName()
904 ParseOneCharToken(state, 'E')) { in ParseUnqualifiedName()
907 state->parse_state = copy; in ParseUnqualifiedName()
911 if (ParseOneCharToken(state, 'F') && MaybeAppend(state, "friend ") && in ParseUnqualifiedName()
912 (ParseSourceName(state) || ParseOperatorName(state, nullptr))) { in ParseUnqualifiedName()
915 state->parse_state = copy; in ParseUnqualifiedName()
922 static bool ParseAbiTags(State *state) { in ParseAbiTags() argument
923 ComplexityGuard guard(state); in ParseAbiTags()
926 while (ParseOneCharToken(state, 'B')) { in ParseAbiTags()
927 ParseState copy = state->parse_state; in ParseAbiTags()
928 MaybeAppend(state, "[abi:"); in ParseAbiTags()
930 if (!ParseSourceName(state)) { in ParseAbiTags()
931 state->parse_state = copy; in ParseAbiTags()
934 MaybeAppend(state, "]"); in ParseAbiTags()
941 static bool ParseSourceName(State *state) { in ParseSourceName() argument
942 ComplexityGuard guard(state); in ParseSourceName()
944 ParseState copy = state->parse_state; in ParseSourceName()
946 if (ParseNumber(state, &length) && in ParseSourceName()
947 ParseIdentifier(state, static_cast<size_t>(length))) { in ParseSourceName()
950 state->parse_state = copy; in ParseSourceName()
959 static bool ParseLocalSourceName(State *state) { in ParseLocalSourceName() argument
960 ComplexityGuard guard(state); in ParseLocalSourceName()
962 ParseState copy = state->parse_state; in ParseLocalSourceName()
963 if (ParseOneCharToken(state, 'L') && ParseSourceName(state) && in ParseLocalSourceName()
964 Optional(ParseDiscriminator(state))) { in ParseLocalSourceName()
967 state->parse_state = copy; in ParseLocalSourceName()
979 static bool ParseUnnamedTypeName(State *state) { in ParseUnnamedTypeName() argument
980 ComplexityGuard guard(state); in ParseUnnamedTypeName()
982 ParseState copy = state->parse_state; in ParseUnnamedTypeName()
988 if (ParseTwoCharToken(state, "Ut") && Optional(ParseNumber(state, &which)) && in ParseUnnamedTypeName()
990 ParseOneCharToken(state, '_')) { in ParseUnnamedTypeName()
991 MaybeAppend(state, "{unnamed type#"); in ParseUnnamedTypeName()
992 MaybeAppendDecimal(state, 2 + which); in ParseUnnamedTypeName()
993 MaybeAppend(state, "}"); in ParseUnnamedTypeName()
996 state->parse_state = copy; in ParseUnnamedTypeName()
1000 if (ParseTwoCharToken(state, "Ul") && DisableAppend(state) && in ParseUnnamedTypeName()
1001 ZeroOrMore(ParseTemplateParamDecl, state) && in ParseUnnamedTypeName()
1002 OneOrMore(ParseType, state) && RestoreAppend(state, copy.append) && in ParseUnnamedTypeName()
1003 ParseOneCharToken(state, 'E') && Optional(ParseNumber(state, &which)) && in ParseUnnamedTypeName()
1005 ParseOneCharToken(state, '_')) { in ParseUnnamedTypeName()
1006 MaybeAppend(state, "{lambda()#"); in ParseUnnamedTypeName()
1007 MaybeAppendDecimal(state, 2 + which); in ParseUnnamedTypeName()
1008 MaybeAppend(state, "}"); in ParseUnnamedTypeName()
1011 state->parse_state = copy; in ParseUnnamedTypeName()
1019 static bool ParseNumber(State *state, int *number_out) { in ParseNumber() argument
1020 ComplexityGuard guard(state); in ParseNumber()
1023 if (ParseOneCharToken(state, 'n')) { in ParseNumber()
1026 const char *p = RemainingInput(state); in ParseNumber()
1041 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseNumber()
1042 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseNumber()
1043 UpdateHighWaterMark(state); in ParseNumber()
1055 static bool ParseFloatNumber(State *state) { in ParseFloatNumber() argument
1056 ComplexityGuard guard(state); in ParseFloatNumber()
1058 const char *p = RemainingInput(state); in ParseFloatNumber()
1064 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseFloatNumber()
1065 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseFloatNumber()
1066 UpdateHighWaterMark(state); in ParseFloatNumber()
1074 static bool ParseSeqId(State *state) { in ParseSeqId() argument
1075 ComplexityGuard guard(state); in ParseSeqId()
1077 const char *p = RemainingInput(state); in ParseSeqId()
1083 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseSeqId()
1084 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseSeqId()
1085 UpdateHighWaterMark(state); in ParseSeqId()
1092 static bool ParseIdentifier(State *state, size_t length) { in ParseIdentifier() argument
1093 ComplexityGuard guard(state); in ParseIdentifier()
1095 if (!AtLeastNumCharsRemaining(RemainingInput(state), length)) { in ParseIdentifier()
1098 if (IdentifierIsAnonymousNamespace(state, length)) { in ParseIdentifier()
1099 MaybeAppend(state, "(anonymous namespace)"); in ParseIdentifier()
1101 MaybeAppendWithLength(state, RemainingInput(state), length); in ParseIdentifier()
1103 state->parse_state.mangled_idx += length; in ParseIdentifier()
1104 UpdateHighWaterMark(state); in ParseIdentifier()
1112 static bool ParseOperatorName(State *state, int *arity) { in ParseOperatorName() argument
1113 ComplexityGuard guard(state); in ParseOperatorName()
1115 if (!AtLeastNumCharsRemaining(RemainingInput(state), 2)) { in ParseOperatorName()
1119 ParseState copy = state->parse_state; in ParseOperatorName()
1120 if (ParseTwoCharToken(state, "cv") && MaybeAppend(state, "operator ") && in ParseOperatorName()
1121 EnterNestedName(state) && ParseConversionOperatorType(state) && in ParseOperatorName()
1122 LeaveNestedName(state, copy.nest_level)) { in ParseOperatorName()
1128 state->parse_state = copy; in ParseOperatorName()
1131 if (ParseTwoCharToken(state, "li") && MaybeAppend(state, "operator\"\" ") && in ParseOperatorName()
1132 ParseSourceName(state)) { in ParseOperatorName()
1135 state->parse_state = copy; in ParseOperatorName()
1138 if (ParseOneCharToken(state, 'v') && ParseDigit(state, arity) && in ParseOperatorName()
1139 ParseSourceName(state)) { in ParseOperatorName()
1142 state->parse_state = copy; in ParseOperatorName()
1146 if (!(IsLower(RemainingInput(state)[0]) && in ParseOperatorName()
1147 IsAlpha(RemainingInput(state)[1]))) { in ParseOperatorName()
1153 if (RemainingInput(state)[0] == p->abbrev[0] && in ParseOperatorName()
1154 RemainingInput(state)[1] == p->abbrev[1]) { in ParseOperatorName()
1158 MaybeAppend(state, "operator"); in ParseOperatorName()
1160 MaybeAppend(state, " "); in ParseOperatorName()
1162 MaybeAppend(state, p->real_name); in ParseOperatorName()
1163 state->parse_state.mangled_idx += 2; in ParseOperatorName()
1164 UpdateHighWaterMark(state); in ParseOperatorName()
1178 static bool ParseConversionOperatorType(State *state) { in ParseConversionOperatorType() argument
1179 ComplexityGuard guard(state); in ParseConversionOperatorType()
1181 ParseState copy = state->parse_state; in ParseConversionOperatorType()
1187 const char* begin_simple_prefixes = RemainingInput(state); in ParseConversionOperatorType()
1188 while (ParseCharClass(state, "OPRCGrVK")) {} in ParseConversionOperatorType()
1189 const char* end_simple_prefixes = RemainingInput(state); in ParseConversionOperatorType()
1192 if (!ParseType(state)) { in ParseConversionOperatorType()
1193 state->parse_state = copy; in ParseConversionOperatorType()
1202 MaybeAppend(state, "*"); in ParseConversionOperatorType()
1205 MaybeAppend(state, "&"); in ParseConversionOperatorType()
1208 MaybeAppend(state, "&&"); in ParseConversionOperatorType()
1211 MaybeAppend(state, " _Complex"); in ParseConversionOperatorType()
1214 MaybeAppend(state, " _Imaginary"); in ParseConversionOperatorType()
1217 MaybeAppend(state, " restrict"); in ParseConversionOperatorType()
1220 MaybeAppend(state, " volatile"); in ParseConversionOperatorType()
1223 MaybeAppend(state, " const"); in ParseConversionOperatorType()
1258 static bool ParseSpecialName(State *state) { in ParseSpecialName() argument
1259 ComplexityGuard guard(state); in ParseSpecialName()
1261 ParseState copy = state->parse_state; in ParseSpecialName()
1263 if (ParseTwoCharToken(state, "TW")) { in ParseSpecialName()
1264 MaybeAppend(state, "thread-local wrapper routine for "); in ParseSpecialName()
1265 if (ParseName(state)) return true; in ParseSpecialName()
1266 state->parse_state = copy; in ParseSpecialName()
1270 if (ParseTwoCharToken(state, "TH")) { in ParseSpecialName()
1271 MaybeAppend(state, "thread-local initialization routine for "); in ParseSpecialName()
1272 if (ParseName(state)) return true; in ParseSpecialName()
1273 state->parse_state = copy; in ParseSpecialName()
1277 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTIS") && in ParseSpecialName()
1278 ParseType(state)) { in ParseSpecialName()
1281 state->parse_state = copy; in ParseSpecialName()
1283 if (ParseTwoCharToken(state, "Tc") && ParseCallOffset(state) && in ParseSpecialName()
1284 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
1287 state->parse_state = copy; in ParseSpecialName()
1289 if (ParseTwoCharToken(state, "GV") && ParseName(state)) { in ParseSpecialName()
1292 state->parse_state = copy; in ParseSpecialName()
1294 if (ParseOneCharToken(state, 'T') && ParseCallOffset(state) && in ParseSpecialName()
1295 ParseEncoding(state)) { in ParseSpecialName()
1298 state->parse_state = copy; in ParseSpecialName()
1301 if (ParseTwoCharToken(state, "TC") && ParseType(state) && in ParseSpecialName()
1302 ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') && in ParseSpecialName()
1303 DisableAppend(state) && ParseType(state)) { in ParseSpecialName()
1304 RestoreAppend(state, copy.append); in ParseSpecialName()
1307 state->parse_state = copy; in ParseSpecialName()
1309 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "FJ") && in ParseSpecialName()
1310 ParseType(state)) { in ParseSpecialName()
1313 state->parse_state = copy; in ParseSpecialName()
1317 if (ParseTwoCharToken(state, "GR")) { in ParseSpecialName()
1318 MaybeAppend(state, "reference temporary for "); in ParseSpecialName()
1319 if (!ParseName(state)) { in ParseSpecialName()
1320 state->parse_state = copy; in ParseSpecialName()
1323 const bool has_seq_id = ParseSeqId(state); in ParseSpecialName()
1324 const bool has_underscore = ParseOneCharToken(state, '_'); in ParseSpecialName()
1326 state->parse_state = copy; in ParseSpecialName()
1332 if (ParseTwoCharToken(state, "GA") && ParseEncoding(state)) { in ParseSpecialName()
1335 state->parse_state = copy; in ParseSpecialName()
1337 if (ParseThreeCharToken(state, "GTt") && in ParseSpecialName()
1338 MaybeAppend(state, "transaction clone for ") && ParseEncoding(state)) { in ParseSpecialName()
1341 state->parse_state = copy; in ParseSpecialName()
1343 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "hv") && in ParseSpecialName()
1344 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
1347 state->parse_state = copy; in ParseSpecialName()
1349 if (ParseTwoCharToken(state, "TA")) { in ParseSpecialName()
1350 bool append = state->parse_state.append; in ParseSpecialName()
1351 DisableAppend(state); in ParseSpecialName()
1352 if (ParseTemplateArg(state)) { in ParseSpecialName()
1353 RestoreAppend(state, append); in ParseSpecialName()
1354 MaybeAppend(state, "template parameter object"); in ParseSpecialName()
1358 state->parse_state = copy; in ParseSpecialName()
1365 static bool ParseCallOffset(State *state) { in ParseCallOffset() argument
1366 ComplexityGuard guard(state); in ParseCallOffset()
1368 ParseState copy = state->parse_state; in ParseCallOffset()
1369 if (ParseOneCharToken(state, 'h') && ParseNVOffset(state) && in ParseCallOffset()
1370 ParseOneCharToken(state, '_')) { in ParseCallOffset()
1373 state->parse_state = copy; in ParseCallOffset()
1375 if (ParseOneCharToken(state, 'v') && ParseVOffset(state) && in ParseCallOffset()
1376 ParseOneCharToken(state, '_')) { in ParseCallOffset()
1379 state->parse_state = copy; in ParseCallOffset()
1385 static bool ParseNVOffset(State *state) { in ParseNVOffset() argument
1386 ComplexityGuard guard(state); in ParseNVOffset()
1388 return ParseNumber(state, nullptr); in ParseNVOffset()
1392 static bool ParseVOffset(State *state) { in ParseVOffset() argument
1393 ComplexityGuard guard(state); in ParseVOffset()
1395 ParseState copy = state->parse_state; in ParseVOffset()
1396 if (ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') && in ParseVOffset()
1397 ParseNumber(state, nullptr)) { in ParseVOffset()
1400 state->parse_state = copy; in ParseVOffset()
1411 static bool ParseCtorDtorName(State *state) { in ParseCtorDtorName() argument
1412 ComplexityGuard guard(state); in ParseCtorDtorName()
1414 ParseState copy = state->parse_state; in ParseCtorDtorName()
1415 if (ParseOneCharToken(state, 'C')) { in ParseCtorDtorName()
1416 if (ParseCharClass(state, "1234")) { in ParseCtorDtorName()
1418 state->out + state->parse_state.prev_name_idx; in ParseCtorDtorName()
1419 MaybeAppendWithLength(state, prev_name, in ParseCtorDtorName()
1420 state->parse_state.prev_name_length); in ParseCtorDtorName()
1422 } else if (ParseOneCharToken(state, 'I') && ParseCharClass(state, "12") && in ParseCtorDtorName()
1423 ParseClassEnumType(state)) { in ParseCtorDtorName()
1427 state->parse_state = copy; in ParseCtorDtorName()
1429 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "0124")) { in ParseCtorDtorName()
1430 const char *const prev_name = state->out + state->parse_state.prev_name_idx; in ParseCtorDtorName()
1431 MaybeAppend(state, "~"); in ParseCtorDtorName()
1432 MaybeAppendWithLength(state, prev_name, in ParseCtorDtorName()
1433 state->parse_state.prev_name_length); in ParseCtorDtorName()
1436 state->parse_state = copy; in ParseCtorDtorName()
1443 static bool ParseDecltype(State *state) { in ParseDecltype() argument
1444 ComplexityGuard guard(state); in ParseDecltype()
1447 ParseState copy = state->parse_state; in ParseDecltype()
1448 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "tT") && in ParseDecltype()
1449 ParseExpression(state) && ParseOneCharToken(state, 'E')) { in ParseDecltype()
1452 state->parse_state = copy; in ParseDecltype()
1477 static bool ParseType(State *state) { in ParseType() argument
1478 ComplexityGuard guard(state); in ParseType()
1480 ParseState copy = state->parse_state; in ParseType()
1495 if (ParseCVQualifiers(state)) { in ParseType()
1496 const bool result = ParseType(state); in ParseType()
1497 if (!result) state->parse_state = copy; in ParseType()
1500 state->parse_state = copy; in ParseType()
1506 if (ParseCharClass(state, "OPRCG")) { in ParseType()
1507 const bool result = ParseType(state); in ParseType()
1508 if (!result) state->parse_state = copy; in ParseType()
1511 state->parse_state = copy; in ParseType()
1513 if (ParseTwoCharToken(state, "Dp") && ParseType(state)) { in ParseType()
1516 state->parse_state = copy; in ParseType()
1518 if (ParseBuiltinType(state) || ParseFunctionType(state) || in ParseType()
1519 ParseClassEnumType(state) || ParseArrayType(state) || in ParseType()
1520 ParsePointerToMemberType(state) || ParseDecltype(state) || in ParseType()
1522 ParseSubstitution(state, /*accept_std=*/false)) { in ParseType()
1526 if (ParseTemplateTemplateParam(state) && ParseTemplateArgs(state)) { in ParseType()
1529 state->parse_state = copy; in ParseType()
1532 if (ParseTemplateParam(state)) { in ParseType()
1537 if (ParseTwoCharToken(state, "Dv") && ParseNumber(state, nullptr) && in ParseType()
1538 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseType()
1541 state->parse_state = copy; in ParseType()
1544 if (ParseTwoCharToken(state, "Dv") && ParseExpression(state) && in ParseType()
1545 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseType()
1548 state->parse_state = copy; in ParseType()
1550 if (ParseTwoCharToken(state, "Dk") && ParseTypeConstraint(state)) { in ParseType()
1553 state->parse_state = copy; in ParseType()
1558 return ParseLongToken(state, "_SUBSTPACK_"); in ParseType()
1566 static bool ParseCVQualifiers(State *state) { in ParseCVQualifiers() argument
1567 ComplexityGuard guard(state); in ParseCVQualifiers()
1570 while (ParseExtendedQualifier(state)) ++num_cv_qualifiers; in ParseCVQualifiers()
1571 num_cv_qualifiers += ParseOneCharToken(state, 'r'); in ParseCVQualifiers()
1572 num_cv_qualifiers += ParseOneCharToken(state, 'V'); in ParseCVQualifiers()
1573 num_cv_qualifiers += ParseOneCharToken(state, 'K'); in ParseCVQualifiers()
1578 static bool ParseExtendedQualifier(State *state) { in ParseExtendedQualifier() argument
1579 ComplexityGuard guard(state); in ParseExtendedQualifier()
1581 ParseState copy = state->parse_state; in ParseExtendedQualifier()
1583 if (!ParseOneCharToken(state, 'U')) return false; in ParseExtendedQualifier()
1585 bool append = state->parse_state.append; in ParseExtendedQualifier()
1586 DisableAppend(state); in ParseExtendedQualifier()
1587 if (!ParseSourceName(state)) { in ParseExtendedQualifier()
1588 state->parse_state = copy; in ParseExtendedQualifier()
1591 Optional(ParseTemplateArgs(state)); in ParseExtendedQualifier()
1592 RestoreAppend(state, append); in ParseExtendedQualifier()
1609 static bool ParseBuiltinType(State *state) { in ParseBuiltinType() argument
1610 ComplexityGuard guard(state); in ParseBuiltinType()
1612 ParseState copy = state->parse_state; in ParseBuiltinType()
1616 if (ParseTwoCharToken(state, "DB") || in ParseBuiltinType()
1617 (ParseTwoCharToken(state, "DU") && MaybeAppend(state, "unsigned "))) { in ParseBuiltinType()
1618 bool append = state->parse_state.append; in ParseBuiltinType()
1619 DisableAppend(state); in ParseBuiltinType()
1621 if (!ParseNumber(state, &number) && !ParseExpression(state)) { in ParseBuiltinType()
1622 state->parse_state = copy; in ParseBuiltinType()
1625 RestoreAppend(state, append); in ParseBuiltinType()
1627 if (!ParseOneCharToken(state, '_')) { in ParseBuiltinType()
1628 state->parse_state = copy; in ParseBuiltinType()
1632 MaybeAppend(state, "_BitInt("); in ParseBuiltinType()
1634 MaybeAppendDecimal(state, number); in ParseBuiltinType()
1636 MaybeAppend(state, "?"); // the best we can do for dependent sizes in ParseBuiltinType()
1638 MaybeAppend(state, ")"); in ParseBuiltinType()
1645 if (ParseTwoCharToken(state, "DF")) { in ParseBuiltinType()
1646 if (ParseThreeCharToken(state, "16b")) { in ParseBuiltinType()
1647 MaybeAppend(state, "std::bfloat16_t"); in ParseBuiltinType()
1651 if (!ParseNumber(state, &number)) { in ParseBuiltinType()
1652 state->parse_state = copy; in ParseBuiltinType()
1655 MaybeAppend(state, "_Float"); in ParseBuiltinType()
1656 MaybeAppendDecimal(state, number); in ParseBuiltinType()
1657 if (ParseOneCharToken(state, 'x')) { in ParseBuiltinType()
1658 MaybeAppend(state, "x"); in ParseBuiltinType()
1661 if (ParseOneCharToken(state, '_')) return true; in ParseBuiltinType()
1662 state->parse_state = copy; in ParseBuiltinType()
1669 if (ParseOneCharToken(state, p->abbrev[0])) { in ParseBuiltinType()
1670 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1673 } else if (p->abbrev[2] == '\0' && ParseTwoCharToken(state, p->abbrev)) { in ParseBuiltinType()
1674 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1679 return ParseVendorExtendedType(state); in ParseBuiltinType()
1683 static bool ParseVendorExtendedType(State *state) { in ParseVendorExtendedType() argument
1684 ComplexityGuard guard(state); in ParseVendorExtendedType()
1687 ParseState copy = state->parse_state; in ParseVendorExtendedType()
1688 if (ParseOneCharToken(state, 'u') && ParseSourceName(state) && in ParseVendorExtendedType()
1689 Optional(ParseTemplateArgs(state))) { in ParseVendorExtendedType()
1692 state->parse_state = copy; in ParseVendorExtendedType()
1703 static bool ParseExceptionSpec(State *state) { in ParseExceptionSpec() argument
1704 ComplexityGuard guard(state); in ParseExceptionSpec()
1707 if (ParseTwoCharToken(state, "Do")) return true; in ParseExceptionSpec()
1709 ParseState copy = state->parse_state; in ParseExceptionSpec()
1710 if (ParseTwoCharToken(state, "DO") && ParseExpression(state) && in ParseExceptionSpec()
1711 ParseOneCharToken(state, 'E')) { in ParseExceptionSpec()
1714 state->parse_state = copy; in ParseExceptionSpec()
1715 if (ParseTwoCharToken(state, "Dw") && OneOrMore(ParseType, state) && in ParseExceptionSpec()
1716 ParseOneCharToken(state, 'E')) { in ParseExceptionSpec()
1719 state->parse_state = copy; in ParseExceptionSpec()
1728 static bool ParseFunctionType(State *state) { in ParseFunctionType() argument
1729 ComplexityGuard guard(state); in ParseFunctionType()
1731 ParseState copy = state->parse_state; in ParseFunctionType()
1732 Optional(ParseExceptionSpec(state)); in ParseFunctionType()
1733 Optional(ParseTwoCharToken(state, "Dx")); in ParseFunctionType()
1734 if (!ParseOneCharToken(state, 'F')) { in ParseFunctionType()
1735 state->parse_state = copy; in ParseFunctionType()
1738 Optional(ParseOneCharToken(state, 'Y')); in ParseFunctionType()
1739 if (!ParseBareFunctionType(state)) { in ParseFunctionType()
1740 state->parse_state = copy; in ParseFunctionType()
1743 Optional(ParseCharClass(state, "RO")); in ParseFunctionType()
1744 if (!ParseOneCharToken(state, 'E')) { in ParseFunctionType()
1745 state->parse_state = copy; in ParseFunctionType()
1755 static bool ParseBareFunctionType(State *state) { in ParseBareFunctionType() argument
1756 ComplexityGuard guard(state); in ParseBareFunctionType()
1758 ParseState copy = state->parse_state; in ParseBareFunctionType()
1759 DisableAppend(state); in ParseBareFunctionType()
1760 if (ZeroOrMore(ParseOverloadAttribute, state) && in ParseBareFunctionType()
1761 OneOrMore(ParseType, state)) { in ParseBareFunctionType()
1762 RestoreAppend(state, copy.append); in ParseBareFunctionType()
1763 MaybeAppend(state, "()"); in ParseBareFunctionType()
1766 state->parse_state = copy; in ParseBareFunctionType()
1778 static bool ParseOverloadAttribute(State *state) { in ParseOverloadAttribute() argument
1779 ComplexityGuard guard(state); in ParseOverloadAttribute()
1781 ParseState copy = state->parse_state; in ParseOverloadAttribute()
1782 if (ParseTwoCharToken(state, "Ua") && ParseName(state)) { in ParseOverloadAttribute()
1785 state->parse_state = copy; in ParseOverloadAttribute()
1795 static bool ParseClassEnumType(State *state) { in ParseClassEnumType() argument
1796 ComplexityGuard guard(state); in ParseClassEnumType()
1798 ParseState copy = state->parse_state; in ParseClassEnumType()
1799 if (Optional(ParseTwoCharToken(state, "Ts") || in ParseClassEnumType()
1800 ParseTwoCharToken(state, "Tu") || in ParseClassEnumType()
1801 ParseTwoCharToken(state, "Te")) && in ParseClassEnumType()
1802 ParseName(state)) { in ParseClassEnumType()
1805 state->parse_state = copy; in ParseClassEnumType()
1811 static bool ParseArrayType(State *state) { in ParseArrayType() argument
1812 ComplexityGuard guard(state); in ParseArrayType()
1814 ParseState copy = state->parse_state; in ParseArrayType()
1815 if (ParseOneCharToken(state, 'A') && ParseNumber(state, nullptr) && in ParseArrayType()
1816 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1819 state->parse_state = copy; in ParseArrayType()
1821 if (ParseOneCharToken(state, 'A') && Optional(ParseExpression(state)) && in ParseArrayType()
1822 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1825 state->parse_state = copy; in ParseArrayType()
1830 static bool ParsePointerToMemberType(State *state) { in ParsePointerToMemberType() argument
1831 ComplexityGuard guard(state); in ParsePointerToMemberType()
1833 ParseState copy = state->parse_state; in ParsePointerToMemberType()
1834 if (ParseOneCharToken(state, 'M') && ParseType(state) && ParseType(state)) { in ParsePointerToMemberType()
1837 state->parse_state = copy; in ParsePointerToMemberType()
1845 static bool ParseTemplateParam(State *state) { in ParseTemplateParam() argument
1846 ComplexityGuard guard(state); in ParseTemplateParam()
1848 if (ParseTwoCharToken(state, "T_")) { in ParseTemplateParam()
1849 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1853 ParseState copy = state->parse_state; in ParseTemplateParam()
1854 if (ParseOneCharToken(state, 'T') && ParseNumber(state, nullptr) && in ParseTemplateParam()
1855 ParseOneCharToken(state, '_')) { in ParseTemplateParam()
1856 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1859 state->parse_state = copy; in ParseTemplateParam()
1861 if (ParseTwoCharToken(state, "TL") && ParseNumber(state, nullptr)) { in ParseTemplateParam()
1862 if (ParseTwoCharToken(state, "__")) { in ParseTemplateParam()
1863 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1867 if (ParseOneCharToken(state, '_') && ParseNumber(state, nullptr) && in ParseTemplateParam()
1868 ParseOneCharToken(state, '_')) { in ParseTemplateParam()
1869 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1873 state->parse_state = copy; in ParseTemplateParam()
1887 static bool ParseTemplateParamDecl(State *state) { in ParseTemplateParamDecl() argument
1888 ComplexityGuard guard(state); in ParseTemplateParamDecl()
1890 ParseState copy = state->parse_state; in ParseTemplateParamDecl()
1892 if (ParseTwoCharToken(state, "Ty")) { in ParseTemplateParamDecl()
1895 state->parse_state = copy; in ParseTemplateParamDecl()
1897 if (ParseTwoCharToken(state, "Tk") && ParseName(state) && in ParseTemplateParamDecl()
1898 Optional(ParseTemplateArgs(state))) { in ParseTemplateParamDecl()
1901 state->parse_state = copy; in ParseTemplateParamDecl()
1903 if (ParseTwoCharToken(state, "Tn") && ParseType(state)) { in ParseTemplateParamDecl()
1906 state->parse_state = copy; in ParseTemplateParamDecl()
1908 if (ParseTwoCharToken(state, "Tt") && in ParseTemplateParamDecl()
1909 ZeroOrMore(ParseTemplateParamDecl, state) && in ParseTemplateParamDecl()
1910 ParseOneCharToken(state, 'E')) { in ParseTemplateParamDecl()
1913 state->parse_state = copy; in ParseTemplateParamDecl()
1915 if (ParseTwoCharToken(state, "Tp") && ParseTemplateParamDecl(state)) { in ParseTemplateParamDecl()
1918 state->parse_state = copy; in ParseTemplateParamDecl()
1925 static bool ParseTemplateTemplateParam(State *state) { in ParseTemplateTemplateParam() argument
1926 ComplexityGuard guard(state); in ParseTemplateTemplateParam()
1928 return (ParseTemplateParam(state) || in ParseTemplateTemplateParam()
1930 ParseSubstitution(state, /*accept_std=*/false)); in ParseTemplateTemplateParam()
1934 static bool ParseTemplateArgs(State *state) { in ParseTemplateArgs() argument
1935 ComplexityGuard guard(state); in ParseTemplateArgs()
1937 ParseState copy = state->parse_state; in ParseTemplateArgs()
1938 DisableAppend(state); in ParseTemplateArgs()
1939 if (ParseOneCharToken(state, 'I') && OneOrMore(ParseTemplateArg, state) && in ParseTemplateArgs()
1940 Optional(ParseQRequiresClauseExpr(state)) && in ParseTemplateArgs()
1941 ParseOneCharToken(state, 'E')) { in ParseTemplateArgs()
1942 RestoreAppend(state, copy.append); in ParseTemplateArgs()
1943 MaybeAppend(state, "<>"); in ParseTemplateArgs()
1946 state->parse_state = copy; in ParseTemplateArgs()
1955 static bool ParseTemplateArg(State *state) { in ParseTemplateArg() argument
1956 ComplexityGuard guard(state); in ParseTemplateArg()
1958 ParseState copy = state->parse_state; in ParseTemplateArg()
1959 if (ParseOneCharToken(state, 'J') && ZeroOrMore(ParseTemplateArg, state) && in ParseTemplateArg()
1960 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1963 state->parse_state = copy; in ParseTemplateArg()
2033 if (ParseLocalSourceName(state) && Optional(ParseTemplateArgs(state))) { in ParseTemplateArg()
2034 copy = state->parse_state; in ParseTemplateArg()
2035 if (ParseExprCastValueAndTrailingE(state)) { in ParseTemplateArg()
2038 state->parse_state = copy; in ParseTemplateArg()
2044 if (ParseType(state) || ParseExprPrimary(state)) { in ParseTemplateArg()
2047 state->parse_state = copy; in ParseTemplateArg()
2049 if (ParseOneCharToken(state, 'X') && ParseExpression(state) && in ParseTemplateArg()
2050 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
2053 state->parse_state = copy; in ParseTemplateArg()
2055 if (ParseTemplateParamDecl(state) && ParseTemplateArg(state)) { in ParseTemplateArg()
2058 state->parse_state = copy; in ParseTemplateArg()
2066 static inline bool ParseUnresolvedType(State *state) { in ParseUnresolvedType() argument
2068 return (ParseTemplateParam(state) && Optional(ParseTemplateArgs(state))) || in ParseUnresolvedType()
2069 ParseDecltype(state) || ParseSubstitution(state, /*accept_std=*/false); in ParseUnresolvedType()
2073 static inline bool ParseSimpleId(State *state) { in ParseSimpleId() argument
2078 return ParseSourceName(state) && Optional(ParseTemplateArgs(state)); in ParseSimpleId()
2084 static bool ParseBaseUnresolvedName(State *state) { in ParseBaseUnresolvedName() argument
2085 ComplexityGuard guard(state); in ParseBaseUnresolvedName()
2088 if (ParseSimpleId(state)) { in ParseBaseUnresolvedName()
2092 ParseState copy = state->parse_state; in ParseBaseUnresolvedName()
2093 if (ParseTwoCharToken(state, "on") && ParseOperatorName(state, nullptr) && in ParseBaseUnresolvedName()
2094 Optional(ParseTemplateArgs(state))) { in ParseBaseUnresolvedName()
2097 state->parse_state = copy; in ParseBaseUnresolvedName()
2099 if (ParseTwoCharToken(state, "dn") && in ParseBaseUnresolvedName()
2100 (ParseUnresolvedType(state) || ParseSimpleId(state))) { in ParseBaseUnresolvedName()
2103 state->parse_state = copy; in ParseBaseUnresolvedName()
2121 static bool ParseUnresolvedName(State *state) { in ParseUnresolvedName() argument
2122 ComplexityGuard guard(state); in ParseUnresolvedName()
2125 ParseState copy = state->parse_state; in ParseUnresolvedName()
2126 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseUnresolvedName()
2127 ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
2130 state->parse_state = copy; in ParseUnresolvedName()
2132 if (ParseTwoCharToken(state, "sr") && ParseUnresolvedType(state) && in ParseUnresolvedName()
2133 ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
2136 state->parse_state = copy; in ParseUnresolvedName()
2138 if (ParseTwoCharToken(state, "sr") && ParseOneCharToken(state, 'N') && in ParseUnresolvedName()
2139 ParseUnresolvedType(state) && in ParseUnresolvedName()
2140 OneOrMore(ParseUnresolvedQualifierLevel, state) && in ParseUnresolvedName()
2141 ParseOneCharToken(state, 'E') && ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
2144 state->parse_state = copy; in ParseUnresolvedName()
2146 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseUnresolvedName()
2147 ParseTwoCharToken(state, "sr") && in ParseUnresolvedName()
2148 OneOrMore(ParseUnresolvedQualifierLevel, state) && in ParseUnresolvedName()
2149 ParseOneCharToken(state, 'E') && ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
2152 state->parse_state = copy; in ParseUnresolvedName()
2154 if (ParseTwoCharToken(state, "sr") && ParseTwoCharToken(state, "St") && in ParseUnresolvedName()
2155 ParseSimpleId(state) && ParseSimpleId(state)) { in ParseUnresolvedName()
2158 state->parse_state = copy; in ParseUnresolvedName()
2171 static bool ParseUnresolvedQualifierLevel(State *state) { in ParseUnresolvedQualifierLevel() argument
2172 ComplexityGuard guard(state); in ParseUnresolvedQualifierLevel()
2175 if (ParseSimpleId(state)) return true; in ParseUnresolvedQualifierLevel()
2177 ParseState copy = state->parse_state; in ParseUnresolvedQualifierLevel()
2178 if (ParseSubstitution(state, /*accept_std=*/false) && in ParseUnresolvedQualifierLevel()
2179 ParseTemplateArgs(state)) { in ParseUnresolvedQualifierLevel()
2182 state->parse_state = copy; in ParseUnresolvedQualifierLevel()
2189 static bool ParseUnionSelector(State *state) { in ParseUnionSelector() argument
2190 return ParseOneCharToken(state, '_') && Optional(ParseNumber(state, nullptr)); in ParseUnionSelector()
2198 static bool ParseFunctionParam(State *state) { in ParseFunctionParam() argument
2199 ComplexityGuard guard(state); in ParseFunctionParam()
2202 ParseState copy = state->parse_state; in ParseFunctionParam()
2205 if (ParseTwoCharToken(state, "fp") && Optional(ParseCVQualifiers(state)) && in ParseFunctionParam()
2206 Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { in ParseFunctionParam()
2209 state->parse_state = copy; in ParseFunctionParam()
2212 if (ParseTwoCharToken(state, "fL") && Optional(ParseNumber(state, nullptr)) && in ParseFunctionParam()
2213 ParseOneCharToken(state, 'p') && Optional(ParseCVQualifiers(state)) && in ParseFunctionParam()
2214 Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { in ParseFunctionParam()
2217 state->parse_state = copy; in ParseFunctionParam()
2219 return ParseThreeCharToken(state, "fpT"); in ParseFunctionParam()
2226 static bool ParseBracedExpression(State *state) { in ParseBracedExpression() argument
2227 ComplexityGuard guard(state); in ParseBracedExpression()
2230 ParseState copy = state->parse_state; in ParseBracedExpression()
2232 if (ParseTwoCharToken(state, "di") && ParseSourceName(state) && in ParseBracedExpression()
2233 ParseBracedExpression(state)) { in ParseBracedExpression()
2236 state->parse_state = copy; in ParseBracedExpression()
2238 if (ParseTwoCharToken(state, "dx") && ParseExpression(state) && in ParseBracedExpression()
2239 ParseBracedExpression(state)) { in ParseBracedExpression()
2242 state->parse_state = copy; in ParseBracedExpression()
2244 if (ParseTwoCharToken(state, "dX") && in ParseBracedExpression()
2245 ParseExpression(state) && ParseExpression(state) && in ParseBracedExpression()
2246 ParseBracedExpression(state)) { in ParseBracedExpression()
2249 state->parse_state = copy; in ParseBracedExpression()
2251 return ParseExpression(state); in ParseBracedExpression()
2302 static bool ParseExpression(State *state) { in ParseExpression() argument
2303 ComplexityGuard guard(state); in ParseExpression()
2305 if (ParseTemplateParam(state) || ParseExprPrimary(state)) { in ParseExpression()
2309 ParseState copy = state->parse_state; in ParseExpression()
2312 if (ParseTwoCharToken(state, "cl") && OneOrMore(ParseExpression, state) && in ParseExpression()
2313 ParseOneCharToken(state, 'E')) { in ParseExpression()
2316 state->parse_state = copy; in ParseExpression()
2320 if ((ParseThreeCharToken(state, "pp_") || in ParseExpression()
2321 ParseThreeCharToken(state, "mm_")) && in ParseExpression()
2322 ParseExpression(state)) { in ParseExpression()
2325 state->parse_state = copy; in ParseExpression()
2329 if (ParseTwoCharToken(state, "cp") && ParseSimpleId(state) && in ParseExpression()
2330 ZeroOrMore(ParseExpression, state) && ParseOneCharToken(state, 'E')) { in ParseExpression()
2333 state->parse_state = copy; in ParseExpression()
2338 if (ParseTwoCharToken(state, "so") && ParseType(state) && in ParseExpression()
2339 ParseExpression(state) && Optional(ParseNumber(state, nullptr)) && in ParseExpression()
2340 ZeroOrMore(ParseUnionSelector, state) && in ParseExpression()
2341 Optional(ParseOneCharToken(state, 'p')) && in ParseExpression()
2342 ParseOneCharToken(state, 'E')) { in ParseExpression()
2345 state->parse_state = copy; in ParseExpression()
2348 if (ParseFunctionParam(state)) return true; in ParseExpression()
2349 state->parse_state = copy; in ParseExpression()
2352 if (ParseTwoCharToken(state, "tl") && ParseType(state) && in ParseExpression()
2353 ZeroOrMore(ParseBracedExpression, state) && in ParseExpression()
2354 ParseOneCharToken(state, 'E')) { in ParseExpression()
2357 state->parse_state = copy; in ParseExpression()
2360 if (ParseTwoCharToken(state, "il") && in ParseExpression()
2361 ZeroOrMore(ParseBracedExpression, state) && in ParseExpression()
2362 ParseOneCharToken(state, 'E')) { in ParseExpression()
2365 state->parse_state = copy; in ParseExpression()
2371 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseExpression()
2372 (ParseTwoCharToken(state, "nw") || ParseTwoCharToken(state, "na")) && in ParseExpression()
2373 ZeroOrMore(ParseExpression, state) && ParseOneCharToken(state, '_') && in ParseExpression()
2374 ParseType(state) && in ParseExpression()
2375 (ParseOneCharToken(state, 'E') || ParseInitializer(state))) { in ParseExpression()
2378 state->parse_state = copy; in ParseExpression()
2382 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseExpression()
2383 (ParseTwoCharToken(state, "dl") || ParseTwoCharToken(state, "da")) && in ParseExpression()
2384 ParseExpression(state)) { in ParseExpression()
2387 state->parse_state = copy; in ParseExpression()
2392 if (ParseCharClass(state, "dscr") && ParseOneCharToken(state, 'c') && in ParseExpression()
2393 ParseType(state) && ParseExpression(state)) { in ParseExpression()
2396 state->parse_state = copy; in ParseExpression()
2406 if (ParseTwoCharToken(state, "cv")) { in ParseExpression()
2407 if (ParseType(state)) { in ParseExpression()
2408 ParseState copy2 = state->parse_state; in ParseExpression()
2409 if (ParseOneCharToken(state, '_') && ZeroOrMore(ParseExpression, state) && in ParseExpression()
2410 ParseOneCharToken(state, 'E')) { in ParseExpression()
2413 state->parse_state = copy2; in ParseExpression()
2414 if (ParseExpression(state)) { in ParseExpression()
2425 if (ParseOperatorName(state, &arity) && in ParseExpression()
2427 (arity < 3 || ParseExpression(state)) && in ParseExpression()
2428 (arity < 2 || ParseExpression(state)) && in ParseExpression()
2429 (arity < 1 || ParseExpression(state))) { in ParseExpression()
2433 state->parse_state = copy; in ParseExpression()
2436 if (ParseTwoCharToken(state, "ti") && ParseType(state)) { in ParseExpression()
2439 state->parse_state = copy; in ParseExpression()
2442 if (ParseTwoCharToken(state, "te") && ParseExpression(state)) { in ParseExpression()
2445 state->parse_state = copy; in ParseExpression()
2448 if (ParseTwoCharToken(state, "st") && ParseType(state)) { in ParseExpression()
2451 state->parse_state = copy; in ParseExpression()
2454 if (ParseTwoCharToken(state, "at") && ParseType(state)) { in ParseExpression()
2457 state->parse_state = copy; in ParseExpression()
2460 if (ParseTwoCharToken(state, "az") && ParseExpression(state)) { in ParseExpression()
2463 state->parse_state = copy; in ParseExpression()
2466 if (ParseTwoCharToken(state, "nx") && ParseExpression(state)) { in ParseExpression()
2469 state->parse_state = copy; in ParseExpression()
2475 if (ParseTwoCharToken(state, "sZ") && in ParseExpression()
2476 (ParseFunctionParam(state) || ParseTemplateParam(state))) { in ParseExpression()
2479 state->parse_state = copy; in ParseExpression()
2484 if (ParseTwoCharToken(state, "sP") && ZeroOrMore(ParseTemplateArg, state) && in ParseExpression()
2485 ParseOneCharToken(state, 'E')) { in ParseExpression()
2488 state->parse_state = copy; in ParseExpression()
2494 if ((ParseTwoCharToken(state, "fl") || ParseTwoCharToken(state, "fr")) && in ParseExpression()
2495 ParseOperatorName(state, nullptr) && ParseExpression(state)) { in ParseExpression()
2498 state->parse_state = copy; in ParseExpression()
2504 if ((ParseTwoCharToken(state, "fL") || ParseTwoCharToken(state, "fR")) && in ParseExpression()
2505 ParseOperatorName(state, nullptr) && ParseExpression(state) && in ParseExpression()
2506 ParseExpression(state)) { in ParseExpression()
2509 state->parse_state = copy; in ParseExpression()
2512 if (ParseTwoCharToken(state, "tw") && ParseExpression(state)) { in ParseExpression()
2515 state->parse_state = copy; in ParseExpression()
2518 if (ParseTwoCharToken(state, "tr")) return true; in ParseExpression()
2523 if ((ParseTwoCharToken(state, "dt") || ParseTwoCharToken(state, "pt")) && in ParseExpression()
2524 ParseExpression(state) && ParseUnresolvedName(state)) { in ParseExpression()
2527 state->parse_state = copy; in ParseExpression()
2532 if (ParseTwoCharToken(state, "ds") && ParseExpression(state) && in ParseExpression()
2533 ParseExpression(state)) { in ParseExpression()
2536 state->parse_state = copy; in ParseExpression()
2539 if (ParseTwoCharToken(state, "sp") && ParseExpression(state)) { in ParseExpression()
2542 state->parse_state = copy; in ParseExpression()
2545 if (ParseOneCharToken(state, 'u') && ParseSourceName(state) && in ParseExpression()
2546 ZeroOrMore(ParseTemplateArg, state) && ParseOneCharToken(state, 'E')) { in ParseExpression()
2549 state->parse_state = copy; in ParseExpression()
2554 if (ParseTwoCharToken(state, "rq") && OneOrMore(ParseRequirement, state) && in ParseExpression()
2555 ParseOneCharToken(state, 'E')) { in ParseExpression()
2558 state->parse_state = copy; in ParseExpression()
2563 if (ParseTwoCharToken(state, "rQ") && ParseBareFunctionType(state) && in ParseExpression()
2564 ParseOneCharToken(state, '_') && OneOrMore(ParseRequirement, state) && in ParseExpression()
2565 ParseOneCharToken(state, 'E')) { in ParseExpression()
2568 state->parse_state = copy; in ParseExpression()
2570 return ParseUnresolvedName(state); in ParseExpression()
2579 static bool ParseInitializer(State *state) { in ParseInitializer() argument
2580 ComplexityGuard guard(state); in ParseInitializer()
2582 ParseState copy = state->parse_state; in ParseInitializer()
2584 if (ParseTwoCharToken(state, "pi") && ZeroOrMore(ParseExpression, state) && in ParseInitializer()
2585 ParseOneCharToken(state, 'E')) { in ParseInitializer()
2588 state->parse_state = copy; in ParseInitializer()
2590 if (ParseTwoCharToken(state, "il") && in ParseInitializer()
2591 ZeroOrMore(ParseBracedExpression, state) && in ParseInitializer()
2592 ParseOneCharToken(state, 'E')) { in ParseInitializer()
2595 state->parse_state = copy; in ParseInitializer()
2625 static bool ParseExprPrimary(State *state) { in ParseExprPrimary() argument
2626 ComplexityGuard guard(state); in ParseExprPrimary()
2628 ParseState copy = state->parse_state; in ParseExprPrimary()
2632 if (ParseTwoCharToken(state, "LZ")) { in ParseExprPrimary()
2633 if (ParseEncoding(state) && ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
2637 state->parse_state = copy; in ParseExprPrimary()
2641 if (ParseOneCharToken(state, 'L')) { in ParseExprPrimary()
2646 if (ParseThreeCharToken(state, "DnE")) return true; in ParseExprPrimary()
2660 if (RemainingInput(state)[0] == 'A' /* an array type follows */) { in ParseExprPrimary() local
2661 if (ParseType(state) && ParseOneCharToken(state, 'E')) return true; in ParseExprPrimary()
2662 state->parse_state = copy; in ParseExprPrimary()
2667 if (ParseType(state) && ParseExprCastValueAndTrailingE(state)) { in ParseExprPrimary()
2671 state->parse_state = copy; in ParseExprPrimary()
2673 if (ParseOneCharToken(state, 'L') && ParseMangledName(state) && in ParseExprPrimary()
2674 ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
2677 state->parse_state = copy; in ParseExprPrimary()
2683 static bool ParseExprCastValueAndTrailingE(State *state) { in ParseExprCastValueAndTrailingE() argument
2684 ComplexityGuard guard(state); in ParseExprCastValueAndTrailingE()
2689 ParseState copy = state->parse_state; in ParseExprCastValueAndTrailingE()
2690 if (ParseNumber(state, nullptr) && ParseOneCharToken(state, 'E')) { in ParseExprCastValueAndTrailingE()
2693 state->parse_state = copy; in ParseExprCastValueAndTrailingE()
2695 if (ParseFloatNumber(state)) { in ParseExprCastValueAndTrailingE()
2697 if (ParseOneCharToken(state, 'E')) return true; in ParseExprCastValueAndTrailingE()
2700 if (ParseOneCharToken(state, '_') && ParseFloatNumber(state) && in ParseExprCastValueAndTrailingE()
2701 ParseOneCharToken(state, 'E')) { in ParseExprCastValueAndTrailingE()
2705 state->parse_state = copy; in ParseExprCastValueAndTrailingE()
2727 static bool ParseQRequiresClauseExpr(State *state) { in ParseQRequiresClauseExpr() argument
2728 ComplexityGuard guard(state); in ParseQRequiresClauseExpr()
2730 ParseState copy = state->parse_state; in ParseQRequiresClauseExpr()
2731 DisableAppend(state); in ParseQRequiresClauseExpr()
2734 if (ParseOneCharToken(state, 'Q') && ParseExpression(state)) { in ParseQRequiresClauseExpr()
2735 RestoreAppend(state, copy.append); in ParseQRequiresClauseExpr()
2740 state->parse_state = copy; in ParseQRequiresClauseExpr()
2751 static bool ParseRequirement(State *state) { in ParseRequirement() argument
2752 ComplexityGuard guard(state); in ParseRequirement()
2755 ParseState copy = state->parse_state; in ParseRequirement()
2757 if (ParseOneCharToken(state, 'X') && ParseExpression(state) && in ParseRequirement()
2758 Optional(ParseOneCharToken(state, 'N')) && in ParseRequirement()
2761 (!ParseOneCharToken(state, 'R') || ParseTypeConstraint(state))) { in ParseRequirement()
2764 state->parse_state = copy; in ParseRequirement()
2766 if (ParseOneCharToken(state, 'T') && ParseType(state)) return true; in ParseRequirement()
2767 state->parse_state = copy; in ParseRequirement()
2769 if (ParseOneCharToken(state, 'Q') && ParseExpression(state)) return true; in ParseRequirement()
2770 state->parse_state = copy; in ParseRequirement()
2776 static bool ParseTypeConstraint(State *state) { in ParseTypeConstraint() argument
2777 return ParseName(state); in ParseTypeConstraint()
2791 static bool ParseLocalNameSuffix(State *state) { in ParseLocalNameSuffix() argument
2792 ComplexityGuard guard(state); in ParseLocalNameSuffix()
2794 ParseState copy = state->parse_state; in ParseLocalNameSuffix()
2797 if (ParseOneCharToken(state, 'd') && in ParseLocalNameSuffix()
2798 (IsDigit(RemainingInput(state)[0]) || RemainingInput(state)[0] == '_')) { in ParseLocalNameSuffix()
2800 Optional(ParseNumber(state, &number)); in ParseLocalNameSuffix()
2811 MaybeAppend(state, "::{default arg#"); in ParseLocalNameSuffix()
2812 MaybeAppendDecimal(state, number); in ParseLocalNameSuffix()
2813 MaybeAppend(state, "}::"); in ParseLocalNameSuffix()
2814 if (ParseOneCharToken(state, '_') && ParseName(state)) return true; in ParseLocalNameSuffix()
2818 state->parse_state = copy; in ParseLocalNameSuffix()
2819 if (state->parse_state.append) { in ParseLocalNameSuffix()
2820 state->out[state->parse_state.out_cur_idx] = '\0'; in ParseLocalNameSuffix()
2824 state->parse_state = copy; in ParseLocalNameSuffix()
2827 if (MaybeAppend(state, "::") && ParseName(state) && in ParseLocalNameSuffix()
2828 Optional(ParseDiscriminator(state))) { in ParseLocalNameSuffix()
2831 state->parse_state = copy; in ParseLocalNameSuffix()
2832 if (state->parse_state.append) { in ParseLocalNameSuffix()
2833 state->out[state->parse_state.out_cur_idx] = '\0'; in ParseLocalNameSuffix()
2837 return ParseOneCharToken(state, 's') && Optional(ParseDiscriminator(state)); in ParseLocalNameSuffix()
2840 static bool ParseLocalName(State *state) { in ParseLocalName() argument
2841 ComplexityGuard guard(state); in ParseLocalName()
2843 ParseState copy = state->parse_state; in ParseLocalName()
2844 if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) && in ParseLocalName()
2845 ParseOneCharToken(state, 'E') && ParseLocalNameSuffix(state)) { in ParseLocalName()
2848 state->parse_state = copy; in ParseLocalName()
2854 static bool ParseDiscriminator(State *state) { in ParseDiscriminator() argument
2855 ComplexityGuard guard(state); in ParseDiscriminator()
2857 ParseState copy = state->parse_state; in ParseDiscriminator()
2860 if (!ParseOneCharToken(state, '_')) return false; in ParseDiscriminator()
2863 if (ParseDigit(state, nullptr)) return true; in ParseDiscriminator()
2866 if (ParseOneCharToken(state, '_') && ParseNumber(state, nullptr) && in ParseDiscriminator()
2867 ParseOneCharToken(state, '_')) { in ParseDiscriminator()
2870 state->parse_state = copy; in ParseDiscriminator()
2885 static bool ParseSubstitution(State *state, bool accept_std) { in ParseSubstitution() argument
2886 ComplexityGuard guard(state); in ParseSubstitution()
2888 if (ParseTwoCharToken(state, "S_")) { in ParseSubstitution()
2889 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
2893 ParseState copy = state->parse_state; in ParseSubstitution()
2894 if (ParseOneCharToken(state, 'S') && ParseSeqId(state) && in ParseSubstitution()
2895 ParseOneCharToken(state, '_')) { in ParseSubstitution()
2896 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
2899 state->parse_state = copy; in ParseSubstitution()
2902 if (ParseOneCharToken(state, 'S')) { in ParseSubstitution()
2905 if (RemainingInput(state)[0] == p->abbrev[1] && in ParseSubstitution()
2907 MaybeAppend(state, "std"); in ParseSubstitution()
2909 MaybeAppend(state, "::"); in ParseSubstitution()
2910 MaybeAppend(state, p->real_name); in ParseSubstitution()
2912 ++state->parse_state.mangled_idx; in ParseSubstitution()
2913 UpdateHighWaterMark(state); in ParseSubstitution()
2918 state->parse_state = copy; in ParseSubstitution()
2924 static bool ParseTopLevelMangledName(State *state) { in ParseTopLevelMangledName() argument
2925 ComplexityGuard guard(state); in ParseTopLevelMangledName()
2927 if (ParseMangledName(state)) { in ParseTopLevelMangledName()
2928 if (RemainingInput(state)[0] != '\0') { in ParseTopLevelMangledName() local
2930 if (IsFunctionCloneSuffix(RemainingInput(state))) { in ParseTopLevelMangledName()
2935 if (RemainingInput(state)[0] == '@') { in ParseTopLevelMangledName() local
2936 MaybeAppend(state, RemainingInput(state)); in ParseTopLevelMangledName()
2939 ReportHighWaterMark(state); in ParseTopLevelMangledName()
2945 ReportHighWaterMark(state); in ParseTopLevelMangledName()
2949 static bool Overflowed(const State *state) { in Overflowed() argument
2950 return state->parse_state.out_cur_idx >= state->out_end_idx; in Overflowed()
2959 State state; in Demangle() local
2960 InitState(&state, mangled, out, out_size); in Demangle()
2961 return ParseTopLevelMangledName(&state) && !Overflowed(&state) && in Demangle()
2962 state.parse_state.out_cur_idx > 0; in Demangle()