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