blob: 039448505f86008f3311fc7c24dbb2b92787f4be [file] [log] [blame]
Howard Hinnant4fbf16a2011-05-05 15:27:28 +00001//===-------------------------- cxa_demangle.cpp --------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "cxa_demangle.h"
11
12#include <stdlib.h>
13#include <string.h>
14#include <ctype.h>
15#include <stdio.h>
16#include <new>
17#include <algorithm>
18#include <assert.h>
19
20
21#ifdef DEBUGGING
22
23#include <string>
24#include <typeinfo>
25
26#endif
27
28namespace __cxxabiv1
29{
30
31namespace __libcxxabi
32{
33
34#pragma GCC visibility push(hidden)
35
36class __node
37{
38 __node(const __node&);
39 __node& operator=(const __node&);
40public:
41 const char* __name_;
42 size_t __size_;
43 __node* __left_;
44 __node* __right_;
45 long double __value_;
46 long __cached_size_;
47public:
48 __node()
49 : __name_(0), __size_(0), __left_(0), __right_(0), __cached_size_(-1)
50 {}
51 virtual ~__node() {};
52
53 void reset_cached_size()
54 {
55 __cached_size_ = -1;
56 if (__left_)
57 __left_->reset_cached_size();
58 if (__right_)
59 __right_->reset_cached_size();
60 }
61
62 virtual size_t first_size() const {return 0;}
63 virtual size_t second_size() const {return 0;}
64 virtual size_t size() const
65 {
66 if (__cached_size_ == -1)
67 const_cast<long&>(__cached_size_) = first_size() + second_size();
68 return __cached_size_;
69 }
70 virtual char* first_demangled_name(char* buf) const {return buf;}
71 virtual char* second_demangled_name(char* buf) const {return buf;}
72 virtual char* get_demangled_name(char* buf) const
73 {
74 return second_demangled_name(first_demangled_name(buf));
75 }
76 virtual size_t base_size() const {return size();}
77 virtual char* get_base_name(char* buf) const
78 {
79 return get_demangled_name(buf);
80 }
81 virtual ptrdiff_t print_base_name(char* f, char* l) const
82 {
83 return print(f, l);
84 }
85 virtual bool ends_with_template() const
86 {
87 return false;
88 }
89 virtual bool is_ctor_dtor_conv() const
90 {
91 return false;
92 }
93 virtual __node* base_name() const
94 {
95 return const_cast<__node*>(this);
96 }
97 virtual bool is_reference_or_pointer_to_function_or_array() const
98 {
99 return false;
100 }
101 virtual bool is_function() const
102 {
103 return false;
104 }
105 virtual bool is_cv_qualifer() const
106 {
107 return false;
108 }
109 virtual bool is_array() const
110 {
111 return false;
112 }
113
114 virtual bool fix_forward_references(__node**, __node**)
115 {
116 return true;
117 }
118 virtual __node* extract_cv(__node*&) const
119 {
120 return 0;
121 }
122 virtual size_t list_len() const
123 {
124 return 0;
125 }
126 virtual bool is_sub() const
127 {
128 return false;
129 }
130
131 virtual ptrdiff_t print(char* f, char* l) const
132 {
133 const ptrdiff_t sz1 = print_first(f, l);
134 return sz1 + print_second(f+std::min(sz1, l-f), l);
135 }
136 virtual ptrdiff_t print_first(char*, char*) const
137 {
138 return 0;
139 }
140 virtual ptrdiff_t print_second(char*, char*) const
141 {
142 return 0;
143 }
144};
145
146#ifdef DEBUGGING
147
148void display(__node* x, int indent = 0)
149{
150 if (x)
151 {
152 for (int i = 0; i < 2*indent; ++i)
153 printf(" ");
154 std::string buf(x->size(), '\0');
155 x->print(&buf.front(), &buf.back()+1);
156 printf("%s %s, %p\n", typeid(*x).name(), buf.c_str(), x);
157 display(x->__left_, indent+1);
158 display(x->__right_, indent+1);
159 }
160}
161
162#endif
163
164class __vtable
165 : public __node
166{
167 static const ptrdiff_t n = sizeof("vtable for ") - 1;
168public:
169 __vtable(__node* type)
170 {
171 __right_ = type;
172 }
173
174 virtual size_t first_size() const
175 {
176 if (__cached_size_ == -1)
177 const_cast<long&>(__cached_size_) = n + __right_->size();
178 return __cached_size_;
179 }
180 virtual char* first_demangled_name(char* buf) const
181 {
182 strncpy(buf, "vtable for ", n);
183 return __right_->get_demangled_name(buf+n);
184 }
185 virtual ptrdiff_t print_first(char* f, char* l) const
186 {
187 const ptrdiff_t r = l - f;
188 if (r < n)
189 return n + __right_->print(l, l);
190 ptrdiff_t sz = __right_->print(f+n, l) + n;
191 if (r >= sz)
192 {
193 *f++ = 'v';
194 *f++ = 't';
195 *f++ = 'a';
196 *f++ = 'b';
197 *f++ = 'l';
198 *f++ = 'e';
199 *f++ = ' ';
200 *f++ = 'f';
201 *f++ = 'o';
202 *f++ = 'r';
203 *f = ' ';
204 }
205 return sz;
206 }
207 virtual __node* base_name() const
208 {
209 return __right_->base_name();
210 }
211 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
212 {
213 return __right_->fix_forward_references(t_begin, t_end);
214 }
215};
216
217class __VTT
218 : public __node
219{
220 static const ptrdiff_t n = sizeof("VTT for ") - 1;
221public:
222 __VTT(__node* type)
223 {
224 __right_ = type;
225 }
226
227 virtual size_t first_size() const
228 {
229 if (__cached_size_ == -1)
230 const_cast<long&>(__cached_size_) = n + __right_->size();
231 return __cached_size_;
232 }
233 virtual char* first_demangled_name(char* buf) const
234 {
235 strncpy(buf, "VTT for ", n);
236 return __right_->get_demangled_name(buf+n);
237 }
238 virtual ptrdiff_t print_first(char* f, char* l) const
239 {
240 const ptrdiff_t r = l - f;
241 if (r < n)
242 return n + __right_->print(l, l);
243 ptrdiff_t sz = __right_->print(f+n, l) + n;
244 if (r >= sz)
245 {
246 *f++ = 'V';
247 *f++ = 'T';
248 *f++ = 'T';
249 *f++ = ' ';
250 *f++ = 'f';
251 *f++ = 'o';
252 *f++ = 'r';
253 *f = ' ';
254 }
255 return sz;
256 }
257 virtual __node* base_name() const
258 {
259 return __right_->base_name();
260 }
261 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
262 {
263 return __right_->fix_forward_references(t_begin, t_end);
264 }
265};
266
Howard Hinnant10115242011-12-09 20:07:56 +0000267class __construction_vtable
268 : public __node
269{
270 static const ptrdiff_t n = sizeof("construction vtable for ") - 1 + 4;
271public:
272 __construction_vtable(__node* left, __node* right)
273 {
274 __left_ = left;
275 __right_ = right;
276 }
277
278 virtual size_t first_size() const
279 {
280 if (__cached_size_ == -1)
281 const_cast<long&>(__cached_size_) = n + __left_->size()
282 + __right_->size();
283 return __cached_size_;
284 }
285 virtual char* first_demangled_name(char* buf) const
286 {
287 strncpy(buf, "construction vtable for ", n-4);
288 buf = __left_->get_demangled_name(buf+n-4);
289 *buf++ = '-';
290 *buf++ = 'i';
291 *buf++ = 'n';
292 *buf++ = '-';
293 return __right_->get_demangled_name(buf);
294 }
295 virtual ptrdiff_t print_first(char* f, char* l) const
296 {
297 const ptrdiff_t r = l - f;
298 if (r < n)
299 return n + __left_->print(l, l) + __right_->print(l, l);
300 ptrdiff_t lsz = __left_->print(f+n-4, l);
301 ptrdiff_t sz = lsz + n;
302 if (r >= sz)
303 {
304 sz += __right_->print(f+sz, l);
305 if (r >= sz)
306 {
307 strncpy(f, "construction vtable for ", n-4);
308 f += n-4 + lsz;
309 *f++ = '-';
310 *f++ = 'i';
311 *f++ = 'n';
312 *f++ = '-';
313 }
314 }
315 else
316 return sz + __right_->print(l, l);
317 return sz;
318 }
319 virtual __node* base_name() const
320 {
321 return __right_->base_name();
322 }
323 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
324 {
325 bool r = true;
326 if (__left_)
327 r = __left_->fix_forward_references(t_begin, t_end);
328 return r && __right_->fix_forward_references(t_begin, t_end);
329 }
330};
331
Howard Hinnant4fbf16a2011-05-05 15:27:28 +0000332class __typeinfo
333 : public __node
334{
335 static const ptrdiff_t n = sizeof("typeinfo for ") - 1;
336public:
337 __typeinfo(__node* type)
338 {
339 __right_ = type;
340 }
341
342 virtual size_t first_size() const
343 {
344 if (__cached_size_ == -1)
345 const_cast<long&>(__cached_size_) = n + __right_->size();
346 return __cached_size_;
347 }
348 virtual char* first_demangled_name(char* buf) const
349 {
350 strncpy(buf, "typeinfo for ", n);
351 return __right_->get_demangled_name(buf+n);
352 }
353 virtual ptrdiff_t print_first(char* f, char* l) const
354 {
355 const ptrdiff_t r = l - f;
356 if (r < n)
357 return n + __right_->print(l, l);
358 ptrdiff_t sz = __right_->print(f+n, l) + n;
359 if (r >= sz)
360 {
361 *f++ = 't';
362 *f++ = 'y';
363 *f++ = 'p';
364 *f++ = 'e';
365 *f++ = 'i';
366 *f++ = 'n';
367 *f++ = 'f';
368 *f++ = 'o';
369 *f++ = ' ';
370 *f++ = 'f';
371 *f++ = 'o';
372 *f++ = 'r';
373 *f = ' ';
374 }
375 return sz;
376 }
377 virtual __node* base_name() const
378 {
379 return __right_->base_name();
380 }
381 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
382 {
383 return __right_->fix_forward_references(t_begin, t_end);
384 }
385};
386
387class __typeinfo_name
388 : public __node
389{
390 static const ptrdiff_t n = sizeof("typeinfo name for ") - 1;
391public:
392 __typeinfo_name(__node* type)
393 {
394 __right_ = type;
395 }
396
397 virtual size_t first_size() const
398 {
399 if (__cached_size_ == -1)
400 const_cast<long&>(__cached_size_) = n + __right_->size();
401 return __cached_size_;
402 }
403 virtual char* first_demangled_name(char* buf) const
404 {
405 strncpy(buf, "typeinfo name for ", n);
406 return __right_->get_demangled_name(buf+n);
407 }
408 virtual ptrdiff_t print_first(char* f, char* l) const
409 {
410 const ptrdiff_t r = l - f;
411 if (r < n)
412 return n + __right_->print(l, l);
413 ptrdiff_t sz = __right_->print(f+n, l) + n;
414 if (r >= sz)
415 {
416 *f++ = 't';
417 *f++ = 'y';
418 *f++ = 'p';
419 *f++ = 'e';
420 *f++ = 'i';
421 *f++ = 'n';
422 *f++ = 'f';
423 *f++ = 'o';
424 *f++ = ' ';
425 *f++ = 'n';
426 *f++ = 'a';
427 *f++ = 'm';
428 *f++ = 'e';
429 *f++ = ' ';
430 *f++ = 'f';
431 *f++ = 'o';
432 *f++ = 'r';
433 *f = ' ';
434 }
435 return sz;
436 }
437 virtual __node* base_name() const
438 {
439 return __right_->base_name();
440 }
441 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
442 {
443 return __right_->fix_forward_references(t_begin, t_end);
444 }
445};
446
447class __covariant_return_thunk
448 : public __node
449{
450 static const ptrdiff_t n = sizeof("covariant return thunk to ") - 1;
451public:
452 __covariant_return_thunk(__node* type)
453 {
454 __right_ = type;
455 }
456
457 virtual size_t first_size() const
458 {
459 if (__cached_size_ == -1)
460 const_cast<long&>(__cached_size_) = n + __right_->size();
461 return __cached_size_;
462 }
463 virtual char* first_demangled_name(char* buf) const
464 {
465 strncpy(buf, "covariant return thunk to ", n);
466 return __right_->get_demangled_name(buf+n);
467 }
468 virtual ptrdiff_t print_first(char* f, char* l) const
469 {
470 const ptrdiff_t r = l - f;
471 if (r < n)
472 return n + __right_->print(l, l);
473 ptrdiff_t sz = __right_->print(f+n, l) + n;
474 if (r >= sz)
475 {
476 *f++ = 'c';
477 *f++ = 'o';
478 *f++ = 'v';
479 *f++ = 'a';
480 *f++ = 'r';
481 *f++ = 'i';
482 *f++ = 'a';
483 *f++ = 'n';
484 *f++ = 't';
485 *f++ = ' ';
486 *f++ = 'r';
487 *f++ = 'e';
488 *f++ = 't';
489 *f++ = 'u';
490 *f++ = 'r';
491 *f++ = 'n';
492 *f++ = ' ';
493 *f++ = 't';
494 *f++ = 'h';
495 *f++ = 'u';
496 *f++ = 'n';
497 *f++ = 'k';
498 *f++ = ' ';
499 *f++ = 't';
500 *f++ = 'o';
501 *f = ' ';
502 }
503 return sz;
504 }
505 virtual __node* base_name() const
506 {
507 return __right_->base_name();
508 }
509 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
510 {
511 return __right_->fix_forward_references(t_begin, t_end);
512 }
513};
514
515class __virtual_thunk
516 : public __node
517{
518 static const size_t n = sizeof("virtual thunk to ") - 1;
519public:
520 __virtual_thunk(__node* type)
521 {
522 __right_ = type;
523 }
524
525 virtual size_t first_size() const
526 {
527 if (__cached_size_ == -1)
528 const_cast<long&>(__cached_size_) = n + __right_->size();
529 return __cached_size_;
530 }
531 virtual char* first_demangled_name(char* buf) const
532 {
533 strncpy(buf, "virtual thunk to ", n);
534 return __right_->get_demangled_name(buf+n);
535 }
536 virtual ptrdiff_t print_first(char* f, char* l) const
537 {
538 const ptrdiff_t r = l - f;
539 if (r < n)
540 return n + __right_->print(l, l);
541 ptrdiff_t sz = __right_->print(f+n, l) + n;
542 if (r >= sz)
543 {
544 *f++ = 'v';
545 *f++ = 'i';
546 *f++ = 'r';
547 *f++ = 't';
548 *f++ = 'u';
549 *f++ = 'a';
550 *f++ = 'l';
551 *f++ = ' ';
552 *f++ = 't';
553 *f++ = 'h';
554 *f++ = 'u';
555 *f++ = 'n';
556 *f++ = 'k';
557 *f++ = ' ';
558 *f++ = 't';
559 *f++ = 'o';
560 *f = ' ';
561 }
562 return sz;
563 }
564 virtual __node* base_name() const
565 {
566 return __right_->base_name();
567 }
568 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
569 {
570 return __right_->fix_forward_references(t_begin, t_end);
571 }
572};
573
574class __non_virtual_thunk
575 : public __node
576{
577 static const size_t n = sizeof("non-virtual thunk to ") - 1;
578public:
579 __non_virtual_thunk(__node* type)
580 {
581 __right_ = type;
582 }
583
584 virtual size_t first_size() const
585 {
586 if (__cached_size_ == -1)
587 const_cast<long&>(__cached_size_) = n + __right_->size();
588 return __cached_size_;
589 }
590 virtual char* first_demangled_name(char* buf) const
591 {
592 strncpy(buf, "non-virtual thunk to ", n);
593 return __right_->get_demangled_name(buf+n);
594 }
595 virtual ptrdiff_t print_first(char* f, char* l) const
596 {
597 const ptrdiff_t r = l - f;
598 if (r < n)
599 return n + __right_->print(l, l);
600 ptrdiff_t sz = __right_->print(f+n, l) + n;
601 if (r >= sz)
602 {
603 *f++ = 'n';
604 *f++ = 'o';
605 *f++ = 'n';
606 *f++ = '-';
607 *f++ = 'v';
608 *f++ = 'i';
609 *f++ = 'r';
610 *f++ = 't';
611 *f++ = 'u';
612 *f++ = 'a';
613 *f++ = 'l';
614 *f++ = ' ';
615 *f++ = 't';
616 *f++ = 'h';
617 *f++ = 'u';
618 *f++ = 'n';
619 *f++ = 'k';
620 *f++ = ' ';
621 *f++ = 't';
622 *f++ = 'o';
623 *f = ' ';
624 }
625 return sz;
626 }
627 virtual __node* base_name() const
628 {
629 return __right_->base_name();
630 }
631 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
632 {
633 return __right_->fix_forward_references(t_begin, t_end);
634 }
635};
636
637class __guard_variable
638 : public __node
639{
640 static const size_t n = sizeof("guard variable for ") - 1;
641public:
642 __guard_variable(__node* type)
643 {
644 __right_ = type;
645 }
646
647 virtual size_t first_size() const
648 {
649 if (__cached_size_ == -1)
650 const_cast<long&>(__cached_size_) = n + __right_->size();
651 return __cached_size_;
652 }
653 virtual char* first_demangled_name(char* buf) const
654 {
655 strncpy(buf, "guard variable for ", n);
656 return __right_->get_demangled_name(buf+n);
657 }
658 virtual ptrdiff_t print_first(char* f, char* l) const
659 {
660 const ptrdiff_t r = l - f;
661 if (r < n)
662 return n + __right_->print(l, l);
663 ptrdiff_t sz = __right_->print(f+n, l) + n;
664 if (r >= sz)
665 {
666 *f++ = 'g';
667 *f++ = 'u';
668 *f++ = 'a';
669 *f++ = 'r';
670 *f++ = 'd';
671 *f++ = ' ';
672 *f++ = 'v';
673 *f++ = 'a';
674 *f++ = 'r';
675 *f++ = 'i';
676 *f++ = 'a';
677 *f++ = 'b';
678 *f++ = 'l';
679 *f++ = 'e';
680 *f++ = ' ';
681 *f++ = 'f';
682 *f++ = 'o';
683 *f++ = 'r';
684 *f = ' ';
685 }
686 return sz;
687 }
688 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
689 {
690 return __right_->fix_forward_references(t_begin, t_end);
691 }
692};
693
Howard Hinnant10115242011-12-09 20:07:56 +0000694class __reference_temporary
695 : public __node
696{
697 static const size_t n = sizeof("reference temporary for ") - 1;
698public:
699 __reference_temporary(__node* type)
700 {
701 __right_ = type;
702 }
703
704 virtual size_t first_size() const
705 {
706 if (__cached_size_ == -1)
707 const_cast<long&>(__cached_size_) = n + __right_->size();
708 return __cached_size_;
709 }
710 virtual char* first_demangled_name(char* buf) const
711 {
712 strncpy(buf, "reference temporary for ", n);
713 return __right_->get_demangled_name(buf+n);
714 }
715 virtual ptrdiff_t print_first(char* f, char* l) const
716 {
717 const ptrdiff_t r = l - f;
718 if (r < n)
719 return n + __right_->print(l, l);
720 ptrdiff_t sz = __right_->print(f+n, l) + n;
721 if (r >= sz)
722 strncpy(f, "reference temporary for ", n);
723 return sz;
724 }
725 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
726 {
727 return __right_->fix_forward_references(t_begin, t_end);
728 }
729};
730
Howard Hinnant4fbf16a2011-05-05 15:27:28 +0000731class __source_name
732 : public __node
733{
734public:
735 __source_name(const char* __name, unsigned __size)
736 {
737 __name_ = __name;
738 __size_ = __size;
739 }
740
741 virtual size_t first_size() const
742 {
743 if (__cached_size_ == -1)
744 {
745 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
746 const_cast<long&>(__cached_size_) = 21;
747 else
748 const_cast<long&>(__cached_size_) = __size_;
749 }
750 return __cached_size_;
751 }
752 virtual char* first_demangled_name(char* buf) const
753 {
754 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
755 return strncpy(buf, "(anonymous namespace)", 21) + 21;
756 return strncpy(buf, __name_, __size_) + __size_;
757 }
758 virtual ptrdiff_t print_first(char* f, char* l) const
759 {
760 const ptrdiff_t r = l - f;
761 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
762 {
763 const ptrdiff_t n = sizeof("(anonymous namespace)") - 1;
764 if (r >= n)
765 {
766 *f++ = '(';
767 *f++ = 'a';
768 *f++ = 'n';
769 *f++ = 'o';
770 *f++ = 'n';
771 *f++ = 'y';
772 *f++ = 'm';
773 *f++ = 'o';
774 *f++ = 'u';
775 *f++ = 's';
776 *f++ = ' ';
777 *f++ = 'n';
778 *f++ = 'a';
779 *f++ = 'm';
780 *f++ = 'e';
781 *f++ = 's';
782 *f++ = 'p';
783 *f++ = 'a';
784 *f++ = 'c';
785 *f++ = 'e';
786 *f = ')';
787 }
788 return n;
789 }
790 if (r >= __size_)
791 strncpy(f, __name_, __size_);
792 return __size_;
793 }
794};
795
796class __operator_new
797 : public __node
798{
799public:
800
801 virtual size_t first_size() const {return sizeof("operator new") - 1;}
802 virtual char* first_demangled_name(char* buf) const
803 {
804 return strncpy(buf, "operator new", sizeof("operator new") - 1) +
805 sizeof("operator new") - 1;
806 }
807 virtual ptrdiff_t print_first(char* f, char* l) const
808 {
809 const ptrdiff_t r = l - f;
810 const ptrdiff_t n = sizeof("operator new") - 1;
811 if (r >= n)
812 {
813 *f++ = 'o';
814 *f++ = 'p';
815 *f++ = 'e';
816 *f++ = 'r';
817 *f++ = 'a';
818 *f++ = 't';
819 *f++ = 'o';
820 *f++ = 'r';
821 *f++ = ' ';
822 *f++ = 'n';
823 *f++ = 'e';
824 *f = 'w';
825 }
826 return n;
827 }
828};
829
830class __operator_new_array
831 : public __node
832{
833public:
834
835 virtual size_t first_size() const {return sizeof("operator new[]") - 1;}
836 virtual char* first_demangled_name(char* buf) const
837 {
838 return strncpy(buf, "operator new[]", sizeof("operator new[]") - 1) +
839 sizeof("operator new[]") - 1;
840 }
841 virtual ptrdiff_t print_first(char* f, char* l) const
842 {
843 const ptrdiff_t r = l - f;
844 const ptrdiff_t n = sizeof("operator new[]") - 1;
845 if (r >= n)
846 {
847 *f++ = 'o';
848 *f++ = 'p';
849 *f++ = 'e';
850 *f++ = 'r';
851 *f++ = 'a';
852 *f++ = 't';
853 *f++ = 'o';
854 *f++ = 'r';
855 *f++ = ' ';
856 *f++ = 'n';
857 *f++ = 'e';
858 *f++ = 'w';
859 *f++ = '[';
860 *f = ']';
861 }
862 return n;
863 }
864};
865
866class __operator_delete
867 : public __node
868{
869public:
870
871 virtual size_t first_size() const {return sizeof("operator delete") - 1;}
872 virtual char* first_demangled_name(char* buf) const
873 {
874 return strncpy(buf, "operator delete", sizeof("operator delete") - 1) +
875 sizeof("operator delete") - 1;
876 }
877 virtual ptrdiff_t print_first(char* f, char* l) const
878 {
879 const ptrdiff_t r = l - f;
880 const ptrdiff_t n = sizeof("operator delete") - 1;
881 if (r >= n)
882 {
883 *f++ = 'o';
884 *f++ = 'p';
885 *f++ = 'e';
886 *f++ = 'r';
887 *f++ = 'a';
888 *f++ = 't';
889 *f++ = 'o';
890 *f++ = 'r';
891 *f++ = ' ';
892 *f++ = 'd';
893 *f++ = 'e';
894 *f++ = 'l';
895 *f++ = 'e';
896 *f++ = 't';
897 *f = 'e';
898 }
899 return n;
900 }
901};
902
903class __operator_delete_array
904 : public __node
905{
906public:
907
908 virtual size_t first_size() const {return sizeof("operator delete[]") - 1;}
909 virtual char* first_demangled_name(char* buf) const
910 {
911 return strncpy(buf, "operator delete[]", sizeof("operator delete[]") - 1) +
912 sizeof("operator delete[]") - 1;
913 }
914 virtual ptrdiff_t print_first(char* f, char* l) const
915 {
916 const ptrdiff_t r = l - f;
917 const ptrdiff_t n = sizeof("operator delete[]") - 1;
918 if (r >= n)
919 {
920 *f++ = 'o';
921 *f++ = 'p';
922 *f++ = 'e';
923 *f++ = 'r';
924 *f++ = 'a';
925 *f++ = 't';
926 *f++ = 'o';
927 *f++ = 'r';
928 *f++ = ' ';
929 *f++ = 'd';
930 *f++ = 'e';
931 *f++ = 'l';
932 *f++ = 'e';
933 *f++ = 't';
934 *f++ = 'e';
935 *f++ = '[';
936 *f = ']';
937 }
938 return n;
939 }
940};
941
942class __operator_logical_and
943 : public __node
944{
945public:
946
947 __operator_logical_and() {}
948 __operator_logical_and(__node* op1, __node* op2)
949 {
950 __left_ = op1;
951 __right_ = op2;
952 }
953 virtual size_t first_size() const
954 {
955 if (__cached_size_ == -1)
956 {
957 if (__left_)
958 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
959 else
960 const_cast<long&>(__cached_size_) = sizeof("operator&&") - 1;
961 }
962 return __cached_size_;
963 }
964 virtual char* first_demangled_name(char* buf) const
965 {
966 if (__left_)
967 {
968 *buf++ = '(';
969 buf = __left_->get_demangled_name(buf);
970 strncpy(buf, ") && (", 6);
971 buf += 6;
972 buf = __right_->get_demangled_name(buf);
973 *buf++ = ')';
974 }
975 else
976 {
977 strncpy(buf, "operator&&", sizeof("operator&&") - 1);
978 buf += sizeof("operator&&") - 1;
979 }
980 return buf;
981 }
982 virtual ptrdiff_t print_first(char* f, char* l) const
983 {
984 const ptrdiff_t r = l - f;
985 if (__left_)
986 {
987 const ptrdiff_t n1 = 8;
988 if (r < n1)
989 return n1 + __left_->print(l, l) + __right_->print(l, l);
990 ptrdiff_t sz1 = __left_->print(f+1, l);
991 if (r < n1 + sz1)
992 return n1 + sz1 + __right_->print(l, l);
993 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
994 if (r >= n1 + sz1 + sz2)
995 {
996 *f = '(';
997 f += 1 + sz1;
998 *f++ = ')';
999 *f++ = ' ';
1000 *f++ = '&';
1001 *f++ = '&';
1002 *f++ = ' ';
1003 *f = '(';
1004 f += 1 + sz2;
1005 *f = ')';
1006 }
1007 return n1 + sz1 + sz2;
1008 }
1009 const ptrdiff_t n2 = sizeof("operator&&") - 1;
1010 if (r >= n2)
1011 {
1012 *f++ = 'o';
1013 *f++ = 'p';
1014 *f++ = 'e';
1015 *f++ = 'r';
1016 *f++ = 'a';
1017 *f++ = 't';
1018 *f++ = 'o';
1019 *f++ = 'r';
1020 *f++ = '&';
1021 *f = '&';
1022 }
1023 return n2;
1024 }
1025 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1026 {
1027 bool r = true;
1028 if (__left_)
1029 r = r && __left_->fix_forward_references(t_begin, t_end);
1030 if (__right_)
1031 r = r && __right_->fix_forward_references(t_begin, t_end);
1032 return r;
1033 }
1034};
1035
1036class __operator_addressof
1037 : public __node
1038{
1039public:
1040
1041 __operator_addressof() {}
1042 explicit __operator_addressof(__node* op)
1043 {
1044 __left_ = op;
1045 }
1046 virtual size_t first_size() const
1047 {
1048 if (__cached_size_ == -1)
1049 {
1050 if (__left_)
1051 const_cast<long&>(__cached_size_) = 3+__left_->size();
1052 else
1053 const_cast<long&>(__cached_size_) = sizeof("operator&") - 1;
1054 }
1055 return __cached_size_;
1056 }
1057 virtual char* first_demangled_name(char* buf) const
1058 {
1059 if (__left_)
1060 {
1061 *buf++ = '&';
1062 *buf++ = '(';
1063 buf = __left_->get_demangled_name(buf);
1064 *buf++ = ')';
1065 }
1066 else
1067 {
1068 strncpy(buf, "operator&", sizeof("operator&") - 1);
1069 buf += sizeof("operator&") - 1;
1070 }
1071 return buf;
1072 }
1073 virtual ptrdiff_t print_first(char* f, char* l) const
1074 {
1075 const ptrdiff_t r = l - f;
1076 if (__left_)
1077 {
1078 const ptrdiff_t n1 = 3;
1079 if (r < n1)
1080 return n1 + __left_->print(l, l);
1081 ptrdiff_t sz1 = __left_->print(f+2, l);
1082 if (r >= n1 + sz1)
1083 {
1084 *f++ = '&';
1085 *f = '(';
1086 f += 1 + sz1;
1087 *f = ')';
1088 }
1089 return n1 + sz1;
1090 }
1091 const ptrdiff_t n2 = sizeof("operator&") - 1;
1092 if (r >= n2)
1093 {
1094 *f++ = 'o';
1095 *f++ = 'p';
1096 *f++ = 'e';
1097 *f++ = 'r';
1098 *f++ = 'a';
1099 *f++ = 't';
1100 *f++ = 'o';
1101 *f++ = 'r';
1102 *f = '&';
1103 }
1104 return n2;
1105 }
1106 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1107 {
1108 if (__left_)
1109 return __left_->fix_forward_references(t_begin, t_end);
1110 return true;
1111 }
1112};
1113
1114class __operator_bit_and
1115 : public __node
1116{
1117public:
1118
1119 __operator_bit_and() {}
1120 __operator_bit_and(__node* op1, __node* op2)
1121 {
1122 __left_ = op1;
1123 __right_ = op2;
1124 }
1125 virtual size_t first_size() const
1126 {
1127 if (__cached_size_ == -1)
1128 {
1129 if (__left_)
1130 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1131 else
1132 const_cast<long&>(__cached_size_) = sizeof("operator&") - 1;
1133 }
1134 return __cached_size_;
1135 }
1136 virtual char* first_demangled_name(char* buf) const
1137 {
1138 if (__left_)
1139 {
1140 *buf++ = '(';
1141 buf = __left_->get_demangled_name(buf);
1142 strncpy(buf, ") & (", 5);
1143 buf += 5;
1144 buf = __right_->get_demangled_name(buf);
1145 *buf++ = ')';
1146 }
1147 else
1148 {
1149 strncpy(buf, "operator&", sizeof("operator&") - 1);
1150 buf += sizeof("operator&") - 1;
1151 }
1152 return buf;
1153 }
1154 virtual ptrdiff_t print_first(char* f, char* l) const
1155 {
1156 const ptrdiff_t r = l - f;
1157 if (__left_)
1158 {
1159 const ptrdiff_t n1 = 7;
1160 if (r < n1)
1161 return n1 + __left_->print(l, l) + __right_->print(l, l);
1162 ptrdiff_t sz1 = __left_->print(f+1, l);
1163 if (r < n1 + sz1)
1164 return n1 + sz1 + __right_->print(l, l);
1165 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1166 if (r >= n1 + sz1 + sz2)
1167 {
1168 *f = '(';
1169 f += 1 + sz1;
1170 *f++ = ')';
1171 *f++ = ' ';
1172 *f++ = '&';
1173 *f++ = ' ';
1174 *f = '(';
1175 f += 1 + sz2;
1176 *f = ')';
1177 }
1178 return n1 + sz1 + sz2;
1179 }
1180 const ptrdiff_t n2 = sizeof("operator&") - 1;
1181 if (r >= n2)
1182 {
1183 *f++ = 'o';
1184 *f++ = 'p';
1185 *f++ = 'e';
1186 *f++ = 'r';
1187 *f++ = 'a';
1188 *f++ = 't';
1189 *f++ = 'o';
1190 *f++ = 'r';
1191 *f = '&';
1192 }
1193 return n2;
1194 }
1195 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1196 {
1197 bool r = true;
1198 if (__left_)
1199 r = r && __left_->fix_forward_references(t_begin, t_end);
1200 if (__right_)
1201 r = r && __right_->fix_forward_references(t_begin, t_end);
1202 return r;
1203 }
1204};
1205
1206class __operator_and_equal
1207 : public __node
1208{
1209public:
1210
1211 __operator_and_equal() {}
1212 __operator_and_equal(__node* op1, __node* op2)
1213 {
1214 __left_ = op1;
1215 __right_ = op2;
1216 }
1217 virtual size_t first_size() const
1218 {
1219 if (__cached_size_ == -1)
1220 {
1221 if (__left_)
1222 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
1223 else
1224 const_cast<long&>(__cached_size_) = sizeof("operator&=") - 1;
1225 }
1226 return __cached_size_;
1227 }
1228 virtual char* first_demangled_name(char* buf) const
1229 {
1230 if (__left_)
1231 {
1232 *buf++ = '(';
1233 buf = __left_->get_demangled_name(buf);
1234 strncpy(buf, ") &= (", 6);
1235 buf += 6;
1236 buf = __right_->get_demangled_name(buf);
1237 *buf++ = ')';
1238 }
1239 else
1240 {
1241 strncpy(buf, "operator&=", sizeof("operator&=") - 1);
1242 buf += sizeof("operator&=") - 1;
1243 }
1244 return buf;
1245 }
1246 virtual ptrdiff_t print_first(char* f, char* l) const
1247 {
1248 const ptrdiff_t r = l - f;
1249 if (__left_)
1250 {
1251 const ptrdiff_t n1 = 8;
1252 if (r < n1)
1253 return n1 + __left_->print(l, l) + __right_->print(l, l);
1254 ptrdiff_t sz1 = __left_->print(f+1, l);
1255 if (r < n1 + sz1)
1256 return n1 + sz1 + __right_->print(l, l);
1257 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1258 if (r >= n1 + sz1 + sz2)
1259 {
1260 *f = '(';
1261 f += 1 + sz1;
1262 *f++ = ')';
1263 *f++ = ' ';
1264 *f++ = '&';
1265 *f++ = '=';
1266 *f++ = ' ';
1267 *f = '(';
1268 f += 1 + sz2;
1269 *f = ')';
1270 }
1271 return n1 + sz1 + sz2;
1272 }
1273 const ptrdiff_t n2 = sizeof("operator&=") - 1;
1274 if (r >= n2)
1275 {
1276 *f++ = 'o';
1277 *f++ = 'p';
1278 *f++ = 'e';
1279 *f++ = 'r';
1280 *f++ = 'a';
1281 *f++ = 't';
1282 *f++ = 'o';
1283 *f++ = 'r';
1284 *f++ = '&';
1285 *f = '=';
1286 }
1287 return n2;
1288 }
1289 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1290 {
1291 bool r = true;
1292 if (__left_)
1293 r = r && __left_->fix_forward_references(t_begin, t_end);
1294 if (__right_)
1295 r = r && __right_->fix_forward_references(t_begin, t_end);
1296 return r;
1297 }
1298};
1299
1300class __operator_equal
1301 : public __node
1302{
1303public:
1304
1305 __operator_equal() {}
1306 __operator_equal(__node* op1, __node* op2)
1307 {
1308 __left_ = op1;
1309 __right_ = op2;
1310 }
1311 virtual size_t first_size() const
1312 {
1313 if (__cached_size_ == -1)
1314 {
1315 if (__left_)
1316 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1317 else
1318 const_cast<long&>(__cached_size_) = sizeof("operator=") - 1;
1319 }
1320 return __cached_size_;
1321 }
1322 virtual char* first_demangled_name(char* buf) const
1323 {
1324 if (__left_)
1325 {
1326 *buf++ = '(';
1327 buf = __left_->get_demangled_name(buf);
1328 strncpy(buf, ") = (", 5);
1329 buf += 5;
1330 buf = __right_->get_demangled_name(buf);
1331 *buf++ = ')';
1332 }
1333 else
1334 {
1335 strncpy(buf, "operator=", sizeof("operator=") - 1);
1336 buf += sizeof("operator=") - 1;
1337 }
1338 return buf;
1339 }
1340 virtual ptrdiff_t print_first(char* f, char* l) const
1341 {
1342 const ptrdiff_t r = l - f;
1343 if (__left_)
1344 {
1345 const ptrdiff_t n1 = 7;
1346 if (r < n1)
1347 return n1 + __left_->print(l, l) + __right_->print(l, l);
1348 ptrdiff_t sz1 = __left_->print(f+1, l);
1349 if (r < n1 + sz1)
1350 return n1 + sz1 + __right_->print(l, l);
1351 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1352 if (r >= n1 + sz1 + sz2)
1353 {
1354 *f = '(';
1355 f += 1 + sz1;
1356 *f++ = ')';
1357 *f++ = ' ';
1358 *f++ = '=';
1359 *f++ = ' ';
1360 *f = '(';
1361 f += 1 + sz2;
1362 *f = ')';
1363 }
1364 return n1 + sz1 + sz2;
1365 }
1366 const ptrdiff_t n2 = sizeof("operator=") - 1;
1367 if (r >= n2)
1368 {
1369 *f++ = 'o';
1370 *f++ = 'p';
1371 *f++ = 'e';
1372 *f++ = 'r';
1373 *f++ = 'a';
1374 *f++ = 't';
1375 *f++ = 'o';
1376 *f++ = 'r';
1377 *f = '=';
1378 }
1379 return n2;
1380 }
1381 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1382 {
1383 bool r = true;
1384 if (__left_)
1385 r = r && __left_->fix_forward_references(t_begin, t_end);
1386 if (__right_)
1387 r = r && __right_->fix_forward_references(t_begin, t_end);
1388 return r;
1389 }
1390};
1391
1392class __operator_alignof_type
1393 : public __node
1394{
1395public:
1396
1397 __operator_alignof_type() {}
1398 __operator_alignof_type(__node* op)
1399 {
1400 __right_ = op;
1401 }
1402 virtual size_t first_size() const
1403 {
1404 if (__cached_size_ == -1)
1405 {
1406 if (__right_)
1407 const_cast<long&>(__cached_size_) = __right_->size() + 10;
1408 else
1409 const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1;
1410 }
1411 return __cached_size_;
1412 }
1413 virtual char* first_demangled_name(char* buf) const
1414 {
1415 if (__right_)
1416 {
1417 strncpy(buf, "alignof (", 9);
1418 buf += 9;
1419 buf = __right_->get_demangled_name(buf);
1420 *buf++ = ')';
1421 }
1422 else
1423 {
1424 strncpy(buf, "operator alignof", sizeof("operator alignof") - 1);
1425 buf += sizeof("operator alignof") - 1;
1426 }
1427 return buf;
1428 }
1429 virtual ptrdiff_t print_first(char* f, char* l) const
1430 {
1431 const ptrdiff_t r = l - f;
1432 if (__right_)
1433 {
1434 const ptrdiff_t n1 = sizeof("alignof ()") - 1;
1435 if (r < n1)
1436 return n1 + __right_->print(l, l);
1437 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
1438 if (r >= n1 + sz1)
1439 {
1440 *f++ = 'a';
1441 *f++ = 'l';
1442 *f++ = 'i';
1443 *f++ = 'g';
1444 *f++ = 'n';
1445 *f++ = 'o';
1446 *f++ = 'f';
1447 *f++ = ' ';
1448 *f = '(';
1449 f += 1 + sz1;
1450 *f = ')';
1451 }
1452 return n1 + sz1;
1453 }
1454 const ptrdiff_t n2 = sizeof("operator alignof") - 1;
1455 if (r >= n2)
1456 {
1457 *f++ = 'o';
1458 *f++ = 'p';
1459 *f++ = 'e';
1460 *f++ = 'r';
1461 *f++ = 'a';
1462 *f++ = 't';
1463 *f++ = 'o';
1464 *f++ = 'r';
1465 *f++ = ' ';
1466 *f++ = 'a';
1467 *f++ = 'l';
1468 *f++ = 'i';
1469 *f++ = 'g';
1470 *f++ = 'n';
1471 *f++ = 'o';
1472 *f = 'f';
1473 }
1474 return n2;
1475 }
1476 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1477 {
1478 if (__right_)
1479 return __right_->fix_forward_references(t_begin, t_end);
1480 return true;
1481 }
1482};
1483
1484class __operator_alignof_expression
1485 : public __node
1486{
1487public:
1488
1489 __operator_alignof_expression() {}
1490 __operator_alignof_expression(__node* op)
1491 {
1492 __right_ = op;
1493 }
1494 virtual size_t first_size() const
1495 {
1496 if (__cached_size_ == -1)
1497 {
1498 if (__right_)
1499 const_cast<long&>(__cached_size_) = __right_->size() + 10;
1500 else
1501 const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1;
1502 }
1503 return __cached_size_;
1504 }
1505 virtual char* first_demangled_name(char* buf) const
1506 {
1507 if (__right_)
1508 {
1509 strncpy(buf, "alignof (", 9);
1510 buf += 9;
1511 buf = __right_->get_demangled_name(buf);
1512 *buf++ = ')';
1513 }
1514 else
1515 {
1516 strncpy(buf, "operator alignof", sizeof("operator alignof") - 1);
1517 buf += sizeof("operator alignof") - 1;
1518 }
1519 return buf;
1520 }
1521 virtual ptrdiff_t print_first(char* f, char* l) const
1522 {
1523 const ptrdiff_t r = l - f;
1524 if (__right_)
1525 {
1526 const ptrdiff_t n1 = sizeof("alignof ()") - 1;
1527 if (r < n1)
1528 return n1 + __right_->print(l, l);
1529 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
1530 if (r >= n1 + sz1)
1531 {
1532 *f++ = 'a';
1533 *f++ = 'l';
1534 *f++ = 'i';
1535 *f++ = 'g';
1536 *f++ = 'n';
1537 *f++ = 'o';
1538 *f++ = 'f';
1539 *f++ = ' ';
1540 *f = '(';
1541 f += 1 + sz1;
1542 *f = ')';
1543 }
1544 return n1 + sz1;
1545 }
1546 const ptrdiff_t n2 = sizeof("operator alignof") - 1;
1547 if (r >= n2)
1548 {
1549 *f++ = 'o';
1550 *f++ = 'p';
1551 *f++ = 'e';
1552 *f++ = 'r';
1553 *f++ = 'a';
1554 *f++ = 't';
1555 *f++ = 'o';
1556 *f++ = 'r';
1557 *f++ = ' ';
1558 *f++ = 'a';
1559 *f++ = 'l';
1560 *f++ = 'i';
1561 *f++ = 'g';
1562 *f++ = 'n';
1563 *f++ = 'o';
1564 *f = 'f';
1565 }
1566 return n2;
1567 }
1568 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1569 {
1570 if (__right_)
1571 return __right_->fix_forward_references(t_begin, t_end);
1572 return true;
1573 }
1574};
1575
1576class __operator_paren
1577 : public __node
1578{
1579public:
1580
1581 virtual size_t first_size() const {return sizeof("operator()") - 1;}
1582 virtual char* first_demangled_name(char* buf) const
1583 {
1584 strncpy(buf, "operator()", sizeof("operator()") - 1);
1585 return buf + sizeof("operator()") - 1;
1586 }
1587 virtual ptrdiff_t print_first(char* f, char* l) const
1588 {
1589 const ptrdiff_t r = l - f;
1590 const ptrdiff_t n = sizeof("operator()") - 1;
1591 if (r >= n)
1592 {
1593 *f++ = 'o';
1594 *f++ = 'p';
1595 *f++ = 'e';
1596 *f++ = 'r';
1597 *f++ = 'a';
1598 *f++ = 't';
1599 *f++ = 'o';
1600 *f++ = 'r';
1601 *f++ = '(';
1602 *f = ')';
1603 }
1604 return n;
1605 }
1606};
1607
1608class __operator_comma
1609 : public __node
1610{
1611public:
1612
1613 __operator_comma() {}
1614 __operator_comma(__node* op1, __node* op2)
1615 {
1616 __left_ = op1;
1617 __right_ = op2;
1618 }
1619 virtual size_t first_size() const
1620 {
1621 if (__cached_size_ == -1)
1622 {
1623 if (__left_)
1624 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1625 else
1626 const_cast<long&>(__cached_size_) = sizeof("operator,") - 1;
1627 }
1628 return __cached_size_;
1629 }
1630 virtual char* first_demangled_name(char* buf) const
1631 {
1632 if (__left_)
1633 {
1634 *buf++ = '(';
1635 buf = __left_->get_demangled_name(buf);
1636 strncpy(buf, ") , (", 5);
1637 buf += 5;
1638 buf = __right_->get_demangled_name(buf);
1639 *buf++ = ')';
1640 }
1641 else
1642 {
1643 strncpy(buf, "operator,", sizeof("operator,") - 1);
1644 buf += sizeof("operator,") - 1;
1645 }
1646 return buf;
1647 }
1648 virtual ptrdiff_t print_first(char* f, char* l) const
1649 {
1650 const ptrdiff_t r = l - f;
1651 if (__left_)
1652 {
1653 const ptrdiff_t n1 = 7;
1654 if (r < n1)
1655 return n1 + __left_->print(l, l) + __right_->print(l, l);
1656 ptrdiff_t sz1 = __left_->print(f+1, l);
1657 if (r < n1 + sz1)
1658 return n1 + sz1 + __right_->print(l, l);
1659 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1660 if (r >= n1 + sz1 + sz2)
1661 {
1662 *f = '(';
1663 f += 1 + sz1;
1664 *f++ = ')';
1665 *f++ = ' ';
1666 *f++ = ',';
1667 *f++ = ' ';
1668 *f = '(';
1669 f += 1 + sz2;
1670 *f = ')';
1671 }
1672 return n1 + sz1 + sz2;
1673 }
1674 const ptrdiff_t n2 = sizeof("operator,") - 1;
1675 if (r >= n2)
1676 {
1677 *f++ = 'o';
1678 *f++ = 'p';
1679 *f++ = 'e';
1680 *f++ = 'r';
1681 *f++ = 'a';
1682 *f++ = 't';
1683 *f++ = 'o';
1684 *f++ = 'r';
1685 *f = ',';
1686 }
1687 return n2;
1688 }
1689 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1690 {
1691 bool r = true;
1692 if (__left_)
1693 r = r && __left_->fix_forward_references(t_begin, t_end);
1694 if (__right_)
1695 r = r && __right_->fix_forward_references(t_begin, t_end);
1696 return r;
1697 }
1698};
1699
1700class __operator_tilda
1701 : public __node
1702{
1703public:
1704
1705 __operator_tilda() {}
1706 explicit __operator_tilda(__node* op)
1707 {
1708 __left_ = op;
1709 }
1710 virtual size_t first_size() const
1711 {
1712 if (__cached_size_ == -1)
1713 {
1714 if (__left_)
1715 const_cast<long&>(__cached_size_) = 3+__left_->size();
1716 else
1717 const_cast<long&>(__cached_size_) = sizeof("operator~") - 1;
1718 }
1719 return __cached_size_;
1720 }
1721 virtual char* first_demangled_name(char* buf) const
1722 {
1723 if (__left_)
1724 {
1725 *buf++ = '~';
1726 *buf++ = '(';
1727 buf = __left_->get_demangled_name(buf);
1728 *buf++ = ')';
1729 }
1730 else
1731 {
1732 strncpy(buf, "operator~", sizeof("operator~") - 1);
1733 buf += sizeof("operator~") - 1;
1734 }
1735 return buf;
1736 }
1737 virtual ptrdiff_t print_first(char* f, char* l) const
1738 {
1739 const ptrdiff_t r = l - f;
1740 if (__left_)
1741 {
1742 const ptrdiff_t n1 = 3;
1743 if (r < n1)
1744 return n1 + __left_->print(l, l);
1745 ptrdiff_t sz1 = __left_->print(f+2, l);
1746 if (r >= n1 + sz1)
1747 {
1748 *f++ = '~';
1749 *f = '(';
1750 f += 1 + sz1;
1751 *f = ')';
1752 }
1753 return n1 + sz1;
1754 }
1755 const ptrdiff_t n2 = sizeof("operator~") - 1;
1756 if (r >= n2)
1757 {
1758 *f++ = 'o';
1759 *f++ = 'p';
1760 *f++ = 'e';
1761 *f++ = 'r';
1762 *f++ = 'a';
1763 *f++ = 't';
1764 *f++ = 'o';
1765 *f++ = 'r';
1766 *f = '~';
1767 }
1768 return n2;
1769 }
1770 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1771 {
1772 if (__left_)
1773 return __left_->fix_forward_references(t_begin, t_end);
1774 return true;
1775 }
1776};
1777
1778class __operator_cast
1779 : public __node
1780{
1781 static const size_t n = sizeof("operator ") - 1;
1782public:
1783
1784 explicit __operator_cast(__node* type)
1785 {
1786 __right_ = type;
1787 }
1788 __operator_cast(__node* type, __node* arg)
1789 {
1790 __size_ = 1;
1791 __right_ = type;
1792 __left_ = arg;
1793 }
1794 virtual size_t first_size() const
1795 {
1796 if (__cached_size_ == -1)
1797 {
1798 size_t off;
1799 if (__size_)
1800 {
1801 off = 4;
1802 off += __right_->size();
1803 if (__left_)
1804 off += __left_->size();
1805 }
1806 else
1807 off = n + __right_->size();;
1808 const_cast<long&>(__cached_size_) = off;
1809 }
1810 return __cached_size_;
1811 }
1812 virtual char* first_demangled_name(char* buf) const
1813 {
1814 if (__size_)
1815 {
1816 *buf++ = '(';
1817 buf = __right_->get_demangled_name(buf);
1818 *buf++ = ')';
1819 *buf++ = '(';
1820 if (__left_)
1821 buf = __left_->get_demangled_name(buf);
1822 *buf++ = ')';
1823 }
1824 else
1825 {
1826 strncpy(buf, "operator ", n);
1827 buf = __right_->get_demangled_name(buf+n);
1828 }
1829 return buf;
1830 }
1831 virtual ptrdiff_t print_first(char* f, char* l) const
1832 {
1833 const ptrdiff_t r = l - f;
1834 if (__size_)
1835 {
1836 const ptrdiff_t n1 = 4;
1837 if (r < n1)
1838 return n1 + __right_->print(l, l) +
1839 (__left_ ? __left_->print(l, l) : 0);
1840 ptrdiff_t sz1 = __right_->print(f+1, l);
1841 if (r < n1 + sz1)
1842 return n1 + sz1 + (__left_ ? __left_->print(l, l) : 0);
1843 ptrdiff_t sz2 = __left_ ? __left_->print(f+3+sz1, l) : 0;
1844 if (r >= n1 + sz1 + sz2)
1845 {
1846 *f = '(';
1847 f += 1 + sz1;
1848 *f++ = ')';
1849 *f = '(';
1850 f += 1 + sz2;
1851 *f = ')';
1852 }
1853 return n1 + sz1 + sz2;
1854 }
1855 const ptrdiff_t n2 = sizeof("operator ") - 1;
1856 if (r < n2)
1857 return n2 + __right_->print(l, l);
1858 ptrdiff_t sz1 = __right_->print(f+n2, l);
1859 if (r >= n2 + sz1)
1860 {
1861 *f++ = 'o';
1862 *f++ = 'p';
1863 *f++ = 'e';
1864 *f++ = 'r';
1865 *f++ = 'a';
1866 *f++ = 't';
1867 *f++ = 'o';
1868 *f++ = 'r';
1869 *f = ' ';
1870 }
1871 return n2 + sz1;
1872 }
1873 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1874 {
1875 bool r = true;
1876 if (__left_)
1877 r = r && __left_->fix_forward_references(t_begin, t_end);
1878 r = r && __right_->fix_forward_references(t_begin, t_end);
1879 return r;
1880 }
1881 virtual bool is_ctor_dtor_conv() const
1882 {
1883 return true;
1884 }
1885};
1886
1887class __cast_literal
1888 : public __node
1889{
1890public:
1891
1892 __cast_literal(__node* type, const char* f, const char* l)
1893 {
1894 __left_ = type;
1895 __name_ = f;
1896 __size_ = l - f;
1897 }
1898 virtual size_t first_size() const
1899 {
1900 if (__cached_size_ == -1)
1901 const_cast<long&>(__cached_size_) = 2 + __left_->size() + __size_;
1902 return __cached_size_;
1903 }
1904 virtual char* first_demangled_name(char* buf) const
1905 {
1906 *buf++ = '(';
1907 buf = __left_->get_demangled_name(buf);
1908 *buf++ = ')';
1909 strncpy(buf, __name_, __size_);
1910 return buf + __size_;
1911 }
1912 virtual ptrdiff_t print_first(char* f, char* l) const
1913 {
1914 const ptrdiff_t r = l - f;
1915 const ptrdiff_t n = 2;
1916 if (r < __size_ + n)
1917 return __size_ + n + __left_->print(l, l);
1918 ptrdiff_t sz = __left_->print(f+1, l);
1919 if (r >= __size_ + n + sz)
1920 {
1921 *f = '(';
1922 f += 1 + sz;
1923 *f++ = ')';
1924 strncpy(f, __name_, __size_);
1925 }
1926 return __size_ + n + sz;
1927 }
1928 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1929 {
1930 return __left_->fix_forward_references(t_begin, t_end);
1931 }
1932};
1933
1934class __operator_dereference
1935 : public __node
1936{
1937public:
1938
1939 __operator_dereference() {}
1940 explicit __operator_dereference(__node* op)
1941 {
1942 __left_ = op;
1943 }
1944 virtual size_t first_size() const
1945 {
1946 if (__cached_size_ == -1)
1947 {
1948 if (__left_)
1949 const_cast<long&>(__cached_size_) = 3+__left_->size();
1950 else
1951 const_cast<long&>(__cached_size_) = sizeof("operator*") - 1;
1952 }
1953 return __cached_size_;
1954 }
1955 virtual char* first_demangled_name(char* buf) const
1956 {
1957 if (__left_)
1958 {
1959 *buf++ = '*';
1960 *buf++ = '(';
1961 buf = __left_->get_demangled_name(buf);
1962 *buf++ = ')';
1963 }
1964 else
1965 {
1966 strncpy(buf, "operator*", sizeof("operator*") - 1);
1967 buf += sizeof("operator*") - 1;
1968 }
1969 return buf;
1970 }
1971 virtual ptrdiff_t print_first(char* f, char* l) const
1972 {
1973 const ptrdiff_t r = l - f;
1974 if (__left_)
1975 {
1976 const ptrdiff_t n1 = 3;
1977 if (r < n1)
1978 return n1 + __left_->print(l, l);
1979 ptrdiff_t sz1 = __left_->print(f+2, l);
1980 if (r >= n1 + sz1)
1981 {
1982 *f++ = '*';
1983 *f = '(';
1984 f += 1 + sz1;
1985 *f = ')';
1986 }
1987 return n1 + sz1;
1988 }
1989 const ptrdiff_t n2 = sizeof("operator*") - 1;
1990 if (r >= n2)
1991 {
1992 *f++ = 'o';
1993 *f++ = 'p';
1994 *f++ = 'e';
1995 *f++ = 'r';
1996 *f++ = 'a';
1997 *f++ = 't';
1998 *f++ = 'o';
1999 *f++ = 'r';
2000 *f = '*';
2001 }
2002 return n2;
2003 }
2004 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2005 {
2006 if (__left_)
2007 return __left_->fix_forward_references(t_begin, t_end);
2008 return true;
2009 }
2010};
2011
2012class __operator_divide
2013 : public __node
2014{
2015public:
2016
2017 __operator_divide() {}
2018 __operator_divide(__node* op1, __node* op2)
2019 {
2020 __left_ = op1;
2021 __right_ = op2;
2022 }
2023 virtual size_t first_size() const
2024 {
2025 if (__cached_size_ == -1)
2026 {
2027 if (__left_)
2028 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2029 else
2030 const_cast<long&>(__cached_size_) = sizeof("operator/") - 1;
2031 }
2032 return __cached_size_;
2033 }
2034 virtual char* first_demangled_name(char* buf) const
2035 {
2036 if (__left_)
2037 {
2038 *buf++ = '(';
2039 buf = __left_->get_demangled_name(buf);
2040 strncpy(buf, ") / (", 5);
2041 buf += 5;
2042 buf = __right_->get_demangled_name(buf);
2043 *buf++ = ')';
2044 }
2045 else
2046 {
2047 strncpy(buf, "operator/", sizeof("operator/") - 1);
2048 buf += sizeof("operator/") - 1;
2049 }
2050 return buf;
2051 }
2052 virtual ptrdiff_t print_first(char* f, char* l) const
2053 {
2054 const ptrdiff_t r = l - f;
2055 if (__left_)
2056 {
2057 const ptrdiff_t n1 = 7;
2058 if (r < n1)
2059 return n1 + __left_->print(l, l) + __right_->print(l, l);
2060 ptrdiff_t sz1 = __left_->print(f+1, l);
2061 if (r < n1 + sz1)
2062 return n1 + sz1 + __right_->print(l, l);
2063 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2064 if (r >= n1 + sz1 + sz2)
2065 {
2066 *f = '(';
2067 f += 1 + sz1;
2068 *f++ = ')';
2069 *f++ = ' ';
2070 *f++ = '/';
2071 *f++ = ' ';
2072 *f = '(';
2073 f += 1 + sz2;
2074 *f = ')';
2075 }
2076 return n1 + sz1 + sz2;
2077 }
2078 const ptrdiff_t n2 = sizeof("operator/") - 1;
2079 if (r >= n2)
2080 {
2081 *f++ = 'o';
2082 *f++ = 'p';
2083 *f++ = 'e';
2084 *f++ = 'r';
2085 *f++ = 'a';
2086 *f++ = 't';
2087 *f++ = 'o';
2088 *f++ = 'r';
2089 *f = '/';
2090 }
2091 return n2;
2092 }
2093 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2094 {
2095 bool r = true;
2096 if (__left_)
2097 r = r && __left_->fix_forward_references(t_begin, t_end);
2098 if (__right_)
2099 r = r && __right_->fix_forward_references(t_begin, t_end);
2100 return r;
2101 }
2102};
2103
2104class __operator_divide_equal
2105 : public __node
2106{
2107public:
2108
2109 __operator_divide_equal() {}
2110 __operator_divide_equal(__node* op1, __node* op2)
2111 {
2112 __left_ = op1;
2113 __right_ = op2;
2114 }
2115 virtual size_t first_size() const
2116 {
2117 if (__cached_size_ == -1)
2118 {
2119 if (__left_)
2120 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2121 else
2122 const_cast<long&>(__cached_size_) = sizeof("operator/=") - 1;
2123 }
2124 return __cached_size_;
2125 }
2126 virtual char* first_demangled_name(char* buf) const
2127 {
2128 if (__left_)
2129 {
2130 *buf++ = '(';
2131 buf = __left_->get_demangled_name(buf);
2132 strncpy(buf, ") /= (", 6);
2133 buf += 6;
2134 buf = __right_->get_demangled_name(buf);
2135 *buf++ = ')';
2136 }
2137 else
2138 {
2139 strncpy(buf, "operator/=", sizeof("operator/=") - 1);
2140 buf += sizeof("operator/=") - 1;
2141 }
2142 return buf;
2143 }
2144 virtual ptrdiff_t print_first(char* f, char* l) const
2145 {
2146 const ptrdiff_t r = l - f;
2147 if (__left_)
2148 {
2149 const ptrdiff_t n1 = 8;
2150 if (r < n1)
2151 return n1 + __left_->print(l, l) + __right_->print(l, l);
2152 ptrdiff_t sz1 = __left_->print(f+1, l);
2153 if (r < n1 + sz1)
2154 return n1 + sz1 + __right_->print(l, l);
2155 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2156 if (r >= n1 + sz1 + sz2)
2157 {
2158 *f = '(';
2159 f += 1 + sz1;
2160 *f++ = ')';
2161 *f++ = ' ';
2162 *f++ = '/';
2163 *f++ = '=';
2164 *f++ = ' ';
2165 *f = '(';
2166 f += 1 + sz2;
2167 *f = ')';
2168 }
2169 return n1 + sz1 + sz2;
2170 }
2171 const ptrdiff_t n2 = sizeof("operator/=") - 1;
2172 if (r >= n2)
2173 {
2174 *f++ = 'o';
2175 *f++ = 'p';
2176 *f++ = 'e';
2177 *f++ = 'r';
2178 *f++ = 'a';
2179 *f++ = 't';
2180 *f++ = 'o';
2181 *f++ = 'r';
2182 *f++ = '/';
2183 *f = '=';
2184 }
2185 return n2;
2186 }
2187 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2188 {
2189 bool r = true;
2190 if (__left_)
2191 r = r && __left_->fix_forward_references(t_begin, t_end);
2192 if (__right_)
2193 r = r && __right_->fix_forward_references(t_begin, t_end);
2194 return r;
2195 }
2196};
2197
2198class __operator_xor
2199 : public __node
2200{
2201public:
2202
2203 __operator_xor() {}
2204 __operator_xor(__node* op1, __node* op2)
2205 {
2206 __left_ = op1;
2207 __right_ = op2;
2208 }
2209 virtual size_t first_size() const
2210 {
2211 if (__cached_size_ == -1)
2212 {
2213 if (__left_)
2214 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2215 else
2216 const_cast<long&>(__cached_size_) = sizeof("operator^") - 1;
2217 }
2218 return __cached_size_;
2219 }
2220 virtual char* first_demangled_name(char* buf) const
2221 {
2222 if (__left_)
2223 {
2224 *buf++ = '(';
2225 buf = __left_->get_demangled_name(buf);
2226 strncpy(buf, ") ^ (", 5);
2227 buf += 5;
2228 buf = __right_->get_demangled_name(buf);
2229 *buf++ = ')';
2230 }
2231 else
2232 {
2233 strncpy(buf, "operator^", sizeof("operator^") - 1);
2234 buf += sizeof("operator^") - 1;
2235 }
2236 return buf;
2237 }
2238 virtual ptrdiff_t print_first(char* f, char* l) const
2239 {
2240 const ptrdiff_t r = l - f;
2241 if (__left_)
2242 {
2243 const ptrdiff_t n1 = 7;
2244 if (r < n1)
2245 return n1 + __left_->print(l, l) + __right_->print(l, l);
2246 ptrdiff_t sz1 = __left_->print(f+1, l);
2247 if (r < n1 + sz1)
2248 return n1 + sz1 + __right_->print(l, l);
2249 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2250 if (r >= n1 + sz1 + sz2)
2251 {
2252 *f = '(';
2253 f += 1 + sz1;
2254 *f++ = ')';
2255 *f++ = ' ';
2256 *f++ = '^';
2257 *f++ = ' ';
2258 *f = '(';
2259 f += 1 + sz2;
2260 *f = ')';
2261 }
2262 return n1 + sz1 + sz2;
2263 }
2264 const ptrdiff_t n2 = sizeof("operator^") - 1;
2265 if (r >= n2)
2266 {
2267 *f++ = 'o';
2268 *f++ = 'p';
2269 *f++ = 'e';
2270 *f++ = 'r';
2271 *f++ = 'a';
2272 *f++ = 't';
2273 *f++ = 'o';
2274 *f++ = 'r';
2275 *f = '^';
2276 }
2277 return n2;
2278 }
2279 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2280 {
2281 bool r = true;
2282 if (__left_)
2283 r = r && __left_->fix_forward_references(t_begin, t_end);
2284 if (__right_)
2285 r = r && __right_->fix_forward_references(t_begin, t_end);
2286 return r;
2287 }
2288};
2289
2290class __operator_xor_equal
2291 : public __node
2292{
2293public:
2294
2295 __operator_xor_equal() {}
2296 __operator_xor_equal(__node* op1, __node* op2)
2297 {
2298 __left_ = op1;
2299 __right_ = op2;
2300 }
2301 virtual size_t first_size() const
2302 {
2303 if (__cached_size_ == -1)
2304 {
2305 if (__left_)
2306 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2307 else
2308 const_cast<long&>(__cached_size_) = sizeof("operator^=") - 1;
2309 }
2310 return __cached_size_;
2311 }
2312 virtual char* first_demangled_name(char* buf) const
2313 {
2314 if (__left_)
2315 {
2316 *buf++ = '('; // strncpy(buf, "(", 1);
2317 buf = __left_->get_demangled_name(buf);
2318 strncpy(buf, ") ^= (", 6);
2319 buf += 6;
2320 buf = __right_->get_demangled_name(buf);
2321 *buf++ = ')';
2322 }
2323 else
2324 {
2325 strncpy(buf, "operator^=", sizeof("operator^=") - 1);
2326 buf += sizeof("operator^=") - 1;
2327 }
2328 return buf;
2329 }
2330 virtual ptrdiff_t print_first(char* f, char* l) const
2331 {
2332 const ptrdiff_t r = l - f;
2333 if (__left_)
2334 {
2335 const ptrdiff_t n1 = 8;
2336 if (r < n1)
2337 return n1 + __left_->print(l, l) + __right_->print(l, l);
2338 ptrdiff_t sz1 = __left_->print(f+1, l);
2339 if (r < n1 + sz1)
2340 return n1 + sz1 + __right_->print(l, l);
2341 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2342 if (r >= n1 + sz1 + sz2)
2343 {
2344 *f = '(';
2345 f += 1 + sz1;
2346 *f++ = ')';
2347 *f++ = ' ';
2348 *f++ = '^';
2349 *f++ = '=';
2350 *f++ = ' ';
2351 *f = '(';
2352 f += 1 + sz2;
2353 *f = ')';
2354 }
2355 return n1 + sz1 + sz2;
2356 }
2357 const ptrdiff_t n2 = sizeof("operator^=") - 1;
2358 if (r >= n2)
2359 {
2360 *f++ = 'o';
2361 *f++ = 'p';
2362 *f++ = 'e';
2363 *f++ = 'r';
2364 *f++ = 'a';
2365 *f++ = 't';
2366 *f++ = 'o';
2367 *f++ = 'r';
2368 *f++ = '^';
2369 *f = '=';
2370 }
2371 return n2;
2372 }
2373 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2374 {
2375 bool r = true;
2376 if (__left_)
2377 r = r && __left_->fix_forward_references(t_begin, t_end);
2378 if (__right_)
2379 r = r && __right_->fix_forward_references(t_begin, t_end);
2380 return r;
2381 }
2382};
2383
2384class __operator_equality
2385 : public __node
2386{
2387public:
2388
2389 __operator_equality() {}
2390 __operator_equality(__node* op1, __node* op2)
2391 {
2392 __left_ = op1;
2393 __right_ = op2;
2394 }
2395 virtual size_t first_size() const
2396 {
2397 if (__cached_size_ == -1)
2398 {
2399 if (__left_)
2400 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2401 else
2402 const_cast<long&>(__cached_size_) = sizeof("operator==") - 1;
2403 }
2404 return __cached_size_;
2405 }
2406 virtual char* first_demangled_name(char* buf) const
2407 {
2408 if (__left_)
2409 {
2410 *buf++ = '(';
2411 buf = __left_->get_demangled_name(buf);
2412 strncpy(buf, ") == (", 6);
2413 buf += 6;
2414 buf = __right_->get_demangled_name(buf);
2415 *buf++ = ')';
2416 }
2417 else
2418 {
2419 strncpy(buf, "operator==", sizeof("operator==") - 1);
2420 buf += sizeof("operator==") - 1;
2421 }
2422 return buf;
2423 }
2424 virtual ptrdiff_t print_first(char* f, char* l) const
2425 {
2426 const ptrdiff_t r = l - f;
2427 if (__left_)
2428 {
2429 const ptrdiff_t n1 = 8;
2430 if (r < n1)
2431 return n1 + __left_->print(l, l) + __right_->print(l, l);
2432 ptrdiff_t sz1 = __left_->print(f+1, l);
2433 if (r < n1 + sz1)
2434 return n1 + sz1 + __right_->print(l, l);
2435 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2436 if (r >= n1 + sz1 + sz2)
2437 {
2438 *f = '(';
2439 f += 1 + sz1;
2440 *f++ = ')';
2441 *f++ = ' ';
2442 *f++ = '=';
2443 *f++ = '=';
2444 *f++ = ' ';
2445 *f = '(';
2446 f += 1 + sz2;
2447 *f = ')';
2448 }
2449 return n1 + sz1 + sz2;
2450 }
2451 const ptrdiff_t n2 = sizeof("operator==") - 1;
2452 if (r >= n2)
2453 {
2454 *f++ = 'o';
2455 *f++ = 'p';
2456 *f++ = 'e';
2457 *f++ = 'r';
2458 *f++ = 'a';
2459 *f++ = 't';
2460 *f++ = 'o';
2461 *f++ = 'r';
2462 *f++ = '=';
2463 *f = '=';
2464 }
2465 return n2;
2466 }
2467 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2468 {
2469 bool r = true;
2470 if (__left_)
2471 r = r && __left_->fix_forward_references(t_begin, t_end);
2472 if (__right_)
2473 r = r && __right_->fix_forward_references(t_begin, t_end);
2474 return r;
2475 }
2476};
2477
2478class __operator_greater_equal
2479 : public __node
2480{
2481public:
2482
2483 __operator_greater_equal() {}
2484 __operator_greater_equal(__node* op1, __node* op2)
2485 {
2486 __left_ = op1;
2487 __right_ = op2;
2488 }
2489 virtual size_t first_size() const
2490 {
2491 if (__cached_size_ == -1)
2492 {
2493 if (__left_)
2494 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2495 else
2496 const_cast<long&>(__cached_size_) = sizeof("operator>=") - 1;
2497 }
2498 return __cached_size_;
2499 }
2500 virtual char* first_demangled_name(char* buf) const
2501 {
2502 if (__left_)
2503 {
2504 *buf++ = '(';
2505 buf = __left_->get_demangled_name(buf);
2506 strncpy(buf, ") >= (", 6);
2507 buf += 6;
2508 buf = __right_->get_demangled_name(buf);
2509 *buf++ = ')';
2510 }
2511 else
2512 {
2513 strncpy(buf, "operator>=", sizeof("operator>=") - 1);
2514 buf += sizeof("operator>=") - 1;
2515 }
2516 return buf;
2517 }
2518 virtual ptrdiff_t print_first(char* f, char* l) const
2519 {
2520 const ptrdiff_t r = l - f;
2521 if (__left_)
2522 {
2523 const ptrdiff_t n1 = 8;
2524 if (r < n1)
2525 return n1 + __left_->print(l, l) + __right_->print(l, l);
2526 ptrdiff_t sz1 = __left_->print(f+1, l);
2527 if (r < n1 + sz1)
2528 return n1 + sz1 + __right_->print(l, l);
2529 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2530 if (r >= n1 + sz1 + sz2)
2531 {
2532 *f = '(';
2533 f += 1 + sz1;
2534 *f++ = ')';
2535 *f++ = ' ';
2536 *f++ = '>';
2537 *f++ = '=';
2538 *f++ = ' ';
2539 *f = '(';
2540 f += 1 + sz2;
2541 *f = ')';
2542 }
2543 return n1 + sz1 + sz2;
2544 }
2545 const ptrdiff_t n2 = sizeof("operator>=") - 1;
2546 if (r >= n2)
2547 {
2548 *f++ = 'o';
2549 *f++ = 'p';
2550 *f++ = 'e';
2551 *f++ = 'r';
2552 *f++ = 'a';
2553 *f++ = 't';
2554 *f++ = 'o';
2555 *f++ = 'r';
2556 *f++ = '>';
2557 *f = '=';
2558 }
2559 return n2;
2560 }
2561 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2562 {
2563 bool r = true;
2564 if (__left_)
2565 r = r && __left_->fix_forward_references(t_begin, t_end);
2566 if (__right_)
2567 r = r && __right_->fix_forward_references(t_begin, t_end);
2568 return r;
2569 }
2570};
2571
2572class __operator_greater
2573 : public __node
2574{
2575public:
2576
2577 __operator_greater() {}
2578 __operator_greater(__node* op1, __node* op2)
2579 {
2580 __left_ = op1;
2581 __right_ = op2;
2582 }
2583 virtual size_t first_size() const
2584 {
2585 if (__cached_size_ == -1)
2586 {
2587 if (__left_)
2588 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
2589 else
2590 const_cast<long&>(__cached_size_) = sizeof("operator>") - 1;
2591 }
2592 return __cached_size_;
2593 }
2594 virtual char* first_demangled_name(char* buf) const
2595 {
2596 if (__left_)
2597 {
2598 *buf++ = '(';
2599 *buf++ = '(';
2600 buf = __left_->get_demangled_name(buf);
2601 strncpy(buf, ") > (", 5);
2602 buf += 5;
2603 buf = __right_->get_demangled_name(buf);
2604 *buf++ = ')';
2605 *buf++ = ')';
2606 }
2607 else
2608 {
2609 strncpy(buf, "operator>", sizeof("operator>") - 1);
2610 buf += sizeof("operator>") - 1;
2611 }
2612 return buf;
2613 }
2614 virtual ptrdiff_t print_first(char* f, char* l) const
2615 {
2616 const ptrdiff_t r = l - f;
2617 if (__left_)
2618 {
2619 const ptrdiff_t n1 = 9;
2620 if (r < n1)
2621 return n1 + __left_->print(l, l) + __right_->print(l, l);
2622 ptrdiff_t sz1 = __left_->print(f+2, l);
2623 if (r < n1 + sz1)
2624 return n1 + sz1 + __right_->print(l, l);
2625 ptrdiff_t sz2 = __right_->print(f+(n1-2)+sz1, l);
2626 if (r >= n1 + sz1 + sz2)
2627 {
2628 *f++ = '(';
2629 *f = '(';
2630 f += 1 + sz1;
2631 *f++ = ')';
2632 *f++ = ' ';
2633 *f++ = '>';
2634 *f++ = ' ';
2635 *f = '(';
2636 f += 1 + sz2;
2637 *f++ = ')';
2638 *f = ')';
2639 }
2640 return n1 + sz1 + sz2;
2641 }
2642 const ptrdiff_t n2 = sizeof("operator>") - 1;
2643 if (r >= n2)
2644 {
2645 *f++ = 'o';
2646 *f++ = 'p';
2647 *f++ = 'e';
2648 *f++ = 'r';
2649 *f++ = 'a';
2650 *f++ = 't';
2651 *f++ = 'o';
2652 *f++ = 'r';
2653 *f = '>';
2654 }
2655 return n2;
2656 }
2657 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2658 {
2659 bool r = true;
2660 if (__left_)
2661 r = r && __left_->fix_forward_references(t_begin, t_end);
2662 if (__right_)
2663 r = r && __right_->fix_forward_references(t_begin, t_end);
2664 return r;
2665 }
2666};
2667
2668class __operator_brackets
2669 : public __node
2670{
2671public:
2672
2673 virtual size_t first_size() const {return sizeof("operator[]") - 1;}
2674 virtual char* first_demangled_name(char* buf) const
2675 {
2676 strncpy(buf, "operator[]", sizeof("operator[]") - 1);
2677 return buf + sizeof("operator[]") - 1;
2678 }
2679 virtual ptrdiff_t print_first(char* f, char* l) const
2680 {
2681 const ptrdiff_t r = l - f;
2682 const ptrdiff_t n = sizeof("operator[]") - 1;
2683 if (r >= n)
2684 {
2685 *f++ = 'o';
2686 *f++ = 'p';
2687 *f++ = 'e';
2688 *f++ = 'r';
2689 *f++ = 'a';
2690 *f++ = 't';
2691 *f++ = 'o';
2692 *f++ = 'r';
2693 *f++ = '[';
2694 *f = ']';
2695 }
2696 return n;
2697 }
2698};
2699
2700class __operator_less_equal
2701 : public __node
2702{
2703public:
2704
2705 __operator_less_equal() {}
2706 __operator_less_equal(__node* op1, __node* op2)
2707 {
2708 __left_ = op1;
2709 __right_ = op2;
2710 }
2711 virtual size_t first_size() const
2712 {
2713 if (__cached_size_ == -1)
2714 {
2715 if (__left_)
2716 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2717 else
2718 const_cast<long&>(__cached_size_) = sizeof("operator<=") - 1;
2719 }
2720 return __cached_size_;
2721 }
2722 virtual char* first_demangled_name(char* buf) const
2723 {
2724 if (__left_)
2725 {
2726 *buf++ = '(';
2727 buf = __left_->get_demangled_name(buf);
2728 strncpy(buf, ") <= (", 6);
2729 buf += 6;
2730 buf = __right_->get_demangled_name(buf);
2731 *buf++ = ')';
2732 }
2733 else
2734 {
2735 strncpy(buf, "operator<=", sizeof("operator<=") - 1);
2736 buf += sizeof("operator<=") - 1;
2737 }
2738 return buf;
2739 }
2740 virtual ptrdiff_t print_first(char* f, char* l) const
2741 {
2742 const ptrdiff_t r = l - f;
2743 if (__left_)
2744 {
2745 const ptrdiff_t n1 = 8;
2746 if (r < n1)
2747 return n1 + __left_->print(l, l) + __right_->print(l, l);
2748 ptrdiff_t sz1 = __left_->print(f+1, l);
2749 if (r < n1 + sz1)
2750 return n1 + sz1 + __right_->print(l, l);
2751 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2752 if (r >= n1 + sz1 + sz2)
2753 {
2754 *f = '(';
2755 f += 1 + sz1;
2756 *f++ = ')';
2757 *f++ = ' ';
2758 *f++ = '<';
2759 *f++ = '=';
2760 *f++ = ' ';
2761 *f = '(';
2762 f += 1 + sz2;
2763 *f = ')';
2764 }
2765 return n1 + sz1 + sz2;
2766 }
2767 const ptrdiff_t n2 = sizeof("operator<=") - 1;
2768 if (r >= n2)
2769 {
2770 *f++ = 'o';
2771 *f++ = 'p';
2772 *f++ = 'e';
2773 *f++ = 'r';
2774 *f++ = 'a';
2775 *f++ = 't';
2776 *f++ = 'o';
2777 *f++ = 'r';
2778 *f++ = '<';
2779 *f = '=';
2780 }
2781 return n2;
2782 }
2783 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2784 {
2785 bool r = true;
2786 if (__left_)
2787 r = r && __left_->fix_forward_references(t_begin, t_end);
2788 if (__right_)
2789 r = r && __right_->fix_forward_references(t_begin, t_end);
2790 return r;
2791 }
2792};
2793
2794class __operator_less
2795 : public __node
2796{
2797public:
2798
2799 __operator_less() {}
2800 __operator_less(__node* op1, __node* op2)
2801 {
2802 __left_ = op1;
2803 __right_ = op2;
2804 }
2805 virtual size_t first_size() const
2806 {
2807 if (__cached_size_ == -1)
2808 {
2809 if (__left_)
2810 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2811 else
2812 const_cast<long&>(__cached_size_) = sizeof("operator<") - 1;
2813 }
2814 return __cached_size_;
2815 }
2816 virtual char* first_demangled_name(char* buf) const
2817 {
2818 if (__left_)
2819 {
2820 *buf++ = '(';
2821 buf = __left_->get_demangled_name(buf);
2822 strncpy(buf, ") < (", 5);
2823 buf += 5;
2824 buf = __right_->get_demangled_name(buf);
2825 *buf++ = ')';
2826 }
2827 else
2828 {
2829 strncpy(buf, "operator<", sizeof("operator<") - 1);
2830 buf += sizeof("operator<") - 1;
2831 }
2832 return buf;
2833 }
2834 virtual ptrdiff_t print_first(char* f, char* l) const
2835 {
2836 const ptrdiff_t r = l - f;
2837 if (__left_)
2838 {
2839 const ptrdiff_t n1 = 7;
2840 if (r < n1)
2841 return n1 + __left_->print(l, l) + __right_->print(l, l);
2842 ptrdiff_t sz1 = __left_->print(f+1, l);
2843 if (r < n1 + sz1)
2844 return n1 + sz1 + __right_->print(l, l);
2845 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2846 if (r >= n1 + sz1 + sz2)
2847 {
2848 *f = '(';
2849 f += 1 + sz1;
2850 *f++ = ')';
2851 *f++ = ' ';
2852 *f++ = '<';
2853 *f++ = ' ';
2854 *f = '(';
2855 f += 1 + sz2;
2856 *f = ')';
2857 }
2858 return n1 + sz1 + sz2;
2859 }
2860 const ptrdiff_t n2 = sizeof("operator<") - 1;
2861 if (r >= n2)
2862 {
2863 *f++ = 'o';
2864 *f++ = 'p';
2865 *f++ = 'e';
2866 *f++ = 'r';
2867 *f++ = 'a';
2868 *f++ = 't';
2869 *f++ = 'o';
2870 *f++ = 'r';
2871 *f = '<';
2872 }
2873 return n2;
2874 }
2875 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2876 {
2877 bool r = true;
2878 if (__left_)
2879 r = r && __left_->fix_forward_references(t_begin, t_end);
2880 if (__right_)
2881 r = r && __right_->fix_forward_references(t_begin, t_end);
2882 return r;
2883 }
2884};
2885
2886class __operator_left_shift
2887 : public __node
2888{
2889public:
2890
2891 __operator_left_shift() {}
2892 __operator_left_shift(__node* op1, __node* op2)
2893 {
2894 __left_ = op1;
2895 __right_ = op2;
2896 }
2897 virtual size_t first_size() const
2898 {
2899 if (__cached_size_ == -1)
2900 {
2901 if (__left_)
2902 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2903 else
2904 const_cast<long&>(__cached_size_) = sizeof("operator<<") - 1;
2905 }
2906 return __cached_size_;
2907 }
2908 virtual char* first_demangled_name(char* buf) const
2909 {
2910 if (__left_)
2911 {
2912 *buf++ = '(';
2913 buf = __left_->get_demangled_name(buf);
2914 strncpy(buf, ") << (", 6);
2915 buf += 6;
2916 buf = __right_->get_demangled_name(buf);
2917 *buf++ = ')';
2918 }
2919 else
2920 {
2921 strncpy(buf, "operator<<", sizeof("operator<<") - 1);
2922 buf += sizeof("operator<<") - 1;
2923 }
2924 return buf;
2925 }
2926 virtual ptrdiff_t print_first(char* f, char* l) const
2927 {
2928 const ptrdiff_t r = l - f;
2929 if (__left_)
2930 {
2931 const ptrdiff_t n1 = 8;
2932 if (r < n1)
2933 return n1 + __left_->print(l, l) + __right_->print(l, l);
2934 ptrdiff_t sz1 = __left_->print(f+1, l);
2935 if (r < n1 + sz1)
2936 return n1 + sz1 + __right_->print(l, l);
2937 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2938 if (r >= n1 + sz1 + sz2)
2939 {
2940 *f = '(';
2941 f += 1 + sz1;
2942 *f++ = ')';
2943 *f++ = ' ';
2944 *f++ = '<';
2945 *f++ = '<';
2946 *f++ = ' ';
2947 *f = '(';
2948 f += 1 + sz2;
2949 *f = ')';
2950 }
2951 return n1 + sz1 + sz2;
2952 }
2953 const ptrdiff_t n2 = sizeof("operator<<") - 1;
2954 if (r >= n2)
2955 {
2956 *f++ = 'o';
2957 *f++ = 'p';
2958 *f++ = 'e';
2959 *f++ = 'r';
2960 *f++ = 'a';
2961 *f++ = 't';
2962 *f++ = 'o';
2963 *f++ = 'r';
2964 *f++ = '<';
2965 *f = '<';
2966 }
2967 return n2;
2968 }
2969 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2970 {
2971 bool r = true;
2972 if (__left_)
2973 r = r && __left_->fix_forward_references(t_begin, t_end);
2974 if (__right_)
2975 r = r && __right_->fix_forward_references(t_begin, t_end);
2976 return r;
2977 }
2978};
2979
2980class __operator_left_shift_equal
2981 : public __node
2982{
2983public:
2984
2985 __operator_left_shift_equal() {}
2986 __operator_left_shift_equal(__node* op1, __node* op2)
2987 {
2988 __left_ = op1;
2989 __right_ = op2;
2990 }
2991 virtual size_t first_size() const
2992 {
2993 if (__cached_size_ == -1)
2994 {
2995 if (__left_)
2996 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
2997 else
2998 const_cast<long&>(__cached_size_) = sizeof("operator<<=") - 1;
2999 }
3000 return __cached_size_;
3001 }
3002 virtual char* first_demangled_name(char* buf) const
3003 {
3004 if (__left_)
3005 {
3006 *buf++ = '(';
3007 buf = __left_->get_demangled_name(buf);
3008 strncpy(buf, ") <<= (", 7);
3009 buf += 7;
3010 buf = __right_->get_demangled_name(buf);
3011 *buf++ = ')';
3012 }
3013 else
3014 {
3015 strncpy(buf, "operator<<=", sizeof("operator<<=") - 1);
3016 buf += sizeof("operator<<=") - 1;
3017 }
3018 return buf;
3019 }
3020 virtual ptrdiff_t print_first(char* f, char* l) const
3021 {
3022 const ptrdiff_t r = l - f;
3023 if (__left_)
3024 {
3025 const ptrdiff_t n1 = 9;
3026 if (r < n1)
3027 return n1 + __left_->print(l, l) + __right_->print(l, l);
3028 ptrdiff_t sz1 = __left_->print(f+1, l);
3029 if (r < n1 + sz1)
3030 return n1 + sz1 + __right_->print(l, l);
3031 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3032 if (r >= n1 + sz1 + sz2)
3033 {
3034 *f = '(';
3035 f += 1 + sz1;
3036 *f++ = ')';
3037 *f++ = ' ';
3038 *f++ = '<';
3039 *f++ = '<';
3040 *f++ = '=';
3041 *f++ = ' ';
3042 *f = '(';
3043 f += 1 + sz2;
3044 *f = ')';
3045 }
3046 return n1 + sz1 + sz2;
3047 }
3048 const ptrdiff_t n2 = sizeof("operator<<=") - 1;
3049 if (r >= n2)
3050 {
3051 *f++ = 'o';
3052 *f++ = 'p';
3053 *f++ = 'e';
3054 *f++ = 'r';
3055 *f++ = 'a';
3056 *f++ = 't';
3057 *f++ = 'o';
3058 *f++ = 'r';
3059 *f++ = '<';
3060 *f++ = '<';
3061 *f = '=';
3062 }
3063 return n2;
3064 }
3065 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3066 {
3067 bool r = true;
3068 if (__left_)
3069 r = r && __left_->fix_forward_references(t_begin, t_end);
3070 if (__right_)
3071 r = r && __right_->fix_forward_references(t_begin, t_end);
3072 return r;
3073 }
3074};
3075
3076class __operator_minus
3077 : public __node
3078{
3079public:
3080
3081 __operator_minus() {}
3082 __operator_minus(__node* op1, __node* op2)
3083 {
3084 __left_ = op1;
3085 __right_ = op2;
3086 }
3087 virtual size_t first_size() const
3088 {
3089 if (__cached_size_ == -1)
3090 {
3091 if (__left_)
3092 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
3093 else
3094 const_cast<long&>(__cached_size_) = sizeof("operator-") - 1;
3095 }
3096 return __cached_size_;
3097 }
3098 virtual char* first_demangled_name(char* buf) const
3099 {
3100 if (__left_)
3101 {
3102 *buf++ = '(';
3103 buf = __left_->get_demangled_name(buf);
3104 strncpy(buf, ") - (", 5);
3105 buf += 5;
3106 buf = __right_->get_demangled_name(buf);
3107 *buf++ = ')';
3108 }
3109 else
3110 {
3111 strncpy(buf, "operator-", sizeof("operator-") - 1);
3112 buf += sizeof("operator-") - 1;
3113 }
3114 return buf;
3115 }
3116 virtual ptrdiff_t print_first(char* f, char* l) const
3117 {
3118 const ptrdiff_t r = l - f;
3119 if (__left_)
3120 {
3121 const ptrdiff_t n1 = 7;
3122 if (r < n1)
3123 return n1 + __left_->print(l, l) + __right_->print(l, l);
3124 ptrdiff_t sz1 = __left_->print(f+1, l);
3125 if (r < n1 + sz1)
3126 return n1 + sz1 + __right_->print(l, l);
3127 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3128 if (r >= n1 + sz1 + sz2)
3129 {
3130 *f = '(';
3131 f += 1 + sz1;
3132 *f++ = ')';
3133 *f++ = ' ';
3134 *f++ = '-';
3135 *f++ = ' ';
3136 *f = '(';
3137 f += 1 + sz2;
3138 *f = ')';
3139 }
3140 return n1 + sz1 + sz2;
3141 }
3142 const ptrdiff_t n2 = sizeof("operator-") - 1;
3143 if (r >= n2)
3144 {
3145 *f++ = 'o';
3146 *f++ = 'p';
3147 *f++ = 'e';
3148 *f++ = 'r';
3149 *f++ = 'a';
3150 *f++ = 't';
3151 *f++ = 'o';
3152 *f++ = 'r';
3153 *f = '-';
3154 }
3155 return n2;
3156 }
3157 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3158 {
3159 bool r = true;
3160 if (__left_)
3161 r = r && __left_->fix_forward_references(t_begin, t_end);
3162 if (__right_)
3163 r = r && __right_->fix_forward_references(t_begin, t_end);
3164 return r;
3165 }
3166};
3167
3168class __operator_minus_equal
3169 : public __node
3170{
3171public:
3172
3173 __operator_minus_equal() {}
3174 __operator_minus_equal(__node* op1, __node* op2)
3175 {
3176 __left_ = op1;
3177 __right_ = op2;
3178 }
3179 virtual size_t first_size() const
3180 {
3181 if (__cached_size_ == -1)
3182 {
3183 if (__left_)
3184 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3185 else
3186 const_cast<long&>(__cached_size_) = sizeof("operator-=") - 1;
3187 }
3188 return __cached_size_;
3189 }
3190 virtual char* first_demangled_name(char* buf) const
3191 {
3192 if (__left_)
3193 {
3194 *buf++ = '(';
3195 buf = __left_->get_demangled_name(buf);
3196 strncpy(buf, ") -= (", 6);
3197 buf += 6;
3198 buf = __right_->get_demangled_name(buf);
3199 *buf++ = ')';
3200 }
3201 else
3202 {
3203 strncpy(buf, "operator-=", sizeof("operator-=") - 1);
3204 buf += sizeof("operator-=") - 1;
3205 }
3206 return buf;
3207 }
3208 virtual ptrdiff_t print_first(char* f, char* l) const
3209 {
3210 const ptrdiff_t r = l - f;
3211 if (__left_)
3212 {
3213 const ptrdiff_t n1 = 8;
3214 if (r < n1)
3215 return n1 + __left_->print(l, l) + __right_->print(l, l);
3216 ptrdiff_t sz1 = __left_->print(f+1, l);
3217 if (r < n1 + sz1)
3218 return n1 + sz1 + __right_->print(l, l);
3219 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3220 if (r >= n1 + sz1 + sz2)
3221 {
3222 *f = '(';
3223 f += 1 + sz1;
3224 *f++ = ')';
3225 *f++ = ' ';
3226 *f++ = '-';
3227 *f++ = '=';
3228 *f++ = ' ';
3229 *f = '(';
3230 f += 1 + sz2;
3231 *f = ')';
3232 }
3233 return n1 + sz1 + sz2;
3234 }
3235 const ptrdiff_t n2 = sizeof("operator-=") - 1;
3236 if (r >= n2)
3237 {
3238 *f++ = 'o';
3239 *f++ = 'p';
3240 *f++ = 'e';
3241 *f++ = 'r';
3242 *f++ = 'a';
3243 *f++ = 't';
3244 *f++ = 'o';
3245 *f++ = 'r';
3246 *f++ = '-';
3247 *f = '=';
3248 }
3249 return n2;
3250 }
3251 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3252 {
3253 bool r = true;
3254 if (__left_)
3255 r = r && __left_->fix_forward_references(t_begin, t_end);
3256 if (__right_)
3257 r = r && __right_->fix_forward_references(t_begin, t_end);
3258 return r;
3259 }
3260};
3261
3262class __operator_times
3263 : public __node
3264{
3265public:
3266
3267 __operator_times() {}
3268 __operator_times(__node* op1, __node* op2)
3269 {
3270 __left_ = op1;
3271 __right_ = op2;
3272 }
3273 virtual size_t first_size() const
3274 {
3275 if (__cached_size_ == -1)
3276 {
3277 if (__left_)
3278 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
3279 else
3280 const_cast<long&>(__cached_size_) = sizeof("operator*") - 1;
3281 }
3282 return __cached_size_;
3283 }
3284 virtual char* first_demangled_name(char* buf) const
3285 {
3286 if (__left_)
3287 {
3288 *buf++ = '(';
3289 buf = __left_->get_demangled_name(buf);
3290 strncpy(buf, ") * (", 5);
3291 buf += 5;
3292 buf = __right_->get_demangled_name(buf);
3293 *buf++ = ')';
3294 }
3295 else
3296 {
3297 strncpy(buf, "operator*", sizeof("operator*") - 1);
3298 buf += sizeof("operator*") - 1;
3299 }
3300 return buf;
3301 }
3302 virtual ptrdiff_t print_first(char* f, char* l) const
3303 {
3304 const ptrdiff_t r = l - f;
3305 if (__left_)
3306 {
3307 const ptrdiff_t n1 = 7;
3308 if (r < n1)
3309 return n1 + __left_->print(l, l) + __right_->print(l, l);
3310 ptrdiff_t sz1 = __left_->print(f+1, l);
3311 if (r < n1 + sz1)
3312 return n1 + sz1 + __right_->print(l, l);
3313 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3314 if (r >= n1 + sz1 + sz2)
3315 {
3316 *f = '(';
3317 f += 1 + sz1;
3318 *f++ = ')';
3319 *f++ = ' ';
3320 *f++ = '*';
3321 *f++ = ' ';
3322 *f = '(';
3323 f += 1 + sz2;
3324 *f = ')';
3325 }
3326 return n1 + sz1 + sz2;
3327 }
3328 const ptrdiff_t n2 = sizeof("operator*") - 1;
3329 if (r >= n2)
3330 {
3331 *f++ = 'o';
3332 *f++ = 'p';
3333 *f++ = 'e';
3334 *f++ = 'r';
3335 *f++ = 'a';
3336 *f++ = 't';
3337 *f++ = 'o';
3338 *f++ = 'r';
3339 *f = '*';
3340 }
3341 return n2;
3342 }
3343 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3344 {
3345 bool r = true;
3346 if (__left_)
3347 r = r && __left_->fix_forward_references(t_begin, t_end);
3348 if (__right_)
3349 r = r && __right_->fix_forward_references(t_begin, t_end);
3350 return r;
3351 }
3352};
3353
3354class __operator_times_equal
3355 : public __node
3356{
3357public:
3358
3359 __operator_times_equal() {}
3360 __operator_times_equal(__node* op1, __node* op2)
3361 {
3362 __left_ = op1;
3363 __right_ = op2;
3364 }
3365 virtual size_t first_size() const
3366 {
3367 if (__cached_size_ == -1)
3368 {
3369 if (__left_)
3370 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3371 else
3372 const_cast<long&>(__cached_size_) = sizeof("operator*=") - 1;
3373 }
3374 return __cached_size_;
3375 }
3376 virtual char* first_demangled_name(char* buf) const
3377 {
3378 if (__left_)
3379 {
3380 *buf++ = '(';
3381 buf = __left_->get_demangled_name(buf);
3382 strncpy(buf, ") *= (", 6);
3383 buf += 6;
3384 buf = __right_->get_demangled_name(buf);
3385 *buf++ = ')';
3386 }
3387 else
3388 {
3389 strncpy(buf, "operator*=", sizeof("operator*=") - 1);
3390 buf += sizeof("operator*=") - 1;
3391 }
3392 return buf;
3393 }
3394 virtual ptrdiff_t print_first(char* f, char* l) const
3395 {
3396 const ptrdiff_t r = l - f;
3397 if (__left_)
3398 {
3399 const ptrdiff_t n1 = 8;
3400 if (r < n1)
3401 return n1 + __left_->print(l, l) + __right_->print(l, l);
3402 ptrdiff_t sz1 = __left_->print(f+1, l);
3403 if (r < n1 + sz1)
3404 return n1 + sz1 + __right_->print(l, l);
3405 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3406 if (r >= n1 + sz1 + sz2)
3407 {
3408 *f = '(';
3409 f += 1 + sz1;
3410 *f++ = ')';
3411 *f++ = ' ';
3412 *f++ = '*';
3413 *f++ = '=';
3414 *f++ = ' ';
3415 *f = '(';
3416 f += 1 + sz2;
3417 *f = ')';
3418 }
3419 return n1 + sz1 + sz2;
3420 }
3421 const ptrdiff_t n2 = sizeof("operator*=") - 1;
3422 if (r >= n2)
3423 {
3424 *f++ = 'o';
3425 *f++ = 'p';
3426 *f++ = 'e';
3427 *f++ = 'r';
3428 *f++ = 'a';
3429 *f++ = 't';
3430 *f++ = 'o';
3431 *f++ = 'r';
3432 *f++ = '*';
3433 *f = '=';
3434 }
3435 return n2;
3436 }
3437 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3438 {
3439 bool r = true;
3440 if (__left_)
3441 r = r && __left_->fix_forward_references(t_begin, t_end);
3442 if (__right_)
3443 r = r && __right_->fix_forward_references(t_begin, t_end);
3444 return r;
3445 }
3446};
3447
3448class __operator_decrement
3449 : public __node
3450{
3451public:
3452
3453 __operator_decrement() {}
3454 explicit __operator_decrement(bool prefix, __node* op)
3455 {
3456 __size_ = prefix;
3457 __left_ = op;
3458 }
3459 virtual size_t first_size() const
3460 {
3461 if (__cached_size_ == -1)
3462 {
3463 if (__left_)
3464 const_cast<long&>(__cached_size_) = 4+__left_->size();
3465 else
3466 const_cast<long&>(__cached_size_) = sizeof("operator--") - 1;
3467 }
3468 return __cached_size_;
3469 }
3470 virtual char* first_demangled_name(char* buf) const
3471 {
3472 if (__left_)
3473 {
3474 if (__size_)
3475 {
3476 *buf++ = '-';
3477 *buf++ = '-';
3478 *buf++ = '(';
3479 }
3480 else
3481 *buf++ = '(';
3482 buf = __left_->get_demangled_name(buf);
3483 if (__size_)
3484 *buf++ = ')';
3485 else
3486 {
3487 *buf++ = ')';
3488 *buf++ = '-';
3489 *buf++ = '-';
3490 }
3491 }
3492 else
3493 {
3494 strncpy(buf, "operator--", sizeof("operator--") - 1);
3495 buf += sizeof("operator--") - 1;
3496 }
3497 return buf;
3498 }
3499 virtual ptrdiff_t print_first(char* f, char* l) const
3500 {
3501 const ptrdiff_t r = l - f;
3502 if (__left_)
3503 {
3504 const ptrdiff_t n1 = 4;
3505 if (r < n1)
3506 return n1 + __left_->print(l, l);
3507 ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l);
3508 if (r >= n1 + sz1)
3509 {
3510 if (__size_)
3511 {
3512 *f++ = '-';
3513 *f++ = '-';
3514 *f = '(';
3515 f += 1+sz1;
3516 *f = ')';
3517 }
3518 else
3519 {
3520 *f = '(';
3521 f += 1+sz1;
3522 *f++ = ')';
3523 *f++ = '-';
3524 *f = '-';
3525 }
3526 }
3527 return n1 + sz1;
3528 }
3529 const ptrdiff_t n2 = sizeof("operator--") - 1;
3530 if (r >= n2)
3531 {
3532 *f++ = 'o';
3533 *f++ = 'p';
3534 *f++ = 'e';
3535 *f++ = 'r';
3536 *f++ = 'a';
3537 *f++ = 't';
3538 *f++ = 'o';
3539 *f++ = 'r';
3540 *f++ = '-';
3541 *f = '-';
3542 }
3543 return n2;
3544 }
3545 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3546 {
3547 if (__left_)
3548 return __left_->fix_forward_references(t_begin, t_end);
3549 return true;
3550 }
3551};
3552
3553class __operator_not_equal
3554 : public __node
3555{
3556public:
3557
3558 __operator_not_equal() {}
3559 __operator_not_equal(__node* op1, __node* op2)
3560 {
3561 __left_ = op1;
3562 __right_ = op2;
3563 }
3564 virtual size_t first_size() const
3565 {
3566 if (__cached_size_ == -1)
3567 {
3568 if (__left_)
3569 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3570 else
3571 const_cast<long&>(__cached_size_) = sizeof("operator!=") - 1;
3572 }
3573 return __cached_size_;
3574 }
3575 virtual char* first_demangled_name(char* buf) const
3576 {
3577 if (__left_)
3578 {
3579 *buf++ = '(';
3580 buf = __left_->get_demangled_name(buf);
3581 strncpy(buf, ") != (", 6);
3582 buf += 6;
3583 buf = __right_->get_demangled_name(buf);
3584 *buf++ = ')';
3585 }
3586 else
3587 {
3588 strncpy(buf, "operator!=", sizeof("operator!=") - 1);
3589 buf += sizeof("operator!=") - 1;
3590 }
3591 return buf;
3592 }
3593 virtual ptrdiff_t print_first(char* f, char* l) const
3594 {
3595 const ptrdiff_t r = l - f;
3596 if (__left_)
3597 {
3598 const ptrdiff_t n1 = 8;
3599 if (r < n1)
3600 return n1 + __left_->print(l, l) + __right_->print(l, l);
3601 ptrdiff_t sz1 = __left_->print(f+1, l);
3602 if (r < n1 + sz1)
3603 return n1 + sz1 + __right_->print(l, l);
3604 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3605 if (r >= n1 + sz1 + sz2)
3606 {
3607 *f = '(';
3608 f += 1 + sz1;
3609 *f++ = ')';
3610 *f++ = ' ';
3611 *f++ = '!';
3612 *f++ = '=';
3613 *f++ = ' ';
3614 *f = '(';
3615 f += 1 + sz2;
3616 *f = ')';
3617 }
3618 return n1 + sz1 + sz2;
3619 }
3620 const ptrdiff_t n2 = sizeof("operator!=") - 1;
3621 if (r >= n2)
3622 {
3623 *f++ = 'o';
3624 *f++ = 'p';
3625 *f++ = 'e';
3626 *f++ = 'r';
3627 *f++ = 'a';
3628 *f++ = 't';
3629 *f++ = 'o';
3630 *f++ = 'r';
3631 *f++ = '!';
3632 *f = '=';
3633 }
3634 return n2;
3635 }
3636 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3637 {
3638 bool r = true;
3639 if (__left_)
3640 r = r && __left_->fix_forward_references(t_begin, t_end);
3641 if (__right_)
3642 r = r && __right_->fix_forward_references(t_begin, t_end);
3643 return r;
3644 }
3645};
3646
3647class __operator_negate
3648 : public __node
3649{
3650public:
3651
3652 __operator_negate() {}
3653 explicit __operator_negate(__node* op)
3654 {
3655 __left_ = op;
3656 }
3657 virtual size_t first_size() const
3658 {
3659 if (__cached_size_ == -1)
3660 {
3661 if (__left_)
3662 const_cast<long&>(__cached_size_) = 3+__left_->size();
3663 else
3664 const_cast<long&>(__cached_size_) = sizeof("operator-") - 1;
3665 }
3666 return __cached_size_;
3667 }
3668 virtual char* first_demangled_name(char* buf) const
3669 {
3670 if (__left_)
3671 {
3672 *buf++ = '-';
3673 *buf++ = '(';
3674 buf = __left_->get_demangled_name(buf);
3675 *buf++ = ')';
3676 }
3677 else
3678 {
3679 strncpy(buf, "operator-", sizeof("operator-") - 1);
3680 buf += sizeof("operator-") - 1;
3681 }
3682 return buf;
3683 }
3684 virtual ptrdiff_t print_first(char* f, char* l) const
3685 {
3686 const ptrdiff_t r = l - f;
3687 if (__left_)
3688 {
3689 const ptrdiff_t n1 = 3;
3690 if (r < n1)
3691 return n1 + __left_->print(l, l);
3692 ptrdiff_t sz1 = __left_->print(f+2, l);
3693 if (r >= n1 + sz1)
3694 {
3695 *f++ = '-';
3696 *f = '(';
3697 f += 1 + sz1;
3698 *f = ')';
3699 }
3700 return n1 + sz1;
3701 }
3702 const ptrdiff_t n2 = sizeof("operator-") - 1;
3703 if (r >= n2)
3704 {
3705 *f++ = 'o';
3706 *f++ = 'p';
3707 *f++ = 'e';
3708 *f++ = 'r';
3709 *f++ = 'a';
3710 *f++ = 't';
3711 *f++ = 'o';
3712 *f++ = 'r';
3713 *f = '-';
3714 }
3715 return n2;
3716 }
3717 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3718 {
3719 if (__left_)
3720 return __left_->fix_forward_references(t_begin, t_end);
3721 return true;
3722 }
3723};
3724
3725class __operator_logical_not
3726 : public __node
3727{
3728public:
3729
3730 __operator_logical_not() {}
3731 explicit __operator_logical_not(__node* op)
3732 {
3733 __left_ = op;
3734 }
3735 virtual size_t first_size() const
3736 {
3737 if (__cached_size_ == -1)
3738 {
3739 if (__left_)
3740 const_cast<long&>(__cached_size_) = 3+__left_->size();
3741 else
3742 const_cast<long&>(__cached_size_) = sizeof("operator!") - 1;
3743 }
3744 return __cached_size_;
3745 }
3746 virtual char* first_demangled_name(char* buf) const
3747 {
3748 if (__left_)
3749 {
3750 *buf++ = '!';
3751 *buf++ = '(';
3752 buf = __left_->get_demangled_name(buf);
3753 *buf++ = ')';
3754 }
3755 else
3756 {
3757 strncpy(buf, "operator!", sizeof("operator!") - 1);
3758 buf += sizeof("operator!") - 1;
3759 }
3760 return buf;
3761 }
3762 virtual ptrdiff_t print_first(char* f, char* l) const
3763 {
3764 const ptrdiff_t r = l - f;
3765 if (__left_)
3766 {
3767 const ptrdiff_t n1 = 3;
3768 if (r < n1)
3769 return n1 + __left_->print(l, l);
3770 ptrdiff_t sz1 = __left_->print(f+2, l);
3771 if (r >= n1 + sz1)
3772 {
3773 *f++ = '!';
3774 *f = '(';
3775 f += 1 + sz1;
3776 *f = ')';
3777 }
3778 return n1 + sz1;
3779 }
3780 const ptrdiff_t n2 = sizeof("operator!") - 1;
3781 if (r >= n2)
3782 {
3783 *f++ = 'o';
3784 *f++ = 'p';
3785 *f++ = 'e';
3786 *f++ = 'r';
3787 *f++ = 'a';
3788 *f++ = 't';
3789 *f++ = 'o';
3790 *f++ = 'r';
3791 *f = '!';
3792 }
3793 return n2;
3794 }
3795 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3796 {
3797 if (__left_)
3798 return __left_->fix_forward_references(t_begin, t_end);
3799 return true;
3800 }
3801};
3802
3803class __operator_logical_or
3804 : public __node
3805{
3806public:
3807
3808 __operator_logical_or() {}
3809 __operator_logical_or(__node* op1, __node* op2)
3810 {
3811 __left_ = op1;
3812 __right_ = op2;
3813 }
3814 virtual size_t first_size() const
3815 {
3816 if (__cached_size_ == -1)
3817 {
3818 if (__left_)
3819 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3820 else
3821 const_cast<long&>(__cached_size_) = sizeof("operator||") - 1;
3822 }
3823 return __cached_size_;
3824 }
3825 virtual char* first_demangled_name(char* buf) const
3826 {
3827 if (__left_)
3828 {
3829 *buf++ = '(';
3830 buf = __left_->get_demangled_name(buf);
3831 strncpy(buf, ") || (", 6);
3832 buf += 6;
3833 buf = __right_->get_demangled_name(buf);
3834 *buf++ = ')';
3835 }
3836 else
3837 {
3838 strncpy(buf, "operator||", sizeof("operator||") - 1);
3839 buf += sizeof("operator||") - 1;
3840 }
3841 return buf;
3842 }
3843 virtual ptrdiff_t print_first(char* f, char* l) const
3844 {
3845 const ptrdiff_t r = l - f;
3846 if (__left_)
3847 {
3848 const ptrdiff_t n1 = 8;
3849 if (r < n1)
3850 return n1 + __left_->print(l, l) + __right_->print(l, l);
3851 ptrdiff_t sz1 = __left_->print(f+1, l);
3852 if (r < n1 + sz1)
3853 return n1 + sz1 + __right_->print(l, l);
3854 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3855 if (r >= n1 + sz1 + sz2)
3856 {
3857 *f = '(';
3858 f += 1 + sz1;
3859 *f++ = ')';
3860 *f++ = ' ';
3861 *f++ = '|';
3862 *f++ = '|';
3863 *f++ = ' ';
3864 *f = '(';
3865 f += 1 + sz2;
3866 *f = ')';
3867 }
3868 return n1 + sz1 + sz2;
3869 }
3870 const ptrdiff_t n2 = sizeof("operator||") - 1;
3871 if (r >= n2)
3872 {
3873 *f++ = 'o';
3874 *f++ = 'p';
3875 *f++ = 'e';
3876 *f++ = 'r';
3877 *f++ = 'a';
3878 *f++ = 't';
3879 *f++ = 'o';
3880 *f++ = 'r';
3881 *f++ = '|';
3882 *f = '|';
3883 }
3884 return n2;
3885 }
3886 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3887 {
3888 bool r = true;
3889 if (__left_)
3890 r = r && __left_->fix_forward_references(t_begin, t_end);
3891 if (__right_)
3892 r = r && __right_->fix_forward_references(t_begin, t_end);
3893 return r;
3894 }
3895};
3896
3897class __operator_bit_or
3898 : public __node
3899{
3900public:
3901
3902 __operator_bit_or() {}
3903 __operator_bit_or(__node* op1, __node* op2)
3904 {
3905 __left_ = op1;
3906 __right_ = op2;
3907 }
3908 virtual size_t first_size() const
3909 {
3910 if (__cached_size_ == -1)
3911 {
3912 if (__left_)
3913 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
3914 else
3915 const_cast<long&>(__cached_size_) = sizeof("operator|") - 1;
3916 }
3917 return __cached_size_;
3918 }
3919 virtual char* first_demangled_name(char* buf) const
3920 {
3921 if (__left_)
3922 {
3923 *buf++ = '(';
3924 buf = __left_->get_demangled_name(buf);
3925 strncpy(buf, ") | (", 5);
3926 buf += 5;
3927 buf = __right_->get_demangled_name(buf);
3928 *buf++ = ')';
3929 }
3930 else
3931 {
3932 strncpy(buf, "operator|", sizeof("operator|") - 1);
3933 buf += sizeof("operator|") - 1;
3934 }
3935 return buf;
3936 }
3937 virtual ptrdiff_t print_first(char* f, char* l) const
3938 {
3939 const ptrdiff_t r = l - f;
3940 if (__left_)
3941 {
3942 const ptrdiff_t n1 = 7;
3943 if (r < n1)
3944 return n1 + __left_->print(l, l) + __right_->print(l, l);
3945 ptrdiff_t sz1 = __left_->print(f+1, l);
3946 if (r < n1 + sz1)
3947 return n1 + sz1 + __right_->print(l, l);
3948 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3949 if (r >= n1 + sz1 + sz2)
3950 {
3951 *f = '(';
3952 f += 1 + sz1;
3953 *f++ = ')';
3954 *f++ = ' ';
3955 *f++ = '|';
3956 *f++ = ' ';
3957 *f = '(';
3958 f += 1 + sz2;
3959 *f = ')';
3960 }
3961 return n1 + sz1 + sz2;
3962 }
3963 const ptrdiff_t n2 = sizeof("operator|") - 1;
3964 if (r >= n2)
3965 {
3966 *f++ = 'o';
3967 *f++ = 'p';
3968 *f++ = 'e';
3969 *f++ = 'r';
3970 *f++ = 'a';
3971 *f++ = 't';
3972 *f++ = 'o';
3973 *f++ = 'r';
3974 *f = '|';
3975 }
3976 return n2;
3977 }
3978 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3979 {
3980 bool r = true;
3981 if (__left_)
3982 r = r && __left_->fix_forward_references(t_begin, t_end);
3983 if (__right_)
3984 r = r && __right_->fix_forward_references(t_begin, t_end);
3985 return r;
3986 }
3987};
3988
3989class __operator_or_equal
3990 : public __node
3991{
3992public:
3993
3994 __operator_or_equal() {}
3995 __operator_or_equal(__node* op1, __node* op2)
3996 {
3997 __left_ = op1;
3998 __right_ = op2;
3999 }
4000 virtual size_t first_size() const
4001 {
4002 if (__cached_size_ == -1)
4003 {
4004 if (__left_)
4005 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4006 else
4007 const_cast<long&>(__cached_size_) = sizeof("operator|=") - 1;
4008 }
4009 return __cached_size_;
4010 }
4011 virtual char* first_demangled_name(char* buf) const
4012 {
4013 if (__left_)
4014 {
4015 *buf++ = '(';
4016 buf = __left_->get_demangled_name(buf);
4017 strncpy(buf, ") |= (", 6);
4018 buf += 6;
4019 buf = __right_->get_demangled_name(buf);
4020 *buf++ = ')';
4021 }
4022 else
4023 {
4024 strncpy(buf, "operator|=", sizeof("operator|=") - 1);
4025 buf += sizeof("operator|=") - 1;
4026 }
4027 return buf;
4028 }
4029 virtual ptrdiff_t print_first(char* f, char* l) const
4030 {
4031 const ptrdiff_t r = l - f;
4032 if (__left_)
4033 {
4034 const ptrdiff_t n1 = 8;
4035 if (r < n1)
4036 return n1 + __left_->print(l, l) + __right_->print(l, l);
4037 ptrdiff_t sz1 = __left_->print(f+1, l);
4038 if (r < n1 + sz1)
4039 return n1 + sz1 + __right_->print(l, l);
4040 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4041 if (r >= n1 + sz1 + sz2)
4042 {
4043 *f = '(';
4044 f += 1 + sz1;
4045 *f++ = ')';
4046 *f++ = ' ';
4047 *f++ = '|';
4048 *f++ = '=';
4049 *f++ = ' ';
4050 *f = '(';
4051 f += 1 + sz2;
4052 *f = ')';
4053 }
4054 return n1 + sz1 + sz2;
4055 }
4056 const ptrdiff_t n2 = sizeof("operator|=") - 1;
4057 if (r >= n2)
4058 {
4059 *f++ = 'o';
4060 *f++ = 'p';
4061 *f++ = 'e';
4062 *f++ = 'r';
4063 *f++ = 'a';
4064 *f++ = 't';
4065 *f++ = 'o';
4066 *f++ = 'r';
4067 *f++ = '|';
4068 *f = '=';
4069 }
4070 return n2;
4071 }
4072 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4073 {
4074 bool r = true;
4075 if (__left_)
4076 r = r && __left_->fix_forward_references(t_begin, t_end);
4077 if (__right_)
4078 r = r && __right_->fix_forward_references(t_begin, t_end);
4079 return r;
4080 }
4081};
4082
4083class __operator_pointer_to_member
4084 : public __node
4085{
4086public:
4087
4088 __operator_pointer_to_member() {}
4089 __operator_pointer_to_member(__node* op1, __node* op2)
4090 {
4091 __left_ = op1;
4092 __right_ = op2;
4093 }
4094 virtual size_t first_size() const
4095 {
4096 if (__cached_size_ == -1)
4097 {
4098 if (__left_)
4099 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
4100 else
4101 const_cast<long&>(__cached_size_) = sizeof("operator->*") - 1;
4102 }
4103 return __cached_size_;
4104 }
4105 virtual char* first_demangled_name(char* buf) const
4106 {
4107 if (__left_)
4108 {
4109 *buf++ = '(';
4110 buf = __left_->get_demangled_name(buf);
4111 strncpy(buf, ") ->* (", 7);
4112 buf += 7;
4113 buf = __right_->get_demangled_name(buf);
4114 *buf++ = ')';
4115 }
4116 else
4117 {
4118 strncpy(buf, "operator->*", sizeof("operator->*") - 1);
4119 buf += sizeof("operator->*") - 1;
4120 }
4121 return buf;
4122 }
4123 virtual ptrdiff_t print_first(char* f, char* l) const
4124 {
4125 const ptrdiff_t r = l - f;
4126 if (__left_)
4127 {
4128 const ptrdiff_t n1 = 9;
4129 if (r < n1)
4130 return n1 + __left_->print(l, l) + __right_->print(l, l);
4131 ptrdiff_t sz1 = __left_->print(f+1, l);
4132 if (r < n1 + sz1)
4133 return n1 + sz1 + __right_->print(l, l);
4134 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4135 if (r >= n1 + sz1 + sz2)
4136 {
4137 *f = '(';
4138 f += 1 + sz1;
4139 *f++ = ')';
4140 *f++ = ' ';
4141 *f++ = '-';
4142 *f++ = '>';
4143 *f++ = '*';
4144 *f++ = ' ';
4145 *f = '(';
4146 f += 1 + sz2;
4147 *f = ')';
4148 }
4149 return n1 + sz1 + sz2;
4150 }
4151 const ptrdiff_t n2 = sizeof("operator->*") - 1;
4152 if (r >= n2)
4153 {
4154 *f++ = 'o';
4155 *f++ = 'p';
4156 *f++ = 'e';
4157 *f++ = 'r';
4158 *f++ = 'a';
4159 *f++ = 't';
4160 *f++ = 'o';
4161 *f++ = 'r';
4162 *f++ = '-';
4163 *f++ = '>';
4164 *f = '*';
4165 }
4166 return n2;
4167 }
4168 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4169 {
4170 bool r = true;
4171 if (__left_)
4172 r = r && __left_->fix_forward_references(t_begin, t_end);
4173 if (__right_)
4174 r = r && __right_->fix_forward_references(t_begin, t_end);
4175 return r;
4176 }
4177};
4178
4179class __operator_plus
4180 : public __node
4181{
4182public:
4183
4184 __operator_plus() {}
4185 __operator_plus(__node* op1, __node* op2)
4186 {
4187 __left_ = op1;
4188 __right_ = op2;
4189 }
4190 virtual size_t first_size() const
4191 {
4192 if (__cached_size_ == -1)
4193 {
4194 if (__left_)
4195 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
4196 else
4197 const_cast<long&>(__cached_size_) = sizeof("operator+") - 1;
4198 }
4199 return __cached_size_;
4200 }
4201 virtual char* first_demangled_name(char* buf) const
4202 {
4203 if (__left_)
4204 {
4205 *buf++ = '(';
4206 buf = __left_->get_demangled_name(buf);
4207 strncpy(buf, ") + (", 5);
4208 buf += 5;
4209 buf = __right_->get_demangled_name(buf);
4210 *buf++ = ')';
4211 }
4212 else
4213 {
4214 strncpy(buf, "operator+", sizeof("operator+") - 1);
4215 buf += sizeof("operator+") - 1;
4216 }
4217 return buf;
4218 }
4219 virtual ptrdiff_t print_first(char* f, char* l) const
4220 {
4221 const ptrdiff_t r = l - f;
4222 if (__left_)
4223 {
4224 const ptrdiff_t n1 = 7;
4225 if (r < n1)
4226 return n1 + __left_->print(l, l) + __right_->print(l, l);
4227 ptrdiff_t sz1 = __left_->print(f+1, l);
4228 if (r < n1 + sz1)
4229 return n1 + sz1 + __right_->print(l, l);
4230 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4231 if (r >= n1 + sz1 + sz2)
4232 {
4233 *f = '(';
4234 f += 1 + sz1;
4235 *f++ = ')';
4236 *f++ = ' ';
4237 *f++ = '+';
4238 *f++ = ' ';
4239 *f = '(';
4240 f += 1 + sz2;
4241 *f = ')';
4242 }
4243 return n1 + sz1 + sz2;
4244 }
4245 const ptrdiff_t n2 = sizeof("operator+") - 1;
4246 if (r >= n2)
4247 {
4248 *f++ = 'o';
4249 *f++ = 'p';
4250 *f++ = 'e';
4251 *f++ = 'r';
4252 *f++ = 'a';
4253 *f++ = 't';
4254 *f++ = 'o';
4255 *f++ = 'r';
4256 *f = '+';
4257 }
4258 return n2;
4259 }
4260 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4261 {
4262 bool r = true;
4263 if (__left_)
4264 r = r && __left_->fix_forward_references(t_begin, t_end);
4265 if (__right_)
4266 r = r && __right_->fix_forward_references(t_begin, t_end);
4267 return r;
4268 }
4269};
4270
4271class __operator_plus_equal
4272 : public __node
4273{
4274public:
4275
4276 __operator_plus_equal() {}
4277 __operator_plus_equal(__node* op1, __node* op2)
4278 {
4279 __left_ = op1;
4280 __right_ = op2;
4281 }
4282 virtual size_t first_size() const
4283 {
4284 if (__cached_size_ == -1)
4285 {
4286 if (__left_)
4287 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4288 else
4289 const_cast<long&>(__cached_size_) = sizeof("operator+=") - 1;
4290 }
4291 return __cached_size_;
4292 }
4293 virtual char* first_demangled_name(char* buf) const
4294 {
4295 if (__left_)
4296 {
4297 *buf++ = '(';
4298 buf = __left_->get_demangled_name(buf);
4299 strncpy(buf, ") += (", 6);
4300 buf += 6;
4301 buf = __right_->get_demangled_name(buf);
4302 *buf++ = ')';
4303 }
4304 else
4305 {
4306 strncpy(buf, "operator+=", sizeof("operator+=") - 1);
4307 buf += sizeof("operator+=") - 1;
4308 }
4309 return buf;
4310 }
4311 virtual ptrdiff_t print_first(char* f, char* l) const
4312 {
4313 const ptrdiff_t r = l - f;
4314 if (__left_)
4315 {
4316 const ptrdiff_t n1 = 8;
4317 if (r < n1)
4318 return n1 + __left_->print(l, l) + __right_->print(l, l);
4319 ptrdiff_t sz1 = __left_->print(f+1, l);
4320 if (r < n1 + sz1)
4321 return n1 + sz1 + __right_->print(l, l);
4322 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4323 if (r >= n1 + sz1 + sz2)
4324 {
4325 *f = '(';
4326 f += 1 + sz1;
4327 *f++ = ')';
4328 *f++ = ' ';
4329 *f++ = '+';
4330 *f++ = '=';
4331 *f++ = ' ';
4332 *f = '(';
4333 f += 1 + sz2;
4334 *f = ')';
4335 }
4336 return n1 + sz1 + sz2;
4337 }
4338 const ptrdiff_t n2 = sizeof("operator+=") - 1;
4339 if (r >= n2)
4340 {
4341 *f++ = 'o';
4342 *f++ = 'p';
4343 *f++ = 'e';
4344 *f++ = 'r';
4345 *f++ = 'a';
4346 *f++ = 't';
4347 *f++ = 'o';
4348 *f++ = 'r';
4349 *f++ = '+';
4350 *f = '=';
4351 }
4352 return n2;
4353 }
4354 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4355 {
4356 bool r = true;
4357 if (__left_)
4358 r = r && __left_->fix_forward_references(t_begin, t_end);
4359 if (__right_)
4360 r = r && __right_->fix_forward_references(t_begin, t_end);
4361 return r;
4362 }
4363};
4364
4365class __operator_increment
4366 : public __node
4367{
4368public:
4369
4370 __operator_increment() {}
4371 explicit __operator_increment(bool prefix, __node* op)
4372 {
4373 __size_ = prefix;
4374 __left_ = op;
4375 }
4376 virtual size_t first_size() const
4377 {
4378 if (__cached_size_ == -1)
4379 {
4380 if (__left_)
4381 const_cast<long&>(__cached_size_) = 4+__left_->size();
4382 else
4383 const_cast<long&>(__cached_size_) = sizeof("operator++") - 1;
4384 }
4385 return __cached_size_;
4386 }
4387 virtual char* first_demangled_name(char* buf) const
4388 {
4389 if (__left_)
4390 {
4391 if (__size_)
4392 {
4393 *buf++ = '+';
4394 *buf++ = '+';
4395 *buf++ = '(';
4396 }
4397 else
4398 *buf++ = '(';
4399 buf = __left_->get_demangled_name(buf);
4400 if (__size_)
4401 *buf++ = ')';
4402 else
4403 {
4404 *buf++ = ')';
4405 *buf++ = '+';
4406 *buf++ = '+';
4407 }
4408 }
4409 else
4410 {
4411 strncpy(buf, "operator++", sizeof("operator++") - 1);
4412 buf += sizeof("operator++") - 1;
4413 }
4414 return buf;
4415 }
4416 virtual ptrdiff_t print_first(char* f, char* l) const
4417 {
4418 const ptrdiff_t r = l - f;
4419 if (__left_)
4420 {
4421 const ptrdiff_t n1 = 4;
4422 if (r < n1)
4423 return n1 + __left_->print(l, l);
4424 ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l);
4425 if (r >= n1 + sz1)
4426 {
4427 if (__size_)
4428 {
4429 *f++ = '+';
4430 *f++ = '+';
4431 *f = '(';
4432 f += 1+sz1;
4433 *f = ')';
4434 }
4435 else
4436 {
4437 *f = '(';
4438 f += 1+sz1;
4439 *f++ = ')';
4440 *f++ = '+';
4441 *f = '+';
4442 }
4443 }
4444 return n1 + sz1;
4445 }
4446 const ptrdiff_t n2 = sizeof("operator++") - 1;
4447 if (r >= n2)
4448 {
4449 *f++ = 'o';
4450 *f++ = 'p';
4451 *f++ = 'e';
4452 *f++ = 'r';
4453 *f++ = 'a';
4454 *f++ = 't';
4455 *f++ = 'o';
4456 *f++ = 'r';
4457 *f++ = '+';
4458 *f = '+';
4459 }
4460 return n2;
4461 }
4462 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4463 {
4464 if (__left_)
4465 return __left_->fix_forward_references(t_begin, t_end);
4466 return true;
4467 }
4468};
4469
4470class __operator_unary_plus
4471 : public __node
4472{
4473public:
4474
4475 __operator_unary_plus() {}
4476 explicit __operator_unary_plus(__node* op)
4477 {
4478 __left_ = op;
4479 }
4480 virtual size_t first_size() const
4481 {
4482 if (__cached_size_ == -1)
4483 {
4484 if (__left_)
4485 const_cast<long&>(__cached_size_) = 3+__left_->size();
4486 else
4487 const_cast<long&>(__cached_size_) = sizeof("operator+") - 1;
4488 }
4489 return __cached_size_;
4490 }
4491 virtual char* first_demangled_name(char* buf) const
4492 {
4493 if (__left_)
4494 {
4495 *buf++ = '+';
4496 *buf++ = '(';
4497 buf = __left_->get_demangled_name(buf);
4498 *buf++ = ')';
4499 }
4500 else
4501 {
4502 strncpy(buf, "operator+", sizeof("operator+") - 1);
4503 buf += sizeof("operator+") - 1;
4504 }
4505 return buf;
4506 }
4507 virtual ptrdiff_t print_first(char* f, char* l) const
4508 {
4509 const ptrdiff_t r = l - f;
4510 if (__left_)
4511 {
4512 const ptrdiff_t n1 = 3;
4513 if (r < n1)
4514 return n1 + __left_->print(l, l);
4515 ptrdiff_t sz1 = __left_->print(f+2, l);
4516 if (r >= n1 + sz1)
4517 {
4518 *f++ = '+';
4519 *f = '(';
4520 f += 1 + sz1;
4521 *f = ')';
4522 }
4523 return n1 + sz1;
4524 }
4525 const ptrdiff_t n2 = sizeof("operator+") - 1;
4526 if (r >= n2)
4527 {
4528 *f++ = 'o';
4529 *f++ = 'p';
4530 *f++ = 'e';
4531 *f++ = 'r';
4532 *f++ = 'a';
4533 *f++ = 't';
4534 *f++ = 'o';
4535 *f++ = 'r';
4536 *f = '+';
4537 }
4538 return n2;
4539 }
4540 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4541 {
4542 if (__left_)
4543 return __left_->fix_forward_references(t_begin, t_end);
4544 return true;
4545 }
4546};
4547
4548class __operator_arrow
4549 : public __node
4550{
4551public:
4552
4553 __operator_arrow() {}
4554 __operator_arrow(__node* op1, __node* op2)
4555 {
4556 __left_ = op1;
4557 __right_ = op2;
4558 }
4559 virtual size_t first_size() const
4560 {
4561 if (__cached_size_ == -1)
4562 {
4563 if (__left_)
4564 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4565 else
4566 const_cast<long&>(__cached_size_) = sizeof("operator->") - 1;
4567 }
4568 return __cached_size_;
4569 }
4570 virtual char* first_demangled_name(char* buf) const
4571 {
4572 if (__left_)
4573 {
4574 *buf++ = '(';
4575 buf = __left_->get_demangled_name(buf);
4576 strncpy(buf, ") -> (", 6);
4577 buf += 6;
4578 buf = __right_->get_demangled_name(buf);
4579 *buf++ = ')';
4580 }
4581 else
4582 {
4583 strncpy(buf, "operator->", sizeof("operator->") - 1);
4584 buf += sizeof("operator->") - 1;
4585 }
4586 return buf;
4587 }
4588 virtual ptrdiff_t print_first(char* f, char* l) const
4589 {
4590 const ptrdiff_t r = l - f;
4591 if (__left_)
4592 {
4593 const ptrdiff_t n1 = 8;
4594 if (r < n1)
4595 return n1 + __left_->print(l, l) + __right_->print(l, l);
4596 ptrdiff_t sz1 = __left_->print(f+1, l);
4597 if (r < n1 + sz1)
4598 return n1 + sz1 + __right_->print(l, l);
4599 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4600 if (r >= n1 + sz1 + sz2)
4601 {
4602 *f = '(';
4603 f += 1 + sz1;
4604 *f++ = ')';
4605 *f++ = ' ';
4606 *f++ = '-';
4607 *f++ = '>';
4608 *f++ = ' ';
4609 *f = '(';
4610 f += 1 + sz2;
4611 *f = ')';
4612 }
4613 return n1 + sz1 + sz2;
4614 }
4615 const ptrdiff_t n2 = sizeof("operator->") - 1;
4616 if (r >= n2)
4617 {
4618 *f++ = 'o';
4619 *f++ = 'p';
4620 *f++ = 'e';
4621 *f++ = 'r';
4622 *f++ = 'a';
4623 *f++ = 't';
4624 *f++ = 'o';
4625 *f++ = 'r';
4626 *f++ = '-';
4627 *f = '>';
4628 }
4629 return n2;
4630 }
4631 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4632 {
4633 bool r = true;
4634 if (__left_)
4635 r = r && __left_->fix_forward_references(t_begin, t_end);
4636 if (__right_)
4637 r = r && __right_->fix_forward_references(t_begin, t_end);
4638 return r;
4639 }
4640};
4641
4642class __operator_conditional
4643 : public __node
4644{
4645public:
4646
4647 __operator_conditional() {}
4648 __operator_conditional(__node* op1, __node* op2, __node* op3)
4649 {
4650 __name_ = (const char*)op1;
4651 __left_ = op2;
4652 __right_ = op3;
4653 }
4654 virtual size_t first_size() const
4655 {
4656 if (__cached_size_ == -1)
4657 {
4658 if (__left_)
4659 {
4660 __node* op1 = (__node*)__name_;
4661 const_cast<long&>(__cached_size_) = op1->size() + __left_->size() + 12 + __right_->size();
4662 }
4663 else
4664 const_cast<long&>(__cached_size_) = sizeof("operator?") - 1;
4665 }
4666 return __cached_size_;
4667 }
4668 virtual char* first_demangled_name(char* buf) const
4669 {
4670 if (__left_)
4671 {
4672 __node* op1 = (__node*)__name_;
4673 *buf++ = '(';
4674 buf = op1->get_demangled_name(buf);
4675 strncpy(buf, ") ? (", 5);
4676 buf += 5;
4677 buf = __left_->get_demangled_name(buf);
4678 strncpy(buf, ") : (", 5);
4679 buf += 5;
4680 buf = __right_->get_demangled_name(buf);
4681 *buf++ = ')';
4682 }
4683 else
4684 {
4685 strncpy(buf, "operator?", sizeof("operator?") - 1);
4686 buf += sizeof("operator?") - 1;
4687 }
4688 return buf;
4689 }
4690 virtual ptrdiff_t print_first(char* f, char* l) const
4691 {
4692 const ptrdiff_t r = l - f;
4693 if (__left_)
4694 {
4695 const ptrdiff_t n1 = 12;
4696 __node* op1 = (__node*)__name_;
4697 if (r < n1)
4698 return n1 + op1->print(l, l) + __left_->print(l, l) +
4699 __right_->print(l, l);
4700 ptrdiff_t sz1 = op1->print(f+1, l);
4701 if (r < n1 + sz1)
4702 return n1 + sz1 + __left_->print(l, l) + __right_->print(l, l);
4703 ptrdiff_t sz2 = __left_->print(f+6+sz1, l);
4704 if (r < n1 + sz1 + sz2)
4705 return n1 + sz1 + sz2 + __right_->print(l, l);
4706 ptrdiff_t sz3 = __right_->print(f+11+sz1+sz2, l);
4707 if (r >= n1 + sz1 + sz2 + sz3)
4708 {
4709 *f = '(';
4710 f += 1 + sz1;
4711 *f++ = ')';
4712 *f++ = ' ';
4713 *f++ = '?';
4714 *f++ = ' ';
4715 *f = '(';
4716 f += 1 + sz2;
4717 *f++ = ')';
4718 *f++ = ' ';
4719 *f++ = ':';
4720 *f++ = ' ';
4721 *f = '(';
4722 f += 1 + sz3;
4723 *f = ')';
4724 }
4725 return n1 + sz1 + sz2 + sz3;
4726 }
4727 const ptrdiff_t n2 = sizeof("operator?") - 1;
4728 if (r >= n2)
4729 {
4730 *f++ = 'o';
4731 *f++ = 'p';
4732 *f++ = 'e';
4733 *f++ = 'r';
4734 *f++ = 'a';
4735 *f++ = 't';
4736 *f++ = 'o';
4737 *f++ = 'r';
4738 *f = '?';
4739 }
4740 return n2;
4741 }
4742 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4743 {
4744 bool r = true;
4745 if (__name_)
4746 r = r && ((__node*)__name_)->fix_forward_references(t_begin, t_end);
4747 if (__left_)
4748 r = r && __left_->fix_forward_references(t_begin, t_end);
4749 if (__right_)
4750 r = r && __right_->fix_forward_references(t_begin, t_end);
4751 return r;
4752 }
4753};
4754
4755class __operator_mod
4756 : public __node
4757{
4758public:
4759
4760 __operator_mod() {}
4761 __operator_mod(__node* op1, __node* op2)
4762 {
4763 __left_ = op1;
4764 __right_ = op2;
4765 }
4766 virtual size_t first_size() const
4767 {
4768 if (__cached_size_ == -1)
4769 {
4770 if (__left_)
4771 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
4772 else
4773 const_cast<long&>(__cached_size_) = sizeof("operator%") - 1;
4774 }
4775 return __cached_size_;
4776 }
4777 virtual char* first_demangled_name(char* buf) const
4778 {
4779 if (__left_)
4780 {
4781 *buf++ = '(';
4782 buf = __left_->get_demangled_name(buf);
4783 strncpy(buf, ") % (", 5);
4784 buf += 5;
4785 buf = __right_->get_demangled_name(buf);
4786 *buf++ = ')';
4787 }
4788 else
4789 {
4790 strncpy(buf, "operator%", sizeof("operator%") - 1);
4791 buf += sizeof("operator%") - 1;
4792 }
4793 return buf;
4794 }
4795 virtual ptrdiff_t print_first(char* f, char* l) const
4796 {
4797 const ptrdiff_t r = l - f;
4798 if (__left_)
4799 {
4800 const ptrdiff_t n1 = 7;
4801 if (r < n1)
4802 return n1 + __left_->print(l, l) + __right_->print(l, l);
4803 ptrdiff_t sz1 = __left_->print(f+1, l);
4804 if (r < n1 + sz1)
4805 return n1 + sz1 + __right_->print(l, l);
4806 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4807 if (r >= n1 + sz1 + sz2)
4808 {
4809 *f = '(';
4810 f += 1 + sz1;
4811 *f++ = ')';
4812 *f++ = ' ';
4813 *f++ = '%';
4814 *f++ = ' ';
4815 *f = '(';
4816 f += 1 + sz2;
4817 *f = ')';
4818 }
4819 return n1 + sz1 + sz2;
4820 }
4821 const ptrdiff_t n2 = sizeof("operator%") - 1;
4822 if (r >= n2)
4823 {
4824 *f++ = 'o';
4825 *f++ = 'p';
4826 *f++ = 'e';
4827 *f++ = 'r';
4828 *f++ = 'a';
4829 *f++ = 't';
4830 *f++ = 'o';
4831 *f++ = 'r';
4832 *f = '%';
4833 }
4834 return n2;
4835 }
4836 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4837 {
4838 bool r = true;
4839 if (__left_)
4840 r = r && __left_->fix_forward_references(t_begin, t_end);
4841 if (__right_)
4842 r = r && __right_->fix_forward_references(t_begin, t_end);
4843 return r;
4844 }
4845};
4846
4847class __operator_mod_equal
4848 : public __node
4849{
4850public:
4851
4852 __operator_mod_equal() {}
4853 __operator_mod_equal(__node* op1, __node* op2)
4854 {
4855 __left_ = op1;
4856 __right_ = op2;
4857 }
4858 virtual size_t first_size() const
4859 {
4860 if (__cached_size_ == -1)
4861 {
4862 if (__left_)
4863 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4864 else
4865 const_cast<long&>(__cached_size_) = sizeof("operator%=") - 1;
4866 }
4867 return __cached_size_;
4868 }
4869 virtual char* first_demangled_name(char* buf) const
4870 {
4871 if (__left_)
4872 {
4873 *buf++ = '(';
4874 buf = __left_->get_demangled_name(buf);
4875 strncpy(buf, ") %= (", 6);
4876 buf += 6;
4877 buf = __right_->get_demangled_name(buf);
4878 *buf++ = ')';
4879 }
4880 else
4881 {
4882 strncpy(buf, "operator%=", sizeof("operator%=") - 1);
4883 buf += sizeof("operator%=") - 1;
4884 }
4885 return buf;
4886 }
4887 virtual ptrdiff_t print_first(char* f, char* l) const
4888 {
4889 const ptrdiff_t r = l - f;
4890 if (__left_)
4891 {
4892 const ptrdiff_t n1 = 8;
4893 if (r < n1)
4894 return n1 + __left_->print(l, l) + __right_->print(l, l);
4895 ptrdiff_t sz1 = __left_->print(f+1, l);
4896 if (r < n1 + sz1)
4897 return n1 + sz1 + __right_->print(l, l);
4898 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4899 if (r >= n1 + sz1 + sz2)
4900 {
4901 *f = '(';
4902 f += 1 + sz1;
4903 *f++ = ')';
4904 *f++ = ' ';
4905 *f++ = '%';
4906 *f++ = '=';
4907 *f++ = ' ';
4908 *f = '(';
4909 f += 1 + sz2;
4910 *f = ')';
4911 }
4912 return n1 + sz1 + sz2;
4913 }
4914 const ptrdiff_t n2 = sizeof("operator%=") - 1;
4915 if (r >= n2)
4916 {
4917 *f++ = 'o';
4918 *f++ = 'p';
4919 *f++ = 'e';
4920 *f++ = 'r';
4921 *f++ = 'a';
4922 *f++ = 't';
4923 *f++ = 'o';
4924 *f++ = 'r';
4925 *f++ = '%';
4926 *f = '=';
4927 }
4928 return n2;
4929 }
4930 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4931 {
4932 bool r = true;
4933 if (__left_)
4934 r = r && __left_->fix_forward_references(t_begin, t_end);
4935 if (__right_)
4936 r = r && __right_->fix_forward_references(t_begin, t_end);
4937 return r;
4938 }
4939};
4940
4941class __operator_right_shift
4942 : public __node
4943{
4944public:
4945
4946 __operator_right_shift() {}
4947 __operator_right_shift(__node* op1, __node* op2)
4948 {
4949 __left_ = op1;
4950 __right_ = op2;
4951 }
4952 virtual size_t first_size() const
4953 {
4954 if (__cached_size_ == -1)
4955 {
4956 if (__left_)
4957 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4958 else
4959 const_cast<long&>(__cached_size_) = sizeof("operator>>") - 1;
4960 }
4961 return __cached_size_;
4962 }
4963 virtual char* first_demangled_name(char* buf) const
4964 {
4965 if (__left_)
4966 {
4967 *buf++ = '(';
4968 buf = __left_->get_demangled_name(buf);
4969 strncpy(buf, ") >> (", 6);
4970 buf += 6;
4971 buf = __right_->get_demangled_name(buf);
4972 *buf++ = ')';
4973 }
4974 else
4975 {
4976 strncpy(buf, "operator>>", sizeof("operator>>") - 1);
4977 buf += sizeof("operator>>") - 1;
4978 }
4979 return buf;
4980 }
4981 virtual ptrdiff_t print_first(char* f, char* l) const
4982 {
4983 const ptrdiff_t r = l - f;
4984 if (__left_)
4985 {
4986 const ptrdiff_t n1 = 8;
4987 if (r < n1)
4988 return n1 + __left_->print(l, l) + __right_->print(l, l);
4989 ptrdiff_t sz1 = __left_->print(f+1, l);
4990 if (r < n1 + sz1)
4991 return n1 + sz1 + __right_->print(l, l);
4992 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4993 if (r >= n1 + sz1 + sz2)
4994 {
4995 *f = '(';
4996 f += 1 + sz1;
4997 *f++ = ')';
4998 *f++ = ' ';
4999 *f++ = '>';
5000 *f++ = '>';
5001 *f++ = ' ';
5002 *f = '(';
5003 f += 1 + sz2;
5004 *f = ')';
5005 }
5006 return n1 + sz1 + sz2;
5007 }
5008 const ptrdiff_t n2 = sizeof("operator>>") - 1;
5009 if (r >= n2)
5010 {
5011 *f++ = 'o';
5012 *f++ = 'p';
5013 *f++ = 'e';
5014 *f++ = 'r';
5015 *f++ = 'a';
5016 *f++ = 't';
5017 *f++ = 'o';
5018 *f++ = 'r';
5019 *f++ = '>';
5020 *f = '>';
5021 }
5022 return n2;
5023 }
5024 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5025 {
5026 bool r = true;
5027 if (__left_)
5028 r = r && __left_->fix_forward_references(t_begin, t_end);
5029 if (__right_)
5030 r = r && __right_->fix_forward_references(t_begin, t_end);
5031 return r;
5032 }
5033};
5034
5035class __operator_right_shift_equal
5036 : public __node
5037{
5038public:
5039
5040 __operator_right_shift_equal() {}
5041 __operator_right_shift_equal(__node* op1, __node* op2)
5042 {
5043 __left_ = op1;
5044 __right_ = op2;
5045 }
5046 virtual size_t first_size() const
5047 {
5048 if (__cached_size_ == -1)
5049 {
5050 if (__left_)
5051 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
5052 else
5053 const_cast<long&>(__cached_size_) = sizeof("operator>>=") - 1;
5054 }
5055 return __cached_size_;
5056 }
5057 virtual char* first_demangled_name(char* buf) const
5058 {
5059 if (__left_)
5060 {
5061 *buf++ = '(';
5062 buf = __left_->get_demangled_name(buf);
5063 strncpy(buf, ") >>= (", 7);
5064 buf += 7;
5065 buf = __right_->get_demangled_name(buf);
5066 *buf++ = ')';
5067 }
5068 else
5069 {
5070 strncpy(buf, "operator>>=", sizeof("operator>>=") - 1);
5071 buf += sizeof("operator>>=") - 1;
5072 }
5073 return buf;
5074 }
5075 virtual ptrdiff_t print_first(char* f, char* l) const
5076 {
5077 const ptrdiff_t r = l - f;
5078 if (__left_)
5079 {
5080 const ptrdiff_t n1 = 9;
5081 if (r < n1)
5082 return n1 + __left_->print(l, l) + __right_->print(l, l);
5083 ptrdiff_t sz1 = __left_->print(f+1, l);
5084 if (r < n1 + sz1)
5085 return n1 + sz1 + __right_->print(l, l);
5086 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
5087 if (r >= n1 + sz1 + sz2)
5088 {
5089 *f = '(';
5090 f += 1 + sz1;
5091 *f++ = ')';
5092 *f++ = ' ';
5093 *f++ = '>';
5094 *f++ = '>';
5095 *f++ = '=';
5096 *f++ = ' ';
5097 *f = '(';
5098 f += 1 + sz2;
5099 *f = ')';
5100 }
5101 return n1 + sz1 + sz2;
5102 }
5103 const ptrdiff_t n2 = sizeof("operator>>=") - 1;
5104 if (r >= n2)
5105 {
5106 *f++ = 'o';
5107 *f++ = 'p';
5108 *f++ = 'e';
5109 *f++ = 'r';
5110 *f++ = 'a';
5111 *f++ = 't';
5112 *f++ = 'o';
5113 *f++ = 'r';
5114 *f++ = '>';
5115 *f++ = '>';
5116 *f = '=';
5117 }
5118 return n2;
5119 }
5120 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5121 {
5122 bool r = true;
5123 if (__left_)
5124 r = r && __left_->fix_forward_references(t_begin, t_end);
5125 if (__right_)
5126 r = r && __right_->fix_forward_references(t_begin, t_end);
5127 return r;
5128 }
5129};
5130
5131class __operator_sizeof_type
5132 : public __node
5133{
5134public:
5135
5136 __operator_sizeof_type() {}
5137 __operator_sizeof_type(__node* op)
5138 {
5139 __right_ = op;
5140 }
5141 virtual size_t first_size() const
5142 {
5143 if (__cached_size_ == -1)
5144 {
5145 if (__right_)
5146 const_cast<long&>(__cached_size_) = __right_->size() + 9;
5147 else
5148 const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1;
5149 }
5150 return __cached_size_;
5151 }
5152 virtual char* first_demangled_name(char* buf) const
5153 {
5154 if (__right_)
5155 {
5156 strncpy(buf, "sizeof (", 8);
5157 buf += 8;
5158 buf = __right_->get_demangled_name(buf);
5159 *buf++ = ')';
5160 }
5161 else
5162 {
5163 strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1);
5164 buf += sizeof("operator sizeof") - 1;
5165 }
5166 return buf;
5167 }
5168 virtual ptrdiff_t print_first(char* f, char* l) const
5169 {
5170 const ptrdiff_t r = l - f;
5171 if (__right_)
5172 {
5173 const ptrdiff_t n1 = sizeof("sizeof ()") - 1;
5174 if (r < n1)
5175 return n1 + __right_->print(l, l);
5176 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5177 if (r >= n1 + sz1)
5178 {
5179 *f++ = 's';
5180 *f++ = 'i';
5181 *f++ = 'z';
5182 *f++ = 'e';
5183 *f++ = 'o';
5184 *f++ = 'f';
5185 *f++ = ' ';
5186 *f = '(';
5187 f += 1 + sz1;
5188 *f = ')';
5189 }
5190 return n1 + sz1;
5191 }
5192 const ptrdiff_t n2 = sizeof("operator sizeof") - 1;
5193 if (r >= n2)
5194 {
5195 *f++ = 'o';
5196 *f++ = 'p';
5197 *f++ = 'e';
5198 *f++ = 'r';
5199 *f++ = 'a';
5200 *f++ = 't';
5201 *f++ = 'o';
5202 *f++ = 'r';
5203 *f++ = ' ';
5204 *f++ = 's';
5205 *f++ = 'i';
5206 *f++ = 'z';
5207 *f++ = 'e';
5208 *f++ = 'o';
5209 *f = 'f';
5210 }
5211 return n2;
5212 }
5213 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5214 {
5215 if (__right_)
5216 return __right_->fix_forward_references(t_begin, t_end);
5217 return true;
5218 }
5219};
5220
5221class __operator_sizeof_expression
5222 : public __node
5223{
5224public:
5225
5226 __operator_sizeof_expression() {}
5227 __operator_sizeof_expression(__node* op)
5228 {
5229 __right_ = op;
5230 }
5231 virtual size_t first_size() const
5232 {
5233 if (__cached_size_ == -1)
5234 {
5235 if (__right_)
5236 const_cast<long&>(__cached_size_) = __right_->size() + 9;
5237 else
5238 const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1;
5239 }
5240 return __cached_size_;
5241 }
5242 virtual char* first_demangled_name(char* buf) const
5243 {
5244 if (__right_)
5245 {
5246 strncpy(buf, "sizeof (", 8);
5247 buf += 8;
5248 buf = __right_->get_demangled_name(buf);
5249 *buf++ = ')';
5250 }
5251 else
5252 {
5253 strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1);
5254 buf += sizeof("operator sizeof") - 1;
5255 }
5256 return buf;
5257 }
5258 virtual ptrdiff_t print_first(char* f, char* l) const
5259 {
5260 const ptrdiff_t r = l - f;
5261 if (__right_)
5262 {
5263 const ptrdiff_t n1 = sizeof("sizeof ()") - 1;
5264 if (r < n1)
5265 return n1 + __right_->print(l, l);
5266 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5267 if (r >= n1 + sz1)
5268 {
5269 *f++ = 's';
5270 *f++ = 'i';
5271 *f++ = 'z';
5272 *f++ = 'e';
5273 *f++ = 'o';
5274 *f++ = 'f';
5275 *f++ = ' ';
5276 *f = '(';
5277 f += 1 + sz1;
5278 *f = ')';
5279 }
5280 return n1 + sz1;
5281 }
5282 const ptrdiff_t n2 = sizeof("operator sizeof") - 1;
5283 if (r >= n2)
5284 {
5285 *f++ = 'o';
5286 *f++ = 'p';
5287 *f++ = 'e';
5288 *f++ = 'r';
5289 *f++ = 'a';
5290 *f++ = 't';
5291 *f++ = 'o';
5292 *f++ = 'r';
5293 *f++ = ' ';
5294 *f++ = 's';
5295 *f++ = 'i';
5296 *f++ = 'z';
5297 *f++ = 'e';
5298 *f++ = 'o';
5299 *f = 'f';
5300 }
5301 return n2;
5302 }
5303 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5304 {
5305 if (__right_)
5306 return __right_->fix_forward_references(t_begin, t_end);
5307 return true;
5308 }
5309};
5310
5311class __typeid
5312 : public __node
5313{
5314public:
5315
5316 __typeid(__node* op)
5317 {
5318 __right_ = op;
5319 }
5320 virtual size_t first_size() const
5321 {
5322 if (__cached_size_ == -1)
5323 const_cast<long&>(__cached_size_) = __right_->size() + 8;
5324 return __cached_size_;
5325 }
5326 virtual char* first_demangled_name(char* buf) const
5327 {
5328 strncpy(buf, "typeid(", 7);
5329 buf += 7;
5330 buf = __right_->get_demangled_name(buf);
5331 *buf++ = ')';
5332 return buf;
5333 }
5334 virtual ptrdiff_t print_first(char* f, char* l) const
5335 {
5336 const ptrdiff_t r = l - f;
5337 const ptrdiff_t n1 = sizeof("typeid()") - 1;
5338 if (r < n1)
5339 return n1 + __right_->print(l, l);
5340 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5341 if (r >= n1 + sz1)
5342 {
5343 *f++ = 't';
5344 *f++ = 'y';
5345 *f++ = 'p';
5346 *f++ = 'e';
5347 *f++ = 'i';
5348 *f++ = 'd';
5349 *f = '(';
5350 f += 1 + sz1;
5351 *f = ')';
5352 }
5353 return n1 + sz1;
5354 }
5355 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5356 {
5357 return __right_->fix_forward_references(t_begin, t_end);
5358 }
5359};
5360
5361class __throw
5362 : public __node
5363{
5364public:
5365
5366 __throw(__node* op)
5367 {
5368 __right_ = op;
5369 }
5370 virtual size_t first_size() const
5371 {
5372 if (__cached_size_ == -1)
5373 const_cast<long&>(__cached_size_) = __right_->size() + 6;
5374 return __cached_size_;
5375 }
5376 virtual char* first_demangled_name(char* buf) const
5377 {
5378 strncpy(buf, "throw ", 6);
5379 return __right_->get_demangled_name(buf+6);
5380 }
5381 virtual ptrdiff_t print_first(char* f, char* l) const
5382 {
5383 const ptrdiff_t r = l - f;
5384 const ptrdiff_t n1 = sizeof("throw ") - 1;
5385 if (r < n1)
5386 return n1 + __right_->print(l, l);
5387 ptrdiff_t sz1 = __right_->print(f+n1, l);
5388 if (r >= n1 + sz1)
5389 {
5390 *f++ = 't';
5391 *f++ = 'h';
5392 *f++ = 'r';
5393 *f++ = 'o';
5394 *f++ = 'w';
5395 *f = ' ';
5396 }
5397 return n1 + sz1;
5398 }
5399 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5400 {
5401 return __right_->fix_forward_references(t_begin, t_end);
5402 }
5403};
5404
5405class __rethrow
5406 : public __node
5407{
5408 static const ptrdiff_t n = sizeof("throw") - 1;
5409public:
5410
5411 virtual size_t first_size() const {return n;}
5412 virtual char* first_demangled_name(char* buf) const
5413 {
5414 strncpy(buf, "throw", n);
5415 return buf+n;
5416 }
5417 virtual ptrdiff_t print_first(char* f, char* l) const
5418 {
5419 const ptrdiff_t r = l - f;
5420 if (r >= n)
5421 {
5422 *f++ = 't';
5423 *f++ = 'h';
5424 *f++ = 'r';
5425 *f++ = 'o';
5426 *f = 'w';
5427 }
5428 return n;
5429 }
5430};
5431
5432class __operator_sizeof_param_pack
5433 : public __node
5434{
5435public:
5436
5437 __operator_sizeof_param_pack(__node* op)
5438 {
5439 __right_ = op;
5440 }
5441 virtual size_t first_size() const
5442 {
5443 if (__cached_size_ == -1)
5444 const_cast<long&>(__cached_size_) = __right_->size() + 11;
5445 return __cached_size_;
5446 }
5447 virtual char* first_demangled_name(char* buf) const
5448 {
5449 strncpy(buf, "sizeof...(", 10);
5450 buf += 10;
5451 buf = __right_->get_demangled_name(buf);
5452 *buf++ = ')';
5453 return buf;
5454 }
5455 virtual ptrdiff_t print_first(char* f, char* l) const
5456 {
5457 const ptrdiff_t r = l - f;
5458 const ptrdiff_t n1 = sizeof("sizeof...()") - 1;
5459 if (r < n1)
5460 return n1 + __right_->print(l, l);
5461 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5462 if (r >= n1 + sz1)
5463 {
5464 *f++ = 's';
5465 *f++ = 'i';
5466 *f++ = 'z';
5467 *f++ = 'e';
5468 *f++ = 'o';
5469 *f++ = 'f';
5470 *f++ = '.';
5471 *f++ = '.';
5472 *f++ = '.';
5473 *f = '(';
5474 f += 1+sz1;
5475 *f = ')';
5476 }
5477 return n1 + sz1;
5478 }
5479 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5480 {
5481 return __right_->fix_forward_references(t_begin, t_end);
5482 }
5483};
5484
5485class __const_cast
5486 : public __node
5487{
5488public:
5489
5490 __const_cast(__node* op1, __node* op2)
5491 {
5492 __left_ = op1;
5493 __right_ = op2;
5494 }
5495 virtual size_t first_size() const
5496 {
5497 if (__cached_size_ == -1)
5498 const_cast<long&>(__cached_size_) = __left_->size() + 14 + __right_->size();
5499 return __cached_size_;
5500 }
5501 virtual char* first_demangled_name(char* buf) const
5502 {
5503 strncpy(buf, "const_cast<", 11);
5504 buf += 11;
5505 buf = __left_->get_demangled_name(buf);
5506 *buf++ = '>';
5507 *buf++ = '(';
5508 buf = __right_->get_demangled_name(buf);
5509 *buf++ = ')';
5510 return buf;
5511 }
5512 virtual ptrdiff_t print_first(char* f, char* l) const
5513 {
5514 const ptrdiff_t r = l - f;
5515 const ptrdiff_t n1 = sizeof("const_cast<>()") - 1;
5516 if (r < n1)
5517 return n1 + __left_->print(l, l) + __right_->print(l, l);
5518 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5519 if (r < n1 + sz1)
5520 return n1 + sz1 + __right_->print(l, l);
5521 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5522 if (r >= n1 + sz1 + sz2)
5523 {
5524 *f++ = 'c';
5525 *f++ = 'o';
5526 *f++ = 'n';
5527 *f++ = 's';
5528 *f++ = 't';
5529 *f++ = '_';
5530 *f++ = 'c';
5531 *f++ = 'a';
5532 *f++ = 's';
5533 *f++ = 't';
5534 *f = '<';
5535 f += 1+sz1;
5536 *f++ = '>';
5537 *f = '(';
5538 f += 1+sz2;
5539 *f = ')';
5540 }
5541 return n1 + sz1 + sz2;
5542 }
5543 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5544 {
5545 return __left_->fix_forward_references(t_begin, t_end) &&
5546 __right_->fix_forward_references(t_begin, t_end);
5547 }
5548};
5549
5550class __dynamic_cast
5551 : public __node
5552{
5553public:
5554
5555 __dynamic_cast(__node* op1, __node* op2)
5556 {
5557 __left_ = op1;
5558 __right_ = op2;
5559 }
5560 virtual size_t first_size() const
5561 {
5562 if (__cached_size_ == -1)
5563 const_cast<long&>(__cached_size_) = __left_->size() + 16 + __right_->size();
5564 return __cached_size_;
5565 }
5566 virtual char* first_demangled_name(char* buf) const
5567 {
5568 strncpy(buf, "dynamic_cast<", 13);
5569 buf += 13;
5570 buf = __left_->get_demangled_name(buf);
5571 *buf++ = '>';
5572 *buf++ = '(';
5573 buf = __right_->get_demangled_name(buf);
5574 *buf++ = ')';
5575 return buf;
5576 }
5577 virtual ptrdiff_t print_first(char* f, char* l) const
5578 {
5579 const ptrdiff_t r = l - f;
5580 const ptrdiff_t n1 = sizeof("dynamic_cast<>()") - 1;
5581 if (r < n1)
5582 return n1 + __left_->print(l, l) + __right_->print(l, l);
5583 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5584 if (r < n1 + sz1)
5585 return n1 + sz1 + __right_->print(l, l);
5586 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5587 if (r >= n1 + sz1 + sz2)
5588 {
5589 *f++ = 'd';
5590 *f++ = 'y';
5591 *f++ = 'n';
5592 *f++ = 'a';
5593 *f++ = 'm';
5594 *f++ = 'i';
5595 *f++ = 'c';
5596 *f++ = '_';
5597 *f++ = 'c';
5598 *f++ = 'a';
5599 *f++ = 's';
5600 *f++ = 't';
5601 *f = '<';
5602 f += 1+sz1;
5603 *f++ = '>';
5604 *f = '(';
5605 f += 1+sz2;
5606 *f = ')';
5607 }
5608 return n1 + sz1 + sz2;
5609 }
5610 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5611 {
5612 return __left_->fix_forward_references(t_begin, t_end) &&
5613 __right_->fix_forward_references(t_begin, t_end);
5614 }
5615};
5616
5617class __reinterpret_cast
5618 : public __node
5619{
5620public:
5621
5622 __reinterpret_cast(__node* op1, __node* op2)
5623 {
5624 __left_ = op1;
5625 __right_ = op2;
5626 }
5627 virtual size_t first_size() const
5628 {
5629 if (__cached_size_ == -1)
5630 const_cast<long&>(__cached_size_) = __left_->size() + 20 + __right_->size();
5631 return __cached_size_;
5632 }
5633 virtual char* first_demangled_name(char* buf) const
5634 {
5635 strncpy(buf, "reinterpret_cast<", 17);
5636 buf += 17;
5637 buf = __left_->get_demangled_name(buf);
5638 *buf++ = '>';
5639 *buf++ = '(';
5640 buf = __right_->get_demangled_name(buf);
5641 *buf++ = ')';
5642 return buf;
5643 }
5644 virtual ptrdiff_t print_first(char* f, char* l) const
5645 {
5646 const ptrdiff_t r = l - f;
5647 const ptrdiff_t n1 = sizeof("reinterpret_cast<>()") - 1;
5648 if (r < n1)
5649 return n1 + __left_->print(l, l) + __right_->print(l, l);
5650 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5651 if (r < n1 + sz1)
5652 return n1 + sz1 + __right_->print(l, l);
5653 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5654 if (r >= n1 + sz1 + sz2)
5655 {
5656 *f++ = 'r';
5657 *f++ = 'e';
5658 *f++ = 'i';
5659 *f++ = 'n';
5660 *f++ = 't';
5661 *f++ = 'e';
5662 *f++ = 'r';
5663 *f++ = 'p';
5664 *f++ = 'r';
5665 *f++ = 'e';
5666 *f++ = 't';
5667 *f++ = '_';
5668 *f++ = 'c';
5669 *f++ = 'a';
5670 *f++ = 's';
5671 *f++ = 't';
5672 *f = '<';
5673 f += 1+sz1;
5674 *f++ = '>';
5675 *f = '(';
5676 f += 1+sz2;
5677 *f = ')';
5678 }
5679 return n1 + sz1 + sz2;
5680 }
5681 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5682 {
5683 return __left_->fix_forward_references(t_begin, t_end) &&
5684 __right_->fix_forward_references(t_begin, t_end);
5685 }
5686};
5687
5688class __static_cast
5689 : public __node
5690{
5691public:
5692
5693 __static_cast(__node* op1, __node* op2)
5694 {
5695 __left_ = op1;
5696 __right_ = op2;
5697 }
5698 virtual size_t first_size() const
5699 {
5700 if (__cached_size_ == -1)
5701 const_cast<long&>(__cached_size_) = __left_->size() + 15 + __right_->size();
5702 return __cached_size_;
5703 }
5704 virtual char* first_demangled_name(char* buf) const
5705 {
5706 strncpy(buf, "static_cast<", 12);
5707 buf += 12;
5708 buf = __left_->get_demangled_name(buf);
5709 *buf++ = '>';
5710 *buf++ = '(';
5711 buf = __right_->get_demangled_name(buf);
5712 *buf++ = ')';
5713 return buf;
5714 }
5715 virtual ptrdiff_t print_first(char* f, char* l) const
5716 {
5717 const ptrdiff_t r = l - f;
5718 const ptrdiff_t n1 = sizeof("static_cast<>()") - 1;
5719 if (r < n1)
5720 return n1 + __left_->print(l, l) + __right_->print(l, l);
5721 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5722 if (r < n1 + sz1)
5723 return n1 + sz1 + __right_->print(l, l);
5724 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5725 if (r >= n1 + sz1 + sz2)
5726 {
5727 *f++ = 's';
5728 *f++ = 't';
5729 *f++ = 'a';
5730 *f++ = 't';
5731 *f++ = 'i';
5732 *f++ = 'c';
5733 *f++ = '_';
5734 *f++ = 'c';
5735 *f++ = 'a';
5736 *f++ = 's';
5737 *f++ = 't';
5738 *f = '<';
5739 f += 1+sz1;
5740 *f++ = '>';
5741 *f = '(';
5742 f += 1+sz2;
5743 *f = ')';
5744 }
5745 return n1 + sz1 + sz2;
5746 }
5747 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5748 {
5749 return __left_->fix_forward_references(t_begin, t_end) &&
5750 __right_->fix_forward_references(t_begin, t_end);
5751 }
5752};
5753
5754class __call_expr
5755 : public __node
5756{
5757public:
5758
5759 __call_expr(__node* op1, __node* op2)
5760 {
5761 __left_ = op1;
5762 __right_ = op2;
5763 }
5764 virtual size_t first_size() const
5765 {
5766 if (__cached_size_ == -1)
5767 {
5768 size_t off = __left_->size() + 2;
5769 if (__right_)
5770 off += __right_->size();
5771 const_cast<long&>(__cached_size_) = off;
5772 }
5773 return __cached_size_;
5774 }
5775 virtual char* first_demangled_name(char* buf) const
5776 {
5777 buf = __left_->get_demangled_name(buf);
5778 *buf++ = '(';
5779 if (__right_)
5780 buf = __right_->get_demangled_name(buf);
5781 *buf++ = ')';
5782 return buf;
5783 }
5784 virtual ptrdiff_t print_first(char* f, char* l) const
5785 {
5786 const ptrdiff_t r = l - f;
5787 const ptrdiff_t n1 = sizeof("()") - 1;
5788 if (r < n1)
5789 return n1 + __left_->print(l, l) + (__right_ ? __right_->print(l, l) : 0);
5790 ptrdiff_t sz1 = __left_->print(f, l);
5791 if (r < n1 + sz1)
5792 return n1 + sz1 + (__right_ ? __right_->print(l, l) : 0);
5793 ptrdiff_t sz2 = __right_ ? __right_->print(f+sz1+1, l) : 0;
5794 if (r >= n1 + sz1 + sz2)
5795 {
5796 f += sz1;
5797 *f = '(';
5798 f += 1+sz2;
5799 *f = ')';
5800 }
5801 return n1 + sz1 + sz2;
5802 }
5803 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5804 {
5805 bool r = __left_->fix_forward_references(t_begin, t_end);
5806 if (__right_)
5807 r = r && __right_->fix_forward_references(t_begin, t_end);
5808 return r;
5809 }
5810};
5811
5812class __delete_array_expr
5813 : public __node
5814{
5815public:
5816
5817 __delete_array_expr(bool global, __node* op)
5818 {
5819 __size_ = global;
5820 __right_ = op;
5821 }
5822 virtual size_t first_size() const
5823 {
5824 if (__cached_size_ == -1)
5825 const_cast<long&>(__cached_size_) = (__size_ ? 2 : 0) + 9 + __right_->size();
5826 return __cached_size_;
5827 }
5828 virtual char* first_demangled_name(char* buf) const
5829 {
5830 if (__size_)
5831 {
5832 *buf++ = ':';
5833 *buf++ = ':';
5834 }
5835 strncpy(buf, "delete[] ", 9);
5836 return __right_->get_demangled_name(buf+9);
5837 }
5838 virtual ptrdiff_t print_first(char* f, char* l) const
5839 {
5840 const ptrdiff_t r = l - f;
5841 const ptrdiff_t n1 = sizeof("delete[] ") - 1 + (__size_ ? 2 : 0);
5842 if (r < n1)
5843 return n1 + __right_->print(l, l);
5844 ptrdiff_t sz1 = __right_->print(f+n1, l);
5845 if (r >= n1 + sz1)
5846 {
5847 if (__size_)
5848 {
5849 *f++ = ':';
5850 *f++ = ':';
5851 }
5852 *f++ = 'd';
5853 *f++ = 'e';
5854 *f++ = 'l';
5855 *f++ = 'e';
5856 *f++ = 't';
5857 *f++ = 'e';
5858 *f++ = '[';
5859 *f++ = ']';
5860 *f = ' ';
5861 }
5862 return n1 + sz1;
5863 }
5864 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5865 {
5866 return __right_->fix_forward_references(t_begin, t_end);
5867 }
5868};
5869
5870class __delete_expr
5871 : public __node
5872{
5873public:
5874
5875 __delete_expr(bool global, __node* op)
5876 {
5877 __size_ = global;
5878 __right_ = op;
5879 }
5880 virtual size_t first_size() const
5881 {
5882 if (__cached_size_ == -1)
5883 const_cast<long&>(__cached_size_) = (__size_ ? 2 : 0) + 7 + __right_->size();
5884 return __cached_size_;
5885 }
5886 virtual char* first_demangled_name(char* buf) const
5887 {
5888 if (__size_)
5889 {
5890 *buf++ = ':';
5891 *buf++ = ':';
5892 }
5893 strncpy(buf, "delete ", 7);
5894 return __right_->get_demangled_name(buf+7);
5895 }
5896 virtual ptrdiff_t print_first(char* f, char* l) const
5897 {
5898 const ptrdiff_t r = l - f;
5899 const ptrdiff_t n1 = sizeof("delete ") - 1 + (__size_ ? 2 : 0);
5900 if (r < n1)
5901 return n1 + __right_->print(l, l);
5902 ptrdiff_t sz1 = __right_->print(f+n1, l);
5903 if (r >= n1 + sz1)
5904 {
5905 if (__size_)
5906 {
5907 *f++ = ':';
5908 *f++ = ':';
5909 }
5910 *f++ = 'd';
5911 *f++ = 'e';
5912 *f++ = 'l';
5913 *f++ = 'e';
5914 *f++ = 't';
5915 *f++ = 'e';
5916 *f = ' ';
5917 }
5918 return n1 + sz1;
5919 }
5920 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5921 {
5922 return __right_->fix_forward_references(t_begin, t_end);
5923 }
5924};
5925
5926class __new_expr
5927 : public __node
5928{
5929public:
5930
5931 __new_expr(bool global, bool is_array, bool has_init,
5932 __node* expr, __node* type, __node* init)
5933 {
5934 __size_ = (unsigned)global |
5935 ((unsigned)is_array << 1) |
5936 ((unsigned)has_init << 2);
5937 __left_ = expr;
5938 __name_ = (const char*)type;
5939 __right_ = init;
5940 }
5941 virtual size_t first_size() const
5942 {
5943 if (__cached_size_ == -1)
5944 {
5945 size_t off = 4;
5946 if (__size_ & 1)
5947 off += 2;
5948 if (__size_ & 2)
5949 off += 2;
5950 if (__left_)
5951 {
5952 off += 2;
5953 off += __left_->size();
5954 }
5955 __node* type = (__node*)__name_;
5956 off += type->size();
5957 if (__size_ & 4)
5958 {
5959 off += 2;
5960 if (__right_)
5961 off += __right_->size();
5962 }
5963 const_cast<long&>(__cached_size_) = off;
5964 }
5965 return __cached_size_;
5966 }
5967 virtual char* first_demangled_name(char* buf) const
5968 {
5969 if (__size_ & 1)
5970 {
5971 *buf++ = ':';
5972 *buf++ = ':';
5973 }
5974 *buf++ = 'n';
5975 *buf++ = 'e';
5976 *buf++ = 'w';
5977 if (__size_ & 2)
5978 {
5979 *buf++ = '[';
5980 *buf++ = ']';
5981 }
5982 if (__left_)
5983 {
5984 *buf++ = '(';
5985 buf = __left_->get_demangled_name(buf);
5986 *buf++ = ')';
5987 }
5988 *buf++ = ' ';
5989 __node* type = (__node*)__name_;
5990 buf = type->get_demangled_name(buf);
5991 if (__size_ & 4)
5992 {
5993 *buf++ = '(';
5994 if (__right_)
5995 buf = __right_->get_demangled_name(buf);
5996 *buf++ = ')';
5997 }
5998 return buf;
5999 }
6000 virtual ptrdiff_t print_first(char* f, char* l) const
6001 {
6002 const ptrdiff_t r = l - f;
6003 const ptrdiff_t n1 = sizeof("new ") - 1 + (__size_ & 1 ? 2 : 0) +
6004 (__size_ & 2 ? 2 : 0) + (__left_ ? 2 : 0) + (__size_ & 4 ? 2 : 0);
6005 __node* type = (__node*)__name_;
6006 if (r < n1)
6007 return n1 + (__left_ ? __left_->print(l, l) : 0) +
6008 type->print(l, l) +
6009 (__right_ ? __right_->print(l, l) : 0);
6010 ptrdiff_t sz1 = __left_ ? __left_->print(f+4+
6011 (__size_ & 1 ? 2 : 0) +
6012 (__size_ & 2 ? 2 : 0), l) : 0;
6013 if (r < n1 + sz1)
6014 return n1 + sz1 + type->print(l, l) +
6015 (__right_ ? __right_->print(l, l) : 0);
6016 ptrdiff_t sz2 = type->print(f+(n1-(__size_ & 4 ? 2 : 0)+sz1), l);
6017 if (r < n1 + sz1 + sz2)
6018 return n1 + sz1 + sz2 + (__right_ ? __right_->print(l, l) : 0);
6019 ptrdiff_t sz3 = __right_ ? __right_->print(f+(n1-1)+sz1+sz2, l) : 0;
6020 if (r >= n1 + sz1 + sz2 + sz3)
6021 {
6022 if (__size_ & 1)
6023 {
6024 *f++ = ':';
6025 *f++ = ':';
6026 }
6027 *f++ = 'n';
6028 *f++ = 'e';
6029 *f++ = 'w';
6030 if (__size_ & 2)
6031 {
6032 *f++ = '[';
6033 *f++ = ']';
6034 }
6035 if (__left_)
6036 {
6037 *f = '(';
6038 f += 1 + sz1;
6039 *f++ = ')';
6040 }
6041 *f = ' ';
6042 if (__size_ & 4)
6043 {
6044 f += 1 + sz2;
6045 *f = '(';
6046 f += 1 + sz3;
6047 *f = ')';
6048 }
6049 }
6050 return n1 + sz1 + sz2 + sz3;
6051 }
6052 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6053 {
6054 __node* type = (__node*)__name_;
6055 bool r = type->fix_forward_references(t_begin, t_end);
6056 if (__left_)
6057 r = r && __left_->fix_forward_references(t_begin, t_end);;
6058 if (__right_)
6059 r = r && __right_->fix_forward_references(t_begin, t_end);;
6060 return r;
6061 }
6062};
6063
6064class __dot_star_expr
6065 : public __node
6066{
6067public:
6068
6069 __dot_star_expr(__node* op1, __node* op2)
6070 {
6071 __left_ = op1;
6072 __right_ = op2;
6073 }
6074 virtual size_t first_size() const
6075 {
6076 if (__cached_size_ == -1)
6077 const_cast<long&>(__cached_size_) = __left_->size() + 2 + __right_->size();
6078 return __cached_size_;
6079 }
6080 virtual char* first_demangled_name(char* buf) const
6081 {
6082 buf = __left_->get_demangled_name(buf);
6083 *buf++ = '.';
6084 *buf++ = '*';
6085 return __right_->get_demangled_name(buf);
6086 }
6087 virtual ptrdiff_t print_first(char* f, char* l) const
6088 {
6089 const ptrdiff_t r = l - f;
6090 const ptrdiff_t n = sizeof(".*") - 1;
6091 if (r < n)
6092 return n + __left_->print(l, l) + __right_->print(l, l);
6093 ptrdiff_t sz1 = __left_->print(f, l);
6094 if (r < n + sz1)
6095 return n + sz1 + __right_->print(l, l);
6096 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
6097 if (r >= n + sz1 + sz2)
6098 {
6099 f += sz1;
6100 *f++ = '.';
6101 *f = '*';
6102 }
6103 return n + sz1 + sz2;
6104 }
6105 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6106 {
6107 return __left_->fix_forward_references(t_begin, t_end) &&
6108 __right_->fix_forward_references(t_begin, t_end);
6109 }
6110};
6111
6112class __dot_expr
6113 : public __node
6114{
6115public:
6116
6117 __dot_expr(__node* op1, __node* op2)
6118 {
6119 __left_ = op1;
6120 __right_ = op2;
6121 }
6122 virtual size_t first_size() const
6123 {
6124 if (__cached_size_ == -1)
6125 const_cast<long&>(__cached_size_) = __left_->size() + 1 + __right_->size();
6126 return __cached_size_;
6127 }
6128 virtual char* first_demangled_name(char* buf) const
6129 {
6130 buf = __left_->get_demangled_name(buf);
6131 *buf++ = '.';
6132 return __right_->get_demangled_name(buf);
6133 }
6134 virtual ptrdiff_t print_first(char* f, char* l) const
6135 {
6136 const ptrdiff_t r = l - f;
6137 const ptrdiff_t n = sizeof(".") - 1;
6138 if (r < n)
6139 return n + __left_->print(l, l) + __right_->print(l, l);
6140 ptrdiff_t sz1 = __left_->print(f, l);
6141 if (r < n + sz1)
6142 return n + sz1 + __right_->print(l, l);
6143 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
6144 if (r >= n + sz1 + sz2)
6145 f[sz1] = '.';
6146 return n + sz1 + sz2;
6147 }
6148 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6149 {
6150 return __left_->fix_forward_references(t_begin, t_end) &&
6151 __right_->fix_forward_references(t_begin, t_end);
6152 }
6153};
6154
6155class __arrow_expr
6156 : public __node
6157{
6158public:
6159
6160 __arrow_expr(__node* op1, __node* op2)
6161 {
6162 __left_ = op1;
6163 __right_ = op2;
6164 }
6165 virtual size_t first_size() const
6166 {
6167 if (__cached_size_ == -1)
6168 const_cast<long&>(__cached_size_) = __left_->size() + 2 + __right_->size();
6169 return __cached_size_;
6170 }
6171 virtual char* first_demangled_name(char* buf) const
6172 {
6173 buf = __left_->get_demangled_name(buf);
6174 *buf++ = '-';
6175 *buf++ = '>';
6176 return __right_->get_demangled_name(buf);
6177 }
6178 virtual ptrdiff_t print_first(char* f, char* l) const
6179 {
6180 const ptrdiff_t r = l - f;
6181 const ptrdiff_t n = sizeof("->") - 1;
6182 if (r < n)
6183 return n + __left_->print(l, l) + __right_->print(l, l);
6184 ptrdiff_t sz1 = __left_->print(f, l);
6185 if (r < n + sz1)
6186 return n + sz1 + __right_->print(l, l);
6187 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
6188 if (r >= n + sz1 + sz2)
6189 {
6190 f += sz1;
6191 *f++ = '-';
6192 *f = '>';
6193 }
6194 return n + sz1 + sz2;
6195 }
6196 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6197 {
6198 return __left_->fix_forward_references(t_begin, t_end) &&
6199 __right_->fix_forward_references(t_begin, t_end);
6200 }
6201};
6202
6203class __std_qualified_name
6204 : public __node
6205{
6206 static const ptrdiff_t n = sizeof("std") - 1;
6207public:
6208
6209 __std_qualified_name()
6210 {
6211 }
6212 virtual size_t first_size() const
6213 {
6214 return n;
6215 }
6216
6217 virtual char* first_demangled_name(char* buf) const
6218 {
6219 *buf++ = 's';
6220 *buf++ = 't';
6221 *buf++ = 'd';
6222 return buf;
6223 }
6224 virtual ptrdiff_t print_first(char* f, char* l) const
6225 {
6226 const ptrdiff_t r = l - f;
6227 if (r >= n)
6228 {
6229 *f++ = 's';
6230 *f++ = 't';
6231 *f = 'd';
6232 }
6233 return n;
6234 }
6235};
6236
6237class __sub_allocator
6238 : public __node
6239{
6240 static const ptrdiff_t n = sizeof("std::allocator") - 1;
6241public:
6242
6243 virtual size_t first_size() const
6244 {
6245 return n;
6246 }
6247 virtual char* first_demangled_name(char* buf) const
6248 {
6249 strncpy(buf, "std::allocator", n);
6250 return buf + n;
6251 }
6252 virtual ptrdiff_t print_first(char* f, char* l) const
6253 {
6254 const ptrdiff_t r = l - f;
6255 if (r >= n)
6256 {
6257 *f++ = 's';
6258 *f++ = 't';
6259 *f++ = 'd';
6260 *f++ = ':';
6261 *f++ = ':';
6262 *f++ = 'a';
6263 *f++ = 'l';
6264 *f++ = 'l';
6265 *f++ = 'o';
6266 *f++ = 'c';
6267 *f++ = 'a';
6268 *f++ = 't';
6269 *f++ = 'o';
6270 *f = 'r';
6271 }
6272 return n;
6273 }
6274};
6275
6276class __sub_basic_string
6277 : public __node
6278{
6279 static const ptrdiff_t n = sizeof("std::basic_string") - 1;
6280public:
6281
6282 virtual size_t first_size() const
6283 {
6284 return n;
6285 }
6286 virtual char* first_demangled_name(char* buf) const
6287 {
6288 strncpy(buf, "std::basic_string", n);
6289 return buf + n;
6290 }
6291 virtual ptrdiff_t print_first(char* f, char* l) const
6292 {
6293 const ptrdiff_t r = l - f;
6294 if (r >= n)
6295 {
6296 *f++ = 's';
6297 *f++ = 't';
6298 *f++ = 'd';
6299 *f++ = ':';
6300 *f++ = ':';
6301 *f++ = 'b';
6302 *f++ = 'a';
6303 *f++ = 's';
6304 *f++ = 'i';
6305 *f++ = 'c';
6306 *f++ = '_';
6307 *f++ = 's';
6308 *f++ = 't';
6309 *f++ = 'r';
6310 *f++ = 'i';
6311 *f++ = 'n';
6312 *f = 'g';
6313 }
6314 return n;
6315 }
6316};
6317
6318class __sub_string
6319 : public __node
6320{
6321 static const size_t n = sizeof("std::string") - 1;
6322 static const size_t ne = sizeof("std::basic_string<char, std::char_traits<char>, std::allocator<char> >") - 1;
6323public:
6324
6325 virtual size_t first_size() const
6326 {
6327 if (__size_)
6328 return ne;
6329 return n;
6330 }
6331 virtual char* first_demangled_name(char* buf) const
6332 {
6333 if (__size_)
6334 {
6335 strncpy(buf, "std::basic_string<char, std::char_traits<char>, std::allocator<char> >", ne);
6336 buf += ne;
6337 }
6338 else
6339 {
6340 strncpy(buf, "std::string", n);
6341 buf += n;
6342 }
6343 return buf;
6344 }
6345
6346 virtual ptrdiff_t print_first(char* f, char* l) const
6347 {
6348 const ptrdiff_t r = l - f;
6349 if (__size_)
6350 {
6351 const ptrdiff_t n1 =
6352 sizeof("std::basic_string<char, std::char_traits<char>,"
6353 " std::allocator<char> >") - 1;
6354 if (r >= n1)
6355 strncpy(f, "std::basic_string<char, std::char_traits<char>,"
6356 " std::allocator<char> >", n1);
6357 return n1;
6358 }
6359 const ptrdiff_t n2 = sizeof("std::string") - 1;
6360 if (r >= n2)
6361 {
6362 *f++ = 's';
6363 *f++ = 't';
6364 *f++ = 'd';
6365 *f++ = ':';
6366 *f++ = ':';
6367 *f++ = 's';
6368 *f++ = 't';
6369 *f++ = 'r';
6370 *f++ = 'i';
6371 *f++ = 'n';
6372 *f = 'g';
6373 }
6374 return n2;
6375 }
6376 virtual size_t base_size() const
6377 {
6378 return 12;
6379 }
6380 virtual char* get_base_name(char* buf) const
6381 {
6382 strncpy(buf, "basic_string", 12);
6383 return buf + 12;
6384 }
6385 virtual ptrdiff_t print_base_name(char* f, char* l) const
6386 {
6387 const ptrdiff_t r = l - f;
6388 const ptrdiff_t n = sizeof("basic_string") - 1;
6389 if (r >= n)
6390 {
6391 *f++ = 'b';
6392 *f++ = 'a';
6393 *f++ = 's';
6394 *f++ = 'i';
6395 *f++ = 'c';
6396 *f++ = '_';
6397 *f++ = 's';
6398 *f++ = 't';
6399 *f++ = 'r';
6400 *f++ = 'i';
6401 *f++ = 'n';
6402 *f = 'g';
6403 }
6404 return n;
6405 }
6406
6407 virtual __node* base_name() const
6408 {
6409 const_cast<size_t&>(__size_) = true;
6410 return const_cast<__node*>(static_cast<const __node*>(this));
6411 }
6412};
6413
6414class __sub_istream
6415 : public __node
6416{
6417 static const ptrdiff_t n = sizeof("std::istream") - 1;
6418public:
6419
6420 virtual size_t first_size() const {return n;}
6421 virtual char* first_demangled_name(char* buf) const
6422 {
6423 strncpy(buf, "std::istream", n);
6424 return buf + n;
6425 }
6426 virtual ptrdiff_t print_first(char* f, char* l) const
6427 {
6428 const ptrdiff_t r = l - f;
6429 if (r >= n)
6430 {
6431 *f++ = 's';
6432 *f++ = 't';
6433 *f++ = 'd';
6434 *f++ = ':';
6435 *f++ = ':';
6436 *f++ = 'i';
6437 *f++ = 's';
6438 *f++ = 't';
6439 *f++ = 'r';
6440 *f++ = 'e';
6441 *f++ = 'a';
6442 *f = 'm';
6443 }
6444 return n;
6445 }
6446};
6447
6448class __sub_ostream
6449 : public __node
6450{
6451 static const ptrdiff_t n = sizeof("std::ostream") - 1;
6452public:
6453
6454 virtual size_t first_size() const {return n;}
6455 virtual char* first_demangled_name(char* buf) const
6456 {
6457 strncpy(buf, "std::ostream", n);
6458 return buf + n;
6459 }
6460 virtual ptrdiff_t print_first(char* f, char* l) const
6461 {
6462 const ptrdiff_t r = l - f;
6463 if (r >= n)
6464 {
6465 *f++ = 's';
6466 *f++ = 't';
6467 *f++ = 'd';
6468 *f++ = ':';
6469 *f++ = ':';
6470 *f++ = 'o';
6471 *f++ = 's';
6472 *f++ = 't';
6473 *f++ = 'r';
6474 *f++ = 'e';
6475 *f++ = 'a';
6476 *f = 'm';
6477 }
6478 return n;
6479 }
6480};
6481
6482class __sub_iostream
6483 : public __node
6484{
6485 static const ptrdiff_t n = sizeof("std::iostream") - 1;
6486public:
6487
6488 virtual size_t first_size() const {return n;}
6489 virtual char* first_demangled_name(char* buf) const
6490 {
6491 strncpy(buf, "std::iostream", n);
6492 return buf + n;
6493 }
6494 virtual ptrdiff_t print_first(char* f, char* l) const
6495 {
6496 const ptrdiff_t r = l - f;
6497 if (r >= n)
6498 {
6499 *f++ = 's';
6500 *f++ = 't';
6501 *f++ = 'd';
6502 *f++ = ':';
6503 *f++ = ':';
6504 *f++ = 'i';
6505 *f++ = 'o';
6506 *f++ = 's';
6507 *f++ = 't';
6508 *f++ = 'r';
6509 *f++ = 'e';
6510 *f++ = 'a';
6511 *f = 'm';
6512 }
6513 return n;
6514 }
6515};
6516
6517class __sub
6518 : public __node
6519{
6520public:
6521
6522 explicit __sub(__node* arg)
6523 {
6524 __left_ = arg;
6525 }
6526 explicit __sub(size_t arg)
6527 {
6528 __size_ = arg;
6529 }
6530 virtual size_t first_size() const
6531 {
6532 return __left_->first_size();
6533 }
6534 virtual char* first_demangled_name(char* buf) const
6535 {
6536 return __left_->first_demangled_name(buf);
6537 }
6538 virtual size_t second_size() const
6539 {
6540 return __left_->second_size();
6541 }
6542 virtual char* second_demangled_name(char* buf) const
6543 {
6544 return __left_->second_demangled_name(buf);
6545 }
6546 virtual ptrdiff_t print_first(char* f, char* l) const
6547 {
6548 return __left_->print_first(f, l);
6549 }
6550 virtual ptrdiff_t print_second(char* f, char* l) const
6551 {
6552 return __left_->print_second(f, l);
6553 }
6554 virtual bool ends_with_template() const
6555 {
6556 return __left_->ends_with_template();
6557 }
6558 virtual __node* base_name() const
6559 {
6560 return __left_->base_name();
6561 }
6562 virtual bool is_reference_or_pointer_to_function_or_array() const
6563 {
6564 return __left_->is_reference_or_pointer_to_function_or_array();
6565 }
6566 virtual bool is_function() const
6567 {
6568 return __left_->is_function();
6569 }
6570 virtual bool is_cv_qualifer() const
6571 {
6572 return __left_->is_cv_qualifer();
6573 }
6574 virtual bool is_ctor_dtor_conv() const
6575 {
6576 return __left_->is_ctor_dtor_conv();
6577 }
6578 virtual bool is_array() const
6579 {
6580 return __left_->is_array();
6581 }
6582 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6583 {
6584 if (__left_ == 0)
6585 {
6586 if (__size_ < t_end - t_begin)
6587 {
6588 __left_ = t_begin[__size_];
6589 __size_ = 0;
6590 }
6591 else
6592 return false;
6593 }
6594 return true;
6595 }
6596 virtual size_t list_len() const
6597 {
6598 return __left_->list_len();
6599 }
6600 virtual bool is_sub() const
6601 {
6602 return true;
6603 }
6604};
6605
6606class __unscoped_template_name
6607 : public __node
6608{
6609public:
6610 __unscoped_template_name(__node* name, __node* args)
6611 {__left_ = name; __right_ = args;}
6612
6613 virtual size_t first_size() const
6614 {
6615 if (__cached_size_ == -1)
6616 const_cast<long&>(__cached_size_) = __left_->size() + __right_->size();
6617 return __cached_size_;
6618 }
6619 virtual char* first_demangled_name(char* buf) const
6620 {
6621 buf = __left_->get_demangled_name(buf);
6622 return __right_->get_demangled_name(buf);
6623 }
6624 virtual ptrdiff_t print_first(char* f, char* l) const
6625 {
6626 const ptrdiff_t r = l - f;
6627 ptrdiff_t sz1 = __left_->print(f, l);
6628 if (r < sz1)
6629 return sz1 + __right_->print(l, l);
6630 return sz1 + __right_->print(f + sz1, l);
6631 }
6632 virtual bool ends_with_template() const
6633 {
6634 return __right_->ends_with_template();
6635 }
6636 virtual __node* base_name() const
6637 {
6638 return __left_->base_name();
6639 }
6640 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6641 {
6642 return __left_->fix_forward_references(t_begin, t_end) &&
6643 __right_->fix_forward_references(t_begin, t_end);
6644 }
6645};
6646
6647// length == 0: __left_ == NULL
6648// length == 1: __left_ != NULL, __right_ == NULL
6649// length > 1: __left_ != NULL, __right_ != NULL
6650class __list
6651 : public __node
6652{
6653public:
6654 explicit __list(__node* type)
6655 {__left_ = type;}
6656
6657 virtual size_t first_size() const
6658 {
6659 if (__cached_size_ == -1)
6660 {
6661 if (__left_ == NULL)
6662 const_cast<long&>(__cached_size_) = 0;
6663 else if (__right_ == NULL)
6664 const_cast<long&>(__cached_size_) = __left_->size();
6665 else
6666 {
6667 size_t off = __right_->size();
6668 if (off > 0)
6669 off += 2;
6670 const_cast<long&>(__cached_size_) = __left_->size() + off;
6671 }
6672 }
6673 return __cached_size_;
6674 }
6675 virtual char* first_demangled_name(char* buf) const
6676 {
6677 if (__left_ != NULL)
6678 {
6679 char* t = __left_->get_demangled_name(buf + (__size_ ? 2 : 0));
6680 if (__size_ == 0)
6681 buf = t;
6682 else if (t != buf+2)
6683 {
6684 *buf++ = ',';
6685 *buf++ = ' ';
6686 buf = t;
6687 }
6688 if (__right_)
6689 buf = __right_->get_demangled_name(buf);
6690 }
6691 return buf;
6692 }
6693 virtual ptrdiff_t print_first(char* f, char* l) const
6694 {
6695 if (__left_ == 0)
6696 return 0;
6697 const ptrdiff_t r = l - f;
6698 ptrdiff_t n = 0;
6699 if (__size_)
6700 {
6701 n = 2;
6702 if (r < n)
6703 {
6704 ptrdiff_t sz1 = __left_->print(l, l);
6705 if (sz1 == 0)
6706 n = 0;
6707 return n + sz1 + (__right_ ? __right_->print(l, l) : 0);
6708 }
6709 }
6710 const ptrdiff_t sz1 = __left_->print(f+n, l);
6711 if (sz1 == 0)
6712 n = 0;
6713 else if (n != 0)
6714 {
6715 f[0] = ',';
6716 f[1] = ' ';
6717 }
6718 const ptrdiff_t sz2 = __right_ ? __right_->print(f+std::min(n+sz1, r), l) : 0;
6719 return n + sz1 + sz2;
6720 }
6721 virtual bool ends_with_template() const
6722 {
6723 if (__right_ != NULL)
6724 return __right_->ends_with_template();
6725 if (__left_ != NULL)
6726 return __left_->ends_with_template();
6727 return false;
6728 }
6729 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6730 {
6731 bool r = true;
6732 if (__left_)
6733 r = r && __left_->fix_forward_references(t_begin, t_end);
6734 if (__right_)
6735 r = r && __right_->fix_forward_references(t_begin, t_end);
6736 return r;
6737 }
6738 virtual size_t list_len() const
6739 {
6740 if (!__left_)
6741 return 0;
6742 if (!__right_)
6743 return 1;
6744 return 1 + __right_->list_len();
6745 }
6746};
6747
6748class __template_args
6749 : public __node
6750{
6751public:
6752 __template_args(__node* name, __node* list)
6753 {
6754 __left_ = name;
6755 __right_ = list;
6756 }
6757
6758 virtual size_t first_size() const
6759 {
6760 if (__cached_size_ == -1)
6761 {
6762 size_t off = 2;
6763 if (__right_)
6764 {
6765 if (__right_->ends_with_template())
6766 ++off;
6767 off += __right_->size();
6768 }
6769 const_cast<long&>(__cached_size_) = __left_->size() + off;
6770 }
6771 return __cached_size_;
6772 }
6773 virtual char* first_demangled_name(char* buf) const
6774 {
6775 buf = __left_->get_demangled_name(buf);
6776 *buf++ = '<';
6777 if (__right_)
6778 {
6779 buf = __right_->get_demangled_name(buf);
6780 if (buf[-1] == '>')
6781 *buf++ = ' ';
6782 }
6783 *buf++ = '>';
6784 return buf;
6785 }
6786 virtual ptrdiff_t print_first(char* f, char* l) const
6787 {
6788 const ptrdiff_t r = l - f;
6789 const ptrdiff_t sz1 = __left_->print(f, l);
6790 ptrdiff_t sz2 = 0;
6791 ptrdiff_t n = 2;
6792 if (__right_)
6793 {
6794 sz2 = __right_->print(f+std::min(sz1+1, r), l);
6795 if (r >= sz1 + sz2 + 2)
6796 {
6797 if (f[sz1+sz2] == '>')
6798 {
6799 f[sz1+sz2+1] = ' ';
6800 ++n;
6801 }
6802 }
6803 else if (__right_->ends_with_template())
6804 ++n;
6805 }
6806 if (r >= sz1 + sz2 + n)
6807 {
6808 f[sz1] = '<';
6809 f[sz1+sz2+n-1] = '>';
6810 }
6811 return n + sz1 + sz2;
6812 }
6813
6814 virtual bool ends_with_template() const
6815 {
6816 return true;
6817 }
6818 virtual __node* base_name() const
6819 {
6820 return __left_->base_name();
6821 }
6822 virtual bool is_ctor_dtor_conv() const
6823 {
6824 return __left_->is_ctor_dtor_conv();
6825 }
6826 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6827 {
6828 bool r = __left_->fix_forward_references(t_begin, t_end);
6829 if (__right_)
6830 r = r && __right_->fix_forward_references(t_begin, t_end);
6831 return r;
6832 }
6833};
6834
6835class __function_args
6836 : public __node
6837{
6838public:
6839 __function_args(__node* list)
6840 {__right_ = list;}
6841
6842 virtual size_t first_size() const
6843 {
6844 if (__cached_size_ == -1)
6845 const_cast<long&>(__cached_size_) = 2 + __right_->size();
6846 return __cached_size_;
6847 }
6848 virtual char* first_demangled_name(char* buf) const
6849 {
6850 *buf++ = '(';
6851 buf = __right_->get_demangled_name(buf);
6852 *buf++ = ')';
6853 return buf;
6854 }
6855 virtual ptrdiff_t print_first(char* f, char* l) const
6856 {
6857 const ptrdiff_t r = l - f;
6858 const ptrdiff_t n = 2;
6859 if (r < n)
6860 return n + __right_->print(l, l);
6861 ptrdiff_t sz1 = __right_->print(f+1, l);
6862 if (r >= n + sz1)
6863 {
6864 *f = '(';
6865 f += 1 + sz1;
6866 *f = ')';
6867 }
6868 return n + sz1;
6869 }
6870 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6871 {
6872 return __right_->fix_forward_references(t_begin, t_end);
6873 }
6874};
6875
6876class __cv_qualifiers
6877 : public __node
6878{
6879public:
6880 __cv_qualifiers(size_t cv, __node* type)
6881 {
6882 __left_ = type;
6883 __size_ = __left_->is_function() ? cv << 5 : cv;
6884 }
6885
6886 virtual size_t first_size() const
6887 {
6888 size_t s = __left_->first_size();
6889 if (__size_ & 4)
6890 s += sizeof(" restrict")-1;
6891 if (__size_ & 2)
6892 s += sizeof(" volatile")-1;
6893 if (__size_ & 1)
6894 s += sizeof(" const")-1;
6895 if (__size_ & 8)
6896 s += sizeof(" &")-1;
6897 if (__size_ & 16)
6898 s += sizeof(" &&")-1;
6899 return s;
6900 }
6901 virtual char* first_demangled_name(char* buf) const
6902 {
6903 buf = __left_->first_demangled_name(buf);
6904 if (__size_ & 1)
6905 {
6906 const size_t n = sizeof(" const")-1;
6907 strncpy(buf, " const", n);
6908 buf += n;
6909 }
6910 if (__size_ & 2)
6911 {
6912 const size_t n = sizeof(" volatile")-1;
6913 strncpy(buf, " volatile", n);
6914 buf += n;
6915 }
6916 if (__size_ & 4)
6917 {
6918 const size_t n = sizeof(" restrict")-1;
6919 strncpy(buf, " restrict", n);
6920 buf += n;
6921 }
6922 if (__size_ & 8)
6923 {
6924 *buf++ = ' ';
6925 *buf++ = '&';
6926 }
6927 if (__size_ & 16)
6928 {
6929 *buf++ = ' ';
6930 *buf++ = '&';
6931 *buf++ = '&';
6932 }
6933 return buf;
6934 }
6935 virtual ptrdiff_t print_first(char* f, char* l) const
6936 {
6937 const ptrdiff_t r = l - f;
6938 const ptrdiff_t sz = __left_->print_first(f, l);
6939 ptrdiff_t n = 0;
6940 if (__size_ & 0x1F)
6941 {
6942 if (__size_ & 1)
6943 {
6944 const ptrdiff_t d = sizeof(" const")-1;
6945 if (r >= sz + n + d)
6946 {
6947 char* t = f + sz + n;
6948 *t++ = ' ';
6949 *t++ = 'c';
6950 *t++ = 'o';
6951 *t++ = 'n';
6952 *t++ = 's';
6953 *t = 't';
6954 }
6955 n += d;
6956 }
6957 if (__size_ & 2)
6958 {
6959 const ptrdiff_t d = sizeof(" volatile")-1;
6960 if (r >= sz + n + d)
6961 {
6962 char* t = f + sz + n;
6963 *t++ = ' ';
6964 *t++ = 'v';
6965 *t++ = 'o';
6966 *t++ = 'l';
6967 *t++ = 'a';
6968 *t++ = 't';
6969 *t++ = 'i';
6970 *t++ = 'l';
6971 *t = 'e';
6972 }
6973 n += d;
6974 }
6975 if (__size_ & 4)
6976 {
6977 const ptrdiff_t d = sizeof(" restrict")-1;
6978 if (r >= sz + n + d)
6979 {
6980 char* t = f + sz + n;
6981 *t++ = ' ';
6982 *t++ = 'r';
6983 *t++ = 'e';
6984 *t++ = 's';
6985 *t++ = 't';
6986 *t++ = 'r';
6987 *t++ = 'i';
6988 *t++ = 'c';
6989 *t = 't';
6990 }
6991 n += d;
6992 }
6993 if (__size_ & 8)
6994 {
6995 const ptrdiff_t d = sizeof(" &")-1;
6996 if (r >= sz + n + d)
6997 {
6998 char* t = f + sz + n;
6999 *t++ = ' ';
7000 *t = '&';
7001 }
7002 n += d;
7003 }
7004 if (__size_ & 16)
7005 {
7006 const ptrdiff_t d = sizeof(" &&")-1;
7007 if (r >= sz + n + d)
7008 {
7009 char* t = f + sz + n;
7010 *t++ = ' ';
7011 *t++ = '&';
7012 *t = '&';
7013 }
7014 n += d;
7015 }
7016 }
7017 return n + sz;
7018 }
7019 virtual size_t second_size() const
7020 {
7021 size_t s = __left_->second_size();
7022 if (__size_ & 128)
7023 s += sizeof(" restrict")-1;
7024 if (__size_ & 64)
7025 s += sizeof(" volatile")-1;
7026 if (__size_ & 32)
7027 s += sizeof(" const")-1;
7028 if (__size_ & 256)
7029 s += sizeof(" &")-1;
7030 if (__size_ & 512)
7031 s += sizeof(" &&")-1;
7032 return s;
7033 }
7034 virtual char* second_demangled_name(char* buf) const
7035 {
7036 buf = __left_->second_demangled_name(buf);
7037 if (__size_ & 32)
7038 {
7039 const size_t n = sizeof(" const")-1;
7040 strncpy(buf, " const", n);
7041 buf += n;
7042 }
7043 if (__size_ & 64)
7044 {
7045 const size_t n = sizeof(" volatile")-1;
7046 strncpy(buf, " volatile", n);
7047 buf += n;
7048 }
7049 if (__size_ & 128)
7050 {
7051 const size_t n = sizeof(" restrict")-1;
7052 strncpy(buf, " restrict", n);
7053 buf += n;
7054 }
7055 if (__size_ & 256)
7056 {
7057 *buf++ = ' ';
7058 *buf++ = '&';
7059 }
7060 if (__size_ & 512)
7061 {
7062 *buf++ = ' ';
7063 *buf++ = '&';
7064 *buf++ = '&';
7065 }
7066 return buf;
7067 }
7068 virtual ptrdiff_t print_second(char* f, char* l) const
7069 {
7070 const ptrdiff_t r = l - f;
7071 const ptrdiff_t sz = __left_->print_second(f, l);
7072 ptrdiff_t n = 0;
7073 if (__size_ & 0x3E0)
7074 {
7075 if (__size_ & 32)
7076 {
7077 const ptrdiff_t d = sizeof(" const")-1;
7078 if (r >= sz + n + d)
7079 {
7080 char* t = f + sz + n;
7081 *t++ = ' ';
7082 *t++ = 'c';
7083 *t++ = 'o';
7084 *t++ = 'n';
7085 *t++ = 's';
7086 *t = 't';
7087 }
7088 n += d;
7089 }
7090 if (__size_ & 64)
7091 {
7092 const ptrdiff_t d = sizeof(" volatile")-1;
7093 if (r >= sz + n + d)
7094 {
7095 char* t = f + sz + n;
7096 *t++ = ' ';
7097 *t++ = 'v';
7098 *t++ = 'o';
7099 *t++ = 'l';
7100 *t++ = 'a';
7101 *t++ = 't';
7102 *t++ = 'i';
7103 *t++ = 'l';
7104 *t = 'e';
7105 }
7106 n += d;
7107 }
7108 if (__size_ & 128)
7109 {
7110 const ptrdiff_t d = sizeof(" restrict")-1;
7111 if (r >= sz + n + d)
7112 {
7113 char* t = f + sz + n;
7114 *t++ = ' ';
7115 *t++ = 'r';
7116 *t++ = 'e';
7117 *t++ = 's';
7118 *t++ = 't';
7119 *t++ = 'r';
7120 *t++ = 'i';
7121 *t++ = 'c';
7122 *t = 't';
7123 }
7124 n += d;
7125 }
7126 if (__size_ & 256)
7127 {
7128 const ptrdiff_t d = sizeof(" &")-1;
7129 if (r >= sz + n + d)
7130 {
7131 char* t = f + sz + n;
7132 *t++ = ' ';
7133 *t = '&';
7134 }
7135 n += d;
7136 }
7137 if (__size_ & 512)
7138 {
7139 const ptrdiff_t d = sizeof(" &&")-1;
7140 if (r >= sz + n + d)
7141 {
7142 char* t = f + sz + n;
7143 *t++ = ' ';
7144 *t++ = '&';
7145 *t = '&';
7146 }
7147 n += d;
7148 }
7149 }
7150 return n + sz;
7151 }
7152 virtual __node* base_name() const
7153 {
7154 return __left_->base_name();
7155 }
7156 virtual bool is_reference_or_pointer_to_function_or_array() const
7157 {
7158 return __left_->is_reference_or_pointer_to_function_or_array();
7159 }
7160 virtual bool is_function() const
7161 {
7162 return __left_->is_function();
7163 }
7164 virtual bool is_cv_qualifer() const
7165 {
7166 return true;
7167 }
7168 virtual __node* extract_cv(__node*& rt) const
7169 {
7170 if (rt == this)
7171 {
7172 rt = __left_;
7173 return const_cast<__node*>(static_cast<const __node*>(this));
7174 }
7175 return 0;
7176 }
7177 virtual bool ends_with_template() const
7178 {
7179 return __left_->ends_with_template();
7180 }
7181 virtual bool is_ctor_dtor_conv() const
7182 {
7183 return __left_->is_ctor_dtor_conv();
7184 }
7185 virtual bool is_array() const
7186 {
7187 return __left_->is_array();
7188 }
7189 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7190 {
7191 return __left_->fix_forward_references(t_begin, t_end);
7192 }
7193 virtual size_t list_len() const
7194 {
7195 return __left_->list_len();
7196 }
7197};
7198
7199class __extended_qualifier
7200 : public __node
7201{
7202public:
7203 __extended_qualifier(__node* name, __node* type)
7204 {
7205 __left_ = type;
7206 __right_ = name;
7207 __size_ = __left_->is_function() ? 1 : 0;
7208 }
7209
7210 virtual size_t first_size() const
7211 {
7212 size_t s = __left_->first_size();
7213 if (__size_ == 0)
7214 s += __right_->size() + 1;
7215 return s;
7216 }
7217 virtual char* first_demangled_name(char* buf) const
7218 {
7219 buf = __left_->first_demangled_name(buf);
7220 if (__size_ == 0)
7221 {
7222 *buf++ = ' ';
7223 buf = __right_->get_demangled_name(buf);
7224 }
7225 return buf;
7226 }
7227 virtual ptrdiff_t print_first(char* f, char* l) const
7228 {
7229 const ptrdiff_t r = l - f;
7230 const ptrdiff_t sz1 = __left_->print_first(f, l);
7231 ptrdiff_t sz2 = 0;
7232 ptrdiff_t n = 0;
7233 if (__size_ == 0)
7234 {
7235 if (r < sz1 + 1)
7236 return sz1 + 1 + __right_->print(l, l);
7237 sz2 = __right_->print(f+1+sz1, l);
7238 n = 1;
7239 f[sz1] = ' ';
7240 }
7241 return n + sz1 + sz2;
7242 }
7243 virtual size_t second_size() const
7244 {
7245 size_t s = __left_->second_size();
7246 if (__size_ == 1)
7247 s += __right_->size() + 1;
7248 return s;
7249 }
7250 virtual char* second_demangled_name(char* buf) const
7251 {
7252 buf = __left_->second_demangled_name(buf);
7253 if (__size_ == 1)
7254 {
7255 *buf++ = ' ';
7256 buf = __right_->get_demangled_name(buf);
7257 }
7258 return buf;
7259 }
7260 virtual ptrdiff_t print_second(char* f, char* l) const
7261 {
7262 const ptrdiff_t r = l - f;
7263 const ptrdiff_t sz1 = __left_->print_second(f, l);
7264 ptrdiff_t sz2 = 0;
7265 ptrdiff_t n = 0;
7266 if (__size_ == 1)
7267 {
7268 if (r < sz1 + 1)
7269 return sz1 + 1 + __right_->print(l, l);
7270 sz2 = __right_->print(f+1+sz1, l);
7271 n = 1;
7272 f[sz1] = ' ';
7273 }
7274 return n + sz1 + sz2;
7275 }
7276 virtual __node* base_name() const
7277 {
7278 return __left_->base_name();
7279 }
7280 virtual bool is_reference_or_pointer_to_function_or_array() const
7281 {
7282 return __left_->is_reference_or_pointer_to_function_or_array();
7283 }
7284 virtual bool is_function() const
7285 {
7286 return __left_->is_function();
7287 }
7288 virtual bool is_cv_qualifer() const
7289 {
7290 return true;
7291 }
7292 virtual __node* extract_cv(__node*& rt) const
7293 {
7294 if (rt == this)
7295 {
7296 rt = __left_;
7297 return const_cast<__node*>(static_cast<const __node*>(this));
7298 }
7299 return 0;
7300 }
7301 virtual bool ends_with_template() const
7302 {
7303 return __left_->ends_with_template();
7304 }
7305 virtual bool is_ctor_dtor_conv() const
7306 {
7307 return __left_->is_ctor_dtor_conv();
7308 }
7309 virtual bool is_array() const
7310 {
7311 return __left_->is_array();
7312 }
7313 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7314 {
7315 return __left_->fix_forward_references(t_begin, t_end);
7316 }
7317 virtual size_t list_len() const
7318 {
7319 return __left_->list_len();
7320 }
7321};
7322
7323class __function
7324 : public __node
7325{
7326public:
7327
7328 __function(__node* name, __node* signature, size_t ret_goes_first = true)
7329 {
7330 __size_ = ret_goes_first;
7331 __left_ = name;
7332 __right_ = signature;
7333 }
7334
7335 virtual size_t first_size() const
7336 {
7337 size_t off = 0;
7338 if (__size_)
7339 {
7340 off = __right_->first_size();
7341 if (off > 0 && (__left_ == NULL ||
7342 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7343 ++off;
7344 }
7345 else
7346 off = 5;
7347 if (__left_)
7348 off += __left_->first_size();
7349 else
7350 ++off;
7351 return off;
7352 }
7353
7354 virtual size_t second_size() const
7355 {
7356 size_t off = 0;
7357 if (__left_ == NULL)
7358 off = 1;
7359 off += __right_->second_size();
7360 if (!__size_)
7361 {
7362 off += 2;
7363 off += __right_->first_size();
7364 }
7365 return off;
7366 }
7367
7368 virtual char* first_demangled_name(char* buf) const
7369 {
7370 if (__size_)
7371 {
7372 const char* t = buf;
7373 buf = __right_->first_demangled_name(buf);
7374 if (buf != t && (__left_ == NULL ||
7375 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7376 *buf++ = ' ';
7377 }
7378 else
7379 {
7380 strncpy(buf, "auto ", 5);
7381 buf += 5;
7382 }
7383 if (__left_)
7384 buf = __left_->first_demangled_name(buf);
7385 else
7386 *buf++ = '(';
7387 return buf;
7388 }
7389 virtual ptrdiff_t print_first(char* f, char* l) const
7390 {
7391 const ptrdiff_t r = l - f;
7392 ptrdiff_t n = 0;
7393 ptrdiff_t sz1 = 0;
7394 ptrdiff_t sz2 = 0;
7395 if (__size_)
7396 {
7397 sz1 = __right_->print_first(f, l);
7398 if (sz1 != 0 && (__left_ == NULL ||
7399 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7400 {
7401 ++n;
7402 if (r >= sz1 + 1)
7403 f[sz1] = ' ';
7404 }
7405 }
7406 else
7407 {
7408 n = 5;
7409 if (r >= 5)
7410 {
7411 char* t = f;
7412 *t++ = 'a';
7413 *t++ = 'u';
7414 *t++ = 't';
7415 *t++ = 'o';
7416 *t++ = ' ';
7417 }
7418 }
7419 if (__left_)
7420 sz2 = __left_->print_first(f + std::min(n + sz1, r), l);
7421 else
7422 {
7423 ++n;
7424 if (r >= n + sz1)
7425 f[n+sz1-1] = '(';
7426 }
7427 return n + sz1 + sz2;
7428 }
7429
7430 virtual char* second_demangled_name(char* buf) const
7431 {
7432 if (__left_ == NULL)
7433 *buf++ = ')';
7434 buf = __right_->second_demangled_name(buf);
7435 if (!__size_)
7436 {
7437 *buf++ = '-';
7438 *buf++ = '>';
7439 buf = __right_->first_demangled_name(buf);
7440 }
7441 return buf;
7442 }
7443 virtual ptrdiff_t print_second(char* f, char* l) const
7444 {
7445 const ptrdiff_t r = l - f;
7446 ptrdiff_t n = 0;
7447 ptrdiff_t sz1 = 0;
7448 ptrdiff_t sz2 = 0;
7449 if (__left_ == NULL)
7450 {
7451 n = 1;
7452 if (r >= 1)
7453 *f = ')';
7454 }
7455 sz1 = __right_->print_second(f+std::min(r, n), l);
7456 if (!__size_)
7457 {
7458 if (r > n+sz1+1)
7459 {
7460 f[n+sz1] = '-';
7461 f[n+sz1+1] = '>';
7462 }
7463 n += 2;
7464 sz2 = __right_->print_first(f+std::min(r, n+sz1), l);
7465 }
7466 return n + sz1 + sz2;
7467 }
7468
Howard Hinnantf36e6a62011-08-12 17:33:10 +00007469 virtual char* get_demangled_name(char* buf) const
7470 {
7471 if (__size_)
7472 {
7473 const char* t = buf;
7474 buf = __right_->first_demangled_name(buf);
7475 if (buf != t && (__left_ == NULL ||
7476 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7477 *buf++ = ' ';
7478 }
7479 else
7480 {
7481 strncpy(buf, "auto ", 5);
7482 buf += 5;
7483 }
7484 if (__left_)
7485 buf = __left_->first_demangled_name(buf);
7486 buf = __right_->second_demangled_name(buf);
7487 if (!__size_)
7488 {
7489 *buf++ = '-';
7490 *buf++ = '>';
7491 buf = __right_->first_demangled_name(buf);
7492 }
7493 return buf;
7494 }
7495
7496 virtual size_t size() const
7497 {
7498 if (__cached_size_ == -1)
7499 {
7500 size_t off = 0;
7501 if (__size_)
7502 {
7503 off = __right_->first_size();
7504 if (off > 0 && (__left_ == NULL ||
7505 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7506 ++off;
7507 }
7508 else
7509 off = 5;
7510 if (__left_)
7511 off += __left_->first_size();
7512 off += __right_->second_size();
7513 if (!__size_)
7514 {
7515 off += 2;
7516 off += __right_->first_size();
7517 }
7518 const_cast<long&>(__cached_size_) = off;
7519 }
7520 return __cached_size_;
7521 }
7522
7523 virtual ptrdiff_t print(char* f, char* l) const
7524 {
7525 const ptrdiff_t r = l - f;
7526 ptrdiff_t n = 0;
7527 ptrdiff_t sz1 = 0;
7528 ptrdiff_t sz2 = 0;
7529 if (__size_)
7530 {
7531 sz1 = __right_->print_first(f, l);
7532 if (sz1 != 0 && (__left_ == NULL ||
7533 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7534 {
7535 ++n;
7536 if (r >= sz1 + 1)
7537 f[sz1] = ' ';
7538 }
7539 }
7540 else
7541 {
7542 n = 5;
7543 if (r >= 5)
7544 {
7545 char* t = f;
7546 *t++ = 'a';
7547 *t++ = 'u';
7548 *t++ = 't';
7549 *t++ = 'o';
7550 *t++ = ' ';
7551 }
7552 }
7553 if (__left_)
7554 sz2 = __left_->print_first(f + std::min(n + sz1, r), l);
7555 n += sz1 + sz2;
7556 sz2 = 0;
7557 sz1 = __right_->print_second(f+std::min(r, n), l);
7558 if (!__size_)
7559 {
7560 if (r > n+sz1+1)
7561 {
7562 f[n+sz1] = '-';
7563 f[n+sz1+1] = '>';
7564 }
7565 n += 2;
7566 sz2 = __right_->print_first(f+std::min(r, n+sz1), l);
7567 }
7568 return n + sz1 + sz2;
7569 }
7570
Howard Hinnant4fbf16a2011-05-05 15:27:28 +00007571 virtual bool is_function() const
7572 {
7573 return true;
7574 }
7575 virtual bool is_ctor_dtor_conv() const
7576 {
7577 return __left_->is_ctor_dtor_conv();
7578 }
7579 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7580 {
7581 bool r = true;
7582 if (__left_)
7583 r = r && __left_->fix_forward_references(t_begin, t_end);
7584 r = r && __right_->fix_forward_references(t_begin, t_end);
7585 return r;
7586 }
7587};
7588
7589class __function_signature
7590 : public __node
7591{
7592public:
7593 __function_signature(__node* ret, __node* args)
7594 {
7595 __left_ = ret;
7596 __right_ = args;
7597 }
7598 virtual size_t first_size() const
7599 {
7600 return __left_ ? __left_->first_size() : 0;
7601 }
7602
7603 virtual size_t second_size() const
7604 {
7605 return 2 + (__right_ ? __right_->size() : 0)
7606 + (__left_ ? __left_->second_size() : 0);
7607 }
7608
7609 virtual char* first_demangled_name(char* buf) const
7610 {
7611 if (__left_)
7612 buf = __left_->first_demangled_name(buf);
7613 return buf;
7614 }
7615 virtual ptrdiff_t print_first(char* f, char* l) const
7616 {
7617 return __left_ ? __left_->print_first(f, l) : 0;
7618 }
7619
7620 virtual char* second_demangled_name(char* buf) const
7621 {
7622 *buf++ = '(';
7623 if (__right_)
7624 buf = __right_->get_demangled_name(buf);
7625 *buf++ = ')';
7626 if (__left_)
7627 buf = __left_->second_demangled_name(buf);
7628 return buf;
7629 }
7630 virtual ptrdiff_t print_second(char* f, char* l) const
7631 {
7632 const ptrdiff_t r = l - f;
7633 const ptrdiff_t sz1 = __right_ ? __right_->print(f+std::min<ptrdiff_t>(1, r), l) : 0;
7634 const ptrdiff_t sz2 = __left_ ? __left_->print_second(f+std::min(2+sz1, r), l) : 0;
7635 if (r >= 2 + sz1 + sz2)
7636 {
7637 *f = '(';
7638 f += 1 + sz1;
7639 *f = ')';
7640 }
7641 return 2 + sz1 + sz2;
7642 }
7643 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7644 {
7645 bool r = true;
7646 if (__left_)
7647 r = r && __left_->fix_forward_references(t_begin, t_end);
7648 if (__right_)
7649 r = r && __right_->fix_forward_references(t_begin, t_end);
7650 return r;
7651 }
7652};
7653
7654class __pointer_to
7655 : public __node
7656{
7657public:
7658
7659 explicit __pointer_to(__node* type)
7660 {
7661 __left_ = type;
7662 }
7663 virtual size_t first_size() const
7664 {
7665 return __left_->first_size() + (__left_->is_array() ? 3 : 1);
7666 }
7667 virtual size_t second_size() const
7668 {
7669 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7670 }
7671 virtual char* first_demangled_name(char* buf) const
7672 {
7673 buf = __left_->first_demangled_name(buf);
7674 if (__left_->is_array())
7675 {
7676 *buf++ = ' ';
7677 *buf++ = '(';
7678 *buf++ = '*';
7679 }
7680 else
7681 *buf++ = '*';
7682 return buf;
7683 }
7684 virtual ptrdiff_t print_first(char* f, char* l) const
7685 {
7686 const ptrdiff_t r = l - f;
7687 const ptrdiff_t sz = __left_->print_first(f, l);
7688 ptrdiff_t n;
7689 if (__left_->is_array())
7690 {
7691 n = 3;
7692 if (r >= sz + n)
7693 {
7694 f += sz;
7695 *f++ = ' ';
7696 *f++ = '(';
7697 *f = '*';
7698 }
7699 }
7700 else
7701 {
7702 n = 1;
7703 if (r >= sz + n)
7704 f[sz] = '*';
7705 }
7706 return sz + n;
7707 }
7708 virtual char* second_demangled_name(char* buf) const
7709 {
7710 if (__left_->is_array())
7711 *buf++ = ')';
7712 return __left_->second_demangled_name(buf);
7713 }
7714 virtual ptrdiff_t print_second(char* f, char* l) const
7715 {
7716 const ptrdiff_t r = l - f;
7717 ptrdiff_t n = 0;
7718 if (__left_->is_array())
7719 {
7720 n = 1;
7721 if (r > n)
7722 *f = ')';
7723 }
7724 return __left_->print_second(f + std::min(n, r), l) + n;
7725 }
7726 virtual __node* base_name() const
7727 {
7728 return __left_->base_name();
7729 }
7730 virtual bool is_reference_or_pointer_to_function_or_array() const
7731 {
7732 return __left_->is_function() ||
7733 __left_->is_reference_or_pointer_to_function_or_array();
7734 }
7735 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7736 {
7737 return __left_->fix_forward_references(t_begin, t_end);
7738 }
7739 virtual size_t list_len() const
7740 {
7741 return __left_->list_len();
7742 }
7743};
7744
7745class __lvalue_reference_to
7746 : public __node
7747{
7748public:
7749
7750 explicit __lvalue_reference_to(__node* type)
7751 {
7752 __left_ = type;
7753 }
7754 virtual size_t first_size() const
7755 {
7756 return __left_->first_size() + (__left_->is_array() ? 3 : 1);
7757 }
7758 virtual size_t second_size() const
7759 {
7760 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7761 }
7762 virtual char* first_demangled_name(char* buf) const
7763 {
7764 buf = __left_->first_demangled_name(buf);
7765 if (__left_->is_array())
7766 {
7767 *buf++ = ' ';
7768 *buf++ = '(';
7769 *buf++ = '&';
7770 }
7771 else
7772 *buf++ = '&';
7773 return buf;
7774 }
7775 virtual ptrdiff_t print_first(char* f, char* l) const
7776 {
7777 const ptrdiff_t r = l - f;
7778 const ptrdiff_t sz = __left_->print_first(f, l);
7779 ptrdiff_t n;
7780 if (__left_->is_array())
7781 {
7782 n = 3;
7783 if (r >= sz + n)
7784 {
7785 f += sz;
7786 *f++ = ' ';
7787 *f++ = '(';
7788 *f = '&';
7789 }
7790 }
7791 else
7792 {
7793 n = 1;
7794 if (r >= sz + n)
7795 f[sz] = '&';
7796 }
7797 return sz + n;
7798 }
7799 virtual char* second_demangled_name(char* buf) const
7800 {
7801 if (__left_->is_array())
7802 *buf++ = ')';
7803 return __left_->second_demangled_name(buf);
7804 }
7805 virtual ptrdiff_t print_second(char* f, char* l) const
7806 {
7807 const ptrdiff_t r = l - f;
7808 ptrdiff_t n = 0;
7809 if (__left_->is_array())
7810 {
7811 n = 1;
7812 if (r > n)
7813 *f = ')';
7814 }
7815 return __left_->print_second(f + std::min(n, r), l) + n;
7816 }
7817 virtual __node* base_name() const
7818 {
7819 return __left_->base_name();
7820 }
7821 virtual bool is_reference_or_pointer_to_function_or_array() const
7822 {
7823 return __left_->is_function();
7824 }
7825 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7826 {
7827 return __left_->fix_forward_references(t_begin, t_end);
7828 }
7829 virtual size_t list_len() const
7830 {
7831 return __left_->list_len();
7832 }
7833};
7834
7835class __rvalue_reference_to
7836 : public __node
7837{
7838public:
7839
7840 explicit __rvalue_reference_to(__node* type)
7841 {
7842 __left_ = type;
7843 }
7844 virtual size_t first_size() const
7845 {
7846 return __left_->first_size() + (__left_->is_array() ? 4 : 2);
7847 }
7848 virtual size_t second_size() const
7849 {
7850 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7851 }
7852 virtual char* first_demangled_name(char* buf) const
7853 {
7854 buf = __left_->first_demangled_name(buf);
7855 if (__left_->is_array())
7856 {
7857 strncpy(buf, " (&&", 4);
7858 buf += 4;
7859 }
7860 else
7861 {
7862 *buf++ = '&';
7863 *buf++ = '&';
7864 }
7865 return buf;
7866 }
7867 virtual ptrdiff_t print_first(char* f, char* l) const
7868 {
7869 const ptrdiff_t r = l - f;
7870 const ptrdiff_t sz = __left_->print_first(f, l);
7871 ptrdiff_t n;
7872 if (__left_->is_array())
7873 {
7874 n = 4;
7875 if (r >= sz + n)
7876 {
7877 f += sz;
7878 *f++ = ' ';
7879 *f++ = '(';
7880 *f++ = '&';
7881 *f = '&';
7882 }
7883 }
7884 else
7885 {
7886 n = 2;
7887 if (r >= sz + n)
7888 {
7889 f += sz;
7890 *f++ = '&';
7891 *f = '&';
7892 }
7893 }
7894 return sz + n;
7895 }
7896 virtual char* second_demangled_name(char* buf) const
7897 {
7898 if (__left_->is_array())
7899 *buf++ = ')';
7900 return __left_->second_demangled_name(buf);
7901 }
7902 virtual ptrdiff_t print_second(char* f, char* l) const
7903 {
7904 const ptrdiff_t r = l - f;
7905 ptrdiff_t n = 0;
7906 if (__left_->is_array())
7907 {
7908 n = 1;
7909 if (r > n)
7910 *f = ')';
7911 }
7912 return __left_->print_second(f + std::min(n, r), l) + n;
7913 }
7914 virtual __node* base_name() const
7915 {
7916 return __left_->base_name();
7917 }
7918 virtual bool is_reference_or_pointer_to_function_or_array() const
7919 {
7920 return __left_->is_function();
7921 }
7922 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7923 {
7924 return __left_->fix_forward_references(t_begin, t_end);
7925 }
7926 virtual size_t list_len() const
7927 {
7928 return __left_->list_len();
7929 }
7930};
7931
7932class __d_complex
7933 : public __node
7934{
7935 static const size_t n = sizeof(" complex") - 1;
7936public:
7937
7938 explicit __d_complex(__node* type)
7939 {
7940 __left_ = type;
7941 }
7942 virtual size_t first_size() const
7943 {
7944 if (__cached_size_ == -1)
7945 const_cast<long&>(__cached_size_) = n + __left_->size();
7946 return __cached_size_;
7947 }
7948 virtual char* first_demangled_name(char* buf) const
7949 {
7950 buf = __left_->get_demangled_name(buf);
7951 strncpy(buf, " complex", n);
7952 return buf + n;
7953 }
7954 virtual ptrdiff_t print_first(char* f, char* l) const
7955 {
7956 const ptrdiff_t r = l - f;
7957 const ptrdiff_t sz = __left_->print(f, l);
7958 const ptrdiff_t n = sizeof(" complex") - 1;
7959 if (r >= sz + n)
7960 {
7961 f += sz;
7962 *f++ = ' ';
7963 *f++ = 'c';
7964 *f++ = 'o';
7965 *f++ = 'm';
7966 *f++ = 'p';
7967 *f++ = 'l';
7968 *f++ = 'e';
7969 *f = 'x';
7970 }
7971 return sz + n;
7972 }
7973 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7974 {
7975 return __left_->fix_forward_references(t_begin, t_end);
7976 }
7977};
7978
7979class __imaginary
7980 : public __node
7981{
7982 static const size_t n = sizeof(" imaginary") - 1;
7983public:
7984
7985 explicit __imaginary(__node* type)
7986 {
7987 __left_ = type;
7988 }
7989 virtual size_t first_size() const
7990 {
7991 if (__cached_size_ == -1)
7992 const_cast<long&>(__cached_size_) = n + __left_->size();
7993 return __cached_size_;
7994 }
7995 virtual char* first_demangled_name(char* buf) const
7996 {
7997 buf = __left_->get_demangled_name(buf);
7998 strncpy(buf, " imaginary", n);
7999 return buf + n;
8000 }
8001 virtual ptrdiff_t print_first(char* f, char* l) const
8002 {
8003 const ptrdiff_t r = l - f;
8004 const ptrdiff_t sz = __left_->print(f, l);
8005 const ptrdiff_t n = sizeof(" imaginary") - 1;
8006 if (r >= sz + n)
8007 {
8008 f += sz;
8009 *f++ = ' ';
8010 *f++ = 'i';
8011 *f++ = 'm';
8012 *f++ = 'a';
8013 *f++ = 'g';
8014 *f++ = 'i';
8015 *f++ = 'n';
8016 *f++ = 'a';
8017 *f++ = 'r';
8018 *f = 'y';
8019 }
8020 return sz + n;
8021 }
8022 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
8023 {
8024 return __left_->fix_forward_references(t_begin, t_end);
8025 }
8026};
8027
8028class __pack_expansion
8029 : public __node
8030{
8031public:
8032
8033 explicit __pack_expansion(__node* type)
8034 {
8035 __left_ = type;
8036 }
8037 virtual size_t first_size() const
8038 {
8039 if (__cached_size_ == -1)
8040 {
8041 size_t len = __left_->list_len();
8042 size_t off = 0;
8043 if (len != 0)
8044 {
8045 if (__left_->is_sub() || len == 1)
8046 off = __left_->size();
8047 else
8048 {
8049 __node* top = __left_;
8050 __node* bottom = top;
8051 while (!bottom->__left_->is_sub())
8052 bottom = bottom->__left_;
8053 __node* sub = bottom->__left_;
8054 __node* i = sub->__left_;
8055 bool first = true;
8056 top->reset_cached_size();
8057 while (i)
8058 {
8059 if (!first)
8060 off += 2;
8061 bottom->__left_ = i->__left_;
8062 off += top->size();
8063 top->reset_cached_size();
8064 i = i->__right_;
8065 first = false;
8066 }
8067 bottom->__left_ = sub;
8068 }
8069 }
8070 const_cast<long&>(__cached_size_) = off;
8071 }
8072 return __cached_size_;
8073 }
8074 virtual char* first_demangled_name(char* buf) const
8075 {
8076 size_t len = __left_->list_len();
8077 if (len != 0)
8078 {
8079 if (__left_->is_sub() || len == 1)
8080 buf = __left_->get_demangled_name(buf);
8081 else
8082 {
8083 __node* top = __left_;
8084 __node* bottom = top;
8085 while (!bottom->__left_->is_sub())
8086 bottom = bottom->__left_;
8087 __node* sub = bottom->__left_;
8088 __node* i = sub->__left_;
8089 bool first = true;
8090 top->reset_cached_size();
8091 while (i)
8092 {
8093 if (!first)
8094 {
8095 *buf++ = ',';
8096 *buf++ = ' ';
8097 }
8098 bottom->__left_ = i->__left_;
8099 buf = top->get_demangled_name(buf);
8100 top->reset_cached_size();
8101 i = i->__right_;
8102 first = false;
8103 }
8104 bottom->__left_ = sub;
8105 }
8106 }
8107 return buf;
8108 }
8109 virtual ptrdiff_t print_first(char* f, char* l) const
8110 {
8111 const ptrdiff_t r = l - f;
8112 const ptrdiff_t len = __left_->list_len();
8113 ptrdiff_t sz = 0;
8114 if (len != 0)
8115 {
8116 if (__left_->is_sub() || len == 1)
8117 sz = __left_->print(f, l);
8118 else
8119 {
8120 __node* top = __left_;
8121 __node* bottom = top;
8122 while (!bottom->__left_->is_sub())
8123 bottom = bottom->__left_;
8124 __node* sub = bottom->__left_;
8125 __node* i = sub->__left_;
8126 bool first = true;
8127 while (i)
8128 {
8129 if (!first)
8130 {
8131 if (r >= sz+2)
8132 {
8133 f[sz] = ',';
8134 f[sz+1] = ' ';
8135 }
8136 sz += 2;
8137 }
8138 bottom->__left_ = i->__left_;
8139 sz += top->print(f+std::min(sz, r), l);
8140 i = i->__right_;
8141 first = false;
8142 }
8143 bottom->__left_ = sub;
8144 }
8145 }
8146 return sz;
8147 }
8148 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
8149 {
8150 return __left_->fix_forward_references(t_begin, t_end);
8151 }
8152};
8153
8154class __void
8155 : public __node
8156{
8157 static const size_t n = sizeof("void") - 1;
8158public:
8159
8160 virtual size_t first_size() const {return n;}
8161 virtual char* first_demangled_name(char* buf) const
8162 {
8163 strncpy(buf, "void", n);
8164 return buf + n;
8165 }
8166 virtual ptrdiff_t print_first(char* f, char* l) const
8167 {
8168 const ptrdiff_t r = l - f;
8169 if (r >= n)
8170 {
8171 *f++ = 'v';
8172 *f++ = 'o';
8173 *f++ = 'i';
8174 *f = 'd';
8175 }
8176 return n;
8177 }
8178};
8179
8180class __wchar_t
8181 : public __node
8182{
8183 static const size_t n = sizeof("wchar_t") - 1;
8184public:
8185
8186 virtual size_t first_size() const {return n;}
8187 virtual char* first_demangled_name(char* buf) const
8188 {
8189 strncpy(buf, "wchar_t", n);
8190 return buf + n;
8191 }
8192 virtual ptrdiff_t print_first(char* f, char* l) const
8193 {
8194 const ptrdiff_t r = l - f;
8195 if (r >= n)
8196 {
8197 *f++ = 'w';
8198 *f++ = 'c';
8199 *f++ = 'h';
8200 *f++ = 'a';
8201 *f++ = 'r';
8202 *f++ = '_';
8203 *f = 't';
8204 }
8205 return n;
8206 }
8207};
8208
8209class __wchar_t_literal
8210 : public __node
8211{
8212public:
8213 explicit __wchar_t_literal(const char* __first, const char* __last)
8214 {
8215 __name_ = __first;
8216 __size_ = __last - __first;
8217 }
8218
8219 virtual size_t first_size() const
8220 {
8221 return __size_+9;
8222 }
8223 virtual char* first_demangled_name(char* buf) const
8224 {
8225 strncpy(buf, "(wchar_t)", 9);
8226 buf += 9;
8227 strncpy(buf, __name_, __size_);
8228 return buf + __size_;
8229 }
8230 virtual ptrdiff_t print_first(char* f, char* l) const
8231 {
8232 const ptrdiff_t r = l - f;
8233 const ptrdiff_t n = sizeof("(wchar_t)") - 1;
8234 if (r >= n + __size_)
8235 {
8236 *f++ = '(';
8237 *f++ = 'w';
8238 *f++ = 'c';
8239 *f++ = 'h';
8240 *f++ = 'a';
8241 *f++ = 'r';
8242 *f++ = '_';
8243 *f++ = 't';
8244 *f++ = ')';
8245 strncpy(f, __name_, __size_);
8246 }
8247 return n + __size_;
8248 }
8249};
8250
8251class __bool
8252 : public __node
8253{
8254 static const size_t n = sizeof("bool") - 1;
8255public:
8256
8257 virtual size_t first_size() const {return n;}
8258 virtual char* first_demangled_name(char* buf) const
8259 {
8260 strncpy(buf, "bool", n);
8261 return buf + n;
8262 }
8263 virtual ptrdiff_t print_first(char* f, char* l) const
8264 {
8265 const ptrdiff_t r = l - f;
8266 if (r >= n)
8267 {
8268 *f++ = 'b';
8269 *f++ = 'o';
8270 *f++ = 'o';
8271 *f = 'l';
8272 }
8273 return n;
8274 }
8275};
8276
8277class __bool_literal
8278 : public __node
8279{
8280public:
8281 explicit __bool_literal(const char* __name, unsigned __size)
8282 {
8283 __name_ = __name;
8284 __size_ = __size;
8285 }
8286
8287 virtual size_t first_size() const
8288 {
8289 return __size_;
8290 }
8291 virtual char* first_demangled_name(char* buf) const
8292 {
8293 strncpy(buf, __name_, __size_);
8294 return buf + __size_;
8295 }
8296 virtual ptrdiff_t print_first(char* f, char* l) const
8297 {
8298 const ptrdiff_t r = l - f;
8299 if (r >= __size_)
8300 strncpy(f, __name_, __size_);
8301 return __size_;
8302 }
8303};
8304
8305class __char
8306 : public __node
8307{
8308 static const size_t n = sizeof("char") - 1;
8309public:
8310
8311 virtual size_t first_size() const {return n;}
8312 virtual char* first_demangled_name(char* buf) const
8313 {
8314 strncpy(buf, "char", n);
8315 return buf + n;
8316 }
8317 virtual ptrdiff_t print_first(char* f, char* l) const
8318 {
8319 const ptrdiff_t r = l - f;
8320 if (r >= n)
8321 {
8322 *f++ = 'c';
8323 *f++ = 'h';
8324 *f++ = 'a';
8325 *f = 'r';
8326 }
8327 return n;
8328 }
8329};
8330
8331class __char_literal
8332 : public __node
8333{
8334public:
8335 explicit __char_literal(const char* __first, const char* __last)
8336 {
8337 __name_ = __first;
8338 __size_ = __last - __first;
8339 }
8340
8341 virtual size_t first_size() const
8342 {
8343 return __size_+6;
8344 }
8345 virtual char* first_demangled_name(char* buf) const
8346 {
8347 strncpy(buf, "(char)", 6);
8348 buf += 6;
8349 if (*__name_ == 'n')
8350 {
8351 *buf++ = '-'; // strncpy(buf+6, "-", 1);
8352 strncpy(buf, __name_+1, __size_-1);
8353 buf += __size_ - 1;
8354 }
8355 else
8356 {
8357 strncpy(buf, __name_, __size_);
8358 buf += __size_;
8359 }
8360 return buf;
8361 }
8362 virtual ptrdiff_t print_first(char* f, char* l) const
8363 {
8364 const ptrdiff_t r = l - f;
8365 const ptrdiff_t n = sizeof("(char)") - 1;
8366 if (r >= __size_ + n)
8367 {
8368 *f++ = '(';
8369 *f++ = 'c';
8370 *f++ = 'h';
8371 *f++ = 'a';
8372 *f++ = 'r';
8373 *f++ = ')';
8374 if (*__name_ == 'n')
8375 {
8376 *f++ = '-';
8377 strncpy(f, __name_+1, __size_-1);
8378 }
8379 else
8380 strncpy(f, __name_, __size_);
8381 }
8382 return __size_ + n;
8383 }
8384};
8385
8386class __signed_char
8387 : public __node
8388{
8389 static const size_t n = sizeof("signed char") - 1;
8390public:
8391
8392 virtual size_t first_size() const {return n;}
8393 virtual char* first_demangled_name(char* buf) const
8394 {
8395 strncpy(buf, "signed char", n);
8396 return buf + n;
8397 }
8398 virtual ptrdiff_t print_first(char* f, char* l) const
8399 {
8400 const ptrdiff_t r = l - f;
8401 if (r >= n)
8402 {
8403 *f++ = 's';
8404 *f++ = 'i';
8405 *f++ = 'g';
8406 *f++ = 'n';
8407 *f++ = 'e';
8408 *f++ = 'd';
8409 *f++ = ' ';
8410 *f++ = 'c';
8411 *f++ = 'h';
8412 *f++ = 'a';
8413 *f = 'r';
8414 }
8415 return n;
8416 }
8417};
8418
8419class __signed_char_literal
8420 : public __node
8421{
8422public:
8423 explicit __signed_char_literal(const char* __first, const char* __last)
8424 {
8425 __name_ = __first;
8426 __size_ = __last - __first;
8427 }
8428
8429 virtual size_t first_size() const
8430 {
8431 return __size_+13;
8432 }
8433 virtual char* first_demangled_name(char* buf) const
8434 {
8435 strncpy(buf, "(signed char)", 13);
8436 buf += 13;
8437 if (*__name_ == 'n')
8438 {
8439 *buf++ = '-';
8440 strncpy(buf, __name_+1, __size_-1);
8441 buf += __size_ - 1;
8442 }
8443 else
8444 {
8445 strncpy(buf, __name_, __size_);
8446 buf += __size_;
8447 }
8448 return buf;
8449 }
8450 virtual ptrdiff_t print_first(char* f, char* l) const
8451 {
8452 const ptrdiff_t r = l - f;
8453 const ptrdiff_t n = sizeof("(signed char)") - 1;
8454 if (r >= __size_ + n)
8455 {
8456 *f++ = '(';
8457 *f++ = 's';
8458 *f++ = 'i';
8459 *f++ = 'g';
8460 *f++ = 'n';
8461 *f++ = 'e';
8462 *f++ = 'd';
8463 *f++ = ' ';
8464 *f++ = 'c';
8465 *f++ = 'h';
8466 *f++ = 'a';
8467 *f++ = 'r';
8468 *f++ = ')';
8469 if (*__name_ == 'n')
8470 {
8471 *f++ = '-';
8472 strncpy(f, __name_+1, __size_-1);
8473 }
8474 else
8475 strncpy(f, __name_, __size_);
8476 }
8477 return __size_ + n;
8478 }
8479};
8480
8481class __unsigned_char
8482 : public __node
8483{
8484 static const size_t n = sizeof("unsigned char") - 1;
8485public:
8486
8487 virtual size_t first_size() const {return n;}
8488 virtual char* first_demangled_name(char* buf) const
8489 {
8490 strncpy(buf, "unsigned char", n);
8491 return buf + n;
8492 }
8493 virtual ptrdiff_t print_first(char* f, char* l) const
8494 {
8495 const ptrdiff_t r = l - f;
8496 if (r >= n)
8497 {
8498 *f++ = 'u';
8499 *f++ = 'n';
8500 *f++ = 's';
8501 *f++ = 'i';
8502 *f++ = 'g';
8503 *f++ = 'n';
8504 *f++ = 'e';
8505 *f++ = 'd';
8506 *f++ = ' ';
8507 *f++ = 'c';
8508 *f++ = 'h';
8509 *f++ = 'a';
8510 *f = 'r';
8511 }
8512 return n;
8513 }
8514};
8515
8516class __unsigned_char_literal
8517 : public __node
8518{
8519public:
8520 explicit __unsigned_char_literal(const char* __first, const char* __last)
8521 {
8522 __name_ = __first;
8523 __size_ = __last - __first;
8524 }
8525
8526 virtual size_t first_size() const
8527 {
8528 return __size_+15;
8529 }
8530 virtual char* first_demangled_name(char* buf) const
8531 {
8532 strncpy(buf, "(unsigned char)", 15);
8533 buf += 15;
8534 strncpy(buf, __name_, __size_);
8535 return buf + __size_;
8536 }
8537 virtual ptrdiff_t print_first(char* f, char* l) const
8538 {
8539 const ptrdiff_t r = l - f;
8540 const ptrdiff_t n = sizeof("(unsigned char)") - 1;
8541 if (r >= __size_ + n)
8542 {
8543 *f++ = '(';
8544 *f++ = 'u';
8545 *f++ = 'n';
8546 *f++ = 's';
8547 *f++ = 'i';
8548 *f++ = 'g';
8549 *f++ = 'n';
8550 *f++ = 'e';
8551 *f++ = 'd';
8552 *f++ = ' ';
8553 *f++ = 'c';
8554 *f++ = 'h';
8555 *f++ = 'a';
8556 *f++ = 'r';
8557 *f++ = ')';
8558 strncpy(f, __name_, __size_);
8559 }
8560 return __size_ + n;
8561 }
8562};
8563
8564class __short
8565 : public __node
8566{
8567 static const size_t n = sizeof("short") - 1;
8568public:
8569
8570 virtual size_t first_size() const {return n;}
8571 virtual char* first_demangled_name(char* buf) const
8572 {
8573 strncpy(buf, "short", n);
8574 return buf + n;
8575 }
8576 virtual ptrdiff_t print_first(char* f, char* l) const
8577 {
8578 const ptrdiff_t r = l - f;
8579 if (r >= n)
8580 {
8581 *f++ = 's';
8582 *f++ = 'h';
8583 *f++ = 'o';
8584 *f++ = 'r';
8585 *f = 't';
8586 }
8587 return n;
8588 }
8589};
8590
8591class __short_literal
8592 : public __node
8593{
8594public:
8595 explicit __short_literal(const char* __first, const char* __last)
8596 {
8597 __name_ = __first;
8598 __size_ = __last - __first;
8599 }
8600
8601 virtual size_t first_size() const
8602 {
8603 return __size_+7;
8604 }
8605 virtual char* first_demangled_name(char* buf) const
8606 {
8607 strncpy(buf, "(short)", 7);
8608 buf += 7;
8609 if (*__name_ == 'n')
8610 {
8611 *buf++ = '-';
8612 strncpy(buf, __name_+1, __size_-1);
8613 buf += __size_ - 1;
8614 }
8615 else
8616 {
8617 strncpy(buf, __name_, __size_);
8618 buf += __size_;
8619 }
8620 return buf;
8621 }
8622 virtual ptrdiff_t print_first(char* f, char* l) const
8623 {
8624 const ptrdiff_t r = l - f;
8625 const ptrdiff_t n = sizeof("(short)") - 1;
8626 if (r >= __size_ + n)
8627 {
8628 *f++ = '(';
8629 *f++ = 's';
8630 *f++ = 'h';
8631 *f++ = 'o';
8632 *f++ = 'r';
8633 *f++ = 't';
8634 *f++ = ')';
8635 if (*__name_ == 'n')
8636 {
8637 *f++ = '-';
8638 strncpy(f, __name_+1, __size_-1);
8639 }
8640 else
8641 strncpy(f, __name_, __size_);
8642 }
8643 return __size_ + n;
8644 }
8645};
8646
8647class __unsigned_short
8648 : public __node
8649{
8650 static const size_t n = sizeof("unsigned short") - 1;
8651public:
8652
8653 virtual size_t first_size() const {return n;}
8654 virtual char* first_demangled_name(char* buf) const
8655 {
8656 strncpy(buf, "unsigned short", n);
8657 return buf + n;
8658 }
8659 virtual ptrdiff_t print_first(char* f, char* l) const
8660 {
8661 const ptrdiff_t r = l - f;
8662 if (r >= n)
8663 {
8664 *f++ = 'u';
8665 *f++ = 'n';
8666 *f++ = 's';
8667 *f++ = 'i';
8668 *f++ = 'g';
8669 *f++ = 'n';
8670 *f++ = 'e';
8671 *f++ = 'd';
8672 *f++ = ' ';
8673 *f++ = 's';
8674 *f++ = 'h';
8675 *f++ = 'o';
8676 *f++ = 'r';
8677 *f = 't';
8678 }
8679 return n;
8680 }
8681};
8682
8683class __unsigned_short_literal
8684 : public __node
8685{
8686public:
8687 explicit __unsigned_short_literal(const char* __first, const char* __last)
8688 {
8689 __name_ = __first;
8690 __size_ = __last - __first;
8691 }
8692
8693 virtual size_t first_size() const
8694 {
8695 return __size_+16;
8696 }
8697 virtual char* first_demangled_name(char* buf) const
8698 {
8699 strncpy(buf, "(unsigned short)", 16);
8700 buf += 16;
8701 strncpy(buf, __name_, __size_);
8702 return buf + __size_;
8703 }
8704 virtual ptrdiff_t print_first(char* f, char* l) const
8705 {
8706 const ptrdiff_t r = l - f;
8707 const ptrdiff_t n = sizeof("(unsigned short)") - 1;
8708 if (r >= __size_ + n)
8709 {
8710 *f++ = '(';
8711 *f++ = 'u';
8712 *f++ = 'n';
8713 *f++ = 's';
8714 *f++ = 'i';
8715 *f++ = 'g';
8716 *f++ = 'n';
8717 *f++ = 'e';
8718 *f++ = 'd';
8719 *f++ = ' ';
8720 *f++ = 's';
8721 *f++ = 'h';
8722 *f++ = 'o';
8723 *f++ = 'r';
8724 *f++ = 't';
8725 *f++ = ')';
8726 strncpy(f, __name_, __size_);
8727 }
8728 return __size_ + n;
8729 }
8730};
8731
8732class __int
8733 : public __node
8734{
8735 static const size_t n = sizeof("int") - 1;
8736public:
8737
8738 virtual size_t first_size() const {return n;}
8739 virtual char* first_demangled_name(char* buf) const
8740 {
8741 *buf++ = 'i';
8742 *buf++ = 'n';
8743 *buf++ = 't';
8744 return buf;
8745 }
8746 virtual ptrdiff_t print_first(char* f, char* l) const
8747 {
8748 const ptrdiff_t r = l - f;
8749 if (r >= n)
8750 {
8751 *f++ = 'i';
8752 *f++ = 'n';
8753 *f = 't';
8754 }
8755 return n;
8756 }
8757};
8758
8759class __int_literal
8760 : public __node
8761{
8762public:
8763 explicit __int_literal(const char* __first, const char* __last)
8764 {
8765 __name_ = __first;
8766 __size_ = __last - __first;
8767 }
8768
8769 virtual size_t first_size() const
8770 {
8771 return __size_;
8772 }
8773 virtual char* first_demangled_name(char* buf) const
8774 {
8775 if (*__name_ == 'n')
8776 {
8777 *buf++ = '-';
8778 strncpy(buf, __name_+1, __size_-1);
8779 buf += __size_ - 1;
8780 }
8781 else
8782 {
8783 strncpy(buf, __name_, __size_);
8784 buf += __size_;
8785 }
8786 return buf;
8787 }
8788 virtual ptrdiff_t print_first(char* f, char* l) const
8789 {
8790 const ptrdiff_t r = l - f;
8791 if (r >= __size_)
8792 {
8793 if (*__name_ == 'n')
8794 {
8795 *f++ = '-';
8796 strncpy(f, __name_+1, __size_-1);
8797 }
8798 else
8799 strncpy(f, __name_, __size_);
8800 }
8801 return __size_;
8802 }
8803};
8804
8805class __unsigned_int
8806 : public __node
8807{
8808 static const size_t n = sizeof("unsigned int") - 1;
8809public:
8810
8811 virtual size_t first_size() const {return n;}
8812 virtual char* first_demangled_name(char* buf) const
8813 {
8814 strncpy(buf, "unsigned int", n);
8815 return buf + n;
8816 }
8817 virtual ptrdiff_t print_first(char* f, char* l) const
8818 {
8819 const ptrdiff_t r = l - f;
8820 if (r >= n)
8821 {
8822 *f++ = 'u';
8823 *f++ = 'n';
8824 *f++ = 's';
8825 *f++ = 'i';
8826 *f++ = 'g';
8827 *f++ = 'n';
8828 *f++ = 'e';
8829 *f++ = 'd';
8830 *f++ = ' ';
8831 *f++ = 'i';
8832 *f++ = 'n';
8833 *f = 't';
8834 }
8835 return n;
8836 }
8837};
8838
8839class __unsigned_int_literal
8840 : public __node
8841{
8842public:
8843 explicit __unsigned_int_literal(const char* __first, const char* __last)
8844 {
8845 __name_ = __first;
8846 __size_ = __last - __first;
8847 }
8848
8849 virtual size_t first_size() const
8850 {
8851 return __size_+1;
8852 }
8853 virtual char* first_demangled_name(char* buf) const
8854 {
8855 strncpy(buf, __name_, __size_);
8856 buf += __size_;
8857 *buf++ = 'u';
8858 return buf;
8859 }
8860 virtual ptrdiff_t print_first(char* f, char* l) const
8861 {
8862 const ptrdiff_t r = l - f;
8863 const ptrdiff_t n = sizeof("u") - 1;
8864 if (r >= __size_ + n)
8865 {
8866 strncpy(f, __name_, __size_);
8867 f[__size_] = 'u';
8868 }
8869 return __size_ + n;
8870 }
8871};
8872
8873class __long
8874 : public __node
8875{
8876 static const size_t n = sizeof("long") - 1;
8877public:
8878
8879 virtual size_t first_size() const {return n;}
8880 virtual char* first_demangled_name(char* buf) const
8881 {
8882 strncpy(buf, "long", n);
8883 return buf + n;
8884 }
8885 virtual ptrdiff_t print_first(char* f, char* l) const
8886 {
8887 const ptrdiff_t r = l - f;
8888 if (r >= n)
8889 {
8890 *f++ = 'l';
8891 *f++ = 'o';
8892 *f++ = 'n';
8893 *f = 'g';
8894 }
8895 return n;
8896 }
8897};
8898
8899class __long_literal
8900 : public __node
8901{
8902public:
8903 explicit __long_literal(const char* __first, const char* __last)
8904 {
8905 __name_ = __first;
8906 __size_ = __last - __first;
8907 }
8908
8909 virtual size_t first_size() const
8910 {
8911 return __size_+1;
8912 }
8913 virtual char* first_demangled_name(char* buf) const
8914 {
8915 if (*__name_ == 'n')
8916 {
8917 *buf++ = '-'; // strncpy(buf, "-", 1);
8918 strncpy(buf, __name_+1, __size_-1);
8919 buf += __size_ - 1;
8920 }
8921 else
8922 {
8923 strncpy(buf, __name_, __size_);
8924 buf += __size_;
8925 }
8926 *buf++ = 'l';
8927 return buf;
8928 }
8929 virtual ptrdiff_t print_first(char* f, char* l) const
8930 {
8931 const ptrdiff_t r = l - f;
8932 const ptrdiff_t n = sizeof("l") - 1;
8933 if (r >= __size_ + n)
8934 {
8935 if (*__name_ == 'n')
8936 {
8937 *f++ = '-';
8938 strncpy(f, __name_+1, __size_-1);
8939 f += __size_-1;
8940 }
8941 else
8942 {
8943 strncpy(f, __name_, __size_);
8944 f += __size_;
8945 }
8946 *f = 'l';
8947 }
8948 return __size_ + n;
8949 }
8950};
8951
8952class __unsigned_long
8953 : public __node
8954{
8955 static const size_t n = sizeof("unsigned long") - 1;
8956public:
8957
8958 virtual size_t first_size() const {return n;}
8959 virtual char* first_demangled_name(char* buf) const
8960 {
8961 strncpy(buf, "unsigned long", n);
8962 return buf + n;
8963 }
8964 virtual ptrdiff_t print_first(char* f, char* l) const
8965 {
8966 const ptrdiff_t r = l - f;
8967 if (r >= n)
8968 {
8969 *f++ = 'u';
8970 *f++ = 'n';
8971 *f++ = 's';
8972 *f++ = 'i';
8973 *f++ = 'g';
8974 *f++ = 'n';
8975 *f++ = 'e';
8976 *f++ = 'd';
8977 *f++ = ' ';
8978 *f++ = 'l';
8979 *f++ = 'o';
8980 *f++ = 'n';
8981 *f = 'g';
8982 }
8983 return n;
8984 }
8985};
8986
8987class __unsigned_long_literal
8988 : public __node
8989{
8990public:
8991 explicit __unsigned_long_literal(const char* __first, const char* __last)
8992 {
8993 __name_ = __first;
8994 __size_ = __last - __first;
8995 }
8996
8997 virtual size_t first_size() const
8998 {
8999 return __size_+2;
9000 }
9001 virtual char* first_demangled_name(char* buf) const
9002 {
9003 strncpy(buf, __name_, __size_);
9004 buf += __size_;
9005 *buf++ = 'u';
9006 *buf++ = 'l';
9007 return buf;
9008 }
9009 virtual ptrdiff_t print_first(char* f, char* l) const
9010 {
9011 const ptrdiff_t r = l - f;
9012 const ptrdiff_t n = sizeof("ul") - 1;
9013 if (r >= __size_ + n)
9014 {
9015 strncpy(f, __name_, __size_);
9016 f += __size_;
9017 *f++ = 'u';
9018 *f = 'l';
9019 }
9020 return __size_ + n;
9021 }
9022};
9023
9024class __long_long
9025 : public __node
9026{
9027 static const size_t n = sizeof("long long") - 1;
9028public:
9029
9030 virtual size_t first_size() const {return n;}
9031 virtual char* first_demangled_name(char* buf) const
9032 {
9033 strncpy(buf, "long long", n);
9034 return buf + n;
9035 }
9036 virtual ptrdiff_t print_first(char* f, char* l) const
9037 {
9038 const ptrdiff_t r = l - f;
9039 if (r >= n)
9040 {
9041 *f++ = 'l';
9042 *f++ = 'o';
9043 *f++ = 'n';
9044 *f++ = 'g';
9045 *f++ = ' ';
9046 *f++ = 'l';
9047 *f++ = 'o';
9048 *f++ = 'n';
9049 *f = 'g';
9050 }
9051 return n;
9052 }
9053};
9054
9055class __long_long_literal
9056 : public __node
9057{
9058public:
9059 explicit __long_long_literal(const char* __first, const char* __last)
9060 {
9061 __name_ = __first;
9062 __size_ = __last - __first;
9063 }
9064
9065 virtual size_t first_size() const
9066 {
9067 return __size_+2;
9068 }
9069 virtual char* first_demangled_name(char* buf) const
9070 {
9071 if (*__name_ == 'n')
9072 {
9073 *buf++ = '-';
9074 strncpy(buf, __name_+1, __size_-1);
9075 buf += __size_ - 1;
9076 }
9077 else
9078 {
9079 strncpy(buf, __name_, __size_);
9080 buf += __size_;
9081 }
9082 *buf++ = 'l';
9083 *buf++ = 'l';
9084 return buf;
9085 }
9086 virtual ptrdiff_t print_first(char* f, char* l) const
9087 {
9088 const ptrdiff_t r = l - f;
9089 const ptrdiff_t n = sizeof("ll") - 1;
9090 if (r >= __size_ + n)
9091 {
9092 if (*__name_ == 'n')
9093 {
9094 *f++ = '-';
9095 strncpy(f, __name_+1, __size_-1);
9096 f += __size_-1;
9097 }
9098 else
9099 {
9100 strncpy(f, __name_, __size_);
9101 f += __size_;
9102 }
9103 *f++ = 'l';
9104 *f = 'l';
9105 }
9106 return __size_ + n;
9107 }
9108};
9109
9110class __unsigned_long_long
9111 : public __node
9112{
9113 static const size_t n = sizeof("unsigned long long") - 1;
9114public:
9115
9116 virtual size_t first_size() const {return n;}
9117 virtual char* first_demangled_name(char* buf) const
9118 {
9119 strncpy(buf, "unsigned long long", n);
9120 return buf + n;
9121 }
9122 virtual ptrdiff_t print_first(char* f, char* l) const
9123 {
9124 const ptrdiff_t r = l - f;
9125 if (r >= n)
9126 {
9127 *f++ = 'u';
9128 *f++ = 'n';
9129 *f++ = 's';
9130 *f++ = 'i';
9131 *f++ = 'g';
9132 *f++ = 'n';
9133 *f++ = 'e';
9134 *f++ = 'd';
9135 *f++ = ' ';
9136 *f++ = 'l';
9137 *f++ = 'o';
9138 *f++ = 'n';
9139 *f++ = 'g';
9140 *f++ = ' ';
9141 *f++ = 'l';
9142 *f++ = 'o';
9143 *f++ = 'n';
9144 *f = 'g';
9145 }
9146 return n;
9147 }
9148};
9149
9150class __unsigned_long_long_literal
9151 : public __node
9152{
9153public:
9154 explicit __unsigned_long_long_literal(const char* __first, const char* __last)
9155 {
9156 __name_ = __first;
9157 __size_ = __last - __first;
9158 }
9159
9160 virtual size_t first_size() const
9161 {
9162 return __size_+3;
9163 }
9164 virtual char* first_demangled_name(char* buf) const
9165 {
9166 strncpy(buf, __name_, __size_);
9167 buf += __size_;
9168 *buf++ = 'u';
9169 *buf++ = 'l';
9170 *buf++ = 'l';
9171 return buf;
9172 }
9173 virtual ptrdiff_t print_first(char* f, char* l) const
9174 {
9175 const ptrdiff_t r = l - f;
9176 const ptrdiff_t n = sizeof("ull") - 1;
9177 if (r >= __size_ + n)
9178 {
9179 strncpy(f, __name_, __size_);
9180 f += __size_;
9181 *f++ = 'u';
9182 *f++ = 'l';
9183 *f = 'l';
9184 }
9185 return __size_ + n;
9186 }
9187};
9188
9189class __int128
9190 : public __node
9191{
9192 static const size_t n = sizeof("__int128") - 1;
9193public:
9194
9195 virtual size_t first_size() const {return n;}
9196 virtual char* first_demangled_name(char* buf) const
9197 {
9198 strncpy(buf, "__int128", n);
9199 return buf + n;
9200 }
9201 virtual ptrdiff_t print_first(char* f, char* l) const
9202 {
9203 const ptrdiff_t r = l - f;
9204 if (r >= n)
9205 {
9206 *f++ = '_';
9207 *f++ = '_';
9208 *f++ = 'i';
9209 *f++ = 'n';
9210 *f++ = 't';
9211 *f++ = '1';
9212 *f++ = '2';
9213 *f = '8';
9214 }
9215 return n;
9216 }
9217};
9218
9219class __int128_literal
9220 : public __node
9221{
9222public:
9223 explicit __int128_literal(const char* __first, const char* __last)
9224 {
9225 __name_ = __first;
9226 __size_ = __last - __first;
9227 }
9228
9229 virtual size_t first_size() const
9230 {
9231 return __size_+10;
9232 }
9233 virtual char* first_demangled_name(char* buf) const
9234 {
9235 strncpy(buf, "(__int128)", 10);
9236 buf += 10;
9237 if (*__name_ == 'n')
9238 {
9239 *buf++ = '-';
9240 strncpy(buf, __name_+1, __size_-1);
9241 buf += __size_ - 1;
9242 }
9243 else
9244 {
9245 strncpy(buf, __name_, __size_);
9246 buf += __size_;
9247 }
9248 return buf;
9249 }
9250 virtual ptrdiff_t print_first(char* f, char* l) const
9251 {
9252 const ptrdiff_t r = l - f;
9253 const ptrdiff_t n = sizeof("(__int128)") - 1;
9254 if (r >= __size_ + n)
9255 {
9256 *f++ = '(';
9257 *f++ = '_';
9258 *f++ = '_';
9259 *f++ = 'i';
9260 *f++ = 'n';
9261 *f++ = 't';
9262 *f++ = '1';
9263 *f++ = '2';
9264 *f++ = '8';
9265 *f = ')';
9266 if (*__name_ == 'n')
9267 {
9268 *f++ = '-';
9269 strncpy(f, __name_+1, __size_-1);
9270 }
9271 else
9272 strncpy(f, __name_, __size_);
9273 }
9274 return __size_ + n;
9275 }
9276};
9277
9278class __unsigned_int128
9279 : public __node
9280{
9281 static const size_t n = sizeof("unsigned __int128") - 1;
9282public:
9283
9284 virtual size_t first_size() const {return n;}
9285 virtual char* first_demangled_name(char* buf) const
9286 {
9287 strncpy(buf, "unsigned __int128", n);
9288 return buf + n;
9289 }
9290 virtual ptrdiff_t print_first(char* f, char* l) const
9291 {
9292 const ptrdiff_t r = l - f;
9293 if (r >= n)
9294 {
9295 *f++ = 'u';
9296 *f++ = 'n';
9297 *f++ = 's';
9298 *f++ = 'i';
9299 *f++ = 'g';
9300 *f++ = 'n';
9301 *f++ = 'e';
9302 *f++ = 'd';
9303 *f++ = ' ';
9304 *f++ = '_';
9305 *f++ = '_';
9306 *f++ = 'i';
9307 *f++ = 'n';
9308 *f++ = 't';
9309 *f++ = '1';
9310 *f++ = '2';
9311 *f = '8';
9312 }
9313 return n;
9314 }
9315};
9316
9317class __unsigned_int128_literal
9318 : public __node
9319{
9320public:
9321 explicit __unsigned_int128_literal(const char* __first, const char* __last)
9322 {
9323 __name_ = __first;
9324 __size_ = __last - __first;
9325 }
9326
9327 virtual size_t first_size() const
9328 {
9329 return __size_+19;
9330 }
9331 virtual char* first_demangled_name(char* buf) const
9332 {
9333 strncpy(buf, "(unsigned __int128)", 19);
9334 buf += 19;
9335 strncpy(buf, __name_, __size_);
9336 return buf + __size_;
9337 }
9338 virtual ptrdiff_t print_first(char* f, char* l) const
9339 {
9340 const ptrdiff_t r = l - f;
9341 const ptrdiff_t n = sizeof("(unsigned __int128)") - 1;
9342 if (r >= __size_ + n)
9343 {
9344 *f++ = '(';
9345 *f++ = 'u';
9346 *f++ = 'n';
9347 *f++ = 's';
9348 *f++ = 'i';
9349 *f++ = 'g';
9350 *f++ = 'n';
9351 *f++ = 'e';
9352 *f++ = 'd';
9353 *f++ = ' ';
9354 *f++ = '_';
9355 *f++ = '_';
9356 *f++ = 'i';
9357 *f++ = 'n';
9358 *f++ = 't';
9359 *f++ = '1';
9360 *f++ = '2';
9361 *f++ = '8';
9362 *f = ')';
9363 strncpy(f, __name_, __size_);
9364 }
9365 return __size_ + n;
9366 }
9367};
9368
9369class __float_literal
9370 : public __node
9371{
9372public:
9373 explicit __float_literal(float value)
9374 {
9375 __value_ = value;
9376 }
9377
9378 virtual size_t first_size() const
9379 {
9380 if (__cached_size_ == -1)
9381 {
9382 char num[20] = {0};
9383 float v = static_cast<float>(__value_);
9384 const_cast<long&>(__cached_size_) = sprintf(num, "%a", v)+1;
9385 }
9386 return __cached_size_;
9387 }
9388 virtual char* first_demangled_name(char* buf) const
9389 {
9390 char num[20] = {0};
9391 float v = static_cast<float>(__value_);
9392 int n = sprintf(num, "%a", v);
9393 strncpy(buf, num, n);
9394 buf += n;
9395 *buf++ = 'f';
9396 return buf;
9397 }
9398 virtual ptrdiff_t print_first(char* f, char* l) const
9399 {
9400 const ptrdiff_t r = l - f;
9401 char num[20] = {0};
9402 float v = static_cast<float>(__value_);
9403 ptrdiff_t n = sprintf(num, "%a", v);
9404 if (r >= n+1)
9405 {
9406 strncpy(f, num, n);
9407 f[n] = 'f';
9408 }
9409 ++n;
9410 return n;
9411 }
9412};
9413
9414class __float
9415 : public __node
9416{
9417 static const size_t n = sizeof("float") - 1;
9418public:
9419
9420 virtual size_t first_size() const {return n;}
9421 virtual char* first_demangled_name(char* buf) const
9422 {
9423 strncpy(buf, "float", n);
9424 return buf + n;
9425 }
9426 virtual ptrdiff_t print_first(char* f, char* l) const
9427 {
9428 const ptrdiff_t r = l - f;
9429 if (r >= n)
9430 {
9431 *f++ = 'f';
9432 *f++ = 'l';
9433 *f++ = 'o';
9434 *f++ = 'a';
9435 *f = 't';
9436 }
9437 return n;
9438 }
9439};
9440
9441class __double_literal
9442 : public __node
9443{
9444public:
9445 explicit __double_literal(double value)
9446 {
9447 __value_ = value;
9448 }
9449
9450 virtual size_t first_size() const
9451 {
9452 if (__cached_size_ == -1)
9453 {
9454 char num[30] = {0};
9455 double v = static_cast<double>(__value_);
9456 const_cast<long&>(__cached_size_) = sprintf(num, "%a", v);
9457 }
9458 return __cached_size_;
9459 }
9460 virtual char* first_demangled_name(char* buf) const
9461 {
9462 char num[30] = {0};
9463 double v = static_cast<double>(__value_);
9464 int n = sprintf(num, "%a", v);
9465 strncpy(buf, num, n);
9466 return buf + n;
9467 }
9468 virtual ptrdiff_t print_first(char* f, char* l) const
9469 {
9470 const ptrdiff_t r = l - f;
9471 char num[30] = {0};
9472 double v = static_cast<double>(__value_);
9473 const ptrdiff_t n = sprintf(num, "%a", v);
9474 if (r >= n)
9475 strncpy(f, num, n);
9476 return n;
9477 }
9478};
9479
9480class __double
9481 : public __node
9482{
9483 static const size_t n = sizeof("double") - 1;
9484public:
9485
9486 virtual size_t first_size() const {return n;}
9487 virtual char* first_demangled_name(char* buf) const
9488 {
9489 strncpy(buf, "double", n);
9490 return buf + n;
9491 }
9492 virtual ptrdiff_t print_first(char* f, char* l) const
9493 {
9494 const ptrdiff_t r = l - f;
9495 if (r >= n)
9496 {
9497 *f++ = 'd';
9498 *f++ = 'o';
9499 *f++ = 'u';
9500 *f++ = 'b';
9501 *f++ = 'l';
9502 *f = 'e';
9503 }
9504 return n;
9505 }
9506};
9507
9508class __long_double
9509 : public __node
9510{
9511 static const size_t n = sizeof("long double") - 1;
9512public:
9513
9514 virtual size_t first_size() const {return n;}
9515 virtual char* first_demangled_name(char* buf) const
9516 {
9517 strncpy(buf, "long double", n);
9518 return buf + n;
9519 }
9520 virtual ptrdiff_t print_first(char* f, char* l) const
9521 {
9522 const ptrdiff_t r = l - f;
9523 if (r >= n)
9524 {
9525 *f++ = 'l';
9526 *f++ = 'o';
9527 *f++ = 'n';
9528 *f++ = 'g';
9529 *f++ = ' ';
9530 *f++ = 'd';
9531 *f++ = 'o';
9532 *f++ = 'u';
9533 *f++ = 'b';
9534 *f++ = 'l';
9535 *f = 'e';
9536 }
9537 return n;
9538 }
9539};
9540
9541class __float128
9542 : public __node
9543{
9544 static const size_t n = sizeof("__float128") - 1;
9545public:
9546
9547 virtual size_t first_size() const {return n;}
9548 virtual char* first_demangled_name(char* buf) const
9549 {
9550 strncpy(buf, "__float128", n);
9551 return buf + n;
9552 }
9553 virtual ptrdiff_t print_first(char* f, char* l) const
9554 {
9555 const ptrdiff_t r = l - f;
9556 if (r >= n)
9557 {
9558 *f++ = '_';
9559 *f++ = '_';
9560 *f++ = 'f';
9561 *f++ = 'l';
9562 *f++ = 'o';
9563 *f++ = 'a';
9564 *f++ = 't';
9565 *f++ = '1';
9566 *f++ = '2';
9567 *f = '8';
9568 }
9569 return n;
9570 }
9571};
9572
9573class __ellipsis
9574 : public __node
9575{
9576 static const size_t n = sizeof("...") - 1;
9577public:
9578
9579 virtual size_t first_size() const {return n;}
9580 virtual char* first_demangled_name(char* buf) const
9581 {
9582 *buf++ = '.';
9583 *buf++ = '.';
9584 *buf++ = '.';
9585 return buf;
9586 }
9587 virtual ptrdiff_t print_first(char* f, char* l) const
9588 {
9589 const ptrdiff_t r = l - f;
9590 if (r >= n)
9591 {
9592 *f++ = '.';
9593 *f++ = '.';
9594 *f = '.';
9595 }
9596 return n;
9597 }
9598};
9599
9600class __decimal64
9601 : public __node
9602{
9603 static const size_t n = sizeof("decimal64") - 1;
9604public:
9605
9606 virtual size_t first_size() const {return n;}
9607 virtual char* first_demangled_name(char* buf) const
9608 {
9609 strncpy(buf, "decimal64", n);
9610 return buf + n;
9611 }
9612 virtual ptrdiff_t print_first(char* f, char* l) const
9613 {
9614 const ptrdiff_t r = l - f;
9615 if (r >= n)
9616 {
9617 *f++ = 'd';
9618 *f++ = 'e';
9619 *f++ = 'c';
9620 *f++ = 'i';
9621 *f++ = 'm';
9622 *f++ = 'a';
9623 *f++ = 'l';
9624 *f++ = '6';
9625 *f = '4';
9626 }
9627 return n;
9628 }
9629};
9630
9631class __decimal128
9632 : public __node
9633{
9634 static const size_t n = sizeof("decimal128") - 1;
9635public:
9636
9637 virtual size_t first_size() const {return n;}
9638 virtual char* first_demangled_name(char* buf) const
9639 {
9640 strncpy(buf, "decimal128", n);
9641 return buf + n;
9642 }
9643 virtual ptrdiff_t print_first(char* f, char* l) const
9644 {
9645 const ptrdiff_t r = l - f;
9646 if (r >= n)
9647 {
9648 *f++ = 'd';
9649 *f++ = 'e';
9650 *f++ = 'c';
9651 *f++ = 'i';
9652 *f++ = 'm';
9653 *f++ = 'a';
9654 *f++ = 'l';
9655 *f++ = '1';
9656 *f++ = '2';
9657 *f = '8';
9658 }
9659 return n;
9660 }
9661};
9662
9663class __decimal32
9664 : public __node
9665{
9666 static const size_t n = sizeof("decimal32") - 1;
9667public:
9668
9669 virtual size_t first_size() const {return n;}
9670 virtual char* first_demangled_name(char* buf) const
9671 {
9672 strncpy(buf, "decimal32", n);
9673 return buf + n;
9674 }
9675 virtual ptrdiff_t print_first(char* f, char* l) const
9676 {
9677 const ptrdiff_t r = l - f;
9678 if (r >= n)
9679 {
9680 *f++ = 'd';
9681 *f++ = 'e';
9682 *f++ = 'c';
9683 *f++ = 'i';
9684 *f++ = 'm';
9685 *f++ = 'a';
9686 *f++ = 'l';
9687 *f++ = '3';
9688 *f = '2';
9689 }
9690 return n;
9691 }
9692};
9693
9694class __decimal16
9695 : public __node
9696{
9697 static const size_t n = sizeof("decimal16") - 1;
9698public:
9699
9700 virtual size_t first_size() const {return n;}
9701 virtual char* first_demangled_name(char* buf) const
9702 {
9703 strncpy(buf, "decimal16", n);
9704 return buf + n;
9705 }
9706 virtual ptrdiff_t print_first(char* f, char* l) const
9707 {
9708 const ptrdiff_t r = l - f;
9709 if (r >= n)
9710 {
9711 *f++ = 'd';
9712 *f++ = 'e';
9713 *f++ = 'c';
9714 *f++ = 'i';
9715 *f++ = 'm';
9716 *f++ = 'a';
9717 *f++ = 'l';
9718 *f++ = '1';
9719 *f = '6';
9720 }
9721 return n;
9722 }
9723};
9724
9725class __d_char32_t
9726 : public __node
9727{
9728 static const size_t n = sizeof("char32_t") - 1;
9729public:
9730
9731 virtual size_t first_size() const {return n;}
9732 virtual char* first_demangled_name(char* buf) const
9733 {
9734 strncpy(buf, "char32_t", n);
9735 return buf + n;
9736 }
9737 virtual ptrdiff_t print_first(char* f, char* l) const
9738 {
9739 const ptrdiff_t r = l - f;
9740 if (r >= n)
9741 {
9742 *f++ = 'c';
9743 *f++ = 'h';
9744 *f++ = 'a';
9745 *f++ = 'r';
9746 *f++ = '3';
9747 *f++ = '2';
9748 *f++ = '_';
9749 *f = 't';
9750 }
9751 return n;
9752 }
9753};
9754
9755class __d_char16_t
9756 : public __node
9757{
9758 static const size_t n = sizeof("char16_t") - 1;
9759public:
9760
9761 virtual size_t first_size() const {return n;}
9762 virtual char* first_demangled_name(char* buf) const
9763 {
9764 strncpy(buf, "char16_t", n);
9765 return buf + n;
9766 }
9767 virtual ptrdiff_t print_first(char* f, char* l) const
9768 {
9769 const ptrdiff_t r = l - f;
9770 if (r >= n)
9771 {
9772 *f++ = 'c';
9773 *f++ = 'h';
9774 *f++ = 'a';
9775 *f++ = 'r';
9776 *f++ = '1';
9777 *f++ = '6';
9778 *f++ = '_';
9779 *f = 't';
9780 }
9781 return n;
9782 }
9783};
9784
9785class __auto
9786 : public __node
9787{
9788 static const size_t n = sizeof("auto") - 1;
9789public:
9790
9791 virtual size_t first_size() const {return n;}
9792 virtual char* first_demangled_name(char* buf) const
9793 {
9794 strncpy(buf, "auto", n);
9795 return buf + n;
9796 }
9797 virtual ptrdiff_t print_first(char* f, char* l) const
9798 {
9799 const ptrdiff_t r = l - f;
9800 if (r >= n)
9801 {
9802 *f++ = 'a';
9803 *f++ = 'u';
9804 *f++ = 't';
9805 *f = 'o';
9806 }
9807 return n;
9808 }
9809};
9810
9811class __nullptr_t
9812 : public __node
9813{
9814 static const size_t n = sizeof("std::nullptr_t") - 1;
9815public:
9816
9817 virtual size_t first_size() const {return n;}
9818 virtual char* first_demangled_name(char* buf) const
9819 {
9820 strncpy(buf, "std::nullptr_t", n);
9821 return buf + n;
9822 }
9823 virtual ptrdiff_t print_first(char* f, char* l) const
9824 {
9825 const ptrdiff_t r = l - f;
9826 if (r >= n)
9827 {
9828 *f++ = 's';
9829 *f++ = 't';
9830 *f++ = 'd';
9831 *f++ = ':';
9832 *f++ = ':';
9833 *f++ = 'n';
9834 *f++ = 'u';
9835 *f++ = 'l';
9836 *f++ = 'l';
9837 *f++ = 'p';
9838 *f++ = 't';
9839 *f++ = 'r';
9840 *f++ = '_';
9841 *f = 't';
9842 }
9843 return n;
9844 }
9845};
9846
9847class __array
9848 : public __node
9849{
9850public:
9851
9852 explicit __array(__node* type)
9853 {
9854 __left_ = type;
9855 }
9856
9857 __array(__node* type, size_t dim)
9858 {
9859 __left_ = type;
9860 __size_ = dim;
9861 }
9862
9863 __array(__node* type, __node* dim)
9864 {
9865 __left_ = type;
9866 __right_ = dim;
9867 }
9868
9869 virtual size_t size() const
9870 {
9871 if (__cached_size_ == -1)
9872 {
9873 size_t r = __left_->size() + 3;
9874 if (__right_ != 0)
9875 r += __right_->size();
9876 else if (__size_ != 0)
9877 r += snprintf(0, 0, "%ld", __size_);
9878 const_cast<long&>(__cached_size_) = r;
9879 }
9880 return __cached_size_;
9881 }
9882
9883 virtual char* get_demangled_name(char* buf) const
9884 {
9885 buf = __left_->get_demangled_name(buf);
9886 *buf++ = ' ';
9887 *buf++ = '[';
9888 if (__right_ != 0)
9889 buf = __right_->get_demangled_name(buf);
9890 else if (__size_ != 0)
9891 {
9892 size_t rs = sprintf(buf, "%ld", __size_);
9893 buf += rs;
9894 }
9895 *buf++ = ']';
9896 return buf;
9897 }
9898 virtual ptrdiff_t print(char* f, char* l) const
9899 {
9900 const ptrdiff_t r = l - f;
9901 const ptrdiff_t n = 3;
9902 const ptrdiff_t sz1 = __left_->print(f, l);
9903 char buf[20];
9904 ptrdiff_t sz2 = 0;
9905 if (__right_ != 0)
9906 sz2 = __right_->print(f+std::min(sz1+(n-1), r), l);
9907 else if (__size_ != 0)
9908 {
9909 sz2 = sprintf(buf, "%ld", __size_);
9910 if (r >= sz1 + sz2 + n)
9911 strncpy(f+sz1+2, buf, sz2);
9912 }
9913 if (r >= sz1 + sz2 + n)
9914 {
9915 f += sz1;
9916 *f++ = ' ';
9917 *f = '[';
9918 f += 1 + sz2;
9919 *f = ']';
9920 }
9921 return sz1 + sz2 + n;
9922 }
9923
9924 virtual size_t first_size() const
9925 {
9926 return __left_->first_size();
9927 }
9928
9929 virtual char* first_demangled_name(char* buf) const
9930 {
9931 return __left_->first_demangled_name(buf);
9932 }
9933
9934 virtual ptrdiff_t print_first(char* f, char* l) const
9935 {
9936 return __left_->print_first(f, l);
9937 }
9938
9939 virtual size_t second_size() const
9940 {
9941 size_t r = 2 + __left_->second_size();
9942 if (!__left_->is_array())
9943 ++r;
9944 if (__right_ != 0)
9945 r += __right_->size();
9946 else if (__size_ != 0)
9947 r += snprintf(0, 0, "%ld", __size_);
9948 return r;
9949 }
9950
9951 virtual char* second_demangled_name(char* buf) const
9952 {
9953 *buf++ = ' ';
9954 *buf++ = '[';
9955 if (__right_ != 0)
9956 buf = __right_->get_demangled_name(buf);
9957 else if (__size_ != 0)
9958 {
9959 size_t off = sprintf(buf, "%ld", __size_);
9960 buf += off;
9961 }
9962 char* t = buf;
9963 buf = __left_->second_demangled_name(buf);
9964 *t = ']';
9965 if (buf == t)
9966 ++buf;
9967 return buf;
9968 }
9969 virtual ptrdiff_t print_second(char* f, char* l) const
9970 {
9971 const ptrdiff_t r = l - f;
9972 ptrdiff_t n = 2;
9973 char buf[20];
9974 ptrdiff_t sz2 = 0;
9975 if (__right_ != 0)
9976 sz2 = __right_->print(f+std::min(n, r), l);
9977 else if (__size_ != 0)
9978 {
9979 sz2 = sprintf(buf, "%ld", __size_);
9980 if (r >= sz2 + 3)
9981 strncpy(f+2, buf, sz2);
9982 }
9983 const ptrdiff_t sz1 = __left_->print_second(f+std::min(2+sz2, r), l);
9984 if (sz1 == 0)
9985 ++n;
9986 if (r >= sz1 + sz2 + n)
9987 {
9988 *f++ = ' ';
9989 *f = '[';
9990 f += 1 + sz2;
9991 *f = ']';
9992 }
9993 return sz1 + sz2 + n;
9994 }
9995 virtual bool is_array() const
9996 {
9997 return true;
9998 }
9999 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10000 {
10001 bool r = __left_->fix_forward_references(t_begin, t_end);
10002 if (__right_)
10003 r = r && __right_->fix_forward_references(t_begin, t_end);
10004 return r;
10005 }
10006};
10007
10008class __pointer_to_member_type
10009 : public __node
10010{
10011public:
10012
10013 __pointer_to_member_type(__node* class_type, __node* member_type)
10014 {
10015 __left_ = class_type;
10016 __right_ = member_type;
10017 }
10018
10019 virtual size_t first_size() const
10020 {
10021 if (__cached_size_ == -1)
Howard Hinnant2de30b32011-12-13 01:23:16 +000010022 const_cast<long&>(__cached_size_) = __left_->size() + 3
10023 + __right_->first_size()
10024 + __right_->second_size();
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000010025 return __cached_size_;
10026 }
10027 virtual char* first_demangled_name(char* buf) const
10028 {
10029 buf = __right_->first_demangled_name(buf);
10030 buf = __left_->get_demangled_name(buf);
10031 *buf++ = ':';
10032 *buf++ = ':';
10033 *buf++ = '*';
10034 return __right_->second_demangled_name(buf);
10035 }
10036 virtual ptrdiff_t print_first(char* f, char* l) const
10037 {
10038 const ptrdiff_t r = l - f;
10039 const ptrdiff_t n = 3;
10040 const ptrdiff_t sz1 = __right_->print_first(f, l);
10041 const ptrdiff_t sz2 = __left_->print(f+std::min(sz1, r), l);
10042 const ptrdiff_t sz3 = __right_->print_second(f+std::min(sz1+sz2+n, r), l);
10043 if (r >= sz1 + sz2 + sz3 + n)
10044 {
10045 f += sz1 + sz2;
10046 *f++ = ':';
10047 *f++ = ':';
10048 *f = '*';
10049 }
10050 return sz1 + sz2 + sz3 + n;
10051 }
10052 virtual __node* base_name() const
10053 {
10054 return __left_->base_name();
10055 }
10056 virtual bool is_reference_or_pointer_to_function_or_array() const
10057 {
10058 return __right_->is_function();
10059 }
10060 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10061 {
10062 return __left_->fix_forward_references(t_begin, t_end) &&
10063 __right_->fix_forward_references(t_begin, t_end);
10064 }
10065};
10066
10067class __decltype_node
10068 : public __node
10069{
10070public:
10071
10072 explicit __decltype_node(__node* expr)
10073 {
10074 __right_ = expr;
10075 }
10076
10077 virtual size_t first_size() const
10078 {
10079 if (__cached_size_ == -1)
10080 const_cast<long&>(__cached_size_) = 10 + __right_->size();
10081 return __cached_size_;
10082 }
10083
10084 virtual char* first_demangled_name(char* buf) const
10085 {
10086 strncpy(buf, "decltype(", 9);
10087 buf += 9;
10088 buf = __right_->get_demangled_name(buf);
10089 *buf++ = ')';
10090 return buf;
10091 }
10092 virtual ptrdiff_t print_first(char* f, char* l) const
10093 {
10094 const ptrdiff_t r = l - f;
10095 const ptrdiff_t n = sizeof("decltype()") - 1;
10096 const ptrdiff_t sz1 = __right_->print(f+std::min(n-1, r), l);
10097 if (r >= sz1 + n)
10098 {
10099 *f++ = 'd';
10100 *f++ = 'e';
10101 *f++ = 'c';
10102 *f++ = 'l';
10103 *f++ = 't';
10104 *f++ = 'y';
10105 *f++ = 'p';
10106 *f++ = 'e';
10107 *f = '(';
10108 f += 1 + sz1;
10109 *f = ')';
10110 }
10111 return sz1 + n;
10112 }
10113 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10114 {
10115 return __right_->fix_forward_references(t_begin, t_end);
10116 }
10117};
10118
10119class __nested_delimeter
10120 : public __node
10121{
10122public:
10123
10124 explicit __nested_delimeter(__node* prev, __node* arg)
10125 {
10126 __left_ = prev;
10127 __right_ = arg;
10128 }
10129
10130 virtual size_t first_size() const
10131 {
10132 if (__cached_size_ == -1)
10133 const_cast<long&>(__cached_size_) = __left_->size() + __right_->size() + 2;
10134 return __cached_size_;
10135 }
10136
10137 virtual char* first_demangled_name(char* buf) const
10138 {
10139 buf = __left_->get_demangled_name(buf);
10140 *buf++ = ':';
10141 *buf++ = ':';
10142 return __right_->get_demangled_name(buf);
10143 }
10144 virtual ptrdiff_t print_first(char* f, char* l) const
10145 {
10146 const ptrdiff_t r = l - f;
10147 const ptrdiff_t n = sizeof("::") - 1;
10148 const ptrdiff_t sz1 = __left_->print(f, l);
10149 if (r >= sz1 + n)
10150 {
10151 f += sz1;
10152 *f++ = ':';
10153 *f++ = ':';
10154 }
10155 const ptrdiff_t sz2 = __right_->print(f, l);
10156 return sz1 + n + sz2;
10157 }
10158
10159 virtual bool ends_with_template() const
10160 {
10161 return __right_->ends_with_template();
10162 }
10163 virtual __node* base_name() const
10164 {
10165 return __right_->base_name();
10166 }
10167 virtual bool is_ctor_dtor_conv() const
10168 {
10169 return __right_->is_ctor_dtor_conv();
10170 }
10171 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10172 {
10173 return __left_->fix_forward_references(t_begin, t_end) &&
10174 __right_->fix_forward_references(t_begin, t_end);
10175 }
10176 virtual __node* extract_cv(__node*& rt) const
10177 {
10178 return __right_->extract_cv(const_cast<__node*&>(__right_));
10179 }
10180};
10181
10182class __unresolved_name
10183 : public __node
10184{
10185public:
10186
10187 __unresolved_name(__node* prev, __node* arg)
10188 {
10189 __left_ = prev;
10190 __right_ = arg;
10191 }
10192
10193 __unresolved_name(bool global, __node* prev, __node* arg)
10194 {
10195 __size_ = global;
10196 __left_ = prev;
10197 __right_ = arg;
10198 }
10199
10200 virtual size_t first_size() const
10201 {
10202 if (__cached_size_ == -1)
10203 const_cast<long&>(__cached_size_) = (__left_ ? __left_->size() + 2 : 0) +
10204 __right_->size() + __size_ * 2;
10205 return __cached_size_;
10206 }
10207
10208 virtual char* first_demangled_name(char* buf) const
10209 {
10210 if (__size_)
10211 {
10212 *buf++ = ':';
10213 *buf++ = ':';
10214 }
10215 if (__left_)
10216 {
10217 buf = __left_->get_demangled_name(buf);
10218 *buf++ = ':';
10219 *buf++ = ':';
10220 }
10221 return __right_->get_demangled_name(buf);
10222 }
10223 virtual ptrdiff_t print_first(char* f, char* l) const
10224 {
10225 const ptrdiff_t r = l - f;
10226 ptrdiff_t n = 0;
10227 if (__size_)
10228 {
10229 n = 2;
10230 if (r >= n)
10231 {
10232 f[0] = ':';
10233 f[1] = ':';
10234 }
10235 }
10236 ptrdiff_t sz1 = 0;
10237 if (__left_)
10238 {
10239 sz1 = __left_->print(f+std::min(n, r), l);
10240 n += 2;
10241 if (r >= sz1 + n)
10242 {
10243 f[sz1 + n - 2] = ':';
10244 f[sz1 + n - 1] = ':';
10245 }
10246 }
10247 const ptrdiff_t sz2 = __right_->print(f+std::min(sz1+n, r), l);
10248 return sz1 + n + sz2;
10249 }
10250
10251 virtual bool ends_with_template() const
10252 {
10253 return __right_->ends_with_template();
10254 }
10255 virtual __node* base_name() const
10256 {
10257 return __right_->base_name();
10258 }
10259 virtual bool is_ctor_dtor_conv() const
10260 {
10261 return __right_->is_ctor_dtor_conv();
10262 }
10263 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10264 {
10265 bool r = true;
10266 if (__left_)
10267 r = __left_->fix_forward_references(t_begin, t_end);
10268 return r && __right_->fix_forward_references(t_begin, t_end);
10269 }
10270 virtual __node* extract_cv(__node*& rt) const
10271 {
10272 return __right_->extract_cv(const_cast<__node*&>(__right_));
10273 }
10274};
10275
10276class __string_literal
10277 : public __node
10278{
10279public:
10280
10281 virtual size_t first_size() const
10282 {
10283 return 14;
10284 }
10285
10286 virtual char* first_demangled_name(char* buf) const
10287 {
10288 strncpy(buf, "string literal", 14);
10289 return buf + 14;
10290 }
10291 virtual ptrdiff_t print_first(char* f, char* l) const
10292 {
10293 const ptrdiff_t r = l - f;
10294 const ptrdiff_t n = sizeof("string literal") - 1;
10295 if (r >= n)
10296 {
10297 *f++ = 's';
10298 *f++ = 't';
10299 *f++ = 'r';
10300 *f++ = 'i';
10301 *f++ = 'n';
10302 *f++ = 'g';
10303 *f++ = ' ';
10304 *f++ = 'l';
10305 *f++ = 'i';
10306 *f++ = 't';
10307 *f++ = 'e';
10308 *f++ = 'r';
10309 *f++ = 'a';
10310 *f = 'l';
10311 }
10312 return n;
10313 }
10314};
10315
10316class __constructor
10317 : public __node
10318{
10319public:
10320
10321 explicit __constructor(__node* name)
10322 {
10323 __right_ = name;
10324 }
10325
10326 virtual size_t first_size() const
10327 {
10328 if (__cached_size_ == -1)
10329 const_cast<long&>(__cached_size_) = __right_->base_size();
10330 return __cached_size_;
10331 }
10332
10333 virtual char* first_demangled_name(char* buf) const
10334 {
10335 return __right_->get_base_name(buf);
10336 }
10337 virtual ptrdiff_t print_first(char* f, char* l) const
10338 {
10339 return __right_->print_base_name(f, l);
10340 }
10341 virtual __node* base_name() const
10342 {
10343 return __right_->base_name();
10344 }
10345 virtual bool ends_with_template() const
10346 {
10347 return __right_->ends_with_template();
10348 }
10349 virtual bool is_ctor_dtor_conv() const
10350 {
10351 return true;
10352 }
10353 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10354 {
10355 return __right_->fix_forward_references(t_begin, t_end);
10356 }
10357};
10358
10359class __destructor
10360 : public __node
10361{
10362public:
10363
10364 explicit __destructor(__node* name)
10365 {
10366 __right_ = name;
10367 }
10368
10369 virtual size_t first_size() const
10370 {
10371 if (__cached_size_ == -1)
10372 const_cast<long&>(__cached_size_) = __right_->base_size() + 1;
10373 return __cached_size_;
10374 }
10375
10376 virtual char* first_demangled_name(char* buf) const
10377 {
10378 *buf++ = '~';
10379 return __right_->get_base_name(buf);
10380 }
10381 virtual ptrdiff_t print_first(char* f, char* l) const
10382 {
10383 const ptrdiff_t r = l - f;
10384 const ptrdiff_t n = 1;
10385 const ptrdiff_t sz = __right_->print_base_name(f+std::min(n, r), l);
10386 if (r >= n + sz)
10387 *f = '~';
10388 return n + sz;
10389 }
10390 virtual __node* base_name() const
10391 {
10392 return __right_->base_name();
10393 }
10394 virtual bool is_ctor_dtor_conv() const
10395 {
10396 return true;
10397 }
10398 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10399 {
10400 return __right_->fix_forward_references(t_begin, t_end);
10401 }
10402};
10403
10404class __dot_suffix
10405 : public __node
10406{
10407public:
10408 __dot_suffix(__node* name, const char* suffix, unsigned sz)
10409 {
10410 __left_ = name;
10411 __name_ = suffix;
10412 __size_ = sz;
10413 }
10414
10415 virtual size_t first_size() const
10416 {
10417 if (__cached_size_ == -1)
10418 {
10419 size_t off = __left_->size();
10420 off += __size_ + 3;
10421 const_cast<long&>(__cached_size_) = off;
10422 }
10423 return __cached_size_;
10424 }
10425 virtual char* first_demangled_name(char* buf) const
10426 {
10427 buf = __left_->get_demangled_name(buf);
10428 *buf++ = ' ';
10429 *buf++ = '(';
10430 strncpy(buf, __name_, __size_);
10431 buf += __size_;
10432 *buf++ = ')';
10433 return buf;
10434 }
10435 virtual ptrdiff_t print_first(char* f, char* l) const
10436 {
10437 const ptrdiff_t r = l - f;
10438 const ptrdiff_t n = 3 + __size_;
10439 const ptrdiff_t sz = __left_->print(f, l);
10440 if (r >= n + sz)
10441 {
10442 f += sz;
10443 *f++ = ' ';
10444 *f++ = '(';
10445 strncpy(f, __name_, __size_);
10446 f += __size_;
10447 *f = ')';
10448 }
10449 return n + sz;
10450 }
10451 virtual __node* base_name() const
10452 {
10453 return __left_->base_name();
10454 }
10455 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10456 {
10457 return __left_->fix_forward_references(t_begin, t_end);
10458 }
10459};
10460
10461
10462enum {invalid_args = -3, invalid_mangled_name, memory_alloc_failure, success,
10463 not_yet_implemented};
10464
10465__demangle_tree::__demangle_tree(const char* mangled_name, char* buf, size_t bs)
10466 : __mangled_name_begin_(0), __mangled_name_end_(0),
10467 __status_(invalid_mangled_name), __root_(0),
10468 __node_begin_(0), __node_end_(0), __node_cap_(0),
10469 __sub_begin_(0), __sub_end_(0), __sub_cap_(0),
10470 __t_begin_(0), __t_end_(0), __t_cap_(0),
10471 __tag_templates_(true),
10472 __fix_forward_references_(false)
10473{
10474 size_t n = strlen(mangled_name);
10475 size_t ms = n + 2*n*sizeof(__node) + 2*n*sizeof(__node*);
10476 char* m;
10477 if (ms <= bs)
10478 {
10479 m = buf;
10480 __owns_buf_ = false;
10481 }
10482 else
10483 {
10484 m = static_cast<char*>(malloc(ms));
10485 __owns_buf_ = true;
10486 }
10487 if (m == NULL)
10488 {
10489 __status_ = memory_alloc_failure;
10490 return;
10491 }
10492 __node_begin_ = __node_end_ = (__node*)(m);
10493 __node_cap_ = __node_begin_ + 2*n;
10494 __sub_begin_ = __sub_end_ = (__node**)(__node_cap_);
10495 __sub_cap_ = __sub_begin_ + n;
10496 __t_begin_ = __t_end_ = (__node**)(__sub_cap_);
10497 __t_cap_ = __t_begin_ + n;
10498 __mangled_name_begin_ = (const char*)(__t_cap_);
10499 __mangled_name_end_ = __mangled_name_begin_ + n;
10500 strncpy(const_cast<char*>(__mangled_name_begin_), mangled_name, n);
10501}
10502
10503__demangle_tree::~__demangle_tree()
10504{
10505 if (__owns_buf_)
10506 free(__node_begin_);
10507}
10508
10509__demangle_tree::__demangle_tree(__demangle_tree& t)
10510 : __mangled_name_begin_(t.__mangled_name_begin_),
10511 __mangled_name_end_(t.__mangled_name_end_),
10512 __status_(t.__status_), __root_(t.__root_),
10513 __node_begin_(t.__node_begin_), __node_end_(t.__node_end_),
10514 __node_cap_(t.__node_cap_),
10515 __sub_begin_(t.__sub_begin_), __sub_end_(t.__sub_end_),
10516 __sub_cap_(t.__sub_cap_),
10517 __t_begin_(t.__t_begin_), __t_end_(t.__t_end_),
10518 __t_cap_(t.__t_cap_),
10519 __tag_templates_(t.__tag_templates_),
10520 __fix_forward_references_(t.__fix_forward_references_),
10521 __owns_buf_(t.__owns_buf_)
10522{
10523 t.__mangled_name_begin_ = 0;
10524 t.__mangled_name_end_ = 0;
10525 t.__status_ = invalid_mangled_name;
10526 t.__root_ = 0;
10527 t.__node_begin_ = t.__node_end_ = t.__node_cap_ = 0;
10528 t.__sub_begin_ = t.__sub_end_ = t.__sub_cap_ = 0;
10529 t.__t_begin_ = t.__t_end_ = t.__t_cap_ = 0;
10530 t.__owns_buf_ = false;
10531}
10532
10533__demangle_tree::__demangle_tree(__demangle_tree_rv rv)
10534 : __mangled_name_begin_(rv.ptr_->__mangled_name_begin_),
10535 __mangled_name_end_(rv.ptr_->__mangled_name_end_),
10536 __status_(rv.ptr_->__status_), __root_(rv.ptr_->__root_),
10537 __node_begin_(rv.ptr_->__node_begin_), __node_end_(rv.ptr_->__node_end_),
10538 __node_cap_(rv.ptr_->__node_cap_),
10539 __sub_begin_(rv.ptr_->__sub_begin_), __sub_end_(rv.ptr_->__sub_end_),
10540 __sub_cap_(rv.ptr_->__sub_cap_),
10541 __t_begin_(rv.ptr_->__t_begin_), __t_end_(rv.ptr_->__t_end_),
10542 __t_cap_(rv.ptr_->__t_cap_),
10543 __tag_templates_(rv.ptr_->__tag_templates_),
10544 __fix_forward_references_(rv.ptr_->__fix_forward_references_),
10545 __owns_buf_(rv.ptr_->__owns_buf_)
10546{
10547 rv.ptr_->__mangled_name_begin_ = 0;
10548 rv.ptr_->__mangled_name_end_ = 0;
10549 rv.ptr_->__status_ = invalid_mangled_name;
10550 rv.ptr_->__root_ = 0;
10551 rv.ptr_->__node_begin_ = rv.ptr_->__node_end_ = rv.ptr_->__node_cap_ = 0;
10552 rv.ptr_->__sub_begin_ = rv.ptr_->__sub_end_ = rv.ptr_->__sub_cap_ = 0;
10553 rv.ptr_->__t_begin_ = rv.ptr_->__t_end_ = rv.ptr_->__t_cap_ = 0;
10554 rv.ptr_->__owns_buf_ = false;
10555}
10556
10557int
10558__demangle_tree::__status() const
10559{
10560 return __status_;
10561}
10562
10563size_t
10564__demangle_tree::size() const
10565{
10566 return __status_ == success ? __root_->size() : 0;
10567}
10568
10569char*
10570__demangle_tree::__get_demangled_name(char* buf) const
10571{
10572 if (__status_ == success)
10573 return __root_->get_demangled_name(buf);
10574 return 0;
10575}
10576
10577template <class _Tp>
10578bool
10579__demangle_tree::__make()
10580{
10581 if (__node_end_ < __node_cap_)
10582 {
10583 ::new (__node_end_) _Tp();
10584 __root_ = __node_end_;
10585 ++__node_end_;
10586 return true;
10587 }
10588 __status_ = memory_alloc_failure;
10589 return false;
10590}
10591
10592template <class _Tp, class _A0>
10593bool
10594__demangle_tree::__make(_A0 __a0)
10595{
10596 if (__node_end_ < __node_cap_)
10597 {
10598 ::new (__node_end_) _Tp(__a0);
10599 __root_ = __node_end_;
10600 ++__node_end_;
10601 return true;
10602 }
10603 __status_ = memory_alloc_failure;
10604 return false;
10605}
10606
10607template <class _Tp, class _A0, class _A1>
10608bool
10609__demangle_tree::__make(_A0 __a0, _A1 __a1)
10610{
10611 if (__node_end_ < __node_cap_)
10612 {
10613 ::new (__node_end_) _Tp(__a0, __a1);
10614 __root_ = __node_end_;
10615 ++__node_end_;
10616 return true;
10617 }
10618 __status_ = memory_alloc_failure;
10619 return false;
10620}
10621
10622template <class _Tp, class _A0, class _A1, class _A2>
10623bool
10624__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2)
10625{
10626 if (__node_end_ < __node_cap_)
10627 {
10628 ::new (__node_end_) _Tp(__a0, __a1, __a2);
10629 __root_ = __node_end_;
10630 ++__node_end_;
10631 return true;
10632 }
10633 __status_ = memory_alloc_failure;
10634 return false;
10635}
10636
10637template <class _Tp, class _A0, class _A1, class _A2, class _A3>
10638bool
10639__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3)
10640{
10641 if (__node_end_ < __node_cap_)
10642 {
10643 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3);
10644 __root_ = __node_end_;
10645 ++__node_end_;
10646 return true;
10647 }
10648 __status_ = memory_alloc_failure;
10649 return false;
10650}
10651
10652template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4>
10653bool
10654__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4)
10655{
10656 if (__node_end_ < __node_cap_)
10657 {
10658 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4);
10659 __root_ = __node_end_;
10660 ++__node_end_;
10661 return true;
10662 }
10663 __status_ = memory_alloc_failure;
10664 return false;
10665}
10666
10667template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4,
10668 class _A5>
10669bool
10670__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4,
10671 _A5 __a5)
10672{
10673 if (__node_end_ < __node_cap_)
10674 {
10675 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4, __a5);
10676 __root_ = __node_end_;
10677 ++__node_end_;
10678 return true;
10679 }
10680 __status_ = memory_alloc_failure;
10681 return false;
10682}
10683
10684// <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const
10685// [R | O] # & or &&
10686
10687const char*
10688__demangle_tree::__parse_cv_qualifiers(const char* first, const char* last,
10689 unsigned& cv, bool look_for_ref_quals)
10690{
10691 if (look_for_ref_quals)
10692 {
10693 for (; first != last; ++first)
10694 {
10695 switch (*first)
10696 {
10697 case 'r':
10698 cv |= 4;
10699 break;
10700 case 'V':
10701 cv |= 2;
10702 break;
10703 case 'K':
10704 cv |= 1;
10705 break;
10706 case 'R':
10707 cv |= 8;
10708 break;
10709 case 'O':
10710 cv |= 16;
10711 break;
10712 default:
10713 return first;
10714 }
10715 }
10716 }
10717 else
10718 {
10719 for (; first != last; ++first)
10720 {
10721 switch (*first)
10722 {
10723 case 'r':
10724 cv |= 4;
10725 break;
10726 case 'V':
10727 cv |= 2;
10728 break;
10729 case 'K':
10730 cv |= 1;
10731 break;
10732 default:
10733 return first;
10734 }
10735 }
10736 }
10737 return first;
10738}
10739
10740// <builtin-type> ::= v # void
10741// ::= w # wchar_t
10742// ::= b # bool
10743// ::= c # char
10744// ::= a # signed char
10745// ::= h # unsigned char
10746// ::= s # short
10747// ::= t # unsigned short
10748// ::= i # int
10749// ::= j # unsigned int
10750// ::= l # long
10751// ::= m # unsigned long
10752// ::= x # long long, __int64
10753// ::= y # unsigned long long, __int64
10754// ::= n # __int128
10755// ::= o # unsigned __int128
10756// ::= f # float
10757// ::= d # double
10758// ::= e # long double, __float80
10759// ::= g # __float128
10760// ::= z # ellipsis
10761// ::= Dd # IEEE 754r decimal floating point (64 bits)
10762// ::= De # IEEE 754r decimal floating point (128 bits)
10763// ::= Df # IEEE 754r decimal floating point (32 bits)
10764// ::= Dh # IEEE 754r half-precision floating point (16 bits)
10765// ::= Di # char32_t
10766// ::= Ds # char16_t
10767// ::= Da # auto (in dependent new-expressions)
10768// ::= Dn # std::nullptr_t (i.e., decltype(nullptr))
10769// ::= u <source-name> # vendor extended type
10770
10771const char*
10772__demangle_tree::__parse_builtin_type(const char* first, const char* last)
10773{
10774 if (first != last)
10775 {
10776 switch (*first)
10777 {
10778 case 'v':
10779 if (__make<__void>())
10780 ++first;
10781 break;
10782 case 'w':
10783 if (__make<__wchar_t>())
10784 ++first;
10785 break;
10786 case 'b':
10787 if (__make<__bool>())
10788 ++first;
10789 break;
10790 case 'c':
10791 if (__make<__char>())
10792 ++first;
10793 break;
10794 case 'a':
10795 if (__make<__signed_char>())
10796 ++first;
10797 break;
10798 case 'h':
10799 if (__make<__unsigned_char>())
10800 ++first;
10801 break;
10802 case 's':
10803 if (__make<__short>())
10804 ++first;
10805 break;
10806 case 't':
10807 if (__make<__unsigned_short>())
10808 ++first;
10809 break;
10810 case 'i':
10811 if (__make<__int>())
10812 ++first;
10813 break;
10814 case 'j':
10815 if (__make<__unsigned_int>())
10816 ++first;
10817 break;
10818 case 'l':
10819 if (__make<__long>())
10820 ++first;
10821 break;
10822 case 'm':
10823 if (__make<__unsigned_long>())
10824 ++first;
10825 break;
10826 case 'x':
10827 if (__make<__long_long>())
10828 ++first;
10829 break;
10830 case 'y':
10831 if (__make<__unsigned_long_long>())
10832 ++first;
10833 break;
10834 case 'n':
10835 if (__make<__int128>())
10836 ++first;
10837 break;
10838 case 'o':
10839 if (__make<__unsigned_int128>())
10840 ++first;
10841 break;
10842 case 'f':
10843 if (__make<__float>())
10844 ++first;
10845 break;
10846 case 'd':
10847 if (__make<__double>())
10848 ++first;
10849 break;
10850 case 'e':
10851 if (__make<__long_double>())
10852 ++first;
10853 break;
10854 case 'g':
10855 if (__make<__float128>())
10856 ++first;
10857 break;
10858 case 'z':
10859 if (__make<__ellipsis>())
10860 ++first;
10861 break;
10862 case 'D':
10863 if (first+1 != last)
10864 {
10865 switch (first[1])
10866 {
10867 case 'd':
10868 if (__make<__decimal64>())
10869 first += 2;
10870 break;
10871 case 'e':
10872 if (__make<__decimal128>())
10873 first += 2;
10874 break;
10875 case 'f':
10876 if (__make<__decimal32>())
10877 first += 2;
10878 break;
10879 case 'h':
10880 if (__make<__decimal16>())
10881 first += 2;
10882 break;
10883 case 'i':
10884 if (__make<__d_char32_t>())
10885 first += 2;
10886 break;
10887 case 's':
10888 if (__make<__d_char16_t>())
10889 first += 2;
10890 break;
10891 case 'a':
10892 if (__make<__auto>())
10893 first += 2;
10894 break;
10895 case 'n':
10896 if (__make<__nullptr_t>())
10897 first += 2;
10898 break;
10899 }
10900 }
10901 break;
10902 }
10903 }
10904 return first;
10905}
10906
10907// <bare-function-type> ::= <signature type>+
10908// # types are possible return type, then parameter types
10909
10910const char*
10911__demangle_tree::__parse_bare_function_type(const char* first, const char* last)
10912{
10913 if (first != last)
10914 {
10915 __tag_templates_ = false;
10916 const char* t = __parse_type(first, last);
10917 if (t != first && __make<__list>(__root_))
10918 {
10919 const char* t0 = t;
10920 __node* head = __root_;
10921 __node* prev = head;
10922 while (true)
10923 {
10924 t = __parse_type(t0, last);
10925 if (t != t0)
10926 {
10927 if (__make<__list>(__root_))
10928 {
10929 t0 = t;
10930 prev->__right_ = __root_;
10931 __root_->__size_ = prev->__size_ + 1;
10932 prev = __root_;
10933 }
10934 else
10935 break;
10936 }
10937 else
10938 {
10939 first = t;
10940 __root_ = head;
10941 break;
10942 }
10943 }
10944 }
10945 __tag_templates_ = true;
10946 }
10947 return first;
10948}
10949
10950// <function-type> ::= F [Y] <bare-function-type> E
10951
10952const char*
10953__demangle_tree::__parse_function_type(const char* first, const char* last)
10954{
10955 if (first != last && *first == 'F')
10956 {
10957 const char* t = first+1;
10958 if (t != last)
10959 {
10960 bool externC = false;
10961 if (*t == 'Y')
10962 {
10963 externC = true;
10964 if (++t == last)
10965 return first;
10966 }
10967 const char* t1 = __parse_type(t, last);
10968 if (t1 != t)
10969 {
10970 __node* ret = __root_;
10971 t = t1;
10972 t1 = __parse_bare_function_type(t, last);
10973 if (t1 != t && t1 != last && *t1 == 'E')
10974 {
10975 if (dynamic_cast<__void*>(__root_->__left_) != NULL)
10976 __root_->__left_ = NULL;
10977 if (__make<__function_signature>(ret, __root_))
10978 {
10979 if (__make<__function>((__node*)0, __root_))
10980 first = t1+1;
10981 }
10982 }
10983 }
10984 }
10985 }
10986 return first;
10987}
10988
10989const char*
10990__demangle_tree::__parse_hex_number(const char* first, const char* last, unsigned long long& n)
10991{
10992 const char* t = first;
10993 for (; t != last && isxdigit(*t); ++t)
10994 {
10995 if (t == first)
10996 n = 0;
10997 if (isdigit(*t))
10998 n = n * 16 + *t - '0';
10999 else if (isupper(*t))
11000 n = n * 16 + *t - 'A' + 10;
11001 else
11002 n = n * 16 + *t - 'a' + 10;
11003 }
11004 first = t;
11005 return first;
11006}
11007
11008// <expr-primary> ::= L <type> <value number> E # integer literal
11009// ::= L <type> <value float> E # floating literal
11010// ::= L <string type> E # string literal
11011// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
11012// ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
11013// ::= L <mangled-name> E # external name
11014
11015const char*
11016__demangle_tree::__parse_expr_primary(const char* first, const char* last)
11017{
11018 if (last - first >= 4 && *first == 'L')
11019 {
11020 switch (first[1])
11021 {
11022 case 'w':
11023 {
11024 const char* t = __parse_number(first+2, last);
11025 if (t != first+2 && t != last && *t == 'E')
11026 {
11027 if (__make<__wchar_t_literal>(first+2, t))
11028 first = t+1;
11029 }
11030 }
11031 break;
11032 case 'b':
11033 if (first[3] == 'E')
11034 {
11035 switch (first[2])
11036 {
11037 case '0':
11038 if (__make<__bool_literal>("false", 5))
11039 first += 4;
11040 break;
11041 case '1':
11042 if (__make<__bool_literal>("true", 4))
11043 first += 4;
11044 break;
11045 }
11046 }
11047 break;
11048 case 'c':
11049 {
11050 const char* t = __parse_number(first+2, last);
11051 if (t != first+2 && t != last && *t == 'E')
11052 {
11053 if (__make<__char_literal>(first+2, t))
11054 first = t+1;
11055 }
11056 }
11057 break;
11058 case 'a':
11059 {
11060 const char* t = __parse_number(first+2, last);
11061 if (t != first+2 && t != last && *t == 'E')
11062 {
11063 if (__make<__signed_char_literal>(first+2, t))
11064 first = t+1;
11065 }
11066 }
11067 break;
11068 case 'h':
11069 {
11070 const char* t = __parse_number(first+2, last);
11071 if (t != first+2 && t != last && *t == 'E')
11072 {
11073 if (__make<__unsigned_char_literal>(first+2, t))
11074 first = t+1;
11075 }
11076 }
11077 break;
11078 case 's':
11079 {
11080 const char* t = __parse_number(first+2, last);
11081 if (t != first+2 && t != last && *t == 'E')
11082 {
11083 if (__make<__short_literal>(first+2, t))
11084 first = t+1;
11085 }
11086 }
11087 break;
11088 case 't':
11089 {
11090 const char* t = __parse_number(first+2, last);
11091 if (t != first+2 && t != last && *t == 'E')
11092 {
11093 if (__make<__unsigned_short_literal>(first+2, t))
11094 first = t+1;
11095 }
11096 }
11097 break;
11098 case 'i':
11099 {
11100 const char* t = __parse_number(first+2, last);
11101 if (t != first+2 && t != last && *t == 'E')
11102 {
11103 if (__make<__int_literal>(first+2, t))
11104 first = t+1;
11105 }
11106 }
11107 break;
11108 case 'j':
11109 {
11110 const char* t = __parse_number(first+2, last);
11111 if (t != first+2 && t != last && *t == 'E')
11112 {
11113 if (__make<__unsigned_int_literal>(first+2, t))
11114 first = t+1;
11115 }
11116 }
11117 break;
11118 case 'l':
11119 {
11120 const char* t = __parse_number(first+2, last);
11121 if (t != first+2 && t != last && *t == 'E')
11122 {
11123 if (__make<__long_literal>(first+2, t))
11124 first = t+1;
11125 }
11126 }
11127 break;
11128 case 'm':
11129 {
11130 const char* t = __parse_number(first+2, last);
11131 if (t != first+2 && t != last && *t == 'E')
11132 {
11133 if (__make<__unsigned_long_literal>(first+2, t))
11134 first = t+1;
11135 }
11136 }
11137 break;
11138 case 'x':
11139 {
11140 const char* t = __parse_number(first+2, last);
11141 if (t != first+2 && t != last && *t == 'E')
11142 {
11143 if (__make<__long_long_literal>(first+2, t))
11144 first = t+1;
11145 }
11146 }
11147 break;
11148 case 'y':
11149 {
11150 const char* t = __parse_number(first+2, last);
11151 if (t != first+2 && t != last && *t == 'E')
11152 {
11153 if (__make<__unsigned_long_long_literal>(first+2, t))
11154 first = t+1;
11155 }
11156 }
11157 break;
11158 case 'n':
11159 {
11160 const char* t = __parse_number(first+2, last);
11161 if (t != first+2 && t != last && *t == 'E')
11162 {
11163 if (__make<__int128_literal>(first+2, t))
11164 first = t+1;
11165 }
11166 }
11167 break;
11168 case 'o':
11169 {
11170 const char* t = __parse_number(first+2, last);
11171 if (t != first+2 && t != last && *t == 'E')
11172 {
11173 if (__make<__unsigned_int128_literal>(first+2, t))
11174 first = t+1;
11175 }
11176 }
11177 break;
11178 case 'f':
11179 {
11180 if (last - (first+2) <= 8)
11181 return first;
11182 unsigned long long j;
11183 const char* t = __parse_hex_number(first+2, first+10, j);
11184 if (t != first+2 && t != last && *t == 'E')
11185 {
11186 unsigned i = static_cast<unsigned>(j);
11187 float value = *(float*)&i;
11188 if (__make<__float_literal>(value))
11189 first = t+1;
11190 }
11191 }
11192 break;
11193 case 'd':
11194 {
11195 if (last - (first+2) <= 16)
11196 return first;
11197 unsigned long long j;
11198 const char* t = __parse_hex_number(first+2, first+18, j);
11199 if (t != first+2 && t != last && *t == 'E')
11200 {
11201 double value = *(double*)&j;
11202 if (__make<__double_literal>(value))
11203 first = t+1;
11204 }
11205 }
11206 break;
11207 case 'e':
11208 break;
11209 case '_':
11210 if (first[2] == 'Z')
11211 {
11212 const char* t = __parse_encoding(first+3, last);
11213 if (t != first+3 && t != last && *t == 'E')
11214 first = t+1;
11215 }
11216 break;
11217 default:
11218 {
11219 // might be named type
11220 const char* t = __parse_type(first+1, last);
11221 if (t != first+1 && t != last)
11222 {
11223 if (*t != 'E')
11224 {
11225 const char* n = t;
11226 for (; n != last && isdigit(*n); ++n)
11227 ;
11228 if (n != t && n != last && *n == 'E')
11229 {
11230 if (__make<__cast_literal>(__root_, t, n))
11231 {
11232 first = n+1;
11233 break;
11234 }
11235 }
11236 }
11237 else
11238 {
11239 first = t+1;
11240 break;
11241 }
11242 }
11243 }
11244 assert(!"case in __parse_expr_primary not implemented");
11245 }
11246 }
11247 return first;
11248}
11249
11250const char*
11251__demangle_tree::__parse_unnamed_type_name(const char* first, const char* last)
11252{
11253 if (first != last && *first == 'U')
11254 {
11255 assert(!"__parse_unnamed_type_name not implemented");
11256 }
11257 return first;
11258}
11259
11260// <ctor-dtor-name> ::= C1 # complete object constructor
11261// ::= C2 # base object constructor
11262// ::= C3 # complete object allocating constructor
11263// ::= D0 # deleting destructor
11264// ::= D1 # complete object destructor
11265// ::= D2 # base object destructor
11266
11267const char*
11268__demangle_tree::__parse_ctor_dtor_name(const char* first, const char* last)
11269{
11270 if (last-first >= 2)
11271 {
11272 switch (first[0])
11273 {
11274 case 'C':
11275 switch (first[1])
11276 {
11277 case '1':
11278 case '2':
11279 case '3':
11280 if (__make<__constructor>(__root_->base_name()))
11281 first += 2;
11282 break;
11283 }
11284 break;
11285 case 'D':
11286 switch (first[1])
11287 {
11288 case '0':
11289 case '1':
11290 case '2':
11291 if (__make<__destructor>(__root_->base_name()))
11292 first += 2;
11293 break;
11294 }
11295 break;
11296 }
11297 }
11298 return first;
11299}
11300
11301const char*
11302__demangle_tree::__parse_unscoped_template_name(const char* first, const char* last)
11303{
11304 assert(!"__parse_unscoped_template_name not implemented");
11305}
11306
11307// <discriminator> := _ <non-negative number> # when number < 10
11308// := __ <non-negative number> _ # when number >= 10
11309// extension := decimal-digit+
11310
11311const char*
11312__demangle_tree::__parse_discriminator(const char* first, const char* last)
11313{
11314 // parse but ignore discriminator
11315 if (first != last)
11316 {
11317 if (*first == '_')
11318 {
11319 const char* t1 = first+1;
11320 if (t1 != last)
11321 {
11322 if (isdigit(*t1))
11323 first = t1+1;
11324 else if (*t1 == '_')
11325 {
11326 for (++t1; t1 != last && isdigit(*t1); ++t1)
11327 ;
11328 if (t1 != last && *t1 == '_')
11329 first = t1 + 1;
11330 }
11331 }
11332 }
11333 else if (isdigit(*first))
11334 {
11335 const char* t1 = first+1;
11336 for (; t1 != last && isdigit(*t1); ++t1)
11337 ;
11338 first = t1;
11339 }
11340 }
11341 return first;
11342}
11343
11344// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
11345// := Z <function encoding> E s [<discriminator>]
11346// := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
11347
11348const char*
11349__demangle_tree::__parse_local_name(const char* first, const char* last)
11350{
11351 if (first != last && *first == 'Z')
11352 {
11353 const char* t = __parse_encoding(first+1, last);
11354 if (t != first+1 && t != last && *t == 'E' && ++t != last)
11355 {
11356 __node* encoding = __root_;
11357 switch (*t)
11358 {
11359 case 's':
11360 {
11361 const char*t1 = __parse_discriminator(t+1, last);
11362 if (__make<__string_literal>())
11363 {
11364 if (__make<__nested_delimeter>(encoding, __root_))
11365 first = t1;
11366 }
11367 }
11368 break;
11369 case 'd':
11370 assert(!"__parse_local_name d not implemented");
11371 break;
11372 default:
11373 {
11374 const char*t1 = __parse_name(t, last);
11375 if (t1 != t)
11376 {
11377 // parse but ignore discriminator
11378 t1 = __parse_discriminator(t1, last);
11379 if (__make<__nested_delimeter>(encoding, __root_))
11380 first = t1;
11381 }
11382 }
11383 break;
11384 }
11385 }
11386 }
11387 return first;
11388}
11389
11390// <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f())
11391// ::= <simple-id> # e.g., ~A<2*N>
11392
11393const char*
11394__demangle_tree::__parse_destructor_name(const char* first, const char* last)
11395{
11396 if (first != last)
11397 {
11398 const char* t = __parse_unresolved_type(first, last);
11399 if (t == first)
11400 t = __parse_simple_id(first, last);
11401 if (t != first && __make<__destructor>(__root_))
11402 first = t;
11403 }
11404 return first;
11405}
11406
11407// <simple-id> ::= <source-name> [ <template-args> ]
11408
11409const char*
11410__demangle_tree::__parse_simple_id(const char* first, const char* last)
11411{
11412 if (first != last)
11413 {
11414 const char* t = __parse_source_name(first, last);
11415 if (t != first)
11416 first = __parse_template_args(t, last);
11417 else
11418 first = t;
11419 }
11420 return first;
11421}
11422
11423// <base-unresolved-name> ::= <simple-id> # unresolved name
11424// extension ::= <operator-name> # unresolved operator-function-id
11425// extension ::= <operator-name> <template-args> # unresolved operator template-id
11426// ::= on <operator-name> # unresolved operator-function-id
11427// ::= on <operator-name> <template-args> # unresolved operator template-id
11428// ::= dn <destructor-name> # destructor or pseudo-destructor;
11429// # e.g. ~X or ~X<N-1>
11430
11431const char*
11432__demangle_tree::__parse_base_unresolved_name(const char* first, const char* last)
11433{
11434 if (last - first >= 2)
11435 {
11436 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
11437 {
11438 if (first[0] == 'o')
11439 {
11440 const char* t = __parse_operator_name(first+2, last);
11441 if (t != first+2)
11442 first = __parse_template_args(t, last);
11443 else
11444 first = t;
11445 }
11446 else
11447 {
11448 const char* t = __parse_destructor_name(first+2, last);
11449 if (t != first+2)
11450 first = t;
11451 }
11452 }
11453 else
11454 {
11455 const char* t = __parse_simple_id(first, last);
11456 if (t == first)
11457 {
11458 t = __parse_operator_name(first, last);
11459 if (t != first)
11460 t = __parse_template_args(t, last);
11461 }
11462 if (t != first)
11463 first = t;
11464 }
11465 }
11466 return first;
11467}
11468
11469// <unresolved-type> ::= <template-param>
11470// ::= <decltype>
11471// ::= <substitution>
11472
11473const char*
11474__demangle_tree::__parse_unresolved_type(const char* first, const char* last)
11475{
11476 if (first != last)
11477 {
11478 const char* t;
11479 switch (*first)
11480 {
11481 case 'T':
11482 t = __parse_template_param(first, last);
11483 if (t != first)
11484 {
11485 if (__sub_end_ == __sub_cap_)
11486 __status_ = memory_alloc_failure;
11487 else
11488 {
11489 *__sub_end_++ = __root_;
11490 first = t;
11491 }
11492 }
11493 break;
11494 case 'D':
11495 t = __parse_decltype(first, last);
11496 if (t != first)
11497 {
11498 if (__sub_end_ == __sub_cap_)
11499 __status_ = memory_alloc_failure;
11500 else
11501 {
11502 *__sub_end_++ = __root_;
11503 first = t;
11504 }
11505 }
11506 break;
11507 case 'S':
11508 t = __parse_substitution(first, last);
11509 if (t != first)
11510 first = t;
11511 break;
11512 }
11513 }
11514 return first;
11515}
11516
Howard Hinnant6f716a02011-06-22 19:27:39 +000011517// <unresolved-qualifier-level> ::= <source-name> [ <template-args> ]
11518
11519const char*
11520__demangle_tree::__parse_unresolved_qualifier_level(const char* first, const char* last)
11521{
11522 if (first != last)
11523 {
11524 const char* t = __parse_source_name(first, last);
11525 if (t != first)
11526 first = __parse_template_args(t, last);
11527 }
11528 return first;
11529}
11530
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011531// <unresolved-name>
Howard Hinnant6f716a02011-06-22 19:27:39 +000011532// extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011533// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
11534// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
11535// # A::x, N::y, A<T>::z; "gs" means leading "::"
Howard Hinnant6f716a02011-06-22 19:27:39 +000011536// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
11537// # T::N::x /decltype(p)::N::x
11538// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011539
11540const char*
11541__demangle_tree::__parse_unresolved_name(const char* first, const char* last)
11542{
11543 if (last - first > 2)
11544 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011545 const char* t = first;
11546 bool global = false;
11547 if (t[0] == 'g' && t[1] == 's')
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011548 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011549 global = true;
11550 t += 2;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011551 }
Howard Hinnant6f716a02011-06-22 19:27:39 +000011552 const char* t2 = __parse_base_unresolved_name(t, last);
11553 if (t2 != t)
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011554 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011555 if (__make<__unresolved_name>(global, (__node*)0, __root_))
11556 first = t2;
11557 }
11558 else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
11559 {
11560 if (!global && t[2] == 'N')
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011561 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011562 t2 = __parse_unresolved_type(t+3, last);
11563 if (t2 != t+3 && t2 != last)
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011564 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011565 t = __parse_template_args(t2, last);
11566 if (t == last)
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011567 return first;
Howard Hinnant6f716a02011-06-22 19:27:39 +000011568 __node* name = __root_;
11569 while (*t != 'E')
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011570 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011571 t2 = __parse_unresolved_qualifier_level(t, last);
11572 if (t2 == t || t2 == last)
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011573 return first;
11574 if (!__make<__nested_delimeter>(name, __root_))
11575 return first;
11576 name = __root_;
Howard Hinnant6f716a02011-06-22 19:27:39 +000011577 t = t2;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011578 }
Howard Hinnant6f716a02011-06-22 19:27:39 +000011579 t2 = __parse_base_unresolved_name(++t, last);
11580 if (t2 != t && __make<__unresolved_name>(false, name, __root_))
11581 first = t2;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011582 }
Howard Hinnant6f716a02011-06-22 19:27:39 +000011583 }
11584 else
11585 {
11586 if (!global)
11587 {
11588 t2 = __parse_unresolved_type(t+2, last);
11589 if (t2 != t+2)
11590 {
11591 t = t2;
11592 __node* name = __root_;
11593 t2 = __parse_base_unresolved_name(t, last);
11594 if (t2 != t && __make<__unresolved_name>(false, name, __root_))
11595 return t2;
11596 return first;
11597 }
11598 }
11599 t2 = __parse_unresolved_qualifier_level(t+2, last);
11600 if (t2 != t+2 && t2 != last)
11601 {
11602 __node* name = __root_;
11603 t = t2;
11604 while (*t != 'E')
11605 {
11606 t2 = __parse_unresolved_qualifier_level(t, last);
11607 if (t2 == t || t2 == last)
11608 return first;
11609 if (!__make<__nested_delimeter>(name, __root_))
11610 return first;
11611 name = __root_;
11612 t = t2;
11613 }
11614 t2 = __parse_base_unresolved_name(++t, last);
11615 if (t2 != t && __make<__unresolved_name>(global, name, __root_))
11616 first = t2;
11617 }
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011618 }
11619 }
11620 }
11621 return first;
11622}
11623
11624// <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter
11625// ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters
11626// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter
11627// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers>
11628
11629const char*
11630__demangle_tree::__parse_function_param(const char* first, const char* last)
11631{
11632 if (last - first >= 3 && *first == 'f')
11633 {
11634 if (first[1] == 'p')
11635 {
11636 assert(!"__parse_function_param not implemented");
11637 }
11638 else if (first[1] == 'L')
11639 {
11640 assert(!"__parse_function_param not implemented");
11641 }
11642 }
11643 return first;
11644}
11645
11646// at <type> # alignof (a type)
11647
11648const char*
11649__demangle_tree::__parse_alignof_expr(const char* first, const char* last)
11650{
11651 if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
11652 {
11653 const char* t = __parse_type(first+2, last);
11654 if (t != first+2)
11655 {
11656 if (__make<__operator_alignof_expression>(__root_))
11657 first = t;
11658 }
11659 }
11660 return first;
11661}
11662
11663// cc <type> <expression> # const_cast<type> (expression)
11664
11665const char*
11666__demangle_tree::__parse_const_cast_expr(const char* first, const char* last)
11667{
11668 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
11669 {
11670 const char* t = __parse_type(first+2, last);
11671 if (t != first+2)
11672 {
11673 __node* type = __root_;
11674 const char* t1 = __parse_expression(t, last);
11675 if (t1 != t)
11676 {
11677 if (__make<__const_cast>(type, __root_))
11678 first = t1;
11679 }
11680 }
11681 }
11682 return first;
11683}
11684
11685// cl <expression>+ E # call
11686
11687const char*
11688__demangle_tree::__parse_call_expr(const char* first, const char* last)
11689{
11690 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
11691 {
11692 const char* t = __parse_expression(first+2, last);
11693 if (t != first+2)
11694 {
11695 if (t == last)
11696 return first;
11697 __node* name = __root_;
11698 __node* args = 0;
11699 __node* prev = 0;
11700 while (*t != 'E')
11701 {
11702 const char* t1 = __parse_expression(t, last);
11703 if (t1 == t || t1 == last)
11704 return first;
11705 if (!__make<__list>(__root_))
11706 return first;
11707 if (args == 0)
11708 args = __root_;
11709 if (prev)
11710 {
11711 prev->__right_ = __root_;
11712 __root_->__size_ = prev->__size_ + 1;
11713 }
11714 prev = __root_;
11715 t = t1;
11716 }
11717 ++t;
11718 if (__make<__call_expr>(name, args))
11719 first = t;
11720 }
11721 }
11722 return first;
11723}
11724
11725// cv <type> <expression> # conversion with one argument
11726// cv <type> _ <expression>* E # conversion with a different number of arguments
11727
11728const char*
11729__demangle_tree::__parse_conversion_expr(const char* first, const char* last)
11730{
11731 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
11732 {
11733 const char* t = __parse_type(first+2, last);
11734 if (t != first+2 && t != last)
11735 {
11736 __node* type = __root_;
11737 __node* args = 0;
11738 if (*t != '_')
11739 {
11740 const char* t1 = __parse_expression(t, last);
11741 if (t1 == t)
11742 return first;
11743 args = __root_;
11744 t = t1;
11745 }
11746 else
11747 {
11748 ++t;
11749 if (t == last)
11750 return first;
11751 __node* prev = 0;
11752 while (*t != 'E')
11753 {
11754 const char* t1 = __parse_expression(t, last);
11755 if (t1 == t || t1 == last)
11756 return first;
11757 if (!__make<__list>(__root_))
11758 return first;
11759 if (args == 0)
11760 args = __root_;
11761 if (prev)
11762 {
11763 prev->__right_ = __root_;
11764 __root_->__size_ = prev->__size_ + 1;
11765 }
11766 prev = __root_;
11767 t = t1;
11768 }
11769 ++t;
11770 }
11771 if (__make<__operator_cast>(type, args))
11772 first = t;
11773 }
11774 }
11775 return first;
11776}
11777
11778// [gs] da <expression> # delete[] expression
11779
11780const char*
11781__demangle_tree::__parse_delete_array_expr(const char* first, const char* last)
11782{
11783 if (last - first >= 4)
11784 {
11785 const char* t = first;
11786 bool parsed_gs = false;
11787 if (t[0] == 'g' && t[1] == 's')
11788 {
11789 t += 2;
11790 parsed_gs = true;
11791 }
11792 if (t[0] == 'd' && t[1] == 'a')
11793 {
11794 t += 2;
11795 const char* t1 = __parse_expression(t, last);
11796 if (t1 != t)
11797 {
11798 if (__make<__delete_array_expr>(parsed_gs, __root_))
11799 first = t1;
11800 }
11801 }
11802 }
11803 return first;
11804}
11805
11806// dc <type> <expression> # dynamic_cast<type> (expression)
11807
11808const char*
11809__demangle_tree::__parse_dynamic_cast_expr(const char* first, const char* last)
11810{
11811 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
11812 {
11813 const char* t = __parse_type(first+2, last);
11814 if (t != first+2)
11815 {
11816 __node* type = __root_;
11817 const char* t1 = __parse_expression(t, last);
11818 if (t1 != t)
11819 {
11820 if (__make<__dynamic_cast>(type, __root_))
11821 first = t1;
11822 }
11823 }
11824 }
11825 return first;
11826}
11827
11828// [gs] dl <expression> # delete expression
11829
11830const char*
11831__demangle_tree::__parse_delete_expr(const char* first, const char* last)
11832{
11833 if (last - first >= 4)
11834 {
11835 const char* t = first;
11836 bool parsed_gs = false;
11837 if (t[0] == 'g' && t[1] == 's')
11838 {
11839 t += 2;
11840 parsed_gs = true;
11841 }
11842 if (t[0] == 'd' && t[1] == 'l')
11843 {
11844 t += 2;
11845 const char* t1 = __parse_expression(t, last);
11846 if (t1 != t)
11847 {
11848 if (__make<__delete_expr>(parsed_gs, __root_))
11849 first = t1;
11850 }
11851 }
11852 }
11853 return first;
11854}
11855
11856// ds <expression> <expression> # expr.*expr
11857
11858const char*
11859__demangle_tree::__parse_dot_star_expr(const char* first, const char* last)
11860{
11861 if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
11862 {
11863 const char* t = __parse_expression(first+2, last);
11864 if (t != first+2)
11865 {
11866 __node* expr = __root_;
11867 const char* t1 = __parse_expression(t, last);
11868 if (t1 != t)
11869 {
11870 if (__make<__dot_star_expr>(expr, __root_))
11871 first = t1;
11872 }
11873 }
11874 }
11875 return first;
11876}
11877
11878// dt <expression> <unresolved-name> # expr.name
11879
11880const char*
11881__demangle_tree::__parse_dot_expr(const char* first, const char* last)
11882{
11883 if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
11884 {
11885 const char* t = __parse_expression(first+2, last);
11886 if (t != first+2)
11887 {
11888 __node* expr = __root_;
11889 const char* t1 = __parse_unresolved_name(t, last);
11890 if (t1 != t)
11891 {
11892 if (__make<__dot_expr>(expr, __root_))
11893 first = t1;
11894 }
11895 }
11896 }
11897 return first;
11898}
11899
11900// mm_ <expression> # prefix --
11901
11902const char*
11903__demangle_tree::__parse_decrement_expr(const char* first, const char* last)
11904{
11905 if (last - first > 3 && first[0] == 'm' && first[1] == 'm' && first[2] == '_')
11906 {
11907 const char* t = __parse_expression(first+3, last);
11908 if (t != first+3)
11909 {
11910 if (__make<__operator_decrement>(true, __root_))
11911 first = t;
11912 }
11913 }
11914 return first;
11915}
11916
11917// pp_ <expression> # prefix ++
11918
11919const char*
11920__demangle_tree::__parse_increment_expr(const char* first, const char* last)
11921{
11922 if (last - first > 3 && first[0] == 'p' && first[1] == 'p' && first[2] == '_')
11923 {
11924 const char* t = __parse_expression(first+3, last);
11925 if (t != first+3)
11926 {
11927 if (__make<__operator_increment>(true, __root_))
11928 first = t;
11929 }
11930 }
11931 return first;
11932}
11933
11934// [gs] nw <expression>* _ <type> E # new (expr-list) type
11935// [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
11936// [gs] na <expression>* _ <type> E # new[] (expr-list) type
11937// [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
11938// <initializer> ::= pi <expression>* E # parenthesized initialization
11939
11940const char*
11941__demangle_tree::__parse_new_expr(const char* first, const char* last)
11942{
11943 if (last - first >= 4)
11944 {
11945 const char* t = first;
11946 bool parsed_gs = false;
11947 if (t[0] == 'g' && t[1] == 's')
11948 {
11949 t += 2;
11950 parsed_gs = true;
11951 }
11952 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
11953 {
11954 bool is_array = t[1] == 'a';
11955 t += 2;
11956 if (t == last)
11957 return first;
11958 __node* expr = 0;
11959 __node* prev = 0;
11960 while (*t != '_')
11961 {
11962 const char* t1 = __parse_expression(t, last);
11963 if (t1 == t || t1 == last)
11964 return first;
11965 if (!__make<__list>(__root_))
11966 return first;
11967 if (expr == 0)
11968 expr = __root_;
11969 if (prev)
11970 {
11971 prev->__right_ = __root_;
11972 __root_->__size_ = prev->__size_ + 1;
11973 }
11974 prev = __root_;
11975 t = t1;
11976 }
11977 ++t;
11978 const char* t1 = __parse_type(t, last);
11979 if (t1 == t || t1 == last)
11980 return first;
11981 t = t1;
11982 __node* type = __root_;
11983 __node* init = 0;
11984 prev = 0;
11985 bool has_init = false;
11986 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
11987 {
11988 t += 2;
11989 has_init = true;
11990 while (*t != 'E')
11991 {
11992 t1 = __parse_expression(t, last);
11993 if (t1 == t || t1 == last)
11994 return first;
11995 if (!__make<__list>(__root_))
11996 return first;
11997 if (init == 0)
11998 init = __root_;
11999 if (prev)
12000 {
12001 prev->__right_ = __root_;
12002 __root_->__size_ = prev->__size_ + 1;
12003 }
12004 prev = __root_;
12005 t = t1;
12006 }
12007 }
12008 if (*t != 'E')
12009 return first;
12010 if (__make<__new_expr>(parsed_gs, is_array, has_init,
12011 expr, type, init))
12012 first = t;
12013 }
12014 }
12015 return first;
12016}
12017
12018// pt <expression> <unresolved-name> # expr->name
12019
12020const char*
12021__demangle_tree::__parse_arrow_expr(const char* first, const char* last)
12022{
12023 if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
12024 {
12025 const char* t = __parse_expression(first+2, last);
12026 if (t != first+2)
12027 {
12028 __node* expr = __root_;
12029 const char* t1 = __parse_unresolved_name(t, last);
12030 if (t1 != t)
12031 {
12032 if (__make<__arrow_expr>(expr, __root_))
12033 first = t1;
12034 }
12035 }
12036 }
12037 return first;
12038}
12039
12040// rc <type> <expression> # reinterpret_cast<type> (expression)
12041
12042const char*
12043__demangle_tree::__parse_reinterpret_cast_expr(const char* first, const char* last)
12044{
12045 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
12046 {
12047 const char* t = __parse_type(first+2, last);
12048 if (t != first+2)
12049 {
12050 __node* type = __root_;
12051 const char* t1 = __parse_expression(t, last);
12052 if (t1 != t)
12053 {
12054 if (__make<__reinterpret_cast>(type, __root_))
12055 first = t1;
12056 }
12057 }
12058 }
12059 return first;
12060}
12061
12062// sc <type> <expression> # static_cast<type> (expression)
12063
12064const char*
12065__demangle_tree::__parse_static_cast_expr(const char* first, const char* last)
12066{
12067 if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
12068 {
12069 const char* t = __parse_type(first+2, last);
12070 if (t != first+2)
12071 {
12072 __node* type = __root_;
12073 const char* t1 = __parse_expression(t, last);
12074 if (t1 != t)
12075 {
12076 if (__make<__static_cast>(type, __root_))
12077 first = t1;
12078 }
12079 }
12080 }
12081 return first;
12082}
12083
12084// st <type> # sizeof (a type)
12085
12086const char*
12087__demangle_tree::__parse_sizeof_type_expr(const char* first, const char* last)
12088{
12089 if (last - first >= 3 && first[0] == 's' && first[1] == 't')
12090 {
12091 const char* t = __parse_type(first+2, last);
12092 if (t != first+2)
12093 {
12094 if (__make<__operator_sizeof_expression>(__root_))
12095 first = t;
12096 }
12097 }
12098 return first;
12099}
12100
12101// sZ <template-param> # size of a parameter pack
12102
12103const char*
12104__demangle_tree::__parse_sizeof_param_pack_expr(const char* first, const char* last)
12105{
12106 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
12107 {
12108 const char* t = __parse_template_param(first+2, last);
12109 if (t != first+2)
12110 {
12111 if (__make<__operator_sizeof_param_pack>(__root_))
12112 first = t;
12113 }
12114 }
12115 return first;
12116}
12117
12118// sZ <function-param> # size of a function parameter pack
12119
12120const char*
12121__demangle_tree::__parse_sizeof_function_param_pack_expr(const char* first, const char* last)
12122{
12123 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
12124 {
12125 const char* t = __parse_function_param(first+2, last);
12126 if (t != first+2)
12127 {
12128 if (__make<__operator_sizeof_param_pack>(__root_))
12129 first = t;
12130 }
12131 }
12132 return first;
12133}
12134
12135// sp <expression> # pack expansion
12136
12137const char*
12138__demangle_tree::__parse_pack_expansion(const char* first, const char* last)
12139{
12140 if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
12141 {
12142 const char* t = __parse_expression(first+2, last);
12143 if (t != first+2)
12144 {
12145 if (__make<__pack_expansion>(__root_))
12146 first = t;
12147 }
12148 }
12149 return first;
12150}
12151
12152// te <expression> # typeid (expression)
12153// ti <type> # typeid (type)
12154
12155const char*
12156__demangle_tree::__parse_typeid_expr(const char* first, const char* last)
12157{
12158 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
12159 {
12160 const char* t;
12161 if (first[1] == 'e')
12162 t = __parse_expression(first+2, last);
12163 else
12164 t = __parse_type(first+2, last);
12165 if (t != first+2)
12166 {
12167 if (__make<__typeid>(__root_))
12168 first = t;
12169 }
12170 }
12171 return first;
12172}
12173
12174// tw <expression> # throw expression
12175
12176const char*
12177__demangle_tree::__parse_throw_expr(const char* first, const char* last)
12178{
12179 if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
12180 {
12181 const char* t = __parse_expression(first+2, last);
12182 if (t != first+2)
12183 {
12184 if (__make<__throw>(__root_))
12185 first = t;
12186 }
12187 }
12188 return first;
12189}
12190
12191// <expression> ::= <unary operator-name> <expression>
12192// ::= <binary operator-name> <expression> <expression>
12193// ::= <ternary operator-name> <expression> <expression> <expression>
12194// ::= cl <expression>+ E # call
12195// ::= cv <type> <expression> # conversion with one argument
12196// ::= cv <type> _ <expression>* E # conversion with a different number of arguments
12197// ::= [gs] nw <expression>* _ <type> E # new (expr-list) type
12198// ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
12199// ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type
12200// ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
12201// ::= [gs] dl <expression> # delete expression
12202// ::= [gs] da <expression> # delete[] expression
12203// ::= pp_ <expression> # prefix ++
12204// ::= mm_ <expression> # prefix --
12205// ::= ti <type> # typeid (type)
12206// ::= te <expression> # typeid (expression)
12207// ::= dc <type> <expression> # dynamic_cast<type> (expression)
12208// ::= sc <type> <expression> # static_cast<type> (expression)
12209// ::= cc <type> <expression> # const_cast<type> (expression)
12210// ::= rc <type> <expression> # reinterpret_cast<type> (expression)
12211// ::= st <type> # sizeof (a type)
12212// ::= at <type> # alignof (a type)
12213// ::= <template-param>
12214// ::= <function-param>
12215// ::= dt <expression> <unresolved-name> # expr.name
12216// ::= pt <expression> <unresolved-name> # expr->name
12217// ::= ds <expression> <expression> # expr.*expr
12218// ::= sZ <template-param> # size of a parameter pack
12219// ::= sZ <function-param> # size of a function parameter pack
12220// ::= sp <expression> # pack expansion
12221// ::= tw <expression> # throw expression
12222// ::= tr # throw with no operand (rethrow)
12223// ::= <unresolved-name> # f(p), N::f(p), ::f(p),
12224// # freestanding dependent name (e.g., T::x),
12225// # objectless nonstatic member reference
12226// ::= <expr-primary>
12227
12228const char*
12229__demangle_tree::__parse_expression(const char* first, const char* last)
12230{
12231 if (last - first >= 2)
12232 {
12233 const char* t = first;
12234 bool parsed_gs = false;
12235 if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
12236 {
12237 t += 2;
12238 parsed_gs = true;
12239 }
12240 switch (*t)
12241 {
12242 case 'L':
12243 t = __parse_expr_primary(first, last);
12244 break;
12245 case 'T':
12246 t = __parse_template_param(first, last);
12247 break;
12248 case 'f':
12249 t = __parse_function_param(first, last);
12250 break;
12251 case 'a':
12252 if (t[1] == 't')
12253 t = __parse_alignof_expr(first, last);
12254 break;
12255 case 'c':
12256 switch (t[1])
12257 {
12258 case 'c':
12259 t = __parse_const_cast_expr(first, last);
12260 break;
12261 case 'l':
12262 t = __parse_call_expr(first, last);
12263 break;
12264 case 'v':
12265 t = __parse_conversion_expr(first, last);
12266 break;
12267 }
12268 break;
12269 case 'd':
12270 switch (t[1])
12271 {
12272 case 'a':
12273 t = __parse_delete_array_expr(first, last);
12274 break;
12275 case 'c':
12276 t = __parse_dynamic_cast_expr(first, last);
12277 break;
12278 case 'l':
12279 t = __parse_delete_expr(first, last);
12280 break;
12281 case 's':
12282 t = __parse_dot_star_expr(first, last);
12283 break;
12284 case 't':
12285 t = __parse_dot_expr(first, last);
12286 break;
12287 }
12288 break;
12289 case 'm':
12290 t = __parse_decrement_expr(first, last);
12291 break;
12292 case 'n':
12293 switch (t[1])
12294 {
12295 case 'a':
12296 case 'w':
12297 t = __parse_new_expr(first, last);
12298 break;
12299 }
12300 break;
12301 case 'p':
12302 switch (t[1])
12303 {
12304 case 'p':
12305 t = __parse_increment_expr(first, last);
12306 break;
12307 case 't':
12308 t = __parse_arrow_expr(first, last);
12309 break;
12310 }
12311 break;
12312 case 'r':
12313 t = __parse_reinterpret_cast_expr(first, last);
12314 break;
12315 case 's':
12316 switch (t[1])
12317 {
12318 case 'c':
12319 t = __parse_static_cast_expr(first, last);
12320 break;
12321 case 'p':
12322 t = __parse_pack_expansion(first, last);
12323 break;
12324 case 't':
12325 t = __parse_sizeof_type_expr(first, last);
12326 break;
12327 case 'Z':
12328 if (last - t >= 3)
12329 {
12330 switch (t[2])
12331 {
12332 case 'T':
12333 t = __parse_sizeof_param_pack_expr(first, last);
12334 break;
12335 case 'f':
12336 t = __parse_sizeof_function_param_pack_expr(first, last);
12337 break;
12338 }
12339 }
12340 break;
12341 }
12342 break;
12343 case 't':
12344 switch (t[1])
12345 {
12346 case 'e':
12347 case 'i':
12348 t = __parse_typeid_expr(first, last);
12349 break;
12350 case 'r':
12351 if (__make<__rethrow>())
12352 t = first +2;
12353 break;
12354 case 'w':
12355 t = __parse_throw_expr(first, last);
12356 break;
12357 }
12358 break;
12359 }
12360 if ((!parsed_gs && t == first) || (parsed_gs && t == first+2))
12361 {
12362 int op;
12363 t = __parse_operator_name(first, last, &op);
12364 if (t == first)
12365 first = __parse_unresolved_name(first, last);
12366 else
12367 first = t;
12368 }
12369 else
12370 first = t;
12371 }
12372 return first;
12373}
12374
12375// <array-type> ::= A <positive dimension number> _ <element type>
12376// ::= A [<dimension expression>] _ <element type>
12377
12378const char*
12379__demangle_tree::__parse_array_type(const char* first, const char* last)
12380{
12381 if (first != last && *first == 'A' && first+1 != last)
12382 {
12383 if (first[1] == '_')
12384 {
12385 const char* t = __parse_type(first+2, last);
12386 if (t != first+2)
12387 {
12388 if (__make<__array>(__root_))
12389 first = t;
12390 }
12391 }
12392 else if ('1' <= first[1] && first[1] <= '9')
12393 {
12394 size_t dim = first[1] - '0';
12395 const char* t = first+2;
12396 for (; t != last && isdigit(*t); ++t)
12397 dim = dim * 10 + *t - '0';
12398 if (t != last && *t == '_')
12399 {
12400 const char* t2 = __parse_type(t+1, last);
12401 if (t2 != t+1)
12402 {
12403 if (__make<__array>(__root_, dim))
12404 first = t2;
12405 }
12406 }
12407 }
12408 else
12409 {
12410 const char* t = __parse_expression(first+1, last);
12411 if (t != first+1 && t != last && *t == '_')
12412 {
12413 __node* dim = __root_;
12414 const char* t2 = __parse_type(++t, last);
12415 if (t2 != t)
12416 {
12417 if (__make<__array>(__root_, dim))
12418 first = t2;
12419 }
12420 }
12421 }
12422 }
12423 return first;
12424}
12425
12426// <class-enum-type> ::= <name>
12427
12428const char*
12429__demangle_tree::__parse_class_enum_type(const char* first, const char* last)
12430{
12431 return __parse_name(first, last);
12432}
12433
12434// <pointer-to-member-type> ::= M <class type> <member type>
12435
12436const char*
12437__demangle_tree::__parse_pointer_to_member_type(const char* first, const char* last)
12438{
12439 if (first != last && *first == 'M')
12440 {
12441 const char* t = __parse_type(first+1, last);
12442 if (t != first+1)
12443 {
12444 __node* class_type = __root_;
12445 const char* t2 = __parse_type(t, last, true, true);
12446 if (t2 != t)
12447 {
12448 if (__make<__pointer_to_member_type>(class_type, __root_))
12449 first = t2;
12450 }
12451 }
12452 }
12453 return first;
12454}
12455
12456// <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x)
12457// ::= DT <expression> E # decltype of an expression (C++0x)
12458
12459const char*
12460__demangle_tree::__parse_decltype(const char* first, const char* last)
12461{
12462 if (last - first >= 4 && first[0] == 'D')
12463 {
12464 switch (first[1])
12465 {
12466 case 't':
12467 case 'T':
12468 {
12469 const char* t = __parse_expression(first+2, last);
12470 if (t != first+2 && t != last && *t == 'E')
12471 {
12472 if (__make<__decltype_node>(__root_))
12473 first = t+1;
12474 }
12475 }
12476 break;
12477 }
12478 }
12479 return first;
12480}
12481
12482// <template-param> ::= T_ # first template parameter
12483// ::= T <parameter-2 non-negative number> _
12484
12485const char*
12486__demangle_tree::__parse_template_param(const char* first, const char* last)
12487{
12488 if (last - first >= 2)
12489 {
12490 if (*first == 'T')
12491 {
12492 if (first[1] == '_')
12493 {
12494 if (__t_begin_ != __t_end_)
12495 {
12496 if (__make<__sub>(*__t_begin_))
12497 first += 2;
12498 }
12499 else
12500 {
12501 if (__make<__sub>(size_t(0)))
12502 {
12503 first += 2;
12504 __fix_forward_references_ = true;
12505 }
12506 }
12507 }
12508 else if (isdigit(first[1]))
12509 {
12510 const char* t = first+1;
12511 size_t sub = *t - '0';
12512 for (++t; t != last && isdigit(*t); ++t)
12513 {
12514 sub *= 10;
12515 sub += *t - '0';
12516 }
12517 if (t == last || *t != '_')
12518 return first;
12519 ++sub;
12520 if (sub < __t_end_ - __t_begin_)
12521 {
12522 if (__make<__sub>(__t_begin_[sub]))
12523 first = t+1;
12524 }
12525 else
12526 {
12527 if (__make<__sub>(sub))
12528 {
12529 first = t+1;
12530 __fix_forward_references_ = true;
12531 }
12532 }
12533 }
12534 }
12535 }
12536 return first;
12537}
12538
12539// <type> ::= <builtin-type>
12540// ::= <function-type>
12541// ::= <class-enum-type>
12542// ::= <array-type>
12543// ::= <pointer-to-member-type>
12544// ::= <template-param>
12545// ::= <template-template-param> <template-args>
12546// ::= <decltype>
12547// ::= <substitution>
12548// ::= <CV-qualifiers> <type>
12549// ::= P <type> # pointer-to
12550// ::= R <type> # reference-to
12551// ::= O <type> # rvalue reference-to (C++0x)
12552// ::= C <type> # complex pair (C 2000)
12553// ::= G <type> # imaginary (C 2000)
12554// ::= Dp <type> # pack expansion (C++0x)
12555// ::= U <source-name> <type> # vendor extended type qualifier
12556
12557const char*
12558__demangle_tree::__parse_type(const char* first, const char* last,
12559 bool try_to_parse_template_args,
12560 bool look_for_ref_quals)
12561{
12562 unsigned cv = 0;
12563 const char* t = __parse_cv_qualifiers(first, last, cv, look_for_ref_quals);
12564 if (t != first)
12565 {
12566 const char* t2 = __parse_type(t, last, try_to_parse_template_args);
12567 if (t2 != t)
12568 {
12569 if (__make<__cv_qualifiers>(cv, __root_))
12570 {
12571 if (__sub_end_ == __sub_cap_)
12572 __status_ = memory_alloc_failure;
12573 else
12574 {
12575 *__sub_end_++ = __root_;
12576 first = t2;
12577 }
12578 }
12579 }
12580 return first;
12581 }
12582 if (first != last)
12583 {
12584 switch (*first)
12585 {
12586 case 'A':
12587 t = __parse_array_type(first, last);
12588 if (t != first)
12589 {
12590 if (__sub_end_ == __sub_cap_)
12591 __status_ = memory_alloc_failure;
12592 else
12593 {
12594 *__sub_end_++ = __root_;
12595 first = t;
12596 }
12597 }
12598 break;
12599 case 'C':
12600 t = __parse_type(first+1, last, try_to_parse_template_args);
12601 if (t != first+1)
12602 {
12603 if (__make<__d_complex>(__root_))
12604 {
12605 if (__sub_end_ == __sub_cap_)
12606 __status_ = memory_alloc_failure;
12607 else
12608 {
12609 *__sub_end_++ = __root_;
12610 first = t;
12611 }
12612 }
12613 return first;
12614 }
12615 break;
12616 case 'F':
12617 t = __parse_function_type(first, last);
12618 if (t != first)
12619 {
12620 if (__sub_end_ == __sub_cap_)
12621 __status_ = memory_alloc_failure;
12622 else
12623 {
12624 *__sub_end_++ = __root_;
12625 first = t;
12626 }
12627 }
12628 break;
12629 case 'G':
12630 t = __parse_type(first+1, last, try_to_parse_template_args);
12631 if (t != first+1)
12632 {
12633 if (__make<__imaginary>(__root_))
12634 {
12635 if (__sub_end_ == __sub_cap_)
12636 __status_ = memory_alloc_failure;
12637 else
12638 {
12639 *__sub_end_++ = __root_;
12640 first = t;
12641 }
12642 }
12643 return first;
12644 }
12645 break;
12646 case 'M':
12647 t = __parse_pointer_to_member_type(first, last);
12648 if (t != first)
12649 {
12650 if (__sub_end_ == __sub_cap_)
12651 __status_ = memory_alloc_failure;
12652 else
12653 {
12654 *__sub_end_++ = __root_;
12655 first = t;
12656 }
12657 }
12658 break;
12659 case 'O':
12660 t = __parse_type(first+1, last, try_to_parse_template_args);
12661 if (t != first+1)
12662 {
12663 if (__make<__rvalue_reference_to>(__root_))
12664 {
12665 if (__sub_end_ == __sub_cap_)
12666 __status_ = memory_alloc_failure;
12667 else
12668 {
12669 *__sub_end_++ = __root_;
12670 first = t;
12671 }
12672 }
12673 return first;
12674 }
12675 break;
12676 case 'P':
12677 t = __parse_type(first+1, last, try_to_parse_template_args);
12678 if (t != first+1)
12679 {
12680 if (__make<__pointer_to>(__root_))
12681 {
12682 if (__sub_end_ == __sub_cap_)
12683 __status_ = memory_alloc_failure;
12684 else
12685 {
12686 *__sub_end_++ = __root_;
12687 first = t;
12688 }
12689 }
12690 return first;
12691 }
12692 break;
12693 case 'R':
12694 t = __parse_type(first+1, last, try_to_parse_template_args);
12695 if (t != first+1)
12696 {
12697 if (__make<__lvalue_reference_to>(__root_))
12698 {
12699 if (__sub_end_ == __sub_cap_)
12700 __status_ = memory_alloc_failure;
12701 else
12702 {
12703 *__sub_end_++ = __root_;
12704 first = t;
12705 }
12706 }
12707 return first;
12708 }
12709 break;
12710 case 'T':
12711 t = __parse_template_param(first, last);
12712 if (t != first)
12713 {
12714 if (__sub_end_ == __sub_cap_)
12715 __status_ = memory_alloc_failure;
12716 else
12717 {
12718 *__sub_end_++ = __root_;
12719 if (try_to_parse_template_args)
12720 {
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000012721 const char* t2 = __parse_template_args(t, last);
12722 if (t2 != t)
12723 {
12724 if (__sub_end_ < __sub_cap_)
12725 {
12726 *__sub_end_++ = __root_;
12727 first = t2;
12728 }
12729 else
12730 __status_ = memory_alloc_failure;
12731 }
12732 else
12733 {
12734 first = t;
12735 }
12736 }
12737 else
12738 {
12739 first = t;
12740 }
12741 }
12742 }
12743 break;
12744 case 'U':
12745 if (first+1 != last)
12746 {
12747 t = __parse_source_name(first+1, last);
12748 if (t != first+1)
12749 {
12750 __node* name = __root_;
12751 const char* t2 = __parse_type(t, last, try_to_parse_template_args);
12752 if (t2 != t)
12753 {
12754 if (__make<__extended_qualifier>(name, __root_))
12755 {
12756 if (__sub_end_ == __sub_cap_)
12757 __status_ = memory_alloc_failure;
12758 else
12759 {
12760 *__sub_end_++ = __root_;
12761 first = t2;
12762 }
12763 }
12764 return first;
12765 }
12766 }
12767 }
12768 break;
12769 case 'S':
12770 if (first+1 != last && first[1] == 't')
12771 {
12772 t = __parse_class_enum_type(first, last);
12773 if (t != first)
12774 {
12775 if (__sub_end_ == __sub_cap_)
12776 __status_ = memory_alloc_failure;
12777 else
12778 {
12779 *__sub_end_++ = __root_;
12780 first = t;
12781 }
12782 }
12783 }
12784 else
12785 {
12786 t = __parse_substitution(first, last);
12787 if (t != first)
12788 {
12789 first = t;
12790 // Parsed a substitution. If the substitution is a
12791 // <template-param> it might be followed by <template-args>.
12792 t = __parse_template_args(first, last);
12793 if (t != first)
12794 {
12795 // Need to create substitution for <template-template-param> <template-args>
12796 if (__sub_end_ == __sub_cap_)
12797 __status_ = memory_alloc_failure;
12798 else
12799 {
12800 *__sub_end_++ = __root_;
12801 first = t;
12802 }
12803 }
12804 }
12805 }
12806 break;
12807 case 'D':
12808 if (first+1 != last)
12809 {
12810 switch (first[1])
12811 {
12812 case 'p':
12813 t = __parse_type(first+2, last, try_to_parse_template_args);
12814 if (t != first+1)
12815 {
12816 if (__make<__pack_expansion>(__root_))
12817 {
12818 if (__sub_end_ == __sub_cap_)
12819 __status_ = memory_alloc_failure;
12820 else
12821 {
12822 *__sub_end_++ = __root_;
12823 first = t;
12824 }
12825 }
12826 return first;
12827 }
12828 break;
12829 case 't':
12830 case 'T':
12831 t = __parse_decltype(first, last);
12832 if (t != first)
12833 {
12834 if (__sub_end_ == __sub_cap_)
12835 __status_ = memory_alloc_failure;
12836 else
12837 {
12838 *__sub_end_++ = __root_;
12839 first = t;
12840 }
12841 return first;
12842 }
12843 break;
12844 }
12845 }
12846 // drop through
12847 default:
12848 // must check for builtin-types before class-enum-types to avoid
12849 // ambiguities with operator-names
12850 t = __parse_builtin_type(first, last);
12851 if (t != first)
12852 {
12853 first = t;
12854 }
12855 else
12856 {
12857 t = __parse_class_enum_type(first, last);
12858 if (t != first)
12859 {
12860 if (__sub_end_ == __sub_cap_)
12861 __status_ = memory_alloc_failure;
12862 else
12863 {
12864 *__sub_end_++ = __root_;
12865 first = t;
12866 }
12867 }
12868 }
12869 break;
12870 }
12871 }
12872 return first;
12873}
12874
12875// <number> ::= [n] <non-negative decimal integer>
12876
12877const char*
12878__demangle_tree::__parse_number(const char* first, const char* last)
12879{
12880 if (first != last)
12881 {
12882 const char* t = first;
12883 if (*t == 'n')
12884 ++t;
12885 if (t != last)
12886 {
12887 if (*t == '0')
12888 {
12889 first = t+1;
12890 }
12891 else if ('1' <= *t && *t <= '9')
12892 {
12893 first = t+1;
12894 while (first != last && isdigit(*first))
12895 ++first;
12896 }
12897 }
12898 }
12899 return first;
12900}
12901
12902// <call-offset> ::= h <nv-offset> _
12903// ::= v <v-offset> _
12904//
12905// <nv-offset> ::= <offset number>
12906// # non-virtual base override
12907//
12908// <v-offset> ::= <offset number> _ <virtual offset number>
12909// # virtual base override, with vcall offset
12910
12911const char*
12912__demangle_tree::__parse_call_offset(const char* first, const char* last)
12913{
12914 if (first != last)
12915 {
12916 switch (*first)
12917 {
12918 case 'h':
12919 {
12920 const char* t = __parse_number(first + 1, last);
12921 if (t != first + 1 && t != last && *t == '_')
12922 first = t + 1;
12923 }
12924 break;
12925 case 'v':
12926 {
12927 const char* t = __parse_number(first + 1, last);
12928 if (t != first + 1 && t != last && *t == '_')
12929 {
12930 const char* t2 = __parse_number(++t, last);
12931 if (t2 != t && t2 != last && *t2 == '_')
12932 first = t2 + 1;
12933 }
12934 }
12935 break;
12936 }
12937 }
12938 return first;
12939}
12940
12941// <special-name> ::= TV <type> # virtual table
12942// ::= TT <type> # VTT structure (construction vtable index)
12943// ::= TI <type> # typeinfo structure
12944// ::= TS <type> # typeinfo name (null-terminated byte string)
12945// ::= Tc <call-offset> <call-offset> <base encoding>
12946// # base is the nominal target function of thunk
12947// # first call-offset is 'this' adjustment
12948// # second call-offset is result adjustment
12949// ::= T <call-offset> <base encoding>
12950// # base is the nominal target function of thunk
12951// ::= GV <object name> # Guard variable for one-time initialization
12952// # No <type>
Howard Hinnant10115242011-12-09 20:07:56 +000012953// extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
12954// extension ::= GR <object name> # reference temporary for object
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000012955
12956const char*
12957__demangle_tree::__parse_special_name(const char* first, const char* last)
12958{
12959 if (last - first > 2)
12960 {
12961 const char* t;
12962 switch (*first)
12963 {
12964 case 'T':
12965 switch (first[1])
12966 {
12967 case 'V':
12968 // TV <type> # virtual table
12969 t = __parse_type(first+2, last);
12970 if (t != first+2 && __make<__vtable>(__root_))
12971 first = t;
12972 break;
12973 case 'T':
12974 // TT <type> # VTT structure (construction vtable index)
12975 t = __parse_type(first+2, last);
12976 if (t != first+2 && __make<__VTT>(__root_))
12977 first = t;
12978 break;
12979 case 'I':
12980 // TI <type> # typeinfo structure
12981 t = __parse_type(first+2, last);
12982 if (t != first+2 && __make<__typeinfo>(__root_))
12983 first = t;
12984 break;
12985 case 'S':
12986 // TS <type> # typeinfo name (null-terminated byte string)
12987 t = __parse_type(first+2, last);
12988 if (t != first+2 && __make<__typeinfo_name>(__root_))
12989 first = t;
12990 break;
12991 case 'c':
12992 // Tc <call-offset> <call-offset> <base encoding>
12993 {
12994 const char* t0 = __parse_call_offset(first+2, last);
12995 if (t0 == first+2)
12996 break;
12997 const char* t1 = __parse_call_offset(t0, last);
12998 if (t1 == t0)
12999 break;
13000 t = __parse_encoding(t1, last);
13001 if (t != t1 && __make<__covariant_return_thunk>(__root_))
13002 first = t;
13003 }
13004 break;
Howard Hinnant10115242011-12-09 20:07:56 +000013005 case 'C':
13006 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
13007 t = __parse_type(first+2, last);
13008 if (t != first+2)
13009 {
13010 __node* op1 = __root_;
13011 const char* t0 = __parse_number(t, last);
13012 if (t0 != t && t0 != last && *t0 == '_')
13013 {
13014 const char* t1 = __parse_type(++t0, last);
13015 if (t1 != t0)
13016 {
13017 if (__make<__construction_vtable>(__root_, op1))
13018 first = t1;
13019 }
13020 }
13021 }
13022 break;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000013023 default:
13024 // T <call-offset> <base encoding>
13025 {
13026 const char* t0 = __parse_call_offset(first+1, last);
13027 if (t0 == first+1)
13028 break;
13029 t = __parse_encoding(t0, last);
13030 if (t != t0)
13031 {
13032 if (first[2] == 'v')
13033 {
13034 if (__make<__virtual_thunk>(__root_))
13035 first = t;
13036 }
13037 else
13038 {
13039 if (__make<__non_virtual_thunk>(__root_))
13040 first = t;
13041 }
13042 }
13043 }
13044 break;
13045 }
13046 break;
13047 case 'G':
Howard Hinnant10115242011-12-09 20:07:56 +000013048 switch (first[1])
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000013049 {
Howard Hinnant10115242011-12-09 20:07:56 +000013050 case 'V':
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000013051 // GV <object name> # Guard variable for one-time initialization
13052 t = __parse_name(first+2, last);
13053 if (t != first+2 && __make<__guard_variable>(__root_))
13054 first = t;
Howard Hinnant10115242011-12-09 20:07:56 +000013055 break;
13056 case 'R':
13057 // extension ::= GR <object name> # reference temporary for object
13058 t = __parse_name(first+2, last);
13059 if (t != first+2 && __make<__reference_temporary>(__root_))
13060 first = t;
13061 break;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000013062 }
13063 break;
13064 }
13065 }
13066 return first;
13067}
13068
13069// <operator-name>
13070// ::= aa # &&
13071// ::= ad # & (unary)
13072// ::= an # &
13073// ::= aN # &=
13074// ::= aS # =
13075// ::= at # alignof (a type)
13076// ::= az # alignof (an expression)
13077// ::= cl # ()
13078// ::= cm # ,
13079// ::= co # ~
13080// ::= cv <type> # (cast)
13081// ::= da # delete[]
13082// ::= de # * (unary)
13083// ::= dl # delete
13084// ::= dv # /
13085// ::= dV # /=
13086// ::= eo # ^
13087// ::= eO # ^=
13088// ::= eq # ==
13089// ::= ge # >=
13090// ::= gt # >
13091// ::= ix # []
13092// ::= le # <=
13093// ::= ls # <<
13094// ::= lS # <<=
13095// ::= lt # <
13096// ::= mi # -
13097// ::= mI # -=
13098// ::= ml # *
13099// ::= mL # *=
13100// ::= mm # -- (postfix in <expression> context)
13101// ::= na # new[]
13102// ::= ne # !=
13103// ::= ng # - (unary)
13104// ::= nt # !
13105// ::= nw # new
13106// ::= oo # ||
13107// ::= or # |
13108// ::= oR # |=
13109// ::= pm # ->*
13110// ::= pl # +
13111// ::= pL # +=
13112// ::= pp # ++ (postfix in <expression> context)
13113// ::= ps # + (unary)
13114// ::= pt # ->
13115// ::= qu # ?
13116// ::= rm # %
13117// ::= rM # %=
13118// ::= rs # >>
13119// ::= rS # >>=
13120// ::= st # sizeof (a type)
13121// ::= sz # sizeof (an expression)
13122// ::= v <digit> <source-name> # vendor extended operator
13123
13124const char*
13125__demangle_tree::__parse_operator_name(const char* first, const char* last, int* type)
13126{
13127 if (last - first >= 2)
13128 {
13129 switch (*first)
13130 {
13131 case 'a':
13132 switch (first[1])
13133 {
13134 case 'a':
13135 // &&
13136 if (type)
13137 {
13138 const char* t = __parse_expression(first+2, last);
13139 if (t != first+2)
13140 {
13141 __node* op1 = __root_;
13142 const char* t2 = __parse_expression(t, last);
13143 if (t != t2)
13144 {
13145 if (__make<__operator_logical_and>(op1, __root_))
13146 {
13147 *type = 2;
13148 first = t2;
13149 }
13150 }
13151 }
13152 }
13153 else
13154 {
13155 if (__make<__operator_logical_and>())
13156 first += 2;
13157 }
13158 break;
13159 case 'd':
13160 // & (unary)
13161 if (type)
13162 {
13163 const char* t = __parse_expression(first+2, last);
13164 if (t != first+2)
13165 {
13166 if (__make<__operator_addressof>(__root_))
13167 {
13168 *type = 1;
13169 first = t;
13170 }
13171 }
13172 }
13173 else
13174 {
13175 if (__make<__operator_addressof>())
13176 first += 2;
13177 }
13178 break;
13179 case 'n':
13180 // &
13181 if (type)
13182 {
13183 const char* t = __parse_expression(first+2, last);
13184 if (t != first+2)
13185 {
13186 __node* op1 = __root_;
13187 const char* t2 = __parse_expression(t, last);
13188 if (t != t2)
13189 {
13190 if (__make<__operator_bit_and>(op1, __root_))
13191 {
13192 *type = 2;
13193 first = t2;
13194 }
13195 }
13196 }
13197 }
13198 else
13199 {
13200 if (__make<__operator_bit_and>())
13201 first += 2;
13202 }
13203 break;
13204 case 'N':
13205 // &=
13206 if (type)
13207 {
13208 const char* t = __parse_expression(first+2, last);
13209 if (t != first+2)
13210 {
13211 __node* op1 = __root_;
13212 const char* t2 = __parse_expression(t, last);
13213 if (t != t2)
13214 {
13215 if (__make<__operator_and_equal>(op1, __root_))
13216 {
13217 *type = 2;
13218 first = t2;
13219 }
13220 }
13221 }
13222 }
13223 else
13224 {
13225 if (__make<__operator_and_equal>())
13226 first += 2;
13227 }
13228 break;
13229 case 'S':
13230 // =
13231 if (type)
13232 {
13233 const char* t = __parse_expression(first+2, last);
13234 if (t != first+2)
13235 {
13236 __node* op1 = __root_;
13237 const char* t2 = __parse_expression(t, last);
13238 if (t != t2)
13239 {
13240 if (__make<__operator_equal>(op1, __root_))
13241 {
13242 *type = 2;
13243 first = t2;
13244 }
13245 }
13246 }
13247 }
13248 else
13249 {
13250 if (__make<__operator_equal>())
13251 first += 2;
13252 }
13253 break;
13254 case 't':
13255 // alignof (a type)
13256 if (type)
13257 {
13258 const char* t = __parse_expression(first+2, last);
13259 if (t != first+2)
13260 {
13261 if (__make<__operator_alignof_type>(__root_))
13262 {
13263 *type = -1;
13264 first = t;
13265 }
13266 }
13267 }
13268 else
13269 {
13270 if (__make<__operator_alignof_type>())
13271 first += 2;
13272 }
13273 break;
13274 case 'z':
13275 // alignof (an expression)
13276 if (type)
13277 {
13278 const char* t = __parse_expression(first+2, last);
13279 if (t != first+2)
13280 {
13281 if (__make<__operator_alignof_expression>(__root_))
13282 {
13283 *type = -1;
13284 first = t;
13285 }
13286 }
13287 }
13288 else
13289 {
13290 if (__make<__operator_alignof_expression>())
13291 first += 2;
13292 }
13293 break;
13294 }
13295 break;
13296 case 'c':
13297 switch (first[1])
13298 {
13299 case 'l':
13300 // ()
13301 if (__make<__operator_paren>())
13302 {
13303 first += 2;
13304 if (type)
13305 *type = -1;
13306 }
13307 break;
13308 case 'm':
13309 // ,
13310 if (type)
13311 {
13312 const char* t = __parse_expression(first+2, last);
13313 if (t != first+2)
13314 {
13315 __node* op1 = __root_;
13316 const char* t2 = __parse_expression(t, last);
13317 if (t != t2)
13318 {
13319 if (__make<__operator_comma>(op1, __root_))
13320 {
13321 *type = 2;
13322 first = t2;
13323 }
13324 }
13325 }
13326 }
13327 else
13328 {
13329 if (__make<__operator_comma>())
13330 first += 2;
13331 }
13332 break;
13333 case 'o':
13334 // ~
13335 if (type)
13336 {
13337 const char* t = __parse_expression(first+2, last);
13338 if (t != first+2)
13339 {
13340 if (__make<__operator_tilda>(__root_))
13341 {
13342 *type = 1;
13343 first = t;
13344 }
13345 }
13346 }
13347 else
13348 {
13349 if (__make<__operator_tilda>())
13350 first += 2;
13351 }
13352 break;
13353 case 'v':
13354 // cast <type>
13355 {
13356 const char* t = __parse_type(first+2, last, false);
13357 if (t != first+2)
13358 {
13359 __node* cast_type = __root_;
13360 if (type)
13361 {
13362 const char* t2 = __parse_expression(t, last);
13363 if (t2 != t)
13364 {
13365 if (__make<__operator_cast>(cast_type, __root_))
13366 {
13367 *type = -1;
13368 first = t2;
13369 }
13370 }
13371 }
13372 else
13373 {
13374 if (__make<__operator_cast>(cast_type))
13375 first = t;
13376 }
13377 }
13378 }
13379 break;
13380 }
13381 break;
13382 case 'd':
13383 switch (first[1])
13384 {
13385 case 'a':
13386 // delete[]
13387 if (__make<__operator_delete_array>())
13388 {
13389 first += 2;
13390 if (type)
13391 *type = -1;
13392 }
13393 break;
13394 case 'e':
13395 // * (unary)
13396 if (type)
13397 {
13398 const char* t = __parse_expression(first+2, last);
13399 if (t != first+2)
13400 {
13401 if (__make<__operator_dereference>(__root_))
13402 {
13403 *type = 1;
13404 first = t;
13405 }
13406 }
13407 }
13408 else
13409 {
13410 if (__make<__operator_dereference>())
13411 first += 2;
13412 }
13413 break;
13414 case 'l':
13415 // delete
13416 if (__make<__operator_delete>())
13417 {
13418 first += 2;
13419 if (type)
13420 *type = -1;
13421 }
13422 break;
13423 case 'v':
13424 // /
13425 if (type)
13426 {
13427 const char* t = __parse_expression(first+2, last);
13428 if (t != first+2)
13429 {
13430 __node* op1 = __root_;
13431 const char* t2 = __parse_expression(t, last);
13432 if (t != t2)
13433 {
13434 if (__make<__operator_divide>(op1, __root_))
13435 {
13436 *type = 2;
13437 first = t2;
13438 }
13439 }
13440 }
13441 }
13442 else
13443 {
13444 if (__make<__operator_divide>())
13445 first += 2;
13446 }
13447 break;
13448 case 'V':
13449 // /=
13450 if (type)
13451 {
13452 const char* t = __parse_expression(first+2, last);
13453 if (t != first+2)
13454 {
13455 __node* op1 = __root_;
13456 const char* t2 = __parse_expression(t, last);
13457 if (t != t2)
13458 {
13459 if (__make<__operator_divide_equal>(op1, __root_))
13460 {
13461 *type = 2;
13462 first = t2;
13463 }
13464 }
13465 }
13466 }
13467 else
13468 {
13469 if (__make<__operator_divide_equal>())
13470 first += 2;
13471 }
13472 break;
13473 }
13474 break;
13475 case 'e':
13476 switch (first[1])
13477 {
13478 case 'o':
13479 // ^
13480 if (type)
13481 {
13482 const char* t = __parse_expression(first+2, last);
13483 if (t != first+2)
13484 {
13485 __node* op1 = __root_;
13486 const char* t2 = __parse_expression(t, last);
13487 if (t != t2)
13488 {
13489 if (__make<__operator_xor>(op1, __root_))
13490 {
13491 *type = 2;
13492 first = t2;
13493 }
13494 }
13495 }
13496 }
13497 else
13498 {
13499 if (__make<__operator_xor>())
13500 first += 2;
13501 }
13502 break;
13503 case 'O':
13504 // ^=
13505 if (type)
13506 {
13507 const char* t = __parse_expression(first+2, last);
13508 if (t != first+2)
13509 {
13510 __node* op1 = __root_;
13511 const char* t2 = __parse_expression(t, last);
13512 if (t != t2)
13513 {
13514 if (__make<__operator_xor_equal>(op1, __root_))
13515 {
13516 *type = 2;
13517 first = t2;
13518 }
13519 }
13520 }
13521 }
13522 else
13523 {
13524 if (__make<__operator_xor_equal>())
13525 first += 2;
13526 }
13527 break;
13528 case 'q':
13529 // ==
13530 if (type)
13531 {
13532 const char* t = __parse_expression(first+2, last);
13533 if (t != first+2)
13534 {
13535 __node* op1 = __root_;
13536 const char* t2 = __parse_expression(t, last);
13537 if (t != t2)
13538 {
13539 if (__make<__operator_equality>(op1, __root_))
13540 {
13541 *type = 2;
13542 first = t2;
13543 }
13544 }
13545 }
13546 }
13547 else
13548 {
13549 if (__make<__operator_equality>())
13550 first += 2;
13551 }
13552 break;
13553 }
13554 break;
13555 case 'g':
13556 switch (first[1])
13557 {
13558 case 'e':
13559 // >=
13560 if (type)
13561 {
13562 const char* t = __parse_expression(first+2, last);
13563 if (t != first+2)
13564 {
13565 __node* op1 = __root_;
13566 const char* t2 = __parse_expression(t, last);
13567 if (t != t2)
13568 {
13569 if (__make<__operator_greater_equal>(op1, __root_))
13570 {
13571 *type = 2;
13572 first = t2;
13573 }
13574 }
13575 }
13576 }
13577 else
13578 {
13579 if (__make<__operator_greater_equal>())
13580 first += 2;
13581 }
13582 break;
13583 case 't':
13584 // >
13585 if (type)
13586 {
13587 const char* t = __parse_expression(first+2, last);
13588 if (t != first+2)
13589 {
13590 __node* op1 = __root_;
13591 const char* t2 = __parse_expression(t, last);
13592 if (t != t2)
13593 {
13594 if (__make<__operator_greater>(op1, __root_))
13595 {
13596 *type = 2;
13597 first = t2;
13598 }
13599 }
13600 }
13601 }
13602 else
13603 {
13604 if (__make<__operator_greater>())
13605 first += 2;
13606 }
13607 break;
13608 }
13609 break;
13610 case 'i':
13611 // []
13612 if (first[1] == 'x' && __make<__operator_brackets>())
13613 {
13614 first += 2;
13615 if (type)
13616 *type = -1;
13617 }
13618 break;
13619 case 'l':
13620 switch (first[1])
13621 {
13622 case 'e':
13623 // <=
13624 if (type)
13625 {
13626 const char* t = __parse_expression(first+2, last);
13627 if (t != first+2)
13628 {
13629 __node* op1 = __root_;
13630 const char* t2 = __parse_expression(t, last);
13631 if (t != t2)
13632 {
13633 if (__make<__operator_less_equal>(op1, __root_))
13634 {
13635 *type = 2;
13636 first = t2;
13637 }
13638 }
13639 }
13640 }
13641 else
13642 {
13643 if (__make<__operator_less_equal>())
13644 first += 2;
13645 }
13646 break;
13647 case 's':
13648 // <<
13649 if (type)
13650 {
13651 const char* t = __parse_expression(first+2, last);
13652 if (t != first+2)
13653 {
13654 __node* op1 = __root_;
13655 const char* t2 = __parse_expression(t, last);
13656 if (t != t2)
13657 {
13658 if (__make<__operator_left_shift>(op1, __root_))
13659 {
13660 *type = 2;
13661 first = t2;
13662 }
13663 }
13664 }
13665 }
13666 else
13667 {
13668 if (__make<__operator_left_shift>())
13669 first += 2;
13670 }
13671 break;
13672 case 'S':
13673 // <<=
13674 if (type)
13675 {
13676 const char* t = __parse_expression(first+2, last);
13677 if (t != first+2)
13678 {
13679 __node* op1 = __root_;
13680 const char* t2 = __parse_expression(t, last);
13681 if (t != t2)
13682 {
13683 if (__make<__operator_left_shift_equal>(op1, __root_))
13684 {
13685 *type = 2;
13686 first = t2;
13687 }
13688 }
13689 }
13690 }
13691 else
13692 {
13693 if (__make<__operator_left_shift_equal>())
13694 first += 2;
13695 }
13696 break;
13697 case 't':
13698 // <
13699 if (type)
13700 {
13701 const char* t = __parse_expression(first+2, last);
13702 if (t != first+2)
13703 {
13704 __node* op1 = __root_;
13705 const char* t2 = __parse_expression(t, last);
13706 if (t != t2)
13707 {
13708 if (__make<__operator_less>(op1, __root_))
13709 {
13710 *type = 2;
13711 first = t2;
13712 }
13713 }
13714 }
13715 }
13716 else
13717 {
13718 if (__make<__operator_less>())
13719 first += 2;
13720 }
13721 break;
13722 }
13723 break;
13724 case 'm':
13725 switch (first[1])
13726 {
13727 case 'i':
13728 // -
13729 if (type)
13730 {
13731 const char* t = __parse_expression(first+2, last);
13732 if (t != first+2)
13733 {
13734 __node* op1 = __root_;
13735 const char* t2 = __parse_expression(t, last);
13736 if (t != t2)
13737 {
13738 if (__make<__operator_minus>(op1, __root_))
13739 {
13740 *type = 2;
13741 first = t2;
13742 }
13743 }
13744 }
13745 }
13746 else
13747 {
13748 if (__make<__operator_minus>())
13749 first += 2;
13750 }
13751 break;
13752 case 'I':
13753 // -=
13754 if (type)
13755 {
13756 const char* t = __parse_expression(first+2, last);
13757 if (t != first+2)
13758 {
13759 __node* op1 = __root_;
13760 const char* t2 = __parse_expression(t, last);
13761 if (t != t2)
13762 {
13763 if (__make<__operator_minus_equal>(op1, __root_))
13764 {
13765 *type = 2;
13766 first = t2;
13767 }
13768 }
13769 }
13770 }
13771 else
13772 {
13773 if (__make<__operator_minus_equal>())
13774 first += 2;
13775 }
13776 break;
13777 case 'l':
13778 // *
13779 if (type)
13780 {
13781 const char* t = __parse_expression(first+2, last);
13782 if (t != first+2)
13783 {
13784 __node* op1 = __root_;
13785 const char* t2 = __parse_expression(t, last);
13786 if (t != t2)
13787 {
13788 if (__make<__operator_times>(op1, __root_))
13789 {
13790 *type = 2;
13791 first = t2;
13792 }
13793 }
13794 }
13795 }
13796 else
13797 {
13798 if (__make<__operator_times>())
13799 first += 2;
13800 }
13801 break;
13802 case 'L':
13803 // *=
13804 if (type)
13805 {
13806 const char* t = __parse_expression(first+2, last);
13807 if (t != first+2)
13808 {
13809 __node* op1 = __root_;
13810 const char* t2 = __parse_expression(t, last);
13811 if (t != t2)
13812 {
13813 if (__make<__operator_times_equal>(op1, __root_))
13814 {
13815 *type = 2;
13816 first = t2;
13817 }
13818 }
13819 }
13820 }
13821 else
13822 {
13823 if (__make<__operator_times_equal>())
13824 first += 2;
13825 }
13826 break;
13827 case 'm':
13828 // -- (postfix in <expression> context)
13829 if (type)
13830 {
13831 const char* t = __parse_expression(first+2, last);
13832 if (t != first+2)
13833 {
13834 if (__make<__operator_decrement>(false, __root_))
13835 {
13836 *type = 1;
13837 first = t;
13838 }
13839 }
13840 }
13841 else
13842 {
13843 if (__make<__operator_decrement>())
13844 first += 2;
13845 }
13846 break;
13847 }
13848 break;
13849 case 'n':
13850 switch (first[1])
13851 {
13852 case 'a':
13853 // new[]
13854 if (__make<__operator_new_array>())
13855 {
13856 first += 2;
13857 if (type)
13858 *type = -1;
13859 }
13860 break;
13861 case 'e':
13862 // !=
13863 if (type)
13864 {
13865 const char* t = __parse_expression(first+2, last);
13866 if (t != first+2)
13867 {
13868 __node* op1 = __root_;
13869 const char* t2 = __parse_expression(t, last);
13870 if (t != t2)
13871 {
13872 if (__make<__operator_not_equal>(op1, __root_))
13873 {
13874 *type = 2;
13875 first = t2;
13876 }
13877 }
13878 }
13879 }
13880 else
13881 {
13882 if (__make<__operator_not_equal>())
13883 first += 2;
13884 }
13885 break;
13886 case 'g':
13887 // - (unary)
13888 if (type)
13889 {
13890 const char* t = __parse_expression(first+2, last);
13891 if (t != first+2)
13892 {
13893 if (__make<__operator_negate>(__root_))
13894 {
13895 *type = 1;
13896 first = t;
13897 }
13898 }
13899 }
13900 else
13901 {
13902 if (__make<__operator_negate>())
13903 first += 2;
13904 }
13905 break;
13906 case 't':
13907 // !
13908 if (type)
13909 {
13910 const char* t = __parse_expression(first+2, last);
13911 if (t != first+2)
13912 {
13913 if (__make<__operator_logical_not>(__root_))
13914 {
13915 *type = 1;
13916 first = t;
13917 }
13918 }
13919 }
13920 else
13921 {
13922 if (__make<__operator_logical_not>())
13923 first += 2;
13924 }
13925 break;
13926 case 'w':
13927 // new
13928 if (__make<__operator_new>())
13929 {
13930 first += 2;
13931 if (type)
13932 *type = -1;
13933 }
13934 break;
13935 }
13936 break;
13937 case 'o':
13938 switch (first[1])
13939 {
13940 case 'o':
13941 // ||
13942 if (type)
13943 {
13944 const char* t = __parse_expression(first+2, last);
13945 if (t != first+2)
13946 {
13947 __node* op1 = __root_;
13948 const char* t2 = __parse_expression(t, last);
13949 if (t != t2)
13950 {
13951 if (__make<__operator_logical_or>(op1, __root_))
13952 {
13953 *type = 2;
13954 first = t2;
13955 }
13956 }
13957 }
13958 }
13959 else
13960 {
13961 if (__make<__operator_logical_or>())
13962 first += 2;
13963 }
13964 break;
13965 case 'r':
13966 // |
13967 if (type)
13968 {
13969 const char* t = __parse_expression(first+2, last);
13970 if (t != first+2)
13971 {
13972 __node* op1 = __root_;
13973 const char* t2 = __parse_expression(t, last);
13974 if (t != t2)
13975 {
13976 if (__make<__operator_bit_or>(op1, __root_))
13977 {
13978 *type = 2;
13979 first = t2;
13980 }
13981 }
13982 }
13983 }
13984 else
13985 {
13986 if (__make<__operator_bit_or>())
13987 first += 2;
13988 }
13989 break;
13990 case 'R':
13991 // |=
13992 if (type)
13993 {
13994 const char* t = __parse_expression(first+2, last);
13995 if (t != first+2)
13996 {
13997 __node* op1 = __root_;
13998 const char* t2 = __parse_expression(t, last);
13999 if (t != t2)
14000 {
14001 if (__make<__operator_or_equal>(op1, __root_))
14002 {
14003 *type = 2;
14004 first = t2;
14005 }
14006 }
14007 }
14008 }
14009 else
14010 {
14011 if (__make<__operator_or_equal>())
14012 first += 2;
14013 }
14014 break;
14015 }
14016 break;
14017 case 'p':
14018 switch (first[1])
14019 {
14020 case 'm':
14021 // ->*
14022 if (type)
14023 {
14024 const char* t = __parse_expression(first+2, last);
14025 if (t != first+2)
14026 {
14027 __node* op1 = __root_;
14028 const char* t2 = __parse_expression(t, last);
14029 if (t != t2)
14030 {
14031 if (__make<__operator_pointer_to_member>(op1, __root_))
14032 {
14033 *type = 2;
14034 first = t2;
14035 }
14036 }
14037 }
14038 }
14039 else
14040 {
14041 if (__make<__operator_pointer_to_member>())
14042 first += 2;
14043 }
14044 break;
14045 case 'l':
14046 // +
14047 if (type)
14048 {
14049 const char* t = __parse_expression(first+2, last);
14050 if (t != first+2)
14051 {
14052 __node* op1 = __root_;
14053 const char* t2 = __parse_expression(t, last);
14054 if (t != t2)
14055 {
14056 if (__make<__operator_plus>(op1, __root_))
14057 {
14058 *type = 2;
14059 first = t2;
14060 }
14061 }
14062 }
14063 }
14064 else
14065 {
14066 if (__make<__operator_plus>())
14067 first += 2;
14068 }
14069 break;
14070 case 'L':
14071 // +=
14072 if (type)
14073 {
14074 const char* t = __parse_expression(first+2, last);
14075 if (t != first+2)
14076 {
14077 __node* op1 = __root_;
14078 const char* t2 = __parse_expression(t, last);
14079 if (t != t2)
14080 {
14081 if (__make<__operator_plus_equal>(op1, __root_))
14082 {
14083 *type = 2;
14084 first = t2;
14085 }
14086 }
14087 }
14088 }
14089 else
14090 {
14091 if (__make<__operator_plus_equal>())
14092 first += 2;
14093 }
14094 break;
14095 case 'p':
14096 // ++ (postfix in <expression> context)
14097 if (type)
14098 {
14099 const char* t = __parse_expression(first+2, last);
14100 if (t != first+2)
14101 {
14102 if (__make<__operator_increment>(false, __root_))
14103 {
14104 *type = 1;
14105 first = t;
14106 }
14107 }
14108 }
14109 else
14110 {
14111 if (__make<__operator_increment>())
14112 first += 2;
14113 }
14114 break;
14115 case 's':
14116 // + (unary)
14117 if (type)
14118 {
14119 const char* t = __parse_expression(first+2, last);
14120 if (t != first+2)
14121 {
14122 if (__make<__operator_unary_plus>(__root_))
14123 {
14124 *type = 1;
14125 first = t;
14126 }
14127 }
14128 }
14129 else
14130 {
14131 if (__make<__operator_unary_plus>())
14132 first += 2;
14133 }
14134 break;
14135 case 't':
14136 // ->
14137 if (type)
14138 {
14139 const char* t = __parse_expression(first+2, last);
14140 if (t != first+2)
14141 {
14142 __node* op1 = __root_;
14143 const char* t2 = __parse_expression(t, last);
14144 if (t != t2)
14145 {
14146 if (__make<__operator_arrow>(op1, __root_))
14147 {
14148 *type = 2;
14149 first = t2;
14150 }
14151 }
14152 }
14153 }
14154 else
14155 {
14156 if (__make<__operator_arrow>())
14157 first += 2;
14158 }
14159 break;
14160 }
14161 break;
14162 case 'q':
14163 // ?
14164 if (first[1] == 'u')
14165 {
14166 if (type)
14167 {
14168 const char* t = __parse_expression(first+2, last);
14169 if (t != first+2)
14170 {
14171 __node* op1 = __root_;
14172 const char* t2 = __parse_expression(t, last);
14173 if (t != t2)
14174 {
14175 __node* op2 = __root_;
14176 const char* t3 = __parse_expression(t2, last);
14177 if (t3 != t2)
14178 {
14179 if (__make<__operator_conditional>(op1, op2, __root_))
14180 {
14181 *type = 3;
14182 first = t3;
14183 }
14184 }
14185 }
14186 }
14187 }
14188 else
14189 {
14190 if (__make<__operator_conditional>())
14191 first += 2;
14192 }
14193 }
14194 break;
14195 case 'r':
14196 switch (first[1])
14197 {
14198 case 'm':
14199 // %
14200 if (type)
14201 {
14202 const char* t = __parse_expression(first+2, last);
14203 if (t != first+2)
14204 {
14205 __node* op1 = __root_;
14206 const char* t2 = __parse_expression(t, last);
14207 if (t != t2)
14208 {
14209 if (__make<__operator_mod>(op1, __root_))
14210 {
14211 *type = 2;
14212 first = t2;
14213 }
14214 }
14215 }
14216 }
14217 else
14218 {
14219 if (__make<__operator_mod>())
14220 first += 2;
14221 }
14222 break;
14223 case 'M':
14224 // %=
14225 if (type)
14226 {
14227 const char* t = __parse_expression(first+2, last);
14228 if (t != first+2)
14229 {
14230 __node* op1 = __root_;
14231 const char* t2 = __parse_expression(t, last);
14232 if (t != t2)
14233 {
14234 if (__make<__operator_mod_equal>(op1, __root_))
14235 {
14236 *type = 2;
14237 first = t2;
14238 }
14239 }
14240 }
14241 }
14242 else
14243 {
14244 if (__make<__operator_mod_equal>())
14245 first += 2;
14246 }
14247 break;
14248 case 's':
14249 // >>
14250 if (type)
14251 {
14252 const char* t = __parse_expression(first+2, last);
14253 if (t != first+2)
14254 {
14255 __node* op1 = __root_;
14256 const char* t2 = __parse_expression(t, last);
14257 if (t != t2)
14258 {
14259 if (__make<__operator_right_shift>(op1, __root_))
14260 {
14261 *type = 2;
14262 first = t2;
14263 }
14264 }
14265 }
14266 }
14267 else
14268 {
14269 if (__make<__operator_right_shift>())
14270 first += 2;
14271 }
14272 break;
14273 case 'S':
14274 // >>=
14275 if (type)
14276 {
14277 const char* t = __parse_expression(first+2, last);
14278 if (t != first+2)
14279 {
14280 __node* op1 = __root_;
14281 const char* t2 = __parse_expression(t, last);
14282 if (t != t2)
14283 {
14284 if (__make<__operator_right_shift_equal>(op1, __root_))
14285 {
14286 *type = 2;
14287 first = t2;
14288 }
14289 }
14290 }
14291 }
14292 else
14293 {
14294 if (__make<__operator_right_shift_equal>())
14295 first += 2;
14296 }
14297 break;
14298 }
14299 break;
14300 case 's':
14301 switch (first[1])
14302 {
14303 case 't':
14304 // sizeof (a type)
14305 if (type)
14306 {
14307 const char* t = __parse_expression(first+2, last);
14308 if (t != first+2)
14309 {
14310 if (__make<__operator_sizeof_type>(__root_))
14311 {
14312 *type = -1;
14313 first = t;
14314 }
14315 }
14316 }
14317 else
14318 {
14319 if (__make<__operator_sizeof_type>())
14320 first += 2;
14321 }
14322 break;
14323 case 'z':
14324 // sizeof (an expression)
14325 if (type)
14326 {
14327 const char* t = __parse_expression(first+2, last);
14328 if (t != first+2)
14329 {
14330 if (__make<__operator_sizeof_expression>(__root_))
14331 {
14332 *type = -1;
14333 first = t;
14334 }
14335 }
14336 }
14337 else
14338 {
14339 if (__make<__operator_sizeof_expression>())
14340 first += 2;
14341 }
14342 break;
14343 }
14344 break;
14345 }
14346 }
14347 return first;
14348}
14349
14350// <source-name> ::= <positive length number> <identifier>
14351
14352const char*
14353__demangle_tree::__parse_source_name(const char* first, const char* last)
14354{
14355 if (first != last)
14356 {
14357 char c = *first;
14358 if ('1' <= c && c <= '9' && first+1 != last)
14359 {
14360 const char* t = first+1;
14361 size_t n = c - '0';
14362 for (c = *t; '0' <= c && c <= '9'; c = *t)
14363 {
14364 n = n * 10 + c - '0';
14365 if (++t == last)
14366 return first;
14367 }
14368 if (last - t >= n && __make<__source_name>(t, n))
14369 first = t + n;
14370 }
14371 }
14372 return first;
14373}
14374
14375// <unqualified-name> ::= <operator-name>
14376// ::= <ctor-dtor-name>
14377// ::= <source-name>
14378// ::= <unnamed-type-name>
14379
14380const char*
14381__demangle_tree::__parse_unqualified_name(const char* first, const char* last)
14382{
14383 const char* t = __parse_source_name(first, last);
14384 if (t == first)
14385 {
14386 t = __parse_ctor_dtor_name(first, last);
14387 if (t == first)
14388 {
14389 t = __parse_operator_name(first, last);
14390 if (t == first)
14391 first = __parse_unnamed_type_name(first, last);
14392 else
14393 first = t;
14394 }
14395 else
14396 first = t;
14397 }
14398 else
14399 first = t;
14400 return first;
14401}
14402
14403// <unscoped-name> ::= <unqualified-name>
14404// ::= St <unqualified-name> # ::std::
14405// extension ::= StL<unqualified-name>
14406
14407const char*
14408__demangle_tree::__parse_unscoped_name(const char* first, const char* last)
14409{
14410 if (last - first >= 2)
14411 {
14412 const char* t0 = first;
14413 if (first[0] == 'S' && first[1] == 't')
14414 {
14415 t0 += 2;
14416 if (t0 != last && *t0 == 'L')
14417 ++t0;
14418 }
14419 const char* t1 = __parse_unqualified_name(t0, last);
14420 if (t1 != t0)
14421 {
14422 if (t0 != first)
14423 {
14424 __node* name = __root_;
14425 if (__make<__std_qualified_name>())
14426 {
14427 if (__make<__nested_delimeter>(__root_, name))
14428 first = t1;
14429 }
14430 }
14431 else
14432 first = t1;
14433 }
14434 }
14435 return first;
14436}
14437
14438// <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
14439// ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
14440//
14441// <prefix> ::= <prefix> <unqualified-name>
14442// ::= <template-prefix> <template-args>
14443// ::= <template-param>
14444// ::= <decltype>
14445// ::= # empty
14446// ::= <substitution>
14447// ::= <prefix> <data-member-prefix>
14448// extension ::= L
14449//
14450// <template-prefix> ::= <prefix> <template unqualified-name>
14451// ::= <template-param>
14452// ::= <substitution>
14453
14454const char*
14455__demangle_tree::__parse_nested_name(const char* first, const char* last)
14456{
14457 if (first != last && *first == 'N')
14458 {
14459 unsigned cv = 0;
14460 const char* t0 = __parse_cv_qualifiers(first+1, last, cv, true);
14461 __node* prev = NULL;
14462 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
14463 {
14464 t0 += 2;
14465 if (!__make<__std_qualified_name>())
14466 return first;
14467 prev = __root_;
14468 }
14469 while (t0 != last)
14470 {
14471 bool can_sub = true;
14472 bool make_nested = true;
14473 const char* t1;
14474 switch (*t0)
14475 {
14476 case '1':
14477 case '2':
14478 case '3':
14479 case '4':
14480 case '5':
14481 case '6':
14482 case '7':
14483 case '8':
14484 case '9':
14485 t1 = __parse_source_name(t0, last);
14486 if (t1 == t0 || t1 == last)
14487 return first;
14488 if (*t1 == 'M')
14489 {
14490 // This is a data-member-prefix
14491 ++t1;
14492 }
14493 else if (*t1 == 'I')
14494 {
14495 // has following <template-args>
14496 if (prev)
14497 {
14498 if (!__make<__nested_delimeter>(prev, __root_))
14499 return first;
14500 make_nested = false;
14501 }
14502 if (__sub_end_ == __sub_cap_)
14503 {
14504 __status_ = memory_alloc_failure;
14505 return first;
14506 }
14507 else
14508 *__sub_end_++ = __root_;
14509 const char* t2 = __parse_template_args(t1, last);
14510 if (t2 == t1)
14511 return first;
14512 t1 = t2;
14513 }
14514 break;
14515 case 'D':
14516 if (t0+1 != last && (t0[1] == 't' || t0[1] == 'T'))
14517 {
14518 t1 = __parse_decltype(t0, last);
14519 break;
14520 }
14521 // check for Dt, DT here, else drop through
14522 case 'C':
14523 t1 = __parse_ctor_dtor_name(t0, last);
14524 if (t1 == t0 || t1 == last)
14525 return first;
14526 if (*t1 == 'I')
14527 {
14528 // has following <template-args>
14529 if (prev)
14530 {
14531 if (!__make<__nested_delimeter>(prev, __root_))
14532 return first;
14533 make_nested = false;
14534 }
14535 if (__sub_end_ == __sub_cap_)
14536 {
14537 __status_ = memory_alloc_failure;
14538 return first;
14539 }
14540 else
14541 *__sub_end_++ = __root_;
14542 const char* t2 = __parse_template_args(t1, last);
14543 if (t2 == t1)
14544 return first;
14545 t1 = t2;
14546 }
14547 break;
14548 case 'U':
14549 assert(!"__parse_nested_name U");
14550 // could have following <template-args>
14551 break;
14552 case 'T':
14553 t1 = __parse_template_param(t0, last);
14554 if (t1 == t0 || t1 == last)
14555 return first;
14556 if (*t1 == 'I')
14557 {
14558 // has following <template-args>
14559 if (prev)
14560 {
14561 if (!__make<__nested_delimeter>(prev, __root_))
14562 return first;
14563 make_nested = false;
14564 }
14565 if (__sub_end_ == __sub_cap_)
14566 {
14567 __status_ = memory_alloc_failure;
14568 return first;
14569 }
14570 else
14571 *__sub_end_++ = __root_;
14572 const char* t2 = __parse_template_args(t1, last);
14573 if (t2 == t1)
14574 return first;
14575 t1 = t2;
14576 }
14577 break;
14578 case 'S':
14579 t1 = __parse_substitution(t0, last);
14580 if (t1 == t0 || t1 == last)
14581 return first;
14582 if (*t1 == 'I')
14583 {
14584 const char* t2 = __parse_template_args(t1, last);
14585 if (t2 == t1)
14586 return first;
14587 t1 = t2;
14588 }
14589 else
14590 can_sub = false;
14591 break;
14592 case 'L':
14593 // extension: ignore L here
14594 ++t0;
14595 continue;
14596 default:
14597 t1 = __parse_operator_name(t0, last);
14598 if (t1 == t0 || t1 == last)
14599 return first;
14600 if (*t1 == 'I')
14601 {
14602 // has following <template-args>
14603 if (prev)
14604 {
14605 if (!__make<__nested_delimeter>(prev, __root_))
14606 return first;
14607 make_nested = false;
14608 }
14609 if (__sub_end_ == __sub_cap_)
14610 {
14611 __status_ = memory_alloc_failure;
14612 return first;
14613 }
14614 else
14615 *__sub_end_++ = __root_;
14616 const char* t2 = __parse_template_args(t1, last);
14617 if (t2 == t1)
14618 return first;
14619 t1 = t2;
14620 }
14621 break;
14622 }
14623 if (t1 == t0 || t1 == last)
14624 return first;
14625 if (prev && make_nested)
14626 {
14627 if (!__make<__nested_delimeter>(prev, __root_))
14628 return first;
14629 can_sub = true;
14630 }
14631 if (can_sub && *t1 != 'E')
14632 {
14633 if (__sub_end_ == __sub_cap_)
14634 {
14635 __status_ = memory_alloc_failure;
14636 return first;
14637 }
14638 else
14639 *__sub_end_++ = __root_;
14640 }
14641 if (*t1 == 'E')
14642 {
14643 if (cv != 0)
14644 {
14645 if (!__make<__cv_qualifiers>(cv, __root_))
14646 return first;
14647 }
14648 first = t1+1;
14649 break;
14650 }
14651 prev = __root_;
14652 t0 = t1;
14653 }
14654 }
14655 return first;
14656}
14657
14658// <template-arg> ::= <type> # type or template
14659// ::= X <expression> E # expression
14660// ::= <expr-primary> # simple expressions
14661// ::= J <template-arg>* E # argument pack
14662// ::= LZ <encoding> E # extension
14663
14664const char*
14665__demangle_tree::__parse_template_arg(const char* first, const char* last)
14666{
14667 if (first != last)
14668 {
14669 const char* t;
14670 switch (*first)
14671 {
14672 case 'X':
14673 t = __parse_expression(first+1, last);
14674 if (t != first+1)
14675 {
14676 if (t != last && *t == 'E')
14677 first = t+1;
14678 }
14679 break;
14680 case 'J':
14681 t = first+1;
14682 if (t == last)
14683 return first;
14684 if (*t == 'E')
14685 {
14686 if (__make<__list>((__node*)0))
14687 first = t+1;
14688 }
14689 else
14690 {
14691 __node* list = NULL;
14692 __node* prev = NULL;
14693 do
14694 {
14695 const char* t2 = __parse_template_arg(t, last);
14696 if (t2 == t || !__make<__list>(__root_))
14697 return first;
14698 if (list == 0)
14699 list = __root_;
14700 if (prev)
14701 {
14702 prev->__right_ = __root_;
14703 __root_->__size_ = prev->__size_ + 1;
14704 }
14705 prev = __root_;
14706 t = t2;
14707 } while (t != last && *t != 'E');
14708 first = t+1;
14709 __root_ = list;
14710 }
14711 break;
14712 case 'L':
14713 // <expr-primary> or LZ <encoding> E
14714 if (first+1 != last && first[1] == 'Z')
14715 {
14716 t = __parse_encoding(first+2, last);
14717 if (t != first+2 && t != last && *t == 'E')
14718 first = t+1;
14719 }
14720 else
14721 first = __parse_expr_primary(first, last);
14722 break;
14723 default:
14724 // <type>
14725 first = __parse_type(first, last);
14726 break;
14727 }
14728 }
14729 return first;
14730}
14731
14732// <template-args> ::= I <template-arg>* E
14733// extension, the abi says <template-arg>+
14734
14735const char*
14736__demangle_tree::__parse_template_args(const char* first, const char* last)
14737{
14738 if (last - first >= 2 && *first == 'I')
14739 {
14740 __node* args = NULL;
14741 __node* prev = NULL;
14742 __node* name = __root_;
14743 bool prev_tag_templates = __tag_templates_;
14744 __tag_templates_ = false;
14745 if (prev_tag_templates)
14746 __t_end_ = __t_begin_;
14747 const char* t = first+1;
14748 while (*t != 'E')
14749 {
14750 const char* t2 = __parse_template_arg(t, last);
14751 if (t2 == t || t2 == last)
14752 break;
14753 if (!__make<__list>(__root_))
14754 return first;
14755 if (args == 0)
14756 args = __root_;
14757 if (prev)
14758 {
14759 prev->__right_ = __root_;
14760 __root_->__size_ = prev->__size_ + 1;
14761 }
14762 prev = __root_;
14763 if (prev_tag_templates)
14764 {
14765 if (__t_end_ == __t_cap_)
14766 {
14767 __status_ = memory_alloc_failure;
14768 return first;
14769 }
14770 if (__root_->__left_)
14771 *__t_end_++ = __root_->__left_;
14772 else
14773 *__t_end_++ = __root_;
14774 }
14775 t = t2;
14776 }
14777 if (t != last && *t == 'E')
14778 {
14779 if (__make<__template_args>(name, args))
14780 first = t+1;
14781 }
14782 __tag_templates_ = prev_tag_templates;
14783 }
14784 return first;
14785}
14786
14787// <substitution> ::= S <seq-id> _
14788// ::= S_
14789// <substitution> ::= Sa # ::std::allocator
14790// <substitution> ::= Sb # ::std::basic_string
14791// <substitution> ::= Ss # ::std::basic_string < char,
14792// ::std::char_traits<char>,
14793// ::std::allocator<char> >
14794// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
14795// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
14796// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
14797
14798const char*
14799__demangle_tree::__parse_substitution(const char* first, const char* last)
14800{
14801 if (last - first >= 2)
14802 {
14803 if (*first == 'S')
14804 {
14805 switch (first[1])
14806 {
14807 case 'a':
14808 if (__make<__sub_allocator>())
14809 first += 2;
14810 break;
14811 case 'b':
14812 if (__make<__sub_basic_string>())
14813 first += 2;
14814 break;
14815 case 's':
14816 if (__make<__sub_string>())
14817 first += 2;
14818 break;
14819 case 'i':
14820 if (__make<__sub_istream>())
14821 first += 2;
14822 break;
14823 case 'o':
14824 if (__make<__sub_ostream>())
14825 first += 2;
14826 break;
14827 case 'd':
14828 if (__make<__sub_iostream>())
14829 first += 2;
14830 break;
14831 case '_':
14832 if (__sub_begin_ != __sub_end_)
14833 {
14834 if (__make<__sub>(*__sub_begin_))
14835 first += 2;
14836 }
14837 break;
14838 default:
14839 if (isdigit(first[1]) || isupper(first[1]))
14840 {
14841 size_t sub = 0;
14842 const char* t = first+1;
14843 if (isdigit(*t))
14844 sub = *t - '0';
14845 else
14846 sub = *t - 'A' + 10;
14847 for (++t; t != last && (isdigit(*t) || isupper(*t)); ++t)
14848 {
14849 sub *= 36;
14850 if (isdigit(*t))
14851 sub += *t - '0';
14852 else
14853 sub += *t - 'A' + 10;
14854 }
14855 if (t == last || *t != '_')
14856 return first;
14857 ++sub;
14858 if (sub < __sub_end_ - __sub_begin_)
14859 {
14860 if (__make<__sub>(__sub_begin_[sub]))
14861 first = t+1;
14862 }
14863 }
14864 break;
14865 }
14866 }
14867 }
14868 return first;
14869}
14870
14871// <name> ::= <nested-name>
14872// ::= <local-name> # See Scope Encoding below
14873// ::= <unscoped-template-name> <template-args>
14874// ::= <unscoped-name>
14875
14876const char*
14877__demangle_tree::__parse_name(const char* first, const char* last)
14878{
14879 if (first != last)
14880 {
14881 const char* t0 = first;
14882 // extension: ignore L here
14883 if (*t0 == 'L')
14884 ++t0;
14885 const char* t = __parse_nested_name(t0, last);
14886 if (t == t0)
14887 {
14888 t = __parse_local_name(t0, last);
14889 if (t == t0)
14890 {
14891 // not <nested-name> nor <local-name>
14892 // Try to parse <unscoped-template-name> <template-args> or
14893 // <unscoped-name> which are nearly ambiguous.
14894 // This logic occurs nowhere else.
14895 if (last - t0 >= 2)
14896 {
14897 if (t0[0] == 'S' && (t0[1] == '_' ||
14898 isdigit(t0[1]) ||
14899 isupper(t0[1]) ||
14900 t0[1] == 'a' ||
14901 t0[1] == 'b'))
14902 {
14903 t = __parse_substitution(t0, last);
14904 if (t != t0)
14905 {
14906 const char* t2 = __parse_template_args(t, last);
14907 if (t2 != t)
14908 first = t2;
14909 }
14910 }
14911 else // Not a substitution, except maybe St
14912 {
14913 t = __parse_unscoped_name(t0, last);
14914 if (t != t0)
14915 {
14916 // unscoped-name might be <unscoped-template-name>
14917 if (t != last && *t == 'I')
14918 {
14919 if (__sub_end_ == __sub_cap_)
14920 {
14921 __status_ = memory_alloc_failure;
14922 return first;
14923 }
14924 *__sub_end_++ = __root_;
14925 const char* t2 = __parse_template_args(t, last);
14926 if (t2 != t)
14927 first = t2;
14928 }
14929 else
14930 {
14931 // <unscoped-name>
14932 first = t;
14933 }
14934 }
14935 }
14936 }
14937 }
14938 else
14939 first = t;
14940 }
14941 else
14942 first = t;
14943 }
14944 return first;
14945}
14946
14947// extension
14948// <dot-suffix> := .<anything and everything>
14949
14950const char*
14951__demangle_tree::__parse_dot_suffix(const char* first, const char* last)
14952{
14953 if (first != last && *first == '.')
14954 {
14955 if (__make<__dot_suffix>(__root_, first, last-first))
14956 first = last;
14957 }
14958 return first;
14959}
14960
14961// <encoding> ::= <function name> <bare-function-type>
14962// ::= <data name>
14963// ::= <special-name>
14964
14965const char*
14966__demangle_tree::__parse_encoding(const char* first, const char* last)
14967{
14968 const char* t = __parse_name(first, last);
14969 if (t != first)
14970 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000014971 if (t != last && *t != 'E' && *t != '.')
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000014972 {
14973 __node* name = __root_;
14974 bool has_return = name->ends_with_template() &&
14975 !name->is_ctor_dtor_conv();
14976 __node* ret = NULL;
14977 const char* t2;
14978 __tag_templates_ = false;
14979 if (has_return)
14980 {
14981 t2 = __parse_type(t, last);
14982 if (t2 != t)
14983 {
14984 ret = __root_;
14985 t = t2;
14986 }
14987 else
14988 return first;
14989 }
14990 t2 = __parse_bare_function_type(t, last);
14991 if (t2 != t)
14992 {
14993 if (dynamic_cast<__void*>(__root_->__left_) != NULL)
14994 __root_->__left_ = NULL;
14995 if (__make<__function_signature>(ret, __root_))
14996 {
14997 __node* cv = name->extract_cv(name);
14998 if (__make<__function>(name, __root_))
14999 {
15000 if (cv)
15001 {
15002 cv->__left_ = __root_;
15003 cv->__size_ <<= 5;
15004 __root_ = cv;
15005 }
15006 first = t2;
15007 }
15008 }
15009 }
15010 __tag_templates_ = true;
15011 }
15012 else
15013 first = t;
15014 }
15015 else
15016 first = __parse_special_name(first, last);
15017 return first;
15018}
15019
15020// <mangled-name> ::= _Z<encoding>
15021// ::= <type>
15022
15023void
15024__demangle_tree::__parse()
15025{
15026 if (__mangled_name_begin_ == __mangled_name_end_)
15027 {
15028 __status_ = invalid_mangled_name;
15029 return;
15030 }
15031 const char* t = NULL;
15032 if (__mangled_name_end_ - __mangled_name_begin_ >= 2 &&
15033 __mangled_name_begin_[0] == '_' &&
15034 __mangled_name_begin_[1] == 'Z')
15035 {
15036 t = __parse_encoding(__mangled_name_begin_+2, __mangled_name_end_);
15037 if (t != __mangled_name_begin_+2 && t != __mangled_name_end_ && *t == '.')
15038 t = __parse_dot_suffix(t, __mangled_name_end_);
15039 }
15040 else
15041 t = __parse_type(__mangled_name_begin_, __mangled_name_end_);
15042 if (t == __mangled_name_end_ && __root_)
15043 {
15044 if (__fix_forward_references_)
15045 {
15046 if (__root_->fix_forward_references(__t_begin_, __t_end_))
15047 __status_ = success;
15048 }
15049 else
15050 __status_ = success;
15051 }
15052}
15053
15054#pragma GCC visibility pop
15055#pragma GCC visibility push(default)
15056
15057__demangle_tree
15058__demangle(const char* mangled_name, char* buf, size_t bs)
15059{
15060 __demangle_tree t(mangled_name, buf, bs);
15061 if (t.__status() == invalid_mangled_name)
15062 t.__parse();
15063 return t;
15064}
15065
15066__demangle_tree
15067__demangle(const char* mangled_name)
15068{
15069 return __demangle(mangled_name, 0, 0);
15070}
15071
15072char*
15073__demangle(__demangle_tree dmg_tree, char* buf, size_t* n, int* status)
15074{
15075 if (dmg_tree.__status() != success)
15076 {
15077 if (status)
15078 *status = dmg_tree.__status();
15079 return NULL;
15080 }
15081#ifdef DEBUGGING
15082display(dmg_tree.__root_);
15083printf("\n");
15084#endif
15085 const size_t bs = buf == NULL ? 0 : *n;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000015086 ptrdiff_t sm = dmg_tree.__mangled_name_end_ - dmg_tree.__mangled_name_begin_;
Howard Hinnant1e6731d2011-12-01 00:08:59 +000015087 ptrdiff_t est = sm + 60 * (
15088 (dmg_tree.__node_end_ - dmg_tree.__node_begin_) +
15089 (dmg_tree.__sub_end_ - dmg_tree.__sub_begin_) +
15090 (dmg_tree.__t_end_ - dmg_tree.__t_begin_));
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000015091 const unsigned N = 4096;
15092 char tmp[N];
15093 ptrdiff_t s;
15094 if (est <= bs)
15095 {
15096 char* e = dmg_tree.__get_demangled_name(buf);
15097 *e++ = '\0';
15098 s = e - buf;
15099 }
15100 else if (est <= N)
15101 {
15102 char* e = dmg_tree.__get_demangled_name(tmp);
15103 *e++ = '\0';
15104 s = e - tmp;
15105 }
15106 else
15107 s = dmg_tree.size() + 1;
15108 if (s > bs)
15109 {
15110 buf = static_cast<char*>(realloc(buf, s));
15111 if (buf == NULL)
15112 {
15113 if (status)
15114 *status = memory_alloc_failure;
15115 return NULL;
15116 }
15117 if (n)
15118 *n = s;
15119 }
15120 if (est > bs)
15121 {
15122 if (est <= N)
15123 strncpy(buf, tmp, s);
15124 else
15125 *dmg_tree.__get_demangled_name(buf) = '\0';
15126 }
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000015127 if (status)
15128 *status = success;
15129 return buf;
15130}
15131
15132} // __libcxxabi
15133
15134extern "C"
15135{
15136
15137char*
15138__cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status)
15139{
15140 if (mangled_name == NULL || (buf != NULL && n == NULL))
15141 {
15142 if (status)
15143 *status = __libcxxabi::invalid_args;
15144 return NULL;
15145 }
15146 const size_t bs = 64 * 1024;
Howard Hinnant828959c2011-11-28 21:03:21 +000015147 __attribute((aligned(16))) char static_buf[bs];
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000015148
15149 buf = __libcxxabi::__demangle(__libcxxabi::__demangle(mangled_name,
15150 static_buf, bs),
15151 buf, n, status);
15152 return buf;
15153}
15154
15155} // extern "C"
15156
15157} // abi