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