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