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