blob: f455329f627a78b4287d4d284256e18baf23cf24 [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
267class __typeinfo
268 : public __node
269{
270 static const ptrdiff_t n = sizeof("typeinfo for ") - 1;
271public:
272 __typeinfo(__node* type)
273 {
274 __right_ = type;
275 }
276
277 virtual size_t first_size() const
278 {
279 if (__cached_size_ == -1)
280 const_cast<long&>(__cached_size_) = n + __right_->size();
281 return __cached_size_;
282 }
283 virtual char* first_demangled_name(char* buf) const
284 {
285 strncpy(buf, "typeinfo for ", n);
286 return __right_->get_demangled_name(buf+n);
287 }
288 virtual ptrdiff_t print_first(char* f, char* l) const
289 {
290 const ptrdiff_t r = l - f;
291 if (r < n)
292 return n + __right_->print(l, l);
293 ptrdiff_t sz = __right_->print(f+n, l) + n;
294 if (r >= sz)
295 {
296 *f++ = 't';
297 *f++ = 'y';
298 *f++ = 'p';
299 *f++ = 'e';
300 *f++ = 'i';
301 *f++ = 'n';
302 *f++ = 'f';
303 *f++ = 'o';
304 *f++ = ' ';
305 *f++ = 'f';
306 *f++ = 'o';
307 *f++ = 'r';
308 *f = ' ';
309 }
310 return sz;
311 }
312 virtual __node* base_name() const
313 {
314 return __right_->base_name();
315 }
316 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
317 {
318 return __right_->fix_forward_references(t_begin, t_end);
319 }
320};
321
322class __typeinfo_name
323 : public __node
324{
325 static const ptrdiff_t n = sizeof("typeinfo name for ") - 1;
326public:
327 __typeinfo_name(__node* type)
328 {
329 __right_ = type;
330 }
331
332 virtual size_t first_size() const
333 {
334 if (__cached_size_ == -1)
335 const_cast<long&>(__cached_size_) = n + __right_->size();
336 return __cached_size_;
337 }
338 virtual char* first_demangled_name(char* buf) const
339 {
340 strncpy(buf, "typeinfo name for ", n);
341 return __right_->get_demangled_name(buf+n);
342 }
343 virtual ptrdiff_t print_first(char* f, char* l) const
344 {
345 const ptrdiff_t r = l - f;
346 if (r < n)
347 return n + __right_->print(l, l);
348 ptrdiff_t sz = __right_->print(f+n, l) + n;
349 if (r >= sz)
350 {
351 *f++ = 't';
352 *f++ = 'y';
353 *f++ = 'p';
354 *f++ = 'e';
355 *f++ = 'i';
356 *f++ = 'n';
357 *f++ = 'f';
358 *f++ = 'o';
359 *f++ = ' ';
360 *f++ = 'n';
361 *f++ = 'a';
362 *f++ = 'm';
363 *f++ = 'e';
364 *f++ = ' ';
365 *f++ = 'f';
366 *f++ = 'o';
367 *f++ = 'r';
368 *f = ' ';
369 }
370 return sz;
371 }
372 virtual __node* base_name() const
373 {
374 return __right_->base_name();
375 }
376 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
377 {
378 return __right_->fix_forward_references(t_begin, t_end);
379 }
380};
381
382class __covariant_return_thunk
383 : public __node
384{
385 static const ptrdiff_t n = sizeof("covariant return thunk to ") - 1;
386public:
387 __covariant_return_thunk(__node* type)
388 {
389 __right_ = type;
390 }
391
392 virtual size_t first_size() const
393 {
394 if (__cached_size_ == -1)
395 const_cast<long&>(__cached_size_) = n + __right_->size();
396 return __cached_size_;
397 }
398 virtual char* first_demangled_name(char* buf) const
399 {
400 strncpy(buf, "covariant return thunk to ", n);
401 return __right_->get_demangled_name(buf+n);
402 }
403 virtual ptrdiff_t print_first(char* f, char* l) const
404 {
405 const ptrdiff_t r = l - f;
406 if (r < n)
407 return n + __right_->print(l, l);
408 ptrdiff_t sz = __right_->print(f+n, l) + n;
409 if (r >= sz)
410 {
411 *f++ = 'c';
412 *f++ = 'o';
413 *f++ = 'v';
414 *f++ = 'a';
415 *f++ = 'r';
416 *f++ = 'i';
417 *f++ = 'a';
418 *f++ = 'n';
419 *f++ = 't';
420 *f++ = ' ';
421 *f++ = 'r';
422 *f++ = 'e';
423 *f++ = 't';
424 *f++ = 'u';
425 *f++ = 'r';
426 *f++ = 'n';
427 *f++ = ' ';
428 *f++ = 't';
429 *f++ = 'h';
430 *f++ = 'u';
431 *f++ = 'n';
432 *f++ = 'k';
433 *f++ = ' ';
434 *f++ = 't';
435 *f++ = 'o';
436 *f = ' ';
437 }
438 return sz;
439 }
440 virtual __node* base_name() const
441 {
442 return __right_->base_name();
443 }
444 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
445 {
446 return __right_->fix_forward_references(t_begin, t_end);
447 }
448};
449
450class __virtual_thunk
451 : public __node
452{
453 static const size_t n = sizeof("virtual thunk to ") - 1;
454public:
455 __virtual_thunk(__node* type)
456 {
457 __right_ = type;
458 }
459
460 virtual size_t first_size() const
461 {
462 if (__cached_size_ == -1)
463 const_cast<long&>(__cached_size_) = n + __right_->size();
464 return __cached_size_;
465 }
466 virtual char* first_demangled_name(char* buf) const
467 {
468 strncpy(buf, "virtual thunk to ", n);
469 return __right_->get_demangled_name(buf+n);
470 }
471 virtual ptrdiff_t print_first(char* f, char* l) const
472 {
473 const ptrdiff_t r = l - f;
474 if (r < n)
475 return n + __right_->print(l, l);
476 ptrdiff_t sz = __right_->print(f+n, l) + n;
477 if (r >= sz)
478 {
479 *f++ = 'v';
480 *f++ = 'i';
481 *f++ = 'r';
482 *f++ = 't';
483 *f++ = 'u';
484 *f++ = 'a';
485 *f++ = 'l';
486 *f++ = ' ';
487 *f++ = 't';
488 *f++ = 'h';
489 *f++ = 'u';
490 *f++ = 'n';
491 *f++ = 'k';
492 *f++ = ' ';
493 *f++ = 't';
494 *f++ = 'o';
495 *f = ' ';
496 }
497 return sz;
498 }
499 virtual __node* base_name() const
500 {
501 return __right_->base_name();
502 }
503 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
504 {
505 return __right_->fix_forward_references(t_begin, t_end);
506 }
507};
508
509class __non_virtual_thunk
510 : public __node
511{
512 static const size_t n = sizeof("non-virtual thunk to ") - 1;
513public:
514 __non_virtual_thunk(__node* type)
515 {
516 __right_ = type;
517 }
518
519 virtual size_t first_size() const
520 {
521 if (__cached_size_ == -1)
522 const_cast<long&>(__cached_size_) = n + __right_->size();
523 return __cached_size_;
524 }
525 virtual char* first_demangled_name(char* buf) const
526 {
527 strncpy(buf, "non-virtual thunk to ", n);
528 return __right_->get_demangled_name(buf+n);
529 }
530 virtual ptrdiff_t print_first(char* f, char* l) const
531 {
532 const ptrdiff_t r = l - f;
533 if (r < n)
534 return n + __right_->print(l, l);
535 ptrdiff_t sz = __right_->print(f+n, l) + n;
536 if (r >= sz)
537 {
538 *f++ = 'n';
539 *f++ = 'o';
540 *f++ = 'n';
541 *f++ = '-';
542 *f++ = 'v';
543 *f++ = 'i';
544 *f++ = 'r';
545 *f++ = 't';
546 *f++ = 'u';
547 *f++ = 'a';
548 *f++ = 'l';
549 *f++ = ' ';
550 *f++ = 't';
551 *f++ = 'h';
552 *f++ = 'u';
553 *f++ = 'n';
554 *f++ = 'k';
555 *f++ = ' ';
556 *f++ = 't';
557 *f++ = 'o';
558 *f = ' ';
559 }
560 return sz;
561 }
562 virtual __node* base_name() const
563 {
564 return __right_->base_name();
565 }
566 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
567 {
568 return __right_->fix_forward_references(t_begin, t_end);
569 }
570};
571
572class __guard_variable
573 : public __node
574{
575 static const size_t n = sizeof("guard variable for ") - 1;
576public:
577 __guard_variable(__node* type)
578 {
579 __right_ = type;
580 }
581
582 virtual size_t first_size() const
583 {
584 if (__cached_size_ == -1)
585 const_cast<long&>(__cached_size_) = n + __right_->size();
586 return __cached_size_;
587 }
588 virtual char* first_demangled_name(char* buf) const
589 {
590 strncpy(buf, "guard variable for ", n);
591 return __right_->get_demangled_name(buf+n);
592 }
593 virtual ptrdiff_t print_first(char* f, char* l) const
594 {
595 const ptrdiff_t r = l - f;
596 if (r < n)
597 return n + __right_->print(l, l);
598 ptrdiff_t sz = __right_->print(f+n, l) + n;
599 if (r >= sz)
600 {
601 *f++ = 'g';
602 *f++ = 'u';
603 *f++ = 'a';
604 *f++ = 'r';
605 *f++ = 'd';
606 *f++ = ' ';
607 *f++ = 'v';
608 *f++ = 'a';
609 *f++ = 'r';
610 *f++ = 'i';
611 *f++ = 'a';
612 *f++ = 'b';
613 *f++ = 'l';
614 *f++ = 'e';
615 *f++ = ' ';
616 *f++ = 'f';
617 *f++ = 'o';
618 *f++ = 'r';
619 *f = ' ';
620 }
621 return sz;
622 }
623 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
624 {
625 return __right_->fix_forward_references(t_begin, t_end);
626 }
627};
628
629class __source_name
630 : public __node
631{
632public:
633 __source_name(const char* __name, unsigned __size)
634 {
635 __name_ = __name;
636 __size_ = __size;
637 }
638
639 virtual size_t first_size() const
640 {
641 if (__cached_size_ == -1)
642 {
643 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
644 const_cast<long&>(__cached_size_) = 21;
645 else
646 const_cast<long&>(__cached_size_) = __size_;
647 }
648 return __cached_size_;
649 }
650 virtual char* first_demangled_name(char* buf) const
651 {
652 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
653 return strncpy(buf, "(anonymous namespace)", 21) + 21;
654 return strncpy(buf, __name_, __size_) + __size_;
655 }
656 virtual ptrdiff_t print_first(char* f, char* l) const
657 {
658 const ptrdiff_t r = l - f;
659 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
660 {
661 const ptrdiff_t n = sizeof("(anonymous namespace)") - 1;
662 if (r >= n)
663 {
664 *f++ = '(';
665 *f++ = 'a';
666 *f++ = 'n';
667 *f++ = 'o';
668 *f++ = 'n';
669 *f++ = 'y';
670 *f++ = 'm';
671 *f++ = 'o';
672 *f++ = 'u';
673 *f++ = 's';
674 *f++ = ' ';
675 *f++ = 'n';
676 *f++ = 'a';
677 *f++ = 'm';
678 *f++ = 'e';
679 *f++ = 's';
680 *f++ = 'p';
681 *f++ = 'a';
682 *f++ = 'c';
683 *f++ = 'e';
684 *f = ')';
685 }
686 return n;
687 }
688 if (r >= __size_)
689 strncpy(f, __name_, __size_);
690 return __size_;
691 }
692};
693
694class __operator_new
695 : public __node
696{
697public:
698
699 virtual size_t first_size() const {return sizeof("operator new") - 1;}
700 virtual char* first_demangled_name(char* buf) const
701 {
702 return strncpy(buf, "operator new", sizeof("operator new") - 1) +
703 sizeof("operator new") - 1;
704 }
705 virtual ptrdiff_t print_first(char* f, char* l) const
706 {
707 const ptrdiff_t r = l - f;
708 const ptrdiff_t n = sizeof("operator new") - 1;
709 if (r >= n)
710 {
711 *f++ = 'o';
712 *f++ = 'p';
713 *f++ = 'e';
714 *f++ = 'r';
715 *f++ = 'a';
716 *f++ = 't';
717 *f++ = 'o';
718 *f++ = 'r';
719 *f++ = ' ';
720 *f++ = 'n';
721 *f++ = 'e';
722 *f = 'w';
723 }
724 return n;
725 }
726};
727
728class __operator_new_array
729 : public __node
730{
731public:
732
733 virtual size_t first_size() const {return sizeof("operator new[]") - 1;}
734 virtual char* first_demangled_name(char* buf) const
735 {
736 return strncpy(buf, "operator new[]", sizeof("operator new[]") - 1) +
737 sizeof("operator new[]") - 1;
738 }
739 virtual ptrdiff_t print_first(char* f, char* l) const
740 {
741 const ptrdiff_t r = l - f;
742 const ptrdiff_t n = sizeof("operator new[]") - 1;
743 if (r >= n)
744 {
745 *f++ = 'o';
746 *f++ = 'p';
747 *f++ = 'e';
748 *f++ = 'r';
749 *f++ = 'a';
750 *f++ = 't';
751 *f++ = 'o';
752 *f++ = 'r';
753 *f++ = ' ';
754 *f++ = 'n';
755 *f++ = 'e';
756 *f++ = 'w';
757 *f++ = '[';
758 *f = ']';
759 }
760 return n;
761 }
762};
763
764class __operator_delete
765 : public __node
766{
767public:
768
769 virtual size_t first_size() const {return sizeof("operator delete") - 1;}
770 virtual char* first_demangled_name(char* buf) const
771 {
772 return strncpy(buf, "operator delete", sizeof("operator delete") - 1) +
773 sizeof("operator delete") - 1;
774 }
775 virtual ptrdiff_t print_first(char* f, char* l) const
776 {
777 const ptrdiff_t r = l - f;
778 const ptrdiff_t n = sizeof("operator delete") - 1;
779 if (r >= n)
780 {
781 *f++ = 'o';
782 *f++ = 'p';
783 *f++ = 'e';
784 *f++ = 'r';
785 *f++ = 'a';
786 *f++ = 't';
787 *f++ = 'o';
788 *f++ = 'r';
789 *f++ = ' ';
790 *f++ = 'd';
791 *f++ = 'e';
792 *f++ = 'l';
793 *f++ = 'e';
794 *f++ = 't';
795 *f = 'e';
796 }
797 return n;
798 }
799};
800
801class __operator_delete_array
802 : public __node
803{
804public:
805
806 virtual size_t first_size() const {return sizeof("operator delete[]") - 1;}
807 virtual char* first_demangled_name(char* buf) const
808 {
809 return strncpy(buf, "operator delete[]", sizeof("operator delete[]") - 1) +
810 sizeof("operator delete[]") - 1;
811 }
812 virtual ptrdiff_t print_first(char* f, char* l) const
813 {
814 const ptrdiff_t r = l - f;
815 const ptrdiff_t n = sizeof("operator delete[]") - 1;
816 if (r >= n)
817 {
818 *f++ = 'o';
819 *f++ = 'p';
820 *f++ = 'e';
821 *f++ = 'r';
822 *f++ = 'a';
823 *f++ = 't';
824 *f++ = 'o';
825 *f++ = 'r';
826 *f++ = ' ';
827 *f++ = 'd';
828 *f++ = 'e';
829 *f++ = 'l';
830 *f++ = 'e';
831 *f++ = 't';
832 *f++ = 'e';
833 *f++ = '[';
834 *f = ']';
835 }
836 return n;
837 }
838};
839
840class __operator_logical_and
841 : public __node
842{
843public:
844
845 __operator_logical_and() {}
846 __operator_logical_and(__node* op1, __node* op2)
847 {
848 __left_ = op1;
849 __right_ = op2;
850 }
851 virtual size_t first_size() const
852 {
853 if (__cached_size_ == -1)
854 {
855 if (__left_)
856 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
857 else
858 const_cast<long&>(__cached_size_) = sizeof("operator&&") - 1;
859 }
860 return __cached_size_;
861 }
862 virtual char* first_demangled_name(char* buf) const
863 {
864 if (__left_)
865 {
866 *buf++ = '(';
867 buf = __left_->get_demangled_name(buf);
868 strncpy(buf, ") && (", 6);
869 buf += 6;
870 buf = __right_->get_demangled_name(buf);
871 *buf++ = ')';
872 }
873 else
874 {
875 strncpy(buf, "operator&&", sizeof("operator&&") - 1);
876 buf += sizeof("operator&&") - 1;
877 }
878 return buf;
879 }
880 virtual ptrdiff_t print_first(char* f, char* l) const
881 {
882 const ptrdiff_t r = l - f;
883 if (__left_)
884 {
885 const ptrdiff_t n1 = 8;
886 if (r < n1)
887 return n1 + __left_->print(l, l) + __right_->print(l, l);
888 ptrdiff_t sz1 = __left_->print(f+1, l);
889 if (r < n1 + sz1)
890 return n1 + sz1 + __right_->print(l, l);
891 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
892 if (r >= n1 + sz1 + sz2)
893 {
894 *f = '(';
895 f += 1 + sz1;
896 *f++ = ')';
897 *f++ = ' ';
898 *f++ = '&';
899 *f++ = '&';
900 *f++ = ' ';
901 *f = '(';
902 f += 1 + sz2;
903 *f = ')';
904 }
905 return n1 + sz1 + sz2;
906 }
907 const ptrdiff_t n2 = sizeof("operator&&") - 1;
908 if (r >= n2)
909 {
910 *f++ = 'o';
911 *f++ = 'p';
912 *f++ = 'e';
913 *f++ = 'r';
914 *f++ = 'a';
915 *f++ = 't';
916 *f++ = 'o';
917 *f++ = 'r';
918 *f++ = '&';
919 *f = '&';
920 }
921 return n2;
922 }
923 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
924 {
925 bool r = true;
926 if (__left_)
927 r = r && __left_->fix_forward_references(t_begin, t_end);
928 if (__right_)
929 r = r && __right_->fix_forward_references(t_begin, t_end);
930 return r;
931 }
932};
933
934class __operator_addressof
935 : public __node
936{
937public:
938
939 __operator_addressof() {}
940 explicit __operator_addressof(__node* op)
941 {
942 __left_ = op;
943 }
944 virtual size_t first_size() const
945 {
946 if (__cached_size_ == -1)
947 {
948 if (__left_)
949 const_cast<long&>(__cached_size_) = 3+__left_->size();
950 else
951 const_cast<long&>(__cached_size_) = sizeof("operator&") - 1;
952 }
953 return __cached_size_;
954 }
955 virtual char* first_demangled_name(char* buf) const
956 {
957 if (__left_)
958 {
959 *buf++ = '&';
960 *buf++ = '(';
961 buf = __left_->get_demangled_name(buf);
962 *buf++ = ')';
963 }
964 else
965 {
966 strncpy(buf, "operator&", sizeof("operator&") - 1);
967 buf += sizeof("operator&") - 1;
968 }
969 return buf;
970 }
971 virtual ptrdiff_t print_first(char* f, char* l) const
972 {
973 const ptrdiff_t r = l - f;
974 if (__left_)
975 {
976 const ptrdiff_t n1 = 3;
977 if (r < n1)
978 return n1 + __left_->print(l, l);
979 ptrdiff_t sz1 = __left_->print(f+2, l);
980 if (r >= n1 + sz1)
981 {
982 *f++ = '&';
983 *f = '(';
984 f += 1 + sz1;
985 *f = ')';
986 }
987 return n1 + sz1;
988 }
989 const ptrdiff_t n2 = sizeof("operator&") - 1;
990 if (r >= n2)
991 {
992 *f++ = 'o';
993 *f++ = 'p';
994 *f++ = 'e';
995 *f++ = 'r';
996 *f++ = 'a';
997 *f++ = 't';
998 *f++ = 'o';
999 *f++ = 'r';
1000 *f = '&';
1001 }
1002 return n2;
1003 }
1004 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1005 {
1006 if (__left_)
1007 return __left_->fix_forward_references(t_begin, t_end);
1008 return true;
1009 }
1010};
1011
1012class __operator_bit_and
1013 : public __node
1014{
1015public:
1016
1017 __operator_bit_and() {}
1018 __operator_bit_and(__node* op1, __node* op2)
1019 {
1020 __left_ = op1;
1021 __right_ = op2;
1022 }
1023 virtual size_t first_size() const
1024 {
1025 if (__cached_size_ == -1)
1026 {
1027 if (__left_)
1028 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1029 else
1030 const_cast<long&>(__cached_size_) = sizeof("operator&") - 1;
1031 }
1032 return __cached_size_;
1033 }
1034 virtual char* first_demangled_name(char* buf) const
1035 {
1036 if (__left_)
1037 {
1038 *buf++ = '(';
1039 buf = __left_->get_demangled_name(buf);
1040 strncpy(buf, ") & (", 5);
1041 buf += 5;
1042 buf = __right_->get_demangled_name(buf);
1043 *buf++ = ')';
1044 }
1045 else
1046 {
1047 strncpy(buf, "operator&", sizeof("operator&") - 1);
1048 buf += sizeof("operator&") - 1;
1049 }
1050 return buf;
1051 }
1052 virtual ptrdiff_t print_first(char* f, char* l) const
1053 {
1054 const ptrdiff_t r = l - f;
1055 if (__left_)
1056 {
1057 const ptrdiff_t n1 = 7;
1058 if (r < n1)
1059 return n1 + __left_->print(l, l) + __right_->print(l, l);
1060 ptrdiff_t sz1 = __left_->print(f+1, l);
1061 if (r < n1 + sz1)
1062 return n1 + sz1 + __right_->print(l, l);
1063 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1064 if (r >= n1 + sz1 + sz2)
1065 {
1066 *f = '(';
1067 f += 1 + sz1;
1068 *f++ = ')';
1069 *f++ = ' ';
1070 *f++ = '&';
1071 *f++ = ' ';
1072 *f = '(';
1073 f += 1 + sz2;
1074 *f = ')';
1075 }
1076 return n1 + sz1 + sz2;
1077 }
1078 const ptrdiff_t n2 = sizeof("operator&") - 1;
1079 if (r >= n2)
1080 {
1081 *f++ = 'o';
1082 *f++ = 'p';
1083 *f++ = 'e';
1084 *f++ = 'r';
1085 *f++ = 'a';
1086 *f++ = 't';
1087 *f++ = 'o';
1088 *f++ = 'r';
1089 *f = '&';
1090 }
1091 return n2;
1092 }
1093 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1094 {
1095 bool r = true;
1096 if (__left_)
1097 r = r && __left_->fix_forward_references(t_begin, t_end);
1098 if (__right_)
1099 r = r && __right_->fix_forward_references(t_begin, t_end);
1100 return r;
1101 }
1102};
1103
1104class __operator_and_equal
1105 : public __node
1106{
1107public:
1108
1109 __operator_and_equal() {}
1110 __operator_and_equal(__node* op1, __node* op2)
1111 {
1112 __left_ = op1;
1113 __right_ = op2;
1114 }
1115 virtual size_t first_size() const
1116 {
1117 if (__cached_size_ == -1)
1118 {
1119 if (__left_)
1120 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
1121 else
1122 const_cast<long&>(__cached_size_) = sizeof("operator&=") - 1;
1123 }
1124 return __cached_size_;
1125 }
1126 virtual char* first_demangled_name(char* buf) const
1127 {
1128 if (__left_)
1129 {
1130 *buf++ = '(';
1131 buf = __left_->get_demangled_name(buf);
1132 strncpy(buf, ") &= (", 6);
1133 buf += 6;
1134 buf = __right_->get_demangled_name(buf);
1135 *buf++ = ')';
1136 }
1137 else
1138 {
1139 strncpy(buf, "operator&=", sizeof("operator&=") - 1);
1140 buf += sizeof("operator&=") - 1;
1141 }
1142 return buf;
1143 }
1144 virtual ptrdiff_t print_first(char* f, char* l) const
1145 {
1146 const ptrdiff_t r = l - f;
1147 if (__left_)
1148 {
1149 const ptrdiff_t n1 = 8;
1150 if (r < n1)
1151 return n1 + __left_->print(l, l) + __right_->print(l, l);
1152 ptrdiff_t sz1 = __left_->print(f+1, l);
1153 if (r < n1 + sz1)
1154 return n1 + sz1 + __right_->print(l, l);
1155 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1156 if (r >= n1 + sz1 + sz2)
1157 {
1158 *f = '(';
1159 f += 1 + sz1;
1160 *f++ = ')';
1161 *f++ = ' ';
1162 *f++ = '&';
1163 *f++ = '=';
1164 *f++ = ' ';
1165 *f = '(';
1166 f += 1 + sz2;
1167 *f = ')';
1168 }
1169 return n1 + sz1 + sz2;
1170 }
1171 const ptrdiff_t n2 = sizeof("operator&=") - 1;
1172 if (r >= n2)
1173 {
1174 *f++ = 'o';
1175 *f++ = 'p';
1176 *f++ = 'e';
1177 *f++ = 'r';
1178 *f++ = 'a';
1179 *f++ = 't';
1180 *f++ = 'o';
1181 *f++ = 'r';
1182 *f++ = '&';
1183 *f = '=';
1184 }
1185 return n2;
1186 }
1187 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1188 {
1189 bool r = true;
1190 if (__left_)
1191 r = r && __left_->fix_forward_references(t_begin, t_end);
1192 if (__right_)
1193 r = r && __right_->fix_forward_references(t_begin, t_end);
1194 return r;
1195 }
1196};
1197
1198class __operator_equal
1199 : public __node
1200{
1201public:
1202
1203 __operator_equal() {}
1204 __operator_equal(__node* op1, __node* op2)
1205 {
1206 __left_ = op1;
1207 __right_ = op2;
1208 }
1209 virtual size_t first_size() const
1210 {
1211 if (__cached_size_ == -1)
1212 {
1213 if (__left_)
1214 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1215 else
1216 const_cast<long&>(__cached_size_) = sizeof("operator=") - 1;
1217 }
1218 return __cached_size_;
1219 }
1220 virtual char* first_demangled_name(char* buf) const
1221 {
1222 if (__left_)
1223 {
1224 *buf++ = '(';
1225 buf = __left_->get_demangled_name(buf);
1226 strncpy(buf, ") = (", 5);
1227 buf += 5;
1228 buf = __right_->get_demangled_name(buf);
1229 *buf++ = ')';
1230 }
1231 else
1232 {
1233 strncpy(buf, "operator=", sizeof("operator=") - 1);
1234 buf += sizeof("operator=") - 1;
1235 }
1236 return buf;
1237 }
1238 virtual ptrdiff_t print_first(char* f, char* l) const
1239 {
1240 const ptrdiff_t r = l - f;
1241 if (__left_)
1242 {
1243 const ptrdiff_t n1 = 7;
1244 if (r < n1)
1245 return n1 + __left_->print(l, l) + __right_->print(l, l);
1246 ptrdiff_t sz1 = __left_->print(f+1, l);
1247 if (r < n1 + sz1)
1248 return n1 + sz1 + __right_->print(l, l);
1249 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1250 if (r >= n1 + sz1 + sz2)
1251 {
1252 *f = '(';
1253 f += 1 + sz1;
1254 *f++ = ')';
1255 *f++ = ' ';
1256 *f++ = '=';
1257 *f++ = ' ';
1258 *f = '(';
1259 f += 1 + sz2;
1260 *f = ')';
1261 }
1262 return n1 + sz1 + sz2;
1263 }
1264 const ptrdiff_t n2 = sizeof("operator=") - 1;
1265 if (r >= n2)
1266 {
1267 *f++ = 'o';
1268 *f++ = 'p';
1269 *f++ = 'e';
1270 *f++ = 'r';
1271 *f++ = 'a';
1272 *f++ = 't';
1273 *f++ = 'o';
1274 *f++ = 'r';
1275 *f = '=';
1276 }
1277 return n2;
1278 }
1279 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1280 {
1281 bool r = true;
1282 if (__left_)
1283 r = r && __left_->fix_forward_references(t_begin, t_end);
1284 if (__right_)
1285 r = r && __right_->fix_forward_references(t_begin, t_end);
1286 return r;
1287 }
1288};
1289
1290class __operator_alignof_type
1291 : public __node
1292{
1293public:
1294
1295 __operator_alignof_type() {}
1296 __operator_alignof_type(__node* op)
1297 {
1298 __right_ = op;
1299 }
1300 virtual size_t first_size() const
1301 {
1302 if (__cached_size_ == -1)
1303 {
1304 if (__right_)
1305 const_cast<long&>(__cached_size_) = __right_->size() + 10;
1306 else
1307 const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1;
1308 }
1309 return __cached_size_;
1310 }
1311 virtual char* first_demangled_name(char* buf) const
1312 {
1313 if (__right_)
1314 {
1315 strncpy(buf, "alignof (", 9);
1316 buf += 9;
1317 buf = __right_->get_demangled_name(buf);
1318 *buf++ = ')';
1319 }
1320 else
1321 {
1322 strncpy(buf, "operator alignof", sizeof("operator alignof") - 1);
1323 buf += sizeof("operator alignof") - 1;
1324 }
1325 return buf;
1326 }
1327 virtual ptrdiff_t print_first(char* f, char* l) const
1328 {
1329 const ptrdiff_t r = l - f;
1330 if (__right_)
1331 {
1332 const ptrdiff_t n1 = sizeof("alignof ()") - 1;
1333 if (r < n1)
1334 return n1 + __right_->print(l, l);
1335 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
1336 if (r >= n1 + sz1)
1337 {
1338 *f++ = 'a';
1339 *f++ = 'l';
1340 *f++ = 'i';
1341 *f++ = 'g';
1342 *f++ = 'n';
1343 *f++ = 'o';
1344 *f++ = 'f';
1345 *f++ = ' ';
1346 *f = '(';
1347 f += 1 + sz1;
1348 *f = ')';
1349 }
1350 return n1 + sz1;
1351 }
1352 const ptrdiff_t n2 = sizeof("operator alignof") - 1;
1353 if (r >= n2)
1354 {
1355 *f++ = 'o';
1356 *f++ = 'p';
1357 *f++ = 'e';
1358 *f++ = 'r';
1359 *f++ = 'a';
1360 *f++ = 't';
1361 *f++ = 'o';
1362 *f++ = 'r';
1363 *f++ = ' ';
1364 *f++ = 'a';
1365 *f++ = 'l';
1366 *f++ = 'i';
1367 *f++ = 'g';
1368 *f++ = 'n';
1369 *f++ = 'o';
1370 *f = 'f';
1371 }
1372 return n2;
1373 }
1374 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1375 {
1376 if (__right_)
1377 return __right_->fix_forward_references(t_begin, t_end);
1378 return true;
1379 }
1380};
1381
1382class __operator_alignof_expression
1383 : public __node
1384{
1385public:
1386
1387 __operator_alignof_expression() {}
1388 __operator_alignof_expression(__node* op)
1389 {
1390 __right_ = op;
1391 }
1392 virtual size_t first_size() const
1393 {
1394 if (__cached_size_ == -1)
1395 {
1396 if (__right_)
1397 const_cast<long&>(__cached_size_) = __right_->size() + 10;
1398 else
1399 const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1;
1400 }
1401 return __cached_size_;
1402 }
1403 virtual char* first_demangled_name(char* buf) const
1404 {
1405 if (__right_)
1406 {
1407 strncpy(buf, "alignof (", 9);
1408 buf += 9;
1409 buf = __right_->get_demangled_name(buf);
1410 *buf++ = ')';
1411 }
1412 else
1413 {
1414 strncpy(buf, "operator alignof", sizeof("operator alignof") - 1);
1415 buf += sizeof("operator alignof") - 1;
1416 }
1417 return buf;
1418 }
1419 virtual ptrdiff_t print_first(char* f, char* l) const
1420 {
1421 const ptrdiff_t r = l - f;
1422 if (__right_)
1423 {
1424 const ptrdiff_t n1 = sizeof("alignof ()") - 1;
1425 if (r < n1)
1426 return n1 + __right_->print(l, l);
1427 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
1428 if (r >= n1 + sz1)
1429 {
1430 *f++ = 'a';
1431 *f++ = 'l';
1432 *f++ = 'i';
1433 *f++ = 'g';
1434 *f++ = 'n';
1435 *f++ = 'o';
1436 *f++ = 'f';
1437 *f++ = ' ';
1438 *f = '(';
1439 f += 1 + sz1;
1440 *f = ')';
1441 }
1442 return n1 + sz1;
1443 }
1444 const ptrdiff_t n2 = sizeof("operator alignof") - 1;
1445 if (r >= n2)
1446 {
1447 *f++ = 'o';
1448 *f++ = 'p';
1449 *f++ = 'e';
1450 *f++ = 'r';
1451 *f++ = 'a';
1452 *f++ = 't';
1453 *f++ = 'o';
1454 *f++ = 'r';
1455 *f++ = ' ';
1456 *f++ = 'a';
1457 *f++ = 'l';
1458 *f++ = 'i';
1459 *f++ = 'g';
1460 *f++ = 'n';
1461 *f++ = 'o';
1462 *f = 'f';
1463 }
1464 return n2;
1465 }
1466 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1467 {
1468 if (__right_)
1469 return __right_->fix_forward_references(t_begin, t_end);
1470 return true;
1471 }
1472};
1473
1474class __operator_paren
1475 : public __node
1476{
1477public:
1478
1479 virtual size_t first_size() const {return sizeof("operator()") - 1;}
1480 virtual char* first_demangled_name(char* buf) const
1481 {
1482 strncpy(buf, "operator()", sizeof("operator()") - 1);
1483 return buf + sizeof("operator()") - 1;
1484 }
1485 virtual ptrdiff_t print_first(char* f, char* l) const
1486 {
1487 const ptrdiff_t r = l - f;
1488 const ptrdiff_t n = sizeof("operator()") - 1;
1489 if (r >= n)
1490 {
1491 *f++ = 'o';
1492 *f++ = 'p';
1493 *f++ = 'e';
1494 *f++ = 'r';
1495 *f++ = 'a';
1496 *f++ = 't';
1497 *f++ = 'o';
1498 *f++ = 'r';
1499 *f++ = '(';
1500 *f = ')';
1501 }
1502 return n;
1503 }
1504};
1505
1506class __operator_comma
1507 : public __node
1508{
1509public:
1510
1511 __operator_comma() {}
1512 __operator_comma(__node* op1, __node* op2)
1513 {
1514 __left_ = op1;
1515 __right_ = op2;
1516 }
1517 virtual size_t first_size() const
1518 {
1519 if (__cached_size_ == -1)
1520 {
1521 if (__left_)
1522 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1523 else
1524 const_cast<long&>(__cached_size_) = sizeof("operator,") - 1;
1525 }
1526 return __cached_size_;
1527 }
1528 virtual char* first_demangled_name(char* buf) const
1529 {
1530 if (__left_)
1531 {
1532 *buf++ = '(';
1533 buf = __left_->get_demangled_name(buf);
1534 strncpy(buf, ") , (", 5);
1535 buf += 5;
1536 buf = __right_->get_demangled_name(buf);
1537 *buf++ = ')';
1538 }
1539 else
1540 {
1541 strncpy(buf, "operator,", sizeof("operator,") - 1);
1542 buf += sizeof("operator,") - 1;
1543 }
1544 return buf;
1545 }
1546 virtual ptrdiff_t print_first(char* f, char* l) const
1547 {
1548 const ptrdiff_t r = l - f;
1549 if (__left_)
1550 {
1551 const ptrdiff_t n1 = 7;
1552 if (r < n1)
1553 return n1 + __left_->print(l, l) + __right_->print(l, l);
1554 ptrdiff_t sz1 = __left_->print(f+1, l);
1555 if (r < n1 + sz1)
1556 return n1 + sz1 + __right_->print(l, l);
1557 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1558 if (r >= n1 + sz1 + sz2)
1559 {
1560 *f = '(';
1561 f += 1 + sz1;
1562 *f++ = ')';
1563 *f++ = ' ';
1564 *f++ = ',';
1565 *f++ = ' ';
1566 *f = '(';
1567 f += 1 + sz2;
1568 *f = ')';
1569 }
1570 return n1 + sz1 + sz2;
1571 }
1572 const ptrdiff_t n2 = sizeof("operator,") - 1;
1573 if (r >= n2)
1574 {
1575 *f++ = 'o';
1576 *f++ = 'p';
1577 *f++ = 'e';
1578 *f++ = 'r';
1579 *f++ = 'a';
1580 *f++ = 't';
1581 *f++ = 'o';
1582 *f++ = 'r';
1583 *f = ',';
1584 }
1585 return n2;
1586 }
1587 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1588 {
1589 bool r = true;
1590 if (__left_)
1591 r = r && __left_->fix_forward_references(t_begin, t_end);
1592 if (__right_)
1593 r = r && __right_->fix_forward_references(t_begin, t_end);
1594 return r;
1595 }
1596};
1597
1598class __operator_tilda
1599 : public __node
1600{
1601public:
1602
1603 __operator_tilda() {}
1604 explicit __operator_tilda(__node* op)
1605 {
1606 __left_ = op;
1607 }
1608 virtual size_t first_size() const
1609 {
1610 if (__cached_size_ == -1)
1611 {
1612 if (__left_)
1613 const_cast<long&>(__cached_size_) = 3+__left_->size();
1614 else
1615 const_cast<long&>(__cached_size_) = sizeof("operator~") - 1;
1616 }
1617 return __cached_size_;
1618 }
1619 virtual char* first_demangled_name(char* buf) const
1620 {
1621 if (__left_)
1622 {
1623 *buf++ = '~';
1624 *buf++ = '(';
1625 buf = __left_->get_demangled_name(buf);
1626 *buf++ = ')';
1627 }
1628 else
1629 {
1630 strncpy(buf, "operator~", sizeof("operator~") - 1);
1631 buf += sizeof("operator~") - 1;
1632 }
1633 return buf;
1634 }
1635 virtual ptrdiff_t print_first(char* f, char* l) const
1636 {
1637 const ptrdiff_t r = l - f;
1638 if (__left_)
1639 {
1640 const ptrdiff_t n1 = 3;
1641 if (r < n1)
1642 return n1 + __left_->print(l, l);
1643 ptrdiff_t sz1 = __left_->print(f+2, l);
1644 if (r >= n1 + sz1)
1645 {
1646 *f++ = '~';
1647 *f = '(';
1648 f += 1 + sz1;
1649 *f = ')';
1650 }
1651 return n1 + sz1;
1652 }
1653 const ptrdiff_t n2 = sizeof("operator~") - 1;
1654 if (r >= n2)
1655 {
1656 *f++ = 'o';
1657 *f++ = 'p';
1658 *f++ = 'e';
1659 *f++ = 'r';
1660 *f++ = 'a';
1661 *f++ = 't';
1662 *f++ = 'o';
1663 *f++ = 'r';
1664 *f = '~';
1665 }
1666 return n2;
1667 }
1668 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1669 {
1670 if (__left_)
1671 return __left_->fix_forward_references(t_begin, t_end);
1672 return true;
1673 }
1674};
1675
1676class __operator_cast
1677 : public __node
1678{
1679 static const size_t n = sizeof("operator ") - 1;
1680public:
1681
1682 explicit __operator_cast(__node* type)
1683 {
1684 __right_ = type;
1685 }
1686 __operator_cast(__node* type, __node* arg)
1687 {
1688 __size_ = 1;
1689 __right_ = type;
1690 __left_ = arg;
1691 }
1692 virtual size_t first_size() const
1693 {
1694 if (__cached_size_ == -1)
1695 {
1696 size_t off;
1697 if (__size_)
1698 {
1699 off = 4;
1700 off += __right_->size();
1701 if (__left_)
1702 off += __left_->size();
1703 }
1704 else
1705 off = n + __right_->size();;
1706 const_cast<long&>(__cached_size_) = off;
1707 }
1708 return __cached_size_;
1709 }
1710 virtual char* first_demangled_name(char* buf) const
1711 {
1712 if (__size_)
1713 {
1714 *buf++ = '(';
1715 buf = __right_->get_demangled_name(buf);
1716 *buf++ = ')';
1717 *buf++ = '(';
1718 if (__left_)
1719 buf = __left_->get_demangled_name(buf);
1720 *buf++ = ')';
1721 }
1722 else
1723 {
1724 strncpy(buf, "operator ", n);
1725 buf = __right_->get_demangled_name(buf+n);
1726 }
1727 return buf;
1728 }
1729 virtual ptrdiff_t print_first(char* f, char* l) const
1730 {
1731 const ptrdiff_t r = l - f;
1732 if (__size_)
1733 {
1734 const ptrdiff_t n1 = 4;
1735 if (r < n1)
1736 return n1 + __right_->print(l, l) +
1737 (__left_ ? __left_->print(l, l) : 0);
1738 ptrdiff_t sz1 = __right_->print(f+1, l);
1739 if (r < n1 + sz1)
1740 return n1 + sz1 + (__left_ ? __left_->print(l, l) : 0);
1741 ptrdiff_t sz2 = __left_ ? __left_->print(f+3+sz1, l) : 0;
1742 if (r >= n1 + sz1 + sz2)
1743 {
1744 *f = '(';
1745 f += 1 + sz1;
1746 *f++ = ')';
1747 *f = '(';
1748 f += 1 + sz2;
1749 *f = ')';
1750 }
1751 return n1 + sz1 + sz2;
1752 }
1753 const ptrdiff_t n2 = sizeof("operator ") - 1;
1754 if (r < n2)
1755 return n2 + __right_->print(l, l);
1756 ptrdiff_t sz1 = __right_->print(f+n2, l);
1757 if (r >= n2 + sz1)
1758 {
1759 *f++ = 'o';
1760 *f++ = 'p';
1761 *f++ = 'e';
1762 *f++ = 'r';
1763 *f++ = 'a';
1764 *f++ = 't';
1765 *f++ = 'o';
1766 *f++ = 'r';
1767 *f = ' ';
1768 }
1769 return n2 + sz1;
1770 }
1771 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1772 {
1773 bool r = true;
1774 if (__left_)
1775 r = r && __left_->fix_forward_references(t_begin, t_end);
1776 r = r && __right_->fix_forward_references(t_begin, t_end);
1777 return r;
1778 }
1779 virtual bool is_ctor_dtor_conv() const
1780 {
1781 return true;
1782 }
1783};
1784
1785class __cast_literal
1786 : public __node
1787{
1788public:
1789
1790 __cast_literal(__node* type, const char* f, const char* l)
1791 {
1792 __left_ = type;
1793 __name_ = f;
1794 __size_ = l - f;
1795 }
1796 virtual size_t first_size() const
1797 {
1798 if (__cached_size_ == -1)
1799 const_cast<long&>(__cached_size_) = 2 + __left_->size() + __size_;
1800 return __cached_size_;
1801 }
1802 virtual char* first_demangled_name(char* buf) const
1803 {
1804 *buf++ = '(';
1805 buf = __left_->get_demangled_name(buf);
1806 *buf++ = ')';
1807 strncpy(buf, __name_, __size_);
1808 return buf + __size_;
1809 }
1810 virtual ptrdiff_t print_first(char* f, char* l) const
1811 {
1812 const ptrdiff_t r = l - f;
1813 const ptrdiff_t n = 2;
1814 if (r < __size_ + n)
1815 return __size_ + n + __left_->print(l, l);
1816 ptrdiff_t sz = __left_->print(f+1, l);
1817 if (r >= __size_ + n + sz)
1818 {
1819 *f = '(';
1820 f += 1 + sz;
1821 *f++ = ')';
1822 strncpy(f, __name_, __size_);
1823 }
1824 return __size_ + n + sz;
1825 }
1826 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1827 {
1828 return __left_->fix_forward_references(t_begin, t_end);
1829 }
1830};
1831
1832class __operator_dereference
1833 : public __node
1834{
1835public:
1836
1837 __operator_dereference() {}
1838 explicit __operator_dereference(__node* op)
1839 {
1840 __left_ = op;
1841 }
1842 virtual size_t first_size() const
1843 {
1844 if (__cached_size_ == -1)
1845 {
1846 if (__left_)
1847 const_cast<long&>(__cached_size_) = 3+__left_->size();
1848 else
1849 const_cast<long&>(__cached_size_) = sizeof("operator*") - 1;
1850 }
1851 return __cached_size_;
1852 }
1853 virtual char* first_demangled_name(char* buf) const
1854 {
1855 if (__left_)
1856 {
1857 *buf++ = '*';
1858 *buf++ = '(';
1859 buf = __left_->get_demangled_name(buf);
1860 *buf++ = ')';
1861 }
1862 else
1863 {
1864 strncpy(buf, "operator*", sizeof("operator*") - 1);
1865 buf += sizeof("operator*") - 1;
1866 }
1867 return buf;
1868 }
1869 virtual ptrdiff_t print_first(char* f, char* l) const
1870 {
1871 const ptrdiff_t r = l - f;
1872 if (__left_)
1873 {
1874 const ptrdiff_t n1 = 3;
1875 if (r < n1)
1876 return n1 + __left_->print(l, l);
1877 ptrdiff_t sz1 = __left_->print(f+2, l);
1878 if (r >= n1 + sz1)
1879 {
1880 *f++ = '*';
1881 *f = '(';
1882 f += 1 + sz1;
1883 *f = ')';
1884 }
1885 return n1 + sz1;
1886 }
1887 const ptrdiff_t n2 = sizeof("operator*") - 1;
1888 if (r >= n2)
1889 {
1890 *f++ = 'o';
1891 *f++ = 'p';
1892 *f++ = 'e';
1893 *f++ = 'r';
1894 *f++ = 'a';
1895 *f++ = 't';
1896 *f++ = 'o';
1897 *f++ = 'r';
1898 *f = '*';
1899 }
1900 return n2;
1901 }
1902 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1903 {
1904 if (__left_)
1905 return __left_->fix_forward_references(t_begin, t_end);
1906 return true;
1907 }
1908};
1909
1910class __operator_divide
1911 : public __node
1912{
1913public:
1914
1915 __operator_divide() {}
1916 __operator_divide(__node* op1, __node* op2)
1917 {
1918 __left_ = op1;
1919 __right_ = op2;
1920 }
1921 virtual size_t first_size() const
1922 {
1923 if (__cached_size_ == -1)
1924 {
1925 if (__left_)
1926 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1927 else
1928 const_cast<long&>(__cached_size_) = sizeof("operator/") - 1;
1929 }
1930 return __cached_size_;
1931 }
1932 virtual char* first_demangled_name(char* buf) const
1933 {
1934 if (__left_)
1935 {
1936 *buf++ = '(';
1937 buf = __left_->get_demangled_name(buf);
1938 strncpy(buf, ") / (", 5);
1939 buf += 5;
1940 buf = __right_->get_demangled_name(buf);
1941 *buf++ = ')';
1942 }
1943 else
1944 {
1945 strncpy(buf, "operator/", sizeof("operator/") - 1);
1946 buf += sizeof("operator/") - 1;
1947 }
1948 return buf;
1949 }
1950 virtual ptrdiff_t print_first(char* f, char* l) const
1951 {
1952 const ptrdiff_t r = l - f;
1953 if (__left_)
1954 {
1955 const ptrdiff_t n1 = 7;
1956 if (r < n1)
1957 return n1 + __left_->print(l, l) + __right_->print(l, l);
1958 ptrdiff_t sz1 = __left_->print(f+1, l);
1959 if (r < n1 + sz1)
1960 return n1 + sz1 + __right_->print(l, l);
1961 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1962 if (r >= n1 + sz1 + sz2)
1963 {
1964 *f = '(';
1965 f += 1 + sz1;
1966 *f++ = ')';
1967 *f++ = ' ';
1968 *f++ = '/';
1969 *f++ = ' ';
1970 *f = '(';
1971 f += 1 + sz2;
1972 *f = ')';
1973 }
1974 return n1 + sz1 + sz2;
1975 }
1976 const ptrdiff_t n2 = sizeof("operator/") - 1;
1977 if (r >= n2)
1978 {
1979 *f++ = 'o';
1980 *f++ = 'p';
1981 *f++ = 'e';
1982 *f++ = 'r';
1983 *f++ = 'a';
1984 *f++ = 't';
1985 *f++ = 'o';
1986 *f++ = 'r';
1987 *f = '/';
1988 }
1989 return n2;
1990 }
1991 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1992 {
1993 bool r = true;
1994 if (__left_)
1995 r = r && __left_->fix_forward_references(t_begin, t_end);
1996 if (__right_)
1997 r = r && __right_->fix_forward_references(t_begin, t_end);
1998 return r;
1999 }
2000};
2001
2002class __operator_divide_equal
2003 : public __node
2004{
2005public:
2006
2007 __operator_divide_equal() {}
2008 __operator_divide_equal(__node* op1, __node* op2)
2009 {
2010 __left_ = op1;
2011 __right_ = op2;
2012 }
2013 virtual size_t first_size() const
2014 {
2015 if (__cached_size_ == -1)
2016 {
2017 if (__left_)
2018 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2019 else
2020 const_cast<long&>(__cached_size_) = sizeof("operator/=") - 1;
2021 }
2022 return __cached_size_;
2023 }
2024 virtual char* first_demangled_name(char* buf) const
2025 {
2026 if (__left_)
2027 {
2028 *buf++ = '(';
2029 buf = __left_->get_demangled_name(buf);
2030 strncpy(buf, ") /= (", 6);
2031 buf += 6;
2032 buf = __right_->get_demangled_name(buf);
2033 *buf++ = ')';
2034 }
2035 else
2036 {
2037 strncpy(buf, "operator/=", sizeof("operator/=") - 1);
2038 buf += sizeof("operator/=") - 1;
2039 }
2040 return buf;
2041 }
2042 virtual ptrdiff_t print_first(char* f, char* l) const
2043 {
2044 const ptrdiff_t r = l - f;
2045 if (__left_)
2046 {
2047 const ptrdiff_t n1 = 8;
2048 if (r < n1)
2049 return n1 + __left_->print(l, l) + __right_->print(l, l);
2050 ptrdiff_t sz1 = __left_->print(f+1, l);
2051 if (r < n1 + sz1)
2052 return n1 + sz1 + __right_->print(l, l);
2053 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2054 if (r >= n1 + sz1 + sz2)
2055 {
2056 *f = '(';
2057 f += 1 + sz1;
2058 *f++ = ')';
2059 *f++ = ' ';
2060 *f++ = '/';
2061 *f++ = '=';
2062 *f++ = ' ';
2063 *f = '(';
2064 f += 1 + sz2;
2065 *f = ')';
2066 }
2067 return n1 + sz1 + sz2;
2068 }
2069 const ptrdiff_t n2 = sizeof("operator/=") - 1;
2070 if (r >= n2)
2071 {
2072 *f++ = 'o';
2073 *f++ = 'p';
2074 *f++ = 'e';
2075 *f++ = 'r';
2076 *f++ = 'a';
2077 *f++ = 't';
2078 *f++ = 'o';
2079 *f++ = 'r';
2080 *f++ = '/';
2081 *f = '=';
2082 }
2083 return n2;
2084 }
2085 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2086 {
2087 bool r = true;
2088 if (__left_)
2089 r = r && __left_->fix_forward_references(t_begin, t_end);
2090 if (__right_)
2091 r = r && __right_->fix_forward_references(t_begin, t_end);
2092 return r;
2093 }
2094};
2095
2096class __operator_xor
2097 : public __node
2098{
2099public:
2100
2101 __operator_xor() {}
2102 __operator_xor(__node* op1, __node* op2)
2103 {
2104 __left_ = op1;
2105 __right_ = op2;
2106 }
2107 virtual size_t first_size() const
2108 {
2109 if (__cached_size_ == -1)
2110 {
2111 if (__left_)
2112 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2113 else
2114 const_cast<long&>(__cached_size_) = sizeof("operator^") - 1;
2115 }
2116 return __cached_size_;
2117 }
2118 virtual char* first_demangled_name(char* buf) const
2119 {
2120 if (__left_)
2121 {
2122 *buf++ = '(';
2123 buf = __left_->get_demangled_name(buf);
2124 strncpy(buf, ") ^ (", 5);
2125 buf += 5;
2126 buf = __right_->get_demangled_name(buf);
2127 *buf++ = ')';
2128 }
2129 else
2130 {
2131 strncpy(buf, "operator^", sizeof("operator^") - 1);
2132 buf += sizeof("operator^") - 1;
2133 }
2134 return buf;
2135 }
2136 virtual ptrdiff_t print_first(char* f, char* l) const
2137 {
2138 const ptrdiff_t r = l - f;
2139 if (__left_)
2140 {
2141 const ptrdiff_t n1 = 7;
2142 if (r < n1)
2143 return n1 + __left_->print(l, l) + __right_->print(l, l);
2144 ptrdiff_t sz1 = __left_->print(f+1, l);
2145 if (r < n1 + sz1)
2146 return n1 + sz1 + __right_->print(l, l);
2147 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2148 if (r >= n1 + sz1 + sz2)
2149 {
2150 *f = '(';
2151 f += 1 + sz1;
2152 *f++ = ')';
2153 *f++ = ' ';
2154 *f++ = '^';
2155 *f++ = ' ';
2156 *f = '(';
2157 f += 1 + sz2;
2158 *f = ')';
2159 }
2160 return n1 + sz1 + sz2;
2161 }
2162 const ptrdiff_t n2 = sizeof("operator^") - 1;
2163 if (r >= n2)
2164 {
2165 *f++ = 'o';
2166 *f++ = 'p';
2167 *f++ = 'e';
2168 *f++ = 'r';
2169 *f++ = 'a';
2170 *f++ = 't';
2171 *f++ = 'o';
2172 *f++ = 'r';
2173 *f = '^';
2174 }
2175 return n2;
2176 }
2177 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2178 {
2179 bool r = true;
2180 if (__left_)
2181 r = r && __left_->fix_forward_references(t_begin, t_end);
2182 if (__right_)
2183 r = r && __right_->fix_forward_references(t_begin, t_end);
2184 return r;
2185 }
2186};
2187
2188class __operator_xor_equal
2189 : public __node
2190{
2191public:
2192
2193 __operator_xor_equal() {}
2194 __operator_xor_equal(__node* op1, __node* op2)
2195 {
2196 __left_ = op1;
2197 __right_ = op2;
2198 }
2199 virtual size_t first_size() const
2200 {
2201 if (__cached_size_ == -1)
2202 {
2203 if (__left_)
2204 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2205 else
2206 const_cast<long&>(__cached_size_) = sizeof("operator^=") - 1;
2207 }
2208 return __cached_size_;
2209 }
2210 virtual char* first_demangled_name(char* buf) const
2211 {
2212 if (__left_)
2213 {
2214 *buf++ = '('; // strncpy(buf, "(", 1);
2215 buf = __left_->get_demangled_name(buf);
2216 strncpy(buf, ") ^= (", 6);
2217 buf += 6;
2218 buf = __right_->get_demangled_name(buf);
2219 *buf++ = ')';
2220 }
2221 else
2222 {
2223 strncpy(buf, "operator^=", sizeof("operator^=") - 1);
2224 buf += sizeof("operator^=") - 1;
2225 }
2226 return buf;
2227 }
2228 virtual ptrdiff_t print_first(char* f, char* l) const
2229 {
2230 const ptrdiff_t r = l - f;
2231 if (__left_)
2232 {
2233 const ptrdiff_t n1 = 8;
2234 if (r < n1)
2235 return n1 + __left_->print(l, l) + __right_->print(l, l);
2236 ptrdiff_t sz1 = __left_->print(f+1, l);
2237 if (r < n1 + sz1)
2238 return n1 + sz1 + __right_->print(l, l);
2239 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2240 if (r >= n1 + sz1 + sz2)
2241 {
2242 *f = '(';
2243 f += 1 + sz1;
2244 *f++ = ')';
2245 *f++ = ' ';
2246 *f++ = '^';
2247 *f++ = '=';
2248 *f++ = ' ';
2249 *f = '(';
2250 f += 1 + sz2;
2251 *f = ')';
2252 }
2253 return n1 + sz1 + sz2;
2254 }
2255 const ptrdiff_t n2 = sizeof("operator^=") - 1;
2256 if (r >= n2)
2257 {
2258 *f++ = 'o';
2259 *f++ = 'p';
2260 *f++ = 'e';
2261 *f++ = 'r';
2262 *f++ = 'a';
2263 *f++ = 't';
2264 *f++ = 'o';
2265 *f++ = 'r';
2266 *f++ = '^';
2267 *f = '=';
2268 }
2269 return n2;
2270 }
2271 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2272 {
2273 bool r = true;
2274 if (__left_)
2275 r = r && __left_->fix_forward_references(t_begin, t_end);
2276 if (__right_)
2277 r = r && __right_->fix_forward_references(t_begin, t_end);
2278 return r;
2279 }
2280};
2281
2282class __operator_equality
2283 : public __node
2284{
2285public:
2286
2287 __operator_equality() {}
2288 __operator_equality(__node* op1, __node* op2)
2289 {
2290 __left_ = op1;
2291 __right_ = op2;
2292 }
2293 virtual size_t first_size() const
2294 {
2295 if (__cached_size_ == -1)
2296 {
2297 if (__left_)
2298 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2299 else
2300 const_cast<long&>(__cached_size_) = sizeof("operator==") - 1;
2301 }
2302 return __cached_size_;
2303 }
2304 virtual char* first_demangled_name(char* buf) const
2305 {
2306 if (__left_)
2307 {
2308 *buf++ = '(';
2309 buf = __left_->get_demangled_name(buf);
2310 strncpy(buf, ") == (", 6);
2311 buf += 6;
2312 buf = __right_->get_demangled_name(buf);
2313 *buf++ = ')';
2314 }
2315 else
2316 {
2317 strncpy(buf, "operator==", sizeof("operator==") - 1);
2318 buf += sizeof("operator==") - 1;
2319 }
2320 return buf;
2321 }
2322 virtual ptrdiff_t print_first(char* f, char* l) const
2323 {
2324 const ptrdiff_t r = l - f;
2325 if (__left_)
2326 {
2327 const ptrdiff_t n1 = 8;
2328 if (r < n1)
2329 return n1 + __left_->print(l, l) + __right_->print(l, l);
2330 ptrdiff_t sz1 = __left_->print(f+1, l);
2331 if (r < n1 + sz1)
2332 return n1 + sz1 + __right_->print(l, l);
2333 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2334 if (r >= n1 + sz1 + sz2)
2335 {
2336 *f = '(';
2337 f += 1 + sz1;
2338 *f++ = ')';
2339 *f++ = ' ';
2340 *f++ = '=';
2341 *f++ = '=';
2342 *f++ = ' ';
2343 *f = '(';
2344 f += 1 + sz2;
2345 *f = ')';
2346 }
2347 return n1 + sz1 + sz2;
2348 }
2349 const ptrdiff_t n2 = sizeof("operator==") - 1;
2350 if (r >= n2)
2351 {
2352 *f++ = 'o';
2353 *f++ = 'p';
2354 *f++ = 'e';
2355 *f++ = 'r';
2356 *f++ = 'a';
2357 *f++ = 't';
2358 *f++ = 'o';
2359 *f++ = 'r';
2360 *f++ = '=';
2361 *f = '=';
2362 }
2363 return n2;
2364 }
2365 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2366 {
2367 bool r = true;
2368 if (__left_)
2369 r = r && __left_->fix_forward_references(t_begin, t_end);
2370 if (__right_)
2371 r = r && __right_->fix_forward_references(t_begin, t_end);
2372 return r;
2373 }
2374};
2375
2376class __operator_greater_equal
2377 : public __node
2378{
2379public:
2380
2381 __operator_greater_equal() {}
2382 __operator_greater_equal(__node* op1, __node* op2)
2383 {
2384 __left_ = op1;
2385 __right_ = op2;
2386 }
2387 virtual size_t first_size() const
2388 {
2389 if (__cached_size_ == -1)
2390 {
2391 if (__left_)
2392 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2393 else
2394 const_cast<long&>(__cached_size_) = sizeof("operator>=") - 1;
2395 }
2396 return __cached_size_;
2397 }
2398 virtual char* first_demangled_name(char* buf) const
2399 {
2400 if (__left_)
2401 {
2402 *buf++ = '(';
2403 buf = __left_->get_demangled_name(buf);
2404 strncpy(buf, ") >= (", 6);
2405 buf += 6;
2406 buf = __right_->get_demangled_name(buf);
2407 *buf++ = ')';
2408 }
2409 else
2410 {
2411 strncpy(buf, "operator>=", sizeof("operator>=") - 1);
2412 buf += sizeof("operator>=") - 1;
2413 }
2414 return buf;
2415 }
2416 virtual ptrdiff_t print_first(char* f, char* l) const
2417 {
2418 const ptrdiff_t r = l - f;
2419 if (__left_)
2420 {
2421 const ptrdiff_t n1 = 8;
2422 if (r < n1)
2423 return n1 + __left_->print(l, l) + __right_->print(l, l);
2424 ptrdiff_t sz1 = __left_->print(f+1, l);
2425 if (r < n1 + sz1)
2426 return n1 + sz1 + __right_->print(l, l);
2427 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2428 if (r >= n1 + sz1 + sz2)
2429 {
2430 *f = '(';
2431 f += 1 + sz1;
2432 *f++ = ')';
2433 *f++ = ' ';
2434 *f++ = '>';
2435 *f++ = '=';
2436 *f++ = ' ';
2437 *f = '(';
2438 f += 1 + sz2;
2439 *f = ')';
2440 }
2441 return n1 + sz1 + sz2;
2442 }
2443 const ptrdiff_t n2 = sizeof("operator>=") - 1;
2444 if (r >= n2)
2445 {
2446 *f++ = 'o';
2447 *f++ = 'p';
2448 *f++ = 'e';
2449 *f++ = 'r';
2450 *f++ = 'a';
2451 *f++ = 't';
2452 *f++ = 'o';
2453 *f++ = 'r';
2454 *f++ = '>';
2455 *f = '=';
2456 }
2457 return n2;
2458 }
2459 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2460 {
2461 bool r = true;
2462 if (__left_)
2463 r = r && __left_->fix_forward_references(t_begin, t_end);
2464 if (__right_)
2465 r = r && __right_->fix_forward_references(t_begin, t_end);
2466 return r;
2467 }
2468};
2469
2470class __operator_greater
2471 : public __node
2472{
2473public:
2474
2475 __operator_greater() {}
2476 __operator_greater(__node* op1, __node* op2)
2477 {
2478 __left_ = op1;
2479 __right_ = op2;
2480 }
2481 virtual size_t first_size() const
2482 {
2483 if (__cached_size_ == -1)
2484 {
2485 if (__left_)
2486 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
2487 else
2488 const_cast<long&>(__cached_size_) = sizeof("operator>") - 1;
2489 }
2490 return __cached_size_;
2491 }
2492 virtual char* first_demangled_name(char* buf) const
2493 {
2494 if (__left_)
2495 {
2496 *buf++ = '(';
2497 *buf++ = '(';
2498 buf = __left_->get_demangled_name(buf);
2499 strncpy(buf, ") > (", 5);
2500 buf += 5;
2501 buf = __right_->get_demangled_name(buf);
2502 *buf++ = ')';
2503 *buf++ = ')';
2504 }
2505 else
2506 {
2507 strncpy(buf, "operator>", sizeof("operator>") - 1);
2508 buf += sizeof("operator>") - 1;
2509 }
2510 return buf;
2511 }
2512 virtual ptrdiff_t print_first(char* f, char* l) const
2513 {
2514 const ptrdiff_t r = l - f;
2515 if (__left_)
2516 {
2517 const ptrdiff_t n1 = 9;
2518 if (r < n1)
2519 return n1 + __left_->print(l, l) + __right_->print(l, l);
2520 ptrdiff_t sz1 = __left_->print(f+2, l);
2521 if (r < n1 + sz1)
2522 return n1 + sz1 + __right_->print(l, l);
2523 ptrdiff_t sz2 = __right_->print(f+(n1-2)+sz1, l);
2524 if (r >= n1 + sz1 + sz2)
2525 {
2526 *f++ = '(';
2527 *f = '(';
2528 f += 1 + sz1;
2529 *f++ = ')';
2530 *f++ = ' ';
2531 *f++ = '>';
2532 *f++ = ' ';
2533 *f = '(';
2534 f += 1 + sz2;
2535 *f++ = ')';
2536 *f = ')';
2537 }
2538 return n1 + sz1 + sz2;
2539 }
2540 const ptrdiff_t n2 = sizeof("operator>") - 1;
2541 if (r >= n2)
2542 {
2543 *f++ = 'o';
2544 *f++ = 'p';
2545 *f++ = 'e';
2546 *f++ = 'r';
2547 *f++ = 'a';
2548 *f++ = 't';
2549 *f++ = 'o';
2550 *f++ = 'r';
2551 *f = '>';
2552 }
2553 return n2;
2554 }
2555 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2556 {
2557 bool r = true;
2558 if (__left_)
2559 r = r && __left_->fix_forward_references(t_begin, t_end);
2560 if (__right_)
2561 r = r && __right_->fix_forward_references(t_begin, t_end);
2562 return r;
2563 }
2564};
2565
2566class __operator_brackets
2567 : public __node
2568{
2569public:
2570
2571 virtual size_t first_size() const {return sizeof("operator[]") - 1;}
2572 virtual char* first_demangled_name(char* buf) const
2573 {
2574 strncpy(buf, "operator[]", sizeof("operator[]") - 1);
2575 return buf + sizeof("operator[]") - 1;
2576 }
2577 virtual ptrdiff_t print_first(char* f, char* l) const
2578 {
2579 const ptrdiff_t r = l - f;
2580 const ptrdiff_t n = sizeof("operator[]") - 1;
2581 if (r >= n)
2582 {
2583 *f++ = 'o';
2584 *f++ = 'p';
2585 *f++ = 'e';
2586 *f++ = 'r';
2587 *f++ = 'a';
2588 *f++ = 't';
2589 *f++ = 'o';
2590 *f++ = 'r';
2591 *f++ = '[';
2592 *f = ']';
2593 }
2594 return n;
2595 }
2596};
2597
2598class __operator_less_equal
2599 : public __node
2600{
2601public:
2602
2603 __operator_less_equal() {}
2604 __operator_less_equal(__node* op1, __node* op2)
2605 {
2606 __left_ = op1;
2607 __right_ = op2;
2608 }
2609 virtual size_t first_size() const
2610 {
2611 if (__cached_size_ == -1)
2612 {
2613 if (__left_)
2614 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2615 else
2616 const_cast<long&>(__cached_size_) = sizeof("operator<=") - 1;
2617 }
2618 return __cached_size_;
2619 }
2620 virtual char* first_demangled_name(char* buf) const
2621 {
2622 if (__left_)
2623 {
2624 *buf++ = '(';
2625 buf = __left_->get_demangled_name(buf);
2626 strncpy(buf, ") <= (", 6);
2627 buf += 6;
2628 buf = __right_->get_demangled_name(buf);
2629 *buf++ = ')';
2630 }
2631 else
2632 {
2633 strncpy(buf, "operator<=", sizeof("operator<=") - 1);
2634 buf += sizeof("operator<=") - 1;
2635 }
2636 return buf;
2637 }
2638 virtual ptrdiff_t print_first(char* f, char* l) const
2639 {
2640 const ptrdiff_t r = l - f;
2641 if (__left_)
2642 {
2643 const ptrdiff_t n1 = 8;
2644 if (r < n1)
2645 return n1 + __left_->print(l, l) + __right_->print(l, l);
2646 ptrdiff_t sz1 = __left_->print(f+1, l);
2647 if (r < n1 + sz1)
2648 return n1 + sz1 + __right_->print(l, l);
2649 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2650 if (r >= n1 + sz1 + sz2)
2651 {
2652 *f = '(';
2653 f += 1 + sz1;
2654 *f++ = ')';
2655 *f++ = ' ';
2656 *f++ = '<';
2657 *f++ = '=';
2658 *f++ = ' ';
2659 *f = '(';
2660 f += 1 + sz2;
2661 *f = ')';
2662 }
2663 return n1 + sz1 + sz2;
2664 }
2665 const ptrdiff_t n2 = sizeof("operator<=") - 1;
2666 if (r >= n2)
2667 {
2668 *f++ = 'o';
2669 *f++ = 'p';
2670 *f++ = 'e';
2671 *f++ = 'r';
2672 *f++ = 'a';
2673 *f++ = 't';
2674 *f++ = 'o';
2675 *f++ = 'r';
2676 *f++ = '<';
2677 *f = '=';
2678 }
2679 return n2;
2680 }
2681 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2682 {
2683 bool r = true;
2684 if (__left_)
2685 r = r && __left_->fix_forward_references(t_begin, t_end);
2686 if (__right_)
2687 r = r && __right_->fix_forward_references(t_begin, t_end);
2688 return r;
2689 }
2690};
2691
2692class __operator_less
2693 : public __node
2694{
2695public:
2696
2697 __operator_less() {}
2698 __operator_less(__node* op1, __node* op2)
2699 {
2700 __left_ = op1;
2701 __right_ = op2;
2702 }
2703 virtual size_t first_size() const
2704 {
2705 if (__cached_size_ == -1)
2706 {
2707 if (__left_)
2708 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2709 else
2710 const_cast<long&>(__cached_size_) = sizeof("operator<") - 1;
2711 }
2712 return __cached_size_;
2713 }
2714 virtual char* first_demangled_name(char* buf) const
2715 {
2716 if (__left_)
2717 {
2718 *buf++ = '(';
2719 buf = __left_->get_demangled_name(buf);
2720 strncpy(buf, ") < (", 5);
2721 buf += 5;
2722 buf = __right_->get_demangled_name(buf);
2723 *buf++ = ')';
2724 }
2725 else
2726 {
2727 strncpy(buf, "operator<", sizeof("operator<") - 1);
2728 buf += sizeof("operator<") - 1;
2729 }
2730 return buf;
2731 }
2732 virtual ptrdiff_t print_first(char* f, char* l) const
2733 {
2734 const ptrdiff_t r = l - f;
2735 if (__left_)
2736 {
2737 const ptrdiff_t n1 = 7;
2738 if (r < n1)
2739 return n1 + __left_->print(l, l) + __right_->print(l, l);
2740 ptrdiff_t sz1 = __left_->print(f+1, l);
2741 if (r < n1 + sz1)
2742 return n1 + sz1 + __right_->print(l, l);
2743 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2744 if (r >= n1 + sz1 + sz2)
2745 {
2746 *f = '(';
2747 f += 1 + sz1;
2748 *f++ = ')';
2749 *f++ = ' ';
2750 *f++ = '<';
2751 *f++ = ' ';
2752 *f = '(';
2753 f += 1 + sz2;
2754 *f = ')';
2755 }
2756 return n1 + sz1 + sz2;
2757 }
2758 const ptrdiff_t n2 = sizeof("operator<") - 1;
2759 if (r >= n2)
2760 {
2761 *f++ = 'o';
2762 *f++ = 'p';
2763 *f++ = 'e';
2764 *f++ = 'r';
2765 *f++ = 'a';
2766 *f++ = 't';
2767 *f++ = 'o';
2768 *f++ = 'r';
2769 *f = '<';
2770 }
2771 return n2;
2772 }
2773 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2774 {
2775 bool r = true;
2776 if (__left_)
2777 r = r && __left_->fix_forward_references(t_begin, t_end);
2778 if (__right_)
2779 r = r && __right_->fix_forward_references(t_begin, t_end);
2780 return r;
2781 }
2782};
2783
2784class __operator_left_shift
2785 : public __node
2786{
2787public:
2788
2789 __operator_left_shift() {}
2790 __operator_left_shift(__node* op1, __node* op2)
2791 {
2792 __left_ = op1;
2793 __right_ = op2;
2794 }
2795 virtual size_t first_size() const
2796 {
2797 if (__cached_size_ == -1)
2798 {
2799 if (__left_)
2800 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2801 else
2802 const_cast<long&>(__cached_size_) = sizeof("operator<<") - 1;
2803 }
2804 return __cached_size_;
2805 }
2806 virtual char* first_demangled_name(char* buf) const
2807 {
2808 if (__left_)
2809 {
2810 *buf++ = '(';
2811 buf = __left_->get_demangled_name(buf);
2812 strncpy(buf, ") << (", 6);
2813 buf += 6;
2814 buf = __right_->get_demangled_name(buf);
2815 *buf++ = ')';
2816 }
2817 else
2818 {
2819 strncpy(buf, "operator<<", sizeof("operator<<") - 1);
2820 buf += sizeof("operator<<") - 1;
2821 }
2822 return buf;
2823 }
2824 virtual ptrdiff_t print_first(char* f, char* l) const
2825 {
2826 const ptrdiff_t r = l - f;
2827 if (__left_)
2828 {
2829 const ptrdiff_t n1 = 8;
2830 if (r < n1)
2831 return n1 + __left_->print(l, l) + __right_->print(l, l);
2832 ptrdiff_t sz1 = __left_->print(f+1, l);
2833 if (r < n1 + sz1)
2834 return n1 + sz1 + __right_->print(l, l);
2835 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2836 if (r >= n1 + sz1 + sz2)
2837 {
2838 *f = '(';
2839 f += 1 + sz1;
2840 *f++ = ')';
2841 *f++ = ' ';
2842 *f++ = '<';
2843 *f++ = '<';
2844 *f++ = ' ';
2845 *f = '(';
2846 f += 1 + sz2;
2847 *f = ')';
2848 }
2849 return n1 + sz1 + sz2;
2850 }
2851 const ptrdiff_t n2 = sizeof("operator<<") - 1;
2852 if (r >= n2)
2853 {
2854 *f++ = 'o';
2855 *f++ = 'p';
2856 *f++ = 'e';
2857 *f++ = 'r';
2858 *f++ = 'a';
2859 *f++ = 't';
2860 *f++ = 'o';
2861 *f++ = 'r';
2862 *f++ = '<';
2863 *f = '<';
2864 }
2865 return n2;
2866 }
2867 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2868 {
2869 bool r = true;
2870 if (__left_)
2871 r = r && __left_->fix_forward_references(t_begin, t_end);
2872 if (__right_)
2873 r = r && __right_->fix_forward_references(t_begin, t_end);
2874 return r;
2875 }
2876};
2877
2878class __operator_left_shift_equal
2879 : public __node
2880{
2881public:
2882
2883 __operator_left_shift_equal() {}
2884 __operator_left_shift_equal(__node* op1, __node* op2)
2885 {
2886 __left_ = op1;
2887 __right_ = op2;
2888 }
2889 virtual size_t first_size() const
2890 {
2891 if (__cached_size_ == -1)
2892 {
2893 if (__left_)
2894 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
2895 else
2896 const_cast<long&>(__cached_size_) = sizeof("operator<<=") - 1;
2897 }
2898 return __cached_size_;
2899 }
2900 virtual char* first_demangled_name(char* buf) const
2901 {
2902 if (__left_)
2903 {
2904 *buf++ = '(';
2905 buf = __left_->get_demangled_name(buf);
2906 strncpy(buf, ") <<= (", 7);
2907 buf += 7;
2908 buf = __right_->get_demangled_name(buf);
2909 *buf++ = ')';
2910 }
2911 else
2912 {
2913 strncpy(buf, "operator<<=", sizeof("operator<<=") - 1);
2914 buf += sizeof("operator<<=") - 1;
2915 }
2916 return buf;
2917 }
2918 virtual ptrdiff_t print_first(char* f, char* l) const
2919 {
2920 const ptrdiff_t r = l - f;
2921 if (__left_)
2922 {
2923 const ptrdiff_t n1 = 9;
2924 if (r < n1)
2925 return n1 + __left_->print(l, l) + __right_->print(l, l);
2926 ptrdiff_t sz1 = __left_->print(f+1, l);
2927 if (r < n1 + sz1)
2928 return n1 + sz1 + __right_->print(l, l);
2929 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2930 if (r >= n1 + sz1 + sz2)
2931 {
2932 *f = '(';
2933 f += 1 + sz1;
2934 *f++ = ')';
2935 *f++ = ' ';
2936 *f++ = '<';
2937 *f++ = '<';
2938 *f++ = '=';
2939 *f++ = ' ';
2940 *f = '(';
2941 f += 1 + sz2;
2942 *f = ')';
2943 }
2944 return n1 + sz1 + sz2;
2945 }
2946 const ptrdiff_t n2 = sizeof("operator<<=") - 1;
2947 if (r >= n2)
2948 {
2949 *f++ = 'o';
2950 *f++ = 'p';
2951 *f++ = 'e';
2952 *f++ = 'r';
2953 *f++ = 'a';
2954 *f++ = 't';
2955 *f++ = 'o';
2956 *f++ = 'r';
2957 *f++ = '<';
2958 *f++ = '<';
2959 *f = '=';
2960 }
2961 return n2;
2962 }
2963 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2964 {
2965 bool r = true;
2966 if (__left_)
2967 r = r && __left_->fix_forward_references(t_begin, t_end);
2968 if (__right_)
2969 r = r && __right_->fix_forward_references(t_begin, t_end);
2970 return r;
2971 }
2972};
2973
2974class __operator_minus
2975 : public __node
2976{
2977public:
2978
2979 __operator_minus() {}
2980 __operator_minus(__node* op1, __node* op2)
2981 {
2982 __left_ = op1;
2983 __right_ = op2;
2984 }
2985 virtual size_t first_size() const
2986 {
2987 if (__cached_size_ == -1)
2988 {
2989 if (__left_)
2990 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2991 else
2992 const_cast<long&>(__cached_size_) = sizeof("operator-") - 1;
2993 }
2994 return __cached_size_;
2995 }
2996 virtual char* first_demangled_name(char* buf) const
2997 {
2998 if (__left_)
2999 {
3000 *buf++ = '(';
3001 buf = __left_->get_demangled_name(buf);
3002 strncpy(buf, ") - (", 5);
3003 buf += 5;
3004 buf = __right_->get_demangled_name(buf);
3005 *buf++ = ')';
3006 }
3007 else
3008 {
3009 strncpy(buf, "operator-", sizeof("operator-") - 1);
3010 buf += sizeof("operator-") - 1;
3011 }
3012 return buf;
3013 }
3014 virtual ptrdiff_t print_first(char* f, char* l) const
3015 {
3016 const ptrdiff_t r = l - f;
3017 if (__left_)
3018 {
3019 const ptrdiff_t n1 = 7;
3020 if (r < n1)
3021 return n1 + __left_->print(l, l) + __right_->print(l, l);
3022 ptrdiff_t sz1 = __left_->print(f+1, l);
3023 if (r < n1 + sz1)
3024 return n1 + sz1 + __right_->print(l, l);
3025 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3026 if (r >= n1 + sz1 + sz2)
3027 {
3028 *f = '(';
3029 f += 1 + sz1;
3030 *f++ = ')';
3031 *f++ = ' ';
3032 *f++ = '-';
3033 *f++ = ' ';
3034 *f = '(';
3035 f += 1 + sz2;
3036 *f = ')';
3037 }
3038 return n1 + sz1 + sz2;
3039 }
3040 const ptrdiff_t n2 = sizeof("operator-") - 1;
3041 if (r >= n2)
3042 {
3043 *f++ = 'o';
3044 *f++ = 'p';
3045 *f++ = 'e';
3046 *f++ = 'r';
3047 *f++ = 'a';
3048 *f++ = 't';
3049 *f++ = 'o';
3050 *f++ = 'r';
3051 *f = '-';
3052 }
3053 return n2;
3054 }
3055 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3056 {
3057 bool r = true;
3058 if (__left_)
3059 r = r && __left_->fix_forward_references(t_begin, t_end);
3060 if (__right_)
3061 r = r && __right_->fix_forward_references(t_begin, t_end);
3062 return r;
3063 }
3064};
3065
3066class __operator_minus_equal
3067 : public __node
3068{
3069public:
3070
3071 __operator_minus_equal() {}
3072 __operator_minus_equal(__node* op1, __node* op2)
3073 {
3074 __left_ = op1;
3075 __right_ = op2;
3076 }
3077 virtual size_t first_size() const
3078 {
3079 if (__cached_size_ == -1)
3080 {
3081 if (__left_)
3082 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3083 else
3084 const_cast<long&>(__cached_size_) = sizeof("operator-=") - 1;
3085 }
3086 return __cached_size_;
3087 }
3088 virtual char* first_demangled_name(char* buf) const
3089 {
3090 if (__left_)
3091 {
3092 *buf++ = '(';
3093 buf = __left_->get_demangled_name(buf);
3094 strncpy(buf, ") -= (", 6);
3095 buf += 6;
3096 buf = __right_->get_demangled_name(buf);
3097 *buf++ = ')';
3098 }
3099 else
3100 {
3101 strncpy(buf, "operator-=", sizeof("operator-=") - 1);
3102 buf += sizeof("operator-=") - 1;
3103 }
3104 return buf;
3105 }
3106 virtual ptrdiff_t print_first(char* f, char* l) const
3107 {
3108 const ptrdiff_t r = l - f;
3109 if (__left_)
3110 {
3111 const ptrdiff_t n1 = 8;
3112 if (r < n1)
3113 return n1 + __left_->print(l, l) + __right_->print(l, l);
3114 ptrdiff_t sz1 = __left_->print(f+1, l);
3115 if (r < n1 + sz1)
3116 return n1 + sz1 + __right_->print(l, l);
3117 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3118 if (r >= n1 + sz1 + sz2)
3119 {
3120 *f = '(';
3121 f += 1 + sz1;
3122 *f++ = ')';
3123 *f++ = ' ';
3124 *f++ = '-';
3125 *f++ = '=';
3126 *f++ = ' ';
3127 *f = '(';
3128 f += 1 + sz2;
3129 *f = ')';
3130 }
3131 return n1 + sz1 + sz2;
3132 }
3133 const ptrdiff_t n2 = sizeof("operator-=") - 1;
3134 if (r >= n2)
3135 {
3136 *f++ = 'o';
3137 *f++ = 'p';
3138 *f++ = 'e';
3139 *f++ = 'r';
3140 *f++ = 'a';
3141 *f++ = 't';
3142 *f++ = 'o';
3143 *f++ = 'r';
3144 *f++ = '-';
3145 *f = '=';
3146 }
3147 return n2;
3148 }
3149 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3150 {
3151 bool r = true;
3152 if (__left_)
3153 r = r && __left_->fix_forward_references(t_begin, t_end);
3154 if (__right_)
3155 r = r && __right_->fix_forward_references(t_begin, t_end);
3156 return r;
3157 }
3158};
3159
3160class __operator_times
3161 : public __node
3162{
3163public:
3164
3165 __operator_times() {}
3166 __operator_times(__node* op1, __node* op2)
3167 {
3168 __left_ = op1;
3169 __right_ = op2;
3170 }
3171 virtual size_t first_size() const
3172 {
3173 if (__cached_size_ == -1)
3174 {
3175 if (__left_)
3176 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
3177 else
3178 const_cast<long&>(__cached_size_) = sizeof("operator*") - 1;
3179 }
3180 return __cached_size_;
3181 }
3182 virtual char* first_demangled_name(char* buf) const
3183 {
3184 if (__left_)
3185 {
3186 *buf++ = '(';
3187 buf = __left_->get_demangled_name(buf);
3188 strncpy(buf, ") * (", 5);
3189 buf += 5;
3190 buf = __right_->get_demangled_name(buf);
3191 *buf++ = ')';
3192 }
3193 else
3194 {
3195 strncpy(buf, "operator*", sizeof("operator*") - 1);
3196 buf += sizeof("operator*") - 1;
3197 }
3198 return buf;
3199 }
3200 virtual ptrdiff_t print_first(char* f, char* l) const
3201 {
3202 const ptrdiff_t r = l - f;
3203 if (__left_)
3204 {
3205 const ptrdiff_t n1 = 7;
3206 if (r < n1)
3207 return n1 + __left_->print(l, l) + __right_->print(l, l);
3208 ptrdiff_t sz1 = __left_->print(f+1, l);
3209 if (r < n1 + sz1)
3210 return n1 + sz1 + __right_->print(l, l);
3211 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3212 if (r >= n1 + sz1 + sz2)
3213 {
3214 *f = '(';
3215 f += 1 + sz1;
3216 *f++ = ')';
3217 *f++ = ' ';
3218 *f++ = '*';
3219 *f++ = ' ';
3220 *f = '(';
3221 f += 1 + sz2;
3222 *f = ')';
3223 }
3224 return n1 + sz1 + sz2;
3225 }
3226 const ptrdiff_t n2 = sizeof("operator*") - 1;
3227 if (r >= n2)
3228 {
3229 *f++ = 'o';
3230 *f++ = 'p';
3231 *f++ = 'e';
3232 *f++ = 'r';
3233 *f++ = 'a';
3234 *f++ = 't';
3235 *f++ = 'o';
3236 *f++ = 'r';
3237 *f = '*';
3238 }
3239 return n2;
3240 }
3241 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3242 {
3243 bool r = true;
3244 if (__left_)
3245 r = r && __left_->fix_forward_references(t_begin, t_end);
3246 if (__right_)
3247 r = r && __right_->fix_forward_references(t_begin, t_end);
3248 return r;
3249 }
3250};
3251
3252class __operator_times_equal
3253 : public __node
3254{
3255public:
3256
3257 __operator_times_equal() {}
3258 __operator_times_equal(__node* op1, __node* op2)
3259 {
3260 __left_ = op1;
3261 __right_ = op2;
3262 }
3263 virtual size_t first_size() const
3264 {
3265 if (__cached_size_ == -1)
3266 {
3267 if (__left_)
3268 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3269 else
3270 const_cast<long&>(__cached_size_) = sizeof("operator*=") - 1;
3271 }
3272 return __cached_size_;
3273 }
3274 virtual char* first_demangled_name(char* buf) const
3275 {
3276 if (__left_)
3277 {
3278 *buf++ = '(';
3279 buf = __left_->get_demangled_name(buf);
3280 strncpy(buf, ") *= (", 6);
3281 buf += 6;
3282 buf = __right_->get_demangled_name(buf);
3283 *buf++ = ')';
3284 }
3285 else
3286 {
3287 strncpy(buf, "operator*=", sizeof("operator*=") - 1);
3288 buf += sizeof("operator*=") - 1;
3289 }
3290 return buf;
3291 }
3292 virtual ptrdiff_t print_first(char* f, char* l) const
3293 {
3294 const ptrdiff_t r = l - f;
3295 if (__left_)
3296 {
3297 const ptrdiff_t n1 = 8;
3298 if (r < n1)
3299 return n1 + __left_->print(l, l) + __right_->print(l, l);
3300 ptrdiff_t sz1 = __left_->print(f+1, l);
3301 if (r < n1 + sz1)
3302 return n1 + sz1 + __right_->print(l, l);
3303 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3304 if (r >= n1 + sz1 + sz2)
3305 {
3306 *f = '(';
3307 f += 1 + sz1;
3308 *f++ = ')';
3309 *f++ = ' ';
3310 *f++ = '*';
3311 *f++ = '=';
3312 *f++ = ' ';
3313 *f = '(';
3314 f += 1 + sz2;
3315 *f = ')';
3316 }
3317 return n1 + sz1 + sz2;
3318 }
3319 const ptrdiff_t n2 = sizeof("operator*=") - 1;
3320 if (r >= n2)
3321 {
3322 *f++ = 'o';
3323 *f++ = 'p';
3324 *f++ = 'e';
3325 *f++ = 'r';
3326 *f++ = 'a';
3327 *f++ = 't';
3328 *f++ = 'o';
3329 *f++ = 'r';
3330 *f++ = '*';
3331 *f = '=';
3332 }
3333 return n2;
3334 }
3335 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3336 {
3337 bool r = true;
3338 if (__left_)
3339 r = r && __left_->fix_forward_references(t_begin, t_end);
3340 if (__right_)
3341 r = r && __right_->fix_forward_references(t_begin, t_end);
3342 return r;
3343 }
3344};
3345
3346class __operator_decrement
3347 : public __node
3348{
3349public:
3350
3351 __operator_decrement() {}
3352 explicit __operator_decrement(bool prefix, __node* op)
3353 {
3354 __size_ = prefix;
3355 __left_ = op;
3356 }
3357 virtual size_t first_size() const
3358 {
3359 if (__cached_size_ == -1)
3360 {
3361 if (__left_)
3362 const_cast<long&>(__cached_size_) = 4+__left_->size();
3363 else
3364 const_cast<long&>(__cached_size_) = sizeof("operator--") - 1;
3365 }
3366 return __cached_size_;
3367 }
3368 virtual char* first_demangled_name(char* buf) const
3369 {
3370 if (__left_)
3371 {
3372 if (__size_)
3373 {
3374 *buf++ = '-';
3375 *buf++ = '-';
3376 *buf++ = '(';
3377 }
3378 else
3379 *buf++ = '(';
3380 buf = __left_->get_demangled_name(buf);
3381 if (__size_)
3382 *buf++ = ')';
3383 else
3384 {
3385 *buf++ = ')';
3386 *buf++ = '-';
3387 *buf++ = '-';
3388 }
3389 }
3390 else
3391 {
3392 strncpy(buf, "operator--", sizeof("operator--") - 1);
3393 buf += sizeof("operator--") - 1;
3394 }
3395 return buf;
3396 }
3397 virtual ptrdiff_t print_first(char* f, char* l) const
3398 {
3399 const ptrdiff_t r = l - f;
3400 if (__left_)
3401 {
3402 const ptrdiff_t n1 = 4;
3403 if (r < n1)
3404 return n1 + __left_->print(l, l);
3405 ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l);
3406 if (r >= n1 + sz1)
3407 {
3408 if (__size_)
3409 {
3410 *f++ = '-';
3411 *f++ = '-';
3412 *f = '(';
3413 f += 1+sz1;
3414 *f = ')';
3415 }
3416 else
3417 {
3418 *f = '(';
3419 f += 1+sz1;
3420 *f++ = ')';
3421 *f++ = '-';
3422 *f = '-';
3423 }
3424 }
3425 return n1 + sz1;
3426 }
3427 const ptrdiff_t n2 = sizeof("operator--") - 1;
3428 if (r >= n2)
3429 {
3430 *f++ = 'o';
3431 *f++ = 'p';
3432 *f++ = 'e';
3433 *f++ = 'r';
3434 *f++ = 'a';
3435 *f++ = 't';
3436 *f++ = 'o';
3437 *f++ = 'r';
3438 *f++ = '-';
3439 *f = '-';
3440 }
3441 return n2;
3442 }
3443 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3444 {
3445 if (__left_)
3446 return __left_->fix_forward_references(t_begin, t_end);
3447 return true;
3448 }
3449};
3450
3451class __operator_not_equal
3452 : public __node
3453{
3454public:
3455
3456 __operator_not_equal() {}
3457 __operator_not_equal(__node* op1, __node* op2)
3458 {
3459 __left_ = op1;
3460 __right_ = op2;
3461 }
3462 virtual size_t first_size() const
3463 {
3464 if (__cached_size_ == -1)
3465 {
3466 if (__left_)
3467 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3468 else
3469 const_cast<long&>(__cached_size_) = sizeof("operator!=") - 1;
3470 }
3471 return __cached_size_;
3472 }
3473 virtual char* first_demangled_name(char* buf) const
3474 {
3475 if (__left_)
3476 {
3477 *buf++ = '(';
3478 buf = __left_->get_demangled_name(buf);
3479 strncpy(buf, ") != (", 6);
3480 buf += 6;
3481 buf = __right_->get_demangled_name(buf);
3482 *buf++ = ')';
3483 }
3484 else
3485 {
3486 strncpy(buf, "operator!=", sizeof("operator!=") - 1);
3487 buf += sizeof("operator!=") - 1;
3488 }
3489 return buf;
3490 }
3491 virtual ptrdiff_t print_first(char* f, char* l) const
3492 {
3493 const ptrdiff_t r = l - f;
3494 if (__left_)
3495 {
3496 const ptrdiff_t n1 = 8;
3497 if (r < n1)
3498 return n1 + __left_->print(l, l) + __right_->print(l, l);
3499 ptrdiff_t sz1 = __left_->print(f+1, l);
3500 if (r < n1 + sz1)
3501 return n1 + sz1 + __right_->print(l, l);
3502 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3503 if (r >= n1 + sz1 + sz2)
3504 {
3505 *f = '(';
3506 f += 1 + sz1;
3507 *f++ = ')';
3508 *f++ = ' ';
3509 *f++ = '!';
3510 *f++ = '=';
3511 *f++ = ' ';
3512 *f = '(';
3513 f += 1 + sz2;
3514 *f = ')';
3515 }
3516 return n1 + sz1 + sz2;
3517 }
3518 const ptrdiff_t n2 = sizeof("operator!=") - 1;
3519 if (r >= n2)
3520 {
3521 *f++ = 'o';
3522 *f++ = 'p';
3523 *f++ = 'e';
3524 *f++ = 'r';
3525 *f++ = 'a';
3526 *f++ = 't';
3527 *f++ = 'o';
3528 *f++ = 'r';
3529 *f++ = '!';
3530 *f = '=';
3531 }
3532 return n2;
3533 }
3534 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3535 {
3536 bool r = true;
3537 if (__left_)
3538 r = r && __left_->fix_forward_references(t_begin, t_end);
3539 if (__right_)
3540 r = r && __right_->fix_forward_references(t_begin, t_end);
3541 return r;
3542 }
3543};
3544
3545class __operator_negate
3546 : public __node
3547{
3548public:
3549
3550 __operator_negate() {}
3551 explicit __operator_negate(__node* op)
3552 {
3553 __left_ = op;
3554 }
3555 virtual size_t first_size() const
3556 {
3557 if (__cached_size_ == -1)
3558 {
3559 if (__left_)
3560 const_cast<long&>(__cached_size_) = 3+__left_->size();
3561 else
3562 const_cast<long&>(__cached_size_) = sizeof("operator-") - 1;
3563 }
3564 return __cached_size_;
3565 }
3566 virtual char* first_demangled_name(char* buf) const
3567 {
3568 if (__left_)
3569 {
3570 *buf++ = '-';
3571 *buf++ = '(';
3572 buf = __left_->get_demangled_name(buf);
3573 *buf++ = ')';
3574 }
3575 else
3576 {
3577 strncpy(buf, "operator-", sizeof("operator-") - 1);
3578 buf += sizeof("operator-") - 1;
3579 }
3580 return buf;
3581 }
3582 virtual ptrdiff_t print_first(char* f, char* l) const
3583 {
3584 const ptrdiff_t r = l - f;
3585 if (__left_)
3586 {
3587 const ptrdiff_t n1 = 3;
3588 if (r < n1)
3589 return n1 + __left_->print(l, l);
3590 ptrdiff_t sz1 = __left_->print(f+2, l);
3591 if (r >= n1 + sz1)
3592 {
3593 *f++ = '-';
3594 *f = '(';
3595 f += 1 + sz1;
3596 *f = ')';
3597 }
3598 return n1 + sz1;
3599 }
3600 const ptrdiff_t n2 = sizeof("operator-") - 1;
3601 if (r >= n2)
3602 {
3603 *f++ = 'o';
3604 *f++ = 'p';
3605 *f++ = 'e';
3606 *f++ = 'r';
3607 *f++ = 'a';
3608 *f++ = 't';
3609 *f++ = 'o';
3610 *f++ = 'r';
3611 *f = '-';
3612 }
3613 return n2;
3614 }
3615 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3616 {
3617 if (__left_)
3618 return __left_->fix_forward_references(t_begin, t_end);
3619 return true;
3620 }
3621};
3622
3623class __operator_logical_not
3624 : public __node
3625{
3626public:
3627
3628 __operator_logical_not() {}
3629 explicit __operator_logical_not(__node* op)
3630 {
3631 __left_ = op;
3632 }
3633 virtual size_t first_size() const
3634 {
3635 if (__cached_size_ == -1)
3636 {
3637 if (__left_)
3638 const_cast<long&>(__cached_size_) = 3+__left_->size();
3639 else
3640 const_cast<long&>(__cached_size_) = sizeof("operator!") - 1;
3641 }
3642 return __cached_size_;
3643 }
3644 virtual char* first_demangled_name(char* buf) const
3645 {
3646 if (__left_)
3647 {
3648 *buf++ = '!';
3649 *buf++ = '(';
3650 buf = __left_->get_demangled_name(buf);
3651 *buf++ = ')';
3652 }
3653 else
3654 {
3655 strncpy(buf, "operator!", sizeof("operator!") - 1);
3656 buf += sizeof("operator!") - 1;
3657 }
3658 return buf;
3659 }
3660 virtual ptrdiff_t print_first(char* f, char* l) const
3661 {
3662 const ptrdiff_t r = l - f;
3663 if (__left_)
3664 {
3665 const ptrdiff_t n1 = 3;
3666 if (r < n1)
3667 return n1 + __left_->print(l, l);
3668 ptrdiff_t sz1 = __left_->print(f+2, l);
3669 if (r >= n1 + sz1)
3670 {
3671 *f++ = '!';
3672 *f = '(';
3673 f += 1 + sz1;
3674 *f = ')';
3675 }
3676 return n1 + sz1;
3677 }
3678 const ptrdiff_t n2 = sizeof("operator!") - 1;
3679 if (r >= n2)
3680 {
3681 *f++ = 'o';
3682 *f++ = 'p';
3683 *f++ = 'e';
3684 *f++ = 'r';
3685 *f++ = 'a';
3686 *f++ = 't';
3687 *f++ = 'o';
3688 *f++ = 'r';
3689 *f = '!';
3690 }
3691 return n2;
3692 }
3693 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3694 {
3695 if (__left_)
3696 return __left_->fix_forward_references(t_begin, t_end);
3697 return true;
3698 }
3699};
3700
3701class __operator_logical_or
3702 : public __node
3703{
3704public:
3705
3706 __operator_logical_or() {}
3707 __operator_logical_or(__node* op1, __node* op2)
3708 {
3709 __left_ = op1;
3710 __right_ = op2;
3711 }
3712 virtual size_t first_size() const
3713 {
3714 if (__cached_size_ == -1)
3715 {
3716 if (__left_)
3717 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3718 else
3719 const_cast<long&>(__cached_size_) = sizeof("operator||") - 1;
3720 }
3721 return __cached_size_;
3722 }
3723 virtual char* first_demangled_name(char* buf) const
3724 {
3725 if (__left_)
3726 {
3727 *buf++ = '(';
3728 buf = __left_->get_demangled_name(buf);
3729 strncpy(buf, ") || (", 6);
3730 buf += 6;
3731 buf = __right_->get_demangled_name(buf);
3732 *buf++ = ')';
3733 }
3734 else
3735 {
3736 strncpy(buf, "operator||", sizeof("operator||") - 1);
3737 buf += sizeof("operator||") - 1;
3738 }
3739 return buf;
3740 }
3741 virtual ptrdiff_t print_first(char* f, char* l) const
3742 {
3743 const ptrdiff_t r = l - f;
3744 if (__left_)
3745 {
3746 const ptrdiff_t n1 = 8;
3747 if (r < n1)
3748 return n1 + __left_->print(l, l) + __right_->print(l, l);
3749 ptrdiff_t sz1 = __left_->print(f+1, l);
3750 if (r < n1 + sz1)
3751 return n1 + sz1 + __right_->print(l, l);
3752 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3753 if (r >= n1 + sz1 + sz2)
3754 {
3755 *f = '(';
3756 f += 1 + sz1;
3757 *f++ = ')';
3758 *f++ = ' ';
3759 *f++ = '|';
3760 *f++ = '|';
3761 *f++ = ' ';
3762 *f = '(';
3763 f += 1 + sz2;
3764 *f = ')';
3765 }
3766 return n1 + sz1 + sz2;
3767 }
3768 const ptrdiff_t n2 = sizeof("operator||") - 1;
3769 if (r >= n2)
3770 {
3771 *f++ = 'o';
3772 *f++ = 'p';
3773 *f++ = 'e';
3774 *f++ = 'r';
3775 *f++ = 'a';
3776 *f++ = 't';
3777 *f++ = 'o';
3778 *f++ = 'r';
3779 *f++ = '|';
3780 *f = '|';
3781 }
3782 return n2;
3783 }
3784 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3785 {
3786 bool r = true;
3787 if (__left_)
3788 r = r && __left_->fix_forward_references(t_begin, t_end);
3789 if (__right_)
3790 r = r && __right_->fix_forward_references(t_begin, t_end);
3791 return r;
3792 }
3793};
3794
3795class __operator_bit_or
3796 : public __node
3797{
3798public:
3799
3800 __operator_bit_or() {}
3801 __operator_bit_or(__node* op1, __node* op2)
3802 {
3803 __left_ = op1;
3804 __right_ = op2;
3805 }
3806 virtual size_t first_size() const
3807 {
3808 if (__cached_size_ == -1)
3809 {
3810 if (__left_)
3811 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
3812 else
3813 const_cast<long&>(__cached_size_) = sizeof("operator|") - 1;
3814 }
3815 return __cached_size_;
3816 }
3817 virtual char* first_demangled_name(char* buf) const
3818 {
3819 if (__left_)
3820 {
3821 *buf++ = '(';
3822 buf = __left_->get_demangled_name(buf);
3823 strncpy(buf, ") | (", 5);
3824 buf += 5;
3825 buf = __right_->get_demangled_name(buf);
3826 *buf++ = ')';
3827 }
3828 else
3829 {
3830 strncpy(buf, "operator|", sizeof("operator|") - 1);
3831 buf += sizeof("operator|") - 1;
3832 }
3833 return buf;
3834 }
3835 virtual ptrdiff_t print_first(char* f, char* l) const
3836 {
3837 const ptrdiff_t r = l - f;
3838 if (__left_)
3839 {
3840 const ptrdiff_t n1 = 7;
3841 if (r < n1)
3842 return n1 + __left_->print(l, l) + __right_->print(l, l);
3843 ptrdiff_t sz1 = __left_->print(f+1, l);
3844 if (r < n1 + sz1)
3845 return n1 + sz1 + __right_->print(l, l);
3846 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3847 if (r >= n1 + sz1 + sz2)
3848 {
3849 *f = '(';
3850 f += 1 + sz1;
3851 *f++ = ')';
3852 *f++ = ' ';
3853 *f++ = '|';
3854 *f++ = ' ';
3855 *f = '(';
3856 f += 1 + sz2;
3857 *f = ')';
3858 }
3859 return n1 + sz1 + sz2;
3860 }
3861 const ptrdiff_t n2 = sizeof("operator|") - 1;
3862 if (r >= n2)
3863 {
3864 *f++ = 'o';
3865 *f++ = 'p';
3866 *f++ = 'e';
3867 *f++ = 'r';
3868 *f++ = 'a';
3869 *f++ = 't';
3870 *f++ = 'o';
3871 *f++ = 'r';
3872 *f = '|';
3873 }
3874 return n2;
3875 }
3876 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3877 {
3878 bool r = true;
3879 if (__left_)
3880 r = r && __left_->fix_forward_references(t_begin, t_end);
3881 if (__right_)
3882 r = r && __right_->fix_forward_references(t_begin, t_end);
3883 return r;
3884 }
3885};
3886
3887class __operator_or_equal
3888 : public __node
3889{
3890public:
3891
3892 __operator_or_equal() {}
3893 __operator_or_equal(__node* op1, __node* op2)
3894 {
3895 __left_ = op1;
3896 __right_ = op2;
3897 }
3898 virtual size_t first_size() const
3899 {
3900 if (__cached_size_ == -1)
3901 {
3902 if (__left_)
3903 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3904 else
3905 const_cast<long&>(__cached_size_) = sizeof("operator|=") - 1;
3906 }
3907 return __cached_size_;
3908 }
3909 virtual char* first_demangled_name(char* buf) const
3910 {
3911 if (__left_)
3912 {
3913 *buf++ = '(';
3914 buf = __left_->get_demangled_name(buf);
3915 strncpy(buf, ") |= (", 6);
3916 buf += 6;
3917 buf = __right_->get_demangled_name(buf);
3918 *buf++ = ')';
3919 }
3920 else
3921 {
3922 strncpy(buf, "operator|=", sizeof("operator|=") - 1);
3923 buf += sizeof("operator|=") - 1;
3924 }
3925 return buf;
3926 }
3927 virtual ptrdiff_t print_first(char* f, char* l) const
3928 {
3929 const ptrdiff_t r = l - f;
3930 if (__left_)
3931 {
3932 const ptrdiff_t n1 = 8;
3933 if (r < n1)
3934 return n1 + __left_->print(l, l) + __right_->print(l, l);
3935 ptrdiff_t sz1 = __left_->print(f+1, l);
3936 if (r < n1 + sz1)
3937 return n1 + sz1 + __right_->print(l, l);
3938 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3939 if (r >= n1 + sz1 + sz2)
3940 {
3941 *f = '(';
3942 f += 1 + sz1;
3943 *f++ = ')';
3944 *f++ = ' ';
3945 *f++ = '|';
3946 *f++ = '=';
3947 *f++ = ' ';
3948 *f = '(';
3949 f += 1 + sz2;
3950 *f = ')';
3951 }
3952 return n1 + sz1 + sz2;
3953 }
3954 const ptrdiff_t n2 = sizeof("operator|=") - 1;
3955 if (r >= n2)
3956 {
3957 *f++ = 'o';
3958 *f++ = 'p';
3959 *f++ = 'e';
3960 *f++ = 'r';
3961 *f++ = 'a';
3962 *f++ = 't';
3963 *f++ = 'o';
3964 *f++ = 'r';
3965 *f++ = '|';
3966 *f = '=';
3967 }
3968 return n2;
3969 }
3970 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3971 {
3972 bool r = true;
3973 if (__left_)
3974 r = r && __left_->fix_forward_references(t_begin, t_end);
3975 if (__right_)
3976 r = r && __right_->fix_forward_references(t_begin, t_end);
3977 return r;
3978 }
3979};
3980
3981class __operator_pointer_to_member
3982 : public __node
3983{
3984public:
3985
3986 __operator_pointer_to_member() {}
3987 __operator_pointer_to_member(__node* op1, __node* op2)
3988 {
3989 __left_ = op1;
3990 __right_ = op2;
3991 }
3992 virtual size_t first_size() const
3993 {
3994 if (__cached_size_ == -1)
3995 {
3996 if (__left_)
3997 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
3998 else
3999 const_cast<long&>(__cached_size_) = sizeof("operator->*") - 1;
4000 }
4001 return __cached_size_;
4002 }
4003 virtual char* first_demangled_name(char* buf) const
4004 {
4005 if (__left_)
4006 {
4007 *buf++ = '(';
4008 buf = __left_->get_demangled_name(buf);
4009 strncpy(buf, ") ->* (", 7);
4010 buf += 7;
4011 buf = __right_->get_demangled_name(buf);
4012 *buf++ = ')';
4013 }
4014 else
4015 {
4016 strncpy(buf, "operator->*", sizeof("operator->*") - 1);
4017 buf += sizeof("operator->*") - 1;
4018 }
4019 return buf;
4020 }
4021 virtual ptrdiff_t print_first(char* f, char* l) const
4022 {
4023 const ptrdiff_t r = l - f;
4024 if (__left_)
4025 {
4026 const ptrdiff_t n1 = 9;
4027 if (r < n1)
4028 return n1 + __left_->print(l, l) + __right_->print(l, l);
4029 ptrdiff_t sz1 = __left_->print(f+1, l);
4030 if (r < n1 + sz1)
4031 return n1 + sz1 + __right_->print(l, l);
4032 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4033 if (r >= n1 + sz1 + sz2)
4034 {
4035 *f = '(';
4036 f += 1 + sz1;
4037 *f++ = ')';
4038 *f++ = ' ';
4039 *f++ = '-';
4040 *f++ = '>';
4041 *f++ = '*';
4042 *f++ = ' ';
4043 *f = '(';
4044 f += 1 + sz2;
4045 *f = ')';
4046 }
4047 return n1 + sz1 + sz2;
4048 }
4049 const ptrdiff_t n2 = sizeof("operator->*") - 1;
4050 if (r >= n2)
4051 {
4052 *f++ = 'o';
4053 *f++ = 'p';
4054 *f++ = 'e';
4055 *f++ = 'r';
4056 *f++ = 'a';
4057 *f++ = 't';
4058 *f++ = 'o';
4059 *f++ = 'r';
4060 *f++ = '-';
4061 *f++ = '>';
4062 *f = '*';
4063 }
4064 return n2;
4065 }
4066 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4067 {
4068 bool r = true;
4069 if (__left_)
4070 r = r && __left_->fix_forward_references(t_begin, t_end);
4071 if (__right_)
4072 r = r && __right_->fix_forward_references(t_begin, t_end);
4073 return r;
4074 }
4075};
4076
4077class __operator_plus
4078 : public __node
4079{
4080public:
4081
4082 __operator_plus() {}
4083 __operator_plus(__node* op1, __node* op2)
4084 {
4085 __left_ = op1;
4086 __right_ = op2;
4087 }
4088 virtual size_t first_size() const
4089 {
4090 if (__cached_size_ == -1)
4091 {
4092 if (__left_)
4093 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
4094 else
4095 const_cast<long&>(__cached_size_) = sizeof("operator+") - 1;
4096 }
4097 return __cached_size_;
4098 }
4099 virtual char* first_demangled_name(char* buf) const
4100 {
4101 if (__left_)
4102 {
4103 *buf++ = '(';
4104 buf = __left_->get_demangled_name(buf);
4105 strncpy(buf, ") + (", 5);
4106 buf += 5;
4107 buf = __right_->get_demangled_name(buf);
4108 *buf++ = ')';
4109 }
4110 else
4111 {
4112 strncpy(buf, "operator+", sizeof("operator+") - 1);
4113 buf += sizeof("operator+") - 1;
4114 }
4115 return buf;
4116 }
4117 virtual ptrdiff_t print_first(char* f, char* l) const
4118 {
4119 const ptrdiff_t r = l - f;
4120 if (__left_)
4121 {
4122 const ptrdiff_t n1 = 7;
4123 if (r < n1)
4124 return n1 + __left_->print(l, l) + __right_->print(l, l);
4125 ptrdiff_t sz1 = __left_->print(f+1, l);
4126 if (r < n1 + sz1)
4127 return n1 + sz1 + __right_->print(l, l);
4128 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4129 if (r >= n1 + sz1 + sz2)
4130 {
4131 *f = '(';
4132 f += 1 + sz1;
4133 *f++ = ')';
4134 *f++ = ' ';
4135 *f++ = '+';
4136 *f++ = ' ';
4137 *f = '(';
4138 f += 1 + sz2;
4139 *f = ')';
4140 }
4141 return n1 + sz1 + sz2;
4142 }
4143 const ptrdiff_t n2 = sizeof("operator+") - 1;
4144 if (r >= n2)
4145 {
4146 *f++ = 'o';
4147 *f++ = 'p';
4148 *f++ = 'e';
4149 *f++ = 'r';
4150 *f++ = 'a';
4151 *f++ = 't';
4152 *f++ = 'o';
4153 *f++ = 'r';
4154 *f = '+';
4155 }
4156 return n2;
4157 }
4158 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4159 {
4160 bool r = true;
4161 if (__left_)
4162 r = r && __left_->fix_forward_references(t_begin, t_end);
4163 if (__right_)
4164 r = r && __right_->fix_forward_references(t_begin, t_end);
4165 return r;
4166 }
4167};
4168
4169class __operator_plus_equal
4170 : public __node
4171{
4172public:
4173
4174 __operator_plus_equal() {}
4175 __operator_plus_equal(__node* op1, __node* op2)
4176 {
4177 __left_ = op1;
4178 __right_ = op2;
4179 }
4180 virtual size_t first_size() const
4181 {
4182 if (__cached_size_ == -1)
4183 {
4184 if (__left_)
4185 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4186 else
4187 const_cast<long&>(__cached_size_) = sizeof("operator+=") - 1;
4188 }
4189 return __cached_size_;
4190 }
4191 virtual char* first_demangled_name(char* buf) const
4192 {
4193 if (__left_)
4194 {
4195 *buf++ = '(';
4196 buf = __left_->get_demangled_name(buf);
4197 strncpy(buf, ") += (", 6);
4198 buf += 6;
4199 buf = __right_->get_demangled_name(buf);
4200 *buf++ = ')';
4201 }
4202 else
4203 {
4204 strncpy(buf, "operator+=", sizeof("operator+=") - 1);
4205 buf += sizeof("operator+=") - 1;
4206 }
4207 return buf;
4208 }
4209 virtual ptrdiff_t print_first(char* f, char* l) const
4210 {
4211 const ptrdiff_t r = l - f;
4212 if (__left_)
4213 {
4214 const ptrdiff_t n1 = 8;
4215 if (r < n1)
4216 return n1 + __left_->print(l, l) + __right_->print(l, l);
4217 ptrdiff_t sz1 = __left_->print(f+1, l);
4218 if (r < n1 + sz1)
4219 return n1 + sz1 + __right_->print(l, l);
4220 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4221 if (r >= n1 + sz1 + sz2)
4222 {
4223 *f = '(';
4224 f += 1 + sz1;
4225 *f++ = ')';
4226 *f++ = ' ';
4227 *f++ = '+';
4228 *f++ = '=';
4229 *f++ = ' ';
4230 *f = '(';
4231 f += 1 + sz2;
4232 *f = ')';
4233 }
4234 return n1 + sz1 + sz2;
4235 }
4236 const ptrdiff_t n2 = sizeof("operator+=") - 1;
4237 if (r >= n2)
4238 {
4239 *f++ = 'o';
4240 *f++ = 'p';
4241 *f++ = 'e';
4242 *f++ = 'r';
4243 *f++ = 'a';
4244 *f++ = 't';
4245 *f++ = 'o';
4246 *f++ = 'r';
4247 *f++ = '+';
4248 *f = '=';
4249 }
4250 return n2;
4251 }
4252 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4253 {
4254 bool r = true;
4255 if (__left_)
4256 r = r && __left_->fix_forward_references(t_begin, t_end);
4257 if (__right_)
4258 r = r && __right_->fix_forward_references(t_begin, t_end);
4259 return r;
4260 }
4261};
4262
4263class __operator_increment
4264 : public __node
4265{
4266public:
4267
4268 __operator_increment() {}
4269 explicit __operator_increment(bool prefix, __node* op)
4270 {
4271 __size_ = prefix;
4272 __left_ = op;
4273 }
4274 virtual size_t first_size() const
4275 {
4276 if (__cached_size_ == -1)
4277 {
4278 if (__left_)
4279 const_cast<long&>(__cached_size_) = 4+__left_->size();
4280 else
4281 const_cast<long&>(__cached_size_) = sizeof("operator++") - 1;
4282 }
4283 return __cached_size_;
4284 }
4285 virtual char* first_demangled_name(char* buf) const
4286 {
4287 if (__left_)
4288 {
4289 if (__size_)
4290 {
4291 *buf++ = '+';
4292 *buf++ = '+';
4293 *buf++ = '(';
4294 }
4295 else
4296 *buf++ = '(';
4297 buf = __left_->get_demangled_name(buf);
4298 if (__size_)
4299 *buf++ = ')';
4300 else
4301 {
4302 *buf++ = ')';
4303 *buf++ = '+';
4304 *buf++ = '+';
4305 }
4306 }
4307 else
4308 {
4309 strncpy(buf, "operator++", sizeof("operator++") - 1);
4310 buf += sizeof("operator++") - 1;
4311 }
4312 return buf;
4313 }
4314 virtual ptrdiff_t print_first(char* f, char* l) const
4315 {
4316 const ptrdiff_t r = l - f;
4317 if (__left_)
4318 {
4319 const ptrdiff_t n1 = 4;
4320 if (r < n1)
4321 return n1 + __left_->print(l, l);
4322 ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l);
4323 if (r >= n1 + sz1)
4324 {
4325 if (__size_)
4326 {
4327 *f++ = '+';
4328 *f++ = '+';
4329 *f = '(';
4330 f += 1+sz1;
4331 *f = ')';
4332 }
4333 else
4334 {
4335 *f = '(';
4336 f += 1+sz1;
4337 *f++ = ')';
4338 *f++ = '+';
4339 *f = '+';
4340 }
4341 }
4342 return n1 + sz1;
4343 }
4344 const ptrdiff_t n2 = sizeof("operator++") - 1;
4345 if (r >= n2)
4346 {
4347 *f++ = 'o';
4348 *f++ = 'p';
4349 *f++ = 'e';
4350 *f++ = 'r';
4351 *f++ = 'a';
4352 *f++ = 't';
4353 *f++ = 'o';
4354 *f++ = 'r';
4355 *f++ = '+';
4356 *f = '+';
4357 }
4358 return n2;
4359 }
4360 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4361 {
4362 if (__left_)
4363 return __left_->fix_forward_references(t_begin, t_end);
4364 return true;
4365 }
4366};
4367
4368class __operator_unary_plus
4369 : public __node
4370{
4371public:
4372
4373 __operator_unary_plus() {}
4374 explicit __operator_unary_plus(__node* op)
4375 {
4376 __left_ = op;
4377 }
4378 virtual size_t first_size() const
4379 {
4380 if (__cached_size_ == -1)
4381 {
4382 if (__left_)
4383 const_cast<long&>(__cached_size_) = 3+__left_->size();
4384 else
4385 const_cast<long&>(__cached_size_) = sizeof("operator+") - 1;
4386 }
4387 return __cached_size_;
4388 }
4389 virtual char* first_demangled_name(char* buf) const
4390 {
4391 if (__left_)
4392 {
4393 *buf++ = '+';
4394 *buf++ = '(';
4395 buf = __left_->get_demangled_name(buf);
4396 *buf++ = ')';
4397 }
4398 else
4399 {
4400 strncpy(buf, "operator+", sizeof("operator+") - 1);
4401 buf += sizeof("operator+") - 1;
4402 }
4403 return buf;
4404 }
4405 virtual ptrdiff_t print_first(char* f, char* l) const
4406 {
4407 const ptrdiff_t r = l - f;
4408 if (__left_)
4409 {
4410 const ptrdiff_t n1 = 3;
4411 if (r < n1)
4412 return n1 + __left_->print(l, l);
4413 ptrdiff_t sz1 = __left_->print(f+2, l);
4414 if (r >= n1 + sz1)
4415 {
4416 *f++ = '+';
4417 *f = '(';
4418 f += 1 + sz1;
4419 *f = ')';
4420 }
4421 return n1 + sz1;
4422 }
4423 const ptrdiff_t n2 = sizeof("operator+") - 1;
4424 if (r >= n2)
4425 {
4426 *f++ = 'o';
4427 *f++ = 'p';
4428 *f++ = 'e';
4429 *f++ = 'r';
4430 *f++ = 'a';
4431 *f++ = 't';
4432 *f++ = 'o';
4433 *f++ = 'r';
4434 *f = '+';
4435 }
4436 return n2;
4437 }
4438 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4439 {
4440 if (__left_)
4441 return __left_->fix_forward_references(t_begin, t_end);
4442 return true;
4443 }
4444};
4445
4446class __operator_arrow
4447 : public __node
4448{
4449public:
4450
4451 __operator_arrow() {}
4452 __operator_arrow(__node* op1, __node* op2)
4453 {
4454 __left_ = op1;
4455 __right_ = op2;
4456 }
4457 virtual size_t first_size() const
4458 {
4459 if (__cached_size_ == -1)
4460 {
4461 if (__left_)
4462 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4463 else
4464 const_cast<long&>(__cached_size_) = sizeof("operator->") - 1;
4465 }
4466 return __cached_size_;
4467 }
4468 virtual char* first_demangled_name(char* buf) const
4469 {
4470 if (__left_)
4471 {
4472 *buf++ = '(';
4473 buf = __left_->get_demangled_name(buf);
4474 strncpy(buf, ") -> (", 6);
4475 buf += 6;
4476 buf = __right_->get_demangled_name(buf);
4477 *buf++ = ')';
4478 }
4479 else
4480 {
4481 strncpy(buf, "operator->", sizeof("operator->") - 1);
4482 buf += sizeof("operator->") - 1;
4483 }
4484 return buf;
4485 }
4486 virtual ptrdiff_t print_first(char* f, char* l) const
4487 {
4488 const ptrdiff_t r = l - f;
4489 if (__left_)
4490 {
4491 const ptrdiff_t n1 = 8;
4492 if (r < n1)
4493 return n1 + __left_->print(l, l) + __right_->print(l, l);
4494 ptrdiff_t sz1 = __left_->print(f+1, l);
4495 if (r < n1 + sz1)
4496 return n1 + sz1 + __right_->print(l, l);
4497 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4498 if (r >= n1 + sz1 + sz2)
4499 {
4500 *f = '(';
4501 f += 1 + sz1;
4502 *f++ = ')';
4503 *f++ = ' ';
4504 *f++ = '-';
4505 *f++ = '>';
4506 *f++ = ' ';
4507 *f = '(';
4508 f += 1 + sz2;
4509 *f = ')';
4510 }
4511 return n1 + sz1 + sz2;
4512 }
4513 const ptrdiff_t n2 = sizeof("operator->") - 1;
4514 if (r >= n2)
4515 {
4516 *f++ = 'o';
4517 *f++ = 'p';
4518 *f++ = 'e';
4519 *f++ = 'r';
4520 *f++ = 'a';
4521 *f++ = 't';
4522 *f++ = 'o';
4523 *f++ = 'r';
4524 *f++ = '-';
4525 *f = '>';
4526 }
4527 return n2;
4528 }
4529 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4530 {
4531 bool r = true;
4532 if (__left_)
4533 r = r && __left_->fix_forward_references(t_begin, t_end);
4534 if (__right_)
4535 r = r && __right_->fix_forward_references(t_begin, t_end);
4536 return r;
4537 }
4538};
4539
4540class __operator_conditional
4541 : public __node
4542{
4543public:
4544
4545 __operator_conditional() {}
4546 __operator_conditional(__node* op1, __node* op2, __node* op3)
4547 {
4548 __name_ = (const char*)op1;
4549 __left_ = op2;
4550 __right_ = op3;
4551 }
4552 virtual size_t first_size() const
4553 {
4554 if (__cached_size_ == -1)
4555 {
4556 if (__left_)
4557 {
4558 __node* op1 = (__node*)__name_;
4559 const_cast<long&>(__cached_size_) = op1->size() + __left_->size() + 12 + __right_->size();
4560 }
4561 else
4562 const_cast<long&>(__cached_size_) = sizeof("operator?") - 1;
4563 }
4564 return __cached_size_;
4565 }
4566 virtual char* first_demangled_name(char* buf) const
4567 {
4568 if (__left_)
4569 {
4570 __node* op1 = (__node*)__name_;
4571 *buf++ = '(';
4572 buf = op1->get_demangled_name(buf);
4573 strncpy(buf, ") ? (", 5);
4574 buf += 5;
4575 buf = __left_->get_demangled_name(buf);
4576 strncpy(buf, ") : (", 5);
4577 buf += 5;
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 = 12;
4594 __node* op1 = (__node*)__name_;
4595 if (r < n1)
4596 return n1 + op1->print(l, l) + __left_->print(l, l) +
4597 __right_->print(l, l);
4598 ptrdiff_t sz1 = op1->print(f+1, l);
4599 if (r < n1 + sz1)
4600 return n1 + sz1 + __left_->print(l, l) + __right_->print(l, l);
4601 ptrdiff_t sz2 = __left_->print(f+6+sz1, l);
4602 if (r < n1 + sz1 + sz2)
4603 return n1 + sz1 + sz2 + __right_->print(l, l);
4604 ptrdiff_t sz3 = __right_->print(f+11+sz1+sz2, l);
4605 if (r >= n1 + sz1 + sz2 + sz3)
4606 {
4607 *f = '(';
4608 f += 1 + sz1;
4609 *f++ = ')';
4610 *f++ = ' ';
4611 *f++ = '?';
4612 *f++ = ' ';
4613 *f = '(';
4614 f += 1 + sz2;
4615 *f++ = ')';
4616 *f++ = ' ';
4617 *f++ = ':';
4618 *f++ = ' ';
4619 *f = '(';
4620 f += 1 + sz3;
4621 *f = ')';
4622 }
4623 return n1 + sz1 + sz2 + sz3;
4624 }
4625 const ptrdiff_t n2 = sizeof("operator?") - 1;
4626 if (r >= n2)
4627 {
4628 *f++ = 'o';
4629 *f++ = 'p';
4630 *f++ = 'e';
4631 *f++ = 'r';
4632 *f++ = 'a';
4633 *f++ = 't';
4634 *f++ = 'o';
4635 *f++ = 'r';
4636 *f = '?';
4637 }
4638 return n2;
4639 }
4640 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4641 {
4642 bool r = true;
4643 if (__name_)
4644 r = r && ((__node*)__name_)->fix_forward_references(t_begin, t_end);
4645 if (__left_)
4646 r = r && __left_->fix_forward_references(t_begin, t_end);
4647 if (__right_)
4648 r = r && __right_->fix_forward_references(t_begin, t_end);
4649 return r;
4650 }
4651};
4652
4653class __operator_mod
4654 : public __node
4655{
4656public:
4657
4658 __operator_mod() {}
4659 __operator_mod(__node* op1, __node* op2)
4660 {
4661 __left_ = op1;
4662 __right_ = op2;
4663 }
4664 virtual size_t first_size() const
4665 {
4666 if (__cached_size_ == -1)
4667 {
4668 if (__left_)
4669 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
4670 else
4671 const_cast<long&>(__cached_size_) = sizeof("operator%") - 1;
4672 }
4673 return __cached_size_;
4674 }
4675 virtual char* first_demangled_name(char* buf) const
4676 {
4677 if (__left_)
4678 {
4679 *buf++ = '(';
4680 buf = __left_->get_demangled_name(buf);
4681 strncpy(buf, ") % (", 5);
4682 buf += 5;
4683 buf = __right_->get_demangled_name(buf);
4684 *buf++ = ')';
4685 }
4686 else
4687 {
4688 strncpy(buf, "operator%", sizeof("operator%") - 1);
4689 buf += sizeof("operator%") - 1;
4690 }
4691 return buf;
4692 }
4693 virtual ptrdiff_t print_first(char* f, char* l) const
4694 {
4695 const ptrdiff_t r = l - f;
4696 if (__left_)
4697 {
4698 const ptrdiff_t n1 = 7;
4699 if (r < n1)
4700 return n1 + __left_->print(l, l) + __right_->print(l, l);
4701 ptrdiff_t sz1 = __left_->print(f+1, l);
4702 if (r < n1 + sz1)
4703 return n1 + sz1 + __right_->print(l, l);
4704 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4705 if (r >= n1 + sz1 + sz2)
4706 {
4707 *f = '(';
4708 f += 1 + sz1;
4709 *f++ = ')';
4710 *f++ = ' ';
4711 *f++ = '%';
4712 *f++ = ' ';
4713 *f = '(';
4714 f += 1 + sz2;
4715 *f = ')';
4716 }
4717 return n1 + sz1 + sz2;
4718 }
4719 const ptrdiff_t n2 = sizeof("operator%") - 1;
4720 if (r >= n2)
4721 {
4722 *f++ = 'o';
4723 *f++ = 'p';
4724 *f++ = 'e';
4725 *f++ = 'r';
4726 *f++ = 'a';
4727 *f++ = 't';
4728 *f++ = 'o';
4729 *f++ = 'r';
4730 *f = '%';
4731 }
4732 return n2;
4733 }
4734 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4735 {
4736 bool r = true;
4737 if (__left_)
4738 r = r && __left_->fix_forward_references(t_begin, t_end);
4739 if (__right_)
4740 r = r && __right_->fix_forward_references(t_begin, t_end);
4741 return r;
4742 }
4743};
4744
4745class __operator_mod_equal
4746 : public __node
4747{
4748public:
4749
4750 __operator_mod_equal() {}
4751 __operator_mod_equal(__node* op1, __node* op2)
4752 {
4753 __left_ = op1;
4754 __right_ = op2;
4755 }
4756 virtual size_t first_size() const
4757 {
4758 if (__cached_size_ == -1)
4759 {
4760 if (__left_)
4761 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4762 else
4763 const_cast<long&>(__cached_size_) = sizeof("operator%=") - 1;
4764 }
4765 return __cached_size_;
4766 }
4767 virtual char* first_demangled_name(char* buf) const
4768 {
4769 if (__left_)
4770 {
4771 *buf++ = '(';
4772 buf = __left_->get_demangled_name(buf);
4773 strncpy(buf, ") %= (", 6);
4774 buf += 6;
4775 buf = __right_->get_demangled_name(buf);
4776 *buf++ = ')';
4777 }
4778 else
4779 {
4780 strncpy(buf, "operator%=", sizeof("operator%=") - 1);
4781 buf += sizeof("operator%=") - 1;
4782 }
4783 return buf;
4784 }
4785 virtual ptrdiff_t print_first(char* f, char* l) const
4786 {
4787 const ptrdiff_t r = l - f;
4788 if (__left_)
4789 {
4790 const ptrdiff_t n1 = 8;
4791 if (r < n1)
4792 return n1 + __left_->print(l, l) + __right_->print(l, l);
4793 ptrdiff_t sz1 = __left_->print(f+1, l);
4794 if (r < n1 + sz1)
4795 return n1 + sz1 + __right_->print(l, l);
4796 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4797 if (r >= n1 + sz1 + sz2)
4798 {
4799 *f = '(';
4800 f += 1 + sz1;
4801 *f++ = ')';
4802 *f++ = ' ';
4803 *f++ = '%';
4804 *f++ = '=';
4805 *f++ = ' ';
4806 *f = '(';
4807 f += 1 + sz2;
4808 *f = ')';
4809 }
4810 return n1 + sz1 + sz2;
4811 }
4812 const ptrdiff_t n2 = sizeof("operator%=") - 1;
4813 if (r >= n2)
4814 {
4815 *f++ = 'o';
4816 *f++ = 'p';
4817 *f++ = 'e';
4818 *f++ = 'r';
4819 *f++ = 'a';
4820 *f++ = 't';
4821 *f++ = 'o';
4822 *f++ = 'r';
4823 *f++ = '%';
4824 *f = '=';
4825 }
4826 return n2;
4827 }
4828 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4829 {
4830 bool r = true;
4831 if (__left_)
4832 r = r && __left_->fix_forward_references(t_begin, t_end);
4833 if (__right_)
4834 r = r && __right_->fix_forward_references(t_begin, t_end);
4835 return r;
4836 }
4837};
4838
4839class __operator_right_shift
4840 : public __node
4841{
4842public:
4843
4844 __operator_right_shift() {}
4845 __operator_right_shift(__node* op1, __node* op2)
4846 {
4847 __left_ = op1;
4848 __right_ = op2;
4849 }
4850 virtual size_t first_size() const
4851 {
4852 if (__cached_size_ == -1)
4853 {
4854 if (__left_)
4855 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4856 else
4857 const_cast<long&>(__cached_size_) = sizeof("operator>>") - 1;
4858 }
4859 return __cached_size_;
4860 }
4861 virtual char* first_demangled_name(char* buf) const
4862 {
4863 if (__left_)
4864 {
4865 *buf++ = '(';
4866 buf = __left_->get_demangled_name(buf);
4867 strncpy(buf, ") >> (", 6);
4868 buf += 6;
4869 buf = __right_->get_demangled_name(buf);
4870 *buf++ = ')';
4871 }
4872 else
4873 {
4874 strncpy(buf, "operator>>", sizeof("operator>>") - 1);
4875 buf += sizeof("operator>>") - 1;
4876 }
4877 return buf;
4878 }
4879 virtual ptrdiff_t print_first(char* f, char* l) const
4880 {
4881 const ptrdiff_t r = l - f;
4882 if (__left_)
4883 {
4884 const ptrdiff_t n1 = 8;
4885 if (r < n1)
4886 return n1 + __left_->print(l, l) + __right_->print(l, l);
4887 ptrdiff_t sz1 = __left_->print(f+1, l);
4888 if (r < n1 + sz1)
4889 return n1 + sz1 + __right_->print(l, l);
4890 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4891 if (r >= n1 + sz1 + sz2)
4892 {
4893 *f = '(';
4894 f += 1 + sz1;
4895 *f++ = ')';
4896 *f++ = ' ';
4897 *f++ = '>';
4898 *f++ = '>';
4899 *f++ = ' ';
4900 *f = '(';
4901 f += 1 + sz2;
4902 *f = ')';
4903 }
4904 return n1 + sz1 + sz2;
4905 }
4906 const ptrdiff_t n2 = sizeof("operator>>") - 1;
4907 if (r >= n2)
4908 {
4909 *f++ = 'o';
4910 *f++ = 'p';
4911 *f++ = 'e';
4912 *f++ = 'r';
4913 *f++ = 'a';
4914 *f++ = 't';
4915 *f++ = 'o';
4916 *f++ = 'r';
4917 *f++ = '>';
4918 *f = '>';
4919 }
4920 return n2;
4921 }
4922 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4923 {
4924 bool r = true;
4925 if (__left_)
4926 r = r && __left_->fix_forward_references(t_begin, t_end);
4927 if (__right_)
4928 r = r && __right_->fix_forward_references(t_begin, t_end);
4929 return r;
4930 }
4931};
4932
4933class __operator_right_shift_equal
4934 : public __node
4935{
4936public:
4937
4938 __operator_right_shift_equal() {}
4939 __operator_right_shift_equal(__node* op1, __node* op2)
4940 {
4941 __left_ = op1;
4942 __right_ = op2;
4943 }
4944 virtual size_t first_size() const
4945 {
4946 if (__cached_size_ == -1)
4947 {
4948 if (__left_)
4949 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
4950 else
4951 const_cast<long&>(__cached_size_) = sizeof("operator>>=") - 1;
4952 }
4953 return __cached_size_;
4954 }
4955 virtual char* first_demangled_name(char* buf) const
4956 {
4957 if (__left_)
4958 {
4959 *buf++ = '(';
4960 buf = __left_->get_demangled_name(buf);
4961 strncpy(buf, ") >>= (", 7);
4962 buf += 7;
4963 buf = __right_->get_demangled_name(buf);
4964 *buf++ = ')';
4965 }
4966 else
4967 {
4968 strncpy(buf, "operator>>=", sizeof("operator>>=") - 1);
4969 buf += sizeof("operator>>=") - 1;
4970 }
4971 return buf;
4972 }
4973 virtual ptrdiff_t print_first(char* f, char* l) const
4974 {
4975 const ptrdiff_t r = l - f;
4976 if (__left_)
4977 {
4978 const ptrdiff_t n1 = 9;
4979 if (r < n1)
4980 return n1 + __left_->print(l, l) + __right_->print(l, l);
4981 ptrdiff_t sz1 = __left_->print(f+1, l);
4982 if (r < n1 + sz1)
4983 return n1 + sz1 + __right_->print(l, l);
4984 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4985 if (r >= n1 + sz1 + sz2)
4986 {
4987 *f = '(';
4988 f += 1 + sz1;
4989 *f++ = ')';
4990 *f++ = ' ';
4991 *f++ = '>';
4992 *f++ = '>';
4993 *f++ = '=';
4994 *f++ = ' ';
4995 *f = '(';
4996 f += 1 + sz2;
4997 *f = ')';
4998 }
4999 return n1 + sz1 + sz2;
5000 }
5001 const ptrdiff_t n2 = sizeof("operator>>=") - 1;
5002 if (r >= n2)
5003 {
5004 *f++ = 'o';
5005 *f++ = 'p';
5006 *f++ = 'e';
5007 *f++ = 'r';
5008 *f++ = 'a';
5009 *f++ = 't';
5010 *f++ = 'o';
5011 *f++ = 'r';
5012 *f++ = '>';
5013 *f++ = '>';
5014 *f = '=';
5015 }
5016 return n2;
5017 }
5018 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5019 {
5020 bool r = true;
5021 if (__left_)
5022 r = r && __left_->fix_forward_references(t_begin, t_end);
5023 if (__right_)
5024 r = r && __right_->fix_forward_references(t_begin, t_end);
5025 return r;
5026 }
5027};
5028
5029class __operator_sizeof_type
5030 : public __node
5031{
5032public:
5033
5034 __operator_sizeof_type() {}
5035 __operator_sizeof_type(__node* op)
5036 {
5037 __right_ = op;
5038 }
5039 virtual size_t first_size() const
5040 {
5041 if (__cached_size_ == -1)
5042 {
5043 if (__right_)
5044 const_cast<long&>(__cached_size_) = __right_->size() + 9;
5045 else
5046 const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1;
5047 }
5048 return __cached_size_;
5049 }
5050 virtual char* first_demangled_name(char* buf) const
5051 {
5052 if (__right_)
5053 {
5054 strncpy(buf, "sizeof (", 8);
5055 buf += 8;
5056 buf = __right_->get_demangled_name(buf);
5057 *buf++ = ')';
5058 }
5059 else
5060 {
5061 strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1);
5062 buf += sizeof("operator sizeof") - 1;
5063 }
5064 return buf;
5065 }
5066 virtual ptrdiff_t print_first(char* f, char* l) const
5067 {
5068 const ptrdiff_t r = l - f;
5069 if (__right_)
5070 {
5071 const ptrdiff_t n1 = sizeof("sizeof ()") - 1;
5072 if (r < n1)
5073 return n1 + __right_->print(l, l);
5074 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5075 if (r >= n1 + sz1)
5076 {
5077 *f++ = 's';
5078 *f++ = 'i';
5079 *f++ = 'z';
5080 *f++ = 'e';
5081 *f++ = 'o';
5082 *f++ = 'f';
5083 *f++ = ' ';
5084 *f = '(';
5085 f += 1 + sz1;
5086 *f = ')';
5087 }
5088 return n1 + sz1;
5089 }
5090 const ptrdiff_t n2 = sizeof("operator sizeof") - 1;
5091 if (r >= n2)
5092 {
5093 *f++ = 'o';
5094 *f++ = 'p';
5095 *f++ = 'e';
5096 *f++ = 'r';
5097 *f++ = 'a';
5098 *f++ = 't';
5099 *f++ = 'o';
5100 *f++ = 'r';
5101 *f++ = ' ';
5102 *f++ = 's';
5103 *f++ = 'i';
5104 *f++ = 'z';
5105 *f++ = 'e';
5106 *f++ = 'o';
5107 *f = 'f';
5108 }
5109 return n2;
5110 }
5111 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5112 {
5113 if (__right_)
5114 return __right_->fix_forward_references(t_begin, t_end);
5115 return true;
5116 }
5117};
5118
5119class __operator_sizeof_expression
5120 : public __node
5121{
5122public:
5123
5124 __operator_sizeof_expression() {}
5125 __operator_sizeof_expression(__node* op)
5126 {
5127 __right_ = op;
5128 }
5129 virtual size_t first_size() const
5130 {
5131 if (__cached_size_ == -1)
5132 {
5133 if (__right_)
5134 const_cast<long&>(__cached_size_) = __right_->size() + 9;
5135 else
5136 const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1;
5137 }
5138 return __cached_size_;
5139 }
5140 virtual char* first_demangled_name(char* buf) const
5141 {
5142 if (__right_)
5143 {
5144 strncpy(buf, "sizeof (", 8);
5145 buf += 8;
5146 buf = __right_->get_demangled_name(buf);
5147 *buf++ = ')';
5148 }
5149 else
5150 {
5151 strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1);
5152 buf += sizeof("operator sizeof") - 1;
5153 }
5154 return buf;
5155 }
5156 virtual ptrdiff_t print_first(char* f, char* l) const
5157 {
5158 const ptrdiff_t r = l - f;
5159 if (__right_)
5160 {
5161 const ptrdiff_t n1 = sizeof("sizeof ()") - 1;
5162 if (r < n1)
5163 return n1 + __right_->print(l, l);
5164 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5165 if (r >= n1 + sz1)
5166 {
5167 *f++ = 's';
5168 *f++ = 'i';
5169 *f++ = 'z';
5170 *f++ = 'e';
5171 *f++ = 'o';
5172 *f++ = 'f';
5173 *f++ = ' ';
5174 *f = '(';
5175 f += 1 + sz1;
5176 *f = ')';
5177 }
5178 return n1 + sz1;
5179 }
5180 const ptrdiff_t n2 = sizeof("operator sizeof") - 1;
5181 if (r >= n2)
5182 {
5183 *f++ = 'o';
5184 *f++ = 'p';
5185 *f++ = 'e';
5186 *f++ = 'r';
5187 *f++ = 'a';
5188 *f++ = 't';
5189 *f++ = 'o';
5190 *f++ = 'r';
5191 *f++ = ' ';
5192 *f++ = 's';
5193 *f++ = 'i';
5194 *f++ = 'z';
5195 *f++ = 'e';
5196 *f++ = 'o';
5197 *f = 'f';
5198 }
5199 return n2;
5200 }
5201 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5202 {
5203 if (__right_)
5204 return __right_->fix_forward_references(t_begin, t_end);
5205 return true;
5206 }
5207};
5208
5209class __typeid
5210 : public __node
5211{
5212public:
5213
5214 __typeid(__node* op)
5215 {
5216 __right_ = op;
5217 }
5218 virtual size_t first_size() const
5219 {
5220 if (__cached_size_ == -1)
5221 const_cast<long&>(__cached_size_) = __right_->size() + 8;
5222 return __cached_size_;
5223 }
5224 virtual char* first_demangled_name(char* buf) const
5225 {
5226 strncpy(buf, "typeid(", 7);
5227 buf += 7;
5228 buf = __right_->get_demangled_name(buf);
5229 *buf++ = ')';
5230 return buf;
5231 }
5232 virtual ptrdiff_t print_first(char* f, char* l) const
5233 {
5234 const ptrdiff_t r = l - f;
5235 const ptrdiff_t n1 = sizeof("typeid()") - 1;
5236 if (r < n1)
5237 return n1 + __right_->print(l, l);
5238 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5239 if (r >= n1 + sz1)
5240 {
5241 *f++ = 't';
5242 *f++ = 'y';
5243 *f++ = 'p';
5244 *f++ = 'e';
5245 *f++ = 'i';
5246 *f++ = 'd';
5247 *f = '(';
5248 f += 1 + sz1;
5249 *f = ')';
5250 }
5251 return n1 + sz1;
5252 }
5253 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5254 {
5255 return __right_->fix_forward_references(t_begin, t_end);
5256 }
5257};
5258
5259class __throw
5260 : public __node
5261{
5262public:
5263
5264 __throw(__node* op)
5265 {
5266 __right_ = op;
5267 }
5268 virtual size_t first_size() const
5269 {
5270 if (__cached_size_ == -1)
5271 const_cast<long&>(__cached_size_) = __right_->size() + 6;
5272 return __cached_size_;
5273 }
5274 virtual char* first_demangled_name(char* buf) const
5275 {
5276 strncpy(buf, "throw ", 6);
5277 return __right_->get_demangled_name(buf+6);
5278 }
5279 virtual ptrdiff_t print_first(char* f, char* l) const
5280 {
5281 const ptrdiff_t r = l - f;
5282 const ptrdiff_t n1 = sizeof("throw ") - 1;
5283 if (r < n1)
5284 return n1 + __right_->print(l, l);
5285 ptrdiff_t sz1 = __right_->print(f+n1, l);
5286 if (r >= n1 + sz1)
5287 {
5288 *f++ = 't';
5289 *f++ = 'h';
5290 *f++ = 'r';
5291 *f++ = 'o';
5292 *f++ = 'w';
5293 *f = ' ';
5294 }
5295 return n1 + sz1;
5296 }
5297 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5298 {
5299 return __right_->fix_forward_references(t_begin, t_end);
5300 }
5301};
5302
5303class __rethrow
5304 : public __node
5305{
5306 static const ptrdiff_t n = sizeof("throw") - 1;
5307public:
5308
5309 virtual size_t first_size() const {return n;}
5310 virtual char* first_demangled_name(char* buf) const
5311 {
5312 strncpy(buf, "throw", n);
5313 return buf+n;
5314 }
5315 virtual ptrdiff_t print_first(char* f, char* l) const
5316 {
5317 const ptrdiff_t r = l - f;
5318 if (r >= n)
5319 {
5320 *f++ = 't';
5321 *f++ = 'h';
5322 *f++ = 'r';
5323 *f++ = 'o';
5324 *f = 'w';
5325 }
5326 return n;
5327 }
5328};
5329
5330class __operator_sizeof_param_pack
5331 : public __node
5332{
5333public:
5334
5335 __operator_sizeof_param_pack(__node* op)
5336 {
5337 __right_ = op;
5338 }
5339 virtual size_t first_size() const
5340 {
5341 if (__cached_size_ == -1)
5342 const_cast<long&>(__cached_size_) = __right_->size() + 11;
5343 return __cached_size_;
5344 }
5345 virtual char* first_demangled_name(char* buf) const
5346 {
5347 strncpy(buf, "sizeof...(", 10);
5348 buf += 10;
5349 buf = __right_->get_demangled_name(buf);
5350 *buf++ = ')';
5351 return buf;
5352 }
5353 virtual ptrdiff_t print_first(char* f, char* l) const
5354 {
5355 const ptrdiff_t r = l - f;
5356 const ptrdiff_t n1 = sizeof("sizeof...()") - 1;
5357 if (r < n1)
5358 return n1 + __right_->print(l, l);
5359 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5360 if (r >= n1 + sz1)
5361 {
5362 *f++ = 's';
5363 *f++ = 'i';
5364 *f++ = 'z';
5365 *f++ = 'e';
5366 *f++ = 'o';
5367 *f++ = 'f';
5368 *f++ = '.';
5369 *f++ = '.';
5370 *f++ = '.';
5371 *f = '(';
5372 f += 1+sz1;
5373 *f = ')';
5374 }
5375 return n1 + sz1;
5376 }
5377 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5378 {
5379 return __right_->fix_forward_references(t_begin, t_end);
5380 }
5381};
5382
5383class __const_cast
5384 : public __node
5385{
5386public:
5387
5388 __const_cast(__node* op1, __node* op2)
5389 {
5390 __left_ = op1;
5391 __right_ = op2;
5392 }
5393 virtual size_t first_size() const
5394 {
5395 if (__cached_size_ == -1)
5396 const_cast<long&>(__cached_size_) = __left_->size() + 14 + __right_->size();
5397 return __cached_size_;
5398 }
5399 virtual char* first_demangled_name(char* buf) const
5400 {
5401 strncpy(buf, "const_cast<", 11);
5402 buf += 11;
5403 buf = __left_->get_demangled_name(buf);
5404 *buf++ = '>';
5405 *buf++ = '(';
5406 buf = __right_->get_demangled_name(buf);
5407 *buf++ = ')';
5408 return buf;
5409 }
5410 virtual ptrdiff_t print_first(char* f, char* l) const
5411 {
5412 const ptrdiff_t r = l - f;
5413 const ptrdiff_t n1 = sizeof("const_cast<>()") - 1;
5414 if (r < n1)
5415 return n1 + __left_->print(l, l) + __right_->print(l, l);
5416 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5417 if (r < n1 + sz1)
5418 return n1 + sz1 + __right_->print(l, l);
5419 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5420 if (r >= n1 + sz1 + sz2)
5421 {
5422 *f++ = 'c';
5423 *f++ = 'o';
5424 *f++ = 'n';
5425 *f++ = 's';
5426 *f++ = 't';
5427 *f++ = '_';
5428 *f++ = 'c';
5429 *f++ = 'a';
5430 *f++ = 's';
5431 *f++ = 't';
5432 *f = '<';
5433 f += 1+sz1;
5434 *f++ = '>';
5435 *f = '(';
5436 f += 1+sz2;
5437 *f = ')';
5438 }
5439 return n1 + sz1 + sz2;
5440 }
5441 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5442 {
5443 return __left_->fix_forward_references(t_begin, t_end) &&
5444 __right_->fix_forward_references(t_begin, t_end);
5445 }
5446};
5447
5448class __dynamic_cast
5449 : public __node
5450{
5451public:
5452
5453 __dynamic_cast(__node* op1, __node* op2)
5454 {
5455 __left_ = op1;
5456 __right_ = op2;
5457 }
5458 virtual size_t first_size() const
5459 {
5460 if (__cached_size_ == -1)
5461 const_cast<long&>(__cached_size_) = __left_->size() + 16 + __right_->size();
5462 return __cached_size_;
5463 }
5464 virtual char* first_demangled_name(char* buf) const
5465 {
5466 strncpy(buf, "dynamic_cast<", 13);
5467 buf += 13;
5468 buf = __left_->get_demangled_name(buf);
5469 *buf++ = '>';
5470 *buf++ = '(';
5471 buf = __right_->get_demangled_name(buf);
5472 *buf++ = ')';
5473 return buf;
5474 }
5475 virtual ptrdiff_t print_first(char* f, char* l) const
5476 {
5477 const ptrdiff_t r = l - f;
5478 const ptrdiff_t n1 = sizeof("dynamic_cast<>()") - 1;
5479 if (r < n1)
5480 return n1 + __left_->print(l, l) + __right_->print(l, l);
5481 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5482 if (r < n1 + sz1)
5483 return n1 + sz1 + __right_->print(l, l);
5484 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5485 if (r >= n1 + sz1 + sz2)
5486 {
5487 *f++ = 'd';
5488 *f++ = 'y';
5489 *f++ = 'n';
5490 *f++ = 'a';
5491 *f++ = 'm';
5492 *f++ = 'i';
5493 *f++ = 'c';
5494 *f++ = '_';
5495 *f++ = 'c';
5496 *f++ = 'a';
5497 *f++ = 's';
5498 *f++ = 't';
5499 *f = '<';
5500 f += 1+sz1;
5501 *f++ = '>';
5502 *f = '(';
5503 f += 1+sz2;
5504 *f = ')';
5505 }
5506 return n1 + sz1 + sz2;
5507 }
5508 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5509 {
5510 return __left_->fix_forward_references(t_begin, t_end) &&
5511 __right_->fix_forward_references(t_begin, t_end);
5512 }
5513};
5514
5515class __reinterpret_cast
5516 : public __node
5517{
5518public:
5519
5520 __reinterpret_cast(__node* op1, __node* op2)
5521 {
5522 __left_ = op1;
5523 __right_ = op2;
5524 }
5525 virtual size_t first_size() const
5526 {
5527 if (__cached_size_ == -1)
5528 const_cast<long&>(__cached_size_) = __left_->size() + 20 + __right_->size();
5529 return __cached_size_;
5530 }
5531 virtual char* first_demangled_name(char* buf) const
5532 {
5533 strncpy(buf, "reinterpret_cast<", 17);
5534 buf += 17;
5535 buf = __left_->get_demangled_name(buf);
5536 *buf++ = '>';
5537 *buf++ = '(';
5538 buf = __right_->get_demangled_name(buf);
5539 *buf++ = ')';
5540 return buf;
5541 }
5542 virtual ptrdiff_t print_first(char* f, char* l) const
5543 {
5544 const ptrdiff_t r = l - f;
5545 const ptrdiff_t n1 = sizeof("reinterpret_cast<>()") - 1;
5546 if (r < n1)
5547 return n1 + __left_->print(l, l) + __right_->print(l, l);
5548 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5549 if (r < n1 + sz1)
5550 return n1 + sz1 + __right_->print(l, l);
5551 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5552 if (r >= n1 + sz1 + sz2)
5553 {
5554 *f++ = 'r';
5555 *f++ = 'e';
5556 *f++ = 'i';
5557 *f++ = 'n';
5558 *f++ = 't';
5559 *f++ = 'e';
5560 *f++ = 'r';
5561 *f++ = 'p';
5562 *f++ = 'r';
5563 *f++ = 'e';
5564 *f++ = 't';
5565 *f++ = '_';
5566 *f++ = 'c';
5567 *f++ = 'a';
5568 *f++ = 's';
5569 *f++ = 't';
5570 *f = '<';
5571 f += 1+sz1;
5572 *f++ = '>';
5573 *f = '(';
5574 f += 1+sz2;
5575 *f = ')';
5576 }
5577 return n1 + sz1 + sz2;
5578 }
5579 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5580 {
5581 return __left_->fix_forward_references(t_begin, t_end) &&
5582 __right_->fix_forward_references(t_begin, t_end);
5583 }
5584};
5585
5586class __static_cast
5587 : public __node
5588{
5589public:
5590
5591 __static_cast(__node* op1, __node* op2)
5592 {
5593 __left_ = op1;
5594 __right_ = op2;
5595 }
5596 virtual size_t first_size() const
5597 {
5598 if (__cached_size_ == -1)
5599 const_cast<long&>(__cached_size_) = __left_->size() + 15 + __right_->size();
5600 return __cached_size_;
5601 }
5602 virtual char* first_demangled_name(char* buf) const
5603 {
5604 strncpy(buf, "static_cast<", 12);
5605 buf += 12;
5606 buf = __left_->get_demangled_name(buf);
5607 *buf++ = '>';
5608 *buf++ = '(';
5609 buf = __right_->get_demangled_name(buf);
5610 *buf++ = ')';
5611 return buf;
5612 }
5613 virtual ptrdiff_t print_first(char* f, char* l) const
5614 {
5615 const ptrdiff_t r = l - f;
5616 const ptrdiff_t n1 = sizeof("static_cast<>()") - 1;
5617 if (r < n1)
5618 return n1 + __left_->print(l, l) + __right_->print(l, l);
5619 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5620 if (r < n1 + sz1)
5621 return n1 + sz1 + __right_->print(l, l);
5622 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5623 if (r >= n1 + sz1 + sz2)
5624 {
5625 *f++ = 's';
5626 *f++ = 't';
5627 *f++ = 'a';
5628 *f++ = 't';
5629 *f++ = 'i';
5630 *f++ = 'c';
5631 *f++ = '_';
5632 *f++ = 'c';
5633 *f++ = 'a';
5634 *f++ = 's';
5635 *f++ = 't';
5636 *f = '<';
5637 f += 1+sz1;
5638 *f++ = '>';
5639 *f = '(';
5640 f += 1+sz2;
5641 *f = ')';
5642 }
5643 return n1 + sz1 + sz2;
5644 }
5645 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5646 {
5647 return __left_->fix_forward_references(t_begin, t_end) &&
5648 __right_->fix_forward_references(t_begin, t_end);
5649 }
5650};
5651
5652class __call_expr
5653 : public __node
5654{
5655public:
5656
5657 __call_expr(__node* op1, __node* op2)
5658 {
5659 __left_ = op1;
5660 __right_ = op2;
5661 }
5662 virtual size_t first_size() const
5663 {
5664 if (__cached_size_ == -1)
5665 {
5666 size_t off = __left_->size() + 2;
5667 if (__right_)
5668 off += __right_->size();
5669 const_cast<long&>(__cached_size_) = off;
5670 }
5671 return __cached_size_;
5672 }
5673 virtual char* first_demangled_name(char* buf) const
5674 {
5675 buf = __left_->get_demangled_name(buf);
5676 *buf++ = '(';
5677 if (__right_)
5678 buf = __right_->get_demangled_name(buf);
5679 *buf++ = ')';
5680 return buf;
5681 }
5682 virtual ptrdiff_t print_first(char* f, char* l) const
5683 {
5684 const ptrdiff_t r = l - f;
5685 const ptrdiff_t n1 = sizeof("()") - 1;
5686 if (r < n1)
5687 return n1 + __left_->print(l, l) + (__right_ ? __right_->print(l, l) : 0);
5688 ptrdiff_t sz1 = __left_->print(f, l);
5689 if (r < n1 + sz1)
5690 return n1 + sz1 + (__right_ ? __right_->print(l, l) : 0);
5691 ptrdiff_t sz2 = __right_ ? __right_->print(f+sz1+1, l) : 0;
5692 if (r >= n1 + sz1 + sz2)
5693 {
5694 f += sz1;
5695 *f = '(';
5696 f += 1+sz2;
5697 *f = ')';
5698 }
5699 return n1 + sz1 + sz2;
5700 }
5701 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5702 {
5703 bool r = __left_->fix_forward_references(t_begin, t_end);
5704 if (__right_)
5705 r = r && __right_->fix_forward_references(t_begin, t_end);
5706 return r;
5707 }
5708};
5709
5710class __delete_array_expr
5711 : public __node
5712{
5713public:
5714
5715 __delete_array_expr(bool global, __node* op)
5716 {
5717 __size_ = global;
5718 __right_ = op;
5719 }
5720 virtual size_t first_size() const
5721 {
5722 if (__cached_size_ == -1)
5723 const_cast<long&>(__cached_size_) = (__size_ ? 2 : 0) + 9 + __right_->size();
5724 return __cached_size_;
5725 }
5726 virtual char* first_demangled_name(char* buf) const
5727 {
5728 if (__size_)
5729 {
5730 *buf++ = ':';
5731 *buf++ = ':';
5732 }
5733 strncpy(buf, "delete[] ", 9);
5734 return __right_->get_demangled_name(buf+9);
5735 }
5736 virtual ptrdiff_t print_first(char* f, char* l) const
5737 {
5738 const ptrdiff_t r = l - f;
5739 const ptrdiff_t n1 = sizeof("delete[] ") - 1 + (__size_ ? 2 : 0);
5740 if (r < n1)
5741 return n1 + __right_->print(l, l);
5742 ptrdiff_t sz1 = __right_->print(f+n1, l);
5743 if (r >= n1 + sz1)
5744 {
5745 if (__size_)
5746 {
5747 *f++ = ':';
5748 *f++ = ':';
5749 }
5750 *f++ = 'd';
5751 *f++ = 'e';
5752 *f++ = 'l';
5753 *f++ = 'e';
5754 *f++ = 't';
5755 *f++ = 'e';
5756 *f++ = '[';
5757 *f++ = ']';
5758 *f = ' ';
5759 }
5760 return n1 + sz1;
5761 }
5762 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5763 {
5764 return __right_->fix_forward_references(t_begin, t_end);
5765 }
5766};
5767
5768class __delete_expr
5769 : public __node
5770{
5771public:
5772
5773 __delete_expr(bool global, __node* op)
5774 {
5775 __size_ = global;
5776 __right_ = op;
5777 }
5778 virtual size_t first_size() const
5779 {
5780 if (__cached_size_ == -1)
5781 const_cast<long&>(__cached_size_) = (__size_ ? 2 : 0) + 7 + __right_->size();
5782 return __cached_size_;
5783 }
5784 virtual char* first_demangled_name(char* buf) const
5785 {
5786 if (__size_)
5787 {
5788 *buf++ = ':';
5789 *buf++ = ':';
5790 }
5791 strncpy(buf, "delete ", 7);
5792 return __right_->get_demangled_name(buf+7);
5793 }
5794 virtual ptrdiff_t print_first(char* f, char* l) const
5795 {
5796 const ptrdiff_t r = l - f;
5797 const ptrdiff_t n1 = sizeof("delete ") - 1 + (__size_ ? 2 : 0);
5798 if (r < n1)
5799 return n1 + __right_->print(l, l);
5800 ptrdiff_t sz1 = __right_->print(f+n1, l);
5801 if (r >= n1 + sz1)
5802 {
5803 if (__size_)
5804 {
5805 *f++ = ':';
5806 *f++ = ':';
5807 }
5808 *f++ = 'd';
5809 *f++ = 'e';
5810 *f++ = 'l';
5811 *f++ = 'e';
5812 *f++ = 't';
5813 *f++ = 'e';
5814 *f = ' ';
5815 }
5816 return n1 + sz1;
5817 }
5818 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5819 {
5820 return __right_->fix_forward_references(t_begin, t_end);
5821 }
5822};
5823
5824class __new_expr
5825 : public __node
5826{
5827public:
5828
5829 __new_expr(bool global, bool is_array, bool has_init,
5830 __node* expr, __node* type, __node* init)
5831 {
5832 __size_ = (unsigned)global |
5833 ((unsigned)is_array << 1) |
5834 ((unsigned)has_init << 2);
5835 __left_ = expr;
5836 __name_ = (const char*)type;
5837 __right_ = init;
5838 }
5839 virtual size_t first_size() const
5840 {
5841 if (__cached_size_ == -1)
5842 {
5843 size_t off = 4;
5844 if (__size_ & 1)
5845 off += 2;
5846 if (__size_ & 2)
5847 off += 2;
5848 if (__left_)
5849 {
5850 off += 2;
5851 off += __left_->size();
5852 }
5853 __node* type = (__node*)__name_;
5854 off += type->size();
5855 if (__size_ & 4)
5856 {
5857 off += 2;
5858 if (__right_)
5859 off += __right_->size();
5860 }
5861 const_cast<long&>(__cached_size_) = off;
5862 }
5863 return __cached_size_;
5864 }
5865 virtual char* first_demangled_name(char* buf) const
5866 {
5867 if (__size_ & 1)
5868 {
5869 *buf++ = ':';
5870 *buf++ = ':';
5871 }
5872 *buf++ = 'n';
5873 *buf++ = 'e';
5874 *buf++ = 'w';
5875 if (__size_ & 2)
5876 {
5877 *buf++ = '[';
5878 *buf++ = ']';
5879 }
5880 if (__left_)
5881 {
5882 *buf++ = '(';
5883 buf = __left_->get_demangled_name(buf);
5884 *buf++ = ')';
5885 }
5886 *buf++ = ' ';
5887 __node* type = (__node*)__name_;
5888 buf = type->get_demangled_name(buf);
5889 if (__size_ & 4)
5890 {
5891 *buf++ = '(';
5892 if (__right_)
5893 buf = __right_->get_demangled_name(buf);
5894 *buf++ = ')';
5895 }
5896 return buf;
5897 }
5898 virtual ptrdiff_t print_first(char* f, char* l) const
5899 {
5900 const ptrdiff_t r = l - f;
5901 const ptrdiff_t n1 = sizeof("new ") - 1 + (__size_ & 1 ? 2 : 0) +
5902 (__size_ & 2 ? 2 : 0) + (__left_ ? 2 : 0) + (__size_ & 4 ? 2 : 0);
5903 __node* type = (__node*)__name_;
5904 if (r < n1)
5905 return n1 + (__left_ ? __left_->print(l, l) : 0) +
5906 type->print(l, l) +
5907 (__right_ ? __right_->print(l, l) : 0);
5908 ptrdiff_t sz1 = __left_ ? __left_->print(f+4+
5909 (__size_ & 1 ? 2 : 0) +
5910 (__size_ & 2 ? 2 : 0), l) : 0;
5911 if (r < n1 + sz1)
5912 return n1 + sz1 + type->print(l, l) +
5913 (__right_ ? __right_->print(l, l) : 0);
5914 ptrdiff_t sz2 = type->print(f+(n1-(__size_ & 4 ? 2 : 0)+sz1), l);
5915 if (r < n1 + sz1 + sz2)
5916 return n1 + sz1 + sz2 + (__right_ ? __right_->print(l, l) : 0);
5917 ptrdiff_t sz3 = __right_ ? __right_->print(f+(n1-1)+sz1+sz2, l) : 0;
5918 if (r >= n1 + sz1 + sz2 + sz3)
5919 {
5920 if (__size_ & 1)
5921 {
5922 *f++ = ':';
5923 *f++ = ':';
5924 }
5925 *f++ = 'n';
5926 *f++ = 'e';
5927 *f++ = 'w';
5928 if (__size_ & 2)
5929 {
5930 *f++ = '[';
5931 *f++ = ']';
5932 }
5933 if (__left_)
5934 {
5935 *f = '(';
5936 f += 1 + sz1;
5937 *f++ = ')';
5938 }
5939 *f = ' ';
5940 if (__size_ & 4)
5941 {
5942 f += 1 + sz2;
5943 *f = '(';
5944 f += 1 + sz3;
5945 *f = ')';
5946 }
5947 }
5948 return n1 + sz1 + sz2 + sz3;
5949 }
5950 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5951 {
5952 __node* type = (__node*)__name_;
5953 bool r = type->fix_forward_references(t_begin, t_end);
5954 if (__left_)
5955 r = r && __left_->fix_forward_references(t_begin, t_end);;
5956 if (__right_)
5957 r = r && __right_->fix_forward_references(t_begin, t_end);;
5958 return r;
5959 }
5960};
5961
5962class __dot_star_expr
5963 : public __node
5964{
5965public:
5966
5967 __dot_star_expr(__node* op1, __node* op2)
5968 {
5969 __left_ = op1;
5970 __right_ = op2;
5971 }
5972 virtual size_t first_size() const
5973 {
5974 if (__cached_size_ == -1)
5975 const_cast<long&>(__cached_size_) = __left_->size() + 2 + __right_->size();
5976 return __cached_size_;
5977 }
5978 virtual char* first_demangled_name(char* buf) const
5979 {
5980 buf = __left_->get_demangled_name(buf);
5981 *buf++ = '.';
5982 *buf++ = '*';
5983 return __right_->get_demangled_name(buf);
5984 }
5985 virtual ptrdiff_t print_first(char* f, char* l) const
5986 {
5987 const ptrdiff_t r = l - f;
5988 const ptrdiff_t n = sizeof(".*") - 1;
5989 if (r < n)
5990 return n + __left_->print(l, l) + __right_->print(l, l);
5991 ptrdiff_t sz1 = __left_->print(f, l);
5992 if (r < n + sz1)
5993 return n + sz1 + __right_->print(l, l);
5994 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
5995 if (r >= n + sz1 + sz2)
5996 {
5997 f += sz1;
5998 *f++ = '.';
5999 *f = '*';
6000 }
6001 return n + sz1 + sz2;
6002 }
6003 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6004 {
6005 return __left_->fix_forward_references(t_begin, t_end) &&
6006 __right_->fix_forward_references(t_begin, t_end);
6007 }
6008};
6009
6010class __dot_expr
6011 : public __node
6012{
6013public:
6014
6015 __dot_expr(__node* op1, __node* op2)
6016 {
6017 __left_ = op1;
6018 __right_ = op2;
6019 }
6020 virtual size_t first_size() const
6021 {
6022 if (__cached_size_ == -1)
6023 const_cast<long&>(__cached_size_) = __left_->size() + 1 + __right_->size();
6024 return __cached_size_;
6025 }
6026 virtual char* first_demangled_name(char* buf) const
6027 {
6028 buf = __left_->get_demangled_name(buf);
6029 *buf++ = '.';
6030 return __right_->get_demangled_name(buf);
6031 }
6032 virtual ptrdiff_t print_first(char* f, char* l) const
6033 {
6034 const ptrdiff_t r = l - f;
6035 const ptrdiff_t n = sizeof(".") - 1;
6036 if (r < n)
6037 return n + __left_->print(l, l) + __right_->print(l, l);
6038 ptrdiff_t sz1 = __left_->print(f, l);
6039 if (r < n + sz1)
6040 return n + sz1 + __right_->print(l, l);
6041 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
6042 if (r >= n + sz1 + sz2)
6043 f[sz1] = '.';
6044 return n + sz1 + sz2;
6045 }
6046 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6047 {
6048 return __left_->fix_forward_references(t_begin, t_end) &&
6049 __right_->fix_forward_references(t_begin, t_end);
6050 }
6051};
6052
6053class __arrow_expr
6054 : public __node
6055{
6056public:
6057
6058 __arrow_expr(__node* op1, __node* op2)
6059 {
6060 __left_ = op1;
6061 __right_ = op2;
6062 }
6063 virtual size_t first_size() const
6064 {
6065 if (__cached_size_ == -1)
6066 const_cast<long&>(__cached_size_) = __left_->size() + 2 + __right_->size();
6067 return __cached_size_;
6068 }
6069 virtual char* first_demangled_name(char* buf) const
6070 {
6071 buf = __left_->get_demangled_name(buf);
6072 *buf++ = '-';
6073 *buf++ = '>';
6074 return __right_->get_demangled_name(buf);
6075 }
6076 virtual ptrdiff_t print_first(char* f, char* l) const
6077 {
6078 const ptrdiff_t r = l - f;
6079 const ptrdiff_t n = sizeof("->") - 1;
6080 if (r < n)
6081 return n + __left_->print(l, l) + __right_->print(l, l);
6082 ptrdiff_t sz1 = __left_->print(f, l);
6083 if (r < n + sz1)
6084 return n + sz1 + __right_->print(l, l);
6085 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
6086 if (r >= n + sz1 + sz2)
6087 {
6088 f += sz1;
6089 *f++ = '-';
6090 *f = '>';
6091 }
6092 return n + sz1 + sz2;
6093 }
6094 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6095 {
6096 return __left_->fix_forward_references(t_begin, t_end) &&
6097 __right_->fix_forward_references(t_begin, t_end);
6098 }
6099};
6100
6101class __std_qualified_name
6102 : public __node
6103{
6104 static const ptrdiff_t n = sizeof("std") - 1;
6105public:
6106
6107 __std_qualified_name()
6108 {
6109 }
6110 virtual size_t first_size() const
6111 {
6112 return n;
6113 }
6114
6115 virtual char* first_demangled_name(char* buf) const
6116 {
6117 *buf++ = 's';
6118 *buf++ = 't';
6119 *buf++ = 'd';
6120 return buf;
6121 }
6122 virtual ptrdiff_t print_first(char* f, char* l) const
6123 {
6124 const ptrdiff_t r = l - f;
6125 if (r >= n)
6126 {
6127 *f++ = 's';
6128 *f++ = 't';
6129 *f = 'd';
6130 }
6131 return n;
6132 }
6133};
6134
6135class __sub_allocator
6136 : public __node
6137{
6138 static const ptrdiff_t n = sizeof("std::allocator") - 1;
6139public:
6140
6141 virtual size_t first_size() const
6142 {
6143 return n;
6144 }
6145 virtual char* first_demangled_name(char* buf) const
6146 {
6147 strncpy(buf, "std::allocator", n);
6148 return buf + n;
6149 }
6150 virtual ptrdiff_t print_first(char* f, char* l) const
6151 {
6152 const ptrdiff_t r = l - f;
6153 if (r >= n)
6154 {
6155 *f++ = 's';
6156 *f++ = 't';
6157 *f++ = 'd';
6158 *f++ = ':';
6159 *f++ = ':';
6160 *f++ = 'a';
6161 *f++ = 'l';
6162 *f++ = 'l';
6163 *f++ = 'o';
6164 *f++ = 'c';
6165 *f++ = 'a';
6166 *f++ = 't';
6167 *f++ = 'o';
6168 *f = 'r';
6169 }
6170 return n;
6171 }
6172};
6173
6174class __sub_basic_string
6175 : public __node
6176{
6177 static const ptrdiff_t n = sizeof("std::basic_string") - 1;
6178public:
6179
6180 virtual size_t first_size() const
6181 {
6182 return n;
6183 }
6184 virtual char* first_demangled_name(char* buf) const
6185 {
6186 strncpy(buf, "std::basic_string", n);
6187 return buf + n;
6188 }
6189 virtual ptrdiff_t print_first(char* f, char* l) const
6190 {
6191 const ptrdiff_t r = l - f;
6192 if (r >= n)
6193 {
6194 *f++ = 's';
6195 *f++ = 't';
6196 *f++ = 'd';
6197 *f++ = ':';
6198 *f++ = ':';
6199 *f++ = 'b';
6200 *f++ = 'a';
6201 *f++ = 's';
6202 *f++ = 'i';
6203 *f++ = 'c';
6204 *f++ = '_';
6205 *f++ = 's';
6206 *f++ = 't';
6207 *f++ = 'r';
6208 *f++ = 'i';
6209 *f++ = 'n';
6210 *f = 'g';
6211 }
6212 return n;
6213 }
6214};
6215
6216class __sub_string
6217 : public __node
6218{
6219 static const size_t n = sizeof("std::string") - 1;
6220 static const size_t ne = sizeof("std::basic_string<char, std::char_traits<char>, std::allocator<char> >") - 1;
6221public:
6222
6223 virtual size_t first_size() const
6224 {
6225 if (__size_)
6226 return ne;
6227 return n;
6228 }
6229 virtual char* first_demangled_name(char* buf) const
6230 {
6231 if (__size_)
6232 {
6233 strncpy(buf, "std::basic_string<char, std::char_traits<char>, std::allocator<char> >", ne);
6234 buf += ne;
6235 }
6236 else
6237 {
6238 strncpy(buf, "std::string", n);
6239 buf += n;
6240 }
6241 return buf;
6242 }
6243
6244 virtual ptrdiff_t print_first(char* f, char* l) const
6245 {
6246 const ptrdiff_t r = l - f;
6247 if (__size_)
6248 {
6249 const ptrdiff_t n1 =
6250 sizeof("std::basic_string<char, std::char_traits<char>,"
6251 " std::allocator<char> >") - 1;
6252 if (r >= n1)
6253 strncpy(f, "std::basic_string<char, std::char_traits<char>,"
6254 " std::allocator<char> >", n1);
6255 return n1;
6256 }
6257 const ptrdiff_t n2 = sizeof("std::string") - 1;
6258 if (r >= n2)
6259 {
6260 *f++ = 's';
6261 *f++ = 't';
6262 *f++ = 'd';
6263 *f++ = ':';
6264 *f++ = ':';
6265 *f++ = 's';
6266 *f++ = 't';
6267 *f++ = 'r';
6268 *f++ = 'i';
6269 *f++ = 'n';
6270 *f = 'g';
6271 }
6272 return n2;
6273 }
6274 virtual size_t base_size() const
6275 {
6276 return 12;
6277 }
6278 virtual char* get_base_name(char* buf) const
6279 {
6280 strncpy(buf, "basic_string", 12);
6281 return buf + 12;
6282 }
6283 virtual ptrdiff_t print_base_name(char* f, char* l) const
6284 {
6285 const ptrdiff_t r = l - f;
6286 const ptrdiff_t n = sizeof("basic_string") - 1;
6287 if (r >= n)
6288 {
6289 *f++ = 'b';
6290 *f++ = 'a';
6291 *f++ = 's';
6292 *f++ = 'i';
6293 *f++ = 'c';
6294 *f++ = '_';
6295 *f++ = 's';
6296 *f++ = 't';
6297 *f++ = 'r';
6298 *f++ = 'i';
6299 *f++ = 'n';
6300 *f = 'g';
6301 }
6302 return n;
6303 }
6304
6305 virtual __node* base_name() const
6306 {
6307 const_cast<size_t&>(__size_) = true;
6308 return const_cast<__node*>(static_cast<const __node*>(this));
6309 }
6310};
6311
6312class __sub_istream
6313 : public __node
6314{
6315 static const ptrdiff_t n = sizeof("std::istream") - 1;
6316public:
6317
6318 virtual size_t first_size() const {return n;}
6319 virtual char* first_demangled_name(char* buf) const
6320 {
6321 strncpy(buf, "std::istream", n);
6322 return buf + n;
6323 }
6324 virtual ptrdiff_t print_first(char* f, char* l) const
6325 {
6326 const ptrdiff_t r = l - f;
6327 if (r >= n)
6328 {
6329 *f++ = 's';
6330 *f++ = 't';
6331 *f++ = 'd';
6332 *f++ = ':';
6333 *f++ = ':';
6334 *f++ = 'i';
6335 *f++ = 's';
6336 *f++ = 't';
6337 *f++ = 'r';
6338 *f++ = 'e';
6339 *f++ = 'a';
6340 *f = 'm';
6341 }
6342 return n;
6343 }
6344};
6345
6346class __sub_ostream
6347 : public __node
6348{
6349 static const ptrdiff_t n = sizeof("std::ostream") - 1;
6350public:
6351
6352 virtual size_t first_size() const {return n;}
6353 virtual char* first_demangled_name(char* buf) const
6354 {
6355 strncpy(buf, "std::ostream", n);
6356 return buf + n;
6357 }
6358 virtual ptrdiff_t print_first(char* f, char* l) const
6359 {
6360 const ptrdiff_t r = l - f;
6361 if (r >= n)
6362 {
6363 *f++ = 's';
6364 *f++ = 't';
6365 *f++ = 'd';
6366 *f++ = ':';
6367 *f++ = ':';
6368 *f++ = 'o';
6369 *f++ = 's';
6370 *f++ = 't';
6371 *f++ = 'r';
6372 *f++ = 'e';
6373 *f++ = 'a';
6374 *f = 'm';
6375 }
6376 return n;
6377 }
6378};
6379
6380class __sub_iostream
6381 : public __node
6382{
6383 static const ptrdiff_t n = sizeof("std::iostream") - 1;
6384public:
6385
6386 virtual size_t first_size() const {return n;}
6387 virtual char* first_demangled_name(char* buf) const
6388 {
6389 strncpy(buf, "std::iostream", n);
6390 return buf + n;
6391 }
6392 virtual ptrdiff_t print_first(char* f, char* l) const
6393 {
6394 const ptrdiff_t r = l - f;
6395 if (r >= n)
6396 {
6397 *f++ = 's';
6398 *f++ = 't';
6399 *f++ = 'd';
6400 *f++ = ':';
6401 *f++ = ':';
6402 *f++ = 'i';
6403 *f++ = 'o';
6404 *f++ = 's';
6405 *f++ = 't';
6406 *f++ = 'r';
6407 *f++ = 'e';
6408 *f++ = 'a';
6409 *f = 'm';
6410 }
6411 return n;
6412 }
6413};
6414
6415class __sub
6416 : public __node
6417{
6418public:
6419
6420 explicit __sub(__node* arg)
6421 {
6422 __left_ = arg;
6423 }
6424 explicit __sub(size_t arg)
6425 {
6426 __size_ = arg;
6427 }
6428 virtual size_t first_size() const
6429 {
6430 return __left_->first_size();
6431 }
6432 virtual char* first_demangled_name(char* buf) const
6433 {
6434 return __left_->first_demangled_name(buf);
6435 }
6436 virtual size_t second_size() const
6437 {
6438 return __left_->second_size();
6439 }
6440 virtual char* second_demangled_name(char* buf) const
6441 {
6442 return __left_->second_demangled_name(buf);
6443 }
6444 virtual ptrdiff_t print_first(char* f, char* l) const
6445 {
6446 return __left_->print_first(f, l);
6447 }
6448 virtual ptrdiff_t print_second(char* f, char* l) const
6449 {
6450 return __left_->print_second(f, l);
6451 }
6452 virtual bool ends_with_template() const
6453 {
6454 return __left_->ends_with_template();
6455 }
6456 virtual __node* base_name() const
6457 {
6458 return __left_->base_name();
6459 }
6460 virtual bool is_reference_or_pointer_to_function_or_array() const
6461 {
6462 return __left_->is_reference_or_pointer_to_function_or_array();
6463 }
6464 virtual bool is_function() const
6465 {
6466 return __left_->is_function();
6467 }
6468 virtual bool is_cv_qualifer() const
6469 {
6470 return __left_->is_cv_qualifer();
6471 }
6472 virtual bool is_ctor_dtor_conv() const
6473 {
6474 return __left_->is_ctor_dtor_conv();
6475 }
6476 virtual bool is_array() const
6477 {
6478 return __left_->is_array();
6479 }
6480 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6481 {
6482 if (__left_ == 0)
6483 {
6484 if (__size_ < t_end - t_begin)
6485 {
6486 __left_ = t_begin[__size_];
6487 __size_ = 0;
6488 }
6489 else
6490 return false;
6491 }
6492 return true;
6493 }
6494 virtual size_t list_len() const
6495 {
6496 return __left_->list_len();
6497 }
6498 virtual bool is_sub() const
6499 {
6500 return true;
6501 }
6502};
6503
6504class __unscoped_template_name
6505 : public __node
6506{
6507public:
6508 __unscoped_template_name(__node* name, __node* args)
6509 {__left_ = name; __right_ = args;}
6510
6511 virtual size_t first_size() const
6512 {
6513 if (__cached_size_ == -1)
6514 const_cast<long&>(__cached_size_) = __left_->size() + __right_->size();
6515 return __cached_size_;
6516 }
6517 virtual char* first_demangled_name(char* buf) const
6518 {
6519 buf = __left_->get_demangled_name(buf);
6520 return __right_->get_demangled_name(buf);
6521 }
6522 virtual ptrdiff_t print_first(char* f, char* l) const
6523 {
6524 const ptrdiff_t r = l - f;
6525 ptrdiff_t sz1 = __left_->print(f, l);
6526 if (r < sz1)
6527 return sz1 + __right_->print(l, l);
6528 return sz1 + __right_->print(f + sz1, l);
6529 }
6530 virtual bool ends_with_template() const
6531 {
6532 return __right_->ends_with_template();
6533 }
6534 virtual __node* base_name() const
6535 {
6536 return __left_->base_name();
6537 }
6538 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6539 {
6540 return __left_->fix_forward_references(t_begin, t_end) &&
6541 __right_->fix_forward_references(t_begin, t_end);
6542 }
6543};
6544
6545// length == 0: __left_ == NULL
6546// length == 1: __left_ != NULL, __right_ == NULL
6547// length > 1: __left_ != NULL, __right_ != NULL
6548class __list
6549 : public __node
6550{
6551public:
6552 explicit __list(__node* type)
6553 {__left_ = type;}
6554
6555 virtual size_t first_size() const
6556 {
6557 if (__cached_size_ == -1)
6558 {
6559 if (__left_ == NULL)
6560 const_cast<long&>(__cached_size_) = 0;
6561 else if (__right_ == NULL)
6562 const_cast<long&>(__cached_size_) = __left_->size();
6563 else
6564 {
6565 size_t off = __right_->size();
6566 if (off > 0)
6567 off += 2;
6568 const_cast<long&>(__cached_size_) = __left_->size() + off;
6569 }
6570 }
6571 return __cached_size_;
6572 }
6573 virtual char* first_demangled_name(char* buf) const
6574 {
6575 if (__left_ != NULL)
6576 {
6577 char* t = __left_->get_demangled_name(buf + (__size_ ? 2 : 0));
6578 if (__size_ == 0)
6579 buf = t;
6580 else if (t != buf+2)
6581 {
6582 *buf++ = ',';
6583 *buf++ = ' ';
6584 buf = t;
6585 }
6586 if (__right_)
6587 buf = __right_->get_demangled_name(buf);
6588 }
6589 return buf;
6590 }
6591 virtual ptrdiff_t print_first(char* f, char* l) const
6592 {
6593 if (__left_ == 0)
6594 return 0;
6595 const ptrdiff_t r = l - f;
6596 ptrdiff_t n = 0;
6597 if (__size_)
6598 {
6599 n = 2;
6600 if (r < n)
6601 {
6602 ptrdiff_t sz1 = __left_->print(l, l);
6603 if (sz1 == 0)
6604 n = 0;
6605 return n + sz1 + (__right_ ? __right_->print(l, l) : 0);
6606 }
6607 }
6608 const ptrdiff_t sz1 = __left_->print(f+n, l);
6609 if (sz1 == 0)
6610 n = 0;
6611 else if (n != 0)
6612 {
6613 f[0] = ',';
6614 f[1] = ' ';
6615 }
6616 const ptrdiff_t sz2 = __right_ ? __right_->print(f+std::min(n+sz1, r), l) : 0;
6617 return n + sz1 + sz2;
6618 }
6619 virtual bool ends_with_template() const
6620 {
6621 if (__right_ != NULL)
6622 return __right_->ends_with_template();
6623 if (__left_ != NULL)
6624 return __left_->ends_with_template();
6625 return false;
6626 }
6627 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6628 {
6629 bool r = true;
6630 if (__left_)
6631 r = r && __left_->fix_forward_references(t_begin, t_end);
6632 if (__right_)
6633 r = r && __right_->fix_forward_references(t_begin, t_end);
6634 return r;
6635 }
6636 virtual size_t list_len() const
6637 {
6638 if (!__left_)
6639 return 0;
6640 if (!__right_)
6641 return 1;
6642 return 1 + __right_->list_len();
6643 }
6644};
6645
6646class __template_args
6647 : public __node
6648{
6649public:
6650 __template_args(__node* name, __node* list)
6651 {
6652 __left_ = name;
6653 __right_ = list;
6654 }
6655
6656 virtual size_t first_size() const
6657 {
6658 if (__cached_size_ == -1)
6659 {
6660 size_t off = 2;
6661 if (__right_)
6662 {
6663 if (__right_->ends_with_template())
6664 ++off;
6665 off += __right_->size();
6666 }
6667 const_cast<long&>(__cached_size_) = __left_->size() + off;
6668 }
6669 return __cached_size_;
6670 }
6671 virtual char* first_demangled_name(char* buf) const
6672 {
6673 buf = __left_->get_demangled_name(buf);
6674 *buf++ = '<';
6675 if (__right_)
6676 {
6677 buf = __right_->get_demangled_name(buf);
6678 if (buf[-1] == '>')
6679 *buf++ = ' ';
6680 }
6681 *buf++ = '>';
6682 return buf;
6683 }
6684 virtual ptrdiff_t print_first(char* f, char* l) const
6685 {
6686 const ptrdiff_t r = l - f;
6687 const ptrdiff_t sz1 = __left_->print(f, l);
6688 ptrdiff_t sz2 = 0;
6689 ptrdiff_t n = 2;
6690 if (__right_)
6691 {
6692 sz2 = __right_->print(f+std::min(sz1+1, r), l);
6693 if (r >= sz1 + sz2 + 2)
6694 {
6695 if (f[sz1+sz2] == '>')
6696 {
6697 f[sz1+sz2+1] = ' ';
6698 ++n;
6699 }
6700 }
6701 else if (__right_->ends_with_template())
6702 ++n;
6703 }
6704 if (r >= sz1 + sz2 + n)
6705 {
6706 f[sz1] = '<';
6707 f[sz1+sz2+n-1] = '>';
6708 }
6709 return n + sz1 + sz2;
6710 }
6711
6712 virtual bool ends_with_template() const
6713 {
6714 return true;
6715 }
6716 virtual __node* base_name() const
6717 {
6718 return __left_->base_name();
6719 }
6720 virtual bool is_ctor_dtor_conv() const
6721 {
6722 return __left_->is_ctor_dtor_conv();
6723 }
6724 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6725 {
6726 bool r = __left_->fix_forward_references(t_begin, t_end);
6727 if (__right_)
6728 r = r && __right_->fix_forward_references(t_begin, t_end);
6729 return r;
6730 }
6731};
6732
6733class __function_args
6734 : public __node
6735{
6736public:
6737 __function_args(__node* list)
6738 {__right_ = list;}
6739
6740 virtual size_t first_size() const
6741 {
6742 if (__cached_size_ == -1)
6743 const_cast<long&>(__cached_size_) = 2 + __right_->size();
6744 return __cached_size_;
6745 }
6746 virtual char* first_demangled_name(char* buf) const
6747 {
6748 *buf++ = '(';
6749 buf = __right_->get_demangled_name(buf);
6750 *buf++ = ')';
6751 return buf;
6752 }
6753 virtual ptrdiff_t print_first(char* f, char* l) const
6754 {
6755 const ptrdiff_t r = l - f;
6756 const ptrdiff_t n = 2;
6757 if (r < n)
6758 return n + __right_->print(l, l);
6759 ptrdiff_t sz1 = __right_->print(f+1, l);
6760 if (r >= n + sz1)
6761 {
6762 *f = '(';
6763 f += 1 + sz1;
6764 *f = ')';
6765 }
6766 return n + sz1;
6767 }
6768 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6769 {
6770 return __right_->fix_forward_references(t_begin, t_end);
6771 }
6772};
6773
6774class __cv_qualifiers
6775 : public __node
6776{
6777public:
6778 __cv_qualifiers(size_t cv, __node* type)
6779 {
6780 __left_ = type;
6781 __size_ = __left_->is_function() ? cv << 5 : cv;
6782 }
6783
6784 virtual size_t first_size() const
6785 {
6786 size_t s = __left_->first_size();
6787 if (__size_ & 4)
6788 s += sizeof(" restrict")-1;
6789 if (__size_ & 2)
6790 s += sizeof(" volatile")-1;
6791 if (__size_ & 1)
6792 s += sizeof(" const")-1;
6793 if (__size_ & 8)
6794 s += sizeof(" &")-1;
6795 if (__size_ & 16)
6796 s += sizeof(" &&")-1;
6797 return s;
6798 }
6799 virtual char* first_demangled_name(char* buf) const
6800 {
6801 buf = __left_->first_demangled_name(buf);
6802 if (__size_ & 1)
6803 {
6804 const size_t n = sizeof(" const")-1;
6805 strncpy(buf, " const", n);
6806 buf += n;
6807 }
6808 if (__size_ & 2)
6809 {
6810 const size_t n = sizeof(" volatile")-1;
6811 strncpy(buf, " volatile", n);
6812 buf += n;
6813 }
6814 if (__size_ & 4)
6815 {
6816 const size_t n = sizeof(" restrict")-1;
6817 strncpy(buf, " restrict", n);
6818 buf += n;
6819 }
6820 if (__size_ & 8)
6821 {
6822 *buf++ = ' ';
6823 *buf++ = '&';
6824 }
6825 if (__size_ & 16)
6826 {
6827 *buf++ = ' ';
6828 *buf++ = '&';
6829 *buf++ = '&';
6830 }
6831 return buf;
6832 }
6833 virtual ptrdiff_t print_first(char* f, char* l) const
6834 {
6835 const ptrdiff_t r = l - f;
6836 const ptrdiff_t sz = __left_->print_first(f, l);
6837 ptrdiff_t n = 0;
6838 if (__size_ & 0x1F)
6839 {
6840 if (__size_ & 1)
6841 {
6842 const ptrdiff_t d = sizeof(" const")-1;
6843 if (r >= sz + n + d)
6844 {
6845 char* t = f + sz + n;
6846 *t++ = ' ';
6847 *t++ = 'c';
6848 *t++ = 'o';
6849 *t++ = 'n';
6850 *t++ = 's';
6851 *t = 't';
6852 }
6853 n += d;
6854 }
6855 if (__size_ & 2)
6856 {
6857 const ptrdiff_t d = sizeof(" volatile")-1;
6858 if (r >= sz + n + d)
6859 {
6860 char* t = f + sz + n;
6861 *t++ = ' ';
6862 *t++ = 'v';
6863 *t++ = 'o';
6864 *t++ = 'l';
6865 *t++ = 'a';
6866 *t++ = 't';
6867 *t++ = 'i';
6868 *t++ = 'l';
6869 *t = 'e';
6870 }
6871 n += d;
6872 }
6873 if (__size_ & 4)
6874 {
6875 const ptrdiff_t d = sizeof(" restrict")-1;
6876 if (r >= sz + n + d)
6877 {
6878 char* t = f + sz + n;
6879 *t++ = ' ';
6880 *t++ = 'r';
6881 *t++ = 'e';
6882 *t++ = 's';
6883 *t++ = 't';
6884 *t++ = 'r';
6885 *t++ = 'i';
6886 *t++ = 'c';
6887 *t = 't';
6888 }
6889 n += d;
6890 }
6891 if (__size_ & 8)
6892 {
6893 const ptrdiff_t d = sizeof(" &")-1;
6894 if (r >= sz + n + d)
6895 {
6896 char* t = f + sz + n;
6897 *t++ = ' ';
6898 *t = '&';
6899 }
6900 n += d;
6901 }
6902 if (__size_ & 16)
6903 {
6904 const ptrdiff_t d = sizeof(" &&")-1;
6905 if (r >= sz + n + d)
6906 {
6907 char* t = f + sz + n;
6908 *t++ = ' ';
6909 *t++ = '&';
6910 *t = '&';
6911 }
6912 n += d;
6913 }
6914 }
6915 return n + sz;
6916 }
6917 virtual size_t second_size() const
6918 {
6919 size_t s = __left_->second_size();
6920 if (__size_ & 128)
6921 s += sizeof(" restrict")-1;
6922 if (__size_ & 64)
6923 s += sizeof(" volatile")-1;
6924 if (__size_ & 32)
6925 s += sizeof(" const")-1;
6926 if (__size_ & 256)
6927 s += sizeof(" &")-1;
6928 if (__size_ & 512)
6929 s += sizeof(" &&")-1;
6930 return s;
6931 }
6932 virtual char* second_demangled_name(char* buf) const
6933 {
6934 buf = __left_->second_demangled_name(buf);
6935 if (__size_ & 32)
6936 {
6937 const size_t n = sizeof(" const")-1;
6938 strncpy(buf, " const", n);
6939 buf += n;
6940 }
6941 if (__size_ & 64)
6942 {
6943 const size_t n = sizeof(" volatile")-1;
6944 strncpy(buf, " volatile", n);
6945 buf += n;
6946 }
6947 if (__size_ & 128)
6948 {
6949 const size_t n = sizeof(" restrict")-1;
6950 strncpy(buf, " restrict", n);
6951 buf += n;
6952 }
6953 if (__size_ & 256)
6954 {
6955 *buf++ = ' ';
6956 *buf++ = '&';
6957 }
6958 if (__size_ & 512)
6959 {
6960 *buf++ = ' ';
6961 *buf++ = '&';
6962 *buf++ = '&';
6963 }
6964 return buf;
6965 }
6966 virtual ptrdiff_t print_second(char* f, char* l) const
6967 {
6968 const ptrdiff_t r = l - f;
6969 const ptrdiff_t sz = __left_->print_second(f, l);
6970 ptrdiff_t n = 0;
6971 if (__size_ & 0x3E0)
6972 {
6973 if (__size_ & 32)
6974 {
6975 const ptrdiff_t d = sizeof(" const")-1;
6976 if (r >= sz + n + d)
6977 {
6978 char* t = f + sz + n;
6979 *t++ = ' ';
6980 *t++ = 'c';
6981 *t++ = 'o';
6982 *t++ = 'n';
6983 *t++ = 's';
6984 *t = 't';
6985 }
6986 n += d;
6987 }
6988 if (__size_ & 64)
6989 {
6990 const ptrdiff_t d = sizeof(" volatile")-1;
6991 if (r >= sz + n + d)
6992 {
6993 char* t = f + sz + n;
6994 *t++ = ' ';
6995 *t++ = 'v';
6996 *t++ = 'o';
6997 *t++ = 'l';
6998 *t++ = 'a';
6999 *t++ = 't';
7000 *t++ = 'i';
7001 *t++ = 'l';
7002 *t = 'e';
7003 }
7004 n += d;
7005 }
7006 if (__size_ & 128)
7007 {
7008 const ptrdiff_t d = sizeof(" restrict")-1;
7009 if (r >= sz + n + d)
7010 {
7011 char* t = f + sz + n;
7012 *t++ = ' ';
7013 *t++ = 'r';
7014 *t++ = 'e';
7015 *t++ = 's';
7016 *t++ = 't';
7017 *t++ = 'r';
7018 *t++ = 'i';
7019 *t++ = 'c';
7020 *t = 't';
7021 }
7022 n += d;
7023 }
7024 if (__size_ & 256)
7025 {
7026 const ptrdiff_t d = sizeof(" &")-1;
7027 if (r >= sz + n + d)
7028 {
7029 char* t = f + sz + n;
7030 *t++ = ' ';
7031 *t = '&';
7032 }
7033 n += d;
7034 }
7035 if (__size_ & 512)
7036 {
7037 const ptrdiff_t d = sizeof(" &&")-1;
7038 if (r >= sz + n + d)
7039 {
7040 char* t = f + sz + n;
7041 *t++ = ' ';
7042 *t++ = '&';
7043 *t = '&';
7044 }
7045 n += d;
7046 }
7047 }
7048 return n + sz;
7049 }
7050 virtual __node* base_name() const
7051 {
7052 return __left_->base_name();
7053 }
7054 virtual bool is_reference_or_pointer_to_function_or_array() const
7055 {
7056 return __left_->is_reference_or_pointer_to_function_or_array();
7057 }
7058 virtual bool is_function() const
7059 {
7060 return __left_->is_function();
7061 }
7062 virtual bool is_cv_qualifer() const
7063 {
7064 return true;
7065 }
7066 virtual __node* extract_cv(__node*& rt) const
7067 {
7068 if (rt == this)
7069 {
7070 rt = __left_;
7071 return const_cast<__node*>(static_cast<const __node*>(this));
7072 }
7073 return 0;
7074 }
7075 virtual bool ends_with_template() const
7076 {
7077 return __left_->ends_with_template();
7078 }
7079 virtual bool is_ctor_dtor_conv() const
7080 {
7081 return __left_->is_ctor_dtor_conv();
7082 }
7083 virtual bool is_array() const
7084 {
7085 return __left_->is_array();
7086 }
7087 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7088 {
7089 return __left_->fix_forward_references(t_begin, t_end);
7090 }
7091 virtual size_t list_len() const
7092 {
7093 return __left_->list_len();
7094 }
7095};
7096
7097class __extended_qualifier
7098 : public __node
7099{
7100public:
7101 __extended_qualifier(__node* name, __node* type)
7102 {
7103 __left_ = type;
7104 __right_ = name;
7105 __size_ = __left_->is_function() ? 1 : 0;
7106 }
7107
7108 virtual size_t first_size() const
7109 {
7110 size_t s = __left_->first_size();
7111 if (__size_ == 0)
7112 s += __right_->size() + 1;
7113 return s;
7114 }
7115 virtual char* first_demangled_name(char* buf) const
7116 {
7117 buf = __left_->first_demangled_name(buf);
7118 if (__size_ == 0)
7119 {
7120 *buf++ = ' ';
7121 buf = __right_->get_demangled_name(buf);
7122 }
7123 return buf;
7124 }
7125 virtual ptrdiff_t print_first(char* f, char* l) const
7126 {
7127 const ptrdiff_t r = l - f;
7128 const ptrdiff_t sz1 = __left_->print_first(f, l);
7129 ptrdiff_t sz2 = 0;
7130 ptrdiff_t n = 0;
7131 if (__size_ == 0)
7132 {
7133 if (r < sz1 + 1)
7134 return sz1 + 1 + __right_->print(l, l);
7135 sz2 = __right_->print(f+1+sz1, l);
7136 n = 1;
7137 f[sz1] = ' ';
7138 }
7139 return n + sz1 + sz2;
7140 }
7141 virtual size_t second_size() const
7142 {
7143 size_t s = __left_->second_size();
7144 if (__size_ == 1)
7145 s += __right_->size() + 1;
7146 return s;
7147 }
7148 virtual char* second_demangled_name(char* buf) const
7149 {
7150 buf = __left_->second_demangled_name(buf);
7151 if (__size_ == 1)
7152 {
7153 *buf++ = ' ';
7154 buf = __right_->get_demangled_name(buf);
7155 }
7156 return buf;
7157 }
7158 virtual ptrdiff_t print_second(char* f, char* l) const
7159 {
7160 const ptrdiff_t r = l - f;
7161 const ptrdiff_t sz1 = __left_->print_second(f, l);
7162 ptrdiff_t sz2 = 0;
7163 ptrdiff_t n = 0;
7164 if (__size_ == 1)
7165 {
7166 if (r < sz1 + 1)
7167 return sz1 + 1 + __right_->print(l, l);
7168 sz2 = __right_->print(f+1+sz1, l);
7169 n = 1;
7170 f[sz1] = ' ';
7171 }
7172 return n + sz1 + sz2;
7173 }
7174 virtual __node* base_name() const
7175 {
7176 return __left_->base_name();
7177 }
7178 virtual bool is_reference_or_pointer_to_function_or_array() const
7179 {
7180 return __left_->is_reference_or_pointer_to_function_or_array();
7181 }
7182 virtual bool is_function() const
7183 {
7184 return __left_->is_function();
7185 }
7186 virtual bool is_cv_qualifer() const
7187 {
7188 return true;
7189 }
7190 virtual __node* extract_cv(__node*& rt) const
7191 {
7192 if (rt == this)
7193 {
7194 rt = __left_;
7195 return const_cast<__node*>(static_cast<const __node*>(this));
7196 }
7197 return 0;
7198 }
7199 virtual bool ends_with_template() const
7200 {
7201 return __left_->ends_with_template();
7202 }
7203 virtual bool is_ctor_dtor_conv() const
7204 {
7205 return __left_->is_ctor_dtor_conv();
7206 }
7207 virtual bool is_array() const
7208 {
7209 return __left_->is_array();
7210 }
7211 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7212 {
7213 return __left_->fix_forward_references(t_begin, t_end);
7214 }
7215 virtual size_t list_len() const
7216 {
7217 return __left_->list_len();
7218 }
7219};
7220
7221class __function
7222 : public __node
7223{
7224public:
7225
7226 __function(__node* name, __node* signature, size_t ret_goes_first = true)
7227 {
7228 __size_ = ret_goes_first;
7229 __left_ = name;
7230 __right_ = signature;
7231 }
7232
7233 virtual size_t first_size() const
7234 {
7235 size_t off = 0;
7236 if (__size_)
7237 {
7238 off = __right_->first_size();
7239 if (off > 0 && (__left_ == NULL ||
7240 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7241 ++off;
7242 }
7243 else
7244 off = 5;
7245 if (__left_)
7246 off += __left_->first_size();
7247 else
7248 ++off;
7249 return off;
7250 }
7251
7252 virtual size_t second_size() const
7253 {
7254 size_t off = 0;
7255 if (__left_ == NULL)
7256 off = 1;
7257 off += __right_->second_size();
7258 if (!__size_)
7259 {
7260 off += 2;
7261 off += __right_->first_size();
7262 }
7263 return off;
7264 }
7265
7266 virtual char* first_demangled_name(char* buf) const
7267 {
7268 if (__size_)
7269 {
7270 const char* t = buf;
7271 buf = __right_->first_demangled_name(buf);
7272 if (buf != t && (__left_ == NULL ||
7273 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7274 *buf++ = ' ';
7275 }
7276 else
7277 {
7278 strncpy(buf, "auto ", 5);
7279 buf += 5;
7280 }
7281 if (__left_)
7282 buf = __left_->first_demangled_name(buf);
7283 else
7284 *buf++ = '(';
7285 return buf;
7286 }
7287 virtual ptrdiff_t print_first(char* f, char* l) const
7288 {
7289 const ptrdiff_t r = l - f;
7290 ptrdiff_t n = 0;
7291 ptrdiff_t sz1 = 0;
7292 ptrdiff_t sz2 = 0;
7293 if (__size_)
7294 {
7295 sz1 = __right_->print_first(f, l);
7296 if (sz1 != 0 && (__left_ == NULL ||
7297 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7298 {
7299 ++n;
7300 if (r >= sz1 + 1)
7301 f[sz1] = ' ';
7302 }
7303 }
7304 else
7305 {
7306 n = 5;
7307 if (r >= 5)
7308 {
7309 char* t = f;
7310 *t++ = 'a';
7311 *t++ = 'u';
7312 *t++ = 't';
7313 *t++ = 'o';
7314 *t++ = ' ';
7315 }
7316 }
7317 if (__left_)
7318 sz2 = __left_->print_first(f + std::min(n + sz1, r), l);
7319 else
7320 {
7321 ++n;
7322 if (r >= n + sz1)
7323 f[n+sz1-1] = '(';
7324 }
7325 return n + sz1 + sz2;
7326 }
7327
7328 virtual char* second_demangled_name(char* buf) const
7329 {
7330 if (__left_ == NULL)
7331 *buf++ = ')';
7332 buf = __right_->second_demangled_name(buf);
7333 if (!__size_)
7334 {
7335 *buf++ = '-';
7336 *buf++ = '>';
7337 buf = __right_->first_demangled_name(buf);
7338 }
7339 return buf;
7340 }
7341 virtual ptrdiff_t print_second(char* f, char* l) const
7342 {
7343 const ptrdiff_t r = l - f;
7344 ptrdiff_t n = 0;
7345 ptrdiff_t sz1 = 0;
7346 ptrdiff_t sz2 = 0;
7347 if (__left_ == NULL)
7348 {
7349 n = 1;
7350 if (r >= 1)
7351 *f = ')';
7352 }
7353 sz1 = __right_->print_second(f+std::min(r, n), l);
7354 if (!__size_)
7355 {
7356 if (r > n+sz1+1)
7357 {
7358 f[n+sz1] = '-';
7359 f[n+sz1+1] = '>';
7360 }
7361 n += 2;
7362 sz2 = __right_->print_first(f+std::min(r, n+sz1), l);
7363 }
7364 return n + sz1 + sz2;
7365 }
7366
7367 virtual bool is_function() const
7368 {
7369 return true;
7370 }
7371 virtual bool is_ctor_dtor_conv() const
7372 {
7373 return __left_->is_ctor_dtor_conv();
7374 }
7375 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7376 {
7377 bool r = true;
7378 if (__left_)
7379 r = r && __left_->fix_forward_references(t_begin, t_end);
7380 r = r && __right_->fix_forward_references(t_begin, t_end);
7381 return r;
7382 }
7383};
7384
7385class __function_signature
7386 : public __node
7387{
7388public:
7389 __function_signature(__node* ret, __node* args)
7390 {
7391 __left_ = ret;
7392 __right_ = args;
7393 }
7394 virtual size_t first_size() const
7395 {
7396 return __left_ ? __left_->first_size() : 0;
7397 }
7398
7399 virtual size_t second_size() const
7400 {
7401 return 2 + (__right_ ? __right_->size() : 0)
7402 + (__left_ ? __left_->second_size() : 0);
7403 }
7404
7405 virtual char* first_demangled_name(char* buf) const
7406 {
7407 if (__left_)
7408 buf = __left_->first_demangled_name(buf);
7409 return buf;
7410 }
7411 virtual ptrdiff_t print_first(char* f, char* l) const
7412 {
7413 return __left_ ? __left_->print_first(f, l) : 0;
7414 }
7415
7416 virtual char* second_demangled_name(char* buf) const
7417 {
7418 *buf++ = '(';
7419 if (__right_)
7420 buf = __right_->get_demangled_name(buf);
7421 *buf++ = ')';
7422 if (__left_)
7423 buf = __left_->second_demangled_name(buf);
7424 return buf;
7425 }
7426 virtual ptrdiff_t print_second(char* f, char* l) const
7427 {
7428 const ptrdiff_t r = l - f;
7429 const ptrdiff_t sz1 = __right_ ? __right_->print(f+std::min<ptrdiff_t>(1, r), l) : 0;
7430 const ptrdiff_t sz2 = __left_ ? __left_->print_second(f+std::min(2+sz1, r), l) : 0;
7431 if (r >= 2 + sz1 + sz2)
7432 {
7433 *f = '(';
7434 f += 1 + sz1;
7435 *f = ')';
7436 }
7437 return 2 + sz1 + sz2;
7438 }
7439 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7440 {
7441 bool r = true;
7442 if (__left_)
7443 r = r && __left_->fix_forward_references(t_begin, t_end);
7444 if (__right_)
7445 r = r && __right_->fix_forward_references(t_begin, t_end);
7446 return r;
7447 }
7448};
7449
7450class __pointer_to
7451 : public __node
7452{
7453public:
7454
7455 explicit __pointer_to(__node* type)
7456 {
7457 __left_ = type;
7458 }
7459 virtual size_t first_size() const
7460 {
7461 return __left_->first_size() + (__left_->is_array() ? 3 : 1);
7462 }
7463 virtual size_t second_size() const
7464 {
7465 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7466 }
7467 virtual char* first_demangled_name(char* buf) const
7468 {
7469 buf = __left_->first_demangled_name(buf);
7470 if (__left_->is_array())
7471 {
7472 *buf++ = ' ';
7473 *buf++ = '(';
7474 *buf++ = '*';
7475 }
7476 else
7477 *buf++ = '*';
7478 return buf;
7479 }
7480 virtual ptrdiff_t print_first(char* f, char* l) const
7481 {
7482 const ptrdiff_t r = l - f;
7483 const ptrdiff_t sz = __left_->print_first(f, l);
7484 ptrdiff_t n;
7485 if (__left_->is_array())
7486 {
7487 n = 3;
7488 if (r >= sz + n)
7489 {
7490 f += sz;
7491 *f++ = ' ';
7492 *f++ = '(';
7493 *f = '*';
7494 }
7495 }
7496 else
7497 {
7498 n = 1;
7499 if (r >= sz + n)
7500 f[sz] = '*';
7501 }
7502 return sz + n;
7503 }
7504 virtual char* second_demangled_name(char* buf) const
7505 {
7506 if (__left_->is_array())
7507 *buf++ = ')';
7508 return __left_->second_demangled_name(buf);
7509 }
7510 virtual ptrdiff_t print_second(char* f, char* l) const
7511 {
7512 const ptrdiff_t r = l - f;
7513 ptrdiff_t n = 0;
7514 if (__left_->is_array())
7515 {
7516 n = 1;
7517 if (r > n)
7518 *f = ')';
7519 }
7520 return __left_->print_second(f + std::min(n, r), l) + n;
7521 }
7522 virtual __node* base_name() const
7523 {
7524 return __left_->base_name();
7525 }
7526 virtual bool is_reference_or_pointer_to_function_or_array() const
7527 {
7528 return __left_->is_function() ||
7529 __left_->is_reference_or_pointer_to_function_or_array();
7530 }
7531 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7532 {
7533 return __left_->fix_forward_references(t_begin, t_end);
7534 }
7535 virtual size_t list_len() const
7536 {
7537 return __left_->list_len();
7538 }
7539};
7540
7541class __lvalue_reference_to
7542 : public __node
7543{
7544public:
7545
7546 explicit __lvalue_reference_to(__node* type)
7547 {
7548 __left_ = type;
7549 }
7550 virtual size_t first_size() const
7551 {
7552 return __left_->first_size() + (__left_->is_array() ? 3 : 1);
7553 }
7554 virtual size_t second_size() const
7555 {
7556 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7557 }
7558 virtual char* first_demangled_name(char* buf) const
7559 {
7560 buf = __left_->first_demangled_name(buf);
7561 if (__left_->is_array())
7562 {
7563 *buf++ = ' ';
7564 *buf++ = '(';
7565 *buf++ = '&';
7566 }
7567 else
7568 *buf++ = '&';
7569 return buf;
7570 }
7571 virtual ptrdiff_t print_first(char* f, char* l) const
7572 {
7573 const ptrdiff_t r = l - f;
7574 const ptrdiff_t sz = __left_->print_first(f, l);
7575 ptrdiff_t n;
7576 if (__left_->is_array())
7577 {
7578 n = 3;
7579 if (r >= sz + n)
7580 {
7581 f += sz;
7582 *f++ = ' ';
7583 *f++ = '(';
7584 *f = '&';
7585 }
7586 }
7587 else
7588 {
7589 n = 1;
7590 if (r >= sz + n)
7591 f[sz] = '&';
7592 }
7593 return sz + n;
7594 }
7595 virtual char* second_demangled_name(char* buf) const
7596 {
7597 if (__left_->is_array())
7598 *buf++ = ')';
7599 return __left_->second_demangled_name(buf);
7600 }
7601 virtual ptrdiff_t print_second(char* f, char* l) const
7602 {
7603 const ptrdiff_t r = l - f;
7604 ptrdiff_t n = 0;
7605 if (__left_->is_array())
7606 {
7607 n = 1;
7608 if (r > n)
7609 *f = ')';
7610 }
7611 return __left_->print_second(f + std::min(n, r), l) + n;
7612 }
7613 virtual __node* base_name() const
7614 {
7615 return __left_->base_name();
7616 }
7617 virtual bool is_reference_or_pointer_to_function_or_array() const
7618 {
7619 return __left_->is_function();
7620 }
7621 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7622 {
7623 return __left_->fix_forward_references(t_begin, t_end);
7624 }
7625 virtual size_t list_len() const
7626 {
7627 return __left_->list_len();
7628 }
7629};
7630
7631class __rvalue_reference_to
7632 : public __node
7633{
7634public:
7635
7636 explicit __rvalue_reference_to(__node* type)
7637 {
7638 __left_ = type;
7639 }
7640 virtual size_t first_size() const
7641 {
7642 return __left_->first_size() + (__left_->is_array() ? 4 : 2);
7643 }
7644 virtual size_t second_size() const
7645 {
7646 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7647 }
7648 virtual char* first_demangled_name(char* buf) const
7649 {
7650 buf = __left_->first_demangled_name(buf);
7651 if (__left_->is_array())
7652 {
7653 strncpy(buf, " (&&", 4);
7654 buf += 4;
7655 }
7656 else
7657 {
7658 *buf++ = '&';
7659 *buf++ = '&';
7660 }
7661 return buf;
7662 }
7663 virtual ptrdiff_t print_first(char* f, char* l) const
7664 {
7665 const ptrdiff_t r = l - f;
7666 const ptrdiff_t sz = __left_->print_first(f, l);
7667 ptrdiff_t n;
7668 if (__left_->is_array())
7669 {
7670 n = 4;
7671 if (r >= sz + n)
7672 {
7673 f += sz;
7674 *f++ = ' ';
7675 *f++ = '(';
7676 *f++ = '&';
7677 *f = '&';
7678 }
7679 }
7680 else
7681 {
7682 n = 2;
7683 if (r >= sz + n)
7684 {
7685 f += sz;
7686 *f++ = '&';
7687 *f = '&';
7688 }
7689 }
7690 return sz + n;
7691 }
7692 virtual char* second_demangled_name(char* buf) const
7693 {
7694 if (__left_->is_array())
7695 *buf++ = ')';
7696 return __left_->second_demangled_name(buf);
7697 }
7698 virtual ptrdiff_t print_second(char* f, char* l) const
7699 {
7700 const ptrdiff_t r = l - f;
7701 ptrdiff_t n = 0;
7702 if (__left_->is_array())
7703 {
7704 n = 1;
7705 if (r > n)
7706 *f = ')';
7707 }
7708 return __left_->print_second(f + std::min(n, r), l) + n;
7709 }
7710 virtual __node* base_name() const
7711 {
7712 return __left_->base_name();
7713 }
7714 virtual bool is_reference_or_pointer_to_function_or_array() const
7715 {
7716 return __left_->is_function();
7717 }
7718 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7719 {
7720 return __left_->fix_forward_references(t_begin, t_end);
7721 }
7722 virtual size_t list_len() const
7723 {
7724 return __left_->list_len();
7725 }
7726};
7727
7728class __d_complex
7729 : public __node
7730{
7731 static const size_t n = sizeof(" complex") - 1;
7732public:
7733
7734 explicit __d_complex(__node* type)
7735 {
7736 __left_ = type;
7737 }
7738 virtual size_t first_size() const
7739 {
7740 if (__cached_size_ == -1)
7741 const_cast<long&>(__cached_size_) = n + __left_->size();
7742 return __cached_size_;
7743 }
7744 virtual char* first_demangled_name(char* buf) const
7745 {
7746 buf = __left_->get_demangled_name(buf);
7747 strncpy(buf, " complex", n);
7748 return buf + n;
7749 }
7750 virtual ptrdiff_t print_first(char* f, char* l) const
7751 {
7752 const ptrdiff_t r = l - f;
7753 const ptrdiff_t sz = __left_->print(f, l);
7754 const ptrdiff_t n = sizeof(" complex") - 1;
7755 if (r >= sz + n)
7756 {
7757 f += sz;
7758 *f++ = ' ';
7759 *f++ = 'c';
7760 *f++ = 'o';
7761 *f++ = 'm';
7762 *f++ = 'p';
7763 *f++ = 'l';
7764 *f++ = 'e';
7765 *f = 'x';
7766 }
7767 return sz + n;
7768 }
7769 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7770 {
7771 return __left_->fix_forward_references(t_begin, t_end);
7772 }
7773};
7774
7775class __imaginary
7776 : public __node
7777{
7778 static const size_t n = sizeof(" imaginary") - 1;
7779public:
7780
7781 explicit __imaginary(__node* type)
7782 {
7783 __left_ = type;
7784 }
7785 virtual size_t first_size() const
7786 {
7787 if (__cached_size_ == -1)
7788 const_cast<long&>(__cached_size_) = n + __left_->size();
7789 return __cached_size_;
7790 }
7791 virtual char* first_demangled_name(char* buf) const
7792 {
7793 buf = __left_->get_demangled_name(buf);
7794 strncpy(buf, " imaginary", n);
7795 return buf + n;
7796 }
7797 virtual ptrdiff_t print_first(char* f, char* l) const
7798 {
7799 const ptrdiff_t r = l - f;
7800 const ptrdiff_t sz = __left_->print(f, l);
7801 const ptrdiff_t n = sizeof(" imaginary") - 1;
7802 if (r >= sz + n)
7803 {
7804 f += sz;
7805 *f++ = ' ';
7806 *f++ = 'i';
7807 *f++ = 'm';
7808 *f++ = 'a';
7809 *f++ = 'g';
7810 *f++ = 'i';
7811 *f++ = 'n';
7812 *f++ = 'a';
7813 *f++ = 'r';
7814 *f = 'y';
7815 }
7816 return sz + n;
7817 }
7818 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7819 {
7820 return __left_->fix_forward_references(t_begin, t_end);
7821 }
7822};
7823
7824class __pack_expansion
7825 : public __node
7826{
7827public:
7828
7829 explicit __pack_expansion(__node* type)
7830 {
7831 __left_ = type;
7832 }
7833 virtual size_t first_size() const
7834 {
7835 if (__cached_size_ == -1)
7836 {
7837 size_t len = __left_->list_len();
7838 size_t off = 0;
7839 if (len != 0)
7840 {
7841 if (__left_->is_sub() || len == 1)
7842 off = __left_->size();
7843 else
7844 {
7845 __node* top = __left_;
7846 __node* bottom = top;
7847 while (!bottom->__left_->is_sub())
7848 bottom = bottom->__left_;
7849 __node* sub = bottom->__left_;
7850 __node* i = sub->__left_;
7851 bool first = true;
7852 top->reset_cached_size();
7853 while (i)
7854 {
7855 if (!first)
7856 off += 2;
7857 bottom->__left_ = i->__left_;
7858 off += top->size();
7859 top->reset_cached_size();
7860 i = i->__right_;
7861 first = false;
7862 }
7863 bottom->__left_ = sub;
7864 }
7865 }
7866 const_cast<long&>(__cached_size_) = off;
7867 }
7868 return __cached_size_;
7869 }
7870 virtual char* first_demangled_name(char* buf) const
7871 {
7872 size_t len = __left_->list_len();
7873 if (len != 0)
7874 {
7875 if (__left_->is_sub() || len == 1)
7876 buf = __left_->get_demangled_name(buf);
7877 else
7878 {
7879 __node* top = __left_;
7880 __node* bottom = top;
7881 while (!bottom->__left_->is_sub())
7882 bottom = bottom->__left_;
7883 __node* sub = bottom->__left_;
7884 __node* i = sub->__left_;
7885 bool first = true;
7886 top->reset_cached_size();
7887 while (i)
7888 {
7889 if (!first)
7890 {
7891 *buf++ = ',';
7892 *buf++ = ' ';
7893 }
7894 bottom->__left_ = i->__left_;
7895 buf = top->get_demangled_name(buf);
7896 top->reset_cached_size();
7897 i = i->__right_;
7898 first = false;
7899 }
7900 bottom->__left_ = sub;
7901 }
7902 }
7903 return buf;
7904 }
7905 virtual ptrdiff_t print_first(char* f, char* l) const
7906 {
7907 const ptrdiff_t r = l - f;
7908 const ptrdiff_t len = __left_->list_len();
7909 ptrdiff_t sz = 0;
7910 if (len != 0)
7911 {
7912 if (__left_->is_sub() || len == 1)
7913 sz = __left_->print(f, l);
7914 else
7915 {
7916 __node* top = __left_;
7917 __node* bottom = top;
7918 while (!bottom->__left_->is_sub())
7919 bottom = bottom->__left_;
7920 __node* sub = bottom->__left_;
7921 __node* i = sub->__left_;
7922 bool first = true;
7923 while (i)
7924 {
7925 if (!first)
7926 {
7927 if (r >= sz+2)
7928 {
7929 f[sz] = ',';
7930 f[sz+1] = ' ';
7931 }
7932 sz += 2;
7933 }
7934 bottom->__left_ = i->__left_;
7935 sz += top->print(f+std::min(sz, r), l);
7936 i = i->__right_;
7937 first = false;
7938 }
7939 bottom->__left_ = sub;
7940 }
7941 }
7942 return sz;
7943 }
7944 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7945 {
7946 return __left_->fix_forward_references(t_begin, t_end);
7947 }
7948};
7949
7950class __void
7951 : public __node
7952{
7953 static const size_t n = sizeof("void") - 1;
7954public:
7955
7956 virtual size_t first_size() const {return n;}
7957 virtual char* first_demangled_name(char* buf) const
7958 {
7959 strncpy(buf, "void", n);
7960 return buf + n;
7961 }
7962 virtual ptrdiff_t print_first(char* f, char* l) const
7963 {
7964 const ptrdiff_t r = l - f;
7965 if (r >= n)
7966 {
7967 *f++ = 'v';
7968 *f++ = 'o';
7969 *f++ = 'i';
7970 *f = 'd';
7971 }
7972 return n;
7973 }
7974};
7975
7976class __wchar_t
7977 : public __node
7978{
7979 static const size_t n = sizeof("wchar_t") - 1;
7980public:
7981
7982 virtual size_t first_size() const {return n;}
7983 virtual char* first_demangled_name(char* buf) const
7984 {
7985 strncpy(buf, "wchar_t", n);
7986 return buf + n;
7987 }
7988 virtual ptrdiff_t print_first(char* f, char* l) const
7989 {
7990 const ptrdiff_t r = l - f;
7991 if (r >= n)
7992 {
7993 *f++ = 'w';
7994 *f++ = 'c';
7995 *f++ = 'h';
7996 *f++ = 'a';
7997 *f++ = 'r';
7998 *f++ = '_';
7999 *f = 't';
8000 }
8001 return n;
8002 }
8003};
8004
8005class __wchar_t_literal
8006 : public __node
8007{
8008public:
8009 explicit __wchar_t_literal(const char* __first, const char* __last)
8010 {
8011 __name_ = __first;
8012 __size_ = __last - __first;
8013 }
8014
8015 virtual size_t first_size() const
8016 {
8017 return __size_+9;
8018 }
8019 virtual char* first_demangled_name(char* buf) const
8020 {
8021 strncpy(buf, "(wchar_t)", 9);
8022 buf += 9;
8023 strncpy(buf, __name_, __size_);
8024 return buf + __size_;
8025 }
8026 virtual ptrdiff_t print_first(char* f, char* l) const
8027 {
8028 const ptrdiff_t r = l - f;
8029 const ptrdiff_t n = sizeof("(wchar_t)") - 1;
8030 if (r >= n + __size_)
8031 {
8032 *f++ = '(';
8033 *f++ = 'w';
8034 *f++ = 'c';
8035 *f++ = 'h';
8036 *f++ = 'a';
8037 *f++ = 'r';
8038 *f++ = '_';
8039 *f++ = 't';
8040 *f++ = ')';
8041 strncpy(f, __name_, __size_);
8042 }
8043 return n + __size_;
8044 }
8045};
8046
8047class __bool
8048 : public __node
8049{
8050 static const size_t n = sizeof("bool") - 1;
8051public:
8052
8053 virtual size_t first_size() const {return n;}
8054 virtual char* first_demangled_name(char* buf) const
8055 {
8056 strncpy(buf, "bool", n);
8057 return buf + n;
8058 }
8059 virtual ptrdiff_t print_first(char* f, char* l) const
8060 {
8061 const ptrdiff_t r = l - f;
8062 if (r >= n)
8063 {
8064 *f++ = 'b';
8065 *f++ = 'o';
8066 *f++ = 'o';
8067 *f = 'l';
8068 }
8069 return n;
8070 }
8071};
8072
8073class __bool_literal
8074 : public __node
8075{
8076public:
8077 explicit __bool_literal(const char* __name, unsigned __size)
8078 {
8079 __name_ = __name;
8080 __size_ = __size;
8081 }
8082
8083 virtual size_t first_size() const
8084 {
8085 return __size_;
8086 }
8087 virtual char* first_demangled_name(char* buf) const
8088 {
8089 strncpy(buf, __name_, __size_);
8090 return buf + __size_;
8091 }
8092 virtual ptrdiff_t print_first(char* f, char* l) const
8093 {
8094 const ptrdiff_t r = l - f;
8095 if (r >= __size_)
8096 strncpy(f, __name_, __size_);
8097 return __size_;
8098 }
8099};
8100
8101class __char
8102 : public __node
8103{
8104 static const size_t n = sizeof("char") - 1;
8105public:
8106
8107 virtual size_t first_size() const {return n;}
8108 virtual char* first_demangled_name(char* buf) const
8109 {
8110 strncpy(buf, "char", n);
8111 return buf + n;
8112 }
8113 virtual ptrdiff_t print_first(char* f, char* l) const
8114 {
8115 const ptrdiff_t r = l - f;
8116 if (r >= n)
8117 {
8118 *f++ = 'c';
8119 *f++ = 'h';
8120 *f++ = 'a';
8121 *f = 'r';
8122 }
8123 return n;
8124 }
8125};
8126
8127class __char_literal
8128 : public __node
8129{
8130public:
8131 explicit __char_literal(const char* __first, const char* __last)
8132 {
8133 __name_ = __first;
8134 __size_ = __last - __first;
8135 }
8136
8137 virtual size_t first_size() const
8138 {
8139 return __size_+6;
8140 }
8141 virtual char* first_demangled_name(char* buf) const
8142 {
8143 strncpy(buf, "(char)", 6);
8144 buf += 6;
8145 if (*__name_ == 'n')
8146 {
8147 *buf++ = '-'; // strncpy(buf+6, "-", 1);
8148 strncpy(buf, __name_+1, __size_-1);
8149 buf += __size_ - 1;
8150 }
8151 else
8152 {
8153 strncpy(buf, __name_, __size_);
8154 buf += __size_;
8155 }
8156 return buf;
8157 }
8158 virtual ptrdiff_t print_first(char* f, char* l) const
8159 {
8160 const ptrdiff_t r = l - f;
8161 const ptrdiff_t n = sizeof("(char)") - 1;
8162 if (r >= __size_ + n)
8163 {
8164 *f++ = '(';
8165 *f++ = 'c';
8166 *f++ = 'h';
8167 *f++ = 'a';
8168 *f++ = 'r';
8169 *f++ = ')';
8170 if (*__name_ == 'n')
8171 {
8172 *f++ = '-';
8173 strncpy(f, __name_+1, __size_-1);
8174 }
8175 else
8176 strncpy(f, __name_, __size_);
8177 }
8178 return __size_ + n;
8179 }
8180};
8181
8182class __signed_char
8183 : public __node
8184{
8185 static const size_t n = sizeof("signed char") - 1;
8186public:
8187
8188 virtual size_t first_size() const {return n;}
8189 virtual char* first_demangled_name(char* buf) const
8190 {
8191 strncpy(buf, "signed char", n);
8192 return buf + n;
8193 }
8194 virtual ptrdiff_t print_first(char* f, char* l) const
8195 {
8196 const ptrdiff_t r = l - f;
8197 if (r >= n)
8198 {
8199 *f++ = 's';
8200 *f++ = 'i';
8201 *f++ = 'g';
8202 *f++ = 'n';
8203 *f++ = 'e';
8204 *f++ = 'd';
8205 *f++ = ' ';
8206 *f++ = 'c';
8207 *f++ = 'h';
8208 *f++ = 'a';
8209 *f = 'r';
8210 }
8211 return n;
8212 }
8213};
8214
8215class __signed_char_literal
8216 : public __node
8217{
8218public:
8219 explicit __signed_char_literal(const char* __first, const char* __last)
8220 {
8221 __name_ = __first;
8222 __size_ = __last - __first;
8223 }
8224
8225 virtual size_t first_size() const
8226 {
8227 return __size_+13;
8228 }
8229 virtual char* first_demangled_name(char* buf) const
8230 {
8231 strncpy(buf, "(signed char)", 13);
8232 buf += 13;
8233 if (*__name_ == 'n')
8234 {
8235 *buf++ = '-';
8236 strncpy(buf, __name_+1, __size_-1);
8237 buf += __size_ - 1;
8238 }
8239 else
8240 {
8241 strncpy(buf, __name_, __size_);
8242 buf += __size_;
8243 }
8244 return buf;
8245 }
8246 virtual ptrdiff_t print_first(char* f, char* l) const
8247 {
8248 const ptrdiff_t r = l - f;
8249 const ptrdiff_t n = sizeof("(signed char)") - 1;
8250 if (r >= __size_ + n)
8251 {
8252 *f++ = '(';
8253 *f++ = 's';
8254 *f++ = 'i';
8255 *f++ = 'g';
8256 *f++ = 'n';
8257 *f++ = 'e';
8258 *f++ = 'd';
8259 *f++ = ' ';
8260 *f++ = 'c';
8261 *f++ = 'h';
8262 *f++ = 'a';
8263 *f++ = 'r';
8264 *f++ = ')';
8265 if (*__name_ == 'n')
8266 {
8267 *f++ = '-';
8268 strncpy(f, __name_+1, __size_-1);
8269 }
8270 else
8271 strncpy(f, __name_, __size_);
8272 }
8273 return __size_ + n;
8274 }
8275};
8276
8277class __unsigned_char
8278 : public __node
8279{
8280 static const size_t n = sizeof("unsigned char") - 1;
8281public:
8282
8283 virtual size_t first_size() const {return n;}
8284 virtual char* first_demangled_name(char* buf) const
8285 {
8286 strncpy(buf, "unsigned char", n);
8287 return buf + n;
8288 }
8289 virtual ptrdiff_t print_first(char* f, char* l) const
8290 {
8291 const ptrdiff_t r = l - f;
8292 if (r >= n)
8293 {
8294 *f++ = 'u';
8295 *f++ = 'n';
8296 *f++ = 's';
8297 *f++ = 'i';
8298 *f++ = 'g';
8299 *f++ = 'n';
8300 *f++ = 'e';
8301 *f++ = 'd';
8302 *f++ = ' ';
8303 *f++ = 'c';
8304 *f++ = 'h';
8305 *f++ = 'a';
8306 *f = 'r';
8307 }
8308 return n;
8309 }
8310};
8311
8312class __unsigned_char_literal
8313 : public __node
8314{
8315public:
8316 explicit __unsigned_char_literal(const char* __first, const char* __last)
8317 {
8318 __name_ = __first;
8319 __size_ = __last - __first;
8320 }
8321
8322 virtual size_t first_size() const
8323 {
8324 return __size_+15;
8325 }
8326 virtual char* first_demangled_name(char* buf) const
8327 {
8328 strncpy(buf, "(unsigned char)", 15);
8329 buf += 15;
8330 strncpy(buf, __name_, __size_);
8331 return buf + __size_;
8332 }
8333 virtual ptrdiff_t print_first(char* f, char* l) const
8334 {
8335 const ptrdiff_t r = l - f;
8336 const ptrdiff_t n = sizeof("(unsigned char)") - 1;
8337 if (r >= __size_ + n)
8338 {
8339 *f++ = '(';
8340 *f++ = 'u';
8341 *f++ = 'n';
8342 *f++ = 's';
8343 *f++ = 'i';
8344 *f++ = 'g';
8345 *f++ = 'n';
8346 *f++ = 'e';
8347 *f++ = 'd';
8348 *f++ = ' ';
8349 *f++ = 'c';
8350 *f++ = 'h';
8351 *f++ = 'a';
8352 *f++ = 'r';
8353 *f++ = ')';
8354 strncpy(f, __name_, __size_);
8355 }
8356 return __size_ + n;
8357 }
8358};
8359
8360class __short
8361 : public __node
8362{
8363 static const size_t n = sizeof("short") - 1;
8364public:
8365
8366 virtual size_t first_size() const {return n;}
8367 virtual char* first_demangled_name(char* buf) const
8368 {
8369 strncpy(buf, "short", n);
8370 return buf + n;
8371 }
8372 virtual ptrdiff_t print_first(char* f, char* l) const
8373 {
8374 const ptrdiff_t r = l - f;
8375 if (r >= n)
8376 {
8377 *f++ = 's';
8378 *f++ = 'h';
8379 *f++ = 'o';
8380 *f++ = 'r';
8381 *f = 't';
8382 }
8383 return n;
8384 }
8385};
8386
8387class __short_literal
8388 : public __node
8389{
8390public:
8391 explicit __short_literal(const char* __first, const char* __last)
8392 {
8393 __name_ = __first;
8394 __size_ = __last - __first;
8395 }
8396
8397 virtual size_t first_size() const
8398 {
8399 return __size_+7;
8400 }
8401 virtual char* first_demangled_name(char* buf) const
8402 {
8403 strncpy(buf, "(short)", 7);
8404 buf += 7;
8405 if (*__name_ == 'n')
8406 {
8407 *buf++ = '-';
8408 strncpy(buf, __name_+1, __size_-1);
8409 buf += __size_ - 1;
8410 }
8411 else
8412 {
8413 strncpy(buf, __name_, __size_);
8414 buf += __size_;
8415 }
8416 return buf;
8417 }
8418 virtual ptrdiff_t print_first(char* f, char* l) const
8419 {
8420 const ptrdiff_t r = l - f;
8421 const ptrdiff_t n = sizeof("(short)") - 1;
8422 if (r >= __size_ + n)
8423 {
8424 *f++ = '(';
8425 *f++ = 's';
8426 *f++ = 'h';
8427 *f++ = 'o';
8428 *f++ = 'r';
8429 *f++ = 't';
8430 *f++ = ')';
8431 if (*__name_ == 'n')
8432 {
8433 *f++ = '-';
8434 strncpy(f, __name_+1, __size_-1);
8435 }
8436 else
8437 strncpy(f, __name_, __size_);
8438 }
8439 return __size_ + n;
8440 }
8441};
8442
8443class __unsigned_short
8444 : public __node
8445{
8446 static const size_t n = sizeof("unsigned short") - 1;
8447public:
8448
8449 virtual size_t first_size() const {return n;}
8450 virtual char* first_demangled_name(char* buf) const
8451 {
8452 strncpy(buf, "unsigned short", n);
8453 return buf + n;
8454 }
8455 virtual ptrdiff_t print_first(char* f, char* l) const
8456 {
8457 const ptrdiff_t r = l - f;
8458 if (r >= n)
8459 {
8460 *f++ = 'u';
8461 *f++ = 'n';
8462 *f++ = 's';
8463 *f++ = 'i';
8464 *f++ = 'g';
8465 *f++ = 'n';
8466 *f++ = 'e';
8467 *f++ = 'd';
8468 *f++ = ' ';
8469 *f++ = 's';
8470 *f++ = 'h';
8471 *f++ = 'o';
8472 *f++ = 'r';
8473 *f = 't';
8474 }
8475 return n;
8476 }
8477};
8478
8479class __unsigned_short_literal
8480 : public __node
8481{
8482public:
8483 explicit __unsigned_short_literal(const char* __first, const char* __last)
8484 {
8485 __name_ = __first;
8486 __size_ = __last - __first;
8487 }
8488
8489 virtual size_t first_size() const
8490 {
8491 return __size_+16;
8492 }
8493 virtual char* first_demangled_name(char* buf) const
8494 {
8495 strncpy(buf, "(unsigned short)", 16);
8496 buf += 16;
8497 strncpy(buf, __name_, __size_);
8498 return buf + __size_;
8499 }
8500 virtual ptrdiff_t print_first(char* f, char* l) const
8501 {
8502 const ptrdiff_t r = l - f;
8503 const ptrdiff_t n = sizeof("(unsigned short)") - 1;
8504 if (r >= __size_ + n)
8505 {
8506 *f++ = '(';
8507 *f++ = 'u';
8508 *f++ = 'n';
8509 *f++ = 's';
8510 *f++ = 'i';
8511 *f++ = 'g';
8512 *f++ = 'n';
8513 *f++ = 'e';
8514 *f++ = 'd';
8515 *f++ = ' ';
8516 *f++ = 's';
8517 *f++ = 'h';
8518 *f++ = 'o';
8519 *f++ = 'r';
8520 *f++ = 't';
8521 *f++ = ')';
8522 strncpy(f, __name_, __size_);
8523 }
8524 return __size_ + n;
8525 }
8526};
8527
8528class __int
8529 : public __node
8530{
8531 static const size_t n = sizeof("int") - 1;
8532public:
8533
8534 virtual size_t first_size() const {return n;}
8535 virtual char* first_demangled_name(char* buf) const
8536 {
8537 *buf++ = 'i';
8538 *buf++ = 'n';
8539 *buf++ = 't';
8540 return buf;
8541 }
8542 virtual ptrdiff_t print_first(char* f, char* l) const
8543 {
8544 const ptrdiff_t r = l - f;
8545 if (r >= n)
8546 {
8547 *f++ = 'i';
8548 *f++ = 'n';
8549 *f = 't';
8550 }
8551 return n;
8552 }
8553};
8554
8555class __int_literal
8556 : public __node
8557{
8558public:
8559 explicit __int_literal(const char* __first, const char* __last)
8560 {
8561 __name_ = __first;
8562 __size_ = __last - __first;
8563 }
8564
8565 virtual size_t first_size() const
8566 {
8567 return __size_;
8568 }
8569 virtual char* first_demangled_name(char* buf) const
8570 {
8571 if (*__name_ == 'n')
8572 {
8573 *buf++ = '-';
8574 strncpy(buf, __name_+1, __size_-1);
8575 buf += __size_ - 1;
8576 }
8577 else
8578 {
8579 strncpy(buf, __name_, __size_);
8580 buf += __size_;
8581 }
8582 return buf;
8583 }
8584 virtual ptrdiff_t print_first(char* f, char* l) const
8585 {
8586 const ptrdiff_t r = l - f;
8587 if (r >= __size_)
8588 {
8589 if (*__name_ == 'n')
8590 {
8591 *f++ = '-';
8592 strncpy(f, __name_+1, __size_-1);
8593 }
8594 else
8595 strncpy(f, __name_, __size_);
8596 }
8597 return __size_;
8598 }
8599};
8600
8601class __unsigned_int
8602 : public __node
8603{
8604 static const size_t n = sizeof("unsigned int") - 1;
8605public:
8606
8607 virtual size_t first_size() const {return n;}
8608 virtual char* first_demangled_name(char* buf) const
8609 {
8610 strncpy(buf, "unsigned int", n);
8611 return buf + n;
8612 }
8613 virtual ptrdiff_t print_first(char* f, char* l) const
8614 {
8615 const ptrdiff_t r = l - f;
8616 if (r >= n)
8617 {
8618 *f++ = 'u';
8619 *f++ = 'n';
8620 *f++ = 's';
8621 *f++ = 'i';
8622 *f++ = 'g';
8623 *f++ = 'n';
8624 *f++ = 'e';
8625 *f++ = 'd';
8626 *f++ = ' ';
8627 *f++ = 'i';
8628 *f++ = 'n';
8629 *f = 't';
8630 }
8631 return n;
8632 }
8633};
8634
8635class __unsigned_int_literal
8636 : public __node
8637{
8638public:
8639 explicit __unsigned_int_literal(const char* __first, const char* __last)
8640 {
8641 __name_ = __first;
8642 __size_ = __last - __first;
8643 }
8644
8645 virtual size_t first_size() const
8646 {
8647 return __size_+1;
8648 }
8649 virtual char* first_demangled_name(char* buf) const
8650 {
8651 strncpy(buf, __name_, __size_);
8652 buf += __size_;
8653 *buf++ = 'u';
8654 return buf;
8655 }
8656 virtual ptrdiff_t print_first(char* f, char* l) const
8657 {
8658 const ptrdiff_t r = l - f;
8659 const ptrdiff_t n = sizeof("u") - 1;
8660 if (r >= __size_ + n)
8661 {
8662 strncpy(f, __name_, __size_);
8663 f[__size_] = 'u';
8664 }
8665 return __size_ + n;
8666 }
8667};
8668
8669class __long
8670 : public __node
8671{
8672 static const size_t n = sizeof("long") - 1;
8673public:
8674
8675 virtual size_t first_size() const {return n;}
8676 virtual char* first_demangled_name(char* buf) const
8677 {
8678 strncpy(buf, "long", n);
8679 return buf + n;
8680 }
8681 virtual ptrdiff_t print_first(char* f, char* l) const
8682 {
8683 const ptrdiff_t r = l - f;
8684 if (r >= n)
8685 {
8686 *f++ = 'l';
8687 *f++ = 'o';
8688 *f++ = 'n';
8689 *f = 'g';
8690 }
8691 return n;
8692 }
8693};
8694
8695class __long_literal
8696 : public __node
8697{
8698public:
8699 explicit __long_literal(const char* __first, const char* __last)
8700 {
8701 __name_ = __first;
8702 __size_ = __last - __first;
8703 }
8704
8705 virtual size_t first_size() const
8706 {
8707 return __size_+1;
8708 }
8709 virtual char* first_demangled_name(char* buf) const
8710 {
8711 if (*__name_ == 'n')
8712 {
8713 *buf++ = '-'; // strncpy(buf, "-", 1);
8714 strncpy(buf, __name_+1, __size_-1);
8715 buf += __size_ - 1;
8716 }
8717 else
8718 {
8719 strncpy(buf, __name_, __size_);
8720 buf += __size_;
8721 }
8722 *buf++ = 'l';
8723 return buf;
8724 }
8725 virtual ptrdiff_t print_first(char* f, char* l) const
8726 {
8727 const ptrdiff_t r = l - f;
8728 const ptrdiff_t n = sizeof("l") - 1;
8729 if (r >= __size_ + n)
8730 {
8731 if (*__name_ == 'n')
8732 {
8733 *f++ = '-';
8734 strncpy(f, __name_+1, __size_-1);
8735 f += __size_-1;
8736 }
8737 else
8738 {
8739 strncpy(f, __name_, __size_);
8740 f += __size_;
8741 }
8742 *f = 'l';
8743 }
8744 return __size_ + n;
8745 }
8746};
8747
8748class __unsigned_long
8749 : public __node
8750{
8751 static const size_t n = sizeof("unsigned long") - 1;
8752public:
8753
8754 virtual size_t first_size() const {return n;}
8755 virtual char* first_demangled_name(char* buf) const
8756 {
8757 strncpy(buf, "unsigned long", n);
8758 return buf + n;
8759 }
8760 virtual ptrdiff_t print_first(char* f, char* l) const
8761 {
8762 const ptrdiff_t r = l - f;
8763 if (r >= n)
8764 {
8765 *f++ = 'u';
8766 *f++ = 'n';
8767 *f++ = 's';
8768 *f++ = 'i';
8769 *f++ = 'g';
8770 *f++ = 'n';
8771 *f++ = 'e';
8772 *f++ = 'd';
8773 *f++ = ' ';
8774 *f++ = 'l';
8775 *f++ = 'o';
8776 *f++ = 'n';
8777 *f = 'g';
8778 }
8779 return n;
8780 }
8781};
8782
8783class __unsigned_long_literal
8784 : public __node
8785{
8786public:
8787 explicit __unsigned_long_literal(const char* __first, const char* __last)
8788 {
8789 __name_ = __first;
8790 __size_ = __last - __first;
8791 }
8792
8793 virtual size_t first_size() const
8794 {
8795 return __size_+2;
8796 }
8797 virtual char* first_demangled_name(char* buf) const
8798 {
8799 strncpy(buf, __name_, __size_);
8800 buf += __size_;
8801 *buf++ = 'u';
8802 *buf++ = 'l';
8803 return buf;
8804 }
8805 virtual ptrdiff_t print_first(char* f, char* l) const
8806 {
8807 const ptrdiff_t r = l - f;
8808 const ptrdiff_t n = sizeof("ul") - 1;
8809 if (r >= __size_ + n)
8810 {
8811 strncpy(f, __name_, __size_);
8812 f += __size_;
8813 *f++ = 'u';
8814 *f = 'l';
8815 }
8816 return __size_ + n;
8817 }
8818};
8819
8820class __long_long
8821 : public __node
8822{
8823 static const size_t n = sizeof("long long") - 1;
8824public:
8825
8826 virtual size_t first_size() const {return n;}
8827 virtual char* first_demangled_name(char* buf) const
8828 {
8829 strncpy(buf, "long long", n);
8830 return buf + n;
8831 }
8832 virtual ptrdiff_t print_first(char* f, char* l) const
8833 {
8834 const ptrdiff_t r = l - f;
8835 if (r >= n)
8836 {
8837 *f++ = 'l';
8838 *f++ = 'o';
8839 *f++ = 'n';
8840 *f++ = 'g';
8841 *f++ = ' ';
8842 *f++ = 'l';
8843 *f++ = 'o';
8844 *f++ = 'n';
8845 *f = 'g';
8846 }
8847 return n;
8848 }
8849};
8850
8851class __long_long_literal
8852 : public __node
8853{
8854public:
8855 explicit __long_long_literal(const char* __first, const char* __last)
8856 {
8857 __name_ = __first;
8858 __size_ = __last - __first;
8859 }
8860
8861 virtual size_t first_size() const
8862 {
8863 return __size_+2;
8864 }
8865 virtual char* first_demangled_name(char* buf) const
8866 {
8867 if (*__name_ == 'n')
8868 {
8869 *buf++ = '-';
8870 strncpy(buf, __name_+1, __size_-1);
8871 buf += __size_ - 1;
8872 }
8873 else
8874 {
8875 strncpy(buf, __name_, __size_);
8876 buf += __size_;
8877 }
8878 *buf++ = 'l';
8879 *buf++ = 'l';
8880 return buf;
8881 }
8882 virtual ptrdiff_t print_first(char* f, char* l) const
8883 {
8884 const ptrdiff_t r = l - f;
8885 const ptrdiff_t n = sizeof("ll") - 1;
8886 if (r >= __size_ + n)
8887 {
8888 if (*__name_ == 'n')
8889 {
8890 *f++ = '-';
8891 strncpy(f, __name_+1, __size_-1);
8892 f += __size_-1;
8893 }
8894 else
8895 {
8896 strncpy(f, __name_, __size_);
8897 f += __size_;
8898 }
8899 *f++ = 'l';
8900 *f = 'l';
8901 }
8902 return __size_ + n;
8903 }
8904};
8905
8906class __unsigned_long_long
8907 : public __node
8908{
8909 static const size_t n = sizeof("unsigned long long") - 1;
8910public:
8911
8912 virtual size_t first_size() const {return n;}
8913 virtual char* first_demangled_name(char* buf) const
8914 {
8915 strncpy(buf, "unsigned long long", n);
8916 return buf + n;
8917 }
8918 virtual ptrdiff_t print_first(char* f, char* l) const
8919 {
8920 const ptrdiff_t r = l - f;
8921 if (r >= n)
8922 {
8923 *f++ = 'u';
8924 *f++ = 'n';
8925 *f++ = 's';
8926 *f++ = 'i';
8927 *f++ = 'g';
8928 *f++ = 'n';
8929 *f++ = 'e';
8930 *f++ = 'd';
8931 *f++ = ' ';
8932 *f++ = 'l';
8933 *f++ = 'o';
8934 *f++ = 'n';
8935 *f++ = 'g';
8936 *f++ = ' ';
8937 *f++ = 'l';
8938 *f++ = 'o';
8939 *f++ = 'n';
8940 *f = 'g';
8941 }
8942 return n;
8943 }
8944};
8945
8946class __unsigned_long_long_literal
8947 : public __node
8948{
8949public:
8950 explicit __unsigned_long_long_literal(const char* __first, const char* __last)
8951 {
8952 __name_ = __first;
8953 __size_ = __last - __first;
8954 }
8955
8956 virtual size_t first_size() const
8957 {
8958 return __size_+3;
8959 }
8960 virtual char* first_demangled_name(char* buf) const
8961 {
8962 strncpy(buf, __name_, __size_);
8963 buf += __size_;
8964 *buf++ = 'u';
8965 *buf++ = 'l';
8966 *buf++ = 'l';
8967 return buf;
8968 }
8969 virtual ptrdiff_t print_first(char* f, char* l) const
8970 {
8971 const ptrdiff_t r = l - f;
8972 const ptrdiff_t n = sizeof("ull") - 1;
8973 if (r >= __size_ + n)
8974 {
8975 strncpy(f, __name_, __size_);
8976 f += __size_;
8977 *f++ = 'u';
8978 *f++ = 'l';
8979 *f = 'l';
8980 }
8981 return __size_ + n;
8982 }
8983};
8984
8985class __int128
8986 : public __node
8987{
8988 static const size_t n = sizeof("__int128") - 1;
8989public:
8990
8991 virtual size_t first_size() const {return n;}
8992 virtual char* first_demangled_name(char* buf) const
8993 {
8994 strncpy(buf, "__int128", n);
8995 return buf + n;
8996 }
8997 virtual ptrdiff_t print_first(char* f, char* l) const
8998 {
8999 const ptrdiff_t r = l - f;
9000 if (r >= n)
9001 {
9002 *f++ = '_';
9003 *f++ = '_';
9004 *f++ = 'i';
9005 *f++ = 'n';
9006 *f++ = 't';
9007 *f++ = '1';
9008 *f++ = '2';
9009 *f = '8';
9010 }
9011 return n;
9012 }
9013};
9014
9015class __int128_literal
9016 : public __node
9017{
9018public:
9019 explicit __int128_literal(const char* __first, const char* __last)
9020 {
9021 __name_ = __first;
9022 __size_ = __last - __first;
9023 }
9024
9025 virtual size_t first_size() const
9026 {
9027 return __size_+10;
9028 }
9029 virtual char* first_demangled_name(char* buf) const
9030 {
9031 strncpy(buf, "(__int128)", 10);
9032 buf += 10;
9033 if (*__name_ == 'n')
9034 {
9035 *buf++ = '-';
9036 strncpy(buf, __name_+1, __size_-1);
9037 buf += __size_ - 1;
9038 }
9039 else
9040 {
9041 strncpy(buf, __name_, __size_);
9042 buf += __size_;
9043 }
9044 return buf;
9045 }
9046 virtual ptrdiff_t print_first(char* f, char* l) const
9047 {
9048 const ptrdiff_t r = l - f;
9049 const ptrdiff_t n = sizeof("(__int128)") - 1;
9050 if (r >= __size_ + n)
9051 {
9052 *f++ = '(';
9053 *f++ = '_';
9054 *f++ = '_';
9055 *f++ = 'i';
9056 *f++ = 'n';
9057 *f++ = 't';
9058 *f++ = '1';
9059 *f++ = '2';
9060 *f++ = '8';
9061 *f = ')';
9062 if (*__name_ == 'n')
9063 {
9064 *f++ = '-';
9065 strncpy(f, __name_+1, __size_-1);
9066 }
9067 else
9068 strncpy(f, __name_, __size_);
9069 }
9070 return __size_ + n;
9071 }
9072};
9073
9074class __unsigned_int128
9075 : public __node
9076{
9077 static const size_t n = sizeof("unsigned __int128") - 1;
9078public:
9079
9080 virtual size_t first_size() const {return n;}
9081 virtual char* first_demangled_name(char* buf) const
9082 {
9083 strncpy(buf, "unsigned __int128", n);
9084 return buf + n;
9085 }
9086 virtual ptrdiff_t print_first(char* f, char* l) const
9087 {
9088 const ptrdiff_t r = l - f;
9089 if (r >= n)
9090 {
9091 *f++ = 'u';
9092 *f++ = 'n';
9093 *f++ = 's';
9094 *f++ = 'i';
9095 *f++ = 'g';
9096 *f++ = 'n';
9097 *f++ = 'e';
9098 *f++ = 'd';
9099 *f++ = ' ';
9100 *f++ = '_';
9101 *f++ = '_';
9102 *f++ = 'i';
9103 *f++ = 'n';
9104 *f++ = 't';
9105 *f++ = '1';
9106 *f++ = '2';
9107 *f = '8';
9108 }
9109 return n;
9110 }
9111};
9112
9113class __unsigned_int128_literal
9114 : public __node
9115{
9116public:
9117 explicit __unsigned_int128_literal(const char* __first, const char* __last)
9118 {
9119 __name_ = __first;
9120 __size_ = __last - __first;
9121 }
9122
9123 virtual size_t first_size() const
9124 {
9125 return __size_+19;
9126 }
9127 virtual char* first_demangled_name(char* buf) const
9128 {
9129 strncpy(buf, "(unsigned __int128)", 19);
9130 buf += 19;
9131 strncpy(buf, __name_, __size_);
9132 return buf + __size_;
9133 }
9134 virtual ptrdiff_t print_first(char* f, char* l) const
9135 {
9136 const ptrdiff_t r = l - f;
9137 const ptrdiff_t n = sizeof("(unsigned __int128)") - 1;
9138 if (r >= __size_ + n)
9139 {
9140 *f++ = '(';
9141 *f++ = 'u';
9142 *f++ = 'n';
9143 *f++ = 's';
9144 *f++ = 'i';
9145 *f++ = 'g';
9146 *f++ = 'n';
9147 *f++ = 'e';
9148 *f++ = 'd';
9149 *f++ = ' ';
9150 *f++ = '_';
9151 *f++ = '_';
9152 *f++ = 'i';
9153 *f++ = 'n';
9154 *f++ = 't';
9155 *f++ = '1';
9156 *f++ = '2';
9157 *f++ = '8';
9158 *f = ')';
9159 strncpy(f, __name_, __size_);
9160 }
9161 return __size_ + n;
9162 }
9163};
9164
9165class __float_literal
9166 : public __node
9167{
9168public:
9169 explicit __float_literal(float value)
9170 {
9171 __value_ = value;
9172 }
9173
9174 virtual size_t first_size() const
9175 {
9176 if (__cached_size_ == -1)
9177 {
9178 char num[20] = {0};
9179 float v = static_cast<float>(__value_);
9180 const_cast<long&>(__cached_size_) = sprintf(num, "%a", v)+1;
9181 }
9182 return __cached_size_;
9183 }
9184 virtual char* first_demangled_name(char* buf) const
9185 {
9186 char num[20] = {0};
9187 float v = static_cast<float>(__value_);
9188 int n = sprintf(num, "%a", v);
9189 strncpy(buf, num, n);
9190 buf += n;
9191 *buf++ = 'f';
9192 return buf;
9193 }
9194 virtual ptrdiff_t print_first(char* f, char* l) const
9195 {
9196 const ptrdiff_t r = l - f;
9197 char num[20] = {0};
9198 float v = static_cast<float>(__value_);
9199 ptrdiff_t n = sprintf(num, "%a", v);
9200 if (r >= n+1)
9201 {
9202 strncpy(f, num, n);
9203 f[n] = 'f';
9204 }
9205 ++n;
9206 return n;
9207 }
9208};
9209
9210class __float
9211 : public __node
9212{
9213 static const size_t n = sizeof("float") - 1;
9214public:
9215
9216 virtual size_t first_size() const {return n;}
9217 virtual char* first_demangled_name(char* buf) const
9218 {
9219 strncpy(buf, "float", n);
9220 return buf + n;
9221 }
9222 virtual ptrdiff_t print_first(char* f, char* l) const
9223 {
9224 const ptrdiff_t r = l - f;
9225 if (r >= n)
9226 {
9227 *f++ = 'f';
9228 *f++ = 'l';
9229 *f++ = 'o';
9230 *f++ = 'a';
9231 *f = 't';
9232 }
9233 return n;
9234 }
9235};
9236
9237class __double_literal
9238 : public __node
9239{
9240public:
9241 explicit __double_literal(double value)
9242 {
9243 __value_ = value;
9244 }
9245
9246 virtual size_t first_size() const
9247 {
9248 if (__cached_size_ == -1)
9249 {
9250 char num[30] = {0};
9251 double v = static_cast<double>(__value_);
9252 const_cast<long&>(__cached_size_) = sprintf(num, "%a", v);
9253 }
9254 return __cached_size_;
9255 }
9256 virtual char* first_demangled_name(char* buf) const
9257 {
9258 char num[30] = {0};
9259 double v = static_cast<double>(__value_);
9260 int n = sprintf(num, "%a", v);
9261 strncpy(buf, num, n);
9262 return buf + n;
9263 }
9264 virtual ptrdiff_t print_first(char* f, char* l) const
9265 {
9266 const ptrdiff_t r = l - f;
9267 char num[30] = {0};
9268 double v = static_cast<double>(__value_);
9269 const ptrdiff_t n = sprintf(num, "%a", v);
9270 if (r >= n)
9271 strncpy(f, num, n);
9272 return n;
9273 }
9274};
9275
9276class __double
9277 : public __node
9278{
9279 static const size_t n = sizeof("double") - 1;
9280public:
9281
9282 virtual size_t first_size() const {return n;}
9283 virtual char* first_demangled_name(char* buf) const
9284 {
9285 strncpy(buf, "double", n);
9286 return buf + n;
9287 }
9288 virtual ptrdiff_t print_first(char* f, char* l) const
9289 {
9290 const ptrdiff_t r = l - f;
9291 if (r >= n)
9292 {
9293 *f++ = 'd';
9294 *f++ = 'o';
9295 *f++ = 'u';
9296 *f++ = 'b';
9297 *f++ = 'l';
9298 *f = 'e';
9299 }
9300 return n;
9301 }
9302};
9303
9304class __long_double
9305 : public __node
9306{
9307 static const size_t n = sizeof("long double") - 1;
9308public:
9309
9310 virtual size_t first_size() const {return n;}
9311 virtual char* first_demangled_name(char* buf) const
9312 {
9313 strncpy(buf, "long double", n);
9314 return buf + n;
9315 }
9316 virtual ptrdiff_t print_first(char* f, char* l) const
9317 {
9318 const ptrdiff_t r = l - f;
9319 if (r >= n)
9320 {
9321 *f++ = 'l';
9322 *f++ = 'o';
9323 *f++ = 'n';
9324 *f++ = 'g';
9325 *f++ = ' ';
9326 *f++ = 'd';
9327 *f++ = 'o';
9328 *f++ = 'u';
9329 *f++ = 'b';
9330 *f++ = 'l';
9331 *f = 'e';
9332 }
9333 return n;
9334 }
9335};
9336
9337class __float128
9338 : public __node
9339{
9340 static const size_t n = sizeof("__float128") - 1;
9341public:
9342
9343 virtual size_t first_size() const {return n;}
9344 virtual char* first_demangled_name(char* buf) const
9345 {
9346 strncpy(buf, "__float128", n);
9347 return buf + n;
9348 }
9349 virtual ptrdiff_t print_first(char* f, char* l) const
9350 {
9351 const ptrdiff_t r = l - f;
9352 if (r >= n)
9353 {
9354 *f++ = '_';
9355 *f++ = '_';
9356 *f++ = 'f';
9357 *f++ = 'l';
9358 *f++ = 'o';
9359 *f++ = 'a';
9360 *f++ = 't';
9361 *f++ = '1';
9362 *f++ = '2';
9363 *f = '8';
9364 }
9365 return n;
9366 }
9367};
9368
9369class __ellipsis
9370 : public __node
9371{
9372 static const size_t n = sizeof("...") - 1;
9373public:
9374
9375 virtual size_t first_size() const {return n;}
9376 virtual char* first_demangled_name(char* buf) const
9377 {
9378 *buf++ = '.';
9379 *buf++ = '.';
9380 *buf++ = '.';
9381 return buf;
9382 }
9383 virtual ptrdiff_t print_first(char* f, char* l) const
9384 {
9385 const ptrdiff_t r = l - f;
9386 if (r >= n)
9387 {
9388 *f++ = '.';
9389 *f++ = '.';
9390 *f = '.';
9391 }
9392 return n;
9393 }
9394};
9395
9396class __decimal64
9397 : public __node
9398{
9399 static const size_t n = sizeof("decimal64") - 1;
9400public:
9401
9402 virtual size_t first_size() const {return n;}
9403 virtual char* first_demangled_name(char* buf) const
9404 {
9405 strncpy(buf, "decimal64", n);
9406 return buf + n;
9407 }
9408 virtual ptrdiff_t print_first(char* f, char* l) const
9409 {
9410 const ptrdiff_t r = l - f;
9411 if (r >= n)
9412 {
9413 *f++ = 'd';
9414 *f++ = 'e';
9415 *f++ = 'c';
9416 *f++ = 'i';
9417 *f++ = 'm';
9418 *f++ = 'a';
9419 *f++ = 'l';
9420 *f++ = '6';
9421 *f = '4';
9422 }
9423 return n;
9424 }
9425};
9426
9427class __decimal128
9428 : public __node
9429{
9430 static const size_t n = sizeof("decimal128") - 1;
9431public:
9432
9433 virtual size_t first_size() const {return n;}
9434 virtual char* first_demangled_name(char* buf) const
9435 {
9436 strncpy(buf, "decimal128", n);
9437 return buf + n;
9438 }
9439 virtual ptrdiff_t print_first(char* f, char* l) const
9440 {
9441 const ptrdiff_t r = l - f;
9442 if (r >= n)
9443 {
9444 *f++ = 'd';
9445 *f++ = 'e';
9446 *f++ = 'c';
9447 *f++ = 'i';
9448 *f++ = 'm';
9449 *f++ = 'a';
9450 *f++ = 'l';
9451 *f++ = '1';
9452 *f++ = '2';
9453 *f = '8';
9454 }
9455 return n;
9456 }
9457};
9458
9459class __decimal32
9460 : public __node
9461{
9462 static const size_t n = sizeof("decimal32") - 1;
9463public:
9464
9465 virtual size_t first_size() const {return n;}
9466 virtual char* first_demangled_name(char* buf) const
9467 {
9468 strncpy(buf, "decimal32", n);
9469 return buf + n;
9470 }
9471 virtual ptrdiff_t print_first(char* f, char* l) const
9472 {
9473 const ptrdiff_t r = l - f;
9474 if (r >= n)
9475 {
9476 *f++ = 'd';
9477 *f++ = 'e';
9478 *f++ = 'c';
9479 *f++ = 'i';
9480 *f++ = 'm';
9481 *f++ = 'a';
9482 *f++ = 'l';
9483 *f++ = '3';
9484 *f = '2';
9485 }
9486 return n;
9487 }
9488};
9489
9490class __decimal16
9491 : public __node
9492{
9493 static const size_t n = sizeof("decimal16") - 1;
9494public:
9495
9496 virtual size_t first_size() const {return n;}
9497 virtual char* first_demangled_name(char* buf) const
9498 {
9499 strncpy(buf, "decimal16", n);
9500 return buf + n;
9501 }
9502 virtual ptrdiff_t print_first(char* f, char* l) const
9503 {
9504 const ptrdiff_t r = l - f;
9505 if (r >= n)
9506 {
9507 *f++ = 'd';
9508 *f++ = 'e';
9509 *f++ = 'c';
9510 *f++ = 'i';
9511 *f++ = 'm';
9512 *f++ = 'a';
9513 *f++ = 'l';
9514 *f++ = '1';
9515 *f = '6';
9516 }
9517 return n;
9518 }
9519};
9520
9521class __d_char32_t
9522 : public __node
9523{
9524 static const size_t n = sizeof("char32_t") - 1;
9525public:
9526
9527 virtual size_t first_size() const {return n;}
9528 virtual char* first_demangled_name(char* buf) const
9529 {
9530 strncpy(buf, "char32_t", n);
9531 return buf + n;
9532 }
9533 virtual ptrdiff_t print_first(char* f, char* l) const
9534 {
9535 const ptrdiff_t r = l - f;
9536 if (r >= n)
9537 {
9538 *f++ = 'c';
9539 *f++ = 'h';
9540 *f++ = 'a';
9541 *f++ = 'r';
9542 *f++ = '3';
9543 *f++ = '2';
9544 *f++ = '_';
9545 *f = 't';
9546 }
9547 return n;
9548 }
9549};
9550
9551class __d_char16_t
9552 : public __node
9553{
9554 static const size_t n = sizeof("char16_t") - 1;
9555public:
9556
9557 virtual size_t first_size() const {return n;}
9558 virtual char* first_demangled_name(char* buf) const
9559 {
9560 strncpy(buf, "char16_t", n);
9561 return buf + n;
9562 }
9563 virtual ptrdiff_t print_first(char* f, char* l) const
9564 {
9565 const ptrdiff_t r = l - f;
9566 if (r >= n)
9567 {
9568 *f++ = 'c';
9569 *f++ = 'h';
9570 *f++ = 'a';
9571 *f++ = 'r';
9572 *f++ = '1';
9573 *f++ = '6';
9574 *f++ = '_';
9575 *f = 't';
9576 }
9577 return n;
9578 }
9579};
9580
9581class __auto
9582 : public __node
9583{
9584 static const size_t n = sizeof("auto") - 1;
9585public:
9586
9587 virtual size_t first_size() const {return n;}
9588 virtual char* first_demangled_name(char* buf) const
9589 {
9590 strncpy(buf, "auto", n);
9591 return buf + n;
9592 }
9593 virtual ptrdiff_t print_first(char* f, char* l) const
9594 {
9595 const ptrdiff_t r = l - f;
9596 if (r >= n)
9597 {
9598 *f++ = 'a';
9599 *f++ = 'u';
9600 *f++ = 't';
9601 *f = 'o';
9602 }
9603 return n;
9604 }
9605};
9606
9607class __nullptr_t
9608 : public __node
9609{
9610 static const size_t n = sizeof("std::nullptr_t") - 1;
9611public:
9612
9613 virtual size_t first_size() const {return n;}
9614 virtual char* first_demangled_name(char* buf) const
9615 {
9616 strncpy(buf, "std::nullptr_t", n);
9617 return buf + n;
9618 }
9619 virtual ptrdiff_t print_first(char* f, char* l) const
9620 {
9621 const ptrdiff_t r = l - f;
9622 if (r >= n)
9623 {
9624 *f++ = 's';
9625 *f++ = 't';
9626 *f++ = 'd';
9627 *f++ = ':';
9628 *f++ = ':';
9629 *f++ = 'n';
9630 *f++ = 'u';
9631 *f++ = 'l';
9632 *f++ = 'l';
9633 *f++ = 'p';
9634 *f++ = 't';
9635 *f++ = 'r';
9636 *f++ = '_';
9637 *f = 't';
9638 }
9639 return n;
9640 }
9641};
9642
9643class __array
9644 : public __node
9645{
9646public:
9647
9648 explicit __array(__node* type)
9649 {
9650 __left_ = type;
9651 }
9652
9653 __array(__node* type, size_t dim)
9654 {
9655 __left_ = type;
9656 __size_ = dim;
9657 }
9658
9659 __array(__node* type, __node* dim)
9660 {
9661 __left_ = type;
9662 __right_ = dim;
9663 }
9664
9665 virtual size_t size() const
9666 {
9667 if (__cached_size_ == -1)
9668 {
9669 size_t r = __left_->size() + 3;
9670 if (__right_ != 0)
9671 r += __right_->size();
9672 else if (__size_ != 0)
9673 r += snprintf(0, 0, "%ld", __size_);
9674 const_cast<long&>(__cached_size_) = r;
9675 }
9676 return __cached_size_;
9677 }
9678
9679 virtual char* get_demangled_name(char* buf) const
9680 {
9681 buf = __left_->get_demangled_name(buf);
9682 *buf++ = ' ';
9683 *buf++ = '[';
9684 if (__right_ != 0)
9685 buf = __right_->get_demangled_name(buf);
9686 else if (__size_ != 0)
9687 {
9688 size_t rs = sprintf(buf, "%ld", __size_);
9689 buf += rs;
9690 }
9691 *buf++ = ']';
9692 return buf;
9693 }
9694 virtual ptrdiff_t print(char* f, char* l) const
9695 {
9696 const ptrdiff_t r = l - f;
9697 const ptrdiff_t n = 3;
9698 const ptrdiff_t sz1 = __left_->print(f, l);
9699 char buf[20];
9700 ptrdiff_t sz2 = 0;
9701 if (__right_ != 0)
9702 sz2 = __right_->print(f+std::min(sz1+(n-1), r), l);
9703 else if (__size_ != 0)
9704 {
9705 sz2 = sprintf(buf, "%ld", __size_);
9706 if (r >= sz1 + sz2 + n)
9707 strncpy(f+sz1+2, buf, sz2);
9708 }
9709 if (r >= sz1 + sz2 + n)
9710 {
9711 f += sz1;
9712 *f++ = ' ';
9713 *f = '[';
9714 f += 1 + sz2;
9715 *f = ']';
9716 }
9717 return sz1 + sz2 + n;
9718 }
9719
9720 virtual size_t first_size() const
9721 {
9722 return __left_->first_size();
9723 }
9724
9725 virtual char* first_demangled_name(char* buf) const
9726 {
9727 return __left_->first_demangled_name(buf);
9728 }
9729
9730 virtual ptrdiff_t print_first(char* f, char* l) const
9731 {
9732 return __left_->print_first(f, l);
9733 }
9734
9735 virtual size_t second_size() const
9736 {
9737 size_t r = 2 + __left_->second_size();
9738 if (!__left_->is_array())
9739 ++r;
9740 if (__right_ != 0)
9741 r += __right_->size();
9742 else if (__size_ != 0)
9743 r += snprintf(0, 0, "%ld", __size_);
9744 return r;
9745 }
9746
9747 virtual char* second_demangled_name(char* buf) const
9748 {
9749 *buf++ = ' ';
9750 *buf++ = '[';
9751 if (__right_ != 0)
9752 buf = __right_->get_demangled_name(buf);
9753 else if (__size_ != 0)
9754 {
9755 size_t off = sprintf(buf, "%ld", __size_);
9756 buf += off;
9757 }
9758 char* t = buf;
9759 buf = __left_->second_demangled_name(buf);
9760 *t = ']';
9761 if (buf == t)
9762 ++buf;
9763 return buf;
9764 }
9765 virtual ptrdiff_t print_second(char* f, char* l) const
9766 {
9767 const ptrdiff_t r = l - f;
9768 ptrdiff_t n = 2;
9769 char buf[20];
9770 ptrdiff_t sz2 = 0;
9771 if (__right_ != 0)
9772 sz2 = __right_->print(f+std::min(n, r), l);
9773 else if (__size_ != 0)
9774 {
9775 sz2 = sprintf(buf, "%ld", __size_);
9776 if (r >= sz2 + 3)
9777 strncpy(f+2, buf, sz2);
9778 }
9779 const ptrdiff_t sz1 = __left_->print_second(f+std::min(2+sz2, r), l);
9780 if (sz1 == 0)
9781 ++n;
9782 if (r >= sz1 + sz2 + n)
9783 {
9784 *f++ = ' ';
9785 *f = '[';
9786 f += 1 + sz2;
9787 *f = ']';
9788 }
9789 return sz1 + sz2 + n;
9790 }
9791 virtual bool is_array() const
9792 {
9793 return true;
9794 }
9795 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
9796 {
9797 bool r = __left_->fix_forward_references(t_begin, t_end);
9798 if (__right_)
9799 r = r && __right_->fix_forward_references(t_begin, t_end);
9800 return r;
9801 }
9802};
9803
9804class __pointer_to_member_type
9805 : public __node
9806{
9807public:
9808
9809 __pointer_to_member_type(__node* class_type, __node* member_type)
9810 {
9811 __left_ = class_type;
9812 __right_ = member_type;
9813 }
9814
9815 virtual size_t first_size() const
9816 {
9817 if (__cached_size_ == -1)
9818 const_cast<long&>(__cached_size_) = __left_->size() + 3 + __right_->size();
9819 return __cached_size_;
9820 }
9821 virtual char* first_demangled_name(char* buf) const
9822 {
9823 buf = __right_->first_demangled_name(buf);
9824 buf = __left_->get_demangled_name(buf);
9825 *buf++ = ':';
9826 *buf++ = ':';
9827 *buf++ = '*';
9828 return __right_->second_demangled_name(buf);
9829 }
9830 virtual ptrdiff_t print_first(char* f, char* l) const
9831 {
9832 const ptrdiff_t r = l - f;
9833 const ptrdiff_t n = 3;
9834 const ptrdiff_t sz1 = __right_->print_first(f, l);
9835 const ptrdiff_t sz2 = __left_->print(f+std::min(sz1, r), l);
9836 const ptrdiff_t sz3 = __right_->print_second(f+std::min(sz1+sz2+n, r), l);
9837 if (r >= sz1 + sz2 + sz3 + n)
9838 {
9839 f += sz1 + sz2;
9840 *f++ = ':';
9841 *f++ = ':';
9842 *f = '*';
9843 }
9844 return sz1 + sz2 + sz3 + n;
9845 }
9846 virtual __node* base_name() const
9847 {
9848 return __left_->base_name();
9849 }
9850 virtual bool is_reference_or_pointer_to_function_or_array() const
9851 {
9852 return __right_->is_function();
9853 }
9854 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
9855 {
9856 return __left_->fix_forward_references(t_begin, t_end) &&
9857 __right_->fix_forward_references(t_begin, t_end);
9858 }
9859};
9860
9861class __decltype_node
9862 : public __node
9863{
9864public:
9865
9866 explicit __decltype_node(__node* expr)
9867 {
9868 __right_ = expr;
9869 }
9870
9871 virtual size_t first_size() const
9872 {
9873 if (__cached_size_ == -1)
9874 const_cast<long&>(__cached_size_) = 10 + __right_->size();
9875 return __cached_size_;
9876 }
9877
9878 virtual char* first_demangled_name(char* buf) const
9879 {
9880 strncpy(buf, "decltype(", 9);
9881 buf += 9;
9882 buf = __right_->get_demangled_name(buf);
9883 *buf++ = ')';
9884 return buf;
9885 }
9886 virtual ptrdiff_t print_first(char* f, char* l) const
9887 {
9888 const ptrdiff_t r = l - f;
9889 const ptrdiff_t n = sizeof("decltype()") - 1;
9890 const ptrdiff_t sz1 = __right_->print(f+std::min(n-1, r), l);
9891 if (r >= sz1 + n)
9892 {
9893 *f++ = 'd';
9894 *f++ = 'e';
9895 *f++ = 'c';
9896 *f++ = 'l';
9897 *f++ = 't';
9898 *f++ = 'y';
9899 *f++ = 'p';
9900 *f++ = 'e';
9901 *f = '(';
9902 f += 1 + sz1;
9903 *f = ')';
9904 }
9905 return sz1 + n;
9906 }
9907 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
9908 {
9909 return __right_->fix_forward_references(t_begin, t_end);
9910 }
9911};
9912
9913class __nested_delimeter
9914 : public __node
9915{
9916public:
9917
9918 explicit __nested_delimeter(__node* prev, __node* arg)
9919 {
9920 __left_ = prev;
9921 __right_ = arg;
9922 }
9923
9924 virtual size_t first_size() const
9925 {
9926 if (__cached_size_ == -1)
9927 const_cast<long&>(__cached_size_) = __left_->size() + __right_->size() + 2;
9928 return __cached_size_;
9929 }
9930
9931 virtual char* first_demangled_name(char* buf) const
9932 {
9933 buf = __left_->get_demangled_name(buf);
9934 *buf++ = ':';
9935 *buf++ = ':';
9936 return __right_->get_demangled_name(buf);
9937 }
9938 virtual ptrdiff_t print_first(char* f, char* l) const
9939 {
9940 const ptrdiff_t r = l - f;
9941 const ptrdiff_t n = sizeof("::") - 1;
9942 const ptrdiff_t sz1 = __left_->print(f, l);
9943 if (r >= sz1 + n)
9944 {
9945 f += sz1;
9946 *f++ = ':';
9947 *f++ = ':';
9948 }
9949 const ptrdiff_t sz2 = __right_->print(f, l);
9950 return sz1 + n + sz2;
9951 }
9952
9953 virtual bool ends_with_template() const
9954 {
9955 return __right_->ends_with_template();
9956 }
9957 virtual __node* base_name() const
9958 {
9959 return __right_->base_name();
9960 }
9961 virtual bool is_ctor_dtor_conv() const
9962 {
9963 return __right_->is_ctor_dtor_conv();
9964 }
9965 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
9966 {
9967 return __left_->fix_forward_references(t_begin, t_end) &&
9968 __right_->fix_forward_references(t_begin, t_end);
9969 }
9970 virtual __node* extract_cv(__node*& rt) const
9971 {
9972 return __right_->extract_cv(const_cast<__node*&>(__right_));
9973 }
9974};
9975
9976class __unresolved_name
9977 : public __node
9978{
9979public:
9980
9981 __unresolved_name(__node* prev, __node* arg)
9982 {
9983 __left_ = prev;
9984 __right_ = arg;
9985 }
9986
9987 __unresolved_name(bool global, __node* prev, __node* arg)
9988 {
9989 __size_ = global;
9990 __left_ = prev;
9991 __right_ = arg;
9992 }
9993
9994 virtual size_t first_size() const
9995 {
9996 if (__cached_size_ == -1)
9997 const_cast<long&>(__cached_size_) = (__left_ ? __left_->size() + 2 : 0) +
9998 __right_->size() + __size_ * 2;
9999 return __cached_size_;
10000 }
10001
10002 virtual char* first_demangled_name(char* buf) const
10003 {
10004 if (__size_)
10005 {
10006 *buf++ = ':';
10007 *buf++ = ':';
10008 }
10009 if (__left_)
10010 {
10011 buf = __left_->get_demangled_name(buf);
10012 *buf++ = ':';
10013 *buf++ = ':';
10014 }
10015 return __right_->get_demangled_name(buf);
10016 }
10017 virtual ptrdiff_t print_first(char* f, char* l) const
10018 {
10019 const ptrdiff_t r = l - f;
10020 ptrdiff_t n = 0;
10021 if (__size_)
10022 {
10023 n = 2;
10024 if (r >= n)
10025 {
10026 f[0] = ':';
10027 f[1] = ':';
10028 }
10029 }
10030 ptrdiff_t sz1 = 0;
10031 if (__left_)
10032 {
10033 sz1 = __left_->print(f+std::min(n, r), l);
10034 n += 2;
10035 if (r >= sz1 + n)
10036 {
10037 f[sz1 + n - 2] = ':';
10038 f[sz1 + n - 1] = ':';
10039 }
10040 }
10041 const ptrdiff_t sz2 = __right_->print(f+std::min(sz1+n, r), l);
10042 return sz1 + n + sz2;
10043 }
10044
10045 virtual bool ends_with_template() const
10046 {
10047 return __right_->ends_with_template();
10048 }
10049 virtual __node* base_name() const
10050 {
10051 return __right_->base_name();
10052 }
10053 virtual bool is_ctor_dtor_conv() const
10054 {
10055 return __right_->is_ctor_dtor_conv();
10056 }
10057 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10058 {
10059 bool r = true;
10060 if (__left_)
10061 r = __left_->fix_forward_references(t_begin, t_end);
10062 return r && __right_->fix_forward_references(t_begin, t_end);
10063 }
10064 virtual __node* extract_cv(__node*& rt) const
10065 {
10066 return __right_->extract_cv(const_cast<__node*&>(__right_));
10067 }
10068};
10069
10070class __string_literal
10071 : public __node
10072{
10073public:
10074
10075 virtual size_t first_size() const
10076 {
10077 return 14;
10078 }
10079
10080 virtual char* first_demangled_name(char* buf) const
10081 {
10082 strncpy(buf, "string literal", 14);
10083 return buf + 14;
10084 }
10085 virtual ptrdiff_t print_first(char* f, char* l) const
10086 {
10087 const ptrdiff_t r = l - f;
10088 const ptrdiff_t n = sizeof("string literal") - 1;
10089 if (r >= n)
10090 {
10091 *f++ = 's';
10092 *f++ = 't';
10093 *f++ = 'r';
10094 *f++ = 'i';
10095 *f++ = 'n';
10096 *f++ = 'g';
10097 *f++ = ' ';
10098 *f++ = 'l';
10099 *f++ = 'i';
10100 *f++ = 't';
10101 *f++ = 'e';
10102 *f++ = 'r';
10103 *f++ = 'a';
10104 *f = 'l';
10105 }
10106 return n;
10107 }
10108};
10109
10110class __constructor
10111 : public __node
10112{
10113public:
10114
10115 explicit __constructor(__node* name)
10116 {
10117 __right_ = name;
10118 }
10119
10120 virtual size_t first_size() const
10121 {
10122 if (__cached_size_ == -1)
10123 const_cast<long&>(__cached_size_) = __right_->base_size();
10124 return __cached_size_;
10125 }
10126
10127 virtual char* first_demangled_name(char* buf) const
10128 {
10129 return __right_->get_base_name(buf);
10130 }
10131 virtual ptrdiff_t print_first(char* f, char* l) const
10132 {
10133 return __right_->print_base_name(f, l);
10134 }
10135 virtual __node* base_name() const
10136 {
10137 return __right_->base_name();
10138 }
10139 virtual bool ends_with_template() const
10140 {
10141 return __right_->ends_with_template();
10142 }
10143 virtual bool is_ctor_dtor_conv() const
10144 {
10145 return true;
10146 }
10147 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10148 {
10149 return __right_->fix_forward_references(t_begin, t_end);
10150 }
10151};
10152
10153class __destructor
10154 : public __node
10155{
10156public:
10157
10158 explicit __destructor(__node* name)
10159 {
10160 __right_ = name;
10161 }
10162
10163 virtual size_t first_size() const
10164 {
10165 if (__cached_size_ == -1)
10166 const_cast<long&>(__cached_size_) = __right_->base_size() + 1;
10167 return __cached_size_;
10168 }
10169
10170 virtual char* first_demangled_name(char* buf) const
10171 {
10172 *buf++ = '~';
10173 return __right_->get_base_name(buf);
10174 }
10175 virtual ptrdiff_t print_first(char* f, char* l) const
10176 {
10177 const ptrdiff_t r = l - f;
10178 const ptrdiff_t n = 1;
10179 const ptrdiff_t sz = __right_->print_base_name(f+std::min(n, r), l);
10180 if (r >= n + sz)
10181 *f = '~';
10182 return n + sz;
10183 }
10184 virtual __node* base_name() const
10185 {
10186 return __right_->base_name();
10187 }
10188 virtual bool is_ctor_dtor_conv() const
10189 {
10190 return true;
10191 }
10192 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10193 {
10194 return __right_->fix_forward_references(t_begin, t_end);
10195 }
10196};
10197
10198class __dot_suffix
10199 : public __node
10200{
10201public:
10202 __dot_suffix(__node* name, const char* suffix, unsigned sz)
10203 {
10204 __left_ = name;
10205 __name_ = suffix;
10206 __size_ = sz;
10207 }
10208
10209 virtual size_t first_size() const
10210 {
10211 if (__cached_size_ == -1)
10212 {
10213 size_t off = __left_->size();
10214 off += __size_ + 3;
10215 const_cast<long&>(__cached_size_) = off;
10216 }
10217 return __cached_size_;
10218 }
10219 virtual char* first_demangled_name(char* buf) const
10220 {
10221 buf = __left_->get_demangled_name(buf);
10222 *buf++ = ' ';
10223 *buf++ = '(';
10224 strncpy(buf, __name_, __size_);
10225 buf += __size_;
10226 *buf++ = ')';
10227 return buf;
10228 }
10229 virtual ptrdiff_t print_first(char* f, char* l) const
10230 {
10231 const ptrdiff_t r = l - f;
10232 const ptrdiff_t n = 3 + __size_;
10233 const ptrdiff_t sz = __left_->print(f, l);
10234 if (r >= n + sz)
10235 {
10236 f += sz;
10237 *f++ = ' ';
10238 *f++ = '(';
10239 strncpy(f, __name_, __size_);
10240 f += __size_;
10241 *f = ')';
10242 }
10243 return n + sz;
10244 }
10245 virtual __node* base_name() const
10246 {
10247 return __left_->base_name();
10248 }
10249 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10250 {
10251 return __left_->fix_forward_references(t_begin, t_end);
10252 }
10253};
10254
10255
10256enum {invalid_args = -3, invalid_mangled_name, memory_alloc_failure, success,
10257 not_yet_implemented};
10258
10259__demangle_tree::__demangle_tree(const char* mangled_name, char* buf, size_t bs)
10260 : __mangled_name_begin_(0), __mangled_name_end_(0),
10261 __status_(invalid_mangled_name), __root_(0),
10262 __node_begin_(0), __node_end_(0), __node_cap_(0),
10263 __sub_begin_(0), __sub_end_(0), __sub_cap_(0),
10264 __t_begin_(0), __t_end_(0), __t_cap_(0),
10265 __tag_templates_(true),
10266 __fix_forward_references_(false)
10267{
10268 size_t n = strlen(mangled_name);
10269 size_t ms = n + 2*n*sizeof(__node) + 2*n*sizeof(__node*);
10270 char* m;
10271 if (ms <= bs)
10272 {
10273 m = buf;
10274 __owns_buf_ = false;
10275 }
10276 else
10277 {
10278 m = static_cast<char*>(malloc(ms));
10279 __owns_buf_ = true;
10280 }
10281 if (m == NULL)
10282 {
10283 __status_ = memory_alloc_failure;
10284 return;
10285 }
10286 __node_begin_ = __node_end_ = (__node*)(m);
10287 __node_cap_ = __node_begin_ + 2*n;
10288 __sub_begin_ = __sub_end_ = (__node**)(__node_cap_);
10289 __sub_cap_ = __sub_begin_ + n;
10290 __t_begin_ = __t_end_ = (__node**)(__sub_cap_);
10291 __t_cap_ = __t_begin_ + n;
10292 __mangled_name_begin_ = (const char*)(__t_cap_);
10293 __mangled_name_end_ = __mangled_name_begin_ + n;
10294 strncpy(const_cast<char*>(__mangled_name_begin_), mangled_name, n);
10295}
10296
10297__demangle_tree::~__demangle_tree()
10298{
10299 if (__owns_buf_)
10300 free(__node_begin_);
10301}
10302
10303__demangle_tree::__demangle_tree(__demangle_tree& t)
10304 : __mangled_name_begin_(t.__mangled_name_begin_),
10305 __mangled_name_end_(t.__mangled_name_end_),
10306 __status_(t.__status_), __root_(t.__root_),
10307 __node_begin_(t.__node_begin_), __node_end_(t.__node_end_),
10308 __node_cap_(t.__node_cap_),
10309 __sub_begin_(t.__sub_begin_), __sub_end_(t.__sub_end_),
10310 __sub_cap_(t.__sub_cap_),
10311 __t_begin_(t.__t_begin_), __t_end_(t.__t_end_),
10312 __t_cap_(t.__t_cap_),
10313 __tag_templates_(t.__tag_templates_),
10314 __fix_forward_references_(t.__fix_forward_references_),
10315 __owns_buf_(t.__owns_buf_)
10316{
10317 t.__mangled_name_begin_ = 0;
10318 t.__mangled_name_end_ = 0;
10319 t.__status_ = invalid_mangled_name;
10320 t.__root_ = 0;
10321 t.__node_begin_ = t.__node_end_ = t.__node_cap_ = 0;
10322 t.__sub_begin_ = t.__sub_end_ = t.__sub_cap_ = 0;
10323 t.__t_begin_ = t.__t_end_ = t.__t_cap_ = 0;
10324 t.__owns_buf_ = false;
10325}
10326
10327__demangle_tree::__demangle_tree(__demangle_tree_rv rv)
10328 : __mangled_name_begin_(rv.ptr_->__mangled_name_begin_),
10329 __mangled_name_end_(rv.ptr_->__mangled_name_end_),
10330 __status_(rv.ptr_->__status_), __root_(rv.ptr_->__root_),
10331 __node_begin_(rv.ptr_->__node_begin_), __node_end_(rv.ptr_->__node_end_),
10332 __node_cap_(rv.ptr_->__node_cap_),
10333 __sub_begin_(rv.ptr_->__sub_begin_), __sub_end_(rv.ptr_->__sub_end_),
10334 __sub_cap_(rv.ptr_->__sub_cap_),
10335 __t_begin_(rv.ptr_->__t_begin_), __t_end_(rv.ptr_->__t_end_),
10336 __t_cap_(rv.ptr_->__t_cap_),
10337 __tag_templates_(rv.ptr_->__tag_templates_),
10338 __fix_forward_references_(rv.ptr_->__fix_forward_references_),
10339 __owns_buf_(rv.ptr_->__owns_buf_)
10340{
10341 rv.ptr_->__mangled_name_begin_ = 0;
10342 rv.ptr_->__mangled_name_end_ = 0;
10343 rv.ptr_->__status_ = invalid_mangled_name;
10344 rv.ptr_->__root_ = 0;
10345 rv.ptr_->__node_begin_ = rv.ptr_->__node_end_ = rv.ptr_->__node_cap_ = 0;
10346 rv.ptr_->__sub_begin_ = rv.ptr_->__sub_end_ = rv.ptr_->__sub_cap_ = 0;
10347 rv.ptr_->__t_begin_ = rv.ptr_->__t_end_ = rv.ptr_->__t_cap_ = 0;
10348 rv.ptr_->__owns_buf_ = false;
10349}
10350
10351int
10352__demangle_tree::__status() const
10353{
10354 return __status_;
10355}
10356
10357size_t
10358__demangle_tree::size() const
10359{
10360 return __status_ == success ? __root_->size() : 0;
10361}
10362
10363char*
10364__demangle_tree::__get_demangled_name(char* buf) const
10365{
10366 if (__status_ == success)
10367 return __root_->get_demangled_name(buf);
10368 return 0;
10369}
10370
10371template <class _Tp>
10372bool
10373__demangle_tree::__make()
10374{
10375 if (__node_end_ < __node_cap_)
10376 {
10377 ::new (__node_end_) _Tp();
10378 __root_ = __node_end_;
10379 ++__node_end_;
10380 return true;
10381 }
10382 __status_ = memory_alloc_failure;
10383 return false;
10384}
10385
10386template <class _Tp, class _A0>
10387bool
10388__demangle_tree::__make(_A0 __a0)
10389{
10390 if (__node_end_ < __node_cap_)
10391 {
10392 ::new (__node_end_) _Tp(__a0);
10393 __root_ = __node_end_;
10394 ++__node_end_;
10395 return true;
10396 }
10397 __status_ = memory_alloc_failure;
10398 return false;
10399}
10400
10401template <class _Tp, class _A0, class _A1>
10402bool
10403__demangle_tree::__make(_A0 __a0, _A1 __a1)
10404{
10405 if (__node_end_ < __node_cap_)
10406 {
10407 ::new (__node_end_) _Tp(__a0, __a1);
10408 __root_ = __node_end_;
10409 ++__node_end_;
10410 return true;
10411 }
10412 __status_ = memory_alloc_failure;
10413 return false;
10414}
10415
10416template <class _Tp, class _A0, class _A1, class _A2>
10417bool
10418__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2)
10419{
10420 if (__node_end_ < __node_cap_)
10421 {
10422 ::new (__node_end_) _Tp(__a0, __a1, __a2);
10423 __root_ = __node_end_;
10424 ++__node_end_;
10425 return true;
10426 }
10427 __status_ = memory_alloc_failure;
10428 return false;
10429}
10430
10431template <class _Tp, class _A0, class _A1, class _A2, class _A3>
10432bool
10433__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3)
10434{
10435 if (__node_end_ < __node_cap_)
10436 {
10437 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3);
10438 __root_ = __node_end_;
10439 ++__node_end_;
10440 return true;
10441 }
10442 __status_ = memory_alloc_failure;
10443 return false;
10444}
10445
10446template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4>
10447bool
10448__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4)
10449{
10450 if (__node_end_ < __node_cap_)
10451 {
10452 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4);
10453 __root_ = __node_end_;
10454 ++__node_end_;
10455 return true;
10456 }
10457 __status_ = memory_alloc_failure;
10458 return false;
10459}
10460
10461template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4,
10462 class _A5>
10463bool
10464__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4,
10465 _A5 __a5)
10466{
10467 if (__node_end_ < __node_cap_)
10468 {
10469 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4, __a5);
10470 __root_ = __node_end_;
10471 ++__node_end_;
10472 return true;
10473 }
10474 __status_ = memory_alloc_failure;
10475 return false;
10476}
10477
10478// <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const
10479// [R | O] # & or &&
10480
10481const char*
10482__demangle_tree::__parse_cv_qualifiers(const char* first, const char* last,
10483 unsigned& cv, bool look_for_ref_quals)
10484{
10485 if (look_for_ref_quals)
10486 {
10487 for (; first != last; ++first)
10488 {
10489 switch (*first)
10490 {
10491 case 'r':
10492 cv |= 4;
10493 break;
10494 case 'V':
10495 cv |= 2;
10496 break;
10497 case 'K':
10498 cv |= 1;
10499 break;
10500 case 'R':
10501 cv |= 8;
10502 break;
10503 case 'O':
10504 cv |= 16;
10505 break;
10506 default:
10507 return first;
10508 }
10509 }
10510 }
10511 else
10512 {
10513 for (; first != last; ++first)
10514 {
10515 switch (*first)
10516 {
10517 case 'r':
10518 cv |= 4;
10519 break;
10520 case 'V':
10521 cv |= 2;
10522 break;
10523 case 'K':
10524 cv |= 1;
10525 break;
10526 default:
10527 return first;
10528 }
10529 }
10530 }
10531 return first;
10532}
10533
10534// <builtin-type> ::= v # void
10535// ::= w # wchar_t
10536// ::= b # bool
10537// ::= c # char
10538// ::= a # signed char
10539// ::= h # unsigned char
10540// ::= s # short
10541// ::= t # unsigned short
10542// ::= i # int
10543// ::= j # unsigned int
10544// ::= l # long
10545// ::= m # unsigned long
10546// ::= x # long long, __int64
10547// ::= y # unsigned long long, __int64
10548// ::= n # __int128
10549// ::= o # unsigned __int128
10550// ::= f # float
10551// ::= d # double
10552// ::= e # long double, __float80
10553// ::= g # __float128
10554// ::= z # ellipsis
10555// ::= Dd # IEEE 754r decimal floating point (64 bits)
10556// ::= De # IEEE 754r decimal floating point (128 bits)
10557// ::= Df # IEEE 754r decimal floating point (32 bits)
10558// ::= Dh # IEEE 754r half-precision floating point (16 bits)
10559// ::= Di # char32_t
10560// ::= Ds # char16_t
10561// ::= Da # auto (in dependent new-expressions)
10562// ::= Dn # std::nullptr_t (i.e., decltype(nullptr))
10563// ::= u <source-name> # vendor extended type
10564
10565const char*
10566__demangle_tree::__parse_builtin_type(const char* first, const char* last)
10567{
10568 if (first != last)
10569 {
10570 switch (*first)
10571 {
10572 case 'v':
10573 if (__make<__void>())
10574 ++first;
10575 break;
10576 case 'w':
10577 if (__make<__wchar_t>())
10578 ++first;
10579 break;
10580 case 'b':
10581 if (__make<__bool>())
10582 ++first;
10583 break;
10584 case 'c':
10585 if (__make<__char>())
10586 ++first;
10587 break;
10588 case 'a':
10589 if (__make<__signed_char>())
10590 ++first;
10591 break;
10592 case 'h':
10593 if (__make<__unsigned_char>())
10594 ++first;
10595 break;
10596 case 's':
10597 if (__make<__short>())
10598 ++first;
10599 break;
10600 case 't':
10601 if (__make<__unsigned_short>())
10602 ++first;
10603 break;
10604 case 'i':
10605 if (__make<__int>())
10606 ++first;
10607 break;
10608 case 'j':
10609 if (__make<__unsigned_int>())
10610 ++first;
10611 break;
10612 case 'l':
10613 if (__make<__long>())
10614 ++first;
10615 break;
10616 case 'm':
10617 if (__make<__unsigned_long>())
10618 ++first;
10619 break;
10620 case 'x':
10621 if (__make<__long_long>())
10622 ++first;
10623 break;
10624 case 'y':
10625 if (__make<__unsigned_long_long>())
10626 ++first;
10627 break;
10628 case 'n':
10629 if (__make<__int128>())
10630 ++first;
10631 break;
10632 case 'o':
10633 if (__make<__unsigned_int128>())
10634 ++first;
10635 break;
10636 case 'f':
10637 if (__make<__float>())
10638 ++first;
10639 break;
10640 case 'd':
10641 if (__make<__double>())
10642 ++first;
10643 break;
10644 case 'e':
10645 if (__make<__long_double>())
10646 ++first;
10647 break;
10648 case 'g':
10649 if (__make<__float128>())
10650 ++first;
10651 break;
10652 case 'z':
10653 if (__make<__ellipsis>())
10654 ++first;
10655 break;
10656 case 'D':
10657 if (first+1 != last)
10658 {
10659 switch (first[1])
10660 {
10661 case 'd':
10662 if (__make<__decimal64>())
10663 first += 2;
10664 break;
10665 case 'e':
10666 if (__make<__decimal128>())
10667 first += 2;
10668 break;
10669 case 'f':
10670 if (__make<__decimal32>())
10671 first += 2;
10672 break;
10673 case 'h':
10674 if (__make<__decimal16>())
10675 first += 2;
10676 break;
10677 case 'i':
10678 if (__make<__d_char32_t>())
10679 first += 2;
10680 break;
10681 case 's':
10682 if (__make<__d_char16_t>())
10683 first += 2;
10684 break;
10685 case 'a':
10686 if (__make<__auto>())
10687 first += 2;
10688 break;
10689 case 'n':
10690 if (__make<__nullptr_t>())
10691 first += 2;
10692 break;
10693 }
10694 }
10695 break;
10696 }
10697 }
10698 return first;
10699}
10700
10701// <bare-function-type> ::= <signature type>+
10702// # types are possible return type, then parameter types
10703
10704const char*
10705__demangle_tree::__parse_bare_function_type(const char* first, const char* last)
10706{
10707 if (first != last)
10708 {
10709 __tag_templates_ = false;
10710 const char* t = __parse_type(first, last);
10711 if (t != first && __make<__list>(__root_))
10712 {
10713 const char* t0 = t;
10714 __node* head = __root_;
10715 __node* prev = head;
10716 while (true)
10717 {
10718 t = __parse_type(t0, last);
10719 if (t != t0)
10720 {
10721 if (__make<__list>(__root_))
10722 {
10723 t0 = t;
10724 prev->__right_ = __root_;
10725 __root_->__size_ = prev->__size_ + 1;
10726 prev = __root_;
10727 }
10728 else
10729 break;
10730 }
10731 else
10732 {
10733 first = t;
10734 __root_ = head;
10735 break;
10736 }
10737 }
10738 }
10739 __tag_templates_ = true;
10740 }
10741 return first;
10742}
10743
10744// <function-type> ::= F [Y] <bare-function-type> E
10745
10746const char*
10747__demangle_tree::__parse_function_type(const char* first, const char* last)
10748{
10749 if (first != last && *first == 'F')
10750 {
10751 const char* t = first+1;
10752 if (t != last)
10753 {
10754 bool externC = false;
10755 if (*t == 'Y')
10756 {
10757 externC = true;
10758 if (++t == last)
10759 return first;
10760 }
10761 const char* t1 = __parse_type(t, last);
10762 if (t1 != t)
10763 {
10764 __node* ret = __root_;
10765 t = t1;
10766 t1 = __parse_bare_function_type(t, last);
10767 if (t1 != t && t1 != last && *t1 == 'E')
10768 {
10769 if (dynamic_cast<__void*>(__root_->__left_) != NULL)
10770 __root_->__left_ = NULL;
10771 if (__make<__function_signature>(ret, __root_))
10772 {
10773 if (__make<__function>((__node*)0, __root_))
10774 first = t1+1;
10775 }
10776 }
10777 }
10778 }
10779 }
10780 return first;
10781}
10782
10783const char*
10784__demangle_tree::__parse_hex_number(const char* first, const char* last, unsigned long long& n)
10785{
10786 const char* t = first;
10787 for (; t != last && isxdigit(*t); ++t)
10788 {
10789 if (t == first)
10790 n = 0;
10791 if (isdigit(*t))
10792 n = n * 16 + *t - '0';
10793 else if (isupper(*t))
10794 n = n * 16 + *t - 'A' + 10;
10795 else
10796 n = n * 16 + *t - 'a' + 10;
10797 }
10798 first = t;
10799 return first;
10800}
10801
10802// <expr-primary> ::= L <type> <value number> E # integer literal
10803// ::= L <type> <value float> E # floating literal
10804// ::= L <string type> E # string literal
10805// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
10806// ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
10807// ::= L <mangled-name> E # external name
10808
10809const char*
10810__demangle_tree::__parse_expr_primary(const char* first, const char* last)
10811{
10812 if (last - first >= 4 && *first == 'L')
10813 {
10814 switch (first[1])
10815 {
10816 case 'w':
10817 {
10818 const char* t = __parse_number(first+2, last);
10819 if (t != first+2 && t != last && *t == 'E')
10820 {
10821 if (__make<__wchar_t_literal>(first+2, t))
10822 first = t+1;
10823 }
10824 }
10825 break;
10826 case 'b':
10827 if (first[3] == 'E')
10828 {
10829 switch (first[2])
10830 {
10831 case '0':
10832 if (__make<__bool_literal>("false", 5))
10833 first += 4;
10834 break;
10835 case '1':
10836 if (__make<__bool_literal>("true", 4))
10837 first += 4;
10838 break;
10839 }
10840 }
10841 break;
10842 case 'c':
10843 {
10844 const char* t = __parse_number(first+2, last);
10845 if (t != first+2 && t != last && *t == 'E')
10846 {
10847 if (__make<__char_literal>(first+2, t))
10848 first = t+1;
10849 }
10850 }
10851 break;
10852 case 'a':
10853 {
10854 const char* t = __parse_number(first+2, last);
10855 if (t != first+2 && t != last && *t == 'E')
10856 {
10857 if (__make<__signed_char_literal>(first+2, t))
10858 first = t+1;
10859 }
10860 }
10861 break;
10862 case 'h':
10863 {
10864 const char* t = __parse_number(first+2, last);
10865 if (t != first+2 && t != last && *t == 'E')
10866 {
10867 if (__make<__unsigned_char_literal>(first+2, t))
10868 first = t+1;
10869 }
10870 }
10871 break;
10872 case 's':
10873 {
10874 const char* t = __parse_number(first+2, last);
10875 if (t != first+2 && t != last && *t == 'E')
10876 {
10877 if (__make<__short_literal>(first+2, t))
10878 first = t+1;
10879 }
10880 }
10881 break;
10882 case 't':
10883 {
10884 const char* t = __parse_number(first+2, last);
10885 if (t != first+2 && t != last && *t == 'E')
10886 {
10887 if (__make<__unsigned_short_literal>(first+2, t))
10888 first = t+1;
10889 }
10890 }
10891 break;
10892 case 'i':
10893 {
10894 const char* t = __parse_number(first+2, last);
10895 if (t != first+2 && t != last && *t == 'E')
10896 {
10897 if (__make<__int_literal>(first+2, t))
10898 first = t+1;
10899 }
10900 }
10901 break;
10902 case 'j':
10903 {
10904 const char* t = __parse_number(first+2, last);
10905 if (t != first+2 && t != last && *t == 'E')
10906 {
10907 if (__make<__unsigned_int_literal>(first+2, t))
10908 first = t+1;
10909 }
10910 }
10911 break;
10912 case 'l':
10913 {
10914 const char* t = __parse_number(first+2, last);
10915 if (t != first+2 && t != last && *t == 'E')
10916 {
10917 if (__make<__long_literal>(first+2, t))
10918 first = t+1;
10919 }
10920 }
10921 break;
10922 case 'm':
10923 {
10924 const char* t = __parse_number(first+2, last);
10925 if (t != first+2 && t != last && *t == 'E')
10926 {
10927 if (__make<__unsigned_long_literal>(first+2, t))
10928 first = t+1;
10929 }
10930 }
10931 break;
10932 case 'x':
10933 {
10934 const char* t = __parse_number(first+2, last);
10935 if (t != first+2 && t != last && *t == 'E')
10936 {
10937 if (__make<__long_long_literal>(first+2, t))
10938 first = t+1;
10939 }
10940 }
10941 break;
10942 case 'y':
10943 {
10944 const char* t = __parse_number(first+2, last);
10945 if (t != first+2 && t != last && *t == 'E')
10946 {
10947 if (__make<__unsigned_long_long_literal>(first+2, t))
10948 first = t+1;
10949 }
10950 }
10951 break;
10952 case 'n':
10953 {
10954 const char* t = __parse_number(first+2, last);
10955 if (t != first+2 && t != last && *t == 'E')
10956 {
10957 if (__make<__int128_literal>(first+2, t))
10958 first = t+1;
10959 }
10960 }
10961 break;
10962 case 'o':
10963 {
10964 const char* t = __parse_number(first+2, last);
10965 if (t != first+2 && t != last && *t == 'E')
10966 {
10967 if (__make<__unsigned_int128_literal>(first+2, t))
10968 first = t+1;
10969 }
10970 }
10971 break;
10972 case 'f':
10973 {
10974 if (last - (first+2) <= 8)
10975 return first;
10976 unsigned long long j;
10977 const char* t = __parse_hex_number(first+2, first+10, j);
10978 if (t != first+2 && t != last && *t == 'E')
10979 {
10980 unsigned i = static_cast<unsigned>(j);
10981 float value = *(float*)&i;
10982 if (__make<__float_literal>(value))
10983 first = t+1;
10984 }
10985 }
10986 break;
10987 case 'd':
10988 {
10989 if (last - (first+2) <= 16)
10990 return first;
10991 unsigned long long j;
10992 const char* t = __parse_hex_number(first+2, first+18, j);
10993 if (t != first+2 && t != last && *t == 'E')
10994 {
10995 double value = *(double*)&j;
10996 if (__make<__double_literal>(value))
10997 first = t+1;
10998 }
10999 }
11000 break;
11001 case 'e':
11002 break;
11003 case '_':
11004 if (first[2] == 'Z')
11005 {
11006 const char* t = __parse_encoding(first+3, last);
11007 if (t != first+3 && t != last && *t == 'E')
11008 first = t+1;
11009 }
11010 break;
11011 default:
11012 {
11013 // might be named type
11014 const char* t = __parse_type(first+1, last);
11015 if (t != first+1 && t != last)
11016 {
11017 if (*t != 'E')
11018 {
11019 const char* n = t;
11020 for (; n != last && isdigit(*n); ++n)
11021 ;
11022 if (n != t && n != last && *n == 'E')
11023 {
11024 if (__make<__cast_literal>(__root_, t, n))
11025 {
11026 first = n+1;
11027 break;
11028 }
11029 }
11030 }
11031 else
11032 {
11033 first = t+1;
11034 break;
11035 }
11036 }
11037 }
11038 assert(!"case in __parse_expr_primary not implemented");
11039 }
11040 }
11041 return first;
11042}
11043
11044const char*
11045__demangle_tree::__parse_unnamed_type_name(const char* first, const char* last)
11046{
11047 if (first != last && *first == 'U')
11048 {
11049 assert(!"__parse_unnamed_type_name not implemented");
11050 }
11051 return first;
11052}
11053
11054// <ctor-dtor-name> ::= C1 # complete object constructor
11055// ::= C2 # base object constructor
11056// ::= C3 # complete object allocating constructor
11057// ::= D0 # deleting destructor
11058// ::= D1 # complete object destructor
11059// ::= D2 # base object destructor
11060
11061const char*
11062__demangle_tree::__parse_ctor_dtor_name(const char* first, const char* last)
11063{
11064 if (last-first >= 2)
11065 {
11066 switch (first[0])
11067 {
11068 case 'C':
11069 switch (first[1])
11070 {
11071 case '1':
11072 case '2':
11073 case '3':
11074 if (__make<__constructor>(__root_->base_name()))
11075 first += 2;
11076 break;
11077 }
11078 break;
11079 case 'D':
11080 switch (first[1])
11081 {
11082 case '0':
11083 case '1':
11084 case '2':
11085 if (__make<__destructor>(__root_->base_name()))
11086 first += 2;
11087 break;
11088 }
11089 break;
11090 }
11091 }
11092 return first;
11093}
11094
11095const char*
11096__demangle_tree::__parse_unscoped_template_name(const char* first, const char* last)
11097{
11098 assert(!"__parse_unscoped_template_name not implemented");
11099}
11100
11101// <discriminator> := _ <non-negative number> # when number < 10
11102// := __ <non-negative number> _ # when number >= 10
11103// extension := decimal-digit+
11104
11105const char*
11106__demangle_tree::__parse_discriminator(const char* first, const char* last)
11107{
11108 // parse but ignore discriminator
11109 if (first != last)
11110 {
11111 if (*first == '_')
11112 {
11113 const char* t1 = first+1;
11114 if (t1 != last)
11115 {
11116 if (isdigit(*t1))
11117 first = t1+1;
11118 else if (*t1 == '_')
11119 {
11120 for (++t1; t1 != last && isdigit(*t1); ++t1)
11121 ;
11122 if (t1 != last && *t1 == '_')
11123 first = t1 + 1;
11124 }
11125 }
11126 }
11127 else if (isdigit(*first))
11128 {
11129 const char* t1 = first+1;
11130 for (; t1 != last && isdigit(*t1); ++t1)
11131 ;
11132 first = t1;
11133 }
11134 }
11135 return first;
11136}
11137
11138// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
11139// := Z <function encoding> E s [<discriminator>]
11140// := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
11141
11142const char*
11143__demangle_tree::__parse_local_name(const char* first, const char* last)
11144{
11145 if (first != last && *first == 'Z')
11146 {
11147 const char* t = __parse_encoding(first+1, last);
11148 if (t != first+1 && t != last && *t == 'E' && ++t != last)
11149 {
11150 __node* encoding = __root_;
11151 switch (*t)
11152 {
11153 case 's':
11154 {
11155 const char*t1 = __parse_discriminator(t+1, last);
11156 if (__make<__string_literal>())
11157 {
11158 if (__make<__nested_delimeter>(encoding, __root_))
11159 first = t1;
11160 }
11161 }
11162 break;
11163 case 'd':
11164 assert(!"__parse_local_name d not implemented");
11165 break;
11166 default:
11167 {
11168 const char*t1 = __parse_name(t, last);
11169 if (t1 != t)
11170 {
11171 // parse but ignore discriminator
11172 t1 = __parse_discriminator(t1, last);
11173 if (__make<__nested_delimeter>(encoding, __root_))
11174 first = t1;
11175 }
11176 }
11177 break;
11178 }
11179 }
11180 }
11181 return first;
11182}
11183
11184// <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f())
11185// ::= <simple-id> # e.g., ~A<2*N>
11186
11187const char*
11188__demangle_tree::__parse_destructor_name(const char* first, const char* last)
11189{
11190 if (first != last)
11191 {
11192 const char* t = __parse_unresolved_type(first, last);
11193 if (t == first)
11194 t = __parse_simple_id(first, last);
11195 if (t != first && __make<__destructor>(__root_))
11196 first = t;
11197 }
11198 return first;
11199}
11200
11201// <simple-id> ::= <source-name> [ <template-args> ]
11202
11203const char*
11204__demangle_tree::__parse_simple_id(const char* first, const char* last)
11205{
11206 if (first != last)
11207 {
11208 const char* t = __parse_source_name(first, last);
11209 if (t != first)
11210 first = __parse_template_args(t, last);
11211 else
11212 first = t;
11213 }
11214 return first;
11215}
11216
11217// <base-unresolved-name> ::= <simple-id> # unresolved name
11218// extension ::= <operator-name> # unresolved operator-function-id
11219// extension ::= <operator-name> <template-args> # unresolved operator template-id
11220// ::= on <operator-name> # unresolved operator-function-id
11221// ::= on <operator-name> <template-args> # unresolved operator template-id
11222// ::= dn <destructor-name> # destructor or pseudo-destructor;
11223// # e.g. ~X or ~X<N-1>
11224
11225const char*
11226__demangle_tree::__parse_base_unresolved_name(const char* first, const char* last)
11227{
11228 if (last - first >= 2)
11229 {
11230 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
11231 {
11232 if (first[0] == 'o')
11233 {
11234 const char* t = __parse_operator_name(first+2, last);
11235 if (t != first+2)
11236 first = __parse_template_args(t, last);
11237 else
11238 first = t;
11239 }
11240 else
11241 {
11242 const char* t = __parse_destructor_name(first+2, last);
11243 if (t != first+2)
11244 first = t;
11245 }
11246 }
11247 else
11248 {
11249 const char* t = __parse_simple_id(first, last);
11250 if (t == first)
11251 {
11252 t = __parse_operator_name(first, last);
11253 if (t != first)
11254 t = __parse_template_args(t, last);
11255 }
11256 if (t != first)
11257 first = t;
11258 }
11259 }
11260 return first;
11261}
11262
11263// <unresolved-type> ::= <template-param>
11264// ::= <decltype>
11265// ::= <substitution>
11266
11267const char*
11268__demangle_tree::__parse_unresolved_type(const char* first, const char* last)
11269{
11270 if (first != last)
11271 {
11272 const char* t;
11273 switch (*first)
11274 {
11275 case 'T':
11276 t = __parse_template_param(first, last);
11277 if (t != first)
11278 {
11279 if (__sub_end_ == __sub_cap_)
11280 __status_ = memory_alloc_failure;
11281 else
11282 {
11283 *__sub_end_++ = __root_;
11284 first = t;
11285 }
11286 }
11287 break;
11288 case 'D':
11289 t = __parse_decltype(first, last);
11290 if (t != first)
11291 {
11292 if (__sub_end_ == __sub_cap_)
11293 __status_ = memory_alloc_failure;
11294 else
11295 {
11296 *__sub_end_++ = __root_;
11297 first = t;
11298 }
11299 }
11300 break;
11301 case 'S':
11302 t = __parse_substitution(first, last);
11303 if (t != first)
11304 first = t;
11305 break;
11306 }
11307 }
11308 return first;
11309}
11310
11311// <unresolved-name>
11312// ::= sr <name> <base-unresolved-name> # extension, subtly different than srN ...
11313// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
11314// # T::N::x /decltype(p)::N::x
11315// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
11316// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
11317// # A::x, N::y, A<T>::z; "gs" means leading "::"
11318// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
11319
11320const char*
11321__demangle_tree::__parse_unresolved_name(const char* first, const char* last)
11322{
11323 if (last - first > 2)
11324 {
11325 if (first[0] == 's' && first[1] == 'r')
11326 {
11327 const char* t = __parse_name(first+2, last);
11328 if (t == first+2)
11329 t = __parse_unresolved_type(first+2, last);
11330 if (t != first+2)
11331 {
11332 __node* name = __root_;
11333 const char* t2 = __parse_base_unresolved_name(t, last);
11334 if (t2 != t && __make<__unresolved_name>(name, __root_))
11335 first = t2;
11336 }
11337 }
11338 else
11339 {
11340 const char* t = first;
11341 bool global = false;
11342 if (t[0] == 'g' && t[1] == 's')
11343 {
11344 global = true;
11345 t += 2;
11346 }
11347 if (last - t > 2)
11348 {
11349 const char* t2;
11350 __node* name = NULL;
11351 if (t[0] == 's' && t[1] == 'r')
11352 {
11353 t += 2;
11354 t2 = __parse_simple_id(t, last);
11355 if (t2 == t || t2 == last)
11356 return first;
11357 name = __root_;
11358 while (*t2 != 'E')
11359 {
11360 t = t2;
11361 t2 = __parse_simple_id(t, last);
11362 if (t2 == t)
11363 return first;
11364 if (!__make<__nested_delimeter>(name, __root_))
11365 return first;
11366 name = __root_;
11367 }
11368 t = t2+1;
11369 }
11370 t2 = __parse_base_unresolved_name(t, last);
11371 if (t2 != t && __make<__unresolved_name>(global, name, __root_))
11372 first = t2;
11373 }
11374 }
11375 }
11376 return first;
11377}
11378
11379// <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter
11380// ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters
11381// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter
11382// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers>
11383
11384const char*
11385__demangle_tree::__parse_function_param(const char* first, const char* last)
11386{
11387 if (last - first >= 3 && *first == 'f')
11388 {
11389 if (first[1] == 'p')
11390 {
11391 assert(!"__parse_function_param not implemented");
11392 }
11393 else if (first[1] == 'L')
11394 {
11395 assert(!"__parse_function_param not implemented");
11396 }
11397 }
11398 return first;
11399}
11400
11401// at <type> # alignof (a type)
11402
11403const char*
11404__demangle_tree::__parse_alignof_expr(const char* first, const char* last)
11405{
11406 if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
11407 {
11408 const char* t = __parse_type(first+2, last);
11409 if (t != first+2)
11410 {
11411 if (__make<__operator_alignof_expression>(__root_))
11412 first = t;
11413 }
11414 }
11415 return first;
11416}
11417
11418// cc <type> <expression> # const_cast<type> (expression)
11419
11420const char*
11421__demangle_tree::__parse_const_cast_expr(const char* first, const char* last)
11422{
11423 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
11424 {
11425 const char* t = __parse_type(first+2, last);
11426 if (t != first+2)
11427 {
11428 __node* type = __root_;
11429 const char* t1 = __parse_expression(t, last);
11430 if (t1 != t)
11431 {
11432 if (__make<__const_cast>(type, __root_))
11433 first = t1;
11434 }
11435 }
11436 }
11437 return first;
11438}
11439
11440// cl <expression>+ E # call
11441
11442const char*
11443__demangle_tree::__parse_call_expr(const char* first, const char* last)
11444{
11445 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
11446 {
11447 const char* t = __parse_expression(first+2, last);
11448 if (t != first+2)
11449 {
11450 if (t == last)
11451 return first;
11452 __node* name = __root_;
11453 __node* args = 0;
11454 __node* prev = 0;
11455 while (*t != 'E')
11456 {
11457 const char* t1 = __parse_expression(t, last);
11458 if (t1 == t || t1 == last)
11459 return first;
11460 if (!__make<__list>(__root_))
11461 return first;
11462 if (args == 0)
11463 args = __root_;
11464 if (prev)
11465 {
11466 prev->__right_ = __root_;
11467 __root_->__size_ = prev->__size_ + 1;
11468 }
11469 prev = __root_;
11470 t = t1;
11471 }
11472 ++t;
11473 if (__make<__call_expr>(name, args))
11474 first = t;
11475 }
11476 }
11477 return first;
11478}
11479
11480// cv <type> <expression> # conversion with one argument
11481// cv <type> _ <expression>* E # conversion with a different number of arguments
11482
11483const char*
11484__demangle_tree::__parse_conversion_expr(const char* first, const char* last)
11485{
11486 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
11487 {
11488 const char* t = __parse_type(first+2, last);
11489 if (t != first+2 && t != last)
11490 {
11491 __node* type = __root_;
11492 __node* args = 0;
11493 if (*t != '_')
11494 {
11495 const char* t1 = __parse_expression(t, last);
11496 if (t1 == t)
11497 return first;
11498 args = __root_;
11499 t = t1;
11500 }
11501 else
11502 {
11503 ++t;
11504 if (t == last)
11505 return first;
11506 __node* prev = 0;
11507 while (*t != 'E')
11508 {
11509 const char* t1 = __parse_expression(t, last);
11510 if (t1 == t || t1 == last)
11511 return first;
11512 if (!__make<__list>(__root_))
11513 return first;
11514 if (args == 0)
11515 args = __root_;
11516 if (prev)
11517 {
11518 prev->__right_ = __root_;
11519 __root_->__size_ = prev->__size_ + 1;
11520 }
11521 prev = __root_;
11522 t = t1;
11523 }
11524 ++t;
11525 }
11526 if (__make<__operator_cast>(type, args))
11527 first = t;
11528 }
11529 }
11530 return first;
11531}
11532
11533// [gs] da <expression> # delete[] expression
11534
11535const char*
11536__demangle_tree::__parse_delete_array_expr(const char* first, const char* last)
11537{
11538 if (last - first >= 4)
11539 {
11540 const char* t = first;
11541 bool parsed_gs = false;
11542 if (t[0] == 'g' && t[1] == 's')
11543 {
11544 t += 2;
11545 parsed_gs = true;
11546 }
11547 if (t[0] == 'd' && t[1] == 'a')
11548 {
11549 t += 2;
11550 const char* t1 = __parse_expression(t, last);
11551 if (t1 != t)
11552 {
11553 if (__make<__delete_array_expr>(parsed_gs, __root_))
11554 first = t1;
11555 }
11556 }
11557 }
11558 return first;
11559}
11560
11561// dc <type> <expression> # dynamic_cast<type> (expression)
11562
11563const char*
11564__demangle_tree::__parse_dynamic_cast_expr(const char* first, const char* last)
11565{
11566 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
11567 {
11568 const char* t = __parse_type(first+2, last);
11569 if (t != first+2)
11570 {
11571 __node* type = __root_;
11572 const char* t1 = __parse_expression(t, last);
11573 if (t1 != t)
11574 {
11575 if (__make<__dynamic_cast>(type, __root_))
11576 first = t1;
11577 }
11578 }
11579 }
11580 return first;
11581}
11582
11583// [gs] dl <expression> # delete expression
11584
11585const char*
11586__demangle_tree::__parse_delete_expr(const char* first, const char* last)
11587{
11588 if (last - first >= 4)
11589 {
11590 const char* t = first;
11591 bool parsed_gs = false;
11592 if (t[0] == 'g' && t[1] == 's')
11593 {
11594 t += 2;
11595 parsed_gs = true;
11596 }
11597 if (t[0] == 'd' && t[1] == 'l')
11598 {
11599 t += 2;
11600 const char* t1 = __parse_expression(t, last);
11601 if (t1 != t)
11602 {
11603 if (__make<__delete_expr>(parsed_gs, __root_))
11604 first = t1;
11605 }
11606 }
11607 }
11608 return first;
11609}
11610
11611// ds <expression> <expression> # expr.*expr
11612
11613const char*
11614__demangle_tree::__parse_dot_star_expr(const char* first, const char* last)
11615{
11616 if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
11617 {
11618 const char* t = __parse_expression(first+2, last);
11619 if (t != first+2)
11620 {
11621 __node* expr = __root_;
11622 const char* t1 = __parse_expression(t, last);
11623 if (t1 != t)
11624 {
11625 if (__make<__dot_star_expr>(expr, __root_))
11626 first = t1;
11627 }
11628 }
11629 }
11630 return first;
11631}
11632
11633// dt <expression> <unresolved-name> # expr.name
11634
11635const char*
11636__demangle_tree::__parse_dot_expr(const char* first, const char* last)
11637{
11638 if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
11639 {
11640 const char* t = __parse_expression(first+2, last);
11641 if (t != first+2)
11642 {
11643 __node* expr = __root_;
11644 const char* t1 = __parse_unresolved_name(t, last);
11645 if (t1 != t)
11646 {
11647 if (__make<__dot_expr>(expr, __root_))
11648 first = t1;
11649 }
11650 }
11651 }
11652 return first;
11653}
11654
11655// mm_ <expression> # prefix --
11656
11657const char*
11658__demangle_tree::__parse_decrement_expr(const char* first, const char* last)
11659{
11660 if (last - first > 3 && first[0] == 'm' && first[1] == 'm' && first[2] == '_')
11661 {
11662 const char* t = __parse_expression(first+3, last);
11663 if (t != first+3)
11664 {
11665 if (__make<__operator_decrement>(true, __root_))
11666 first = t;
11667 }
11668 }
11669 return first;
11670}
11671
11672// pp_ <expression> # prefix ++
11673
11674const char*
11675__demangle_tree::__parse_increment_expr(const char* first, const char* last)
11676{
11677 if (last - first > 3 && first[0] == 'p' && first[1] == 'p' && first[2] == '_')
11678 {
11679 const char* t = __parse_expression(first+3, last);
11680 if (t != first+3)
11681 {
11682 if (__make<__operator_increment>(true, __root_))
11683 first = t;
11684 }
11685 }
11686 return first;
11687}
11688
11689// [gs] nw <expression>* _ <type> E # new (expr-list) type
11690// [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
11691// [gs] na <expression>* _ <type> E # new[] (expr-list) type
11692// [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
11693// <initializer> ::= pi <expression>* E # parenthesized initialization
11694
11695const char*
11696__demangle_tree::__parse_new_expr(const char* first, const char* last)
11697{
11698 if (last - first >= 4)
11699 {
11700 const char* t = first;
11701 bool parsed_gs = false;
11702 if (t[0] == 'g' && t[1] == 's')
11703 {
11704 t += 2;
11705 parsed_gs = true;
11706 }
11707 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
11708 {
11709 bool is_array = t[1] == 'a';
11710 t += 2;
11711 if (t == last)
11712 return first;
11713 __node* expr = 0;
11714 __node* prev = 0;
11715 while (*t != '_')
11716 {
11717 const char* t1 = __parse_expression(t, last);
11718 if (t1 == t || t1 == last)
11719 return first;
11720 if (!__make<__list>(__root_))
11721 return first;
11722 if (expr == 0)
11723 expr = __root_;
11724 if (prev)
11725 {
11726 prev->__right_ = __root_;
11727 __root_->__size_ = prev->__size_ + 1;
11728 }
11729 prev = __root_;
11730 t = t1;
11731 }
11732 ++t;
11733 const char* t1 = __parse_type(t, last);
11734 if (t1 == t || t1 == last)
11735 return first;
11736 t = t1;
11737 __node* type = __root_;
11738 __node* init = 0;
11739 prev = 0;
11740 bool has_init = false;
11741 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
11742 {
11743 t += 2;
11744 has_init = true;
11745 while (*t != 'E')
11746 {
11747 t1 = __parse_expression(t, last);
11748 if (t1 == t || t1 == last)
11749 return first;
11750 if (!__make<__list>(__root_))
11751 return first;
11752 if (init == 0)
11753 init = __root_;
11754 if (prev)
11755 {
11756 prev->__right_ = __root_;
11757 __root_->__size_ = prev->__size_ + 1;
11758 }
11759 prev = __root_;
11760 t = t1;
11761 }
11762 }
11763 if (*t != 'E')
11764 return first;
11765 if (__make<__new_expr>(parsed_gs, is_array, has_init,
11766 expr, type, init))
11767 first = t;
11768 }
11769 }
11770 return first;
11771}
11772
11773// pt <expression> <unresolved-name> # expr->name
11774
11775const char*
11776__demangle_tree::__parse_arrow_expr(const char* first, const char* last)
11777{
11778 if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
11779 {
11780 const char* t = __parse_expression(first+2, last);
11781 if (t != first+2)
11782 {
11783 __node* expr = __root_;
11784 const char* t1 = __parse_unresolved_name(t, last);
11785 if (t1 != t)
11786 {
11787 if (__make<__arrow_expr>(expr, __root_))
11788 first = t1;
11789 }
11790 }
11791 }
11792 return first;
11793}
11794
11795// rc <type> <expression> # reinterpret_cast<type> (expression)
11796
11797const char*
11798__demangle_tree::__parse_reinterpret_cast_expr(const char* first, const char* last)
11799{
11800 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
11801 {
11802 const char* t = __parse_type(first+2, last);
11803 if (t != first+2)
11804 {
11805 __node* type = __root_;
11806 const char* t1 = __parse_expression(t, last);
11807 if (t1 != t)
11808 {
11809 if (__make<__reinterpret_cast>(type, __root_))
11810 first = t1;
11811 }
11812 }
11813 }
11814 return first;
11815}
11816
11817// sc <type> <expression> # static_cast<type> (expression)
11818
11819const char*
11820__demangle_tree::__parse_static_cast_expr(const char* first, const char* last)
11821{
11822 if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
11823 {
11824 const char* t = __parse_type(first+2, last);
11825 if (t != first+2)
11826 {
11827 __node* type = __root_;
11828 const char* t1 = __parse_expression(t, last);
11829 if (t1 != t)
11830 {
11831 if (__make<__static_cast>(type, __root_))
11832 first = t1;
11833 }
11834 }
11835 }
11836 return first;
11837}
11838
11839// st <type> # sizeof (a type)
11840
11841const char*
11842__demangle_tree::__parse_sizeof_type_expr(const char* first, const char* last)
11843{
11844 if (last - first >= 3 && first[0] == 's' && first[1] == 't')
11845 {
11846 const char* t = __parse_type(first+2, last);
11847 if (t != first+2)
11848 {
11849 if (__make<__operator_sizeof_expression>(__root_))
11850 first = t;
11851 }
11852 }
11853 return first;
11854}
11855
11856// sZ <template-param> # size of a parameter pack
11857
11858const char*
11859__demangle_tree::__parse_sizeof_param_pack_expr(const char* first, const char* last)
11860{
11861 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
11862 {
11863 const char* t = __parse_template_param(first+2, last);
11864 if (t != first+2)
11865 {
11866 if (__make<__operator_sizeof_param_pack>(__root_))
11867 first = t;
11868 }
11869 }
11870 return first;
11871}
11872
11873// sZ <function-param> # size of a function parameter pack
11874
11875const char*
11876__demangle_tree::__parse_sizeof_function_param_pack_expr(const char* first, const char* last)
11877{
11878 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
11879 {
11880 const char* t = __parse_function_param(first+2, last);
11881 if (t != first+2)
11882 {
11883 if (__make<__operator_sizeof_param_pack>(__root_))
11884 first = t;
11885 }
11886 }
11887 return first;
11888}
11889
11890// sp <expression> # pack expansion
11891
11892const char*
11893__demangle_tree::__parse_pack_expansion(const char* first, const char* last)
11894{
11895 if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
11896 {
11897 const char* t = __parse_expression(first+2, last);
11898 if (t != first+2)
11899 {
11900 if (__make<__pack_expansion>(__root_))
11901 first = t;
11902 }
11903 }
11904 return first;
11905}
11906
11907// te <expression> # typeid (expression)
11908// ti <type> # typeid (type)
11909
11910const char*
11911__demangle_tree::__parse_typeid_expr(const char* first, const char* last)
11912{
11913 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
11914 {
11915 const char* t;
11916 if (first[1] == 'e')
11917 t = __parse_expression(first+2, last);
11918 else
11919 t = __parse_type(first+2, last);
11920 if (t != first+2)
11921 {
11922 if (__make<__typeid>(__root_))
11923 first = t;
11924 }
11925 }
11926 return first;
11927}
11928
11929// tw <expression> # throw expression
11930
11931const char*
11932__demangle_tree::__parse_throw_expr(const char* first, const char* last)
11933{
11934 if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
11935 {
11936 const char* t = __parse_expression(first+2, last);
11937 if (t != first+2)
11938 {
11939 if (__make<__throw>(__root_))
11940 first = t;
11941 }
11942 }
11943 return first;
11944}
11945
11946// <expression> ::= <unary operator-name> <expression>
11947// ::= <binary operator-name> <expression> <expression>
11948// ::= <ternary operator-name> <expression> <expression> <expression>
11949// ::= cl <expression>+ E # call
11950// ::= cv <type> <expression> # conversion with one argument
11951// ::= cv <type> _ <expression>* E # conversion with a different number of arguments
11952// ::= [gs] nw <expression>* _ <type> E # new (expr-list) type
11953// ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
11954// ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type
11955// ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
11956// ::= [gs] dl <expression> # delete expression
11957// ::= [gs] da <expression> # delete[] expression
11958// ::= pp_ <expression> # prefix ++
11959// ::= mm_ <expression> # prefix --
11960// ::= ti <type> # typeid (type)
11961// ::= te <expression> # typeid (expression)
11962// ::= dc <type> <expression> # dynamic_cast<type> (expression)
11963// ::= sc <type> <expression> # static_cast<type> (expression)
11964// ::= cc <type> <expression> # const_cast<type> (expression)
11965// ::= rc <type> <expression> # reinterpret_cast<type> (expression)
11966// ::= st <type> # sizeof (a type)
11967// ::= at <type> # alignof (a type)
11968// ::= <template-param>
11969// ::= <function-param>
11970// ::= dt <expression> <unresolved-name> # expr.name
11971// ::= pt <expression> <unresolved-name> # expr->name
11972// ::= ds <expression> <expression> # expr.*expr
11973// ::= sZ <template-param> # size of a parameter pack
11974// ::= sZ <function-param> # size of a function parameter pack
11975// ::= sp <expression> # pack expansion
11976// ::= tw <expression> # throw expression
11977// ::= tr # throw with no operand (rethrow)
11978// ::= <unresolved-name> # f(p), N::f(p), ::f(p),
11979// # freestanding dependent name (e.g., T::x),
11980// # objectless nonstatic member reference
11981// ::= <expr-primary>
11982
11983const char*
11984__demangle_tree::__parse_expression(const char* first, const char* last)
11985{
11986 if (last - first >= 2)
11987 {
11988 const char* t = first;
11989 bool parsed_gs = false;
11990 if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
11991 {
11992 t += 2;
11993 parsed_gs = true;
11994 }
11995 switch (*t)
11996 {
11997 case 'L':
11998 t = __parse_expr_primary(first, last);
11999 break;
12000 case 'T':
12001 t = __parse_template_param(first, last);
12002 break;
12003 case 'f':
12004 t = __parse_function_param(first, last);
12005 break;
12006 case 'a':
12007 if (t[1] == 't')
12008 t = __parse_alignof_expr(first, last);
12009 break;
12010 case 'c':
12011 switch (t[1])
12012 {
12013 case 'c':
12014 t = __parse_const_cast_expr(first, last);
12015 break;
12016 case 'l':
12017 t = __parse_call_expr(first, last);
12018 break;
12019 case 'v':
12020 t = __parse_conversion_expr(first, last);
12021 break;
12022 }
12023 break;
12024 case 'd':
12025 switch (t[1])
12026 {
12027 case 'a':
12028 t = __parse_delete_array_expr(first, last);
12029 break;
12030 case 'c':
12031 t = __parse_dynamic_cast_expr(first, last);
12032 break;
12033 case 'l':
12034 t = __parse_delete_expr(first, last);
12035 break;
12036 case 's':
12037 t = __parse_dot_star_expr(first, last);
12038 break;
12039 case 't':
12040 t = __parse_dot_expr(first, last);
12041 break;
12042 }
12043 break;
12044 case 'm':
12045 t = __parse_decrement_expr(first, last);
12046 break;
12047 case 'n':
12048 switch (t[1])
12049 {
12050 case 'a':
12051 case 'w':
12052 t = __parse_new_expr(first, last);
12053 break;
12054 }
12055 break;
12056 case 'p':
12057 switch (t[1])
12058 {
12059 case 'p':
12060 t = __parse_increment_expr(first, last);
12061 break;
12062 case 't':
12063 t = __parse_arrow_expr(first, last);
12064 break;
12065 }
12066 break;
12067 case 'r':
12068 t = __parse_reinterpret_cast_expr(first, last);
12069 break;
12070 case 's':
12071 switch (t[1])
12072 {
12073 case 'c':
12074 t = __parse_static_cast_expr(first, last);
12075 break;
12076 case 'p':
12077 t = __parse_pack_expansion(first, last);
12078 break;
12079 case 't':
12080 t = __parse_sizeof_type_expr(first, last);
12081 break;
12082 case 'Z':
12083 if (last - t >= 3)
12084 {
12085 switch (t[2])
12086 {
12087 case 'T':
12088 t = __parse_sizeof_param_pack_expr(first, last);
12089 break;
12090 case 'f':
12091 t = __parse_sizeof_function_param_pack_expr(first, last);
12092 break;
12093 }
12094 }
12095 break;
12096 }
12097 break;
12098 case 't':
12099 switch (t[1])
12100 {
12101 case 'e':
12102 case 'i':
12103 t = __parse_typeid_expr(first, last);
12104 break;
12105 case 'r':
12106 if (__make<__rethrow>())
12107 t = first +2;
12108 break;
12109 case 'w':
12110 t = __parse_throw_expr(first, last);
12111 break;
12112 }
12113 break;
12114 }
12115 if ((!parsed_gs && t == first) || (parsed_gs && t == first+2))
12116 {
12117 int op;
12118 t = __parse_operator_name(first, last, &op);
12119 if (t == first)
12120 first = __parse_unresolved_name(first, last);
12121 else
12122 first = t;
12123 }
12124 else
12125 first = t;
12126 }
12127 return first;
12128}
12129
12130// <array-type> ::= A <positive dimension number> _ <element type>
12131// ::= A [<dimension expression>] _ <element type>
12132
12133const char*
12134__demangle_tree::__parse_array_type(const char* first, const char* last)
12135{
12136 if (first != last && *first == 'A' && first+1 != last)
12137 {
12138 if (first[1] == '_')
12139 {
12140 const char* t = __parse_type(first+2, last);
12141 if (t != first+2)
12142 {
12143 if (__make<__array>(__root_))
12144 first = t;
12145 }
12146 }
12147 else if ('1' <= first[1] && first[1] <= '9')
12148 {
12149 size_t dim = first[1] - '0';
12150 const char* t = first+2;
12151 for (; t != last && isdigit(*t); ++t)
12152 dim = dim * 10 + *t - '0';
12153 if (t != last && *t == '_')
12154 {
12155 const char* t2 = __parse_type(t+1, last);
12156 if (t2 != t+1)
12157 {
12158 if (__make<__array>(__root_, dim))
12159 first = t2;
12160 }
12161 }
12162 }
12163 else
12164 {
12165 const char* t = __parse_expression(first+1, last);
12166 if (t != first+1 && t != last && *t == '_')
12167 {
12168 __node* dim = __root_;
12169 const char* t2 = __parse_type(++t, last);
12170 if (t2 != t)
12171 {
12172 if (__make<__array>(__root_, dim))
12173 first = t2;
12174 }
12175 }
12176 }
12177 }
12178 return first;
12179}
12180
12181// <class-enum-type> ::= <name>
12182
12183const char*
12184__demangle_tree::__parse_class_enum_type(const char* first, const char* last)
12185{
12186 return __parse_name(first, last);
12187}
12188
12189// <pointer-to-member-type> ::= M <class type> <member type>
12190
12191const char*
12192__demangle_tree::__parse_pointer_to_member_type(const char* first, const char* last)
12193{
12194 if (first != last && *first == 'M')
12195 {
12196 const char* t = __parse_type(first+1, last);
12197 if (t != first+1)
12198 {
12199 __node* class_type = __root_;
12200 const char* t2 = __parse_type(t, last, true, true);
12201 if (t2 != t)
12202 {
12203 if (__make<__pointer_to_member_type>(class_type, __root_))
12204 first = t2;
12205 }
12206 }
12207 }
12208 return first;
12209}
12210
12211// <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x)
12212// ::= DT <expression> E # decltype of an expression (C++0x)
12213
12214const char*
12215__demangle_tree::__parse_decltype(const char* first, const char* last)
12216{
12217 if (last - first >= 4 && first[0] == 'D')
12218 {
12219 switch (first[1])
12220 {
12221 case 't':
12222 case 'T':
12223 {
12224 const char* t = __parse_expression(first+2, last);
12225 if (t != first+2 && t != last && *t == 'E')
12226 {
12227 if (__make<__decltype_node>(__root_))
12228 first = t+1;
12229 }
12230 }
12231 break;
12232 }
12233 }
12234 return first;
12235}
12236
12237// <template-param> ::= T_ # first template parameter
12238// ::= T <parameter-2 non-negative number> _
12239
12240const char*
12241__demangle_tree::__parse_template_param(const char* first, const char* last)
12242{
12243 if (last - first >= 2)
12244 {
12245 if (*first == 'T')
12246 {
12247 if (first[1] == '_')
12248 {
12249 if (__t_begin_ != __t_end_)
12250 {
12251 if (__make<__sub>(*__t_begin_))
12252 first += 2;
12253 }
12254 else
12255 {
12256 if (__make<__sub>(size_t(0)))
12257 {
12258 first += 2;
12259 __fix_forward_references_ = true;
12260 }
12261 }
12262 }
12263 else if (isdigit(first[1]))
12264 {
12265 const char* t = first+1;
12266 size_t sub = *t - '0';
12267 for (++t; t != last && isdigit(*t); ++t)
12268 {
12269 sub *= 10;
12270 sub += *t - '0';
12271 }
12272 if (t == last || *t != '_')
12273 return first;
12274 ++sub;
12275 if (sub < __t_end_ - __t_begin_)
12276 {
12277 if (__make<__sub>(__t_begin_[sub]))
12278 first = t+1;
12279 }
12280 else
12281 {
12282 if (__make<__sub>(sub))
12283 {
12284 first = t+1;
12285 __fix_forward_references_ = true;
12286 }
12287 }
12288 }
12289 }
12290 }
12291 return first;
12292}
12293
12294// <type> ::= <builtin-type>
12295// ::= <function-type>
12296// ::= <class-enum-type>
12297// ::= <array-type>
12298// ::= <pointer-to-member-type>
12299// ::= <template-param>
12300// ::= <template-template-param> <template-args>
12301// ::= <decltype>
12302// ::= <substitution>
12303// ::= <CV-qualifiers> <type>
12304// ::= P <type> # pointer-to
12305// ::= R <type> # reference-to
12306// ::= O <type> # rvalue reference-to (C++0x)
12307// ::= C <type> # complex pair (C 2000)
12308// ::= G <type> # imaginary (C 2000)
12309// ::= Dp <type> # pack expansion (C++0x)
12310// ::= U <source-name> <type> # vendor extended type qualifier
12311
12312const char*
12313__demangle_tree::__parse_type(const char* first, const char* last,
12314 bool try_to_parse_template_args,
12315 bool look_for_ref_quals)
12316{
12317 unsigned cv = 0;
12318 const char* t = __parse_cv_qualifiers(first, last, cv, look_for_ref_quals);
12319 if (t != first)
12320 {
12321 const char* t2 = __parse_type(t, last, try_to_parse_template_args);
12322 if (t2 != t)
12323 {
12324 if (__make<__cv_qualifiers>(cv, __root_))
12325 {
12326 if (__sub_end_ == __sub_cap_)
12327 __status_ = memory_alloc_failure;
12328 else
12329 {
12330 *__sub_end_++ = __root_;
12331 first = t2;
12332 }
12333 }
12334 }
12335 return first;
12336 }
12337 if (first != last)
12338 {
12339 switch (*first)
12340 {
12341 case 'A':
12342 t = __parse_array_type(first, last);
12343 if (t != first)
12344 {
12345 if (__sub_end_ == __sub_cap_)
12346 __status_ = memory_alloc_failure;
12347 else
12348 {
12349 *__sub_end_++ = __root_;
12350 first = t;
12351 }
12352 }
12353 break;
12354 case 'C':
12355 t = __parse_type(first+1, last, try_to_parse_template_args);
12356 if (t != first+1)
12357 {
12358 if (__make<__d_complex>(__root_))
12359 {
12360 if (__sub_end_ == __sub_cap_)
12361 __status_ = memory_alloc_failure;
12362 else
12363 {
12364 *__sub_end_++ = __root_;
12365 first = t;
12366 }
12367 }
12368 return first;
12369 }
12370 break;
12371 case 'F':
12372 t = __parse_function_type(first, last);
12373 if (t != first)
12374 {
12375 if (__sub_end_ == __sub_cap_)
12376 __status_ = memory_alloc_failure;
12377 else
12378 {
12379 *__sub_end_++ = __root_;
12380 first = t;
12381 }
12382 }
12383 break;
12384 case 'G':
12385 t = __parse_type(first+1, last, try_to_parse_template_args);
12386 if (t != first+1)
12387 {
12388 if (__make<__imaginary>(__root_))
12389 {
12390 if (__sub_end_ == __sub_cap_)
12391 __status_ = memory_alloc_failure;
12392 else
12393 {
12394 *__sub_end_++ = __root_;
12395 first = t;
12396 }
12397 }
12398 return first;
12399 }
12400 break;
12401 case 'M':
12402 t = __parse_pointer_to_member_type(first, last);
12403 if (t != first)
12404 {
12405 if (__sub_end_ == __sub_cap_)
12406 __status_ = memory_alloc_failure;
12407 else
12408 {
12409 *__sub_end_++ = __root_;
12410 first = t;
12411 }
12412 }
12413 break;
12414 case 'O':
12415 t = __parse_type(first+1, last, try_to_parse_template_args);
12416 if (t != first+1)
12417 {
12418 if (__make<__rvalue_reference_to>(__root_))
12419 {
12420 if (__sub_end_ == __sub_cap_)
12421 __status_ = memory_alloc_failure;
12422 else
12423 {
12424 *__sub_end_++ = __root_;
12425 first = t;
12426 }
12427 }
12428 return first;
12429 }
12430 break;
12431 case 'P':
12432 t = __parse_type(first+1, last, try_to_parse_template_args);
12433 if (t != first+1)
12434 {
12435 if (__make<__pointer_to>(__root_))
12436 {
12437 if (__sub_end_ == __sub_cap_)
12438 __status_ = memory_alloc_failure;
12439 else
12440 {
12441 *__sub_end_++ = __root_;
12442 first = t;
12443 }
12444 }
12445 return first;
12446 }
12447 break;
12448 case 'R':
12449 t = __parse_type(first+1, last, try_to_parse_template_args);
12450 if (t != first+1)
12451 {
12452 if (__make<__lvalue_reference_to>(__root_))
12453 {
12454 if (__sub_end_ == __sub_cap_)
12455 __status_ = memory_alloc_failure;
12456 else
12457 {
12458 *__sub_end_++ = __root_;
12459 first = t;
12460 }
12461 }
12462 return first;
12463 }
12464 break;
12465 case 'T':
12466 t = __parse_template_param(first, last);
12467 if (t != first)
12468 {
12469 if (__sub_end_ == __sub_cap_)
12470 __status_ = memory_alloc_failure;
12471 else
12472 {
12473 *__sub_end_++ = __root_;
12474 if (try_to_parse_template_args)
12475 {
12476 __node* temp = __root_;
12477 const char* t2 = __parse_template_args(t, last);
12478 if (t2 != t)
12479 {
12480 if (__sub_end_ < __sub_cap_)
12481 {
12482 *__sub_end_++ = __root_;
12483 first = t2;
12484 }
12485 else
12486 __status_ = memory_alloc_failure;
12487 }
12488 else
12489 {
12490 first = t;
12491 }
12492 }
12493 else
12494 {
12495 first = t;
12496 }
12497 }
12498 }
12499 break;
12500 case 'U':
12501 if (first+1 != last)
12502 {
12503 t = __parse_source_name(first+1, last);
12504 if (t != first+1)
12505 {
12506 __node* name = __root_;
12507 const char* t2 = __parse_type(t, last, try_to_parse_template_args);
12508 if (t2 != t)
12509 {
12510 if (__make<__extended_qualifier>(name, __root_))
12511 {
12512 if (__sub_end_ == __sub_cap_)
12513 __status_ = memory_alloc_failure;
12514 else
12515 {
12516 *__sub_end_++ = __root_;
12517 first = t2;
12518 }
12519 }
12520 return first;
12521 }
12522 }
12523 }
12524 break;
12525 case 'S':
12526 if (first+1 != last && first[1] == 't')
12527 {
12528 t = __parse_class_enum_type(first, last);
12529 if (t != first)
12530 {
12531 if (__sub_end_ == __sub_cap_)
12532 __status_ = memory_alloc_failure;
12533 else
12534 {
12535 *__sub_end_++ = __root_;
12536 first = t;
12537 }
12538 }
12539 }
12540 else
12541 {
12542 t = __parse_substitution(first, last);
12543 if (t != first)
12544 {
12545 first = t;
12546 // Parsed a substitution. If the substitution is a
12547 // <template-param> it might be followed by <template-args>.
12548 t = __parse_template_args(first, last);
12549 if (t != first)
12550 {
12551 // Need to create substitution for <template-template-param> <template-args>
12552 if (__sub_end_ == __sub_cap_)
12553 __status_ = memory_alloc_failure;
12554 else
12555 {
12556 *__sub_end_++ = __root_;
12557 first = t;
12558 }
12559 }
12560 }
12561 }
12562 break;
12563 case 'D':
12564 if (first+1 != last)
12565 {
12566 switch (first[1])
12567 {
12568 case 'p':
12569 t = __parse_type(first+2, last, try_to_parse_template_args);
12570 if (t != first+1)
12571 {
12572 if (__make<__pack_expansion>(__root_))
12573 {
12574 if (__sub_end_ == __sub_cap_)
12575 __status_ = memory_alloc_failure;
12576 else
12577 {
12578 *__sub_end_++ = __root_;
12579 first = t;
12580 }
12581 }
12582 return first;
12583 }
12584 break;
12585 case 't':
12586 case 'T':
12587 t = __parse_decltype(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 return first;
12598 }
12599 break;
12600 }
12601 }
12602 // drop through
12603 default:
12604 // must check for builtin-types before class-enum-types to avoid
12605 // ambiguities with operator-names
12606 t = __parse_builtin_type(first, last);
12607 if (t != first)
12608 {
12609 first = t;
12610 }
12611 else
12612 {
12613 t = __parse_class_enum_type(first, last);
12614 if (t != first)
12615 {
12616 if (__sub_end_ == __sub_cap_)
12617 __status_ = memory_alloc_failure;
12618 else
12619 {
12620 *__sub_end_++ = __root_;
12621 first = t;
12622 }
12623 }
12624 }
12625 break;
12626 }
12627 }
12628 return first;
12629}
12630
12631// <number> ::= [n] <non-negative decimal integer>
12632
12633const char*
12634__demangle_tree::__parse_number(const char* first, const char* last)
12635{
12636 if (first != last)
12637 {
12638 const char* t = first;
12639 if (*t == 'n')
12640 ++t;
12641 if (t != last)
12642 {
12643 if (*t == '0')
12644 {
12645 first = t+1;
12646 }
12647 else if ('1' <= *t && *t <= '9')
12648 {
12649 first = t+1;
12650 while (first != last && isdigit(*first))
12651 ++first;
12652 }
12653 }
12654 }
12655 return first;
12656}
12657
12658// <call-offset> ::= h <nv-offset> _
12659// ::= v <v-offset> _
12660//
12661// <nv-offset> ::= <offset number>
12662// # non-virtual base override
12663//
12664// <v-offset> ::= <offset number> _ <virtual offset number>
12665// # virtual base override, with vcall offset
12666
12667const char*
12668__demangle_tree::__parse_call_offset(const char* first, const char* last)
12669{
12670 if (first != last)
12671 {
12672 switch (*first)
12673 {
12674 case 'h':
12675 {
12676 const char* t = __parse_number(first + 1, last);
12677 if (t != first + 1 && t != last && *t == '_')
12678 first = t + 1;
12679 }
12680 break;
12681 case 'v':
12682 {
12683 const char* t = __parse_number(first + 1, last);
12684 if (t != first + 1 && t != last && *t == '_')
12685 {
12686 const char* t2 = __parse_number(++t, last);
12687 if (t2 != t && t2 != last && *t2 == '_')
12688 first = t2 + 1;
12689 }
12690 }
12691 break;
12692 }
12693 }
12694 return first;
12695}
12696
12697// <special-name> ::= TV <type> # virtual table
12698// ::= TT <type> # VTT structure (construction vtable index)
12699// ::= TI <type> # typeinfo structure
12700// ::= TS <type> # typeinfo name (null-terminated byte string)
12701// ::= Tc <call-offset> <call-offset> <base encoding>
12702// # base is the nominal target function of thunk
12703// # first call-offset is 'this' adjustment
12704// # second call-offset is result adjustment
12705// ::= T <call-offset> <base encoding>
12706// # base is the nominal target function of thunk
12707// ::= GV <object name> # Guard variable for one-time initialization
12708// # No <type>
12709
12710const char*
12711__demangle_tree::__parse_special_name(const char* first, const char* last)
12712{
12713 if (last - first > 2)
12714 {
12715 const char* t;
12716 switch (*first)
12717 {
12718 case 'T':
12719 switch (first[1])
12720 {
12721 case 'V':
12722 // TV <type> # virtual table
12723 t = __parse_type(first+2, last);
12724 if (t != first+2 && __make<__vtable>(__root_))
12725 first = t;
12726 break;
12727 case 'T':
12728 // TT <type> # VTT structure (construction vtable index)
12729 t = __parse_type(first+2, last);
12730 if (t != first+2 && __make<__VTT>(__root_))
12731 first = t;
12732 break;
12733 case 'I':
12734 // TI <type> # typeinfo structure
12735 t = __parse_type(first+2, last);
12736 if (t != first+2 && __make<__typeinfo>(__root_))
12737 first = t;
12738 break;
12739 case 'S':
12740 // TS <type> # typeinfo name (null-terminated byte string)
12741 t = __parse_type(first+2, last);
12742 if (t != first+2 && __make<__typeinfo_name>(__root_))
12743 first = t;
12744 break;
12745 case 'c':
12746 // Tc <call-offset> <call-offset> <base encoding>
12747 {
12748 const char* t0 = __parse_call_offset(first+2, last);
12749 if (t0 == first+2)
12750 break;
12751 const char* t1 = __parse_call_offset(t0, last);
12752 if (t1 == t0)
12753 break;
12754 t = __parse_encoding(t1, last);
12755 if (t != t1 && __make<__covariant_return_thunk>(__root_))
12756 first = t;
12757 }
12758 break;
12759 default:
12760 // T <call-offset> <base encoding>
12761 {
12762 const char* t0 = __parse_call_offset(first+1, last);
12763 if (t0 == first+1)
12764 break;
12765 t = __parse_encoding(t0, last);
12766 if (t != t0)
12767 {
12768 if (first[2] == 'v')
12769 {
12770 if (__make<__virtual_thunk>(__root_))
12771 first = t;
12772 }
12773 else
12774 {
12775 if (__make<__non_virtual_thunk>(__root_))
12776 first = t;
12777 }
12778 }
12779 }
12780 break;
12781 }
12782 break;
12783 case 'G':
12784 if (first[1] == 'V')
12785 {
12786 // GV <object name> # Guard variable for one-time initialization
12787 t = __parse_name(first+2, last);
12788 if (t != first+2 && __make<__guard_variable>(__root_))
12789 first = t;
12790 }
12791 break;
12792 }
12793 }
12794 return first;
12795}
12796
12797// <operator-name>
12798// ::= aa # &&
12799// ::= ad # & (unary)
12800// ::= an # &
12801// ::= aN # &=
12802// ::= aS # =
12803// ::= at # alignof (a type)
12804// ::= az # alignof (an expression)
12805// ::= cl # ()
12806// ::= cm # ,
12807// ::= co # ~
12808// ::= cv <type> # (cast)
12809// ::= da # delete[]
12810// ::= de # * (unary)
12811// ::= dl # delete
12812// ::= dv # /
12813// ::= dV # /=
12814// ::= eo # ^
12815// ::= eO # ^=
12816// ::= eq # ==
12817// ::= ge # >=
12818// ::= gt # >
12819// ::= ix # []
12820// ::= le # <=
12821// ::= ls # <<
12822// ::= lS # <<=
12823// ::= lt # <
12824// ::= mi # -
12825// ::= mI # -=
12826// ::= ml # *
12827// ::= mL # *=
12828// ::= mm # -- (postfix in <expression> context)
12829// ::= na # new[]
12830// ::= ne # !=
12831// ::= ng # - (unary)
12832// ::= nt # !
12833// ::= nw # new
12834// ::= oo # ||
12835// ::= or # |
12836// ::= oR # |=
12837// ::= pm # ->*
12838// ::= pl # +
12839// ::= pL # +=
12840// ::= pp # ++ (postfix in <expression> context)
12841// ::= ps # + (unary)
12842// ::= pt # ->
12843// ::= qu # ?
12844// ::= rm # %
12845// ::= rM # %=
12846// ::= rs # >>
12847// ::= rS # >>=
12848// ::= st # sizeof (a type)
12849// ::= sz # sizeof (an expression)
12850// ::= v <digit> <source-name> # vendor extended operator
12851
12852const char*
12853__demangle_tree::__parse_operator_name(const char* first, const char* last, int* type)
12854{
12855 if (last - first >= 2)
12856 {
12857 switch (*first)
12858 {
12859 case 'a':
12860 switch (first[1])
12861 {
12862 case 'a':
12863 // &&
12864 if (type)
12865 {
12866 const char* t = __parse_expression(first+2, last);
12867 if (t != first+2)
12868 {
12869 __node* op1 = __root_;
12870 const char* t2 = __parse_expression(t, last);
12871 if (t != t2)
12872 {
12873 if (__make<__operator_logical_and>(op1, __root_))
12874 {
12875 *type = 2;
12876 first = t2;
12877 }
12878 }
12879 }
12880 }
12881 else
12882 {
12883 if (__make<__operator_logical_and>())
12884 first += 2;
12885 }
12886 break;
12887 case 'd':
12888 // & (unary)
12889 if (type)
12890 {
12891 const char* t = __parse_expression(first+2, last);
12892 if (t != first+2)
12893 {
12894 if (__make<__operator_addressof>(__root_))
12895 {
12896 *type = 1;
12897 first = t;
12898 }
12899 }
12900 }
12901 else
12902 {
12903 if (__make<__operator_addressof>())
12904 first += 2;
12905 }
12906 break;
12907 case 'n':
12908 // &
12909 if (type)
12910 {
12911 const char* t = __parse_expression(first+2, last);
12912 if (t != first+2)
12913 {
12914 __node* op1 = __root_;
12915 const char* t2 = __parse_expression(t, last);
12916 if (t != t2)
12917 {
12918 if (__make<__operator_bit_and>(op1, __root_))
12919 {
12920 *type = 2;
12921 first = t2;
12922 }
12923 }
12924 }
12925 }
12926 else
12927 {
12928 if (__make<__operator_bit_and>())
12929 first += 2;
12930 }
12931 break;
12932 case 'N':
12933 // &=
12934 if (type)
12935 {
12936 const char* t = __parse_expression(first+2, last);
12937 if (t != first+2)
12938 {
12939 __node* op1 = __root_;
12940 const char* t2 = __parse_expression(t, last);
12941 if (t != t2)
12942 {
12943 if (__make<__operator_and_equal>(op1, __root_))
12944 {
12945 *type = 2;
12946 first = t2;
12947 }
12948 }
12949 }
12950 }
12951 else
12952 {
12953 if (__make<__operator_and_equal>())
12954 first += 2;
12955 }
12956 break;
12957 case 'S':
12958 // =
12959 if (type)
12960 {
12961 const char* t = __parse_expression(first+2, last);
12962 if (t != first+2)
12963 {
12964 __node* op1 = __root_;
12965 const char* t2 = __parse_expression(t, last);
12966 if (t != t2)
12967 {
12968 if (__make<__operator_equal>(op1, __root_))
12969 {
12970 *type = 2;
12971 first = t2;
12972 }
12973 }
12974 }
12975 }
12976 else
12977 {
12978 if (__make<__operator_equal>())
12979 first += 2;
12980 }
12981 break;
12982 case 't':
12983 // alignof (a type)
12984 if (type)
12985 {
12986 const char* t = __parse_expression(first+2, last);
12987 if (t != first+2)
12988 {
12989 if (__make<__operator_alignof_type>(__root_))
12990 {
12991 *type = -1;
12992 first = t;
12993 }
12994 }
12995 }
12996 else
12997 {
12998 if (__make<__operator_alignof_type>())
12999 first += 2;
13000 }
13001 break;
13002 case 'z':
13003 // alignof (an expression)
13004 if (type)
13005 {
13006 const char* t = __parse_expression(first+2, last);
13007 if (t != first+2)
13008 {
13009 if (__make<__operator_alignof_expression>(__root_))
13010 {
13011 *type = -1;
13012 first = t;
13013 }
13014 }
13015 }
13016 else
13017 {
13018 if (__make<__operator_alignof_expression>())
13019 first += 2;
13020 }
13021 break;
13022 }
13023 break;
13024 case 'c':
13025 switch (first[1])
13026 {
13027 case 'l':
13028 // ()
13029 if (__make<__operator_paren>())
13030 {
13031 first += 2;
13032 if (type)
13033 *type = -1;
13034 }
13035 break;
13036 case 'm':
13037 // ,
13038 if (type)
13039 {
13040 const char* t = __parse_expression(first+2, last);
13041 if (t != first+2)
13042 {
13043 __node* op1 = __root_;
13044 const char* t2 = __parse_expression(t, last);
13045 if (t != t2)
13046 {
13047 if (__make<__operator_comma>(op1, __root_))
13048 {
13049 *type = 2;
13050 first = t2;
13051 }
13052 }
13053 }
13054 }
13055 else
13056 {
13057 if (__make<__operator_comma>())
13058 first += 2;
13059 }
13060 break;
13061 case 'o':
13062 // ~
13063 if (type)
13064 {
13065 const char* t = __parse_expression(first+2, last);
13066 if (t != first+2)
13067 {
13068 if (__make<__operator_tilda>(__root_))
13069 {
13070 *type = 1;
13071 first = t;
13072 }
13073 }
13074 }
13075 else
13076 {
13077 if (__make<__operator_tilda>())
13078 first += 2;
13079 }
13080 break;
13081 case 'v':
13082 // cast <type>
13083 {
13084 const char* t = __parse_type(first+2, last, false);
13085 if (t != first+2)
13086 {
13087 __node* cast_type = __root_;
13088 if (type)
13089 {
13090 const char* t2 = __parse_expression(t, last);
13091 if (t2 != t)
13092 {
13093 if (__make<__operator_cast>(cast_type, __root_))
13094 {
13095 *type = -1;
13096 first = t2;
13097 }
13098 }
13099 }
13100 else
13101 {
13102 if (__make<__operator_cast>(cast_type))
13103 first = t;
13104 }
13105 }
13106 }
13107 break;
13108 }
13109 break;
13110 case 'd':
13111 switch (first[1])
13112 {
13113 case 'a':
13114 // delete[]
13115 if (__make<__operator_delete_array>())
13116 {
13117 first += 2;
13118 if (type)
13119 *type = -1;
13120 }
13121 break;
13122 case 'e':
13123 // * (unary)
13124 if (type)
13125 {
13126 const char* t = __parse_expression(first+2, last);
13127 if (t != first+2)
13128 {
13129 if (__make<__operator_dereference>(__root_))
13130 {
13131 *type = 1;
13132 first = t;
13133 }
13134 }
13135 }
13136 else
13137 {
13138 if (__make<__operator_dereference>())
13139 first += 2;
13140 }
13141 break;
13142 case 'l':
13143 // delete
13144 if (__make<__operator_delete>())
13145 {
13146 first += 2;
13147 if (type)
13148 *type = -1;
13149 }
13150 break;
13151 case 'v':
13152 // /
13153 if (type)
13154 {
13155 const char* t = __parse_expression(first+2, last);
13156 if (t != first+2)
13157 {
13158 __node* op1 = __root_;
13159 const char* t2 = __parse_expression(t, last);
13160 if (t != t2)
13161 {
13162 if (__make<__operator_divide>(op1, __root_))
13163 {
13164 *type = 2;
13165 first = t2;
13166 }
13167 }
13168 }
13169 }
13170 else
13171 {
13172 if (__make<__operator_divide>())
13173 first += 2;
13174 }
13175 break;
13176 case 'V':
13177 // /=
13178 if (type)
13179 {
13180 const char* t = __parse_expression(first+2, last);
13181 if (t != first+2)
13182 {
13183 __node* op1 = __root_;
13184 const char* t2 = __parse_expression(t, last);
13185 if (t != t2)
13186 {
13187 if (__make<__operator_divide_equal>(op1, __root_))
13188 {
13189 *type = 2;
13190 first = t2;
13191 }
13192 }
13193 }
13194 }
13195 else
13196 {
13197 if (__make<__operator_divide_equal>())
13198 first += 2;
13199 }
13200 break;
13201 }
13202 break;
13203 case 'e':
13204 switch (first[1])
13205 {
13206 case 'o':
13207 // ^
13208 if (type)
13209 {
13210 const char* t = __parse_expression(first+2, last);
13211 if (t != first+2)
13212 {
13213 __node* op1 = __root_;
13214 const char* t2 = __parse_expression(t, last);
13215 if (t != t2)
13216 {
13217 if (__make<__operator_xor>(op1, __root_))
13218 {
13219 *type = 2;
13220 first = t2;
13221 }
13222 }
13223 }
13224 }
13225 else
13226 {
13227 if (__make<__operator_xor>())
13228 first += 2;
13229 }
13230 break;
13231 case 'O':
13232 // ^=
13233 if (type)
13234 {
13235 const char* t = __parse_expression(first+2, last);
13236 if (t != first+2)
13237 {
13238 __node* op1 = __root_;
13239 const char* t2 = __parse_expression(t, last);
13240 if (t != t2)
13241 {
13242 if (__make<__operator_xor_equal>(op1, __root_))
13243 {
13244 *type = 2;
13245 first = t2;
13246 }
13247 }
13248 }
13249 }
13250 else
13251 {
13252 if (__make<__operator_xor_equal>())
13253 first += 2;
13254 }
13255 break;
13256 case 'q':
13257 // ==
13258 if (type)
13259 {
13260 const char* t = __parse_expression(first+2, last);
13261 if (t != first+2)
13262 {
13263 __node* op1 = __root_;
13264 const char* t2 = __parse_expression(t, last);
13265 if (t != t2)
13266 {
13267 if (__make<__operator_equality>(op1, __root_))
13268 {
13269 *type = 2;
13270 first = t2;
13271 }
13272 }
13273 }
13274 }
13275 else
13276 {
13277 if (__make<__operator_equality>())
13278 first += 2;
13279 }
13280 break;
13281 }
13282 break;
13283 case 'g':
13284 switch (first[1])
13285 {
13286 case 'e':
13287 // >=
13288 if (type)
13289 {
13290 const char* t = __parse_expression(first+2, last);
13291 if (t != first+2)
13292 {
13293 __node* op1 = __root_;
13294 const char* t2 = __parse_expression(t, last);
13295 if (t != t2)
13296 {
13297 if (__make<__operator_greater_equal>(op1, __root_))
13298 {
13299 *type = 2;
13300 first = t2;
13301 }
13302 }
13303 }
13304 }
13305 else
13306 {
13307 if (__make<__operator_greater_equal>())
13308 first += 2;
13309 }
13310 break;
13311 case 't':
13312 // >
13313 if (type)
13314 {
13315 const char* t = __parse_expression(first+2, last);
13316 if (t != first+2)
13317 {
13318 __node* op1 = __root_;
13319 const char* t2 = __parse_expression(t, last);
13320 if (t != t2)
13321 {
13322 if (__make<__operator_greater>(op1, __root_))
13323 {
13324 *type = 2;
13325 first = t2;
13326 }
13327 }
13328 }
13329 }
13330 else
13331 {
13332 if (__make<__operator_greater>())
13333 first += 2;
13334 }
13335 break;
13336 }
13337 break;
13338 case 'i':
13339 // []
13340 if (first[1] == 'x' && __make<__operator_brackets>())
13341 {
13342 first += 2;
13343 if (type)
13344 *type = -1;
13345 }
13346 break;
13347 case 'l':
13348 switch (first[1])
13349 {
13350 case 'e':
13351 // <=
13352 if (type)
13353 {
13354 const char* t = __parse_expression(first+2, last);
13355 if (t != first+2)
13356 {
13357 __node* op1 = __root_;
13358 const char* t2 = __parse_expression(t, last);
13359 if (t != t2)
13360 {
13361 if (__make<__operator_less_equal>(op1, __root_))
13362 {
13363 *type = 2;
13364 first = t2;
13365 }
13366 }
13367 }
13368 }
13369 else
13370 {
13371 if (__make<__operator_less_equal>())
13372 first += 2;
13373 }
13374 break;
13375 case 's':
13376 // <<
13377 if (type)
13378 {
13379 const char* t = __parse_expression(first+2, last);
13380 if (t != first+2)
13381 {
13382 __node* op1 = __root_;
13383 const char* t2 = __parse_expression(t, last);
13384 if (t != t2)
13385 {
13386 if (__make<__operator_left_shift>(op1, __root_))
13387 {
13388 *type = 2;
13389 first = t2;
13390 }
13391 }
13392 }
13393 }
13394 else
13395 {
13396 if (__make<__operator_left_shift>())
13397 first += 2;
13398 }
13399 break;
13400 case 'S':
13401 // <<=
13402 if (type)
13403 {
13404 const char* t = __parse_expression(first+2, last);
13405 if (t != first+2)
13406 {
13407 __node* op1 = __root_;
13408 const char* t2 = __parse_expression(t, last);
13409 if (t != t2)
13410 {
13411 if (__make<__operator_left_shift_equal>(op1, __root_))
13412 {
13413 *type = 2;
13414 first = t2;
13415 }
13416 }
13417 }
13418 }
13419 else
13420 {
13421 if (__make<__operator_left_shift_equal>())
13422 first += 2;
13423 }
13424 break;
13425 case 't':
13426 // <
13427 if (type)
13428 {
13429 const char* t = __parse_expression(first+2, last);
13430 if (t != first+2)
13431 {
13432 __node* op1 = __root_;
13433 const char* t2 = __parse_expression(t, last);
13434 if (t != t2)
13435 {
13436 if (__make<__operator_less>(op1, __root_))
13437 {
13438 *type = 2;
13439 first = t2;
13440 }
13441 }
13442 }
13443 }
13444 else
13445 {
13446 if (__make<__operator_less>())
13447 first += 2;
13448 }
13449 break;
13450 }
13451 break;
13452 case 'm':
13453 switch (first[1])
13454 {
13455 case 'i':
13456 // -
13457 if (type)
13458 {
13459 const char* t = __parse_expression(first+2, last);
13460 if (t != first+2)
13461 {
13462 __node* op1 = __root_;
13463 const char* t2 = __parse_expression(t, last);
13464 if (t != t2)
13465 {
13466 if (__make<__operator_minus>(op1, __root_))
13467 {
13468 *type = 2;
13469 first = t2;
13470 }
13471 }
13472 }
13473 }
13474 else
13475 {
13476 if (__make<__operator_minus>())
13477 first += 2;
13478 }
13479 break;
13480 case 'I':
13481 // -=
13482 if (type)
13483 {
13484 const char* t = __parse_expression(first+2, last);
13485 if (t != first+2)
13486 {
13487 __node* op1 = __root_;
13488 const char* t2 = __parse_expression(t, last);
13489 if (t != t2)
13490 {
13491 if (__make<__operator_minus_equal>(op1, __root_))
13492 {
13493 *type = 2;
13494 first = t2;
13495 }
13496 }
13497 }
13498 }
13499 else
13500 {
13501 if (__make<__operator_minus_equal>())
13502 first += 2;
13503 }
13504 break;
13505 case 'l':
13506 // *
13507 if (type)
13508 {
13509 const char* t = __parse_expression(first+2, last);
13510 if (t != first+2)
13511 {
13512 __node* op1 = __root_;
13513 const char* t2 = __parse_expression(t, last);
13514 if (t != t2)
13515 {
13516 if (__make<__operator_times>(op1, __root_))
13517 {
13518 *type = 2;
13519 first = t2;
13520 }
13521 }
13522 }
13523 }
13524 else
13525 {
13526 if (__make<__operator_times>())
13527 first += 2;
13528 }
13529 break;
13530 case 'L':
13531 // *=
13532 if (type)
13533 {
13534 const char* t = __parse_expression(first+2, last);
13535 if (t != first+2)
13536 {
13537 __node* op1 = __root_;
13538 const char* t2 = __parse_expression(t, last);
13539 if (t != t2)
13540 {
13541 if (__make<__operator_times_equal>(op1, __root_))
13542 {
13543 *type = 2;
13544 first = t2;
13545 }
13546 }
13547 }
13548 }
13549 else
13550 {
13551 if (__make<__operator_times_equal>())
13552 first += 2;
13553 }
13554 break;
13555 case 'm':
13556 // -- (postfix in <expression> context)
13557 if (type)
13558 {
13559 const char* t = __parse_expression(first+2, last);
13560 if (t != first+2)
13561 {
13562 if (__make<__operator_decrement>(false, __root_))
13563 {
13564 *type = 1;
13565 first = t;
13566 }
13567 }
13568 }
13569 else
13570 {
13571 if (__make<__operator_decrement>())
13572 first += 2;
13573 }
13574 break;
13575 }
13576 break;
13577 case 'n':
13578 switch (first[1])
13579 {
13580 case 'a':
13581 // new[]
13582 if (__make<__operator_new_array>())
13583 {
13584 first += 2;
13585 if (type)
13586 *type = -1;
13587 }
13588 break;
13589 case 'e':
13590 // !=
13591 if (type)
13592 {
13593 const char* t = __parse_expression(first+2, last);
13594 if (t != first+2)
13595 {
13596 __node* op1 = __root_;
13597 const char* t2 = __parse_expression(t, last);
13598 if (t != t2)
13599 {
13600 if (__make<__operator_not_equal>(op1, __root_))
13601 {
13602 *type = 2;
13603 first = t2;
13604 }
13605 }
13606 }
13607 }
13608 else
13609 {
13610 if (__make<__operator_not_equal>())
13611 first += 2;
13612 }
13613 break;
13614 case 'g':
13615 // - (unary)
13616 if (type)
13617 {
13618 const char* t = __parse_expression(first+2, last);
13619 if (t != first+2)
13620 {
13621 if (__make<__operator_negate>(__root_))
13622 {
13623 *type = 1;
13624 first = t;
13625 }
13626 }
13627 }
13628 else
13629 {
13630 if (__make<__operator_negate>())
13631 first += 2;
13632 }
13633 break;
13634 case 't':
13635 // !
13636 if (type)
13637 {
13638 const char* t = __parse_expression(first+2, last);
13639 if (t != first+2)
13640 {
13641 if (__make<__operator_logical_not>(__root_))
13642 {
13643 *type = 1;
13644 first = t;
13645 }
13646 }
13647 }
13648 else
13649 {
13650 if (__make<__operator_logical_not>())
13651 first += 2;
13652 }
13653 break;
13654 case 'w':
13655 // new
13656 if (__make<__operator_new>())
13657 {
13658 first += 2;
13659 if (type)
13660 *type = -1;
13661 }
13662 break;
13663 }
13664 break;
13665 case 'o':
13666 switch (first[1])
13667 {
13668 case 'o':
13669 // ||
13670 if (type)
13671 {
13672 const char* t = __parse_expression(first+2, last);
13673 if (t != first+2)
13674 {
13675 __node* op1 = __root_;
13676 const char* t2 = __parse_expression(t, last);
13677 if (t != t2)
13678 {
13679 if (__make<__operator_logical_or>(op1, __root_))
13680 {
13681 *type = 2;
13682 first = t2;
13683 }
13684 }
13685 }
13686 }
13687 else
13688 {
13689 if (__make<__operator_logical_or>())
13690 first += 2;
13691 }
13692 break;
13693 case 'r':
13694 // |
13695 if (type)
13696 {
13697 const char* t = __parse_expression(first+2, last);
13698 if (t != first+2)
13699 {
13700 __node* op1 = __root_;
13701 const char* t2 = __parse_expression(t, last);
13702 if (t != t2)
13703 {
13704 if (__make<__operator_bit_or>(op1, __root_))
13705 {
13706 *type = 2;
13707 first = t2;
13708 }
13709 }
13710 }
13711 }
13712 else
13713 {
13714 if (__make<__operator_bit_or>())
13715 first += 2;
13716 }
13717 break;
13718 case 'R':
13719 // |=
13720 if (type)
13721 {
13722 const char* t = __parse_expression(first+2, last);
13723 if (t != first+2)
13724 {
13725 __node* op1 = __root_;
13726 const char* t2 = __parse_expression(t, last);
13727 if (t != t2)
13728 {
13729 if (__make<__operator_or_equal>(op1, __root_))
13730 {
13731 *type = 2;
13732 first = t2;
13733 }
13734 }
13735 }
13736 }
13737 else
13738 {
13739 if (__make<__operator_or_equal>())
13740 first += 2;
13741 }
13742 break;
13743 }
13744 break;
13745 case 'p':
13746 switch (first[1])
13747 {
13748 case 'm':
13749 // ->*
13750 if (type)
13751 {
13752 const char* t = __parse_expression(first+2, last);
13753 if (t != first+2)
13754 {
13755 __node* op1 = __root_;
13756 const char* t2 = __parse_expression(t, last);
13757 if (t != t2)
13758 {
13759 if (__make<__operator_pointer_to_member>(op1, __root_))
13760 {
13761 *type = 2;
13762 first = t2;
13763 }
13764 }
13765 }
13766 }
13767 else
13768 {
13769 if (__make<__operator_pointer_to_member>())
13770 first += 2;
13771 }
13772 break;
13773 case 'l':
13774 // +
13775 if (type)
13776 {
13777 const char* t = __parse_expression(first+2, last);
13778 if (t != first+2)
13779 {
13780 __node* op1 = __root_;
13781 const char* t2 = __parse_expression(t, last);
13782 if (t != t2)
13783 {
13784 if (__make<__operator_plus>(op1, __root_))
13785 {
13786 *type = 2;
13787 first = t2;
13788 }
13789 }
13790 }
13791 }
13792 else
13793 {
13794 if (__make<__operator_plus>())
13795 first += 2;
13796 }
13797 break;
13798 case 'L':
13799 // +=
13800 if (type)
13801 {
13802 const char* t = __parse_expression(first+2, last);
13803 if (t != first+2)
13804 {
13805 __node* op1 = __root_;
13806 const char* t2 = __parse_expression(t, last);
13807 if (t != t2)
13808 {
13809 if (__make<__operator_plus_equal>(op1, __root_))
13810 {
13811 *type = 2;
13812 first = t2;
13813 }
13814 }
13815 }
13816 }
13817 else
13818 {
13819 if (__make<__operator_plus_equal>())
13820 first += 2;
13821 }
13822 break;
13823 case 'p':
13824 // ++ (postfix in <expression> context)
13825 if (type)
13826 {
13827 const char* t = __parse_expression(first+2, last);
13828 if (t != first+2)
13829 {
13830 if (__make<__operator_increment>(false, __root_))
13831 {
13832 *type = 1;
13833 first = t;
13834 }
13835 }
13836 }
13837 else
13838 {
13839 if (__make<__operator_increment>())
13840 first += 2;
13841 }
13842 break;
13843 case 's':
13844 // + (unary)
13845 if (type)
13846 {
13847 const char* t = __parse_expression(first+2, last);
13848 if (t != first+2)
13849 {
13850 if (__make<__operator_unary_plus>(__root_))
13851 {
13852 *type = 1;
13853 first = t;
13854 }
13855 }
13856 }
13857 else
13858 {
13859 if (__make<__operator_unary_plus>())
13860 first += 2;
13861 }
13862 break;
13863 case 't':
13864 // ->
13865 if (type)
13866 {
13867 const char* t = __parse_expression(first+2, last);
13868 if (t != first+2)
13869 {
13870 __node* op1 = __root_;
13871 const char* t2 = __parse_expression(t, last);
13872 if (t != t2)
13873 {
13874 if (__make<__operator_arrow>(op1, __root_))
13875 {
13876 *type = 2;
13877 first = t2;
13878 }
13879 }
13880 }
13881 }
13882 else
13883 {
13884 if (__make<__operator_arrow>())
13885 first += 2;
13886 }
13887 break;
13888 }
13889 break;
13890 case 'q':
13891 // ?
13892 if (first[1] == 'u')
13893 {
13894 if (type)
13895 {
13896 const char* t = __parse_expression(first+2, last);
13897 if (t != first+2)
13898 {
13899 __node* op1 = __root_;
13900 const char* t2 = __parse_expression(t, last);
13901 if (t != t2)
13902 {
13903 __node* op2 = __root_;
13904 const char* t3 = __parse_expression(t2, last);
13905 if (t3 != t2)
13906 {
13907 if (__make<__operator_conditional>(op1, op2, __root_))
13908 {
13909 *type = 3;
13910 first = t3;
13911 }
13912 }
13913 }
13914 }
13915 }
13916 else
13917 {
13918 if (__make<__operator_conditional>())
13919 first += 2;
13920 }
13921 }
13922 break;
13923 case 'r':
13924 switch (first[1])
13925 {
13926 case 'm':
13927 // %
13928 if (type)
13929 {
13930 const char* t = __parse_expression(first+2, last);
13931 if (t != first+2)
13932 {
13933 __node* op1 = __root_;
13934 const char* t2 = __parse_expression(t, last);
13935 if (t != t2)
13936 {
13937 if (__make<__operator_mod>(op1, __root_))
13938 {
13939 *type = 2;
13940 first = t2;
13941 }
13942 }
13943 }
13944 }
13945 else
13946 {
13947 if (__make<__operator_mod>())
13948 first += 2;
13949 }
13950 break;
13951 case 'M':
13952 // %=
13953 if (type)
13954 {
13955 const char* t = __parse_expression(first+2, last);
13956 if (t != first+2)
13957 {
13958 __node* op1 = __root_;
13959 const char* t2 = __parse_expression(t, last);
13960 if (t != t2)
13961 {
13962 if (__make<__operator_mod_equal>(op1, __root_))
13963 {
13964 *type = 2;
13965 first = t2;
13966 }
13967 }
13968 }
13969 }
13970 else
13971 {
13972 if (__make<__operator_mod_equal>())
13973 first += 2;
13974 }
13975 break;
13976 case 's':
13977 // >>
13978 if (type)
13979 {
13980 const char* t = __parse_expression(first+2, last);
13981 if (t != first+2)
13982 {
13983 __node* op1 = __root_;
13984 const char* t2 = __parse_expression(t, last);
13985 if (t != t2)
13986 {
13987 if (__make<__operator_right_shift>(op1, __root_))
13988 {
13989 *type = 2;
13990 first = t2;
13991 }
13992 }
13993 }
13994 }
13995 else
13996 {
13997 if (__make<__operator_right_shift>())
13998 first += 2;
13999 }
14000 break;
14001 case 'S':
14002 // >>=
14003 if (type)
14004 {
14005 const char* t = __parse_expression(first+2, last);
14006 if (t != first+2)
14007 {
14008 __node* op1 = __root_;
14009 const char* t2 = __parse_expression(t, last);
14010 if (t != t2)
14011 {
14012 if (__make<__operator_right_shift_equal>(op1, __root_))
14013 {
14014 *type = 2;
14015 first = t2;
14016 }
14017 }
14018 }
14019 }
14020 else
14021 {
14022 if (__make<__operator_right_shift_equal>())
14023 first += 2;
14024 }
14025 break;
14026 }
14027 break;
14028 case 's':
14029 switch (first[1])
14030 {
14031 case 't':
14032 // sizeof (a type)
14033 if (type)
14034 {
14035 const char* t = __parse_expression(first+2, last);
14036 if (t != first+2)
14037 {
14038 if (__make<__operator_sizeof_type>(__root_))
14039 {
14040 *type = -1;
14041 first = t;
14042 }
14043 }
14044 }
14045 else
14046 {
14047 if (__make<__operator_sizeof_type>())
14048 first += 2;
14049 }
14050 break;
14051 case 'z':
14052 // sizeof (an expression)
14053 if (type)
14054 {
14055 const char* t = __parse_expression(first+2, last);
14056 if (t != first+2)
14057 {
14058 if (__make<__operator_sizeof_expression>(__root_))
14059 {
14060 *type = -1;
14061 first = t;
14062 }
14063 }
14064 }
14065 else
14066 {
14067 if (__make<__operator_sizeof_expression>())
14068 first += 2;
14069 }
14070 break;
14071 }
14072 break;
14073 }
14074 }
14075 return first;
14076}
14077
14078// <source-name> ::= <positive length number> <identifier>
14079
14080const char*
14081__demangle_tree::__parse_source_name(const char* first, const char* last)
14082{
14083 if (first != last)
14084 {
14085 char c = *first;
14086 if ('1' <= c && c <= '9' && first+1 != last)
14087 {
14088 const char* t = first+1;
14089 size_t n = c - '0';
14090 for (c = *t; '0' <= c && c <= '9'; c = *t)
14091 {
14092 n = n * 10 + c - '0';
14093 if (++t == last)
14094 return first;
14095 }
14096 if (last - t >= n && __make<__source_name>(t, n))
14097 first = t + n;
14098 }
14099 }
14100 return first;
14101}
14102
14103// <unqualified-name> ::= <operator-name>
14104// ::= <ctor-dtor-name>
14105// ::= <source-name>
14106// ::= <unnamed-type-name>
14107
14108const char*
14109__demangle_tree::__parse_unqualified_name(const char* first, const char* last)
14110{
14111 const char* t = __parse_source_name(first, last);
14112 if (t == first)
14113 {
14114 t = __parse_ctor_dtor_name(first, last);
14115 if (t == first)
14116 {
14117 t = __parse_operator_name(first, last);
14118 if (t == first)
14119 first = __parse_unnamed_type_name(first, last);
14120 else
14121 first = t;
14122 }
14123 else
14124 first = t;
14125 }
14126 else
14127 first = t;
14128 return first;
14129}
14130
14131// <unscoped-name> ::= <unqualified-name>
14132// ::= St <unqualified-name> # ::std::
14133// extension ::= StL<unqualified-name>
14134
14135const char*
14136__demangle_tree::__parse_unscoped_name(const char* first, const char* last)
14137{
14138 if (last - first >= 2)
14139 {
14140 const char* t0 = first;
14141 if (first[0] == 'S' && first[1] == 't')
14142 {
14143 t0 += 2;
14144 if (t0 != last && *t0 == 'L')
14145 ++t0;
14146 }
14147 const char* t1 = __parse_unqualified_name(t0, last);
14148 if (t1 != t0)
14149 {
14150 if (t0 != first)
14151 {
14152 __node* name = __root_;
14153 if (__make<__std_qualified_name>())
14154 {
14155 if (__make<__nested_delimeter>(__root_, name))
14156 first = t1;
14157 }
14158 }
14159 else
14160 first = t1;
14161 }
14162 }
14163 return first;
14164}
14165
14166// <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
14167// ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
14168//
14169// <prefix> ::= <prefix> <unqualified-name>
14170// ::= <template-prefix> <template-args>
14171// ::= <template-param>
14172// ::= <decltype>
14173// ::= # empty
14174// ::= <substitution>
14175// ::= <prefix> <data-member-prefix>
14176// extension ::= L
14177//
14178// <template-prefix> ::= <prefix> <template unqualified-name>
14179// ::= <template-param>
14180// ::= <substitution>
14181
14182const char*
14183__demangle_tree::__parse_nested_name(const char* first, const char* last)
14184{
14185 if (first != last && *first == 'N')
14186 {
14187 unsigned cv = 0;
14188 const char* t0 = __parse_cv_qualifiers(first+1, last, cv, true);
14189 __node* prev = NULL;
14190 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
14191 {
14192 t0 += 2;
14193 if (!__make<__std_qualified_name>())
14194 return first;
14195 prev = __root_;
14196 }
14197 while (t0 != last)
14198 {
14199 bool can_sub = true;
14200 bool make_nested = true;
14201 const char* t1;
14202 switch (*t0)
14203 {
14204 case '1':
14205 case '2':
14206 case '3':
14207 case '4':
14208 case '5':
14209 case '6':
14210 case '7':
14211 case '8':
14212 case '9':
14213 t1 = __parse_source_name(t0, last);
14214 if (t1 == t0 || t1 == last)
14215 return first;
14216 if (*t1 == 'M')
14217 {
14218 // This is a data-member-prefix
14219 ++t1;
14220 }
14221 else if (*t1 == 'I')
14222 {
14223 // has following <template-args>
14224 if (prev)
14225 {
14226 if (!__make<__nested_delimeter>(prev, __root_))
14227 return first;
14228 make_nested = false;
14229 }
14230 if (__sub_end_ == __sub_cap_)
14231 {
14232 __status_ = memory_alloc_failure;
14233 return first;
14234 }
14235 else
14236 *__sub_end_++ = __root_;
14237 const char* t2 = __parse_template_args(t1, last);
14238 if (t2 == t1)
14239 return first;
14240 t1 = t2;
14241 }
14242 break;
14243 case 'D':
14244 if (t0+1 != last && (t0[1] == 't' || t0[1] == 'T'))
14245 {
14246 t1 = __parse_decltype(t0, last);
14247 break;
14248 }
14249 // check for Dt, DT here, else drop through
14250 case 'C':
14251 t1 = __parse_ctor_dtor_name(t0, last);
14252 if (t1 == t0 || t1 == last)
14253 return first;
14254 if (*t1 == 'I')
14255 {
14256 // has following <template-args>
14257 if (prev)
14258 {
14259 if (!__make<__nested_delimeter>(prev, __root_))
14260 return first;
14261 make_nested = false;
14262 }
14263 if (__sub_end_ == __sub_cap_)
14264 {
14265 __status_ = memory_alloc_failure;
14266 return first;
14267 }
14268 else
14269 *__sub_end_++ = __root_;
14270 const char* t2 = __parse_template_args(t1, last);
14271 if (t2 == t1)
14272 return first;
14273 t1 = t2;
14274 }
14275 break;
14276 case 'U':
14277 assert(!"__parse_nested_name U");
14278 // could have following <template-args>
14279 break;
14280 case 'T':
14281 t1 = __parse_template_param(t0, last);
14282 if (t1 == t0 || t1 == last)
14283 return first;
14284 if (*t1 == 'I')
14285 {
14286 // has following <template-args>
14287 if (prev)
14288 {
14289 if (!__make<__nested_delimeter>(prev, __root_))
14290 return first;
14291 make_nested = false;
14292 }
14293 if (__sub_end_ == __sub_cap_)
14294 {
14295 __status_ = memory_alloc_failure;
14296 return first;
14297 }
14298 else
14299 *__sub_end_++ = __root_;
14300 const char* t2 = __parse_template_args(t1, last);
14301 if (t2 == t1)
14302 return first;
14303 t1 = t2;
14304 }
14305 break;
14306 case 'S':
14307 t1 = __parse_substitution(t0, last);
14308 if (t1 == t0 || t1 == last)
14309 return first;
14310 if (*t1 == 'I')
14311 {
14312 const char* t2 = __parse_template_args(t1, last);
14313 if (t2 == t1)
14314 return first;
14315 t1 = t2;
14316 }
14317 else
14318 can_sub = false;
14319 break;
14320 case 'L':
14321 // extension: ignore L here
14322 ++t0;
14323 continue;
14324 default:
14325 t1 = __parse_operator_name(t0, last);
14326 if (t1 == t0 || t1 == last)
14327 return first;
14328 if (*t1 == 'I')
14329 {
14330 // has following <template-args>
14331 if (prev)
14332 {
14333 if (!__make<__nested_delimeter>(prev, __root_))
14334 return first;
14335 make_nested = false;
14336 }
14337 if (__sub_end_ == __sub_cap_)
14338 {
14339 __status_ = memory_alloc_failure;
14340 return first;
14341 }
14342 else
14343 *__sub_end_++ = __root_;
14344 const char* t2 = __parse_template_args(t1, last);
14345 if (t2 == t1)
14346 return first;
14347 t1 = t2;
14348 }
14349 break;
14350 }
14351 if (t1 == t0 || t1 == last)
14352 return first;
14353 if (prev && make_nested)
14354 {
14355 if (!__make<__nested_delimeter>(prev, __root_))
14356 return first;
14357 can_sub = true;
14358 }
14359 if (can_sub && *t1 != 'E')
14360 {
14361 if (__sub_end_ == __sub_cap_)
14362 {
14363 __status_ = memory_alloc_failure;
14364 return first;
14365 }
14366 else
14367 *__sub_end_++ = __root_;
14368 }
14369 if (*t1 == 'E')
14370 {
14371 if (cv != 0)
14372 {
14373 if (!__make<__cv_qualifiers>(cv, __root_))
14374 return first;
14375 }
14376 first = t1+1;
14377 break;
14378 }
14379 prev = __root_;
14380 t0 = t1;
14381 }
14382 }
14383 return first;
14384}
14385
14386// <template-arg> ::= <type> # type or template
14387// ::= X <expression> E # expression
14388// ::= <expr-primary> # simple expressions
14389// ::= J <template-arg>* E # argument pack
14390// ::= LZ <encoding> E # extension
14391
14392const char*
14393__demangle_tree::__parse_template_arg(const char* first, const char* last)
14394{
14395 if (first != last)
14396 {
14397 const char* t;
14398 switch (*first)
14399 {
14400 case 'X':
14401 t = __parse_expression(first+1, last);
14402 if (t != first+1)
14403 {
14404 if (t != last && *t == 'E')
14405 first = t+1;
14406 }
14407 break;
14408 case 'J':
14409 t = first+1;
14410 if (t == last)
14411 return first;
14412 if (*t == 'E')
14413 {
14414 if (__make<__list>((__node*)0))
14415 first = t+1;
14416 }
14417 else
14418 {
14419 __node* list = NULL;
14420 __node* prev = NULL;
14421 do
14422 {
14423 const char* t2 = __parse_template_arg(t, last);
14424 if (t2 == t || !__make<__list>(__root_))
14425 return first;
14426 if (list == 0)
14427 list = __root_;
14428 if (prev)
14429 {
14430 prev->__right_ = __root_;
14431 __root_->__size_ = prev->__size_ + 1;
14432 }
14433 prev = __root_;
14434 t = t2;
14435 } while (t != last && *t != 'E');
14436 first = t+1;
14437 __root_ = list;
14438 }
14439 break;
14440 case 'L':
14441 // <expr-primary> or LZ <encoding> E
14442 if (first+1 != last && first[1] == 'Z')
14443 {
14444 t = __parse_encoding(first+2, last);
14445 if (t != first+2 && t != last && *t == 'E')
14446 first = t+1;
14447 }
14448 else
14449 first = __parse_expr_primary(first, last);
14450 break;
14451 default:
14452 // <type>
14453 first = __parse_type(first, last);
14454 break;
14455 }
14456 }
14457 return first;
14458}
14459
14460// <template-args> ::= I <template-arg>* E
14461// extension, the abi says <template-arg>+
14462
14463const char*
14464__demangle_tree::__parse_template_args(const char* first, const char* last)
14465{
14466 if (last - first >= 2 && *first == 'I')
14467 {
14468 __node* args = NULL;
14469 __node* prev = NULL;
14470 __node* name = __root_;
14471 bool prev_tag_templates = __tag_templates_;
14472 __tag_templates_ = false;
14473 if (prev_tag_templates)
14474 __t_end_ = __t_begin_;
14475 const char* t = first+1;
14476 while (*t != 'E')
14477 {
14478 const char* t2 = __parse_template_arg(t, last);
14479 if (t2 == t || t2 == last)
14480 break;
14481 if (!__make<__list>(__root_))
14482 return first;
14483 if (args == 0)
14484 args = __root_;
14485 if (prev)
14486 {
14487 prev->__right_ = __root_;
14488 __root_->__size_ = prev->__size_ + 1;
14489 }
14490 prev = __root_;
14491 if (prev_tag_templates)
14492 {
14493 if (__t_end_ == __t_cap_)
14494 {
14495 __status_ = memory_alloc_failure;
14496 return first;
14497 }
14498 if (__root_->__left_)
14499 *__t_end_++ = __root_->__left_;
14500 else
14501 *__t_end_++ = __root_;
14502 }
14503 t = t2;
14504 }
14505 if (t != last && *t == 'E')
14506 {
14507 if (__make<__template_args>(name, args))
14508 first = t+1;
14509 }
14510 __tag_templates_ = prev_tag_templates;
14511 }
14512 return first;
14513}
14514
14515// <substitution> ::= S <seq-id> _
14516// ::= S_
14517// <substitution> ::= Sa # ::std::allocator
14518// <substitution> ::= Sb # ::std::basic_string
14519// <substitution> ::= Ss # ::std::basic_string < char,
14520// ::std::char_traits<char>,
14521// ::std::allocator<char> >
14522// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
14523// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
14524// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
14525
14526const char*
14527__demangle_tree::__parse_substitution(const char* first, const char* last)
14528{
14529 if (last - first >= 2)
14530 {
14531 if (*first == 'S')
14532 {
14533 switch (first[1])
14534 {
14535 case 'a':
14536 if (__make<__sub_allocator>())
14537 first += 2;
14538 break;
14539 case 'b':
14540 if (__make<__sub_basic_string>())
14541 first += 2;
14542 break;
14543 case 's':
14544 if (__make<__sub_string>())
14545 first += 2;
14546 break;
14547 case 'i':
14548 if (__make<__sub_istream>())
14549 first += 2;
14550 break;
14551 case 'o':
14552 if (__make<__sub_ostream>())
14553 first += 2;
14554 break;
14555 case 'd':
14556 if (__make<__sub_iostream>())
14557 first += 2;
14558 break;
14559 case '_':
14560 if (__sub_begin_ != __sub_end_)
14561 {
14562 if (__make<__sub>(*__sub_begin_))
14563 first += 2;
14564 }
14565 break;
14566 default:
14567 if (isdigit(first[1]) || isupper(first[1]))
14568 {
14569 size_t sub = 0;
14570 const char* t = first+1;
14571 if (isdigit(*t))
14572 sub = *t - '0';
14573 else
14574 sub = *t - 'A' + 10;
14575 for (++t; t != last && (isdigit(*t) || isupper(*t)); ++t)
14576 {
14577 sub *= 36;
14578 if (isdigit(*t))
14579 sub += *t - '0';
14580 else
14581 sub += *t - 'A' + 10;
14582 }
14583 if (t == last || *t != '_')
14584 return first;
14585 ++sub;
14586 if (sub < __sub_end_ - __sub_begin_)
14587 {
14588 if (__make<__sub>(__sub_begin_[sub]))
14589 first = t+1;
14590 }
14591 }
14592 break;
14593 }
14594 }
14595 }
14596 return first;
14597}
14598
14599// <name> ::= <nested-name>
14600// ::= <local-name> # See Scope Encoding below
14601// ::= <unscoped-template-name> <template-args>
14602// ::= <unscoped-name>
14603
14604const char*
14605__demangle_tree::__parse_name(const char* first, const char* last)
14606{
14607 if (first != last)
14608 {
14609 const char* t0 = first;
14610 // extension: ignore L here
14611 if (*t0 == 'L')
14612 ++t0;
14613 const char* t = __parse_nested_name(t0, last);
14614 if (t == t0)
14615 {
14616 t = __parse_local_name(t0, last);
14617 if (t == t0)
14618 {
14619 // not <nested-name> nor <local-name>
14620 // Try to parse <unscoped-template-name> <template-args> or
14621 // <unscoped-name> which are nearly ambiguous.
14622 // This logic occurs nowhere else.
14623 if (last - t0 >= 2)
14624 {
14625 if (t0[0] == 'S' && (t0[1] == '_' ||
14626 isdigit(t0[1]) ||
14627 isupper(t0[1]) ||
14628 t0[1] == 'a' ||
14629 t0[1] == 'b'))
14630 {
14631 t = __parse_substitution(t0, last);
14632 if (t != t0)
14633 {
14634 const char* t2 = __parse_template_args(t, last);
14635 if (t2 != t)
14636 first = t2;
14637 }
14638 }
14639 else // Not a substitution, except maybe St
14640 {
14641 t = __parse_unscoped_name(t0, last);
14642 if (t != t0)
14643 {
14644 // unscoped-name might be <unscoped-template-name>
14645 if (t != last && *t == 'I')
14646 {
14647 if (__sub_end_ == __sub_cap_)
14648 {
14649 __status_ = memory_alloc_failure;
14650 return first;
14651 }
14652 *__sub_end_++ = __root_;
14653 const char* t2 = __parse_template_args(t, last);
14654 if (t2 != t)
14655 first = t2;
14656 }
14657 else
14658 {
14659 // <unscoped-name>
14660 first = t;
14661 }
14662 }
14663 }
14664 }
14665 }
14666 else
14667 first = t;
14668 }
14669 else
14670 first = t;
14671 }
14672 return first;
14673}
14674
14675// extension
14676// <dot-suffix> := .<anything and everything>
14677
14678const char*
14679__demangle_tree::__parse_dot_suffix(const char* first, const char* last)
14680{
14681 if (first != last && *first == '.')
14682 {
14683 if (__make<__dot_suffix>(__root_, first, last-first))
14684 first = last;
14685 }
14686 return first;
14687}
14688
14689// <encoding> ::= <function name> <bare-function-type>
14690// ::= <data name>
14691// ::= <special-name>
14692
14693const char*
14694__demangle_tree::__parse_encoding(const char* first, const char* last)
14695{
14696 const char* t = __parse_name(first, last);
14697 if (t != first)
14698 {
14699 if (t != last && *t != 'E')
14700 {
14701 __node* name = __root_;
14702 bool has_return = name->ends_with_template() &&
14703 !name->is_ctor_dtor_conv();
14704 __node* ret = NULL;
14705 const char* t2;
14706 __tag_templates_ = false;
14707 if (has_return)
14708 {
14709 t2 = __parse_type(t, last);
14710 if (t2 != t)
14711 {
14712 ret = __root_;
14713 t = t2;
14714 }
14715 else
14716 return first;
14717 }
14718 t2 = __parse_bare_function_type(t, last);
14719 if (t2 != t)
14720 {
14721 if (dynamic_cast<__void*>(__root_->__left_) != NULL)
14722 __root_->__left_ = NULL;
14723 if (__make<__function_signature>(ret, __root_))
14724 {
14725 __node* cv = name->extract_cv(name);
14726 if (__make<__function>(name, __root_))
14727 {
14728 if (cv)
14729 {
14730 cv->__left_ = __root_;
14731 cv->__size_ <<= 5;
14732 __root_ = cv;
14733 }
14734 first = t2;
14735 }
14736 }
14737 }
14738 __tag_templates_ = true;
14739 }
14740 else
14741 first = t;
14742 }
14743 else
14744 first = __parse_special_name(first, last);
14745 return first;
14746}
14747
14748// <mangled-name> ::= _Z<encoding>
14749// ::= <type>
14750
14751void
14752__demangle_tree::__parse()
14753{
14754 if (__mangled_name_begin_ == __mangled_name_end_)
14755 {
14756 __status_ = invalid_mangled_name;
14757 return;
14758 }
14759 const char* t = NULL;
14760 if (__mangled_name_end_ - __mangled_name_begin_ >= 2 &&
14761 __mangled_name_begin_[0] == '_' &&
14762 __mangled_name_begin_[1] == 'Z')
14763 {
14764 t = __parse_encoding(__mangled_name_begin_+2, __mangled_name_end_);
14765 if (t != __mangled_name_begin_+2 && t != __mangled_name_end_ && *t == '.')
14766 t = __parse_dot_suffix(t, __mangled_name_end_);
14767 }
14768 else
14769 t = __parse_type(__mangled_name_begin_, __mangled_name_end_);
14770 if (t == __mangled_name_end_ && __root_)
14771 {
14772 if (__fix_forward_references_)
14773 {
14774 if (__root_->fix_forward_references(__t_begin_, __t_end_))
14775 __status_ = success;
14776 }
14777 else
14778 __status_ = success;
14779 }
14780}
14781
14782#pragma GCC visibility pop
14783#pragma GCC visibility push(default)
14784
14785__demangle_tree
14786__demangle(const char* mangled_name, char* buf, size_t bs)
14787{
14788 __demangle_tree t(mangled_name, buf, bs);
14789 if (t.__status() == invalid_mangled_name)
14790 t.__parse();
14791 return t;
14792}
14793
14794__demangle_tree
14795__demangle(const char* mangled_name)
14796{
14797 return __demangle(mangled_name, 0, 0);
14798}
14799
14800char*
14801__demangle(__demangle_tree dmg_tree, char* buf, size_t* n, int* status)
14802{
14803 if (dmg_tree.__status() != success)
14804 {
14805 if (status)
14806 *status = dmg_tree.__status();
14807 return NULL;
14808 }
14809#ifdef DEBUGGING
14810display(dmg_tree.__root_);
14811printf("\n");
14812#endif
14813 const size_t bs = buf == NULL ? 0 : *n;
14814#if 0
14815 const unsigned N = 1024;
14816 char tmp[N];
14817 char* f;
14818 char* l;
14819 if (bs < N)
14820 {
14821 f = tmp;
14822 l = f + N;
14823 }
14824 else
14825 {
14826 f = buf;
14827 l = f + bs;
14828 }
14829 const ptrdiff_t sz = dmg_tree.__root_->print(f, l-1);
14830 if (sz > l-f-1)
14831 {
14832 buf = static_cast<char*>(realloc(buf, sz+1));
14833 if (buf == NULL)
14834 {
14835 if (status)
14836 *status = memory_alloc_failure;
14837 return NULL;
14838 }
14839 if (n)
14840 *n = sz+1;
14841 dmg_tree.__root_->print(buf, buf+sz);
14842 buf[sz] = '\0';
14843 goto end;
14844 }
14845 f[sz] = '\0';
14846 if (f != buf)
14847 {
14848 if (bs < sz+1)
14849 {
14850 buf = static_cast<char*>(realloc(buf, sz+1));
14851 if (buf == NULL)
14852 {
14853 if (status)
14854 *status = memory_alloc_failure;
14855 return NULL;
14856 }
14857 if (n)
14858 *n = sz+1;
14859 }
14860 strncpy(buf, f, sz+1);
14861 }
14862#else
14863 ptrdiff_t sm = dmg_tree.__mangled_name_end_ - dmg_tree.__mangled_name_begin_;
14864 ptrdiff_t est = sm + 50 * (dmg_tree.__node_end_ - dmg_tree.__node_begin_);
14865 const unsigned N = 4096;
14866 char tmp[N];
14867 ptrdiff_t s;
14868 if (est <= bs)
14869 {
14870 char* e = dmg_tree.__get_demangled_name(buf);
14871 *e++ = '\0';
14872 s = e - buf;
14873 }
14874 else if (est <= N)
14875 {
14876 char* e = dmg_tree.__get_demangled_name(tmp);
14877 *e++ = '\0';
14878 s = e - tmp;
14879 }
14880 else
14881 s = dmg_tree.size() + 1;
14882 if (s > bs)
14883 {
14884 buf = static_cast<char*>(realloc(buf, s));
14885 if (buf == NULL)
14886 {
14887 if (status)
14888 *status = memory_alloc_failure;
14889 return NULL;
14890 }
14891 if (n)
14892 *n = s;
14893 }
14894 if (est > bs)
14895 {
14896 if (est <= N)
14897 strncpy(buf, tmp, s);
14898 else
14899 *dmg_tree.__get_demangled_name(buf) = '\0';
14900 }
14901#endif
14902end:
14903 if (status)
14904 *status = success;
14905 return buf;
14906}
14907
14908} // __libcxxabi
14909
14910extern "C"
14911{
14912
14913char*
14914__cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status)
14915{
14916 if (mangled_name == NULL || (buf != NULL && n == NULL))
14917 {
14918 if (status)
14919 *status = __libcxxabi::invalid_args;
14920 return NULL;
14921 }
14922 const size_t bs = 64 * 1024;
14923 char static_buf[bs];
14924
14925 buf = __libcxxabi::__demangle(__libcxxabi::__demangle(mangled_name,
14926 static_buf, bs),
14927 buf, n, status);
14928 return buf;
14929}
14930
14931} // extern "C"
14932
14933} // abi