Home | History | Annotate | Download | only in src
      1 //===-------------------------- cxa_demangle.cpp --------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #define _LIBCPP_NO_EXCEPTIONS
     11 
     12 #include "__cxxabi_config.h"
     13 
     14 #include <vector>
     15 #include <algorithm>
     16 #include <string>
     17 #include <numeric>
     18 #include <cstdlib>
     19 #include <cstring>
     20 #include <cctype>
     21 
     22 #ifdef _MSC_VER
     23 // snprintf is implemented in VS 2015
     24 #if _MSC_VER < 1900
     25 #define snprintf _snprintf_s
     26 #endif
     27 #endif
     28 
     29 namespace __cxxabiv1
     30 {
     31 
     32 namespace
     33 {
     34 
     35 enum
     36 {
     37     unknown_error = -4,
     38     invalid_args = -3,
     39     invalid_mangled_name,
     40     memory_alloc_failure,
     41     success
     42 };
     43 
     44 template <std::size_t N>
     45 class arena
     46 {
     47     static const std::size_t alignment = 16;
     48     alignas(alignment) char buf_[N];
     49     char* ptr_;
     50 
     51     std::size_t
     52     align_up(std::size_t n) noexcept
     53         {return (n + (alignment-1)) & ~(alignment-1);}
     54 
     55     bool
     56     pointer_in_buffer(char* p) noexcept
     57         {return buf_ <= p && p <= buf_ + N;}
     58 
     59 public:
     60     arena() noexcept : ptr_(buf_) {}
     61     ~arena() {ptr_ = nullptr;}
     62     arena(const arena&) = delete;
     63     arena& operator=(const arena&) = delete;
     64 
     65     char* allocate(std::size_t n);
     66     void deallocate(char* p, std::size_t n) noexcept;
     67 
     68     static constexpr std::size_t size() {return N;}
     69     std::size_t used() const {return static_cast<std::size_t>(ptr_ - buf_);}
     70     void reset() {ptr_ = buf_;}
     71 };
     72 
     73 template <std::size_t N>
     74 char*
     75 arena<N>::allocate(std::size_t n)
     76 {
     77     n = align_up(n);
     78     if (static_cast<std::size_t>(buf_ + N - ptr_) >= n)
     79     {
     80         char* r = ptr_;
     81         ptr_ += n;
     82         return r;
     83     }
     84     return static_cast<char*>(std::malloc(n));
     85 }
     86 
     87 template <std::size_t N>
     88 void
     89 arena<N>::deallocate(char* p, std::size_t n) noexcept
     90 {
     91     if (pointer_in_buffer(p))
     92     {
     93         n = align_up(n);
     94         if (p + n == ptr_)
     95             ptr_ = p;
     96     }
     97     else
     98         std::free(p);
     99 }
    100 
    101 template <class T, std::size_t N>
    102 class short_alloc
    103 {
    104     arena<N>& a_;
    105 public:
    106     typedef T value_type;
    107 
    108 public:
    109     template <class _Up> struct rebind {typedef short_alloc<_Up, N> other;};
    110 
    111     short_alloc(arena<N>& a) noexcept : a_(a) {}
    112     template <class U>
    113         short_alloc(const short_alloc<U, N>& a) noexcept
    114             : a_(a.a_) {}
    115     short_alloc(const short_alloc&) = default;
    116     short_alloc& operator=(const short_alloc&) = delete;
    117 
    118     T* allocate(std::size_t n)
    119     {
    120         return reinterpret_cast<T*>(a_.allocate(n*sizeof(T)));
    121     }
    122     void deallocate(T* p, std::size_t n) noexcept
    123     {
    124         a_.deallocate(reinterpret_cast<char*>(p), n*sizeof(T));
    125     }
    126 
    127     template <class T1, std::size_t N1, class U, std::size_t M>
    128     friend
    129     bool
    130     operator==(const short_alloc<T1, N1>& x, const short_alloc<U, M>& y) noexcept;
    131 
    132     template <class U, std::size_t M> friend class short_alloc;
    133 };
    134 
    135 template <class T, std::size_t N, class U, std::size_t M>
    136 inline
    137 bool
    138 operator==(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
    139 {
    140     return N == M && &x.a_ == &y.a_;
    141 }
    142 
    143 template <class T, std::size_t N, class U, std::size_t M>
    144 inline
    145 bool
    146 operator!=(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
    147 {
    148     return !(x == y);
    149 }
    150 
    151 template <class T>
    152 class malloc_alloc
    153 {
    154 public:
    155     typedef T value_type;
    156     typedef T& reference;
    157     typedef const T& const_reference;
    158     typedef T* pointer;
    159     typedef const T* const_pointer;
    160     typedef std::size_t size_type;
    161     typedef std::ptrdiff_t difference_type;
    162 
    163     malloc_alloc() = default;
    164     template <class U> malloc_alloc(const malloc_alloc<U>&) noexcept {}
    165 
    166     T* allocate(std::size_t n)
    167     {
    168         return static_cast<T*>(std::malloc(n*sizeof(T)));
    169     }
    170     void deallocate(T* p, std::size_t) noexcept
    171     {
    172         std::free(p);
    173     }
    174 
    175     template <class U> struct rebind { using other = malloc_alloc<U>; };
    176     template <class U, class... Args>
    177     void construct(U* p, Args&&... args)
    178     {
    179         ::new ((void*)p) U(std::forward<Args>(args)...);
    180     }
    181     void destroy(T* p)
    182     {
    183         p->~T();
    184     }
    185 };
    186 
    187 template <class T, class U>
    188 inline
    189 bool
    190 operator==(const malloc_alloc<T>&, const malloc_alloc<U>&) noexcept
    191 {
    192     return true;
    193 }
    194 
    195 template <class T, class U>
    196 inline
    197 bool
    198 operator!=(const malloc_alloc<T>& x, const malloc_alloc<U>& y) noexcept
    199 {
    200     return !(x == y);
    201 }
    202 
    203 const size_t bs = 4 * 1024;
    204 template <class T> using Alloc = short_alloc<T, bs>;
    205 template <class T> using Vector = std::vector<T, Alloc<T>>;
    206 
    207 template <class StrT>
    208 struct string_pair
    209 {
    210     StrT first;
    211     StrT second;
    212 
    213     string_pair() = default;
    214     string_pair(StrT f) : first(std::move(f)) {}
    215     string_pair(StrT f, StrT s)
    216         : first(std::move(f)), second(std::move(s)) {}
    217     template <size_t N>
    218         string_pair(const char (&s)[N]) : first(s, N-1) {}
    219 
    220     size_t size() const {return first.size() + second.size();}
    221     bool empty() const { return first.empty() && second.empty(); }
    222     StrT full() const {return first + second;}
    223     StrT move_full() {return std::move(first) + std::move(second);}
    224 };
    225 
    226 struct Db
    227 {
    228     typedef std::basic_string<char, std::char_traits<char>,
    229                               malloc_alloc<char>> String;
    230     typedef Vector<string_pair<String>> sub_type;
    231     typedef Vector<sub_type> template_param_type;
    232     sub_type names;
    233     template_param_type subs;
    234     Vector<template_param_type> template_param;
    235     unsigned cv = 0;
    236     unsigned ref = 0;
    237     unsigned encoding_depth = 0;
    238     bool parsed_ctor_dtor_cv = false;
    239     bool tag_templates = true;
    240     bool fix_forward_references = false;
    241     bool try_to_parse_template_args = true;
    242 
    243     template <size_t N>
    244     Db(arena<N>& ar) :
    245         names(ar),
    246         subs(0, names, ar),
    247         template_param(0, subs, ar)
    248     {}
    249 };
    250 
    251 
    252 const char* parse_type(const char* first, const char* last, Db& db);
    253 const char* parse_encoding(const char* first, const char* last, Db& db);
    254 const char* parse_name(const char* first, const char* last, Db& db,
    255                        bool* ends_with_template_args = 0);
    256 const char* parse_expression(const char* first, const char* last, Db& db);
    257 const char* parse_template_args(const char* first, const char* last, Db& db);
    258 const char* parse_operator_name(const char* first, const char* last, Db& db);
    259 const char* parse_unqualified_name(const char* first, const char* last, Db& db);
    260 const char* parse_decltype(const char* first, const char* last, Db& db);
    261 
    262 template <class C>
    263 void
    264 print_stack(const C& db)
    265 {
    266     fprintf(stderr, "---------\n");
    267     fprintf(stderr, "names:\n");
    268     for (auto& s : db.names)
    269         fprintf(stderr, "{%s#%s}\n", s.first.c_str(), s.second.c_str());
    270     int i = -1;
    271     fprintf(stderr, "subs:\n");
    272     for (auto& v : db.subs)
    273     {
    274         if (i >= 0)
    275             fprintf(stderr, "S%i_ = {", i);
    276         else
    277             fprintf(stderr, "S_  = {");
    278         for (auto& s : v)
    279             fprintf(stderr, "{%s#%s}", s.first.c_str(), s.second.c_str());
    280         fprintf(stderr, "}\n");
    281         ++i;
    282     }
    283     fprintf(stderr, "template_param:\n");
    284     for (auto& t : db.template_param)
    285     {
    286         fprintf(stderr, "--\n");
    287         i = -1;
    288         for (auto& v : t)
    289         {
    290             if (i >= 0)
    291                 fprintf(stderr, "T%i_ = {", i);
    292             else
    293                 fprintf(stderr, "T_  = {");
    294             for (auto& s : v)
    295                 fprintf(stderr, "{%s#%s}", s.first.c_str(), s.second.c_str());
    296             fprintf(stderr, "}\n");
    297             ++i;
    298         }
    299     }
    300     fprintf(stderr, "---------\n\n");
    301 }
    302 
    303 template <class C>
    304 void
    305 print_state(const char* msg, const char* first, const char* last, const C& db)
    306 {
    307     fprintf(stderr, "%s: ", msg);
    308     for (; first != last; ++first)
    309         fprintf(stderr, "%c", *first);
    310     fprintf(stderr, "\n");
    311     print_stack(db);
    312 }
    313 
    314 // <number> ::= [n] <non-negative decimal integer>
    315 
    316 const char*
    317 parse_number(const char* first, const char* last)
    318 {
    319     if (first != last)
    320     {
    321         const char* t = first;
    322         if (*t == 'n')
    323             ++t;
    324         if (t != last)
    325         {
    326             if (*t == '0')
    327             {
    328                 first = t+1;
    329             }
    330             else if ('1' <= *t && *t <= '9')
    331             {
    332                 first = t+1;
    333                 while (first != last && std::isdigit(*first))
    334                     ++first;
    335             }
    336         }
    337     }
    338     return first;
    339 }
    340 
    341 template <class Float>
    342 struct float_data;
    343 
    344 template <>
    345 struct float_data<float>
    346 {
    347     static const size_t mangled_size = 8;
    348     static const size_t max_demangled_size = 24;
    349     static constexpr const char* spec = "%af";
    350 };
    351 
    352 constexpr const char* float_data<float>::spec;
    353 
    354 template <>
    355 struct float_data<double>
    356 {
    357     static const size_t mangled_size = 16;
    358     static const size_t max_demangled_size = 32;
    359     static constexpr const char* spec = "%a";
    360 };
    361 
    362 constexpr const char* float_data<double>::spec;
    363 
    364 template <>
    365 struct float_data<long double>
    366 {
    367 #if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \
    368     defined(__wasm__)
    369     static const size_t mangled_size = 32;
    370 #elif defined(__arm__) || defined(__mips__) || defined(__hexagon__)
    371     static const size_t mangled_size = 16;
    372 #else
    373     static const size_t mangled_size = 20;  // May need to be adjusted to 16 or 24 on other platforms
    374 #endif
    375     static const size_t max_demangled_size = 40;
    376     static constexpr const char* spec = "%LaL";
    377 };
    378 
    379 constexpr const char* float_data<long double>::spec;
    380 
    381 template <class Float>
    382 const char*
    383 parse_floating_number(const char* first, const char* last, Db& db)
    384 {
    385     const size_t N = float_data<Float>::mangled_size;
    386     if (static_cast<std::size_t>(last - first) > N)
    387     {
    388         last = first + N;
    389         union
    390         {
    391             Float value;
    392             char buf[sizeof(Float)];
    393         };
    394         const char* t = first;
    395         char* e = buf;
    396         for (; t != last; ++t, ++e)
    397         {
    398             if (!isxdigit(*t))
    399                 return first;
    400             unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
    401                                         static_cast<unsigned>(*t - 'a' + 10);
    402             ++t;
    403             unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
    404                                         static_cast<unsigned>(*t - 'a' + 10);
    405             *e = static_cast<char>((d1 << 4) + d0);
    406         }
    407         if (*t == 'E')
    408         {
    409 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    410             std::reverse(buf, e);
    411 #endif
    412             char num[float_data<Float>::max_demangled_size] = {0};
    413             int n = snprintf(num, sizeof(num), float_data<Float>::spec, value);
    414             if (static_cast<std::size_t>(n) >= sizeof(num))
    415                 return first;
    416             db.names.push_back(Db::String(num, static_cast<std::size_t>(n)));
    417             first = t+1;
    418         }
    419     }
    420     return first;
    421 }
    422 
    423 // <source-name> ::= <positive length number> <identifier>
    424 
    425 const char*
    426 parse_source_name(const char* first, const char* last, Db& db)
    427 {
    428     if (first != last)
    429     {
    430         char c = *first;
    431         if (isdigit(c) && first+1 != last)
    432         {
    433             const char* t = first+1;
    434             size_t n = static_cast<size_t>(c - '0');
    435             for (c = *t; isdigit(c); c = *t)
    436             {
    437                 n = n * 10 + static_cast<size_t>(c - '0');
    438                 if (++t == last)
    439                     return first;
    440             }
    441             if (static_cast<size_t>(last - t) >= n)
    442             {
    443                 Db::String r(t, n);
    444                 if (r.substr(0, 10) == "_GLOBAL__N")
    445                     db.names.push_back("(anonymous namespace)");
    446                 else
    447                     db.names.push_back(std::move(r));
    448                 first = t + n;
    449             }
    450         }
    451     }
    452     return first;
    453 }
    454 
    455 // <substitution> ::= S <seq-id> _
    456 //                ::= S_
    457 // <substitution> ::= Sa # ::std::allocator
    458 // <substitution> ::= Sb # ::std::basic_string
    459 // <substitution> ::= Ss # ::std::basic_string < char,
    460 //                                               ::std::char_traits<char>,
    461 //                                               ::std::allocator<char> >
    462 // <substitution> ::= Si # ::std::basic_istream<char,  std::char_traits<char> >
    463 // <substitution> ::= So # ::std::basic_ostream<char,  std::char_traits<char> >
    464 // <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
    465 
    466 const char*
    467 parse_substitution(const char* first, const char* last, Db& db)
    468 {
    469     if (last - first >= 2)
    470     {
    471         if (*first == 'S')
    472         {
    473             switch (first[1])
    474             {
    475             case 'a':
    476                 db.names.push_back("std::allocator");
    477                 first += 2;
    478                 break;
    479             case 'b':
    480                 db.names.push_back("std::basic_string");
    481                 first += 2;
    482                 break;
    483             case 's':
    484                 db.names.push_back("std::string");
    485                 first += 2;
    486                 break;
    487             case 'i':
    488                 db.names.push_back("std::istream");
    489                 first += 2;
    490                 break;
    491             case 'o':
    492                 db.names.push_back("std::ostream");
    493                 first += 2;
    494                 break;
    495             case 'd':
    496                 db.names.push_back("std::iostream");
    497                 first += 2;
    498                 break;
    499             case '_':
    500                 if (!db.subs.empty())
    501                 {
    502                     for (const auto& n : db.subs.front())
    503                         db.names.push_back(n);
    504                     first += 2;
    505                 }
    506                 break;
    507             default:
    508                 if (std::isdigit(first[1]) || std::isupper(first[1]))
    509                 {
    510                     size_t sub = 0;
    511                     const char* t = first+1;
    512                     if (std::isdigit(*t))
    513                         sub = static_cast<size_t>(*t - '0');
    514                     else
    515                         sub = static_cast<size_t>(*t - 'A') + 10;
    516                     for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
    517                     {
    518                         sub *= 36;
    519                         if (std::isdigit(*t))
    520                             sub += static_cast<size_t>(*t - '0');
    521                         else
    522                             sub += static_cast<size_t>(*t - 'A') + 10;
    523                     }
    524                     if (t == last || *t != '_')
    525                         return first;
    526                     ++sub;
    527                     if (sub < db.subs.size())
    528                     {
    529                         for (const auto& n : db.subs[sub])
    530                             db.names.push_back(n);
    531                         first = t+1;
    532                     }
    533                 }
    534                 break;
    535             }
    536         }
    537     }
    538     return first;
    539 }
    540 
    541 // <builtin-type> ::= v    # void
    542 //                ::= w    # wchar_t
    543 //                ::= b    # bool
    544 //                ::= c    # char
    545 //                ::= a    # signed char
    546 //                ::= h    # unsigned char
    547 //                ::= s    # short
    548 //                ::= t    # unsigned short
    549 //                ::= i    # int
    550 //                ::= j    # unsigned int
    551 //                ::= l    # long
    552 //                ::= m    # unsigned long
    553 //                ::= x    # long long, __int64
    554 //                ::= y    # unsigned long long, __int64
    555 //                ::= n    # __int128
    556 //                ::= o    # unsigned __int128
    557 //                ::= f    # float
    558 //                ::= d    # double
    559 //                ::= e    # long double, __float80
    560 //                ::= g    # __float128
    561 //                ::= z    # ellipsis
    562 //                ::= Dd   # IEEE 754r decimal floating point (64 bits)
    563 //                ::= De   # IEEE 754r decimal floating point (128 bits)
    564 //                ::= Df   # IEEE 754r decimal floating point (32 bits)
    565 //                ::= Dh   # IEEE 754r half-precision floating point (16 bits)
    566 //                ::= Di   # char32_t
    567 //                ::= Ds   # char16_t
    568 //                ::= Da   # auto (in dependent new-expressions)
    569 //                ::= Dc   # decltype(auto)
    570 //                ::= Dn   # std::nullptr_t (i.e., decltype(nullptr))
    571 //                ::= u <source-name>    # vendor extended type
    572 
    573 const char*
    574 parse_builtin_type(const char* first, const char* last, Db& db)
    575 {
    576     if (first != last)
    577     {
    578         switch (*first)
    579         {
    580         case 'v':
    581             db.names.push_back("void");
    582             ++first;
    583             break;
    584         case 'w':
    585             db.names.push_back("wchar_t");
    586             ++first;
    587             break;
    588         case 'b':
    589             db.names.push_back("bool");
    590             ++first;
    591             break;
    592         case 'c':
    593             db.names.push_back("char");
    594             ++first;
    595             break;
    596         case 'a':
    597             db.names.push_back("signed char");
    598             ++first;
    599             break;
    600         case 'h':
    601             db.names.push_back("unsigned char");
    602             ++first;
    603             break;
    604         case 's':
    605             db.names.push_back("short");
    606             ++first;
    607             break;
    608         case 't':
    609             db.names.push_back("unsigned short");
    610             ++first;
    611             break;
    612         case 'i':
    613             db.names.push_back("int");
    614             ++first;
    615             break;
    616         case 'j':
    617             db.names.push_back("unsigned int");
    618             ++first;
    619             break;
    620         case 'l':
    621             db.names.push_back("long");
    622             ++first;
    623             break;
    624         case 'm':
    625             db.names.push_back("unsigned long");
    626             ++first;
    627             break;
    628         case 'x':
    629             db.names.push_back("long long");
    630             ++first;
    631             break;
    632         case 'y':
    633             db.names.push_back("unsigned long long");
    634             ++first;
    635             break;
    636         case 'n':
    637             db.names.push_back("__int128");
    638             ++first;
    639             break;
    640         case 'o':
    641             db.names.push_back("unsigned __int128");
    642             ++first;
    643             break;
    644         case 'f':
    645             db.names.push_back("float");
    646             ++first;
    647             break;
    648         case 'd':
    649             db.names.push_back("double");
    650             ++first;
    651             break;
    652         case 'e':
    653             db.names.push_back("long double");
    654             ++first;
    655             break;
    656         case 'g':
    657             db.names.push_back("__float128");
    658             ++first;
    659             break;
    660         case 'z':
    661             db.names.push_back("...");
    662             ++first;
    663             break;
    664         case 'u':
    665             {
    666                 const char*t = parse_source_name(first+1, last, db);
    667                 if (t != first+1)
    668                     first = t;
    669             }
    670             break;
    671         case 'D':
    672             if (first+1 != last)
    673             {
    674                 switch (first[1])
    675                 {
    676                 case 'd':
    677                     db.names.push_back("decimal64");
    678                     first += 2;
    679                     break;
    680                 case 'e':
    681                     db.names.push_back("decimal128");
    682                     first += 2;
    683                     break;
    684                 case 'f':
    685                     db.names.push_back("decimal32");
    686                     first += 2;
    687                     break;
    688                 case 'h':
    689                     db.names.push_back("decimal16");
    690                     first += 2;
    691                     break;
    692                 case 'i':
    693                     db.names.push_back("char32_t");
    694                     first += 2;
    695                     break;
    696                 case 's':
    697                     db.names.push_back("char16_t");
    698                     first += 2;
    699                     break;
    700                 case 'a':
    701                     db.names.push_back("auto");
    702                     first += 2;
    703                     break;
    704                 case 'c':
    705                     db.names.push_back("decltype(auto)");
    706                     first += 2;
    707                     break;
    708                 case 'n':
    709                     db.names.push_back("std::nullptr_t");
    710                     first += 2;
    711                     break;
    712                 }
    713             }
    714             break;
    715         }
    716     }
    717     return first;
    718 }
    719 
    720 // <CV-qualifiers> ::= [r] [V] [K]
    721 
    722 const char*
    723 parse_cv_qualifiers(const char* first, const char* last, unsigned& cv)
    724 {
    725     cv = 0;
    726     if (first != last)
    727     {
    728         if (*first == 'r')
    729         {
    730             cv |= 4;
    731             ++first;
    732         }
    733         if (*first == 'V')
    734         {
    735             cv |= 2;
    736             ++first;
    737         }
    738         if (*first == 'K')
    739         {
    740             cv |= 1;
    741             ++first;
    742         }
    743     }
    744     return first;
    745 }
    746 
    747 // <template-param> ::= T_    # first template parameter
    748 //                  ::= T <parameter-2 non-negative number> _
    749 
    750 const char*
    751 parse_template_param(const char* first, const char* last, Db& db)
    752 {
    753     if (last - first >= 2)
    754     {
    755         if (*first == 'T')
    756         {
    757             if (first[1] == '_')
    758             {
    759                 if (db.template_param.empty())
    760                     return first;
    761                 if (!db.template_param.back().empty())
    762                 {
    763                     for (auto& t : db.template_param.back().front())
    764                         db.names.push_back(t);
    765                     first += 2;
    766                 }
    767                 else
    768                 {
    769                     db.names.push_back("T_");
    770                     first += 2;
    771                     db.fix_forward_references = true;
    772                 }
    773             }
    774             else if (isdigit(first[1]))
    775             {
    776                 const char* t = first+1;
    777                 size_t sub = static_cast<size_t>(*t - '0');
    778                 for (++t; t != last && isdigit(*t); ++t)
    779                 {
    780                     sub *= 10;
    781                     sub += static_cast<size_t>(*t - '0');
    782                 }
    783                 if (t == last || *t != '_' || db.template_param.empty())
    784                     return first;
    785                 ++sub;
    786                 if (sub < db.template_param.back().size())
    787                 {
    788                     for (auto& temp : db.template_param.back()[sub])
    789                         db.names.push_back(temp);
    790                     first = t+1;
    791                 }
    792                 else
    793                 {
    794                     db.names.push_back(Db::String(first, t+1));
    795                     first = t+1;
    796                     db.fix_forward_references = true;
    797                 }
    798             }
    799         }
    800     }
    801     return first;
    802 }
    803 
    804 // cc <type> <expression>                               # const_cast<type> (expression)
    805 
    806 const char*
    807 parse_const_cast_expr(const char* first, const char* last, Db& db)
    808 {
    809     if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
    810     {
    811         const char* t = parse_type(first+2, last, db);
    812         if (t != first+2)
    813         {
    814             const char* t1 = parse_expression(t, last, db);
    815             if (t1 != t)
    816             {
    817                 if (db.names.size() < 2)
    818                     return first;
    819                 auto expr = db.names.back().move_full();
    820                 db.names.pop_back();
    821                 if (db.names.empty())
    822                     return first;
    823                 db.names.back() = "const_cast<" + db.names.back().move_full() + ">(" + expr + ")";
    824                 first = t1;
    825             }
    826         }
    827     }
    828     return first;
    829 }
    830 
    831 // dc <type> <expression>                               # dynamic_cast<type> (expression)
    832 
    833 const char*
    834 parse_dynamic_cast_expr(const char* first, const char* last, Db& db)
    835 {
    836     if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
    837     {
    838         const char* t = parse_type(first+2, last, db);
    839         if (t != first+2)
    840         {
    841             const char* t1 = parse_expression(t, last, db);
    842             if (t1 != t)
    843             {
    844                 if (db.names.size() < 2)
    845                     return first;
    846                 auto expr = db.names.back().move_full();
    847                 db.names.pop_back();
    848                 if (db.names.empty())
    849                     return first;
    850                 db.names.back() = "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")";
    851                 first = t1;
    852             }
    853         }
    854     }
    855     return first;
    856 }
    857 
    858 // rc <type> <expression>                               # reinterpret_cast<type> (expression)
    859 
    860 const char*
    861 parse_reinterpret_cast_expr(const char* first, const char* last, Db& db)
    862 {
    863     if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
    864     {
    865         const char* t = parse_type(first+2, last, db);
    866         if (t != first+2)
    867         {
    868             const char* t1 = parse_expression(t, last, db);
    869             if (t1 != t)
    870             {
    871                 if (db.names.size() < 2)
    872                     return first;
    873                 auto expr = db.names.back().move_full();
    874                 db.names.pop_back();
    875                 if (db.names.empty())
    876                     return first;
    877                 db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + ">(" + expr + ")";
    878                 first = t1;
    879             }
    880         }
    881     }
    882     return first;
    883 }
    884 
    885 // sc <type> <expression>                               # static_cast<type> (expression)
    886 
    887 const char*
    888 parse_static_cast_expr(const char* first, const char* last, Db& db)
    889 {
    890     if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
    891     {
    892         const char* t = parse_type(first+2, last, db);
    893         if (t != first+2)
    894         {
    895             const char* t1 = parse_expression(t, last, db);
    896             if (t1 != t)
    897             {
    898                 if (db.names.size() < 2)
    899                     return first;
    900                 auto expr = db.names.back().move_full();
    901                 db.names.pop_back();
    902                 db.names.back() = "static_cast<" + db.names.back().move_full() + ">(" + expr + ")";
    903                 first = t1;
    904             }
    905         }
    906     }
    907     return first;
    908 }
    909 
    910 // sp <expression>                                  # pack expansion
    911 
    912 const char*
    913 parse_pack_expansion(const char* first, const char* last, Db& db)
    914 {
    915     if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
    916     {
    917         const char* t = parse_expression(first+2, last, db);
    918         if (t != first+2)
    919             first = t;
    920     }
    921     return first;
    922 }
    923 
    924 // st <type>                                            # sizeof (a type)
    925 
    926 const char*
    927 parse_sizeof_type_expr(const char* first, const char* last, Db& db)
    928 {
    929     if (last - first >= 3 && first[0] == 's' && first[1] == 't')
    930     {
    931         const char* t = parse_type(first+2, last, db);
    932         if (t != first+2)
    933         {
    934             if (db.names.empty())
    935                 return first;
    936             db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
    937             first = t;
    938         }
    939     }
    940     return first;
    941 }
    942 
    943 // sz <expr>                                            # sizeof (a expression)
    944 
    945 const char*
    946 parse_sizeof_expr_expr(const char* first, const char* last, Db& db)
    947 {
    948     if (last - first >= 3 && first[0] == 's' && first[1] == 'z')
    949     {
    950         const char* t = parse_expression(first+2, last, db);
    951         if (t != first+2)
    952         {
    953             if (db.names.empty())
    954                 return first;
    955             db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
    956             first = t;
    957         }
    958     }
    959     return first;
    960 }
    961 
    962 // sZ <template-param>                                  # size of a parameter pack
    963 
    964 const char*
    965 parse_sizeof_param_pack_expr(const char* first, const char* last, Db& db)
    966 {
    967     if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
    968     {
    969         size_t k0 = db.names.size();
    970         const char* t = parse_template_param(first+2, last, db);
    971         size_t k1 = db.names.size();
    972         if (t != first+2)
    973         {
    974             Db::String tmp("sizeof...(");
    975             size_t k = k0;
    976             if (k != k1)
    977             {
    978                 tmp += db.names[k].move_full();
    979                 for (++k; k != k1; ++k)
    980                     tmp += ", " + db.names[k].move_full();
    981             }
    982             tmp += ")";
    983             for (; k1 != k0; --k1)
    984                 db.names.pop_back();
    985             db.names.push_back(std::move(tmp));
    986             first = t;
    987         }
    988     }
    989     return first;
    990 }
    991 
    992 // <function-param> ::= fp <top-level CV-qualifiers> _                                     # L == 0, first parameter
    993 //                  ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _   # L == 0, second and later parameters
    994 //                  ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _         # L > 0, first parameter
    995 //                  ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> <parameter-2 non-negative number> _   # L > 0, second and later parameters
    996 
    997 const char*
    998 parse_function_param(const char* first, const char* last, Db& db)
    999 {
   1000     if (last - first >= 3 && *first == 'f')
   1001     {
   1002         if (first[1] == 'p')
   1003         {
   1004             unsigned cv;
   1005             const char* t = parse_cv_qualifiers(first+2, last, cv);
   1006             const char* t1 = parse_number(t, last);
   1007             if (t1 != last && *t1 == '_')
   1008             {
   1009                 db.names.push_back("fp" + Db::String(t, t1));
   1010                 first = t1+1;
   1011             }
   1012         }
   1013         else if (first[1] == 'L')
   1014         {
   1015             unsigned cv;
   1016             const char* t0 = parse_number(first+2, last);
   1017             if (t0 != last && *t0 == 'p')
   1018             {
   1019                 ++t0;
   1020                 const char* t = parse_cv_qualifiers(t0, last, cv);
   1021                 const char* t1 = parse_number(t, last);
   1022                 if (t1 != last && *t1 == '_')
   1023                 {
   1024                     db.names.push_back("fp" + Db::String(t, t1));
   1025                     first = t1+1;
   1026                 }
   1027             }
   1028         }
   1029     }
   1030     return first;
   1031 }
   1032 
   1033 // sZ <function-param>                                  # size of a function parameter pack
   1034 
   1035 const char*
   1036 parse_sizeof_function_param_pack_expr(const char* first, const char* last, Db& db)
   1037 {
   1038     if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
   1039     {
   1040         const char* t = parse_function_param(first+2, last, db);
   1041         if (t != first+2)
   1042         {
   1043             if (db.names.empty())
   1044                 return first;
   1045             db.names.back() = "sizeof...(" + db.names.back().move_full() + ")";
   1046             first = t;
   1047         }
   1048     }
   1049     return first;
   1050 }
   1051 
   1052 // te <expression>                                      # typeid (expression)
   1053 // ti <type>                                            # typeid (type)
   1054 
   1055 const char*
   1056 parse_typeid_expr(const char* first, const char* last, Db& db)
   1057 {
   1058     if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
   1059     {
   1060         const char* t;
   1061         if (first[1] == 'e')
   1062             t = parse_expression(first+2, last, db);
   1063         else
   1064             t = parse_type(first+2, last, db);
   1065         if (t != first+2)
   1066         {
   1067             if (db.names.empty())
   1068                 return first;
   1069             db.names.back() = "typeid(" + db.names.back().move_full() + ")";
   1070             first = t;
   1071         }
   1072     }
   1073     return first;
   1074 }
   1075 
   1076 // tw <expression>                                      # throw expression
   1077 
   1078 const char*
   1079 parse_throw_expr(const char* first, const char* last, Db& db)
   1080 {
   1081     if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
   1082     {
   1083         const char* t = parse_expression(first+2, last, db);
   1084         if (t != first+2)
   1085         {
   1086             if (db.names.empty())
   1087                 return first;
   1088             db.names.back() = "throw " + db.names.back().move_full();
   1089             first = t;
   1090         }
   1091     }
   1092     return first;
   1093 }
   1094 
   1095 // ds <expression> <expression>                         # expr.*expr
   1096 
   1097 const char*
   1098 parse_dot_star_expr(const char* first, const char* last, Db& db)
   1099 {
   1100     if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
   1101     {
   1102         const char* t = parse_expression(first+2, last, db);
   1103         if (t != first+2)
   1104         {
   1105             const char* t1 = parse_expression(t, last, db);
   1106             if (t1 != t)
   1107             {
   1108                 if (db.names.size() < 2)
   1109                     return first;
   1110                 auto expr = db.names.back().move_full();
   1111                 db.names.pop_back();
   1112                 db.names.back().first += ".*" + expr;
   1113                 first = t1;
   1114             }
   1115         }
   1116     }
   1117     return first;
   1118 }
   1119 
   1120 // <simple-id> ::= <source-name> [ <template-args> ]
   1121 
   1122 const char*
   1123 parse_simple_id(const char* first, const char* last, Db& db)
   1124 {
   1125     if (first != last)
   1126     {
   1127         const char* t = parse_source_name(first, last, db);
   1128         if (t != first)
   1129         {
   1130             const char* t1 = parse_template_args(t, last, db);
   1131             if (t1 != t)
   1132             {
   1133                 if (db.names.size() < 2)
   1134                     return first;
   1135                 auto args = db.names.back().move_full();
   1136                 db.names.pop_back();
   1137                 db.names.back().first += std::move(args);
   1138             }
   1139             first = t1;
   1140         }
   1141         else
   1142             first = t;
   1143     }
   1144     return first;
   1145 }
   1146 
   1147 // <unresolved-type> ::= <template-param>
   1148 //                   ::= <decltype>
   1149 //                   ::= <substitution>
   1150 
   1151 const char*
   1152 parse_unresolved_type(const char* first, const char* last, Db& db)
   1153 {
   1154     if (first != last)
   1155     {
   1156         const char* t = first;
   1157         switch (*first)
   1158         {
   1159         case 'T':
   1160           {
   1161             size_t k0 = db.names.size();
   1162             t = parse_template_param(first, last, db);
   1163             size_t k1 = db.names.size();
   1164             if (t != first && k1 == k0 + 1)
   1165             {
   1166                 db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   1167                 first = t;
   1168             }
   1169             else
   1170             {
   1171                 for (; k1 != k0; --k1)
   1172                     db.names.pop_back();
   1173             }
   1174             break;
   1175           }
   1176         case 'D':
   1177             t = parse_decltype(first, last, db);
   1178             if (t != first)
   1179             {
   1180                 if (db.names.empty())
   1181                     return first;
   1182                 db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   1183                 first = t;
   1184             }
   1185             break;
   1186         case 'S':
   1187             t = parse_substitution(first, last, db);
   1188             if (t != first)
   1189                 first = t;
   1190             else
   1191             {
   1192                 if (last - first > 2 && first[1] == 't')
   1193                 {
   1194                     t = parse_unqualified_name(first+2, last, db);
   1195                     if (t != first+2)
   1196                     {
   1197                         if (db.names.empty())
   1198                             return first;
   1199                         db.names.back().first.insert(0, "std::");
   1200                         db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   1201                         first = t;
   1202                     }
   1203                 }
   1204             }
   1205             break;
   1206        }
   1207     }
   1208     return first;
   1209 }
   1210 
   1211 // <destructor-name> ::= <unresolved-type>                               # e.g., ~T or ~decltype(f())
   1212 //                   ::= <simple-id>                                     # e.g., ~A<2*N>
   1213 
   1214 const char*
   1215 parse_destructor_name(const char* first, const char* last, Db& db)
   1216 {
   1217     if (first != last)
   1218     {
   1219         const char* t = parse_unresolved_type(first, last, db);
   1220         if (t == first)
   1221             t = parse_simple_id(first, last, db);
   1222         if (t != first)
   1223         {
   1224             if (db.names.empty())
   1225                 return first;
   1226             db.names.back().first.insert(0, "~");
   1227             first = t;
   1228         }
   1229     }
   1230     return first;
   1231 }
   1232 
   1233 // <base-unresolved-name> ::= <simple-id>                                # unresolved name
   1234 //          extension     ::= <operator-name>                            # unresolved operator-function-id
   1235 //          extension     ::= <operator-name> <template-args>            # unresolved operator template-id
   1236 //                        ::= on <operator-name>                         # unresolved operator-function-id
   1237 //                        ::= on <operator-name> <template-args>         # unresolved operator template-id
   1238 //                        ::= dn <destructor-name>                       # destructor or pseudo-destructor;
   1239 //                                                                         # e.g. ~X or ~X<N-1>
   1240 
   1241 const char*
   1242 parse_base_unresolved_name(const char* first, const char* last, Db& db)
   1243 {
   1244     if (last - first >= 2)
   1245     {
   1246         if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
   1247         {
   1248             if (first[0] == 'o')
   1249             {
   1250                 const char* t = parse_operator_name(first+2, last, db);
   1251                 if (t != first+2)
   1252                 {
   1253                     first = parse_template_args(t, last, db);
   1254                     if (first != t)
   1255                     {
   1256                         if (db.names.size() < 2)
   1257                             return first;
   1258                         auto args = db.names.back().move_full();
   1259                         db.names.pop_back();
   1260                         db.names.back().first += std::move(args);
   1261                     }
   1262                 }
   1263             }
   1264             else
   1265             {
   1266                 const char* t = parse_destructor_name(first+2, last, db);
   1267                 if (t != first+2)
   1268                     first = t;
   1269             }
   1270         }
   1271         else
   1272         {
   1273             const char* t = parse_simple_id(first, last, db);
   1274             if (t == first)
   1275             {
   1276                 t = parse_operator_name(first, last, db);
   1277                 if (t != first)
   1278                 {
   1279                     first = parse_template_args(t, last, db);
   1280                     if (first != t)
   1281                     {
   1282                         if (db.names.size() < 2)
   1283                             return first;
   1284                         auto args = db.names.back().move_full();
   1285                         db.names.pop_back();
   1286                         db.names.back().first += std::move(args);
   1287                     }
   1288                 }
   1289             }
   1290             else
   1291                 first = t;
   1292         }
   1293     }
   1294     return first;
   1295 }
   1296 
   1297 // <unresolved-qualifier-level> ::= <simple-id>
   1298 
   1299 const char*
   1300 parse_unresolved_qualifier_level(const char* first, const char* last, Db& db)
   1301 {
   1302     return parse_simple_id(first, last, db);
   1303 }
   1304 
   1305 // <unresolved-name>
   1306 //  extension        ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
   1307 //                   ::= [gs] <base-unresolved-name>                     # x or (with "gs") ::x
   1308 //                   ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
   1309 //                                                                       # A::x, N::y, A<T>::z; "gs" means leading "::"
   1310 //                   ::= sr <unresolved-type> <base-unresolved-name>     # T::x / decltype(p)::x
   1311 //  extension        ::= sr <unresolved-type> <template-args> <base-unresolved-name>
   1312 //                                                                       # T::N::x /decltype(p)::N::x
   1313 //  (ignored)        ::= srN <unresolved-type>  <unresolved-qualifier-level>+ E <base-unresolved-name>
   1314 
   1315 const char*
   1316 parse_unresolved_name(const char* first, const char* last, Db& db)
   1317 {
   1318     if (last - first > 2)
   1319     {
   1320         const char* t = first;
   1321         bool global = false;
   1322         if (t[0] == 'g' && t[1] == 's')
   1323         {
   1324             global = true;
   1325             t += 2;
   1326         }
   1327         const char* t2 = parse_base_unresolved_name(t, last, db);
   1328         if (t2 != t)
   1329         {
   1330             if (global)
   1331             {
   1332                 if (db.names.empty())
   1333                     return first;
   1334                 db.names.back().first.insert(0, "::");
   1335             }
   1336             first = t2;
   1337         }
   1338         else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
   1339         {
   1340             if (t[2] == 'N')
   1341             {
   1342                 t += 3;
   1343                 const char* t1 = parse_unresolved_type(t, last, db);
   1344                 if (t1 == t || t1 == last)
   1345                     return first;
   1346                 t = t1;
   1347                 t1 = parse_template_args(t, last, db);
   1348                 if (t1 != t)
   1349                 {
   1350                     if (db.names.size() < 2)
   1351                         return first;
   1352                     auto args = db.names.back().move_full();
   1353                     db.names.pop_back();
   1354                     db.names.back().first += std::move(args);
   1355                     t = t1;
   1356                     if (t == last)
   1357                     {
   1358                         db.names.pop_back();
   1359                         return first;
   1360                     }
   1361                 }
   1362                 while (*t != 'E')
   1363                 {
   1364                     t1 = parse_unresolved_qualifier_level(t, last, db);
   1365                     if (t1 == t || t1 == last || db.names.size() < 2)
   1366                         return first;
   1367                     auto s = db.names.back().move_full();
   1368                     db.names.pop_back();
   1369                     db.names.back().first += "::" + std::move(s);
   1370                     t = t1;
   1371                 }
   1372                 ++t;
   1373                 t1 = parse_base_unresolved_name(t, last, db);
   1374                 if (t1 == t)
   1375                 {
   1376                     if (!db.names.empty())
   1377                         db.names.pop_back();
   1378                     return first;
   1379                 }
   1380                 if (db.names.size() < 2)
   1381                     return first;
   1382                 auto s = db.names.back().move_full();
   1383                 db.names.pop_back();
   1384                 db.names.back().first += "::" + std::move(s);
   1385                 first = t1;
   1386             }
   1387             else
   1388             {
   1389                 t += 2;
   1390                 const char* t1 = parse_unresolved_type(t, last, db);
   1391                 if (t1 != t)
   1392                 {
   1393                     t = t1;
   1394                     t1 = parse_template_args(t, last, db);
   1395                     if (t1 != t)
   1396                     {
   1397                         if (db.names.size() < 2)
   1398                             return first;
   1399                         auto args = db.names.back().move_full();
   1400                         db.names.pop_back();
   1401                         db.names.back().first += std::move(args);
   1402                         t = t1;
   1403                     }
   1404                     t1 = parse_base_unresolved_name(t, last, db);
   1405                     if (t1 == t)
   1406                     {
   1407                         if (!db.names.empty())
   1408                             db.names.pop_back();
   1409                         return first;
   1410                     }
   1411                     if (db.names.size() < 2)
   1412                         return first;
   1413                     auto s = db.names.back().move_full();
   1414                     db.names.pop_back();
   1415                     db.names.back().first += "::" + std::move(s);
   1416                     first = t1;
   1417                 }
   1418                 else
   1419                 {
   1420                     t1 = parse_unresolved_qualifier_level(t, last, db);
   1421                     if (t1 == t || t1 == last)
   1422                         return first;
   1423                     t = t1;
   1424                     if (global)
   1425                     {
   1426                         if (db.names.empty())
   1427                             return first;
   1428                         db.names.back().first.insert(0, "::");
   1429                     }
   1430                     while (*t != 'E')
   1431                     {
   1432                         t1 = parse_unresolved_qualifier_level(t, last, db);
   1433                         if (t1 == t || t1 == last || db.names.size() < 2)
   1434                             return first;
   1435                         auto s = db.names.back().move_full();
   1436                         db.names.pop_back();
   1437                         db.names.back().first += "::" + std::move(s);
   1438                         t = t1;
   1439                     }
   1440                     ++t;
   1441                     t1 = parse_base_unresolved_name(t, last, db);
   1442                     if (t1 == t)
   1443                     {
   1444                         if (!db.names.empty())
   1445                             db.names.pop_back();
   1446                         return first;
   1447                     }
   1448                     if (db.names.size() < 2)
   1449                         return first;
   1450                     auto s = db.names.back().move_full();
   1451                     db.names.pop_back();
   1452                     db.names.back().first += "::" + std::move(s);
   1453                     first = t1;
   1454                 }
   1455             }
   1456         }
   1457     }
   1458     return first;
   1459 }
   1460 
   1461 // dt <expression> <unresolved-name>                    # expr.name
   1462 
   1463 const char*
   1464 parse_dot_expr(const char* first, const char* last, Db& db)
   1465 {
   1466     if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
   1467     {
   1468         const char* t = parse_expression(first+2, last, db);
   1469         if (t != first+2)
   1470         {
   1471             const char* t1 = parse_unresolved_name(t, last, db);
   1472             if (t1 != t)
   1473             {
   1474                 if (db.names.size() < 2)
   1475                     return first;
   1476                 auto name = db.names.back().move_full();
   1477                 db.names.pop_back();
   1478                 if (db.names.empty())
   1479                     return first;
   1480                 db.names.back().first += "." + name;
   1481                 first = t1;
   1482             }
   1483         }
   1484     }
   1485     return first;
   1486 }
   1487 
   1488 // cl <expression>+ E                                   # call
   1489 
   1490 const char*
   1491 parse_call_expr(const char* first, const char* last, Db& db)
   1492 {
   1493     if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
   1494     {
   1495         const char* t = parse_expression(first+2, last, db);
   1496         if (t != first+2)
   1497         {
   1498             if (t == last)
   1499                 return first;
   1500             if (db.names.empty())
   1501                 return first;
   1502             db.names.back().first += db.names.back().second;
   1503             db.names.back().second = Db::String();
   1504             db.names.back().first.append("(");
   1505             bool first_expr = true;
   1506             while (*t != 'E')
   1507             {
   1508                 const char* t1 = parse_expression(t, last, db);
   1509                 if (t1 == t || t1 == last)
   1510                     return first;
   1511                 if (db.names.empty())
   1512                     return first;
   1513                 auto tmp = db.names.back().move_full();
   1514                 db.names.pop_back();
   1515                 if (!tmp.empty())
   1516                 {
   1517                     if (db.names.empty())
   1518                         return first;
   1519                     if (!first_expr)
   1520                     {
   1521                         db.names.back().first.append(", ");
   1522                         first_expr = false;
   1523                     }
   1524                     db.names.back().first.append(tmp);
   1525                 }
   1526                 t = t1;
   1527             }
   1528             ++t;
   1529             if (db.names.empty())
   1530                 return first;
   1531             db.names.back().first.append(")");
   1532             first = t;
   1533         }
   1534     }
   1535     return first;
   1536 }
   1537 
   1538 // [gs] nw <expression>* _ <type> E                     # new (expr-list) type
   1539 // [gs] nw <expression>* _ <type> <initializer>         # new (expr-list) type (init)
   1540 // [gs] na <expression>* _ <type> E                     # new[] (expr-list) type
   1541 // [gs] na <expression>* _ <type> <initializer>         # new[] (expr-list) type (init)
   1542 // <initializer> ::= pi <expression>* E                 # parenthesized initialization
   1543 
   1544 const char*
   1545 parse_new_expr(const char* first, const char* last, Db& db)
   1546 {
   1547     if (last - first >= 4)
   1548     {
   1549         const char* t = first;
   1550         bool parsed_gs = false;
   1551         if (t[0] == 'g' && t[1] == 's')
   1552         {
   1553             t += 2;
   1554             parsed_gs = true;
   1555         }
   1556         if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
   1557         {
   1558             bool is_array = t[1] == 'a';
   1559             t += 2;
   1560             if (t == last)
   1561                 return first;
   1562             bool has_expr_list = false;
   1563             bool first_expr = true;
   1564             while (*t != '_')
   1565             {
   1566                 const char* t1 = parse_expression(t, last, db);
   1567                 if (t1 == t || t1 == last)
   1568                     return first;
   1569                 has_expr_list = true;
   1570                 if (!first_expr)
   1571                 {
   1572                     if (db.names.empty())
   1573                         return first;
   1574                     auto tmp = db.names.back().move_full();
   1575                     db.names.pop_back();
   1576                     if (!tmp.empty())
   1577                     {
   1578                         if (db.names.empty())
   1579                             return first;
   1580                         db.names.back().first.append(", ");
   1581                         db.names.back().first.append(tmp);
   1582                         first_expr = false;
   1583                     }
   1584                 }
   1585                 t = t1;
   1586             }
   1587             ++t;
   1588             const char* t1 = parse_type(t, last, db);
   1589             if (t1 == t || t1 == last)
   1590                 return first;
   1591             t = t1;
   1592             bool has_init = false;
   1593             if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
   1594             {
   1595                 t += 2;
   1596                 has_init = true;
   1597                 first_expr = true;
   1598                 while (*t != 'E')
   1599                 {
   1600                     t1 = parse_expression(t, last, db);
   1601                     if (t1 == t || t1 == last)
   1602                         return first;
   1603                     if (!first_expr)
   1604                     {
   1605                         if (db.names.empty())
   1606                             return first;
   1607                         auto tmp = db.names.back().move_full();
   1608                         db.names.pop_back();
   1609                         if (!tmp.empty())
   1610                         {
   1611                             if (db.names.empty())
   1612                                 return first;
   1613                             db.names.back().first.append(", ");
   1614                             db.names.back().first.append(tmp);
   1615                             first_expr = false;
   1616                         }
   1617                     }
   1618                     t = t1;
   1619                 }
   1620             }
   1621             if (*t != 'E')
   1622                 return first;
   1623             Db::String init_list;
   1624             if (has_init)
   1625             {
   1626                 if (db.names.empty())
   1627                     return first;
   1628                 init_list = db.names.back().move_full();
   1629                 db.names.pop_back();
   1630             }
   1631             if (db.names.empty())
   1632                 return first;
   1633             auto type = db.names.back().move_full();
   1634             db.names.pop_back();
   1635             Db::String expr_list;
   1636             if (has_expr_list)
   1637             {
   1638                 if (db.names.empty())
   1639                     return first;
   1640                 expr_list = db.names.back().move_full();
   1641                 db.names.pop_back();
   1642             }
   1643             Db::String r;
   1644             if (parsed_gs)
   1645                 r = "::";
   1646             if (is_array)
   1647                 r += "[] ";
   1648             else
   1649                 r += " ";
   1650             if (has_expr_list)
   1651                 r += "(" + expr_list + ") ";
   1652             r += type;
   1653             if (has_init)
   1654                 r += " (" + init_list + ")";
   1655             db.names.push_back(std::move(r));
   1656             first = t+1;
   1657         }
   1658     }
   1659     return first;
   1660 }
   1661 
   1662 // cv <type> <expression>                               # conversion with one argument
   1663 // cv <type> _ <expression>* E                          # conversion with a different number of arguments
   1664 
   1665 const char*
   1666 parse_conversion_expr(const char* first, const char* last, Db& db)
   1667 {
   1668     if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
   1669     {
   1670         bool try_to_parse_template_args = db.try_to_parse_template_args;
   1671         db.try_to_parse_template_args = false;
   1672         const char* t = parse_type(first+2, last, db);
   1673         db.try_to_parse_template_args = try_to_parse_template_args;
   1674         if (t != first+2 && t != last)
   1675         {
   1676             if (*t != '_')
   1677             {
   1678                 const char* t1 = parse_expression(t, last, db);
   1679                 if (t1 == t)
   1680                     return first;
   1681                 t = t1;
   1682             }
   1683             else
   1684             {
   1685                 ++t;
   1686                 if (t == last)
   1687                     return first;
   1688                 if (*t == 'E')
   1689                     db.names.emplace_back();
   1690                 else
   1691                 {
   1692                     bool first_expr = true;
   1693                     while (*t != 'E')
   1694                     {
   1695                         const char* t1 = parse_expression(t, last, db);
   1696                         if (t1 == t || t1 == last)
   1697                             return first;
   1698                         if (!first_expr)
   1699                         {
   1700                             if (db.names.empty())
   1701                                 return first;
   1702                             auto tmp = db.names.back().move_full();
   1703                             db.names.pop_back();
   1704                             if (!tmp.empty())
   1705                             {
   1706                                 if (db.names.empty())
   1707                                     return first;
   1708                                 db.names.back().first.append(", ");
   1709                                 db.names.back().first.append(tmp);
   1710                                 first_expr = false;
   1711                             }
   1712                         }
   1713                         t = t1;
   1714                     }
   1715                 }
   1716                 ++t;
   1717             }
   1718             if (db.names.size() < 2)
   1719                 return first;
   1720             auto tmp = db.names.back().move_full();
   1721             db.names.pop_back();
   1722             db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")";
   1723             first = t;
   1724         }
   1725     }
   1726     return first;
   1727 }
   1728 
   1729 // pt <expression> <expression>                    # expr->name
   1730 
   1731 const char*
   1732 parse_arrow_expr(const char* first, const char* last, Db& db)
   1733 {
   1734     if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
   1735     {
   1736         const char* t = parse_expression(first+2, last, db);
   1737         if (t != first+2)
   1738         {
   1739             const char* t1 = parse_expression(t, last, db);
   1740             if (t1 != t)
   1741             {
   1742                 if (db.names.size() < 2)
   1743                     return first;
   1744                 auto tmp = db.names.back().move_full();
   1745                 db.names.pop_back();
   1746                 db.names.back().first += "->";
   1747                 db.names.back().first += tmp;
   1748                 first = t1;
   1749             }
   1750         }
   1751     }
   1752     return first;
   1753 }
   1754 
   1755 //  <ref-qualifier> ::= R                   # & ref-qualifier
   1756 //  <ref-qualifier> ::= O                   # && ref-qualifier
   1757 
   1758 // <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E
   1759 
   1760 const char*
   1761 parse_function_type(const char* first, const char* last, Db& db)
   1762 {
   1763     if (first != last && *first == 'F')
   1764     {
   1765         const char* t = first+1;
   1766         if (t != last)
   1767         {
   1768             if (*t == 'Y')
   1769             {
   1770                 /* extern "C" */
   1771                 if (++t == last)
   1772                     return first;
   1773             }
   1774             const char* t1 = parse_type(t, last, db);
   1775             if (t1 != t)
   1776             {
   1777                 t = t1;
   1778                 Db::String sig("(");
   1779                 int ref_qual = 0;
   1780                 while (true)
   1781                 {
   1782                     if (t == last)
   1783                     {
   1784                         if (!db.names.empty())
   1785                           db.names.pop_back();
   1786                         return first;
   1787                     }
   1788                     if (*t == 'E')
   1789                     {
   1790                         ++t;
   1791                         break;
   1792                     }
   1793                     if (*t == 'v')
   1794                     {
   1795                         ++t;
   1796                         continue;
   1797                     }
   1798                     if (*t == 'R' && t+1 != last && t[1] == 'E')
   1799                     {
   1800                         ref_qual = 1;
   1801                         ++t;
   1802                         continue;
   1803                     }
   1804                     if (*t == 'O' && t+1 != last && t[1] == 'E')
   1805                     {
   1806                         ref_qual = 2;
   1807                         ++t;
   1808                         continue;
   1809                     }
   1810                     size_t k0 = db.names.size();
   1811                     t1 = parse_type(t, last, db);
   1812                     size_t k1 = db.names.size();
   1813                     if (t1 == t || t1 == last)
   1814                         return first;
   1815                     for (size_t k = k0; k < k1; ++k)
   1816                     {
   1817                         if (sig.size() > 1)
   1818                             sig += ", ";
   1819                         sig += db.names[k].move_full();
   1820                     }
   1821                     for (size_t k = k0; k < k1; ++k)
   1822                         db.names.pop_back();
   1823                     t = t1;
   1824                 }
   1825                 sig += ")";
   1826                 switch (ref_qual)
   1827                 {
   1828                 case 1:
   1829                     sig += " &";
   1830                     break;
   1831                 case 2:
   1832                     sig += " &&";
   1833                     break;
   1834                 }
   1835                 if (db.names.empty())
   1836                     return first;
   1837                 db.names.back().first += " ";
   1838                 db.names.back().second.insert(0, sig);
   1839                 first = t;
   1840             }
   1841         }
   1842     }
   1843     return first;
   1844 }
   1845 
   1846 // <pointer-to-member-type> ::= M <class type> <member type>
   1847 
   1848 const char*
   1849 parse_pointer_to_member_type(const char* first, const char* last, Db& db)
   1850 {
   1851     if (first != last && *first == 'M')
   1852     {
   1853         const char* t = parse_type(first+1, last, db);
   1854         if (t != first+1)
   1855         {
   1856             const char* t2 = parse_type(t, last, db);
   1857             if (t2 != t)
   1858             {
   1859                 if (db.names.size() < 2)
   1860                     return first;
   1861                 auto func = std::move(db.names.back());
   1862                 db.names.pop_back();
   1863                 auto class_type = std::move(db.names.back());
   1864                 if (!func.second.empty() && func.second.front() == '(')
   1865                 {
   1866                     db.names.back().first = std::move(func.first) + "(" + class_type.move_full() + "::*";
   1867                     db.names.back().second = ")" + std::move(func.second);
   1868                 }
   1869                 else
   1870                 {
   1871                     db.names.back().first = std::move(func.first) + " " + class_type.move_full() + "::*";
   1872                     db.names.back().second = std::move(func.second);
   1873                 }
   1874                 first = t2;
   1875             }
   1876         }
   1877     }
   1878     return first;
   1879 }
   1880 
   1881 // <array-type> ::= A <positive dimension number> _ <element type>
   1882 //              ::= A [<dimension expression>] _ <element type>
   1883 
   1884 const char*
   1885 parse_array_type(const char* first, const char* last, Db& db)
   1886 {
   1887     if (first != last && *first == 'A' && first+1 != last)
   1888     {
   1889         if (first[1] == '_')
   1890         {
   1891             const char* t = parse_type(first+2, last, db);
   1892             if (t != first+2)
   1893             {
   1894                 if (db.names.empty())
   1895                     return first;
   1896                 if (db.names.back().second.substr(0, 2) == " [")
   1897                     db.names.back().second.erase(0, 1);
   1898                 db.names.back().second.insert(0, " []");
   1899                 first = t;
   1900             }
   1901         }
   1902         else if ('1' <= first[1] && first[1] <= '9')
   1903         {
   1904             const char* t = parse_number(first+1, last);
   1905             if (t != last && *t == '_')
   1906             {
   1907                 const char* t2 = parse_type(t+1, last, db);
   1908                 if (t2 != t+1)
   1909                 {
   1910                     if (db.names.empty())
   1911                         return first;
   1912                     if (db.names.back().second.substr(0, 2) == " [")
   1913                         db.names.back().second.erase(0, 1);
   1914                     db.names.back().second.insert(0, " [" + Db::String(first+1, t) + "]");
   1915                     first = t2;
   1916                 }
   1917             }
   1918         }
   1919         else
   1920         {
   1921             const char* t = parse_expression(first+1, last, db);
   1922             if (t != first+1 && t != last && *t == '_')
   1923             {
   1924                 const char* t2 = parse_type(++t, last, db);
   1925                 if (t2 != t)
   1926                 {
   1927                     if (db.names.size() < 2)
   1928                         return first;
   1929                     auto type = std::move(db.names.back());
   1930                     db.names.pop_back();
   1931                     auto expr = std::move(db.names.back());
   1932                     db.names.back().first = std::move(type.first);
   1933                     if (type.second.substr(0, 2) == " [")
   1934                         type.second.erase(0, 1);
   1935                     db.names.back().second = " [" + expr.move_full() + "]" + std::move(type.second);
   1936                     first = t2;
   1937                 }
   1938             }
   1939         }
   1940     }
   1941     return first;
   1942 }
   1943 
   1944 // <decltype>  ::= Dt <expression> E  # decltype of an id-expression or class member access (C++0x)
   1945 //             ::= DT <expression> E  # decltype of an expression (C++0x)
   1946 
   1947 const char*
   1948 parse_decltype(const char* first, const char* last, Db& db)
   1949 {
   1950     if (last - first >= 4 && first[0] == 'D')
   1951     {
   1952         switch (first[1])
   1953         {
   1954         case 't':
   1955         case 'T':
   1956             {
   1957                 const char* t = parse_expression(first+2, last, db);
   1958                 if (t != first+2 && t != last && *t == 'E')
   1959                 {
   1960                     if (db.names.empty())
   1961                         return first;
   1962                     db.names.back() = "decltype(" + db.names.back().move_full() + ")";
   1963                     first = t+1;
   1964                 }
   1965             }
   1966             break;
   1967         }
   1968     }
   1969     return first;
   1970 }
   1971 
   1972 // extension:
   1973 // <vector-type>           ::= Dv <positive dimension number> _
   1974 //                                    <extended element type>
   1975 //                         ::= Dv [<dimension expression>] _ <element type>
   1976 // <extended element type> ::= <element type>
   1977 //                         ::= p # AltiVec vector pixel
   1978 
   1979 const char*
   1980 parse_vector_type(const char* first, const char* last, Db& db)
   1981 {
   1982     if (last - first > 3 && first[0] == 'D' && first[1] == 'v')
   1983     {
   1984         if ('1' <= first[2] && first[2] <= '9')
   1985         {
   1986             const char* t = parse_number(first+2, last);
   1987             if (t == last || *t != '_')
   1988                 return first;
   1989             const char* num = first + 2;
   1990             size_t sz = static_cast<size_t>(t - num);
   1991             if (++t != last)
   1992             {
   1993                 if (*t != 'p')
   1994                 {
   1995                     const char* t1 = parse_type(t, last, db);
   1996                     if (t1 != t)
   1997                     {
   1998                         if (db.names.empty())
   1999                             return first;
   2000                         db.names.back().first += " vector[" + Db::String(num, sz) + "]";
   2001                         first = t1;
   2002                     }
   2003                 }
   2004                 else
   2005                 {
   2006                     ++t;
   2007                     db.names.push_back("pixel vector[" + Db::String(num, sz) + "]");
   2008                     first = t;
   2009                 }
   2010             }
   2011         }
   2012         else
   2013         {
   2014             Db::String num;
   2015             const char* t1 = first+2;
   2016             if (*t1 != '_')
   2017             {
   2018                 const char* t = parse_expression(t1, last, db);
   2019                 if (t != t1)
   2020                 {
   2021                     if (db.names.empty())
   2022                         return first;
   2023                     num = db.names.back().move_full();
   2024                     db.names.pop_back();
   2025                     t1 = t;
   2026                 }
   2027             }
   2028             if (t1 != last && *t1 == '_' && ++t1 != last)
   2029             {
   2030                 const char* t = parse_type(t1, last, db);
   2031                 if (t != t1)
   2032                 {
   2033                     if (db.names.empty())
   2034                         return first;
   2035                     db.names.back().first += " vector[" + num + "]";
   2036                     first = t;
   2037                 }
   2038             }
   2039         }
   2040     }
   2041     return first;
   2042 }
   2043 
   2044 // <type> ::= <builtin-type>
   2045 //        ::= <function-type>
   2046 //        ::= <class-enum-type>
   2047 //        ::= <array-type>
   2048 //        ::= <pointer-to-member-type>
   2049 //        ::= <template-param>
   2050 //        ::= <template-template-param> <template-args>
   2051 //        ::= <decltype>
   2052 //        ::= <substitution>
   2053 //        ::= <CV-qualifiers> <type>
   2054 //        ::= P <type>        # pointer-to
   2055 //        ::= R <type>        # reference-to
   2056 //        ::= O <type>        # rvalue reference-to (C++0x)
   2057 //        ::= C <type>        # complex pair (C 2000)
   2058 //        ::= G <type>        # imaginary (C 2000)
   2059 //        ::= Dp <type>       # pack expansion (C++0x)
   2060 //        ::= U <source-name> <type>  # vendor extended type qualifier
   2061 // extension := U <objc-name> <objc-type>  # objc-type<identifier>
   2062 // extension := <vector-type> # <vector-type> starts with Dv
   2063 
   2064 // <objc-name> ::= <k0 number> objcproto <k1 number> <identifier>  # k0 = 9 + <number of digits in k1> + k1
   2065 // <objc-type> := <source-name>  # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
   2066 
   2067 const char*
   2068 parse_type(const char* first, const char* last, Db& db)
   2069 {
   2070     if (first != last)
   2071     {
   2072         switch (*first)
   2073         {
   2074             case 'r':
   2075             case 'V':
   2076             case 'K':
   2077               {
   2078                 unsigned cv = 0;
   2079                 const char* t = parse_cv_qualifiers(first, last, cv);
   2080                 if (t != first)
   2081                 {
   2082                     bool is_function = *t == 'F';
   2083                     size_t k0 = db.names.size();
   2084                     const char* t1 = parse_type(t, last, db);
   2085                     size_t k1 = db.names.size();
   2086                     if (t1 != t)
   2087                     {
   2088                         if (is_function)
   2089                             db.subs.pop_back();
   2090                         db.subs.emplace_back(db.names.get_allocator());
   2091                         for (size_t k = k0; k < k1; ++k)
   2092                         {
   2093                             if (is_function)
   2094                             {
   2095                                 size_t p = db.names[k].second.size();
   2096                                 if (db.names[k].second[p - 2] == '&' &&
   2097                                     db.names[k].second[p - 1] == '&')
   2098                                     p -= 2;
   2099                                 else if (db.names[k].second.back() == '&')
   2100                                     p -= 1;
   2101                                 if (cv & 1)
   2102                                 {
   2103                                     db.names[k].second.insert(p, " const");
   2104                                     p += 6;
   2105                                 }
   2106                                 if (cv & 2)
   2107                                 {
   2108                                     db.names[k].second.insert(p, " volatile");
   2109                                     p += 9;
   2110                                 }
   2111                                 if (cv & 4)
   2112                                     db.names[k].second.insert(p, " restrict");
   2113                             }
   2114                             else
   2115                             {
   2116                                 if (cv & 1)
   2117                                     db.names[k].first.append(" const");
   2118                                 if (cv & 2)
   2119                                     db.names[k].first.append(" volatile");
   2120                                 if (cv & 4)
   2121                                     db.names[k].first.append(" restrict");
   2122                             }
   2123                             db.subs.back().push_back(db.names[k]);
   2124                         }
   2125                         first = t1;
   2126                     }
   2127                 }
   2128               }
   2129                 break;
   2130             default:
   2131               {
   2132                 const char* t = parse_builtin_type(first, last, db);
   2133                 if (t != first)
   2134                 {
   2135                     first = t;
   2136                 }
   2137                 else
   2138                 {
   2139                     switch (*first)
   2140                     {
   2141                     case 'A':
   2142                         t = parse_array_type(first, last, db);
   2143                         if (t != first)
   2144                         {
   2145                             if (db.names.empty())
   2146                                 return first;
   2147                             first = t;
   2148                             db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2149                         }
   2150                         break;
   2151                     case 'C':
   2152                         t = parse_type(first+1, last, db);
   2153                         if (t != first+1)
   2154                         {
   2155                             if (db.names.empty())
   2156                                 return first;
   2157                             db.names.back().first.append(" complex");
   2158                             first = t;
   2159                             db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2160                         }
   2161                         break;
   2162                     case 'F':
   2163                         t = parse_function_type(first, last, db);
   2164                         if (t != first)
   2165                         {
   2166                             if (db.names.empty())
   2167                                 return first;
   2168                             first = t;
   2169                             db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2170                         }
   2171                         break;
   2172                     case 'G':
   2173                         t = parse_type(first+1, last, db);
   2174                         if (t != first+1)
   2175                         {
   2176                             if (db.names.empty())
   2177                                 return first;
   2178                             db.names.back().first.append(" imaginary");
   2179                             first = t;
   2180                             db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2181                         }
   2182                         break;
   2183                     case 'M':
   2184                         t = parse_pointer_to_member_type(first, last, db);
   2185                         if (t != first)
   2186                         {
   2187                             if (db.names.empty())
   2188                                 return first;
   2189                             first = t;
   2190                             db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2191                         }
   2192                         break;
   2193                     case 'O':
   2194                       {
   2195                         size_t k0 = db.names.size();
   2196                         t = parse_type(first+1, last, db);
   2197                         size_t k1 = db.names.size();
   2198                         if (t != first+1)
   2199                         {
   2200                             db.subs.emplace_back(db.names.get_allocator());
   2201                             for (size_t k = k0; k < k1; ++k)
   2202                             {
   2203                                 if (db.names[k].second.substr(0, 2) == " [")
   2204                                 {
   2205                                     db.names[k].first += " (";
   2206                                     db.names[k].second.insert(0, ")");
   2207                                 }
   2208                                 else if (!db.names[k].second.empty() &&
   2209                                           db.names[k].second.front() == '(')
   2210                                 {
   2211                                     db.names[k].first += "(";
   2212                                     db.names[k].second.insert(0, ")");
   2213                                 }
   2214                                 db.names[k].first.append("&&");
   2215                                 db.subs.back().push_back(db.names[k]);
   2216                             }
   2217                             first = t;
   2218                         }
   2219                         break;
   2220                       }
   2221                     case 'P':
   2222                       {
   2223                         size_t k0 = db.names.size();
   2224                         t = parse_type(first+1, last, db);
   2225                         size_t k1 = db.names.size();
   2226                         if (t != first+1)
   2227                         {
   2228                             db.subs.emplace_back(db.names.get_allocator());
   2229                             for (size_t k = k0; k < k1; ++k)
   2230                             {
   2231                                 if (db.names[k].second.substr(0, 2) == " [")
   2232                                 {
   2233                                     db.names[k].first += " (";
   2234                                     db.names[k].second.insert(0, ")");
   2235                                 }
   2236                                 else if (!db.names[k].second.empty() &&
   2237                                           db.names[k].second.front() == '(')
   2238                                 {
   2239                                     db.names[k].first += "(";
   2240                                     db.names[k].second.insert(0, ")");
   2241                                 }
   2242                                 if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<")
   2243                                 {
   2244                                     db.names[k].first.append("*");
   2245                                 }
   2246                                 else
   2247                                 {
   2248                                     db.names[k].first.replace(0, 11, "id");
   2249                                 }
   2250                                 db.subs.back().push_back(db.names[k]);
   2251                             }
   2252                             first = t;
   2253                         }
   2254                         break;
   2255                       }
   2256                     case 'R':
   2257                       {
   2258                         size_t k0 = db.names.size();
   2259                         t = parse_type(first+1, last, db);
   2260                         size_t k1 = db.names.size();
   2261                         if (t != first+1)
   2262                         {
   2263                             db.subs.emplace_back(db.names.get_allocator());
   2264                             for (size_t k = k0; k < k1; ++k)
   2265                             {
   2266                                 if (db.names[k].second.substr(0, 2) == " [")
   2267                                 {
   2268                                     db.names[k].first += " (";
   2269                                     db.names[k].second.insert(0, ")");
   2270                                 }
   2271                                 else if (!db.names[k].second.empty() &&
   2272                                           db.names[k].second.front() == '(')
   2273                                 {
   2274                                     db.names[k].first += "(";
   2275                                     db.names[k].second.insert(0, ")");
   2276                                 }
   2277                                 db.names[k].first.append("&");
   2278                                 db.subs.back().push_back(db.names[k]);
   2279                             }
   2280                             first = t;
   2281                         }
   2282                         break;
   2283                       }
   2284                     case 'T':
   2285                       {
   2286                         size_t k0 = db.names.size();
   2287                         t = parse_template_param(first, last, db);
   2288                         size_t k1 = db.names.size();
   2289                         if (t != first)
   2290                         {
   2291                             db.subs.emplace_back(db.names.get_allocator());
   2292                             for (size_t k = k0; k < k1; ++k)
   2293                                 db.subs.back().push_back(db.names[k]);
   2294                             if (db.try_to_parse_template_args && k1 == k0+1)
   2295                             {
   2296                                 const char* t1 = parse_template_args(t, last, db);
   2297                                 if (t1 != t)
   2298                                 {
   2299                                     auto args = db.names.back().move_full();
   2300                                     db.names.pop_back();
   2301                                     db.names.back().first += std::move(args);
   2302                                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2303                                     t = t1;
   2304                                 }
   2305                             }
   2306                             first = t;
   2307                         }
   2308                         break;
   2309                       }
   2310                     case 'U':
   2311                         if (first+1 != last)
   2312                         {
   2313                             t = parse_source_name(first+1, last, db);
   2314                             if (t != first+1)
   2315                             {
   2316                                 const char* t2 = parse_type(t, last, db);
   2317                                 if (t2 != t)
   2318                                 {
   2319                                     if (db.names.size() < 2)
   2320                                         return first;
   2321                                     auto type = db.names.back().move_full();
   2322                                     db.names.pop_back();
   2323                                     if (db.names.back().first.substr(0, 9) != "objcproto")
   2324                                     {
   2325                                         db.names.back() = type + " " + db.names.back().move_full();
   2326                                     }
   2327                                     else
   2328                                     {
   2329                                         auto proto = db.names.back().move_full();
   2330                                         db.names.pop_back();
   2331                                         t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db);
   2332                                         if (t != proto.data() + 9)
   2333                                         {
   2334                                             db.names.back() = type + "<" + db.names.back().move_full() + ">";
   2335                                         }
   2336                                         else
   2337                                         {
   2338                                             db.names.push_back(type + " " + proto);
   2339                                         }
   2340                                     }
   2341                                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2342                                     first = t2;
   2343                                 }
   2344                             }
   2345                         }
   2346                         break;
   2347                     case 'S':
   2348                         if (first+1 != last && first[1] == 't')
   2349                         {
   2350                             t = parse_name(first, last, db);
   2351                             if (t != first)
   2352                             {
   2353                                 if (db.names.empty())
   2354                                     return first;
   2355                                 db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2356                                 first = t;
   2357                             }
   2358                         }
   2359                         else
   2360                         {
   2361                             t = parse_substitution(first, last, db);
   2362                             if (t != first)
   2363                             {
   2364                                 first = t;
   2365                                 // Parsed a substitution.  If the substitution is a
   2366                                 //  <template-param> it might be followed by <template-args>.
   2367                                 if (db.try_to_parse_template_args)
   2368                                 {
   2369                                     t = parse_template_args(first, last, db);
   2370                                     if (t != first)
   2371                                     {
   2372                                         if (db.names.size() < 2)
   2373                                             return first;
   2374                                         auto template_args = db.names.back().move_full();
   2375                                         db.names.pop_back();
   2376                                         db.names.back().first += template_args;
   2377                                         // Need to create substitution for <template-template-param> <template-args>
   2378                                         db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2379                                         first = t;
   2380                                     }
   2381                                 }
   2382                             }
   2383                         }
   2384                         break;
   2385                     case 'D':
   2386                         if (first+1 != last)
   2387                         {
   2388                             switch (first[1])
   2389                             {
   2390                             case 'p':
   2391                               {
   2392                                 size_t k0 = db.names.size();
   2393                                 t = parse_type(first+2, last, db);
   2394                                 size_t k1 = db.names.size();
   2395                                 if (t != first+2)
   2396                                 {
   2397                                     db.subs.emplace_back(db.names.get_allocator());
   2398                                     for (size_t k = k0; k < k1; ++k)
   2399                                         db.subs.back().push_back(db.names[k]);
   2400                                     first = t;
   2401                                     return first;
   2402                                 }
   2403                                 break;
   2404                               }
   2405                             case 't':
   2406                             case 'T':
   2407                                 t = parse_decltype(first, last, db);
   2408                                 if (t != first)
   2409                                 {
   2410                                     if (db.names.empty())
   2411                                         return first;
   2412                                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2413                                     first = t;
   2414                                     return first;
   2415                                 }
   2416                                 break;
   2417                             case 'v':
   2418                                 t = parse_vector_type(first, last, db);
   2419                                 if (t != first)
   2420                                 {
   2421                                     if (db.names.empty())
   2422                                         return first;
   2423                                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2424                                     first = t;
   2425                                     return first;
   2426                                 }
   2427                                 break;
   2428                             }
   2429                         }
   2430                         _LIBCPP_FALLTHROUGH();
   2431                     default:
   2432                         // must check for builtin-types before class-enum-types to avoid
   2433                         // ambiguities with operator-names
   2434                         t = parse_builtin_type(first, last, db);
   2435                         if (t != first)
   2436                         {
   2437                             first = t;
   2438                         }
   2439                         else
   2440                         {
   2441                             t = parse_name(first, last, db);
   2442                             if (t != first)
   2443                             {
   2444                                 if (db.names.empty())
   2445                                     return first;
   2446                                 db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   2447                                 first = t;
   2448                             }
   2449                         }
   2450                         break;
   2451                     }
   2452               }
   2453                 break;
   2454             }
   2455         }
   2456     }
   2457     return first;
   2458 }
   2459 
   2460 //   <operator-name>
   2461 //                   ::= aa    # &&
   2462 //                   ::= ad    # & (unary)
   2463 //                   ::= an    # &
   2464 //                   ::= aN    # &=
   2465 //                   ::= aS    # =
   2466 //                   ::= cl    # ()
   2467 //                   ::= cm    # ,
   2468 //                   ::= co    # ~
   2469 //                   ::= cv <type>    # (cast)
   2470 //                   ::= da    # delete[]
   2471 //                   ::= de    # * (unary)
   2472 //                   ::= dl    # delete
   2473 //                   ::= dv    # /
   2474 //                   ::= dV    # /=
   2475 //                   ::= eo    # ^
   2476 //                   ::= eO    # ^=
   2477 //                   ::= eq    # ==
   2478 //                   ::= ge    # >=
   2479 //                   ::= gt    # >
   2480 //                   ::= ix    # []
   2481 //                   ::= le    # <=
   2482 //                   ::= li <source-name>  # operator ""
   2483 //                   ::= ls    # <<
   2484 //                   ::= lS    # <<=
   2485 //                   ::= lt    # <
   2486 //                   ::= mi    # -
   2487 //                   ::= mI    # -=
   2488 //                   ::= ml    # *
   2489 //                   ::= mL    # *=
   2490 //                   ::= mm    # -- (postfix in <expression> context)
   2491 //                   ::= na    # new[]
   2492 //                   ::= ne    # !=
   2493 //                   ::= ng    # - (unary)
   2494 //                   ::= nt    # !
   2495 //                   ::= nw    # new
   2496 //                   ::= oo    # ||
   2497 //                   ::= or    # |
   2498 //                   ::= oR    # |=
   2499 //                   ::= pm    # ->*
   2500 //                   ::= pl    # +
   2501 //                   ::= pL    # +=
   2502 //                   ::= pp    # ++ (postfix in <expression> context)
   2503 //                   ::= ps    # + (unary)
   2504 //                   ::= pt    # ->
   2505 //                   ::= qu    # ?
   2506 //                   ::= rm    # %
   2507 //                   ::= rM    # %=
   2508 //                   ::= rs    # >>
   2509 //                   ::= rS    # >>=
   2510 //                   ::= v <digit> <source-name>        # vendor extended operator
   2511 
   2512 const char*
   2513 parse_operator_name(const char* first, const char* last, Db& db)
   2514 {
   2515     if (last - first >= 2)
   2516     {
   2517         switch (first[0])
   2518         {
   2519         case 'a':
   2520             switch (first[1])
   2521             {
   2522             case 'a':
   2523                 db.names.push_back("operator&&");
   2524                 first += 2;
   2525                 break;
   2526             case 'd':
   2527             case 'n':
   2528                 db.names.push_back("operator&");
   2529                 first += 2;
   2530                 break;
   2531             case 'N':
   2532                 db.names.push_back("operator&=");
   2533                 first += 2;
   2534                 break;
   2535             case 'S':
   2536                 db.names.push_back("operator=");
   2537                 first += 2;
   2538                 break;
   2539             }
   2540             break;
   2541         case 'c':
   2542             switch (first[1])
   2543             {
   2544             case 'l':
   2545                 db.names.push_back("operator()");
   2546                 first += 2;
   2547                 break;
   2548             case 'm':
   2549                 db.names.push_back("operator,");
   2550                 first += 2;
   2551                 break;
   2552             case 'o':
   2553                 db.names.push_back("operator~");
   2554                 first += 2;
   2555                 break;
   2556             case 'v':
   2557                 {
   2558                     bool try_to_parse_template_args = db.try_to_parse_template_args;
   2559                     db.try_to_parse_template_args = false;
   2560                     const char* t = parse_type(first+2, last, db);
   2561                     db.try_to_parse_template_args = try_to_parse_template_args;
   2562                     if (t != first+2)
   2563                     {
   2564                         if (db.names.empty())
   2565                             return first;
   2566                         db.names.back().first.insert(0, "operator ");
   2567                         db.parsed_ctor_dtor_cv = true;
   2568                         first = t;
   2569                     }
   2570                 }
   2571                 break;
   2572             }
   2573             break;
   2574         case 'd':
   2575             switch (first[1])
   2576             {
   2577             case 'a':
   2578                 db.names.push_back("operator delete[]");
   2579                 first += 2;
   2580                 break;
   2581             case 'e':
   2582                 db.names.push_back("operator*");
   2583                 first += 2;
   2584                 break;
   2585             case 'l':
   2586                 db.names.push_back("operator delete");
   2587                 first += 2;
   2588                 break;
   2589             case 'v':
   2590                 db.names.push_back("operator/");
   2591                 first += 2;
   2592                 break;
   2593             case 'V':
   2594                 db.names.push_back("operator/=");
   2595                 first += 2;
   2596                 break;
   2597             }
   2598             break;
   2599         case 'e':
   2600             switch (first[1])
   2601             {
   2602             case 'o':
   2603                 db.names.push_back("operator^");
   2604                 first += 2;
   2605                 break;
   2606             case 'O':
   2607                 db.names.push_back("operator^=");
   2608                 first += 2;
   2609                 break;
   2610             case 'q':
   2611                 db.names.push_back("operator==");
   2612                 first += 2;
   2613                 break;
   2614             }
   2615             break;
   2616         case 'g':
   2617             switch (first[1])
   2618             {
   2619             case 'e':
   2620                 db.names.push_back("operator>=");
   2621                 first += 2;
   2622                 break;
   2623             case 't':
   2624                 db.names.push_back("operator>");
   2625                 first += 2;
   2626                 break;
   2627             }
   2628             break;
   2629         case 'i':
   2630             if (first[1] == 'x')
   2631             {
   2632                 db.names.push_back("operator[]");
   2633                 first += 2;
   2634             }
   2635             break;
   2636         case 'l':
   2637             switch (first[1])
   2638             {
   2639             case 'e':
   2640                 db.names.push_back("operator<=");
   2641                 first += 2;
   2642                 break;
   2643             case 'i':
   2644                 {
   2645                     const char* t = parse_source_name(first+2, last, db);
   2646                     if (t != first+2)
   2647                     {
   2648                         if (db.names.empty())
   2649                             return first;
   2650                         db.names.back().first.insert(0, "operator\"\" ");
   2651                         first = t;
   2652                     }
   2653                 }
   2654                 break;
   2655             case 's':
   2656                 db.names.push_back("operator<<");
   2657                 first += 2;
   2658                 break;
   2659             case 'S':
   2660                 db.names.push_back("operator<<=");
   2661                 first += 2;
   2662                 break;
   2663             case 't':
   2664                 db.names.push_back("operator<");
   2665                 first += 2;
   2666                 break;
   2667             }
   2668             break;
   2669         case 'm':
   2670             switch (first[1])
   2671             {
   2672             case 'i':
   2673                 db.names.push_back("operator-");
   2674                 first += 2;
   2675                 break;
   2676             case 'I':
   2677                 db.names.push_back("operator-=");
   2678                 first += 2;
   2679                 break;
   2680             case 'l':
   2681                 db.names.push_back("operator*");
   2682                 first += 2;
   2683                 break;
   2684             case 'L':
   2685                 db.names.push_back("operator*=");
   2686                 first += 2;
   2687                 break;
   2688             case 'm':
   2689                 db.names.push_back("operator--");
   2690                 first += 2;
   2691                 break;
   2692             }
   2693             break;
   2694         case 'n':
   2695             switch (first[1])
   2696             {
   2697             case 'a':
   2698                 db.names.push_back("operator new[]");
   2699                 first += 2;
   2700                 break;
   2701             case 'e':
   2702                 db.names.push_back("operator!=");
   2703                 first += 2;
   2704                 break;
   2705             case 'g':
   2706                 db.names.push_back("operator-");
   2707                 first += 2;
   2708                 break;
   2709             case 't':
   2710                 db.names.push_back("operator!");
   2711                 first += 2;
   2712                 break;
   2713             case 'w':
   2714                 db.names.push_back("operator new");
   2715                 first += 2;
   2716                 break;
   2717             }
   2718             break;
   2719         case 'o':
   2720             switch (first[1])
   2721             {
   2722             case 'o':
   2723                 db.names.push_back("operator||");
   2724                 first += 2;
   2725                 break;
   2726             case 'r':
   2727                 db.names.push_back("operator|");
   2728                 first += 2;
   2729                 break;
   2730             case 'R':
   2731                 db.names.push_back("operator|=");
   2732                 first += 2;
   2733                 break;
   2734             }
   2735             break;
   2736         case 'p':
   2737             switch (first[1])
   2738             {
   2739             case 'm':
   2740                 db.names.push_back("operator->*");
   2741                 first += 2;
   2742                 break;
   2743             case 'l':
   2744                 db.names.push_back("operator+");
   2745                 first += 2;
   2746                 break;
   2747             case 'L':
   2748                 db.names.push_back("operator+=");
   2749                 first += 2;
   2750                 break;
   2751             case 'p':
   2752                 db.names.push_back("operator++");
   2753                 first += 2;
   2754                 break;
   2755             case 's':
   2756                 db.names.push_back("operator+");
   2757                 first += 2;
   2758                 break;
   2759             case 't':
   2760                 db.names.push_back("operator->");
   2761                 first += 2;
   2762                 break;
   2763             }
   2764             break;
   2765         case 'q':
   2766             if (first[1] == 'u')
   2767             {
   2768                 db.names.push_back("operator?");
   2769                 first += 2;
   2770             }
   2771             break;
   2772         case 'r':
   2773             switch (first[1])
   2774             {
   2775             case 'm':
   2776                 db.names.push_back("operator%");
   2777                 first += 2;
   2778                 break;
   2779             case 'M':
   2780                 db.names.push_back("operator%=");
   2781                 first += 2;
   2782                 break;
   2783             case 's':
   2784                 db.names.push_back("operator>>");
   2785                 first += 2;
   2786                 break;
   2787             case 'S':
   2788                 db.names.push_back("operator>>=");
   2789                 first += 2;
   2790                 break;
   2791             }
   2792             break;
   2793         case 'v':
   2794             if (std::isdigit(first[1]))
   2795             {
   2796                 const char* t = parse_source_name(first+2, last, db);
   2797                 if (t != first+2)
   2798                 {
   2799                     if (db.names.empty())
   2800                         return first;
   2801                     db.names.back().first.insert(0, "operator ");
   2802                     first = t;
   2803                 }
   2804             }
   2805             break;
   2806         }
   2807     }
   2808     return first;
   2809 }
   2810 
   2811 const char*
   2812 parse_integer_literal(const char* first, const char* last, const Db::String& lit, Db& db)
   2813 {
   2814     const char* t = parse_number(first, last);
   2815     if (t != first && t != last && *t == 'E')
   2816     {
   2817         if (lit.size() > 3)
   2818             db.names.push_back("(" + lit + ")");
   2819         else
   2820             db.names.emplace_back();
   2821         if (*first == 'n')
   2822         {
   2823             db.names.back().first += '-';
   2824             ++first;
   2825         }
   2826         db.names.back().first.append(first, t);
   2827         if (lit.size() <= 3)
   2828             db.names.back().first += lit;
   2829         first = t+1;
   2830     }
   2831     return first;
   2832 }
   2833 
   2834 // <expr-primary> ::= L <type> <value number> E                          # integer literal
   2835 //                ::= L <type> <value float> E                           # floating literal
   2836 //                ::= L <string type> E                                  # string literal
   2837 //                ::= L <nullptr type> E                                 # nullptr literal (i.e., "LDnE")
   2838 //                ::= L <type> <real-part float> _ <imag-part float> E   # complex floating point literal (C 2000)
   2839 //                ::= L <mangled-name> E                                 # external name
   2840 
   2841 const char*
   2842 parse_expr_primary(const char* first, const char* last, Db& db)
   2843 {
   2844     if (last - first >= 4 && *first == 'L')
   2845     {
   2846         switch (first[1])
   2847         {
   2848         case 'w':
   2849             {
   2850             const char* t = parse_integer_literal(first+2, last, "wchar_t", db);
   2851             if (t != first+2)
   2852                 first = t;
   2853             }
   2854             break;
   2855         case 'b':
   2856             if (first[3] == 'E')
   2857             {
   2858                 switch (first[2])
   2859                 {
   2860                 case '0':
   2861                     db.names.push_back("false");
   2862                     first += 4;
   2863                     break;
   2864                 case '1':
   2865                     db.names.push_back("true");
   2866                     first += 4;
   2867                     break;
   2868                 }
   2869             }
   2870             break;
   2871         case 'c':
   2872             {
   2873             const char* t = parse_integer_literal(first+2, last, "char", db);
   2874             if (t != first+2)
   2875                 first = t;
   2876             }
   2877             break;
   2878         case 'a':
   2879             {
   2880             const char* t = parse_integer_literal(first+2, last, "signed char", db);
   2881             if (t != first+2)
   2882                 first = t;
   2883             }
   2884             break;
   2885         case 'h':
   2886             {
   2887             const char* t = parse_integer_literal(first+2, last, "unsigned char", db);
   2888             if (t != first+2)
   2889                 first = t;
   2890             }
   2891             break;
   2892         case 's':
   2893             {
   2894             const char* t = parse_integer_literal(first+2, last, "short", db);
   2895             if (t != first+2)
   2896                 first = t;
   2897             }
   2898             break;
   2899         case 't':
   2900             {
   2901             const char* t = parse_integer_literal(first+2, last, "unsigned short", db);
   2902             if (t != first+2)
   2903                 first = t;
   2904             }
   2905             break;
   2906         case 'i':
   2907             {
   2908             const char* t = parse_integer_literal(first+2, last, "", db);
   2909             if (t != first+2)
   2910                 first = t;
   2911             }
   2912             break;
   2913         case 'j':
   2914             {
   2915             const char* t = parse_integer_literal(first+2, last, "u", db);
   2916             if (t != first+2)
   2917                 first = t;
   2918             }
   2919             break;
   2920         case 'l':
   2921             {
   2922             const char* t = parse_integer_literal(first+2, last, "l", db);
   2923             if (t != first+2)
   2924                 first = t;
   2925             }
   2926             break;
   2927         case 'm':
   2928             {
   2929             const char* t = parse_integer_literal(first+2, last, "ul", db);
   2930             if (t != first+2)
   2931                 first = t;
   2932             }
   2933             break;
   2934         case 'x':
   2935             {
   2936             const char* t = parse_integer_literal(first+2, last, "ll", db);
   2937             if (t != first+2)
   2938                 first = t;
   2939             }
   2940             break;
   2941         case 'y':
   2942             {
   2943             const char* t = parse_integer_literal(first+2, last, "ull", db);
   2944             if (t != first+2)
   2945                 first = t;
   2946             }
   2947             break;
   2948         case 'n':
   2949             {
   2950             const char* t = parse_integer_literal(first+2, last, "__int128", db);
   2951             if (t != first+2)
   2952                 first = t;
   2953             }
   2954             break;
   2955         case 'o':
   2956             {
   2957             const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db);
   2958             if (t != first+2)
   2959                 first = t;
   2960             }
   2961             break;
   2962         case 'f':
   2963             {
   2964             const char* t = parse_floating_number<float>(first+2, last, db);
   2965             if (t != first+2)
   2966                 first = t;
   2967             }
   2968             break;
   2969         case 'd':
   2970             {
   2971             const char* t = parse_floating_number<double>(first+2, last, db);
   2972             if (t != first+2)
   2973                 first = t;
   2974             }
   2975             break;
   2976          case 'e':
   2977             {
   2978             const char* t = parse_floating_number<long double>(first+2, last, db);
   2979             if (t != first+2)
   2980                 first = t;
   2981             }
   2982             break;
   2983         case '_':
   2984             if (first[2] == 'Z')
   2985             {
   2986                 const char* t = parse_encoding(first+3, last, db);
   2987                 if (t != first+3 && t != last && *t == 'E')
   2988                     first = t+1;
   2989             }
   2990             break;
   2991         case 'T':
   2992             // Invalid mangled name per
   2993             //   http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
   2994             break;
   2995         default:
   2996             {
   2997                 // might be named type
   2998                 const char* t = parse_type(first+1, last, db);
   2999                 if (t != first+1 && t != last)
   3000                 {
   3001                     if (*t != 'E')
   3002                     {
   3003                         const char* n = t;
   3004                         for (; n != last && isdigit(*n); ++n)
   3005                             ;
   3006                         if (n != t && n != last && *n == 'E')
   3007                         {
   3008                             if (db.names.empty())
   3009                                 return first;
   3010                             db.names.back() = "(" + db.names.back().move_full() + ")" + Db::String(t, n);
   3011                             first = n+1;
   3012                             break;
   3013                         }
   3014                     }
   3015                     else
   3016                     {
   3017                         first = t+1;
   3018                         break;
   3019                     }
   3020                 }
   3021             }
   3022         }
   3023     }
   3024     return first;
   3025 }
   3026 
   3027 template <class String>
   3028 String
   3029 base_name(String& s)
   3030 {
   3031     if (s.empty())
   3032         return s;
   3033     if (s == "std::string")
   3034     {
   3035         s = "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
   3036         return "basic_string";
   3037     }
   3038     if (s == "std::istream")
   3039     {
   3040         s = "std::basic_istream<char, std::char_traits<char> >";
   3041         return "basic_istream";
   3042     }
   3043     if (s == "std::ostream")
   3044     {
   3045         s = "std::basic_ostream<char, std::char_traits<char> >";
   3046         return "basic_ostream";
   3047     }
   3048     if (s == "std::iostream")
   3049     {
   3050         s = "std::basic_iostream<char, std::char_traits<char> >";
   3051         return "basic_iostream";
   3052     }
   3053     const char* const pf = s.data();
   3054     const char* pe = pf + s.size();
   3055     if (pe[-1] == '>')
   3056     {
   3057         unsigned c = 1;
   3058         while (true)
   3059         {
   3060             if (--pe == pf)
   3061                 return String();
   3062             if (pe[-1] == '<')
   3063             {
   3064                 if (--c == 0)
   3065                 {
   3066                     --pe;
   3067                     break;
   3068                 }
   3069             }
   3070             else if (pe[-1] == '>')
   3071                 ++c;
   3072         }
   3073     }
   3074     if (pe - pf <= 1)
   3075       return String();
   3076     const char* p0 = pe - 1;
   3077     for (; p0 != pf; --p0)
   3078     {
   3079         if (*p0 == ':')
   3080         {
   3081             ++p0;
   3082             break;
   3083         }
   3084         if (!isalpha(*p0) && !isdigit(*p0) && *p0 != '_')
   3085         {
   3086             return String();
   3087         }
   3088     }
   3089     return String(p0, pe);
   3090 }
   3091 
   3092 // <ctor-dtor-name> ::= C1    # complete object constructor
   3093 //                  ::= C2    # base object constructor
   3094 //                  ::= C3    # complete object allocating constructor
   3095 //   extension      ::= C5    # ?
   3096 //                  ::= D0    # deleting destructor
   3097 //                  ::= D1    # complete object destructor
   3098 //                  ::= D2    # base object destructor
   3099 //   extension      ::= D5    # ?
   3100 
   3101 const char*
   3102 parse_ctor_dtor_name(const char* first, const char* last, Db& db)
   3103 {
   3104     if (last-first >= 2 && !db.names.empty())
   3105     {
   3106         switch (first[0])
   3107         {
   3108         case 'C':
   3109             switch (first[1])
   3110             {
   3111             case '1':
   3112             case '2':
   3113             case '3':
   3114             case '5':
   3115                 if (db.names.empty())
   3116                     return first;
   3117                 db.names.push_back(base_name(db.names.back().first));
   3118                 first += 2;
   3119                 db.parsed_ctor_dtor_cv = true;
   3120                 break;
   3121             }
   3122             break;
   3123         case 'D':
   3124             switch (first[1])
   3125             {
   3126             case '0':
   3127             case '1':
   3128             case '2':
   3129             case '5':
   3130                 if (db.names.empty())
   3131                     return first;
   3132                 db.names.push_back("~" + base_name(db.names.back().first));
   3133                 first += 2;
   3134                 db.parsed_ctor_dtor_cv = true;
   3135                 break;
   3136             }
   3137             break;
   3138         }
   3139     }
   3140     return first;
   3141 }
   3142 
   3143 // <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
   3144 //                     ::= <closure-type-name>
   3145 //
   3146 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
   3147 //
   3148 // <lambda-sig> ::= <parameter type>+  # Parameter types or "v" if the lambda has no parameters
   3149 
   3150 const char*
   3151 parse_unnamed_type_name(const char* first, const char* last, Db& db)
   3152 {
   3153     if (last - first > 2 && first[0] == 'U')
   3154     {
   3155         char type = first[1];
   3156         switch (type)
   3157         {
   3158         case 't':
   3159           {
   3160             db.names.push_back(Db::String("'unnamed"));
   3161             const char* t0 = first+2;
   3162             if (t0 == last)
   3163             {
   3164                 db.names.pop_back();
   3165                 return first;
   3166             }
   3167             if (std::isdigit(*t0))
   3168             {
   3169                 const char* t1 = t0 + 1;
   3170                 while (t1 != last && std::isdigit(*t1))
   3171                     ++t1;
   3172                 db.names.back().first.append(t0, t1);
   3173                 t0 = t1;
   3174             }
   3175             db.names.back().first.push_back('\'');
   3176             if (t0 == last || *t0 != '_')
   3177             {
   3178                 db.names.pop_back();
   3179                 return first;
   3180             }
   3181             first = t0 + 1;
   3182           }
   3183             break;
   3184         case 'l':
   3185           {
   3186             size_t lambda_pos = db.names.size();
   3187             db.names.push_back(Db::String("'lambda'("));
   3188             const char* t0 = first+2;
   3189             if (first[2] == 'v')
   3190             {
   3191                 db.names.back().first += ')';
   3192                 ++t0;
   3193             }
   3194             else
   3195             {
   3196                 bool is_first_it = true;
   3197                 while (true)
   3198                 {
   3199                     long k0 = static_cast<long>(db.names.size());
   3200                     const char* t1 = parse_type(t0, last, db);
   3201                     long k1 = static_cast<long>(db.names.size());
   3202                     if (t1 == t0)
   3203                         break;
   3204                     if (k0 >= k1)
   3205                         return first;
   3206                     // If the call to parse_type above found a pack expansion
   3207                     // substitution, then multiple names could have been
   3208                     // inserted into the name table. Walk through the names,
   3209                     // appending each onto the lambda's parameter list.
   3210                     std::for_each(db.names.begin() + k0, db.names.begin() + k1,
   3211                                   [&](Db::sub_type::value_type &pair) {
   3212                                       if (pair.empty())
   3213                                           return;
   3214                                       auto &lambda = db.names[lambda_pos].first;
   3215                                       if (!is_first_it)
   3216                                           lambda.append(", ");
   3217                                       is_first_it = false;
   3218                                       lambda.append(pair.move_full());
   3219                                   });
   3220                     db.names.erase(db.names.begin() + k0, db.names.end());
   3221                     t0 = t1;
   3222                 }
   3223                 if (is_first_it)
   3224                 {
   3225                     if (!db.names.empty())
   3226                         db.names.pop_back();
   3227                     return first;
   3228                 }
   3229                 if (db.names.empty() || db.names.size() - 1 != lambda_pos)
   3230                   return first;
   3231                 db.names.back().first.append(")");
   3232             }
   3233             if (t0 == last || *t0 != 'E')
   3234             {
   3235               if (!db.names.empty())
   3236                 db.names.pop_back();
   3237               return first;
   3238             }
   3239             ++t0;
   3240             if (t0 == last)
   3241             {
   3242                 if(!db.names.empty())
   3243                   db.names.pop_back();
   3244                 return first;
   3245             }
   3246             if (std::isdigit(*t0))
   3247             {
   3248                 const char* t1 = t0 + 1;
   3249                 while (t1 != last && std::isdigit(*t1))
   3250                     ++t1;
   3251                 db.names.back().first.insert(db.names.back().first.begin()+7, t0, t1);
   3252                 t0 = t1;
   3253             }
   3254             if (t0 == last || *t0 != '_')
   3255             {
   3256                 if(!db.names.empty())
   3257                   db.names.pop_back();
   3258                 return first;
   3259             }
   3260             first = t0 + 1;
   3261           }
   3262             break;
   3263         }
   3264     }
   3265     return first;
   3266 }
   3267 
   3268 // <unqualified-name> ::= <operator-name>
   3269 //                    ::= <ctor-dtor-name>
   3270 //                    ::= <source-name>
   3271 //                    ::= <unnamed-type-name>
   3272 
   3273 const char*
   3274 parse_unqualified_name(const char* first, const char* last, Db& db)
   3275 {
   3276     if (first != last)
   3277     {
   3278         const char* t;
   3279         switch (*first)
   3280         {
   3281         case 'C':
   3282         case 'D':
   3283             t = parse_ctor_dtor_name(first, last, db);
   3284             if (t != first)
   3285                 first = t;
   3286             break;
   3287         case 'U':
   3288             t = parse_unnamed_type_name(first, last, db);
   3289             if (t != first)
   3290                 first = t;
   3291             break;
   3292         case '1':
   3293         case '2':
   3294         case '3':
   3295         case '4':
   3296         case '5':
   3297         case '6':
   3298         case '7':
   3299         case '8':
   3300         case '9':
   3301             t = parse_source_name(first, last, db);
   3302             if (t != first)
   3303                 first = t;
   3304             break;
   3305         default:
   3306             t = parse_operator_name(first, last, db);
   3307             if (t != first)
   3308                 first = t;
   3309             break;
   3310         };
   3311     }
   3312     return first;
   3313 }
   3314 
   3315 // <unscoped-name> ::= <unqualified-name>
   3316 //                 ::= St <unqualified-name>   # ::std::
   3317 // extension       ::= StL<unqualified-name>
   3318 
   3319 const char*
   3320 parse_unscoped_name(const char* first, const char* last, Db& db)
   3321 {
   3322     if (last - first >= 2)
   3323     {
   3324         const char* t0 = first;
   3325         bool St = false;
   3326         if (first[0] == 'S' && first[1] == 't')
   3327         {
   3328             t0 += 2;
   3329             St = true;
   3330             if (t0 != last && *t0 == 'L')
   3331                 ++t0;
   3332         }
   3333         const char* t1 = parse_unqualified_name(t0, last, db);
   3334         if (t1 != t0)
   3335         {
   3336             if (St)
   3337             {
   3338                 if (db.names.empty())
   3339                     return first;
   3340                 db.names.back().first.insert(0, "std::");
   3341             }
   3342             first = t1;
   3343         }
   3344     }
   3345     return first;
   3346 }
   3347 
   3348 // at <type>                                            # alignof (a type)
   3349 
   3350 const char*
   3351 parse_alignof_type(const char* first, const char* last, Db& db)
   3352 {
   3353     if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
   3354     {
   3355         const char* t = parse_type(first+2, last, db);
   3356         if (t != first+2)
   3357         {
   3358             if (db.names.empty())
   3359                 return first;
   3360             db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
   3361             first = t;
   3362         }
   3363     }
   3364     return first;
   3365 }
   3366 
   3367 // az <expression>                                            # alignof (a expression)
   3368 
   3369 const char*
   3370 parse_alignof_expr(const char* first, const char* last, Db& db)
   3371 {
   3372     if (last - first >= 3 && first[0] == 'a' && first[1] == 'z')
   3373     {
   3374         const char* t = parse_expression(first+2, last, db);
   3375         if (t != first+2)
   3376         {
   3377             if (db.names.empty())
   3378                 return first;
   3379             db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
   3380             first = t;
   3381         }
   3382     }
   3383     return first;
   3384 }
   3385 
   3386 const char*
   3387 parse_noexcept_expression(const char* first, const char* last, Db& db)
   3388 {
   3389     const char* t1 = parse_expression(first, last, db);
   3390     if (t1 != first)
   3391     {
   3392         if (db.names.empty())
   3393             return first;
   3394         db.names.back().first =  "noexcept (" + db.names.back().move_full() + ")";
   3395         first = t1;
   3396     }
   3397     return first;
   3398 }
   3399 
   3400 const char*
   3401 parse_prefix_expression(const char* first, const char* last, const Db::String& op, Db& db)
   3402 {
   3403     const char* t1 = parse_expression(first, last, db);
   3404     if (t1 != first)
   3405     {
   3406         if (db.names.empty())
   3407             return first;
   3408         db.names.back().first =  op + "(" + db.names.back().move_full() + ")";
   3409         first = t1;
   3410     }
   3411     return first;
   3412 }
   3413 
   3414 const char*
   3415 parse_binary_expression(const char* first, const char* last, const Db::String& op, Db& db)
   3416 {
   3417     const char* t1 = parse_expression(first, last, db);
   3418     if (t1 != first)
   3419     {
   3420         const char* t2 = parse_expression(t1, last, db);
   3421         if (t2 != t1)
   3422         {
   3423             if (db.names.size() < 2)
   3424                 return first;
   3425             auto op2 = db.names.back().move_full();
   3426             db.names.pop_back();
   3427             auto op1 = db.names.back().move_full();
   3428             auto& nm = db.names.back().first;
   3429             nm.clear();
   3430             if (op == ">")
   3431                 nm += '(';
   3432             nm += "(" + op1 + ") " + op + " (" + op2 + ")";
   3433             if (op == ">")
   3434                 nm += ')';
   3435             first = t2;
   3436         }
   3437         else if(!db.names.empty())
   3438             db.names.pop_back();
   3439     }
   3440     return first;
   3441 }
   3442 
   3443 // <expression> ::= <unary operator-name> <expression>
   3444 //              ::= <binary operator-name> <expression> <expression>
   3445 //              ::= <ternary operator-name> <expression> <expression> <expression>
   3446 //              ::= cl <expression>+ E                                   # call
   3447 //              ::= cv <type> <expression>                               # conversion with one argument
   3448 //              ::= cv <type> _ <expression>* E                          # conversion with a different number of arguments
   3449 //              ::= [gs] nw <expression>* _ <type> E                     # new (expr-list) type
   3450 //              ::= [gs] nw <expression>* _ <type> <initializer>         # new (expr-list) type (init)
   3451 //              ::= [gs] na <expression>* _ <type> E                     # new[] (expr-list) type
   3452 //              ::= [gs] na <expression>* _ <type> <initializer>         # new[] (expr-list) type (init)
   3453 //              ::= [gs] dl <expression>                                 # delete expression
   3454 //              ::= [gs] da <expression>                                 # delete[] expression
   3455 //              ::= pp_ <expression>                                     # prefix ++
   3456 //              ::= mm_ <expression>                                     # prefix --
   3457 //              ::= ti <type>                                            # typeid (type)
   3458 //              ::= te <expression>                                      # typeid (expression)
   3459 //              ::= dc <type> <expression>                               # dynamic_cast<type> (expression)
   3460 //              ::= sc <type> <expression>                               # static_cast<type> (expression)
   3461 //              ::= cc <type> <expression>                               # const_cast<type> (expression)
   3462 //              ::= rc <type> <expression>                               # reinterpret_cast<type> (expression)
   3463 //              ::= st <type>                                            # sizeof (a type)
   3464 //              ::= sz <expression>                                      # sizeof (an expression)
   3465 //              ::= at <type>                                            # alignof (a type)
   3466 //              ::= az <expression>                                      # alignof (an expression)
   3467 //              ::= nx <expression>                                      # noexcept (expression)
   3468 //              ::= <template-param>
   3469 //              ::= <function-param>
   3470 //              ::= dt <expression> <unresolved-name>                    # expr.name
   3471 //              ::= pt <expression> <unresolved-name>                    # expr->name
   3472 //              ::= ds <expression> <expression>                         # expr.*expr
   3473 //              ::= sZ <template-param>                                  # size of a parameter pack
   3474 //              ::= sZ <function-param>                                  # size of a function parameter pack
   3475 //              ::= sp <expression>                                      # pack expansion
   3476 //              ::= tw <expression>                                      # throw expression
   3477 //              ::= tr                                                   # throw with no operand (rethrow)
   3478 //              ::= <unresolved-name>                                    # f(p), N::f(p), ::f(p),
   3479 //                                                                       # freestanding dependent name (e.g., T::x),
   3480 //                                                                       # objectless nonstatic member reference
   3481 //              ::= <expr-primary>
   3482 
   3483 const char*
   3484 parse_expression(const char* first, const char* last, Db& db)
   3485 {
   3486     if (last - first >= 2)
   3487     {
   3488         const char* t = first;
   3489         bool parsed_gs = false;
   3490         if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
   3491         {
   3492             t += 2;
   3493             parsed_gs = true;
   3494         }
   3495         switch (*t)
   3496         {
   3497         case 'L':
   3498             first = parse_expr_primary(first, last, db);
   3499             break;
   3500         case 'T':
   3501             first = parse_template_param(first, last, db);
   3502             break;
   3503         case 'f':
   3504             first = parse_function_param(first, last, db);
   3505             break;
   3506         case 'a':
   3507             switch (t[1])
   3508             {
   3509             case 'a':
   3510                 t = parse_binary_expression(first+2, last, "&&", db);
   3511                 if (t != first+2)
   3512                     first = t;
   3513                 break;
   3514             case 'd':
   3515                 t = parse_prefix_expression(first+2, last, "&", db);
   3516                 if (t != first+2)
   3517                     first = t;
   3518                 break;
   3519             case 'n':
   3520                 t = parse_binary_expression(first+2, last, "&", db);
   3521                 if (t != first+2)
   3522                     first = t;
   3523                 break;
   3524             case 'N':
   3525                 t = parse_binary_expression(first+2, last, "&=", db);
   3526                 if (t != first+2)
   3527                     first = t;
   3528                 break;
   3529             case 'S':
   3530                 t = parse_binary_expression(first+2, last, "=", db);
   3531                 if (t != first+2)
   3532                     first = t;
   3533                 break;
   3534             case 't':
   3535                 first = parse_alignof_type(first, last, db);
   3536                 break;
   3537             case 'z':
   3538                 first = parse_alignof_expr(first, last, db);
   3539                 break;
   3540             }
   3541             break;
   3542         case 'c':
   3543             switch (t[1])
   3544             {
   3545             case 'c':
   3546                 first = parse_const_cast_expr(first, last, db);
   3547                 break;
   3548             case 'l':
   3549                 first = parse_call_expr(first, last, db);
   3550                 break;
   3551             case 'm':
   3552                 t = parse_binary_expression(first+2, last, ",", db);
   3553                 if (t != first+2)
   3554                     first = t;
   3555                 break;
   3556             case 'o':
   3557                 t = parse_prefix_expression(first+2, last, "~", db);
   3558                 if (t != first+2)
   3559                     first = t;
   3560                 break;
   3561             case 'v':
   3562                 first = parse_conversion_expr(first, last, db);
   3563                 break;
   3564             }
   3565             break;
   3566         case 'd':
   3567             switch (t[1])
   3568             {
   3569             case 'a':
   3570                 {
   3571                     const char* t1 = parse_expression(t+2, last, db);
   3572                     if (t1 != t+2)
   3573                     {
   3574                         if (db.names.empty())
   3575                             return first;
   3576                         db.names.back().first = (parsed_gs ? Db::String("::") : Db::String()) +
   3577                                           "delete[] " + db.names.back().move_full();
   3578                         first = t1;
   3579                     }
   3580                 }
   3581                 break;
   3582             case 'c':
   3583                 first = parse_dynamic_cast_expr(first, last, db);
   3584                 break;
   3585             case 'e':
   3586                 t = parse_prefix_expression(first+2, last, "*", db);
   3587                 if (t != first+2)
   3588                     first = t;
   3589                 break;
   3590             case 'l':
   3591                 {
   3592                     const char* t1 = parse_expression(t+2, last, db);
   3593                     if (t1 != t+2)
   3594                     {
   3595                         if (db.names.empty())
   3596                             return first;
   3597                         db.names.back().first = (parsed_gs ? Db::String("::") : Db::String()) +
   3598                                           "delete " + db.names.back().move_full();
   3599                         first = t1;
   3600                     }
   3601                 }
   3602                 break;
   3603             case 'n':
   3604                 return parse_unresolved_name(first, last, db);
   3605             case 's':
   3606                 first = parse_dot_star_expr(first, last, db);
   3607                 break;
   3608             case 't':
   3609                 first = parse_dot_expr(first, last, db);
   3610                 break;
   3611             case 'v':
   3612                 t = parse_binary_expression(first+2, last, "/", db);
   3613                 if (t != first+2)
   3614                     first = t;
   3615                 break;
   3616             case 'V':
   3617                 t = parse_binary_expression(first+2, last, "/=", db);
   3618                 if (t != first+2)
   3619                     first = t;
   3620                 break;
   3621             }
   3622             break;
   3623         case 'e':
   3624             switch (t[1])
   3625             {
   3626             case 'o':
   3627                 t = parse_binary_expression(first+2, last, "^", db);
   3628                 if (t != first+2)
   3629                     first = t;
   3630                 break;
   3631             case 'O':
   3632                 t = parse_binary_expression(first+2, last, "^=", db);
   3633                 if (t != first+2)
   3634                     first = t;
   3635                 break;
   3636             case 'q':
   3637                 t = parse_binary_expression(first+2, last, "==", db);
   3638                 if (t != first+2)
   3639                     first = t;
   3640                 break;
   3641             }
   3642             break;
   3643         case 'g':
   3644             switch (t[1])
   3645             {
   3646             case 'e':
   3647                 t = parse_binary_expression(first+2, last, ">=", db);
   3648                 if (t != first+2)
   3649                     first = t;
   3650                 break;
   3651             case 't':
   3652                 t = parse_binary_expression(first+2, last, ">", db);
   3653                 if (t != first+2)
   3654                     first = t;
   3655                 break;
   3656             }
   3657             break;
   3658         case 'i':
   3659             if (t[1] == 'x')
   3660             {
   3661                 const char* t1 = parse_expression(first+2, last, db);
   3662                 if (t1 != first+2)
   3663                 {
   3664                     const char* t2 = parse_expression(t1, last, db);
   3665                     if (t2 != t1)
   3666                     {
   3667                         if (db.names.size() < 2)
   3668                             return first;
   3669                         auto op2 = db.names.back().move_full();
   3670                         db.names.pop_back();
   3671                         auto op1 = db.names.back().move_full();
   3672                         db.names.back() = "(" + op1 + ")[" + op2 + "]";
   3673                         first = t2;
   3674                     }
   3675                     else if (!db.names.empty())
   3676                         db.names.pop_back();
   3677                 }
   3678             }
   3679             break;
   3680         case 'l':
   3681             switch (t[1])
   3682             {
   3683             case 'e':
   3684                 t = parse_binary_expression(first+2, last, "<=", db);
   3685                 if (t != first+2)
   3686                     first = t;
   3687                 break;
   3688             case 's':
   3689                 t = parse_binary_expression(first+2, last, "<<", db);
   3690                 if (t != first+2)
   3691                     first = t;
   3692                 break;
   3693             case 'S':
   3694                 t = parse_binary_expression(first+2, last, "<<=", db);
   3695                 if (t != first+2)
   3696                     first = t;
   3697                 break;
   3698             case 't':
   3699                 t = parse_binary_expression(first+2, last, "<", db);
   3700                 if (t != first+2)
   3701                     first = t;
   3702                 break;
   3703             }
   3704             break;
   3705         case 'm':
   3706             switch (t[1])
   3707             {
   3708             case 'i':
   3709                 t = parse_binary_expression(first+2, last, "-", db);
   3710                 if (t != first+2)
   3711                     first = t;
   3712                 break;
   3713             case 'I':
   3714                 t = parse_binary_expression(first+2, last, "-=", db);
   3715                 if (t != first+2)
   3716                     first = t;
   3717                 break;
   3718             case 'l':
   3719                 t = parse_binary_expression(first+2, last, "*", db);
   3720                 if (t != first+2)
   3721                     first = t;
   3722                 break;
   3723             case 'L':
   3724                 t = parse_binary_expression(first+2, last, "*=", db);
   3725                 if (t != first+2)
   3726                     first = t;
   3727                 break;
   3728             case 'm':
   3729                 if (first+2 != last && first[2] == '_')
   3730                 {
   3731                     t = parse_prefix_expression(first+3, last, "--", db);
   3732                     if (t != first+3)
   3733                         first = t;
   3734                 }
   3735                 else
   3736                 {
   3737                     const char* t1 = parse_expression(first+2, last, db);
   3738                     if (t1 != first+2)
   3739                     {
   3740                         if (db.names.empty())
   3741                             return first;
   3742                         db.names.back() = "(" + db.names.back().move_full() + ")--";
   3743                         first = t1;
   3744                     }
   3745                 }
   3746                 break;
   3747             }
   3748             break;
   3749         case 'n':
   3750             switch (t[1])
   3751             {
   3752             case 'a':
   3753             case 'w':
   3754                 first = parse_new_expr(first, last, db);
   3755                 break;
   3756             case 'e':
   3757                 t = parse_binary_expression(first+2, last, "!=", db);
   3758                 if (t != first+2)
   3759                     first = t;
   3760                 break;
   3761             case 'g':
   3762                 t = parse_prefix_expression(first+2, last, "-", db);
   3763                 if (t != first+2)
   3764                     first = t;
   3765                 break;
   3766             case 't':
   3767                 t = parse_prefix_expression(first+2, last, "!", db);
   3768                 if (t != first+2)
   3769                     first = t;
   3770                 break;
   3771             case 'x':
   3772                 t = parse_noexcept_expression(first+2, last, db);
   3773                 if (t != first+2)
   3774                     first = t;
   3775                 break;
   3776             }
   3777             break;
   3778         case 'o':
   3779             switch (t[1])
   3780             {
   3781             case 'n':
   3782                 return parse_unresolved_name(first, last, db);
   3783             case 'o':
   3784                 t = parse_binary_expression(first+2, last, "||", db);
   3785                 if (t != first+2)
   3786                     first = t;
   3787                 break;
   3788             case 'r':
   3789                 t = parse_binary_expression(first+2, last, "|", db);
   3790                 if (t != first+2)
   3791                     first = t;
   3792                 break;
   3793             case 'R':
   3794                 t = parse_binary_expression(first+2, last, "|=", db);
   3795                 if (t != first+2)
   3796                     first = t;
   3797                 break;
   3798             }
   3799             break;
   3800         case 'p':
   3801             switch (t[1])
   3802             {
   3803             case 'm':
   3804                 t = parse_binary_expression(first+2, last, "->*", db);
   3805                 if (t != first+2)
   3806                     first = t;
   3807                 break;
   3808             case 'l':
   3809                 t = parse_binary_expression(first+2, last, "+", db);
   3810                 if (t != first+2)
   3811                     first = t;
   3812                 break;
   3813             case 'L':
   3814                 t = parse_binary_expression(first+2, last, "+=", db);
   3815                 if (t != first+2)
   3816                     first = t;
   3817                 break;
   3818             case 'p':
   3819                 if (first+2 != last && first[2] == '_')
   3820                 {
   3821                     t = parse_prefix_expression(first+3, last, "++", db);
   3822                     if (t != first+3)
   3823                         first = t;
   3824                 }
   3825                 else
   3826                 {
   3827                     const char* t1 = parse_expression(first+2, last, db);
   3828                     if (t1 != first+2)
   3829                     {
   3830                         if (db.names.empty())
   3831                             return first;
   3832                         db.names.back() = "(" + db.names.back().move_full() + ")++";
   3833                         first = t1;
   3834                     }
   3835                 }
   3836                 break;
   3837             case 's':
   3838                 t = parse_prefix_expression(first+2, last, "+", db);
   3839                 if (t != first+2)
   3840                     first = t;
   3841                 break;
   3842             case 't':
   3843                 first = parse_arrow_expr(first, last, db);
   3844                 break;
   3845             }
   3846             break;
   3847         case 'q':
   3848             if (t[1] == 'u')
   3849             {
   3850                 const char* t1 = parse_expression(first+2, last, db);
   3851                 if (t1 != first+2)
   3852                 {
   3853                     const char* t2 = parse_expression(t1, last, db);
   3854                     if (t2 != t1)
   3855                     {
   3856                         const char* t3 = parse_expression(t2, last, db);
   3857                         if (t3 != t2)
   3858                         {
   3859                             if (db.names.size() < 3)
   3860                                 return first;
   3861                             auto op3 = db.names.back().move_full();
   3862                             db.names.pop_back();
   3863                             auto op2 = db.names.back().move_full();
   3864                             db.names.pop_back();
   3865                             auto op1 = db.names.back().move_full();
   3866                             db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")";
   3867                             first = t3;
   3868                         }
   3869                         else
   3870                         {
   3871                             if (db.names.size() < 2)
   3872                               return first;
   3873                             db.names.pop_back();
   3874                             db.names.pop_back();
   3875                         }
   3876                     }
   3877                     else if (!db.names.empty())
   3878                         db.names.pop_back();
   3879                 }
   3880             }
   3881             break;
   3882         case 'r':
   3883             switch (t[1])
   3884             {
   3885             case 'c':
   3886                 first = parse_reinterpret_cast_expr(first, last, db);
   3887                 break;
   3888             case 'm':
   3889                 t = parse_binary_expression(first+2, last, "%", db);
   3890                 if (t != first+2)
   3891                     first = t;
   3892                 break;
   3893             case 'M':
   3894                 t = parse_binary_expression(first+2, last, "%=", db);
   3895                 if (t != first+2)
   3896                     first = t;
   3897                 break;
   3898             case 's':
   3899                 t = parse_binary_expression(first+2, last, ">>", db);
   3900                 if (t != first+2)
   3901                     first = t;
   3902                 break;
   3903             case 'S':
   3904                 t = parse_binary_expression(first+2, last, ">>=", db);
   3905                 if (t != first+2)
   3906                     first = t;
   3907                 break;
   3908             }
   3909             break;
   3910         case 's':
   3911             switch (t[1])
   3912             {
   3913             case 'c':
   3914                 first = parse_static_cast_expr(first, last, db);
   3915                 break;
   3916             case 'p':
   3917                 first = parse_pack_expansion(first, last, db);
   3918                 break;
   3919             case 'r':
   3920                 return parse_unresolved_name(first, last, db);
   3921             case 't':
   3922                 first = parse_sizeof_type_expr(first, last, db);
   3923                 break;
   3924             case 'z':
   3925                 first = parse_sizeof_expr_expr(first, last, db);
   3926                 break;
   3927             case 'Z':
   3928                 if (last - t >= 3)
   3929                 {
   3930                     switch (t[2])
   3931                     {
   3932                     case 'T':
   3933                         first = parse_sizeof_param_pack_expr(first, last, db);
   3934                         break;
   3935                     case 'f':
   3936                         first = parse_sizeof_function_param_pack_expr(first, last, db);
   3937                         break;
   3938                     }
   3939                 }
   3940                 break;
   3941             }
   3942             break;
   3943         case 't':
   3944             switch (t[1])
   3945             {
   3946             case 'e':
   3947             case 'i':
   3948                 first = parse_typeid_expr(first, last, db);
   3949                 break;
   3950             case 'r':
   3951                 db.names.push_back("throw");
   3952                 first += 2;
   3953                 break;
   3954             case 'w':
   3955                 first = parse_throw_expr(first, last, db);
   3956                 break;
   3957             }
   3958             break;
   3959         case '1':
   3960         case '2':
   3961         case '3':
   3962         case '4':
   3963         case '5':
   3964         case '6':
   3965         case '7':
   3966         case '8':
   3967         case '9':
   3968             return parse_unresolved_name(first, last, db);
   3969         }
   3970     }
   3971     return first;
   3972 }
   3973 
   3974 // <template-arg> ::= <type>                                             # type or template
   3975 //                ::= X <expression> E                                   # expression
   3976 //                ::= <expr-primary>                                     # simple expressions
   3977 //                ::= J <template-arg>* E                                # argument pack
   3978 //                ::= LZ <encoding> E                                    # extension
   3979 
   3980 const char*
   3981 parse_template_arg(const char* first, const char* last, Db& db)
   3982 {
   3983     if (first != last)
   3984     {
   3985         const char* t;
   3986         switch (*first)
   3987         {
   3988         case 'X':
   3989             t = parse_expression(first+1, last, db);
   3990             if (t != first+1)
   3991             {
   3992                 if (t != last && *t == 'E')
   3993                     first = t+1;
   3994             }
   3995             break;
   3996         case 'J':
   3997             t = first+1;
   3998             if (t == last)
   3999                 return first;
   4000             while (*t != 'E')
   4001             {
   4002                 const char* t1 = parse_template_arg(t, last, db);
   4003                 if (t1 == t)
   4004                     return first;
   4005                 t = t1;
   4006             }
   4007             first = t+1;
   4008             break;
   4009         case 'L':
   4010             // <expr-primary> or LZ <encoding> E
   4011             if (first+1 != last && first[1] == 'Z')
   4012             {
   4013                 t = parse_encoding(first+2, last, db);
   4014                 if (t != first+2 && t != last && *t == 'E')
   4015                     first = t+1;
   4016             }
   4017             else
   4018                 first = parse_expr_primary(first, last, db);
   4019             break;
   4020         default:
   4021             // <type>
   4022             first = parse_type(first, last, db);
   4023             break;
   4024         }
   4025     }
   4026     return first;
   4027 }
   4028 
   4029 // <template-args> ::= I <template-arg>* E
   4030 //     extension, the abi says <template-arg>+
   4031 
   4032 const char*
   4033 parse_template_args(const char* first, const char* last, Db& db)
   4034 {
   4035     if (last - first >= 2 && *first == 'I')
   4036     {
   4037         if (db.tag_templates)
   4038             db.template_param.back().clear();
   4039         const char* t = first+1;
   4040         Db::String args("<");
   4041         while (*t != 'E')
   4042         {
   4043             if (db.tag_templates)
   4044                 db.template_param.emplace_back(db.names.get_allocator());
   4045             size_t k0 = db.names.size();
   4046             const char* t1 = parse_template_arg(t, last, db);
   4047             size_t k1 = db.names.size();
   4048             if (db.tag_templates)
   4049                 db.template_param.pop_back();
   4050             if (t1 == t || t1 == last)
   4051                 return first;
   4052             if (db.tag_templates)
   4053             {
   4054                 db.template_param.back().emplace_back(db.names.get_allocator());
   4055                 for (size_t k = k0; k < k1; ++k)
   4056                     db.template_param.back().back().push_back(db.names[k]);
   4057             }
   4058             for (size_t k = k0; k < k1; ++k)
   4059             {
   4060                 if (args.size() > 1)
   4061                     args += ", ";
   4062                 args += db.names[k].move_full();
   4063             }
   4064             for (; k1 > k0; --k1)
   4065                 if (!db.names.empty())
   4066                     db.names.pop_back();
   4067             t = t1;
   4068         }
   4069         first = t + 1;
   4070         if (args.back() != '>')
   4071             args += ">";
   4072         else
   4073             args += " >";
   4074         db.names.push_back(std::move(args));
   4075 
   4076     }
   4077     return first;
   4078 }
   4079 
   4080 // <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
   4081 //               ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
   4082 //
   4083 // <prefix> ::= <prefix> <unqualified-name>
   4084 //          ::= <template-prefix> <template-args>
   4085 //          ::= <template-param>
   4086 //          ::= <decltype>
   4087 //          ::= # empty
   4088 //          ::= <substitution>
   4089 //          ::= <prefix> <data-member-prefix>
   4090 //  extension ::= L
   4091 //
   4092 // <template-prefix> ::= <prefix> <template unqualified-name>
   4093 //                   ::= <template-param>
   4094 //                   ::= <substitution>
   4095 
   4096 const char*
   4097 parse_nested_name(const char* first, const char* last, Db& db,
   4098                   bool* ends_with_template_args)
   4099 {
   4100     if (first != last && *first == 'N')
   4101     {
   4102         unsigned cv;
   4103         const char* t0 = parse_cv_qualifiers(first+1, last, cv);
   4104         if (t0 == last)
   4105             return first;
   4106         db.ref = 0;
   4107         if (*t0 == 'R')
   4108         {
   4109             db.ref = 1;
   4110             ++t0;
   4111         }
   4112         else if (*t0 == 'O')
   4113         {
   4114             db.ref = 2;
   4115             ++t0;
   4116         }
   4117         db.names.emplace_back();
   4118         if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
   4119         {
   4120             t0 += 2;
   4121             db.names.back().first = "std";
   4122         }
   4123         if (t0 == last)
   4124         {
   4125             db.names.pop_back();
   4126             return first;
   4127         }
   4128         bool pop_subs = false;
   4129         bool component_ends_with_template_args = false;
   4130         while (*t0 != 'E')
   4131         {
   4132             component_ends_with_template_args = false;
   4133             const char* t1;
   4134             switch (*t0)
   4135             {
   4136             case 'S':
   4137                 if (t0 + 1 != last && t0[1] == 't')
   4138                     goto do_parse_unqualified_name;
   4139                 t1 = parse_substitution(t0, last, db);
   4140                 if (t1 != t0 && t1 != last)
   4141                 {
   4142                     auto name = db.names.back().move_full();
   4143                     db.names.pop_back();
   4144                     if (db.names.empty())
   4145                         return first;
   4146                     if (!db.names.back().first.empty())
   4147                     {
   4148                         db.names.back().first += "::" + name;
   4149                         db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   4150                     }
   4151                     else
   4152                         db.names.back().first = name;
   4153                     pop_subs = true;
   4154                     t0 = t1;
   4155                 }
   4156                 else
   4157                     return first;
   4158                 break;
   4159             case 'T':
   4160                 t1 = parse_template_param(t0, last, db);
   4161                 if (t1 != t0 && t1 != last)
   4162                 {
   4163                     auto name = db.names.back().move_full();
   4164                     db.names.pop_back();
   4165                     if (db.names.empty())
   4166                         return first;
   4167                     if (!db.names.back().first.empty())
   4168                         db.names.back().first += "::" + name;
   4169                     else
   4170                         db.names.back().first = name;
   4171                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   4172                     pop_subs = true;
   4173                     t0 = t1;
   4174                 }
   4175                 else
   4176                     return first;
   4177                 break;
   4178             case 'D':
   4179                 if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
   4180                     goto do_parse_unqualified_name;
   4181                 t1 = parse_decltype(t0, last, db);
   4182                 if (t1 != t0 && t1 != last)
   4183                 {
   4184                     auto name = db.names.back().move_full();
   4185                     db.names.pop_back();
   4186                     if (db.names.empty())
   4187                         return first;
   4188                     if (!db.names.back().first.empty())
   4189                         db.names.back().first += "::" + name;
   4190                     else
   4191                         db.names.back().first = name;
   4192                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   4193                     pop_subs = true;
   4194                     t0 = t1;
   4195                 }
   4196                 else
   4197                     return first;
   4198                 break;
   4199             case 'I':
   4200                 t1 = parse_template_args(t0, last, db);
   4201                 if (t1 != t0 && t1 != last)
   4202                 {
   4203                     auto name = db.names.back().move_full();
   4204                     db.names.pop_back();
   4205                     if (db.names.empty())
   4206                         return first;
   4207                     db.names.back().first += name;
   4208                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   4209                     t0 = t1;
   4210                     component_ends_with_template_args = true;
   4211                 }
   4212                 else
   4213                     return first;
   4214                 break;
   4215             case 'L':
   4216                 if (++t0 == last)
   4217                     return first;
   4218                 break;
   4219             default:
   4220             do_parse_unqualified_name:
   4221                 t1 = parse_unqualified_name(t0, last, db);
   4222                 if (t1 != t0 && t1 != last)
   4223                 {
   4224                     auto name = db.names.back().move_full();
   4225                     db.names.pop_back();
   4226                     if (db.names.empty())
   4227                         return first;
   4228                     if (!db.names.back().first.empty())
   4229                         db.names.back().first += "::" + name;
   4230                     else
   4231                         db.names.back().first = name;
   4232                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   4233                     pop_subs = true;
   4234                     t0 = t1;
   4235                 }
   4236                 else
   4237                     return first;
   4238             }
   4239         }
   4240         first = t0 + 1;
   4241         db.cv = cv;
   4242         if (pop_subs && !db.subs.empty())
   4243             db.subs.pop_back();
   4244         if (ends_with_template_args)
   4245             *ends_with_template_args = component_ends_with_template_args;
   4246     }
   4247     return first;
   4248 }
   4249 
   4250 // <discriminator> := _ <non-negative number>      # when number < 10
   4251 //                 := __ <non-negative number> _   # when number >= 10
   4252 //  extension      := decimal-digit+               # at the end of string
   4253 
   4254 const char*
   4255 parse_discriminator(const char* first, const char* last)
   4256 {
   4257     // parse but ignore discriminator
   4258     if (first != last)
   4259     {
   4260         if (*first == '_')
   4261         {
   4262             const char* t1 = first+1;
   4263             if (t1 != last)
   4264             {
   4265                 if (std::isdigit(*t1))
   4266                     first = t1+1;
   4267                 else if (*t1 == '_')
   4268                 {
   4269                     for (++t1; t1 != last && std::isdigit(*t1); ++t1)
   4270                         ;
   4271                     if (t1 != last && *t1 == '_')
   4272                         first = t1 + 1;
   4273                 }
   4274             }
   4275         }
   4276         else if (std::isdigit(*first))
   4277         {
   4278             const char* t1 = first+1;
   4279             for (; t1 != last && std::isdigit(*t1); ++t1)
   4280                 ;
   4281             if (t1 == last)
   4282                 first = last;
   4283         }
   4284     }
   4285     return first;
   4286 }
   4287 
   4288 // <local-name> := Z <function encoding> E <entity name> [<discriminator>]
   4289 //              := Z <function encoding> E s [<discriminator>]
   4290 //              := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
   4291 
   4292 const char*
   4293 parse_local_name(const char* first, const char* last, Db& db,
   4294                  bool* ends_with_template_args)
   4295 {
   4296     if (first != last && *first == 'Z')
   4297     {
   4298         const char* t = parse_encoding(first+1, last, db);
   4299         if (t != first+1 && t != last && *t == 'E' && ++t != last)
   4300         {
   4301             switch (*t)
   4302             {
   4303             case 's':
   4304                 first = parse_discriminator(t+1, last);
   4305                 if (db.names.empty())
   4306                     return first;
   4307                 db.names.back().first.append("::string literal");
   4308                 break;
   4309             case 'd':
   4310                 if (++t != last)
   4311                 {
   4312                     const char* t1 = parse_number(t, last);
   4313                     if (t1 != last && *t1 == '_')
   4314                     {
   4315                         t = t1 + 1;
   4316                         t1 = parse_name(t, last, db,
   4317                                         ends_with_template_args);
   4318                         if (t1 != t)
   4319                         {
   4320                             if (db.names.size() < 2)
   4321                                 return first;
   4322                             auto name = db.names.back().move_full();
   4323                             db.names.pop_back();
   4324                             if (db.names.empty())
   4325                                 return first;
   4326                             db.names.back().first.append("::");
   4327                             db.names.back().first.append(name);
   4328                             first = t1;
   4329                         }
   4330                         else if (!db.names.empty())
   4331                             db.names.pop_back();
   4332                     }
   4333                 }
   4334                 break;
   4335             default:
   4336                 {
   4337                     const char* t1 = parse_name(t, last, db,
   4338                                                 ends_with_template_args);
   4339                     if (t1 != t)
   4340                     {
   4341                         // parse but ignore discriminator
   4342                         first = parse_discriminator(t1, last);
   4343                         if (db.names.size() < 2)
   4344                             return first;
   4345                         auto name = db.names.back().move_full();
   4346                         db.names.pop_back();
   4347                         if (db.names.empty())
   4348                             return first;
   4349                         db.names.back().first.append("::");
   4350                         db.names.back().first.append(name);
   4351                     }
   4352                     else if (!db.names.empty())
   4353                         db.names.pop_back();
   4354                 }
   4355                 break;
   4356             }
   4357         }
   4358     }
   4359     return first;
   4360 }
   4361 
   4362 // <name> ::= <nested-name> // N
   4363 //        ::= <local-name> # See Scope Encoding below  // Z
   4364 //        ::= <unscoped-template-name> <template-args>
   4365 //        ::= <unscoped-name>
   4366 
   4367 // <unscoped-template-name> ::= <unscoped-name>
   4368 //                          ::= <substitution>
   4369 
   4370 const char*
   4371 parse_name(const char* first, const char* last, Db& db,
   4372            bool* ends_with_template_args)
   4373 {
   4374     if (last - first >= 2)
   4375     {
   4376         const char* t0 = first;
   4377         // extension: ignore L here
   4378         if (*t0 == 'L')
   4379             ++t0;
   4380         switch (*t0)
   4381         {
   4382         case 'N':
   4383           {
   4384             const char* t1 = parse_nested_name(t0, last, db,
   4385                                                ends_with_template_args);
   4386             if (t1 != t0)
   4387                 first = t1;
   4388             break;
   4389           }
   4390         case 'Z':
   4391           {
   4392             const char* t1 = parse_local_name(t0, last, db,
   4393                                               ends_with_template_args);
   4394             if (t1 != t0)
   4395                 first = t1;
   4396             break;
   4397           }
   4398         default:
   4399           {
   4400             const char* t1 = parse_unscoped_name(t0, last, db);
   4401             if (t1 != t0)
   4402             {
   4403                 if (t1 != last && *t1 == 'I')  // <unscoped-template-name> <template-args>
   4404                 {
   4405                     if (db.names.empty())
   4406                         return first;
   4407                     db.subs.push_back(Db::sub_type(1, db.names.back(), db.names.get_allocator()));
   4408                     t0 = t1;
   4409                     t1 = parse_template_args(t0, last, db);
   4410                     if (t1 != t0)
   4411                     {
   4412                         if (db.names.size() < 2)
   4413                             return first;
   4414                         auto tmp = db.names.back().move_full();
   4415                         db.names.pop_back();
   4416                         if (db.names.empty())
   4417                             return first;
   4418                         db.names.back().first += tmp;
   4419                         first = t1;
   4420                         if (ends_with_template_args)
   4421                             *ends_with_template_args = true;
   4422                     }
   4423                 }
   4424                 else   // <unscoped-name>
   4425                     first = t1;
   4426             }
   4427             else
   4428             {   // try <substitution> <template-args>
   4429                 t1 = parse_substitution(t0, last, db);
   4430                 if (t1 != t0 && t1 != last && *t1 == 'I')
   4431                 {
   4432                     t0 = t1;
   4433                     t1 = parse_template_args(t0, last, db);
   4434                     if (t1 != t0)
   4435                     {
   4436                         if (db.names.size() < 2)
   4437                             return first;
   4438                         auto tmp = db.names.back().move_full();
   4439                         db.names.pop_back();
   4440                         if (db.names.empty())
   4441                             return first;
   4442                         db.names.back().first += tmp;
   4443                         first = t1;
   4444                         if (ends_with_template_args)
   4445                             *ends_with_template_args = true;
   4446                     }
   4447                 }
   4448             }
   4449             break;
   4450           }
   4451         }
   4452     }
   4453     return first;
   4454 }
   4455 
   4456 // <call-offset> ::= h <nv-offset> _
   4457 //               ::= v <v-offset> _
   4458 //
   4459 // <nv-offset> ::= <offset number>
   4460 //               # non-virtual base override
   4461 //
   4462 // <v-offset>  ::= <offset number> _ <virtual offset number>
   4463 //               # virtual base override, with vcall offset
   4464 
   4465 const char*
   4466 parse_call_offset(const char* first, const char* last)
   4467 {
   4468     if (first != last)
   4469     {
   4470         switch (*first)
   4471         {
   4472         case 'h':
   4473             {
   4474             const char* t = parse_number(first + 1, last);
   4475             if (t != first + 1 && t != last && *t == '_')
   4476                 first = t + 1;
   4477             }
   4478             break;
   4479         case 'v':
   4480             {
   4481             const char* t = parse_number(first + 1, last);
   4482             if (t != first + 1 && t != last && *t == '_')
   4483             {
   4484                 const char* t2 = parse_number(++t, last);
   4485                 if (t2 != t && t2 != last && *t2 == '_')
   4486                     first = t2 + 1;
   4487             }
   4488             }
   4489             break;
   4490         }
   4491     }
   4492     return first;
   4493 }
   4494 
   4495 // <special-name> ::= TV <type>    # virtual table
   4496 //                ::= TT <type>    # VTT structure (construction vtable index)
   4497 //                ::= TI <type>    # typeinfo structure
   4498 //                ::= TS <type>    # typeinfo name (null-terminated byte string)
   4499 //                ::= Tc <call-offset> <call-offset> <base encoding>
   4500 //                    # base is the nominal target function of thunk
   4501 //                    # first call-offset is 'this' adjustment
   4502 //                    # second call-offset is result adjustment
   4503 //                ::= T <call-offset> <base encoding>
   4504 //                    # base is the nominal target function of thunk
   4505 //                ::= GV <object name> # Guard variable for one-time initialization
   4506 //                                     # No <type>
   4507 //                ::= TW <object name> # Thread-local wrapper
   4508 //                ::= TH <object name> # Thread-local initialization
   4509 //      extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
   4510 //      extension ::= GR <object name> # reference temporary for object
   4511 
   4512 const char*
   4513 parse_special_name(const char* first, const char* last, Db& db)
   4514 {
   4515     if (last - first > 2)
   4516     {
   4517         const char* t;
   4518         switch (*first)
   4519         {
   4520         case 'T':
   4521             switch (first[1])
   4522             {
   4523             case 'V':
   4524                 // TV <type>    # virtual table
   4525                 t = parse_type(first+2, last, db);
   4526                 if (t != first+2)
   4527                 {
   4528                     if (db.names.empty())
   4529                         return first;
   4530                     db.names.back().first.insert(0, "vtable for ");
   4531                     first = t;
   4532                 }
   4533                 break;
   4534             case 'T':
   4535                 // TT <type>    # VTT structure (construction vtable index)
   4536                 t = parse_type(first+2, last, db);
   4537                 if (t != first+2)
   4538                 {
   4539                     if (db.names.empty())
   4540                         return first;
   4541                     db.names.back().first.insert(0, "VTT for ");
   4542                     first = t;
   4543                 }
   4544                 break;
   4545             case 'I':
   4546                 // TI <type>    # typeinfo structure
   4547                 t = parse_type(first+2, last, db);
   4548                 if (t != first+2)
   4549                 {
   4550                     if (db.names.empty())
   4551                         return first;
   4552                     db.names.back().first.insert(0, "typeinfo for ");
   4553                     first = t;
   4554                 }
   4555                 break;
   4556             case 'S':
   4557                 // TS <type>    # typeinfo name (null-terminated byte string)
   4558                 t = parse_type(first+2, last, db);
   4559                 if (t != first+2)
   4560                 {
   4561                     if (db.names.empty())
   4562                         return first;
   4563                     db.names.back().first.insert(0, "typeinfo name for ");
   4564                     first = t;
   4565                 }
   4566                 break;
   4567             case 'c':
   4568                 // Tc <call-offset> <call-offset> <base encoding>
   4569               {
   4570                 const char* t0 = parse_call_offset(first+2, last);
   4571                 if (t0 == first+2)
   4572                     break;
   4573                 const char* t1 = parse_call_offset(t0, last);
   4574                 if (t1 == t0)
   4575                     break;
   4576                 t = parse_encoding(t1, last, db);
   4577                 if (t != t1)
   4578                 {
   4579                     if (db.names.empty())
   4580                         return first;
   4581                     db.names.back().first.insert(0, "covariant return thunk to ");
   4582                     first = t;
   4583                 }
   4584               }
   4585                 break;
   4586             case 'C':
   4587                 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
   4588                 t = parse_type(first+2, last, db);
   4589                 if (t != first+2)
   4590                 {
   4591                     const char* t0 = parse_number(t, last);
   4592                     if (t0 != t && t0 != last && *t0 == '_')
   4593                     {
   4594                         const char* t1 = parse_type(++t0, last, db);
   4595                         if (t1 != t0)
   4596                         {
   4597                             if (db.names.size() < 2)
   4598                                 return first;
   4599                             auto left = db.names.back().move_full();
   4600                             db.names.pop_back();
   4601                             if (db.names.empty())
   4602                                 return first;
   4603                             db.names.back().first = "construction vtable for " +
   4604                                                     std::move(left) + "-in-" +
   4605                                                     db.names.back().move_full();
   4606                             first = t1;
   4607                         }
   4608                     }
   4609                 }
   4610                 break;
   4611             case 'W':
   4612                 // TW <object name> # Thread-local wrapper
   4613                 t = parse_name(first + 2, last, db);
   4614                 if (t != first + 2)
   4615                 {
   4616                     if (db.names.empty())
   4617                     return first;
   4618                     db.names.back().first.insert(0, "thread-local wrapper routine for ");
   4619                     first = t;
   4620                 }
   4621                 break;
   4622             case 'H':
   4623                 //TH <object name> # Thread-local initialization
   4624                 t = parse_name(first + 2, last, db);
   4625                 if (t != first + 2)
   4626                 {
   4627                     if (db.names.empty())
   4628                     return first;
   4629                     db.names.back().first.insert(0, "thread-local initialization routine for ");
   4630                     first = t;
   4631                 }
   4632                 break;
   4633             default:
   4634                 // T <call-offset> <base encoding>
   4635                 {
   4636                 const char* t0 = parse_call_offset(first+1, last);
   4637                 if (t0 == first+1)
   4638                     break;
   4639                 t = parse_encoding(t0, last, db);
   4640                 if (t != t0)
   4641                 {
   4642                     if (db.names.empty())
   4643                         return first;
   4644                     if (first[1] == 'v')
   4645                     {
   4646                         db.names.back().first.insert(0, "virtual thunk to ");
   4647                         first = t;
   4648                     }
   4649                     else
   4650                     {
   4651                         db.names.back().first.insert(0, "non-virtual thunk to ");
   4652                         first = t;
   4653                     }
   4654                 }
   4655                 }
   4656                 break;
   4657             }
   4658             break;
   4659         case 'G':
   4660             switch (first[1])
   4661             {
   4662             case 'V':
   4663                 // GV <object name> # Guard variable for one-time initialization
   4664                 t = parse_name(first+2, last, db);
   4665                 if (t != first+2)
   4666                 {
   4667                     if (db.names.empty())
   4668                         return first;
   4669                     db.names.back().first.insert(0, "guard variable for ");
   4670                     first = t;
   4671                 }
   4672                 break;
   4673             case 'R':
   4674                 // extension ::= GR <object name> # reference temporary for object
   4675                 t = parse_name(first+2, last, db);
   4676                 if (t != first+2)
   4677                 {
   4678                     if (db.names.empty())
   4679                         return first;
   4680                     db.names.back().first.insert(0, "reference temporary for ");
   4681                     first = t;
   4682                 }
   4683                 break;
   4684             }
   4685             break;
   4686         }
   4687     }
   4688     return first;
   4689 }
   4690 
   4691 template <class T>
   4692 class save_value
   4693 {
   4694     T& restore_;
   4695     T original_value_;
   4696 public:
   4697     save_value(T& restore)
   4698         : restore_(restore),
   4699           original_value_(restore)
   4700         {}
   4701 
   4702     ~save_value()
   4703     {
   4704         restore_ = std::move(original_value_);
   4705     }
   4706 
   4707     save_value(const save_value&) = delete;
   4708     save_value& operator=(const save_value&) = delete;
   4709 };
   4710 
   4711 // <encoding> ::= <function name> <bare-function-type>
   4712 //            ::= <data name>
   4713 //            ::= <special-name>
   4714 
   4715 const char*
   4716 parse_encoding(const char* first, const char* last, Db& db)
   4717 {
   4718     if (first != last)
   4719     {
   4720         save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
   4721         ++db.encoding_depth;
   4722         save_value<decltype(db.tag_templates)> sb(db.tag_templates);
   4723         if (db.encoding_depth > 1)
   4724             db.tag_templates = true;
   4725         save_value<decltype(db.parsed_ctor_dtor_cv)> sp(db.parsed_ctor_dtor_cv);
   4726         db.parsed_ctor_dtor_cv = false;
   4727         switch (*first)
   4728         {
   4729         case 'G':
   4730         case 'T':
   4731             first = parse_special_name(first, last, db);
   4732             break;
   4733         default:
   4734           {
   4735             bool ends_with_template_args = false;
   4736             const char* t = parse_name(first, last, db,
   4737                                        &ends_with_template_args);
   4738             unsigned cv = db.cv;
   4739             unsigned ref = db.ref;
   4740             if (t != first)
   4741             {
   4742                 if (t != last && *t != 'E' && *t != '.')
   4743                 {
   4744                     save_value<bool> sb2(db.tag_templates);
   4745                     db.tag_templates = false;
   4746                     const char* t2;
   4747                     Db::String ret2;
   4748                     if (db.names.empty())
   4749                         return first;
   4750                     const Db::String& nm = db.names.back().first;
   4751                     if (nm.empty())
   4752                         return first;
   4753                     if (!db.parsed_ctor_dtor_cv && ends_with_template_args)
   4754                     {
   4755                         t2 = parse_type(t, last, db);
   4756                         if (t2 == t)
   4757                             return first;
   4758                         if (db.names.size() < 2)
   4759                             return first;
   4760                         auto ret1 = std::move(db.names.back().first);
   4761                         ret2 = std::move(db.names.back().second);
   4762                         if (ret2.empty())
   4763                             ret1 += ' ';
   4764                         db.names.pop_back();
   4765                         if (db.names.empty())
   4766                             return first;
   4767 
   4768                         db.names.back().first.insert(0, ret1);
   4769                         t = t2;
   4770                     }
   4771                     db.names.back().first += '(';
   4772                     if (t != last && *t == 'v')
   4773                     {
   4774                         ++t;
   4775                     }
   4776                     else
   4777                     {
   4778                         bool first_arg = true;
   4779                         while (true)
   4780                         {
   4781                             size_t k0 = db.names.size();
   4782                             t2 = parse_type(t, last, db);
   4783                             size_t k1 = db.names.size();
   4784                             if (t2 == t)
   4785                                 break;
   4786                             if (k1 > k0)
   4787                             {
   4788                                 Db::String tmp;
   4789                                 for (size_t k = k0; k < k1; ++k)
   4790                                 {
   4791                                     if (!tmp.empty())
   4792                                         tmp += ", ";
   4793                                     tmp += db.names[k].move_full();
   4794                                 }
   4795                                 for (size_t k = k0; k < k1; ++k) {
   4796                                     if (db.names.empty())
   4797                                         return first;
   4798                                     db.names.pop_back();
   4799                                 }
   4800                                 if (!tmp.empty())
   4801                                 {
   4802                                     if (db.names.empty())
   4803                                         return first;
   4804                                     if (!first_arg)
   4805                                         db.names.back().first += ", ";
   4806                                     else
   4807                                         first_arg = false;
   4808                                     db.names.back().first += tmp;
   4809                                 }
   4810                             }
   4811                             t = t2;
   4812                         }
   4813                     }
   4814                     if (db.names.empty())
   4815                         return first;
   4816                     db.names.back().first += ')';
   4817                     if (cv & 1)
   4818                         db.names.back().first.append(" const");
   4819                     if (cv & 2)
   4820                         db.names.back().first.append(" volatile");
   4821                     if (cv & 4)
   4822                         db.names.back().first.append(" restrict");
   4823                     if (ref == 1)
   4824                         db.names.back().first.append(" &");
   4825                     else if (ref == 2)
   4826                         db.names.back().first.append(" &&");
   4827                     db.names.back().first += ret2;
   4828                     first = t;
   4829                 }
   4830                 else
   4831                     first = t;
   4832             }
   4833             break;
   4834           }
   4835         }
   4836     }
   4837     return first;
   4838 }
   4839 
   4840 // _block_invoke
   4841 // _block_invoke<decimal-digit>+
   4842 // _block_invoke_<decimal-digit>+
   4843 
   4844 const char*
   4845 parse_block_invoke(const char* first, const char* last, Db& db)
   4846 {
   4847     if (last - first >= 13)
   4848     {
   4849         const char test[] = "_block_invoke";
   4850         const char* t = first;
   4851         for (int i = 0; i < 13; ++i, ++t)
   4852         {
   4853             if (*t != test[i])
   4854                 return first;
   4855         }
   4856         if (t != last)
   4857         {
   4858             if (*t == '_')
   4859             {
   4860                 // must have at least 1 decimal digit
   4861                 if (++t == last || !std::isdigit(*t))
   4862                     return first;
   4863                 ++t;
   4864             }
   4865             // parse zero or more digits
   4866             while (t != last && isdigit(*t))
   4867                 ++t;
   4868         }
   4869         if (db.names.empty())
   4870             return first;
   4871         db.names.back().first.insert(0, "invocation function for block in ");
   4872         first = t;
   4873     }
   4874     return first;
   4875 }
   4876 
   4877 // extension
   4878 // <dot-suffix> := .<anything and everything>
   4879 
   4880 const char*
   4881 parse_dot_suffix(const char* first, const char* last, Db& db)
   4882 {
   4883     if (first != last && *first == '.')
   4884     {
   4885         if (db.names.empty())
   4886             return first;
   4887         db.names.back().first += " (" + Db::String(first, last) + ")";
   4888         first = last;
   4889     }
   4890     return first;
   4891 }
   4892 
   4893 // <block-involcaton-function> ___Z<encoding>_block_invoke
   4894 // <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
   4895 // <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
   4896 // <mangled-name> ::= _Z<encoding>
   4897 //                ::= <type>
   4898 
   4899 void
   4900 demangle(const char* first, const char* last, Db& db, int& status)
   4901 {
   4902     if (first >= last)
   4903     {
   4904         status = invalid_mangled_name;
   4905         return;
   4906     }
   4907     if (*first == '_')
   4908     {
   4909         if (last - first >= 4)
   4910         {
   4911             if (first[1] == 'Z')
   4912             {
   4913                 const char* t = parse_encoding(first+2, last, db);
   4914                 if (t != first+2 && t != last && *t == '.')
   4915                     t = parse_dot_suffix(t, last, db);
   4916                 if (t != last)
   4917                     status = invalid_mangled_name;
   4918             }
   4919             else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z')
   4920             {
   4921                 const char* t = parse_encoding(first+4, last, db);
   4922                 if (t != first+4 && t != last)
   4923                 {
   4924                     const char* t1 = parse_block_invoke(t, last, db);
   4925                     if (t1 != last)
   4926                         status = invalid_mangled_name;
   4927                 }
   4928                 else
   4929                     status = invalid_mangled_name;
   4930             }
   4931             else
   4932                 status = invalid_mangled_name;
   4933         }
   4934         else
   4935             status = invalid_mangled_name;
   4936     }
   4937     else
   4938     {
   4939         const char* t = parse_type(first, last, db);
   4940         if (t != last)
   4941             status = invalid_mangled_name;
   4942     }
   4943     if (status == success && db.names.empty())
   4944         status = invalid_mangled_name;
   4945 }
   4946 
   4947 }  // unnamed namespace
   4948 
   4949 extern "C" _LIBCXXABI_FUNC_VIS char *
   4950 __cxa_demangle(const char *mangled_name, char *buf, size_t *n, int *status) {
   4951     if (mangled_name == nullptr || (buf != nullptr && n == nullptr))
   4952     {
   4953         if (status)
   4954             *status = invalid_args;
   4955         return nullptr;
   4956     }
   4957 
   4958     size_t internal_size = buf != nullptr ? *n : 0;
   4959     arena<bs> a;
   4960     Db db(a);
   4961     db.template_param.emplace_back(a);
   4962     int internal_status = success;
   4963     size_t len = std::strlen(mangled_name);
   4964     demangle(mangled_name, mangled_name + len, db,
   4965              internal_status);
   4966     if (internal_status == success && db.fix_forward_references &&
   4967            !db.template_param.empty() && !db.template_param.front().empty())
   4968     {
   4969         db.fix_forward_references = false;
   4970         db.tag_templates = false;
   4971         db.names.clear();
   4972         db.subs.clear();
   4973         demangle(mangled_name, mangled_name + len, db, internal_status);
   4974         if (db.fix_forward_references)
   4975             internal_status = invalid_mangled_name;
   4976     }
   4977     if (internal_status == success)
   4978     {
   4979         size_t sz = db.names.back().size() + 1;
   4980         if (sz > internal_size)
   4981         {
   4982             char* newbuf = static_cast<char*>(std::realloc(buf, sz));
   4983             if (newbuf == nullptr)
   4984             {
   4985                 internal_status = memory_alloc_failure;
   4986                 buf = nullptr;
   4987             }
   4988             else
   4989             {
   4990                 buf = newbuf;
   4991                 if (n != nullptr)
   4992                     *n = sz;
   4993             }
   4994         }
   4995         if (buf != nullptr)
   4996         {
   4997             db.names.back().first += db.names.back().second;
   4998             std::memcpy(buf, db.names.back().first.data(), sz-1);
   4999             buf[sz-1] = char(0);
   5000         }
   5001     }
   5002     else
   5003         buf = nullptr;
   5004     if (status)
   5005         *status = internal_status;
   5006     return buf;
   5007 }
   5008 
   5009 }  // __cxxabiv1
   5010