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