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()) {
 
   84      std::copy(Other.begin(), Other.end(), First);
 
   85      Last = First + Other.size();
 
 
   97    if (Other.isInline()) {
 
  102      std::copy(Other.begin(), Other.end(), First);
 
  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); }
 
  152    return *(
begin() + Index);
 
 
 
  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); }
 
 
  463    return Child->hasRHSComponent(OB);
 
 
  466    return Child->hasArray(OB);
 
 
  469    return Child->hasFunction(OB);
 
 
  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_) {}
 
 
  552  template<
typename Fn> 
void match(Fn 
F)
 const { 
F(Kind, Child); }
 
 
  562  std::string_view Transform;
 
  566      : 
Node(KTransformedType), Transform(Transform_), BaseType(BaseType_) {}
 
 
  568  template<
typename Fn> 
void match(Fn 
F)
 const { 
F(Transform, BaseType); }
 
 
  603      : 
Node(KEnableIfAttr), Conditions(Conditions_) {}
 
 
  605  template<
typename Fn> 
void match(Fn 
F)
 const { 
F(Conditions); }
 
  608    OB += 
" [enable_if:";
 
  609    Conditions.printWithComma(OB);
 
 
 
  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);
 
  708      const Node *SN = SoFar.second->getSyntaxNode(OB);
 
  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); }
 
  734    return Pointee->hasRHSComponent(OB);
 
 
  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))
 
 
  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); }
 
  777    return MemberType->hasRHSComponent(OB);
 
 
  781    OB.printLeft(*MemberType);
 
  782    if (MemberType->hasArray(OB) || MemberType->hasFunction(OB))
 
  786    ClassType->print(OB);
 
 
  791    if (MemberType->hasArray(OB) || MemberType->hasFunction(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);
 
 
  872    Params.printWithComma(OB);
 
  888    if (ExceptionSpec != 
nullptr) {
 
  890      ExceptionSpec->print(OB);
 
 
 
  900  template<
typename Fn> 
void match(Fn 
F)
 const { 
F(E); }
 
  905    E->printAsOperand(OB);
 
 
 
  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))
 
 
  999    Params.printWithComma(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);
 
 
 
 1190  const Node *BaseType;
 
 1191  const Node *Dimension;
 
 1195      : 
Node(KVectorType), BaseType(BaseType_), Dimension(Dimension_) {}
 
 
 1200  template<
typename Fn> 
void match(Fn 
F)
 const { 
F(BaseType, Dimension); }
 
 1203    BaseType->print(OB);
 
 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_) {}
 
 
 1259  template<
typename Fn> 
void match(Fn 
F)
 const { 
F(Kind, Index); }
 
 
 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); }
 
 1371    Params.printWithComma(OB);
 
 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;
 
 1603    return Ref->hasRHSComponent(OB);
 
 
 1609    return Ref->hasArray(OB);
 
 
 1615    return Ref->hasFunction(OB);
 
 
 1621    return Ref->getSyntaxNode(OB);
 
 
 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(); }
 
 
 1704      return {
"allocator"};
 
 1706      return {
"basic_string"};
 
 1708      return {
"basic_string"};
 
 1710      return {
"basic_istream"};
 
 1712      return {
"basic_ostream"};
 
 1714      return {
"basic_iostream"};
 
 
 1723      OB << 
"<char, std::char_traits<char>";
 
 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()) {
 
 1829      TemplateParams.printWithComma(OB);
 
 1832    if (Requires1 != 
nullptr) {
 
 1834      Requires1->print(OB);
 
 1838    Params.printWithComma(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); }
 
 1865    Bindings.printWithComma(OB);
 
 
 
 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 {
 
 
 1921    Op2->printAsOperand(OB);
 
 
 
 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;
 
 1975      : 
Node(KMemberExpr, Prec_), LHS(LHS_), Kind(Kind_), RHS(RHS_) {}
 
 
 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()) {
 
 2144      ExprList.printWithComma(OB);
 
 2149    if (!InitList.empty()) {
 
 2151      InitList.printWithComma(OB);
 
 
 
 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;
 
 2205      : 
Node(KFunctionParam), Number(Number_) {}
 
 
 2207  template<
typename Fn> 
void match(Fn 
F)
 const { 
F(Number); }
 
 
 2221      : 
Node(KConversionExpr, Prec_), Type(Type_), Expressions(Expressions_) {}
 
 
 2223  template <
typename Fn> 
void match(Fn 
F)
 const {
 
 
 2232    Expressions.printWithComma(OB);
 
 
 
 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); }
 
 2273      if (Ty->printInitListAsType(OB, Inits))
 
 2278    Inits.printWithComma(OB);
 
 
 
 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;
 
 2669    for (
char c : 
static_cast<const IntegerLiteral *
>(Element)->value()) {
 
 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),
 
 2771      Parser->TemplateParams.push_back(&Params);
 
 
 2774      DEMANGLE_ASSERT(Parser->TemplateParams.size() >= OldNumTemplateParamLists,
 
 2776      Parser->TemplateParams.shrinkToSize(OldNumTemplateParamLists);
 
 
 
 2800      OldParams = std::move(Parser->TemplateParams);
 
 2801      OldOuterParams = std::move(Parser->OuterTemplateParams);
 
 2802      Parser->TemplateParams.clear();
 
 2803      Parser->OuterTemplateParams.clear();
 
 
 2806      Parser->TemplateParams = std::move(OldParams);
 
 2807      Parser->OuterTemplateParams = std::move(OldOuterParams);
 
 
 
 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);
 
 
 2859    Names.shrinkToSize(FromPosition);
 
 
 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;
 
 
 2951    size_t I = State.ForwardTemplateRefsBegin;
 
 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>
 
 3069  Node *Result = 
nullptr;
 
 3070  bool IsSubst = 
false;
 
 3072  Result = 
getDerived().parseUnscopedName(State, &IsSubst);
 
 3076  if (
look() == 
'I') {
 
 3080      Subs.push_back(Result);
 
 3085      State->EndsWithTemplateArgs = 
true;
 
 3087  } 
else if (IsSubst) {
 
 
 3098template <
typename Derived, 
typename Alloc>
 
 3103  if (Encoding == 
nullptr || !
consumeIf(
'E'))
 
 3129  if (Entity == 
nullptr)
 
 
 3138template <
typename Derived, 
typename Alloc>
 
 3143  Node *Std = 
nullptr;
 
 3150  Node *Res = 
nullptr;
 
 3152  if (
look() == 
'S') {
 
 3156    if (S->
getKind() == Node::KModuleName)
 
 3158    else if (IsSubst && Std == 
nullptr) {
 
 3166  if (Res == 
nullptr || Std != 
nullptr) {
 
 
 3179template <
typename Derived, 
typename Alloc>
 
 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);
 
 3196    size_t BindingsBegin = 
Names.size();
 
 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)
 
 3215  if (Result != 
nullptr)
 
 3217  if (Result != 
nullptr && IsMemberLikeFriend)
 
 3219  else if (Result != 
nullptr && Scope != 
nullptr)
 
 
 3230template <
typename Derived, 
typename Alloc>
 
 3253template <
typename Derived, 
typename Alloc>
 
 3258  if (State != 
nullptr)
 
 3272    size_t ParamsBegin = 
Names.size();
 
 3304    if (TempParams.
empty())
 
 3307    Node *Requires1 = 
nullptr;
 
 3309      Requires1 = 
getDerived().parseConstraintExpr();
 
 3310      if (Requires1 == 
nullptr)
 
 3320      } 
while (
look() != 
'E' && 
look() != 
'Q');
 
 3324    Node *Requires2 = 
nullptr;
 
 3326      Requires2 = 
getDerived().parseConstraintExpr();
 
 3327      if (Requires2 == 
nullptr)
 
 
 3350template <
typename Derived, 
typename Alloc>
 
 3355  if (
numLeft() < Length || Length == 0)
 
 3357  std::string_view Name(
First, Length);
 
 
 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;
 
 
 3481template <
typename Derived, 
typename Alloc>
 
 3497      if (State) State->CtorDtorConversion = 
true;
 
 3521    if (
look() >= 
'0' && 
look() <= 
'9') {
 
 
 3544template <
typename Derived, 
typename Alloc>
 
 3548  if (SoFar->
getKind() == Node::KSpecialSubstitution) {
 
 3561    int Variant = 
look() - 
'0';
 
 3563    if (State) State->CtorDtorConversion = 
true;
 
 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';
 
 3575    if (State) State->CtorDtorConversion = 
true;
 
 
 3601template <
typename Derived, 
typename Alloc>
 
 3612      State->CVQualifiers = CVTmp;
 
 3625    State->HasExplicitObjectParameter = 
true;
 
 3628  Node *SoFar = 
nullptr;
 
 3632      State->EndsWithTemplateArgs = 
false;
 
 3634    if (
look() == 
'T') {
 
 3636      if (SoFar != 
nullptr)
 
 3639    } 
else if (
look() == 
'I') {
 
 3641      if (SoFar == 
nullptr)
 
 3646      if (SoFar->
getKind() == Node::KNameWithTemplateArgs)
 
 3652        State->EndsWithTemplateArgs = 
true;
 
 3654    } 
else if (
look() == 
'D' && (
look(1) == 
't' || 
look(1) == 
'T')) {
 
 3656      if (SoFar != 
nullptr)
 
 3662      if (
look() == 
'S') {
 
 3665        if (
look(1) == 
't') {
 
 3673        if (S->
getKind() == Node::KModuleName) {
 
 3675        } 
else if (SoFar != 
nullptr) {
 
 3687    if (SoFar == 
nullptr)
 
 3689    Subs.push_back(SoFar);
 
 3696  if (SoFar == 
nullptr || 
Subs.empty())
 
 
 3704template <
typename Derived, 
typename Alloc>
 
 3709  if (
look() == 
'I') {
 
 
 3720template <
typename Derived, 
typename Alloc>
 
 3723  if (std::isdigit(
look()))
 
 3727  if (Result == 
nullptr)
 
 
 3735template <
typename Derived, 
typename Alloc>
 
 3737  if (
look() == 
'T') {
 
 3744  if (
look() == 
'D') {
 
 
 3761template <
typename Derived, 
typename Alloc>
 
 3763  if (std::isdigit(
look()))
 
 3772  if (Oper == 
nullptr)
 
 3774  if (
look() == 
'I') {
 
 
 3795template <
typename Derived, 
typename Alloc>
 
 3797  Node *SoFar = 
nullptr;
 
 3803    if (SoFar == 
nullptr)
 
 3806    if (
look() == 
'I') {
 
 3817      if (Qual == 
nullptr)
 
 3825    if (Base == 
nullptr)
 
 3832    SoFar = 
getDerived().parseBaseUnresolvedName();
 
 3833    if (SoFar == 
nullptr)
 
 3841  if (std::isdigit(
look())) {
 
 3844      if (Qual == 
nullptr)
 
 3860    if (SoFar == 
nullptr)
 
 3863    if (
look() == 
'I') {
 
 3876  if (Base == 
nullptr)
 
 
 3883template <
typename Derived, 
typename Alloc>
 
 3897template <
typename Alloc, 
typename Derived>
 
 3900  const char *Tmp = 
First;
 
 3904    return std::string_view();
 
 3907  return std::string_view(Tmp, 
First - Tmp);
 
 
 3911template <
typename Alloc, 
typename Derived>
 
 3916  while (
look() >= 
'0' && 
look() <= 
'9') {
 
 3918    *Out += 
static_cast<size_t>(
consume() - 
'0');
 
 
 3923template <
typename Alloc, 
typename Derived>
 
 3941template <
typename Derived, 
typename Alloc>
 
 3945  Node *ExceptionSpec = 
nullptr;
 
 3958    size_t SpecsBegin = 
Names.size();
 
 3977  if (ReturnType == 
nullptr)
 
 3981  size_t ParamsBegin = 
Names.size();
 
 4003                            ReferenceQualifier, ExceptionSpec);
 
 
 4011template <
typename Derived, 
typename Alloc>
 
 4015  if (
look() >= 
'1' && 
look() <= 
'9') {
 
 4017    if (!DimensionNumber)
 
 4024    if (ElemType == 
nullptr)
 
 
 4048template <
typename Derived, 
typename Alloc>
 
 4064template <
typename Derived, 
typename Alloc>
 
 4069  Node *Dimension = 
nullptr;
 
 4071  if (std::isdigit(
look())) {
 
 4079    if (DimExpr == 
nullptr)
 
 4083    Dimension = DimExpr;
 
 
 4093template <
typename Derived, 
typename Alloc>
 
 4098  if (ClassType == 
nullptr)
 
 4101  if (MemberType == 
nullptr)
 
 
 4110template <
typename Derived, 
typename Alloc>
 
 4112  std::string_view ElabSpef;
 
 4114    ElabSpef = 
"struct";
 
 4121  if (Name == 
nullptr)
 
 4124  if (!ElabSpef.empty())
 
 
 4133template <
typename Derived, 
typename Alloc>
 
 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);
 
 4153      if (Child == 
nullptr)
 
 4159    if (
look() == 
'I') {
 
 4166    if (Child == 
nullptr)
 
 
 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'))) {
 
 4357      if (!DimensionNumber)
 
 4416      if (
look(1) == 
'A') {
 
 4436      if (
look(1) == 
'R') {
 
 4500      std::string_view Kind = 
look(1) == 
'k' ? 
" auto" : 
" decltype(auto)";
 
 4554    Result = 
getDerived().parsePointerToMemberType();
 
 4560    if (
look(1) == 
's' || 
look(1) == 
'u' || 
look(1) == 
'e') {
 
 4566    if (Result == 
nullptr)
 
 4580      Subs.push_back(Result);
 
 4635    if (
look(1) != 
't') {
 
 4636      bool IsSubst = 
false;
 
 4637      Result = 
getDerived().parseUnscopedName(
nullptr, &IsSubst);
 
 4653          Subs.push_back(Result);
 
 4658      } 
else if (IsSubst) {
 
 4677  if (Result != 
nullptr)
 
 4678    Subs.push_back(Result);
 
 
 4682template <
typename Derived, 
typename Alloc>
 
 4692template <
typename Derived, 
typename Alloc>
 
 4705template <
typename Derived, 
typename Alloc>
 
 4707    std::string_view Lit) {
 
 
 4715template <
typename Alloc, 
typename Derived>
 
 4732template <
typename Derived, 
typename Alloc>
 
 4759template <
typename Derived, 
typename Alloc>
 
 4773    size_t ExprsBegin = 
Names.size();
 
 4785  if (
E[0] == 
nullptr)
 
 
 4797template <
typename Derived, 
typename Alloc>
 
 4804    return getDerived().parseIntegerLiteral(
"wchar_t");
 
 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");
 
 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");
 
 4858#if defined(__powerpc__) || defined(__s390__) 
 
 4917template <
typename Derived, 
typename Alloc>
 
 4919  if (
look() == 
'd') {
 
 4924      if (
Field == 
nullptr)
 
 4927      if (Init == 
nullptr)
 
 4934      if (Index == 
nullptr)
 
 4937      if (Init == 
nullptr)
 
 4944      if (RangeBegin == 
nullptr)
 
 4947      if (RangeEnd == 
nullptr)
 
 4950      if (Init == 
nullptr)
 
 
 4964template <
typename Derived, 
typename Alloc>
 
 4969  bool IsLeftFold = 
false, HasInitializer = 
false;
 
 4975    HasInitializer = 
true;
 
 4978    HasInitializer = 
true;
 
 4993            && Op->getName().back() == 
'*')))
 
 4997  if (Pack == 
nullptr)
 
 5000  Node *Init = 
nullptr;
 
 5001  if (HasInitializer) {
 
 5003    if (Init == 
nullptr)
 
 5007  if (IsLeftFold && Init)
 
 
 5016template <
typename Derived, 
typename Alloc>
 
 5026  std::string_view Offset = 
getDerived().parseNumber(
true);
 
 
 5036template <
typename Derived, 
typename Alloc>
 
 5044  std::string_view Offset = 
getDerived().parseNumber(
true);
 
 5045  size_t SelectorsBegin = 
Names.size();
 
 5050    Names.push_back(Selector);
 
 
 5059template <
typename Derived, 
typename Alloc>
 
 5068template <
typename Derived, 
typename Alloc>
 
 5073    size_t ParamsBegin = 
Names.size();
 
 5076      if (
Type == 
nullptr)
 
 5086  size_t ReqsBegin = 
Names.size();
 
 5088    Node *Constraint = 
nullptr;
 
 5092      if (Expr == 
nullptr)
 
 5095      Node *TypeReq = 
nullptr;
 
 5098        if (TypeReq == 
nullptr)
 
 5105      if (
Type == 
nullptr)
 
 5117      if (NestedReq == 
nullptr)
 
 5121    if (Constraint == 
nullptr)
 
 5123    Names.push_back(Constraint);
 
 
 5174template <
typename Derived, 
typename Alloc>
 
 5180    auto Sym = Op->getSymbol();
 
 5181    switch (Op->getKind()) {
 
 5184      return getDerived().parseBinaryExpr(Sym, Op->getPrecedence());
 
 5187      return getDerived().parsePrefixExpr(Sym, Op->getPrecedence());
 
 5191        return getDerived().parsePrefixExpr(Sym, Op->getPrecedence());
 
 5200      if (Base == 
nullptr)
 
 5203      if (Index == 
nullptr)
 
 5223      size_t Exprs = 
Names.size();
 
 5228        Names.push_back(Ex);
 
 5235      size_t InitsBegin = 
Names.size();
 
 5240        if (Init == 
nullptr)
 
 5242        Names.push_back(Init);
 
 5246                           Op->getFlag(), Op->getPrecedence());
 
 5254                              Op->getPrecedence());
 
 5259      if (Callee == 
nullptr)
 
 5261      size_t ExprsBegin = 
Names.size();
 
 5269                            Op->getFlag(), Op->getPrecedence());
 
 5281      size_t ExprsBegin = 
Names.size();
 
 5292      if (!IsMany && Exprs.
size() != 1)
 
 5299      if (
Cond == 
nullptr)
 
 5342  if (
look() == 
'f') {
 
 5344    if (
look(1) == 
'p' || (
look(1) == 
'L' && std::isdigit(
look(2))))
 
 5349    size_t InitsBegin = 
Names.size();
 
 5366  if (
look() == 
'r' && (
look(1) == 
'q' || 
look(1) == 
'Q'))
 
 5372    if (Child == 
nullptr)
 
 5377    if (
look() == 
'T') {
 
 5389    size_t ArgsBegin = 
Names.size();
 
 5394      Names.push_back(Arg);
 
 5405    size_t InitsBegin = 
Names.size();
 
 5431    bool IsUUID = 
false;
 
 5433    if (Name->getBaseName() == 
"__uuidof") {
 
 5442    size_t ExprsBegin = 
Names.size();
 
 5444      if (
UUID == 
nullptr)
 
 5460  return getDerived().parseUnresolvedName(Global);
 
 
 5471template <
typename Alloc, 
typename Derived>
 
 5504template <
typename Derived, 
typename Alloc>
 
 5557      if (Encoding == 
nullptr)
 
 5566      if (FirstType == 
nullptr)
 
 5571      if (SecondType == 
nullptr)
 
 5579      if (Name == 
nullptr)
 
 5587      if (Name == 
nullptr)
 
 5594      bool IsVirt = 
look() == 
'v';
 
 5598      if (BaseEncoding == 
nullptr)
 
 5612      if (Name == 
nullptr)
 
 5622      if (Name == 
nullptr)
 
 
 5649template <
typename Derived, 
typename Alloc>
 
 5655  if (
look() == 
'G' || 
look() == 
'T')
 
 5658  auto IsEndOfEncoding = [&] {
 
 5667  if (Name == 
nullptr)
 
 5673  if (IsEndOfEncoding())
 
 5686  Node *Attrs = 
nullptr;
 
 5688    size_t BeforeArgs = 
Names.size();
 
 5693      Names.push_back(Arg);
 
 5700  Node *ReturnType = 
nullptr;
 
 5703    if (ReturnType == 
nullptr)
 
 5709    size_t ParamsBegin = 
Names.size();
 
 5715      const bool IsFirstParam = ParamsBegin == 
Names.size();
 
 5722      Names.push_back(Ty);
 
 5723    } 
while (!IsEndOfEncoding() && 
look() != 
'Q');
 
 5727  Node *Requires = 
nullptr;
 
 5729    Requires = 
getDerived().parseConstraintExpr();
 
 
 5739template <
class Float>
 
 5747    static constexpr const char* 
spec = 
"%af";
 
 
 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__ 
 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'))
 
 
 5798template <
typename Alloc, 
typename Derived>
 
 5800  if (!(
look() >= 
'0' && 
look() <= 
'9') &&
 
 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>
 
 5836  if (
look() >= 
'a' && 
look() <= 
'z') {
 
 5869    if (WithTags != SpecialSub) {
 
 5870      Subs.push_back(WithTags);
 
 5871      SpecialSub = WithTags;
 
 
 5897template <
typename Derived, 
typename Alloc>
 
 5899  const char *Begin = 
First;
 
 
 5967template <
typename Derived, 
typename Alloc>
 
 6015    size_t ParamsBegin = 
Names.size();
 
 6017    Node *Requires = 
nullptr;
 
 6024        Requires = 
getDerived().parseConstraintExpr();
 
 6025        if (Requires == 
nullptr || !
consumeIf(
'E'))
 
 
 6050template <
typename Derived, 
typename Alloc>
 
 6062    size_t ArgsBegin = 
Names.size();
 
 6067      Names.push_back(Arg);
 
 6074    if (
look(1) == 
'Z') {
 
 
 6103template <
typename Derived, 
typename Alloc>
 
 6117  size_t ArgsBegin = 
Names.size();
 
 6118  Node *Requires = 
nullptr;
 
 6124      Names.push_back(Arg);
 
 6126      if (Arg->
getKind() == Node::KTemplateParamQualifiedArg) {
 
 6130      if (Arg->
getKind() == Node::KTemplateArgumentPack) {
 
 6141      Names.push_back(Arg);
 
 6144      Requires = 
getDerived().parseConstraintExpr();
 
 
 6158template <
typename Derived, 
typename Alloc>
 
 6162    if (Encoding == 
nullptr)
 
 6164    if (
look() == 
'.') {
 
 6176    if (Encoding == 
nullptr || !
consumeIf(
"_block_invoke"))
 
 
 
 6194template <
typename Alloc>
 
 6206#if defined(__clang__) 
 6207#pragma clang diagnostic pop 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
AMDGPU Prepare AGPR Alloc
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
#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
DEMANGLE_ABI const char * parse_discriminator(const char *first, const char *last)
Qualifiers operator|=(Qualifiers &Q1, Qualifiers Q2)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
FloatLiteralImpl< long double > LongDoubleLiteral
FloatLiteralImpl< float > FloatLiteral
FloatLiteralImpl< double > DoubleLiteral
Machine Check Debug Module
OptimizedStructLayoutField Field
static StringRef getName(Value *V)
const SmallVectorImpl< MachineOperand > & Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
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_)
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_)
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
friend class OutputBuffer
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
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
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_)
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
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
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
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
PODSmallVector< Node *, 8 > TemplateParamList
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()
static const OperatorInfo Ops[]
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)
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
static const size_t mangled_size
static const size_t max_demangled_size
static constexpr const char * spec
static constexpr const char * spec
static const size_t mangled_size
static const size_t max_demangled_size
static const size_t max_demangled_size
static constexpr const char * spec
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.