1 //===-------------------------- cxa_demangle.cpp --------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // FIXME: (possibly) incomplete list of features that clang mangles that this
11 // file does not yet support:
12 //   - enable_if attribute
13 //   - decomposition declarations
14 //   - C++ modules TS
15 
16 #define _LIBCPP_NO_EXCEPTIONS
17 
18 #include "__cxxabi_config.h"
19 
20 #include <vector>
21 #include <algorithm>
22 #include <numeric>
23 #include <cstdio>
24 #include <cstdlib>
25 #include <cstring>
26 #include <cctype>
27 
28 #ifdef _MSC_VER
29 // snprintf is implemented in VS 2015
30 #if _MSC_VER < 1900
31 #define snprintf _snprintf_s
32 #endif
33 #endif
34 
35 namespace __cxxabiv1
36 {
37 
38 namespace
39 {
40 
41 enum
42 {
43     unknown_error = -4,
44     invalid_args = -3,
45     invalid_mangled_name,
46     memory_alloc_failure,
47     success
48 };
49 
50 class StringView {
51   const char *First;
52   const char *Last;
53 
54 public:
55   template <size_t N>
56   StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {}
57   StringView(const char *First_, const char *Last_) : First(First_), Last(Last_) {}
58   StringView() : First(nullptr), Last(nullptr) {}
59 
60   StringView substr(size_t From, size_t To) {
61     if (To >= size())
62       To = size() - 1;
63     if (From >= size())
64       From = size() - 1;
65     return StringView(First + From, First + To);
66   }
67 
68   StringView dropFront(size_t N) const {
69     if (N >= size())
70       N = size() - 1;
71     return StringView(First + N, Last);
72   }
73 
74   bool startsWith(StringView Str) const {
75     if (Str.size() > size())
76       return false;
77     return std::equal(Str.begin(), Str.end(), begin());
78   }
79 
80   const char &operator[](size_t Idx) const { return *(begin() + Idx); }
81 
82   const char *begin() const { return First; }
83   const char *end() const { return Last; }
84   size_t size() const { return static_cast<size_t>(Last - First); }
85 };
86 
87 bool operator==(const StringView &LHS, const StringView &RHS) {
88   return LHS.size() == RHS.size() &&
89          std::equal(LHS.begin(), LHS.end(), RHS.begin());
90 }
91 
92 // Stream that AST nodes write their string representation into after the AST
93 // has been parsed.
94 class OutputStream {
95   char *Buffer;
96   size_t CurrentPosition;
97   size_t BufferCapacity;
98 
99   // Ensure there is at least n more positions in buffer.
100   void grow(size_t N) {
101     if (N + CurrentPosition >= BufferCapacity) {
102       BufferCapacity *= 2;
103       if (BufferCapacity < N + CurrentPosition)
104         BufferCapacity = N + CurrentPosition;
105       Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity));
106     }
107   }
108 
109 public:
110   OutputStream(char *StartBuf, size_t Size)
111       : Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {}
112 
113   OutputStream &operator+=(StringView R) {
114     size_t Size = R.size();
115     if (Size == 0)
116       return *this;
117     grow(Size);
118     memmove(Buffer + CurrentPosition, R.begin(), Size);
119     CurrentPosition += Size;
120     return *this;
121   }
122 
123   OutputStream &operator+=(char C) {
124     grow(1);
125     Buffer[CurrentPosition++] = C;
126     return *this;
127   }
128 
129   // Offset of position in buffer, used for building stream_string_view.
130   typedef unsigned StreamPosition;
131 
132   // StringView into a stream, used for caching the ast nodes.
133   class StreamStringView {
134     StreamPosition First, Last;
135 
136     friend class OutputStream;
137 
138   public:
139     StreamStringView() : First(0), Last(0) {}
140 
141     StreamStringView(StreamPosition First_, StreamPosition Last_)
142         : First(First_), Last(Last_) {}
143 
144     bool empty() const { return First == Last; }
145   };
146 
147   OutputStream &operator+=(StreamStringView &s) {
148     size_t Sz = static_cast<size_t>(s.Last - s.First);
149     if (Sz == 0)
150       return *this;
151     grow(Sz);
152     memmove(Buffer + CurrentPosition, Buffer + s.First, Sz);
153     CurrentPosition += Sz;
154     return *this;
155   }
156 
157   StreamPosition getCurrentPosition() const {
158     return static_cast<StreamPosition>(CurrentPosition);
159   }
160 
161   StreamStringView makeStringViewFromPastPosition(StreamPosition Pos) {
162     return StreamStringView(Pos, getCurrentPosition());
163   }
164 
165   char back() const {
166     return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0';
167   }
168 
169   bool empty() const { return CurrentPosition == 0; }
170 
171   char *getBuffer() { return Buffer; }
172   char *getBufferEnd() { return Buffer + CurrentPosition - 1; }
173   size_t getBufferCapacity() { return BufferCapacity; }
174 };
175 
176 // Base class of all AST nodes. The AST is built by the parser, then is
177 // traversed by the printLeft/Right functions to produce a demangled string.
178 class Node {
179 public:
180   enum Kind : unsigned char {
181     KDotSuffix,
182     KVendorExtQualType,
183     KQualType,
184     KConversionOperatorType,
185     KPostfixQualifiedType,
186     KNameType,
187     KAbiTagAttr,
188     KObjCProtoName,
189     KPointerType,
190     KLValueReferenceType,
191     KRValueReferenceType,
192     KPointerToMemberType,
193     KArrayType,
194     KFunctionType,
195     KTopLevelFunctionDecl,
196     KFunctionQualType,
197     KFunctionRefQualType,
198     KLiteralOperator,
199     KSpecialName,
200     KCtorVtableSpecialName,
201     KQualifiedName,
202     KEmptyName,
203     KVectorType,
204     KTemplateParams,
205     KNameWithTemplateArgs,
206     KGlobalQualifiedName,
207     KStdQualifiedName,
208     KExpandedSpecialSubstitution,
209     KSpecialSubstitution,
210     KCtorDtorName,
211     KDtorName,
212     KUnnamedTypeName,
213     KLambdaTypeName,
214     KExpr,
215   };
216 
217   const Kind K;
218 
219 private:
220   // If this Node has any RHS part, potentally many Nodes further down.
221   const unsigned HasRHSComponent : 1;
222   const unsigned HasFunction : 1;
223   const unsigned HasArray : 1;
224 
225 public:
226   Node(Kind K_, bool HasRHS_ = false, bool HasFunction_ = false,
227        bool HasArray_ = false)
228       : K(K_), HasRHSComponent(HasRHS_), HasFunction(HasFunction_),
229         HasArray(HasArray_) {}
230 
231   bool hasRHSComponent() const { return HasRHSComponent; }
232   bool hasArray() const { return HasArray; }
233   bool hasFunction() const { return HasFunction; }
234 
235   void print(OutputStream &s) const {
236     printLeft(s);
237     if (hasRHSComponent())
238       printRight(s);
239   }
240 
241   // Print the "left" side of this Node into OutputStream.
242   virtual void printLeft(OutputStream &) const = 0;
243 
244   // Print the "right". This distinction is necessary to represent C++ types
245   // that appear on the RHS of their subtype, such as arrays or functions.
246   // Since most types don't have such a component, provide a default
247   // implemenation.
248   virtual void printRight(OutputStream &) const {}
249 
250   virtual StringView getBaseName() const { return StringView(); }
251 
252   // Silence compiler warnings, this dtor will never be called.
253   virtual ~Node() = default;
254 };
255 
256 class NodeArray {
257   Node **Elements;
258   size_t NumElements;
259 
260 public:
261   NodeArray() : NumElements(0) {}
262   NodeArray(Node **Elements_, size_t NumElements_)
263       : Elements(Elements_), NumElements(NumElements_) {}
264 
265   bool empty() const { return NumElements == 0; }
266   size_t size() const { return NumElements; }
267 
268   void printWithSeperator(OutputStream &S, StringView Seperator) const {
269     for (size_t Idx = 0; Idx != NumElements; ++Idx) {
270       if (Idx)
271         S += Seperator;
272       Elements[Idx]->print(S);
273     }
274   }
275 };
276 
277 class DotSuffix final : public Node {
278   const Node *Prefix;
279   const StringView Suffix;
280 
281 public:
282   DotSuffix(Node *Prefix_, StringView Suffix_)
283       : Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {}
284 
285   void printLeft(OutputStream &s) const override {
286     Prefix->print(s);
287     s += " (";
288     s += Suffix;
289     s += ")";
290   }
291 };
292 
293 class VendorExtQualType final : public Node {
294   const Node *Ext;
295   const Node *Ty;
296 
297 public:
298   VendorExtQualType(Node *Ext_, Node *Ty_)
299       : Node(KVendorExtQualType), Ext(Ext_), Ty(Ty_) {}
300 
301   void printLeft(OutputStream &S) const override {
302     Ext->print(S);
303     S += " ";
304     Ty->printLeft(S);
305   }
306 
307   void printRight(OutputStream &S) const override { Ty->printRight(S); }
308 };
309 
310 enum Qualifiers {
311   QualNone = 0,
312   QualConst = 0x1,
313   QualVolatile = 0x2,
314   QualRestrict = 0x4,
315 };
316 
317 void addQualifiers(Qualifiers &Q1, Qualifiers Q2) {
318   Q1 = static_cast<Qualifiers>(Q1 | Q2);
319 }
320 
321 class QualType : public Node {
322 protected:
323   const Qualifiers Quals;
324   const Node *Child;
325 
326   void printQuals(OutputStream &S) const {
327     if (Quals & QualConst)
328       S += " const";
329     if (Quals & QualVolatile)
330       S += " volatile";
331     if (Quals & QualRestrict)
332       S += " restrict";
333   }
334 
335 public:
336   QualType(Node *Child_, Qualifiers Quals_)
337       : Node(KQualType, Child_->hasRHSComponent(), Child_->hasFunction(),
338              Child_->hasArray()),
339         Quals(Quals_), Child(Child_) {}
340 
341   QualType(Node::Kind ChildKind_, Node *Child_, Qualifiers Quals_)
342       : Node(ChildKind_, Child_->hasRHSComponent(), Child_->hasFunction(),
343              Child_->hasArray()),
344         Quals(Quals_), Child(Child_) {}
345 
346   void printLeft(OutputStream &S) const override {
347     Child->printLeft(S);
348     printQuals(S);
349   }
350 
351   void printRight(OutputStream &S) const override { Child->printRight(S); }
352 };
353 
354 class ConversionOperatorType final : public Node {
355   const Node *Ty;
356 
357 public:
358   ConversionOperatorType(Node *Ty_) : Node(KConversionOperatorType), Ty(Ty_) {}
359 
360   void printLeft(OutputStream &S) const override {
361     S += "operator ";
362     Ty->print(S);
363   }
364 };
365 
366 class PostfixQualifiedType final : public Node {
367   const Node *Ty;
368   const StringView Postfix;
369 
370 public:
371   PostfixQualifiedType(Node *Ty_, StringView Postfix_)
372       : Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {}
373 
374   void printLeft(OutputStream &s) const override {
375     Ty->printLeft(s);
376     s += Postfix;
377   }
378 
379   void printRight(OutputStream &S) const override { Ty->printRight(S); }
380 };
381 
382 class NameType final : public Node {
383   const StringView Name;
384 
385 public:
386   NameType(StringView Name_) : Node(KNameType), Name(Name_) {}
387 
388   StringView getName() const { return Name; }
389   StringView getBaseName() const override { return Name; }
390 
391   void printLeft(OutputStream &s) const override { s += Name; }
392 };
393 
394 class AbiTagAttr final : public Node {
395   const Node* Base;
396   StringView Tag;
397 public:
398   AbiTagAttr(const Node* Base_, StringView Tag_)
399       : Node(KAbiTagAttr), Base(Base_), Tag(Tag_) {}
400 
401   void printLeft(OutputStream &S) const override {
402     Base->printLeft(S);
403     S += "[abi:";
404     S += Tag;
405     S += "]";
406   }
407 };
408 
409 class ObjCProtoName : public Node {
410   Node *Ty;
411   Node *Protocol;
412 
413   friend class PointerType;
414 
415 public:
416   ObjCProtoName(Node *Ty_, Node *Protocol_)
417       : Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {}
418 
419   bool isObjCObject() const {
420     return Ty->K == KNameType &&
421            static_cast<NameType *>(Ty)->getName() == "objc_object";
422   }
423 
424   void printLeft(OutputStream &S) const override {
425     Ty->printLeft(S);
426     S += "<";
427     Protocol->printLeft(S);
428     S += ">";
429   }
430 };
431 
432 class PointerType final : public Node {
433   const Node *Pointee;
434 
435 public:
436   PointerType(Node *Pointee_)
437       : Node(KPointerType, Pointee_->hasRHSComponent()), Pointee(Pointee_) {}
438 
439   void printLeft(OutputStream &s) const override {
440     // We rewrite objc_object<SomeProtocol>* into id<SomeProtocol>.
441     if (Pointee->K != KObjCProtoName ||
442         !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) {
443       Pointee->printLeft(s);
444       if (Pointee->hasArray())
445         s += " ";
446       if (Pointee->hasArray() || Pointee->hasFunction())
447         s += "(";
448       s += "*";
449     } else {
450       const auto *objcProto = static_cast<const ObjCProtoName *>(Pointee);
451       s += "id<";
452       objcProto->Protocol->print(s);
453       s += ">";
454     }
455   }
456 
457   void printRight(OutputStream &s) const override {
458     if (Pointee->K != KObjCProtoName ||
459         !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) {
460       if (Pointee->hasArray() || Pointee->hasFunction())
461         s += ")";
462       Pointee->printRight(s);
463     }
464   }
465 };
466 
467 class LValueReferenceType final : public Node {
468   const Node *Pointee;
469 
470 public:
471   LValueReferenceType(Node *Pointee_)
472       : Node(KLValueReferenceType, Pointee_->hasRHSComponent()),
473         Pointee(Pointee_) {}
474 
475   void printLeft(OutputStream &s) const override {
476     Pointee->printLeft(s);
477     if (Pointee->hasArray())
478       s += " ";
479     if (Pointee->hasArray() || Pointee->hasFunction())
480       s += "(&";
481     else
482       s += "&";
483   }
484   void printRight(OutputStream &s) const override {
485     if (Pointee->hasArray() || Pointee->hasFunction())
486       s += ")";
487     Pointee->printRight(s);
488   }
489 };
490 
491 class RValueReferenceType final : public Node {
492   const Node *Pointee;
493 
494 public:
495   RValueReferenceType(Node *Pointee_)
496       : Node(KRValueReferenceType, Pointee_->hasRHSComponent()),
497         Pointee(Pointee_) {}
498 
499   void printLeft(OutputStream &s) const override {
500     Pointee->printLeft(s);
501     if (Pointee->hasArray())
502       s += " ";
503     if (Pointee->hasArray() || Pointee->hasFunction())
504       s += "(&&";
505     else
506       s += "&&";
507   }
508 
509   void printRight(OutputStream &s) const override {
510     if (Pointee->hasArray() || Pointee->hasFunction())
511       s += ")";
512     Pointee->printRight(s);
513   }
514 };
515 
516 class PointerToMemberType final : public Node {
517   const Node *ClassType;
518   const Node *MemberType;
519 
520 public:
521   PointerToMemberType(Node *ClassType_, Node *MemberType_)
522       : Node(KPointerToMemberType, MemberType_->hasRHSComponent()),
523         ClassType(ClassType_), MemberType(MemberType_) {}
524 
525   void printLeft(OutputStream &s) const override {
526     MemberType->printLeft(s);
527     if (MemberType->hasArray() || MemberType->hasFunction())
528       s += "(";
529     else
530       s += " ";
531     ClassType->print(s);
532     s += "::*";
533   }
534 
535   void printRight(OutputStream &s) const override {
536     if (MemberType->hasArray() || MemberType->hasFunction())
537       s += ")";
538     MemberType->printRight(s);
539   }
540 };
541 
542 class NodeOrString {
543   const void *First;
544   const void *Second;
545 
546 public:
547   /* implicit */ NodeOrString(StringView Str) {
548     const char *FirstChar = Str.begin();
549     const char *SecondChar = Str.end();
550     if (SecondChar == nullptr) {
551       assert(FirstChar == SecondChar);
552       ++FirstChar, ++SecondChar;
553     }
554     First = static_cast<const void *>(FirstChar);
555     Second = static_cast<const void *>(SecondChar);
556   }
557 
558   /* implicit */ NodeOrString(Node *N)
559       : First(static_cast<const void *>(N)), Second(nullptr) {}
560   NodeOrString() : First(nullptr), Second(nullptr) {}
561 
562   bool isString() const { return Second && First; }
563   bool isNode() const { return First && !Second; }
564   bool isEmpty() const { return !First && !Second; }
565 
566   StringView asString() const {
567     assert(isString());
568     return StringView(static_cast<const char *>(First),
569                       static_cast<const char *>(Second));
570   }
571 
572   const Node *asNode() const {
573     assert(isNode());
574     return static_cast<const Node *>(First);
575   }
576 };
577 
578 class ArrayType final : public Node {
579   Node *Base;
580   NodeOrString Dimension;
581 
582 public:
583   ArrayType(Node *Base_, NodeOrString Dimension_)
584       : Node(KArrayType, true, false, true), Base(Base_), Dimension(Dimension_) {}
585 
586   // Incomplete array type.
587   ArrayType(Node *Base_) : Node(KArrayType, true, false, true), Base(Base_) {}
588 
589   void printLeft(OutputStream &S) const override { Base->printLeft(S); }
590 
591   void printRight(OutputStream &S) const override {
592     if (S.back() != ']')
593       S += " ";
594     S += "[";
595     if (Dimension.isString())
596       S += Dimension.asString();
597     else if (Dimension.isNode())
598       Dimension.asNode()->print(S);
599     S += "]";
600     Base->printRight(S);
601   }
602 };
603 
604 class FunctionType final : public Node {
605   Node *Ret;
606   NodeArray Params;
607 
608 public:
609   FunctionType(Node *Ret_, NodeArray Params_)
610       : Node(KFunctionType, true, true), Ret(Ret_), Params(Params_) {}
611 
612   // Handle C++'s ... quirky decl grammer by using the left & right
613   // distinction. Consider:
614   //   int (*f(float))(char) {}
615   // f is a function that takes a float and returns a pointer to a function
616   // that takes a char and returns an int. If we're trying to print f, start
617   // by printing out the return types's left, then print our parameters, then
618   // finally print right of the return type.
619   void printLeft(OutputStream &S) const override {
620     Ret->printLeft(S);
621     S += " ";
622   }
623 
624   void printRight(OutputStream &S) const override {
625     S += "(";
626     Params.printWithSeperator(S, ", ");
627     S += ")";
628     Ret->printRight(S);
629   }
630 };
631 
632 class TopLevelFunctionDecl final : public Node {
633   const Node *Ret;
634   const Node *Name;
635   NodeArray Params;
636 
637 public:
638   TopLevelFunctionDecl(Node *Ret_, Node *Name_, NodeArray Params_)
639       : Node(KTopLevelFunctionDecl, true, true), Ret(Ret_), Name(Name_),
640         Params(Params_) {}
641 
642   void printLeft(OutputStream &S) const override {
643     if (Ret) {
644       Ret->printLeft(S);
645       if (!Ret->hasRHSComponent())
646         S += " ";
647     }
648     Name->print(S);
649   }
650 
651   void printRight(OutputStream &S) const override {
652     S += "(";
653     Params.printWithSeperator(S, ", ");
654     S += ")";
655     if (Ret)
656       Ret->printRight(S);
657   }
658 };
659 
660 enum FunctionRefQual : unsigned char {
661   FrefQualNone,
662   FrefQualLValue,
663   FrefQualRValue,
664 };
665 
666 class FunctionRefQualType : public Node {
667   Node *Fn;
668   FunctionRefQual Quals;
669 
670   friend class FunctionQualType;
671 
672 public:
673   FunctionRefQualType(Node *Fn_, FunctionRefQual Quals_)
674       : Node(KFunctionRefQualType, true, true), Fn(Fn_), Quals(Quals_) {}
675 
676   void printQuals(OutputStream &S) const {
677     if (Quals == FrefQualLValue)
678       S += " &";
679     else
680       S += " &&";
681   }
682 
683   void printLeft(OutputStream &S) const override { Fn->printLeft(S); }
684 
685   void printRight(OutputStream &S) const override {
686     Fn->printRight(S);
687     printQuals(S);
688   }
689 };
690 
691 class FunctionQualType final : public QualType {
692 public:
693   FunctionQualType(Node *Child_, Qualifiers Quals_)
694       : QualType(KFunctionQualType, Child_, Quals_) {}
695 
696   void printLeft(OutputStream &S) const override { Child->printLeft(S); }
697 
698   void printRight(OutputStream &S) const override {
699     if (Child->K == KFunctionRefQualType) {
700       auto *RefQuals = static_cast<const FunctionRefQualType *>(Child);
701       RefQuals->Fn->printRight(S);
702       printQuals(S);
703       RefQuals->printQuals(S);
704     } else {
705       Child->printRight(S);
706       printQuals(S);
707     }
708   }
709 };
710 
711 class LiteralOperator : public Node {
712   const Node *OpName;
713 
714 public:
715   LiteralOperator(Node *OpName_) : Node(KLiteralOperator), OpName(OpName_) {}
716 
717   void printLeft(OutputStream &S) const override {
718     S += "operator\"\" ";
719     OpName->print(S);
720   }
721 };
722 
723 class SpecialName final : public Node {
724   const StringView Special;
725   const Node *Child;
726 
727 public:
728   SpecialName(StringView Special_, Node *Child_)
729       : Node(KSpecialName), Special(Special_), Child(Child_) {}
730 
731   void printLeft(OutputStream &S) const override {
732     S += Special;
733     Child->print(S);
734   }
735 };
736 
737 class CtorVtableSpecialName final : public Node {
738   const Node *FirstType;
739   const Node *SecondType;
740 
741 public:
742   CtorVtableSpecialName(Node *FirstType_, Node *SecondType_)
743       : Node(KCtorVtableSpecialName), FirstType(FirstType_),
744         SecondType(SecondType_) {}
745 
746   void printLeft(OutputStream &S) const override {
747     S += "construction vtable for ";
748     FirstType->print(S);
749     S += "-in-";
750     SecondType->print(S);
751   }
752 };
753 
754 class QualifiedName final : public Node {
755   // qualifier::name
756   const Node *Qualifier;
757   const Node *Name;
758 
759   mutable OutputStream::StreamStringView Cache;
760 
761 public:
762   QualifiedName(Node *Qualifier_, Node *Name_)
763       : Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {}
764 
765   StringView getBaseName() const override { return Name->getBaseName(); }
766 
767   void printLeft(OutputStream &S) const override {
768     if (!Cache.empty()) {
769       S += Cache;
770       return;
771     }
772 
773     OutputStream::StreamPosition Start = S.getCurrentPosition();
774     if (Qualifier->K != KEmptyName) {
775       Qualifier->print(S);
776       S += "::";
777     }
778     Name->print(S);
779     Cache = S.makeStringViewFromPastPosition(Start);
780   }
781 };
782 
783 class EmptyName : public Node {
784 public:
785   EmptyName() : Node(KEmptyName) {}
786   void printLeft(OutputStream &) const override {}
787 };
788 
789 class VectorType final : public Node {
790   const Node *BaseType;
791   const NodeOrString Dimension;
792   const bool IsPixel;
793 
794 public:
795   VectorType(NodeOrString Dimension_)
796       : Node(KVectorType), BaseType(nullptr), Dimension(Dimension_),
797         IsPixel(true) {}
798   VectorType(Node *BaseType_, NodeOrString Dimension_)
799       : Node(KVectorType), BaseType(BaseType_), Dimension(Dimension_),
800         IsPixel(false) {}
801 
802   void printLeft(OutputStream &S) const override {
803     if (IsPixel) {
804       S += "pixel vector[";
805       S += Dimension.asString();
806       S += "]";
807     } else {
808       BaseType->print(S);
809       S += " vector[";
810       if (Dimension.isNode())
811         Dimension.asNode()->print(S);
812       else if (Dimension.isString())
813         S += Dimension.asString();
814       S += "]";
815     }
816   }
817 };
818 
819 class TemplateParams final : public Node {
820   NodeArray Params;
821 
822   mutable OutputStream::StreamStringView Cache;
823 
824 public:
825   TemplateParams(NodeArray Params_) : Node(KTemplateParams), Params(Params_) {}
826 
827   void printLeft(OutputStream &S) const override {
828     if (!Cache.empty()) {
829       S += Cache;
830       return;
831     }
832 
833     OutputStream::StreamPosition Start = S.getCurrentPosition();
834 
835     S += "<";
836     Params.printWithSeperator(S, ", ");
837     if (S.back() == '>')
838       S += " ";
839     S += ">";
840 
841     Cache = S.makeStringViewFromPastPosition(Start);
842   }
843 };
844 
845 class NameWithTemplateArgs final : public Node {
846   // name<template_args>
847   Node *Name;
848   Node *TemplateArgs;
849 
850 public:
851   NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_)
852       : Node(KNameWithTemplateArgs), Name(Name_), TemplateArgs(TemplateArgs_) {}
853 
854   StringView getBaseName() const override { return Name->getBaseName(); }
855 
856   void printLeft(OutputStream &S) const override {
857     Name->print(S);
858     TemplateArgs->print(S);
859   }
860 };
861 
862 class GlobalQualifiedName final : public Node {
863   Node *Child;
864 
865 public:
866   GlobalQualifiedName(Node *Child_) : Node(KGlobalQualifiedName), Child(Child_) {}
867 
868   StringView getBaseName() const override { return Child->getBaseName(); }
869 
870   void printLeft(OutputStream &S) const override {
871     S += "::";
872     Child->print(S);
873   }
874 };
875 
876 class StdQualifiedName final : public Node {
877   Node *Child;
878 
879 public:
880   StdQualifiedName(Node *Child_) : Node(KStdQualifiedName), Child(Child_) {}
881 
882   StringView getBaseName() const override { return Child->getBaseName(); }
883 
884   void printLeft(OutputStream &S) const override {
885     S += "std::";
886     Child->print(S);
887   }
888 };
889 
890 enum class SpecialSubKind {
891   allocator,
892   basic_string,
893   string,
894   istream,
895   ostream,
896   iostream,
897 };
898 
899 class ExpandedSpecialSubstitution final : public Node {
900   SpecialSubKind SSK;
901 
902 public:
903   ExpandedSpecialSubstitution(SpecialSubKind SSK_)
904       : Node(KExpandedSpecialSubstitution), SSK(SSK_) {}
905 
906   StringView getBaseName() const override {
907     switch (SSK) {
908     case SpecialSubKind::allocator:
909       return StringView("allocator");
910     case SpecialSubKind::basic_string:
911       return StringView("basic_string");
912     case SpecialSubKind::string:
913       return StringView("basic_string");
914     case SpecialSubKind::istream:
915       return StringView("basic_istream");
916     case SpecialSubKind::ostream:
917       return StringView("basic_ostream");
918     case SpecialSubKind::iostream:
919       return StringView("basic_iostream");
920     }
921     _LIBCPP_UNREACHABLE();
922   }
923 
924   void printLeft(OutputStream &S) const override {
925     switch (SSK) {
926     case SpecialSubKind::allocator:
927       S += "std::basic_string<char, std::char_traits<char>, "
928            "std::allocator<char> >";
929       break;
930     case SpecialSubKind::basic_string:
931     case SpecialSubKind::string:
932       S += "std::basic_string<char, std::char_traits<char>, "
933            "std::allocator<char> >";
934       break;
935     case SpecialSubKind::istream:
936       S += "std::basic_istream<char, std::char_traits<char> >";
937       break;
938     case SpecialSubKind::ostream:
939       S += "std::basic_ostream<char, std::char_traits<char> >";
940       break;
941     case SpecialSubKind::iostream:
942       S += "std::basic_iostream<char, std::char_traits<char> >";
943       break;
944     }
945   }
946 };
947 
948 class SpecialSubstitution final : public Node {
949 public:
950   SpecialSubKind SSK;
951 
952   SpecialSubstitution(SpecialSubKind SSK_)
953       : Node(KSpecialSubstitution), SSK(SSK_) {}
954 
955   StringView getBaseName() const override {
956     switch (SSK) {
957     case SpecialSubKind::allocator:
958       return StringView("allocator");
959     case SpecialSubKind::basic_string:
960       return StringView("basic_string");
961     case SpecialSubKind::string:
962       return StringView("string");
963     case SpecialSubKind::istream:
964       return StringView("istream");
965     case SpecialSubKind::ostream:
966       return StringView("ostream");
967     case SpecialSubKind::iostream:
968       return StringView("iostream");
969     }
970     _LIBCPP_UNREACHABLE();
971   }
972 
973   void printLeft(OutputStream &S) const override {
974     switch (SSK) {
975     case SpecialSubKind::allocator:
976       S += "std::allocator";
977       break;
978     case SpecialSubKind::basic_string:
979       S += "std::basic_string";
980       break;
981     case SpecialSubKind::string:
982       S += "std::string";
983       break;
984     case SpecialSubKind::istream:
985       S += "std::istream";
986       break;
987     case SpecialSubKind::ostream:
988       S += "std::ostream";
989       break;
990     case SpecialSubKind::iostream:
991       S += "std::iostream";
992       break;
993     }
994   }
995 };
996 
997 class CtorDtorName final : public Node {
998   const Node *Basename;
999   const bool IsDtor;
1000 
1001 public:
1002   CtorDtorName(Node *Basename_, bool IsDtor_)
1003       : Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_) {}
1004 
1005   void printLeft(OutputStream &S) const override {
1006     if (IsDtor)
1007       S += "~";
1008     S += Basename->getBaseName();
1009   }
1010 };
1011 
1012 class DtorName : public Node {
1013   const Node *Base;
1014 
1015 public:
1016   DtorName(Node *Base_) : Node(KDtorName), Base(Base_) {}
1017 
1018   void printLeft(OutputStream &S) const override {
1019     S += "~";
1020     Base->printLeft(S);
1021   }
1022 };
1023 
1024 class UnnamedTypeName : public Node {
1025   const StringView Count;
1026 
1027 public:
1028   UnnamedTypeName(StringView Count_) : Node(KUnnamedTypeName), Count(Count_) {}
1029 
1030   void printLeft(OutputStream &S) const override {
1031     S += "'unnamed";
1032     S += Count;
1033     S += "\'";
1034   }
1035 };
1036 
1037 class LambdaTypeName : public Node {
1038   NodeArray Params;
1039   StringView Count;
1040 
1041 public:
1042   LambdaTypeName(NodeArray Params_, StringView Count_)
1043       : Node(KLambdaTypeName), Params(Params_), Count(Count_) {}
1044 
1045   void printLeft(OutputStream &S) const override {
1046     S += "\'lambda";
1047     S += Count;
1048     S += "\'(";
1049     Params.printWithSeperator(S, ", ");
1050     S += ")";
1051   }
1052 };
1053 
1054 // -- Expression Nodes --
1055 
1056 struct Expr : public Node {
1057   Expr() : Node(KExpr) {}
1058 };
1059 
1060 class BinaryExpr : public Expr {
1061   const Node *LHS;
1062   const StringView InfixOperator;
1063   const Node *RHS;
1064 
1065 public:
1066   BinaryExpr(Node *LHS_, StringView InfixOperator_, Node *RHS_)
1067       : LHS(LHS_), InfixOperator(InfixOperator_), RHS(RHS_) {}
1068 
1069   void printLeft(OutputStream &S) const override {
1070     // might be a template argument expression, then we need to disambiguate
1071     // with parens.
1072     if (InfixOperator == ">")
1073       S += "(";
1074 
1075     S += "(";
1076     LHS->print(S);
1077     S += ") ";
1078     S += InfixOperator;
1079     S += " (";
1080     RHS->print(S);
1081     S += ")";
1082 
1083     if (InfixOperator == ">")
1084       S += ")";
1085   }
1086 };
1087 
1088 class ArraySubscriptExpr : public Expr {
1089   const Node *Op1;
1090   const Node *Op2;
1091 
1092 public:
1093   ArraySubscriptExpr(Node *Op1_, Node *Op2_) : Op1(Op1_), Op2(Op2_) {}
1094 
1095   void printLeft(OutputStream &S) const override {
1096     S += "(";
1097     Op1->print(S);
1098     S += ")[";
1099     Op2->print(S);
1100     S += "]";
1101   }
1102 };
1103 
1104 class PostfixExpr : public Expr {
1105   const Node *Child;
1106   const StringView Operand;
1107 
1108 public:
1109   PostfixExpr(Node *Child_, StringView Operand_)
1110       : Child(Child_), Operand(Operand_) {}
1111 
1112   void printLeft(OutputStream &S) const override {
1113     S += "(";
1114     Child->print(S);
1115     S += ")";
1116     S += Operand;
1117   }
1118 };
1119 
1120 class ConditionalExpr : public Expr {
1121   const Node *Cond;
1122   const Node *Then;
1123   const Node *Else;
1124 
1125 public:
1126   ConditionalExpr(Node *Cond_, Node *Then_, Node *Else_)
1127       : Cond(Cond_), Then(Then_), Else(Else_) {}
1128 
1129   void printLeft(OutputStream &S) const override {
1130     S += "(";
1131     Cond->print(S);
1132     S += ") ? (";
1133     Then->print(S);
1134     S += ") : (";
1135     Else->print(S);
1136     S += ")";
1137   }
1138 };
1139 
1140 class MemberExpr : public Expr {
1141   const Node *LHS;
1142   const StringView Kind;
1143   const Node *RHS;
1144 
1145 public:
1146   MemberExpr(Node *LHS_, StringView Kind_, Node *RHS_)
1147       : LHS(LHS_), Kind(Kind_), RHS(RHS_) {}
1148 
1149   void printLeft(OutputStream &S) const override {
1150     LHS->print(S);
1151     S += Kind;
1152     RHS->print(S);
1153   }
1154 };
1155 
1156 class EnclosingExpr : public Expr {
1157   const StringView Prefix;
1158   const Node *Infix;
1159   const StringView Postfix;
1160 
1161 public:
1162   EnclosingExpr(StringView Prefix_, Node *Infix_, StringView Postfix_)
1163       : Prefix(Prefix_), Infix(Infix_), Postfix(Postfix_) {}
1164 
1165   void printLeft(OutputStream &S) const override {
1166     S += Prefix;
1167     Infix->print(S);
1168     S += Postfix;
1169   }
1170 };
1171 
1172 class CastExpr : public Expr {
1173   // cast_kind<to>(from)
1174   const StringView CastKind;
1175   const Node *To;
1176   const Node *From;
1177 
1178 public:
1179   CastExpr(StringView CastKind_, Node *To_, Node *From_)
1180       : CastKind(CastKind_), To(To_), From(From_) {}
1181 
1182   void printLeft(OutputStream &S) const override {
1183     S += CastKind;
1184     S += "<";
1185     To->printLeft(S);
1186     S += ">(";
1187     From->printLeft(S);
1188     S += ")";
1189   }
1190 };
1191 
1192 class SizeofParamPackExpr : public Expr {
1193   NodeArray Args;
1194 
1195 public:
1196   SizeofParamPackExpr(NodeArray Args_) : Args(Args_) {}
1197 
1198   void printLeft(OutputStream &S) const override {
1199     S += "sizeof...(";
1200     Args.printWithSeperator(S, ", ");
1201     S += ")";
1202   }
1203 };
1204 
1205 class CallExpr : public Expr {
1206   const Node *Callee;
1207   NodeArray Args;
1208 
1209 public:
1210   CallExpr(Node *Callee_, NodeArray Args_) : Callee(Callee_), Args(Args_) {}
1211 
1212   void printLeft(OutputStream &S) const override {
1213     Callee->print(S);
1214     S += "(";
1215     Args.printWithSeperator(S, ", ");
1216     S += ")";
1217   }
1218 };
1219 
1220 class NewExpr : public Expr {
1221   // new (expr_list) type(init_list)
1222   NodeArray ExprList;
1223   Node *Type;
1224   NodeArray InitList;
1225   bool IsGlobal; // ::operator new ?
1226   bool IsArray;  // new[] ?
1227 public:
1228   NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_,
1229           bool IsArray_)
1230       : ExprList(ExprList_), Type(Type_), InitList(InitList_), IsGlobal(IsGlobal_),
1231         IsArray(IsArray_) {}
1232 
1233   void printLeft(OutputStream &S) const override {
1234     if (IsGlobal)
1235       S += "::operator ";
1236     S += "new";
1237     if (IsArray)
1238       S += "[]";
1239     if (!ExprList.empty()) {
1240       S += "(";
1241       ExprList.printWithSeperator(S, ", ");
1242       S += ")";
1243     }
1244     Type->print(S);
1245     if (!InitList.empty()) {
1246       S += "(";
1247       InitList.printWithSeperator(S, ", ");
1248       S += ")";
1249     }
1250   }
1251 };
1252 
1253 class DeleteExpr : public Expr {
1254   Node *Op;
1255   bool IsGlobal;
1256   bool IsArray;
1257 
1258 public:
1259   DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_)
1260       : Op(Op_), IsGlobal(IsGlobal_), IsArray(IsArray_) {}
1261 
1262   void printLeft(OutputStream &S) const override {
1263     if (IsGlobal)
1264       S += "::";
1265     S += "delete";
1266     if (IsArray)
1267       S += "[] ";
1268     Op->print(S);
1269   }
1270 };
1271 
1272 class PrefixExpr : public Expr {
1273   StringView Prefix;
1274   Node *Child;
1275 
1276 public:
1277   PrefixExpr(StringView Prefix_, Node *Child_) : Prefix(Prefix_), Child(Child_) {}
1278 
1279   void printLeft(OutputStream &S) const override {
1280     S += Prefix;
1281     S += "(";
1282     Child->print(S);
1283     S += ")";
1284   }
1285 };
1286 
1287 class FunctionParam : public Expr {
1288   StringView Number;
1289 
1290 public:
1291   FunctionParam(StringView Number_) : Number(Number_) {}
1292 
1293   void printLeft(OutputStream &S) const override {
1294     S += "fp";
1295     S += Number;
1296   }
1297 };
1298 
1299 class ExprList : public Expr {
1300   NodeArray SubExprs;
1301 
1302 public:
1303   ExprList(NodeArray SubExprs_) : SubExprs(SubExprs_) {}
1304 
1305   void printLeft(OutputStream &S) const override {
1306     S += "(";
1307     SubExprs.printWithSeperator(S, ", ");
1308     S += ")";
1309   }
1310 };
1311 
1312 class ConversionExpr : public Expr {
1313   NodeArray Expressions;
1314   NodeArray Types;
1315 
1316 public:
1317   ConversionExpr(NodeArray Expressions_, NodeArray Types_)
1318       : Expressions(Expressions_), Types(Types_) {}
1319 
1320   void printLeft(OutputStream &S) const override {
1321     S += "(";
1322     Expressions.printWithSeperator(S, ", ");
1323     S += ")(";
1324     Types.printWithSeperator(S, ", ");
1325     S += ")";
1326   }
1327 };
1328 
1329 class ThrowExpr : public Expr {
1330   const Node *Op;
1331 
1332 public:
1333   ThrowExpr(Node *Op_) : Op(Op_) {}
1334 
1335   void printLeft(OutputStream &S) const override {
1336     S += "throw ";
1337     Op->print(S);
1338   }
1339 };
1340 
1341 class BoolExpr : public Expr {
1342   bool Value;
1343 
1344 public:
1345   BoolExpr(bool Value_) : Value(Value_) {}
1346 
1347   void printLeft(OutputStream &S) const override {
1348     S += Value ? StringView("true") : StringView("false");
1349   }
1350 };
1351 
1352 class IntegerCastExpr : public Expr {
1353   // ty(integer)
1354   Node *Ty;
1355   StringView Integer;
1356 
1357 public:
1358   IntegerCastExpr(Node *Ty_, StringView Integer_) : Ty(Ty_), Integer(Integer_) {}
1359 
1360   void printLeft(OutputStream &S) const override {
1361     S += "(";
1362     Ty->print(S);
1363     S += ")";
1364     S += Integer;
1365   }
1366 };
1367 
1368 class IntegerExpr : public Expr {
1369   StringView Type;
1370   StringView Value;
1371 
1372 public:
1373   IntegerExpr(StringView Type_, StringView Value_) : Type(Type_), Value(Value_) {}
1374 
1375   void printLeft(OutputStream &S) const override {
1376     if (Type.size() > 3) {
1377       S += "(";
1378       S += Type;
1379       S += ")";
1380     }
1381 
1382     if (Value[0] == 'n') {
1383       S += "-";
1384       S += Value.dropFront(1);
1385     } else
1386       S += Value;
1387 
1388     if (Type.size() <= 3)
1389       S += Type;
1390   }
1391 };
1392 
1393 template <class Float> struct FloatData;
1394 
1395 template <class Float> class FloatExpr : public Expr {
1396   const StringView Contents;
1397 
1398 public:
1399   FloatExpr(StringView Contents_) : Contents(Contents_) {}
1400 
1401   void printLeft(OutputStream &s) const override {
1402     const char *first = Contents.begin();
1403     const char *last = Contents.end() + 1;
1404 
1405     const size_t N = FloatData<Float>::mangled_size;
1406     if (static_cast<std::size_t>(last - first) > N) {
1407       last = first + N;
1408       union {
1409         Float value;
1410         char buf[sizeof(Float)];
1411       };
1412       const char *t = first;
1413       char *e = buf;
1414       for (; t != last; ++t, ++e) {
1415         unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0')
1416                                   : static_cast<unsigned>(*t - 'a' + 10);
1417         ++t;
1418         unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0')
1419                                   : static_cast<unsigned>(*t - 'a' + 10);
1420         *e = static_cast<char>((d1 << 4) + d0);
1421       }
1422 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1423       std::reverse(buf, e);
1424 #endif
1425       char num[FloatData<Float>::max_demangled_size] = {0};
1426       int n = snprintf(num, sizeof(num), FloatData<Float>::spec, value);
1427       s += StringView(num, num + n);
1428     }
1429   }
1430 };
1431 
1432 class BumpPointerAllocator {
1433   struct BlockMeta {
1434     BlockMeta* Next;
1435     size_t Current;
1436   };
1437 
1438   static constexpr size_t AllocSize = 4096;
1439   static constexpr size_t UsableAllocSize = AllocSize - sizeof(BlockMeta);
1440 
1441   alignas(16) char InitialBuffer[AllocSize];
1442   BlockMeta* BlockList = nullptr;
1443 
1444   void grow() {
1445     char* NewMeta = new char[AllocSize];
1446     BlockList = new (NewMeta) BlockMeta{BlockList, 0};
1447   }
1448 
1449   void* allocateMassive(size_t NBytes) {
1450     NBytes += sizeof(BlockMeta);
1451     BlockMeta* NewMeta = reinterpret_cast<BlockMeta*>(new char[NBytes]);
1452     BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0};
1453     return static_cast<void*>(NewMeta + 1);
1454   }
1455 
1456 public:
1457   BumpPointerAllocator()
1458       : BlockList(new (InitialBuffer) BlockMeta{nullptr, 0}) {}
1459 
1460   void* allocate(size_t N) {
1461     N = (N + 15u) & ~15u;
1462     if (N + BlockList->Current >= UsableAllocSize) {
1463       if (N > UsableAllocSize)
1464         return allocateMassive(N);
1465       grow();
1466     }
1467     BlockList->Current += N;
1468     return static_cast<void*>(reinterpret_cast<char*>(BlockList + 1) +
1469                               BlockList->Current - N);
1470   }
1471 
1472   ~BumpPointerAllocator() {
1473     while (BlockList) {
1474       BlockMeta* Tmp = BlockList;
1475       BlockList = BlockList->Next;
1476       if (reinterpret_cast<char*>(Tmp) != InitialBuffer)
1477         delete[] reinterpret_cast<char*>(Tmp);
1478     }
1479   }
1480 };
1481 
1482 template <class T, size_t N>
1483 class PODSmallVector {
1484   static_assert(std::is_pod<T>::value,
1485                 "T is required to be a plain old data type");
1486 
1487   T* First;
1488   T* Last;
1489   T* Cap;
1490   T Inline[N];
1491 
1492   bool isInline() const { return First == Inline; }
1493 
1494   void clearInline() {
1495     First = Inline;
1496     Last = Inline;
1497     Cap = Inline + N;
1498   }
1499 
1500   void reserve(size_t NewCap) {
1501     size_t S = size();
1502     if (isInline()) {
1503       auto* Tmp = static_cast<T*>(std::malloc(NewCap * sizeof(T)));
1504       std::copy(First, Last, Tmp);
1505       First = Tmp;
1506     } else
1507       First = static_cast<T*>(std::realloc(First, NewCap * sizeof(T)));
1508     Last = First + S;
1509     Cap = First + NewCap;
1510   }
1511 
1512 public:
1513   PODSmallVector() : First(Inline), Last(First), Cap(Inline + N) {}
1514 
1515   PODSmallVector(const PODSmallVector&) = delete;
1516   PODSmallVector& operator=(const PODSmallVector&) = delete;
1517 
1518   PODSmallVector(PODSmallVector&& Other) : PODSmallVector() {
1519     if (Other.isInline()) {
1520       std::copy(Other.begin(), Other.end(), First);
1521       Last = First + Other.size();
1522       Other.clear();
1523       return;
1524     }
1525 
1526     First = Other.First;
1527     Last = Other.Last;
1528     Cap = Other.Cap;
1529     Other.clearInline();
1530   }
1531 
1532   PODSmallVector& operator=(PODSmallVector&& Other) {
1533     if (Other.isInline()) {
1534       if (!isInline()) {
1535         std::free(First);
1536         clearInline();
1537       }
1538       std::copy(Other.begin(), Other.end(), First);
1539       Last = First + Other.size();
1540       Other.clear();
1541       return *this;
1542     }
1543 
1544     if (isInline()) {
1545       First = Other.First;
1546       Last = Other.Last;
1547       Cap = Other.Cap;
1548       Other.clearInline();
1549       return *this;
1550     }
1551 
1552     std::swap(First, Other.First);
1553     std::swap(Last, Other.Last);
1554     std::swap(Cap, Other.Cap);
1555     Other.clear();
1556     return *this;
1557   }
1558 
1559   void push_back(const T& Elem) {
1560     if (Last == Cap)
1561       reserve(size() * 2);
1562     *Last++ = Elem;
1563   }
1564 
1565   void pop_back() {
1566     assert(Last != First && "Popping empty vector!");
1567     --Last;
1568   }
1569 
1570   void dropBack(size_t Index) {
1571     assert(Index <= size() && "dropBack() can't expand!");
1572     Last = First + Index;
1573   }
1574 
1575   T* begin() { return First; }
1576   T* end() { return Last; }
1577 
1578   bool empty() const { return First == Last; }
1579   size_t size() const { return static_cast<size_t>(Last - First); }
1580   T& back() {
1581     assert(Last != First && "Calling back() on empty vector!");
1582     return *(Last - 1);
1583   }
1584   T& operator[](size_t Index) {
1585     assert(Index < size() && "Invalid access!");
1586     return *(begin() + Index);
1587   }
1588   void clear() { Last = First; }
1589 
1590   ~PODSmallVector() {
1591     if (!isInline())
1592       std::free(First);
1593   }
1594 };
1595 
1596 // Substitution table. This type is used to track the substitutions that are
1597 // known by the parser.
1598 template <size_t Size>
1599 class SubstitutionTable {
1600   // Substitutions hold the actual entries in the table, and PackIndices tells
1601   // us which entries are members of which pack. For example, if the
1602   // substitutions we're tracking are: {int, {float, FooBar}, char}, with
1603   // {float, FooBar} being a parameter pack, we represent the substitutions as:
1604   // Substitutions: int, float, FooBar, char
1605   // PackIndices:     0,             1,    3
1606   // So, PackIndicies[I] holds the offset of the begin of the Ith pack, and
1607   // PackIndices[I + 1] holds the offset of the end.
1608   PODSmallVector<Node*, Size> Substitutions;
1609   PODSmallVector<unsigned, Size> PackIndices;
1610 
1611 public:
1612   // Add a substitution that represents a single name to the table. This is
1613   // modeled as a parameter pack with just one element.
1614   void pushSubstitution(Node* Entry) {
1615     pushPack();
1616     pushSubstitutionIntoPack(Entry);
1617   }
1618 
1619   // Add a new empty pack to the table. Subsequent calls to
1620   // pushSubstitutionIntoPack() will add to this pack.
1621   void pushPack() {
1622     PackIndices.push_back(static_cast<unsigned>(Substitutions.size()));
1623   }
1624   void pushSubstitutionIntoPack(Node* Entry) {
1625     assert(!PackIndices.empty() && "No pack to push substitution into!");
1626     Substitutions.push_back(Entry);
1627   }
1628 
1629   // Remove the last pack from the table.
1630   void popPack() {
1631     unsigned Last = PackIndices.back();
1632     PackIndices.pop_back();
1633     Substitutions.dropBack(Last);
1634   }
1635 
1636   // For use in a range-for loop.
1637   struct NodeRange {
1638     Node** First;
1639     Node** Last;
1640     Node** begin() { return First; }
1641     Node** end() { return Last; }
1642   };
1643 
1644   // Retrieve the Nth substitution. This is represented as a range, as the
1645   // substitution could be referring to a parameter pack.
1646   NodeRange nthSubstitution(size_t N) {
1647     assert(PackIndices[N] <= Substitutions.size());
1648     // The Nth parameter pack starts at offset PackIndices[N], and ends at
1649     // PackIndices[N + 1].
1650     Node** Begin = Substitutions.begin() + PackIndices[N];
1651     Node** End;
1652     if (N + 1 != PackIndices.size()) {
1653       assert(PackIndices[N + 1] <= Substitutions.size());
1654       End = Substitutions.begin() + PackIndices[N + 1];
1655     } else
1656       End = Substitutions.end();
1657     assert(Begin <= End);
1658     return NodeRange{Begin, End};
1659   }
1660 
1661   size_t size() const { return PackIndices.size(); }
1662   bool empty() const { return PackIndices.empty(); }
1663   void clear() {
1664     Substitutions.clear();
1665     PackIndices.clear();
1666   }
1667 };
1668 
1669 struct Db
1670 {
1671     // Name stack, this is used by the parser to hold temporary names that were
1672     // parsed. The parser colapses multiple names into new nodes to construct
1673     // the AST. Once the parser is finished, names.size() == 1.
1674     PODSmallVector<Node*, 32> Names;
1675 
1676     // Substitution table. Itanium supports name substitutions as a means of
1677     // compression. The string "S42_" refers to the 42nd entry in this table.
1678     SubstitutionTable<32> Subs;
1679 
1680     // Template parameter table. Like the above, but referenced like "T42_".
1681     // This has a smaller size compared to Subs and Names because it can be
1682     // stored on the stack.
1683     SubstitutionTable<4> TemplateParams;
1684 
1685     Qualifiers CV = QualNone;
1686     FunctionRefQual RefQuals = FrefQualNone;
1687     unsigned EncodingDepth = 0;
1688     bool ParsedCtorDtorCV = false;
1689     bool TagTemplates = true;
1690     bool FixForwardReferences = false;
1691     bool TryToParseTemplateArgs = true;
1692 
1693     BumpPointerAllocator ASTAllocator;
1694 
1695     template <class T, class... Args> T* make(Args&& ...args)
1696     {
1697         return new (ASTAllocator.allocate(sizeof(T)))
1698             T(std::forward<Args>(args)...);
1699     }
1700 
1701     template <class It> NodeArray makeNodeArray(It begin, It end)
1702     {
1703         size_t sz = static_cast<size_t>(end - begin);
1704         void* mem = ASTAllocator.allocate(sizeof(Node*) * sz);
1705         Node** data = new (mem) Node*[sz];
1706         std::copy(begin, end, data);
1707         return NodeArray(data, sz);
1708     }
1709 
1710     NodeArray popTrailingNodeArray(size_t FromPosition)
1711     {
1712         assert(FromPosition <= Names.size());
1713         NodeArray res = makeNodeArray(
1714             Names.begin() + (long)FromPosition, Names.end());
1715         Names.dropBack(FromPosition);
1716         return res;
1717     }
1718 };
1719 
1720 const char* parse_type(const char* first, const char* last, Db& db);
1721 const char* parse_encoding(const char* first, const char* last, Db& db);
1722 const char* parse_name(const char* first, const char* last, Db& db,
1723                        bool* ends_with_template_args = 0);
1724 const char* parse_expression(const char* first, const char* last, Db& db);
1725 const char* parse_template_args(const char* first, const char* last, Db& db);
1726 const char* parse_operator_name(const char* first, const char* last, Db& db);
1727 const char* parse_unqualified_name(const char* first, const char* last, Db& db);
1728 const char* parse_decltype(const char* first, const char* last, Db& db);
1729 
1730 // <number> ::= [n] <non-negative decimal integer>
1731 
1732 const char*
1733 parse_number(const char* first, const char* last)
1734 {
1735     if (first != last)
1736     {
1737         const char* t = first;
1738         if (*t == 'n')
1739             ++t;
1740         if (t != last)
1741         {
1742             if (*t == '0')
1743             {
1744                 first = t+1;
1745             }
1746             else if ('1' <= *t && *t <= '9')
1747             {
1748                 first = t+1;
1749                 while (first != last && std::isdigit(*first))
1750                     ++first;
1751             }
1752         }
1753     }
1754     return first;
1755 }
1756 
1757 template <class Float>
1758 struct FloatData;
1759 
1760 template <>
1761 struct FloatData<float>
1762 {
1763     static const size_t mangled_size = 8;
1764     static const size_t max_demangled_size = 24;
1765     static constexpr const char* spec = "%af";
1766 };
1767 
1768 constexpr const char* FloatData<float>::spec;
1769 
1770 template <>
1771 struct FloatData<double>
1772 {
1773     static const size_t mangled_size = 16;
1774     static const size_t max_demangled_size = 32;
1775     static constexpr const char* spec = "%a";
1776 };
1777 
1778 constexpr const char* FloatData<double>::spec;
1779 
1780 template <>
1781 struct FloatData<long double>
1782 {
1783 #if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \
1784     defined(__wasm__)
1785     static const size_t mangled_size = 32;
1786 #elif defined(__arm__) || defined(__mips__) || defined(__hexagon__)
1787     static const size_t mangled_size = 16;
1788 #else
1789     static const size_t mangled_size = 20;  // May need to be adjusted to 16 or 24 on other platforms
1790 #endif
1791     static const size_t max_demangled_size = 40;
1792     static constexpr const char* spec = "%LaL";
1793 };
1794 
1795 constexpr const char* FloatData<long double>::spec;
1796 
1797 template <class Float>
1798 const char*
1799 parse_floating_number(const char* first, const char* last, Db& db)
1800 {
1801     const size_t N = FloatData<Float>::mangled_size;
1802     if (static_cast<std::size_t>(last - first) <= N)
1803         return first;
1804     last = first + N;
1805     const char* t = first;
1806     for (; t != last; ++t)
1807     {
1808         if (!isxdigit(*t))
1809             return first;
1810     }
1811     if (*t == 'E')
1812     {
1813         db.Names.push_back(
1814             db.make<FloatExpr<Float>>(StringView(first, t)));
1815         first = t + 1;
1816     }
1817     return first;
1818 }
1819 
1820 // <positive length number> ::= [0-9]*
1821 const char*
1822 parse_positive_integer(const char* first, const char* last, size_t* out)
1823 {
1824     if (first != last)
1825     {
1826         char c = *first;
1827         if (isdigit(c) && first+1 != last)
1828         {
1829             const char* t = first+1;
1830             size_t n = static_cast<size_t>(c - '0');
1831             for (c = *t; isdigit(c); c = *t)
1832             {
1833                 n = n * 10 + static_cast<size_t>(c - '0');
1834                 if (++t == last)
1835                     return first;
1836             }
1837             *out = n;
1838             first = t;
1839         }
1840     }
1841     return first;
1842 }
1843 
1844 // extension
1845 // <abi-tag-seq> ::= <abi-tag>*
1846 // <abi-tag>     ::= B <positive length number> <identifier>
1847 const char*
1848 parse_abi_tag_seq(const char* first, const char* last, Db& db)
1849 {
1850     while (first != last && *first == 'B' && first+1 != last)
1851     {
1852         size_t length;
1853         const char* t = parse_positive_integer(first+1, last, &length);
1854         if (t == first+1)
1855             return first;
1856         if (static_cast<size_t>(last - t) < length || db.Names.empty())
1857             return first;
1858         db.Names.back() = db.make<AbiTagAttr>(
1859             db.Names.back(), StringView(t, t + length));
1860         first = t + length;
1861     }
1862     return first;
1863 }
1864 
1865 // <source-name> ::= <positive length number> <identifier> [<abi-tag-seq>]
1866 const char*
1867 parse_source_name(const char* first, const char* last, Db& db)
1868 {
1869     if (first != last)
1870     {
1871         size_t length;
1872         const char* t = parse_positive_integer(first, last, &length);
1873         if (t == first)
1874             return first;
1875         if (static_cast<size_t>(last - t) >= length)
1876         {
1877             StringView r(t, t + length);
1878             if (r.substr(0, 10) == "_GLOBAL__N")
1879                 db.Names.push_back(db.make<NameType>("(anonymous namespace)"));
1880             else
1881                 db.Names.push_back(db.make<NameType>(r));
1882             first = t + length;
1883             first = parse_abi_tag_seq(first, last, db);
1884         }
1885     }
1886     return first;
1887 }
1888 
1889 // <substitution> ::= S <seq-id> _
1890 //                ::= S_
1891 // <substitution> ::= Sa # ::std::allocator
1892 // <substitution> ::= Sb # ::std::basic_string
1893 // <substitution> ::= Ss # ::std::basic_string < char,
1894 //                                               ::std::char_traits<char>,
1895 //                                               ::std::allocator<char> >
1896 // <substitution> ::= Si # ::std::basic_istream<char,  std::char_traits<char> >
1897 // <substitution> ::= So # ::std::basic_ostream<char,  std::char_traits<char> >
1898 // <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
1899 
1900 const char*
1901 parse_substitution(const char* first, const char* last, Db& db)
1902 {
1903     if (last - first >= 2)
1904     {
1905         if (*first == 'S')
1906         {
1907             switch (first[1])
1908             {
1909             case 'a':
1910                 db.Names.push_back(
1911                     db.make<SpecialSubstitution>(
1912                         SpecialSubKind::allocator));
1913                 first += 2;
1914                 break;
1915             case 'b':
1916                 db.Names.push_back(
1917                     db.make<SpecialSubstitution>(SpecialSubKind::basic_string));
1918                 first += 2;
1919                 break;
1920             case 's':
1921                 db.Names.push_back(
1922                     db.make<SpecialSubstitution>(
1923                         SpecialSubKind::string));
1924                 first += 2;
1925                 break;
1926             case 'i':
1927                 db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::istream));
1928                 first += 2;
1929                 break;
1930             case 'o':
1931                 db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::ostream));
1932                 first += 2;
1933                 break;
1934             case 'd':
1935                 db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::iostream));
1936                 first += 2;
1937                 break;
1938             case '_':
1939                 if (!db.Subs.empty())
1940                 {
1941                     for (Node* n : db.Subs.nthSubstitution(0))
1942                         db.Names.push_back(n);
1943                     first += 2;
1944                 }
1945                 break;
1946             default:
1947                 if (std::isdigit(first[1]) || std::isupper(first[1]))
1948                 {
1949                     size_t sub = 0;
1950                     const char* t = first+1;
1951                     if (std::isdigit(*t))
1952                         sub = static_cast<size_t>(*t - '0');
1953                     else
1954                         sub = static_cast<size_t>(*t - 'A') + 10;
1955                     for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
1956                     {
1957                         sub *= 36;
1958                         if (std::isdigit(*t))
1959                             sub += static_cast<size_t>(*t - '0');
1960                         else
1961                             sub += static_cast<size_t>(*t - 'A') + 10;
1962                     }
1963                     if (t == last || *t != '_')
1964                         return first;
1965                     ++sub;
1966                     if (sub < db.Subs.size())
1967                     {
1968                         for (Node* n : db.Subs.nthSubstitution(sub))
1969                             db.Names.push_back(n);
1970                         first = t+1;
1971                     }
1972                 }
1973                 break;
1974             }
1975         }
1976     }
1977     return first;
1978 }
1979 
1980 // <builtin-type> ::= v    # void
1981 //                ::= w    # wchar_t
1982 //                ::= b    # bool
1983 //                ::= c    # char
1984 //                ::= a    # signed char
1985 //                ::= h    # unsigned char
1986 //                ::= s    # short
1987 //                ::= t    # unsigned short
1988 //                ::= i    # int
1989 //                ::= j    # unsigned int
1990 //                ::= l    # long
1991 //                ::= m    # unsigned long
1992 //                ::= x    # long long, __int64
1993 //                ::= y    # unsigned long long, __int64
1994 //                ::= n    # __int128
1995 //                ::= o    # unsigned __int128
1996 //                ::= f    # float
1997 //                ::= d    # double
1998 //                ::= e    # long double, __float80
1999 //                ::= g    # __float128
2000 //                ::= z    # ellipsis
2001 //                ::= Dd   # IEEE 754r decimal floating point (64 bits)
2002 //                ::= De   # IEEE 754r decimal floating point (128 bits)
2003 //                ::= Df   # IEEE 754r decimal floating point (32 bits)
2004 //                ::= Dh   # IEEE 754r half-precision floating point (16 bits)
2005 //                ::= Di   # char32_t
2006 //                ::= Ds   # char16_t
2007 //                ::= Da   # auto (in dependent new-expressions)
2008 //                ::= Dc   # decltype(auto)
2009 //                ::= Dn   # std::nullptr_t (i.e., decltype(nullptr))
2010 //                ::= u <source-name>    # vendor extended type
2011 
2012 const char*
2013 parse_builtin_type(const char* first, const char* last, Db& db)
2014 {
2015     if (first != last)
2016     {
2017         switch (*first)
2018         {
2019         case 'v':
2020             db.Names.push_back(db.make<NameType>("void"));
2021             ++first;
2022             break;
2023         case 'w':
2024             db.Names.push_back(db.make<NameType>("wchar_t"));
2025             ++first;
2026             break;
2027         case 'b':
2028             db.Names.push_back(db.make<NameType>("bool"));
2029             ++first;
2030             break;
2031         case 'c':
2032             db.Names.push_back(db.make<NameType>("char"));
2033             ++first;
2034             break;
2035         case 'a':
2036             db.Names.push_back(db.make<NameType>("signed char"));
2037             ++first;
2038             break;
2039         case 'h':
2040             db.Names.push_back(db.make<NameType>("unsigned char"));
2041             ++first;
2042             break;
2043         case 's':
2044             db.Names.push_back(db.make<NameType>("short"));
2045             ++first;
2046             break;
2047         case 't':
2048             db.Names.push_back(db.make<NameType>("unsigned short"));
2049             ++first;
2050             break;
2051         case 'i':
2052             db.Names.push_back(db.make<NameType>("int"));
2053             ++first;
2054             break;
2055         case 'j':
2056             db.Names.push_back(db.make<NameType>("unsigned int"));
2057             ++first;
2058             break;
2059         case 'l':
2060             db.Names.push_back(db.make<NameType>("long"));
2061             ++first;
2062             break;
2063         case 'm':
2064             db.Names.push_back(db.make<NameType>("unsigned long"));
2065             ++first;
2066             break;
2067         case 'x':
2068             db.Names.push_back(db.make<NameType>("long long"));
2069             ++first;
2070             break;
2071         case 'y':
2072             db.Names.push_back(db.make<NameType>("unsigned long long"));
2073             ++first;
2074             break;
2075         case 'n':
2076             db.Names.push_back(db.make<NameType>("__int128"));
2077             ++first;
2078             break;
2079         case 'o':
2080             db.Names.push_back(db.make<NameType>("unsigned __int128"));
2081             ++first;
2082             break;
2083         case 'f':
2084             db.Names.push_back(db.make<NameType>("float"));
2085             ++first;
2086             break;
2087         case 'd':
2088             db.Names.push_back(db.make<NameType>("double"));
2089             ++first;
2090             break;
2091         case 'e':
2092             db.Names.push_back(db.make<NameType>("long double"));
2093             ++first;
2094             break;
2095         case 'g':
2096             db.Names.push_back(db.make<NameType>("__float128"));
2097             ++first;
2098             break;
2099         case 'z':
2100             db.Names.push_back(db.make<NameType>("..."));
2101             ++first;
2102             break;
2103         case 'u':
2104             {
2105                 const char*t = parse_source_name(first+1, last, db);
2106                 if (t != first+1)
2107                     first = t;
2108             }
2109             break;
2110         case 'D':
2111             if (first+1 != last)
2112             {
2113                 switch (first[1])
2114                 {
2115                 case 'd':
2116                     db.Names.push_back(db.make<NameType>("decimal64"));
2117                     first += 2;
2118                     break;
2119                 case 'e':
2120                     db.Names.push_back(db.make<NameType>("decimal128"));
2121                     first += 2;
2122                     break;
2123                 case 'f':
2124                     db.Names.push_back(db.make<NameType>("decimal32"));
2125                     first += 2;
2126                     break;
2127                 case 'h':
2128                     db.Names.push_back(db.make<NameType>("decimal16"));
2129                     first += 2;
2130                     break;
2131                 case 'i':
2132                     db.Names.push_back(db.make<NameType>("char32_t"));
2133                     first += 2;
2134                     break;
2135                 case 's':
2136                     db.Names.push_back(db.make<NameType>("char16_t"));
2137                     first += 2;
2138                     break;
2139                 case 'a':
2140                     db.Names.push_back(db.make<NameType>("auto"));
2141                     first += 2;
2142                     break;
2143                 case 'c':
2144                     db.Names.push_back(db.make<NameType>("decltype(auto)"));
2145                     first += 2;
2146                     break;
2147                 case 'n':
2148                     db.Names.push_back(db.make<NameType>("std::nullptr_t"));
2149                     first += 2;
2150                     break;
2151                 }
2152             }
2153             break;
2154         }
2155     }
2156     return first;
2157 }
2158 
2159 // <CV-Qualifiers> ::= [r] [V] [K]
2160 
2161 const char*
2162 parse_cv_qualifiers(const char* first, const char* last, Qualifiers& cv)
2163 {
2164     cv = QualNone;
2165     if (first != last)
2166     {
2167         if (*first == 'r')
2168         {
2169             addQualifiers(cv, QualRestrict);
2170             ++first;
2171         }
2172         if (*first == 'V')
2173         {
2174             addQualifiers(cv, QualVolatile);
2175             ++first;
2176         }
2177         if (*first == 'K')
2178         {
2179             addQualifiers(cv, QualConst);
2180             ++first;
2181         }
2182     }
2183     return first;
2184 }
2185 
2186 // <template-param> ::= T_    # first template parameter
2187 //                  ::= T <parameter-2 non-negative number> _
2188 
2189 const char*
2190 parse_template_param(const char* first, const char* last, Db& db)
2191 {
2192     if (last - first >= 2)
2193     {
2194         if (*first == 'T')
2195         {
2196             if (first[1] == '_')
2197             {
2198                 if (!db.TemplateParams.empty())
2199                 {
2200                     for (Node *t : db.TemplateParams.nthSubstitution(0))
2201                         db.Names.push_back(t);
2202                     first += 2;
2203                 }
2204                 else
2205                 {
2206                     db.Names.push_back(db.make<NameType>("T_"));
2207                     first += 2;
2208                     db.FixForwardReferences = true;
2209                 }
2210             }
2211             else if (isdigit(first[1]))
2212             {
2213                 const char* t = first+1;
2214                 size_t sub = static_cast<size_t>(*t - '0');
2215                 for (++t; t != last && isdigit(*t); ++t)
2216                 {
2217                     sub *= 10;
2218                     sub += static_cast<size_t>(*t - '0');
2219                 }
2220                 if (t == last || *t != '_')
2221                     return first;
2222                 ++sub;
2223                 if (sub < db.TemplateParams.size())
2224                 {
2225                     for (Node *temp : db.TemplateParams.nthSubstitution(sub))
2226                         db.Names.push_back(temp);
2227                     first = t+1;
2228                 }
2229                 else
2230                 {
2231                     db.Names.push_back(
2232                         db.make<NameType>(StringView(first, t + 1)));
2233                     first = t+1;
2234                     db.FixForwardReferences = true;
2235                 }
2236             }
2237         }
2238     }
2239     return first;
2240 }
2241 
2242 // cc <type> <expression>                               # const_cast<type> (expression)
2243 
2244 const char*
2245 parse_const_cast_expr(const char* first, const char* last, Db& db)
2246 {
2247     if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
2248     {
2249         const char* t = parse_type(first+2, last, db);
2250         if (t != first+2)
2251         {
2252             const char* t1 = parse_expression(t, last, db);
2253             if (t1 != t)
2254             {
2255                 if (db.Names.size() < 2)
2256                     return first;
2257                 auto from_expr = db.Names.back();
2258                 db.Names.pop_back();
2259                 if (db.Names.empty())
2260                     return first;
2261                 db.Names.back() = db.make<CastExpr>(
2262                     "const_cast", db.Names.back(), from_expr);
2263                 first = t1;
2264             }
2265         }
2266     }
2267     return first;
2268 }
2269 
2270 // dc <type> <expression>                               # dynamic_cast<type> (expression)
2271 
2272 const char*
2273 parse_dynamic_cast_expr(const char* first, const char* last, Db& db)
2274 {
2275     if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
2276     {
2277         const char* t = parse_type(first+2, last, db);
2278         if (t != first+2)
2279         {
2280             const char* t1 = parse_expression(t, last, db);
2281             if (t1 != t)
2282             {
2283                 if (db.Names.size() < 2)
2284                     return first;
2285                 auto from_expr = db.Names.back();
2286                 db.Names.pop_back();
2287                 if (db.Names.empty())
2288                     return first;
2289                 db.Names.back() = db.make<CastExpr>(
2290                     "dynamic_cast", db.Names.back(), from_expr);
2291                 first = t1;
2292             }
2293         }
2294     }
2295     return first;
2296 }
2297 
2298 // rc <type> <expression>                               # reinterpret_cast<type> (expression)
2299 
2300 const char*
2301 parse_reinterpret_cast_expr(const char* first, const char* last, Db& db)
2302 {
2303     if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
2304     {
2305         const char* t = parse_type(first+2, last, db);
2306         if (t != first+2)
2307         {
2308             const char* t1 = parse_expression(t, last, db);
2309             if (t1 != t)
2310             {
2311                 if (db.Names.size() < 2)
2312                     return first;
2313                 auto from_expr = db.Names.back();
2314                 db.Names.pop_back();
2315                 if (db.Names.empty())
2316                     return first;
2317                 db.Names.back() = db.make<CastExpr>(
2318                     "reinterpret_cast", db.Names.back(), from_expr);
2319                 first = t1;
2320             }
2321         }
2322     }
2323     return first;
2324 }
2325 
2326 // sc <type> <expression>                               # static_cast<type> (expression)
2327 
2328 const char*
2329 parse_static_cast_expr(const char* first, const char* last, Db& db)
2330 {
2331     if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
2332     {
2333         const char* t = parse_type(first+2, last, db);
2334         if (t != first+2)
2335         {
2336             const char* t1 = parse_expression(t, last, db);
2337             if (t1 != t)
2338             {
2339                 if (db.Names.size() < 2)
2340                     return first;
2341                 auto from_expr = db.Names.back();
2342                 db.Names.pop_back();
2343                 db.Names.back() = db.make<CastExpr>(
2344                     "static_cast", db.Names.back(), from_expr);
2345                 first = t1;
2346             }
2347         }
2348     }
2349     return first;
2350 }
2351 
2352 // sp <expression>                                  # pack expansion
2353 
2354 const char*
2355 parse_pack_expansion(const char* first, const char* last, Db& db)
2356 {
2357     if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
2358     {
2359         const char* t = parse_expression(first+2, last, db);
2360         if (t != first+2)
2361             first = t;
2362     }
2363     return first;
2364 }
2365 
2366 // st <type>                                            # sizeof (a type)
2367 
2368 const char*
2369 parse_sizeof_type_expr(const char* first, const char* last, Db& db)
2370 {
2371     if (last - first >= 3 && first[0] == 's' && first[1] == 't')
2372     {
2373         const char* t = parse_type(first+2, last, db);
2374         if (t != first+2)
2375         {
2376             if (db.Names.empty())
2377                 return first;
2378             db.Names.back() = db.make<EnclosingExpr>(
2379                 "sizeof (", db.Names.back(), ")");
2380             first = t;
2381         }
2382     }
2383     return first;
2384 }
2385 
2386 // sz <expr>                                            # sizeof (a expression)
2387 
2388 const char*
2389 parse_sizeof_expr_expr(const char* first, const char* last, Db& db)
2390 {
2391     if (last - first >= 3 && first[0] == 's' && first[1] == 'z')
2392     {
2393         const char* t = parse_expression(first+2, last, db);
2394         if (t != first+2)
2395         {
2396             if (db.Names.empty())
2397                 return first;
2398             db.Names.back() = db.make<EnclosingExpr>(
2399                 "sizeof (", db.Names.back(), ")");
2400             first = t;
2401         }
2402     }
2403     return first;
2404 }
2405 
2406 // sZ <template-param>                                  # size of a parameter pack
2407 
2408 const char*
2409 parse_sizeof_param_pack_expr(const char* first, const char* last, Db& db)
2410 {
2411     if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
2412     {
2413         size_t k0 = db.Names.size();
2414         const char* t = parse_template_param(first+2, last, db);
2415         size_t k1 = db.Names.size();
2416         if (t != first+2 && k0 <= k1)
2417         {
2418             Node* sizeof_expr = db.make<SizeofParamPackExpr>(
2419                 db.popTrailingNodeArray(k0));
2420             db.Names.push_back(sizeof_expr);
2421             first = t;
2422         }
2423     }
2424     return first;
2425 }
2426 
2427 // <function-param> ::= fp <top-level CV-Qualifiers> _                                     # L == 0, first parameter
2428 //                  ::= fp <top-level CV-Qualifiers> <parameter-2 non-negative number> _   # L == 0, second and later parameters
2429 //                  ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> _         # L > 0, first parameter
2430 //                  ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> <parameter-2 non-negative number> _   # L > 0, second and later parameters
2431 
2432 const char*
2433 parse_function_param(const char* first, const char* last, Db& db)
2434 {
2435     if (last - first >= 3 && *first == 'f')
2436     {
2437         if (first[1] == 'p')
2438         {
2439             Qualifiers cv;
2440             const char* t = parse_cv_qualifiers(first+2, last, cv);
2441             const char* t1 = parse_number(t, last);
2442             if (t1 != last && *t1 == '_')
2443             {
2444                 db.Names.push_back(
2445                     db.make<FunctionParam>(StringView(t, t1)));
2446                 first = t1+1;
2447             }
2448         }
2449         else if (first[1] == 'L')
2450         {
2451             Qualifiers cv;
2452             const char* t0 = parse_number(first+2, last);
2453             if (t0 != last && *t0 == 'p')
2454             {
2455                 ++t0;
2456                 const char* t = parse_cv_qualifiers(t0, last, cv);
2457                 const char* t1 = parse_number(t, last);
2458                 if (t1 != last && *t1 == '_')
2459                 {
2460                     db.Names.push_back(
2461                         db.make<FunctionParam>(StringView(t, t1)));
2462                     first = t1+1;
2463                 }
2464             }
2465         }
2466     }
2467     return first;
2468 }
2469 
2470 // sZ <function-param>                                  # size of a function parameter pack
2471 
2472 const char*
2473 parse_sizeof_function_param_pack_expr(const char* first, const char* last, Db& db)
2474 {
2475     if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
2476     {
2477         const char* t = parse_function_param(first+2, last, db);
2478         if (t != first+2)
2479         {
2480             if (db.Names.empty())
2481                 return first;
2482             db.Names.back() = db.make<EnclosingExpr>(
2483                 "sizeof...(", db.Names.back(), ")");
2484             first = t;
2485         }
2486     }
2487     return first;
2488 }
2489 
2490 // te <expression>                                      # typeid (expression)
2491 // ti <type>                                            # typeid (type)
2492 
2493 const char*
2494 parse_typeid_expr(const char* first, const char* last, Db& db)
2495 {
2496     if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
2497     {
2498         const char* t;
2499         if (first[1] == 'e')
2500             t = parse_expression(first+2, last, db);
2501         else
2502             t = parse_type(first+2, last, db);
2503         if (t != first+2)
2504         {
2505             if (db.Names.empty())
2506                 return first;
2507             db.Names.back() = db.make<EnclosingExpr>(
2508                 "typeid(", db.Names.back(), ")");
2509             first = t;
2510         }
2511     }
2512     return first;
2513 }
2514 
2515 // tw <expression>                                      # throw expression
2516 
2517 const char*
2518 parse_throw_expr(const char* first, const char* last, Db& db)
2519 {
2520     if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
2521     {
2522         const char* t = parse_expression(first+2, last, db);
2523         if (t != first+2)
2524         {
2525             if (db.Names.empty())
2526                 return first;
2527             db.Names.back() = db.make<ThrowExpr>(db.Names.back());
2528             first = t;
2529         }
2530     }
2531     return first;
2532 }
2533 
2534 // ds <expression> <expression>                         # expr.*expr
2535 
2536 const char*
2537 parse_dot_star_expr(const char* first, const char* last, Db& db)
2538 {
2539     if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
2540     {
2541         const char* t = parse_expression(first+2, last, db);
2542         if (t != first+2)
2543         {
2544             const char* t1 = parse_expression(t, last, db);
2545             if (t1 != t)
2546             {
2547                 if (db.Names.size() < 2)
2548                     return first;
2549                 auto rhs_expr = db.Names.back();
2550                 db.Names.pop_back();
2551                 db.Names.back() = db.make<MemberExpr>(
2552                     db.Names.back(), ".*", rhs_expr);
2553                 first = t1;
2554             }
2555         }
2556     }
2557     return first;
2558 }
2559 
2560 // <simple-id> ::= <source-name> [ <template-args> ]
2561 
2562 const char*
2563 parse_simple_id(const char* first, const char* last, Db& db)
2564 {
2565     if (first != last)
2566     {
2567         const char* t = parse_source_name(first, last, db);
2568         if (t != first)
2569         {
2570             const char* t1 = parse_template_args(t, last, db);
2571             if (t1 != t)
2572             {
2573                 if (db.Names.size() < 2)
2574                     return first;
2575                 auto args = db.Names.back();
2576                 db.Names.pop_back();
2577                 db.Names.back() =
2578                     db.make<NameWithTemplateArgs>(db.Names.back(), args);
2579             }
2580             first = t1;
2581         }
2582         else
2583             first = t;
2584     }
2585     return first;
2586 }
2587 
2588 // <unresolved-type> ::= <template-param>
2589 //                   ::= <decltype>
2590 //                   ::= <substitution>
2591 
2592 const char*
2593 parse_unresolved_type(const char* first, const char* last, Db& db)
2594 {
2595     if (first != last)
2596     {
2597         const char* t = first;
2598         switch (*first)
2599         {
2600         case 'T':
2601           {
2602             size_t k0 = db.Names.size();
2603             t = parse_template_param(first, last, db);
2604             size_t k1 = db.Names.size();
2605             if (t != first && k1 == k0 + 1)
2606             {
2607                 db.Subs.pushSubstitution(db.Names.back());
2608                 first = t;
2609             }
2610             else
2611             {
2612                 for (; k1 != k0; --k1)
2613                     db.Names.pop_back();
2614             }
2615             break;
2616           }
2617         case 'D':
2618             t = parse_decltype(first, last, db);
2619             if (t != first)
2620             {
2621                 if (db.Names.empty())
2622                     return first;
2623                 db.Subs.pushSubstitution(db.Names.back());
2624                 first = t;
2625             }
2626             break;
2627         case 'S':
2628             t = parse_substitution(first, last, db);
2629             if (t != first)
2630                 first = t;
2631             else
2632             {
2633                 if (last - first > 2 && first[1] == 't')
2634                 {
2635                     t = parse_unqualified_name(first+2, last, db);
2636                     if (t != first+2)
2637                     {
2638                         if (db.Names.empty())
2639                             return first;
2640                         db.Names.back() =
2641                             db.make<StdQualifiedName>(db.Names.back());
2642                         db.Subs.pushSubstitution(db.Names.back());
2643                         first = t;
2644                     }
2645                 }
2646             }
2647             break;
2648        }
2649     }
2650     return first;
2651 }
2652 
2653 // <destructor-name> ::= <unresolved-type>                               # e.g., ~T or ~decltype(f())
2654 //                   ::= <simple-id>                                     # e.g., ~A<2*N>
2655 
2656 const char*
2657 parse_destructor_name(const char* first, const char* last, Db& db)
2658 {
2659     if (first != last)
2660     {
2661         const char* t = parse_unresolved_type(first, last, db);
2662         if (t == first)
2663             t = parse_simple_id(first, last, db);
2664         if (t != first)
2665         {
2666             if (db.Names.empty())
2667                 return first;
2668             db.Names.back() = db.make<DtorName>(db.Names.back());
2669             first = t;
2670         }
2671     }
2672     return first;
2673 }
2674 
2675 // <base-unresolved-name> ::= <simple-id>                                # unresolved name
2676 //          extension     ::= <operator-name>                            # unresolved operator-function-id
2677 //          extension     ::= <operator-name> <template-args>            # unresolved operator template-id
2678 //                        ::= on <operator-name>                         # unresolved operator-function-id
2679 //                        ::= on <operator-name> <template-args>         # unresolved operator template-id
2680 //                        ::= dn <destructor-name>                       # destructor or pseudo-destructor;
2681 //                                                                         # e.g. ~X or ~X<N-1>
2682 
2683 const char*
2684 parse_base_unresolved_name(const char* first, const char* last, Db& db)
2685 {
2686     if (last - first >= 2)
2687     {
2688         if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
2689         {
2690             if (first[0] == 'o')
2691             {
2692                 const char* t = parse_operator_name(first+2, last, db);
2693                 if (t != first+2)
2694                 {
2695                     first = parse_template_args(t, last, db);
2696                     if (first != t)
2697                     {
2698                         if (db.Names.size() < 2)
2699                             return first;
2700                         auto args = db.Names.back();
2701                         db.Names.pop_back();
2702                         db.Names.back() =
2703                             db.make<NameWithTemplateArgs>(
2704                                 db.Names.back(), args);
2705                     }
2706                 }
2707             }
2708             else
2709             {
2710                 const char* t = parse_destructor_name(first+2, last, db);
2711                 if (t != first+2)
2712                     first = t;
2713             }
2714         }
2715         else
2716         {
2717             const char* t = parse_simple_id(first, last, db);
2718             if (t == first)
2719             {
2720                 t = parse_operator_name(first, last, db);
2721                 if (t != first)
2722                 {
2723                     first = parse_template_args(t, last, db);
2724                     if (first != t)
2725                     {
2726                         if (db.Names.size() < 2)
2727                             return first;
2728                         auto args = db.Names.back();
2729                         db.Names.pop_back();
2730                         db.Names.back() =
2731                             db.make<NameWithTemplateArgs>(
2732                                 db.Names.back(), args);
2733                     }
2734                 }
2735             }
2736             else
2737                 first = t;
2738         }
2739     }
2740     return first;
2741 }
2742 
2743 // <unresolved-qualifier-level> ::= <simple-id>
2744 
2745 const char*
2746 parse_unresolved_qualifier_level(const char* first, const char* last, Db& db)
2747 {
2748     return parse_simple_id(first, last, db);
2749 }
2750 
2751 // <unresolved-name>
2752 //  extension        ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
2753 //                   ::= [gs] <base-unresolved-name>                     # x or (with "gs") ::x
2754 //                   ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
2755 //                                                                       # A::x, N::y, A<T>::z; "gs" means leading "::"
2756 //                   ::= sr <unresolved-type> <base-unresolved-name>     # T::x / decltype(p)::x
2757 //  extension        ::= sr <unresolved-type> <template-args> <base-unresolved-name>
2758 //                                                                       # T::N::x /decltype(p)::N::x
2759 //  (ignored)        ::= srN <unresolved-type>  <unresolved-qualifier-level>+ E <base-unresolved-name>
2760 
2761 const char*
2762 parse_unresolved_name(const char* first, const char* last, Db& db)
2763 {
2764     if (last - first > 2)
2765     {
2766         const char* t = first;
2767         bool global = false;
2768         if (t[0] == 'g' && t[1] == 's')
2769         {
2770             global = true;
2771             t += 2;
2772         }
2773         const char* t2 = parse_base_unresolved_name(t, last, db);
2774         if (t2 != t)
2775         {
2776             if (global)
2777             {
2778                 if (db.Names.empty())
2779                     return first;
2780                 db.Names.back() =
2781                     db.make<GlobalQualifiedName>(db.Names.back());
2782             }
2783             first = t2;
2784         }
2785         else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
2786         {
2787             if (t[2] == 'N')
2788             {
2789                 t += 3;
2790                 const char* t1 = parse_unresolved_type(t, last, db);
2791                 if (t1 == t || t1 == last)
2792                     return first;
2793                 t = t1;
2794                 t1 = parse_template_args(t, last, db);
2795                 if (t1 != t)
2796                 {
2797                     if (db.Names.size() < 2)
2798                         return first;
2799                     auto args = db.Names.back();
2800                     db.Names.pop_back();
2801                     db.Names.back() = db.make<NameWithTemplateArgs>(
2802                         db.Names.back(), args);
2803                     t = t1;
2804                     if (t == last)
2805                     {
2806                         db.Names.pop_back();
2807                         return first;
2808                     }
2809                 }
2810                 while (*t != 'E')
2811                 {
2812                     t1 = parse_unresolved_qualifier_level(t, last, db);
2813                     if (t1 == t || t1 == last || db.Names.size() < 2)
2814                         return first;
2815                     auto s = db.Names.back();
2816                     db.Names.pop_back();
2817                     db.Names.back() =
2818                         db.make<QualifiedName>(db.Names.back(), s);
2819                     t = t1;
2820                 }
2821                 ++t;
2822                 t1 = parse_base_unresolved_name(t, last, db);
2823                 if (t1 == t)
2824                 {
2825                     if (!db.Names.empty())
2826                         db.Names.pop_back();
2827                     return first;
2828                 }
2829                 if (db.Names.size() < 2)
2830                     return first;
2831                 auto s = db.Names.back();
2832                 db.Names.pop_back();
2833                 db.Names.back() =
2834                     db.make<QualifiedName>(db.Names.back(), s);
2835                 first = t1;
2836             }
2837             else
2838             {
2839                 t += 2;
2840                 const char* t1 = parse_unresolved_type(t, last, db);
2841                 if (t1 != t)
2842                 {
2843                     t = t1;
2844                     t1 = parse_template_args(t, last, db);
2845                     if (t1 != t)
2846                     {
2847                         if (db.Names.size() < 2)
2848                             return first;
2849                         auto args = db.Names.back();
2850                         db.Names.pop_back();
2851                         db.Names.back() =
2852                             db.make<NameWithTemplateArgs>(
2853                                 db.Names.back(), args);
2854                         t = t1;
2855                     }
2856                     t1 = parse_base_unresolved_name(t, last, db);
2857                     if (t1 == t)
2858                     {
2859                         if (!db.Names.empty())
2860                             db.Names.pop_back();
2861                         return first;
2862                     }
2863                     if (db.Names.size() < 2)
2864                         return first;
2865                     auto s = db.Names.back();
2866                     db.Names.pop_back();
2867                     db.Names.back() =
2868                         db.make<QualifiedName>(db.Names.back(), s);
2869                     first = t1;
2870                 }
2871                 else
2872                 {
2873                     t1 = parse_unresolved_qualifier_level(t, last, db);
2874                     if (t1 == t || t1 == last)
2875                         return first;
2876                     t = t1;
2877                     if (global)
2878                     {
2879                         if (db.Names.empty())
2880                             return first;
2881                         db.Names.back() =
2882                             db.make<GlobalQualifiedName>(
2883                                 db.Names.back());
2884                     }
2885                     while (*t != 'E')
2886                     {
2887                         t1 = parse_unresolved_qualifier_level(t, last, db);
2888                         if (t1 == t || t1 == last || db.Names.size() < 2)
2889                             return first;
2890                         auto s = db.Names.back();
2891                         db.Names.pop_back();
2892                         db.Names.back() = db.make<QualifiedName>(
2893                             db.Names.back(), s);
2894                         t = t1;
2895                     }
2896                     ++t;
2897                     t1 = parse_base_unresolved_name(t, last, db);
2898                     if (t1 == t)
2899                     {
2900                         if (!db.Names.empty())
2901                             db.Names.pop_back();
2902                         return first;
2903                     }
2904                     if (db.Names.size() < 2)
2905                         return first;
2906                     auto s = db.Names.back();
2907                     db.Names.pop_back();
2908                     db.Names.back() =
2909                         db.make<QualifiedName>(db.Names.back(), s);
2910                     first = t1;
2911                 }
2912             }
2913         }
2914     }
2915     return first;
2916 }
2917 
2918 // dt <expression> <unresolved-name>                    # expr.name
2919 
2920 const char*
2921 parse_dot_expr(const char* first, const char* last, Db& db)
2922 {
2923     if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
2924     {
2925         const char* t = parse_expression(first+2, last, db);
2926         if (t != first+2)
2927         {
2928             const char* t1 = parse_unresolved_name(t, last, db);
2929             if (t1 != t)
2930             {
2931                 if (db.Names.size() < 2)
2932                     return first;
2933                 auto name = db.Names.back();
2934                 db.Names.pop_back();
2935                 if (db.Names.empty())
2936                     return first;
2937                 db.Names.back() = db.make<MemberExpr>(db.Names.back(), ".", name);
2938                 first = t1;
2939             }
2940         }
2941     }
2942     return first;
2943 }
2944 
2945 // cl <expression>+ E                                   # call
2946 
2947 const char*
2948 parse_call_expr(const char* first, const char* last, Db& db)
2949 {
2950     if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
2951     {
2952         const char* t = parse_expression(first+2, last, db);
2953         if (t == last || t == first + 2 || db.Names.empty())
2954             return first;
2955         Node* callee = db.Names.back();
2956         db.Names.pop_back();
2957         size_t args_begin = db.Names.size();
2958         while (*t != 'E')
2959         {
2960             const char* t1 = parse_expression(t, last, db);
2961             if (t1 == last || t1 == t)
2962                 return first;
2963             t = t1;
2964         }
2965         if (db.Names.size() < args_begin)
2966             return first;
2967         ++t;
2968         CallExpr* the_call = db.make<CallExpr>(
2969             callee, db.popTrailingNodeArray(args_begin));
2970         db.Names.push_back(the_call);
2971         first = t;
2972     }
2973     return first;
2974 }
2975 
2976 // [gs] nw <expression>* _ <type> E                     # new (expr-list) type
2977 // [gs] nw <expression>* _ <type> <initializer>         # new (expr-list) type (init)
2978 // [gs] na <expression>* _ <type> E                     # new[] (expr-list) type
2979 // [gs] na <expression>* _ <type> <initializer>         # new[] (expr-list) type (init)
2980 // <initializer> ::= pi <expression>* E                 # parenthesized initialization
2981 
2982 const char*
2983 parse_new_expr(const char* first, const char* last, Db& db)
2984 {
2985     if (last - first >= 4)
2986     {
2987         const char* t = first;
2988         bool parsed_gs = false;
2989         if (t[0] == 'g' && t[1] == 's')
2990         {
2991             t += 2;
2992             parsed_gs = true;
2993         }
2994         if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
2995         {
2996             bool is_array = t[1] == 'a';
2997             t += 2;
2998             if (t == last)
2999                 return first;
3000             size_t first_expr_in_list = db.Names.size();
3001             NodeArray ExprList, init_list;
3002             while (*t != '_')
3003             {
3004                 const char* t1 = parse_expression(t, last, db);
3005                 if (t1 == t || t1 == last)
3006                     return first;
3007                 t = t1;
3008             }
3009             if (first_expr_in_list > db.Names.size())
3010                 return first;
3011             ExprList = db.popTrailingNodeArray(first_expr_in_list);
3012             ++t;
3013             const char* t1 = parse_type(t, last, db);
3014             if (t1 == t || t1 == last)
3015                 return first;
3016             t = t1;
3017             bool has_init = false;
3018             if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
3019             {
3020                 t += 2;
3021                 has_init = true;
3022                 size_t init_list_begin = db.Names.size();
3023                 while (*t != 'E')
3024                 {
3025                     t1 = parse_expression(t, last, db);
3026                     if (t1 == t || t1 == last)
3027                         return first;
3028                     t = t1;
3029                 }
3030                 if (init_list_begin > db.Names.size())
3031                     return first;
3032                 init_list = db.popTrailingNodeArray(init_list_begin);
3033             }
3034             if (*t != 'E' || db.Names.empty())
3035                 return first;
3036             auto type = db.Names.back();
3037             db.Names.pop_back();
3038             db.Names.push_back(
3039                 db.make<NewExpr>(ExprList, type, init_list,
3040                                   parsed_gs, is_array));
3041             first = t+1;
3042         }
3043     }
3044     return first;
3045 }
3046 
3047 // cv <type> <expression>                               # conversion with one argument
3048 // cv <type> _ <expression>* E                          # conversion with a different number of arguments
3049 
3050 const char*
3051 parse_conversion_expr(const char* first, const char* last, Db& db)
3052 {
3053     if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
3054     {
3055         bool TryToParseTemplateArgs = db.TryToParseTemplateArgs;
3056         db.TryToParseTemplateArgs = false;
3057         size_t type_begin = db.Names.size();
3058         const char* t = parse_type(first+2, last, db);
3059         db.TryToParseTemplateArgs = TryToParseTemplateArgs;
3060         if (t != first+2 && t != last)
3061         {
3062             size_t expr_list_begin = db.Names.size();
3063             if (*t != '_')
3064             {
3065                 const char* t1 = parse_expression(t, last, db);
3066                 if (t1 == t)
3067                     return first;
3068                 t = t1;
3069             }
3070             else
3071             {
3072                 ++t;
3073                 if (t == last)
3074                     return first;
3075                 if (*t != 'E')
3076                 {
3077                     while (*t != 'E')
3078                     {
3079                         const char* t1 = parse_expression(t, last, db);
3080                         if (t1 == t || t1 == last)
3081                             return first;
3082                         t = t1;
3083                     }
3084                 }
3085                 ++t;
3086             }
3087             if (db.Names.size() < expr_list_begin ||
3088                 type_begin > expr_list_begin)
3089                 return first;
3090             NodeArray expressions = db.makeNodeArray(
3091                 db.Names.begin() + (long)expr_list_begin, db.Names.end());
3092             NodeArray types = db.makeNodeArray(
3093                 db.Names.begin() + (long)type_begin,
3094                 db.Names.begin() + (long)expr_list_begin);
3095             auto* conv_expr = db.make<ConversionExpr>(
3096                 types, expressions);
3097             db.Names.dropBack(type_begin);
3098             db.Names.push_back(conv_expr);
3099             first = t;
3100         }
3101     }
3102     return first;
3103 }
3104 
3105 // pt <expression> <expression>                    # expr->name
3106 
3107 const char*
3108 parse_arrow_expr(const char* first, const char* last, Db& db)
3109 {
3110     if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
3111     {
3112         const char* t = parse_expression(first+2, last, db);
3113         if (t != first+2)
3114         {
3115             const char* t1 = parse_expression(t, last, db);
3116             if (t1 != t)
3117             {
3118                 if (db.Names.size() < 2)
3119                     return first;
3120                 auto tmp = db.Names.back();
3121                 db.Names.pop_back();
3122                 db.Names.back() = db.make<MemberExpr>(
3123                     db.Names.back(), "->", tmp);
3124                 first = t1;
3125             }
3126         }
3127     }
3128     return first;
3129 }
3130 
3131 //  <ref-qualifier> ::= R                   # & ref-qualifier
3132 //  <ref-qualifier> ::= O                   # && ref-qualifier
3133 
3134 // <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E
3135 
3136 const char*
3137 parse_function_type(const char* first, const char* last, Db& db)
3138 {
3139     if (first != last && *first == 'F')
3140     {
3141         const char* t = first+1;
3142         if (t != last)
3143         {
3144             if (*t == 'Y')
3145             {
3146                 /* extern "C" */
3147                 if (++t == last)
3148                     return first;
3149             }
3150             const char* t1 = parse_type(t, last, db);
3151             if (t1 != t && !db.Names.empty())
3152             {
3153                 Node* ret_type = db.Names.back();
3154                 db.Names.pop_back();
3155                 size_t params_begin = db.Names.size();
3156                 t = t1;
3157                 FunctionRefQual RefQuals = FrefQualNone;
3158                 while (true)
3159                 {
3160                     if (t == last)
3161                     {
3162                         if (!db.Names.empty())
3163                           db.Names.pop_back();
3164                         return first;
3165                     }
3166                     if (*t == 'E')
3167                     {
3168                         ++t;
3169                         break;
3170                     }
3171                     if (*t == 'v')
3172                     {
3173                         ++t;
3174                         continue;
3175                     }
3176                     if (*t == 'R' && t+1 != last && t[1] == 'E')
3177                     {
3178                         RefQuals = FrefQualLValue;
3179                         ++t;
3180                         continue;
3181                     }
3182                     if (*t == 'O' && t+1 != last && t[1] == 'E')
3183                     {
3184                         RefQuals = FrefQualRValue;
3185                         ++t;
3186                         continue;
3187                     }
3188                     size_t k0 = db.Names.size();
3189                     t1 = parse_type(t, last, db);
3190                     size_t k1 = db.Names.size();
3191                     if (t1 == t || t1 == last || k1 < k0)
3192                         return first;
3193                     t = t1;
3194                 }
3195                 if (db.Names.empty() || params_begin > db.Names.size())
3196                     return first;
3197                 Node* fty = db.make<FunctionType>(
3198                     ret_type, db.popTrailingNodeArray(params_begin));
3199                 if (RefQuals)
3200                     fty = db.make<FunctionRefQualType>(fty, RefQuals);
3201                 db.Names.push_back(fty);
3202                 first = t;
3203             }
3204         }
3205     }
3206     return first;
3207 }
3208 
3209 // <pointer-to-member-type> ::= M <class type> <member type>
3210 
3211 const char*
3212 parse_pointer_to_member_type(const char* first, const char* last, Db& db)
3213 {
3214     if (first != last && *first == 'M')
3215     {
3216         const char* t = parse_type(first+1, last, db);
3217         if (t != first+1)
3218         {
3219             const char* t2 = parse_type(t, last, db);
3220             if (t2 != t)
3221             {
3222                 if (db.Names.size() < 2)
3223                     return first;
3224                 auto func = std::move(db.Names.back());
3225                 db.Names.pop_back();
3226                 auto ClassType = std::move(db.Names.back());
3227                 db.Names.back() =
3228                     db.make<PointerToMemberType>(ClassType, func);
3229                 first = t2;
3230             }
3231         }
3232     }
3233     return first;
3234 }
3235 
3236 // <array-type> ::= A <positive dimension number> _ <element type>
3237 //              ::= A [<dimension expression>] _ <element type>
3238 
3239 const char*
3240 parse_array_type(const char* first, const char* last, Db& db)
3241 {
3242     if (first != last && *first == 'A' && first+1 != last)
3243     {
3244         if (first[1] == '_')
3245         {
3246             const char* t = parse_type(first+2, last, db);
3247             if (t != first+2)
3248             {
3249                 if (db.Names.empty())
3250                     return first;
3251                 db.Names.back() = db.make<ArrayType>(db.Names.back());
3252                 first = t;
3253             }
3254         }
3255         else if ('1' <= first[1] && first[1] <= '9')
3256         {
3257             const char* t = parse_number(first+1, last);
3258             if (t != last && *t == '_')
3259             {
3260                 const char* t2 = parse_type(t+1, last, db);
3261                 if (t2 != t+1)
3262                 {
3263                     if (db.Names.empty())
3264                         return first;
3265                     db.Names.back() =
3266                         db.make<ArrayType>(db.Names.back(),
3267                                             StringView(first + 1, t));
3268                     first = t2;
3269                 }
3270             }
3271         }
3272         else
3273         {
3274             const char* t = parse_expression(first+1, last, db);
3275             if (t != first+1 && t != last && *t == '_')
3276             {
3277                 const char* t2 = parse_type(++t, last, db);
3278                 if (t2 != t)
3279                 {
3280                     if (db.Names.size() < 2)
3281                         return first;
3282                     auto base_type = std::move(db.Names.back());
3283                     db.Names.pop_back();
3284                     auto dimension_expr = std::move(db.Names.back());
3285                     db.Names.back() =
3286                         db.make<ArrayType>(base_type, dimension_expr);
3287                     first = t2;
3288                 }
3289             }
3290         }
3291     }
3292     return first;
3293 }
3294 
3295 // <decltype>  ::= Dt <expression> E  # decltype of an id-expression or class member access (C++0x)
3296 //             ::= DT <expression> E  # decltype of an expression (C++0x)
3297 
3298 const char*
3299 parse_decltype(const char* first, const char* last, Db& db)
3300 {
3301     if (last - first >= 4 && first[0] == 'D')
3302     {
3303         switch (first[1])
3304         {
3305         case 't':
3306         case 'T':
3307             {
3308                 const char* t = parse_expression(first+2, last, db);
3309                 if (t != first+2 && t != last && *t == 'E')
3310                 {
3311                     if (db.Names.empty())
3312                         return first;
3313                     db.Names.back() = db.make<EnclosingExpr>(
3314                         "decltype(", db.Names.back(), ")");
3315                     first = t+1;
3316                 }
3317             }
3318             break;
3319         }
3320     }
3321     return first;
3322 }
3323 
3324 // extension:
3325 // <vector-type>           ::= Dv <positive dimension number> _
3326 //                                    <extended element type>
3327 //                         ::= Dv [<dimension expression>] _ <element type>
3328 // <extended element type> ::= <element type>
3329 //                         ::= p # AltiVec vector pixel
3330 
3331 const char*
3332 parse_vector_type(const char* first, const char* last, Db& db)
3333 {
3334     if (last - first > 3 && first[0] == 'D' && first[1] == 'v')
3335     {
3336         if ('1' <= first[2] && first[2] <= '9')
3337         {
3338             const char* t = parse_number(first+2, last);
3339             if (t == last || *t != '_')
3340                 return first;
3341             const char* num = first + 2;
3342             size_t sz = static_cast<size_t>(t - num);
3343             if (++t != last)
3344             {
3345                 if (*t != 'p')
3346                 {
3347                     const char* t1 = parse_type(t, last, db);
3348                     if (t1 != t)
3349                     {
3350                         if (db.Names.empty())
3351                             return first;
3352                         db.Names.back() =
3353                             db.make<VectorType>(db.Names.back(),
3354                                                  StringView(num, num + sz));
3355                         first = t1;
3356                     }
3357                 }
3358                 else
3359                 {
3360                     ++t;
3361                     db.Names.push_back(
3362                         db.make<VectorType>(StringView(num, num + sz)));
3363                     first = t;
3364                 }
3365             }
3366         }
3367         else
3368         {
3369             Node* num = nullptr;
3370             const char* t1 = first+2;
3371             if (*t1 != '_')
3372             {
3373                 const char* t = parse_expression(t1, last, db);
3374                 if (t != t1)
3375                 {
3376                     if (db.Names.empty())
3377                         return first;
3378                     num = db.Names.back();
3379                     db.Names.pop_back();
3380                     t1 = t;
3381                 }
3382             }
3383             if (t1 != last && *t1 == '_' && ++t1 != last)
3384             {
3385                 const char* t = parse_type(t1, last, db);
3386                 if (t != t1)
3387                 {
3388                     if (db.Names.empty())
3389                         return first;
3390                     if (num)
3391                         db.Names.back() =
3392                             db.make<VectorType>(db.Names.back(), num);
3393                     else
3394                         db.Names.back() =
3395                             db.make<VectorType>(db.Names.back(), StringView());
3396                     first = t;
3397                 } else if (num)
3398                     db.Names.push_back(num);
3399             }
3400         }
3401     }
3402     return first;
3403 }
3404 
3405 // <type> ::= <builtin-type>
3406 //        ::= <function-type>
3407 //        ::= <class-enum-type>
3408 //        ::= <array-type>
3409 //        ::= <pointer-to-member-type>
3410 //        ::= <template-param>
3411 //        ::= <template-template-param> <template-args>
3412 //        ::= <decltype>
3413 //        ::= <substitution>
3414 //        ::= <CV-Qualifiers> <type>
3415 //        ::= P <type>        # pointer-to
3416 //        ::= R <type>        # reference-to
3417 //        ::= O <type>        # rvalue reference-to (C++0x)
3418 //        ::= C <type>        # complex pair (C 2000)
3419 //        ::= G <type>        # imaginary (C 2000)
3420 //        ::= Dp <type>       # pack expansion (C++0x)
3421 //        ::= U <source-name> <type>  # vendor extended type qualifier
3422 // extension := U <objc-name> <objc-type>  # objc-type<identifier>
3423 // extension := <vector-type> # <vector-type> starts with Dv
3424 
3425 // <objc-name> ::= <k0 number> objcproto <k1 number> <identifier>  # k0 = 9 + <number of digits in k1> + k1
3426 // <objc-type> := <source-name>  # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
3427 
3428 const char*
3429 parse_type(const char* first, const char* last, Db& db)
3430 {
3431     if (first != last)
3432     {
3433         switch (*first)
3434         {
3435             case 'r':
3436             case 'V':
3437             case 'K':
3438               {
3439                 Qualifiers cv = QualNone;
3440                 const char* t = parse_cv_qualifiers(first, last, cv);
3441                 if (t != first)
3442                 {
3443                     bool is_function = *t == 'F';
3444                     size_t k0 = db.Names.size();
3445                     const char* t1 = parse_type(t, last, db);
3446                     size_t k1 = db.Names.size();
3447                     if (t1 != t)
3448                     {
3449                         if (is_function)
3450                             db.Subs.popPack();
3451                         db.Subs.pushPack();
3452                         for (size_t k = k0; k < k1; ++k)
3453                         {
3454                             if (cv) {
3455                                 if (is_function)
3456                                     db.Names[k] = db.make<FunctionQualType>(
3457                                         db.Names[k], cv);
3458                                 else
3459                                     db.Names[k] =
3460                                         db.make<QualType>(db.Names[k], cv);
3461                             }
3462                             db.Subs.pushSubstitutionIntoPack(db.Names[k]);
3463                         }
3464                         first = t1;
3465                     }
3466                 }
3467               }
3468                 break;
3469             default:
3470               {
3471                 const char* t = parse_builtin_type(first, last, db);
3472                 if (t != first)
3473                 {
3474                     first = t;
3475                 }
3476                 else
3477                 {
3478                     switch (*first)
3479                     {
3480                     case 'A':
3481                         t = parse_array_type(first, last, db);
3482                         if (t != first)
3483                         {
3484                             if (db.Names.empty())
3485                                 return first;
3486                             first = t;
3487                             db.Subs.pushSubstitution(db.Names.back());
3488                         }
3489                         break;
3490                     case 'C':
3491                         t = parse_type(first+1, last, db);
3492                         if (t != first+1)
3493                         {
3494                             if (db.Names.empty())
3495                                 return first;
3496                             db.Names.back() = db.make<PostfixQualifiedType>(
3497                                 db.Names.back(), " complex");
3498                             first = t;
3499                             db.Subs.pushSubstitution(db.Names.back());
3500                         }
3501                         break;
3502                     case 'F':
3503                         t = parse_function_type(first, last, db);
3504                         if (t != first)
3505                         {
3506                             if (db.Names.empty())
3507                                 return first;
3508                             first = t;
3509                             db.Subs.pushSubstitution(db.Names.back());
3510                         }
3511                         break;
3512                     case 'G':
3513                         t = parse_type(first+1, last, db);
3514                         if (t != first+1)
3515                         {
3516                             if (db.Names.empty())
3517                                 return first;
3518                             db.Names.back() = db.make<PostfixQualifiedType>(
3519                                 db.Names.back(), " imaginary");
3520                             first = t;
3521                             db.Subs.pushSubstitution(db.Names.back());
3522                         }
3523                         break;
3524                     case 'M':
3525                         t = parse_pointer_to_member_type(first, last, db);
3526                         if (t != first)
3527                         {
3528                             if (db.Names.empty())
3529                                 return first;
3530                             first = t;
3531                             db.Subs.pushSubstitution(db.Names.back());
3532                         }
3533                         break;
3534                     case 'O':
3535                       {
3536                         size_t k0 = db.Names.size();
3537                         t = parse_type(first+1, last, db);
3538                         size_t k1 = db.Names.size();
3539                         if (t != first+1)
3540                         {
3541                             db.Subs.pushPack();
3542                             for (size_t k = k0; k < k1; ++k)
3543                             {
3544                                 db.Names[k] =
3545                                     db.make<RValueReferenceType>(db.Names[k]);
3546                                 db.Subs.pushSubstitutionIntoPack(db.Names[k]);
3547                             }
3548                             first = t;
3549                         }
3550                         break;
3551                       }
3552                     case 'P':
3553                       {
3554                         size_t k0 = db.Names.size();
3555                         t = parse_type(first+1, last, db);
3556                         size_t k1 = db.Names.size();
3557                         if (t != first+1)
3558                         {
3559                             db.Subs.pushPack();
3560                             for (size_t k = k0; k < k1; ++k)
3561                             {
3562                                 db.Names[k] = db.make<PointerType>(db.Names[k]);
3563                                 db.Subs.pushSubstitutionIntoPack(db.Names[k]);
3564                             }
3565                             first = t;
3566                         }
3567                         break;
3568                       }
3569                     case 'R':
3570                       {
3571                         size_t k0 = db.Names.size();
3572                         t = parse_type(first+1, last, db);
3573                         size_t k1 = db.Names.size();
3574                         if (t != first+1)
3575                         {
3576                             db.Subs.pushPack();
3577                             for (size_t k = k0; k < k1; ++k)
3578                             {
3579                                 db.Names[k] =
3580                                     db.make<LValueReferenceType>(db.Names[k]);
3581                                 db.Subs.pushSubstitutionIntoPack(db.Names[k]);
3582                             }
3583                             first = t;
3584                         }
3585                         break;
3586                       }
3587                     case 'T':
3588                       {
3589                         size_t k0 = db.Names.size();
3590                         t = parse_template_param(first, last, db);
3591                         size_t k1 = db.Names.size();
3592                         if (t != first)
3593                         {
3594                             db.Subs.pushPack();
3595                             for (size_t k = k0; k < k1; ++k)
3596                                 db.Subs.pushSubstitutionIntoPack(db.Names[k]);
3597                             if (db.TryToParseTemplateArgs && k1 == k0+1)
3598                             {
3599                                 const char* t1 = parse_template_args(t, last, db);
3600                                 if (t1 != t)
3601                                 {
3602                                     auto args = db.Names.back();
3603                                     db.Names.pop_back();
3604                                     db.Names.back() = db.make<
3605                                         NameWithTemplateArgs>(
3606                                         db.Names.back(), args);
3607                                     db.Subs.pushSubstitution(db.Names.back());
3608                                     t = t1;
3609                                 }
3610                             }
3611                             first = t;
3612                         }
3613                         break;
3614                       }
3615                     case 'U':
3616                         if (first+1 != last)
3617                         {
3618                             t = parse_source_name(first+1, last, db);
3619                             if (t != first+1)
3620                             {
3621                                 const char* t2 = parse_type(t, last, db);
3622                                 if (t2 != t)
3623                                 {
3624                                     if (db.Names.size() < 2)
3625                                         return first;
3626                                     auto type = db.Names.back();
3627                                     db.Names.pop_back();
3628                                     if (db.Names.back()->K != Node::KNameType ||
3629                                         !static_cast<NameType*>(db.Names.back())->getName().startsWith("objcproto"))
3630                                     {
3631                                         db.Names.back() = db.make<VendorExtQualType>(type, db.Names.back());
3632                                     }
3633                                     else
3634                                     {
3635                                         auto* proto = static_cast<NameType*>(db.Names.back());
3636                                         db.Names.pop_back();
3637                                         t = parse_source_name(proto->getName().begin() + 9, proto->getName().end(), db);
3638                                         if (t != proto->getName().begin() + 9)
3639                                         {
3640                                             db.Names.back() = db.make<ObjCProtoName>(type, db.Names.back());
3641                                         }
3642                                         else
3643                                         {
3644                                             db.Names.push_back(db.make<VendorExtQualType>(type, proto));
3645                                         }
3646                                     }
3647                                     db.Subs.pushSubstitution(db.Names.back());
3648                                     first = t2;
3649                                 }
3650                             }
3651                         }
3652                         break;
3653                     case 'S':
3654                         if (first+1 != last && first[1] == 't')
3655                         {
3656                             t = parse_name(first, last, db);
3657                             if (t != first)
3658                             {
3659                                 if (db.Names.empty())
3660                                     return first;
3661                                 db.Subs.pushSubstitution(db.Names.back());
3662                                 first = t;
3663                             }
3664                         }
3665                         else
3666                         {
3667                             t = parse_substitution(first, last, db);
3668                             if (t != first)
3669                             {
3670                                 first = t;
3671                                 // Parsed a substitution.  If the substitution is a
3672                                 //  <template-param> it might be followed by <template-args>.
3673                                 if (db.TryToParseTemplateArgs)
3674                                 {
3675                                     t = parse_template_args(first, last, db);
3676                                     if (t != first)
3677                                     {
3678                                         if (db.Names.size() < 2)
3679                                             return first;
3680                                         auto template_args = db.Names.back();
3681                                         db.Names.pop_back();
3682                                         db.Names.back() = db.make<
3683                                           NameWithTemplateArgs>(
3684                                               db.Names.back(), template_args);
3685                                         // Need to create substitution for <template-template-param> <template-args>
3686                                         db.Subs.pushSubstitution(db.Names.back());
3687                                         first = t;
3688                                     }
3689                                 }
3690                             }
3691                         }
3692                         break;
3693                     case 'D':
3694                         if (first+1 != last)
3695                         {
3696                             switch (first[1])
3697                             {
3698                             case 'p':
3699                               {
3700                                 size_t k0 = db.Names.size();
3701                                 t = parse_type(first+2, last, db);
3702                                 size_t k1 = db.Names.size();
3703                                 if (t != first+2)
3704                                 {
3705                                     db.Subs.pushPack();
3706                                     for (size_t k = k0; k < k1; ++k)
3707                                         db.Subs.pushSubstitutionIntoPack(db.Names[k]);
3708                                     first = t;
3709                                     return first;
3710                                 }
3711                                 break;
3712                               }
3713                             case 't':
3714                             case 'T':
3715                                 t = parse_decltype(first, last, db);
3716                                 if (t != first)
3717                                 {
3718                                     if (db.Names.empty())
3719                                         return first;
3720                                     db.Subs.pushSubstitution(db.Names.back());
3721                                     first = t;
3722                                     return first;
3723                                 }
3724                                 break;
3725                             case 'v':
3726                                 t = parse_vector_type(first, last, db);
3727                                 if (t != first)
3728                                 {
3729                                     if (db.Names.empty())
3730                                         return first;
3731                                     db.Subs.pushSubstitution(db.Names.back());
3732                                     first = t;
3733                                     return first;
3734                                 }
3735                                 break;
3736                             }
3737                         }
3738                         _LIBCPP_FALLTHROUGH();
3739                     default:
3740                         // must check for builtin-types before class-enum-types to avoid
3741                         // ambiguities with operator-names
3742                         t = parse_builtin_type(first, last, db);
3743                         if (t != first)
3744                         {
3745                             first = t;
3746                         }
3747                         else
3748                         {
3749                             t = parse_name(first, last, db);
3750                             if (t != first)
3751                             {
3752                                 if (db.Names.empty())
3753                                     return first;
3754                                 db.Subs.pushSubstitution(db.Names.back());
3755                                 first = t;
3756                             }
3757                         }
3758                         break;
3759                     }
3760               }
3761                 break;
3762             }
3763         }
3764     }
3765     return first;
3766 }
3767 
3768 //   <operator-name>
3769 //                   ::= aa    # &&
3770 //                   ::= ad    # & (unary)
3771 //                   ::= an    # &
3772 //                   ::= aN    # &=
3773 //                   ::= aS    # =
3774 //                   ::= cl    # ()
3775 //                   ::= cm    # ,
3776 //                   ::= co    # ~
3777 //                   ::= cv <type>    # (cast)
3778 //                   ::= da    # delete[]
3779 //                   ::= de    # * (unary)
3780 //                   ::= dl    # delete
3781 //                   ::= dv    # /
3782 //                   ::= dV    # /=
3783 //                   ::= eo    # ^
3784 //                   ::= eO    # ^=
3785 //                   ::= eq    # ==
3786 //                   ::= ge    # >=
3787 //                   ::= gt    # >
3788 //                   ::= ix    # []
3789 //                   ::= le    # <=
3790 //                   ::= li <source-name>  # operator ""
3791 //                   ::= ls    # <<
3792 //                   ::= lS    # <<=
3793 //                   ::= lt    # <
3794 //                   ::= mi    # -
3795 //                   ::= mI    # -=
3796 //                   ::= ml    # *
3797 //                   ::= mL    # *=
3798 //                   ::= mm    # -- (postfix in <expression> context)
3799 //                   ::= na    # new[]
3800 //                   ::= ne    # !=
3801 //                   ::= ng    # - (unary)
3802 //                   ::= nt    # !
3803 //                   ::= nw    # new
3804 //                   ::= oo    # ||
3805 //                   ::= or    # |
3806 //                   ::= oR    # |=
3807 //                   ::= pm    # ->*
3808 //                   ::= pl    # +
3809 //                   ::= pL    # +=
3810 //                   ::= pp    # ++ (postfix in <expression> context)
3811 //                   ::= ps    # + (unary)
3812 //                   ::= pt    # ->
3813 //                   ::= qu    # ?
3814 //                   ::= rm    # %
3815 //                   ::= rM    # %=
3816 //                   ::= rs    # >>
3817 //                   ::= rS    # >>=
3818 //                   ::= v <digit> <source-name>        # vendor extended operator
3819 //   extension       ::= <operator-name> <abi-tag-seq>
3820 const char*
3821 parse_operator_name(const char* first, const char* last, Db& db)
3822 {
3823     const char* original_first = first;
3824     if (last - first >= 2)
3825     {
3826         switch (first[0])
3827         {
3828         case 'a':
3829             switch (first[1])
3830             {
3831             case 'a':
3832                 db.Names.push_back(db.make<NameType>("operator&&"));
3833                 first += 2;
3834                 break;
3835             case 'd':
3836             case 'n':
3837                 db.Names.push_back(db.make<NameType>("operator&"));
3838                 first += 2;
3839                 break;
3840             case 'N':
3841                 db.Names.push_back(db.make<NameType>("operator&="));
3842                 first += 2;
3843                 break;
3844             case 'S':
3845                 db.Names.push_back(db.make<NameType>("operator="));
3846                 first += 2;
3847                 break;
3848             }
3849             break;
3850         case 'c':
3851             switch (first[1])
3852             {
3853             case 'l':
3854                 db.Names.push_back(db.make<NameType>("operator()"));
3855                 first += 2;
3856                 break;
3857             case 'm':
3858                 db.Names.push_back(db.make<NameType>("operator,"));
3859                 first += 2;
3860                 break;
3861             case 'o':
3862                 db.Names.push_back(db.make<NameType>("operator~"));
3863                 first += 2;
3864                 break;
3865             case 'v':
3866                 {
3867                     bool TryToParseTemplateArgs = db.TryToParseTemplateArgs;
3868                     db.TryToParseTemplateArgs = false;
3869                     const char* t = parse_type(first+2, last, db);
3870                     db.TryToParseTemplateArgs = TryToParseTemplateArgs;
3871                     if (t != first+2)
3872                     {
3873                         if (db.Names.empty())
3874                             return first;
3875                         db.Names.back() =
3876                             db.make<ConversionOperatorType>(db.Names.back());
3877                         db.ParsedCtorDtorCV = true;
3878                         first = t;
3879                     }
3880                 }
3881                 break;
3882             }
3883             break;
3884         case 'd':
3885             switch (first[1])
3886             {
3887             case 'a':
3888                 db.Names.push_back(db.make<NameType>("operator delete[]"));
3889                 first += 2;
3890                 break;
3891             case 'e':
3892                 db.Names.push_back(db.make<NameType>("operator*"));
3893                 first += 2;
3894                 break;
3895             case 'l':
3896                 db.Names.push_back(db.make<NameType>("operator delete"));
3897                 first += 2;
3898                 break;
3899             case 'v':
3900                 db.Names.push_back(db.make<NameType>("operator/"));
3901                 first += 2;
3902                 break;
3903             case 'V':
3904                 db.Names.push_back(db.make<NameType>("operator/="));
3905                 first += 2;
3906                 break;
3907             }
3908             break;
3909         case 'e':
3910             switch (first[1])
3911             {
3912             case 'o':
3913                 db.Names.push_back(db.make<NameType>("operator^"));
3914                 first += 2;
3915                 break;
3916             case 'O':
3917                 db.Names.push_back(db.make<NameType>("operator^="));
3918                 first += 2;
3919                 break;
3920             case 'q':
3921                 db.Names.push_back(db.make<NameType>("operator=="));
3922                 first += 2;
3923                 break;
3924             }
3925             break;
3926         case 'g':
3927             switch (first[1])
3928             {
3929             case 'e':
3930                 db.Names.push_back(db.make<NameType>("operator>="));
3931                 first += 2;
3932                 break;
3933             case 't':
3934                 db.Names.push_back(db.make<NameType>("operator>"));
3935                 first += 2;
3936                 break;
3937             }
3938             break;
3939         case 'i':
3940             if (first[1] == 'x')
3941             {
3942                 db.Names.push_back(db.make<NameType>("operator[]"));
3943                 first += 2;
3944             }
3945             break;
3946         case 'l':
3947             switch (first[1])
3948             {
3949             case 'e':
3950                 db.Names.push_back(db.make<NameType>("operator<="));
3951                 first += 2;
3952                 break;
3953             case 'i':
3954                 {
3955                     const char* t = parse_source_name(first+2, last, db);
3956                     if (t != first+2)
3957                     {
3958                         if (db.Names.empty())
3959                             return first;
3960                         db.Names.back() =
3961                             db.make<LiteralOperator>(db.Names.back());
3962                         first = t;
3963                     }
3964                 }
3965                 break;
3966             case 's':
3967                 db.Names.push_back(db.make<NameType>("operator<<"));
3968                 first += 2;
3969                 break;
3970             case 'S':
3971                 db.Names.push_back(db.make<NameType>("operator<<="));
3972                 first += 2;
3973                 break;
3974             case 't':
3975                 db.Names.push_back(db.make<NameType>("operator<"));
3976                 first += 2;
3977                 break;
3978             }
3979             break;
3980         case 'm':
3981             switch (first[1])
3982             {
3983             case 'i':
3984                 db.Names.push_back(db.make<NameType>("operator-"));
3985                 first += 2;
3986                 break;
3987             case 'I':
3988                 db.Names.push_back(db.make<NameType>("operator-="));
3989                 first += 2;
3990                 break;
3991             case 'l':
3992                 db.Names.push_back(db.make<NameType>("operator*"));
3993                 first += 2;
3994                 break;
3995             case 'L':
3996                 db.Names.push_back(db.make<NameType>("operator*="));
3997                 first += 2;
3998                 break;
3999             case 'm':
4000                 db.Names.push_back(db.make<NameType>("operator--"));
4001                 first += 2;
4002                 break;
4003             }
4004             break;
4005         case 'n':
4006             switch (first[1])
4007             {
4008             case 'a':
4009                 db.Names.push_back(db.make<NameType>("operator new[]"));
4010                 first += 2;
4011                 break;
4012             case 'e':
4013                 db.Names.push_back(db.make<NameType>("operator!="));
4014                 first += 2;
4015                 break;
4016             case 'g':
4017                 db.Names.push_back(db.make<NameType>("operator-"));
4018                 first += 2;
4019                 break;
4020             case 't':
4021                 db.Names.push_back(db.make<NameType>("operator!"));
4022                 first += 2;
4023                 break;
4024             case 'w':
4025                 db.Names.push_back(db.make<NameType>("operator new"));
4026                 first += 2;
4027                 break;
4028             }
4029             break;
4030         case 'o':
4031             switch (first[1])
4032             {
4033             case 'o':
4034                 db.Names.push_back(db.make<NameType>("operator||"));
4035                 first += 2;
4036                 break;
4037             case 'r':
4038                 db.Names.push_back(db.make<NameType>("operator|"));
4039                 first += 2;
4040                 break;
4041             case 'R':
4042                 db.Names.push_back(db.make<NameType>("operator|="));
4043                 first += 2;
4044                 break;
4045             }
4046             break;
4047         case 'p':
4048             switch (first[1])
4049             {
4050             case 'm':
4051                 db.Names.push_back(db.make<NameType>("operator->*"));
4052                 first += 2;
4053                 break;
4054             case 'l':
4055                 db.Names.push_back(db.make<NameType>("operator+"));
4056                 first += 2;
4057                 break;
4058             case 'L':
4059                 db.Names.push_back(db.make<NameType>("operator+="));
4060                 first += 2;
4061                 break;
4062             case 'p':
4063                 db.Names.push_back(db.make<NameType>("operator++"));
4064                 first += 2;
4065                 break;
4066             case 's':
4067                 db.Names.push_back(db.make<NameType>("operator+"));
4068                 first += 2;
4069                 break;
4070             case 't':
4071                 db.Names.push_back(db.make<NameType>("operator->"));
4072                 first += 2;
4073                 break;
4074             }
4075             break;
4076         case 'q':
4077             if (first[1] == 'u')
4078             {
4079                 db.Names.push_back(db.make<NameType>("operator?"));
4080                 first += 2;
4081             }
4082             break;
4083         case 'r':
4084             switch (first[1])
4085             {
4086             case 'm':
4087                 db.Names.push_back(db.make<NameType>("operator%"));
4088                 first += 2;
4089                 break;
4090             case 'M':
4091                 db.Names.push_back(db.make<NameType>("operator%="));
4092                 first += 2;
4093                 break;
4094             case 's':
4095                 db.Names.push_back(db.make<NameType>("operator>>"));
4096                 first += 2;
4097                 break;
4098             case 'S':
4099                 db.Names.push_back(db.make<NameType>("operator>>="));
4100                 first += 2;
4101                 break;
4102             }
4103             break;
4104         case 'v':
4105             if (std::isdigit(first[1]))
4106             {
4107                 const char* t = parse_source_name(first+2, last, db);
4108                 if (t != first+2)
4109                 {
4110                     if (db.Names.empty())
4111                         return first;
4112                     db.Names.back() =
4113                         db.make<ConversionOperatorType>(db.Names.back());
4114                     first = t;
4115                 }
4116             }
4117             break;
4118         }
4119     }
4120 
4121     if (original_first != first)
4122         first = parse_abi_tag_seq(first, last, db);
4123 
4124     return first;
4125 }
4126 
4127 const char*
4128 parse_integer_literal(const char* first, const char* last, StringView lit, Db& db)
4129 {
4130     const char* t = parse_number(first, last);
4131     if (t != first && t != last && *t == 'E')
4132     {
4133         db.Names.push_back(
4134             db.make<IntegerExpr>(lit, StringView(first, t)));
4135         first = t+1;
4136     }
4137     return first;
4138 }
4139 
4140 // <expr-primary> ::= L <type> <value number> E                          # integer literal
4141 //                ::= L <type> <value float> E                           # floating literal
4142 //                ::= L <string type> E                                  # string literal
4143 //                ::= L <nullptr type> E                                 # nullptr literal (i.e., "LDnE")
4144 //                ::= L <type> <real-part float> _ <imag-part float> E   # complex floating point literal (C 2000)
4145 //                ::= L <mangled-name> E                                 # external name
4146 
4147 const char*
4148 parse_expr_primary(const char* first, const char* last, Db& db)
4149 {
4150     if (last - first >= 4 && *first == 'L')
4151     {
4152         switch (first[1])
4153         {
4154         case 'w':
4155             {
4156             const char* t = parse_integer_literal(first+2, last, "wchar_t", db);
4157             if (t != first+2)
4158                 first = t;
4159             }
4160             break;
4161         case 'b':
4162             if (first[3] == 'E')
4163             {
4164                 switch (first[2])
4165                 {
4166                 case '0':
4167                     db.Names.push_back(db.make<BoolExpr>(0));
4168                     first += 4;
4169                     break;
4170                 case '1':
4171                     db.Names.push_back(db.make<BoolExpr>(1));
4172                     first += 4;
4173                     break;
4174                 }
4175             }
4176             break;
4177         case 'c':
4178             {
4179             const char* t = parse_integer_literal(first+2, last, "char", db);
4180             if (t != first+2)
4181                 first = t;
4182             }
4183             break;
4184         case 'a':
4185             {
4186             const char* t = parse_integer_literal(first+2, last, "signed char", db);
4187             if (t != first+2)
4188                 first = t;
4189             }
4190             break;
4191         case 'h':
4192             {
4193             const char* t = parse_integer_literal(first+2, last, "unsigned char", db);
4194             if (t != first+2)
4195                 first = t;
4196             }
4197             break;
4198         case 's':
4199             {
4200             const char* t = parse_integer_literal(first+2, last, "short", db);
4201             if (t != first+2)
4202                 first = t;
4203             }
4204             break;
4205         case 't':
4206             {
4207             const char* t = parse_integer_literal(first+2, last, "unsigned short", db);
4208             if (t != first+2)
4209                 first = t;
4210             }
4211             break;
4212         case 'i':
4213             {
4214             const char* t = parse_integer_literal(first+2, last, "", db);
4215             if (t != first+2)
4216                 first = t;
4217             }
4218             break;
4219         case 'j':
4220             {
4221             const char* t = parse_integer_literal(first+2, last, "u", db);
4222             if (t != first+2)
4223                 first = t;
4224             }
4225             break;
4226         case 'l':
4227             {
4228             const char* t = parse_integer_literal(first+2, last, "l", db);
4229             if (t != first+2)
4230                 first = t;
4231             }
4232             break;
4233         case 'm':
4234             {
4235             const char* t = parse_integer_literal(first+2, last, "ul", db);
4236             if (t != first+2)
4237                 first = t;
4238             }
4239             break;
4240         case 'x':
4241             {
4242             const char* t = parse_integer_literal(first+2, last, "ll", db);
4243             if (t != first+2)
4244                 first = t;
4245             }
4246             break;
4247         case 'y':
4248             {
4249             const char* t = parse_integer_literal(first+2, last, "ull", db);
4250             if (t != first+2)
4251                 first = t;
4252             }
4253             break;
4254         case 'n':
4255             {
4256             const char* t = parse_integer_literal(first+2, last, "__int128", db);
4257             if (t != first+2)
4258                 first = t;
4259             }
4260             break;
4261         case 'o':
4262             {
4263             const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db);
4264             if (t != first+2)
4265                 first = t;
4266             }
4267             break;
4268         case 'f':
4269             {
4270             const char* t = parse_floating_number<float>(first+2, last, db);
4271             if (t != first+2)
4272                 first = t;
4273             }
4274             break;
4275         case 'd':
4276             {
4277             const char* t = parse_floating_number<double>(first+2, last, db);
4278             if (t != first+2)
4279                 first = t;
4280             }
4281             break;
4282          case 'e':
4283             {
4284             const char* t = parse_floating_number<long double>(first+2, last, db);
4285             if (t != first+2)
4286                 first = t;
4287             }
4288             break;
4289         case '_':
4290             if (first[2] == 'Z')
4291             {
4292                 const char* t = parse_encoding(first+3, last, db);
4293                 if (t != first+3 && t != last && *t == 'E')
4294                     first = t+1;
4295             }
4296             break;
4297         case 'T':
4298             // Invalid mangled name per
4299             //   http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
4300             break;
4301         default:
4302             {
4303                 // might be named type
4304                 const char* t = parse_type(first+1, last, db);
4305                 if (t != first+1 && t != last)
4306                 {
4307                     if (*t != 'E')
4308                     {
4309                         const char* n = t;
4310                         for (; n != last && isdigit(*n); ++n)
4311                             ;
4312                         if (n != t && n != last && *n == 'E')
4313                         {
4314                             if (db.Names.empty())
4315                                 return first;
4316                             db.Names.back() = db.make<IntegerCastExpr>(
4317                                 db.Names.back(), StringView(t, n));
4318                             first = n+1;
4319                             break;
4320                         }
4321                     }
4322                     else
4323                     {
4324                         first = t+1;
4325                         break;
4326                     }
4327                 }
4328             }
4329         }
4330     }
4331     return first;
4332 }
4333 
4334 Node* maybe_change_special_sub_name(Node* inp, Db& db)
4335 {
4336     if (inp->K != Node::KSpecialSubstitution)
4337         return inp;
4338     auto Kind = static_cast<SpecialSubstitution*>(inp)->SSK;
4339     switch (Kind)
4340     {
4341     case SpecialSubKind::string:
4342     case SpecialSubKind::istream:
4343     case SpecialSubKind::ostream:
4344     case SpecialSubKind::iostream:
4345         return db.make<ExpandedSpecialSubstitution>(Kind);
4346     default:
4347         break;
4348     }
4349     return inp;
4350 }
4351 
4352 // <ctor-dtor-name> ::= C1    # complete object constructor
4353 //                  ::= C2    # base object constructor
4354 //                  ::= C3    # complete object allocating constructor
4355 //   extension      ::= C5    # ?
4356 //                  ::= D0    # deleting destructor
4357 //                  ::= D1    # complete object destructor
4358 //                  ::= D2    # base object destructor
4359 //   extension      ::= D5    # ?
4360 //   extension      ::= <ctor-dtor-name> <abi-tag-seq>
4361 const char*
4362 parse_ctor_dtor_name(const char* first, const char* last, Db& db)
4363 {
4364     if (last-first >= 2 && !db.Names.empty())
4365     {
4366         switch (first[0])
4367         {
4368         case 'C':
4369             switch (first[1])
4370             {
4371             case '1':
4372             case '2':
4373             case '3':
4374             case '5':
4375                 if (db.Names.empty())
4376                     return first;
4377                 db.Names.back() =
4378                     maybe_change_special_sub_name(db.Names.back(), db);
4379                 db.Names.push_back(
4380                     db.make<CtorDtorName>(db.Names.back(), false));
4381                 first += 2;
4382                 first = parse_abi_tag_seq(first, last, db);
4383                 db.ParsedCtorDtorCV = true;
4384                 break;
4385             }
4386             break;
4387         case 'D':
4388             switch (first[1])
4389             {
4390             case '0':
4391             case '1':
4392             case '2':
4393             case '5':
4394                 if (db.Names.empty())
4395                     return first;
4396                 db.Names.push_back(
4397                     db.make<CtorDtorName>(db.Names.back(), true));
4398                 first += 2;
4399                 first = parse_abi_tag_seq(first, last, db);
4400                 db.ParsedCtorDtorCV = true;
4401                 break;
4402             }
4403             break;
4404         }
4405     }
4406     return first;
4407 }
4408 
4409 // <unnamed-type-name> ::= Ut [<nonnegative number>] _ [<abi-tag-seq>]
4410 //                     ::= <closure-type-name>
4411 //
4412 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
4413 //
4414 // <lambda-sig> ::= <parameter type>+  # Parameter types or "v" if the lambda has no parameters
4415 const char*
4416 parse_unnamed_type_name(const char* first, const char* last, Db& db)
4417 {
4418     if (last - first > 2 && first[0] == 'U')
4419     {
4420         char type = first[1];
4421         switch (type)
4422         {
4423         case 't':
4424           {
4425             const char* t0 = first+2;
4426             if (t0 == last)
4427                 return first;
4428             StringView count;
4429             if (std::isdigit(*t0))
4430             {
4431                 const char* t1 = t0 + 1;
4432                 while (t1 != last && std::isdigit(*t1))
4433                     ++t1;
4434                 count = StringView(t0, t1);
4435                 t0 = t1;
4436             }
4437             if (t0 == last || *t0 != '_')
4438                 return first;
4439             db.Names.push_back(db.make<UnnamedTypeName>(count));
4440             first = t0 + 1;
4441             first = parse_abi_tag_seq(first, last, db);
4442           }
4443             break;
4444         case 'l':
4445           {
4446             size_t begin_pos = db.Names.size();
4447             const char* t0 = first+2;
4448             NodeArray lambda_params;
4449             if (first[2] == 'v')
4450             {
4451                 ++t0;
4452             }
4453             else
4454             {
4455                 while (true)
4456                 {
4457                     const char* t1 = parse_type(t0, last, db);
4458                     if (t1 == t0)
4459                         break;
4460                     t0 = t1;
4461                 }
4462                 if (db.Names.size() < begin_pos)
4463                     return first;
4464                 lambda_params = db.popTrailingNodeArray(begin_pos);
4465             }
4466             if (t0 == last || *t0 != 'E')
4467                 return first;
4468             ++t0;
4469             if (t0 == last)
4470                 return first;
4471             StringView count;
4472             if (std::isdigit(*t0))
4473             {
4474                 const char* t1 = t0 + 1;
4475                 while (t1 != last && std::isdigit(*t1))
4476                     ++t1;
4477                 count = StringView(t0, t1);
4478                 t0 = t1;
4479             }
4480             if (t0 == last || *t0 != '_')
4481                 return first;
4482             db.Names.push_back(db.make<LambdaTypeName>(lambda_params, count));
4483             first = t0 + 1;
4484           }
4485             break;
4486         }
4487     }
4488     return first;
4489 }
4490 
4491 // <unqualified-name> ::= <operator-name>
4492 //                    ::= <ctor-dtor-name>
4493 //                    ::= <source-name>
4494 //                    ::= <unnamed-type-name>
4495 
4496 const char*
4497 parse_unqualified_name(const char* first, const char* last, Db& db)
4498 {
4499     if (first != last)
4500     {
4501         const char* t;
4502         switch (*first)
4503         {
4504         case 'C':
4505         case 'D':
4506             t = parse_ctor_dtor_name(first, last, db);
4507             if (t != first)
4508                 first = t;
4509             break;
4510         case 'U':
4511             t = parse_unnamed_type_name(first, last, db);
4512             if (t != first)
4513                 first = t;
4514             break;
4515         case '1':
4516         case '2':
4517         case '3':
4518         case '4':
4519         case '5':
4520         case '6':
4521         case '7':
4522         case '8':
4523         case '9':
4524             t = parse_source_name(first, last, db);
4525             if (t != first)
4526                 first = t;
4527             break;
4528         default:
4529             t = parse_operator_name(first, last, db);
4530             if (t != first)
4531                 first = t;
4532             break;
4533         };
4534     }
4535     return first;
4536 }
4537 
4538 // <unscoped-name> ::= <unqualified-name>
4539 //                 ::= St <unqualified-name>   # ::std::
4540 // extension       ::= StL<unqualified-name>
4541 
4542 const char*
4543 parse_unscoped_name(const char* first, const char* last, Db& db)
4544 {
4545     if (last - first >= 2)
4546     {
4547         const char* t0 = first;
4548         bool St = false;
4549         if (first[0] == 'S' && first[1] == 't')
4550         {
4551             t0 += 2;
4552             St = true;
4553             if (t0 != last && *t0 == 'L')
4554                 ++t0;
4555         }
4556         const char* t1 = parse_unqualified_name(t0, last, db);
4557         if (t1 != t0)
4558         {
4559             if (St)
4560             {
4561                 if (db.Names.empty())
4562                     return first;
4563                 db.Names.back() =
4564                     db.make<StdQualifiedName>(db.Names.back());
4565             }
4566             first = t1;
4567         }
4568     }
4569     return first;
4570 }
4571 
4572 // at <type>                                            # alignof (a type)
4573 
4574 const char*
4575 parse_alignof_type(const char* first, const char* last, Db& db)
4576 {
4577     if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
4578     {
4579         const char* t = parse_type(first+2, last, db);
4580         if (t != first+2)
4581         {
4582             if (db.Names.empty())
4583                 return first;
4584             db.Names.back() =
4585                 db.make<EnclosingExpr>("alignof (", db.Names.back(), ")");
4586             first = t;
4587         }
4588     }
4589     return first;
4590 }
4591 
4592 // az <expression>                                            # alignof (a expression)
4593 
4594 const char*
4595 parse_alignof_expr(const char* first, const char* last, Db& db)
4596 {
4597     if (last - first >= 3 && first[0] == 'a' && first[1] == 'z')
4598     {
4599         const char* t = parse_expression(first+2, last, db);
4600         if (t != first+2)
4601         {
4602             if (db.Names.empty())
4603                 return first;
4604             db.Names.back() =
4605                 db.make<EnclosingExpr>("alignof (", db.Names.back(), ")");
4606             first = t;
4607         }
4608     }
4609     return first;
4610 }
4611 
4612 const char*
4613 parse_noexcept_expression(const char* first, const char* last, Db& db)
4614 {
4615     const char* t1 = parse_expression(first, last, db);
4616     if (t1 != first)
4617     {
4618         if (db.Names.empty())
4619             return first;
4620         db.Names.back() =
4621             db.make<EnclosingExpr>("noexcept (", db.Names.back(), ")");
4622         first = t1;
4623     }
4624     return first;
4625 }
4626 
4627 const char*
4628 parse_prefix_expression(const char* first, const char* last, StringView op, Db& db)
4629 {
4630     const char* t1 = parse_expression(first, last, db);
4631     if (t1 != first)
4632     {
4633         if (db.Names.empty())
4634             return first;
4635         db.Names.back() = db.make<PrefixExpr>(op, db.Names.back());
4636         first = t1;
4637     }
4638     return first;
4639 }
4640 
4641 const char*
4642 parse_binary_expression(const char* first, const char* last, StringView op, Db& db)
4643 {
4644     const char* t1 = parse_expression(first, last, db);
4645     if (t1 != first)
4646     {
4647         const char* t2 = parse_expression(t1, last, db);
4648         if (t2 != t1)
4649         {
4650             if (db.Names.size() < 2)
4651                 return first;
4652             auto op2 = db.Names.back();
4653             db.Names.pop_back();
4654             auto op1 = db.Names.back();
4655             db.Names.back() = db.make<BinaryExpr>(op1, op, op2);
4656             first = t2;
4657         }
4658     }
4659     return first;
4660 }
4661 
4662 // <expression> ::= <unary operator-name> <expression>
4663 //              ::= <binary operator-name> <expression> <expression>
4664 //              ::= <ternary operator-name> <expression> <expression> <expression>
4665 //              ::= cl <expression>+ E                                   # call
4666 //              ::= cv <type> <expression>                               # conversion with one argument
4667 //              ::= cv <type> _ <expression>* E                          # conversion with a different number of arguments
4668 //              ::= [gs] nw <expression>* _ <type> E                     # new (expr-list) type
4669 //              ::= [gs] nw <expression>* _ <type> <initializer>         # new (expr-list) type (init)
4670 //              ::= [gs] na <expression>* _ <type> E                     # new[] (expr-list) type
4671 //              ::= [gs] na <expression>* _ <type> <initializer>         # new[] (expr-list) type (init)
4672 //              ::= [gs] dl <expression>                                 # delete expression
4673 //              ::= [gs] da <expression>                                 # delete[] expression
4674 //              ::= pp_ <expression>                                     # prefix ++
4675 //              ::= mm_ <expression>                                     # prefix --
4676 //              ::= ti <type>                                            # typeid (type)
4677 //              ::= te <expression>                                      # typeid (expression)
4678 //              ::= dc <type> <expression>                               # dynamic_cast<type> (expression)
4679 //              ::= sc <type> <expression>                               # static_cast<type> (expression)
4680 //              ::= cc <type> <expression>                               # const_cast<type> (expression)
4681 //              ::= rc <type> <expression>                               # reinterpret_cast<type> (expression)
4682 //              ::= st <type>                                            # sizeof (a type)
4683 //              ::= sz <expression>                                      # sizeof (an expression)
4684 //              ::= at <type>                                            # alignof (a type)
4685 //              ::= az <expression>                                      # alignof (an expression)
4686 //              ::= nx <expression>                                      # noexcept (expression)
4687 //              ::= <template-param>
4688 //              ::= <function-param>
4689 //              ::= dt <expression> <unresolved-name>                    # expr.name
4690 //              ::= pt <expression> <unresolved-name>                    # expr->name
4691 //              ::= ds <expression> <expression>                         # expr.*expr
4692 //              ::= sZ <template-param>                                  # size of a parameter pack
4693 //              ::= sZ <function-param>                                  # size of a function parameter pack
4694 //              ::= sp <expression>                                      # pack expansion
4695 //              ::= tw <expression>                                      # throw expression
4696 //              ::= tr                                                   # throw with no operand (rethrow)
4697 //              ::= <unresolved-name>                                    # f(p), N::f(p), ::f(p),
4698 //                                                                       # freestanding dependent name (e.g., T::x),
4699 //                                                                       # objectless nonstatic member reference
4700 //              ::= <expr-primary>
4701 
4702 const char*
4703 parse_expression(const char* first, const char* last, Db& db)
4704 {
4705     if (last - first >= 2)
4706     {
4707         const char* t = first;
4708         bool parsed_gs = false;
4709         if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
4710         {
4711             t += 2;
4712             parsed_gs = true;
4713         }
4714         switch (*t)
4715         {
4716         case 'L':
4717             first = parse_expr_primary(first, last, db);
4718             break;
4719         case 'T':
4720             first = parse_template_param(first, last, db);
4721             break;
4722         case 'f':
4723             first = parse_function_param(first, last, db);
4724             break;
4725         case 'a':
4726             switch (t[1])
4727             {
4728             case 'a':
4729                 t = parse_binary_expression(first+2, last, "&&", db);
4730                 if (t != first+2)
4731                     first = t;
4732                 break;
4733             case 'd':
4734                 t = parse_prefix_expression(first+2, last, "&", db);
4735                 if (t != first+2)
4736                     first = t;
4737                 break;
4738             case 'n':
4739                 t = parse_binary_expression(first+2, last, "&", db);
4740                 if (t != first+2)
4741                     first = t;
4742                 break;
4743             case 'N':
4744                 t = parse_binary_expression(first+2, last, "&=", db);
4745                 if (t != first+2)
4746                     first = t;
4747                 break;
4748             case 'S':
4749                 t = parse_binary_expression(first+2, last, "=", db);
4750                 if (t != first+2)
4751                     first = t;
4752                 break;
4753             case 't':
4754                 first = parse_alignof_type(first, last, db);
4755                 break;
4756             case 'z':
4757                 first = parse_alignof_expr(first, last, db);
4758                 break;
4759             }
4760             break;
4761         case 'c':
4762             switch (t[1])
4763             {
4764             case 'c':
4765                 first = parse_const_cast_expr(first, last, db);
4766                 break;
4767             case 'l':
4768                 first = parse_call_expr(first, last, db);
4769                 break;
4770             case 'm':
4771                 t = parse_binary_expression(first+2, last, ",", db);
4772                 if (t != first+2)
4773                     first = t;
4774                 break;
4775             case 'o':
4776                 t = parse_prefix_expression(first+2, last, "~", db);
4777                 if (t != first+2)
4778                     first = t;
4779                 break;
4780             case 'v':
4781                 first = parse_conversion_expr(first, last, db);
4782                 break;
4783             }
4784             break;
4785         case 'd':
4786             switch (t[1])
4787             {
4788             case 'a':
4789                 {
4790                     const char* t1 = parse_expression(t+2, last, db);
4791                     if (t1 != t+2)
4792                     {
4793                         if (db.Names.empty())
4794                             return first;
4795                         db.Names.back() = db.make<DeleteExpr>(
4796                             db.Names.back(), parsed_gs, /*is_array=*/true);
4797                         first = t1;
4798                     }
4799                 }
4800                 break;
4801             case 'c':
4802                 first = parse_dynamic_cast_expr(first, last, db);
4803                 break;
4804             case 'e':
4805                 t = parse_prefix_expression(first+2, last, "*", db);
4806                 if (t != first+2)
4807                     first = t;
4808                 break;
4809             case 'l':
4810                 {
4811                     const char* t1 = parse_expression(t+2, last, db);
4812                     if (t1 != t+2)
4813                     {
4814                         if (db.Names.empty())
4815                             return first;
4816                         db.Names.back() = db.make<DeleteExpr>(
4817                             db.Names.back(), parsed_gs, /*is_array=*/false);
4818                         first = t1;
4819                     }
4820                 }
4821                 break;
4822             case 'n':
4823                 return parse_unresolved_name(first, last, db);
4824             case 's':
4825                 first = parse_dot_star_expr(first, last, db);
4826                 break;
4827             case 't':
4828                 first = parse_dot_expr(first, last, db);
4829                 break;
4830             case 'v':
4831                 t = parse_binary_expression(first+2, last, "/", db);
4832                 if (t != first+2)
4833                     first = t;
4834                 break;
4835             case 'V':
4836                 t = parse_binary_expression(first+2, last, "/=", db);
4837                 if (t != first+2)
4838                     first = t;
4839                 break;
4840             }
4841             break;
4842         case 'e':
4843             switch (t[1])
4844             {
4845             case 'o':
4846                 t = parse_binary_expression(first+2, last, "^", db);
4847                 if (t != first+2)
4848                     first = t;
4849                 break;
4850             case 'O':
4851                 t = parse_binary_expression(first+2, last, "^=", db);
4852                 if (t != first+2)
4853                     first = t;
4854                 break;
4855             case 'q':
4856                 t = parse_binary_expression(first+2, last, "==", db);
4857                 if (t != first+2)
4858                     first = t;
4859                 break;
4860             }
4861             break;
4862         case 'g':
4863             switch (t[1])
4864             {
4865             case 'e':
4866                 t = parse_binary_expression(first+2, last, ">=", db);
4867                 if (t != first+2)
4868                     first = t;
4869                 break;
4870             case 't':
4871                 t = parse_binary_expression(first+2, last, ">", db);
4872                 if (t != first+2)
4873                     first = t;
4874                 break;
4875             }
4876             break;
4877         case 'i':
4878             if (t[1] == 'x')
4879             {
4880                 const char* t1 = parse_expression(first+2, last, db);
4881                 if (t1 != first+2)
4882                 {
4883                     const char* t2 = parse_expression(t1, last, db);
4884                     if (t2 != t1)
4885                     {
4886                         if (db.Names.size() < 2)
4887                             return first;
4888                         auto op2 = db.Names.back();
4889                         db.Names.pop_back();
4890                         auto op1 = db.Names.back();
4891                         db.Names.back() =
4892                             db.make<ArraySubscriptExpr>(op1, op2);
4893                         first = t2;
4894                     }
4895                     else if (!db.Names.empty())
4896                         db.Names.pop_back();
4897                 }
4898             }
4899             break;
4900         case 'l':
4901             switch (t[1])
4902             {
4903             case 'e':
4904                 t = parse_binary_expression(first+2, last, "<=", db);
4905                 if (t != first+2)
4906                     first = t;
4907                 break;
4908             case 's':
4909                 t = parse_binary_expression(first+2, last, "<<", db);
4910                 if (t != first+2)
4911                     first = t;
4912                 break;
4913             case 'S':
4914                 t = parse_binary_expression(first+2, last, "<<=", db);
4915                 if (t != first+2)
4916                     first = t;
4917                 break;
4918             case 't':
4919                 t = parse_binary_expression(first+2, last, "<", db);
4920                 if (t != first+2)
4921                     first = t;
4922                 break;
4923             }
4924             break;
4925         case 'm':
4926             switch (t[1])
4927             {
4928             case 'i':
4929                 t = parse_binary_expression(first+2, last, "-", db);
4930                 if (t != first+2)
4931                     first = t;
4932                 break;
4933             case 'I':
4934                 t = parse_binary_expression(first+2, last, "-=", db);
4935                 if (t != first+2)
4936                     first = t;
4937                 break;
4938             case 'l':
4939                 t = parse_binary_expression(first+2, last, "*", db);
4940                 if (t != first+2)
4941                     first = t;
4942                 break;
4943             case 'L':
4944                 t = parse_binary_expression(first+2, last, "*=", db);
4945                 if (t != first+2)
4946                     first = t;
4947                 break;
4948             case 'm':
4949                 if (first+2 != last && first[2] == '_')
4950                 {
4951                     t = parse_prefix_expression(first+3, last, "--", db);
4952                     if (t != first+3)
4953                         first = t;
4954                 }
4955                 else
4956                 {
4957                     const char* t1 = parse_expression(first+2, last, db);
4958                     if (t1 != first+2)
4959                     {
4960                         if (db.Names.empty())
4961                             return first;
4962                         db.Names.back() =
4963                             db.make<PostfixExpr>(db.Names.back(), "--");
4964                         first = t1;
4965                     }
4966                 }
4967                 break;
4968             }
4969             break;
4970         case 'n':
4971             switch (t[1])
4972             {
4973             case 'a':
4974             case 'w':
4975                 first = parse_new_expr(first, last, db);
4976                 break;
4977             case 'e':
4978                 t = parse_binary_expression(first+2, last, "!=", db);
4979                 if (t != first+2)
4980                     first = t;
4981                 break;
4982             case 'g':
4983                 t = parse_prefix_expression(first+2, last, "-", db);
4984                 if (t != first+2)
4985                     first = t;
4986                 break;
4987             case 't':
4988                 t = parse_prefix_expression(first+2, last, "!", db);
4989                 if (t != first+2)
4990                     first = t;
4991                 break;
4992             case 'x':
4993                 t = parse_noexcept_expression(first+2, last, db);
4994                 if (t != first+2)
4995                     first = t;
4996                 break;
4997             }
4998             break;
4999         case 'o':
5000             switch (t[1])
5001             {
5002             case 'n':
5003                 return parse_unresolved_name(first, last, db);
5004             case 'o':
5005                 t = parse_binary_expression(first+2, last, "||", db);
5006                 if (t != first+2)
5007                     first = t;
5008                 break;
5009             case 'r':
5010                 t = parse_binary_expression(first+2, last, "|", db);
5011                 if (t != first+2)
5012                     first = t;
5013                 break;
5014             case 'R':
5015                 t = parse_binary_expression(first+2, last, "|=", db);
5016                 if (t != first+2)
5017                     first = t;
5018                 break;
5019             }
5020             break;
5021         case 'p':
5022             switch (t[1])
5023             {
5024             case 'm':
5025                 t = parse_binary_expression(first+2, last, "->*", db);
5026                 if (t != first+2)
5027                     first = t;
5028                 break;
5029             case 'l':
5030                 t = parse_binary_expression(first+2, last, "+", db);
5031                 if (t != first+2)
5032                     first = t;
5033                 break;
5034             case 'L':
5035                 t = parse_binary_expression(first+2, last, "+=", db);
5036                 if (t != first+2)
5037                     first = t;
5038                 break;
5039             case 'p':
5040                 if (first+2 != last && first[2] == '_')
5041                 {
5042                     t = parse_prefix_expression(first+3, last, "++", db);
5043                     if (t != first+3)
5044                         first = t;
5045                 }
5046                 else
5047                 {
5048                     const char* t1 = parse_expression(first+2, last, db);
5049                     if (t1 != first+2)
5050                     {
5051                         if (db.Names.empty())
5052                             return first;
5053                         db.Names.back() =
5054                             db.make<PostfixExpr>(db.Names.back(), "++");
5055                         first = t1;
5056                     }
5057                 }
5058                 break;
5059             case 's':
5060                 t = parse_prefix_expression(first+2, last, "+", db);
5061                 if (t != first+2)
5062                     first = t;
5063                 break;
5064             case 't':
5065                 first = parse_arrow_expr(first, last, db);
5066                 break;
5067             }
5068             break;
5069         case 'q':
5070             if (t[1] == 'u')
5071             {
5072                 const char* t1 = parse_expression(first+2, last, db);
5073                 if (t1 != first+2)
5074                 {
5075                     const char* t2 = parse_expression(t1, last, db);
5076                     if (t2 != t1)
5077                     {
5078                         const char* t3 = parse_expression(t2, last, db);
5079                         if (t3 != t2)
5080                         {
5081                             if (db.Names.size() < 3)
5082                                 return first;
5083                             auto op3 = db.Names.back();
5084                             db.Names.pop_back();
5085                             auto op2 = db.Names.back();
5086                             db.Names.pop_back();
5087                             auto op1 = db.Names.back();
5088                             db.Names.back() =
5089                                 db.make<ConditionalExpr>(op1, op2, op3);
5090                             first = t3;
5091                         }
5092                         else
5093                         {
5094                             if (db.Names.size() < 2)
5095                               return first;
5096                             db.Names.pop_back();
5097                             db.Names.pop_back();
5098                         }
5099                     }
5100                     else if (!db.Names.empty())
5101                         db.Names.pop_back();
5102                 }
5103             }
5104             break;
5105         case 'r':
5106             switch (t[1])
5107             {
5108             case 'c':
5109                 first = parse_reinterpret_cast_expr(first, last, db);
5110                 break;
5111             case 'm':
5112                 t = parse_binary_expression(first+2, last, "%", db);
5113                 if (t != first+2)
5114                     first = t;
5115                 break;
5116             case 'M':
5117                 t = parse_binary_expression(first+2, last, "%=", db);
5118                 if (t != first+2)
5119                     first = t;
5120                 break;
5121             case 's':
5122                 t = parse_binary_expression(first+2, last, ">>", db);
5123                 if (t != first+2)
5124                     first = t;
5125                 break;
5126             case 'S':
5127                 t = parse_binary_expression(first+2, last, ">>=", db);
5128                 if (t != first+2)
5129                     first = t;
5130                 break;
5131             }
5132             break;
5133         case 's':
5134             switch (t[1])
5135             {
5136             case 'c':
5137                 first = parse_static_cast_expr(first, last, db);
5138                 break;
5139             case 'p':
5140                 first = parse_pack_expansion(first, last, db);
5141                 break;
5142             case 'r':
5143                 return parse_unresolved_name(first, last, db);
5144             case 't':
5145                 first = parse_sizeof_type_expr(first, last, db);
5146                 break;
5147             case 'z':
5148                 first = parse_sizeof_expr_expr(first, last, db);
5149                 break;
5150             case 'Z':
5151                 if (last - t >= 3)
5152                 {
5153                     switch (t[2])
5154                     {
5155                     case 'T':
5156                         first = parse_sizeof_param_pack_expr(first, last, db);
5157                         break;
5158                     case 'f':
5159                         first = parse_sizeof_function_param_pack_expr(first, last, db);
5160                         break;
5161                     }
5162                 }
5163                 break;
5164             }
5165             break;
5166         case 't':
5167             switch (t[1])
5168             {
5169             case 'e':
5170             case 'i':
5171                 first = parse_typeid_expr(first, last, db);
5172                 break;
5173             case 'r':
5174                 db.Names.push_back(db.make<NameType>("throw"));
5175                 first += 2;
5176                 break;
5177             case 'w':
5178                 first = parse_throw_expr(first, last, db);
5179                 break;
5180             }
5181             break;
5182         case '1':
5183         case '2':
5184         case '3':
5185         case '4':
5186         case '5':
5187         case '6':
5188         case '7':
5189         case '8':
5190         case '9':
5191             return parse_unresolved_name(first, last, db);
5192         }
5193     }
5194     return first;
5195 }
5196 
5197 // <template-arg> ::= <type>                                             # type or template
5198 //                ::= X <expression> E                                   # expression
5199 //                ::= <expr-primary>                                     # simple expressions
5200 //                ::= J <template-arg>* E                                # argument pack
5201 //                ::= LZ <encoding> E                                    # extension
5202 
5203 const char*
5204 parse_template_arg(const char* first, const char* last, Db& db)
5205 {
5206     if (first != last)
5207     {
5208         const char* t;
5209         switch (*first)
5210         {
5211         case 'X':
5212             t = parse_expression(first+1, last, db);
5213             if (t != first+1)
5214             {
5215                 if (t != last && *t == 'E')
5216                     first = t+1;
5217             }
5218             break;
5219         case 'J':
5220             t = first+1;
5221             if (t == last)
5222                 return first;
5223             while (*t != 'E')
5224             {
5225                 const char* t1 = parse_template_arg(t, last, db);
5226                 if (t1 == t)
5227                     return first;
5228                 t = t1;
5229             }
5230             first = t+1;
5231             break;
5232         case 'L':
5233             // <expr-primary> or LZ <encoding> E
5234             if (first+1 != last && first[1] == 'Z')
5235             {
5236                 t = parse_encoding(first+2, last, db);
5237                 if (t != first+2 && t != last && *t == 'E')
5238                     first = t+1;
5239             }
5240             else
5241                 first = parse_expr_primary(first, last, db);
5242             break;
5243         default:
5244             // <type>
5245             first = parse_type(first, last, db);
5246             break;
5247         }
5248     }
5249     return first;
5250 }
5251 
5252 // <template-args> ::= I <template-arg>* E
5253 //     extension, the abi says <template-arg>+
5254 
5255 const char*
5256 parse_template_args(const char* first, const char* last, Db& db)
5257 {
5258     if (last - first >= 2 && *first == 'I')
5259     {
5260         if (db.TagTemplates)
5261             db.TemplateParams.clear();
5262         const char* t = first+1;
5263         size_t begin_idx = db.Names.size();
5264         while (*t != 'E')
5265         {
5266             if (db.TagTemplates)
5267             {
5268                 auto TmpParams = std::move(db.TemplateParams);
5269                 size_t k0 = db.Names.size();
5270                 const char* t1 = parse_template_arg(t, last, db);
5271                 size_t k1 = db.Names.size();
5272                 db.TemplateParams = std::move(TmpParams);
5273 
5274                 if (t1 == t || t1 == last || k0 > k1)
5275                     return first;
5276                 db.TemplateParams.pushPack();
5277                 for (size_t k = k0; k < k1; ++k)
5278                     db.TemplateParams.pushSubstitutionIntoPack(db.Names[k]);
5279                 t = t1;
5280                 continue;
5281             }
5282             size_t k0 = db.Names.size();
5283             const char* t1 = parse_template_arg(t, last, db);
5284             size_t k1 = db.Names.size();
5285             if (t1 == t || t1 == last || k0 > k1)
5286               return first;
5287             t = t1;
5288         }
5289         if (begin_idx > db.Names.size())
5290             return first;
5291         first = t + 1;
5292         TemplateParams* tp = db.make<TemplateParams>(
5293             db.popTrailingNodeArray(begin_idx));
5294         db.Names.push_back(tp);
5295     }
5296     return first;
5297 }
5298 
5299 // <nested-name> ::= N [<CV-Qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
5300 //               ::= N [<CV-Qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
5301 //
5302 // <prefix> ::= <prefix> <unqualified-name>
5303 //          ::= <template-prefix> <template-args>
5304 //          ::= <template-param>
5305 //          ::= <decltype>
5306 //          ::= # empty
5307 //          ::= <substitution>
5308 //          ::= <prefix> <data-member-prefix>
5309 //  extension ::= L
5310 //
5311 // <template-prefix> ::= <prefix> <template unqualified-name>
5312 //                   ::= <template-param>
5313 //                   ::= <substitution>
5314 
5315 const char*
5316 parse_nested_name(const char* first, const char* last, Db& db,
5317                   bool* ends_with_template_args)
5318 {
5319     if (first != last && *first == 'N')
5320     {
5321         Qualifiers cv;
5322         const char* t0 = parse_cv_qualifiers(first+1, last, cv);
5323         if (t0 == last)
5324             return first;
5325         db.RefQuals = FrefQualNone;
5326         if (*t0 == 'R')
5327         {
5328             db.RefQuals = FrefQualLValue;
5329             ++t0;
5330         }
5331         else if (*t0 == 'O')
5332         {
5333             db.RefQuals = FrefQualRValue;
5334             ++t0;
5335         }
5336         db.Names.push_back(db.make<EmptyName>());
5337         if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
5338         {
5339             t0 += 2;
5340             db.Names.back() = db.make<NameType>("std");
5341         }
5342         if (t0 == last)
5343             return first;
5344         bool pop_subs = false;
5345         bool component_ends_with_template_args = false;
5346         while (*t0 != 'E')
5347         {
5348             component_ends_with_template_args = false;
5349             const char* t1;
5350             switch (*t0)
5351             {
5352             case 'S':
5353                 if (t0 + 1 != last && t0[1] == 't')
5354                     goto do_parse_unqualified_name;
5355                 t1 = parse_substitution(t0, last, db);
5356                 if (t1 != t0 && t1 != last)
5357                 {
5358                     if (db.Names.size() < 2)
5359                         return first;
5360                     auto name = db.Names.back();
5361                     db.Names.pop_back();
5362                     if (db.Names.back()->K != Node::KEmptyName)
5363                     {
5364                         db.Names.back() = db.make<QualifiedName>(
5365                             db.Names.back(), name);
5366                         db.Subs.pushSubstitution(db.Names.back());
5367                     }
5368                     else
5369                         db.Names.back() = name;
5370                     pop_subs = true;
5371                     t0 = t1;
5372                 }
5373                 else
5374                     return first;
5375                 break;
5376             case 'T':
5377                 t1 = parse_template_param(t0, last, db);
5378                 if (t1 != t0 && t1 != last)
5379                 {
5380                     if (db.Names.size() < 2)
5381                         return first;
5382                     auto name = db.Names.back();
5383                     db.Names.pop_back();
5384                     if (db.Names.back()->K != Node::KEmptyName)
5385                         db.Names.back() =
5386                             db.make<QualifiedName>(db.Names.back(), name);
5387                     else
5388                         db.Names.back() = name;
5389                     db.Subs.pushSubstitution(db.Names.back());
5390                     pop_subs = true;
5391                     t0 = t1;
5392                 }
5393                 else
5394                     return first;
5395                 break;
5396             case 'D':
5397                 if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
5398                     goto do_parse_unqualified_name;
5399                 t1 = parse_decltype(t0, last, db);
5400                 if (t1 != t0 && t1 != last)
5401                 {
5402                     if (db.Names.size() < 2)
5403                         return first;
5404                     auto name = db.Names.back();
5405                     db.Names.pop_back();
5406                     if (db.Names.back()->K != Node::KEmptyName)
5407                         db.Names.back() =
5408                             db.make<QualifiedName>(db.Names.back(), name);
5409                     else
5410                         db.Names.back() = name;
5411                     db.Subs.pushSubstitution(db.Names.back());
5412                     pop_subs = true;
5413                     t0 = t1;
5414                 }
5415                 else
5416                     return first;
5417                 break;
5418             case 'I':
5419                 t1 = parse_template_args(t0, last, db);
5420                 if (t1 != t0 && t1 != last)
5421                 {
5422                     if (db.Names.size() < 2)
5423                         return first;
5424                     auto name = db.Names.back();
5425                     db.Names.pop_back();
5426                     db.Names.back() = db.make<NameWithTemplateArgs>(
5427                         db.Names.back(), name);
5428                     db.Subs.pushSubstitution(db.Names.back());
5429                     t0 = t1;
5430                     component_ends_with_template_args = true;
5431                 }
5432                 else
5433                     return first;
5434                 break;
5435             case 'L':
5436                 if (++t0 == last)
5437                     return first;
5438                 break;
5439             default:
5440             do_parse_unqualified_name:
5441                 t1 = parse_unqualified_name(t0, last, db);
5442                 if (t1 != t0 && t1 != last)
5443                 {
5444                     if (db.Names.size() < 2)
5445                         return first;
5446                     auto name = db.Names.back();
5447                     db.Names.pop_back();
5448                     if (db.Names.back()->K != Node::KEmptyName)
5449                         db.Names.back() =
5450                             db.make<QualifiedName>(db.Names.back(), name);
5451                     else
5452                         db.Names.back() = name;
5453                     db.Subs.pushSubstitution(db.Names.back());
5454                     pop_subs = true;
5455                     t0 = t1;
5456                 }
5457                 else
5458                     return first;
5459             }
5460         }
5461         first = t0 + 1;
5462         db.CV = cv;
5463         if (pop_subs && !db.Subs.empty())
5464             db.Subs.popPack();
5465         if (ends_with_template_args)
5466             *ends_with_template_args = component_ends_with_template_args;
5467     }
5468     return first;
5469 }
5470 
5471 // <discriminator> := _ <non-negative number>      # when number < 10
5472 //                 := __ <non-negative number> _   # when number >= 10
5473 //  extension      := decimal-digit+               # at the end of string
5474 
5475 const char*
5476 parse_discriminator(const char* first, const char* last)
5477 {
5478     // parse but ignore discriminator
5479     if (first != last)
5480     {
5481         if (*first == '_')
5482         {
5483             const char* t1 = first+1;
5484             if (t1 != last)
5485             {
5486                 if (std::isdigit(*t1))
5487                     first = t1+1;
5488                 else if (*t1 == '_')
5489                 {
5490                     for (++t1; t1 != last && std::isdigit(*t1); ++t1)
5491                         ;
5492                     if (t1 != last && *t1 == '_')
5493                         first = t1 + 1;
5494                 }
5495             }
5496         }
5497         else if (std::isdigit(*first))
5498         {
5499             const char* t1 = first+1;
5500             for (; t1 != last && std::isdigit(*t1); ++t1)
5501                 ;
5502             if (t1 == last)
5503                 first = last;
5504         }
5505     }
5506     return first;
5507 }
5508 
5509 // <local-name> := Z <function encoding> E <entity name> [<discriminator>]
5510 //              := Z <function encoding> E s [<discriminator>]
5511 //              := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
5512 
5513 const char*
5514 parse_local_name(const char* first, const char* last, Db& db,
5515                  bool* ends_with_template_args)
5516 {
5517     if (first != last && *first == 'Z')
5518     {
5519         const char* t = parse_encoding(first+1, last, db);
5520         if (t != first+1 && t != last && *t == 'E' && ++t != last)
5521         {
5522             switch (*t)
5523             {
5524             case 's':
5525                 first = parse_discriminator(t+1, last);
5526                 if (db.Names.empty())
5527                     return first;
5528                 db.Names.back() = db.make<QualifiedName>(
5529                     db.Names.back(), db.make<NameType>("string literal"));
5530                 break;
5531             case 'd':
5532                 if (++t != last)
5533                 {
5534                     const char* t1 = parse_number(t, last);
5535                     if (t1 != last && *t1 == '_')
5536                     {
5537                         t = t1 + 1;
5538                         t1 = parse_name(t, last, db,
5539                                         ends_with_template_args);
5540                         if (t1 != t)
5541                         {
5542                             if (db.Names.size() < 2)
5543                                 return first;
5544                             auto name = db.Names.back();
5545                             db.Names.pop_back();
5546                             if (db.Names.empty())
5547                                 return first;
5548                             db.Names.back() =
5549                                 db.make<QualifiedName>(db.Names.back(), name);
5550                             first = t1;
5551                         }
5552                         else if (!db.Names.empty())
5553                             db.Names.pop_back();
5554                     }
5555                 }
5556                 break;
5557             default:
5558                 {
5559                     const char* t1 = parse_name(t, last, db,
5560                                                 ends_with_template_args);
5561                     if (t1 != t)
5562                     {
5563                         // parse but ignore discriminator
5564                         first = parse_discriminator(t1, last);
5565                         if (db.Names.size() < 2)
5566                             return first;
5567                         auto name = db.Names.back();
5568                         db.Names.pop_back();
5569                         if (db.Names.empty())
5570                             return first;
5571                         db.Names.back() =
5572                             db.make<QualifiedName>(db.Names.back(), name);
5573                     }
5574                     else if (!db.Names.empty())
5575                         db.Names.pop_back();
5576                 }
5577                 break;
5578             }
5579         }
5580     }
5581     return first;
5582 }
5583 
5584 // <name> ::= <nested-name> // N
5585 //        ::= <local-name> # See Scope Encoding below  // Z
5586 //        ::= <unscoped-template-name> <template-args>
5587 //        ::= <unscoped-name>
5588 
5589 // <unscoped-template-name> ::= <unscoped-name>
5590 //                          ::= <substitution>
5591 
5592 const char*
5593 parse_name(const char* first, const char* last, Db& db,
5594            bool* ends_with_template_args)
5595 {
5596     if (last - first >= 2)
5597     {
5598         const char* t0 = first;
5599         // extension: ignore L here
5600         if (*t0 == 'L')
5601             ++t0;
5602         switch (*t0)
5603         {
5604         case 'N':
5605           {
5606             const char* t1 = parse_nested_name(t0, last, db,
5607                                                ends_with_template_args);
5608             if (t1 != t0)
5609                 first = t1;
5610             break;
5611           }
5612         case 'Z':
5613           {
5614             const char* t1 = parse_local_name(t0, last, db,
5615                                               ends_with_template_args);
5616             if (t1 != t0)
5617                 first = t1;
5618             break;
5619           }
5620         default:
5621           {
5622             const char* t1 = parse_unscoped_name(t0, last, db);
5623             if (t1 != t0)
5624             {
5625                 if (t1 != last && *t1 == 'I')  // <unscoped-template-name> <template-args>
5626                 {
5627                     if (db.Names.empty())
5628                         return first;
5629                     db.Subs.pushSubstitution(db.Names.back());
5630                     t0 = t1;
5631                     t1 = parse_template_args(t0, last, db);
5632                     if (t1 != t0)
5633                     {
5634                         if (db.Names.size() < 2)
5635                             return first;
5636                         auto tmp = db.Names.back();
5637                         db.Names.pop_back();
5638                         if (db.Names.empty())
5639                             return first;
5640                         db.Names.back() =
5641                             db.make<NameWithTemplateArgs>(
5642                                 db.Names.back(), tmp);
5643                         first = t1;
5644                         if (ends_with_template_args)
5645                             *ends_with_template_args = true;
5646                     }
5647                 }
5648                 else   // <unscoped-name>
5649                     first = t1;
5650             }
5651             else
5652             {   // try <substitution> <template-args>
5653                 t1 = parse_substitution(t0, last, db);
5654                 if (t1 != t0 && t1 != last && *t1 == 'I')
5655                 {
5656                     t0 = t1;
5657                     t1 = parse_template_args(t0, last, db);
5658                     if (t1 != t0)
5659                     {
5660                         if (db.Names.size() < 2)
5661                             return first;
5662                         auto tmp = db.Names.back();
5663                         db.Names.pop_back();
5664                         if (db.Names.empty())
5665                             return first;
5666                         db.Names.back() =
5667                             db.make<NameWithTemplateArgs>(
5668                                 db.Names.back(), tmp);
5669                         first = t1;
5670                         if (ends_with_template_args)
5671                             *ends_with_template_args = true;
5672                     }
5673                 }
5674             }
5675             break;
5676           }
5677         }
5678     }
5679     return first;
5680 }
5681 
5682 // <call-offset> ::= h <nv-offset> _
5683 //               ::= v <v-offset> _
5684 //
5685 // <nv-offset> ::= <offset number>
5686 //               # non-virtual base override
5687 //
5688 // <v-offset>  ::= <offset number> _ <virtual offset number>
5689 //               # virtual base override, with vcall offset
5690 
5691 const char*
5692 parse_call_offset(const char* first, const char* last)
5693 {
5694     if (first != last)
5695     {
5696         switch (*first)
5697         {
5698         case 'h':
5699             {
5700             const char* t = parse_number(first + 1, last);
5701             if (t != first + 1 && t != last && *t == '_')
5702                 first = t + 1;
5703             }
5704             break;
5705         case 'v':
5706             {
5707             const char* t = parse_number(first + 1, last);
5708             if (t != first + 1 && t != last && *t == '_')
5709             {
5710                 const char* t2 = parse_number(++t, last);
5711                 if (t2 != t && t2 != last && *t2 == '_')
5712                     first = t2 + 1;
5713             }
5714             }
5715             break;
5716         }
5717     }
5718     return first;
5719 }
5720 
5721 // <special-name> ::= TV <type>    # virtual table
5722 //                ::= TT <type>    # VTT structure (construction vtable index)
5723 //                ::= TI <type>    # typeinfo structure
5724 //                ::= TS <type>    # typeinfo name (null-terminated byte string)
5725 //                ::= Tc <call-offset> <call-offset> <base encoding>
5726 //                    # base is the nominal target function of thunk
5727 //                    # first call-offset is 'this' adjustment
5728 //                    # second call-offset is result adjustment
5729 //                ::= T <call-offset> <base encoding>
5730 //                    # base is the nominal target function of thunk
5731 //                ::= GV <object name> # Guard variable for one-time initialization
5732 //                                     # No <type>
5733 //                ::= TW <object name> # Thread-local wrapper
5734 //                ::= TH <object name> # Thread-local initialization
5735 //      extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
5736 //      extension ::= GR <object name> # reference temporary for object
5737 
5738 const char*
5739 parse_special_name(const char* first, const char* last, Db& db)
5740 {
5741     if (last - first > 2)
5742     {
5743         const char* t;
5744         switch (*first)
5745         {
5746         case 'T':
5747             switch (first[1])
5748             {
5749             case 'V':
5750                 // TV <type>    # virtual table
5751                 t = parse_type(first+2, last, db);
5752                 if (t != first+2)
5753                 {
5754                     if (db.Names.empty())
5755                         return first;
5756                     db.Names.back() =
5757                         db.make<SpecialName>("vtable for ", db.Names.back());
5758                     first = t;
5759                 }
5760                 break;
5761             case 'T':
5762                 // TT <type>    # VTT structure (construction vtable index)
5763                 t = parse_type(first+2, last, db);
5764                 if (t != first+2)
5765                 {
5766                     if (db.Names.empty())
5767                         return first;
5768                     db.Names.back() =
5769                         db.make<SpecialName>("VTT for ", db.Names.back());
5770                     first = t;
5771                 }
5772                 break;
5773             case 'I':
5774                 // TI <type>    # typeinfo structure
5775                 t = parse_type(first+2, last, db);
5776                 if (t != first+2)
5777                 {
5778                     if (db.Names.empty())
5779                         return first;
5780                     db.Names.back() =
5781                         db.make<SpecialName>("typeinfo for ", db.Names.back());
5782                     first = t;
5783                 }
5784                 break;
5785             case 'S':
5786                 // TS <type>    # typeinfo name (null-terminated byte string)
5787                 t = parse_type(first+2, last, db);
5788                 if (t != first+2)
5789                 {
5790                     if (db.Names.empty())
5791                         return first;
5792                     db.Names.back() =
5793                         db.make<SpecialName>("typeinfo name for ", db.Names.back());
5794                     first = t;
5795                 }
5796                 break;
5797             case 'c':
5798                 // Tc <call-offset> <call-offset> <base encoding>
5799               {
5800                 const char* t0 = parse_call_offset(first+2, last);
5801                 if (t0 == first+2)
5802                     break;
5803                 const char* t1 = parse_call_offset(t0, last);
5804                 if (t1 == t0)
5805                     break;
5806                 t = parse_encoding(t1, last, db);
5807                 if (t != t1)
5808                 {
5809                     if (db.Names.empty())
5810                         return first;
5811                     db.Names.back() =
5812                         db.make<SpecialName>("covariant return thunk to ",
5813                                               db.Names.back());
5814                     first = t;
5815                 }
5816               }
5817                 break;
5818             case 'C':
5819                 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
5820                 t = parse_type(first+2, last, db);
5821                 if (t != first+2)
5822                 {
5823                     const char* t0 = parse_number(t, last);
5824                     if (t0 != t && t0 != last && *t0 == '_')
5825                     {
5826                         const char* t1 = parse_type(++t0, last, db);
5827                         if (t1 != t0)
5828                         {
5829                             if (db.Names.size() < 2)
5830                                 return first;
5831                             auto left = db.Names.back();
5832                             db.Names.pop_back();
5833                             if (db.Names.empty())
5834                                 return first;
5835                             db.Names.back() = db.make<CtorVtableSpecialName>(
5836                                 left, db.Names.back());
5837                             first = t1;
5838                         }
5839                     }
5840                 }
5841                 break;
5842             case 'W':
5843                 // TW <object name> # Thread-local wrapper
5844                 t = parse_name(first + 2, last, db);
5845                 if (t != first + 2)
5846                 {
5847                     if (db.Names.empty())
5848                         return first;
5849                     db.Names.back() =
5850                         db.make<SpecialName>("thread-local wrapper routine for ",
5851                                               db.Names.back());
5852                     first = t;
5853                 }
5854                 break;
5855             case 'H':
5856                 //TH <object name> # Thread-local initialization
5857                 t = parse_name(first + 2, last, db);
5858                 if (t != first + 2)
5859                 {
5860                     if (db.Names.empty())
5861                         return first;
5862                     db.Names.back() = db.make<SpecialName>(
5863                         "thread-local initialization routine for ", db.Names.back());
5864                     first = t;
5865                 }
5866                 break;
5867             default:
5868                 // T <call-offset> <base encoding>
5869                 {
5870                 const char* t0 = parse_call_offset(first+1, last);
5871                 if (t0 == first+1)
5872                     break;
5873                 t = parse_encoding(t0, last, db);
5874                 if (t != t0)
5875                 {
5876                     if (db.Names.empty())
5877                         return first;
5878                     if (first[1] == 'v')
5879                     {
5880                         db.Names.back() =
5881                             db.make<SpecialName>("virtual thunk to ",
5882                                                   db.Names.back());
5883                         first = t;
5884                     }
5885                     else
5886                     {
5887                         db.Names.back() =
5888                             db.make<SpecialName>("non-virtual thunk to ",
5889                                                   db.Names.back());
5890                         first = t;
5891                     }
5892                 }
5893                 }
5894                 break;
5895             }
5896             break;
5897         case 'G':
5898             switch (first[1])
5899             {
5900             case 'V':
5901                 // GV <object name> # Guard variable for one-time initialization
5902                 t = parse_name(first+2, last, db);
5903                 if (t != first+2)
5904                 {
5905                     if (db.Names.empty())
5906                         return first;
5907                     db.Names.back() =
5908                         db.make<SpecialName>("guard variable for ", db.Names.back());
5909                     first = t;
5910                 }
5911                 break;
5912             case 'R':
5913                 // extension ::= GR <object name> # reference temporary for object
5914                 t = parse_name(first+2, last, db);
5915                 if (t != first+2)
5916                 {
5917                     if (db.Names.empty())
5918                         return first;
5919                     db.Names.back() =
5920                         db.make<SpecialName>("reference temporary for ",
5921                                               db.Names.back());
5922                     first = t;
5923                 }
5924                 break;
5925             }
5926             break;
5927         }
5928     }
5929     return first;
5930 }
5931 
5932 template <class T>
5933 class save_value
5934 {
5935     T& restore_;
5936     T original_value_;
5937 public:
5938     save_value(T& restore)
5939         : restore_(restore),
5940           original_value_(restore)
5941         {}
5942 
5943     ~save_value()
5944     {
5945         restore_ = std::move(original_value_);
5946     }
5947 
5948     save_value(const save_value&) = delete;
5949     save_value& operator=(const save_value&) = delete;
5950 };
5951 
5952 // <encoding> ::= <function name> <bare-function-type>
5953 //            ::= <data name>
5954 //            ::= <special-name>
5955 
5956 const char*
5957 parse_encoding(const char* first, const char* last, Db& db)
5958 {
5959     if (first != last)
5960     {
5961         save_value<decltype(db.EncodingDepth)> su(db.EncodingDepth);
5962         ++db.EncodingDepth;
5963         save_value<decltype(db.TagTemplates)> sb(db.TagTemplates);
5964         if (db.EncodingDepth > 1)
5965             db.TagTemplates = true;
5966         save_value<decltype(db.ParsedCtorDtorCV)> sp(db.ParsedCtorDtorCV);
5967         db.ParsedCtorDtorCV = false;
5968         switch (*first)
5969         {
5970         case 'G':
5971         case 'T':
5972             first = parse_special_name(first, last, db);
5973             break;
5974         default:
5975           {
5976             bool ends_with_template_args = false;
5977             const char* t = parse_name(first, last, db,
5978                                        &ends_with_template_args);
5979             if (db.Names.empty())
5980                 return first;
5981             Qualifiers cv = db.CV;
5982             FunctionRefQual ref = db.RefQuals;
5983             if (t != first)
5984             {
5985                 if (t != last && *t != 'E' && *t != '.')
5986                 {
5987                     save_value<bool> sb2(db.TagTemplates);
5988                     db.TagTemplates = false;
5989                     const char* t2;
5990                     if (db.Names.empty())
5991                         return first;
5992                     if (!db.Names.back())
5993                         return first;
5994                     Node* return_type = nullptr;
5995                     if (!db.ParsedCtorDtorCV && ends_with_template_args)
5996                     {
5997                         t2 = parse_type(t, last, db);
5998                         if (t2 == t)
5999                             return first;
6000                         if (db.Names.size() < 1)
6001                             return first;
6002                         return_type = db.Names.back();
6003                         db.Names.pop_back();
6004                         t = t2;
6005                     }
6006 
6007                     Node* result = nullptr;
6008 
6009                     if (t != last && *t == 'v')
6010                     {
6011                         ++t;
6012                         if (db.Names.empty())
6013                             return first;
6014                         Node* name = db.Names.back();
6015                         db.Names.pop_back();
6016                         result = db.make<TopLevelFunctionDecl>(
6017                             return_type, name, NodeArray());
6018                     }
6019                     else
6020                     {
6021                         size_t params_begin = db.Names.size();
6022                         while (true)
6023                         {
6024                             t2 = parse_type(t, last, db);
6025                             if (t2 == t)
6026                                 break;
6027                             t = t2;
6028                         }
6029                         if (db.Names.size() < params_begin)
6030                             return first;
6031                         NodeArray params =
6032                             db.popTrailingNodeArray(params_begin);
6033                         if (db.Names.empty())
6034                             return first;
6035                         Node* name = db.Names.back();
6036                         db.Names.pop_back();
6037                         result = db.make<TopLevelFunctionDecl>(
6038                             return_type, name, params);
6039                     }
6040                     if (ref != FrefQualNone)
6041                         result = db.make<FunctionRefQualType>(result, ref);
6042                     if (cv != QualNone)
6043                         result = db.make<FunctionQualType>(result, cv);
6044                     db.Names.push_back(result);
6045                     first = t;
6046                 }
6047                 else
6048                     first = t;
6049             }
6050             break;
6051           }
6052         }
6053     }
6054     return first;
6055 }
6056 
6057 // _block_invoke
6058 // _block_invoke<decimal-digit>+
6059 // _block_invoke_<decimal-digit>+
6060 
6061 const char*
6062 parse_block_invoke(const char* first, const char* last, Db& db)
6063 {
6064     if (last - first >= 13)
6065     {
6066         // FIXME: strcmp?
6067         const char test[] = "_block_invoke";
6068         const char* t = first;
6069         for (int i = 0; i < 13; ++i, ++t)
6070         {
6071             if (*t != test[i])
6072                 return first;
6073         }
6074         if (t != last)
6075         {
6076             if (*t == '_')
6077             {
6078                 // must have at least 1 decimal digit
6079                 if (++t == last || !std::isdigit(*t))
6080                     return first;
6081                 ++t;
6082             }
6083             // parse zero or more digits
6084             while (t != last && isdigit(*t))
6085                 ++t;
6086         }
6087         if (db.Names.empty())
6088             return first;
6089         db.Names.back() =
6090             db.make<SpecialName>("invocation function for block in ",
6091                                   db.Names.back());
6092         first = t;
6093     }
6094     return first;
6095 }
6096 
6097 // extension
6098 // <dot-suffix> := .<anything and everything>
6099 
6100 const char*
6101 parse_dot_suffix(const char* first, const char* last, Db& db)
6102 {
6103     if (first != last && *first == '.')
6104     {
6105         if (db.Names.empty())
6106             return first;
6107         db.Names.back() =
6108             db.make<DotSuffix>(db.Names.back(), StringView(first, last));
6109         first = last;
6110     }
6111     return first;
6112 }
6113 
6114 // <block-involcaton-function> ___Z<encoding>_block_invoke
6115 // <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
6116 // <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
6117 // <mangled-name> ::= _Z<encoding>
6118 //                ::= <type>
6119 
6120 void
6121 demangle(const char* first, const char* last, Db& db, int& status)
6122 {
6123     if (first >= last)
6124     {
6125         status = invalid_mangled_name;
6126         return;
6127     }
6128     if (*first == '_')
6129     {
6130         if (last - first >= 4)
6131         {
6132             if (first[1] == 'Z')
6133             {
6134                 const char* t = parse_encoding(first+2, last, db);
6135                 if (t != first+2 && t != last && *t == '.')
6136                     t = parse_dot_suffix(t, last, db);
6137                 if (t != last)
6138                     status = invalid_mangled_name;
6139             }
6140             else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z')
6141             {
6142                 const char* t = parse_encoding(first+4, last, db);
6143                 if (t != first+4 && t != last)
6144                 {
6145                     const char* t1 = parse_block_invoke(t, last, db);
6146                     if (t1 != last)
6147                         status = invalid_mangled_name;
6148                 }
6149                 else
6150                     status = invalid_mangled_name;
6151             }
6152             else
6153                 status = invalid_mangled_name;
6154         }
6155         else
6156             status = invalid_mangled_name;
6157     }
6158     else
6159     {
6160         const char* t = parse_type(first, last, db);
6161         if (t != last)
6162             status = invalid_mangled_name;
6163     }
6164     if (status == success && db.Names.empty())
6165         status = invalid_mangled_name;
6166 }
6167 
6168 }  // unnamed namespace
6169 
6170 extern "C" _LIBCXXABI_FUNC_VIS char *
6171 __cxa_demangle(const char *mangled_name, char *buf, size_t *n, int *status) {
6172     if (mangled_name == nullptr || (buf != nullptr && n == nullptr))
6173     {
6174         if (status)
6175             *status = invalid_args;
6176         return nullptr;
6177     }
6178 
6179     size_t internal_size = buf != nullptr ? *n : 0;
6180     Db db;
6181     int internal_status = success;
6182     size_t len = std::strlen(mangled_name);
6183     demangle(mangled_name, mangled_name + len, db,
6184              internal_status);
6185 
6186     if (internal_status == success && db.FixForwardReferences &&
6187         !db.TemplateParams.empty())
6188     {
6189         db.FixForwardReferences = false;
6190         db.TagTemplates = false;
6191         db.Names.clear();
6192         db.Subs.clear();
6193         demangle(mangled_name, mangled_name + len, db, internal_status);
6194         if (db.FixForwardReferences)
6195             internal_status = invalid_mangled_name;
6196     }
6197 
6198     if (internal_status == success)
6199     {
6200         if (!buf)
6201         {
6202             internal_size = 1024;
6203             buf = static_cast<char*>(std::malloc(internal_size));
6204         }
6205 
6206         if (buf)
6207         {
6208             OutputStream s(buf, internal_size);
6209             db.Names.back()->print(s);
6210             s += '\0';
6211             if (n) *n = s.getCurrentPosition();
6212             buf = s.getBuffer();
6213         }
6214         else
6215             internal_status = memory_alloc_failure;
6216     }
6217     else
6218         buf = nullptr;
6219     if (status)
6220         *status = internal_status;
6221     return buf;
6222 }
6223 
6224 }  // __cxxabiv1
6225