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