1d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//===-------------------------- cxa_demangle.cpp --------------------------===//
2d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//
3d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//                     The LLVM Compiler Infrastructure
4d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//
5d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//
8d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//===----------------------------------------------------------------------===//
9d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
101c300b9e6592df8e2259cf79f5abb121fb95de30Erik Pilkington// FIXME: (possibly) incomplete list of features that clang mangles that this
111c300b9e6592df8e2259cf79f5abb121fb95de30Erik Pilkington// file does not yet support:
121c300b9e6592df8e2259cf79f5abb121fb95de30Erik Pilkington//   - enable_if attribute
131c300b9e6592df8e2259cf79f5abb121fb95de30Erik Pilkington//   - C++ modules TS
14761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington//   - All C++14 and C++17 features
151c300b9e6592df8e2259cf79f5abb121fb95de30Erik Pilkington
166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#define _LIBCPP_NO_EXCEPTIONS
17d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
18b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool#include "__cxxabi_config.h"
19b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool
206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <vector>
21d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant#include <algorithm>
226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <numeric>
23761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#include <cassert>
247710154bed813889e5559da3693f3bd610e003cfErik Pilkington#include <cstdio>
256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <cstdlib>
266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <cstring>
276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant#include <cctype>
28d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
29b4c998b0496177cc59cb6402d6eb5ab13b082d0eNico Weber#ifdef _MSC_VER
30b4c998b0496177cc59cb6402d6eb5ab13b082d0eNico Weber// snprintf is implemented in VS 2015
31b4c998b0496177cc59cb6402d6eb5ab13b082d0eNico Weber#if _MSC_VER < 1900
32b4c998b0496177cc59cb6402d6eb5ab13b082d0eNico Weber#define snprintf _snprintf_s
33b4c998b0496177cc59cb6402d6eb5ab13b082d0eNico Weber#endif
34b4c998b0496177cc59cb6402d6eb5ab13b082d0eNico Weber#endif
35b4c998b0496177cc59cb6402d6eb5ab13b082d0eNico Weber
36761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#ifndef NDEBUG
37761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#if __has_attribute(noinline) && __has_attribute(used)
38761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#define DUMP_METHOD __attribute__((noinline,used))
39761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#else
40761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#define DUMP_METHOD
41761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#endif
42761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#endif
43d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
44761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonnamespace {
45d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass StringView {
470024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const char *First;
480024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const char *Last;
490024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  template <size_t N>
520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {}
537de232a3f6f6b6d5f2892b689095fb13d732bbcbErik Pilkington  StringView(const char *First_, const char *Last_) : First(First_), Last(Last_) {}
540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView() : First(nullptr), Last(nullptr) {}
550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView substr(size_t From, size_t To) {
570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (To >= size())
580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      To = size() - 1;
590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (From >= size())
600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      From = size() - 1;
610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return StringView(First + From, First + To);
620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView dropFront(size_t N) const {
650024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (N >= size())
660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      N = size() - 1;
670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return StringView(First + N, Last);
680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool startsWith(StringView Str) const {
710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Str.size() > size())
720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return false;
730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return std::equal(Str.begin(), Str.end(), begin());
740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const char &operator[](size_t Idx) const { return *(begin() + Idx); }
770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const char *begin() const { return First; }
790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const char *end() const { return Last; }
800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  size_t size() const { return static_cast<size_t>(Last - First); }
81761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool empty() const { return First == Last; }
820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonbool operator==(const StringView &LHS, const StringView &RHS) {
850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  return LHS.size() == RHS.size() &&
860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington         std::equal(LHS.begin(), LHS.end(), RHS.begin());
870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington}
880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington// Stream that AST nodes write their string representation into after the AST
900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington// has been parsed.
910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass OutputStream {
920024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  char *Buffer;
930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  size_t CurrentPosition;
940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  size_t BufferCapacity;
950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // Ensure there is at least n more positions in buffer.
970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void grow(size_t N) {
980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (N + CurrentPosition >= BufferCapacity) {
990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      BufferCapacity *= 2;
1000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      if (BufferCapacity < N + CurrentPosition)
1010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        BufferCapacity = N + CurrentPosition;
1020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity));
1030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
1040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
1050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  OutputStream(char *StartBuf, size_t Size)
1080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      : Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {}
1090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
110761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// If a ParameterPackExpansion (or similar type) is encountered, the offset
111761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// into the pack that we're currently printing.
112761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max();
113761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  OutputStream &operator+=(StringView R) {
1150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    size_t Size = R.size();
1160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Size == 0)
1170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return *this;
1180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    grow(Size);
1190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    memmove(Buffer + CurrentPosition, R.begin(), Size);
1200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    CurrentPosition += Size;
1210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return *this;
1220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
1230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  OutputStream &operator+=(char C) {
1250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    grow(1);
1260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Buffer[CurrentPosition++] = C;
1270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return *this;
1280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
1290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
130761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  size_t getCurrentPosition() const { return CurrentPosition; };
1310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  char back() const {
1330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0';
1340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
1350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool empty() const { return CurrentPosition == 0; }
1370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  char *getBuffer() { return Buffer; }
1390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  char *getBufferEnd() { return Buffer + CurrentPosition - 1; }
1400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  size_t getBufferCapacity() { return BufferCapacity; }
1410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
1420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
143761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtontemplate <class T>
144761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonclass SwapAndRestore {
145761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  T &Restore;
146761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  T OriginalValue;
147761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonpublic:
148761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  SwapAndRestore(T& Restore_, T NewVal)
149761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Restore(Restore_), OriginalValue(Restore) {
150761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Restore = std::move(NewVal);
151761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
152761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  ~SwapAndRestore() { Restore = std::move(OriginalValue); }
153761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
154761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  SwapAndRestore(const SwapAndRestore &) = delete;
155761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  SwapAndRestore &operator=(const SwapAndRestore &) = delete;
156761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington};
157761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington// Base class of all AST nodes. The AST is built by the parser, then is
1590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington// traversed by the printLeft/Right functions to produce a demangled string.
1600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass Node {
1610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  enum Kind : unsigned char {
1630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KDotSuffix,
1640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KVendorExtQualType,
1650024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KQualType,
1660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KConversionOperatorType,
1670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KPostfixQualifiedType,
1680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KNameType,
1695bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    KAbiTagAttr,
1700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KObjCProtoName,
1710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KPointerType,
1720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KLValueReferenceType,
1730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KRValueReferenceType,
1740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KPointerToMemberType,
1750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KArrayType,
1760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KFunctionType,
177761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    KFunctionEncoding,
1780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KFunctionQualType,
1790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KFunctionRefQualType,
1800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KLiteralOperator,
1810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KSpecialName,
1820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KCtorVtableSpecialName,
1830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KQualifiedName,
1840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KEmptyName,
1850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KVectorType,
186761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    KParameterPack,
187761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    KTemplateArgumentPack,
188761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    KParameterPackExpansion,
189761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    KTemplateArgs,
1900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KNameWithTemplateArgs,
1910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KGlobalQualifiedName,
1920024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KStdQualifiedName,
1930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KExpandedSpecialSubstitution,
1940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KSpecialSubstitution,
1950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KCtorDtorName,
1960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KDtorName,
1970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KUnnamedTypeName,
1980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KLambdaTypeName,
1990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    KExpr,
2000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  };
2010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
202761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  static constexpr unsigned NoParameterPack =
203761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    std::numeric_limits<unsigned>::max();
204761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  unsigned ParameterPackSize = NoParameterPack;
2050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
206761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Kind K;
2070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
208761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// Three-way bool to track a cached value. Unknown is possible if this node
209761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// has an unexpanded parameter pack below it that may affect this cache.
210761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  enum class Cache : unsigned char { Yes, No, Unknown, };
211761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
212761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// Tracks if this node has a component on its right side, in which case we
213761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// need to call printRight.
214761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Cache RHSComponentCache;
215761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
216761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// Track if this node is a (possibly qualified) array type. This can affect
217761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// how we format the output string.
218761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Cache ArrayCache;
219761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
220761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// Track if this node is a (possibly qualified) function type. This can
221761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// affect how we format the output string.
222761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Cache FunctionCache;
223761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
224761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Node(Kind K_, unsigned ParameterPackSize_ = NoParameterPack,
225761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington       Cache RHSComponentCache_ = Cache::No, Cache ArrayCache_ = Cache::No,
226761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington       Cache FunctionCache_ = Cache::No)
227761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : ParameterPackSize(ParameterPackSize_), K(K_),
228761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        RHSComponentCache(RHSComponentCache_), ArrayCache(ArrayCache_),
229761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        FunctionCache(FunctionCache_) {}
2300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
231761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool containsUnexpandedParameterPack() const {
232761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return ParameterPackSize != NoParameterPack;
233761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
234761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
235761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponent(OutputStream &S) const {
236761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (RHSComponentCache != Cache::Unknown)
237761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      return RHSComponentCache == Cache::Yes;
238761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return hasRHSComponentSlow(S);
239761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
2400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
241761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasArray(OutputStream &S) const {
242761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (ArrayCache != Cache::Unknown)
243761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      return ArrayCache == Cache::Yes;
244761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return hasArraySlow(S);
245761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
246761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
247761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasFunction(OutputStream &S) const {
248761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (FunctionCache != Cache::Unknown)
249761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      return FunctionCache == Cache::Yes;
250761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return hasFunctionSlow(S);
251761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
252761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
253761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Kind getKind() const { return K; }
254761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
255761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  virtual bool hasRHSComponentSlow(OutputStream &) const { return false; }
256761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  virtual bool hasArraySlow(OutputStream &) const { return false; }
257761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  virtual bool hasFunctionSlow(OutputStream &) const { return false; }
258761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
259761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// If this node is a pack expansion that expands to 0 elements. This can have
260761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  /// an effect on how we should format the output.
261761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool isEmptyPackExpansion() const;
262761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
263761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  void print(OutputStream &S) const {
264761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    printLeft(S);
265761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (RHSComponentCache != Cache::No)
266761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      printRight(S);
2670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
2680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
2690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // Print the "left" side of this Node into OutputStream.
2700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  virtual void printLeft(OutputStream &) const = 0;
2710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
2720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // Print the "right". This distinction is necessary to represent C++ types
2730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // that appear on the RHS of their subtype, such as arrays or functions.
2740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // Since most types don't have such a component, provide a default
2750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // implemenation.
2760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  virtual void printRight(OutputStream &) const {}
2770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
2780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  virtual StringView getBaseName() const { return StringView(); }
2790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
2800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // Silence compiler warnings, this dtor will never be called.
2810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  virtual ~Node() = default;
282761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
283761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#ifndef NDEBUG
284761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  DUMP_METHOD void dump() const {
285761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    char *Buffer = static_cast<char*>(std::malloc(1024));
286761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    OutputStream S(Buffer, 1024);
287761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    print(S);
288761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    S += '\0';
289761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    printf("Symbol dump for %p: %s\n", (const void*)this, S.getBuffer());
290761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    std::free(S.getBuffer());
291761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
292761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington#endif
2930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
2940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
2950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass NodeArray {
2960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node **Elements;
2970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  size_t NumElements;
2980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
2990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
300761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  NodeArray() : Elements(nullptr), NumElements(0) {}
301414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  NodeArray(Node **Elements_, size_t NumElements_)
302414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington      : Elements(Elements_), NumElements(NumElements_) {}
3030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool empty() const { return NumElements == 0; }
3050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  size_t size() const { return NumElements; }
3060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
307761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Node **begin() const { return Elements; }
308761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Node **end() const { return Elements + NumElements; }
309761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
310761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Node *operator[](size_t Idx) const { return Elements[Idx]; }
311761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
312761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  void printWithComma(OutputStream &S) const {
313761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    bool FirstElement = true;
3140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    for (size_t Idx = 0; Idx != NumElements; ++Idx) {
315761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (Elements[Idx]->isEmptyPackExpansion())
316761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        continue;
317761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (!FirstElement)
318761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        S += ", ";
319761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      FirstElement = false;
3200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      Elements[Idx]->print(S);
3210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
3220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
3230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
3240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass DotSuffix final : public Node {
3260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Prefix;
3270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Suffix;
3280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
330414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  DotSuffix(Node *Prefix_, StringView Suffix_)
331414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington      : Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {}
3320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &s) const override {
3340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Prefix->print(s);
3350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    s += " (";
3360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    s += Suffix;
3370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    s += ")";
3380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
3390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
3400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass VendorExtQualType final : public Node {
3420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Ty;
343f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  StringView Ext;
3440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
346f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  VendorExtQualType(Node *Ty_, StringView Ext_)
347f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      : Node(KVendorExtQualType, Ty_->ParameterPackSize),
348761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Ty(Ty_), Ext(Ext_) {}
349761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
3500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
351761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Ty->print(S);
3520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += " ";
353f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    S += Ext;
3540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
3550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
3560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonenum Qualifiers {
3580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  QualNone = 0,
3590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  QualConst = 0x1,
3600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  QualVolatile = 0x2,
3610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  QualRestrict = 0x4,
3620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
3630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonvoid addQualifiers(Qualifiers &Q1, Qualifiers Q2) {
3650024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Q1 = static_cast<Qualifiers>(Q1 | Q2);
3660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington}
3670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass QualType : public Node {
3690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonprotected:
3700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Qualifiers Quals;
3710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Child;
3720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printQuals(OutputStream &S) const {
3740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Quals & QualConst)
3750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += " const";
3760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Quals & QualVolatile)
3770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += " volatile";
3780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Quals & QualRestrict)
3790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += " restrict";
3800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
3810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
383414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  QualType(Node *Child_, Qualifiers Quals_)
384761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KQualType, Child_->ParameterPackSize, Child_->RHSComponentCache,
385761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             Child_->ArrayCache, Child_->FunctionCache),
386414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington        Quals(Quals_), Child(Child_) {}
3870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
388761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &S) const override {
389761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Child->hasRHSComponent(S);
390761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
391761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasArraySlow(OutputStream &S) const override {
392761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Child->hasArray(S);
393761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
394761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasFunctionSlow(OutputStream &S) const override {
395761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Child->hasFunction(S);
396761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
3970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
3980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
3990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Child->printLeft(S);
4000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    printQuals(S);
4010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
4020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &S) const override { Child->printRight(S); }
4040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
4050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass ConversionOperatorType final : public Node {
4070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Ty;
4080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
410761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  ConversionOperatorType(Node *Ty_)
411761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KConversionOperatorType, Ty_->ParameterPackSize), Ty(Ty_) {}
4120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4130024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
4140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "operator ";
4150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Ty->print(S);
4160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
4170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
4180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass PostfixQualifiedType final : public Node {
4200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Ty;
4210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Postfix;
4220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
424414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  PostfixQualifiedType(Node *Ty_, StringView Postfix_)
425761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KPostfixQualifiedType, Ty_->ParameterPackSize),
426761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Ty(Ty_), Postfix(Postfix_) {}
4270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &s) const override {
4290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Ty->printLeft(s);
4300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    s += Postfix;
4310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
4320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
4330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass NameType final : public Node {
4350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Name;
4360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
438414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  NameType(StringView Name_) : Node(KNameType), Name(Name_) {}
4390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView getName() const { return Name; }
4410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView getBaseName() const override { return Name; }
4420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &s) const override { s += Name; }
4440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
4450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4465bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkingtonclass AbiTagAttr final : public Node {
4475bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington  const Node* Base;
4485bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington  StringView Tag;
4495bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkingtonpublic:
4505bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington  AbiTagAttr(const Node* Base_, StringView Tag_)
451761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KAbiTagAttr, Base_->ParameterPackSize, Base_->RHSComponentCache,
452761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             Base_->ArrayCache, Base_->FunctionCache),
453761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Base(Base_), Tag(Tag_) {}
4545bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington
4555bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington  void printLeft(OutputStream &S) const override {
4565bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    Base->printLeft(S);
4575bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    S += "[abi:";
4585bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    S += Tag;
4595bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    S += "]";
4605bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington  }
4615bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington};
4625bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington
4630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass ObjCProtoName : public Node {
4640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Ty;
465f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  StringView Protocol;
4660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  friend class PointerType;
4680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
470f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  ObjCProtoName(Node *Ty_, StringView Protocol_)
471414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington      : Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {}
4720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool isObjCObject() const {
474761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Ty->getKind() == KNameType &&
4750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington           static_cast<NameType *>(Ty)->getName() == "objc_object";
4760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
4770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
479761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Ty->print(S);
4800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "<";
481f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    S += Protocol;
4820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ">";
4830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
4840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
4850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass PointerType final : public Node {
4870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Pointee;
4880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
490414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  PointerType(Node *Pointee_)
491761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KPointerType, Pointee_->ParameterPackSize,
492761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             Pointee_->RHSComponentCache),
493761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Pointee(Pointee_) {}
494761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
495761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &S) const override {
496761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Pointee->hasRHSComponent(S);
497761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
4980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
4990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &s) const override {
5000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    // We rewrite objc_object<SomeProtocol>* into id<SomeProtocol>.
501761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Pointee->getKind() != KObjCProtoName ||
5020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) {
5030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      Pointee->printLeft(s);
504761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (Pointee->hasArray(s))
5050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        s += " ";
506761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (Pointee->hasArray(s) || Pointee->hasFunction(s))
5070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        s += "(";
5080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += "*";
5090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    } else {
5100024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      const auto *objcProto = static_cast<const ObjCProtoName *>(Pointee);
5110024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += "id<";
512f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      s += objcProto->Protocol;
5130024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += ">";
5140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
5150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
5160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &s) const override {
518761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Pointee->getKind() != KObjCProtoName ||
5190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) {
520761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (Pointee->hasArray(s) || Pointee->hasFunction(s))
5210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        s += ")";
5220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      Pointee->printRight(s);
5230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
5240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
5250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
5260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass LValueReferenceType final : public Node {
5280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Pointee;
5290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
531414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  LValueReferenceType(Node *Pointee_)
532761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KLValueReferenceType, Pointee_->ParameterPackSize,
533761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             Pointee_->RHSComponentCache),
534414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington        Pointee(Pointee_) {}
5350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
536761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &S) const override {
537761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Pointee->hasRHSComponent(S);
538761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
539761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
5400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &s) const override {
5410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Pointee->printLeft(s);
542761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Pointee->hasArray(s))
5430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += " ";
544761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Pointee->hasArray(s) || Pointee->hasFunction(s))
5450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += "(&";
5460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    else
5470024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += "&";
5480024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
5490024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &s) const override {
550761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Pointee->hasArray(s) || Pointee->hasFunction(s))
5510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += ")";
5520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Pointee->printRight(s);
5530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
5540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
5550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass RValueReferenceType final : public Node {
5570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Pointee;
5580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
560414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  RValueReferenceType(Node *Pointee_)
561761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KRValueReferenceType, Pointee_->ParameterPackSize,
562761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             Pointee_->RHSComponentCache),
563414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington        Pointee(Pointee_) {}
5640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
565761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &S) const override {
566761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Pointee->hasRHSComponent(S);
567761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
568761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
5690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &s) const override {
5700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Pointee->printLeft(s);
571761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Pointee->hasArray(s))
5720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += " ";
573761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Pointee->hasArray(s) || Pointee->hasFunction(s))
5740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += "(&&";
5750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    else
5760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += "&&";
5770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
5780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &s) const override {
580761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Pointee->hasArray(s) || Pointee->hasFunction(s))
5810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += ")";
5820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Pointee->printRight(s);
5830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
5840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
5850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass PointerToMemberType final : public Node {
5870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *ClassType;
5880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *MemberType;
5890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
591414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  PointerToMemberType(Node *ClassType_, Node *MemberType_)
592761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KPointerToMemberType,
593761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             std::min(MemberType_->ParameterPackSize,
594761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                      ClassType_->ParameterPackSize),
595761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             MemberType_->RHSComponentCache),
596414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington        ClassType(ClassType_), MemberType(MemberType_) {}
5970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
598761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &S) const override {
599761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return MemberType->hasRHSComponent(S);
600761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
601761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
6020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &s) const override {
6030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    MemberType->printLeft(s);
604761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (MemberType->hasArray(s) || MemberType->hasFunction(s))
6050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += "(";
6060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    else
6070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += " ";
6080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    ClassType->print(s);
6090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    s += "::*";
6100024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
6110024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &s) const override {
613761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (MemberType->hasArray(s) || MemberType->hasFunction(s))
6140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += ")";
6150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    MemberType->printRight(s);
6160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
6170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
6180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass NodeOrString {
6200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const void *First;
6210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const void *Second;
6220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
6240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  /* implicit */ NodeOrString(StringView Str) {
6250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    const char *FirstChar = Str.begin();
6260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    const char *SecondChar = Str.end();
6270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (SecondChar == nullptr) {
6280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      assert(FirstChar == SecondChar);
6290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      ++FirstChar, ++SecondChar;
6300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
6310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    First = static_cast<const void *>(FirstChar);
6320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Second = static_cast<const void *>(SecondChar);
6330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
6340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  /* implicit */ NodeOrString(Node *N)
6360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      : First(static_cast<const void *>(N)), Second(nullptr) {}
6370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeOrString() : First(nullptr), Second(nullptr) {}
6380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool isString() const { return Second && First; }
6400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool isNode() const { return First && !Second; }
6410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool isEmpty() const { return !First && !Second; }
6420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView asString() const {
6440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    assert(isString());
6450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return StringView(static_cast<const char *>(First),
6460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                      static_cast<const char *>(Second));
6470024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
6480024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6490024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *asNode() const {
6500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    assert(isNode());
6510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return static_cast<const Node *>(First);
6520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
6530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
6540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass ArrayType final : public Node {
6560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Base;
6570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeOrString Dimension;
6580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
660414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  ArrayType(Node *Base_, NodeOrString Dimension_)
661761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KArrayType, Base_->ParameterPackSize,
662761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*RHSComponentCache=*/Cache::Yes,
663761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*ArrayCache=*/Cache::Yes),
664761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Base(Base_), Dimension(Dimension_) {
665761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Dimension.isNode())
666761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize =
667761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington          std::min(ParameterPackSize, Dimension.asNode()->ParameterPackSize);
668761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
6690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // Incomplete array type.
671761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  ArrayType(Node *Base_)
672761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KArrayType, Base_->ParameterPackSize,
673761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*RHSComponentCache=*/Cache::Yes,
674761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*ArrayCache=*/Cache::Yes),
675761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Base(Base_) {}
676761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
677761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &) const override { return true; }
678761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasArraySlow(OutputStream &) const override { return true; }
6790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override { Base->printLeft(S); }
6810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &S) const override {
6830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (S.back() != ']')
6840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += " ";
6850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "[";
6860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Dimension.isString())
6870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += Dimension.asString();
6880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    else if (Dimension.isNode())
6890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      Dimension.asNode()->print(S);
6900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "]";
6910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Base->printRight(S);
6920024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
6930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
6940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass FunctionType final : public Node {
6960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Ret;
6970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeArray Params;
6980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
6990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
700414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  FunctionType(Node *Ret_, NodeArray Params_)
701761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KFunctionType, Ret_->ParameterPackSize,
702761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No,
703761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*FunctionCache=*/Cache::Yes),
704761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Ret(Ret_), Params(Params_) {
705761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *P : Params)
706761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, P->ParameterPackSize);
707761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
708761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
709761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &) const override { return true; }
710761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasFunctionSlow(OutputStream &) const override { return true; }
7110024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // Handle C++'s ... quirky decl grammer by using the left & right
7130024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // distinction. Consider:
7140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  //   int (*f(float))(char) {}
7150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // f is a function that takes a float and returns a pointer to a function
7160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // that takes a char and returns an int. If we're trying to print f, start
7170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // by printing out the return types's left, then print our parameters, then
7180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // finally print right of the return type.
7190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
7200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Ret->printLeft(S);
7210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += " ";
7220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
7230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &S) const override {
7250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
726761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Params.printWithComma(S);
7270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
7280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Ret->printRight(S);
7290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
7300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
7310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
732761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonclass FunctionEncoding final : public Node {
7330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Ret;
7340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Name;
7350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeArray Params;
7360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
738761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  FunctionEncoding(Node *Ret_, Node *Name_, NodeArray Params_)
739761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KFunctionEncoding, NoParameterPack,
740761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No,
741761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*FunctionCache=*/Cache::Yes),
742761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Ret(Ret_), Name(Name_), Params(Params_) {
743761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *P : Params)
744761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, P->ParameterPackSize);
745761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Ret)
746761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, Ret->ParameterPackSize);
747761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
748761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
749761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &) const override { return true; }
750761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasFunctionSlow(OutputStream &) const override { return true; }
751761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
752761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Node *getName() { return const_cast<Node *>(Name); }
7530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
7550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Ret) {
7560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      Ret->printLeft(S);
757761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (!Ret->hasRHSComponent(S))
7580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        S += " ";
7590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
7600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Name->print(S);
7610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
7620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &S) const override {
7640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
765761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Params.printWithComma(S);
7660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
7670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Ret)
7680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      Ret->printRight(S);
7690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
7700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
7710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonenum FunctionRefQual : unsigned char {
7730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  FrefQualNone,
7740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  FrefQualLValue,
7750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  FrefQualRValue,
7760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
7770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass FunctionRefQualType : public Node {
7790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Fn;
7800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  FunctionRefQual Quals;
7810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  friend class FunctionQualType;
7830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
785414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  FunctionRefQualType(Node *Fn_, FunctionRefQual Quals_)
786761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KFunctionRefQualType, Fn_->ParameterPackSize,
787761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No,
788761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             /*FunctionCache=*/Cache::Yes),
789761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Fn(Fn_), Quals(Quals_) {}
790761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
791761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasFunctionSlow(OutputStream &) const override { return true; }
792761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &) const override { return true; }
7930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
7940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printQuals(OutputStream &S) const {
7950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Quals == FrefQualLValue)
7960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += " &";
7970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    else
7980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += " &&";
7990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
8000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override { Fn->printLeft(S); }
8020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &S) const override {
8040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Fn->printRight(S);
8050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    printQuals(S);
8060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
8070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
8080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass FunctionQualType final : public QualType {
8100024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
811414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  FunctionQualType(Node *Child_, Qualifiers Quals_)
812761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : QualType(Child_, Quals_) {
813761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    K = KFunctionQualType;
814761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
8150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override { Child->printLeft(S); }
8170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printRight(OutputStream &S) const override {
819761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Child->getKind() == KFunctionRefQualType) {
8200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      auto *RefQuals = static_cast<const FunctionRefQualType *>(Child);
8210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      RefQuals->Fn->printRight(S);
8220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      printQuals(S);
8230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      RefQuals->printQuals(S);
8240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    } else {
8250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      Child->printRight(S);
8260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      printQuals(S);
8270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
8280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
8290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
8300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass LiteralOperator : public Node {
8320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *OpName;
8330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
835761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  LiteralOperator(Node *OpName_)
836761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KLiteralOperator, OpName_->ParameterPackSize), OpName(OpName_) {}
8370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
8390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "operator\"\" ";
8400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    OpName->print(S);
8410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
8420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
8430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass SpecialName final : public Node {
8450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Special;
8460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Child;
8470024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8480024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
849761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  SpecialName(StringView Special_, Node* Child_)
850761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KSpecialName, Child_->ParameterPackSize), Special(Special_),
851761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Child(Child_) {}
8520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
8540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Special;
8550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Child->print(S);
8560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
8570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
8580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass CtorVtableSpecialName final : public Node {
8600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *FirstType;
8610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *SecondType;
8620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
864414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  CtorVtableSpecialName(Node *FirstType_, Node *SecondType_)
865761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KCtorVtableSpecialName, std::min(FirstType_->ParameterPackSize,
866761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                                              SecondType_->ParameterPackSize)),
867761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        FirstType(FirstType_), SecondType(SecondType_) {}
8680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
8700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "construction vtable for ";
8710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    FirstType->print(S);
8720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "-in-";
8730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    SecondType->print(S);
8740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
8750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
8760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass QualifiedName final : public Node {
8780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // qualifier::name
8790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Qualifier;
8800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Name;
8810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
883761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  QualifiedName(Node* Qualifier_, Node* Name_)
884761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KQualifiedName,
885761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington             std::min(Qualifier_->ParameterPackSize, Name_->ParameterPackSize)),
886761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Qualifier(Qualifier_), Name(Name_) {}
8870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView getBaseName() const override { return Name->getBaseName(); }
8890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
891761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Qualifier->print(S);
892761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    S += "::";
8930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Name->print(S);
8940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
8950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
8960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
8970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass EmptyName : public Node {
8980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
8990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  EmptyName() : Node(KEmptyName) {}
9000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &) const override {}
9010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
9020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
9030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass VectorType final : public Node {
9040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *BaseType;
9050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const NodeOrString Dimension;
9060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const bool IsPixel;
9070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
9080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
909414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  VectorType(NodeOrString Dimension_)
910414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington      : Node(KVectorType), BaseType(nullptr), Dimension(Dimension_),
911761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        IsPixel(true) {
912761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Dimension.isNode())
913761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = Dimension.asNode()->ParameterPackSize;
914761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
915414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  VectorType(Node *BaseType_, NodeOrString Dimension_)
916761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KVectorType, BaseType_->ParameterPackSize), BaseType(BaseType_),
917761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Dimension(Dimension_), IsPixel(false) {
918761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Dimension.isNode())
919761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize =
920761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington          std::min(ParameterPackSize, Dimension.asNode()->ParameterPackSize);
921761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
9220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
9230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
9240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (IsPixel) {
9250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "pixel vector[";
9260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += Dimension.asString();
9270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "]";
9280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    } else {
9290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      BaseType->print(S);
9300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += " vector[";
9310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      if (Dimension.isNode())
9320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        Dimension.asNode()->print(S);
9330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      else if (Dimension.isString())
9340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        S += Dimension.asString();
9350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "]";
9360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
9370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
9380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
9390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
940761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// An unexpanded parameter pack (either in the expression or type context). If
941761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// this AST is correct, this node will have a ParameterPackExpansion node above
942761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// it.
943761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington///
944761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// This node is created when some <template-args> are found that apply to an
945761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// <encoding>, and is stored in the TemplateParams table. In order for this to
946761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// appear in the final AST, it has to referenced via a <template-param> (ie,
947761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// T_).
948761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonclass ParameterPack final : public Node {
949761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  NodeArray Data;
950761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonpublic:
951761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  ParameterPack(NodeArray Data_)
952761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KParameterPack, static_cast<unsigned>(Data_.size())), Data(Data_) {
953761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ArrayCache = FunctionCache = RHSComponentCache = Cache::Unknown;
954761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (std::all_of(Data.begin(), Data.end(), [](Node* P) {
955761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington          return P->ArrayCache == Cache::No;
956761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        }))
957761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ArrayCache = Cache::No;
958761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (std::all_of(Data.begin(), Data.end(), [](Node* P) {
959761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington          return P->FunctionCache == Cache::No;
960761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        }))
961761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      FunctionCache = Cache::No;
962761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (std::all_of(Data.begin(), Data.end(), [](Node* P) {
963761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington          return P->RHSComponentCache == Cache::No;
964761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        }))
965761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      RHSComponentCache = Cache::No;
966761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
967761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
968761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasRHSComponentSlow(OutputStream &S) const override {
969761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    size_t Idx = S.CurrentPackIndex;
970761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Idx < Data.size() && Data[Idx]->hasRHSComponent(S);
971761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
972761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasArraySlow(OutputStream &S) const override {
973761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    size_t Idx = S.CurrentPackIndex;
974761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Idx < Data.size() && Data[Idx]->hasArray(S);
975761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
976761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  bool hasFunctionSlow(OutputStream &S) const override {
977761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    size_t Idx = S.CurrentPackIndex;
978761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return Idx < Data.size() && Data[Idx]->hasFunction(S);
979761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
980761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
981761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  void printLeft(OutputStream &S) const override {
982761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    size_t Idx = S.CurrentPackIndex;
983761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Idx < Data.size())
984761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      Data[Idx]->printLeft(S);
985761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
986761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  void printRight(OutputStream &S) const override {
987761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    size_t Idx = S.CurrentPackIndex;
988761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Idx < Data.size())
989761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      Data[Idx]->printRight(S);
990761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
991761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington};
992761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
993761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// A variadic template argument. This node represents an occurance of
994761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// J<something>E in some <template-args>. It isn't itself unexpanded, unless
995761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// one of it's Elements is. The parser inserts a ParameterPack into the
996761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// TemplateParams table if the <template-args> this pack belongs to apply to an
997761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// <encoding>.
998761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonclass TemplateArgumentPack final : public Node {
999761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  NodeArray Elements;
1000761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonpublic:
1001761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  TemplateArgumentPack(NodeArray Elements_)
1002761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KTemplateArgumentPack), Elements(Elements_) {
1003761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *E : Elements)
1004761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(E->ParameterPackSize, ParameterPackSize);
1005761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
10060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1007761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  NodeArray getElements() const { return Elements; }
1008761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1009761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  void printLeft(OutputStream &S) const override {
1010761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Elements.printWithComma(S);
1011761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
1012761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington};
1013761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1014761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// A pack expansion. Below this node, there are some unexpanded ParameterPacks
1015761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington/// which each have Child->ParameterPackSize elements.
1016761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonclass ParameterPackExpansion final : public Node {
1017761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  const Node *Child;
10180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
10190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1020761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  ParameterPackExpansion(Node* Child_)
1021761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KParameterPackExpansion), Child(Child_) {}
1022761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1023761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  const Node *getChild() const { return Child; }
10240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
10250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
1026761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    unsigned PackSize = Child->ParameterPackSize;
1027761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (PackSize == NoParameterPack) {
1028761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      Child->print(S);
1029761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      S += "...";
10300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return;
10310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
10320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1033761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    SwapAndRestore<unsigned> SavePackIndex(S.CurrentPackIndex, 0);
1034761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (unsigned I = 0; I != PackSize; ++I) {
1035761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (I != 0)
1036761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        S += ", ";
1037761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      S.CurrentPackIndex = I;
1038761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      Child->print(S);
1039761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    }
1040761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
1041761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington};
1042761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1043761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtoninline bool Node::isEmptyPackExpansion() const {
1044761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  if (getKind() == KParameterPackExpansion) {
1045761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    auto *AsPack = static_cast<const ParameterPackExpansion *>(this);
1046761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return AsPack->getChild()->isEmptyPackExpansion();
1047761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
1048761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  if (getKind() == KTemplateArgumentPack) {
1049761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    auto *AsTemplateArg = static_cast<const TemplateArgumentPack *>(this);
1050761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *E : AsTemplateArg->getElements())
1051761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (!E->isEmptyPackExpansion())
1052761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        return false;
1053761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    return true;
1054761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
1055761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  return ParameterPackSize == 0;
1056761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington}
1057761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1058761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonclass TemplateArgs final : public Node {
1059761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  NodeArray Params;
1060761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1061761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonpublic:
1062761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  TemplateArgs(NodeArray Params_) : Node(KTemplateArgs), Params(Params_) {
1063761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *P : Params)
1064761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, P->ParameterPackSize);
1065761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
1066761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
1067761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  NodeArray getParams() { return Params; }
10680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1069761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  void printLeft(OutputStream &S) const override {
10700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "<";
1071761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    bool FirstElement = true;
1072761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (size_t Idx = 0, E = Params.size(); Idx != E; ++Idx) {
1073761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (Params[Idx]->isEmptyPackExpansion())
1074761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        continue;
1075761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      if (!FirstElement)
1076761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        S += ", ";
1077761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      FirstElement = false;
1078761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      Params[Idx]->print(S);
1079761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    }
10800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (S.back() == '>')
10810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += " ";
10820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ">";
10830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
10840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
10850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
10860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass NameWithTemplateArgs final : public Node {
10870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // name<template_args>
10880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Name;
10890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *TemplateArgs;
10900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
10910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1092414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_)
1093761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KNameWithTemplateArgs, std::min(Name_->ParameterPackSize,
1094761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                                             TemplateArgs_->ParameterPackSize)),
1095761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Name(Name_), TemplateArgs(TemplateArgs_) {}
10960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
10970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView getBaseName() const override { return Name->getBaseName(); }
10980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
10990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
11000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Name->print(S);
11010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    TemplateArgs->print(S);
11020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
11030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
11040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass GlobalQualifiedName final : public Node {
11060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Child;
11070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1109761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  GlobalQualifiedName(Node* Child_)
1110761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KGlobalQualifiedName, Child_->ParameterPackSize), Child(Child_) {}
11110024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView getBaseName() const override { return Child->getBaseName(); }
11130024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
11150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "::";
11160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Child->print(S);
11170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
11180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
11190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass StdQualifiedName final : public Node {
11210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Child;
11220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1124761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  StdQualifiedName(Node *Child_)
1125761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KStdQualifiedName, Child_->ParameterPackSize), Child(Child_) {}
11260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView getBaseName() const override { return Child->getBaseName(); }
11280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
11300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "std::";
11310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Child->print(S);
11320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
11330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
11340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonenum class SpecialSubKind {
11360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  allocator,
11370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  basic_string,
11380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  string,
11390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  istream,
11400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  ostream,
11410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  iostream,
11420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
11430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass ExpandedSpecialSubstitution final : public Node {
11450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  SpecialSubKind SSK;
11460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11470024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1148414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  ExpandedSpecialSubstitution(SpecialSubKind SSK_)
1149414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington      : Node(KExpandedSpecialSubstitution), SSK(SSK_) {}
11500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView getBaseName() const override {
11520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    switch (SSK) {
11530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::allocator:
11540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("allocator");
11550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::basic_string:
11560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("basic_string");
11570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::string:
11580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("basic_string");
11590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::istream:
11600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("basic_istream");
11610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::ostream:
11620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("basic_ostream");
11630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::iostream:
11640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("basic_iostream");
11650024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
1166d25d9018b6c470126aa89c9c6b2c7e8e9c78ef5cErik Pilkington    _LIBCPP_UNREACHABLE();
11670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
11680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
11700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    switch (SSK) {
11710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::allocator:
11720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::basic_string<char, std::char_traits<char>, "
11730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington           "std::allocator<char> >";
11740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
11750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::basic_string:
11760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::string:
11770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::basic_string<char, std::char_traits<char>, "
11780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington           "std::allocator<char> >";
11790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
11800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::istream:
11810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::basic_istream<char, std::char_traits<char> >";
11820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
11830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::ostream:
11840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::basic_ostream<char, std::char_traits<char> >";
11850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
11860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::iostream:
11870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::basic_iostream<char, std::char_traits<char> >";
11880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
11890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
11900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
11910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
11920024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
11930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass SpecialSubstitution final : public Node {
11940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
11950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  SpecialSubKind SSK;
11960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1197414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  SpecialSubstitution(SpecialSubKind SSK_)
1198414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington      : Node(KSpecialSubstitution), SSK(SSK_) {}
11990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView getBaseName() const override {
12010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    switch (SSK) {
12020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::allocator:
12030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("allocator");
12040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::basic_string:
12050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("basic_string");
12060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::string:
12070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("string");
12080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::istream:
12090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("istream");
12100024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::ostream:
12110024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("ostream");
12120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::iostream:
12130024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      return StringView("iostream");
12140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
1215d25d9018b6c470126aa89c9c6b2c7e8e9c78ef5cErik Pilkington    _LIBCPP_UNREACHABLE();
12160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
12170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
12190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    switch (SSK) {
12200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::allocator:
12210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::allocator";
12220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
12230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::basic_string:
12240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::basic_string";
12250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
12260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::string:
12270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::string";
12280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
12290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::istream:
12300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::istream";
12310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
12320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::ostream:
12330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::ostream";
12340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
12350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    case SpecialSubKind::iostream:
12360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "std::iostream";
12370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      break;
12380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
12390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
12400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
12410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass CtorDtorName final : public Node {
12430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Basename;
12440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const bool IsDtor;
12450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1247414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  CtorDtorName(Node *Basename_, bool IsDtor_)
1248761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KCtorDtorName, Basename_->ParameterPackSize),
1249761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        Basename(Basename_), IsDtor(IsDtor_) {}
12500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
12520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (IsDtor)
12530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "~";
12540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Basename->getBaseName();
12550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
12560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
12570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass DtorName : public Node {
12590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Base;
12600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1262761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  DtorName(Node *Base_) : Node(KDtorName), Base(Base_) {
1263761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = Base->ParameterPackSize;
1264761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
12650024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
12670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "~";
12680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Base->printLeft(S);
12690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
12700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
12710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass UnnamedTypeName : public Node {
12730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Count;
12740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1276414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  UnnamedTypeName(StringView Count_) : Node(KUnnamedTypeName), Count(Count_) {}
12770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
12790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "'unnamed";
12800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Count;
12810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "\'";
12820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
12830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
12840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass LambdaTypeName : public Node {
12860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeArray Params;
12870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView Count;
12880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1290414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  LambdaTypeName(NodeArray Params_, StringView Count_)
1291761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Node(KLambdaTypeName), Params(Params_), Count(Count_) {
1292761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *P : Params)
1293761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, P->ParameterPackSize);
1294761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
12950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
12960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
12970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "\'lambda";
12980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Count;
12990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "\'(";
1300761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Params.printWithComma(S);
13010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
13020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
13030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
13040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington// -- Expression Nodes --
13060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonstruct Expr : public Node {
13080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Expr() : Node(KExpr) {}
13090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
13100024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13110024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass BinaryExpr : public Expr {
13120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *LHS;
13130024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView InfixOperator;
13140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *RHS;
13150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1317414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  BinaryExpr(Node *LHS_, StringView InfixOperator_, Node *RHS_)
1318761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : LHS(LHS_), InfixOperator(InfixOperator_), RHS(RHS_) {
1319761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize =
1320761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      std::min(LHS->ParameterPackSize, RHS->ParameterPackSize);
1321761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
13220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
13240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    // might be a template argument expression, then we need to disambiguate
13250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    // with parens.
13260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (InfixOperator == ">")
13270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "(";
13280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
13300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    LHS->print(S);
13310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ") ";
13320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += InfixOperator;
13330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += " (";
13340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    RHS->print(S);
13350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
13360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (InfixOperator == ">")
13380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += ")";
13390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
13400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
13410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass ArraySubscriptExpr : public Expr {
13430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Op1;
13440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Op2;
13450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1347761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  ArraySubscriptExpr(Node *Op1_, Node *Op2_) : Op1(Op1_), Op2(Op2_) {
1348761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize =
1349761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      std::min(Op1->ParameterPackSize, Op2->ParameterPackSize);
1350761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
13510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
13530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
13540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Op1->print(S);
13550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")[";
13560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Op2->print(S);
13570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "]";
13580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
13590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
13600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass PostfixExpr : public Expr {
13620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Child;
13630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Operand;
13640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13650024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1366414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  PostfixExpr(Node *Child_, StringView Operand_)
1367761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Child(Child_), Operand(Operand_) {
1368761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = Child->ParameterPackSize;
1369761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
13700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
13720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
13730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Child->print(S);
13740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
13750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Operand;
13760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
13770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
13780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass ConditionalExpr : public Expr {
13800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Cond;
13810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Then;
13820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Else;
13830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1385414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  ConditionalExpr(Node *Cond_, Node *Then_, Node *Else_)
1386761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Cond(Cond_), Then(Then_), Else(Else_) {
1387761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize =
1388761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        std::min(Cond->ParameterPackSize,
1389761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                 std::min(Then->ParameterPackSize, Else->ParameterPackSize));
1390761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
13910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
13920024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
13930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
13940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Cond->print(S);
13950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ") ? (";
13960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Then->print(S);
13970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ") : (";
13980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Else->print(S);
13990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
14000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
14010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
14020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass MemberExpr : public Expr {
14040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *LHS;
14050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Kind;
14060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *RHS;
14070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1409414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  MemberExpr(Node *LHS_, StringView Kind_, Node *RHS_)
1410761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : LHS(LHS_), Kind(Kind_), RHS(RHS_) {
1411761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize =
1412761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      std::min(LHS->ParameterPackSize, RHS->ParameterPackSize);
1413761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
14140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
14160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    LHS->print(S);
14170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Kind;
14180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    RHS->print(S);
14190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
14200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
14210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass EnclosingExpr : public Expr {
14230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Prefix;
14240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Infix;
14250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Postfix;
14260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1428414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  EnclosingExpr(StringView Prefix_, Node *Infix_, StringView Postfix_)
1429761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Prefix(Prefix_), Infix(Infix_), Postfix(Postfix_) {
1430761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = Infix->ParameterPackSize;
1431761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
14320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
14340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Prefix;
14350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Infix->print(S);
14360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Postfix;
14370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
14380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
14390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass CastExpr : public Expr {
14410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // cast_kind<to>(from)
14420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView CastKind;
14430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *To;
14440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *From;
14450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1447414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  CastExpr(StringView CastKind_, Node *To_, Node *From_)
1448761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : CastKind(CastKind_), To(To_), From(From_) {
1449761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize =
1450761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      std::min(To->ParameterPackSize, From->ParameterPackSize);
1451761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
14520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
14540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += CastKind;
14550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "<";
14560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    To->printLeft(S);
14570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ">(";
14580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    From->printLeft(S);
14590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
14600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
14610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
14620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass SizeofParamPackExpr : public Expr {
1464761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  Node *Pack;
14650024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1467761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  SizeofParamPackExpr(Node *Pack_) : Pack(Pack_) {}
14680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
14700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "sizeof...(";
1471761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackExpansion PPE(Pack);
1472761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    PPE.printLeft(S);
14730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
14740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
14750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
14760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass CallExpr : public Expr {
14780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Callee;
14790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeArray Args;
14800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1482761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  CallExpr(Node *Callee_, NodeArray Args_) : Callee(Callee_), Args(Args_) {
1483761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *P : Args)
1484761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, P->ParameterPackSize);
1485761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = std::min(ParameterPackSize, Callee->ParameterPackSize);
1486761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
14870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
14890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Callee->print(S);
14900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
1491761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Args.printWithComma(S);
14920024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
14930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
14940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
14950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
14960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass NewExpr : public Expr {
14970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // new (expr_list) type(init_list)
14980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeArray ExprList;
14990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Type;
15000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeArray InitList;
15010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool IsGlobal; // ::operator new ?
15020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool IsArray;  // new[] ?
15030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1504414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_,
1505414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington          bool IsArray_)
1506761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : ExprList(ExprList_), Type(Type_), InitList(InitList_),
1507761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        IsGlobal(IsGlobal_), IsArray(IsArray_) {
1508761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *E : ExprList)
1509761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, E->ParameterPackSize);
1510761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *I : InitList)
1511761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, I->ParameterPackSize);
1512761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (Type)
1513761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, Type->ParameterPackSize);
1514761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
15150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
15170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (IsGlobal)
15180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "::operator ";
15190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "new";
15200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (IsArray)
15210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "[]";
1522b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    S += ' ';
15230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (!ExprList.empty()) {
15240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "(";
1525761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ExprList.printWithComma(S);
15260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += ")";
15270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
15280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Type->print(S);
15290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (!InitList.empty()) {
15300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "(";
1531761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      InitList.printWithComma(S);
15320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += ")";
15330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
1534761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
15350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
15360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
15370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass DeleteExpr : public Expr {
15390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Op;
15400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool IsGlobal;
15410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool IsArray;
15420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1544414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_)
1545761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Op(Op_), IsGlobal(IsGlobal_), IsArray(IsArray_) {
1546761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = Op->ParameterPackSize;
1547761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
15480024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15490024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
15500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (IsGlobal)
15510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "::";
15520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "delete";
15530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (IsArray)
15540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "[] ";
15550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Op->print(S);
15560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
15570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
15580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass PrefixExpr : public Expr {
15600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView Prefix;
15610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Child;
15620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1564761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  PrefixExpr(StringView Prefix_, Node *Child_) : Prefix(Prefix_), Child(Child_) {
1565761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = Child->ParameterPackSize;
1566761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
15670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
15690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Prefix;
15700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
15710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Child->print(S);
15720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
15730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
15740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
15750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass FunctionParam : public Expr {
15770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView Number;
15780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1580414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  FunctionParam(StringView Number_) : Number(Number_) {}
15810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
15830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "fp";
15840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Number;
15850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
15860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
15870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass ConversionExpr : public Expr {
1589761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  const Node *Type;
15900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  NodeArray Expressions;
15910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
15920024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1593761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  ConversionExpr(const Node *Type_, NodeArray Expressions_)
1594761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      : Type(Type_), Expressions(Expressions_) {
1595761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    for (Node *E : Expressions)
1596761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington      ParameterPackSize = std::min(ParameterPackSize, E->ParameterPackSize);
1597761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = std::min(ParameterPackSize, Type->ParameterPackSize);
1598761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
15990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
16010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
1602761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Type->print(S);
16030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")(";
1604761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    Expressions.printWithComma(S);
16050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
16060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
16070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
16080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass ThrowExpr : public Expr {
16100024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const Node *Op;
16110024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1613761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  ThrowExpr(Node *Op_) : Op(Op_) {
1614761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = Op->ParameterPackSize;
1615761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
16160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
16180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "throw ";
16190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Op->print(S);
16200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
16210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
16220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass BoolExpr : public Expr {
16240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  bool Value;
16250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1627414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  BoolExpr(bool Value_) : Value(Value_) {}
16280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
16300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Value ? StringView("true") : StringView("false");
16310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
16320024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
16330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass IntegerCastExpr : public Expr {
16350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  // ty(integer)
16360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  Node *Ty;
16370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView Integer;
16380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1640761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  IntegerCastExpr(Node *Ty_, StringView Integer_) : Ty(Ty_), Integer(Integer_) {
1641761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    ParameterPackSize = Ty->ParameterPackSize;
1642761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington  }
16430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
16450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += "(";
16460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    Ty->print(S);
16470024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += ")";
16480024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    S += Integer;
16490024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
16500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
16510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass IntegerExpr : public Expr {
16530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView Type;
16540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  StringView Value;
16550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1657414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  IntegerExpr(StringView Type_, StringView Value_) : Type(Type_), Value(Value_) {}
16580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &S) const override {
16600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Type.size() > 3) {
16610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "(";
16620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += Type;
16630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += ")";
16640024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
16650024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Value[0] == 'n') {
16670024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += "-";
16680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += Value.dropFront(1);
16690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    } else
16700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += Value;
16710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (Type.size() <= 3)
16730024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      S += Type;
16740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
16750024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
16760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtontemplate <class Float> struct FloatData;
16780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtontemplate <class Float> class FloatExpr : public Expr {
16800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  const StringView Contents;
16810024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16820024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
1683414f1a58bbce2377dd142b09b97d88815b22059fErik Pilkington  FloatExpr(StringView Contents_) : Contents(Contents_) {}
16840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void printLeft(OutputStream &s) const override {
16860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    const char *first = Contents.begin();
16870024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    const char *last = Contents.end() + 1;
16880024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
16890024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    const size_t N = FloatData<Float>::mangled_size;
16900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (static_cast<std::size_t>(last - first) > N) {
16910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      last = first + N;
16920024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      union {
16930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        Float value;
16940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        char buf[sizeof(Float)];
16950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      };
16960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      const char *t = first;
16970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      char *e = buf;
16980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      for (; t != last; ++t, ++e) {
16990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0')
17000024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                                  : static_cast<unsigned>(*t - 'a' + 10);
17010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        ++t;
17020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0')
17030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                                  : static_cast<unsigned>(*t - 'a' + 10);
17040024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        *e = static_cast<char>((d1 << 4) + d0);
17050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      }
17060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
17070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      std::reverse(buf, e);
17080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington#endif
17090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      char num[FloatData<Float>::max_demangled_size] = {0};
17100024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      int n = snprintf(num, sizeof(num), FloatData<Float>::spec, value);
17110024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      s += StringView(num, num + n);
17120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
17130024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
17140024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
17150024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
17160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonclass BumpPointerAllocator {
17170024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  struct BlockMeta {
17180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    BlockMeta* Next;
17190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    size_t Current;
17200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  };
17219dd63d2a0b20ba61889e14a97b1b15f1851cefc0Erik Pilkington
17220024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  static constexpr size_t AllocSize = 4096;
17230024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  static constexpr size_t UsableAllocSize = AllocSize - sizeof(BlockMeta);
17240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
17250024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  alignas(16) char InitialBuffer[AllocSize];
17260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  BlockMeta* BlockList = nullptr;
17270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
17280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void grow() {
17290024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    char* NewMeta = new char[AllocSize];
17300024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    BlockList = new (NewMeta) BlockMeta{BlockList, 0};
17310024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
17329dd63d2a0b20ba61889e14a97b1b15f1851cefc0Erik Pilkington
17330024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void* allocateMassive(size_t NBytes) {
17340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    NBytes += sizeof(BlockMeta);
17350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    BlockMeta* NewMeta = reinterpret_cast<BlockMeta*>(new char[NBytes]);
17360024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0};
17370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return static_cast<void*>(NewMeta + 1);
17380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
17390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
17400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonpublic:
17410024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  BumpPointerAllocator()
17420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      : BlockList(new (InitialBuffer) BlockMeta{nullptr, 0}) {}
17430024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
17440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  void* allocate(size_t N) {
17450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    N = (N + 15u) & ~15u;
17460024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    if (N + BlockList->Current >= UsableAllocSize) {
17470024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      if (N > UsableAllocSize)
17480024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        return allocateMassive(N);
17490024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      grow();
17500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
17510024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    BlockList->Current += N;
17520024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    return static_cast<void*>(reinterpret_cast<char*>(BlockList + 1) +
17530024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                              BlockList->Current - N);
17540024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
17550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
17560024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  ~BumpPointerAllocator() {
17570024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    while (BlockList) {
17580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      BlockMeta* Tmp = BlockList;
17590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      BlockList = BlockList->Next;
17600024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington      if (reinterpret_cast<char*>(Tmp) != InitialBuffer)
17610024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        delete[] reinterpret_cast<char*>(Tmp);
17620024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
17630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington  }
17649dd63d2a0b20ba61889e14a97b1b15f1851cefc0Erik Pilkington};
17659dd63d2a0b20ba61889e14a97b1b15f1851cefc0Erik Pilkington
1766ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkingtontemplate <class T, size_t N>
1767ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkingtonclass PODSmallVector {
1768ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  static_assert(std::is_pod<T>::value,
1769ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                "T is required to be a plain old data type");
1770ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1771ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  T* First;
1772ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  T* Last;
1773ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  T* Cap;
1774ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  T Inline[N];
1775ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1776ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  bool isInline() const { return First == Inline; }
1777ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1778ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  void clearInline() {
1779ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    First = Inline;
1780ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Last = Inline;
1781ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Cap = Inline + N;
1782ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1783ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1784ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  void reserve(size_t NewCap) {
1785ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    size_t S = size();
1786ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    if (isInline()) {
1787ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      auto* Tmp = static_cast<T*>(std::malloc(NewCap * sizeof(T)));
1788ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      std::copy(First, Last, Tmp);
1789ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      First = Tmp;
1790ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    } else
1791ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      First = static_cast<T*>(std::realloc(First, NewCap * sizeof(T)));
1792ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Last = First + S;
1793ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Cap = First + NewCap;
1794ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1795ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1796ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkingtonpublic:
1797ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  PODSmallVector() : First(Inline), Last(First), Cap(Inline + N) {}
1798ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1799ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  PODSmallVector(const PODSmallVector&) = delete;
1800ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  PODSmallVector& operator=(const PODSmallVector&) = delete;
1801ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1802ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  PODSmallVector(PODSmallVector&& Other) : PODSmallVector() {
1803ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    if (Other.isInline()) {
1804ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      std::copy(Other.begin(), Other.end(), First);
1805ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      Last = First + Other.size();
1806ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      Other.clear();
1807ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      return;
1808ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    }
1809ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1810ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    First = Other.First;
1811ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Last = Other.Last;
1812ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Cap = Other.Cap;
1813ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Other.clearInline();
1814ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1815ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1816ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  PODSmallVector& operator=(PODSmallVector&& Other) {
1817ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    if (Other.isInline()) {
1818ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      if (!isInline()) {
1819ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington        std::free(First);
1820ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington        clearInline();
1821ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      }
1822ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      std::copy(Other.begin(), Other.end(), First);
1823ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      Last = First + Other.size();
1824ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      Other.clear();
1825ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      return *this;
1826ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    }
1827ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1828ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    if (isInline()) {
1829ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      First = Other.First;
1830ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      Last = Other.Last;
1831ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      Cap = Other.Cap;
1832ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      Other.clearInline();
1833ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      return *this;
1834ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    }
1835ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1836ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    std::swap(First, Other.First);
1837ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    std::swap(Last, Other.Last);
1838ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    std::swap(Cap, Other.Cap);
1839ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Other.clear();
1840ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    return *this;
1841ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1842ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1843ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  void push_back(const T& Elem) {
1844ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    if (Last == Cap)
1845ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      reserve(size() * 2);
1846ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    *Last++ = Elem;
1847ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1848ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1849ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  void pop_back() {
1850ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    assert(Last != First && "Popping empty vector!");
1851ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    --Last;
1852ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1853ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1854ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  void dropBack(size_t Index) {
1855ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    assert(Index <= size() && "dropBack() can't expand!");
1856ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Last = First + Index;
1857ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1858ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1859ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  T* begin() { return First; }
1860ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  T* end() { return Last; }
1861ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1862ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  bool empty() const { return First == Last; }
1863ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  size_t size() const { return static_cast<size_t>(Last - First); }
1864ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  T& back() {
1865ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    assert(Last != First && "Calling back() on empty vector!");
1866ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    return *(Last - 1);
1867ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1868ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  T& operator[](size_t Index) {
1869ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    assert(Index < size() && "Invalid access!");
1870ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    return *(begin() + Index);
1871ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1872ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  void clear() { Last = First; }
1873ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1874ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  ~PODSmallVector() {
1875ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    if (!isInline())
1876ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington      std::free(First);
1877ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington  }
1878ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington};
1879ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington
1880b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonstruct Db {
1881b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  const char *First;
1882b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  const char *Last;
18830024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
1884b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // Name stack, this is used by the parser to hold temporary names that were
1885b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // parsed. The parser colapses multiple names into new nodes to construct
1886b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // the AST. Once the parser is finished, names.size() == 1.
1887b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  PODSmallVector<Node *, 32> Names;
1888b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1889b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // Substitution table. Itanium supports name substitutions as a means of
1890b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // compression. The string "S42_" refers to the 44nd entry (base-36) in this
1891b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // table.
1892b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  PODSmallVector<Node *, 32> Subs;
1893b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1894b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // Template parameter table. Like the above, but referenced like "T42_".
1895b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // This has a smaller size compared to Subs and Names because it can be
1896b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // stored on the stack.
1897b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  PODSmallVector<Node *, 8> TemplateParams;
1898b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1899b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Qualifiers CV = QualNone;
1900b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  FunctionRefQual RefQuals = FrefQualNone;
1901b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  unsigned EncodingDepth = 0;
1902b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool ParsedCtorDtorCV = false;
1903b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool TagTemplates = true;
1904b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool FixForwardReferences = false;
1905b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool TryToParseTemplateArgs = true;
1906b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1907b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  BumpPointerAllocator ASTAllocator;
1908b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1909b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  template <class T, class... Args> T *make(Args &&... args) {
1910b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return new (ASTAllocator.allocate(sizeof(T)))
1911b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        T(std::forward<Args>(args)...);
1912b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
1913b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1914b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  template <class It> NodeArray makeNodeArray(It begin, It end) {
1915b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    size_t sz = static_cast<size_t>(end - begin);
1916b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    void *mem = ASTAllocator.allocate(sizeof(Node *) * sz);
1917b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    Node **data = new (mem) Node *[sz];
1918b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    std::copy(begin, end, data);
1919b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return NodeArray(data, sz);
1920b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
1921b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1922b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  NodeArray popTrailingNodeArray(size_t FromPosition) {
1923b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    assert(FromPosition <= Names.size());
1924b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    NodeArray res =
1925b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        makeNodeArray(Names.begin() + (long)FromPosition, Names.end());
1926b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    Names.dropBack(FromPosition);
1927b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return res;
1928b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
1929b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1930b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool consumeIf(StringView S) {
1931b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (StringView(First, Last).startsWith(S)) {
1932b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += S.size();
1933b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return true;
1934d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
1935b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return false;
1936b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
1937d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
1938b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool consumeIf(char C) {
1939b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (First != Last && *First == C) {
1940b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      ++First;
1941b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return true;
19420024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    }
1943b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return false;
1944b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
1945b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1946b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  char consume() { return First != Last ? *First++ : '\0'; }
1947b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1948b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  char look(unsigned Lookahead = 0) {
1949b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (static_cast<size_t>(Last - First) <= Lookahead)
1950b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return '\0';
1951b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return First[Lookahead];
1952b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
1953b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1954b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  size_t numLeft() const { return static_cast<size_t>(Last - First); }
1955b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1956b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  StringView parseNumber(bool AllowNegative = false);
1957b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Qualifiers parseCVQualifiers();
1958f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  bool parsePositiveInteger(size_t *Out);
1959f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  StringView parseBareSourceName();
1960b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1961b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  /// Parse the <expr> production.
1962b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *parseExpr();
1963b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *parsePrefixExpr(StringView Kind);
1964b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *parseBinaryExpr(StringView Kind);
1965b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *parseIntegerLiteral(StringView Lit);
1966b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *parseExprPrimary();
1967b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  template <class Float> Node *parseFloatingLiteral();
1968b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *parseFunctionParam();
1969b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *parseNewExpr();
1970b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *parseConversionExpr();
1971b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
1972f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  /// Parse the <type> production.
1973f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *parseType();
1974f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *parseFunctionType();
1975f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *parseVectorType();
1976f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *parseDecltype();
1977f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *parseArrayType();
1978f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *parsePointerToMemberType();
1979f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *parseClassEnumType();
1980f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
1981b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  // FIXME: remove this when all the parse_* functions have been rewritten.
1982b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  template <const char *(*parse_fn)(const char *, const char *, Db &)>
1983b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *legacyParse() {
1984b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    size_t BeforeType = Names.size();
1985b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    const char *OrigFirst = First;
1986b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    const char *T = parse_fn(First, Last, *this);
1987b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (T == OrigFirst || BeforeType + 1 != Names.size())
1988b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
1989b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    First = T;
1990b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    Node *R = Names.back();
1991b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    Names.pop_back();
1992b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return R;
1993b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
1994f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  template <const char *(*parse_fn)(const char *, const char *, Db &, bool *)>
1995f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *legacyParse() {
1996f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    size_t BeforeType = Names.size();
1997f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    const char *OrigFirst = First;
1998f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    const char *T = parse_fn(First, Last, *this, nullptr);
1999f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (T == OrigFirst || BeforeType + 1 != Names.size())
2000f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2001f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    First = T;
2002f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *R = Names.back();
2003f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Names.pop_back();
2004f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return R;
2005f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
20060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington};
20070024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
2008b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_expression(const char *first, const char *last, Db &db) {
2009b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  db.First = first;
2010b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  db.Last = last;
2011b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *R = db.parseExpr();
2012b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (R == nullptr)
2013b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return first;
2014b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  db.Names.push_back(R);
2015b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return db.First;
2016b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2017b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2018b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_expr_primary(const char *first, const char *last, Db &db) {
2019b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  db.First = first;
2020b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  db.Last = last;
2021b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *R = db.parseExprPrimary();
2022b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (R == nullptr)
2023b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return first;
2024b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  db.Names.push_back(R);
2025b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return db.First;
2026b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2027b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2028f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkingtonconst char *parse_type(const char *first, const char *last, Db &db) {
2029f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  db.First = first;
2030f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  db.Last = last;
2031f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *R = db.parseType();
2032f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (R == nullptr)
2033f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return first;
2034f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  db.Names.push_back(R);
2035f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return db.First;
2036f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2037f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2038f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkingtonconst char *parse_decltype(const char *first, const char *last, Db &db) {
2039f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  db.First = first;
2040f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  db.Last = last;
2041f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *R = db.parseDecltype();
2042f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (R == nullptr)
2043f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return first;
2044f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  db.Names.push_back(R);
2045f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return db.First;
2046f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2047f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2048b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_type(const char *first, const char *last, Db &db);
2049b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_encoding(const char *first, const char *last, Db &db);
2050b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_name(const char *first, const char *last, Db &db,
2051b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                       bool *ends_with_template_args = 0);
2052b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_template_args(const char *first, const char *last, Db &db);
2053b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_template_param(const char *, const char *, Db &);
2054b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_operator_name(const char *first, const char *last, Db &db);
2055b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_unqualified_name(const char *first, const char *last, Db &db);
2056b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_decltype(const char *first, const char *last, Db &db);
2057b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char *parse_unresolved_name(const char *, const char *, Db &);
2058f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkingtonconst char *parse_substitution(const char *, const char *, Db &);
2059b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2060b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <number> ::= [n] <non-negative decimal integer>
2061b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonStringView Db::parseNumber(bool AllowNegative) {
2062b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  const char *Tmp = First;
2063b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (AllowNegative)
2064b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    consumeIf('n');
2065b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (numLeft() == 0 || !std::isdigit(*First))
2066b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return StringView();
2067b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  while (numLeft() != 0 && std::isdigit(*First))
2068b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2069b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return StringView(Tmp, First);
2070b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2071b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2072f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <positive length number> ::= [0-9]*
2073f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkingtonbool Db::parsePositiveInteger(size_t *Out) {
2074f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  *Out = 0;
2075f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (look() < '0' || look() > '9')
2076f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return true;
2077f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  while (look() >= '0' && look() <= '9') {
2078f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    *Out *= 10;
2079f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    *Out += static_cast<size_t>(consume() - '0');
2080f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2081f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return false;
2082f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2083f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2084f23deca27d417faefd8c3dfe59e68c212fa63d68Erik PilkingtonStringView Db::parseBareSourceName() {
2085f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  size_t Int = 0;
2086f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (parsePositiveInteger(&Int) || numLeft() < Int)
2087f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return StringView();
2088f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  StringView R(First, First + Int);
2089f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  First += Int;
2090f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return R;
2091f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2092f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2093f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E
2094f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//
2095f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//  <ref-qualifier> ::= R                   # & ref-qualifier
2096f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//  <ref-qualifier> ::= O                   # && ref-qualifier
2097f23deca27d417faefd8c3dfe59e68c212fa63d68Erik PilkingtonNode *Db::parseFunctionType() {
2098f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf('F'))
2099f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2100f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  consumeIf('Y'); // extern "C"
2101f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *ReturnType = parseType();
2102f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (ReturnType == nullptr)
2103f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2104f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2105f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  FunctionRefQual ReferenceQualifier = FrefQualNone;
2106f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  size_t ParamsBegin = Names.size();
2107f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  while (true) {
2108f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (consumeIf('E'))
2109f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      break;
2110f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (consumeIf('v'))
2111f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      continue;
2112f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (consumeIf("RE")) {
2113f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      ReferenceQualifier = FrefQualLValue;
2114f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      break;
2115f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    }
2116f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (consumeIf("OE")) {
2117f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      ReferenceQualifier = FrefQualRValue;
2118f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      break;
2119f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    }
2120f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *T = parseType();
2121f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (T == nullptr)
2122f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2123f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Names.push_back(T);
2124f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2125f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2126f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  NodeArray Params = popTrailingNodeArray(ParamsBegin);
2127f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *Fn = make<FunctionType>(ReturnType, Params);
2128f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (ReferenceQualifier != FrefQualNone)
2129f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Fn = make<FunctionRefQualType>(Fn, ReferenceQualifier);
2130f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return Fn;
2131f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2132f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2133f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// extension:
2134f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <vector-type>           ::= Dv <positive dimension number> _ <extended element type>
2135f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//                         ::= Dv [<dimension expression>] _ <element type>
2136f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <extended element type> ::= <element type>
2137f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//                         ::= p # AltiVec vector pixel
2138f23deca27d417faefd8c3dfe59e68c212fa63d68Erik PilkingtonNode *Db::parseVectorType() {
2139f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf("Dv"))
2140f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2141f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (look() >= '1' && look() <= '9') {
2142f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    StringView DimensionNumber = parseNumber();
2143f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (!consumeIf('_'))
2144f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2145f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (consumeIf('p'))
2146f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<VectorType>(DimensionNumber);
2147f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *ElemType = parseType();
2148f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (ElemType == nullptr)
2149f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2150f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<VectorType>(ElemType, DimensionNumber);
2151f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2152f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2153f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf('_')) {
2154f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *DimExpr = parseExpr();
2155f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (!DimExpr)
2156f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2157f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (!consumeIf('_'))
2158f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2159f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *ElemType = parseType();
2160f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (!ElemType)
2161f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2162f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<VectorType>(ElemType, DimExpr);
2163f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2164f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *ElemType = parseType();
2165f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!ElemType)
2166f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2167f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return make<VectorType>(ElemType, StringView());
2168f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2169f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2170f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <decltype>  ::= Dt <expression> E  # decltype of an id-expression or class member access (C++0x)
2171f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= DT <expression> E  # decltype of an expression (C++0x)
2172f23deca27d417faefd8c3dfe59e68c212fa63d68Erik PilkingtonNode *Db::parseDecltype() {
2173f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf('D'))
2174f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2175f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf('t') && !consumeIf('T'))
2176f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2177f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *E = parseExpr();
2178f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (E == nullptr)
2179f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2180f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf('E'))
2181f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2182f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return make<EnclosingExpr>("decltype(", E, ")");
2183f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2184f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2185f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <array-type> ::= A <positive dimension number> _ <element type>
2186f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//              ::= A [<dimension expression>] _ <element type>
2187f23deca27d417faefd8c3dfe59e68c212fa63d68Erik PilkingtonNode *Db::parseArrayType() {
2188f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf('A'))
2189f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2190f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2191f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (std::isdigit(look())) {
2192f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    StringView Dimension = parseNumber();
2193f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (!consumeIf('_'))
2194f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2195f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *Ty = parseType();
2196f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Ty == nullptr)
2197f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2198f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<ArrayType>(Ty, Dimension);
2199f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2200f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2201f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf('_')) {
2202f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *DimExpr = parseExpr();
2203f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (DimExpr == nullptr)
2204f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2205f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (!consumeIf('_'))
2206f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2207f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *ElementType = parseType();
2208f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (ElementType == nullptr)
2209f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2210f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<ArrayType>(ElementType, DimExpr);
2211f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2212f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2213f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *Ty = parseType();
2214f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (Ty == nullptr)
2215f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2216f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return make<ArrayType>(Ty);
2217f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2218f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2219f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <pointer-to-member-type> ::= M <class type> <member type>
2220f23deca27d417faefd8c3dfe59e68c212fa63d68Erik PilkingtonNode *Db::parsePointerToMemberType() {
2221f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (!consumeIf('M'))
2222f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2223f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *ClassType = parseType();
2224f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (ClassType == nullptr)
2225f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2226f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *MemberType = parseType();
2227f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (MemberType == nullptr)
2228f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return nullptr;
2229f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return make<PointerToMemberType>(ClassType, MemberType);
2230f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2231f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2232f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <class-enum-type> ::= <name>     # non-dependent type name, dependent type name, or dependent typename-specifier
2233f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//                   ::= Ts <name>  # dependent elaborated type specifier using 'struct' or 'class'
2234f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//                   ::= Tu <name>  # dependent elaborated type specifier using 'union'
2235f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//                   ::= Te <name>  # dependent elaborated type specifier using 'enum'
2236f23deca27d417faefd8c3dfe59e68c212fa63d68Erik PilkingtonNode *Db::parseClassEnumType() {
2237f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  // FIXME: try to parse the elaborated type specifiers here!
2238f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return legacyParse<parse_name>();
2239f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2240f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2241f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <type>      ::= <builtin-type>
2242f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <qualified-type>
2243f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <function-type>
2244f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <class-enum-type>
2245f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <array-type>
2246f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <pointer-to-member-type>
2247f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <template-param>
2248f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <template-template-param> <template-args>
2249f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <decltype>
2250f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= P <type>        # pointer
2251f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= R <type>        # l-value reference
2252f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= O <type>        # r-value reference (C++11)
2253f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= C <type>        # complex pair (C99)
2254f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= G <type>        # imaginary (C99)
2255f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//             ::= <substitution>  # See Compression below
2256f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// extension   ::= U <objc-name> <objc-type>  # objc-type<identifier>
2257f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// extension   ::= <vector-type> # <vector-type> starts with Dv
2258f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington//
2259f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier>  # k0 = 9 + <number of digits in k1> + k1
2260f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington// <objc-type> ::= <source-name>  # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
2261f23deca27d417faefd8c3dfe59e68c212fa63d68Erik PilkingtonNode *Db::parseType() {
2262f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *Result = nullptr;
2263f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2264f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  switch (look()) {
2265f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= <qualified-type>
2266f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'r':
2267f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'V':
2268f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'K': {
2269f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Qualifiers Q = parseCVQualifiers();
2270f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    bool AppliesToFunction = look() == 'F';
2271f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2272f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *Child = parseType();
2273f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Child == nullptr)
2274f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2275f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2276f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (AppliesToFunction)
2277f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Result = make<FunctionQualType>(Child, Q);
2278f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    else
2279f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Result = make<QualType>(Child, Q);
2280f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2281f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // Itanium C++ ABI 5.1.5.3:
2282f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //   For the purposes of substitution, the CV-qualifiers and ref-qualifier
2283f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //   of a function type are an indivisible part of the type.
2284f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (AppliesToFunction)
2285f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return Result;
2286f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2287f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2288f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  // <extended-qualifier> ::= U <source-name> [<template-args>] # vendor extended type qualifier
2289f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'U': {
2290f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // FIXME: We should fold this into the cvr qualifier parsing above. This
2291f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // currently adds too many entries into the substitution table if multiple
2292f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // qualifiers are present on the same type, as all the qualifiers on a type
2293f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // should just get one entry in the substitution table.
2294f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2295f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    StringView Qual = parseBareSourceName();
2296f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Qual.empty())
2297f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2298f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2299f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // FIXME parse the optional <template-args> here!
2300f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2301f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = parseType();
2302f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Result == nullptr)
2303f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2304f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2305f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // extension   ::= U <objc-name> <objc-type>  # objc-type<identifier>
2306f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Qual.startsWith("objcproto")) {
2307f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      StringView ProtoSourceName = Qual.dropFront(std::strlen("objcproto"));
2308f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      StringView Proto;
2309f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      {
2310f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        SwapAndRestore<const char *> SaveFirst(First, ProtoSourceName.begin()),
2311f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington                                     SaveLast(Last, ProtoSourceName.end());
2312f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        Proto = parseBareSourceName();
2313f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      }
2314f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      if (Proto.empty())
2315f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        return nullptr;
2316f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Result = make<ObjCProtoName>(Result, Proto);
2317f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    } else
2318f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Result = make<VendorExtQualType>(Result, Qual);
2319f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2320f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2321f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  // <builtin-type> ::= v    # void
2322f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'v':
2323f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2324f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("void");
2325f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= w    # wchar_t
2326f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'w':
2327f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2328f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("wchar_t");
2329f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= b    # bool
2330f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'b':
2331f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2332f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("bool");
2333f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= c    # char
2334f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'c':
2335f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2336f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("char");
2337f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= a    # signed char
2338f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'a':
2339f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2340f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("signed char");
2341f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= h    # unsigned char
2342f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'h':
2343f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2344f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("unsigned char");
2345f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= s    # short
2346f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 's':
2347f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2348f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("short");
2349f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= t    # unsigned short
2350f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 't':
2351f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2352f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("unsigned short");
2353f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= i    # int
2354f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'i':
2355f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2356f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("int");
2357f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= j    # unsigned int
2358f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'j':
2359f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2360f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("unsigned int");
2361f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= l    # long
2362f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'l':
2363f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2364f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("long");
2365f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= m    # unsigned long
2366f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'm':
2367f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2368f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("unsigned long");
2369f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= x    # long long, __int64
2370f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'x':
2371f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2372f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("long long");
2373f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= y    # unsigned long long, __int64
2374f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'y':
2375f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2376f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("unsigned long long");
2377f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= n    # __int128
2378f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'n':
2379f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2380f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("__int128");
2381f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= o    # unsigned __int128
2382f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'o':
2383f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2384f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("unsigned __int128");
2385f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= f    # float
2386f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'f':
2387f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2388f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("float");
2389f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= d    # double
2390f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'd':
2391f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2392f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("double");
2393f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= e    # long double, __float80
2394f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'e':
2395f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2396f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("long double");
2397f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= g    # __float128
2398f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'g':
2399f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2400f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("__float128");
2401f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //                ::= z    # ellipsis
2402f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'z':
2403f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2404f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>("...");
2405f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2406f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  // <builtin-type> ::= u <source-name>    # vendor extended type
2407f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'u': {
2408f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2409f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    StringView Res = parseBareSourceName();
2410f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Res.empty())
2411f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2412f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    return make<NameType>(Res);
2413f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2414f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'D':
2415f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    switch (look(1)) {
2416f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= Dd   # IEEE 754r decimal floating point (64 bits)
2417f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'd':
2418f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2419f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("decimal64");
2420f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= De   # IEEE 754r decimal floating point (128 bits)
2421f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'e':
2422f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2423f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("decimal128");
2424f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= Df   # IEEE 754r decimal floating point (32 bits)
2425f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'f':
2426f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2427f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("decimal32");
2428f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= Dh   # IEEE 754r half-precision floating point (16 bits)
2429f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'h':
2430f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2431f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("decimal16");
2432f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= Di   # char32_t
2433f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'i':
2434f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2435f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("char32_t");
2436f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= Ds   # char16_t
2437f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 's':
2438f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2439f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("char16_t");
2440f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= Da   # auto (in dependent new-expressions)
2441f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'a':
2442f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2443f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("auto");
2444f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= Dc   # decltype(auto)
2445f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'c':
2446f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2447f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("decltype(auto)");
2448f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                ::= Dn   # std::nullptr_t (i.e., decltype(nullptr))
2449f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'n':
2450f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2451f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return make<NameType>("std::nullptr_t");
2452f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2453f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //             ::= <decltype>
2454f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 't':
2455f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'T': {
2456f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Result = parseDecltype();
2457f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      break;
2458f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    }
2459f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // extension   ::= <vector-type> # <vector-type> starts with Dv
2460f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'v': {
2461f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Result = parseVectorType();
2462f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      break;
2463f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    }
2464f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //           ::= Dp <type>       # pack expansion (C++0x)
2465f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    case 'p': {
2466f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      First += 2;
2467f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *Child = parseType();
2468f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      if (!Child)
2469f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        return nullptr;
2470f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Result = make<ParameterPackExpansion>(Child);
2471f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      break;
2472f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    }
2473f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    }
2474f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2475f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= <function-type>
2476f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'F': {
2477f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = parseFunctionType();
2478f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2479f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2480f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= <array-type>
2481f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'A': {
2482f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = parseArrayType();
2483f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2484f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2485f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= <pointer-to-member-type>
2486f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'M': {
2487f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = parsePointerToMemberType();
2488f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2489f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2490f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= <template-param>
2491f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'T': {
2492f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = legacyParse<parse_template_param>();
2493f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Result == nullptr)
2494f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2495f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2496f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // Result could be either of:
2497f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //   <type>        ::= <template-param>
2498f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //   <type>        ::= <template-template-param> <template-args>
2499f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //
2500f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //   <template-template-param> ::= <template-param>
2501f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //                             ::= <substitution>
2502f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    //
2503f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // If this is followed by some <template-args>, and we're permitted to
2504f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    // parse them, take the second production.
2505f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2506f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (TryToParseTemplateArgs && look() == 'I') {
2507f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *TA = legacyParse<parse_template_args>();
2508f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      if (TA == nullptr)
2509f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        return nullptr;
2510f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Result = make<NameWithTemplateArgs>(Result, TA);
2511f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    }
2512f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2513f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2514f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= P <type>        # pointer
2515f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'P': {
2516f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2517f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *Ptr = parseType();
2518f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Ptr == nullptr)
2519f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2520f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = make<PointerType>(Ptr);
2521f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2522f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2523f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= R <type>        # l-value reference
2524f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'R': {
2525f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2526f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *Ref = parseType();
2527f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Ref == nullptr)
2528f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2529f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = make<LValueReferenceType>(Ref);
2530f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2531f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2532f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= O <type>        # r-value reference (C++11)
2533f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'O': {
2534f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2535f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *Ref = parseType();
2536f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (Ref == nullptr)
2537f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2538f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = make<RValueReferenceType>(Ref);
2539f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2540f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2541f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= C <type>        # complex pair (C99)
2542f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'C': {
2543f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2544f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *P = parseType();
2545f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (P == nullptr)
2546f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return nullptr;
2547f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = make<PostfixQualifiedType>(P, " complex");
2548f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2549f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2550f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= G <type>        # imaginary (C99)
2551f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'G': {
2552f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    ++First;
2553f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *P = parseType();
2554f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (P == nullptr)
2555f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return P;
2556f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = make<PostfixQualifiedType>(P, " imaginary");
2557f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2558f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2559f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //             ::= <substitution>  # See Compression below
2560f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  case 'S': {
2561f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    if (look(1) && look(1) != 't') {
2562f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *Sub = legacyParse<parse_substitution>();
2563f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      if (Sub == nullptr)
2564f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        return nullptr;
2565f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2566f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      // Sub could be either of:
2567f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      //   <type>        ::= <substitution>
2568f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      //   <type>        ::= <template-template-param> <template-args>
2569f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      //
2570f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      //   <template-template-param> ::= <template-param>
2571f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      //                             ::= <substitution>
2572f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      //
2573f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      // If this is followed by some <template-args>, and we're permitted to
2574f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      // parse them, take the second production.
2575f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2576f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      if (TryToParseTemplateArgs && look() == 'I') {
2577f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        Node *TA = legacyParse<parse_template_args>();
2578f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        if (TA == nullptr)
2579f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington          return nullptr;
2580f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        Result = make<NameWithTemplateArgs>(Sub, TA);
2581f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington        break;
2582f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      }
2583f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2584f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      // If all we parsed was a substitution, don't re-insert into the
2585f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      // substitution table.
2586f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      return Sub;
2587f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    }
2588f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    _LIBCPP_FALLTHROUGH();
2589f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2590f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  //        ::= <class-enum-type>
2591f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  default: {
2592f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Result = parseClassEnumType();
2593f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    break;
2594f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2595f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  }
2596f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2597f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  // If we parsed a type, insert it into the substitution table. Note that all
2598f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  // <builtin-type>s and <substitution>s have already bailed out, because they
2599f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  // don't get substitutions.
2600f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  if (Result != nullptr)
2601f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Subs.push_back(Result);
2602f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  return Result;
2603f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington}
2604f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington
2605b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode *Db::parsePrefixExpr(StringView Kind) {
2606b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *E = parseExpr();
2607b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (E == nullptr)
2608b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2609b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return make<PrefixExpr>(Kind, E);
2610b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2611b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2612b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode *Db::parseBinaryExpr(StringView Kind) {
2613b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *LHS = parseExpr();
2614b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (LHS == nullptr)
2615b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2616b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *RHS = parseExpr();
2617b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (RHS == nullptr)
2618b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2619b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return make<BinaryExpr>(LHS, Kind, RHS);
2620b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2621b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2622b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode *Db::parseIntegerLiteral(StringView Lit) {
2623b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  StringView Tmp = parseNumber(true);
2624b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (!Tmp.empty() && consumeIf('E'))
2625b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return make<IntegerExpr>(Lit, Tmp);
2626b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return nullptr;
2627b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2628b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2629b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonQualifiers Db::parseCVQualifiers() {
2630b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Qualifiers CVR = QualNone;
2631b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (consumeIf('r'))
2632b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    addQualifiers(CVR, QualRestrict);
2633b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (consumeIf('V'))
2634b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    addQualifiers(CVR, QualVolatile);
2635b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (consumeIf('K'))
2636b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    addQualifiers(CVR, QualConst);
2637b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return CVR;
2638b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2639b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2640b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <function-param> ::= fp <top-level CV-Qualifiers> _                                     # L == 0, first parameter
2641b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                  ::= fp <top-level CV-Qualifiers> <parameter-2 non-negative number> _   # L == 0, second and later parameters
2642b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                  ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> _         # L > 0, first parameter
2643b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                  ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> <parameter-2 non-negative number> _   # L > 0, second and later parameters
2644b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode *Db::parseFunctionParam() {
2645b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (consumeIf("fp")) {
2646b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    parseCVQualifiers();
2647b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    StringView Num = parseNumber();
2648b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (!consumeIf('_'))
2649b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
2650b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return make<FunctionParam>(Num);
2651b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
2652b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (consumeIf("fL")) {
2653b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (parseNumber().empty())
2654b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
2655b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (!consumeIf('p'))
2656b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
2657b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    parseCVQualifiers();
2658b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    StringView Num = parseNumber();
2659b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (!consumeIf('_'))
2660b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
2661b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return make<FunctionParam>(Num);
2662b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
2663b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return nullptr;
2664b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2665b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2666b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// [gs] nw <expression>* _ <type> E                     # new (expr-list) type
2667b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// [gs] nw <expression>* _ <type> <initializer>         # new (expr-list) type (init)
2668b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// [gs] na <expression>* _ <type> E                     # new[] (expr-list) type
2669b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// [gs] na <expression>* _ <type> <initializer>         # new[] (expr-list) type (init)
2670b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <initializer> ::= pi <expression>* E                 # parenthesized initialization
2671b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode *Db::parseNewExpr() {
2672b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool Global = consumeIf("gs");
2673b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool IsArray = look(1) == 'a';
2674b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (!consumeIf("nw") && !consumeIf("na"))
2675b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2676b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  size_t Exprs = Names.size();
2677b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  while (!consumeIf('_')) {
2678b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    Node *Ex = parseExpr();
2679b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (Ex == nullptr)
2680b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
2681b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    Names.push_back(Ex);
2682b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
2683b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  NodeArray ExprList = popTrailingNodeArray(Exprs);
2684f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington  Node *Ty = parseType();
2685b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (Ty == nullptr)
2686b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return Ty;
2687b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (consumeIf("pi")) {
2688b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    size_t InitsBegin = Names.size();
2689b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    while (!consumeIf('E')) {
2690b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Init = parseExpr();
2691b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Init == nullptr)
2692b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Init;
2693b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Names.push_back(Init);
2694b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2695b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    NodeArray Inits = popTrailingNodeArray(InitsBegin);
2696b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return make<NewExpr>(ExprList, Ty, Inits, Global, IsArray);
2697b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  } else if (!consumeIf('E'))
2698b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2699b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return make<NewExpr>(ExprList, Ty, NodeArray(), Global, IsArray);
2700b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2701b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2702b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// cv <type> <expression>                               # conversion with one argument
2703b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// cv <type> _ <expression>* E                          # conversion with a different number of arguments
2704b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode *Db::parseConversionExpr() {
2705b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (!consumeIf("cv"))
2706b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2707b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *Ty;
2708b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  {
2709b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    SwapAndRestore<bool> SaveTemp(TryToParseTemplateArgs, false);
2710f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Ty = parseType();
2711b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
2712b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2713b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (Ty == nullptr)
2714b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2715b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2716b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (consumeIf('_')) {
2717b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    size_t ExprsBegin = Names.size();
2718b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    while (!consumeIf('E')) {
2719b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *E = parseExpr();
2720b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (E == nullptr)
2721b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return E;
2722b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Names.push_back(E);
2723b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2724b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    NodeArray Exprs = popTrailingNodeArray(ExprsBegin);
2725b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return make<ConversionExpr>(Ty, Exprs);
2726b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
2727b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2728b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  Node *E[1] = {parseExpr()};
2729b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (E[0] == nullptr)
2730b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2731b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return make<ConversionExpr>(Ty, makeNodeArray(E, E + 1));
2732b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2733b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2734b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <expr-primary> ::= L <type> <value number> E                          # integer literal
2735b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                ::= L <type> <value float> E                           # floating literal
2736b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                ::= L <string type> E                                  # string literal
2737b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                ::= L <nullptr type> E                                 # nullptr literal (i.e., "LDnE")
2738b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// FIXME:         ::= L <type> <real-part float> _ <imag-part float> E   # complex floating point literal (C 2000)
2739b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                ::= L <mangled-name> E                                 # external name
2740b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode *Db::parseExprPrimary() {
2741b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (!consumeIf('L'))
2742b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2743b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  switch (look()) {
2744b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'w':
2745b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2746b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("wchar_t");
2747b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'b':
2748b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (consumeIf("b0E"))
2749b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<BoolExpr>(0);
2750b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (consumeIf("b1E"))
2751b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<BoolExpr>(1);
2752b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2753b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'c':
2754b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2755b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("char");
2756b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'a':
2757b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2758b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("signed char");
2759b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'h':
2760b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2761b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("unsigned char");
2762b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 's':
2763b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2764b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("short");
2765b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 't':
2766b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2767b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("unsigned short");
2768b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'i':
2769b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2770b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("");
2771b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'j':
2772b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2773b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("u");
2774b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'l':
2775b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2776b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("l");
2777b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'm':
2778b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2779b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("ul");
2780b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'x':
2781b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2782b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("ll");
2783b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'y':
2784b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2785b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("ull");
2786b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'n':
2787b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2788b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("__int128");
2789b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'o':
2790b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2791b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseIntegerLiteral("unsigned __int128");
2792b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'f':
2793b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2794b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseFloatingLiteral<float>();
2795b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'd':
2796b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2797b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseFloatingLiteral<double>();
2798b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'e':
2799b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    ++First;
2800b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseFloatingLiteral<long double>();
2801b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '_':
2802b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (consumeIf("_Z")) {
2803b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *R = legacyParse<parse_encoding>();
2804b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (R != nullptr && consumeIf('E'))
2805b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return R;
2806b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2807b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2808b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'T':
2809b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    // Invalid mangled name per
2810b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    //   http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
2811b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2812b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  default: {
2813b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    // might be named type
2814f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington    Node *T = parseType();
2815b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (T == nullptr)
2816b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
2817b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    StringView N = parseNumber();
2818b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (!N.empty()) {
2819b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (!consumeIf('E'))
2820b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
2821b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<IntegerCastExpr>(T, N);
2822b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2823b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (consumeIf('E'))
2824b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return T;
2825b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2826b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
2827b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
2828b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
2829b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2830b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <expression> ::= <unary operator-name> <expression>
2831b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= <binary operator-name> <expression> <expression>
2832b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= <ternary operator-name> <expression> <expression> <expression>
2833b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= cl <expression>+ E                                   # call
2834b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= cv <type> <expression>                               # conversion with one argument
2835b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= cv <type> _ <expression>* E                          # conversion with a different number of arguments
2836b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= [gs] nw <expression>* _ <type> E                     # new (expr-list) type
2837b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= [gs] nw <expression>* _ <type> <initializer>         # new (expr-list) type (init)
2838b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= [gs] na <expression>* _ <type> E                     # new[] (expr-list) type
2839b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= [gs] na <expression>* _ <type> <initializer>         # new[] (expr-list) type (init)
2840b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= [gs] dl <expression>                                 # delete expression
2841b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= [gs] da <expression>                                 # delete[] expression
2842b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= pp_ <expression>                                     # prefix ++
2843b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= mm_ <expression>                                     # prefix --
2844b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= ti <type>                                            # typeid (type)
2845b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= te <expression>                                      # typeid (expression)
2846b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= dc <type> <expression>                               # dynamic_cast<type> (expression)
2847b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= sc <type> <expression>                               # static_cast<type> (expression)
2848b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= cc <type> <expression>                               # const_cast<type> (expression)
2849b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= rc <type> <expression>                               # reinterpret_cast<type> (expression)
2850b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= st <type>                                            # sizeof (a type)
2851b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= sz <expression>                                      # sizeof (an expression)
2852b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= at <type>                                            # alignof (a type)
2853b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= az <expression>                                      # alignof (an expression)
2854b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= nx <expression>                                      # noexcept (expression)
2855b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= <template-param>
2856b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= <function-param>
2857b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= dt <expression> <unresolved-name>                    # expr.name
2858b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= pt <expression> <unresolved-name>                    # expr->name
2859b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= ds <expression> <expression>                         # expr.*expr
2860b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= sZ <template-param>                                  # size of a parameter pack
2861b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= sZ <function-param>                                  # size of a function parameter pack
2862b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= sp <expression>                                      # pack expansion
2863b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= tw <expression>                                      # throw expression
2864b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= tr                                                   # throw with no operand (rethrow)
2865b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= <unresolved-name>                                    # f(p), N::f(p), ::f(p),
2866b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                                                                       # freestanding dependent name (e.g., T::x),
2867b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                                                                       # objectless nonstatic member reference
2868b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= fL <binary-operator-name> <expression> <expression>
2869b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= fR <binary-operator-name> <expression> <expression>
2870b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= fl <binary-operator-name> <expression>
2871b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= fr <binary-operator-name> <expression>
2872b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//              ::= <expr-primary>
2873b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode *Db::parseExpr() {
2874b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  bool Global = consumeIf("gs");
2875b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (numLeft() < 2)
2876b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2877b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
2878b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  switch (*First) {
2879b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'L':
2880b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseExprPrimary();
2881b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'T':
2882b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return legacyParse<parse_template_param>();
2883b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'f':
2884b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parseFunctionParam();
2885b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'a':
2886b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
2887b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'a':
2888b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2889b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("&&");
2890b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'd':
2891b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2892b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parsePrefixExpr("&");
2893b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'n':
2894b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2895b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("&");
2896b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'N':
2897b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2898b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("&=");
2899b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'S':
2900b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2901b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("=");
2902b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 't': {
2903b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2904f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *Ty = parseType();
2905b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ty == nullptr)
2906b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
2907b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<EnclosingExpr>("alignof (", Ty, ")");
2908b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2909b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'z': {
2910b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2911b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ty = parseExpr();
2912b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ty == nullptr)
2913b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
2914b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<EnclosingExpr>("alignof (", Ty, ")");
2915b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2916b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2917b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2918b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'c':
2919b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
2920b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    // cc <type> <expression>                               # const_cast<type>(expression)
2921b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'c': {
2922b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2923f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *Ty = parseType();
2924b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ty == nullptr)
2925b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ty;
2926b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
2927b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
2928b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
2929b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<CastExpr>("const_cast", Ty, Ex);
2930b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2931b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    // cl <expression>+ E                                   # call
2932b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'l': {
2933b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2934b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Callee = parseExpr();
2935b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Callee == nullptr)
2936b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Callee;
2937b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      size_t ExprsBegin = Names.size();
2938b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      while (!consumeIf('E')) {
2939b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        Node *E = parseExpr();
2940b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if (E == nullptr)
2941b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington          return E;
2942b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        Names.push_back(E);
2943b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      }
2944b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<CallExpr>(Callee, popTrailingNodeArray(ExprsBegin));
2945b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2946b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'm':
2947b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2948b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr(",");
2949b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'o':
2950b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2951b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parsePrefixExpr("~");
2952b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'v':
2953b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseConversionExpr();
2954b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2955b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
2956b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'd':
2957b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
2958b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'a': {
2959b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2960b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
2961b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
2962b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
2963b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<DeleteExpr>(Ex, Global, /*is_array=*/true);
2964b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2965b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'c': {
2966b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2967f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *T = parseType();
2968b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (T == nullptr)
2969b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return T;
2970b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
2971b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
2972b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
2973b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<CastExpr>("dynamic_cast", T, Ex);
2974b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2975b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'e':
2976b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2977b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parsePrefixExpr("*");
2978b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'l': {
2979b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2980b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *E = parseExpr();
2981b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (E == nullptr)
2982b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return E;
2983b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<DeleteExpr>(E, Global, /*is_array=*/false);
2984b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2985b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'n':
2986b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return legacyParse<parse_unresolved_name>();
2987b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 's': {
2988b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2989b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *LHS = parseExpr();
2990b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (LHS == nullptr)
2991b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
2992b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *RHS = parseExpr();
2993b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (RHS == nullptr)
2994b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
2995b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<MemberExpr>(LHS, ".*", RHS);
2996b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
2997b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 't': {
2998b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
2999b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *LHS = parseExpr();
3000b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (LHS == nullptr)
3001b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return LHS;
3002b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *RHS = parseExpr();
3003b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (RHS == nullptr)
3004b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
3005b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<MemberExpr>(LHS, ".", RHS);
3006b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3007b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'v':
3008b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3009b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("/");
3010b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'V':
3011b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3012b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("/=");
3013b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3014b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3015b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'e':
3016b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3017b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'o':
3018b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3019b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("^");
3020b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'O':
3021b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3022b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("^=");
3023b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'q':
3024b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3025b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("==");
3026b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3027b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3028b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'g':
3029b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3030b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'e':
3031b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3032b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr(">=");
3033b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 't':
3034b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3035b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr(">");
3036b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3037b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3038b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'i':
3039b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (First[1] == 'x') {
3040b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3041b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Base = parseExpr();
3042b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Base == nullptr)
3043b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
3044b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Index = parseExpr();
3045b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Index == nullptr)
3046b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Index;
3047b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<ArraySubscriptExpr>(Base, Index);
3048b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3049b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3050b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'l':
3051b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3052b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'e':
3053b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3054b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("<=");
3055b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 's':
3056b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3057b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("<<");
3058b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'S':
3059b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3060b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("<<=");
3061b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 't':
3062b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3063b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("<");
3064b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3065b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3066b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'm':
3067b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3068b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'i':
3069b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3070b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("-");
3071b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'I':
3072b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3073b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("-=");
3074b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'l':
3075b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3076b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("*");
3077b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'L':
3078b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3079b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("*=");
3080b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'm':
3081b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3082b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (consumeIf('_'))
3083b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return parsePrefixExpr("--");
3084b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
3085b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
3086b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
3087b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<PostfixExpr>(Ex, "--");
3088b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3089b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3090b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'n':
3091b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3092b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'a':
3093b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'w':
3094b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseNewExpr();
3095b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'e':
3096b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3097b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("!=");
3098b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'g':
3099b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3100b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parsePrefixExpr("-");
3101b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 't':
3102b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3103b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parsePrefixExpr("!");
3104b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'x':
3105b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3106b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
3107b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
3108b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
3109b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<EnclosingExpr>("noexcept (", Ex, ")");
3110b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3111b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3112b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'o':
3113b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3114b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'n':
3115b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return legacyParse<parse_unresolved_name>();
3116b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'o':
3117b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3118b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("||");
3119b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'r':
3120b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3121b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("|");
3122b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'R':
3123b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3124b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("|=");
3125b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3126b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3127b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'p':
3128b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3129b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'm':
3130b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3131b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("->*");
3132b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'l':
3133b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3134b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("+");
3135b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'L':
3136b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3137b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("+=");
3138b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'p': {
3139b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3140b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (consumeIf('_'))
3141b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return parsePrefixExpr("++");
3142b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
3143b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
3144b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
3145b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<PostfixExpr>(Ex, "++");
3146b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3147b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 's':
3148b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3149b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parsePrefixExpr("+");
3150b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 't': {
3151b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3152b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *L = parseExpr();
3153b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (L == nullptr)
3154b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
3155b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *R = parseExpr();
3156b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (R == nullptr)
3157b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
3158b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<MemberExpr>(L, "->", R);
3159b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3160b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3161b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3162b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'q':
3163b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (First[1] == 'u') {
3164b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3165b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Cond = parseExpr();
316624e8b733da82232d37fc0c07f1173dadcf2593c9Erik Pilkington      if (Cond == nullptr)
316724e8b733da82232d37fc0c07f1173dadcf2593c9Erik Pilkington        return nullptr;
3168b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *LHS = parseExpr();
316924e8b733da82232d37fc0c07f1173dadcf2593c9Erik Pilkington      if (LHS == nullptr)
317024e8b733da82232d37fc0c07f1173dadcf2593c9Erik Pilkington        return nullptr;
3171b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *RHS = parseExpr();
317224e8b733da82232d37fc0c07f1173dadcf2593c9Erik Pilkington      if (RHS == nullptr)
317324e8b733da82232d37fc0c07f1173dadcf2593c9Erik Pilkington        return nullptr;
317424e8b733da82232d37fc0c07f1173dadcf2593c9Erik Pilkington      return make<ConditionalExpr>(Cond, LHS, RHS);
3175b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3176b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3177b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 'r':
3178b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3179b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'c': {
3180b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3181f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *T = parseType();
3182b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (T == nullptr)
3183b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return T;
3184b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
3185b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
3186b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
3187b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<CastExpr>("reinterpret_cast", T, Ex);
3188b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3189b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'm':
3190b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3191b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("%");
3192b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'M':
3193b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3194b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr("%=");
3195b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 's':
3196b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3197b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr(">>");
3198b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'S':
3199b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3200b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return parseBinaryExpr(">>=");
3201b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3202b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3203b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 's':
3204b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3205b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'c': {
3206b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3207f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *T = parseType();
3208b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (T == nullptr)
3209b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return T;
3210b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
3211b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
3212b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
3213b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<CastExpr>("static_cast", T, Ex);
3214b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3215b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'p': {
3216b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3217b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Child = parseExpr();
3218b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Child == nullptr)
3219b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
3220b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<ParameterPackExpansion>(Child);
3221b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3222b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'r':
3223b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return legacyParse<parse_unresolved_name>();
3224b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 't': {
3225b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3226f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *Ty = parseType();
3227b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ty == nullptr)
3228b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ty;
3229b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<EnclosingExpr>("sizeof (", Ty, ")");
3230b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3231b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'z': {
3232b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3233b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
3234b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
3235b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
3236b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<EnclosingExpr>("sizeof (", Ex, ")");
3237b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3238b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'Z':
3239b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3240b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (look() == 'T') {
3241b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        Node *R = legacyParse<parse_template_param>();
3242b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if (R == nullptr)
3243b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington          return nullptr;
3244b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return make<SizeofParamPackExpr>(R);
3245b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      } else if (look() == 'f') {
3246b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        Node *FP = parseFunctionParam();
3247b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if (FP == nullptr)
3248b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington          return nullptr;
3249b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return make<EnclosingExpr>("sizeof...", FP, ")");
3250b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      }
3251b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
3252b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3253b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3254b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case 't':
3255b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (First[1]) {
3256b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'e': {
3257b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3258b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
3259b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
3260b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ex;
3261b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<EnclosingExpr>("typeid (", Ex, ")");
3262b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3263b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'i': {
3264b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3265f23deca27d417faefd8c3dfe59e68c212fa63d68Erik Pilkington      Node *Ty = parseType();
3266b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ty == nullptr)
3267b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return Ty;
3268b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<EnclosingExpr>("typeid (", Ty, ")");
3269b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3270b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'r':
3271b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3272b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<NameType>("throw");
3273b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case 'w': {
3274b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      First += 2;
3275b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      Node *Ex = parseExpr();
3276b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      if (Ex == nullptr)
3277b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return nullptr;
3278b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return make<ThrowExpr>(Ex);
3279b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3280b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
3281b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3282b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '1':
3283b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '2':
3284b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '3':
3285b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '4':
3286b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '5':
3287b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '6':
3288b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '7':
3289b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '8':
3290b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  case '9':
3291b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return legacyParse<parse_unresolved_name>();
3292b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  }
3293b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return nullptr;
3294b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
3295d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
32966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <number> ::= [n] <non-negative decimal integer>
3297d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
32986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
32996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_number(const char* first, const char* last)
3300d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
33016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (first != last)
3302d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
33036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t = first;
33046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*t == 'n')
33056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            ++t;
33066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (t != last)
33076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
33086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (*t == '0')
33096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
33106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t+1;
33116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
33126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            else if ('1' <= *t && *t <= '9')
33136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
33146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t+1;
33156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                while (first != last && std::isdigit(*first))
33166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    ++first;
33176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
33186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
3319d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
33206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
33216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3322d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
33236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <class Float>
33240024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonstruct FloatData;
3325d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
33266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <>
33270024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonstruct FloatData<float>
3328f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant{
33296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    static const size_t mangled_size = 8;
33306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    static const size_t max_demangled_size = 24;
3331c62cbea03e7fb9df073bc965d3f7fc5ca5a39438Howard Hinnant    static constexpr const char* spec = "%af";
3332f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant};
3333f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant
33340024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonconstexpr const char* FloatData<float>::spec;
3335d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
33366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <>
33370024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonstruct FloatData<double>
3338d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
33396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    static const size_t mangled_size = 16;
33406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    static const size_t max_demangled_size = 32;
33416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    static constexpr const char* spec = "%a";
3342d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant};
3343d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
33440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonconstexpr const char* FloatData<double>::spec;
3345d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
33466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnanttemplate <>
33470024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonstruct FloatData<long double>
3348d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
3349d04ecd028fa2e2dc066923ff850d4c7ec526cff6Dan Gohman#if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \
3350d04ecd028fa2e2dc066923ff850d4c7ec526cff6Dan Gohman    defined(__wasm__)
335152cf98bc52a16fba2139909ad01b3f1b364ce401Daniel Sanders    static const size_t mangled_size = 32;
33529ef2c6e495b0f6df3a4a17f21b335ac5b852c473Ben Craig#elif defined(__arm__) || defined(__mips__) || defined(__hexagon__)
335305d51bcf07d0ec1c40785b4a860fd917410b4be1Logan Chien    static const size_t mangled_size = 16;
335405d51bcf07d0ec1c40785b4a860fd917410b4be1Logan Chien#else
33556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    static const size_t mangled_size = 20;  // May need to be adjusted to 16 or 24 on other platforms
335605d51bcf07d0ec1c40785b4a860fd917410b4be1Logan Chien#endif
33576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    static const size_t max_demangled_size = 40;
3358b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    static constexpr const char *spec = "%LaL";
3359d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant};
3360d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
3361b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconstexpr const char *FloatData<long double>::spec;
3362b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
3363b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtontemplate <class Float> Node *Db::parseFloatingLiteral() {
3364b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  const size_t N = FloatData<Float>::mangled_size;
3365b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (numLeft() <= N)
3366b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3367b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  StringView Data(First, First + N);
3368b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  for (char C : Data)
3369b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (!std::isxdigit(C))
3370b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington      return nullptr;
3371b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  First += N;
3372b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  if (!consumeIf('E'))
3373b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return nullptr;
3374b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington  return make<FloatExpr<Float>>(Data);
33756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3376d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
33775bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington// <positive length number> ::= [0-9]*
33786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
33795bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkingtonparse_positive_integer(const char* first, const char* last, size_t* out)
3380f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant{
33816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (first != last)
3382f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant    {
33836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        char c = *first;
33846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (isdigit(c) && first+1 != last)
33856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
33866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            const char* t = first+1;
33876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            size_t n = static_cast<size_t>(c - '0');
33886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            for (c = *t; isdigit(c); c = *t)
33896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
33906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                n = n * 10 + static_cast<size_t>(c - '0');
33916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (++t == last)
33926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    return first;
33936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
33945bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            *out = n;
33955bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            first = t;
33965bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        }
33975bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    }
33985bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    return first;
33995bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington}
34005bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington
34015bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington// extension
34025bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington// <abi-tag-seq> ::= <abi-tag>*
34035bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington// <abi-tag>     ::= B <positive length number> <identifier>
34045bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkingtonconst char*
34055bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkingtonparse_abi_tag_seq(const char* first, const char* last, Db& db)
34065bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington{
34075bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    while (first != last && *first == 'B' && first+1 != last)
34085bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    {
34095bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        size_t length;
34105bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        const char* t = parse_positive_integer(first+1, last, &length);
34115bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        if (t == first+1)
34125bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            return first;
34135bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        if (static_cast<size_t>(last - t) < length || db.Names.empty())
34145bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            return first;
34155bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        db.Names.back() = db.make<AbiTagAttr>(
34165bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            db.Names.back(), StringView(t, t + length));
34175bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        first = t + length;
34185bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    }
34195bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    return first;
34205bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington}
34215bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington
34225bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington// <source-name> ::= <positive length number> <identifier> [<abi-tag-seq>]
34235bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkingtonconst char*
34245bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkingtonparse_source_name(const char* first, const char* last, Db& db)
34255bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington{
34265bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    if (first != last)
34275bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    {
34285bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        size_t length;
34295bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        const char* t = parse_positive_integer(first, last, &length);
34305bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        if (t == first)
34315bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            return first;
34325bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        if (static_cast<size_t>(last - t) >= length)
34335bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        {
34345bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            StringView r(t, t + length);
34355bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            if (r.substr(0, 10) == "_GLOBAL__N")
34365bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington                db.Names.push_back(db.make<NameType>("(anonymous namespace)"));
34375bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            else
34385bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington                db.Names.push_back(db.make<NameType>(r));
34395bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            first = t + length;
34405bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington            first = parse_abi_tag_seq(first, last, db);
34416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
3442f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant    }
34436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
34446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3445f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant
34466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= S <seq-id> _
34476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= S_
34486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Sa # ::std::allocator
34496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Sb # ::std::basic_string
34506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Ss # ::std::basic_string < char,
34516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                                               ::std::char_traits<char>,
34526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                                               ::std::allocator<char> >
34536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Si # ::std::basic_istream<char,  std::char_traits<char> >
34546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= So # ::std::basic_ostream<char,  std::char_traits<char> >
34556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
3456f270035a31a0abd92c1592ba0e87db0016127c3eHoward Hinnant
34576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
3458c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_substitution(const char* first, const char* last, Db& db)
3459d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
34606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (last - first >= 2)
3461d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
34626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*first == 'S')
3463d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
34646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
34656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
34666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'a':
3467dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(
34680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                    db.make<SpecialSubstitution>(
34690024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        SpecialSubKind::allocator));
34706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
34716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
34726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'b':
3473dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(
34740024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                    db.make<SpecialSubstitution>(SpecialSubKind::basic_string));
34756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
34766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
34776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 's':
3478dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(
34790024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                    db.make<SpecialSubstitution>(
34800024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        SpecialSubKind::string));
34816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
34826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
34836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'i':
3484dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::istream));
34856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
34866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
34876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'o':
3488dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::ostream));
34896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
34906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
34916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'd':
3492dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::iostream));
34936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
34946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
34956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case '_':
3496dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                if (!db.Subs.empty())
34976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
3498761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                    db.Names.push_back(db.Subs[0]);
34996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first += 2;
35006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
35016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
35026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            default:
35036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (std::isdigit(first[1]) || std::isupper(first[1]))
35046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
35056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    size_t sub = 0;
35066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    const char* t = first+1;
35076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (std::isdigit(*t))
35086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        sub = static_cast<size_t>(*t - '0');
35096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    else
35106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        sub = static_cast<size_t>(*t - 'A') + 10;
35116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
35126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
35136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        sub *= 36;
35146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        if (std::isdigit(*t))
35156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            sub += static_cast<size_t>(*t - '0');
35166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        else
35176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            sub += static_cast<size_t>(*t - 'A') + 10;
35186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
35196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t == last || *t != '_')
35206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        return first;
35216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    ++sub;
3522dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (sub < db.Subs.size())
35236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
3524761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                        db.Names.push_back(db.Subs[sub]);
35256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        first = t+1;
35266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
35276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
35286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
35296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
35306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
3531d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
35326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
35336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3534d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
35350024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington// <CV-Qualifiers> ::= [r] [V] [K]
3536d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
35376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
35380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkingtonparse_cv_qualifiers(const char* first, const char* last, Qualifiers& cv)
3539d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
35400024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington    cv = QualNone;
35416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (first != last)
3542d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
35436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*first == 'r')
3544d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
35450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            addQualifiers(cv, QualRestrict);
35466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            ++first;
3547d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
35486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*first == 'V')
3549d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
35500024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            addQualifiers(cv, QualVolatile);
35516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            ++first;
3552d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
35536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*first == 'K')
3554d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
35550024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            addQualifiers(cv, QualConst);
35566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            ++first;
3557d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3558d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
35596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
35606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3561d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
35626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <template-param> ::= T_    # first template parameter
35636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                  ::= T <parameter-2 non-negative number> _
3564d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
35656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
3566c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_template_param(const char* first, const char* last, Db& db)
35676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
35686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (last - first >= 2)
3569d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
35706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*first == 'T')
3571d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
35726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (first[1] == '_')
35736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
3574ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                if (!db.TemplateParams.empty())
35756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
3576761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                    db.Names.push_back(db.TemplateParams[0]);
35776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first += 2;
35786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
35796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
35806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
3581dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.push_back(db.make<NameType>("T_"));
35826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first += 2;
3583dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.FixForwardReferences = true;
35846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
35856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
35866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            else if (isdigit(first[1]))
35876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
35886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t = first+1;
35896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                size_t sub = static_cast<size_t>(*t - '0');
35906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                for (++t; t != last && isdigit(*t); ++t)
35916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
35926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    sub *= 10;
35936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    sub += static_cast<size_t>(*t - '0');
35946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
3595ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                if (t == last || *t != '_')
35966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    return first;
35976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                ++sub;
3598ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                if (sub < db.TemplateParams.size())
35996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
3600761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                    db.Names.push_back(db.TemplateParams[sub]);
36016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t+1;
36026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
36036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
36046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
3605dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.push_back(
36060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        db.make<NameType>(StringView(first, t + 1)));
36076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t+1;
3608dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.FixForwardReferences = true;
36096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
36106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
3611d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3612d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
36136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
36146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
36156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
3616b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <simple-id> ::= <source-name> [ <template-args> ]
36176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
36186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
3619b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonparse_simple_id(const char* first, const char* last, Db& db)
36206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
3621b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (first != last)
3622d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
3623b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        const char* t = parse_source_name(first, last, db);
3624b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if (t != first)
3625d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
3626b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            const char* t1 = parse_template_args(t, last, db);
36276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t1 != t)
36286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
3629dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                if (db.Names.size() < 2)
3630753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                    return first;
3631b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                auto args = db.Names.back();
3632dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.pop_back();
3633b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.Names.back() =
3634b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.make<NameWithTemplateArgs>(db.Names.back(), args);
36356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
3636b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            first = t1;
3637d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3638b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        else
3639b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            first = t;
3640d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
36416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
36426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3643d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
3644b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <unresolved-type> ::= <template-param>
3645b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                   ::= <decltype>
3646b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                   ::= <substitution>
3647d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
36486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
3649b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonparse_unresolved_type(const char* first, const char* last, Db& db)
36506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
3651b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (first != last)
3652d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
3653b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        const char* t = first;
3654b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        switch (*first)
3655d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
3656b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        case 'T':
3657b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington          {
3658b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            size_t k0 = db.Names.size();
3659b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            t = parse_template_param(first, last, db);
3660b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            size_t k1 = db.Names.size();
3661b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (t != first && k1 == k0 + 1)
3662b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            {
3663b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.Subs.push_back(db.Names.back());
3664b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first = t;
3665b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            }
3666b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            else
3667b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            {
3668b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                for (; k1 != k0; --k1)
3669b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.Names.pop_back();
3670b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            }
3671b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            break;
3672b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington          }
3673b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        case 'D':
3674b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            t = parse_decltype(first, last, db);
3675b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (t != first)
36766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
3677dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                if (db.Names.empty())
3678eb3e8cf1bf71859b1683ed84414d0985a4801d58Mehdi Amini                    return first;
3679b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.Subs.push_back(db.Names.back());
3680b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first = t;
36816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
3682b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            break;
3683b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        case 'S':
3684b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            t = parse_substitution(first, last, db);
3685b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (t != first)
3686b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first = t;
3687b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            else
3688b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            {
3689b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (last - first > 2 && first[1] == 't')
3690b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                {
3691b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    t = parse_unqualified_name(first+2, last, db);
3692b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    if (t != first+2)
3693b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    {
3694b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        if (db.Names.empty())
3695b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                            return first;
3696b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Names.back() =
3697b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                            db.make<StdQualifiedName>(db.Names.back());
3698b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Subs.push_back(db.Names.back());
3699b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        first = t;
3700b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    }
3701b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                }
3702b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            }
3703b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            break;
3704b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington       }
3705d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
37066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
37076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3708d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
3709b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <destructor-name> ::= <unresolved-type>                               # e.g., ~T or ~decltype(f())
3710b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                   ::= <simple-id>                                     # e.g., ~A<2*N>
3711d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
37126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
3713b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonparse_destructor_name(const char* first, const char* last, Db& db)
37146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
3715b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (first != last)
3716d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
3717b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        const char* t = parse_unresolved_type(first, last, db);
3718b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if (t == first)
3719b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            t = parse_simple_id(first, last, db);
3720b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if (t != first)
3721d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
3722b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (db.Names.empty())
3723b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                return first;
3724b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            db.Names.back() = db.make<DtorName>(db.Names.back());
3725b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            first = t;
3726d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3727d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
37286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
37296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3730d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
3731b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <base-unresolved-name> ::= <simple-id>                                # unresolved name
3732b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//          extension     ::= <operator-name>                            # unresolved operator-function-id
3733b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//          extension     ::= <operator-name> <template-args>            # unresolved operator template-id
3734b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                        ::= on <operator-name>                         # unresolved operator-function-id
3735b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                        ::= on <operator-name> <template-args>         # unresolved operator template-id
3736b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                        ::= dn <destructor-name>                       # destructor or pseudo-destructor;
3737b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                                                                         # e.g. ~X or ~X<N-1>
3738b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
37396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
3740b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonparse_base_unresolved_name(const char* first, const char* last, Db& db)
37416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
3742b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (last - first >= 2)
3743d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
3744b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
3745d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
3746b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (first[0] == 'o')
37476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
3748b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                const char* t = parse_operator_name(first+2, last, db);
3749b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (t != first+2)
3750b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                {
3751b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    first = parse_template_args(t, last, db);
3752b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    if (first != t)
3753b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    {
3754b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        if (db.Names.size() < 2)
3755b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                            return first;
3756b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        auto args = db.Names.back();
3757b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Names.pop_back();
3758b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Names.back() =
3759b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                            db.make<NameWithTemplateArgs>(
3760b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                                db.Names.back(), args);
3761b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    }
3762b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                }
37636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
3764b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            else
37656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
3766b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                const char* t = parse_destructor_name(first+2, last, db);
3767b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (t != first+2)
3768b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    first = t;
37696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
3770d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3771b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        else
3772d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
3773b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            const char* t = parse_simple_id(first, last, db);
3774b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (t == first)
37756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
3776b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                t = parse_operator_name(first, last, db);
3777b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (t != first)
37786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
3779b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    first = parse_template_args(t, last, db);
3780b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    if (first != t)
3781b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    {
3782b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        if (db.Names.size() < 2)
3783b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                            return first;
3784b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        auto args = db.Names.back();
3785b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Names.pop_back();
3786b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Names.back() =
3787b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                            db.make<NameWithTemplateArgs>(
3788b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                                db.Names.back(), args);
3789b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    }
37906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
37916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
3792b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            else
3793b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first = t;
3794d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3795d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
37966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
37976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3798d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
3799b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <unresolved-qualifier-level> ::= <simple-id>
38006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
38016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
3802b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonparse_unresolved_qualifier_level(const char* first, const char* last, Db& db)
38036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
3804b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return parse_simple_id(first, last, db);
38056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3806d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
3807b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <unresolved-name>
3808b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//  extension        ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
3809b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                   ::= [gs] <base-unresolved-name>                     # x or (with "gs") ::x
3810b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                   ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
3811b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                                                                       # A::x, N::y, A<T>::z; "gs" means leading "::"
3812b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                   ::= sr <unresolved-type> <base-unresolved-name>     # T::x / decltype(p)::x
3813b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//  extension        ::= sr <unresolved-type> <template-args> <base-unresolved-name>
3814b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                                                                       # T::N::x /decltype(p)::N::x
3815b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//  (ignored)        ::= srN <unresolved-type>  <unresolved-qualifier-level>+ E <base-unresolved-name>
3816d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
38176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
3818b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonparse_unresolved_name(const char* first, const char* last, Db& db)
38196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
3820b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (last - first > 2)
3821d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
3822b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        const char* t = first;
3823b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        bool global = false;
3824b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if (t[0] == 'g' && t[1] == 's')
3825d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
3826b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            global = true;
3827b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            t += 2;
3828d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3829b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        const char* t2 = parse_base_unresolved_name(t, last, db);
3830b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        if (t2 != t)
3831d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
3832b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (global)
3833d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
3834b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (db.Names.empty())
3835753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                    return first;
3836b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.Names.back() =
3837b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.make<GlobalQualifiedName>(db.Names.back());
3838d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
3839b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            first = t2;
3840d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3841b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
3842d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
3843b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (t[2] == 'N')
38446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
3845b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                t += 3;
3846b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                const char* t1 = parse_unresolved_type(t, last, db);
3847b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (t1 == t || t1 == last)
3848b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    return first;
3849b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                t = t1;
3850b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                t1 = parse_template_args(t, last, db);
3851b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (t1 != t)
3852b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                {
3853b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    if (db.Names.size() < 2)
3854b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        return first;
3855b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    auto args = db.Names.back();
3856b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.Names.pop_back();
3857b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.Names.back() = db.make<NameWithTemplateArgs>(
3858b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Names.back(), args);
3859b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    t = t1;
3860b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    if (t == last)
3861b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    {
3862b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Names.pop_back();
3863b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        return first;
3864b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    }
3865b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                }
3866b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                while (*t != 'E')
3867b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                {
3868b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    t1 = parse_unresolved_qualifier_level(t, last, db);
3869b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    if (t1 == t || t1 == last || db.Names.size() < 2)
3870b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        return first;
3871b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    auto s = db.Names.back();
3872b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.Names.pop_back();
3873b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.Names.back() =
3874b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.make<QualifiedName>(db.Names.back(), s);
3875b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    t = t1;
3876b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                }
3877b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                ++t;
3878b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                t1 = parse_base_unresolved_name(t, last, db);
3879b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (t1 == t)
3880b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                {
3881b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    if (!db.Names.empty())
3882b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                        db.Names.pop_back();
3883b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    return first;
3884b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                }
3885dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                if (db.Names.size() < 2)
3886753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                    return first;
3887b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                auto s = db.Names.back();
3888dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.pop_back();
3889dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.back() =
3890b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.make<QualifiedName>(db.Names.back(), s);
3891b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first = t1;
38926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
38936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            else
38946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
38956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t += 2;
38966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t1 = parse_unresolved_type(t, last, db);
38976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 != t)
38986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
38996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t = t1;
39006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t1 = parse_template_args(t, last, db);
39016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 != t)
39026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
3903dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.size() < 2)
3904753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                            return first;
3905dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        auto args = db.Names.back();
3906dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
3907dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
39080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            db.make<NameWithTemplateArgs>(
3909dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                db.Names.back(), args);
39106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        t = t1;
39116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
39126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t1 = parse_base_unresolved_name(t, last, db);
39136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 == t)
39146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
3915dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (!db.Names.empty())
3916dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.pop_back();
39176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        return first;
39186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
3919dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.size() < 2)
3920753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
3921dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    auto s = db.Names.back();
3922dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.pop_back();
3923dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
3924dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.make<QualifiedName>(db.Names.back(), s);
39256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t1;
39266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
39276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
39286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
39296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t1 = parse_unresolved_qualifier_level(t, last, db);
39306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 == t || t1 == last)
39316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        return first;
39326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t = t1;
39336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (global)
3934753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                    {
3935dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.empty())
3936753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                            return first;
3937dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
39380024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            db.make<GlobalQualifiedName>(
3939dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                db.Names.back());
3940753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                    }
39416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    while (*t != 'E')
39426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
39436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        t1 = parse_unresolved_qualifier_level(t, last, db);
3944dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (t1 == t || t1 == last || db.Names.size() < 2)
39456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            return first;
3946dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        auto s = db.Names.back();
3947dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
3948dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() = db.make<QualifiedName>(
3949dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.back(), s);
39506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        t = t1;
39516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
39526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    ++t;
39536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t1 = parse_base_unresolved_name(t, last, db);
39546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 == t)
39556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
3956dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (!db.Names.empty())
3957dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.pop_back();
39586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        return first;
39596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
3960dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.size() < 2)
3961753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
3962dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    auto s = db.Names.back();
3963dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.pop_back();
3964dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
3965dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.make<QualifiedName>(db.Names.back(), s);
39666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t1;
39676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
39686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
3969d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
3970d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
39716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
39726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
3973d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
39746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//   <operator-name>
39756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= aa    # &&
39766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= ad    # & (unary)
39776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= an    # &
39786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= aN    # &=
39796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= aS    # =
39806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= cl    # ()
39816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= cm    # ,
39826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= co    # ~
39836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= cv <type>    # (cast)
39846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= da    # delete[]
39856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= de    # * (unary)
39866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= dl    # delete
39876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= dv    # /
39886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= dV    # /=
39896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= eo    # ^
39906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= eO    # ^=
39916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= eq    # ==
39926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= ge    # >=
39936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= gt    # >
39946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= ix    # []
39956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= le    # <=
3996f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant//                   ::= li <source-name>  # operator ""
39976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= ls    # <<
39986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= lS    # <<=
39996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= lt    # <
40006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= mi    # -
40016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= mI    # -=
40026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= ml    # *
40036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= mL    # *=
40046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= mm    # -- (postfix in <expression> context)
40056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= na    # new[]
40066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= ne    # !=
40076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= ng    # - (unary)
40086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= nt    # !
40096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= nw    # new
40106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= oo    # ||
40116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= or    # |
40126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= oR    # |=
40136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= pm    # ->*
40146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= pl    # +
40156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= pL    # +=
40166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= pp    # ++ (postfix in <expression> context)
40176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= ps    # + (unary)
40186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= pt    # ->
40196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= qu    # ?
40206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= rm    # %
40216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= rM    # %=
40226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= rs    # >>
40236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= rS    # >>=
40246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                   ::= v <digit> <source-name>        # vendor extended operator
40255bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington//   extension       ::= <operator-name> <abi-tag-seq>
40266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
4027c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_operator_name(const char* first, const char* last, Db& db)
40286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
40295bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    const char* original_first = first;
40306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (last - first >= 2)
40316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    {
40326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        switch (first[0])
40336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
40346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'a':
40356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
40366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
40376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'a':
4038dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator&&"));
40396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
40406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
40416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'd':
40426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'n':
4043dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator&"));
40446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
40456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
40466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'N':
4047dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator&="));
40486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
40496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
40506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'S':
4051dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator="));
40526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4053d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4054d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
4055d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            break;
4056d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        case 'c':
4057d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            switch (first[1])
4058d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
4059d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'l':
4060dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator()"));
40616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4062d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4063d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'm':
4064dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator,"));
40656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4066d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4067d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'o':
4068dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator~"));
40696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4070d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4071d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'v':
4072d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
4073dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    bool TryToParseTemplateArgs = db.TryToParseTemplateArgs;
4074dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.TryToParseTemplateArgs = false;
40756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    const char* t = parse_type(first+2, last, db);
4076dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.TryToParseTemplateArgs = TryToParseTemplateArgs;
40776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t != first+2)
4078d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    {
4079dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.empty())
4080753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                            return first;
4081dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
4082dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.make<ConversionOperatorType>(db.Names.back());
4083dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.ParsedCtorDtorCV = true;
40846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        first = t;
4085d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    }
4086d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
4087d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4088d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
4089d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            break;
4090d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        case 'd':
4091d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            switch (first[1])
4092d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
4093d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'a':
4094dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator delete[]"));
40956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4096d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4097d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'e':
4098dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator*"));
40996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4100d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4101d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'l':
4102dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator delete"));
41036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'v':
4106dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator/"));
41076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'V':
4110dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator/="));
41116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
41146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
41156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'e':
41166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
41176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
41186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'o':
4119dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator^"));
41206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'O':
4123dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator^="));
41246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'q':
4127dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator=="));
41286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
41316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
41326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'g':
41336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
41346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
41356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'e':
4136dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator>="));
41376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 't':
4140dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator>"));
41416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
41446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
41456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'i':
41466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (first[1] == 'x')
41476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
4148dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator[]"));
41496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
41516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
41526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'l':
41536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
41546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
41556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'e':
4156dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator<="));
41576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
4159f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant            case 'i':
4160f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                {
4161f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                    const char* t = parse_source_name(first+2, last, db);
4162f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                    if (t != first+2)
4163f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                    {
4164dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.empty())
4165f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                            return first;
4166dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
4167dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.make<LiteralOperator>(db.Names.back());
4168f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                        first = t;
4169f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                    }
4170f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                }
4171f29757a358ae9c07d3a768a5b40543fae9d768ddHoward Hinnant                break;
41726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 's':
4173dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator<<"));
41746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'S':
4177dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator<<="));
41786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 't':
4181dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator<"));
41826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
41856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
41866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'm':
41876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
41886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
41896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'i':
4190dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator-"));
41916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'I':
4194dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator-="));
41956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
41966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
41976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'l':
4198dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator*"));
41996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'L':
4202dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator*="));
42036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'm':
4206dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator--"));
42076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
42106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
42116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'n':
42126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
42136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
42146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'a':
4215dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator new[]"));
42166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'e':
4219dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator!="));
42206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'g':
4223dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator-"));
42246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 't':
4227dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator!"));
42286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'w':
4231dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator new"));
42326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
42356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
42366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'o':
42376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
42386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
42396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'o':
4240dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator||"));
42416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'r':
4244dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator|"));
42456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'R':
4248dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator|="));
42496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
42526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
42536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'p':
42546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
42556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
42566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'm':
4257dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator->*"));
42586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'l':
4261dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator+"));
42626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'L':
4265dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator+="));
42666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'p':
4269dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator++"));
42706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 's':
4273dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator+"));
42746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 't':
4277dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator->"));
42786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
42806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
42816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
42826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'q':
42836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (first[1] == 'u')
42846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
4285dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator?"));
42866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
42876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
42886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
42896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'r':
42906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
42916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
42926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'm':
4293dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator%"));
42946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4295d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
42966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'M':
4297dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator%="));
42986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4299d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
43006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 's':
4301dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator>>"));
43026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
43036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
43046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'S':
4305dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.push_back(db.make<NameType>("operator>>="));
43066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first += 2;
4307d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4308d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
4309d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            break;
43106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'v':
43116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (std::isdigit(first[1]))
4312d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
43136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t = parse_source_name(first+2, last, db);
43146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2)
4315d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
4316dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
4317753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
4318dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
4319dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.make<ConversionOperatorType>(db.Names.back());
43206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
4321d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
43226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
43236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
43246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
43256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
43265bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington
43275bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington    if (original_first != first)
43285bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington        first = parse_abi_tag_seq(first, last, db);
43295bff412f87e41f24e25e15e8d1739684aa6f0907Erik Pilkington
43306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
43316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
43326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
4333b679cfd41e0249c5994da99435f13fb40acc0399Erik PilkingtonNode* maybe_change_special_sub_name(Node* inp, Db& db)
43346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
4335b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (inp->K != Node::KSpecialSubstitution)
4336b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return inp;
4337b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    auto Kind = static_cast<SpecialSubstitution*>(inp)->SSK;
4338b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    switch (Kind)
43396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    {
4340b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case SpecialSubKind::string:
4341b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case SpecialSubKind::istream:
4342b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case SpecialSubKind::ostream:
4343b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    case SpecialSubKind::iostream:
4344b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        return db.make<ExpandedSpecialSubstitution>(Kind);
4345b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    default:
4346b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        break;
43476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
4348b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return inp;
43496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
43506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
4351b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <ctor-dtor-name> ::= C1    # complete object constructor
4352b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                  ::= C2    # base object constructor
4353b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                  ::= C3    # complete object allocating constructor
4354b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//   extension      ::= C5    # ?
4355b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                  ::= D0    # deleting destructor
4356b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                  ::= D1    # complete object destructor
4357b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                  ::= D2    # base object destructor
4358b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//   extension      ::= D5    # ?
4359b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//   extension      ::= <ctor-dtor-name> <abi-tag-seq>
43606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
4361b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonparse_ctor_dtor_name(const char* first, const char* last, Db& db)
43626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
4363b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (last-first >= 2 && !db.Names.empty())
43646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    {
4365b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        switch (first[0])
43666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
4367b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        case 'C':
4368b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            switch (first[1])
436993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant            {
4370b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            case '1':
4371b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            case '2':
4372b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            case '3':
4373b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            case '5':
4374b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (db.Names.empty())
4375b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    return first;
4376b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.Names.back() =
4377b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    maybe_change_special_sub_name(db.Names.back(), db);
4378b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.Names.push_back(
4379b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.make<CtorDtorName>(db.Names.back(), false));
4380b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first += 2;
4381b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first = parse_abi_tag_seq(first, last, db);
4382b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.ParsedCtorDtorCV = true;
4383b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                break;
438493433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant            }
438593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant            break;
4386b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        case 'D':
4387b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            switch (first[1])
43886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
4389b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            case '0':
4390b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            case '1':
4391b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            case '2':
4392b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            case '5':
4393b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                if (db.Names.empty())
4394b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    return first;
4395b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.Names.push_back(
4396b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    db.make<CtorDtorName>(db.Names.back(), true));
4397b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first += 2;
4398b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                first = parse_abi_tag_seq(first, last, db);
4399b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                db.ParsedCtorDtorCV = true;
4400b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                break;
44016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
44026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
4403b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        }
4404b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    }
4405b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    return first;
4406b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington}
4407b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington
4408b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <unnamed-type-name> ::= Ut [<nonnegative number>] _ [<abi-tag-seq>]
4409b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//                     ::= <closure-type-name>
4410b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//
4411b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
4412b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington//
4413b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington// <lambda-sig> ::= <parameter type>+  # Parameter types or "v" if the lambda has no parameters
4414b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonconst char*
4415b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkingtonparse_unnamed_type_name(const char* first, const char* last, Db& db)
4416b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington{
4417b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    if (last - first > 2 && first[0] == 'U')
4418b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington    {
4419b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        char type = first[1];
4420b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        switch (type)
4421b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        {
4422b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        case 't':
4423b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington          {
4424b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            const char* t0 = first+2;
4425b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (t0 == last)
4426b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                return first;
4427b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            StringView count;
4428b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (std::isdigit(*t0))
442993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant            {
4430b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                const char* t1 = t0 + 1;
4431b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                while (t1 != last && std::isdigit(*t1))
4432b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                    ++t1;
4433b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                count = StringView(t0, t1);
4434b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                t0 = t1;
443593433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant            }
4436b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (t0 == last || *t0 != '_')
4437b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                return first;
4438b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            db.Names.push_back(db.make<UnnamedTypeName>(count));
4439b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            first = t0 + 1;
4440b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            first = parse_abi_tag_seq(first, last, db);
4441b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington          }
444293433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant            break;
4443b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington        case 'l':
4444b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington          {
4445b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            size_t begin_pos = db.Names.size();
4446b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            const char* t0 = first+2;
4447b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            NodeArray lambda_params;
4448b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            if (first[2] == 'v')
444993433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant            {
4450b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington                ++t0;
445193433df2421f377a55478d20c8a67b8f835380f5Howard Hinnant            }
4452b679cfd41e0249c5994da99435f13fb40acc0399Erik Pilkington            else
44536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
44546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                while (true)
4455d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
44560a91f7ab6633790706437fd2e76d31939aeb0025Erik Pilkington                    const char* t1 = parse_type(t0, last, db);
44576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 == t0)
44586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        break;
44596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t0 = t1;
4460d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
4461dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                if (db.Names.size() < begin_pos)
44620a91f7ab6633790706437fd2e76d31939aeb0025Erik Pilkington                    return first;
44630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                lambda_params = db.popTrailingNodeArray(begin_pos);
44646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
44656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t0 == last || *t0 != 'E')
44660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                return first;
44676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            ++t0;
44686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t0 == last)
44696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                return first;
44700024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            StringView count;
44716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (std::isdigit(*t0))
44726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
44736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t1 = t0 + 1;
44746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                while (t1 != last && std::isdigit(*t1))
44756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    ++t1;
44760024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                count = StringView(t0, t1);
44776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t0 = t1;
44786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
44796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t0 == last || *t0 != '_')
44806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                return first;
4481dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            db.Names.push_back(db.make<LambdaTypeName>(lambda_params, count));
44826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            first = t0 + 1;
44836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          }
44846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
44856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
44866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
44876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
44886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
44896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
44906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unqualified-name> ::= <operator-name>
44916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                    ::= <ctor-dtor-name>
44926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                    ::= <source-name>
44936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                    ::= <unnamed-type-name>
44946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
44956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
4496c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_unqualified_name(const char* first, const char* last, Db& db)
44976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
44986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (first != last)
44996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    {
45006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t;
45016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        switch (*first)
45026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
45036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'C':
45046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'D':
45056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            t = parse_ctor_dtor_name(first, last, db);
45066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t != first)
45076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t;
45086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
45096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'U':
45106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            t = parse_unnamed_type_name(first, last, db);
45116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t != first)
45126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t;
45136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
45146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '1':
45156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '2':
45166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '3':
45176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '4':
45186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '5':
45196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '6':
45206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '7':
45216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '8':
45226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case '9':
45236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            t = parse_source_name(first, last, db);
45246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t != first)
45256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t;
45266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
45276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        default:
45286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            t = parse_operator_name(first, last, db);
45296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t != first)
45306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t;
45316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
45326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        };
45336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
45346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
45356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
45366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
45376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unscoped-name> ::= <unqualified-name>
45386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                 ::= St <unqualified-name>   # ::std::
45396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension       ::= StL<unqualified-name>
45406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
45416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
4542c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_unscoped_name(const char* first, const char* last, Db& db)
45436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
45446c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (last - first >= 2)
45456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    {
45466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t0 = first;
45476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        bool St = false;
45486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (first[0] == 'S' && first[1] == 't')
45496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
45506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            t0 += 2;
45516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            St = true;
45526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t0 != last && *t0 == 'L')
45536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                ++t0;
45546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
45556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t1 = parse_unqualified_name(t0, last, db);
45566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (t1 != t0)
45576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
45586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (St)
4559753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant            {
4560dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                if (db.Names.empty())
4561753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                    return first;
4562dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.back() =
4563dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.make<StdQualifiedName>(db.Names.back());
4564753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant            }
45656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            first = t1;
45666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
45676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
45686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
45696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
45706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
45716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <template-arg> ::= <type>                                             # type or template
45726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= X <expression> E                                   # expression
45736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= <expr-primary>                                     # simple expressions
45746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= J <template-arg>* E                                # argument pack
45756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= LZ <encoding> E                                    # extension
4576d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char*
4577c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_template_arg(const char* first, const char* last, Db& db)
4578d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
4579d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    if (first != last)
4580d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
45816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t;
45826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        switch (*first)
4583d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
45846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'X':
45856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            t = parse_expression(first+1, last, db);
45866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t != first+1)
4587d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
45886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != last && *t == 'E')
45896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t+1;
45906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
45916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
4592761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        case 'J': {
45936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            t = first+1;
45946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t == last)
45956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                return first;
4596761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington            size_t ArgsBegin = db.Names.size();
45976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            while (*t != 'E')
45986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
45996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t1 = parse_template_arg(t, last, db);
46006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 == t)
4601d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    return first;
46026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = t1;
46036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
4604761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington            NodeArray Args = db.popTrailingNodeArray(ArgsBegin);
4605761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington            db.Names.push_back(db.make<TemplateArgumentPack>(Args));
46066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            first = t+1;
46076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
4608761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        }
46096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'L':
46106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            // <expr-primary> or LZ <encoding> E
46116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (first+1 != last && first[1] == 'Z')
46126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
46136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_encoding(first+2, last, db);
46146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2 && t != last && *t == 'E')
46156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t+1;
4616d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
4617d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            else
46186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = parse_expr_primary(first, last, db);
46196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
46206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        default:
46216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            // <type>
46226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            first = parse_type(first, last, db);
46236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
4624d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
4625d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
4626d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return first;
4627d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
4628d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
46296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <template-args> ::= I <template-arg>* E
46306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//     extension, the abi says <template-arg>+
4631d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char*
4632c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_template_args(const char* first, const char* last, Db& db)
4633d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
46346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (last - first >= 2 && *first == 'I')
4635d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
4636dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        if (db.TagTemplates)
4637ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington            db.TemplateParams.clear();
46386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t = first+1;
4639dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        size_t begin_idx = db.Names.size();
46406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        while (*t != 'E')
4641d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
4642dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            if (db.TagTemplates)
4643ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington            {
4644ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                auto TmpParams = std::move(db.TemplateParams);
4645ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                size_t k0 = db.Names.size();
4646ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                const char* t1 = parse_template_arg(t, last, db);
4647ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                size_t k1 = db.Names.size();
4648ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                db.TemplateParams = std::move(TmpParams);
4649761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                if (t1 == t || t1 == last || k0 + 1 != k1)
4650ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                    return first;
4651761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                Node *TableEntry = db.Names.back();
4652761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                if (TableEntry->getKind() == Node::KTemplateArgumentPack)
4653761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                  TableEntry = db.make<ParameterPack>(
4654761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                      static_cast<TemplateArgumentPack*>(TableEntry)
4655761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                          ->getElements());
4656761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                db.TemplateParams.push_back(TableEntry);
4657ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                t = t1;
4658ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington                continue;
4659ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington            }
4660dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            size_t k0 = db.Names.size();
46616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            const char* t1 = parse_template_arg(t, last, db);
4662dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            size_t k1 = db.Names.size();
46630024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            if (t1 == t || t1 == last || k0 > k1)
4664ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington              return first;
46656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            t = t1;
4666d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
4667dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        if (begin_idx > db.Names.size())
4668ffdace5fe0e35ae8d1fc8e10b5286c684b8e8b5eErik Pilkington            return first;
46696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        first = t + 1;
4670761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        auto *tp = db.make<TemplateArgs>(
46710024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            db.popTrailingNodeArray(begin_idx));
4672dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.Names.push_back(tp);
4673d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
4674d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return first;
4675d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
4676d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
46770024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington// <nested-name> ::= N [<CV-Qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
46780024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington//               ::= N [<CV-Qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
4679d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//
4680d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// <prefix> ::= <prefix> <unqualified-name>
4681d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//          ::= <template-prefix> <template-args>
4682d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//          ::= <template-param>
4683d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//          ::= <decltype>
4684d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//          ::= # empty
4685d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//          ::= <substitution>
4686d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//          ::= <prefix> <data-member-prefix>
4687d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//  extension ::= L
4688d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//
4689d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// <template-prefix> ::= <prefix> <template unqualified-name>
4690d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//                   ::= <template-param>
4691d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//                   ::= <substitution>
4692d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
4693d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char*
4694c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_nested_name(const char* first, const char* last, Db& db,
469524ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                  bool* ends_with_template_args)
4696d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
4697d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    if (first != last && *first == 'N')
4698d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
46990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        Qualifiers cv;
47006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t0 = parse_cv_qualifiers(first+1, last, cv);
47016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (t0 == last)
47026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            return first;
4703dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.RefQuals = FrefQualNone;
47046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*t0 == 'R')
47056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
4706dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            db.RefQuals = FrefQualLValue;
47076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            ++t0;
47086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
47096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        else if (*t0 == 'O')
47106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
4711dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            db.RefQuals = FrefQualRValue;
47126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            ++t0;
47136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
4714dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.Names.push_back(db.make<EmptyName>());
4715d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
4716d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
4717d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            t0 += 2;
4718dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            db.Names.back() = db.make<NameType>("std");
4719d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
47206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (t0 == last)
47216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            return first;
47226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        bool pop_subs = false;
472324ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith        bool component_ends_with_template_args = false;
47246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        while (*t0 != 'E')
47256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
472624ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith            component_ends_with_template_args = false;
47276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            const char* t1;
47286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (*t0)
47296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
47306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'S':
47316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t0 + 1 != last && t0[1] == 't')
47326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    goto do_parse_unqualified_name;
47336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t1 = parse_substitution(t0, last, db);
47346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 != t0 && t1 != last)
47356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
4736dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.size() < 2)
4737ffdace5fe0e35ae8d1fc8e10b5286c684b8e8b5eErik Pilkington                        return first;
4738dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    auto name = db.Names.back();
4739dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.pop_back();
4740dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.back()->K != Node::KEmptyName)
4741d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    {
4742dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() = db.make<QualifiedName>(
4743dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.back(), name);
4744761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                        db.Subs.push_back(db.Names.back());
4745d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    }
4746d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    else
4747dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() = name;
47486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    pop_subs = true;
47496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t0 = t1;
4750d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
47516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
4752d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    return first;
4753d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4754d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'T':
47556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t1 = parse_template_param(t0, last, db);
47566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 != t0 && t1 != last)
4757d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
4758dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.size() < 2)
4759ffdace5fe0e35ae8d1fc8e10b5286c684b8e8b5eErik Pilkington                        return first;
4760dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    auto name = db.Names.back();
4761dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.pop_back();
4762dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.back()->K != Node::KEmptyName)
4763dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
4764dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.make<QualifiedName>(db.Names.back(), name);
4765d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    else
4766dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() = name;
4767761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                    db.Subs.push_back(db.Names.back());
47686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    pop_subs = true;
47696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t0 = t1;
4770d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
47716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
47726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    return first;
4773d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
47746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'D':
47756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
47766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    goto do_parse_unqualified_name;
47776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t1 = parse_decltype(t0, last, db);
47786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 != t0 && t1 != last)
47796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
4780dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.size() < 2)
4781ffdace5fe0e35ae8d1fc8e10b5286c684b8e8b5eErik Pilkington                        return first;
4782dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    auto name = db.Names.back();
4783dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.pop_back();
4784dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.back()->K != Node::KEmptyName)
4785dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
4786dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.make<QualifiedName>(db.Names.back(), name);
47876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    else
4788dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() = name;
4789761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                    db.Subs.push_back(db.Names.back());
47906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    pop_subs = true;
47916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t0 = t1;
47926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
47936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
4794d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    return first;
47956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
47966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'I':
47976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t1 = parse_template_args(t0, last, db);
47986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 != t0 && t1 != last)
4799d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
4800dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.size() < 2)
4801ffdace5fe0e35ae8d1fc8e10b5286c684b8e8b5eErik Pilkington                        return first;
4802dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    auto name = db.Names.back();
4803dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.pop_back();
4804dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() = db.make<NameWithTemplateArgs>(
4805dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back(), name);
4806761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                    db.Subs.push_back(db.Names.back());
48076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t0 = t1;
480824ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                    component_ends_with_template_args = true;
4809d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
4810d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                else
48116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    return first;
4812d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4813d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            case 'L':
48146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (++t0 == last)
4815d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    return first;
48166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
48176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            default:
48186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            do_parse_unqualified_name:
48196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t1 = parse_unqualified_name(t0, last, db);
48206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 != t0 && t1 != last)
48216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
4822dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.size() < 2)
4823ffdace5fe0e35ae8d1fc8e10b5286c684b8e8b5eErik Pilkington                        return first;
4824dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    auto name = db.Names.back();
4825dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.pop_back();
4826dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.back()->K != Node::KEmptyName)
4827dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
4828dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.make<QualifiedName>(db.Names.back(), name);
4829d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    else
4830dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() = name;
4831761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                    db.Subs.push_back(db.Names.back());
48326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    pop_subs = true;
48336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t0 = t1;
4834d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
48356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
4836d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    return first;
4837d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
48386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
48396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        first = t0 + 1;
4840dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.CV = cv;
4841dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        if (pop_subs && !db.Subs.empty())
4842761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington            db.Subs.pop_back();
484324ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith        if (ends_with_template_args)
484424ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith            *ends_with_template_args = component_ends_with_template_args;
48456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
48466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
48476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
48486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
48496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <discriminator> := _ <non-negative number>      # when number < 10
48506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                 := __ <non-negative number> _   # when number >= 10
48516c6d9cb283f42b60b31d2b48587cf4ecce8cb519Marshall Clow//  extension      := decimal-digit+               # at the end of string
48526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
48536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
48546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_discriminator(const char* first, const char* last)
48556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
48566c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    // parse but ignore discriminator
48576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (first != last)
48586c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    {
48596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*first == '_')
48606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
48616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            const char* t1 = first+1;
48626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t1 != last)
4863d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
48646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (std::isdigit(*t1))
48656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t1+1;
48666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else if (*t1 == '_')
4867d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
48686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    for (++t1; t1 != last && std::isdigit(*t1); ++t1)
48696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        ;
48706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 != last && *t1 == '_')
48716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        first = t1 + 1;
4872d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
4873d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
48746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
48756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        else if (std::isdigit(*first))
48766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
48776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            const char* t1 = first+1;
48786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            for (; t1 != last && std::isdigit(*t1); ++t1)
48796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                ;
48806c6d9cb283f42b60b31d2b48587cf4ecce8cb519Marshall Clow            if (t1 == last)
48816c6d9cb283f42b60b31d2b48587cf4ecce8cb519Marshall Clow                first = last;
48826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
48836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
48846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    return first;
48856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}
48866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
48876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
48886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//              := Z <function encoding> E s [<discriminator>]
48896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//              := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
48906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
48916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantconst char*
4892c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_local_name(const char* first, const char* last, Db& db,
489324ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                 bool* ends_with_template_args)
48946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant{
48956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (first != last && *first == 'Z')
48966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    {
48976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t = parse_encoding(first+1, last, db);
48986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (t != first+1 && t != last && *t == 'E' && ++t != last)
48996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
49006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (*t)
4901d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
49026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 's':
49036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = parse_discriminator(t+1, last);
4904dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                if (db.Names.empty())
4905753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                    return first;
4906dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                db.Names.back() = db.make<QualifiedName>(
4907dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back(), db.make<NameType>("string literal"));
49086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
49096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'd':
49106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (++t != last)
4911d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
49126c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    const char* t1 = parse_number(t, last);
49136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 != last && *t1 == '_')
49146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
49156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        t = t1 + 1;
491624ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                        t1 = parse_name(t, last, db,
491724ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                                        ends_with_template_args);
49186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        if (t1 != t)
49196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        {
4920dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            if (db.Names.size() < 2)
4921753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                                return first;
4922dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            auto name = db.Names.back();
4923dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.pop_back();
4924dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            if (db.Names.empty())
4925eb3e8cf1bf71859b1683ed84414d0985a4801d58Mehdi Amini                                return first;
4926dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.back() =
4927dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                db.make<QualifiedName>(db.Names.back(), name);
49286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            first = t1;
49296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        }
4930dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        else if (!db.Names.empty())
4931dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.pop_back();
49326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
49336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
49346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
49356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            default:
49366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
493724ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                    const char* t1 = parse_name(t, last, db,
493824ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                                                ends_with_template_args);
49396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 != t)
49406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
49416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        // parse but ignore discriminator
49426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        first = parse_discriminator(t1, last);
4943dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.size() < 2)
4944753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                            return first;
4945dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        auto name = db.Names.back();
4946dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
4947dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.empty())
4948eb3e8cf1bf71859b1683ed84414d0985a4801d58Mehdi Amini                            return first;
4949dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
4950dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.make<QualifiedName>(db.Names.back(), name);
49516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
4952dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    else if (!db.Names.empty())
4953dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
4954d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
4955d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
4956d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
4957d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
4958d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
4959d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return first;
4960d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
4961d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
49626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <name> ::= <nested-name> // N
49636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//        ::= <local-name> # See Scope Encoding below  // Z
49646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//        ::= <unscoped-template-name> <template-args>
49656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//        ::= <unscoped-name>
4966d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
49676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <unscoped-template-name> ::= <unscoped-name>
49686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                          ::= <substitution>
49696c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
4970d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char*
4971c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_name(const char* first, const char* last, Db& db,
497224ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith           bool* ends_with_template_args)
4973d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
49746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (last - first >= 2)
4975d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
49766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t0 = first;
49776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        // extension: ignore L here
49786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (*t0 == 'L')
49796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            ++t0;
49806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        switch (*t0)
4981d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
49826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'N':
49836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          {
498424ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith            const char* t1 = parse_nested_name(t0, last, db,
498524ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                                               ends_with_template_args);
49866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t1 != t0)
49876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t1;
4988d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            break;
49896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          }
49906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'Z':
49916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          {
499224ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith            const char* t1 = parse_local_name(t0, last, db,
499324ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                                              ends_with_template_args);
49946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t1 != t0)
49956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t1;
49966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
49976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          }
49986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        default:
49996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          {
50006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            const char* t1 = parse_unscoped_name(t0, last, db);
50016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t1 != t0)
5002d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
50036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 != last && *t1 == 'I')  // <unscoped-template-name> <template-args>
50046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5005dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5006753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5007761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                    db.Subs.push_back(db.Names.back());
50086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t0 = t1;
50096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t1 = parse_template_args(t0, last, db);
50106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 != t0)
50116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
5012dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.size() < 2)
5013753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                            return first;
5014dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        auto tmp = db.Names.back();
5015dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
5016dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.empty())
5017eb3e8cf1bf71859b1683ed84414d0985a4801d58Mehdi Amini                            return first;
5018dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
50190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            db.make<NameWithTemplateArgs>(
5020dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                db.Names.back(), tmp);
50216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        first = t1;
502224ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                        if (ends_with_template_args)
502324ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                            *ends_with_template_args = true;
50246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
50256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
50266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else   // <unscoped-name>
50276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t1;
5028d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
5029d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            else
50306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {   // try <substitution> <template-args>
50316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t1 = parse_substitution(t0, last, db);
5032b4033ff8b4db60bbd7f2498d85fd7c4dd0ad5b11Howard Hinnant                if (t1 != t0 && t1 != last && *t1 == 'I')
5033d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
50346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t0 = t1;
50356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t1 = parse_template_args(t0, last, db);
50366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 != t0)
5037d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    {
5038dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.size() < 2)
5039753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                            return first;
5040dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        auto tmp = db.Names.back();
5041dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
5042dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.empty())
5043eb3e8cf1bf71859b1683ed84414d0985a4801d58Mehdi Amini                            return first;
5044dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
50450024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            db.make<NameWithTemplateArgs>(
5046dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                db.Names.back(), tmp);
50476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        first = t1;
504824ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                        if (ends_with_template_args)
504924ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                            *ends_with_template_args = true;
5050d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    }
50516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
5052d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
5053d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            break;
50546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          }
5055d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
5056d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
5057d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return first;
5058d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
5059d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
50606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <call-offset> ::= h <nv-offset> _
50616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//               ::= v <v-offset> _
50626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//
50636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <nv-offset> ::= <offset number>
50646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//               # non-virtual base override
50656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//
50666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <v-offset>  ::= <offset number> _ <virtual offset number>
50676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//               # virtual base override, with vcall offset
5068d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
5069d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char*
50706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnantparse_call_offset(const char* first, const char* last)
5071d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
50726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (first != last)
5073d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
50746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        switch (*first)
5075d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
50766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'h':
5077ab87dcf97e2bba2b2b9aadc0877ebd3b8d7cab42Howard Hinnant            {
50786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            const char* t = parse_number(first + 1, last);
50796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t != first + 1 && t != last && *t == '_')
50806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                first = t + 1;
5081ab87dcf97e2bba2b2b9aadc0877ebd3b8d7cab42Howard Hinnant            }
50826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
50836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'v':
5084d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
50856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            const char* t = parse_number(first + 1, last);
50866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t != first + 1 && t != last && *t == '_')
5087d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
50886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t2 = parse_number(++t, last);
50896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t2 != t && t2 != last && *t2 == '_')
50906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t2 + 1;
5091d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
50926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
50936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
5094d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
5095d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
5096d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return first;
5097d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
5098d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
50996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <special-name> ::= TV <type>    # virtual table
51006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= TT <type>    # VTT structure (construction vtable index)
51016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= TI <type>    # typeinfo structure
51026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= TS <type>    # typeinfo name (null-terminated byte string)
51036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= Tc <call-offset> <call-offset> <base encoding>
51046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                    # base is the nominal target function of thunk
51056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                    # first call-offset is 'this' adjustment
51066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                    # second call-offset is result adjustment
51076c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= T <call-offset> <base encoding>
51086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                    # base is the nominal target function of thunk
51096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                ::= GV <object name> # Guard variable for one-time initialization
51106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//                                     # No <type>
5111c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier//                ::= TW <object name> # Thread-local wrapper
5112c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier//                ::= TH <object name> # Thread-local initialization
51136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//      extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
51146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//      extension ::= GR <object name> # reference temporary for object
5115d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
5116d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char*
5117c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_special_name(const char* first, const char* last, Db& db)
5118d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
51196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (last - first > 2)
5120d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
51216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t;
51226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        switch (*first)
5123d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
51246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'T':
5125d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            switch (first[1])
5126d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
51276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'V':
51286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // TV <type>    # virtual table
51296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_type(first+2, last, db);
51306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2)
51316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5132dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5133753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5134dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
5135dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.make<SpecialName>("vtable for ", db.Names.back());
51366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
51376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
5138d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
51396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'T':
51406c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // TT <type>    # VTT structure (construction vtable index)
51416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_type(first+2, last, db);
51426c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2)
51436c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5144dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5145753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5146dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
5147dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.make<SpecialName>("VTT for ", db.Names.back());
51486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
51496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
5150d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
51516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'I':
51526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // TI <type>    # typeinfo structure
51536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_type(first+2, last, db);
51546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2)
51556c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5156dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5157753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5158dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
5159dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.make<SpecialName>("typeinfo for ", db.Names.back());
51606c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
51616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
5162d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
51636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'S':
51646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // TS <type>    # typeinfo name (null-terminated byte string)
51656c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_type(first+2, last, db);
51666c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2)
51676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5168dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5169753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5170dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
5171dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.make<SpecialName>("typeinfo name for ", db.Names.back());
51726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
51736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
5174d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
51756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'c':
51766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // Tc <call-offset> <call-offset> <base encoding>
51776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant              {
51786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t0 = parse_call_offset(first+2, last);
51796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t0 == first+2)
51806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    break;
51816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t1 = parse_call_offset(t0, last);
51826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t1 == t0)
51836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    break;
51846c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_encoding(t1, last, db);
51856c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != t1)
51866c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5187dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5188753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5189dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
51900024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        db.make<SpecialName>("covariant return thunk to ",
5191dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                              db.Names.back());
51926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
51936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
51946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant              }
5195d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
51966c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'C':
51976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
51986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_type(first+2, last, db);
51996c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2)
5200d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
52016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    const char* t0 = parse_number(t, last);
52026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t0 != t && t0 != last && *t0 == '_')
52036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
52046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        const char* t1 = parse_type(++t0, last, db);
52056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        if (t1 != t0)
52066c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        {
5207dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            if (db.Names.size() < 2)
5208753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                                return first;
5209dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            auto left = db.Names.back();
5210dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.pop_back();
5211dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            if (db.Names.empty())
5212eb3e8cf1bf71859b1683ed84414d0985a4801d58Mehdi Amini                                return first;
5213dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                            db.Names.back() = db.make<CtorVtableSpecialName>(
5214dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                left, db.Names.back());
52156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            first = t1;
52166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        }
52176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
5218d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
5219d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
5220c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier            case 'W':
5221c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                // TW <object name> # Thread-local wrapper
5222c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                t = parse_name(first + 2, last, db);
5223c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                if (t != first + 2)
5224c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                {
5225dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
52260024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        return first;
5227dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
52280024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        db.make<SpecialName>("thread-local wrapper routine for ",
5229dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                              db.Names.back());
5230c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                    first = t;
5231c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                }
5232c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                break;
5233c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier            case 'H':
5234c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                //TH <object name> # Thread-local initialization
5235c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                t = parse_name(first + 2, last, db);
5236c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                if (t != first + 2)
5237c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                {
5238dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
52390024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        return first;
5240dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() = db.make<SpecialName>(
5241dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        "thread-local initialization routine for ", db.Names.back());
5242c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                    first = t;
5243c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                }
5244c2fa8f1bd7e3d22f49105c9b30e9c3e87e2428c6David Bozier                break;
5245d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            default:
52466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // T <call-offset> <base encoding>
5247d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
52486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t0 = parse_call_offset(first+1, last);
52496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t0 == first+1)
52506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    break;
52516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_encoding(t0, last, db);
52526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != t0)
52536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5254dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5255753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5256fdccce6f42f3ae5a66d5d3a08935489a04d64105Marshall Clow                    if (first[1] == 'v')
5257d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    {
5258dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
52590024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            db.make<SpecialName>("virtual thunk to ",
5260dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                                  db.Names.back());
52616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        first = t;
5262d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    }
52636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    else
5264d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    {
5265dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.back() =
52660024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            db.make<SpecialName>("non-virtual thunk to ",
5267dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                                  db.Names.back());
52686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        first = t;
5269d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    }
5270d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
52716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
52726c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
52736c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
52746c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
52756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'G':
52766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            switch (first[1])
52776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
52786c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'V':
52796c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // GV <object name> # Guard variable for one-time initialization
52806c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_name(first+2, last, db);
52816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2)
52826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5283dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5284753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5285dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
5286dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.make<SpecialName>("guard variable for ", db.Names.back());
52876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
52886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
52896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                break;
52906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            case 'R':
52916c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                // extension ::= GR <object name> # reference temporary for object
52926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                t = parse_name(first+2, last, db);
52936c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2)
52946c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
5295dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5296753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5297dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.back() =
52980024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        db.make<SpecialName>("reference temporary for ",
5299dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                              db.Names.back());
53006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
53016c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
5302d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                break;
5303d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
53046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
5305d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
5306d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
5307d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return first;
5308d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
5309d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
5310753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnanttemplate <class T>
5311753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnantclass save_value
5312753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant{
5313753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant    T& restore_;
5314753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant    T original_value_;
5315753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnantpublic:
5316753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant    save_value(T& restore)
5317753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant        : restore_(restore),
5318753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant          original_value_(restore)
5319753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant        {}
5320753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant
5321753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant    ~save_value()
5322753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant    {
5323753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant        restore_ = std::move(original_value_);
5324753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant    }
5325753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant
5326753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant    save_value(const save_value&) = delete;
5327753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant    save_value& operator=(const save_value&) = delete;
5328753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant};
5329753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant
53306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <encoding> ::= <function name> <bare-function-type>
53316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//            ::= <data name>
53326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant//            ::= <special-name>
5333d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
5334d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char*
5335c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_encoding(const char* first, const char* last, Db& db)
5336d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
5337d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    if (first != last)
5338d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
5339dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        save_value<decltype(db.EncodingDepth)> su(db.EncodingDepth);
5340dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        ++db.EncodingDepth;
5341dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        save_value<decltype(db.TagTemplates)> sb(db.TagTemplates);
5342dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        if (db.EncodingDepth > 1)
5343dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            db.TagTemplates = true;
5344dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        save_value<decltype(db.ParsedCtorDtorCV)> sp(db.ParsedCtorDtorCV);
5345dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.ParsedCtorDtorCV = false;
53466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        switch (*first)
5347d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        {
53486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'G':
53496c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        case 'T':
53506c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            first = parse_special_name(first, last, db);
53516c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
53526c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        default:
53536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          {
535424ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith            bool ends_with_template_args = false;
535524ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith            const char* t = parse_name(first, last, db,
535624ecd0992aeaf3e16c034053054bda0581e292f4Richard Smith                                       &ends_with_template_args);
5357dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            if (db.Names.empty())
53580024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                return first;
5359dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            Qualifiers cv = db.CV;
5360dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            FunctionRefQual ref = db.RefQuals;
53616c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (t != first)
5362d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            {
53636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != last && *t != 'E' && *t != '.')
5364d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                {
5365dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    save_value<bool> sb2(db.TagTemplates);
5366dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.TagTemplates = false;
53676c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    const char* t2;
5368dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (db.Names.empty())
5369753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
5370dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (!db.Names.back())
5371753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                        return first;
53720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                    Node* return_type = nullptr;
5373dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    if (!db.ParsedCtorDtorCV && ends_with_template_args)
5374d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    {
53756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        t2 = parse_type(t, last, db);
53766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        if (t2 == t)
53776c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            return first;
5378dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.size() < 1)
5379753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant                            return first;
5380dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        return_type = db.Names.back();
5381dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
53826c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        t = t2;
53836c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    }
53840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
53850024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                    Node* result = nullptr;
53860024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
53876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t != last && *t == 'v')
53886c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    {
53896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        ++t;
5390dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.empty())
5391b90082274531c38eb75bb5d30aac876d338004eaErik Pilkington                            return first;
5392dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        Node* name = db.Names.back();
5393dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
5394761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                        result = db.make<FunctionEncoding>(
53950024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            return_type, name, NodeArray());
5396d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    }
53976c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    else
5398d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    {
5399dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        size_t params_begin = db.Names.size();
54006c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        while (true)
5401d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                        {
54026c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            t2 = parse_type(t, last, db);
54036c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            if (t2 == t)
54046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                                break;
54056c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                            t = t2;
5406d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                        }
5407dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.size() < params_begin)
54080024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            return first;
54090024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        NodeArray params =
54100024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            db.popTrailingNodeArray(params_begin);
5411dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        if (db.Names.empty())
54120024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            return first;
5413dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        Node* name = db.Names.back();
5414dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                        db.Names.pop_back();
5415761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington                        result = db.make<FunctionEncoding>(
54160024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                            return_type, name, params);
5417d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                    }
54180024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                    if (ref != FrefQualNone)
54190024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        result = db.make<FunctionRefQualType>(result, ref);
54200024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                    if (cv != QualNone)
54210024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington                        result = db.make<FunctionQualType>(result, cv);
5422dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                    db.Names.push_back(result);
54236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
5424d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant                }
54256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
54266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    first = t;
5427d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant            }
54286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            break;
54296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant          }
5430d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        }
5431d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
5432d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return first;
5433d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
5434d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
54355dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// _block_invoke
54365dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// _block_invoke<decimal-digit>+
54375dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// _block_invoke_<decimal-digit>+
54385dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant
54395dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnantconst char*
5440c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_block_invoke(const char* first, const char* last, Db& db)
54415dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant{
54425dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant    if (last - first >= 13)
54435dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant    {
54440024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        // FIXME: strcmp?
54455dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        const char test[] = "_block_invoke";
54465dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        const char* t = first;
54475dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        for (int i = 0; i < 13; ++i, ++t)
54485dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        {
54495dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant            if (*t != test[i])
54505dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant                return first;
54515dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        }
54525dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        if (t != last)
54535dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        {
54545dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant            if (*t == '_')
54555dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant            {
54565dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant                // must have at least 1 decimal digit
54576c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (++t == last || !std::isdigit(*t))
54585dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant                    return first;
54595dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant                ++t;
54605dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant            }
54615dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant            // parse zero or more digits
54625dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant            while (t != last && isdigit(*t))
54635dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant                ++t;
54645dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        }
5465dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        if (db.Names.empty())
5466753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant            return first;
5467dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.Names.back() =
54680024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            db.make<SpecialName>("invocation function for block in ",
5469dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington                                  db.Names.back());
54706c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        first = t;
54715dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant    }
54725dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant    return first;
54735dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant}
54745dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant
54756c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// extension
54766c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant// <dot-suffix> := .<anything and everything>
5477d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
5478d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantconst char*
5479c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtonparse_dot_suffix(const char* first, const char* last, Db& db)
5480d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
54816c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (first != last && *first == '.')
5482d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
5483dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        if (db.Names.empty())
5484753a30dd68ae008948d48f16bc942d5963fe65a1Howard Hinnant            return first;
5485dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.Names.back() =
5486dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            db.make<DotSuffix>(db.Names.back(), StringView(first, last));
54876c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        first = last;
5488d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
5489d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return first;
5490d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
5491d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
5492761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonenum {
5493761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    unknown_error = -4,
5494761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    invalid_args = -3,
5495761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    invalid_mangled_name,
5496761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    memory_alloc_failure,
5497761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    success
5498761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington};
5499761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
55005dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// <block-involcaton-function> ___Z<encoding>_block_invoke
55015dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
55025dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant// <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
5503d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant// <mangled-name> ::= _Z<encoding>
5504d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant//                ::= <type>
5505d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnantvoid
5506c3926621b0d7904282728696bfe5b5a804b064c1Erik Pilkingtondemangle(const char* first, const char* last, Db& db, int& status)
5507d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant{
5508eb8d46c54e181eea4d33b96a9a13e2ac0bd329a8Howard Hinnant    if (first >= last)
5509d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
55106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        status = invalid_mangled_name;
5511d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        return;
5512d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
55136c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (*first == '_')
5514d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
55156c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (last - first >= 4)
55166c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
55176c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            if (first[1] == 'Z')
55186c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
55196c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t = parse_encoding(first+2, last, db);
55206c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+2 && t != last && *t == '.')
55216c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    t = parse_dot_suffix(t, last, db);
55226c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != last)
55236c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    status = invalid_mangled_name;
55246c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
55256c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z')
55266c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            {
55276c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                const char* t = parse_encoding(first+4, last, db);
55286c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                if (t != first+4 && t != last)
55296c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                {
55306c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    const char* t1 = parse_block_invoke(t, last, db);
55316c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    if (t1 != last)
55326c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                        status = invalid_mangled_name;
55336c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                }
55346c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                else
55356c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                    status = invalid_mangled_name;
55366c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            }
55376c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            else
55386c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant                status = invalid_mangled_name;
55396c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
55405dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant        else
55416c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            status = invalid_mangled_name;
55425dd173b3792e868a7ebfa699d156f24075eafc01Howard Hinnant    }
5543d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    else
5544d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
55456c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        const char* t = parse_type(first, last, db);
55466c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        if (t != last)
55476c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            status = invalid_mangled_name;
55486c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
5549dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington    if (status == success && db.Names.empty())
5550eb8d46c54e181eea4d33b96a9a13e2ac0bd329a8Howard Hinnant        status = invalid_mangled_name;
5551d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
5552d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant
55536c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}  // unnamed namespace
55546c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant
5555761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
5556761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkingtonnamespace __cxxabiv1 {
5557b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolextern "C" _LIBCXXABI_FUNC_VIS char *
555877a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool__cxa_demangle(const char *mangled_name, char *buf, size_t *n, int *status) {
55596c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (mangled_name == nullptr || (buf != nullptr && n == nullptr))
5560d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    {
5561d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant        if (status)
55626c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant            *status = invalid_args;
55636c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        return nullptr;
55646c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    }
55658cfa5a3ce80feee59b7790258ae254c291c3a2a6Saleem Abdulrasool
55668ad6a220cfff34f8ecbadc142891c7728c4d4ed8Howard Hinnant    size_t internal_size = buf != nullptr ? *n : 0;
5567ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington    Db db;
55686c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    int internal_status = success;
55690cbb1dae894eec86e0a2978d5a0f101f1761983cJonathan Roelofs    size_t len = std::strlen(mangled_name);
5570b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant    demangle(mangled_name, mangled_name + len, db,
55716c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant             internal_status);
55720024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5573dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington    if (internal_status == success && db.FixForwardReferences &&
5574ba34a24c6780a8050b9347c466717cb3d30ee501Erik Pilkington        !db.TemplateParams.empty())
5575b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant    {
5576dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.FixForwardReferences = false;
5577dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.TagTemplates = false;
5578dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.Names.clear();
5579dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        db.Subs.clear();
5580b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant        demangle(mangled_name, mangled_name + len, db, internal_status);
5581dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington        if (db.FixForwardReferences)
5582b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant            internal_status = invalid_mangled_name;
5583b2d1f94e76c016628f868868ed40a53c2b40b6edHoward Hinnant    }
55840024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
5585761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington    if (internal_status == success &&
5586761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        db.Names.back()->containsUnexpandedParameterPack())
5587761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington        internal_status = invalid_mangled_name;
5588761e6b02ba40b575106dda7957e4de1976b5315bErik Pilkington
55896c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (internal_status == success)
55906c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    {
55910024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        if (!buf)
55926c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
55930024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            internal_size = 1024;
55940024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            buf = static_cast<char*>(std::malloc(internal_size));
55956c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
55960024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington
55970024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        if (buf)
55986c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        {
55990024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            OutputStream s(buf, internal_size);
5600dc64cee52cc045127d8adf5570379a90488dc1c6Erik Pilkington            db.Names.back()->print(s);
56010024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            s += '\0';
56020024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            if (n) *n = s.getCurrentPosition();
56030024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            buf = s.getBuffer();
56046c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        }
56050024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington        else
56060024acd5db186ac64abe46dcf0abef5d654725c2Erik Pilkington            internal_status = memory_alloc_failure;
5607d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    }
56086c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    else
56096c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        buf = nullptr;
56106c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant    if (status)
56116c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant        *status = internal_status;
5612d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant    return buf;
5613d213ffdf3befead3b8f5a0ba12ce1c2d9949525Howard Hinnant}
56146c33e768c1b37af3e5d5f9f0e2a72fcf1dc51382Howard Hinnant}  // __cxxabiv1
5615