16#ifndef DEMANGLE_ITANIUMDEMANGLE_H
17#define DEMANGLE_ITANIUMDEMANGLE_H
34#pragma clang diagnostic push
35#pragma clang diagnostic ignored "-Wunused-template"
41 static_assert(std::is_trivial<T>::value,
42 "T is required to be a trivial type");
48 bool isInline()
const {
return First == Inline; }
56 void reserve(
size_t NewCap) {
59 auto *Tmp =
static_cast<T *
>(std::malloc(NewCap *
sizeof(
T)));
62 std::copy(First, Last, Tmp);
65 First =
static_cast<T *
>(std::realloc(First, NewCap *
sizeof(
T)));
80 if (
Other.isInline()) {
82 Last = First +
Other.size();
94 if (
Other.isInline()) {
100 Last = First +
Other.size();
135 Last = First +
Index;
141 bool empty()
const {
return First == Last; }
142 size_t size()
const {
return static_cast<size_t>(Last - First); }
166#define NODE(NodeKind) K##NodeKind,
167#include "ItaniumNodes.def"
229 template<
typename Fn>
void visit(Fn
F)
const;
273 bool StrictlyWorse =
false)
const {
322 : Elements(Elements_), NumElements(NumElements_) {}
324 bool empty()
const {
return NumElements == 0; }
325 size_t size()
const {
return NumElements; }
328 Node **
end()
const {
return Elements + NumElements; }
333 bool FirstElement =
true;
334 for (
size_t Idx = 0;
Idx != NumElements; ++
Idx) {
335 size_t BeforeComma = OB.getCurrentPosition();
338 size_t AfterComma = OB.getCurrentPosition();
343 if (AfterComma == OB.getCurrentPosition()) {
344 OB.setCurrentPosition(BeforeComma);
348 FirstElement =
false;
368 const std::string_view Suffix;
372 :
Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {}
374 template<
typename Fn>
void match(Fn
F)
const {
F(Prefix, Suffix); }
386 std::string_view Ext;
391 :
Node(KVendorExtQualType), Ty(Ty_), Ext(Ext_), TA(TA_) {}
394 std::string_view
getExt()
const {
return Ext; }
397 template <
typename Fn>
void match(Fn
F)
const {
F(Ty, Ext, TA); }
473 :
Node(KConversionOperatorType), Ty(Ty_) {}
475 template<
typename Fn>
void match(Fn
F)
const {
F(Ty); }
485 const std::string_view Postfix;
489 :
Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {}
491 template<
typename Fn>
void match(Fn
F)
const {
F(Ty, Postfix); }
500 const std::string_view Name;
505 template<
typename Fn>
void match(Fn
F)
const {
F(Name); }
507 std::string_view
getName()
const {
return Name; }
519 :
Node(KBitIntType), Size(Size_), Signed(Signed_) {}
521 template <
typename Fn>
void match(Fn
F)
const {
F(Size, Signed); }
528 Size->printAsOperand(OB);
534 std::string_view
Kind;
538 :
Node(KElaboratedTypeSpefType),
Kind(Kind_), Child(Child_) {}
550 std::string_view Transform;
554 :
Node(KTransformedType), Transform(Transform_),
BaseType(BaseType_) {}
591 :
Node(KEnableIfAttr), Conditions(Conditions_) {}
593 template<
typename Fn>
void match(Fn
F)
const {
F(Conditions); }
596 OB +=
" [enable_if:";
604 std::string_view Protocol;
610 :
Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {}
612 template<
typename Fn>
void match(Fn
F)
const {
F(Ty, Protocol); }
615 return Ty->
getKind() == KNameType &&
637 template<
typename Fn>
void match(Fn
F)
const {
F(Pointee); }
640 return Pointee->hasRHSComponent(OB);
645 if (Pointee->getKind() != KObjCProtoName ||
647 Pointee->printLeft(OB);
648 if (Pointee->hasArray(OB))
650 if (Pointee->hasArray(OB) || Pointee->hasFunction(OB))
654 const auto *objcProto =
static_cast<const ObjCProtoName *
>(Pointee);
656 OB += objcProto->Protocol;
662 if (Pointee->getKind() != KObjCProtoName ||
664 if (Pointee->hasArray(OB) || Pointee->hasFunction(OB))
666 Pointee->printRight(OB);
681 mutable bool Printing =
false;
690 std::pair<ReferenceKind, const Node *> collapse(
OutputBuffer &OB)
const {
691 auto SoFar = std::make_pair(RK, Pointee);
697 if (SN->
getKind() != KReferenceType)
700 SoFar.second = RT->Pointee;
701 SoFar.first = std::min(SoFar.first, RT->RK);
705 if (Prev.
size() > 1 && SoFar.second == Prev[(Prev.
size() - 1) / 2]) {
707 SoFar.second =
nullptr;
717 Pointee(Pointee_), RK(RK_) {}
719 template<
typename Fn>
void match(Fn
F)
const {
F(Pointee, RK); }
729 std::pair<ReferenceKind, const Node *> Collapsed = collapse(OB);
730 if (!Collapsed.second)
732 Collapsed.second->printLeft(OB);
733 if (Collapsed.second->hasArray(OB))
735 if (Collapsed.second->hasArray(OB) || Collapsed.second->hasFunction(OB))
738 OB += (Collapsed.first == ReferenceKind::LValue ?
"&" :
"&&");
744 std::pair<ReferenceKind, const Node *> Collapsed = collapse(OB);
745 if (!Collapsed.second)
747 if (Collapsed.second->hasArray(OB) || Collapsed.second->hasFunction(OB))
749 Collapsed.second->printRight(OB);
754 const Node *ClassType;
755 const Node *MemberType;
760 ClassType(ClassType_), MemberType(MemberType_) {}
762 template<
typename Fn>
void match(Fn
F)
const {
F(ClassType, MemberType); }
774 ClassType->print(OB);
794 Base(Base_), Dimension(Dimension_) {}
796 template<
typename Fn>
void match(Fn
F)
const {
F(Base, Dimension); }
804 if (OB.back() !=
']')
808 Dimension->print(OB);
810 Base->printRight(OB);
814 const NodeArray &Elements)
const override {
815 if (Base->getKind() == KNameType &&
817 return Elements.printAsString(OB);
828 const Node *ExceptionSpec;
833 :
Node(KFunctionType,
836 Ret(Ret_), Params(Params_), CVQuals(CVQuals_), RefQual(RefQual_),
837 ExceptionSpec(ExceptionSpec_) {}
839 template<
typename Fn>
void match(Fn
F)
const {
840 F(Ret, Params, CVQuals, RefQual, ExceptionSpec);
876 if (ExceptionSpec !=
nullptr) {
878 ExceptionSpec->
print(OB);
888 template<
typename Fn>
void match(Fn
F)
const {
F(E); }
902 :
Node(KDynamicExceptionSpec), Types(Types_) {}
904 template<
typename Fn>
void match(Fn
F)
const {
F(Types); }
909 Types.printWithComma(OB);
926 :
Node(KExplicitObjectParameter), Base(Base_) {
929 "Creating an ExplicitObjectParameter without a valid Base Node.");
932 template <
typename Fn>
void match(Fn
F)
const {
F(Base); }
945 const Node *Requires;
951 const Node *Attrs_,
const Node *Requires_,
953 :
Node(KFunctionEncoding,
956 Ret(Ret_), Name(Name_), Params(Params_), Attrs(Attrs_),
957 Requires(Requires_), CVQuals(CVQuals_), RefQual(RefQual_) {}
959 template<
typename Fn>
void match(Fn
F)
const {
960 F(Ret, Name, Params, Attrs, Requires, CVQuals, RefQual);
976 if (!Ret->hasRHSComponent(OB))
1001 if (Attrs !=
nullptr)
1004 if (Requires !=
nullptr) {
1006 Requires->
print(OB);
1021 OB +=
"operator\"\" ";
1027 const std::string_view Special;
1032 :
Node(KSpecialName), Special(Special_), Child(Child_) {}
1034 template<
typename Fn>
void match(Fn
F)
const {
F(Special, Child); }
1043 const Node *FirstType;
1044 const Node *SecondType;
1048 :
Node(KCtorVtableSpecialName),
1049 FirstType(FirstType_), SecondType(SecondType_) {}
1051 template<
typename Fn>
void match(Fn
F)
const {
F(FirstType, SecondType); }
1054 OB +=
"construction vtable for ";
1055 FirstType->print(OB);
1057 SecondType->
print(OB);
1084 :
Node(KMemberLikeFriendName),
Qual(Qual_),
Name(Name_) {}
1106 template <
typename Fn>
void match(Fn
F)
const {
1155 const Node *Qualifier;
1160 :
Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {}
1162 template<
typename Fn>
void match(Fn
F)
const {
F(Qualifier, Name); }
1164 std::string_view
getBaseName()
const override {
return Name->getBaseName(); }
1167 Qualifier->print(OB);
1175 const Node *Dimension;
1179 :
Node(KVectorType),
BaseType(BaseType_), Dimension(Dimension_) {}
1190 Dimension->print(OB);
1196 const Node *Dimension;
1200 :
Node(KPixelVectorType), Dimension(Dimension_) {}
1202 template<
typename Fn>
void match(Fn
F)
const {
F(Dimension); }
1206 OB +=
"pixel vector[";
1207 Dimension->print(OB);
1213 const Node *Dimension;
1217 :
Node(KBinaryFPType), Dimension(Dimension_) {}
1219 template<
typename Fn>
void match(Fn
F)
const {
F(Dimension); }
1223 Dimension->print(OB);
1241 :
Node(KSyntheticTemplateParamName),
Kind(Kind_), Index(Index_) {}
1247 case TemplateParamKind::Type:
1250 case TemplateParamKind::NonType:
1253 case TemplateParamKind::Template:
1268 :
Node(KTemplateParamQualifiedArg), Param(Param_), Arg(Arg_) {}
1270 template <
typename Fn>
void match(Fn
F)
const {
F(Param, Arg); }
1286 :
Node(KTypeTemplateParamDecl,
Cache::
Yes), Name(Name_) {}
1288 template<
typename Fn>
void match(Fn
F)
const {
F(Name); }
1303 Constraint(Constraint_), Name(Name_) {}
1305 template<
typename Fn>
void match(Fn
F)
const {
F(Constraint, Name); }
1308 Constraint->print(OB);
1322 :
Node(KNonTypeTemplateParamDecl,
Cache::
Yes), Name(Name_), Type(Type_) {}
1324 template<
typename Fn>
void match(Fn
F)
const {
F(Name, Type); }
1327 Type->printLeft(OB);
1328 if (!Type->hasRHSComponent(OB))
1334 Type->printRight(OB);
1347 :
Node(KTemplateTemplateParamDecl,
Cache::
Yes), Name(Name_),
1348 Params(Params_), Requires(Requires_) {}
1350 template <
typename Fn>
void match(Fn
F)
const {
F(Name, Params, Requires); }
1356 OB +=
"> typename ";
1361 if (Requires !=
nullptr) {
1363 Requires->
print(OB);
1374 :
Node(KTemplateParamPackDecl,
Cache::
Yes), Param(Param_) {}
1376 template<
typename Fn>
void match(Fn
F)
const {
F(Param); }
1379 Param->printLeft(OB);
1400 if (OB.CurrentPackMax == std::numeric_limits<unsigned>::max()) {
1401 OB.CurrentPackMax =
static_cast<unsigned>(Data.size());
1402 OB.CurrentPackIndex = 0;
1409 if (std::all_of(Data.begin(), Data.end(),
1410 [](
Node *
P) { return P->getArrayCache() == Cache::No; }))
1412 if (std::all_of(Data.begin(), Data.end(),
1413 [](
Node *
P) { return P->getFunctionCache() == Cache::No; }))
1415 if (std::all_of(Data.begin(), Data.end(), [](
Node *
P) {
1416 return P->getRHSComponentCache() == Cache::No;
1421 template<
typename Fn>
void match(Fn
F)
const {
F(Data); }
1424 initializePackExpansion(OB);
1425 size_t Idx = OB.CurrentPackIndex;
1426 return Idx < Data.size() && Data[
Idx]->hasRHSComponent(OB);
1429 initializePackExpansion(OB);
1430 size_t Idx = OB.CurrentPackIndex;
1431 return Idx < Data.size() && Data[
Idx]->hasArray(OB);
1434 initializePackExpansion(OB);
1435 size_t Idx = OB.CurrentPackIndex;
1436 return Idx < Data.size() && Data[
Idx]->hasFunction(OB);
1439 initializePackExpansion(OB);
1440 size_t Idx = OB.CurrentPackIndex;
1441 return Idx < Data.size() ? Data[
Idx]->getSyntaxNode(OB) :
this;
1445 initializePackExpansion(OB);
1446 size_t Idx = OB.CurrentPackIndex;
1447 if (
Idx < Data.size())
1448 Data[
Idx]->printLeft(OB);
1451 initializePackExpansion(OB);
1452 size_t Idx = OB.CurrentPackIndex;
1453 if (
Idx < Data.size())
1454 Data[
Idx]->printRight(OB);
1467 :
Node(KTemplateArgumentPack), Elements(Elements_) {}
1469 template<
typename Fn>
void match(Fn
F)
const {
F(Elements); }
1474 Elements.printWithComma(OB);
1485 :
Node(KParameterPackExpansion), Child(Child_) {}
1487 template<
typename Fn>
void match(Fn
F)
const {
F(Child); }
1492 constexpr unsigned Max = std::numeric_limits<unsigned>::max();
1495 size_t StreamPos = OB.getCurrentPosition();
1503 if (OB.CurrentPackMax == Max) {
1510 if (OB.CurrentPackMax == 0) {
1511 OB.setCurrentPosition(StreamPos);
1516 for (
unsigned I = 1,
E = OB.CurrentPackMax;
I <
E; ++
I) {
1518 OB.CurrentPackIndex =
I;
1530 :
Node(KTemplateArgs), Params(Params_), Requires(Requires_) {}
1532 template<
typename Fn>
void match(Fn
F)
const {
F(Params, Requires); }
1539 Params.printWithComma(OB);
1581 template<
typename Fn>
void match(Fn
F)
const =
delete;
1645 :
Node(KGlobalQualifiedName), Child(Child_) {}
1647 template<
typename Fn>
void match(Fn
F)
const {
F(Child); }
1649 std::string_view
getBaseName()
const override {
return Child->getBaseName(); }
1687 case SpecialSubKind::allocator:
1688 return {
"allocator"};
1689 case SpecialSubKind::basic_string:
1690 return {
"basic_string"};
1691 case SpecialSubKind::string:
1692 return {
"basic_string"};
1693 case SpecialSubKind::istream:
1694 return {
"basic_istream"};
1695 case SpecialSubKind::ostream:
1696 return {
"basic_ostream"};
1697 case SpecialSubKind::iostream:
1698 return {
"basic_iostream"};
1707 OB <<
"<char, std::char_traits<char>";
1708 if (
SSK == SpecialSubKind::string)
1709 OB <<
", std::allocator<char>";
1727 SV.remove_prefix(
sizeof(
"basic_") - 1);
1742 const Node *Basename;
1748 :
Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_),
1749 Variant(Variant_) {}
1751 template<
typename Fn>
void match(Fn
F)
const {
F(Basename, IsDtor, Variant); }
1756 OB += Basename->getBaseName();
1766 template<
typename Fn>
void match(Fn
F)
const {
F(Base); }
1770 Base->printLeft(OB);
1775 const std::string_view Count;
1779 :
Node(KUnnamedTypeName), Count(Count_) {}
1781 template<
typename Fn>
void match(Fn
F)
const {
F(Count); }
1792 const Node *Requires1;
1794 const Node *Requires2;
1795 std::string_view Count;
1800 std::string_view Count_)
1801 :
Node(KClosureTypeName), TemplateParams(TemplateParams_),
1802 Requires1(Requires1_), Params(Params_), Requires2(Requires2_),
1805 template<
typename Fn>
void match(Fn
F)
const {
1806 F(TemplateParams, Requires1, Params, Requires2, Count);
1810 if (!TemplateParams.
empty()) {
1816 if (Requires1 !=
nullptr) {
1818 Requires1->
print(OB);
1824 if (Requires2 !=
nullptr) {
1826 Requires2->
print(OB);
1843 :
Node(KStructuredBindingName), Bindings(Bindings_) {}
1845 template<
typename Fn>
void match(Fn
F)
const {
F(Bindings); }
1858 const std::string_view InfixOperator;
1864 :
Node(KBinaryExpr, Prec_),
LHS(LHS_), InfixOperator(InfixOperator_),
1867 template <
typename Fn>
void match(Fn
F)
const {
1872 bool ParenAll = OB.isGtInsideTemplateArgs() &&
1873 (InfixOperator ==
">" || InfixOperator ==
">>");
1880 if (!(InfixOperator ==
","))
1882 OB += InfixOperator;
1896 :
Node(KArraySubscriptExpr, Prec_), Op1(Op1_), Op2(Op2_) {}
1898 template <
typename Fn>
void match(Fn
F)
const {
1912 const std::string_view Operator;
1916 :
Node(KPostfixExpr, Prec_), Child(Child_), Operator(Operator_) {}
1918 template <
typename Fn>
void match(Fn
F)
const {
1936 :
Node(KConditionalExpr, Prec_),
Cond(Cond_), Then(Then_), Else(Else_) {}
1938 template <
typename Fn>
void match(Fn
F)
const {
1945 Then->printAsOperand(OB);
1953 const std::string_view
Kind;
1961 template <
typename Fn>
void match(Fn
F)
const {
1974 const Node *SubExpr;
1975 std::string_view Offset;
1981 std::string_view Offset_,
NodeArray UnionSelectors_,
1982 bool OnePastTheEnd_)
1983 :
Node(KSubobjectExpr), Type(Type_), SubExpr(SubExpr_), Offset(Offset_),
1984 UnionSelectors(UnionSelectors_), OnePastTheEnd(OnePastTheEnd_) {}
1986 template<
typename Fn>
void match(Fn
F)
const {
1987 F(Type, SubExpr, Offset, UnionSelectors, OnePastTheEnd);
1994 OB +=
" at offset ";
1995 if (Offset.empty()) {
1997 }
else if (Offset[0] ==
'n') {
1999 OB += std::string_view(Offset.data() + 1, Offset.size() - 1);
2008 const std::string_view Prefix;
2010 const std::string_view Postfix;
2015 :
Node(KEnclosingExpr, Prec_), Prefix(Prefix_), Infix(Infix_) {}
2017 template <
typename Fn>
void match(Fn
F)
const {
2032 const std::string_view CastKind;
2039 :
Node(KCastExpr, Prec_), CastKind(CastKind_), To(To_),
From(From_) {}
2041 template <
typename Fn>
void match(Fn
F)
const {
2054 From->printAsOperand(OB);
2064 :
Node(KSizeofParamPackExpr), Pack(Pack_) {}
2066 template<
typename Fn>
void match(Fn
F)
const {
F(Pack); }
2084 :
Node(KCallExpr, Prec_), Callee(Callee_), Args(Args_),
2085 IsParen(IsParen_) {}
2087 template <
typename Fn>
void match(Fn
F)
const {
2098 Args.printWithComma(OB);
2112 bool IsArray_,
Prec Prec_)
2113 :
Node(KNewExpr, Prec_), ExprList(ExprList_), Type(Type_),
2114 InitList(InitList_), IsGlobal(IsGlobal_), IsArray(IsArray_) {}
2116 template<
typename Fn>
void match(Fn
F)
const {
2126 if (!ExprList.
empty()) {
2133 if (!InitList.
empty()) {
2148 :
Node(KDeleteExpr, Prec_), Op(Op_), IsGlobal(IsGlobal_),
2149 IsArray(IsArray_) {}
2151 template <
typename Fn>
void match(Fn
F)
const {
2167 std::string_view Prefix;
2172 :
Node(KPrefixExpr, Prec_), Prefix(Prefix_), Child(Child_) {}
2174 template <
typename Fn>
void match(Fn
F)
const {
2185 std::string_view Number;
2205 :
Node(KConversionExpr, Prec_), Type(Type_), Expressions(Expressions_) {}
2207 template <
typename Fn>
void match(Fn
F)
const {
2223 const Node *SubExpr;
2224 std::string_view Offset;
2228 std::string_view Offset_,
Prec Prec_)
2229 :
Node(KPointerToMemberConversionExpr, Prec_), Type(Type_),
2230 SubExpr(SubExpr_), Offset(Offset_) {}
2232 template <
typename Fn>
void match(Fn
F)
const {
2251 :
Node(KInitListExpr), Ty(Ty_), Inits(Inits_) {}
2253 template<
typename Fn>
void match(Fn
F)
const {
F(Ty, Inits); }
2273 :
Node(KBracedExpr), Elem(Elem_), Init(Init_), IsArray(IsArray_) {}
2275 template<
typename Fn>
void match(Fn
F)
const {
F(Elem, Init, IsArray); }
2286 if (Init->
getKind() != KBracedExpr && Init->
getKind() != KBracedRangeExpr)
2298 :
Node(KBracedRangeExpr), First(First_), Last(Last_), Init(Init_) {}
2300 template<
typename Fn>
void match(Fn
F)
const {
F(First, Last, Init); }
2308 if (Init->
getKind() != KBracedExpr && Init->
getKind() != KBracedRangeExpr)
2315 const Node *Pack, *Init;
2316 std::string_view OperatorName;
2320 FoldExpr(
bool IsLeftFold_, std::string_view OperatorName_,
const Node *Pack_,
2322 :
Node(KFoldExpr), Pack(Pack_), Init(Init_), OperatorName(OperatorName_),
2323 IsLeftFold(IsLeftFold_) {}
2325 template<
typename Fn>
void match(Fn
F)
const {
2326 F(IsLeftFold, OperatorName, Pack, Init);
2330 auto PrintPack = [&] {
2340 if (!IsLeftFold || Init !=
nullptr) {
2346 OB <<
" " << OperatorName <<
" ";
2349 if (IsLeftFold || Init !=
nullptr) {
2351 OB <<
" " << OperatorName <<
" ";
2367 template<
typename Fn>
void match(Fn
F)
const {
F(Op); }
2381 template<
typename Fn>
void match(Fn
F)
const {
F(Value); }
2384 OB += Value ? std::string_view(
"true") : std::string_view(
"false");
2394 template<
typename Fn>
void match(Fn
F)
const {
F(Type); }
2409 template<
typename Fn>
void match(Fn
F)
const {
F(Type); }
2413 if (Type->getKind() == KClosureTypeName)
2422 std::string_view Integer;
2426 :
Node(KEnumLiteral), Ty(Ty_), Integer(Integer_) {}
2428 template<
typename Fn>
void match(Fn
F)
const {
F(Ty, Integer); }
2435 if (Integer[0] ==
'n')
2436 OB <<
'-' << std::string_view(Integer.data() + 1, Integer.size() - 1);
2443 std::string_view Type;
2444 std::string_view Value;
2448 :
Node(KIntegerLiteral), Type(Type_), Value(Value_) {}
2450 template<
typename Fn>
void match(Fn
F)
const {
F(Type, Value); }
2453 if (Type.size() > 3) {
2459 if (Value[0] ==
'n')
2460 OB <<
'-' << std::string_view(Value.data() + 1, Value.size() - 1);
2464 if (Type.size() <= 3)
2468 std::string_view
value()
const {
return Value; }
2476 :
Node(KRequiresExpr), Parameters(Parameters_),
2477 Requirements(Requirements_) {}
2479 template<
typename Fn>
void match(Fn
F)
const {
F(Parameters, Requirements); }
2483 if (!Parameters.empty()) {
2486 Parameters.printWithComma(OB);
2491 for (
const Node *Req : Requirements) {
2502 const Node *TypeConstraint;
2505 const Node *TypeConstraint_)
2506 :
Node(KExprRequirement), Expr(Expr_), IsNoexcept(IsNoexcept_),
2507 TypeConstraint(TypeConstraint_) {}
2509 template <
typename Fn>
void match(Fn
F)
const {
2510 F(Expr, IsNoexcept, TypeConstraint);
2515 if (IsNoexcept || TypeConstraint)
2518 if (IsNoexcept || TypeConstraint)
2522 if (TypeConstraint) {
2524 TypeConstraint->
print(OB);
2534 :
Node(KTypeRequirement), Type(Type_) {}
2536 template <
typename Fn>
void match(Fn
F)
const {
F(Type); }
2546 const Node *Constraint;
2549 :
Node(KNestedRequirement), Constraint(Constraint_) {}
2551 template <
typename Fn>
void match(Fn
F)
const {
F(Constraint); }
2555 Constraint->
print(OB);
2564 return Node::KFloatLiteral;
2567 return Node::KDoubleLiteral;
2570 return Node::KLongDoubleLiteral;
2575 const std::string_view Contents;
2577 static constexpr Kind KindForClass =
2582 :
Node(KindForClass), Contents(Contents_) {}
2584 template<
typename Fn>
void match(Fn
F)
const {
F(Contents); }
2588 if (Contents.size() >=
N) {
2591 char buf[
sizeof(
Float)];
2593 const char *t = Contents.data();
2594 const char *last = t +
N;
2596 for (; t != last; ++t, ++e) {
2597 unsigned d1 = isdigit(*t) ?
static_cast<unsigned>(*t -
'0')
2598 :
static_cast<unsigned>(*t -
'a' + 10);
2600 unsigned d0 = isdigit(*t) ?
static_cast<unsigned>(*t -
'0')
2601 :
static_cast<unsigned>(*t -
'a' + 10);
2602 *e =
static_cast<char>((d1 << 4) + d0);
2604#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
2605 std::reverse(buf, e);
2609 OB += std::string_view(num, n);
2620template<
typename Fn>
2625 return F(static_cast<const X *>(this));
2626#include "ItaniumNodes.def"
2634 template <> struct NodeKind<X> { \
2635 static constexpr Node::Kind Kind = Node::K##X; \
2636 static constexpr const char *name() { return #X; } \
2638#include "ItaniumNodes.def"
2641 auto StartPos = OB.getCurrentPosition();
2642 auto Fail = [&OB, StartPos] {
2643 OB.setCurrentPosition(StartPos);
2648 bool LastWasNumericEscape =
false;
2649 for (
const Node *Element : *
this) {
2650 if (Element->
getKind() != Node::KIntegerLiteral)
2652 int integer_value = 0;
2654 if (c <
'0' || c >
'9' || integer_value > 25)
2656 integer_value *= 10;
2657 integer_value += c -
'0';
2659 if (integer_value > 255)
2663 if (LastWasNumericEscape) {
2664 if ((integer_value >=
'0' && integer_value <=
'9') ||
2665 (integer_value >=
'a' && integer_value <=
'f') ||
2666 (integer_value >=
'A' && integer_value <=
'F')) {
2671 LastWasNumericEscape =
false;
2674 switch (integer_value) {
2707 if (integer_value < 32 || integer_value == 127) {
2708 constexpr char Hex[] =
"0123456789ABCDEF";
2710 if (integer_value > 7)
2712 if (integer_value >= 16)
2713 OB += Hex[integer_value >> 4];
2714 OB += Hex[integer_value & 0xF];
2715 LastWasNumericEscape =
true;
2720 OB += (
char)integer_value;
2748 size_t OldNumTemplateParamLists;
2753 : Parser(TheParser),
2813 void reset(
const char *First_,
const char *Last_) {
2822 for (
int I = 0;
I != 3; ++
I)
2832 size_t sz =
static_cast<size_t>(end - begin);
2834 Node **data =
new (mem)
Node *[sz];
2835 std::copy(begin, end, data);
2865 char look(
unsigned Lookahead = 0)
const {
2866 if (
static_cast<size_t>(
Last -
First) <= Lookahead)
2868 return First[Lookahead];
2886 return look() ==
'T' &&
2887 std::string_view(
"yptnk").find(
look(1)) != std::string_view::npos;
2937 for (;
I <
E; ++
I) {
2994 return *
this <
Other.Enc;
2997 return Enc[0] < Peek[0] || (
Enc[0] == Peek[0] &&
Enc[1] < Peek[1]);
3000 return Enc[0] == Peek[0] &&
Enc[1] == Peek[1];
3006 std::string_view Res =
Name;
3009 "operator name does not start with 'operator'");
3010 Res.remove_prefix(
sizeof(
"operator") - 1);
3012 Res.remove_prefix(1);
3045template <
typename Derived,
typename Alloc>
3048 return getDerived().parseNestedName(State);
3050 return getDerived().parseLocalName(State);
3052 Node *Result =
nullptr;
3053 bool IsSubst =
false;
3055 Result = getDerived().parseUnscopedName(State, &IsSubst);
3059 if (look() ==
'I') {
3064 Node *TA = getDerived().parseTemplateArgs(State !=
nullptr);
3069 Result = make<NameWithTemplateArgs>(Result, TA);
3070 }
else if (IsSubst) {
3081template <
typename Derived,
typename Alloc>
3083 if (!consumeIf(
'Z'))
3085 Node *Encoding = getDerived().parseEncoding();
3086 if (Encoding ==
nullptr || !consumeIf(
'E'))
3089 if (consumeIf(
's')) {
3091 auto *StringLitName = make<NameType>(
"string literal");
3094 return make<LocalName>(Encoding, StringLitName);
3101 if (consumeIf(
'd')) {
3103 if (!consumeIf(
'_'))
3105 Node *
N = getDerived().parseName(State);
3108 return make<LocalName>(Encoding,
N);
3111 Node *Entity = getDerived().parseName(State);
3112 if (Entity ==
nullptr)
3115 return make<LocalName>(Encoding, Entity);
3121template <
typename Derived,
typename Alloc>
3126 Node *Std =
nullptr;
3127 if (consumeIf(
"St")) {
3128 Std = make<NameType>(
"std");
3133 Node *Res =
nullptr;
3135 if (look() ==
'S') {
3136 Node *S = getDerived().parseSubstitution();
3139 if (S->
getKind() == Node::KModuleName)
3141 else if (IsSubst && Std ==
nullptr) {
3149 if (Res ==
nullptr || Std !=
nullptr) {
3150 Res = getDerived().parseUnqualifiedName(State, Std,
Module);
3162template <
typename Derived,
typename Alloc>
3165 if (getDerived().parseModuleNameOpt(
Module))
3168 bool IsMemberLikeFriend = Scope && consumeIf(
'F');
3173 if (look() >=
'1' && look() <=
'9') {
3174 Result = getDerived().parseSourceName(State);
3175 }
else if (look() ==
'U') {
3176 Result = getDerived().parseUnnamedTypeName(State);
3177 }
else if (consumeIf(
"DC")) {
3179 size_t BindingsBegin = Names.
size();
3181 Node *Binding = getDerived().parseSourceName(State);
3182 if (Binding ==
nullptr)
3185 }
while (!consumeIf(
'E'));
3186 Result = make<StructuredBindingName>(popTrailingNodeArray(BindingsBegin));
3187 }
else if (look() ==
'C' || look() ==
'D') {
3189 if (Scope ==
nullptr ||
Module !=
nullptr)
3191 Result = getDerived().parseCtorDtorName(Scope, State);
3193 Result = getDerived().parseOperatorName(State);
3196 if (Result !=
nullptr &&
Module !=
nullptr)
3197 Result = make<ModuleEntity>(
Module, Result);
3198 if (Result !=
nullptr)
3199 Result = getDerived().parseAbiTags(Result);
3200 if (Result !=
nullptr && IsMemberLikeFriend)
3201 Result = make<MemberLikeFriendName>(Scope, Result);
3202 else if (Result !=
nullptr && Scope !=
nullptr)
3203 Result = make<NestedName>(Scope, Result);
3213template <
typename Derived,
typename Alloc>
3216 while (consumeIf(
'W')) {
3217 bool IsPartition = consumeIf(
'P');
3218 Node *Sub = getDerived().parseSourceName(
nullptr);
3236template <
typename Derived,
typename Alloc>
3241 if (State !=
nullptr)
3242 TemplateParams.
clear();
3244 if (consumeIf(
"Ut")) {
3245 std::string_view Count = parseNumber();
3246 if (!consumeIf(
'_'))
3248 return make<UnnamedTypeName>(Count);
3250 if (consumeIf(
"Ul")) {
3252 TemplateParams.
size());
3255 size_t ParamsBegin = Names.
size();
3256 while (getDerived().isTemplateParamDecl()) {
3258 getDerived().parseTemplateParamDecl(LambdaTemplateParams.
params());
3263 NodeArray TempParams = popTrailingNodeArray(ParamsBegin);
3287 if (TempParams.
empty())
3290 Node *Requires1 =
nullptr;
3291 if (consumeIf(
'Q')) {
3292 Requires1 = getDerived().parseConstraintExpr();
3293 if (Requires1 ==
nullptr)
3297 if (!consumeIf(
"v")) {
3299 Node *
P = getDerived().parseType();
3303 }
while (look() !=
'E' && look() !=
'Q');
3305 NodeArray Params = popTrailingNodeArray(ParamsBegin);
3307 Node *Requires2 =
nullptr;
3308 if (consumeIf(
'Q')) {
3309 Requires2 = getDerived().parseConstraintExpr();
3310 if (Requires2 ==
nullptr)
3314 if (!consumeIf(
'E'))
3317 std::string_view Count = parseNumber();
3318 if (!consumeIf(
'_'))
3320 return make<ClosureTypeName>(TempParams, Requires1, Params, Requires2,
3323 if (consumeIf(
"Ub")) {
3324 (void)parseNumber();
3325 if (!consumeIf(
'_'))
3327 return make<NameType>(
"'block-literal'");
3333template <
typename Derived,
typename Alloc>
3336 if (parsePositiveInteger(&Length))
3338 if (numLeft() < Length || Length == 0)
3340 std::string_view
Name(First, Length);
3343 return make<NameType>(
"(anonymous namespace)");
3344 return make<NameType>(
Name);
3348template <
typename Derived,
typename Alloc>
3360 "operator co_await"},
3372 "operator delete[]"},
3420 "reinterpret_cast"},
3432template <
typename Derived,
typename Alloc>
3438template <
typename Derived,
typename Alloc>
3446 size_t lower = 0u, upper = NumOps - 1;
3447 while (upper != lower) {
3448 size_t middle = (upper + lower) / 2;
3449 if (Ops[middle] < First)
3454 if (Ops[lower] != First)
3464template <
typename Derived,
typename Alloc>
3467 if (
const auto *Op = parseOperatorEncoding()) {
3468 if (Op->getKind() == OperatorInfo::CCast) {
3475 PermitForwardTemplateReferences ||
3477 Node *Ty = getDerived().parseType();
3481 return make<ConversionOperatorType>(Ty);
3484 if (Op->getKind() >= OperatorInfo::Unnameable)
3487 if (Op->getKind() == OperatorInfo::Member && !Op->getFlag())
3491 return make<NameType>(Op->getName());
3494 if (consumeIf(
"li")) {
3496 Node *SN = getDerived().parseSourceName(State);
3499 return make<LiteralOperator>(SN);
3502 if (consumeIf(
'v')) {
3504 if (look() >=
'0' && look() <=
'9') {
3506 Node *SN = getDerived().parseSourceName(State);
3509 return make<ConversionOperatorType>(SN);
3527template <
typename Derived,
typename Alloc>
3531 if (SoFar->
getKind() == Node::KSpecialSubstitution) {
3533 SoFar = make<ExpandedSpecialSubstitution>(
3539 if (consumeIf(
'C')) {
3540 bool IsInherited = consumeIf(
'I');
3541 if (look() !=
'1' && look() !=
'2' && look() !=
'3' && look() !=
'4' &&
3544 int Variant = look() -
'0';
3548 if (getDerived().parseName(State) ==
nullptr)
3551 return make<CtorDtorName>(SoFar,
false, Variant);
3554 if (look() ==
'D' && (look(1) ==
'0' || look(1) ==
'1' || look(1) ==
'2' ||
3555 look(1) ==
'4' || look(1) ==
'5')) {
3556 int Variant = look(1) -
'0';
3559 return make<CtorDtorName>(SoFar,
true, Variant);
3584template <
typename Derived,
typename Alloc>
3587 if (!consumeIf(
'N'))
3592 if (!consumeIf(
'H')) {
3597 if (consumeIf(
'O')) {
3600 }
else if (consumeIf(
'R')) {
3611 Node *SoFar =
nullptr;
3612 while (!consumeIf(
'E')) {
3617 if (look() ==
'T') {
3619 if (SoFar !=
nullptr)
3621 SoFar = getDerived().parseTemplateParam();
3622 }
else if (look() ==
'I') {
3624 if (SoFar ==
nullptr)
3626 Node *TA = getDerived().parseTemplateArgs(State !=
nullptr);
3629 if (SoFar->
getKind() == Node::KNameWithTemplateArgs)
3636 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
3637 }
else if (look() ==
'D' && (look(1) ==
't' || look(1) ==
'T')) {
3639 if (SoFar !=
nullptr)
3641 SoFar = getDerived().parseDecltype();
3645 if (look() ==
'S') {
3648 if (look(1) ==
't') {
3650 S = make<NameType>(
"std");
3652 S = getDerived().parseSubstitution();
3656 if (S->
getKind() == Node::KModuleName) {
3658 }
else if (SoFar !=
nullptr) {
3667 SoFar = getDerived().parseUnqualifiedName(State, SoFar,
Module);
3670 if (SoFar ==
nullptr)
3679 if (SoFar ==
nullptr || Subs.
empty())
3687template <
typename Derived,
typename Alloc>
3689 Node *SN = getDerived().parseSourceName(
nullptr);
3692 if (look() ==
'I') {
3693 Node *TA = getDerived().parseTemplateArgs();
3696 return make<NameWithTemplateArgs>(SN, TA);
3703template <
typename Derived,
typename Alloc>
3706 if (std::isdigit(look()))
3707 Result = getDerived().parseSimpleId();
3709 Result = getDerived().parseUnresolvedType();
3710 if (Result ==
nullptr)
3712 return make<DtorName>(Result);
3718template <
typename Derived,
typename Alloc>
3720 if (look() ==
'T') {
3721 Node *TP = getDerived().parseTemplateParam();
3727 if (look() ==
'D') {
3728 Node *DT = getDerived().parseDecltype();
3734 return getDerived().parseSubstitution();
3744template <
typename Derived,
typename Alloc>
3746 if (std::isdigit(look()))
3747 return getDerived().parseSimpleId();
3749 if (consumeIf(
"dn"))
3750 return getDerived().parseDestructorName();
3754 Node *Oper = getDerived().parseOperatorName(
nullptr);
3755 if (Oper ==
nullptr)
3757 if (look() ==
'I') {
3758 Node *TA = getDerived().parseTemplateArgs();
3761 return make<NameWithTemplateArgs>(Oper, TA);
3778template <
typename Derived,
typename Alloc>
3780 Node *SoFar =
nullptr;
3784 if (consumeIf(
"srN")) {
3785 SoFar = getDerived().parseUnresolvedType();
3786 if (SoFar ==
nullptr)
3789 if (look() ==
'I') {
3790 Node *TA = getDerived().parseTemplateArgs();
3793 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
3798 while (!consumeIf(
'E')) {
3799 Node *Qual = getDerived().parseSimpleId();
3800 if (Qual ==
nullptr)
3802 SoFar = make<QualifiedName>(SoFar, Qual);
3807 Node *Base = getDerived().parseBaseUnresolvedName();
3808 if (Base ==
nullptr)
3810 return make<QualifiedName>(SoFar, Base);
3814 if (!consumeIf(
"sr")) {
3815 SoFar = getDerived().parseBaseUnresolvedName();
3816 if (SoFar ==
nullptr)
3819 SoFar = make<GlobalQualifiedName>(SoFar);
3824 if (std::isdigit(look())) {
3826 Node *Qual = getDerived().parseSimpleId();
3827 if (Qual ==
nullptr)
3830 SoFar = make<QualifiedName>(SoFar, Qual);
3832 SoFar = make<GlobalQualifiedName>(Qual);
3837 }
while (!consumeIf(
'E'));
3842 SoFar = getDerived().parseUnresolvedType();
3843 if (SoFar ==
nullptr)
3846 if (look() ==
'I') {
3847 Node *TA = getDerived().parseTemplateArgs();
3850 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
3858 Node *Base = getDerived().parseBaseUnresolvedName();
3859 if (Base ==
nullptr)
3861 return make<QualifiedName>(SoFar, Base);
3866template <
typename Derived,
typename Alloc>
3868 while (consumeIf(
'B')) {
3869 std::string_view SN = parseBareSourceName();
3872 N = make<AbiTagAttr>(
N, SN);
3880template <
typename Alloc,
typename Derived>
3883 const char *Tmp = First;
3886 if (numLeft() == 0 || !std::isdigit(*First))
3887 return std::string_view();
3888 while (numLeft() != 0 && std::isdigit(*First))
3890 return std::string_view(Tmp, First - Tmp);
3894template <
typename Alloc,
typename Derived>
3897 if (look() <
'0' || look() >
'9')
3899 while (look() >=
'0' && look() <=
'9') {
3901 *Out +=
static_cast<size_t>(
consume() -
'0');
3906template <
typename Alloc,
typename Derived>
3909 if (parsePositiveInteger(&
Int) || numLeft() <
Int)
3911 std::string_view R(First,
Int);
3924template <
typename Derived,
typename Alloc>
3928 Node *ExceptionSpec =
nullptr;
3929 if (consumeIf(
"Do")) {
3930 ExceptionSpec = make<NameType>(
"noexcept");
3933 }
else if (consumeIf(
"DO")) {
3934 Node *
E = getDerived().parseExpr();
3935 if (
E ==
nullptr || !consumeIf(
'E'))
3937 ExceptionSpec = make<NoexceptSpec>(
E);
3940 }
else if (consumeIf(
"Dw")) {
3941 size_t SpecsBegin = Names.
size();
3942 while (!consumeIf(
'E')) {
3943 Node *
T = getDerived().parseType();
3949 make<DynamicExceptionSpec>(popTrailingNodeArray(SpecsBegin));
3956 if (!consumeIf(
'F'))
3959 Node *ReturnType = getDerived().parseType();
3960 if (ReturnType ==
nullptr)
3964 size_t ParamsBegin = Names.
size();
3970 if (consumeIf(
"RE")) {
3974 if (consumeIf(
"OE")) {
3978 Node *
T = getDerived().parseType();
3984 NodeArray Params = popTrailingNodeArray(ParamsBegin);
3985 return make<FunctionType>(ReturnType, Params, CVQuals,
3986 ReferenceQualifier, ExceptionSpec);
3994template <
typename Derived,
typename Alloc>
3996 if (!consumeIf(
"Dv"))
3998 if (look() >=
'1' && look() <=
'9') {
3999 Node *DimensionNumber = make<NameType>(parseNumber());
4000 if (!DimensionNumber)
4002 if (!consumeIf(
'_'))
4005 return make<PixelVectorType>(DimensionNumber);
4006 Node *ElemType = getDerived().parseType();
4007 if (ElemType ==
nullptr)
4009 return make<VectorType>(ElemType, DimensionNumber);
4012 if (!consumeIf(
'_')) {
4013 Node *DimExpr = getDerived().parseExpr();
4016 if (!consumeIf(
'_'))
4018 Node *ElemType = getDerived().parseType();
4021 return make<VectorType>(ElemType, DimExpr);
4023 Node *ElemType = getDerived().parseType();
4026 return make<VectorType>(ElemType,
nullptr);
4031template <
typename Derived,
typename Alloc>
4033 if (!consumeIf(
'D'))
4035 if (!consumeIf(
't') && !consumeIf(
'T'))
4037 Node *
E = getDerived().parseExpr();
4040 if (!consumeIf(
'E'))
4042 return make<EnclosingExpr>(
"decltype",
E);
4047template <
typename Derived,
typename Alloc>
4049 if (!consumeIf(
'A'))
4052 Node *Dimension =
nullptr;
4054 if (std::isdigit(look())) {
4055 Dimension = make<NameType>(parseNumber());
4058 if (!consumeIf(
'_'))
4060 }
else if (!consumeIf(
'_')) {
4061 Node *DimExpr = getDerived().parseExpr();
4062 if (DimExpr ==
nullptr)
4064 if (!consumeIf(
'_'))
4066 Dimension = DimExpr;
4069 Node *Ty = getDerived().parseType();
4072 return make<ArrayType>(Ty, Dimension);
4076template <
typename Derived,
typename Alloc>
4078 if (!consumeIf(
'M'))
4080 Node *ClassType = getDerived().parseType();
4081 if (ClassType ==
nullptr)
4083 Node *MemberType = getDerived().parseType();
4084 if (MemberType ==
nullptr)
4086 return make<PointerToMemberType>(ClassType, MemberType);
4093template <
typename Derived,
typename Alloc>
4095 std::string_view ElabSpef;
4096 if (consumeIf(
"Ts"))
4097 ElabSpef =
"struct";
4098 else if (consumeIf(
"Tu"))
4100 else if (consumeIf(
"Te"))
4103 Node *
Name = getDerived().parseName();
4104 if (
Name ==
nullptr)
4107 if (!ElabSpef.empty())
4108 return make<ElaboratedTypeSpefType>(ElabSpef,
Name);
4116template <
typename Derived,
typename Alloc>
4118 if (consumeIf(
'U')) {
4119 std::string_view Qual = parseBareSourceName();
4125 constexpr size_t Len =
sizeof(
"objcproto") - 1;
4126 std::string_view ProtoSourceName(Qual.data() + Len, Qual.size() - Len);
4127 std::string_view Proto;
4130 SaveLast(Last, &*ProtoSourceName.rbegin() + 1);
4131 Proto = parseBareSourceName();
4135 Node *Child = getDerived().parseQualifiedType();
4136 if (Child ==
nullptr)
4138 return make<ObjCProtoName>(Child, Proto);
4142 if (look() ==
'I') {
4143 TA = getDerived().parseTemplateArgs();
4148 Node *Child = getDerived().parseQualifiedType();
4149 if (Child ==
nullptr)
4151 return make<VendorExtQualType>(Child, Qual, TA);
4155 Node *Ty = getDerived().parseType();
4159 Ty = make<QualType>(Ty, Quals);
4183template <
typename Derived,
typename Alloc>
4185 Node *Result =
nullptr;
4192 unsigned AfterQuals = 0;
4193 if (look(AfterQuals) ==
'r') ++AfterQuals;
4194 if (look(AfterQuals) ==
'V') ++AfterQuals;
4195 if (look(AfterQuals) ==
'K') ++AfterQuals;
4197 if (look(AfterQuals) ==
'F' ||
4198 (look(AfterQuals) ==
'D' &&
4199 (look(AfterQuals + 1) ==
'o' || look(AfterQuals + 1) ==
'O' ||
4200 look(AfterQuals + 1) ==
'w' || look(AfterQuals + 1) ==
'x'))) {
4201 Result = getDerived().parseFunctionType();
4207 Result = getDerived().parseQualifiedType();
4213 return make<NameType>(
"void");
4217 return make<NameType>(
"wchar_t");
4221 return make<NameType>(
"bool");
4225 return make<NameType>(
"char");
4229 return make<NameType>(
"signed char");
4233 return make<NameType>(
"unsigned char");
4237 return make<NameType>(
"short");
4241 return make<NameType>(
"unsigned short");
4245 return make<NameType>(
"int");
4249 return make<NameType>(
"unsigned int");
4253 return make<NameType>(
"long");
4257 return make<NameType>(
"unsigned long");
4261 return make<NameType>(
"long long");
4265 return make<NameType>(
"unsigned long long");
4269 return make<NameType>(
"__int128");
4273 return make<NameType>(
"unsigned __int128");
4277 return make<NameType>(
"float");
4281 return make<NameType>(
"double");
4285 return make<NameType>(
"long double");
4289 return make<NameType>(
"__float128");
4293 return make<NameType>(
"...");
4298 std::string_view Res = parseBareSourceName();
4304 if (consumeIf(
'I')) {
4308 if (!consumeIf(
'E'))
4310 Result = make<TransformedType>(Res,
BaseType);
4312 Result = make<NameType>(Res);
4320 return make<NameType>(
"decimal64");
4324 return make<NameType>(
"decimal128");
4328 return make<NameType>(
"decimal32");
4332 return make<NameType>(
"half");
4336 Node *DimensionNumber = make<NameType>(parseNumber());
4337 if (!DimensionNumber)
4339 if (!consumeIf(
'_'))
4341 return make<BinaryFPType>(DimensionNumber);
4357 return make<NameType>(
"short _Accum");
4359 return make<NameType>(
"unsigned short _Accum");
4361 return make<NameType>(
"_Accum");
4363 return make<NameType>(
"unsigned _Accum");
4365 return make<NameType>(
"long _Accum");
4367 return make<NameType>(
"unsigned long _Accum");
4377 return make<NameType>(
"short _Fract");
4379 return make<NameType>(
"unsigned short _Fract");
4381 return make<NameType>(
"_Fract");
4383 return make<NameType>(
"unsigned _Fract");
4385 return make<NameType>(
"long _Fract");
4387 return make<NameType>(
"unsigned long _Fract");
4396 if (look(1) ==
'A') {
4401 return make<NameType>(
"_Sat short _Accum");
4403 return make<NameType>(
"_Sat unsigned short _Accum");
4405 return make<NameType>(
"_Sat _Accum");
4407 return make<NameType>(
"_Sat unsigned _Accum");
4409 return make<NameType>(
"_Sat long _Accum");
4411 return make<NameType>(
"_Sat unsigned long _Accum");
4416 if (look(1) ==
'R') {
4421 return make<NameType>(
"_Sat short _Fract");
4423 return make<NameType>(
"_Sat unsigned short _Fract");
4425 return make<NameType>(
"_Sat _Fract");
4427 return make<NameType>(
"_Sat unsigned _Fract");
4429 return make<NameType>(
"_Sat long _Fract");
4431 return make<NameType>(
"_Sat unsigned long _Fract");
4444 bool Signed = look(1) ==
'B';
4446 Node *
Size = std::isdigit(look()) ? make<NameType>(parseNumber())
4447 : getDerived().parseExpr();
4450 if (!consumeIf(
'_'))
4457 return make<NameType>(
"char32_t");
4461 return make<NameType>(
"char16_t");
4465 return make<NameType>(
"char8_t");
4469 return make<NameType>(
"auto");
4473 return make<NameType>(
"decltype(auto)");
4478 std::string_view Kind = look(1) ==
'k' ?
" auto" :
" decltype(auto)";
4480 Node *Constraint = getDerived().parseName();
4483 return make<PostfixQualifiedType>(Constraint, Kind);
4488 return make<NameType>(
"std::nullptr_t");
4493 Result = getDerived().parseDecltype();
4498 Result = getDerived().parseVectorType();
4504 Node *Child = getDerived().parseType();
4507 Result = make<ParameterPackExpansion>(Child);
4516 Result = getDerived().parseFunctionType();
4522 Result = getDerived().parseFunctionType();
4527 Result = getDerived().parseArrayType();
4532 Result = getDerived().parsePointerToMemberType();
4538 if (look(1) ==
's' || look(1) ==
'u' || look(1) ==
'e') {
4539 Result = getDerived().parseClassEnumType();
4543 Result = getDerived().parseTemplateParam();
4544 if (Result ==
nullptr)
4557 if (TryToParseTemplateArgs && look() ==
'I') {
4559 Node *TA = getDerived().parseTemplateArgs();
4562 Result = make<NameWithTemplateArgs>(Result, TA);
4569 Node *
Ptr = getDerived().parseType();
4572 Result = make<PointerType>(
Ptr);
4578 Node *Ref = getDerived().parseType();
4587 Node *Ref = getDerived().parseType();
4596 Node *
P = getDerived().parseType();
4599 Result = make<PostfixQualifiedType>(
P,
" complex");
4605 Node *
P = getDerived().parseType();
4608 Result = make<PostfixQualifiedType>(
P,
" imaginary");
4613 if (look(1) !=
't') {
4614 bool IsSubst =
false;
4615 Result = getDerived().parseUnscopedName(
nullptr, &IsSubst);
4629 if (look() ==
'I' && (!IsSubst || TryToParseTemplateArgs)) {
4632 Node *TA = getDerived().parseTemplateArgs();
4635 Result = make<NameWithTemplateArgs>(Result, TA);
4636 }
else if (IsSubst) {
4647 Result = getDerived().parseClassEnumType();
4655 if (Result !=
nullptr)
4660template <
typename Derived,
typename Alloc>
4664 Node *
E = getDerived().parseExpr();
4667 return make<PrefixExpr>(Kind,
E, Prec);
4670template <
typename Derived,
typename Alloc>
4674 Node *
LHS = getDerived().parseExpr();
4677 Node *
RHS = getDerived().parseExpr();
4680 return make<BinaryExpr>(
LHS, Kind,
RHS, Prec);
4683template <
typename Derived,
typename Alloc>
4685 std::string_view Lit) {
4686 std::string_view Tmp = parseNumber(
true);
4687 if (!Tmp.empty() && consumeIf(
'E'))
4688 return make<IntegerLiteral>(Lit, Tmp);
4693template <
typename Alloc,
typename Derived>
4710template <
typename Derived,
typename Alloc>
4712 if (consumeIf(
"fpT"))
4713 return make<NameType>(
"this");
4714 if (consumeIf(
"fp")) {
4715 parseCVQualifiers();
4716 std::string_view Num = parseNumber();
4717 if (!consumeIf(
'_'))
4719 return make<FunctionParam>(Num);
4721 if (consumeIf(
"fL")) {
4722 if (parseNumber().empty())
4724 if (!consumeIf(
'p'))
4726 parseCVQualifiers();
4727 std::string_view Num = parseNumber();
4728 if (!consumeIf(
'_'))
4730 return make<FunctionParam>(Num);
4737template <
typename Derived,
typename Alloc>
4739 if (!consumeIf(
"cv"))
4744 Ty = getDerived().parseType();
4750 if (consumeIf(
'_')) {
4751 size_t ExprsBegin = Names.
size();
4752 while (!consumeIf(
'E')) {
4753 Node *
E = getDerived().parseExpr();
4758 NodeArray Exprs = popTrailingNodeArray(ExprsBegin);
4759 return make<ConversionExpr>(Ty, Exprs);
4762 Node *
E[1] = {getDerived().parseExpr()};
4763 if (
E[0] ==
nullptr)
4765 return make<ConversionExpr>(Ty, makeNodeArray(
E,
E + 1));
4775template <
typename Derived,
typename Alloc>
4777 if (!consumeIf(
'L'))
4782 return getDerived().parseIntegerLiteral(
"wchar_t");
4784 if (consumeIf(
"b0E"))
4785 return make<BoolExpr>(0);
4786 if (consumeIf(
"b1E"))
4787 return make<BoolExpr>(1);
4791 return getDerived().parseIntegerLiteral(
"char");
4794 return getDerived().parseIntegerLiteral(
"signed char");
4797 return getDerived().parseIntegerLiteral(
"unsigned char");
4800 return getDerived().parseIntegerLiteral(
"short");
4803 return getDerived().parseIntegerLiteral(
"unsigned short");
4806 return getDerived().parseIntegerLiteral(
"");
4809 return getDerived().parseIntegerLiteral(
"u");
4812 return getDerived().parseIntegerLiteral(
"l");
4815 return getDerived().parseIntegerLiteral(
"ul");
4818 return getDerived().parseIntegerLiteral(
"ll");
4821 return getDerived().parseIntegerLiteral(
"ull");
4824 return getDerived().parseIntegerLiteral(
"__int128");
4827 return getDerived().parseIntegerLiteral(
"unsigned __int128");
4830 return getDerived().template parseFloatingLiteral<float>();
4833 return getDerived().template parseFloatingLiteral<double>();
4836#if defined(__powerpc__) || defined(__s390__)
4839 return getDerived().template parseFloatingLiteral<double>();
4841 return getDerived().template parseFloatingLiteral<long double>();
4844 if (consumeIf(
"_Z")) {
4845 Node *R = getDerived().parseEncoding();
4846 if (R !=
nullptr && consumeIf(
'E'))
4851 Node *
T = getDerived().parseType();
4856 return make<StringLiteral>(
T);
4860 if (consumeIf(
"Dn") && (consumeIf(
'0'), consumeIf(
'E')))
4861 return make<NameType>(
"nullptr");
4871 Node *
T = parseUnnamedTypeName(
nullptr);
4872 if (!
T || !consumeIf(
'E'))
4874 return make<LambdaExpr>(
T);
4878 Node *
T = getDerived().parseType();
4881 std::string_view
N = parseNumber(
true);
4884 if (!consumeIf(
'E'))
4886 return make<EnumLiteral>(
T,
N);
4895template <
typename Derived,
typename Alloc>
4897 if (look() ==
'd') {
4901 Node *
Field = getDerived().parseSourceName(
nullptr);
4902 if (
Field ==
nullptr)
4904 Node *Init = getDerived().parseBracedExpr();
4905 if (Init ==
nullptr)
4907 return make<BracedExpr>(
Field, Init,
false);
4912 if (
Index ==
nullptr)
4914 Node *Init = getDerived().parseBracedExpr();
4915 if (Init ==
nullptr)
4917 return make<BracedExpr>(
Index, Init,
true);
4921 Node *RangeBegin = getDerived().parseExpr();
4922 if (RangeBegin ==
nullptr)
4924 Node *RangeEnd = getDerived().parseExpr();
4925 if (RangeEnd ==
nullptr)
4927 Node *Init = getDerived().parseBracedExpr();
4928 if (Init ==
nullptr)
4930 return make<BracedRangeExpr>(RangeBegin, RangeEnd, Init);
4934 return getDerived().parseExpr();
4942template <
typename Derived,
typename Alloc>
4944 if (!consumeIf(
'f'))
4947 bool IsLeftFold =
false, HasInitializer =
false;
4953 HasInitializer =
true;
4956 HasInitializer =
true;
4966 const auto *Op = parseOperatorEncoding();
4969 if (!(Op->getKind() == OperatorInfo::Binary
4970 || (Op->getKind() == OperatorInfo::Member
4971 && Op->getName().back() ==
'*')))
4974 Node *Pack = getDerived().parseExpr();
4975 if (Pack ==
nullptr)
4978 Node *Init =
nullptr;
4979 if (HasInitializer) {
4980 Init = getDerived().parseExpr();
4981 if (Init ==
nullptr)
4985 if (IsLeftFold && Init)
4988 return make<FoldExpr>(IsLeftFold, Op->getSymbol(), Pack, Init);
4994template <
typename Derived,
typename Alloc>
4998 Node *Ty = getDerived().parseType();
5001 Node *Expr = getDerived().parseExpr();