]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Demangle/ItaniumDemangle.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r304149, and update
[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         // falls 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     if (!isalpha(*p0) && !isdigit(*p0) && *p0 != '_') {
2529       return std::string();
2530     }
2531   }
2532   return std::string(p0, pe);
2533 }
2534
2535 // <ctor-dtor-name> ::= C1    # complete object constructor
2536 //                  ::= C2    # base object constructor
2537 //                  ::= C3    # complete object allocating constructor
2538 //   extension      ::= C5    # ?
2539 //                  ::= D0    # deleting destructor
2540 //                  ::= D1    # complete object destructor
2541 //                  ::= D2    # base object destructor
2542 //   extension      ::= D5    # ?
2543
2544 template <class C>
2545 static const char *parse_ctor_dtor_name(const char *first, const char *last,
2546                                         C &db) {
2547   if (last - first >= 2 && !db.names.empty()) {
2548     switch (first[0]) {
2549     case 'C':
2550       switch (first[1]) {
2551       case '1':
2552       case '2':
2553       case '3':
2554       case '5':
2555         if (db.names.empty())
2556           return first;
2557         db.names.push_back(base_name(db.names.back().first));
2558         first += 2;
2559         db.parsed_ctor_dtor_cv = true;
2560         break;
2561       }
2562       break;
2563     case 'D':
2564       switch (first[1]) {
2565       case '0':
2566       case '1':
2567       case '2':
2568       case '5':
2569         if (db.names.empty())
2570           return first;
2571         db.names.push_back("~" + base_name(db.names.back().first));
2572         first += 2;
2573         db.parsed_ctor_dtor_cv = true;
2574         break;
2575       }
2576       break;
2577     }
2578   }
2579   return first;
2580 }
2581
2582 // <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
2583 //                     ::= <closure-type-name>
2584 //
2585 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
2586 //
2587 // <lambda-sig> ::= <parameter type>+  # Parameter types or "v" if the lambda
2588 // has no parameters
2589
2590 template <class C>
2591 static const char *parse_unnamed_type_name(const char *first, const char *last,
2592                                            C &db) {
2593   if (last - first > 2 && first[0] == 'U') {
2594     char type = first[1];
2595     switch (type) {
2596     case 't': {
2597       db.names.push_back(std::string("'unnamed"));
2598       const char *t0 = first + 2;
2599       if (t0 == last) {
2600         db.names.pop_back();
2601         return first;
2602       }
2603       if (std::isdigit(*t0)) {
2604         const char *t1 = t0 + 1;
2605         while (t1 != last && std::isdigit(*t1))
2606           ++t1;
2607         db.names.back().first.append(t0, t1);
2608         t0 = t1;
2609       }
2610       db.names.back().first.push_back('\'');
2611       if (t0 == last || *t0 != '_') {
2612         db.names.pop_back();
2613         return first;
2614       }
2615       first = t0 + 1;
2616     } break;
2617     case 'l': {
2618       size_t lambda_pos = db.names.size();
2619       db.names.push_back(std::string("'lambda'("));
2620       const char *t0 = first + 2;
2621       if (first[2] == 'v') {
2622         db.names.back().first += ')';
2623         ++t0;
2624       } else {
2625         bool is_first_it = true;
2626         while (true) {
2627           long k0 = static_cast<long>(db.names.size());
2628           const char *t1 = parse_type(t0, last, db);
2629           long k1 = static_cast<long>(db.names.size());
2630           if (t1 == t0)
2631             break;
2632           if (k0 >= k1)
2633             return first;
2634           // If the call to parse_type above found a pack expansion
2635           // substitution, then multiple names could have been
2636           // inserted into the name table. Walk through the names,
2637           // appending each onto the lambda's parameter list.
2638           std::for_each(db.names.begin() + k0, db.names.begin() + k1,
2639                         [&](typename C::sub_type::value_type &pair) {
2640                           if (pair.empty())
2641                             return;
2642                           auto &lambda = db.names[lambda_pos].first;
2643                           if (!is_first_it)
2644                             lambda.append(", ");
2645                           is_first_it = false;
2646                           lambda.append(pair.move_full());
2647                         });
2648           db.names.erase(db.names.begin() + k0, db.names.end());
2649           t0 = t1;
2650         }
2651         if (is_first_it) {
2652           if (!db.names.empty())
2653             db.names.pop_back();
2654           return first;
2655         }
2656         if (db.names.empty() || db.names.size() - 1 != lambda_pos)
2657           return first;
2658         db.names.back().first.append(")");
2659       }
2660       if (t0 == last || *t0 != 'E') {
2661         if (!db.names.empty())
2662           db.names.pop_back();
2663         return first;
2664       }
2665       ++t0;
2666       if (t0 == last) {
2667         if (!db.names.empty())
2668           db.names.pop_back();
2669         return first;
2670       }
2671       if (std::isdigit(*t0)) {
2672         const char *t1 = t0 + 1;
2673         while (t1 != last && std::isdigit(*t1))
2674           ++t1;
2675         db.names.back().first.insert(db.names.back().first.begin() + 7, t0, t1);
2676         t0 = t1;
2677       }
2678       if (t0 == last || *t0 != '_') {
2679         if (!db.names.empty())
2680           db.names.pop_back();
2681         return first;
2682       }
2683       first = t0 + 1;
2684     } break;
2685     }
2686   }
2687   return first;
2688 }
2689
2690 // <unqualified-name> ::= <operator-name>
2691 //                    ::= <ctor-dtor-name>
2692 //                    ::= <source-name>
2693 //                    ::= <unnamed-type-name>
2694
2695 template <class C>
2696 static const char *parse_unqualified_name(const char *first, const char *last,
2697                                           C &db) {
2698   if (first != last) {
2699     const char *t;
2700     switch (*first) {
2701     case 'C':
2702     case 'D':
2703       t = parse_ctor_dtor_name(first, last, db);
2704       if (t != first)
2705         first = t;
2706       break;
2707     case 'U':
2708       t = parse_unnamed_type_name(first, last, db);
2709       if (t != first)
2710         first = t;
2711       break;
2712     case '1':
2713     case '2':
2714     case '3':
2715     case '4':
2716     case '5':
2717     case '6':
2718     case '7':
2719     case '8':
2720     case '9':
2721       t = parse_source_name(first, last, db);
2722       if (t != first)
2723         first = t;
2724       break;
2725     default:
2726       t = parse_operator_name(first, last, db);
2727       if (t != first)
2728         first = t;
2729       break;
2730     };
2731   }
2732   return first;
2733 }
2734
2735 // <unscoped-name> ::= <unqualified-name>
2736 //                 ::= St <unqualified-name>   # ::std::
2737 // extension       ::= StL<unqualified-name>
2738
2739 template <class C>
2740 static const char *parse_unscoped_name(const char *first, const char *last,
2741                                        C &db) {
2742   if (last - first >= 2) {
2743     const char *t0 = first;
2744     bool St = false;
2745     if (first[0] == 'S' && first[1] == 't') {
2746       t0 += 2;
2747       St = true;
2748       if (t0 != last && *t0 == 'L')
2749         ++t0;
2750     }
2751     const char *t1 = parse_unqualified_name(t0, last, db);
2752     if (t1 != t0) {
2753       if (St) {
2754         if (db.names.empty())
2755           return first;
2756         db.names.back().first.insert(0, "std::");
2757       }
2758       first = t1;
2759     }
2760   }
2761   return first;
2762 }
2763
2764 // at <type>                                            # alignof (a type)
2765
2766 template <class C>
2767 static const char *parse_alignof_type(const char *first, const char *last,
2768                                       C &db) {
2769   if (last - first >= 3 && first[0] == 'a' && first[1] == 't') {
2770     const char *t = parse_type(first + 2, last, db);
2771     if (t != first + 2) {
2772       if (db.names.empty())
2773         return first;
2774       db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
2775       first = t;
2776     }
2777   }
2778   return first;
2779 }
2780
2781 // az <expression>                                            # alignof (a
2782 // expression)
2783
2784 template <class C>
2785 static const char *parse_alignof_expr(const char *first, const char *last,
2786                                       C &db) {
2787   if (last - first >= 3 && first[0] == 'a' && first[1] == 'z') {
2788     const char *t = parse_expression(first + 2, last, db);
2789     if (t != first + 2) {
2790       if (db.names.empty())
2791         return first;
2792       db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
2793       first = t;
2794     }
2795   }
2796   return first;
2797 }
2798
2799 template <class C>
2800 static const char *parse_noexcept_expression(const char *first,
2801                                              const char *last, C &db) {
2802   const char *t1 = parse_expression(first, last, db);
2803   if (t1 != first) {
2804     if (db.names.empty())
2805       return first;
2806     db.names.back().first = "noexcept (" + db.names.back().move_full() + ")";
2807     first = t1;
2808   }
2809   return first;
2810 }
2811
2812 template <class C>
2813 static const char *parse_prefix_expression(const char *first, const char *last,
2814                                            const std::string &op,
2815                                            C &db) {
2816   const char *t1 = parse_expression(first, last, db);
2817   if (t1 != first) {
2818     if (db.names.empty())
2819       return first;
2820     db.names.back().first = op + "(" + db.names.back().move_full() + ")";
2821     first = t1;
2822   }
2823   return first;
2824 }
2825
2826 template <class C>
2827 static const char *parse_binary_expression(const char *first, const char *last,
2828                                            const std::string &op,
2829                                            C &db) {
2830   const char *t1 = parse_expression(first, last, db);
2831   if (t1 != first) {
2832     const char *t2 = parse_expression(t1, last, db);
2833     if (t2 != t1) {
2834       if (db.names.size() < 2)
2835         return first;
2836       auto op2 = db.names.back().move_full();
2837       db.names.pop_back();
2838       auto op1 = db.names.back().move_full();
2839       auto &nm = db.names.back().first;
2840       nm.clear();
2841       if (op == ">")
2842         nm += '(';
2843       nm += "(" + op1 + ") " + op + " (" + op2 + ")";
2844       if (op == ">")
2845         nm += ')';
2846       first = t2;
2847     } else if (!db.names.empty())
2848       db.names.pop_back();
2849   }
2850   return first;
2851 }
2852
2853 // <expression> ::= <unary operator-name> <expression>
2854 //              ::= <binary operator-name> <expression> <expression>
2855 //              ::= <ternary operator-name> <expression> <expression>
2856 //              <expression>
2857 //              ::= cl <expression>+ E                                   # call
2858 //              ::= cv <type> <expression>                               #
2859 //              conversion with one argument
2860 //              ::= cv <type> _ <expression>* E                          #
2861 //              conversion with a different number of arguments
2862 //              ::= [gs] nw <expression>* _ <type> E                     # new
2863 //              (expr-list) type
2864 //              ::= [gs] nw <expression>* _ <type> <initializer>         # new
2865 //              (expr-list) type (init)
2866 //              ::= [gs] na <expression>* _ <type> E                     # new[]
2867 //              (expr-list) type
2868 //              ::= [gs] na <expression>* _ <type> <initializer>         # new[]
2869 //              (expr-list) type (init)
2870 //              ::= [gs] dl <expression>                                 #
2871 //              delete expression
2872 //              ::= [gs] da <expression>                                 #
2873 //              delete[] expression
2874 //              ::= pp_ <expression>                                     #
2875 //              prefix ++
2876 //              ::= mm_ <expression>                                     #
2877 //              prefix --
2878 //              ::= ti <type>                                            #
2879 //              typeid (type)
2880 //              ::= te <expression>                                      #
2881 //              typeid (expression)
2882 //              ::= dc <type> <expression>                               #
2883 //              dynamic_cast<type> (expression)
2884 //              ::= sc <type> <expression>                               #
2885 //              static_cast<type> (expression)
2886 //              ::= cc <type> <expression>                               #
2887 //              const_cast<type> (expression)
2888 //              ::= rc <type> <expression>                               #
2889 //              reinterpret_cast<type> (expression)
2890 //              ::= st <type>                                            #
2891 //              sizeof (a type)
2892 //              ::= sz <expression>                                      #
2893 //              sizeof (an expression)
2894 //              ::= at <type>                                            #
2895 //              alignof (a type)
2896 //              ::= az <expression>                                      #
2897 //              alignof (an expression)
2898 //              ::= nx <expression>                                      #
2899 //              noexcept (expression)
2900 //              ::= <template-param>
2901 //              ::= <function-param>
2902 //              ::= dt <expression> <unresolved-name>                    #
2903 //              expr.name
2904 //              ::= pt <expression> <unresolved-name>                    #
2905 //              expr->name
2906 //              ::= ds <expression> <expression>                         #
2907 //              expr.*expr
2908 //              ::= sZ <template-param>                                  # size
2909 //              of a parameter pack
2910 //              ::= sZ <function-param>                                  # size
2911 //              of a function parameter pack
2912 //              ::= sp <expression>                                      # pack
2913 //              expansion
2914 //              ::= tw <expression>                                      # throw
2915 //              expression
2916 //              ::= tr                                                   # throw
2917 //              with no operand (rethrow)
2918 //              ::= <unresolved-name>                                    # f(p),
2919 //              N::f(p), ::f(p),
2920 //                                                                       #
2921 //                                                                       freestanding
2922 //                                                                       dependent
2923 //                                                                       name
2924 //                                                                       (e.g.,
2925 //                                                                       T::x),
2926 //                                                                       #
2927 //                                                                       objectless
2928 //                                                                       nonstatic
2929 //                                                                       member
2930 //                                                                       reference
2931 //              ::= <expr-primary>
2932
2933 template <class C>
2934 static const char *parse_expression(const char *first, const char *last,
2935                                     C &db) {
2936   if (last - first >= 2) {
2937     const char *t = first;
2938     bool parsed_gs = false;
2939     if (last - first >= 4 && t[0] == 'g' && t[1] == 's') {
2940       t += 2;
2941       parsed_gs = true;
2942     }
2943     switch (*t) {
2944     case 'L':
2945       first = parse_expr_primary(first, last, db);
2946       break;
2947     case 'T':
2948       first = parse_template_param(first, last, db);
2949       break;
2950     case 'f':
2951       first = parse_function_param(first, last, db);
2952       break;
2953     case 'a':
2954       switch (t[1]) {
2955       case 'a':
2956         t = parse_binary_expression(first + 2, last, "&&", db);
2957         if (t != first + 2)
2958           first = t;
2959         break;
2960       case 'd':
2961         t = parse_prefix_expression(first + 2, last, "&", db);
2962         if (t != first + 2)
2963           first = t;
2964         break;
2965       case 'n':
2966         t = parse_binary_expression(first + 2, last, "&", db);
2967         if (t != first + 2)
2968           first = t;
2969         break;
2970       case 'N':
2971         t = parse_binary_expression(first + 2, last, "&=", db);
2972         if (t != first + 2)
2973           first = t;
2974         break;
2975       case 'S':
2976         t = parse_binary_expression(first + 2, last, "=", db);
2977         if (t != first + 2)
2978           first = t;
2979         break;
2980       case 't':
2981         first = parse_alignof_type(first, last, db);
2982         break;
2983       case 'z':
2984         first = parse_alignof_expr(first, last, db);
2985         break;
2986       }
2987       break;
2988     case 'c':
2989       switch (t[1]) {
2990       case 'c':
2991         first = parse_const_cast_expr(first, last, db);
2992         break;
2993       case 'l':
2994         first = parse_call_expr(first, last, db);
2995         break;
2996       case 'm':
2997         t = parse_binary_expression(first + 2, last, ",", db);
2998         if (t != first + 2)
2999           first = t;
3000         break;
3001       case 'o':
3002         t = parse_prefix_expression(first + 2, last, "~", db);
3003         if (t != first + 2)
3004           first = t;
3005         break;
3006       case 'v':
3007         first = parse_conversion_expr(first, last, db);
3008         break;
3009       }
3010       break;
3011     case 'd':
3012       switch (t[1]) {
3013       case 'a': {
3014         const char *t1 = parse_expression(t + 2, last, db);
3015         if (t1 != t + 2) {
3016           if (db.names.empty())
3017             return first;
3018           db.names.back().first =
3019               (parsed_gs ? std::string("::") : std::string()) + "delete[] " +
3020               db.names.back().move_full();
3021           first = t1;
3022         }
3023       } break;
3024       case 'c':
3025         first = parse_dynamic_cast_expr(first, last, db);
3026         break;
3027       case 'e':
3028         t = parse_prefix_expression(first + 2, last, "*", db);
3029         if (t != first + 2)
3030           first = t;
3031         break;
3032       case 'l': {
3033         const char *t1 = parse_expression(t + 2, last, db);
3034         if (t1 != t + 2) {
3035           if (db.names.empty())
3036             return first;
3037           db.names.back().first =
3038               (parsed_gs ? std::string("::") : std::string()) + "delete " +
3039               db.names.back().move_full();
3040           first = t1;
3041         }
3042       } break;
3043       case 'n':
3044         return parse_unresolved_name(first, last, db);
3045       case 's':
3046         first = parse_dot_star_expr(first, last, db);
3047         break;
3048       case 't':
3049         first = parse_dot_expr(first, last, db);
3050         break;
3051       case 'v':
3052         t = parse_binary_expression(first + 2, last, "/", db);
3053         if (t != first + 2)
3054           first = t;
3055         break;
3056       case 'V':
3057         t = parse_binary_expression(first + 2, last, "/=", db);
3058         if (t != first + 2)
3059           first = t;
3060         break;
3061       }
3062       break;
3063     case 'e':
3064       switch (t[1]) {
3065       case 'o':
3066         t = parse_binary_expression(first + 2, last, "^", db);
3067         if (t != first + 2)
3068           first = t;
3069         break;
3070       case 'O':
3071         t = parse_binary_expression(first + 2, last, "^=", db);
3072         if (t != first + 2)
3073           first = t;
3074         break;
3075       case 'q':
3076         t = parse_binary_expression(first + 2, last, "==", db);
3077         if (t != first + 2)
3078           first = t;
3079         break;
3080       }
3081       break;
3082     case 'g':
3083       switch (t[1]) {
3084       case 'e':
3085         t = parse_binary_expression(first + 2, last, ">=", db);
3086         if (t != first + 2)
3087           first = t;
3088         break;
3089       case 't':
3090         t = parse_binary_expression(first + 2, last, ">", db);
3091         if (t != first + 2)
3092           first = t;
3093         break;
3094       }
3095       break;
3096     case 'i':
3097       if (t[1] == 'x') {
3098         const char *t1 = parse_expression(first + 2, last, db);
3099         if (t1 != first + 2) {
3100           const char *t2 = parse_expression(t1, last, db);
3101           if (t2 != t1) {
3102             if (db.names.size() < 2)
3103               return first;
3104             auto op2 = db.names.back().move_full();
3105             db.names.pop_back();
3106             auto op1 = db.names.back().move_full();
3107             db.names.back() = "(" + op1 + ")[" + op2 + "]";
3108             first = t2;
3109           } else if (!db.names.empty())
3110             db.names.pop_back();
3111         }
3112       }
3113       break;
3114     case 'l':
3115       switch (t[1]) {
3116       case 'e':
3117         t = parse_binary_expression(first + 2, last, "<=", db);
3118         if (t != first + 2)
3119           first = t;
3120         break;
3121       case 's':
3122         t = parse_binary_expression(first + 2, last, "<<", db);
3123         if (t != first + 2)
3124           first = t;
3125         break;
3126       case 'S':
3127         t = parse_binary_expression(first + 2, last, "<<=", db);
3128         if (t != first + 2)
3129           first = t;
3130         break;
3131       case 't':
3132         t = parse_binary_expression(first + 2, last, "<", db);
3133         if (t != first + 2)
3134           first = t;
3135         break;
3136       }
3137       break;
3138     case 'm':
3139       switch (t[1]) {
3140       case 'i':
3141         t = parse_binary_expression(first + 2, last, "-", db);
3142         if (t != first + 2)
3143           first = t;
3144         break;
3145       case 'I':
3146         t = parse_binary_expression(first + 2, last, "-=", db);
3147         if (t != first + 2)
3148           first = t;
3149         break;
3150       case 'l':
3151         t = parse_binary_expression(first + 2, last, "*", db);
3152         if (t != first + 2)
3153           first = t;
3154         break;
3155       case 'L':
3156         t = parse_binary_expression(first + 2, last, "*=", db);
3157         if (t != first + 2)
3158           first = t;
3159         break;
3160       case 'm':
3161         if (first + 2 != last && first[2] == '_') {
3162           t = parse_prefix_expression(first + 3, last, "--", db);
3163           if (t != first + 3)
3164             first = t;
3165         } else {
3166           const char *t1 = parse_expression(first + 2, last, db);
3167           if (t1 != first + 2) {
3168             if (db.names.empty())
3169               return first;
3170             db.names.back() = "(" + db.names.back().move_full() + ")--";
3171             first = t1;
3172           }
3173         }
3174         break;
3175       }
3176       break;
3177     case 'n':
3178       switch (t[1]) {
3179       case 'a':
3180       case 'w':
3181         first = parse_new_expr(first, last, db);
3182         break;
3183       case 'e':
3184         t = parse_binary_expression(first + 2, last, "!=", db);
3185         if (t != first + 2)
3186           first = t;
3187         break;
3188       case 'g':
3189         t = parse_prefix_expression(first + 2, last, "-", db);
3190         if (t != first + 2)
3191           first = t;
3192         break;
3193       case 't':
3194         t = parse_prefix_expression(first + 2, last, "!", db);
3195         if (t != first + 2)
3196           first = t;
3197         break;
3198       case 'x':
3199         t = parse_noexcept_expression(first + 2, last, db);
3200         if (t != first + 2)
3201           first = t;
3202         break;
3203       }
3204       break;
3205     case 'o':
3206       switch (t[1]) {
3207       case 'n':
3208         return parse_unresolved_name(first, last, db);
3209       case 'o':
3210         t = parse_binary_expression(first + 2, last, "||", db);
3211         if (t != first + 2)
3212           first = t;
3213         break;
3214       case 'r':
3215         t = parse_binary_expression(first + 2, last, "|", db);
3216         if (t != first + 2)
3217           first = t;
3218         break;
3219       case 'R':
3220         t = parse_binary_expression(first + 2, last, "|=", db);
3221         if (t != first + 2)
3222           first = t;
3223         break;
3224       }
3225       break;
3226     case 'p':
3227       switch (t[1]) {
3228       case 'm':
3229         t = parse_binary_expression(first + 2, last, "->*", db);
3230         if (t != first + 2)
3231           first = t;
3232         break;
3233       case 'l':
3234         t = parse_binary_expression(first + 2, last, "+", db);
3235         if (t != first + 2)
3236           first = t;
3237         break;
3238       case 'L':
3239         t = parse_binary_expression(first + 2, last, "+=", db);
3240         if (t != first + 2)
3241           first = t;
3242         break;
3243       case 'p':
3244         if (first + 2 != last && first[2] == '_') {
3245           t = parse_prefix_expression(first + 3, last, "++", db);
3246           if (t != first + 3)
3247             first = t;
3248         } else {
3249           const char *t1 = parse_expression(first + 2, last, db);
3250           if (t1 != first + 2) {
3251             if (db.names.empty())
3252               return first;
3253             db.names.back() = "(" + db.names.back().move_full() + ")++";
3254             first = t1;
3255           }
3256         }
3257         break;
3258       case 's':
3259         t = parse_prefix_expression(first + 2, last, "+", db);
3260         if (t != first + 2)
3261           first = t;
3262         break;
3263       case 't':
3264         first = parse_arrow_expr(first, last, db);
3265         break;
3266       }
3267       break;
3268     case 'q':
3269       if (t[1] == 'u') {
3270         const char *t1 = parse_expression(first + 2, last, db);
3271         if (t1 != first + 2) {
3272           const char *t2 = parse_expression(t1, last, db);
3273           if (t2 != t1) {
3274             const char *t3 = parse_expression(t2, last, db);
3275             if (t3 != t2) {
3276               if (db.names.size() < 3)
3277                 return first;
3278               auto op3 = db.names.back().move_full();
3279               db.names.pop_back();
3280               auto op2 = db.names.back().move_full();
3281               db.names.pop_back();
3282               auto op1 = db.names.back().move_full();
3283               db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")";
3284               first = t3;
3285             } else {
3286               if (db.names.size() < 2)
3287                 return first;
3288               db.names.pop_back();
3289               db.names.pop_back();
3290             }
3291           } else if (!db.names.empty())
3292             db.names.pop_back();
3293         }
3294       }
3295       break;
3296     case 'r':
3297       switch (t[1]) {
3298       case 'c':
3299         first = parse_reinterpret_cast_expr(first, last, db);
3300         break;
3301       case 'm':
3302         t = parse_binary_expression(first + 2, last, "%", db);
3303         if (t != first + 2)
3304           first = t;
3305         break;
3306       case 'M':
3307         t = parse_binary_expression(first + 2, last, "%=", db);
3308         if (t != first + 2)
3309           first = t;
3310         break;
3311       case 's':
3312         t = parse_binary_expression(first + 2, last, ">>", db);
3313         if (t != first + 2)
3314           first = t;
3315         break;
3316       case 'S':
3317         t = parse_binary_expression(first + 2, last, ">>=", db);
3318         if (t != first + 2)
3319           first = t;
3320         break;
3321       }
3322       break;
3323     case 's':
3324       switch (t[1]) {
3325       case 'c':
3326         first = parse_static_cast_expr(first, last, db);
3327         break;
3328       case 'p':
3329         first = parse_pack_expansion(first, last, db);
3330         break;
3331       case 'r':
3332         return parse_unresolved_name(first, last, db);
3333       case 't':
3334         first = parse_sizeof_type_expr(first, last, db);
3335         break;
3336       case 'z':
3337         first = parse_sizeof_expr_expr(first, last, db);
3338         break;
3339       case 'Z':
3340         if (last - t >= 3) {
3341           switch (t[2]) {
3342           case 'T':
3343             first = parse_sizeof_param_pack_expr(first, last, db);
3344             break;
3345           case 'f':
3346             first = parse_sizeof_function_param_pack_expr(first, last, db);
3347             break;
3348           }
3349         }
3350         break;
3351       }
3352       break;
3353     case 't':
3354       switch (t[1]) {
3355       case 'e':
3356       case 'i':
3357         first = parse_typeid_expr(first, last, db);
3358         break;
3359       case 'r':
3360         db.names.push_back("throw");
3361         first += 2;
3362         break;
3363       case 'w':
3364         first = parse_throw_expr(first, last, db);
3365         break;
3366       }
3367       break;
3368     case '1':
3369     case '2':
3370     case '3':
3371     case '4':
3372     case '5':
3373     case '6':
3374     case '7':
3375     case '8':
3376     case '9':
3377       return parse_unresolved_name(first, last, db);
3378     }
3379   }
3380   return first;
3381 }
3382
3383 // <template-arg> ::= <type>                                             # type
3384 // or template
3385 //                ::= X <expression> E                                   #
3386 //                expression
3387 //                ::= <expr-primary>                                     #
3388 //                simple expressions
3389 //                ::= J <template-arg>* E                                #
3390 //                argument pack
3391 //                ::= LZ <encoding> E                                    #
3392 //                extension
3393
3394 template <class C>
3395 static const char *parse_template_arg(const char *first, const char *last,
3396                                       C &db) {
3397   if (first != last) {
3398     const char *t;
3399     switch (*first) {
3400     case 'X':
3401       t = parse_expression(first + 1, last, db);
3402       if (t != first + 1) {
3403         if (t != last && *t == 'E')
3404           first = t + 1;
3405       }
3406       break;
3407     case 'J':
3408       t = first + 1;
3409       if (t == last)
3410         return first;
3411       while (*t != 'E') {
3412         const char *t1 = parse_template_arg(t, last, db);
3413         if (t1 == t)
3414           return first;
3415         t = t1;
3416       }
3417       first = t + 1;
3418       break;
3419     case 'L':
3420       // <expr-primary> or LZ <encoding> E
3421       if (first + 1 != last && first[1] == 'Z') {
3422         t = parse_encoding(first + 2, last, db);
3423         if (t != first + 2 && t != last && *t == 'E')
3424           first = t + 1;
3425       } else
3426         first = parse_expr_primary(first, last, db);
3427       break;
3428     default:
3429       // <type>
3430       first = parse_type(first, last, db);
3431       break;
3432     }
3433   }
3434   return first;
3435 }
3436
3437 // <template-args> ::= I <template-arg>* E
3438 //     extension, the abi says <template-arg>+
3439
3440 template <class C>
3441 static const char *parse_template_args(const char *first, const char *last,
3442                                        C &db) {
3443   if (last - first >= 2 && *first == 'I') {
3444     if (db.tag_templates)
3445       db.template_param.back().clear();
3446     const char *t = first + 1;
3447     std::string args("<");
3448     while (*t != 'E') {
3449       if (db.tag_templates)
3450         db.template_param.emplace_back();
3451       size_t k0 = db.names.size();
3452       const char *t1 = parse_template_arg(t, last, db);
3453       size_t k1 = db.names.size();
3454       if (db.tag_templates)
3455         db.template_param.pop_back();
3456       if (t1 == t || t1 == last)
3457         return first;
3458       if (db.tag_templates) {
3459         db.template_param.back().emplace_back();
3460         for (size_t k = k0; k < k1; ++k)
3461           db.template_param.back().back().push_back(db.names[k]);
3462       }
3463       for (size_t k = k0; k < k1; ++k) {
3464         if (args.size() > 1)
3465           args += ", ";
3466         args += db.names[k].move_full();
3467       }
3468       for (; k1 > k0; --k1)
3469         if (!db.names.empty())
3470           db.names.pop_back();
3471       t = t1;
3472     }
3473     first = t + 1;
3474     if (args.back() != '>')
3475       args += ">";
3476     else
3477       args += " >";
3478     db.names.push_back(std::move(args));
3479   }
3480   return first;
3481 }
3482
3483 // <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix>
3484 // <unqualified-name> E
3485 //               ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix>
3486 //               <template-args> E
3487 //
3488 // <prefix> ::= <prefix> <unqualified-name>
3489 //          ::= <template-prefix> <template-args>
3490 //          ::= <template-param>
3491 //          ::= <decltype>
3492 //          ::= # empty
3493 //          ::= <substitution>
3494 //          ::= <prefix> <data-member-prefix>
3495 //  extension ::= L
3496 //
3497 // <template-prefix> ::= <prefix> <template unqualified-name>
3498 //                   ::= <template-param>
3499 //                   ::= <substitution>
3500
3501 template <class C>
3502 static const char *parse_nested_name(const char *first, const char *last, C &db,
3503                                      bool *ends_with_template_args) {
3504   if (first != last && *first == 'N') {
3505     unsigned cv;
3506     const char *t0 = parse_cv_qualifiers(first + 1, last, cv);
3507     if (t0 == last)
3508       return first;
3509     db.ref = 0;
3510     if (*t0 == 'R') {
3511       db.ref = 1;
3512       ++t0;
3513     } else if (*t0 == 'O') {
3514       db.ref = 2;
3515       ++t0;
3516     }
3517     db.names.emplace_back();
3518     if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't') {
3519       t0 += 2;
3520       db.names.back().first = "std";
3521     }
3522     if (t0 == last) {
3523       db.names.pop_back();
3524       return first;
3525     }
3526     bool pop_subs = false;
3527     bool component_ends_with_template_args = false;
3528     while (*t0 != 'E') {
3529       component_ends_with_template_args = false;
3530       const char *t1;
3531       switch (*t0) {
3532       case 'S':
3533         if (t0 + 1 != last && t0[1] == 't')
3534           goto do_parse_unqualified_name;
3535         t1 = parse_substitution(t0, last, db);
3536         if (t1 != t0 && t1 != last) {
3537           auto name = db.names.back().move_full();
3538           db.names.pop_back();
3539           if (db.names.empty())
3540             return first;
3541           if (!db.names.back().first.empty()) {
3542             db.names.back().first += "::" + name;
3543             db.subs.push_back(typename C::sub_type(1, db.names.back()));
3544           } else
3545             db.names.back().first = name;
3546           pop_subs = true;
3547           t0 = t1;
3548         } else
3549           return first;
3550         break;
3551       case 'T':
3552         t1 = parse_template_param(t0, last, db);
3553         if (t1 != t0 && t1 != last) {
3554           auto name = db.names.back().move_full();
3555           db.names.pop_back();
3556           if (db.names.empty())
3557             return first;
3558           if (!db.names.back().first.empty())
3559             db.names.back().first += "::" + name;
3560           else
3561             db.names.back().first = name;
3562           db.subs.push_back(typename C::sub_type(1, db.names.back()));
3563           pop_subs = true;
3564           t0 = t1;
3565         } else
3566           return first;
3567         break;
3568       case 'D':
3569         if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
3570           goto do_parse_unqualified_name;
3571         t1 = parse_decltype(t0, last, db);
3572         if (t1 != t0 && t1 != last) {
3573           auto name = db.names.back().move_full();
3574           db.names.pop_back();
3575           if (db.names.empty())
3576             return first;
3577           if (!db.names.back().first.empty())
3578             db.names.back().first += "::" + name;
3579           else
3580             db.names.back().first = name;
3581           db.subs.push_back(typename C::sub_type(1, db.names.back()));
3582           pop_subs = true;
3583           t0 = t1;
3584         } else
3585           return first;
3586         break;
3587       case 'I':
3588         t1 = parse_template_args(t0, last, db);
3589         if (t1 != t0 && t1 != last) {
3590           auto name = db.names.back().move_full();
3591           db.names.pop_back();
3592           if (db.names.empty())
3593             return first;
3594           db.names.back().first += name;
3595           db.subs.push_back(typename C::sub_type(1, db.names.back()));
3596           t0 = t1;
3597           component_ends_with_template_args = true;
3598         } else
3599           return first;
3600         break;
3601       case 'L':
3602         if (++t0 == last)
3603           return first;
3604         break;
3605       default:
3606       do_parse_unqualified_name:
3607         t1 = parse_unqualified_name(t0, last, db);
3608         if (t1 != t0 && t1 != last) {
3609           auto name = db.names.back().move_full();
3610           db.names.pop_back();
3611           if (db.names.empty())
3612             return first;
3613           if (!db.names.back().first.empty())
3614             db.names.back().first += "::" + name;
3615           else
3616             db.names.back().first = name;
3617           db.subs.push_back(typename C::sub_type(1, db.names.back()));
3618           pop_subs = true;
3619           t0 = t1;
3620         } else
3621           return first;
3622       }
3623     }
3624     first = t0 + 1;
3625     db.cv = cv;
3626     if (pop_subs && !db.subs.empty())
3627       db.subs.pop_back();
3628     if (ends_with_template_args)
3629       *ends_with_template_args = component_ends_with_template_args;
3630   }
3631   return first;
3632 }
3633
3634 // <discriminator> := _ <non-negative number>      # when number < 10
3635 //                 := __ <non-negative number> _   # when number >= 10
3636 //  extension      := decimal-digit+               # at the end of string
3637
3638 static const char *parse_discriminator(const char *first, const char *last) {
3639   // parse but ignore discriminator
3640   if (first != last) {
3641     if (*first == '_') {
3642       const char *t1 = first + 1;
3643       if (t1 != last) {
3644         if (std::isdigit(*t1))
3645           first = t1 + 1;
3646         else if (*t1 == '_') {
3647           for (++t1; t1 != last && std::isdigit(*t1); ++t1)
3648             ;
3649           if (t1 != last && *t1 == '_')
3650             first = t1 + 1;
3651         }
3652       }
3653     } else if (std::isdigit(*first)) {
3654       const char *t1 = first + 1;
3655       for (; t1 != last && std::isdigit(*t1); ++t1)
3656         ;
3657       if (t1 == last)
3658         first = last;
3659     }
3660   }
3661   return first;
3662 }
3663
3664 // <local-name> := Z <function encoding> E <entity name> [<discriminator>]
3665 //              := Z <function encoding> E s [<discriminator>]
3666 //              := Z <function encoding> Ed [ <parameter number> ] _ <entity
3667 //              name>
3668
3669 template <class C>
3670 static const char *parse_local_name(const char *first, const char *last, C &db,
3671                                     bool *ends_with_template_args) {
3672   if (first != last && *first == 'Z') {
3673     const char *t = parse_encoding(first + 1, last, db);
3674     if (t != first + 1 && t != last && *t == 'E' && ++t != last) {
3675       switch (*t) {
3676       case 's':
3677         first = parse_discriminator(t + 1, last);
3678         if (db.names.empty())
3679           return first;
3680         db.names.back().first.append("::string literal");
3681         break;
3682       case 'd':
3683         if (++t != last) {
3684           const char *t1 = parse_number(t, last);
3685           if (t1 != last && *t1 == '_') {
3686             t = t1 + 1;
3687             t1 = parse_name(t, last, db, ends_with_template_args);
3688             if (t1 != t) {
3689               if (db.names.size() < 2)
3690                 return first;
3691               auto name = db.names.back().move_full();
3692               db.names.pop_back();
3693               if (db.names.empty())
3694                 return first;
3695               db.names.back().first.append("::");
3696               db.names.back().first.append(name);
3697               first = t1;
3698             } else if (!db.names.empty())
3699               db.names.pop_back();
3700           }
3701         }
3702         break;
3703       default: {
3704         const char *t1 = parse_name(t, last, db, ends_with_template_args);
3705         if (t1 != t) {
3706           // parse but ignore discriminator
3707           first = parse_discriminator(t1, last);
3708           if (db.names.size() < 2)
3709             return first;
3710           auto name = db.names.back().move_full();
3711           db.names.pop_back();
3712           if (db.names.empty())
3713             return first;
3714           db.names.back().first.append("::");
3715           db.names.back().first.append(name);
3716         } else if (!db.names.empty())
3717           db.names.pop_back();
3718       } break;
3719       }
3720     }
3721   }
3722   return first;
3723 }
3724
3725 // <name> ::= <nested-name> // N
3726 //        ::= <local-name> # See Scope Encoding below  // Z
3727 //        ::= <unscoped-template-name> <template-args>
3728 //        ::= <unscoped-name>
3729
3730 // <unscoped-template-name> ::= <unscoped-name>
3731 //                          ::= <substitution>
3732
3733 template <class C>
3734 static const char *parse_name(const char *first, const char *last, C &db,
3735                               bool *ends_with_template_args) {
3736   if (last - first >= 2) {
3737     const char *t0 = first;
3738     // extension: ignore L here
3739     if (*t0 == 'L')
3740       ++t0;
3741     switch (*t0) {
3742     case 'N': {
3743       const char *t1 = parse_nested_name(t0, last, db, ends_with_template_args);
3744       if (t1 != t0)
3745         first = t1;
3746       break;
3747     }
3748     case 'Z': {
3749       const char *t1 = parse_local_name(t0, last, db, ends_with_template_args);
3750       if (t1 != t0)
3751         first = t1;
3752       break;
3753     }
3754     default: {
3755       const char *t1 = parse_unscoped_name(t0, last, db);
3756       if (t1 != t0) {
3757         if (t1 != last &&
3758             *t1 == 'I') // <unscoped-template-name> <template-args>
3759         {
3760           if (db.names.empty())
3761             return first;
3762           db.subs.push_back(typename C::sub_type(1, db.names.back()));
3763           t0 = t1;
3764           t1 = parse_template_args(t0, last, db);
3765           if (t1 != t0) {
3766             if (db.names.size() < 2)
3767               return first;
3768             auto tmp = db.names.back().move_full();
3769             db.names.pop_back();
3770             if (db.names.empty())
3771               return first;
3772             db.names.back().first += tmp;
3773             first = t1;
3774             if (ends_with_template_args)
3775               *ends_with_template_args = true;
3776           }
3777         } else // <unscoped-name>
3778           first = t1;
3779       } else { // try <substitution> <template-args>
3780         t1 = parse_substitution(t0, last, db);
3781         if (t1 != t0 && t1 != last && *t1 == 'I') {
3782           t0 = t1;
3783           t1 = parse_template_args(t0, last, db);
3784           if (t1 != t0) {
3785             if (db.names.size() < 2)
3786               return first;
3787             auto tmp = db.names.back().move_full();
3788             db.names.pop_back();
3789             if (db.names.empty())
3790               return first;
3791             db.names.back().first += tmp;
3792             first = t1;
3793             if (ends_with_template_args)
3794               *ends_with_template_args = true;
3795           }
3796         }
3797       }
3798       break;
3799     }
3800     }
3801   }
3802   return first;
3803 }
3804
3805 // <call-offset> ::= h <nv-offset> _
3806 //               ::= v <v-offset> _
3807 //
3808 // <nv-offset> ::= <offset number>
3809 //               # non-virtual base override
3810 //
3811 // <v-offset>  ::= <offset number> _ <virtual offset number>
3812 //               # virtual base override, with vcall offset
3813
3814 static const char *parse_call_offset(const char *first, const char *last) {
3815   if (first != last) {
3816     switch (*first) {
3817     case 'h': {
3818       const char *t = parse_number(first + 1, last);
3819       if (t != first + 1 && t != last && *t == '_')
3820         first = t + 1;
3821     } break;
3822     case 'v': {
3823       const char *t = parse_number(first + 1, last);
3824       if (t != first + 1 && t != last && *t == '_') {
3825         const char *t2 = parse_number(++t, last);
3826         if (t2 != t && t2 != last && *t2 == '_')
3827           first = t2 + 1;
3828       }
3829     } break;
3830     }
3831   }
3832   return first;
3833 }
3834
3835 // <special-name> ::= TV <type>    # virtual table
3836 //                ::= TT <type>    # VTT structure (construction vtable index)
3837 //                ::= TI <type>    # typeinfo structure
3838 //                ::= TS <type>    # typeinfo name (null-terminated byte string)
3839 //                ::= Tc <call-offset> <call-offset> <base encoding>
3840 //                    # base is the nominal target function of thunk
3841 //                    # first call-offset is 'this' adjustment
3842 //                    # second call-offset is result adjustment
3843 //                ::= T <call-offset> <base encoding>
3844 //                    # base is the nominal target function of thunk
3845 //                ::= GV <object name> # Guard variable for one-time
3846 //                initialization
3847 //                                     # No <type>
3848 //                ::= TW <object name> # Thread-local wrapper
3849 //                ::= TH <object name> # Thread-local initialization
3850 //      extension ::= TC <first type> <number> _ <second type> # construction
3851 //      vtable for second-in-first
3852 //      extension ::= GR <object name> # reference temporary for object
3853
3854 template <class C>
3855 static const char *parse_special_name(const char *first, const char *last,
3856                                       C &db) {
3857   if (last - first > 2) {
3858     const char *t;
3859     switch (*first) {
3860     case 'T':
3861       switch (first[1]) {
3862       case 'V':
3863         // TV <type>    # virtual table
3864         t = parse_type(first + 2, last, db);
3865         if (t != first + 2) {
3866           if (db.names.empty())
3867             return first;
3868           db.names.back().first.insert(0, "vtable for ");
3869           first = t;
3870         }
3871         break;
3872       case 'T':
3873         // TT <type>    # VTT structure (construction vtable index)
3874         t = parse_type(first + 2, last, db);
3875         if (t != first + 2) {
3876           if (db.names.empty())
3877             return first;
3878           db.names.back().first.insert(0, "VTT for ");
3879           first = t;
3880         }
3881         break;
3882       case 'I':
3883         // TI <type>    # typeinfo structure
3884         t = parse_type(first + 2, last, db);
3885         if (t != first + 2) {
3886           if (db.names.empty())
3887             return first;
3888           db.names.back().first.insert(0, "typeinfo for ");
3889           first = t;
3890         }
3891         break;
3892       case 'S':
3893         // TS <type>    # typeinfo name (null-terminated byte string)
3894         t = parse_type(first + 2, last, db);
3895         if (t != first + 2) {
3896           if (db.names.empty())
3897             return first;
3898           db.names.back().first.insert(0, "typeinfo name for ");
3899           first = t;
3900         }
3901         break;
3902       case 'c':
3903         // Tc <call-offset> <call-offset> <base encoding>
3904         {
3905           const char *t0 = parse_call_offset(first + 2, last);
3906           if (t0 == first + 2)
3907             break;
3908           const char *t1 = parse_call_offset(t0, last);
3909           if (t1 == t0)
3910             break;
3911           t = parse_encoding(t1, last, db);
3912           if (t != t1) {
3913             if (db.names.empty())
3914               return first;
3915             db.names.back().first.insert(0, "covariant return thunk to ");
3916             first = t;
3917           }
3918         }
3919         break;
3920       case 'C':
3921         // extension ::= TC <first type> <number> _ <second type> # construction
3922         // vtable for second-in-first
3923         t = parse_type(first + 2, last, db);
3924         if (t != first + 2) {
3925           const char *t0 = parse_number(t, last);
3926           if (t0 != t && t0 != last && *t0 == '_') {
3927             const char *t1 = parse_type(++t0, last, db);
3928             if (t1 != t0) {
3929               if (db.names.size() < 2)
3930                 return first;
3931               auto left = db.names.back().move_full();
3932               db.names.pop_back();
3933               if (db.names.empty())
3934                 return first;
3935               db.names.back().first = "construction vtable for " +
3936                                       std::move(left) + "-in-" +
3937                                       db.names.back().move_full();
3938               first = t1;
3939             }
3940           }
3941         }
3942         break;
3943       case 'W':
3944         // TW <object name> # Thread-local wrapper
3945         t = parse_name(first + 2, last, db);
3946         if (t != first + 2) {
3947           if (db.names.empty())
3948             return first;
3949           db.names.back().first.insert(0, "thread-local wrapper routine for ");
3950           first = t;
3951         }
3952         break;
3953       case 'H':
3954         // TH <object name> # Thread-local initialization
3955         t = parse_name(first + 2, last, db);
3956         if (t != first + 2) {
3957           if (db.names.empty())
3958             return first;
3959           db.names.back().first.insert(
3960               0, "thread-local initialization routine for ");
3961           first = t;
3962         }
3963         break;
3964       default:
3965         // T <call-offset> <base encoding>
3966         {
3967           const char *t0 = parse_call_offset(first + 1, last);
3968           if (t0 == first + 1)
3969             break;
3970           t = parse_encoding(t0, last, db);
3971           if (t != t0) {
3972             if (db.names.empty())
3973               return first;
3974             if (first[1] == 'v') {
3975               db.names.back().first.insert(0, "virtual thunk to ");
3976               first = t;
3977             } else {
3978               db.names.back().first.insert(0, "non-virtual thunk to ");
3979               first = t;
3980             }
3981           }
3982         }
3983         break;
3984       }
3985       break;
3986     case 'G':
3987       switch (first[1]) {
3988       case 'V':
3989         // GV <object name> # Guard variable for one-time initialization
3990         t = parse_name(first + 2, last, db);
3991         if (t != first + 2) {
3992           if (db.names.empty())
3993             return first;
3994           db.names.back().first.insert(0, "guard variable for ");
3995           first = t;
3996         }
3997         break;
3998       case 'R':
3999         // extension ::= GR <object name> # reference temporary for object
4000         t = parse_name(first + 2, last, db);
4001         if (t != first + 2) {
4002           if (db.names.empty())
4003             return first;
4004           db.names.back().first.insert(0, "reference temporary for ");
4005           first = t;
4006         }
4007         break;
4008       }
4009       break;
4010     }
4011   }
4012   return first;
4013 }
4014
4015 namespace {
4016 template <class T> class save_value {
4017   T &restore_;
4018   T original_value_;
4019
4020 public:
4021   save_value(T &restore) : restore_(restore), original_value_(restore) {}
4022
4023   ~save_value() { restore_ = std::move(original_value_); }
4024
4025   save_value(const save_value &) = delete;
4026   save_value &operator=(const save_value &) = delete;
4027 };
4028 }
4029
4030 // <encoding> ::= <function name> <bare-function-type>
4031 //            ::= <data name>
4032 //            ::= <special-name>
4033
4034 template <class C>
4035 static const char *parse_encoding(const char *first, const char *last, C &db) {
4036   if (first != last) {
4037     save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
4038     ++db.encoding_depth;
4039     save_value<decltype(db.tag_templates)> sb(db.tag_templates);
4040     if (db.encoding_depth > 1)
4041       db.tag_templates = true;
4042     save_value<decltype(db.parsed_ctor_dtor_cv)> sp(db.parsed_ctor_dtor_cv);
4043     db.parsed_ctor_dtor_cv = false;
4044     switch (*first) {
4045     case 'G':
4046     case 'T':
4047       first = parse_special_name(first, last, db);
4048       break;
4049     default: {
4050       bool ends_with_template_args = false;
4051       const char *t = parse_name(first, last, db, &ends_with_template_args);
4052       unsigned cv = db.cv;
4053       unsigned ref = db.ref;
4054       if (t != first) {
4055         if (t != last && *t != 'E' && *t != '.') {
4056           save_value<bool> sb2(db.tag_templates);
4057           db.tag_templates = false;
4058           const char *t2;
4059           std::string ret2;
4060           if (db.names.empty())
4061             return first;
4062           const std::string &nm = db.names.back().first;
4063           if (nm.empty())
4064             return first;
4065           if (!db.parsed_ctor_dtor_cv && ends_with_template_args) {
4066             t2 = parse_type(t, last, db);
4067             if (t2 == t)
4068               return first;
4069             if (db.names.size() < 2)
4070               return first;
4071             auto ret1 = std::move(db.names.back().first);
4072             ret2 = std::move(db.names.back().second);
4073             if (ret2.empty())
4074               ret1 += ' ';
4075             db.names.pop_back();
4076             if (db.names.empty())
4077               return first;
4078
4079             db.names.back().first.insert(0, ret1);
4080             t = t2;
4081           }
4082           db.names.back().first += '(';
4083           if (t != last && *t == 'v') {
4084             ++t;
4085           } else {
4086             bool first_arg = true;
4087             while (true) {
4088               size_t k0 = db.names.size();
4089               t2 = parse_type(t, last, db);
4090               size_t k1 = db.names.size();
4091               if (t2 == t)
4092                 break;
4093               if (k1 > k0) {
4094                 std::string tmp;
4095                 for (size_t k = k0; k < k1; ++k) {
4096                   if (!tmp.empty())
4097                     tmp += ", ";
4098                   tmp += db.names[k].move_full();
4099                 }
4100                 for (size_t k = k0; k < k1; ++k) {
4101                   if (db.names.empty())
4102                     return first;
4103                   db.names.pop_back();
4104                 }
4105                 if (!tmp.empty()) {
4106                   if (db.names.empty())
4107                     return first;
4108                   if (!first_arg)
4109                     db.names.back().first += ", ";
4110                   else
4111                     first_arg = false;
4112                   db.names.back().first += tmp;
4113                 }
4114               }
4115               t = t2;
4116             }
4117           }
4118           if (db.names.empty())
4119             return first;
4120           db.names.back().first += ')';
4121           if (cv & CV_const)
4122             db.names.back().first.append(" const");
4123           if (cv & CV_volatile)
4124             db.names.back().first.append(" volatile");
4125           if (cv & CV_restrict)
4126             db.names.back().first.append(" restrict");
4127           if (ref == 1)
4128             db.names.back().first.append(" &");
4129           else if (ref == 2)
4130             db.names.back().first.append(" &&");
4131           db.names.back().first += ret2;
4132           first = t;
4133         } else
4134           first = t;
4135       }
4136       break;
4137     }
4138     }
4139   }
4140   return first;
4141 }
4142
4143 // _block_invoke
4144 // _block_invoke<decimal-digit>+
4145 // _block_invoke_<decimal-digit>+
4146
4147 template <class C>
4148 static const char *parse_block_invoke(const char *first, const char *last,
4149                                       C &db) {
4150   if (last - first >= 13) {
4151     const char test[] = "_block_invoke";
4152     const char *t = first;
4153     for (int i = 0; i < 13; ++i, ++t) {
4154       if (*t != test[i])
4155         return first;
4156     }
4157     if (t != last) {
4158       if (*t == '_') {
4159         // must have at least 1 decimal digit
4160         if (++t == last || !std::isdigit(*t))
4161           return first;
4162         ++t;
4163       }
4164       // parse zero or more digits
4165       while (t != last && isdigit(*t))
4166         ++t;
4167     }
4168     if (db.names.empty())
4169       return first;
4170     db.names.back().first.insert(0, "invocation function for block in ");
4171     first = t;
4172   }
4173   return first;
4174 }
4175
4176 // extension
4177 // <dot-suffix> := .<anything and everything>
4178
4179 template <class C>
4180 static const char *parse_dot_suffix(const char *first, const char *last,
4181                                     C &db) {
4182   if (first != last && *first == '.') {
4183     if (db.names.empty())
4184       return first;
4185     db.names.back().first += " (" + std::string(first, last) + ")";
4186     first = last;
4187   }
4188   return first;
4189 }
4190
4191 // <block-involcaton-function> ___Z<encoding>_block_invoke
4192 // <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
4193 // <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
4194 // <mangled-name> ::= _Z<encoding>
4195 //                ::= <type>
4196
4197 template <class C>
4198 static void demangle(const char *first, const char *last, C &db, int &status) {
4199   if (first >= last) {
4200     status = invalid_mangled_name;
4201     return;
4202   }
4203   if (*first == '_') {
4204     if (last - first >= 4) {
4205       if (first[1] == 'Z') {
4206         const char *t = parse_encoding(first + 2, last, db);
4207         if (t != first + 2 && t != last && *t == '.')
4208           t = parse_dot_suffix(t, last, db);
4209         if (t != last)
4210           status = invalid_mangled_name;
4211       } else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z') {
4212         const char *t = parse_encoding(first + 4, last, db);
4213         if (t != first + 4 && t != last) {
4214           const char *t1 = parse_block_invoke(t, last, db);
4215           if (t1 != last)
4216             status = invalid_mangled_name;
4217         } else
4218           status = invalid_mangled_name;
4219       } else
4220         status = invalid_mangled_name;
4221     } else
4222       status = invalid_mangled_name;
4223   } else {
4224     const char *t = parse_type(first, last, db);
4225     if (t != last)
4226       status = invalid_mangled_name;
4227   }
4228   if (status == success && db.names.empty())
4229     status = invalid_mangled_name;
4230 }
4231
4232 namespace {
4233 template <class StrT> struct string_pair {
4234   StrT first;
4235   StrT second;
4236
4237   string_pair() = default;
4238   string_pair(StrT f) : first(std::move(f)) {}
4239   string_pair(StrT f, StrT s) : first(std::move(f)), second(std::move(s)) {}
4240   template <size_t N> string_pair(const char (&s)[N]) : first(s, N - 1) {}
4241
4242   size_t size() const { return first.size() + second.size(); }
4243   bool empty() const { return first.empty() && second.empty(); }
4244   StrT full() const { return first + second; }
4245   StrT move_full() { return std::move(first) + std::move(second); }
4246 };
4247
4248 struct Db {
4249   typedef std::vector<string_pair<std::string>> sub_type;
4250   typedef std::vector<sub_type> template_param_type;
4251   sub_type names;
4252   template_param_type subs;
4253   std::vector<template_param_type> template_param;
4254   unsigned cv = 0;
4255   unsigned ref = 0;
4256   unsigned encoding_depth = 0;
4257   bool parsed_ctor_dtor_cv = false;
4258   bool tag_templates = true;
4259   bool fix_forward_references = false;
4260   bool try_to_parse_template_args = true;
4261
4262   Db() : subs(0, names), template_param(0, subs) {}
4263 };
4264 }
4265
4266 char *llvm::itaniumDemangle(const char *mangled_name, char *buf, size_t *n,
4267                             int *status) {
4268   if (mangled_name == nullptr || (buf != nullptr && n == nullptr)) {
4269     if (status)
4270       *status = invalid_args;
4271     return nullptr;
4272   }
4273   size_t internal_size = buf != nullptr ? *n : 0;
4274   Db db;
4275   db.template_param.emplace_back();
4276   int internal_status = success;
4277   size_t len = std::strlen(mangled_name);
4278   demangle(mangled_name, mangled_name + len, db, internal_status);
4279   if (internal_status == success && db.fix_forward_references &&
4280       !db.template_param.empty() && !db.template_param.front().empty()) {
4281     db.fix_forward_references = false;
4282     db.tag_templates = false;
4283     db.names.clear();
4284     db.subs.clear();
4285     demangle(mangled_name, mangled_name + len, db, internal_status);
4286     if (db.fix_forward_references)
4287       internal_status = invalid_mangled_name;
4288   }
4289   if (internal_status == success) {
4290     size_t sz = db.names.back().size() + 1;
4291     if (sz > internal_size) {
4292       char *newbuf = static_cast<char *>(std::realloc(buf, sz));
4293       if (newbuf == nullptr) {
4294         internal_status = memory_alloc_failure;
4295         buf = nullptr;
4296       } else {
4297         buf = newbuf;
4298         if (n != nullptr)
4299           *n = sz;
4300       }
4301     }
4302     if (buf != nullptr) {
4303       db.names.back().first += db.names.back().second;
4304       std::memcpy(buf, db.names.back().first.data(), sz - 1);
4305       buf[sz - 1] = char(0);
4306     }
4307   } else
4308     buf = nullptr;
4309   if (status)
4310     *status = internal_status;
4311   return buf;
4312 }