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