16#ifndef DEMANGLE_ITANIUMDEMANGLE_H
17#define DEMANGLE_ITANIUMDEMANGLE_H
35#pragma clang diagnostic push
36#pragma clang diagnostic ignored "-Wunused-template"
42 static_assert(std::is_trivially_copyable<T>::value,
43 "T is required to be a trivially copyable type");
44 static_assert(std::is_trivially_default_constructible<T>::value,
45 "T is required to be trivially default constructible");
51 bool isInline()
const {
return First == Inline; }
59 void reserve(
size_t NewCap) {
62 auto *Tmp =
static_cast<T *
>(std::malloc(NewCap *
sizeof(
T)));
65 std::copy(First, Last, Tmp);
68 First =
static_cast<T *
>(std::realloc(First, NewCap *
sizeof(
T)));
83 if (
Other.isInline()) {
85 Last = First +
Other.size();
97 if (
Other.isInline()) {
103 Last = First +
Other.size();
138 Last = First +
Index;
144 bool empty()
const {
return First == Last; }
145 size_t size()
const {
return static_cast<size_t>(Last - First); }
169#define NODE(NodeKind) K##NodeKind,
170#include "ItaniumNodes.def"
232 template<
typename Fn>
void visit(Fn
F)
const;
276 bool StrictlyWorse =
false)
const {
289 OB.printRight(*
this);
334 : Elements(Elements_), NumElements(NumElements_) {}
336 bool empty()
const {
return NumElements == 0; }
337 size_t size()
const {
return NumElements; }
340 Node **
end()
const {
return Elements + NumElements; }
345 bool FirstElement =
true;
346 for (
size_t Idx = 0;
Idx != NumElements; ++
Idx) {
347 size_t BeforeComma = OB.getCurrentPosition();
350 size_t AfterComma = OB.getCurrentPosition();
355 if (AfterComma == OB.getCurrentPosition()) {
356 OB.setCurrentPosition(BeforeComma);
360 FirstElement =
false;
380 const std::string_view Suffix;
384 :
Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {}
386 template<
typename Fn>
void match(Fn
F)
const {
F(Prefix, Suffix); }
398 std::string_view Ext;
403 :
Node(KVendorExtQualType), Ty(Ty_), Ext(Ext_), TA(TA_) {}
406 std::string_view
getExt()
const {
return Ext; }
409 template <
typename Fn>
void match(Fn
F)
const {
F(Ty, Ext, TA); }
473 OB.printLeft(*
Child);
485 :
Node(KConversionOperatorType), Ty(Ty_) {}
487 template<
typename Fn>
void match(Fn
F)
const {
F(Ty); }
497 const std::string_view Postfix;
501 :
Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {}
503 template<
typename Fn>
void match(Fn
F)
const {
F(Ty, Postfix); }
512 const std::string_view Name;
517 template<
typename Fn>
void match(Fn
F)
const {
F(Name); }
519 std::string_view
getName()
const {
return Name; }
531 :
Node(KBitIntType), Size(Size_), Signed(Signed_) {}
533 template <
typename Fn>
void match(Fn
F)
const {
F(Size, Signed); }
540 Size->printAsOperand(OB);
546 std::string_view
Kind;
550 :
Node(KElaboratedTypeSpefType),
Kind(Kind_), Child(Child_) {}
562 std::string_view Transform;
566 :
Node(KTransformedType), Transform(Transform_),
BaseType(BaseType_) {}
603 :
Node(KEnableIfAttr), Conditions(Conditions_) {}
605 template<
typename Fn>
void match(Fn
F)
const {
F(Conditions); }
608 OB +=
" [enable_if:";
616 std::string_view Protocol;
620 :
Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {}
622 template<
typename Fn>
void match(Fn
F)
const {
F(Ty, Protocol); }
625 return Ty->
getKind() == KNameType &&
649 template<
typename Fn>
void match(Fn
F)
const {
F(Pointee); }
652 return Pointee->hasRHSComponent(OB);
657 if (Pointee->getKind() != KObjCProtoName ||
659 OB.printLeft(*Pointee);
660 if (Pointee->hasArray(OB))
662 if (Pointee->hasArray(OB) || Pointee->hasFunction(OB))
666 const auto *objcProto =
static_cast<const ObjCProtoName *
>(Pointee);
668 OB += objcProto->getProtocol();
674 if (Pointee->getKind() != KObjCProtoName ||
676 if (Pointee->hasArray(OB) || Pointee->hasFunction(OB))
678 OB.printRight(*Pointee);
693 mutable bool Printing =
false;
702 std::pair<ReferenceKind, const Node *> collapse(
OutputBuffer &OB)
const {
703 auto SoFar = std::make_pair(RK, Pointee);
709 if (SN->
getKind() != KReferenceType)
712 SoFar.second = RT->Pointee;
713 SoFar.first = std::min(SoFar.first, RT->RK);
717 if (Prev.
size() > 1 && SoFar.second == Prev[(Prev.
size() - 1) / 2]) {
719 SoFar.second =
nullptr;
729 Pointee(Pointee_), RK(RK_) {}
731 template<
typename Fn>
void match(Fn
F)
const {
F(Pointee, RK); }
741 std::pair<ReferenceKind, const Node *> Collapsed = collapse(OB);
742 if (!Collapsed.second)
744 OB.printLeft(*Collapsed.second);
745 if (Collapsed.second->hasArray(OB))
747 if (Collapsed.second->hasArray(OB) || Collapsed.second->hasFunction(OB))
750 OB += (Collapsed.first == ReferenceKind::LValue ?
"&" :
"&&");
756 std::pair<ReferenceKind, const Node *> Collapsed = collapse(OB);
757 if (!Collapsed.second)
759 if (Collapsed.second->hasArray(OB) || Collapsed.second->hasFunction(OB))
761 OB.printRight(*Collapsed.second);
766 const Node *ClassType;
767 const Node *MemberType;
772 ClassType(ClassType_), MemberType(MemberType_) {}
774 template<
typename Fn>
void match(Fn
F)
const {
F(ClassType, MemberType); }
781 OB.printLeft(*MemberType);
786 ClassType->print(OB);
793 OB.printRight(*MemberType);
806 Base(Base_), Dimension(Dimension_) {}
808 template<
typename Fn>
void match(Fn
F)
const {
F(Base, Dimension); }
816 if (OB.back() !=
']')
820 Dimension->print(OB);
822 OB.printRight(*Base);
826 const NodeArray &Elements)
const override {
827 if (Base->getKind() == KNameType &&
829 return Elements.printAsString(OB);
840 const Node *ExceptionSpec;
845 :
Node(KFunctionType,
848 Ret(Ret_), Params(Params_), CVQuals(CVQuals_), RefQual(RefQual_),
849 ExceptionSpec(ExceptionSpec_) {}
851 template<
typename Fn>
void match(Fn
F)
const {
852 F(Ret, Params, CVQuals, RefQual, ExceptionSpec);
888 if (ExceptionSpec !=
nullptr) {
890 ExceptionSpec->
print(OB);
900 template<
typename Fn>
void match(Fn
F)
const {
F(E); }
914 :
Node(KDynamicExceptionSpec), Types(Types_) {}
916 template<
typename Fn>
void match(Fn
F)
const {
F(Types); }
921 Types.printWithComma(OB);
938 :
Node(KExplicitObjectParameter), Base(Base_) {
941 "Creating an ExplicitObjectParameter without a valid Base Node.");
944 template <
typename Fn>
void match(Fn
F)
const {
F(Base); }
957 const Node *Requires;
963 const Node *Attrs_,
const Node *Requires_,
965 :
Node(KFunctionEncoding,
968 Ret(Ret_), Name(Name_), Params(Params_), Attrs(Attrs_),
969 Requires(Requires_), CVQuals(CVQuals_), RefQual(RefQual_) {}
971 template<
typename Fn>
void match(Fn
F)
const {
972 F(Ret, Name, Params, Attrs, Requires, CVQuals, RefQual);
990 if (!Ret->hasRHSComponent(OB))
1003 OB.printRight(*Ret);
1017 if (Attrs !=
nullptr)
1020 if (Requires !=
nullptr) {
1022 Requires->
print(OB);
1037 OB +=
"operator\"\" ";
1043 const std::string_view Special;
1048 :
Node(KSpecialName), Special(Special_), Child(Child_) {}
1050 template<
typename Fn>
void match(Fn
F)
const {
F(Special, Child); }
1059 const Node *FirstType;
1060 const Node *SecondType;
1064 :
Node(KCtorVtableSpecialName),
1065 FirstType(FirstType_), SecondType(SecondType_) {}
1067 template<
typename Fn>
void match(Fn
F)
const {
F(FirstType, SecondType); }
1070 OB +=
"construction vtable for ";
1071 FirstType->print(OB);
1073 SecondType->
print(OB);
1100 :
Node(KMemberLikeFriendName),
Qual(Qual_),
Name(Name_) {}
1122 template <
typename Fn>
void match(Fn
F)
const {
1171 const Node *Qualifier;
1176 :
Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {}
1178 template<
typename Fn>
void match(Fn
F)
const {
F(Qualifier, Name); }
1180 std::string_view
getBaseName()
const override {
return Name->getBaseName(); }
1183 Qualifier->print(OB);
1191 const Node *Dimension;
1195 :
Node(KVectorType),
BaseType(BaseType_), Dimension(Dimension_) {}
1206 Dimension->print(OB);
1212 const Node *Dimension;
1216 :
Node(KPixelVectorType), Dimension(Dimension_) {}
1218 template<
typename Fn>
void match(Fn
F)
const {
F(Dimension); }
1222 OB +=
"pixel vector[";
1223 Dimension->print(OB);
1229 const Node *Dimension;
1233 :
Node(KBinaryFPType), Dimension(Dimension_) {}
1235 template<
typename Fn>
void match(Fn
F)
const {
F(Dimension); }
1239 Dimension->print(OB);
1257 :
Node(KSyntheticTemplateParamName),
Kind(Kind_), Index(Index_) {}
1263 case TemplateParamKind::Type:
1266 case TemplateParamKind::NonType:
1269 case TemplateParamKind::Template:
1284 :
Node(KTemplateParamQualifiedArg), Param(Param_), Arg(Arg_) {}
1286 template <
typename Fn>
void match(Fn
F)
const {
F(Param, Arg); }
1302 :
Node(KTypeTemplateParamDecl,
Cache::
Yes), Name(Name_) {}
1304 template<
typename Fn>
void match(Fn
F)
const {
F(Name); }
1319 Constraint(Constraint_), Name(Name_) {}
1321 template<
typename Fn>
void match(Fn
F)
const {
F(Constraint, Name); }
1324 Constraint->print(OB);
1338 :
Node(KNonTypeTemplateParamDecl,
Cache::
Yes), Name(Name_), Type(Type_) {}
1340 template<
typename Fn>
void match(Fn
F)
const {
F(Name, Type); }
1343 OB.printLeft(*Type);
1344 if (!Type->hasRHSComponent(OB))
1350 OB.printRight(*Type);
1363 :
Node(KTemplateTemplateParamDecl,
Cache::
Yes), Name(Name_),
1364 Params(Params_), Requires(Requires_) {}
1366 template <
typename Fn>
void match(Fn
F)
const {
F(Name, Params, Requires); }
1372 OB +=
"> typename ";
1377 if (Requires !=
nullptr) {
1379 Requires->
print(OB);
1390 :
Node(KTemplateParamPackDecl,
Cache::
Yes), Param(Param_) {}
1392 template<
typename Fn>
void match(Fn
F)
const {
F(Param); }
1395 OB.printLeft(*Param);
1416 if (OB.CurrentPackMax == std::numeric_limits<unsigned>::max()) {
1417 OB.CurrentPackMax =
static_cast<unsigned>(Data.size());
1418 OB.CurrentPackIndex = 0;
1425 if (std::all_of(Data.begin(), Data.end(),
1426 [](
Node *
P) { return P->getArrayCache() == Cache::No; }))
1428 if (std::all_of(Data.begin(), Data.end(),
1429 [](
Node *
P) { return P->getFunctionCache() == Cache::No; }))
1431 if (std::all_of(Data.begin(), Data.end(), [](
Node *
P) {
1432 return P->getRHSComponentCache() == Cache::No;
1437 template<
typename Fn>
void match(Fn
F)
const {
F(Data); }
1440 initializePackExpansion(OB);
1441 size_t Idx = OB.CurrentPackIndex;
1442 return Idx < Data.size() && Data[
Idx]->hasRHSComponent(OB);
1445 initializePackExpansion(OB);
1446 size_t Idx = OB.CurrentPackIndex;
1447 return Idx < Data.size() && Data[
Idx]->hasArray(OB);
1450 initializePackExpansion(OB);
1451 size_t Idx = OB.CurrentPackIndex;
1452 return Idx < Data.size() && Data[
Idx]->hasFunction(OB);
1455 initializePackExpansion(OB);
1456 size_t Idx = OB.CurrentPackIndex;
1457 return Idx < Data.size() ? Data[
Idx]->getSyntaxNode(OB) :
this;
1461 initializePackExpansion(OB);
1462 size_t Idx = OB.CurrentPackIndex;
1463 if (
Idx < Data.size())
1464 OB.printLeft(*Data[
Idx]);
1467 initializePackExpansion(OB);
1468 size_t Idx = OB.CurrentPackIndex;
1469 if (
Idx < Data.size())
1470 OB.printRight(*Data[
Idx]);
1483 :
Node(KTemplateArgumentPack), Elements(Elements_) {}
1485 template<
typename Fn>
void match(Fn
F)
const {
F(Elements); }
1490 Elements.printWithComma(OB);
1501 :
Node(KParameterPackExpansion), Child(Child_) {}
1503 template<
typename Fn>
void match(Fn
F)
const {
F(Child); }
1508 constexpr unsigned Max = std::numeric_limits<unsigned>::max();
1511 size_t StreamPos = OB.getCurrentPosition();
1519 if (OB.CurrentPackMax == Max) {
1526 if (OB.CurrentPackMax == 0) {
1527 OB.setCurrentPosition(StreamPos);
1532 for (
unsigned I = 1,
E = OB.CurrentPackMax;
I <
E; ++
I) {
1534 OB.CurrentPackIndex =
I;
1546 :
Node(KTemplateArgs), Params(Params_), Requires(Requires_) {}
1548 template<
typename Fn>
void match(Fn
F)
const {
F(Params, Requires); }
1555 Params.printWithComma(OB);
1597 template<
typename Fn>
void match(Fn
F)
const =
delete;
1634 OB.printRight(*
Ref);
1661 :
Node(KGlobalQualifiedName), Child(Child_) {}
1663 template<
typename Fn>
void match(Fn
F)
const {
F(Child); }
1665 std::string_view
getBaseName()
const override {
return Child->getBaseName(); }
1703 case SpecialSubKind::allocator:
1704 return {
"allocator"};
1705 case SpecialSubKind::basic_string:
1706 return {
"basic_string"};
1707 case SpecialSubKind::string:
1708 return {
"basic_string"};
1709 case SpecialSubKind::istream:
1710 return {
"basic_istream"};
1711 case SpecialSubKind::ostream:
1712 return {
"basic_ostream"};
1713 case SpecialSubKind::iostream:
1714 return {
"basic_iostream"};
1723 OB <<
"<char, std::char_traits<char>";
1724 if (
SSK == SpecialSubKind::string)
1725 OB <<
", std::allocator<char>";
1743 SV.remove_prefix(
sizeof(
"basic_") - 1);
1758 const Node *Basename;
1764 :
Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_),
1765 Variant(Variant_) {}
1767 template<
typename Fn>
void match(Fn
F)
const {
F(Basename, IsDtor, Variant); }
1772 OB += Basename->getBaseName();
1782 template<
typename Fn>
void match(Fn
F)
const {
F(Base); }
1786 OB.printLeft(*Base);
1791 const std::string_view Count;
1795 :
Node(KUnnamedTypeName), Count(Count_) {}
1797 template<
typename Fn>
void match(Fn
F)
const {
F(Count); }
1808 const Node *Requires1;
1810 const Node *Requires2;
1811 std::string_view Count;
1816 std::string_view Count_)
1817 :
Node(KClosureTypeName), TemplateParams(TemplateParams_),
1818 Requires1(Requires1_), Params(Params_), Requires2(Requires2_),
1821 template<
typename Fn>
void match(Fn
F)
const {
1822 F(TemplateParams, Requires1, Params, Requires2, Count);
1826 if (!TemplateParams.
empty()) {
1832 if (Requires1 !=
nullptr) {
1834 Requires1->
print(OB);
1840 if (Requires2 !=
nullptr) {
1842 Requires2->
print(OB);
1859 :
Node(KStructuredBindingName), Bindings(Bindings_) {}
1861 template<
typename Fn>
void match(Fn
F)
const {
F(Bindings); }
1874 const std::string_view InfixOperator;
1880 :
Node(KBinaryExpr, Prec_),
LHS(LHS_), InfixOperator(InfixOperator_),
1883 template <
typename Fn>
void match(Fn
F)
const {
1888 bool ParenAll = OB.isGtInsideTemplateArgs() &&
1889 (InfixOperator ==
">" || InfixOperator ==
">>");
1896 if (!(InfixOperator ==
","))
1898 OB += InfixOperator;
1912 :
Node(KArraySubscriptExpr, Prec_), Op1(Op1_), Op2(Op2_) {}
1914 template <
typename Fn>
void match(Fn
F)
const {
1928 const std::string_view Operator;
1932 :
Node(KPostfixExpr, Prec_), Child(Child_), Operator(Operator_) {}
1934 template <
typename Fn>
void match(Fn
F)
const {
1952 :
Node(KConditionalExpr, Prec_),
Cond(Cond_), Then(Then_), Else(Else_) {}
1954 template <
typename Fn>
void match(Fn
F)
const {
1961 Then->printAsOperand(OB);
1969 const std::string_view
Kind;
1977 template <
typename Fn>
void match(Fn
F)
const {
1990 const Node *SubExpr;
1991 std::string_view Offset;
1997 std::string_view Offset_,
NodeArray UnionSelectors_,
1998 bool OnePastTheEnd_)
1999 :
Node(KSubobjectExpr), Type(Type_), SubExpr(SubExpr_), Offset(Offset_),
2000 UnionSelectors(UnionSelectors_), OnePastTheEnd(OnePastTheEnd_) {}
2002 template<
typename Fn>
void match(Fn
F)
const {
2003 F(Type, SubExpr, Offset, UnionSelectors, OnePastTheEnd);
2010 OB +=
" at offset ";
2011 if (Offset.empty()) {
2013 }
else if (Offset[0] ==
'n') {
2015 OB += std::string_view(Offset.data() + 1, Offset.size() - 1);
2024 const std::string_view Prefix;
2026 const std::string_view Postfix;
2031 :
Node(KEnclosingExpr, Prec_), Prefix(Prefix_), Infix(Infix_) {}
2033 template <
typename Fn>
void match(Fn
F)
const {
2048 const std::string_view CastKind;
2055 :
Node(KCastExpr, Prec_), CastKind(CastKind_), To(To_),
From(From_) {}
2057 template <
typename Fn>
void match(Fn
F)
const {
2070 From->printAsOperand(OB);
2080 :
Node(KSizeofParamPackExpr), Pack(Pack_) {}
2082 template<
typename Fn>
void match(Fn
F)
const {
F(Pack); }
2100 :
Node(KCallExpr, Prec_), Callee(Callee_), Args(Args_),
2101 IsParen(IsParen_) {}
2103 template <
typename Fn>
void match(Fn
F)
const {
2114 Args.printWithComma(OB);
2128 bool IsArray_,
Prec Prec_)
2129 :
Node(KNewExpr, Prec_), ExprList(ExprList_), Type(Type_),
2130 InitList(InitList_), IsGlobal(IsGlobal_), IsArray(IsArray_) {}
2132 template<
typename Fn>
void match(Fn
F)
const {
2142 if (!ExprList.
empty()) {
2149 if (!InitList.
empty()) {
2164 :
Node(KDeleteExpr, Prec_), Op(Op_), IsGlobal(IsGlobal_),
2165 IsArray(IsArray_) {}
2167 template <
typename Fn>
void match(Fn
F)
const {
2183 std::string_view Prefix;
2188 :
Node(KPrefixExpr, Prec_), Prefix(Prefix_), Child(Child_) {}
2190 template <
typename Fn>
void match(Fn
F)
const {
2201 std::string_view Number;
2221 :
Node(KConversionExpr, Prec_), Type(Type_), Expressions(Expressions_) {}
2223 template <
typename Fn>
void match(Fn
F)
const {
2239 const Node *SubExpr;
2240 std::string_view Offset;
2244 std::string_view Offset_,
Prec Prec_)
2245 :
Node(KPointerToMemberConversionExpr, Prec_), Type(Type_),
2246 SubExpr(SubExpr_), Offset(Offset_) {}
2248 template <
typename Fn>
void match(Fn
F)
const {
2267 :
Node(KInitListExpr), Ty(Ty_), Inits(Inits_) {}
2269 template<
typename Fn>
void match(Fn
F)
const {
F(Ty, Inits); }
2289 :
Node(KBracedExpr), Elem(Elem_), Init(Init_), IsArray(IsArray_) {}
2291 template<
typename Fn>
void match(Fn
F)
const {
F(Elem, Init, IsArray); }
2302 if (Init->
getKind() != KBracedExpr && Init->
getKind() != KBracedRangeExpr)
2314 :
Node(KBracedRangeExpr), First(First_), Last(Last_), Init(Init_) {}
2316 template<
typename Fn>
void match(Fn
F)
const {
F(First, Last, Init); }
2324 if (Init->
getKind() != KBracedExpr && Init->
getKind() != KBracedRangeExpr)
2331 const Node *Pack, *Init;
2332 std::string_view OperatorName;
2336 FoldExpr(
bool IsLeftFold_, std::string_view OperatorName_,
const Node *Pack_,
2338 :
Node(KFoldExpr), Pack(Pack_), Init(Init_), OperatorName(OperatorName_),
2339 IsLeftFold(IsLeftFold_) {}
2341 template<
typename Fn>
void match(Fn
F)
const {
2342 F(IsLeftFold, OperatorName, Pack, Init);
2346 auto PrintPack = [&] {
2356 if (!IsLeftFold || Init !=
nullptr) {
2362 OB <<
" " << OperatorName <<
" ";
2365 if (IsLeftFold || Init !=
nullptr) {
2367 OB <<
" " << OperatorName <<
" ";
2383 template<
typename Fn>
void match(Fn
F)
const {
F(Op); }
2397 template<
typename Fn>
void match(Fn
F)
const {
F(Value); }
2400 OB += Value ? std::string_view(
"true") : std::string_view(
"false");
2410 template<
typename Fn>
void match(Fn
F)
const {
F(Type); }
2425 template<
typename Fn>
void match(Fn
F)
const {
F(Type); }
2429 if (Type->getKind() == KClosureTypeName)
2438 std::string_view Integer;
2442 :
Node(KEnumLiteral), Ty(Ty_), Integer(Integer_) {}
2444 template<
typename Fn>
void match(Fn
F)
const {
F(Ty, Integer); }
2451 if (Integer[0] ==
'n')
2452 OB <<
'-' << std::string_view(Integer.data() + 1, Integer.size() - 1);
2459 std::string_view Type;
2460 std::string_view Value;
2464 :
Node(KIntegerLiteral), Type(Type_), Value(Value_) {}
2466 template<
typename Fn>
void match(Fn
F)
const {
F(Type, Value); }
2469 if (Type.size() > 3) {
2475 if (Value[0] ==
'n')
2476 OB <<
'-' << std::string_view(Value.data() + 1, Value.size() - 1);
2480 if (Type.size() <= 3)
2484 std::string_view
value()
const {
return Value; }
2492 :
Node(KRequiresExpr), Parameters(Parameters_),
2493 Requirements(Requirements_) {}
2495 template<
typename Fn>
void match(Fn
F)
const {
F(Parameters, Requirements); }
2499 if (!Parameters.empty()) {
2502 Parameters.printWithComma(OB);
2507 for (
const Node *Req : Requirements) {
2518 const Node *TypeConstraint;
2521 const Node *TypeConstraint_)
2522 :
Node(KExprRequirement), Expr(Expr_), IsNoexcept(IsNoexcept_),
2523 TypeConstraint(TypeConstraint_) {}
2525 template <
typename Fn>
void match(Fn
F)
const {
2526 F(Expr, IsNoexcept, TypeConstraint);
2531 if (IsNoexcept || TypeConstraint)
2534 if (IsNoexcept || TypeConstraint)
2538 if (TypeConstraint) {
2540 TypeConstraint->
print(OB);
2550 :
Node(KTypeRequirement), Type(Type_) {}
2552 template <
typename Fn>
void match(Fn
F)
const {
F(Type); }
2562 const Node *Constraint;
2565 :
Node(KNestedRequirement), Constraint(Constraint_) {}
2567 template <
typename Fn>
void match(Fn
F)
const {
F(Constraint); }
2571 Constraint->
print(OB);
2580 return Node::KFloatLiteral;
2583 return Node::KDoubleLiteral;
2586 return Node::KLongDoubleLiteral;
2591 const std::string_view Contents;
2593 static constexpr Kind KindForClass =
2598 :
Node(KindForClass), Contents(Contents_) {}
2600 template<
typename Fn>
void match(Fn
F)
const {
F(Contents); }
2604 if (Contents.size() >=
N) {
2607 char buf[
sizeof(
Float)];
2609 const char *t = Contents.data();
2610 const char *last = t +
N;
2612 for (; t != last; ++t, ++e) {
2613 unsigned d1 = isdigit(*t) ?
static_cast<unsigned>(*t -
'0')
2614 :
static_cast<unsigned>(*t -
'a' + 10);
2616 unsigned d0 = isdigit(*t) ?
static_cast<unsigned>(*t -
'0')
2617 :
static_cast<unsigned>(*t -
'a' + 10);
2618 *e =
static_cast<char>((d1 << 4) + d0);
2620#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
2621 std::reverse(buf, e);
2625 OB += std::string_view(num, n);
2636template<
typename Fn>
2641 return F(static_cast<const X *>(this));
2642#include "ItaniumNodes.def"
2650 template <> struct NodeKind<X> { \
2651 static constexpr Node::Kind Kind = Node::K##X; \
2652 static constexpr const char *name() { return #X; } \
2654#include "ItaniumNodes.def"
2657 auto StartPos = OB.getCurrentPosition();
2658 auto Fail = [&OB, StartPos] {
2659 OB.setCurrentPosition(StartPos);
2664 bool LastWasNumericEscape =
false;
2665 for (
const Node *Element : *
this) {
2666 if (Element->
getKind() != Node::KIntegerLiteral)
2668 int integer_value = 0;
2670 if (c <
'0' || c >
'9' || integer_value > 25)
2672 integer_value *= 10;
2673 integer_value += c -
'0';
2675 if (integer_value > 255)
2679 if (LastWasNumericEscape) {
2680 if ((integer_value >=
'0' && integer_value <=
'9') ||
2681 (integer_value >=
'a' && integer_value <=
'f') ||
2682 (integer_value >=
'A' && integer_value <=
'F')) {
2687 LastWasNumericEscape =
false;
2690 switch (integer_value) {
2723 if (integer_value < 32 || integer_value == 127) {
2724 constexpr char Hex[] =
"0123456789ABCDEF";
2726 if (integer_value > 7)
2728 if (integer_value >= 16)
2729 OB += Hex[integer_value >> 4];
2730 OB += Hex[integer_value & 0xF];
2731 LastWasNumericEscape =
true;
2736 OB += (
char)integer_value;
2764 size_t OldNumTemplateParamLists;
2769 : Parser(TheParser),
2829 void reset(
const char *First_,
const char *Last_) {
2838 for (
int I = 0;
I != 3; ++
I)
2848 size_t sz =
static_cast<size_t>(end - begin);
2851 std::copy(begin, end,
data);
2881 char look(
unsigned Lookahead = 0)
const {
2882 if (
static_cast<size_t>(
Last -
First) <= Lookahead)
2884 return First[Lookahead];
2902 return look() ==
'T' &&
2903 std::string_view(
"yptnk").find(
look(1)) != std::string_view::npos;
2953 for (;
I <
E; ++
I) {
3010 return *
this <
Other.Enc;
3013 return Enc[0] < Peek[0] || (
Enc[0] == Peek[0] &&
Enc[1] < Peek[1]);
3016 return Enc[0] == Peek[0] &&
Enc[1] == Peek[1];
3022 std::string_view Res =
Name;
3025 "operator name does not start with 'operator'");
3026 Res.remove_prefix(
sizeof(
"operator") - 1);
3028 Res.remove_prefix(1);
3062template <
typename Derived,
typename Alloc>
3065 return getDerived().parseNestedName(State);
3067 return getDerived().parseLocalName(State);
3069 Node *Result =
nullptr;
3070 bool IsSubst =
false;
3072 Result = getDerived().parseUnscopedName(State, &IsSubst);
3076 if (look() ==
'I') {
3081 Node *TA = getDerived().parseTemplateArgs(State !=
nullptr);
3086 Result = make<NameWithTemplateArgs>(Result, TA);
3087 }
else if (IsSubst) {
3098template <
typename Derived,
typename Alloc>
3100 if (!consumeIf(
'Z'))
3102 Node *Encoding = getDerived().parseEncoding();
3103 if (Encoding ==
nullptr || !consumeIf(
'E'))
3106 if (consumeIf(
's')) {
3108 auto *StringLitName = make<NameType>(
"string literal");
3111 return make<LocalName>(Encoding, StringLitName);
3118 if (consumeIf(
'd')) {
3120 if (!consumeIf(
'_'))
3122 Node *
N = getDerived().parseName(State);
3125 return make<LocalName>(Encoding,
N);
3128 Node *Entity = getDerived().parseName(State);
3129 if (Entity ==
nullptr)
3132 return make<LocalName>(Encoding, Entity);
3138template <
typename Derived,
typename Alloc>
3143 Node *Std =
nullptr;
3144 if (consumeIf(
"St")) {
3145 Std = make<NameType>(
"std");
3150 Node *Res =
nullptr;
3152 if (look() ==
'S') {
3153 Node *S = getDerived().parseSubstitution();
3156 if (S->
getKind() == Node::KModuleName)
3158 else if (IsSubst && Std ==
nullptr) {
3166 if (Res ==
nullptr || Std !=
nullptr) {
3167 Res = getDerived().parseUnqualifiedName(State, Std,
Module);
3179template <
typename Derived,
typename Alloc>
3182 if (getDerived().parseModuleNameOpt(
Module))
3185 bool IsMemberLikeFriend = Scope && consumeIf(
'F');
3190 if (look() >=
'1' && look() <=
'9') {
3191 Result = getDerived().parseSourceName(State);
3192 }
else if (look() ==
'U') {
3193 Result = getDerived().parseUnnamedTypeName(State);
3194 }
else if (consumeIf(
"DC")) {
3196 size_t BindingsBegin = Names.
size();
3198 Node *
Binding = getDerived().parseSourceName(State);
3202 }
while (!consumeIf(
'E'));
3203 Result = make<StructuredBindingName>(popTrailingNodeArray(BindingsBegin));
3204 }
else if (look() ==
'C' || look() ==
'D') {
3206 if (Scope ==
nullptr ||
Module !=
nullptr)
3208 Result = getDerived().parseCtorDtorName(Scope, State);
3210 Result = getDerived().parseOperatorName(State);
3213 if (Result !=
nullptr &&
Module !=
nullptr)
3214 Result = make<ModuleEntity>(
Module, Result);
3215 if (Result !=
nullptr)
3216 Result = getDerived().parseAbiTags(Result);
3217 if (Result !=
nullptr && IsMemberLikeFriend)
3218 Result = make<MemberLikeFriendName>(Scope, Result);
3219 else if (Result !=
nullptr && Scope !=
nullptr)
3220 Result = make<NestedName>(Scope, Result);
3230template <
typename Derived,
typename Alloc>
3233 while (consumeIf(
'W')) {
3234 bool IsPartition = consumeIf(
'P');
3235 Node *Sub = getDerived().parseSourceName(
nullptr);
3253template <
typename Derived,
typename Alloc>
3258 if (State !=
nullptr)
3259 TemplateParams.
clear();
3261 if (consumeIf(
"Ut")) {
3262 std::string_view Count = parseNumber();
3263 if (!consumeIf(
'_'))
3265 return make<UnnamedTypeName>(Count);
3267 if (consumeIf(
"Ul")) {
3269 TemplateParams.
size());
3272 size_t ParamsBegin = Names.
size();
3273 while (getDerived().isTemplateParamDecl()) {
3275 getDerived().parseTemplateParamDecl(LambdaTemplateParams.
params());
3280 NodeArray TempParams = popTrailingNodeArray(ParamsBegin);
3304 if (TempParams.
empty())
3307 Node *Requires1 =
nullptr;
3308 if (consumeIf(
'Q')) {
3309 Requires1 = getDerived().parseConstraintExpr();
3310 if (Requires1 ==
nullptr)
3314 if (!consumeIf(
"v")) {
3316 Node *
P = getDerived().parseType();
3320 }
while (look() !=
'E' && look() !=
'Q');
3322 NodeArray Params = popTrailingNodeArray(ParamsBegin);
3324 Node *Requires2 =
nullptr;
3325 if (consumeIf(
'Q')) {
3326 Requires2 = getDerived().parseConstraintExpr();
3327 if (Requires2 ==
nullptr)
3331 if (!consumeIf(
'E'))
3334 std::string_view Count = parseNumber();
3335 if (!consumeIf(
'_'))
3337 return make<ClosureTypeName>(TempParams, Requires1, Params, Requires2,
3340 if (consumeIf(
"Ub")) {
3341 (void)parseNumber();
3342 if (!consumeIf(
'_'))
3344 return make<NameType>(
"'block-literal'");
3350template <
typename Derived,
typename Alloc>
3353 if (parsePositiveInteger(&Length))
3355 if (numLeft() < Length || Length == 0)
3357 std::string_view
Name(First, Length);
3360 return make<NameType>(
"(anonymous namespace)");
3361 return make<NameType>(
Name);
3365template <
typename Derived,
typename Alloc>
3377 "operator co_await"},
3389 "operator delete[]"},
3437 "reinterpret_cast"},
3449template <
typename Derived,
typename Alloc>
3455template <
typename Derived,
typename Alloc>
3463 size_t lower = 0u, upper = NumOps - 1;
3464 while (upper != lower) {
3465 size_t middle = (upper + lower) / 2;
3466 if (Ops[middle] < First)
3471 if (Ops[lower] != First)
3481template <
typename Derived,
typename Alloc>
3484 if (
const auto *Op = parseOperatorEncoding()) {
3485 if (Op->getKind() == OperatorInfo::CCast) {
3492 PermitForwardTemplateReferences ||
3494 Node *Ty = getDerived().parseType();
3498 return make<ConversionOperatorType>(Ty);
3501 if (Op->getKind() >= OperatorInfo::Unnameable)
3504 if (Op->getKind() == OperatorInfo::Member && !Op->getFlag())
3508 return make<NameType>(Op->getName());
3511 if (consumeIf(
"li")) {
3513 Node *SN = getDerived().parseSourceName(State);
3516 return make<LiteralOperator>(SN);
3519 if (consumeIf(
'v')) {
3521 if (look() >=
'0' && look() <=
'9') {
3523 Node *SN = getDerived().parseSourceName(State);
3526 return make<ConversionOperatorType>(SN);
3544template <
typename Derived,
typename Alloc>
3548 if (SoFar->
getKind() == Node::KSpecialSubstitution) {
3550 SoFar = make<ExpandedSpecialSubstitution>(
3556 if (consumeIf(
'C')) {
3557 bool IsInherited = consumeIf(
'I');
3558 if (look() !=
'1' && look() !=
'2' && look() !=
'3' && look() !=
'4' &&
3561 int Variant = look() -
'0';
3565 if (getDerived().parseName(State) ==
nullptr)
3568 return make<CtorDtorName>(SoFar,
false, Variant);
3571 if (look() ==
'D' && (look(1) ==
'0' || look(1) ==
'1' || look(1) ==
'2' ||
3572 look(1) ==
'4' || look(1) ==
'5')) {
3573 int Variant = look(1) -
'0';
3576 return make<CtorDtorName>(SoFar,
true, Variant);
3601template <
typename Derived,
typename Alloc>
3604 if (!consumeIf(
'N'))
3609 if (!consumeIf(
'H')) {
3614 if (consumeIf(
'O')) {
3617 }
else if (consumeIf(
'R')) {
3628 Node *SoFar =
nullptr;
3629 while (!consumeIf(
'E')) {
3634 if (look() ==
'T') {
3636 if (SoFar !=
nullptr)
3638 SoFar = getDerived().parseTemplateParam();
3639 }
else if (look() ==
'I') {
3641 if (SoFar ==
nullptr)
3643 Node *TA = getDerived().parseTemplateArgs(State !=
nullptr);
3646 if (SoFar->
getKind() == Node::KNameWithTemplateArgs)
3653 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
3654 }
else if (look() ==
'D' && (look(1) ==
't' || look(1) ==
'T')) {
3656 if (SoFar !=
nullptr)
3658 SoFar = getDerived().parseDecltype();
3662 if (look() ==
'S') {
3665 if (look(1) ==
't') {
3667 S = make<NameType>(
"std");
3669 S = getDerived().parseSubstitution();
3673 if (S->
getKind() == Node::KModuleName) {
3675 }
else if (SoFar !=
nullptr) {
3684 SoFar = getDerived().parseUnqualifiedName(State, SoFar,
Module);
3687 if (SoFar ==
nullptr)
3696 if (SoFar ==
nullptr || Subs.
empty())
3704template <
typename Derived,
typename Alloc>
3706 Node *SN = getDerived().parseSourceName(
nullptr);
3709 if (look() ==
'I') {
3710 Node *TA = getDerived().parseTemplateArgs();
3713 return make<NameWithTemplateArgs>(SN, TA);
3720template <
typename Derived,
typename Alloc>
3723 if (std::isdigit(look()))
3724 Result = getDerived().parseSimpleId();
3726 Result = getDerived().parseUnresolvedType();
3727 if (Result ==
nullptr)
3729 return make<DtorName>(Result);
3735template <
typename Derived,
typename Alloc>
3737 if (look() ==
'T') {
3738 Node *TP = getDerived().parseTemplateParam();
3744 if (look() ==
'D') {
3745 Node *DT = getDerived().parseDecltype();
3751 return getDerived().parseSubstitution();
3761template <
typename Derived,
typename Alloc>
3763 if (std::isdigit(look()))
3764 return getDerived().parseSimpleId();
3766 if (consumeIf(
"dn"))
3767 return getDerived().parseDestructorName();
3771 Node *Oper = getDerived().parseOperatorName(
nullptr);
3772 if (Oper ==
nullptr)
3774 if (look() ==
'I') {
3775 Node *TA = getDerived().parseTemplateArgs();
3778 return make<NameWithTemplateArgs>(Oper, TA);
3795template <
typename Derived,
typename Alloc>
3797 Node *SoFar =
nullptr;
3801 if (consumeIf(
"srN")) {
3802 SoFar = getDerived().parseUnresolvedType();
3803 if (SoFar ==
nullptr)
3806 if (look() ==
'I') {
3807 Node *TA = getDerived().parseTemplateArgs();
3810 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
3815 while (!consumeIf(
'E')) {
3816 Node *Qual = getDerived().parseSimpleId();
3817 if (Qual ==
nullptr)
3819 SoFar = make<QualifiedName>(SoFar, Qual);
3824 Node *Base = getDerived().parseBaseUnresolvedName();
3825 if (Base ==
nullptr)
3827 return make<QualifiedName>(SoFar, Base);
3831 if (!consumeIf(
"sr")) {
3832 SoFar = getDerived().parseBaseUnresolvedName();
3833 if (SoFar ==
nullptr)
3836 SoFar = make<GlobalQualifiedName>(SoFar);
3841 if (std::isdigit(look())) {
3843 Node *Qual = getDerived().parseSimpleId();
3844 if (Qual ==
nullptr)
3847 SoFar = make<QualifiedName>(SoFar, Qual);
3849 SoFar = make<GlobalQualifiedName>(Qual);
3854 }
while (!consumeIf(
'E'));
3859 SoFar = getDerived().parseUnresolvedType();
3860 if (SoFar ==
nullptr)
3863 if (look() ==
'I') {
3864 Node *TA = getDerived().parseTemplateArgs();
3867 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
3875 Node *Base = getDerived().parseBaseUnresolvedName();
3876 if (Base ==
nullptr)
3878 return make<QualifiedName>(SoFar, Base);
3883template <
typename Derived,
typename Alloc>
3885 while (consumeIf(
'B')) {
3886 std::string_view SN = parseBareSourceName();
3889 N = make<AbiTagAttr>(
N, SN);
3897template <
typename Alloc,
typename Derived>
3900 const char *Tmp = First;
3903 if (numLeft() == 0 || !std::isdigit(*First))
3904 return std::string_view();
3905 while (numLeft() != 0 && std::isdigit(*First))
3907 return std::string_view(Tmp, First - Tmp);
3911template <
typename Alloc,
typename Derived>
3914 if (look() <
'0' || look() >
'9')
3916 while (look() >=
'0' && look() <=
'9') {
3918 *Out +=
static_cast<size_t>(
consume() -
'0');
3923template <
typename Alloc,
typename Derived>
3926 if (parsePositiveInteger(&
Int) || numLeft() <
Int)
3928 std::string_view R(First,
Int);
3941template <
typename Derived,
typename Alloc>
3945 Node *ExceptionSpec =
nullptr;
3946 if (consumeIf(
"Do")) {
3947 ExceptionSpec = make<NameType>(
"noexcept");
3950 }
else if (consumeIf(
"DO")) {
3951 Node *
E = getDerived().parseExpr();
3952 if (
E ==
nullptr || !consumeIf(
'E'))
3954 ExceptionSpec = make<NoexceptSpec>(
E);
3957 }
else if (consumeIf(
"Dw")) {
3958 size_t SpecsBegin = Names.
size();
3959 while (!consumeIf(
'E')) {
3960 Node *
T = getDerived().parseType();
3966 make<DynamicExceptionSpec>(popTrailingNodeArray(SpecsBegin));
3973 if (!consumeIf(
'F'))
3976 Node *ReturnType = getDerived().parseType();
3977 if (ReturnType ==
nullptr)
3981 size_t ParamsBegin = Names.
size();
3987 if (consumeIf(
"RE")) {
3991 if (consumeIf(
"OE")) {
3995 Node *
T = getDerived().parseType();
4001 NodeArray Params = popTrailingNodeArray(ParamsBegin);
4002 return make<FunctionType>(ReturnType, Params, CVQuals,
4003 ReferenceQualifier, ExceptionSpec);
4011template <
typename Derived,
typename Alloc>
4013 if (!consumeIf(
"Dv"))
4015 if (look() >=
'1' && look() <=
'9') {
4016 Node *DimensionNumber = make<NameType>(parseNumber());
4017 if (!DimensionNumber)
4019 if (!consumeIf(
'_'))
4022 return make<PixelVectorType>(DimensionNumber);
4023 Node *ElemType = getDerived().parseType();
4024 if (ElemType ==
nullptr)
4026 return make<VectorType>(ElemType, DimensionNumber);
4029 if (!consumeIf(
'_')) {
4030 Node *DimExpr = getDerived().parseExpr();
4033 if (!consumeIf(
'_'))
4035 Node *ElemType = getDerived().parseType();
4038 return make<VectorType>(ElemType, DimExpr);
4040 Node *ElemType = getDerived().parseType();
4043 return make<VectorType>(ElemType,
nullptr);
4048template <
typename Derived,
typename Alloc>
4050 if (!consumeIf(
'D'))
4052 if (!consumeIf(
't') && !consumeIf(
'T'))
4054 Node *
E = getDerived().parseExpr();
4057 if (!consumeIf(
'E'))
4059 return make<EnclosingExpr>(
"decltype",
E);
4064template <
typename Derived,
typename Alloc>
4066 if (!consumeIf(
'A'))
4069 Node *Dimension =
nullptr;
4071 if (std::isdigit(look())) {
4072 Dimension = make<NameType>(parseNumber());
4075 if (!consumeIf(
'_'))
4077 }
else if (!consumeIf(
'_')) {
4078 Node *DimExpr = getDerived().parseExpr();
4079 if (DimExpr ==
nullptr)
4081 if (!consumeIf(
'_'))
4083 Dimension = DimExpr;
4086 Node *Ty = getDerived().parseType();
4089 return make<ArrayType>(Ty, Dimension);
4093template <
typename Derived,
typename Alloc>
4095 if (!consumeIf(
'M'))
4097 Node *ClassType = getDerived().parseType();
4098 if (ClassType ==
nullptr)
4100 Node *MemberType = getDerived().parseType();
4101 if (MemberType ==
nullptr)
4103 return make<PointerToMemberType>(ClassType, MemberType);
4110template <
typename Derived,
typename Alloc>
4112 std::string_view ElabSpef;
4113 if (consumeIf(
"Ts"))
4114 ElabSpef =
"struct";
4115 else if (consumeIf(
"Tu"))
4117 else if (consumeIf(
"Te"))
4120 Node *
Name = getDerived().parseName();
4121 if (
Name ==
nullptr)
4124 if (!ElabSpef.empty())
4125 return make<ElaboratedTypeSpefType>(ElabSpef,
Name);
4133template <
typename Derived,
typename Alloc>
4135 if (consumeIf(
'U')) {
4136 std::string_view Qual = parseBareSourceName();
4142 constexpr size_t Len =
sizeof(
"objcproto") - 1;
4143 std::string_view ProtoSourceName(Qual.data() + Len, Qual.size() - Len);
4144 std::string_view Proto;
4147 SaveLast(Last, &*ProtoSourceName.rbegin() + 1);
4148 Proto = parseBareSourceName();
4152 Node *Child = getDerived().parseQualifiedType();
4153 if (Child ==
nullptr)
4155 return make<ObjCProtoName>(Child, Proto);
4159 if (look() ==
'I') {
4160 TA = getDerived().parseTemplateArgs();
4165 Node *Child = getDerived().parseQualifiedType();
4166 if (Child ==
nullptr)
4168 return make<VendorExtQualType>(Child, Qual, TA);
4172 Node *Ty = getDerived().parseType();
4176 Ty = make<QualType>(Ty, Quals);
4200template <
typename Derived,
typename Alloc>
4202 Node *Result =
nullptr;
4209 unsigned AfterQuals = 0;
4210 if (look(AfterQuals) ==
'r') ++AfterQuals;
4211 if (look(AfterQuals) ==
'V') ++AfterQuals;
4212 if (look(AfterQuals) ==
'K') ++AfterQuals;
4214 if (look(AfterQuals) ==
'F' ||
4215 (look(AfterQuals) ==
'D' &&
4216 (look(AfterQuals + 1) ==
'o' || look(AfterQuals + 1) ==
'O' ||
4217 look(AfterQuals + 1) ==
'w' || look(AfterQuals + 1) ==
'x'))) {
4218 Result = getDerived().parseFunctionType();
4224 Result = getDerived().parseQualifiedType();
4230 return make<NameType>(
"void");
4234 return make<NameType>(
"wchar_t");
4238 return make<NameType>(
"bool");
4242 return make<NameType>(
"char");
4246 return make<NameType>(
"signed char");
4250 return make<NameType>(
"unsigned char");
4254 return make<NameType>(
"short");
4258 return make<NameType>(
"unsigned short");
4262 return make<NameType>(
"int");
4266 return make<NameType>(
"unsigned int");
4270 return make<NameType>(
"long");
4274 return make<NameType>(
"unsigned long");
4278 return make<NameType>(
"long long");
4282 return make<NameType>(
"unsigned long long");
4286 return make<NameType>(
"__int128");
4290 return make<NameType>(
"unsigned __int128");
4294 return make<NameType>(
"float");
4298 return make<NameType>(
"double");
4302 return make<NameType>(
"long double");
4306 return make<NameType>(
"__float128");
4310 return make<NameType>(
"...");
4315 std::string_view Res = parseBareSourceName();
4321 if (consumeIf(
'I')) {
4325 if (!consumeIf(
'E'))
4327 Result = make<TransformedType>(Res,
BaseType);
4329 Result = make<NameType>(Res);
4337 return make<NameType>(
"decimal64");
4341 return make<NameType>(
"decimal128");
4345 return make<NameType>(
"decimal32");
4349 return make<NameType>(
"half");
4354 if (consumeIf(
"16b"))
4355 return make<NameType>(
"std::bfloat16_t");
4356 Node *DimensionNumber = make<NameType>(parseNumber());
4357 if (!DimensionNumber)
4359 if (!consumeIf(
'_'))
4361 return make<BinaryFPType>(DimensionNumber);
4377 return make<NameType>(
"short _Accum");
4379 return make<NameType>(
"unsigned short _Accum");
4381 return make<NameType>(
"_Accum");
4383 return make<NameType>(
"unsigned _Accum");
4385 return make<NameType>(
"long _Accum");
4387 return make<NameType>(
"unsigned long _Accum");
4397 return make<NameType>(
"short _Fract");
4399 return make<NameType>(
"unsigned short _Fract");
4401 return make<NameType>(
"_Fract");
4403 return make<NameType>(
"unsigned _Fract");
4405 return make<NameType>(
"long _Fract");
4407 return make<NameType>(
"unsigned long _Fract");
4416 if (look(1) ==
'A') {
4421 return make<NameType>(
"_Sat short _Accum");
4423 return make<NameType>(
"_Sat unsigned short _Accum");
4425 return make<NameType>(
"_Sat _Accum");
4427 return make<NameType>(
"_Sat unsigned _Accum");
4429 return make<NameType>(
"_Sat long _Accum");
4431 return make<NameType>(
"_Sat unsigned long _Accum");
4436 if (look(1) ==
'R') {
4441 return make<NameType>(
"_Sat short _Fract");
4443 return make<NameType>(
"_Sat unsigned short _Fract");
4445 return make<NameType>(
"_Sat _Fract");
4447 return make<NameType>(
"_Sat unsigned _Fract");
4449 return make<NameType>(
"_Sat long _Fract");
4451 return make<NameType>(
"_Sat unsigned long _Fract");
4464 bool Signed = look(1) ==
'B';
4466 Node *
Size = std::isdigit(look()) ? make<NameType>(parseNumber())
4467 : getDerived().parseExpr();
4470 if (!consumeIf(
'_'))
4479 return make<NameType>(
"char32_t");
4483 return make<NameType>(
"char16_t");
4487 return make<NameType>(
"char8_t");
4491 return make<NameType>(
"auto");
4495 return make<NameType>(
"decltype(auto)");
4500 std::string_view Kind = look(1) ==
'k' ?
" auto" :
" decltype(auto)";
4502 Node *Constraint = getDerived().parseName();
4505 return make<PostfixQualifiedType>(Constraint, Kind);
4510 return make<NameType>(
"std::nullptr_t");
4515 Result = getDerived().parseDecltype();
4520 Result = getDerived().parseVectorType();
4526 Node *Child = getDerived().parseType();
4529 Result = make<ParameterPackExpansion>(Child);
4538 Result = getDerived().parseFunctionType();
4544 Result = getDerived().parseFunctionType();
4549 Result = getDerived().parseArrayType();
4554 Result = getDerived().parsePointerToMemberType();
4560 if (look(1) ==
's' || look(1) ==
'u' || look(1) ==
'e') {
4561 Result = getDerived().parseClassEnumType();
4565 Result = getDerived().parseTemplateParam();
4566 if (Result ==
nullptr)
4579 if (TryToParseTemplateArgs && look() ==
'I') {
4581 Node *TA = getDerived().parseTemplateArgs();
4584 Result = make<NameWithTemplateArgs>(Result, TA);
4591 Node *
Ptr = getDerived().parseType();
4594 Result = make<PointerType>(
Ptr);
4600 Node *Ref = getDerived().parseType();
4609 Node *Ref = getDerived().parseType();
4618 Node *
P = getDerived().parseType();
4621 Result = make<PostfixQualifiedType>(
P,
" complex");
4627 Node *
P = getDerived().parseType();
4630 Result = make<PostfixQualifiedType>(
P,
" imaginary");
4635 if (look(1) !=
't') {
4636 bool IsSubst =
false;
4637 Result = getDerived().parseUnscopedName(
nullptr, &IsSubst);
4651 if (look() ==
'I' && (!IsSubst || TryToParseTemplateArgs)) {
4654 Node *TA = getDerived().parseTemplateArgs();
4657 Result = make<NameWithTemplateArgs>(Result, TA);
4658 }
else if (IsSubst) {
4669 Result = getDerived().parseClassEnumType();
4677 if (Result !=
nullptr)
4682template <
typename Derived,
typename Alloc>
4686 Node *
E = getDerived().parseExpr();
4689 return make<PrefixExpr>(Kind,
E, Prec);
4692template <
typename Derived,
typename Alloc>
4696 Node *
LHS = getDerived().parseExpr();
4699 Node *
RHS = getDerived().parseExpr();
4702 return make<BinaryExpr>(
LHS, Kind,
RHS, Prec);
4705template <
typename Derived,
typename Alloc>
4707 std::string_view Lit) {
4708 std::string_view Tmp = parseNumber(
true);
4709 if (!Tmp.empty() && consumeIf(
'E'))
4710 return make<IntegerLiteral>(Lit, Tmp);
4715template <
typename Alloc,
typename Derived>
4732template <
typename Derived,
typename Alloc>
4734 if (consumeIf(
"fpT"))
4735 return make<NameType>(
"this");
4736 if (consumeIf(
"fp")) {
4737 parseCVQualifiers();
4738 std::string_view Num = parseNumber();
4739 if (!consumeIf(
'_'))
4741 return make<FunctionParam>(Num);
4743 if (consumeIf(
"fL")) {
4744 if (parseNumber().empty())
4746 if (!consumeIf(
'p'))
4748 parseCVQualifiers();
4749 std::string_view Num = parseNumber();
4750 if (!consumeIf(
'_'))
4752 return make<FunctionParam>(Num);
4759template <
typename Derived,
typename Alloc>
4761 if (!consumeIf(
"cv"))
4766 Ty = getDerived().parseType();
4772 if (consumeIf(
'_')) {
4773 size_t ExprsBegin = Names.
size();
4774 while (!consumeIf(
'E')) {
4775 Node *
E = getDerived().parseExpr();
4780 NodeArray Exprs = popTrailingNodeArray(ExprsBegin);
4781 return make<ConversionExpr>(Ty, Exprs);
4784 Node *
E[1] = {getDerived().parseExpr()};
4785 if (
E[0] ==
nullptr)
4787 return make<ConversionExpr>(Ty, makeNodeArray(
E,
E + 1));
4797template <
typename Derived,
typename Alloc>
4799 if (!consumeIf(
'L'))
4804 return getDerived().parseIntegerLiteral(
"wchar_t");
4806 if (consumeIf(
"b0E"))
4807 return make<BoolExpr>(0);
4808 if (consumeIf(
"b1E"))
4809 return make<BoolExpr>(1);
4813 return getDerived().parseIntegerLiteral(
"char");
4816 return getDerived().parseIntegerLiteral(
"signed char");
4819 return getDerived().parseIntegerLiteral(
"unsigned char");
4822 return getDerived().parseIntegerLiteral(
"short");
4825 return getDerived().parseIntegerLiteral(
"unsigned short");
4828 return getDerived().parseIntegerLiteral(
"");
4831 return getDerived().parseIntegerLiteral(
"u");
4834 return getDerived().parseIntegerLiteral(
"l");
4837 return getDerived().parseIntegerLiteral(
"ul");
4840 return getDerived().parseIntegerLiteral(
"ll");
4843 return getDerived().parseIntegerLiteral(
"ull");
4846 return getDerived().parseIntegerLiteral(
"__int128");
4849 return getDerived().parseIntegerLiteral(
"unsigned __int128");
4852 return getDerived().template parseFloatingLiteral<float>();
4855 return getDerived().template parseFloatingLiteral<double>();
4858#if defined(__powerpc__) || defined(__s390__)
4861 return getDerived().template parseFloatingLiteral<double>();
4863 return getDerived().template parseFloatingLiteral<long double>();
4866 if (consumeIf(
"_Z")) {
4867 Node *R = getDerived().parseEncoding();
4868 if (R !=
nullptr && consumeIf(
'E'))
4873 Node *
T = getDerived().parseType();
4878 return make<StringLiteral>(
T);
4882 if (consumeIf(
"Dn") && (consumeIf(
'0'), consumeIf(
'E')))
4883 return make<NameType>(
"nullptr");
4893 Node *
T = parseUnnamedTypeName(
nullptr);
4894 if (!
T || !consumeIf(
'E'))
4896 return make<LambdaExpr>(
T);
4900 Node *
T = getDerived().parseType();
4903 std::string_view
N = parseNumber(
true);
4906 if (!consumeIf(
'E'))
4908 return make<EnumLiteral>(
T,
N);
4917template <
typename Derived,
typename Alloc>
4919 if (look() ==
'd') {
4923 Node *
Field = getDerived().parseSourceName(
nullptr);
4924 if (
Field ==
nullptr)
4926 Node *Init = getDerived().parseBracedExpr();
4927 if (Init ==
nullptr)
4929 return make<BracedExpr>(
Field, Init,
false);
4934 if (
Index ==
nullptr)
4936 Node *Init = getDerived().parseBracedExpr();
4937 if (Init ==
nullptr)
4939 return make<BracedExpr>(
Index, Init,
true);
4943 Node *RangeBegin = getDerived().parseExpr();
4944 if (RangeBegin ==
nullptr)
4946 Node *RangeEnd = getDerived().parseExpr();
4947 if (RangeEnd ==
nullptr)
4949 Node *Init = getDerived().parseBracedExpr();
4950 if (Init ==
nullptr)
4952 return make<BracedRangeExpr>(RangeBegin, RangeEnd, Init);
4956 return getDerived().parseExpr();
4964template <
typename Derived,
typename Alloc>
4966 if (!consumeIf(
'f'))
4969 bool IsLeftFold =
false, HasInitializer =
false;
4975 HasInitializer =
true;
4978 HasInitializer =
true;
4988 const auto *Op = parseOperatorEncoding();
4991 if (!(Op->getKind() == OperatorInfo::Binary
4992 || (Op->getKind() == OperatorInfo::Member
4993 && Op->getName().back() ==
'*')))
4996 Node *Pack = getDerived().parseExpr();
4997 if (Pack ==
nullptr)
5000 Node *Init =
nullptr;
5001 if (HasInitializer) {
5002 Init = getDerived().parseExpr();
5003 if (Init ==
nullptr)
5007 if (IsLeftFold && Init)
5010 return make<FoldExpr>(IsLeftFold, Op->getSymbol(), Pack, Init);
5016template <
typename Derived,
typename Alloc>
5020 Node *Ty = getDerived().parseType();
5023 Node *Expr = getDerived().parseExpr();
5026 std::string_view
Offset = getDerived().parseNumber(
true);
5027 if (!consumeIf(
'E'))
5029 return make<PointerToMemberConversionExpr>(Ty, Expr,
Offset, Prec);
5036template <
typename Derived,
typename Alloc>
5038 Node *Ty = getDerived().parseType();
5041 Node *Expr = getDerived().parseExpr();
5044 std::string_view
Offset = getDerived().parseNumber(
true);
5045 size_t SelectorsBegin = Names.
size();
5046 while (consumeIf(
'_')) {
5047 Node *Selector = make<NameType>(parseNumber());
5052 bool OnePastTheEnd = consumeIf(
'p');
5053 if (!consumeIf(
'E'))
5055 return make<SubobjectExpr>(
5056 Ty, Expr,
Offset, popTrailingNodeArray(SelectorsBegin), OnePastTheEnd);
5059template <
typename Derived,
typename Alloc>
5064 HasIncompleteTemplateParameterTracking,
true);
5065 return getDerived().parseExpr();
5068template <
typename Derived,
typename Alloc>
5071 if (consumeIf(
"rQ")) {
5073 size_t ParamsBegin = Names.
size();
5074 while (!consumeIf(
'_')) {
5075 Node *
Type = getDerived().parseType();
5076 if (
Type ==
nullptr)
5080 Params = popTrailingNodeArray(ParamsBegin);
5081 }
else if (!consumeIf(
"rq")) {
5086 size_t ReqsBegin = Names.
size();
5088 Node *Constraint =
nullptr;
5089 if (consumeIf(
'X')) {
5091 Node *Expr = getDerived().parseExpr();
5092 if (Expr ==
nullptr)
5094 bool Noexcept = consumeIf(
'N');
5095 Node *TypeReq =
nullptr;
5096 if (consumeIf(
'R')) {
5097 TypeReq = getDerived().parseName();
5098 if (TypeReq ==
nullptr)
5101 Constraint = make<ExprRequirement>(Expr, Noexcept, TypeReq);
5102 }
else if (consumeIf(
'T')) {
5104 Node *
Type = getDerived().parseType();
5105 if (
Type ==
nullptr)
5107 Constraint = make<TypeRequirement>(
Type);
5108 }
else if (consumeIf(
'Q')) {
5116 Node *NestedReq = getDerived().parseExpr();
5117 if (NestedReq ==
nullptr)
5119 Constraint = make<NestedRequirement>(NestedReq);
5121 if (Constraint ==
nullptr)
5124 }
while (!consumeIf(
'E'));
5126 return make<RequiresExpr>(Params, popTrailingNodeArray(ReqsBegin));
5174template <
typename Derived,
typename Alloc>
5176 bool Global = consumeIf(
"gs");
5178 const auto *Op = parseOperatorEncoding();
5180 auto Sym = Op->getSymbol();
5181 switch (Op->getKind()) {
5182 case OperatorInfo::Binary:
5184 return getDerived().parseBinaryExpr(
Sym, Op->getPrecedence());
5185 case OperatorInfo::Prefix:
5187 return getDerived().parsePrefixExpr(
Sym, Op->getPrecedence());
5188 case OperatorInfo::Postfix: {
5191 return getDerived().parsePrefixExpr(
Sym, Op->getPrecedence());
5192 Node *Ex = getDerived().parseExpr();
5195 return make<PostfixExpr>(Ex,
Sym, Op->getPrecedence());
5197 case OperatorInfo::Array: {
5199 Node *Base = getDerived().parseExpr();
5200 if (Base ==
nullptr)
5203 if (
Index ==
nullptr)
5205 return make<ArraySubscriptExpr>(Base,
Index, Op->getPrecedence());
5207 case OperatorInfo::Member: {
5209 Node *
LHS = getDerived().parseExpr();
5212 Node *
RHS = getDerived().parseExpr();
5215 return make<MemberExpr>(
LHS,
Sym,
RHS, Op->getPrecedence());
5217 case OperatorInfo::New: {
5223 size_t Exprs = Names.
size();
5224 while (!consumeIf(
'_')) {
5225 Node *Ex = getDerived().parseExpr();
5230 NodeArray ExprList = popTrailingNodeArray(Exprs);
5231 Node *Ty = getDerived().parseType();
5234 bool HaveInits = consumeIf(
"pi");
5235 size_t InitsBegin = Names.
size();
5236 while (!consumeIf(
'E')) {
5239 Node *Init = getDerived().parseExpr();
5240 if (Init ==
nullptr)
5244 NodeArray Inits = popTrailingNodeArray(InitsBegin);
5245 return make<NewExpr>(ExprList, Ty, Inits, Global,
5246 Op->getFlag(), Op->getPrecedence());
5248 case OperatorInfo::Del: {
5250 Node *Ex = getDerived().parseExpr();
5253 return make<DeleteExpr>(Ex, Global, Op->getFlag(),
5254 Op->getPrecedence());
5256 case OperatorInfo::Call: {
5258 Node *Callee = getDerived().parseExpr();
5259 if (Callee ==
nullptr)
5261 size_t ExprsBegin = Names.
size();
5262 while (!consumeIf(
'E')) {
5263 Node *
E = getDerived().parseExpr();
5268 return make<CallExpr>(Callee, popTrailingNodeArray(ExprsBegin),
5269 Op->getFlag(), Op->getPrecedence());
5271 case OperatorInfo::CCast: {
5276 Ty = getDerived().parseType();
5281 size_t ExprsBegin = Names.
size();
5282 bool IsMany = consumeIf(
'_');
5283 while (!consumeIf(
'E')) {
5284 Node *
E = getDerived().parseExpr();
5291 NodeArray Exprs = popTrailingNodeArray(ExprsBegin);
5292 if (!IsMany && Exprs.
size() != 1)
5294 return make<ConversionExpr>(Ty, Exprs, Op->getPrecedence());
5296 case OperatorInfo::Conditional: {
5298 Node *
Cond = getDerived().parseExpr();
5299 if (
Cond ==
nullptr)
5301 Node *
LHS = getDerived().parseExpr();
5304 Node *
RHS = getDerived().parseExpr();
5307 return make<ConditionalExpr>(
Cond,
LHS,
RHS, Op->getPrecedence());
5309 case OperatorInfo::NamedCast: {
5311 Node *Ty = getDerived().parseType();
5314 Node *Ex = getDerived().parseExpr();
5317 return make<CastExpr>(
Sym, Ty, Ex, Op->getPrecedence());
5319 case OperatorInfo::OfIdOp: {
5322 Op->getFlag() ? getDerived().parseType() : getDerived().parseExpr();
5325 return make<EnclosingExpr>(
Sym, Arg, Op->getPrecedence());
5327 case OperatorInfo::NameOnly: {
5339 return getDerived().parseExprPrimary();
5341 return getDerived().parseTemplateParam();
5342 if (look() ==
'f') {
5344 if (look(1) ==
'p' || (look(1) ==
'L' && std::isdigit(look(2))))
5345 return getDerived().parseFunctionParam();
5346 return getDerived().parseFoldExpr();
5348 if (consumeIf(
"il")) {
5349 size_t InitsBegin = Names.
size();
5350 while (!consumeIf(
'E')) {
5351 Node *
E = getDerived().parseBracedExpr();
5356 return make<InitListExpr>(
nullptr, popTrailingNodeArray(InitsBegin));
5358 if (consumeIf(
"mc"))
5360 if (consumeIf(
"nx")) {
5361 Node *Ex = getDerived().parseExpr();
5366 if (look() ==
'r' && (look(1) ==
'q' || look(1) ==
'Q'))
5367 return parseRequiresExpr();
5368 if (consumeIf(
"so"))
5369 return parseSubobjectExpr();
5370 if (consumeIf(
"sp")) {
5371 Node *Child = getDerived().parseExpr();
5372 if (Child ==
nullptr)
5374 return make<ParameterPackExpansion>(Child);
5376 if (consumeIf(
"sZ")) {
5377 if (look() ==
'T') {
5378 Node *R = getDerived().parseTemplateParam();
5381 return make<SizeofParamPackExpr>(R);
5383 Node *
FP = getDerived().parseFunctionParam();
5386 return make<EnclosingExpr>(
"sizeof... ",
FP);
5388 if (consumeIf(
"sP")) {
5389 size_t ArgsBegin = Names.
size();
5390 while (!consumeIf(
'E')) {
5391 Node *Arg = getDerived().parseTemplateArg();
5396 auto *Pack = make<NodeArrayNode>(popTrailingNodeArray(ArgsBegin));
5399 return make<EnclosingExpr>(
"sizeof... ", Pack);
5401 if (consumeIf(
"tl")) {
5402 Node *Ty = getDerived().parseType();
5405 size_t InitsBegin = Names.
size();
5406 while (!consumeIf(
'E')) {
5407 Node *
E = getDerived().parseBracedExpr();
5412 return make<InitListExpr>(Ty, popTrailingNodeArray(InitsBegin));
5414 if (consumeIf(
"tr"))
5415 return make<NameType>(
"throw");
5416 if (consumeIf(
"tw")) {
5417 Node *Ex = getDerived().parseExpr();
5420 return make<ThrowExpr>(Ex);
5422 if (consumeIf(
'u')) {
5423 Node *
Name = getDerived().parseSourceName(
nullptr);
5431 bool IsUUID =
false;
5433 if (
Name->getBaseName() ==
"__uuidof") {
5434 if (consumeIf(
't')) {
5435 UUID = getDerived().parseType();
5437 }
else if (consumeIf(
'z')) {
5438 UUID = getDerived().parseExpr();
5442 size_t ExprsBegin = Names.
size();
5444 if (
UUID ==
nullptr)
5448 while (!consumeIf(
'E')) {
5449 Node *
E = getDerived().parseTemplateArg();
5455 return make<CallExpr>(
Name, popTrailingNodeArray(ExprsBegin),
5460 return getDerived().parseUnresolvedName(Global);
5471template <
typename Alloc,
typename Derived>
5476 return parseNumber(
true).empty() || !consumeIf(
'_');
5478 return parseNumber(
true).empty() || !consumeIf(
'_') ||
5479 parseNumber(
true).empty() || !consumeIf(
'_');
5504template <
typename Derived,
typename Alloc>
5514 Node *Arg = getDerived().parseTemplateArg();
5517 return make<SpecialName>(
"template parameter object for ", Arg);
5522 Node *Ty = getDerived().parseType();
5525 return make<SpecialName>(
"vtable for ", Ty);
5530 Node *Ty = getDerived().parseType();
5533 return make<SpecialName>(
"VTT for ", Ty);
5538 Node *Ty = getDerived().parseType();
5541 return make<SpecialName>(
"typeinfo for ", Ty);
5546 Node *Ty = getDerived().parseType();
5549 return make<SpecialName>(
"typeinfo name for ", Ty);
5554 if (parseCallOffset() || parseCallOffset())
5556 Node *Encoding = getDerived().parseEncoding();
5557 if (Encoding ==
nullptr)
5559 return make<SpecialName>(
"covariant return thunk to ", Encoding);
5565 Node *FirstType = getDerived().parseType();
5566 if (FirstType ==
nullptr)
5568 if (parseNumber(
true).empty() || !consumeIf(
'_'))
5570 Node *SecondType = getDerived().parseType();
5571 if (SecondType ==
nullptr)
5573 return make<CtorVtableSpecialName>(SecondType, FirstType);
5578 Node *
Name = getDerived().parseName();
5579 if (
Name ==
nullptr)
5581 return make<SpecialName>(
"thread-local wrapper routine for ",
Name);
5586 Node *
Name = getDerived().parseName();
5587 if (
Name ==
nullptr)
5589 return make<SpecialName>(
"thread-local initialization routine for ",
Name);
5594 bool IsVirt = look() ==
'v';
5595 if (parseCallOffset())
5597 Node *BaseEncoding = getDerived().parseEncoding();
5598 if (BaseEncoding ==
nullptr)
5601 return make<SpecialName>(
"virtual thunk to ", BaseEncoding);
5603 return make<SpecialName>(
"non-virtual thunk to ", BaseEncoding);
5611 Node *
Name = getDerived().parseName();
5612 if (
Name ==
nullptr)
5614 return make<SpecialName>(
"guard variable for ",
Name);
5621 Node *
Name = getDerived().parseName();
5622 if (
Name ==
nullptr)
5625 bool ParsedSeqId = !parseSeqId(&Count);
5626 if (!consumeIf(
'_') && ParsedSeqId)
5628 return make<SpecialName>(
"reference temporary for ",
Name);
5634 if (getDerived().parseModuleNameOpt(
Module))
5638 return make<SpecialName>(
"initializer for module ",
Module);
5649template <
typename Derived,
typename Alloc>
5655 if (look() ==
'G' || look() ==
'T')
5656 return getDerived().parseSpecialName();
5658 auto IsEndOfEncoding = [&] {
5662 return numLeft() == 0 || look() ==
'E' || look() ==
'.' || look() ==
'_';
5666 Node *
Name = getDerived().parseName(&NameInfo);
5667 if (
Name ==
nullptr)
5670 if (resolveForwardTemplateRefs(NameInfo))
5673 if (IsEndOfEncoding())
5686 Node *Attrs =
nullptr;
5687 if (consumeIf(
"Ua9enable_ifI")) {
5688 size_t BeforeArgs = Names.
size();
5689 while (!consumeIf(
'E')) {
5690 Node *Arg = getDerived().parseTemplateArg();
5695 Attrs = make<EnableIfAttr>(popTrailingNodeArray(BeforeArgs));
5700 Node *ReturnType =
nullptr;
5702 ReturnType = getDerived().parseType();
5703 if (ReturnType ==
nullptr)
5708 if (!consumeIf(
'v')) {
5709 size_t ParamsBegin = Names.
size();
5711 Node *Ty = getDerived().parseType();
5715 const bool IsFirstParam = ParamsBegin == Names.
size();
5717 Ty = make<ExplicitObjectParameter>(Ty);
5723 }
while (!IsEndOfEncoding() && look() !=
'Q');
5724 Params = popTrailingNodeArray(ParamsBegin);
5727 Node *Requires =
nullptr;
5728 if (consumeIf(
'Q')) {
5729 Requires = getDerived().parseConstraintExpr();
5734 return make<FunctionEncoding>(ReturnType,
Name, Params, Attrs, Requires,
5739template <
class Float>
5745 static const size_t mangled_size = 8;
5746 static const size_t max_demangled_size = 24;
5747 static constexpr const char* spec =
"%af";
5753 static const size_t mangled_size = 16;
5754 static const size_t max_demangled_size = 32;
5755 static constexpr const char* spec =
"%a";
5761#if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
5762 static const size_t mangled_size = 32;
5763#elif __LDBL_MANT_DIG__ == 53 || defined(_MSC_VER)
5766 static const size_t mangled_size = 16;
5767#elif __LDBL_MANT_DIG__ == 64
5768 static const size_t mangled_size = 20;
5770#error Unknown size for __LDBL_MANT_DIG__
5777 static const size_t max_demangled_size = 42;
5778 static constexpr const char *spec =
"%LaL";
5781template <
typename Alloc,
typename Derived>
5782template <
class Float>
5787 std::string_view Data(First,
N);
5789 if (!(
C >=
'0' &&
C <=
'9') && !(
C >=
'a' &&
C <=
'f'))
5792 if (!consumeIf(
'E'))
5794 return make<FloatLiteralImpl<Float>>(Data);
5798template <
typename Alloc,
typename Derived>
5800 if (!(look() >=
'0' && look() <=
'9') &&
5801 !(look() >=
'A' && look() <=
'Z'))
5806 if (look() >=
'0' && look() <=
'9') {
5808 Id +=
static_cast<size_t>(look() -
'0');
5809 }
else if (look() >=
'A' && look() <=
'Z') {
5811 Id +=
static_cast<size_t>(look() -
'A') + 10;
5831template <
typename Derived,
typename Alloc>
5833 if (!consumeIf(
'S'))
5836 if (look() >=
'a' && look() <=
'z') {
5861 auto *SpecialSub = make<SpecialSubstitution>(Kind);
5868 Node *WithTags = getDerived().parseAbiTags(SpecialSub);
5869 if (WithTags != SpecialSub) {
5871 SpecialSub = WithTags;
5877 if (consumeIf(
'_')) {
5885 if (parseSeqId(&
Index))
5888 if (!consumeIf(
'_') ||
Index >= Subs.
size())
5897template <
typename Derived,
typename Alloc>
5899 const char *Begin = First;
5900 if (!consumeIf(
'T'))
5904 if (consumeIf(
'L')) {
5905 if (parsePositiveInteger(&Level))
5908 if (!consumeIf(
'_'))
5913 if (!consumeIf(
'_')) {
5914 if (parsePositiveInteger(&
Index))
5917 if (!consumeIf(
'_'))
5925 if (HasIncompleteTemplateParameterTracking) {
5926 return make<NameType>(std::string_view(Begin, First - 1 - Begin));
5933 if (PermitForwardTemplateReferences && Level == 0) {
5934 Node *ForwardRef = make<ForwardTemplateReference>(
Index);
5944 if (Level >= TemplateParams.
size() || !TemplateParams[Level] ||
5945 Index >= TemplateParams[Level]->
size()) {
5948 if (ParsingLambdaParamsAtLevel == Level && Level <= TemplateParams.
size()) {
5951 if (Level == TemplateParams.
size())
5953 return make<NameType>(
"auto");
5959 return (*TemplateParams[Level])[
Index];
5967template <
typename Derived,
typename Alloc>
5971 unsigned Index = NumSyntheticTemplateParameters[(int)Kind]++;
5972 Node *
N = make<SyntheticTemplateParamName>(Kind,
Index);
5978 if (consumeIf(
"Ty")) {
5982 return make<TypeTemplateParamDecl>(
Name);
5985 if (consumeIf(
"Tk")) {
5991 HasIncompleteTemplateParameterTracking,
true);
5992 Node *Constraint = getDerived().parseName();
5998 return make<ConstrainedTypeTemplateParamDecl>(Constraint,
Name);
6001 if (consumeIf(
"Tn")) {
6008 return make<NonTypeTemplateParamDecl>(
Name,
Type);
6011 if (consumeIf(
"Tt")) {
6015 size_t ParamsBegin = Names.
size();
6017 Node *Requires =
nullptr;
6018 while (!consumeIf(
'E')) {
6019 Node *
P = parseTemplateParamDecl(TemplateTemplateParamParams.
params());
6023 if (consumeIf(
'Q')) {
6024 Requires = getDerived().parseConstraintExpr();
6025 if (Requires ==
nullptr || !consumeIf(
'E'))
6030 NodeArray InnerParams = popTrailingNodeArray(ParamsBegin);
6031 return make<TemplateTemplateParamDecl>(
Name, InnerParams, Requires);
6034 if (consumeIf(
"Tp")) {
6035 Node *
P = parseTemplateParamDecl(Params);
6038 return make<TemplateParamPackDecl>(
P);
6050template <
typename Derived,
typename Alloc>
6055 Node *Arg = getDerived().parseExpr();
6056 if (Arg ==
nullptr || !consumeIf(
'E'))
6062 size_t ArgsBegin = Names.
size();
6063 while (!consumeIf(
'E')) {
6064 Node *Arg = getDerived().parseTemplateArg();
6069 NodeArray Args = popTrailingNodeArray(ArgsBegin);
6070 return make<TemplateArgumentPack>(Args);
6074 if (look(1) ==
'Z') {
6076 Node *Arg = getDerived().parseEncoding();
6077 if (Arg ==
nullptr || !consumeIf(
'E'))
6082 return getDerived().parseExprPrimary();
6086 if (!getDerived().isTemplateParamDecl())
6087 return getDerived().parseType();
6088 Node *Param = getDerived().parseTemplateParamDecl(
nullptr);
6091 Node *Arg = getDerived().parseTemplateArg();
6094 return make<TemplateParamQualifiedArg>(Param, Arg);
6097 return getDerived().parseType();
6103template <
typename Derived,
typename Alloc>
6106 if (!consumeIf(
'I'))
6112 TemplateParams.
clear();
6113 TemplateParams.
push_back(&OuterTemplateParams);
6114 OuterTemplateParams.
clear();
6117 size_t ArgsBegin = Names.
size();
6118 Node *Requires =
nullptr;
6119 while (!consumeIf(
'E')) {
6121 Node *Arg = getDerived().parseTemplateArg();
6126 if (Arg->
getKind() == Node::KTemplateParamQualifiedArg) {
6130 if (Arg->
getKind() == Node::KTemplateArgumentPack) {
6138 Node *Arg = getDerived().parseTemplateArg();
6143 if (consumeIf(
'Q')) {
6144 Requires = getDerived().parseConstraintExpr();
6145 if (!Requires || !consumeIf(
'E'))
6150 return make<TemplateArgs>(popTrailingNodeArray(ArgsBegin), Requires);
6158template <
typename Derived,
typename Alloc>
6160 if (consumeIf(
"_Z") || consumeIf(
"__Z")) {
6161 Node *Encoding = getDerived().parseEncoding(ParseParams);
6162 if (Encoding ==
nullptr)
6164 if (look() ==
'.') {
6166 make<DotSuffix>(Encoding, std::string_view(First, Last - First));
6174 if (consumeIf(
"___Z") || consumeIf(
"____Z")) {
6175 Node *Encoding = getDerived().parseEncoding(ParseParams);
6176 if (Encoding ==
nullptr || !consumeIf(
"_block_invoke"))
6178 bool RequireNumber = consumeIf(
'_');
6179 if (parseNumber().empty() && RequireNumber)
6185 return make<SpecialName>(
"invocation function for block in ", Encoding);
6188 Node *Ty = getDerived().parseType();
6194template <
typename Alloc>
6206#if defined(__clang__)
6207#pragma clang diagnostic pop
BlockVerifier::State From
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
DXIL Resource Implicit Binding
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Given that RA is a live value
#define DEMANGLE_ABI
DEMANGLE_ABI is the export/visibility macro used to mark symbols delcared in llvm/Demangle as exporte...
#define DEMANGLE_DUMP_METHOD
#define DEMANGLE_FALLTHROUGH
#define DEMANGLE_NAMESPACE_END
#define DEMANGLE_ASSERT(__expr, __msg)
#define DEMANGLE_NAMESPACE_BEGIN
#define DEMANGLE_UNREACHABLE
std::optional< std::vector< StOtherPiece > > Other
DEMANGLE_ABI const char * parse_discriminator(const char *first, const char *last)
Qualifiers operator|=(Qualifiers &Q1, Qualifiers Q2)
Machine Check Debug Module
static StringRef getName(Value *V)
const SmallVectorImpl< MachineOperand > & Cond
std::pair< llvm::MachO::Target, std::string > UUID
static bool consume(InternalInstruction *insn, T &ptr)
SaveTemplateParams(AbstractManglingParser *TheParser)
TemplateParamList * params()
~ScopedTemplateParamList()
ScopedTemplateParamList(AbstractManglingParser *TheParser)
void printLeft(OutputBuffer &OB) const override
ArraySubscriptExpr(const Node *Op1_, const Node *Op2_, Prec Prec_)
void printRight(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
bool printInitListAsType(OutputBuffer &OB, const NodeArray &Elements) const override
bool hasArraySlow(OutputBuffer &) const override
ArrayType(const Node *Base_, Node *Dimension_)
bool hasRHSComponentSlow(OutputBuffer &) const override
BinaryExpr(const Node *LHS_, std::string_view InfixOperator_, const Node *RHS_, Prec Prec_)
void printLeft(OutputBuffer &OB) const override
BinaryFPType(const Node *Dimension_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
BitIntType(const Node *Size_, bool Signed_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
BracedExpr(const Node *Elem_, const Node *Init_, bool IsArray_)
void printLeft(OutputBuffer &OB) const override
BracedRangeExpr(const Node *First_, const Node *Last_, const Node *Init_)
void printLeft(OutputBuffer &OB) const override
CallExpr(const Node *Callee_, NodeArray Args_, bool IsParen_, Prec Prec_)
CastExpr(std::string_view CastKind_, const Node *To_, const Node *From_, Prec Prec_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
void printDeclarator(OutputBuffer &OB) const
ClosureTypeName(NodeArray TemplateParams_, const Node *Requires1_, NodeArray Params_, const Node *Requires2_, std::string_view Count_)
void printLeft(OutputBuffer &OB) const override
ConditionalExpr(const Node *Cond_, const Node *Then_, const Node *Else_, Prec Prec_)
A constrained template type parameter declaration, 'C T'.
ConstrainedTypeTemplateParamDecl(Node *Constraint_, Node *Name_)
void printRight(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
ConversionExpr(const Node *Type_, NodeArray Expressions_, Prec Prec_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
ConversionOperatorType(const Node *Ty_)
CtorDtorName(const Node *Basename_, bool IsDtor_, int Variant_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
CtorVtableSpecialName(const Node *FirstType_, const Node *SecondType_)
void printLeft(OutputBuffer &OB) const override
DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_, Prec Prec_)
DotSuffix(const Node *Prefix_, std::string_view Suffix_)
void printLeft(OutputBuffer &OB) const override
DtorName(const Node *Base_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
DynamicExceptionSpec(NodeArray Types_)
ElaboratedTypeSpefType(std::string_view Kind_, Node *Child_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
EnableIfAttr(NodeArray Conditions_)
void printLeft(OutputBuffer &OB) const override
EnclosingExpr(std::string_view Prefix_, const Node *Infix_, Prec Prec_=Prec::Primary)
void printLeft(OutputBuffer &OB) const override
EnumLiteral(const Node *Ty_, std::string_view Integer_)
std::string_view getBaseName() const override
bool isInstantiation() const
ExpandedSpecialSubstitution(SpecialSubKind SSK_)
ExpandedSpecialSubstitution(SpecialSubKind SSK_, Kind K_)
Represents the explicitly named object parameter.
ExplicitObjectParameter(Node *Base_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
ExprRequirement(const Node *Expr_, bool IsNoexcept_, const Node *TypeConstraint_)
void printLeft(OutputBuffer &OB) const override
FloatLiteralImpl(std::string_view Contents_)
void printLeft(OutputBuffer &OB) const override
FoldExpr(bool IsLeftFold_, std::string_view OperatorName_, const Node *Pack_, const Node *Init_)
void printRight(OutputBuffer &OB) const override
Qualifiers getCVQuals() const
FunctionRefQual getRefQual() const
const Node * getAttrs() const
const Node * getReturnType() const
bool hasRHSComponentSlow(OutputBuffer &) const override
const Node * getRequires() const
void printLeft(OutputBuffer &OB) const override
const Node * getName() const
bool hasFunctionSlow(OutputBuffer &) const override
FunctionEncoding(const Node *Ret_, const Node *Name_, NodeArray Params_, const Node *Attrs_, const Node *Requires_, Qualifiers CVQuals_, FunctionRefQual RefQual_)
NodeArray getParams() const
void printLeft(OutputBuffer &OB) const override
FunctionParam(std::string_view Number_)
void printLeft(OutputBuffer &OB) const override
FunctionType(const Node *Ret_, NodeArray Params_, Qualifiers CVQuals_, FunctionRefQual RefQual_, const Node *ExceptionSpec_)
bool hasRHSComponentSlow(OutputBuffer &) const override
void printRight(OutputBuffer &OB) const override
bool hasFunctionSlow(OutputBuffer &) const override
GlobalQualifiedName(Node *Child_)
std::string_view getBaseName() const override
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
InitListExpr(const Node *Ty_, NodeArray Inits_)
std::string_view value() const
IntegerLiteral(std::string_view Type_, std::string_view Value_)
void printLeft(OutputBuffer &OB) const override
LambdaExpr(const Node *Type_)
void printLeft(OutputBuffer &OB) const override
LiteralOperator(const Node *OpName_)
void printLeft(OutputBuffer &OB) const override
MemberExpr(const Node *LHS_, std::string_view Kind_, const Node *RHS_, Prec Prec_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
NameType(std::string_view Name_)
std::string_view getBaseName() const override
std::string_view getName() const
void printLeft(OutputBuffer &OB) const override
NestedRequirement(const Node *Constraint_)
NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_, bool IsArray_, Prec Prec_)
void printLeft(OutputBuffer &OB) const override
NodeArray(Node **Elements_, size_t NumElements_)
void printWithComma(OutputBuffer &OB) const
bool printAsString(OutputBuffer &OB) const
Node * operator[](size_t Idx) const
void print(OutputBuffer &OB) const
Prec getPrecedence() const
Prec
Operator precedence for expression nodes.
virtual bool printInitListAsType(OutputBuffer &, const NodeArray &) const
void visit(Fn F) const
Visit the most-derived object corresponding to this object.
void printAsOperand(OutputBuffer &OB, Prec P=Prec::Default, bool StrictlyWorse=false) const
Node(Kind K_, Cache RHSComponentCache_, Cache ArrayCache_=Cache::No, Cache FunctionCache_=Cache::No)
bool hasRHSComponent(OutputBuffer &OB) const
DEMANGLE_DUMP_METHOD void dump() const
bool hasFunction(OutputBuffer &OB) const
Cache
Three-way bool to track a cached value.
Node(Kind K_, Prec Precedence_=Prec::Primary, Cache RHSComponentCache_=Cache::No, Cache ArrayCache_=Cache::No, Cache FunctionCache_=Cache::No)
Cache getRHSComponentCache() const
bool hasArray(OutputBuffer &OB) const
Cache getArrayCache() const
virtual bool hasRHSComponentSlow(OutputBuffer &) const
Cache ArrayCache
Track if this node is a (possibly qualified) array type.
virtual bool hasArraySlow(OutputBuffer &) const
virtual std::string_view getBaseName() const
virtual const Node * getSyntaxNode(OutputBuffer &) const
virtual bool hasFunctionSlow(OutputBuffer &) const
Cache getFunctionCache() const
Cache RHSComponentCache
Tracks if this node has a component on its right side, in which case we need to call printRight.
Cache FunctionCache
Track if this node is a (possibly qualified) function type.
NoexceptSpec(const Node *E_)
void printLeft(OutputBuffer &OB) const override
A non-type template parameter declaration, 'int N'.
void printRight(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
NonTypeTemplateParamDecl(Node *Name_, Node *Type_)
bool isObjCObject() const
ObjCProtoName(const Node *Ty_, std::string_view Protocol_)
void printLeft(OutputBuffer &OB) const override
std::string_view getProtocol() const
virtual void printRight(const Node &N)
virtual void printLeft(const Node &N)
Called by the demangler when printing the demangle tree.
PODSmallVector & operator=(PODSmallVector &&Other)
PODSmallVector(const PODSmallVector &)=delete
void push_back(const T &Elem)
PODSmallVector & operator=(const PODSmallVector &)=delete
PODSmallVector(PODSmallVector &&Other)
void shrinkToSize(size_t Index)
T & operator[](size_t Index)
const Node * getChild() const
ParameterPackExpansion(const Node *Child_)
void printLeft(OutputBuffer &OB) const override
An unexpanded parameter pack (either in the expression or type context).
ParameterPack(NodeArray Data_)
void printRight(OutputBuffer &OB) const override
bool hasArraySlow(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
const Node * getSyntaxNode(OutputBuffer &OB) const override
bool hasFunctionSlow(OutputBuffer &OB) const override
bool hasRHSComponentSlow(OutputBuffer &OB) const override
PixelVectorType(const Node *Dimension_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
PointerToMemberConversionExpr(const Node *Type_, const Node *SubExpr_, std::string_view Offset_, Prec Prec_)
void printRight(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
bool hasRHSComponentSlow(OutputBuffer &OB) const override
PointerToMemberType(const Node *ClassType_, const Node *MemberType_)
bool hasRHSComponentSlow(OutputBuffer &OB) const override
PointerType(const Node *Pointee_)
const Node * getPointee() const
void printRight(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
PostfixExpr(const Node *Child_, std::string_view Operator_, Prec Prec_)
void printLeft(OutputBuffer &OB) const override
PostfixQualifiedType(const Node *Ty_, std::string_view Postfix_)
void printLeft(OutputBuffer &OB) const override
PrefixExpr(std::string_view Prefix_, Node *Child_, Prec Prec_)
void printLeft(OutputBuffer &OB) const override
bool hasFunctionSlow(OutputBuffer &OB) const override
QualType(const Node *Child_, Qualifiers Quals_)
void printLeft(OutputBuffer &OB) const override
void printQuals(OutputBuffer &OB) const
Qualifiers getQuals() const
void printRight(OutputBuffer &OB) const override
const Node * getChild() const
bool hasRHSComponentSlow(OutputBuffer &OB) const override
bool hasArraySlow(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
std::string_view getBaseName() const override
QualifiedName(const Node *Qualifier_, const Node *Name_)
void printLeft(OutputBuffer &OB) const override
bool hasRHSComponentSlow(OutputBuffer &OB) const override
ReferenceType(const Node *Pointee_, ReferenceKind RK_)
void printRight(OutputBuffer &OB) const override
RequiresExpr(NodeArray Parameters_, NodeArray Requirements_)
void printLeft(OutputBuffer &OB) const override
SizeofParamPackExpr(const Node *Pack_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
SpecialName(std::string_view Special_, const Node *Child_)
std::string_view getBaseName() const override
SpecialSubstitution(SpecialSubKind SSK_)
void printLeft(OutputBuffer &OB) const override
StringLiteral(const Node *Type_)
void printLeft(OutputBuffer &OB) const override
StructuredBindingName(NodeArray Bindings_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
SubobjectExpr(const Node *Type_, const Node *SubExpr_, std::string_view Offset_, NodeArray UnionSelectors_, bool OnePastTheEnd_)
An invented name for a template parameter for which we don't have a corresponding template argument.
void printLeft(OutputBuffer &OB) const override
SyntheticTemplateParamName(TemplateParamKind Kind_, unsigned Index_)
TemplateArgs(NodeArray Params_, Node *Requires_)
void printLeft(OutputBuffer &OB) const override
A variadic template argument.
void printLeft(OutputBuffer &OB) const override
TemplateArgumentPack(NodeArray Elements_)
NodeArray getElements() const
A template parameter pack declaration, 'typename ...T'.
void printRight(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
TemplateParamPackDecl(Node *Param_)
TemplateParamQualifiedArg(Node *Param_, Node *Arg_)
void printLeft(OutputBuffer &OB) const override
A template template parameter declaration, 'template<typename T> typename N'.
void printLeft(OutputBuffer &OB) const override
TemplateTemplateParamDecl(Node *Name_, NodeArray Params_, Node *Requires_)
void printRight(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
ThrowExpr(const Node *Op_)
TypeRequirement(const Node *Type_)
void printLeft(OutputBuffer &OB) const override
A template type parameter declaration, 'typename T'.
void printLeft(OutputBuffer &OB) const override
TypeTemplateParamDecl(Node *Name_)
void printRight(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
UnnamedTypeName(std::string_view Count_)
VectorType(const Node *BaseType_, const Node *Dimension_)
const Node * getDimension() const
void printLeft(OutputBuffer &OB) const override
const Node * getBaseType() const
VendorExtQualType(const Node *Ty_, std::string_view Ext_, const Node *TA_)
void printLeft(OutputBuffer &OB) const override
std::string_view getExt() const
const Node * getTA() const
const Node * getTy() const
constexpr Node::Kind getFloatLiteralKind(float *)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
void printLeft(OutputBuffer &OB) const override
AbiTagAttr(Node *Base_, std::string_view Tag_)
std::string_view getBaseName() const override
Holds some extra information about a <name> that is being parsed.
bool HasExplicitObjectParameter
bool EndsWithTemplateArgs
NameState(AbstractManglingParser *Enclosing)
size_t ForwardTemplateRefsBegin
FunctionRefQual ReferenceQualifier
constexpr OperatorInfo(const char(&E)[3], OIKind K, bool F, Node::Prec P, const char *N)
Node::Prec getPrecedence() const
bool operator<(const OperatorInfo &Other) const
std::string_view getName() const
bool operator==(const char *Peek) const
bool operator!=(const char *Peek) const
bool operator<(const char *Peek) const
std::string_view getSymbol() const
bool parseModuleNameOpt(ModuleName *&Module)
Node * parseSubstitution()
PODSmallVector< Node *, 32 > Subs
Node * parseFloatingLiteral()
void reset(const char *First_, const char *Last_)
Node * parseClassEnumType()
Node * parseBaseUnresolvedName()
bool HasIncompleteTemplateParameterTracking
Node * parseSubobjectExpr()
PODSmallVector< ForwardTemplateReference *, 4 > ForwardTemplateRefs
Node * parseConversionExpr()
PODSmallVector< Node *, 32 > Names
Node * parseConstraintExpr()
bool isTemplateParamDecl()
Node * parseTemplateArgs(bool TagTemplates=false)
Node * parseSpecialName()
Node * parseTemplateParam()
Node * parseType()
Parse the <type> production.
Node * parseTemplateParamDecl(TemplateParamList *Params)
Qualifiers parseCVQualifiers()
Node * parsePrefixExpr(std::string_view Kind, Node::Prec Prec)
bool PermitForwardTemplateReferences
Node * parseUnresolvedName(bool Global)
Parse the <unresolved-name> production.
Node * parsePointerToMemberConversionExpr(Node::Prec Prec)
Node * parsePointerToMemberType()
bool resolveForwardTemplateRefs(NameState &State)
Node * parseIntegerLiteral(std::string_view Lit)
Node * make(Args &&... args)
bool parseSeqId(size_t *Out)
Node * parseEncoding(bool ParseParams=true)
Node * parseName(NameState *State=nullptr)
Parse the <name> production>
Node * parseBinaryExpr(std::string_view Kind, Node::Prec Prec)
std::string_view parseNumber(bool AllowNegative=false)
TemplateParamList OuterTemplateParams
Node * parse(bool ParseParams=true)
Top-level entry point into the parser.
Node * parseFunctionType()
Node * parseDestructorName()
NodeArray makeNodeArray(It begin, It end)
Node * parseLocalName(NameState *State)
AbstractManglingParser(const char *First_, const char *Last_)
Node * parseRequiresExpr()
char look(unsigned Lookahead=0) const
bool parsePositiveInteger(size_t *Out)
Node * parseExprPrimary()
Node * parseQualifiedType()
Node * parseCtorDtorName(Node *&SoFar, NameState *State)
Node * parseExpr()
Parse the <expression> production.
Node * parseAbiTags(Node *N)
static const OperatorInfo Ops[]
Node * parseNestedName(NameState *State)
unsigned NumSyntheticTemplateParameters[3]
Node * parseSourceName(NameState *State)
Node * parseUnscopedName(NameState *State, bool *isSubstName)
size_t ParsingLambdaParamsAtLevel
Node * parseTemplateArg()
bool TryToParseTemplateArgs
bool consumeIf(std::string_view S)
Node * parseUnqualifiedName(NameState *State, Node *Scope, ModuleName *Module)
std::string_view parseBareSourceName()
NodeArray popTrailingNodeArray(size_t FromPosition)
Node * parseFunctionParam()
PODSmallVector< TemplateParamList *, 4 > TemplateParams
const OperatorInfo * parseOperatorEncoding()
Node * parseUnresolvedType()
Node * parseOperatorName(NameState *State)
Node * parseUnnamedTypeName(NameState *State)
static const size_t NumOps
A forward-reference to a template argument that was not known at the point where the template paramet...
const Node * getSyntaxNode(OutputBuffer &OB) const override
bool hasRHSComponentSlow(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
bool hasFunctionSlow(OutputBuffer &OB) const override
bool hasArraySlow(OutputBuffer &OB) const override
void printRight(OutputBuffer &OB) const override
ForwardTemplateReference(size_t Index_)
void match(Fn F) const =delete
LocalName(Node *Encoding_, Node *Entity_)
void printLeft(OutputBuffer &OB) const override
std::string_view getBaseName() const override
MemberLikeFriendName(Node *Qual_, Node *Name_)
void printLeft(OutputBuffer &OB) const override
std::string_view getBaseName() const override
void printLeft(OutputBuffer &OB) const override
ModuleEntity(ModuleName *Module_, Node *Name_)
void printLeft(OutputBuffer &OB) const override
ModuleName(ModuleName *Parent_, Node *Name_, bool IsPartition_=false)
void printLeft(OutputBuffer &OB) const override
std::string_view getBaseName() const override
NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_)
std::string_view getBaseName() const override
NestedName(Node *Qual_, Node *Name_)
void printLeft(OutputBuffer &OB) const override
void printLeft(OutputBuffer &OB) const override
NodeArrayNode(NodeArray Array_)
Determine the kind of a node from its type.