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