blob: 22adf133b9f26ab42b960c71d036466b70e117ad [file] [log] [blame]
Howard Hinnant4fbf16a2011-05-05 15:27:28 +00001//===-------------------------- cxa_demangle.cpp --------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "cxa_demangle.h"
11
12#include <stdlib.h>
13#include <string.h>
14#include <ctype.h>
15#include <stdio.h>
16#include <new>
17#include <algorithm>
18#include <assert.h>
19
20
21#ifdef DEBUGGING
22
23#include <string>
24#include <typeinfo>
25
26#endif
27
28namespace __cxxabiv1
29{
30
31namespace __libcxxabi
32{
33
34#pragma GCC visibility push(hidden)
35
36class __node
37{
38 __node(const __node&);
39 __node& operator=(const __node&);
40public:
41 const char* __name_;
42 size_t __size_;
43 __node* __left_;
44 __node* __right_;
45 long double __value_;
46 long __cached_size_;
47public:
48 __node()
49 : __name_(0), __size_(0), __left_(0), __right_(0), __cached_size_(-1)
50 {}
51 virtual ~__node() {};
52
53 void reset_cached_size()
54 {
55 __cached_size_ = -1;
56 if (__left_)
57 __left_->reset_cached_size();
58 if (__right_)
59 __right_->reset_cached_size();
60 }
61
62 virtual size_t first_size() const {return 0;}
63 virtual size_t second_size() const {return 0;}
64 virtual size_t size() const
65 {
66 if (__cached_size_ == -1)
67 const_cast<long&>(__cached_size_) = first_size() + second_size();
68 return __cached_size_;
69 }
70 virtual char* first_demangled_name(char* buf) const {return buf;}
71 virtual char* second_demangled_name(char* buf) const {return buf;}
72 virtual char* get_demangled_name(char* buf) const
73 {
74 return second_demangled_name(first_demangled_name(buf));
75 }
76 virtual size_t base_size() const {return size();}
77 virtual char* get_base_name(char* buf) const
78 {
79 return get_demangled_name(buf);
80 }
81 virtual ptrdiff_t print_base_name(char* f, char* l) const
82 {
83 return print(f, l);
84 }
85 virtual bool ends_with_template() const
86 {
87 return false;
88 }
89 virtual bool is_ctor_dtor_conv() const
90 {
91 return false;
92 }
93 virtual __node* base_name() const
94 {
95 return const_cast<__node*>(this);
96 }
97 virtual bool is_reference_or_pointer_to_function_or_array() const
98 {
99 return false;
100 }
101 virtual bool is_function() const
102 {
103 return false;
104 }
105 virtual bool is_cv_qualifer() const
106 {
107 return false;
108 }
109 virtual bool is_array() const
110 {
111 return false;
112 }
113
114 virtual bool fix_forward_references(__node**, __node**)
115 {
116 return true;
117 }
118 virtual __node* extract_cv(__node*&) const
119 {
120 return 0;
121 }
122 virtual size_t list_len() const
123 {
124 return 0;
125 }
126 virtual bool is_sub() const
127 {
128 return false;
129 }
130
131 virtual ptrdiff_t print(char* f, char* l) const
132 {
133 const ptrdiff_t sz1 = print_first(f, l);
134 return sz1 + print_second(f+std::min(sz1, l-f), l);
135 }
136 virtual ptrdiff_t print_first(char*, char*) const
137 {
138 return 0;
139 }
140 virtual ptrdiff_t print_second(char*, char*) const
141 {
142 return 0;
143 }
144};
145
146#ifdef DEBUGGING
147
148void display(__node* x, int indent = 0)
149{
150 if (x)
151 {
152 for (int i = 0; i < 2*indent; ++i)
153 printf(" ");
154 std::string buf(x->size(), '\0');
155 x->print(&buf.front(), &buf.back()+1);
156 printf("%s %s, %p\n", typeid(*x).name(), buf.c_str(), x);
157 display(x->__left_, indent+1);
158 display(x->__right_, indent+1);
159 }
160}
161
162#endif
163
164class __vtable
165 : public __node
166{
167 static const ptrdiff_t n = sizeof("vtable for ") - 1;
168public:
169 __vtable(__node* type)
170 {
171 __right_ = type;
172 }
173
174 virtual size_t first_size() const
175 {
176 if (__cached_size_ == -1)
177 const_cast<long&>(__cached_size_) = n + __right_->size();
178 return __cached_size_;
179 }
180 virtual char* first_demangled_name(char* buf) const
181 {
182 strncpy(buf, "vtable for ", n);
183 return __right_->get_demangled_name(buf+n);
184 }
185 virtual ptrdiff_t print_first(char* f, char* l) const
186 {
187 const ptrdiff_t r = l - f;
188 if (r < n)
189 return n + __right_->print(l, l);
190 ptrdiff_t sz = __right_->print(f+n, l) + n;
191 if (r >= sz)
192 {
193 *f++ = 'v';
194 *f++ = 't';
195 *f++ = 'a';
196 *f++ = 'b';
197 *f++ = 'l';
198 *f++ = 'e';
199 *f++ = ' ';
200 *f++ = 'f';
201 *f++ = 'o';
202 *f++ = 'r';
203 *f = ' ';
204 }
205 return sz;
206 }
207 virtual __node* base_name() const
208 {
209 return __right_->base_name();
210 }
211 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
212 {
213 return __right_->fix_forward_references(t_begin, t_end);
214 }
215};
216
217class __VTT
218 : public __node
219{
220 static const ptrdiff_t n = sizeof("VTT for ") - 1;
221public:
222 __VTT(__node* type)
223 {
224 __right_ = type;
225 }
226
227 virtual size_t first_size() const
228 {
229 if (__cached_size_ == -1)
230 const_cast<long&>(__cached_size_) = n + __right_->size();
231 return __cached_size_;
232 }
233 virtual char* first_demangled_name(char* buf) const
234 {
235 strncpy(buf, "VTT for ", n);
236 return __right_->get_demangled_name(buf+n);
237 }
238 virtual ptrdiff_t print_first(char* f, char* l) const
239 {
240 const ptrdiff_t r = l - f;
241 if (r < n)
242 return n + __right_->print(l, l);
243 ptrdiff_t sz = __right_->print(f+n, l) + n;
244 if (r >= sz)
245 {
246 *f++ = 'V';
247 *f++ = 'T';
248 *f++ = 'T';
249 *f++ = ' ';
250 *f++ = 'f';
251 *f++ = 'o';
252 *f++ = 'r';
253 *f = ' ';
254 }
255 return sz;
256 }
257 virtual __node* base_name() const
258 {
259 return __right_->base_name();
260 }
261 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
262 {
263 return __right_->fix_forward_references(t_begin, t_end);
264 }
265};
266
Howard Hinnant10115242011-12-09 20:07:56 +0000267class __construction_vtable
268 : public __node
269{
270 static const ptrdiff_t n = sizeof("construction vtable for ") - 1 + 4;
271public:
272 __construction_vtable(__node* left, __node* right)
273 {
274 __left_ = left;
275 __right_ = right;
276 }
277
278 virtual size_t first_size() const
279 {
280 if (__cached_size_ == -1)
281 const_cast<long&>(__cached_size_) = n + __left_->size()
282 + __right_->size();
283 return __cached_size_;
284 }
285 virtual char* first_demangled_name(char* buf) const
286 {
287 strncpy(buf, "construction vtable for ", n-4);
288 buf = __left_->get_demangled_name(buf+n-4);
289 *buf++ = '-';
290 *buf++ = 'i';
291 *buf++ = 'n';
292 *buf++ = '-';
293 return __right_->get_demangled_name(buf);
294 }
295 virtual ptrdiff_t print_first(char* f, char* l) const
296 {
297 const ptrdiff_t r = l - f;
298 if (r < n)
299 return n + __left_->print(l, l) + __right_->print(l, l);
300 ptrdiff_t lsz = __left_->print(f+n-4, l);
301 ptrdiff_t sz = lsz + n;
302 if (r >= sz)
303 {
304 sz += __right_->print(f+sz, l);
305 if (r >= sz)
306 {
307 strncpy(f, "construction vtable for ", n-4);
308 f += n-4 + lsz;
309 *f++ = '-';
310 *f++ = 'i';
311 *f++ = 'n';
312 *f++ = '-';
313 }
314 }
315 else
316 return sz + __right_->print(l, l);
317 return sz;
318 }
319 virtual __node* base_name() const
320 {
321 return __right_->base_name();
322 }
323 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
324 {
325 bool r = true;
326 if (__left_)
327 r = __left_->fix_forward_references(t_begin, t_end);
328 return r && __right_->fix_forward_references(t_begin, t_end);
329 }
330};
331
Howard Hinnant4fbf16a2011-05-05 15:27:28 +0000332class __typeinfo
333 : public __node
334{
335 static const ptrdiff_t n = sizeof("typeinfo for ") - 1;
336public:
337 __typeinfo(__node* type)
338 {
339 __right_ = type;
340 }
341
342 virtual size_t first_size() const
343 {
344 if (__cached_size_ == -1)
345 const_cast<long&>(__cached_size_) = n + __right_->size();
346 return __cached_size_;
347 }
348 virtual char* first_demangled_name(char* buf) const
349 {
350 strncpy(buf, "typeinfo for ", n);
351 return __right_->get_demangled_name(buf+n);
352 }
353 virtual ptrdiff_t print_first(char* f, char* l) const
354 {
355 const ptrdiff_t r = l - f;
356 if (r < n)
357 return n + __right_->print(l, l);
358 ptrdiff_t sz = __right_->print(f+n, l) + n;
359 if (r >= sz)
360 {
361 *f++ = 't';
362 *f++ = 'y';
363 *f++ = 'p';
364 *f++ = 'e';
365 *f++ = 'i';
366 *f++ = 'n';
367 *f++ = 'f';
368 *f++ = 'o';
369 *f++ = ' ';
370 *f++ = 'f';
371 *f++ = 'o';
372 *f++ = 'r';
373 *f = ' ';
374 }
375 return sz;
376 }
377 virtual __node* base_name() const
378 {
379 return __right_->base_name();
380 }
381 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
382 {
383 return __right_->fix_forward_references(t_begin, t_end);
384 }
385};
386
387class __typeinfo_name
388 : public __node
389{
390 static const ptrdiff_t n = sizeof("typeinfo name for ") - 1;
391public:
392 __typeinfo_name(__node* type)
393 {
394 __right_ = type;
395 }
396
397 virtual size_t first_size() const
398 {
399 if (__cached_size_ == -1)
400 const_cast<long&>(__cached_size_) = n + __right_->size();
401 return __cached_size_;
402 }
403 virtual char* first_demangled_name(char* buf) const
404 {
405 strncpy(buf, "typeinfo name for ", n);
406 return __right_->get_demangled_name(buf+n);
407 }
408 virtual ptrdiff_t print_first(char* f, char* l) const
409 {
410 const ptrdiff_t r = l - f;
411 if (r < n)
412 return n + __right_->print(l, l);
413 ptrdiff_t sz = __right_->print(f+n, l) + n;
414 if (r >= sz)
415 {
416 *f++ = 't';
417 *f++ = 'y';
418 *f++ = 'p';
419 *f++ = 'e';
420 *f++ = 'i';
421 *f++ = 'n';
422 *f++ = 'f';
423 *f++ = 'o';
424 *f++ = ' ';
425 *f++ = 'n';
426 *f++ = 'a';
427 *f++ = 'm';
428 *f++ = 'e';
429 *f++ = ' ';
430 *f++ = 'f';
431 *f++ = 'o';
432 *f++ = 'r';
433 *f = ' ';
434 }
435 return sz;
436 }
437 virtual __node* base_name() const
438 {
439 return __right_->base_name();
440 }
441 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
442 {
443 return __right_->fix_forward_references(t_begin, t_end);
444 }
445};
446
447class __covariant_return_thunk
448 : public __node
449{
450 static const ptrdiff_t n = sizeof("covariant return thunk to ") - 1;
451public:
452 __covariant_return_thunk(__node* type)
453 {
454 __right_ = type;
455 }
456
457 virtual size_t first_size() const
458 {
459 if (__cached_size_ == -1)
460 const_cast<long&>(__cached_size_) = n + __right_->size();
461 return __cached_size_;
462 }
463 virtual char* first_demangled_name(char* buf) const
464 {
465 strncpy(buf, "covariant return thunk to ", n);
466 return __right_->get_demangled_name(buf+n);
467 }
468 virtual ptrdiff_t print_first(char* f, char* l) const
469 {
470 const ptrdiff_t r = l - f;
471 if (r < n)
472 return n + __right_->print(l, l);
473 ptrdiff_t sz = __right_->print(f+n, l) + n;
474 if (r >= sz)
475 {
476 *f++ = 'c';
477 *f++ = 'o';
478 *f++ = 'v';
479 *f++ = 'a';
480 *f++ = 'r';
481 *f++ = 'i';
482 *f++ = 'a';
483 *f++ = 'n';
484 *f++ = 't';
485 *f++ = ' ';
486 *f++ = 'r';
487 *f++ = 'e';
488 *f++ = 't';
489 *f++ = 'u';
490 *f++ = 'r';
491 *f++ = 'n';
492 *f++ = ' ';
493 *f++ = 't';
494 *f++ = 'h';
495 *f++ = 'u';
496 *f++ = 'n';
497 *f++ = 'k';
498 *f++ = ' ';
499 *f++ = 't';
500 *f++ = 'o';
501 *f = ' ';
502 }
503 return sz;
504 }
505 virtual __node* base_name() const
506 {
507 return __right_->base_name();
508 }
509 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
510 {
511 return __right_->fix_forward_references(t_begin, t_end);
512 }
513};
514
515class __virtual_thunk
516 : public __node
517{
518 static const size_t n = sizeof("virtual thunk to ") - 1;
519public:
520 __virtual_thunk(__node* type)
521 {
522 __right_ = type;
523 }
524
525 virtual size_t first_size() const
526 {
527 if (__cached_size_ == -1)
528 const_cast<long&>(__cached_size_) = n + __right_->size();
529 return __cached_size_;
530 }
531 virtual char* first_demangled_name(char* buf) const
532 {
533 strncpy(buf, "virtual thunk to ", n);
534 return __right_->get_demangled_name(buf+n);
535 }
536 virtual ptrdiff_t print_first(char* f, char* l) const
537 {
538 const ptrdiff_t r = l - f;
539 if (r < n)
540 return n + __right_->print(l, l);
541 ptrdiff_t sz = __right_->print(f+n, l) + n;
542 if (r >= sz)
543 {
544 *f++ = 'v';
545 *f++ = 'i';
546 *f++ = 'r';
547 *f++ = 't';
548 *f++ = 'u';
549 *f++ = 'a';
550 *f++ = 'l';
551 *f++ = ' ';
552 *f++ = 't';
553 *f++ = 'h';
554 *f++ = 'u';
555 *f++ = 'n';
556 *f++ = 'k';
557 *f++ = ' ';
558 *f++ = 't';
559 *f++ = 'o';
560 *f = ' ';
561 }
562 return sz;
563 }
564 virtual __node* base_name() const
565 {
566 return __right_->base_name();
567 }
568 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
569 {
570 return __right_->fix_forward_references(t_begin, t_end);
571 }
572};
573
574class __non_virtual_thunk
575 : public __node
576{
577 static const size_t n = sizeof("non-virtual thunk to ") - 1;
578public:
579 __non_virtual_thunk(__node* type)
580 {
581 __right_ = type;
582 }
583
584 virtual size_t first_size() const
585 {
586 if (__cached_size_ == -1)
587 const_cast<long&>(__cached_size_) = n + __right_->size();
588 return __cached_size_;
589 }
590 virtual char* first_demangled_name(char* buf) const
591 {
592 strncpy(buf, "non-virtual thunk to ", n);
593 return __right_->get_demangled_name(buf+n);
594 }
595 virtual ptrdiff_t print_first(char* f, char* l) const
596 {
597 const ptrdiff_t r = l - f;
598 if (r < n)
599 return n + __right_->print(l, l);
600 ptrdiff_t sz = __right_->print(f+n, l) + n;
601 if (r >= sz)
602 {
603 *f++ = 'n';
604 *f++ = 'o';
605 *f++ = 'n';
606 *f++ = '-';
607 *f++ = 'v';
608 *f++ = 'i';
609 *f++ = 'r';
610 *f++ = 't';
611 *f++ = 'u';
612 *f++ = 'a';
613 *f++ = 'l';
614 *f++ = ' ';
615 *f++ = 't';
616 *f++ = 'h';
617 *f++ = 'u';
618 *f++ = 'n';
619 *f++ = 'k';
620 *f++ = ' ';
621 *f++ = 't';
622 *f++ = 'o';
623 *f = ' ';
624 }
625 return sz;
626 }
627 virtual __node* base_name() const
628 {
629 return __right_->base_name();
630 }
631 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
632 {
633 return __right_->fix_forward_references(t_begin, t_end);
634 }
635};
636
637class __guard_variable
638 : public __node
639{
640 static const size_t n = sizeof("guard variable for ") - 1;
641public:
642 __guard_variable(__node* type)
643 {
644 __right_ = type;
645 }
646
647 virtual size_t first_size() const
648 {
649 if (__cached_size_ == -1)
650 const_cast<long&>(__cached_size_) = n + __right_->size();
651 return __cached_size_;
652 }
653 virtual char* first_demangled_name(char* buf) const
654 {
655 strncpy(buf, "guard variable for ", n);
656 return __right_->get_demangled_name(buf+n);
657 }
658 virtual ptrdiff_t print_first(char* f, char* l) const
659 {
660 const ptrdiff_t r = l - f;
661 if (r < n)
662 return n + __right_->print(l, l);
663 ptrdiff_t sz = __right_->print(f+n, l) + n;
664 if (r >= sz)
665 {
666 *f++ = 'g';
667 *f++ = 'u';
668 *f++ = 'a';
669 *f++ = 'r';
670 *f++ = 'd';
671 *f++ = ' ';
672 *f++ = 'v';
673 *f++ = 'a';
674 *f++ = 'r';
675 *f++ = 'i';
676 *f++ = 'a';
677 *f++ = 'b';
678 *f++ = 'l';
679 *f++ = 'e';
680 *f++ = ' ';
681 *f++ = 'f';
682 *f++ = 'o';
683 *f++ = 'r';
684 *f = ' ';
685 }
686 return sz;
687 }
688 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
689 {
690 return __right_->fix_forward_references(t_begin, t_end);
691 }
692};
693
Howard Hinnant10115242011-12-09 20:07:56 +0000694class __reference_temporary
695 : public __node
696{
697 static const size_t n = sizeof("reference temporary for ") - 1;
698public:
699 __reference_temporary(__node* type)
700 {
701 __right_ = type;
702 }
703
704 virtual size_t first_size() const
705 {
706 if (__cached_size_ == -1)
707 const_cast<long&>(__cached_size_) = n + __right_->size();
708 return __cached_size_;
709 }
710 virtual char* first_demangled_name(char* buf) const
711 {
712 strncpy(buf, "reference temporary for ", n);
713 return __right_->get_demangled_name(buf+n);
714 }
715 virtual ptrdiff_t print_first(char* f, char* l) const
716 {
717 const ptrdiff_t r = l - f;
718 if (r < n)
719 return n + __right_->print(l, l);
720 ptrdiff_t sz = __right_->print(f+n, l) + n;
721 if (r >= sz)
722 strncpy(f, "reference temporary for ", n);
723 return sz;
724 }
725 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
726 {
727 return __right_->fix_forward_references(t_begin, t_end);
728 }
729};
730
Howard Hinnant4fbf16a2011-05-05 15:27:28 +0000731class __source_name
732 : public __node
733{
734public:
735 __source_name(const char* __name, unsigned __size)
736 {
737 __name_ = __name;
738 __size_ = __size;
739 }
740
741 virtual size_t first_size() const
742 {
743 if (__cached_size_ == -1)
744 {
745 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
746 const_cast<long&>(__cached_size_) = 21;
747 else
748 const_cast<long&>(__cached_size_) = __size_;
749 }
750 return __cached_size_;
751 }
752 virtual char* first_demangled_name(char* buf) const
753 {
754 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
755 return strncpy(buf, "(anonymous namespace)", 21) + 21;
756 return strncpy(buf, __name_, __size_) + __size_;
757 }
758 virtual ptrdiff_t print_first(char* f, char* l) const
759 {
760 const ptrdiff_t r = l - f;
761 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
762 {
763 const ptrdiff_t n = sizeof("(anonymous namespace)") - 1;
764 if (r >= n)
765 {
766 *f++ = '(';
767 *f++ = 'a';
768 *f++ = 'n';
769 *f++ = 'o';
770 *f++ = 'n';
771 *f++ = 'y';
772 *f++ = 'm';
773 *f++ = 'o';
774 *f++ = 'u';
775 *f++ = 's';
776 *f++ = ' ';
777 *f++ = 'n';
778 *f++ = 'a';
779 *f++ = 'm';
780 *f++ = 'e';
781 *f++ = 's';
782 *f++ = 'p';
783 *f++ = 'a';
784 *f++ = 'c';
785 *f++ = 'e';
786 *f = ')';
787 }
788 return n;
789 }
790 if (r >= __size_)
791 strncpy(f, __name_, __size_);
792 return __size_;
793 }
794};
795
796class __operator_new
797 : public __node
798{
799public:
800
801 virtual size_t first_size() const {return sizeof("operator new") - 1;}
802 virtual char* first_demangled_name(char* buf) const
803 {
804 return strncpy(buf, "operator new", sizeof("operator new") - 1) +
805 sizeof("operator new") - 1;
806 }
807 virtual ptrdiff_t print_first(char* f, char* l) const
808 {
809 const ptrdiff_t r = l - f;
810 const ptrdiff_t n = sizeof("operator new") - 1;
811 if (r >= n)
812 {
813 *f++ = 'o';
814 *f++ = 'p';
815 *f++ = 'e';
816 *f++ = 'r';
817 *f++ = 'a';
818 *f++ = 't';
819 *f++ = 'o';
820 *f++ = 'r';
821 *f++ = ' ';
822 *f++ = 'n';
823 *f++ = 'e';
824 *f = 'w';
825 }
826 return n;
827 }
828};
829
830class __operator_new_array
831 : public __node
832{
833public:
834
835 virtual size_t first_size() const {return sizeof("operator new[]") - 1;}
836 virtual char* first_demangled_name(char* buf) const
837 {
838 return strncpy(buf, "operator new[]", sizeof("operator new[]") - 1) +
839 sizeof("operator new[]") - 1;
840 }
841 virtual ptrdiff_t print_first(char* f, char* l) const
842 {
843 const ptrdiff_t r = l - f;
844 const ptrdiff_t n = sizeof("operator new[]") - 1;
845 if (r >= n)
846 {
847 *f++ = 'o';
848 *f++ = 'p';
849 *f++ = 'e';
850 *f++ = 'r';
851 *f++ = 'a';
852 *f++ = 't';
853 *f++ = 'o';
854 *f++ = 'r';
855 *f++ = ' ';
856 *f++ = 'n';
857 *f++ = 'e';
858 *f++ = 'w';
859 *f++ = '[';
860 *f = ']';
861 }
862 return n;
863 }
864};
865
866class __operator_delete
867 : public __node
868{
869public:
870
871 virtual size_t first_size() const {return sizeof("operator delete") - 1;}
872 virtual char* first_demangled_name(char* buf) const
873 {
874 return strncpy(buf, "operator delete", sizeof("operator delete") - 1) +
875 sizeof("operator delete") - 1;
876 }
877 virtual ptrdiff_t print_first(char* f, char* l) const
878 {
879 const ptrdiff_t r = l - f;
880 const ptrdiff_t n = sizeof("operator delete") - 1;
881 if (r >= n)
882 {
883 *f++ = 'o';
884 *f++ = 'p';
885 *f++ = 'e';
886 *f++ = 'r';
887 *f++ = 'a';
888 *f++ = 't';
889 *f++ = 'o';
890 *f++ = 'r';
891 *f++ = ' ';
892 *f++ = 'd';
893 *f++ = 'e';
894 *f++ = 'l';
895 *f++ = 'e';
896 *f++ = 't';
897 *f = 'e';
898 }
899 return n;
900 }
901};
902
903class __operator_delete_array
904 : public __node
905{
906public:
907
908 virtual size_t first_size() const {return sizeof("operator delete[]") - 1;}
909 virtual char* first_demangled_name(char* buf) const
910 {
911 return strncpy(buf, "operator delete[]", sizeof("operator delete[]") - 1) +
912 sizeof("operator delete[]") - 1;
913 }
914 virtual ptrdiff_t print_first(char* f, char* l) const
915 {
916 const ptrdiff_t r = l - f;
917 const ptrdiff_t n = sizeof("operator delete[]") - 1;
918 if (r >= n)
919 {
920 *f++ = 'o';
921 *f++ = 'p';
922 *f++ = 'e';
923 *f++ = 'r';
924 *f++ = 'a';
925 *f++ = 't';
926 *f++ = 'o';
927 *f++ = 'r';
928 *f++ = ' ';
929 *f++ = 'd';
930 *f++ = 'e';
931 *f++ = 'l';
932 *f++ = 'e';
933 *f++ = 't';
934 *f++ = 'e';
935 *f++ = '[';
936 *f = ']';
937 }
938 return n;
939 }
940};
941
942class __operator_logical_and
943 : public __node
944{
945public:
946
947 __operator_logical_and() {}
948 __operator_logical_and(__node* op1, __node* op2)
949 {
950 __left_ = op1;
951 __right_ = op2;
952 }
953 virtual size_t first_size() const
954 {
955 if (__cached_size_ == -1)
956 {
957 if (__left_)
958 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
959 else
960 const_cast<long&>(__cached_size_) = sizeof("operator&&") - 1;
961 }
962 return __cached_size_;
963 }
964 virtual char* first_demangled_name(char* buf) const
965 {
966 if (__left_)
967 {
968 *buf++ = '(';
969 buf = __left_->get_demangled_name(buf);
970 strncpy(buf, ") && (", 6);
971 buf += 6;
972 buf = __right_->get_demangled_name(buf);
973 *buf++ = ')';
974 }
975 else
976 {
977 strncpy(buf, "operator&&", sizeof("operator&&") - 1);
978 buf += sizeof("operator&&") - 1;
979 }
980 return buf;
981 }
982 virtual ptrdiff_t print_first(char* f, char* l) const
983 {
984 const ptrdiff_t r = l - f;
985 if (__left_)
986 {
987 const ptrdiff_t n1 = 8;
988 if (r < n1)
989 return n1 + __left_->print(l, l) + __right_->print(l, l);
990 ptrdiff_t sz1 = __left_->print(f+1, l);
991 if (r < n1 + sz1)
992 return n1 + sz1 + __right_->print(l, l);
993 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
994 if (r >= n1 + sz1 + sz2)
995 {
996 *f = '(';
997 f += 1 + sz1;
998 *f++ = ')';
999 *f++ = ' ';
1000 *f++ = '&';
1001 *f++ = '&';
1002 *f++ = ' ';
1003 *f = '(';
1004 f += 1 + sz2;
1005 *f = ')';
1006 }
1007 return n1 + sz1 + sz2;
1008 }
1009 const ptrdiff_t n2 = sizeof("operator&&") - 1;
1010 if (r >= n2)
1011 {
1012 *f++ = 'o';
1013 *f++ = 'p';
1014 *f++ = 'e';
1015 *f++ = 'r';
1016 *f++ = 'a';
1017 *f++ = 't';
1018 *f++ = 'o';
1019 *f++ = 'r';
1020 *f++ = '&';
1021 *f = '&';
1022 }
1023 return n2;
1024 }
1025 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1026 {
1027 bool r = true;
1028 if (__left_)
1029 r = r && __left_->fix_forward_references(t_begin, t_end);
1030 if (__right_)
1031 r = r && __right_->fix_forward_references(t_begin, t_end);
1032 return r;
1033 }
1034};
1035
1036class __operator_addressof
1037 : public __node
1038{
1039public:
1040
1041 __operator_addressof() {}
1042 explicit __operator_addressof(__node* op)
1043 {
1044 __left_ = op;
1045 }
1046 virtual size_t first_size() const
1047 {
1048 if (__cached_size_ == -1)
1049 {
1050 if (__left_)
1051 const_cast<long&>(__cached_size_) = 3+__left_->size();
1052 else
1053 const_cast<long&>(__cached_size_) = sizeof("operator&") - 1;
1054 }
1055 return __cached_size_;
1056 }
1057 virtual char* first_demangled_name(char* buf) const
1058 {
1059 if (__left_)
1060 {
1061 *buf++ = '&';
1062 *buf++ = '(';
1063 buf = __left_->get_demangled_name(buf);
1064 *buf++ = ')';
1065 }
1066 else
1067 {
1068 strncpy(buf, "operator&", sizeof("operator&") - 1);
1069 buf += sizeof("operator&") - 1;
1070 }
1071 return buf;
1072 }
1073 virtual ptrdiff_t print_first(char* f, char* l) const
1074 {
1075 const ptrdiff_t r = l - f;
1076 if (__left_)
1077 {
1078 const ptrdiff_t n1 = 3;
1079 if (r < n1)
1080 return n1 + __left_->print(l, l);
1081 ptrdiff_t sz1 = __left_->print(f+2, l);
1082 if (r >= n1 + sz1)
1083 {
1084 *f++ = '&';
1085 *f = '(';
1086 f += 1 + sz1;
1087 *f = ')';
1088 }
1089 return n1 + sz1;
1090 }
1091 const ptrdiff_t n2 = sizeof("operator&") - 1;
1092 if (r >= n2)
1093 {
1094 *f++ = 'o';
1095 *f++ = 'p';
1096 *f++ = 'e';
1097 *f++ = 'r';
1098 *f++ = 'a';
1099 *f++ = 't';
1100 *f++ = 'o';
1101 *f++ = 'r';
1102 *f = '&';
1103 }
1104 return n2;
1105 }
1106 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1107 {
1108 if (__left_)
1109 return __left_->fix_forward_references(t_begin, t_end);
1110 return true;
1111 }
1112};
1113
1114class __operator_bit_and
1115 : public __node
1116{
1117public:
1118
1119 __operator_bit_and() {}
1120 __operator_bit_and(__node* op1, __node* op2)
1121 {
1122 __left_ = op1;
1123 __right_ = op2;
1124 }
1125 virtual size_t first_size() const
1126 {
1127 if (__cached_size_ == -1)
1128 {
1129 if (__left_)
1130 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1131 else
1132 const_cast<long&>(__cached_size_) = sizeof("operator&") - 1;
1133 }
1134 return __cached_size_;
1135 }
1136 virtual char* first_demangled_name(char* buf) const
1137 {
1138 if (__left_)
1139 {
1140 *buf++ = '(';
1141 buf = __left_->get_demangled_name(buf);
1142 strncpy(buf, ") & (", 5);
1143 buf += 5;
1144 buf = __right_->get_demangled_name(buf);
1145 *buf++ = ')';
1146 }
1147 else
1148 {
1149 strncpy(buf, "operator&", sizeof("operator&") - 1);
1150 buf += sizeof("operator&") - 1;
1151 }
1152 return buf;
1153 }
1154 virtual ptrdiff_t print_first(char* f, char* l) const
1155 {
1156 const ptrdiff_t r = l - f;
1157 if (__left_)
1158 {
1159 const ptrdiff_t n1 = 7;
1160 if (r < n1)
1161 return n1 + __left_->print(l, l) + __right_->print(l, l);
1162 ptrdiff_t sz1 = __left_->print(f+1, l);
1163 if (r < n1 + sz1)
1164 return n1 + sz1 + __right_->print(l, l);
1165 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1166 if (r >= n1 + sz1 + sz2)
1167 {
1168 *f = '(';
1169 f += 1 + sz1;
1170 *f++ = ')';
1171 *f++ = ' ';
1172 *f++ = '&';
1173 *f++ = ' ';
1174 *f = '(';
1175 f += 1 + sz2;
1176 *f = ')';
1177 }
1178 return n1 + sz1 + sz2;
1179 }
1180 const ptrdiff_t n2 = sizeof("operator&") - 1;
1181 if (r >= n2)
1182 {
1183 *f++ = 'o';
1184 *f++ = 'p';
1185 *f++ = 'e';
1186 *f++ = 'r';
1187 *f++ = 'a';
1188 *f++ = 't';
1189 *f++ = 'o';
1190 *f++ = 'r';
1191 *f = '&';
1192 }
1193 return n2;
1194 }
1195 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1196 {
1197 bool r = true;
1198 if (__left_)
1199 r = r && __left_->fix_forward_references(t_begin, t_end);
1200 if (__right_)
1201 r = r && __right_->fix_forward_references(t_begin, t_end);
1202 return r;
1203 }
1204};
1205
1206class __operator_and_equal
1207 : public __node
1208{
1209public:
1210
1211 __operator_and_equal() {}
1212 __operator_and_equal(__node* op1, __node* op2)
1213 {
1214 __left_ = op1;
1215 __right_ = op2;
1216 }
1217 virtual size_t first_size() const
1218 {
1219 if (__cached_size_ == -1)
1220 {
1221 if (__left_)
1222 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
1223 else
1224 const_cast<long&>(__cached_size_) = sizeof("operator&=") - 1;
1225 }
1226 return __cached_size_;
1227 }
1228 virtual char* first_demangled_name(char* buf) const
1229 {
1230 if (__left_)
1231 {
1232 *buf++ = '(';
1233 buf = __left_->get_demangled_name(buf);
1234 strncpy(buf, ") &= (", 6);
1235 buf += 6;
1236 buf = __right_->get_demangled_name(buf);
1237 *buf++ = ')';
1238 }
1239 else
1240 {
1241 strncpy(buf, "operator&=", sizeof("operator&=") - 1);
1242 buf += sizeof("operator&=") - 1;
1243 }
1244 return buf;
1245 }
1246 virtual ptrdiff_t print_first(char* f, char* l) const
1247 {
1248 const ptrdiff_t r = l - f;
1249 if (__left_)
1250 {
1251 const ptrdiff_t n1 = 8;
1252 if (r < n1)
1253 return n1 + __left_->print(l, l) + __right_->print(l, l);
1254 ptrdiff_t sz1 = __left_->print(f+1, l);
1255 if (r < n1 + sz1)
1256 return n1 + sz1 + __right_->print(l, l);
1257 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1258 if (r >= n1 + sz1 + sz2)
1259 {
1260 *f = '(';
1261 f += 1 + sz1;
1262 *f++ = ')';
1263 *f++ = ' ';
1264 *f++ = '&';
1265 *f++ = '=';
1266 *f++ = ' ';
1267 *f = '(';
1268 f += 1 + sz2;
1269 *f = ')';
1270 }
1271 return n1 + sz1 + sz2;
1272 }
1273 const ptrdiff_t n2 = sizeof("operator&=") - 1;
1274 if (r >= n2)
1275 {
1276 *f++ = 'o';
1277 *f++ = 'p';
1278 *f++ = 'e';
1279 *f++ = 'r';
1280 *f++ = 'a';
1281 *f++ = 't';
1282 *f++ = 'o';
1283 *f++ = 'r';
1284 *f++ = '&';
1285 *f = '=';
1286 }
1287 return n2;
1288 }
1289 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1290 {
1291 bool r = true;
1292 if (__left_)
1293 r = r && __left_->fix_forward_references(t_begin, t_end);
1294 if (__right_)
1295 r = r && __right_->fix_forward_references(t_begin, t_end);
1296 return r;
1297 }
1298};
1299
1300class __operator_equal
1301 : public __node
1302{
1303public:
1304
1305 __operator_equal() {}
1306 __operator_equal(__node* op1, __node* op2)
1307 {
1308 __left_ = op1;
1309 __right_ = op2;
1310 }
1311 virtual size_t first_size() const
1312 {
1313 if (__cached_size_ == -1)
1314 {
1315 if (__left_)
1316 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1317 else
1318 const_cast<long&>(__cached_size_) = sizeof("operator=") - 1;
1319 }
1320 return __cached_size_;
1321 }
1322 virtual char* first_demangled_name(char* buf) const
1323 {
1324 if (__left_)
1325 {
1326 *buf++ = '(';
1327 buf = __left_->get_demangled_name(buf);
1328 strncpy(buf, ") = (", 5);
1329 buf += 5;
1330 buf = __right_->get_demangled_name(buf);
1331 *buf++ = ')';
1332 }
1333 else
1334 {
1335 strncpy(buf, "operator=", sizeof("operator=") - 1);
1336 buf += sizeof("operator=") - 1;
1337 }
1338 return buf;
1339 }
1340 virtual ptrdiff_t print_first(char* f, char* l) const
1341 {
1342 const ptrdiff_t r = l - f;
1343 if (__left_)
1344 {
1345 const ptrdiff_t n1 = 7;
1346 if (r < n1)
1347 return n1 + __left_->print(l, l) + __right_->print(l, l);
1348 ptrdiff_t sz1 = __left_->print(f+1, l);
1349 if (r < n1 + sz1)
1350 return n1 + sz1 + __right_->print(l, l);
1351 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1352 if (r >= n1 + sz1 + sz2)
1353 {
1354 *f = '(';
1355 f += 1 + sz1;
1356 *f++ = ')';
1357 *f++ = ' ';
1358 *f++ = '=';
1359 *f++ = ' ';
1360 *f = '(';
1361 f += 1 + sz2;
1362 *f = ')';
1363 }
1364 return n1 + sz1 + sz2;
1365 }
1366 const ptrdiff_t n2 = sizeof("operator=") - 1;
1367 if (r >= n2)
1368 {
1369 *f++ = 'o';
1370 *f++ = 'p';
1371 *f++ = 'e';
1372 *f++ = 'r';
1373 *f++ = 'a';
1374 *f++ = 't';
1375 *f++ = 'o';
1376 *f++ = 'r';
1377 *f = '=';
1378 }
1379 return n2;
1380 }
1381 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1382 {
1383 bool r = true;
1384 if (__left_)
1385 r = r && __left_->fix_forward_references(t_begin, t_end);
1386 if (__right_)
1387 r = r && __right_->fix_forward_references(t_begin, t_end);
1388 return r;
1389 }
1390};
1391
1392class __operator_alignof_type
1393 : public __node
1394{
1395public:
1396
1397 __operator_alignof_type() {}
1398 __operator_alignof_type(__node* op)
1399 {
1400 __right_ = op;
1401 }
1402 virtual size_t first_size() const
1403 {
1404 if (__cached_size_ == -1)
1405 {
1406 if (__right_)
1407 const_cast<long&>(__cached_size_) = __right_->size() + 10;
1408 else
1409 const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1;
1410 }
1411 return __cached_size_;
1412 }
1413 virtual char* first_demangled_name(char* buf) const
1414 {
1415 if (__right_)
1416 {
1417 strncpy(buf, "alignof (", 9);
1418 buf += 9;
1419 buf = __right_->get_demangled_name(buf);
1420 *buf++ = ')';
1421 }
1422 else
1423 {
1424 strncpy(buf, "operator alignof", sizeof("operator alignof") - 1);
1425 buf += sizeof("operator alignof") - 1;
1426 }
1427 return buf;
1428 }
1429 virtual ptrdiff_t print_first(char* f, char* l) const
1430 {
1431 const ptrdiff_t r = l - f;
1432 if (__right_)
1433 {
1434 const ptrdiff_t n1 = sizeof("alignof ()") - 1;
1435 if (r < n1)
1436 return n1 + __right_->print(l, l);
1437 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
1438 if (r >= n1 + sz1)
1439 {
1440 *f++ = 'a';
1441 *f++ = 'l';
1442 *f++ = 'i';
1443 *f++ = 'g';
1444 *f++ = 'n';
1445 *f++ = 'o';
1446 *f++ = 'f';
1447 *f++ = ' ';
1448 *f = '(';
1449 f += 1 + sz1;
1450 *f = ')';
1451 }
1452 return n1 + sz1;
1453 }
1454 const ptrdiff_t n2 = sizeof("operator alignof") - 1;
1455 if (r >= n2)
1456 {
1457 *f++ = 'o';
1458 *f++ = 'p';
1459 *f++ = 'e';
1460 *f++ = 'r';
1461 *f++ = 'a';
1462 *f++ = 't';
1463 *f++ = 'o';
1464 *f++ = 'r';
1465 *f++ = ' ';
1466 *f++ = 'a';
1467 *f++ = 'l';
1468 *f++ = 'i';
1469 *f++ = 'g';
1470 *f++ = 'n';
1471 *f++ = 'o';
1472 *f = 'f';
1473 }
1474 return n2;
1475 }
1476 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1477 {
1478 if (__right_)
1479 return __right_->fix_forward_references(t_begin, t_end);
1480 return true;
1481 }
1482};
1483
1484class __operator_alignof_expression
1485 : public __node
1486{
1487public:
1488
1489 __operator_alignof_expression() {}
1490 __operator_alignof_expression(__node* op)
1491 {
1492 __right_ = op;
1493 }
1494 virtual size_t first_size() const
1495 {
1496 if (__cached_size_ == -1)
1497 {
1498 if (__right_)
1499 const_cast<long&>(__cached_size_) = __right_->size() + 10;
1500 else
1501 const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1;
1502 }
1503 return __cached_size_;
1504 }
1505 virtual char* first_demangled_name(char* buf) const
1506 {
1507 if (__right_)
1508 {
1509 strncpy(buf, "alignof (", 9);
1510 buf += 9;
1511 buf = __right_->get_demangled_name(buf);
1512 *buf++ = ')';
1513 }
1514 else
1515 {
1516 strncpy(buf, "operator alignof", sizeof("operator alignof") - 1);
1517 buf += sizeof("operator alignof") - 1;
1518 }
1519 return buf;
1520 }
1521 virtual ptrdiff_t print_first(char* f, char* l) const
1522 {
1523 const ptrdiff_t r = l - f;
1524 if (__right_)
1525 {
1526 const ptrdiff_t n1 = sizeof("alignof ()") - 1;
1527 if (r < n1)
1528 return n1 + __right_->print(l, l);
1529 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
1530 if (r >= n1 + sz1)
1531 {
1532 *f++ = 'a';
1533 *f++ = 'l';
1534 *f++ = 'i';
1535 *f++ = 'g';
1536 *f++ = 'n';
1537 *f++ = 'o';
1538 *f++ = 'f';
1539 *f++ = ' ';
1540 *f = '(';
1541 f += 1 + sz1;
1542 *f = ')';
1543 }
1544 return n1 + sz1;
1545 }
1546 const ptrdiff_t n2 = sizeof("operator alignof") - 1;
1547 if (r >= n2)
1548 {
1549 *f++ = 'o';
1550 *f++ = 'p';
1551 *f++ = 'e';
1552 *f++ = 'r';
1553 *f++ = 'a';
1554 *f++ = 't';
1555 *f++ = 'o';
1556 *f++ = 'r';
1557 *f++ = ' ';
1558 *f++ = 'a';
1559 *f++ = 'l';
1560 *f++ = 'i';
1561 *f++ = 'g';
1562 *f++ = 'n';
1563 *f++ = 'o';
1564 *f = 'f';
1565 }
1566 return n2;
1567 }
1568 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1569 {
1570 if (__right_)
1571 return __right_->fix_forward_references(t_begin, t_end);
1572 return true;
1573 }
1574};
1575
1576class __operator_paren
1577 : public __node
1578{
1579public:
1580
1581 virtual size_t first_size() const {return sizeof("operator()") - 1;}
1582 virtual char* first_demangled_name(char* buf) const
1583 {
1584 strncpy(buf, "operator()", sizeof("operator()") - 1);
1585 return buf + sizeof("operator()") - 1;
1586 }
1587 virtual ptrdiff_t print_first(char* f, char* l) const
1588 {
1589 const ptrdiff_t r = l - f;
1590 const ptrdiff_t n = sizeof("operator()") - 1;
1591 if (r >= n)
1592 {
1593 *f++ = 'o';
1594 *f++ = 'p';
1595 *f++ = 'e';
1596 *f++ = 'r';
1597 *f++ = 'a';
1598 *f++ = 't';
1599 *f++ = 'o';
1600 *f++ = 'r';
1601 *f++ = '(';
1602 *f = ')';
1603 }
1604 return n;
1605 }
1606};
1607
1608class __operator_comma
1609 : public __node
1610{
1611public:
1612
1613 __operator_comma() {}
1614 __operator_comma(__node* op1, __node* op2)
1615 {
1616 __left_ = op1;
1617 __right_ = op2;
1618 }
1619 virtual size_t first_size() const
1620 {
1621 if (__cached_size_ == -1)
1622 {
1623 if (__left_)
1624 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
1625 else
1626 const_cast<long&>(__cached_size_) = sizeof("operator,") - 1;
1627 }
1628 return __cached_size_;
1629 }
1630 virtual char* first_demangled_name(char* buf) const
1631 {
1632 if (__left_)
1633 {
1634 *buf++ = '(';
1635 buf = __left_->get_demangled_name(buf);
1636 strncpy(buf, ") , (", 5);
1637 buf += 5;
1638 buf = __right_->get_demangled_name(buf);
1639 *buf++ = ')';
1640 }
1641 else
1642 {
1643 strncpy(buf, "operator,", sizeof("operator,") - 1);
1644 buf += sizeof("operator,") - 1;
1645 }
1646 return buf;
1647 }
1648 virtual ptrdiff_t print_first(char* f, char* l) const
1649 {
1650 const ptrdiff_t r = l - f;
1651 if (__left_)
1652 {
1653 const ptrdiff_t n1 = 7;
1654 if (r < n1)
1655 return n1 + __left_->print(l, l) + __right_->print(l, l);
1656 ptrdiff_t sz1 = __left_->print(f+1, l);
1657 if (r < n1 + sz1)
1658 return n1 + sz1 + __right_->print(l, l);
1659 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
1660 if (r >= n1 + sz1 + sz2)
1661 {
1662 *f = '(';
1663 f += 1 + sz1;
1664 *f++ = ')';
1665 *f++ = ' ';
1666 *f++ = ',';
1667 *f++ = ' ';
1668 *f = '(';
1669 f += 1 + sz2;
1670 *f = ')';
1671 }
1672 return n1 + sz1 + sz2;
1673 }
1674 const ptrdiff_t n2 = sizeof("operator,") - 1;
1675 if (r >= n2)
1676 {
1677 *f++ = 'o';
1678 *f++ = 'p';
1679 *f++ = 'e';
1680 *f++ = 'r';
1681 *f++ = 'a';
1682 *f++ = 't';
1683 *f++ = 'o';
1684 *f++ = 'r';
1685 *f = ',';
1686 }
1687 return n2;
1688 }
1689 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1690 {
1691 bool r = true;
1692 if (__left_)
1693 r = r && __left_->fix_forward_references(t_begin, t_end);
1694 if (__right_)
1695 r = r && __right_->fix_forward_references(t_begin, t_end);
1696 return r;
1697 }
1698};
1699
1700class __operator_tilda
1701 : public __node
1702{
1703public:
1704
1705 __operator_tilda() {}
1706 explicit __operator_tilda(__node* op)
1707 {
1708 __left_ = op;
1709 }
1710 virtual size_t first_size() const
1711 {
1712 if (__cached_size_ == -1)
1713 {
1714 if (__left_)
1715 const_cast<long&>(__cached_size_) = 3+__left_->size();
1716 else
1717 const_cast<long&>(__cached_size_) = sizeof("operator~") - 1;
1718 }
1719 return __cached_size_;
1720 }
1721 virtual char* first_demangled_name(char* buf) const
1722 {
1723 if (__left_)
1724 {
1725 *buf++ = '~';
1726 *buf++ = '(';
1727 buf = __left_->get_demangled_name(buf);
1728 *buf++ = ')';
1729 }
1730 else
1731 {
1732 strncpy(buf, "operator~", sizeof("operator~") - 1);
1733 buf += sizeof("operator~") - 1;
1734 }
1735 return buf;
1736 }
1737 virtual ptrdiff_t print_first(char* f, char* l) const
1738 {
1739 const ptrdiff_t r = l - f;
1740 if (__left_)
1741 {
1742 const ptrdiff_t n1 = 3;
1743 if (r < n1)
1744 return n1 + __left_->print(l, l);
1745 ptrdiff_t sz1 = __left_->print(f+2, l);
1746 if (r >= n1 + sz1)
1747 {
1748 *f++ = '~';
1749 *f = '(';
1750 f += 1 + sz1;
1751 *f = ')';
1752 }
1753 return n1 + sz1;
1754 }
1755 const ptrdiff_t n2 = sizeof("operator~") - 1;
1756 if (r >= n2)
1757 {
1758 *f++ = 'o';
1759 *f++ = 'p';
1760 *f++ = 'e';
1761 *f++ = 'r';
1762 *f++ = 'a';
1763 *f++ = 't';
1764 *f++ = 'o';
1765 *f++ = 'r';
1766 *f = '~';
1767 }
1768 return n2;
1769 }
1770 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1771 {
1772 if (__left_)
1773 return __left_->fix_forward_references(t_begin, t_end);
1774 return true;
1775 }
1776};
1777
1778class __operator_cast
1779 : public __node
1780{
1781 static const size_t n = sizeof("operator ") - 1;
1782public:
1783
1784 explicit __operator_cast(__node* type)
1785 {
1786 __right_ = type;
1787 }
1788 __operator_cast(__node* type, __node* arg)
1789 {
1790 __size_ = 1;
1791 __right_ = type;
1792 __left_ = arg;
1793 }
1794 virtual size_t first_size() const
1795 {
1796 if (__cached_size_ == -1)
1797 {
1798 size_t off;
1799 if (__size_)
1800 {
1801 off = 4;
1802 off += __right_->size();
1803 if (__left_)
1804 off += __left_->size();
1805 }
1806 else
1807 off = n + __right_->size();;
1808 const_cast<long&>(__cached_size_) = off;
1809 }
1810 return __cached_size_;
1811 }
1812 virtual char* first_demangled_name(char* buf) const
1813 {
1814 if (__size_)
1815 {
1816 *buf++ = '(';
1817 buf = __right_->get_demangled_name(buf);
1818 *buf++ = ')';
1819 *buf++ = '(';
1820 if (__left_)
1821 buf = __left_->get_demangled_name(buf);
1822 *buf++ = ')';
1823 }
1824 else
1825 {
1826 strncpy(buf, "operator ", n);
1827 buf = __right_->get_demangled_name(buf+n);
1828 }
1829 return buf;
1830 }
1831 virtual ptrdiff_t print_first(char* f, char* l) const
1832 {
1833 const ptrdiff_t r = l - f;
1834 if (__size_)
1835 {
1836 const ptrdiff_t n1 = 4;
1837 if (r < n1)
1838 return n1 + __right_->print(l, l) +
1839 (__left_ ? __left_->print(l, l) : 0);
1840 ptrdiff_t sz1 = __right_->print(f+1, l);
1841 if (r < n1 + sz1)
1842 return n1 + sz1 + (__left_ ? __left_->print(l, l) : 0);
1843 ptrdiff_t sz2 = __left_ ? __left_->print(f+3+sz1, l) : 0;
1844 if (r >= n1 + sz1 + sz2)
1845 {
1846 *f = '(';
1847 f += 1 + sz1;
1848 *f++ = ')';
1849 *f = '(';
1850 f += 1 + sz2;
1851 *f = ')';
1852 }
1853 return n1 + sz1 + sz2;
1854 }
1855 const ptrdiff_t n2 = sizeof("operator ") - 1;
1856 if (r < n2)
1857 return n2 + __right_->print(l, l);
1858 ptrdiff_t sz1 = __right_->print(f+n2, l);
1859 if (r >= n2 + sz1)
1860 {
1861 *f++ = 'o';
1862 *f++ = 'p';
1863 *f++ = 'e';
1864 *f++ = 'r';
1865 *f++ = 'a';
1866 *f++ = 't';
1867 *f++ = 'o';
1868 *f++ = 'r';
1869 *f = ' ';
1870 }
1871 return n2 + sz1;
1872 }
1873 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1874 {
1875 bool r = true;
1876 if (__left_)
1877 r = r && __left_->fix_forward_references(t_begin, t_end);
1878 r = r && __right_->fix_forward_references(t_begin, t_end);
1879 return r;
1880 }
1881 virtual bool is_ctor_dtor_conv() const
1882 {
1883 return true;
1884 }
1885};
1886
1887class __cast_literal
1888 : public __node
1889{
1890public:
1891
1892 __cast_literal(__node* type, const char* f, const char* l)
1893 {
1894 __left_ = type;
1895 __name_ = f;
1896 __size_ = l - f;
1897 }
1898 virtual size_t first_size() const
1899 {
1900 if (__cached_size_ == -1)
1901 const_cast<long&>(__cached_size_) = 2 + __left_->size() + __size_;
1902 return __cached_size_;
1903 }
1904 virtual char* first_demangled_name(char* buf) const
1905 {
1906 *buf++ = '(';
1907 buf = __left_->get_demangled_name(buf);
1908 *buf++ = ')';
1909 strncpy(buf, __name_, __size_);
1910 return buf + __size_;
1911 }
1912 virtual ptrdiff_t print_first(char* f, char* l) const
1913 {
1914 const ptrdiff_t r = l - f;
1915 const ptrdiff_t n = 2;
1916 if (r < __size_ + n)
1917 return __size_ + n + __left_->print(l, l);
1918 ptrdiff_t sz = __left_->print(f+1, l);
1919 if (r >= __size_ + n + sz)
1920 {
1921 *f = '(';
1922 f += 1 + sz;
1923 *f++ = ')';
1924 strncpy(f, __name_, __size_);
1925 }
1926 return __size_ + n + sz;
1927 }
1928 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1929 {
1930 return __left_->fix_forward_references(t_begin, t_end);
1931 }
1932};
1933
1934class __operator_dereference
1935 : public __node
1936{
1937public:
1938
1939 __operator_dereference() {}
1940 explicit __operator_dereference(__node* op)
1941 {
1942 __left_ = op;
1943 }
1944 virtual size_t first_size() const
1945 {
1946 if (__cached_size_ == -1)
1947 {
1948 if (__left_)
1949 const_cast<long&>(__cached_size_) = 3+__left_->size();
1950 else
1951 const_cast<long&>(__cached_size_) = sizeof("operator*") - 1;
1952 }
1953 return __cached_size_;
1954 }
1955 virtual char* first_demangled_name(char* buf) const
1956 {
1957 if (__left_)
1958 {
1959 *buf++ = '*';
1960 *buf++ = '(';
1961 buf = __left_->get_demangled_name(buf);
1962 *buf++ = ')';
1963 }
1964 else
1965 {
1966 strncpy(buf, "operator*", sizeof("operator*") - 1);
1967 buf += sizeof("operator*") - 1;
1968 }
1969 return buf;
1970 }
1971 virtual ptrdiff_t print_first(char* f, char* l) const
1972 {
1973 const ptrdiff_t r = l - f;
1974 if (__left_)
1975 {
1976 const ptrdiff_t n1 = 3;
1977 if (r < n1)
1978 return n1 + __left_->print(l, l);
1979 ptrdiff_t sz1 = __left_->print(f+2, l);
1980 if (r >= n1 + sz1)
1981 {
1982 *f++ = '*';
1983 *f = '(';
1984 f += 1 + sz1;
1985 *f = ')';
1986 }
1987 return n1 + sz1;
1988 }
1989 const ptrdiff_t n2 = sizeof("operator*") - 1;
1990 if (r >= n2)
1991 {
1992 *f++ = 'o';
1993 *f++ = 'p';
1994 *f++ = 'e';
1995 *f++ = 'r';
1996 *f++ = 'a';
1997 *f++ = 't';
1998 *f++ = 'o';
1999 *f++ = 'r';
2000 *f = '*';
2001 }
2002 return n2;
2003 }
2004 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2005 {
2006 if (__left_)
2007 return __left_->fix_forward_references(t_begin, t_end);
2008 return true;
2009 }
2010};
2011
2012class __operator_divide
2013 : public __node
2014{
2015public:
2016
2017 __operator_divide() {}
2018 __operator_divide(__node* op1, __node* op2)
2019 {
2020 __left_ = op1;
2021 __right_ = op2;
2022 }
2023 virtual size_t first_size() const
2024 {
2025 if (__cached_size_ == -1)
2026 {
2027 if (__left_)
2028 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2029 else
2030 const_cast<long&>(__cached_size_) = sizeof("operator/") - 1;
2031 }
2032 return __cached_size_;
2033 }
2034 virtual char* first_demangled_name(char* buf) const
2035 {
2036 if (__left_)
2037 {
2038 *buf++ = '(';
2039 buf = __left_->get_demangled_name(buf);
2040 strncpy(buf, ") / (", 5);
2041 buf += 5;
2042 buf = __right_->get_demangled_name(buf);
2043 *buf++ = ')';
2044 }
2045 else
2046 {
2047 strncpy(buf, "operator/", sizeof("operator/") - 1);
2048 buf += sizeof("operator/") - 1;
2049 }
2050 return buf;
2051 }
2052 virtual ptrdiff_t print_first(char* f, char* l) const
2053 {
2054 const ptrdiff_t r = l - f;
2055 if (__left_)
2056 {
2057 const ptrdiff_t n1 = 7;
2058 if (r < n1)
2059 return n1 + __left_->print(l, l) + __right_->print(l, l);
2060 ptrdiff_t sz1 = __left_->print(f+1, l);
2061 if (r < n1 + sz1)
2062 return n1 + sz1 + __right_->print(l, l);
2063 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2064 if (r >= n1 + sz1 + sz2)
2065 {
2066 *f = '(';
2067 f += 1 + sz1;
2068 *f++ = ')';
2069 *f++ = ' ';
2070 *f++ = '/';
2071 *f++ = ' ';
2072 *f = '(';
2073 f += 1 + sz2;
2074 *f = ')';
2075 }
2076 return n1 + sz1 + sz2;
2077 }
2078 const ptrdiff_t n2 = sizeof("operator/") - 1;
2079 if (r >= n2)
2080 {
2081 *f++ = 'o';
2082 *f++ = 'p';
2083 *f++ = 'e';
2084 *f++ = 'r';
2085 *f++ = 'a';
2086 *f++ = 't';
2087 *f++ = 'o';
2088 *f++ = 'r';
2089 *f = '/';
2090 }
2091 return n2;
2092 }
2093 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2094 {
2095 bool r = true;
2096 if (__left_)
2097 r = r && __left_->fix_forward_references(t_begin, t_end);
2098 if (__right_)
2099 r = r && __right_->fix_forward_references(t_begin, t_end);
2100 return r;
2101 }
2102};
2103
2104class __operator_divide_equal
2105 : public __node
2106{
2107public:
2108
2109 __operator_divide_equal() {}
2110 __operator_divide_equal(__node* op1, __node* op2)
2111 {
2112 __left_ = op1;
2113 __right_ = op2;
2114 }
2115 virtual size_t first_size() const
2116 {
2117 if (__cached_size_ == -1)
2118 {
2119 if (__left_)
2120 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2121 else
2122 const_cast<long&>(__cached_size_) = sizeof("operator/=") - 1;
2123 }
2124 return __cached_size_;
2125 }
2126 virtual char* first_demangled_name(char* buf) const
2127 {
2128 if (__left_)
2129 {
2130 *buf++ = '(';
2131 buf = __left_->get_demangled_name(buf);
2132 strncpy(buf, ") /= (", 6);
2133 buf += 6;
2134 buf = __right_->get_demangled_name(buf);
2135 *buf++ = ')';
2136 }
2137 else
2138 {
2139 strncpy(buf, "operator/=", sizeof("operator/=") - 1);
2140 buf += sizeof("operator/=") - 1;
2141 }
2142 return buf;
2143 }
2144 virtual ptrdiff_t print_first(char* f, char* l) const
2145 {
2146 const ptrdiff_t r = l - f;
2147 if (__left_)
2148 {
2149 const ptrdiff_t n1 = 8;
2150 if (r < n1)
2151 return n1 + __left_->print(l, l) + __right_->print(l, l);
2152 ptrdiff_t sz1 = __left_->print(f+1, l);
2153 if (r < n1 + sz1)
2154 return n1 + sz1 + __right_->print(l, l);
2155 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2156 if (r >= n1 + sz1 + sz2)
2157 {
2158 *f = '(';
2159 f += 1 + sz1;
2160 *f++ = ')';
2161 *f++ = ' ';
2162 *f++ = '/';
2163 *f++ = '=';
2164 *f++ = ' ';
2165 *f = '(';
2166 f += 1 + sz2;
2167 *f = ')';
2168 }
2169 return n1 + sz1 + sz2;
2170 }
2171 const ptrdiff_t n2 = sizeof("operator/=") - 1;
2172 if (r >= n2)
2173 {
2174 *f++ = 'o';
2175 *f++ = 'p';
2176 *f++ = 'e';
2177 *f++ = 'r';
2178 *f++ = 'a';
2179 *f++ = 't';
2180 *f++ = 'o';
2181 *f++ = 'r';
2182 *f++ = '/';
2183 *f = '=';
2184 }
2185 return n2;
2186 }
2187 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2188 {
2189 bool r = true;
2190 if (__left_)
2191 r = r && __left_->fix_forward_references(t_begin, t_end);
2192 if (__right_)
2193 r = r && __right_->fix_forward_references(t_begin, t_end);
2194 return r;
2195 }
2196};
2197
2198class __operator_xor
2199 : public __node
2200{
2201public:
2202
2203 __operator_xor() {}
2204 __operator_xor(__node* op1, __node* op2)
2205 {
2206 __left_ = op1;
2207 __right_ = op2;
2208 }
2209 virtual size_t first_size() const
2210 {
2211 if (__cached_size_ == -1)
2212 {
2213 if (__left_)
2214 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2215 else
2216 const_cast<long&>(__cached_size_) = sizeof("operator^") - 1;
2217 }
2218 return __cached_size_;
2219 }
2220 virtual char* first_demangled_name(char* buf) const
2221 {
2222 if (__left_)
2223 {
2224 *buf++ = '(';
2225 buf = __left_->get_demangled_name(buf);
2226 strncpy(buf, ") ^ (", 5);
2227 buf += 5;
2228 buf = __right_->get_demangled_name(buf);
2229 *buf++ = ')';
2230 }
2231 else
2232 {
2233 strncpy(buf, "operator^", sizeof("operator^") - 1);
2234 buf += sizeof("operator^") - 1;
2235 }
2236 return buf;
2237 }
2238 virtual ptrdiff_t print_first(char* f, char* l) const
2239 {
2240 const ptrdiff_t r = l - f;
2241 if (__left_)
2242 {
2243 const ptrdiff_t n1 = 7;
2244 if (r < n1)
2245 return n1 + __left_->print(l, l) + __right_->print(l, l);
2246 ptrdiff_t sz1 = __left_->print(f+1, l);
2247 if (r < n1 + sz1)
2248 return n1 + sz1 + __right_->print(l, l);
2249 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2250 if (r >= n1 + sz1 + sz2)
2251 {
2252 *f = '(';
2253 f += 1 + sz1;
2254 *f++ = ')';
2255 *f++ = ' ';
2256 *f++ = '^';
2257 *f++ = ' ';
2258 *f = '(';
2259 f += 1 + sz2;
2260 *f = ')';
2261 }
2262 return n1 + sz1 + sz2;
2263 }
2264 const ptrdiff_t n2 = sizeof("operator^") - 1;
2265 if (r >= n2)
2266 {
2267 *f++ = 'o';
2268 *f++ = 'p';
2269 *f++ = 'e';
2270 *f++ = 'r';
2271 *f++ = 'a';
2272 *f++ = 't';
2273 *f++ = 'o';
2274 *f++ = 'r';
2275 *f = '^';
2276 }
2277 return n2;
2278 }
2279 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2280 {
2281 bool r = true;
2282 if (__left_)
2283 r = r && __left_->fix_forward_references(t_begin, t_end);
2284 if (__right_)
2285 r = r && __right_->fix_forward_references(t_begin, t_end);
2286 return r;
2287 }
2288};
2289
2290class __operator_xor_equal
2291 : public __node
2292{
2293public:
2294
2295 __operator_xor_equal() {}
2296 __operator_xor_equal(__node* op1, __node* op2)
2297 {
2298 __left_ = op1;
2299 __right_ = op2;
2300 }
2301 virtual size_t first_size() const
2302 {
2303 if (__cached_size_ == -1)
2304 {
2305 if (__left_)
2306 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2307 else
2308 const_cast<long&>(__cached_size_) = sizeof("operator^=") - 1;
2309 }
2310 return __cached_size_;
2311 }
2312 virtual char* first_demangled_name(char* buf) const
2313 {
2314 if (__left_)
2315 {
2316 *buf++ = '('; // strncpy(buf, "(", 1);
2317 buf = __left_->get_demangled_name(buf);
2318 strncpy(buf, ") ^= (", 6);
2319 buf += 6;
2320 buf = __right_->get_demangled_name(buf);
2321 *buf++ = ')';
2322 }
2323 else
2324 {
2325 strncpy(buf, "operator^=", sizeof("operator^=") - 1);
2326 buf += sizeof("operator^=") - 1;
2327 }
2328 return buf;
2329 }
2330 virtual ptrdiff_t print_first(char* f, char* l) const
2331 {
2332 const ptrdiff_t r = l - f;
2333 if (__left_)
2334 {
2335 const ptrdiff_t n1 = 8;
2336 if (r < n1)
2337 return n1 + __left_->print(l, l) + __right_->print(l, l);
2338 ptrdiff_t sz1 = __left_->print(f+1, l);
2339 if (r < n1 + sz1)
2340 return n1 + sz1 + __right_->print(l, l);
2341 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2342 if (r >= n1 + sz1 + sz2)
2343 {
2344 *f = '(';
2345 f += 1 + sz1;
2346 *f++ = ')';
2347 *f++ = ' ';
2348 *f++ = '^';
2349 *f++ = '=';
2350 *f++ = ' ';
2351 *f = '(';
2352 f += 1 + sz2;
2353 *f = ')';
2354 }
2355 return n1 + sz1 + sz2;
2356 }
2357 const ptrdiff_t n2 = sizeof("operator^=") - 1;
2358 if (r >= n2)
2359 {
2360 *f++ = 'o';
2361 *f++ = 'p';
2362 *f++ = 'e';
2363 *f++ = 'r';
2364 *f++ = 'a';
2365 *f++ = 't';
2366 *f++ = 'o';
2367 *f++ = 'r';
2368 *f++ = '^';
2369 *f = '=';
2370 }
2371 return n2;
2372 }
2373 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2374 {
2375 bool r = true;
2376 if (__left_)
2377 r = r && __left_->fix_forward_references(t_begin, t_end);
2378 if (__right_)
2379 r = r && __right_->fix_forward_references(t_begin, t_end);
2380 return r;
2381 }
2382};
2383
2384class __operator_equality
2385 : public __node
2386{
2387public:
2388
2389 __operator_equality() {}
2390 __operator_equality(__node* op1, __node* op2)
2391 {
2392 __left_ = op1;
2393 __right_ = op2;
2394 }
2395 virtual size_t first_size() const
2396 {
2397 if (__cached_size_ == -1)
2398 {
2399 if (__left_)
2400 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2401 else
2402 const_cast<long&>(__cached_size_) = sizeof("operator==") - 1;
2403 }
2404 return __cached_size_;
2405 }
2406 virtual char* first_demangled_name(char* buf) const
2407 {
2408 if (__left_)
2409 {
2410 *buf++ = '(';
2411 buf = __left_->get_demangled_name(buf);
2412 strncpy(buf, ") == (", 6);
2413 buf += 6;
2414 buf = __right_->get_demangled_name(buf);
2415 *buf++ = ')';
2416 }
2417 else
2418 {
2419 strncpy(buf, "operator==", sizeof("operator==") - 1);
2420 buf += sizeof("operator==") - 1;
2421 }
2422 return buf;
2423 }
2424 virtual ptrdiff_t print_first(char* f, char* l) const
2425 {
2426 const ptrdiff_t r = l - f;
2427 if (__left_)
2428 {
2429 const ptrdiff_t n1 = 8;
2430 if (r < n1)
2431 return n1 + __left_->print(l, l) + __right_->print(l, l);
2432 ptrdiff_t sz1 = __left_->print(f+1, l);
2433 if (r < n1 + sz1)
2434 return n1 + sz1 + __right_->print(l, l);
2435 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2436 if (r >= n1 + sz1 + sz2)
2437 {
2438 *f = '(';
2439 f += 1 + sz1;
2440 *f++ = ')';
2441 *f++ = ' ';
2442 *f++ = '=';
2443 *f++ = '=';
2444 *f++ = ' ';
2445 *f = '(';
2446 f += 1 + sz2;
2447 *f = ')';
2448 }
2449 return n1 + sz1 + sz2;
2450 }
2451 const ptrdiff_t n2 = sizeof("operator==") - 1;
2452 if (r >= n2)
2453 {
2454 *f++ = 'o';
2455 *f++ = 'p';
2456 *f++ = 'e';
2457 *f++ = 'r';
2458 *f++ = 'a';
2459 *f++ = 't';
2460 *f++ = 'o';
2461 *f++ = 'r';
2462 *f++ = '=';
2463 *f = '=';
2464 }
2465 return n2;
2466 }
2467 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2468 {
2469 bool r = true;
2470 if (__left_)
2471 r = r && __left_->fix_forward_references(t_begin, t_end);
2472 if (__right_)
2473 r = r && __right_->fix_forward_references(t_begin, t_end);
2474 return r;
2475 }
2476};
2477
2478class __operator_greater_equal
2479 : public __node
2480{
2481public:
2482
2483 __operator_greater_equal() {}
2484 __operator_greater_equal(__node* op1, __node* op2)
2485 {
2486 __left_ = op1;
2487 __right_ = op2;
2488 }
2489 virtual size_t first_size() const
2490 {
2491 if (__cached_size_ == -1)
2492 {
2493 if (__left_)
2494 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2495 else
2496 const_cast<long&>(__cached_size_) = sizeof("operator>=") - 1;
2497 }
2498 return __cached_size_;
2499 }
2500 virtual char* first_demangled_name(char* buf) const
2501 {
2502 if (__left_)
2503 {
2504 *buf++ = '(';
2505 buf = __left_->get_demangled_name(buf);
2506 strncpy(buf, ") >= (", 6);
2507 buf += 6;
2508 buf = __right_->get_demangled_name(buf);
2509 *buf++ = ')';
2510 }
2511 else
2512 {
2513 strncpy(buf, "operator>=", sizeof("operator>=") - 1);
2514 buf += sizeof("operator>=") - 1;
2515 }
2516 return buf;
2517 }
2518 virtual ptrdiff_t print_first(char* f, char* l) const
2519 {
2520 const ptrdiff_t r = l - f;
2521 if (__left_)
2522 {
2523 const ptrdiff_t n1 = 8;
2524 if (r < n1)
2525 return n1 + __left_->print(l, l) + __right_->print(l, l);
2526 ptrdiff_t sz1 = __left_->print(f+1, l);
2527 if (r < n1 + sz1)
2528 return n1 + sz1 + __right_->print(l, l);
2529 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2530 if (r >= n1 + sz1 + sz2)
2531 {
2532 *f = '(';
2533 f += 1 + sz1;
2534 *f++ = ')';
2535 *f++ = ' ';
2536 *f++ = '>';
2537 *f++ = '=';
2538 *f++ = ' ';
2539 *f = '(';
2540 f += 1 + sz2;
2541 *f = ')';
2542 }
2543 return n1 + sz1 + sz2;
2544 }
2545 const ptrdiff_t n2 = sizeof("operator>=") - 1;
2546 if (r >= n2)
2547 {
2548 *f++ = 'o';
2549 *f++ = 'p';
2550 *f++ = 'e';
2551 *f++ = 'r';
2552 *f++ = 'a';
2553 *f++ = 't';
2554 *f++ = 'o';
2555 *f++ = 'r';
2556 *f++ = '>';
2557 *f = '=';
2558 }
2559 return n2;
2560 }
2561 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2562 {
2563 bool r = true;
2564 if (__left_)
2565 r = r && __left_->fix_forward_references(t_begin, t_end);
2566 if (__right_)
2567 r = r && __right_->fix_forward_references(t_begin, t_end);
2568 return r;
2569 }
2570};
2571
2572class __operator_greater
2573 : public __node
2574{
2575public:
2576
2577 __operator_greater() {}
2578 __operator_greater(__node* op1, __node* op2)
2579 {
2580 __left_ = op1;
2581 __right_ = op2;
2582 }
2583 virtual size_t first_size() const
2584 {
2585 if (__cached_size_ == -1)
2586 {
2587 if (__left_)
2588 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
2589 else
2590 const_cast<long&>(__cached_size_) = sizeof("operator>") - 1;
2591 }
2592 return __cached_size_;
2593 }
2594 virtual char* first_demangled_name(char* buf) const
2595 {
2596 if (__left_)
2597 {
2598 *buf++ = '(';
2599 *buf++ = '(';
2600 buf = __left_->get_demangled_name(buf);
2601 strncpy(buf, ") > (", 5);
2602 buf += 5;
2603 buf = __right_->get_demangled_name(buf);
2604 *buf++ = ')';
2605 *buf++ = ')';
2606 }
2607 else
2608 {
2609 strncpy(buf, "operator>", sizeof("operator>") - 1);
2610 buf += sizeof("operator>") - 1;
2611 }
2612 return buf;
2613 }
2614 virtual ptrdiff_t print_first(char* f, char* l) const
2615 {
2616 const ptrdiff_t r = l - f;
2617 if (__left_)
2618 {
2619 const ptrdiff_t n1 = 9;
2620 if (r < n1)
2621 return n1 + __left_->print(l, l) + __right_->print(l, l);
2622 ptrdiff_t sz1 = __left_->print(f+2, l);
2623 if (r < n1 + sz1)
2624 return n1 + sz1 + __right_->print(l, l);
2625 ptrdiff_t sz2 = __right_->print(f+(n1-2)+sz1, l);
2626 if (r >= n1 + sz1 + sz2)
2627 {
2628 *f++ = '(';
2629 *f = '(';
2630 f += 1 + sz1;
2631 *f++ = ')';
2632 *f++ = ' ';
2633 *f++ = '>';
2634 *f++ = ' ';
2635 *f = '(';
2636 f += 1 + sz2;
2637 *f++ = ')';
2638 *f = ')';
2639 }
2640 return n1 + sz1 + sz2;
2641 }
2642 const ptrdiff_t n2 = sizeof("operator>") - 1;
2643 if (r >= n2)
2644 {
2645 *f++ = 'o';
2646 *f++ = 'p';
2647 *f++ = 'e';
2648 *f++ = 'r';
2649 *f++ = 'a';
2650 *f++ = 't';
2651 *f++ = 'o';
2652 *f++ = 'r';
2653 *f = '>';
2654 }
2655 return n2;
2656 }
2657 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2658 {
2659 bool r = true;
2660 if (__left_)
2661 r = r && __left_->fix_forward_references(t_begin, t_end);
2662 if (__right_)
2663 r = r && __right_->fix_forward_references(t_begin, t_end);
2664 return r;
2665 }
2666};
2667
2668class __operator_brackets
2669 : public __node
2670{
2671public:
2672
2673 virtual size_t first_size() const {return sizeof("operator[]") - 1;}
2674 virtual char* first_demangled_name(char* buf) const
2675 {
2676 strncpy(buf, "operator[]", sizeof("operator[]") - 1);
2677 return buf + sizeof("operator[]") - 1;
2678 }
2679 virtual ptrdiff_t print_first(char* f, char* l) const
2680 {
2681 const ptrdiff_t r = l - f;
2682 const ptrdiff_t n = sizeof("operator[]") - 1;
2683 if (r >= n)
2684 {
2685 *f++ = 'o';
2686 *f++ = 'p';
2687 *f++ = 'e';
2688 *f++ = 'r';
2689 *f++ = 'a';
2690 *f++ = 't';
2691 *f++ = 'o';
2692 *f++ = 'r';
2693 *f++ = '[';
2694 *f = ']';
2695 }
2696 return n;
2697 }
2698};
2699
2700class __operator_less_equal
2701 : public __node
2702{
2703public:
2704
2705 __operator_less_equal() {}
2706 __operator_less_equal(__node* op1, __node* op2)
2707 {
2708 __left_ = op1;
2709 __right_ = op2;
2710 }
2711 virtual size_t first_size() const
2712 {
2713 if (__cached_size_ == -1)
2714 {
2715 if (__left_)
2716 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2717 else
2718 const_cast<long&>(__cached_size_) = sizeof("operator<=") - 1;
2719 }
2720 return __cached_size_;
2721 }
2722 virtual char* first_demangled_name(char* buf) const
2723 {
2724 if (__left_)
2725 {
2726 *buf++ = '(';
2727 buf = __left_->get_demangled_name(buf);
2728 strncpy(buf, ") <= (", 6);
2729 buf += 6;
2730 buf = __right_->get_demangled_name(buf);
2731 *buf++ = ')';
2732 }
2733 else
2734 {
2735 strncpy(buf, "operator<=", sizeof("operator<=") - 1);
2736 buf += sizeof("operator<=") - 1;
2737 }
2738 return buf;
2739 }
2740 virtual ptrdiff_t print_first(char* f, char* l) const
2741 {
2742 const ptrdiff_t r = l - f;
2743 if (__left_)
2744 {
2745 const ptrdiff_t n1 = 8;
2746 if (r < n1)
2747 return n1 + __left_->print(l, l) + __right_->print(l, l);
2748 ptrdiff_t sz1 = __left_->print(f+1, l);
2749 if (r < n1 + sz1)
2750 return n1 + sz1 + __right_->print(l, l);
2751 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2752 if (r >= n1 + sz1 + sz2)
2753 {
2754 *f = '(';
2755 f += 1 + sz1;
2756 *f++ = ')';
2757 *f++ = ' ';
2758 *f++ = '<';
2759 *f++ = '=';
2760 *f++ = ' ';
2761 *f = '(';
2762 f += 1 + sz2;
2763 *f = ')';
2764 }
2765 return n1 + sz1 + sz2;
2766 }
2767 const ptrdiff_t n2 = sizeof("operator<=") - 1;
2768 if (r >= n2)
2769 {
2770 *f++ = 'o';
2771 *f++ = 'p';
2772 *f++ = 'e';
2773 *f++ = 'r';
2774 *f++ = 'a';
2775 *f++ = 't';
2776 *f++ = 'o';
2777 *f++ = 'r';
2778 *f++ = '<';
2779 *f = '=';
2780 }
2781 return n2;
2782 }
2783 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2784 {
2785 bool r = true;
2786 if (__left_)
2787 r = r && __left_->fix_forward_references(t_begin, t_end);
2788 if (__right_)
2789 r = r && __right_->fix_forward_references(t_begin, t_end);
2790 return r;
2791 }
2792};
2793
2794class __operator_less
2795 : public __node
2796{
2797public:
2798
2799 __operator_less() {}
2800 __operator_less(__node* op1, __node* op2)
2801 {
2802 __left_ = op1;
2803 __right_ = op2;
2804 }
2805 virtual size_t first_size() const
2806 {
2807 if (__cached_size_ == -1)
2808 {
2809 if (__left_)
2810 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
2811 else
2812 const_cast<long&>(__cached_size_) = sizeof("operator<") - 1;
2813 }
2814 return __cached_size_;
2815 }
2816 virtual char* first_demangled_name(char* buf) const
2817 {
2818 if (__left_)
2819 {
2820 *buf++ = '(';
2821 buf = __left_->get_demangled_name(buf);
2822 strncpy(buf, ") < (", 5);
2823 buf += 5;
2824 buf = __right_->get_demangled_name(buf);
2825 *buf++ = ')';
2826 }
2827 else
2828 {
2829 strncpy(buf, "operator<", sizeof("operator<") - 1);
2830 buf += sizeof("operator<") - 1;
2831 }
2832 return buf;
2833 }
2834 virtual ptrdiff_t print_first(char* f, char* l) const
2835 {
2836 const ptrdiff_t r = l - f;
2837 if (__left_)
2838 {
2839 const ptrdiff_t n1 = 7;
2840 if (r < n1)
2841 return n1 + __left_->print(l, l) + __right_->print(l, l);
2842 ptrdiff_t sz1 = __left_->print(f+1, l);
2843 if (r < n1 + sz1)
2844 return n1 + sz1 + __right_->print(l, l);
2845 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2846 if (r >= n1 + sz1 + sz2)
2847 {
2848 *f = '(';
2849 f += 1 + sz1;
2850 *f++ = ')';
2851 *f++ = ' ';
2852 *f++ = '<';
2853 *f++ = ' ';
2854 *f = '(';
2855 f += 1 + sz2;
2856 *f = ')';
2857 }
2858 return n1 + sz1 + sz2;
2859 }
2860 const ptrdiff_t n2 = sizeof("operator<") - 1;
2861 if (r >= n2)
2862 {
2863 *f++ = 'o';
2864 *f++ = 'p';
2865 *f++ = 'e';
2866 *f++ = 'r';
2867 *f++ = 'a';
2868 *f++ = 't';
2869 *f++ = 'o';
2870 *f++ = 'r';
2871 *f = '<';
2872 }
2873 return n2;
2874 }
2875 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2876 {
2877 bool r = true;
2878 if (__left_)
2879 r = r && __left_->fix_forward_references(t_begin, t_end);
2880 if (__right_)
2881 r = r && __right_->fix_forward_references(t_begin, t_end);
2882 return r;
2883 }
2884};
2885
2886class __operator_left_shift
2887 : public __node
2888{
2889public:
2890
2891 __operator_left_shift() {}
2892 __operator_left_shift(__node* op1, __node* op2)
2893 {
2894 __left_ = op1;
2895 __right_ = op2;
2896 }
2897 virtual size_t first_size() const
2898 {
2899 if (__cached_size_ == -1)
2900 {
2901 if (__left_)
2902 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
2903 else
2904 const_cast<long&>(__cached_size_) = sizeof("operator<<") - 1;
2905 }
2906 return __cached_size_;
2907 }
2908 virtual char* first_demangled_name(char* buf) const
2909 {
2910 if (__left_)
2911 {
2912 *buf++ = '(';
2913 buf = __left_->get_demangled_name(buf);
2914 strncpy(buf, ") << (", 6);
2915 buf += 6;
2916 buf = __right_->get_demangled_name(buf);
2917 *buf++ = ')';
2918 }
2919 else
2920 {
2921 strncpy(buf, "operator<<", sizeof("operator<<") - 1);
2922 buf += sizeof("operator<<") - 1;
2923 }
2924 return buf;
2925 }
2926 virtual ptrdiff_t print_first(char* f, char* l) const
2927 {
2928 const ptrdiff_t r = l - f;
2929 if (__left_)
2930 {
2931 const ptrdiff_t n1 = 8;
2932 if (r < n1)
2933 return n1 + __left_->print(l, l) + __right_->print(l, l);
2934 ptrdiff_t sz1 = __left_->print(f+1, l);
2935 if (r < n1 + sz1)
2936 return n1 + sz1 + __right_->print(l, l);
2937 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
2938 if (r >= n1 + sz1 + sz2)
2939 {
2940 *f = '(';
2941 f += 1 + sz1;
2942 *f++ = ')';
2943 *f++ = ' ';
2944 *f++ = '<';
2945 *f++ = '<';
2946 *f++ = ' ';
2947 *f = '(';
2948 f += 1 + sz2;
2949 *f = ')';
2950 }
2951 return n1 + sz1 + sz2;
2952 }
2953 const ptrdiff_t n2 = sizeof("operator<<") - 1;
2954 if (r >= n2)
2955 {
2956 *f++ = 'o';
2957 *f++ = 'p';
2958 *f++ = 'e';
2959 *f++ = 'r';
2960 *f++ = 'a';
2961 *f++ = 't';
2962 *f++ = 'o';
2963 *f++ = 'r';
2964 *f++ = '<';
2965 *f = '<';
2966 }
2967 return n2;
2968 }
2969 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2970 {
2971 bool r = true;
2972 if (__left_)
2973 r = r && __left_->fix_forward_references(t_begin, t_end);
2974 if (__right_)
2975 r = r && __right_->fix_forward_references(t_begin, t_end);
2976 return r;
2977 }
2978};
2979
2980class __operator_left_shift_equal
2981 : public __node
2982{
2983public:
2984
2985 __operator_left_shift_equal() {}
2986 __operator_left_shift_equal(__node* op1, __node* op2)
2987 {
2988 __left_ = op1;
2989 __right_ = op2;
2990 }
2991 virtual size_t first_size() const
2992 {
2993 if (__cached_size_ == -1)
2994 {
2995 if (__left_)
2996 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
2997 else
2998 const_cast<long&>(__cached_size_) = sizeof("operator<<=") - 1;
2999 }
3000 return __cached_size_;
3001 }
3002 virtual char* first_demangled_name(char* buf) const
3003 {
3004 if (__left_)
3005 {
3006 *buf++ = '(';
3007 buf = __left_->get_demangled_name(buf);
3008 strncpy(buf, ") <<= (", 7);
3009 buf += 7;
3010 buf = __right_->get_demangled_name(buf);
3011 *buf++ = ')';
3012 }
3013 else
3014 {
3015 strncpy(buf, "operator<<=", sizeof("operator<<=") - 1);
3016 buf += sizeof("operator<<=") - 1;
3017 }
3018 return buf;
3019 }
3020 virtual ptrdiff_t print_first(char* f, char* l) const
3021 {
3022 const ptrdiff_t r = l - f;
3023 if (__left_)
3024 {
3025 const ptrdiff_t n1 = 9;
3026 if (r < n1)
3027 return n1 + __left_->print(l, l) + __right_->print(l, l);
3028 ptrdiff_t sz1 = __left_->print(f+1, l);
3029 if (r < n1 + sz1)
3030 return n1 + sz1 + __right_->print(l, l);
3031 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3032 if (r >= n1 + sz1 + sz2)
3033 {
3034 *f = '(';
3035 f += 1 + sz1;
3036 *f++ = ')';
3037 *f++ = ' ';
3038 *f++ = '<';
3039 *f++ = '<';
3040 *f++ = '=';
3041 *f++ = ' ';
3042 *f = '(';
3043 f += 1 + sz2;
3044 *f = ')';
3045 }
3046 return n1 + sz1 + sz2;
3047 }
3048 const ptrdiff_t n2 = sizeof("operator<<=") - 1;
3049 if (r >= n2)
3050 {
3051 *f++ = 'o';
3052 *f++ = 'p';
3053 *f++ = 'e';
3054 *f++ = 'r';
3055 *f++ = 'a';
3056 *f++ = 't';
3057 *f++ = 'o';
3058 *f++ = 'r';
3059 *f++ = '<';
3060 *f++ = '<';
3061 *f = '=';
3062 }
3063 return n2;
3064 }
3065 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3066 {
3067 bool r = true;
3068 if (__left_)
3069 r = r && __left_->fix_forward_references(t_begin, t_end);
3070 if (__right_)
3071 r = r && __right_->fix_forward_references(t_begin, t_end);
3072 return r;
3073 }
3074};
3075
3076class __operator_minus
3077 : public __node
3078{
3079public:
3080
3081 __operator_minus() {}
3082 __operator_minus(__node* op1, __node* op2)
3083 {
3084 __left_ = op1;
3085 __right_ = op2;
3086 }
3087 virtual size_t first_size() const
3088 {
3089 if (__cached_size_ == -1)
3090 {
3091 if (__left_)
3092 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
3093 else
3094 const_cast<long&>(__cached_size_) = sizeof("operator-") - 1;
3095 }
3096 return __cached_size_;
3097 }
3098 virtual char* first_demangled_name(char* buf) const
3099 {
3100 if (__left_)
3101 {
3102 *buf++ = '(';
3103 buf = __left_->get_demangled_name(buf);
3104 strncpy(buf, ") - (", 5);
3105 buf += 5;
3106 buf = __right_->get_demangled_name(buf);
3107 *buf++ = ')';
3108 }
3109 else
3110 {
3111 strncpy(buf, "operator-", sizeof("operator-") - 1);
3112 buf += sizeof("operator-") - 1;
3113 }
3114 return buf;
3115 }
3116 virtual ptrdiff_t print_first(char* f, char* l) const
3117 {
3118 const ptrdiff_t r = l - f;
3119 if (__left_)
3120 {
3121 const ptrdiff_t n1 = 7;
3122 if (r < n1)
3123 return n1 + __left_->print(l, l) + __right_->print(l, l);
3124 ptrdiff_t sz1 = __left_->print(f+1, l);
3125 if (r < n1 + sz1)
3126 return n1 + sz1 + __right_->print(l, l);
3127 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3128 if (r >= n1 + sz1 + sz2)
3129 {
3130 *f = '(';
3131 f += 1 + sz1;
3132 *f++ = ')';
3133 *f++ = ' ';
3134 *f++ = '-';
3135 *f++ = ' ';
3136 *f = '(';
3137 f += 1 + sz2;
3138 *f = ')';
3139 }
3140 return n1 + sz1 + sz2;
3141 }
3142 const ptrdiff_t n2 = sizeof("operator-") - 1;
3143 if (r >= n2)
3144 {
3145 *f++ = 'o';
3146 *f++ = 'p';
3147 *f++ = 'e';
3148 *f++ = 'r';
3149 *f++ = 'a';
3150 *f++ = 't';
3151 *f++ = 'o';
3152 *f++ = 'r';
3153 *f = '-';
3154 }
3155 return n2;
3156 }
3157 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3158 {
3159 bool r = true;
3160 if (__left_)
3161 r = r && __left_->fix_forward_references(t_begin, t_end);
3162 if (__right_)
3163 r = r && __right_->fix_forward_references(t_begin, t_end);
3164 return r;
3165 }
3166};
3167
3168class __operator_minus_equal
3169 : public __node
3170{
3171public:
3172
3173 __operator_minus_equal() {}
3174 __operator_minus_equal(__node* op1, __node* op2)
3175 {
3176 __left_ = op1;
3177 __right_ = op2;
3178 }
3179 virtual size_t first_size() const
3180 {
3181 if (__cached_size_ == -1)
3182 {
3183 if (__left_)
3184 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3185 else
3186 const_cast<long&>(__cached_size_) = sizeof("operator-=") - 1;
3187 }
3188 return __cached_size_;
3189 }
3190 virtual char* first_demangled_name(char* buf) const
3191 {
3192 if (__left_)
3193 {
3194 *buf++ = '(';
3195 buf = __left_->get_demangled_name(buf);
3196 strncpy(buf, ") -= (", 6);
3197 buf += 6;
3198 buf = __right_->get_demangled_name(buf);
3199 *buf++ = ')';
3200 }
3201 else
3202 {
3203 strncpy(buf, "operator-=", sizeof("operator-=") - 1);
3204 buf += sizeof("operator-=") - 1;
3205 }
3206 return buf;
3207 }
3208 virtual ptrdiff_t print_first(char* f, char* l) const
3209 {
3210 const ptrdiff_t r = l - f;
3211 if (__left_)
3212 {
3213 const ptrdiff_t n1 = 8;
3214 if (r < n1)
3215 return n1 + __left_->print(l, l) + __right_->print(l, l);
3216 ptrdiff_t sz1 = __left_->print(f+1, l);
3217 if (r < n1 + sz1)
3218 return n1 + sz1 + __right_->print(l, l);
3219 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3220 if (r >= n1 + sz1 + sz2)
3221 {
3222 *f = '(';
3223 f += 1 + sz1;
3224 *f++ = ')';
3225 *f++ = ' ';
3226 *f++ = '-';
3227 *f++ = '=';
3228 *f++ = ' ';
3229 *f = '(';
3230 f += 1 + sz2;
3231 *f = ')';
3232 }
3233 return n1 + sz1 + sz2;
3234 }
3235 const ptrdiff_t n2 = sizeof("operator-=") - 1;
3236 if (r >= n2)
3237 {
3238 *f++ = 'o';
3239 *f++ = 'p';
3240 *f++ = 'e';
3241 *f++ = 'r';
3242 *f++ = 'a';
3243 *f++ = 't';
3244 *f++ = 'o';
3245 *f++ = 'r';
3246 *f++ = '-';
3247 *f = '=';
3248 }
3249 return n2;
3250 }
3251 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3252 {
3253 bool r = true;
3254 if (__left_)
3255 r = r && __left_->fix_forward_references(t_begin, t_end);
3256 if (__right_)
3257 r = r && __right_->fix_forward_references(t_begin, t_end);
3258 return r;
3259 }
3260};
3261
3262class __operator_times
3263 : public __node
3264{
3265public:
3266
3267 __operator_times() {}
3268 __operator_times(__node* op1, __node* op2)
3269 {
3270 __left_ = op1;
3271 __right_ = op2;
3272 }
3273 virtual size_t first_size() const
3274 {
3275 if (__cached_size_ == -1)
3276 {
3277 if (__left_)
3278 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
3279 else
3280 const_cast<long&>(__cached_size_) = sizeof("operator*") - 1;
3281 }
3282 return __cached_size_;
3283 }
3284 virtual char* first_demangled_name(char* buf) const
3285 {
3286 if (__left_)
3287 {
3288 *buf++ = '(';
3289 buf = __left_->get_demangled_name(buf);
3290 strncpy(buf, ") * (", 5);
3291 buf += 5;
3292 buf = __right_->get_demangled_name(buf);
3293 *buf++ = ')';
3294 }
3295 else
3296 {
3297 strncpy(buf, "operator*", sizeof("operator*") - 1);
3298 buf += sizeof("operator*") - 1;
3299 }
3300 return buf;
3301 }
3302 virtual ptrdiff_t print_first(char* f, char* l) const
3303 {
3304 const ptrdiff_t r = l - f;
3305 if (__left_)
3306 {
3307 const ptrdiff_t n1 = 7;
3308 if (r < n1)
3309 return n1 + __left_->print(l, l) + __right_->print(l, l);
3310 ptrdiff_t sz1 = __left_->print(f+1, l);
3311 if (r < n1 + sz1)
3312 return n1 + sz1 + __right_->print(l, l);
3313 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3314 if (r >= n1 + sz1 + sz2)
3315 {
3316 *f = '(';
3317 f += 1 + sz1;
3318 *f++ = ')';
3319 *f++ = ' ';
3320 *f++ = '*';
3321 *f++ = ' ';
3322 *f = '(';
3323 f += 1 + sz2;
3324 *f = ')';
3325 }
3326 return n1 + sz1 + sz2;
3327 }
3328 const ptrdiff_t n2 = sizeof("operator*") - 1;
3329 if (r >= n2)
3330 {
3331 *f++ = 'o';
3332 *f++ = 'p';
3333 *f++ = 'e';
3334 *f++ = 'r';
3335 *f++ = 'a';
3336 *f++ = 't';
3337 *f++ = 'o';
3338 *f++ = 'r';
3339 *f = '*';
3340 }
3341 return n2;
3342 }
3343 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3344 {
3345 bool r = true;
3346 if (__left_)
3347 r = r && __left_->fix_forward_references(t_begin, t_end);
3348 if (__right_)
3349 r = r && __right_->fix_forward_references(t_begin, t_end);
3350 return r;
3351 }
3352};
3353
3354class __operator_times_equal
3355 : public __node
3356{
3357public:
3358
3359 __operator_times_equal() {}
3360 __operator_times_equal(__node* op1, __node* op2)
3361 {
3362 __left_ = op1;
3363 __right_ = op2;
3364 }
3365 virtual size_t first_size() const
3366 {
3367 if (__cached_size_ == -1)
3368 {
3369 if (__left_)
3370 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3371 else
3372 const_cast<long&>(__cached_size_) = sizeof("operator*=") - 1;
3373 }
3374 return __cached_size_;
3375 }
3376 virtual char* first_demangled_name(char* buf) const
3377 {
3378 if (__left_)
3379 {
3380 *buf++ = '(';
3381 buf = __left_->get_demangled_name(buf);
3382 strncpy(buf, ") *= (", 6);
3383 buf += 6;
3384 buf = __right_->get_demangled_name(buf);
3385 *buf++ = ')';
3386 }
3387 else
3388 {
3389 strncpy(buf, "operator*=", sizeof("operator*=") - 1);
3390 buf += sizeof("operator*=") - 1;
3391 }
3392 return buf;
3393 }
3394 virtual ptrdiff_t print_first(char* f, char* l) const
3395 {
3396 const ptrdiff_t r = l - f;
3397 if (__left_)
3398 {
3399 const ptrdiff_t n1 = 8;
3400 if (r < n1)
3401 return n1 + __left_->print(l, l) + __right_->print(l, l);
3402 ptrdiff_t sz1 = __left_->print(f+1, l);
3403 if (r < n1 + sz1)
3404 return n1 + sz1 + __right_->print(l, l);
3405 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3406 if (r >= n1 + sz1 + sz2)
3407 {
3408 *f = '(';
3409 f += 1 + sz1;
3410 *f++ = ')';
3411 *f++ = ' ';
3412 *f++ = '*';
3413 *f++ = '=';
3414 *f++ = ' ';
3415 *f = '(';
3416 f += 1 + sz2;
3417 *f = ')';
3418 }
3419 return n1 + sz1 + sz2;
3420 }
3421 const ptrdiff_t n2 = sizeof("operator*=") - 1;
3422 if (r >= n2)
3423 {
3424 *f++ = 'o';
3425 *f++ = 'p';
3426 *f++ = 'e';
3427 *f++ = 'r';
3428 *f++ = 'a';
3429 *f++ = 't';
3430 *f++ = 'o';
3431 *f++ = 'r';
3432 *f++ = '*';
3433 *f = '=';
3434 }
3435 return n2;
3436 }
3437 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3438 {
3439 bool r = true;
3440 if (__left_)
3441 r = r && __left_->fix_forward_references(t_begin, t_end);
3442 if (__right_)
3443 r = r && __right_->fix_forward_references(t_begin, t_end);
3444 return r;
3445 }
3446};
3447
3448class __operator_decrement
3449 : public __node
3450{
3451public:
3452
3453 __operator_decrement() {}
3454 explicit __operator_decrement(bool prefix, __node* op)
3455 {
3456 __size_ = prefix;
3457 __left_ = op;
3458 }
3459 virtual size_t first_size() const
3460 {
3461 if (__cached_size_ == -1)
3462 {
3463 if (__left_)
3464 const_cast<long&>(__cached_size_) = 4+__left_->size();
3465 else
3466 const_cast<long&>(__cached_size_) = sizeof("operator--") - 1;
3467 }
3468 return __cached_size_;
3469 }
3470 virtual char* first_demangled_name(char* buf) const
3471 {
3472 if (__left_)
3473 {
3474 if (__size_)
3475 {
3476 *buf++ = '-';
3477 *buf++ = '-';
3478 *buf++ = '(';
3479 }
3480 else
3481 *buf++ = '(';
3482 buf = __left_->get_demangled_name(buf);
3483 if (__size_)
3484 *buf++ = ')';
3485 else
3486 {
3487 *buf++ = ')';
3488 *buf++ = '-';
3489 *buf++ = '-';
3490 }
3491 }
3492 else
3493 {
3494 strncpy(buf, "operator--", sizeof("operator--") - 1);
3495 buf += sizeof("operator--") - 1;
3496 }
3497 return buf;
3498 }
3499 virtual ptrdiff_t print_first(char* f, char* l) const
3500 {
3501 const ptrdiff_t r = l - f;
3502 if (__left_)
3503 {
3504 const ptrdiff_t n1 = 4;
3505 if (r < n1)
3506 return n1 + __left_->print(l, l);
3507 ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l);
3508 if (r >= n1 + sz1)
3509 {
3510 if (__size_)
3511 {
3512 *f++ = '-';
3513 *f++ = '-';
3514 *f = '(';
3515 f += 1+sz1;
3516 *f = ')';
3517 }
3518 else
3519 {
3520 *f = '(';
3521 f += 1+sz1;
3522 *f++ = ')';
3523 *f++ = '-';
3524 *f = '-';
3525 }
3526 }
3527 return n1 + sz1;
3528 }
3529 const ptrdiff_t n2 = sizeof("operator--") - 1;
3530 if (r >= n2)
3531 {
3532 *f++ = 'o';
3533 *f++ = 'p';
3534 *f++ = 'e';
3535 *f++ = 'r';
3536 *f++ = 'a';
3537 *f++ = 't';
3538 *f++ = 'o';
3539 *f++ = 'r';
3540 *f++ = '-';
3541 *f = '-';
3542 }
3543 return n2;
3544 }
3545 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3546 {
3547 if (__left_)
3548 return __left_->fix_forward_references(t_begin, t_end);
3549 return true;
3550 }
3551};
3552
3553class __operator_not_equal
3554 : public __node
3555{
3556public:
3557
3558 __operator_not_equal() {}
3559 __operator_not_equal(__node* op1, __node* op2)
3560 {
3561 __left_ = op1;
3562 __right_ = op2;
3563 }
3564 virtual size_t first_size() const
3565 {
3566 if (__cached_size_ == -1)
3567 {
3568 if (__left_)
3569 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3570 else
3571 const_cast<long&>(__cached_size_) = sizeof("operator!=") - 1;
3572 }
3573 return __cached_size_;
3574 }
3575 virtual char* first_demangled_name(char* buf) const
3576 {
3577 if (__left_)
3578 {
3579 *buf++ = '(';
3580 buf = __left_->get_demangled_name(buf);
3581 strncpy(buf, ") != (", 6);
3582 buf += 6;
3583 buf = __right_->get_demangled_name(buf);
3584 *buf++ = ')';
3585 }
3586 else
3587 {
3588 strncpy(buf, "operator!=", sizeof("operator!=") - 1);
3589 buf += sizeof("operator!=") - 1;
3590 }
3591 return buf;
3592 }
3593 virtual ptrdiff_t print_first(char* f, char* l) const
3594 {
3595 const ptrdiff_t r = l - f;
3596 if (__left_)
3597 {
3598 const ptrdiff_t n1 = 8;
3599 if (r < n1)
3600 return n1 + __left_->print(l, l) + __right_->print(l, l);
3601 ptrdiff_t sz1 = __left_->print(f+1, l);
3602 if (r < n1 + sz1)
3603 return n1 + sz1 + __right_->print(l, l);
3604 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3605 if (r >= n1 + sz1 + sz2)
3606 {
3607 *f = '(';
3608 f += 1 + sz1;
3609 *f++ = ')';
3610 *f++ = ' ';
3611 *f++ = '!';
3612 *f++ = '=';
3613 *f++ = ' ';
3614 *f = '(';
3615 f += 1 + sz2;
3616 *f = ')';
3617 }
3618 return n1 + sz1 + sz2;
3619 }
3620 const ptrdiff_t n2 = sizeof("operator!=") - 1;
3621 if (r >= n2)
3622 {
3623 *f++ = 'o';
3624 *f++ = 'p';
3625 *f++ = 'e';
3626 *f++ = 'r';
3627 *f++ = 'a';
3628 *f++ = 't';
3629 *f++ = 'o';
3630 *f++ = 'r';
3631 *f++ = '!';
3632 *f = '=';
3633 }
3634 return n2;
3635 }
3636 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3637 {
3638 bool r = true;
3639 if (__left_)
3640 r = r && __left_->fix_forward_references(t_begin, t_end);
3641 if (__right_)
3642 r = r && __right_->fix_forward_references(t_begin, t_end);
3643 return r;
3644 }
3645};
3646
3647class __operator_negate
3648 : public __node
3649{
3650public:
3651
3652 __operator_negate() {}
3653 explicit __operator_negate(__node* op)
3654 {
3655 __left_ = op;
3656 }
3657 virtual size_t first_size() const
3658 {
3659 if (__cached_size_ == -1)
3660 {
3661 if (__left_)
3662 const_cast<long&>(__cached_size_) = 3+__left_->size();
3663 else
3664 const_cast<long&>(__cached_size_) = sizeof("operator-") - 1;
3665 }
3666 return __cached_size_;
3667 }
3668 virtual char* first_demangled_name(char* buf) const
3669 {
3670 if (__left_)
3671 {
3672 *buf++ = '-';
3673 *buf++ = '(';
3674 buf = __left_->get_demangled_name(buf);
3675 *buf++ = ')';
3676 }
3677 else
3678 {
3679 strncpy(buf, "operator-", sizeof("operator-") - 1);
3680 buf += sizeof("operator-") - 1;
3681 }
3682 return buf;
3683 }
3684 virtual ptrdiff_t print_first(char* f, char* l) const
3685 {
3686 const ptrdiff_t r = l - f;
3687 if (__left_)
3688 {
3689 const ptrdiff_t n1 = 3;
3690 if (r < n1)
3691 return n1 + __left_->print(l, l);
3692 ptrdiff_t sz1 = __left_->print(f+2, l);
3693 if (r >= n1 + sz1)
3694 {
3695 *f++ = '-';
3696 *f = '(';
3697 f += 1 + sz1;
3698 *f = ')';
3699 }
3700 return n1 + sz1;
3701 }
3702 const ptrdiff_t n2 = sizeof("operator-") - 1;
3703 if (r >= n2)
3704 {
3705 *f++ = 'o';
3706 *f++ = 'p';
3707 *f++ = 'e';
3708 *f++ = 'r';
3709 *f++ = 'a';
3710 *f++ = 't';
3711 *f++ = 'o';
3712 *f++ = 'r';
3713 *f = '-';
3714 }
3715 return n2;
3716 }
3717 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3718 {
3719 if (__left_)
3720 return __left_->fix_forward_references(t_begin, t_end);
3721 return true;
3722 }
3723};
3724
3725class __operator_logical_not
3726 : public __node
3727{
3728public:
3729
3730 __operator_logical_not() {}
3731 explicit __operator_logical_not(__node* op)
3732 {
3733 __left_ = op;
3734 }
3735 virtual size_t first_size() const
3736 {
3737 if (__cached_size_ == -1)
3738 {
3739 if (__left_)
3740 const_cast<long&>(__cached_size_) = 3+__left_->size();
3741 else
3742 const_cast<long&>(__cached_size_) = sizeof("operator!") - 1;
3743 }
3744 return __cached_size_;
3745 }
3746 virtual char* first_demangled_name(char* buf) const
3747 {
3748 if (__left_)
3749 {
3750 *buf++ = '!';
3751 *buf++ = '(';
3752 buf = __left_->get_demangled_name(buf);
3753 *buf++ = ')';
3754 }
3755 else
3756 {
3757 strncpy(buf, "operator!", sizeof("operator!") - 1);
3758 buf += sizeof("operator!") - 1;
3759 }
3760 return buf;
3761 }
3762 virtual ptrdiff_t print_first(char* f, char* l) const
3763 {
3764 const ptrdiff_t r = l - f;
3765 if (__left_)
3766 {
3767 const ptrdiff_t n1 = 3;
3768 if (r < n1)
3769 return n1 + __left_->print(l, l);
3770 ptrdiff_t sz1 = __left_->print(f+2, l);
3771 if (r >= n1 + sz1)
3772 {
3773 *f++ = '!';
3774 *f = '(';
3775 f += 1 + sz1;
3776 *f = ')';
3777 }
3778 return n1 + sz1;
3779 }
3780 const ptrdiff_t n2 = sizeof("operator!") - 1;
3781 if (r >= n2)
3782 {
3783 *f++ = 'o';
3784 *f++ = 'p';
3785 *f++ = 'e';
3786 *f++ = 'r';
3787 *f++ = 'a';
3788 *f++ = 't';
3789 *f++ = 'o';
3790 *f++ = 'r';
3791 *f = '!';
3792 }
3793 return n2;
3794 }
3795 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3796 {
3797 if (__left_)
3798 return __left_->fix_forward_references(t_begin, t_end);
3799 return true;
3800 }
3801};
3802
3803class __operator_logical_or
3804 : public __node
3805{
3806public:
3807
3808 __operator_logical_or() {}
3809 __operator_logical_or(__node* op1, __node* op2)
3810 {
3811 __left_ = op1;
3812 __right_ = op2;
3813 }
3814 virtual size_t first_size() const
3815 {
3816 if (__cached_size_ == -1)
3817 {
3818 if (__left_)
3819 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
3820 else
3821 const_cast<long&>(__cached_size_) = sizeof("operator||") - 1;
3822 }
3823 return __cached_size_;
3824 }
3825 virtual char* first_demangled_name(char* buf) const
3826 {
3827 if (__left_)
3828 {
3829 *buf++ = '(';
3830 buf = __left_->get_demangled_name(buf);
3831 strncpy(buf, ") || (", 6);
3832 buf += 6;
3833 buf = __right_->get_demangled_name(buf);
3834 *buf++ = ')';
3835 }
3836 else
3837 {
3838 strncpy(buf, "operator||", sizeof("operator||") - 1);
3839 buf += sizeof("operator||") - 1;
3840 }
3841 return buf;
3842 }
3843 virtual ptrdiff_t print_first(char* f, char* l) const
3844 {
3845 const ptrdiff_t r = l - f;
3846 if (__left_)
3847 {
3848 const ptrdiff_t n1 = 8;
3849 if (r < n1)
3850 return n1 + __left_->print(l, l) + __right_->print(l, l);
3851 ptrdiff_t sz1 = __left_->print(f+1, l);
3852 if (r < n1 + sz1)
3853 return n1 + sz1 + __right_->print(l, l);
3854 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3855 if (r >= n1 + sz1 + sz2)
3856 {
3857 *f = '(';
3858 f += 1 + sz1;
3859 *f++ = ')';
3860 *f++ = ' ';
3861 *f++ = '|';
3862 *f++ = '|';
3863 *f++ = ' ';
3864 *f = '(';
3865 f += 1 + sz2;
3866 *f = ')';
3867 }
3868 return n1 + sz1 + sz2;
3869 }
3870 const ptrdiff_t n2 = sizeof("operator||") - 1;
3871 if (r >= n2)
3872 {
3873 *f++ = 'o';
3874 *f++ = 'p';
3875 *f++ = 'e';
3876 *f++ = 'r';
3877 *f++ = 'a';
3878 *f++ = 't';
3879 *f++ = 'o';
3880 *f++ = 'r';
3881 *f++ = '|';
3882 *f = '|';
3883 }
3884 return n2;
3885 }
3886 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3887 {
3888 bool r = true;
3889 if (__left_)
3890 r = r && __left_->fix_forward_references(t_begin, t_end);
3891 if (__right_)
3892 r = r && __right_->fix_forward_references(t_begin, t_end);
3893 return r;
3894 }
3895};
3896
3897class __operator_bit_or
3898 : public __node
3899{
3900public:
3901
3902 __operator_bit_or() {}
3903 __operator_bit_or(__node* op1, __node* op2)
3904 {
3905 __left_ = op1;
3906 __right_ = op2;
3907 }
3908 virtual size_t first_size() const
3909 {
3910 if (__cached_size_ == -1)
3911 {
3912 if (__left_)
3913 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
3914 else
3915 const_cast<long&>(__cached_size_) = sizeof("operator|") - 1;
3916 }
3917 return __cached_size_;
3918 }
3919 virtual char* first_demangled_name(char* buf) const
3920 {
3921 if (__left_)
3922 {
3923 *buf++ = '(';
3924 buf = __left_->get_demangled_name(buf);
3925 strncpy(buf, ") | (", 5);
3926 buf += 5;
3927 buf = __right_->get_demangled_name(buf);
3928 *buf++ = ')';
3929 }
3930 else
3931 {
3932 strncpy(buf, "operator|", sizeof("operator|") - 1);
3933 buf += sizeof("operator|") - 1;
3934 }
3935 return buf;
3936 }
3937 virtual ptrdiff_t print_first(char* f, char* l) const
3938 {
3939 const ptrdiff_t r = l - f;
3940 if (__left_)
3941 {
3942 const ptrdiff_t n1 = 7;
3943 if (r < n1)
3944 return n1 + __left_->print(l, l) + __right_->print(l, l);
3945 ptrdiff_t sz1 = __left_->print(f+1, l);
3946 if (r < n1 + sz1)
3947 return n1 + sz1 + __right_->print(l, l);
3948 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
3949 if (r >= n1 + sz1 + sz2)
3950 {
3951 *f = '(';
3952 f += 1 + sz1;
3953 *f++ = ')';
3954 *f++ = ' ';
3955 *f++ = '|';
3956 *f++ = ' ';
3957 *f = '(';
3958 f += 1 + sz2;
3959 *f = ')';
3960 }
3961 return n1 + sz1 + sz2;
3962 }
3963 const ptrdiff_t n2 = sizeof("operator|") - 1;
3964 if (r >= n2)
3965 {
3966 *f++ = 'o';
3967 *f++ = 'p';
3968 *f++ = 'e';
3969 *f++ = 'r';
3970 *f++ = 'a';
3971 *f++ = 't';
3972 *f++ = 'o';
3973 *f++ = 'r';
3974 *f = '|';
3975 }
3976 return n2;
3977 }
3978 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3979 {
3980 bool r = true;
3981 if (__left_)
3982 r = r && __left_->fix_forward_references(t_begin, t_end);
3983 if (__right_)
3984 r = r && __right_->fix_forward_references(t_begin, t_end);
3985 return r;
3986 }
3987};
3988
3989class __operator_or_equal
3990 : public __node
3991{
3992public:
3993
3994 __operator_or_equal() {}
3995 __operator_or_equal(__node* op1, __node* op2)
3996 {
3997 __left_ = op1;
3998 __right_ = op2;
3999 }
4000 virtual size_t first_size() const
4001 {
4002 if (__cached_size_ == -1)
4003 {
4004 if (__left_)
4005 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4006 else
4007 const_cast<long&>(__cached_size_) = sizeof("operator|=") - 1;
4008 }
4009 return __cached_size_;
4010 }
4011 virtual char* first_demangled_name(char* buf) const
4012 {
4013 if (__left_)
4014 {
4015 *buf++ = '(';
4016 buf = __left_->get_demangled_name(buf);
4017 strncpy(buf, ") |= (", 6);
4018 buf += 6;
4019 buf = __right_->get_demangled_name(buf);
4020 *buf++ = ')';
4021 }
4022 else
4023 {
4024 strncpy(buf, "operator|=", sizeof("operator|=") - 1);
4025 buf += sizeof("operator|=") - 1;
4026 }
4027 return buf;
4028 }
4029 virtual ptrdiff_t print_first(char* f, char* l) const
4030 {
4031 const ptrdiff_t r = l - f;
4032 if (__left_)
4033 {
4034 const ptrdiff_t n1 = 8;
4035 if (r < n1)
4036 return n1 + __left_->print(l, l) + __right_->print(l, l);
4037 ptrdiff_t sz1 = __left_->print(f+1, l);
4038 if (r < n1 + sz1)
4039 return n1 + sz1 + __right_->print(l, l);
4040 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4041 if (r >= n1 + sz1 + sz2)
4042 {
4043 *f = '(';
4044 f += 1 + sz1;
4045 *f++ = ')';
4046 *f++ = ' ';
4047 *f++ = '|';
4048 *f++ = '=';
4049 *f++ = ' ';
4050 *f = '(';
4051 f += 1 + sz2;
4052 *f = ')';
4053 }
4054 return n1 + sz1 + sz2;
4055 }
4056 const ptrdiff_t n2 = sizeof("operator|=") - 1;
4057 if (r >= n2)
4058 {
4059 *f++ = 'o';
4060 *f++ = 'p';
4061 *f++ = 'e';
4062 *f++ = 'r';
4063 *f++ = 'a';
4064 *f++ = 't';
4065 *f++ = 'o';
4066 *f++ = 'r';
4067 *f++ = '|';
4068 *f = '=';
4069 }
4070 return n2;
4071 }
4072 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4073 {
4074 bool r = true;
4075 if (__left_)
4076 r = r && __left_->fix_forward_references(t_begin, t_end);
4077 if (__right_)
4078 r = r && __right_->fix_forward_references(t_begin, t_end);
4079 return r;
4080 }
4081};
4082
4083class __operator_pointer_to_member
4084 : public __node
4085{
4086public:
4087
4088 __operator_pointer_to_member() {}
4089 __operator_pointer_to_member(__node* op1, __node* op2)
4090 {
4091 __left_ = op1;
4092 __right_ = op2;
4093 }
4094 virtual size_t first_size() const
4095 {
4096 if (__cached_size_ == -1)
4097 {
4098 if (__left_)
4099 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
4100 else
4101 const_cast<long&>(__cached_size_) = sizeof("operator->*") - 1;
4102 }
4103 return __cached_size_;
4104 }
4105 virtual char* first_demangled_name(char* buf) const
4106 {
4107 if (__left_)
4108 {
4109 *buf++ = '(';
4110 buf = __left_->get_demangled_name(buf);
4111 strncpy(buf, ") ->* (", 7);
4112 buf += 7;
4113 buf = __right_->get_demangled_name(buf);
4114 *buf++ = ')';
4115 }
4116 else
4117 {
4118 strncpy(buf, "operator->*", sizeof("operator->*") - 1);
4119 buf += sizeof("operator->*") - 1;
4120 }
4121 return buf;
4122 }
4123 virtual ptrdiff_t print_first(char* f, char* l) const
4124 {
4125 const ptrdiff_t r = l - f;
4126 if (__left_)
4127 {
4128 const ptrdiff_t n1 = 9;
4129 if (r < n1)
4130 return n1 + __left_->print(l, l) + __right_->print(l, l);
4131 ptrdiff_t sz1 = __left_->print(f+1, l);
4132 if (r < n1 + sz1)
4133 return n1 + sz1 + __right_->print(l, l);
4134 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4135 if (r >= n1 + sz1 + sz2)
4136 {
4137 *f = '(';
4138 f += 1 + sz1;
4139 *f++ = ')';
4140 *f++ = ' ';
4141 *f++ = '-';
4142 *f++ = '>';
4143 *f++ = '*';
4144 *f++ = ' ';
4145 *f = '(';
4146 f += 1 + sz2;
4147 *f = ')';
4148 }
4149 return n1 + sz1 + sz2;
4150 }
4151 const ptrdiff_t n2 = sizeof("operator->*") - 1;
4152 if (r >= n2)
4153 {
4154 *f++ = 'o';
4155 *f++ = 'p';
4156 *f++ = 'e';
4157 *f++ = 'r';
4158 *f++ = 'a';
4159 *f++ = 't';
4160 *f++ = 'o';
4161 *f++ = 'r';
4162 *f++ = '-';
4163 *f++ = '>';
4164 *f = '*';
4165 }
4166 return n2;
4167 }
4168 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4169 {
4170 bool r = true;
4171 if (__left_)
4172 r = r && __left_->fix_forward_references(t_begin, t_end);
4173 if (__right_)
4174 r = r && __right_->fix_forward_references(t_begin, t_end);
4175 return r;
4176 }
4177};
4178
4179class __operator_plus
4180 : public __node
4181{
4182public:
4183
4184 __operator_plus() {}
4185 __operator_plus(__node* op1, __node* op2)
4186 {
4187 __left_ = op1;
4188 __right_ = op2;
4189 }
4190 virtual size_t first_size() const
4191 {
4192 if (__cached_size_ == -1)
4193 {
4194 if (__left_)
4195 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
4196 else
4197 const_cast<long&>(__cached_size_) = sizeof("operator+") - 1;
4198 }
4199 return __cached_size_;
4200 }
4201 virtual char* first_demangled_name(char* buf) const
4202 {
4203 if (__left_)
4204 {
4205 *buf++ = '(';
4206 buf = __left_->get_demangled_name(buf);
4207 strncpy(buf, ") + (", 5);
4208 buf += 5;
4209 buf = __right_->get_demangled_name(buf);
4210 *buf++ = ')';
4211 }
4212 else
4213 {
4214 strncpy(buf, "operator+", sizeof("operator+") - 1);
4215 buf += sizeof("operator+") - 1;
4216 }
4217 return buf;
4218 }
4219 virtual ptrdiff_t print_first(char* f, char* l) const
4220 {
4221 const ptrdiff_t r = l - f;
4222 if (__left_)
4223 {
4224 const ptrdiff_t n1 = 7;
4225 if (r < n1)
4226 return n1 + __left_->print(l, l) + __right_->print(l, l);
4227 ptrdiff_t sz1 = __left_->print(f+1, l);
4228 if (r < n1 + sz1)
4229 return n1 + sz1 + __right_->print(l, l);
4230 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4231 if (r >= n1 + sz1 + sz2)
4232 {
4233 *f = '(';
4234 f += 1 + sz1;
4235 *f++ = ')';
4236 *f++ = ' ';
4237 *f++ = '+';
4238 *f++ = ' ';
4239 *f = '(';
4240 f += 1 + sz2;
4241 *f = ')';
4242 }
4243 return n1 + sz1 + sz2;
4244 }
4245 const ptrdiff_t n2 = sizeof("operator+") - 1;
4246 if (r >= n2)
4247 {
4248 *f++ = 'o';
4249 *f++ = 'p';
4250 *f++ = 'e';
4251 *f++ = 'r';
4252 *f++ = 'a';
4253 *f++ = 't';
4254 *f++ = 'o';
4255 *f++ = 'r';
4256 *f = '+';
4257 }
4258 return n2;
4259 }
4260 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4261 {
4262 bool r = true;
4263 if (__left_)
4264 r = r && __left_->fix_forward_references(t_begin, t_end);
4265 if (__right_)
4266 r = r && __right_->fix_forward_references(t_begin, t_end);
4267 return r;
4268 }
4269};
4270
4271class __operator_plus_equal
4272 : public __node
4273{
4274public:
4275
4276 __operator_plus_equal() {}
4277 __operator_plus_equal(__node* op1, __node* op2)
4278 {
4279 __left_ = op1;
4280 __right_ = op2;
4281 }
4282 virtual size_t first_size() const
4283 {
4284 if (__cached_size_ == -1)
4285 {
4286 if (__left_)
4287 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4288 else
4289 const_cast<long&>(__cached_size_) = sizeof("operator+=") - 1;
4290 }
4291 return __cached_size_;
4292 }
4293 virtual char* first_demangled_name(char* buf) const
4294 {
4295 if (__left_)
4296 {
4297 *buf++ = '(';
4298 buf = __left_->get_demangled_name(buf);
4299 strncpy(buf, ") += (", 6);
4300 buf += 6;
4301 buf = __right_->get_demangled_name(buf);
4302 *buf++ = ')';
4303 }
4304 else
4305 {
4306 strncpy(buf, "operator+=", sizeof("operator+=") - 1);
4307 buf += sizeof("operator+=") - 1;
4308 }
4309 return buf;
4310 }
4311 virtual ptrdiff_t print_first(char* f, char* l) const
4312 {
4313 const ptrdiff_t r = l - f;
4314 if (__left_)
4315 {
4316 const ptrdiff_t n1 = 8;
4317 if (r < n1)
4318 return n1 + __left_->print(l, l) + __right_->print(l, l);
4319 ptrdiff_t sz1 = __left_->print(f+1, l);
4320 if (r < n1 + sz1)
4321 return n1 + sz1 + __right_->print(l, l);
4322 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4323 if (r >= n1 + sz1 + sz2)
4324 {
4325 *f = '(';
4326 f += 1 + sz1;
4327 *f++ = ')';
4328 *f++ = ' ';
4329 *f++ = '+';
4330 *f++ = '=';
4331 *f++ = ' ';
4332 *f = '(';
4333 f += 1 + sz2;
4334 *f = ')';
4335 }
4336 return n1 + sz1 + sz2;
4337 }
4338 const ptrdiff_t n2 = sizeof("operator+=") - 1;
4339 if (r >= n2)
4340 {
4341 *f++ = 'o';
4342 *f++ = 'p';
4343 *f++ = 'e';
4344 *f++ = 'r';
4345 *f++ = 'a';
4346 *f++ = 't';
4347 *f++ = 'o';
4348 *f++ = 'r';
4349 *f++ = '+';
4350 *f = '=';
4351 }
4352 return n2;
4353 }
4354 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4355 {
4356 bool r = true;
4357 if (__left_)
4358 r = r && __left_->fix_forward_references(t_begin, t_end);
4359 if (__right_)
4360 r = r && __right_->fix_forward_references(t_begin, t_end);
4361 return r;
4362 }
4363};
4364
4365class __operator_increment
4366 : public __node
4367{
4368public:
4369
4370 __operator_increment() {}
4371 explicit __operator_increment(bool prefix, __node* op)
4372 {
4373 __size_ = prefix;
4374 __left_ = op;
4375 }
4376 virtual size_t first_size() const
4377 {
4378 if (__cached_size_ == -1)
4379 {
4380 if (__left_)
4381 const_cast<long&>(__cached_size_) = 4+__left_->size();
4382 else
4383 const_cast<long&>(__cached_size_) = sizeof("operator++") - 1;
4384 }
4385 return __cached_size_;
4386 }
4387 virtual char* first_demangled_name(char* buf) const
4388 {
4389 if (__left_)
4390 {
4391 if (__size_)
4392 {
4393 *buf++ = '+';
4394 *buf++ = '+';
4395 *buf++ = '(';
4396 }
4397 else
4398 *buf++ = '(';
4399 buf = __left_->get_demangled_name(buf);
4400 if (__size_)
4401 *buf++ = ')';
4402 else
4403 {
4404 *buf++ = ')';
4405 *buf++ = '+';
4406 *buf++ = '+';
4407 }
4408 }
4409 else
4410 {
4411 strncpy(buf, "operator++", sizeof("operator++") - 1);
4412 buf += sizeof("operator++") - 1;
4413 }
4414 return buf;
4415 }
4416 virtual ptrdiff_t print_first(char* f, char* l) const
4417 {
4418 const ptrdiff_t r = l - f;
4419 if (__left_)
4420 {
4421 const ptrdiff_t n1 = 4;
4422 if (r < n1)
4423 return n1 + __left_->print(l, l);
4424 ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l);
4425 if (r >= n1 + sz1)
4426 {
4427 if (__size_)
4428 {
4429 *f++ = '+';
4430 *f++ = '+';
4431 *f = '(';
4432 f += 1+sz1;
4433 *f = ')';
4434 }
4435 else
4436 {
4437 *f = '(';
4438 f += 1+sz1;
4439 *f++ = ')';
4440 *f++ = '+';
4441 *f = '+';
4442 }
4443 }
4444 return n1 + sz1;
4445 }
4446 const ptrdiff_t n2 = sizeof("operator++") - 1;
4447 if (r >= n2)
4448 {
4449 *f++ = 'o';
4450 *f++ = 'p';
4451 *f++ = 'e';
4452 *f++ = 'r';
4453 *f++ = 'a';
4454 *f++ = 't';
4455 *f++ = 'o';
4456 *f++ = 'r';
4457 *f++ = '+';
4458 *f = '+';
4459 }
4460 return n2;
4461 }
4462 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4463 {
4464 if (__left_)
4465 return __left_->fix_forward_references(t_begin, t_end);
4466 return true;
4467 }
4468};
4469
4470class __operator_unary_plus
4471 : public __node
4472{
4473public:
4474
4475 __operator_unary_plus() {}
4476 explicit __operator_unary_plus(__node* op)
4477 {
4478 __left_ = op;
4479 }
4480 virtual size_t first_size() const
4481 {
4482 if (__cached_size_ == -1)
4483 {
4484 if (__left_)
4485 const_cast<long&>(__cached_size_) = 3+__left_->size();
4486 else
4487 const_cast<long&>(__cached_size_) = sizeof("operator+") - 1;
4488 }
4489 return __cached_size_;
4490 }
4491 virtual char* first_demangled_name(char* buf) const
4492 {
4493 if (__left_)
4494 {
4495 *buf++ = '+';
4496 *buf++ = '(';
4497 buf = __left_->get_demangled_name(buf);
4498 *buf++ = ')';
4499 }
4500 else
4501 {
4502 strncpy(buf, "operator+", sizeof("operator+") - 1);
4503 buf += sizeof("operator+") - 1;
4504 }
4505 return buf;
4506 }
4507 virtual ptrdiff_t print_first(char* f, char* l) const
4508 {
4509 const ptrdiff_t r = l - f;
4510 if (__left_)
4511 {
4512 const ptrdiff_t n1 = 3;
4513 if (r < n1)
4514 return n1 + __left_->print(l, l);
4515 ptrdiff_t sz1 = __left_->print(f+2, l);
4516 if (r >= n1 + sz1)
4517 {
4518 *f++ = '+';
4519 *f = '(';
4520 f += 1 + sz1;
4521 *f = ')';
4522 }
4523 return n1 + sz1;
4524 }
4525 const ptrdiff_t n2 = sizeof("operator+") - 1;
4526 if (r >= n2)
4527 {
4528 *f++ = 'o';
4529 *f++ = 'p';
4530 *f++ = 'e';
4531 *f++ = 'r';
4532 *f++ = 'a';
4533 *f++ = 't';
4534 *f++ = 'o';
4535 *f++ = 'r';
4536 *f = '+';
4537 }
4538 return n2;
4539 }
4540 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4541 {
4542 if (__left_)
4543 return __left_->fix_forward_references(t_begin, t_end);
4544 return true;
4545 }
4546};
4547
4548class __operator_arrow
4549 : public __node
4550{
4551public:
4552
4553 __operator_arrow() {}
4554 __operator_arrow(__node* op1, __node* op2)
4555 {
4556 __left_ = op1;
4557 __right_ = op2;
4558 }
4559 virtual size_t first_size() const
4560 {
4561 if (__cached_size_ == -1)
4562 {
4563 if (__left_)
4564 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4565 else
4566 const_cast<long&>(__cached_size_) = sizeof("operator->") - 1;
4567 }
4568 return __cached_size_;
4569 }
4570 virtual char* first_demangled_name(char* buf) const
4571 {
4572 if (__left_)
4573 {
4574 *buf++ = '(';
4575 buf = __left_->get_demangled_name(buf);
4576 strncpy(buf, ") -> (", 6);
4577 buf += 6;
4578 buf = __right_->get_demangled_name(buf);
4579 *buf++ = ')';
4580 }
4581 else
4582 {
4583 strncpy(buf, "operator->", sizeof("operator->") - 1);
4584 buf += sizeof("operator->") - 1;
4585 }
4586 return buf;
4587 }
4588 virtual ptrdiff_t print_first(char* f, char* l) const
4589 {
4590 const ptrdiff_t r = l - f;
4591 if (__left_)
4592 {
4593 const ptrdiff_t n1 = 8;
4594 if (r < n1)
4595 return n1 + __left_->print(l, l) + __right_->print(l, l);
4596 ptrdiff_t sz1 = __left_->print(f+1, l);
4597 if (r < n1 + sz1)
4598 return n1 + sz1 + __right_->print(l, l);
4599 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4600 if (r >= n1 + sz1 + sz2)
4601 {
4602 *f = '(';
4603 f += 1 + sz1;
4604 *f++ = ')';
4605 *f++ = ' ';
4606 *f++ = '-';
4607 *f++ = '>';
4608 *f++ = ' ';
4609 *f = '(';
4610 f += 1 + sz2;
4611 *f = ')';
4612 }
4613 return n1 + sz1 + sz2;
4614 }
4615 const ptrdiff_t n2 = sizeof("operator->") - 1;
4616 if (r >= n2)
4617 {
4618 *f++ = 'o';
4619 *f++ = 'p';
4620 *f++ = 'e';
4621 *f++ = 'r';
4622 *f++ = 'a';
4623 *f++ = 't';
4624 *f++ = 'o';
4625 *f++ = 'r';
4626 *f++ = '-';
4627 *f = '>';
4628 }
4629 return n2;
4630 }
4631 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4632 {
4633 bool r = true;
4634 if (__left_)
4635 r = r && __left_->fix_forward_references(t_begin, t_end);
4636 if (__right_)
4637 r = r && __right_->fix_forward_references(t_begin, t_end);
4638 return r;
4639 }
4640};
4641
4642class __operator_conditional
4643 : public __node
4644{
4645public:
4646
4647 __operator_conditional() {}
4648 __operator_conditional(__node* op1, __node* op2, __node* op3)
4649 {
4650 __name_ = (const char*)op1;
4651 __left_ = op2;
4652 __right_ = op3;
4653 }
4654 virtual size_t first_size() const
4655 {
4656 if (__cached_size_ == -1)
4657 {
4658 if (__left_)
4659 {
4660 __node* op1 = (__node*)__name_;
4661 const_cast<long&>(__cached_size_) = op1->size() + __left_->size() + 12 + __right_->size();
4662 }
4663 else
4664 const_cast<long&>(__cached_size_) = sizeof("operator?") - 1;
4665 }
4666 return __cached_size_;
4667 }
4668 virtual char* first_demangled_name(char* buf) const
4669 {
4670 if (__left_)
4671 {
4672 __node* op1 = (__node*)__name_;
4673 *buf++ = '(';
4674 buf = op1->get_demangled_name(buf);
4675 strncpy(buf, ") ? (", 5);
4676 buf += 5;
4677 buf = __left_->get_demangled_name(buf);
4678 strncpy(buf, ") : (", 5);
4679 buf += 5;
4680 buf = __right_->get_demangled_name(buf);
4681 *buf++ = ')';
4682 }
4683 else
4684 {
4685 strncpy(buf, "operator?", sizeof("operator?") - 1);
4686 buf += sizeof("operator?") - 1;
4687 }
4688 return buf;
4689 }
4690 virtual ptrdiff_t print_first(char* f, char* l) const
4691 {
4692 const ptrdiff_t r = l - f;
4693 if (__left_)
4694 {
4695 const ptrdiff_t n1 = 12;
4696 __node* op1 = (__node*)__name_;
4697 if (r < n1)
4698 return n1 + op1->print(l, l) + __left_->print(l, l) +
4699 __right_->print(l, l);
4700 ptrdiff_t sz1 = op1->print(f+1, l);
4701 if (r < n1 + sz1)
4702 return n1 + sz1 + __left_->print(l, l) + __right_->print(l, l);
4703 ptrdiff_t sz2 = __left_->print(f+6+sz1, l);
4704 if (r < n1 + sz1 + sz2)
4705 return n1 + sz1 + sz2 + __right_->print(l, l);
4706 ptrdiff_t sz3 = __right_->print(f+11+sz1+sz2, l);
4707 if (r >= n1 + sz1 + sz2 + sz3)
4708 {
4709 *f = '(';
4710 f += 1 + sz1;
4711 *f++ = ')';
4712 *f++ = ' ';
4713 *f++ = '?';
4714 *f++ = ' ';
4715 *f = '(';
4716 f += 1 + sz2;
4717 *f++ = ')';
4718 *f++ = ' ';
4719 *f++ = ':';
4720 *f++ = ' ';
4721 *f = '(';
4722 f += 1 + sz3;
4723 *f = ')';
4724 }
4725 return n1 + sz1 + sz2 + sz3;
4726 }
4727 const ptrdiff_t n2 = sizeof("operator?") - 1;
4728 if (r >= n2)
4729 {
4730 *f++ = 'o';
4731 *f++ = 'p';
4732 *f++ = 'e';
4733 *f++ = 'r';
4734 *f++ = 'a';
4735 *f++ = 't';
4736 *f++ = 'o';
4737 *f++ = 'r';
4738 *f = '?';
4739 }
4740 return n2;
4741 }
4742 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4743 {
4744 bool r = true;
4745 if (__name_)
4746 r = r && ((__node*)__name_)->fix_forward_references(t_begin, t_end);
4747 if (__left_)
4748 r = r && __left_->fix_forward_references(t_begin, t_end);
4749 if (__right_)
4750 r = r && __right_->fix_forward_references(t_begin, t_end);
4751 return r;
4752 }
4753};
4754
4755class __operator_mod
4756 : public __node
4757{
4758public:
4759
4760 __operator_mod() {}
4761 __operator_mod(__node* op1, __node* op2)
4762 {
4763 __left_ = op1;
4764 __right_ = op2;
4765 }
4766 virtual size_t first_size() const
4767 {
4768 if (__cached_size_ == -1)
4769 {
4770 if (__left_)
4771 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size();
4772 else
4773 const_cast<long&>(__cached_size_) = sizeof("operator%") - 1;
4774 }
4775 return __cached_size_;
4776 }
4777 virtual char* first_demangled_name(char* buf) const
4778 {
4779 if (__left_)
4780 {
4781 *buf++ = '(';
4782 buf = __left_->get_demangled_name(buf);
4783 strncpy(buf, ") % (", 5);
4784 buf += 5;
4785 buf = __right_->get_demangled_name(buf);
4786 *buf++ = ')';
4787 }
4788 else
4789 {
4790 strncpy(buf, "operator%", sizeof("operator%") - 1);
4791 buf += sizeof("operator%") - 1;
4792 }
4793 return buf;
4794 }
4795 virtual ptrdiff_t print_first(char* f, char* l) const
4796 {
4797 const ptrdiff_t r = l - f;
4798 if (__left_)
4799 {
4800 const ptrdiff_t n1 = 7;
4801 if (r < n1)
4802 return n1 + __left_->print(l, l) + __right_->print(l, l);
4803 ptrdiff_t sz1 = __left_->print(f+1, l);
4804 if (r < n1 + sz1)
4805 return n1 + sz1 + __right_->print(l, l);
4806 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4807 if (r >= n1 + sz1 + sz2)
4808 {
4809 *f = '(';
4810 f += 1 + sz1;
4811 *f++ = ')';
4812 *f++ = ' ';
4813 *f++ = '%';
4814 *f++ = ' ';
4815 *f = '(';
4816 f += 1 + sz2;
4817 *f = ')';
4818 }
4819 return n1 + sz1 + sz2;
4820 }
4821 const ptrdiff_t n2 = sizeof("operator%") - 1;
4822 if (r >= n2)
4823 {
4824 *f++ = 'o';
4825 *f++ = 'p';
4826 *f++ = 'e';
4827 *f++ = 'r';
4828 *f++ = 'a';
4829 *f++ = 't';
4830 *f++ = 'o';
4831 *f++ = 'r';
4832 *f = '%';
4833 }
4834 return n2;
4835 }
4836 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4837 {
4838 bool r = true;
4839 if (__left_)
4840 r = r && __left_->fix_forward_references(t_begin, t_end);
4841 if (__right_)
4842 r = r && __right_->fix_forward_references(t_begin, t_end);
4843 return r;
4844 }
4845};
4846
4847class __operator_mod_equal
4848 : public __node
4849{
4850public:
4851
4852 __operator_mod_equal() {}
4853 __operator_mod_equal(__node* op1, __node* op2)
4854 {
4855 __left_ = op1;
4856 __right_ = op2;
4857 }
4858 virtual size_t first_size() const
4859 {
4860 if (__cached_size_ == -1)
4861 {
4862 if (__left_)
4863 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4864 else
4865 const_cast<long&>(__cached_size_) = sizeof("operator%=") - 1;
4866 }
4867 return __cached_size_;
4868 }
4869 virtual char* first_demangled_name(char* buf) const
4870 {
4871 if (__left_)
4872 {
4873 *buf++ = '(';
4874 buf = __left_->get_demangled_name(buf);
4875 strncpy(buf, ") %= (", 6);
4876 buf += 6;
4877 buf = __right_->get_demangled_name(buf);
4878 *buf++ = ')';
4879 }
4880 else
4881 {
4882 strncpy(buf, "operator%=", sizeof("operator%=") - 1);
4883 buf += sizeof("operator%=") - 1;
4884 }
4885 return buf;
4886 }
4887 virtual ptrdiff_t print_first(char* f, char* l) const
4888 {
4889 const ptrdiff_t r = l - f;
4890 if (__left_)
4891 {
4892 const ptrdiff_t n1 = 8;
4893 if (r < n1)
4894 return n1 + __left_->print(l, l) + __right_->print(l, l);
4895 ptrdiff_t sz1 = __left_->print(f+1, l);
4896 if (r < n1 + sz1)
4897 return n1 + sz1 + __right_->print(l, l);
4898 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4899 if (r >= n1 + sz1 + sz2)
4900 {
4901 *f = '(';
4902 f += 1 + sz1;
4903 *f++ = ')';
4904 *f++ = ' ';
4905 *f++ = '%';
4906 *f++ = '=';
4907 *f++ = ' ';
4908 *f = '(';
4909 f += 1 + sz2;
4910 *f = ')';
4911 }
4912 return n1 + sz1 + sz2;
4913 }
4914 const ptrdiff_t n2 = sizeof("operator%=") - 1;
4915 if (r >= n2)
4916 {
4917 *f++ = 'o';
4918 *f++ = 'p';
4919 *f++ = 'e';
4920 *f++ = 'r';
4921 *f++ = 'a';
4922 *f++ = 't';
4923 *f++ = 'o';
4924 *f++ = 'r';
4925 *f++ = '%';
4926 *f = '=';
4927 }
4928 return n2;
4929 }
4930 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4931 {
4932 bool r = true;
4933 if (__left_)
4934 r = r && __left_->fix_forward_references(t_begin, t_end);
4935 if (__right_)
4936 r = r && __right_->fix_forward_references(t_begin, t_end);
4937 return r;
4938 }
4939};
4940
4941class __operator_right_shift
4942 : public __node
4943{
4944public:
4945
4946 __operator_right_shift() {}
4947 __operator_right_shift(__node* op1, __node* op2)
4948 {
4949 __left_ = op1;
4950 __right_ = op2;
4951 }
4952 virtual size_t first_size() const
4953 {
4954 if (__cached_size_ == -1)
4955 {
4956 if (__left_)
4957 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size();
4958 else
4959 const_cast<long&>(__cached_size_) = sizeof("operator>>") - 1;
4960 }
4961 return __cached_size_;
4962 }
4963 virtual char* first_demangled_name(char* buf) const
4964 {
4965 if (__left_)
4966 {
4967 *buf++ = '(';
4968 buf = __left_->get_demangled_name(buf);
4969 strncpy(buf, ") >> (", 6);
4970 buf += 6;
4971 buf = __right_->get_demangled_name(buf);
4972 *buf++ = ')';
4973 }
4974 else
4975 {
4976 strncpy(buf, "operator>>", sizeof("operator>>") - 1);
4977 buf += sizeof("operator>>") - 1;
4978 }
4979 return buf;
4980 }
4981 virtual ptrdiff_t print_first(char* f, char* l) const
4982 {
4983 const ptrdiff_t r = l - f;
4984 if (__left_)
4985 {
4986 const ptrdiff_t n1 = 8;
4987 if (r < n1)
4988 return n1 + __left_->print(l, l) + __right_->print(l, l);
4989 ptrdiff_t sz1 = __left_->print(f+1, l);
4990 if (r < n1 + sz1)
4991 return n1 + sz1 + __right_->print(l, l);
4992 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
4993 if (r >= n1 + sz1 + sz2)
4994 {
4995 *f = '(';
4996 f += 1 + sz1;
4997 *f++ = ')';
4998 *f++ = ' ';
4999 *f++ = '>';
5000 *f++ = '>';
5001 *f++ = ' ';
5002 *f = '(';
5003 f += 1 + sz2;
5004 *f = ')';
5005 }
5006 return n1 + sz1 + sz2;
5007 }
5008 const ptrdiff_t n2 = sizeof("operator>>") - 1;
5009 if (r >= n2)
5010 {
5011 *f++ = 'o';
5012 *f++ = 'p';
5013 *f++ = 'e';
5014 *f++ = 'r';
5015 *f++ = 'a';
5016 *f++ = 't';
5017 *f++ = 'o';
5018 *f++ = 'r';
5019 *f++ = '>';
5020 *f = '>';
5021 }
5022 return n2;
5023 }
5024 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5025 {
5026 bool r = true;
5027 if (__left_)
5028 r = r && __left_->fix_forward_references(t_begin, t_end);
5029 if (__right_)
5030 r = r && __right_->fix_forward_references(t_begin, t_end);
5031 return r;
5032 }
5033};
5034
5035class __operator_right_shift_equal
5036 : public __node
5037{
5038public:
5039
5040 __operator_right_shift_equal() {}
5041 __operator_right_shift_equal(__node* op1, __node* op2)
5042 {
5043 __left_ = op1;
5044 __right_ = op2;
5045 }
5046 virtual size_t first_size() const
5047 {
5048 if (__cached_size_ == -1)
5049 {
5050 if (__left_)
5051 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size();
5052 else
5053 const_cast<long&>(__cached_size_) = sizeof("operator>>=") - 1;
5054 }
5055 return __cached_size_;
5056 }
5057 virtual char* first_demangled_name(char* buf) const
5058 {
5059 if (__left_)
5060 {
5061 *buf++ = '(';
5062 buf = __left_->get_demangled_name(buf);
5063 strncpy(buf, ") >>= (", 7);
5064 buf += 7;
5065 buf = __right_->get_demangled_name(buf);
5066 *buf++ = ')';
5067 }
5068 else
5069 {
5070 strncpy(buf, "operator>>=", sizeof("operator>>=") - 1);
5071 buf += sizeof("operator>>=") - 1;
5072 }
5073 return buf;
5074 }
5075 virtual ptrdiff_t print_first(char* f, char* l) const
5076 {
5077 const ptrdiff_t r = l - f;
5078 if (__left_)
5079 {
5080 const ptrdiff_t n1 = 9;
5081 if (r < n1)
5082 return n1 + __left_->print(l, l) + __right_->print(l, l);
5083 ptrdiff_t sz1 = __left_->print(f+1, l);
5084 if (r < n1 + sz1)
5085 return n1 + sz1 + __right_->print(l, l);
5086 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l);
5087 if (r >= n1 + sz1 + sz2)
5088 {
5089 *f = '(';
5090 f += 1 + sz1;
5091 *f++ = ')';
5092 *f++ = ' ';
5093 *f++ = '>';
5094 *f++ = '>';
5095 *f++ = '=';
5096 *f++ = ' ';
5097 *f = '(';
5098 f += 1 + sz2;
5099 *f = ')';
5100 }
5101 return n1 + sz1 + sz2;
5102 }
5103 const ptrdiff_t n2 = sizeof("operator>>=") - 1;
5104 if (r >= n2)
5105 {
5106 *f++ = 'o';
5107 *f++ = 'p';
5108 *f++ = 'e';
5109 *f++ = 'r';
5110 *f++ = 'a';
5111 *f++ = 't';
5112 *f++ = 'o';
5113 *f++ = 'r';
5114 *f++ = '>';
5115 *f++ = '>';
5116 *f = '=';
5117 }
5118 return n2;
5119 }
5120 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5121 {
5122 bool r = true;
5123 if (__left_)
5124 r = r && __left_->fix_forward_references(t_begin, t_end);
5125 if (__right_)
5126 r = r && __right_->fix_forward_references(t_begin, t_end);
5127 return r;
5128 }
5129};
5130
5131class __operator_sizeof_type
5132 : public __node
5133{
5134public:
5135
5136 __operator_sizeof_type() {}
5137 __operator_sizeof_type(__node* op)
5138 {
5139 __right_ = op;
5140 }
5141 virtual size_t first_size() const
5142 {
5143 if (__cached_size_ == -1)
5144 {
5145 if (__right_)
5146 const_cast<long&>(__cached_size_) = __right_->size() + 9;
5147 else
5148 const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1;
5149 }
5150 return __cached_size_;
5151 }
5152 virtual char* first_demangled_name(char* buf) const
5153 {
5154 if (__right_)
5155 {
5156 strncpy(buf, "sizeof (", 8);
5157 buf += 8;
5158 buf = __right_->get_demangled_name(buf);
5159 *buf++ = ')';
5160 }
5161 else
5162 {
5163 strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1);
5164 buf += sizeof("operator sizeof") - 1;
5165 }
5166 return buf;
5167 }
5168 virtual ptrdiff_t print_first(char* f, char* l) const
5169 {
5170 const ptrdiff_t r = l - f;
5171 if (__right_)
5172 {
5173 const ptrdiff_t n1 = sizeof("sizeof ()") - 1;
5174 if (r < n1)
5175 return n1 + __right_->print(l, l);
5176 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5177 if (r >= n1 + sz1)
5178 {
5179 *f++ = 's';
5180 *f++ = 'i';
5181 *f++ = 'z';
5182 *f++ = 'e';
5183 *f++ = 'o';
5184 *f++ = 'f';
5185 *f++ = ' ';
5186 *f = '(';
5187 f += 1 + sz1;
5188 *f = ')';
5189 }
5190 return n1 + sz1;
5191 }
5192 const ptrdiff_t n2 = sizeof("operator sizeof") - 1;
5193 if (r >= n2)
5194 {
5195 *f++ = 'o';
5196 *f++ = 'p';
5197 *f++ = 'e';
5198 *f++ = 'r';
5199 *f++ = 'a';
5200 *f++ = 't';
5201 *f++ = 'o';
5202 *f++ = 'r';
5203 *f++ = ' ';
5204 *f++ = 's';
5205 *f++ = 'i';
5206 *f++ = 'z';
5207 *f++ = 'e';
5208 *f++ = 'o';
5209 *f = 'f';
5210 }
5211 return n2;
5212 }
5213 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5214 {
5215 if (__right_)
5216 return __right_->fix_forward_references(t_begin, t_end);
5217 return true;
5218 }
5219};
5220
5221class __operator_sizeof_expression
5222 : public __node
5223{
5224public:
5225
5226 __operator_sizeof_expression() {}
5227 __operator_sizeof_expression(__node* op)
5228 {
5229 __right_ = op;
5230 }
5231 virtual size_t first_size() const
5232 {
5233 if (__cached_size_ == -1)
5234 {
5235 if (__right_)
5236 const_cast<long&>(__cached_size_) = __right_->size() + 9;
5237 else
5238 const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1;
5239 }
5240 return __cached_size_;
5241 }
5242 virtual char* first_demangled_name(char* buf) const
5243 {
5244 if (__right_)
5245 {
5246 strncpy(buf, "sizeof (", 8);
5247 buf += 8;
5248 buf = __right_->get_demangled_name(buf);
5249 *buf++ = ')';
5250 }
5251 else
5252 {
5253 strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1);
5254 buf += sizeof("operator sizeof") - 1;
5255 }
5256 return buf;
5257 }
5258 virtual ptrdiff_t print_first(char* f, char* l) const
5259 {
5260 const ptrdiff_t r = l - f;
5261 if (__right_)
5262 {
5263 const ptrdiff_t n1 = sizeof("sizeof ()") - 1;
5264 if (r < n1)
5265 return n1 + __right_->print(l, l);
5266 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5267 if (r >= n1 + sz1)
5268 {
5269 *f++ = 's';
5270 *f++ = 'i';
5271 *f++ = 'z';
5272 *f++ = 'e';
5273 *f++ = 'o';
5274 *f++ = 'f';
5275 *f++ = ' ';
5276 *f = '(';
5277 f += 1 + sz1;
5278 *f = ')';
5279 }
5280 return n1 + sz1;
5281 }
5282 const ptrdiff_t n2 = sizeof("operator sizeof") - 1;
5283 if (r >= n2)
5284 {
5285 *f++ = 'o';
5286 *f++ = 'p';
5287 *f++ = 'e';
5288 *f++ = 'r';
5289 *f++ = 'a';
5290 *f++ = 't';
5291 *f++ = 'o';
5292 *f++ = 'r';
5293 *f++ = ' ';
5294 *f++ = 's';
5295 *f++ = 'i';
5296 *f++ = 'z';
5297 *f++ = 'e';
5298 *f++ = 'o';
5299 *f = 'f';
5300 }
5301 return n2;
5302 }
5303 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5304 {
5305 if (__right_)
5306 return __right_->fix_forward_references(t_begin, t_end);
5307 return true;
5308 }
5309};
5310
5311class __typeid
5312 : public __node
5313{
5314public:
5315
5316 __typeid(__node* op)
5317 {
5318 __right_ = op;
5319 }
5320 virtual size_t first_size() const
5321 {
5322 if (__cached_size_ == -1)
5323 const_cast<long&>(__cached_size_) = __right_->size() + 8;
5324 return __cached_size_;
5325 }
5326 virtual char* first_demangled_name(char* buf) const
5327 {
5328 strncpy(buf, "typeid(", 7);
5329 buf += 7;
5330 buf = __right_->get_demangled_name(buf);
5331 *buf++ = ')';
5332 return buf;
5333 }
5334 virtual ptrdiff_t print_first(char* f, char* l) const
5335 {
5336 const ptrdiff_t r = l - f;
5337 const ptrdiff_t n1 = sizeof("typeid()") - 1;
5338 if (r < n1)
5339 return n1 + __right_->print(l, l);
5340 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5341 if (r >= n1 + sz1)
5342 {
5343 *f++ = 't';
5344 *f++ = 'y';
5345 *f++ = 'p';
5346 *f++ = 'e';
5347 *f++ = 'i';
5348 *f++ = 'd';
5349 *f = '(';
5350 f += 1 + sz1;
5351 *f = ')';
5352 }
5353 return n1 + sz1;
5354 }
5355 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5356 {
5357 return __right_->fix_forward_references(t_begin, t_end);
5358 }
5359};
5360
5361class __throw
5362 : public __node
5363{
5364public:
5365
5366 __throw(__node* op)
5367 {
5368 __right_ = op;
5369 }
5370 virtual size_t first_size() const
5371 {
5372 if (__cached_size_ == -1)
5373 const_cast<long&>(__cached_size_) = __right_->size() + 6;
5374 return __cached_size_;
5375 }
5376 virtual char* first_demangled_name(char* buf) const
5377 {
5378 strncpy(buf, "throw ", 6);
5379 return __right_->get_demangled_name(buf+6);
5380 }
5381 virtual ptrdiff_t print_first(char* f, char* l) const
5382 {
5383 const ptrdiff_t r = l - f;
5384 const ptrdiff_t n1 = sizeof("throw ") - 1;
5385 if (r < n1)
5386 return n1 + __right_->print(l, l);
5387 ptrdiff_t sz1 = __right_->print(f+n1, l);
5388 if (r >= n1 + sz1)
5389 {
5390 *f++ = 't';
5391 *f++ = 'h';
5392 *f++ = 'r';
5393 *f++ = 'o';
5394 *f++ = 'w';
5395 *f = ' ';
5396 }
5397 return n1 + sz1;
5398 }
5399 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5400 {
5401 return __right_->fix_forward_references(t_begin, t_end);
5402 }
5403};
5404
5405class __rethrow
5406 : public __node
5407{
5408 static const ptrdiff_t n = sizeof("throw") - 1;
5409public:
5410
5411 virtual size_t first_size() const {return n;}
5412 virtual char* first_demangled_name(char* buf) const
5413 {
5414 strncpy(buf, "throw", n);
5415 return buf+n;
5416 }
5417 virtual ptrdiff_t print_first(char* f, char* l) const
5418 {
5419 const ptrdiff_t r = l - f;
5420 if (r >= n)
5421 {
5422 *f++ = 't';
5423 *f++ = 'h';
5424 *f++ = 'r';
5425 *f++ = 'o';
5426 *f = 'w';
5427 }
5428 return n;
5429 }
5430};
5431
5432class __operator_sizeof_param_pack
5433 : public __node
5434{
5435public:
5436
5437 __operator_sizeof_param_pack(__node* op)
5438 {
5439 __right_ = op;
5440 }
5441 virtual size_t first_size() const
5442 {
5443 if (__cached_size_ == -1)
5444 const_cast<long&>(__cached_size_) = __right_->size() + 11;
5445 return __cached_size_;
5446 }
5447 virtual char* first_demangled_name(char* buf) const
5448 {
5449 strncpy(buf, "sizeof...(", 10);
5450 buf += 10;
5451 buf = __right_->get_demangled_name(buf);
5452 *buf++ = ')';
5453 return buf;
5454 }
5455 virtual ptrdiff_t print_first(char* f, char* l) const
5456 {
5457 const ptrdiff_t r = l - f;
5458 const ptrdiff_t n1 = sizeof("sizeof...()") - 1;
5459 if (r < n1)
5460 return n1 + __right_->print(l, l);
5461 ptrdiff_t sz1 = __right_->print(f+(n1-1), l);
5462 if (r >= n1 + sz1)
5463 {
5464 *f++ = 's';
5465 *f++ = 'i';
5466 *f++ = 'z';
5467 *f++ = 'e';
5468 *f++ = 'o';
5469 *f++ = 'f';
5470 *f++ = '.';
5471 *f++ = '.';
5472 *f++ = '.';
5473 *f = '(';
5474 f += 1+sz1;
5475 *f = ')';
5476 }
5477 return n1 + sz1;
5478 }
5479 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5480 {
5481 return __right_->fix_forward_references(t_begin, t_end);
5482 }
5483};
5484
5485class __const_cast
5486 : public __node
5487{
5488public:
5489
5490 __const_cast(__node* op1, __node* op2)
5491 {
5492 __left_ = op1;
5493 __right_ = op2;
5494 }
5495 virtual size_t first_size() const
5496 {
5497 if (__cached_size_ == -1)
5498 const_cast<long&>(__cached_size_) = __left_->size() + 14 + __right_->size();
5499 return __cached_size_;
5500 }
5501 virtual char* first_demangled_name(char* buf) const
5502 {
5503 strncpy(buf, "const_cast<", 11);
5504 buf += 11;
5505 buf = __left_->get_demangled_name(buf);
5506 *buf++ = '>';
5507 *buf++ = '(';
5508 buf = __right_->get_demangled_name(buf);
5509 *buf++ = ')';
5510 return buf;
5511 }
5512 virtual ptrdiff_t print_first(char* f, char* l) const
5513 {
5514 const ptrdiff_t r = l - f;
5515 const ptrdiff_t n1 = sizeof("const_cast<>()") - 1;
5516 if (r < n1)
5517 return n1 + __left_->print(l, l) + __right_->print(l, l);
5518 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5519 if (r < n1 + sz1)
5520 return n1 + sz1 + __right_->print(l, l);
5521 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5522 if (r >= n1 + sz1 + sz2)
5523 {
5524 *f++ = 'c';
5525 *f++ = 'o';
5526 *f++ = 'n';
5527 *f++ = 's';
5528 *f++ = 't';
5529 *f++ = '_';
5530 *f++ = 'c';
5531 *f++ = 'a';
5532 *f++ = 's';
5533 *f++ = 't';
5534 *f = '<';
5535 f += 1+sz1;
5536 *f++ = '>';
5537 *f = '(';
5538 f += 1+sz2;
5539 *f = ')';
5540 }
5541 return n1 + sz1 + sz2;
5542 }
5543 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5544 {
5545 return __left_->fix_forward_references(t_begin, t_end) &&
5546 __right_->fix_forward_references(t_begin, t_end);
5547 }
5548};
5549
5550class __dynamic_cast
5551 : public __node
5552{
5553public:
5554
5555 __dynamic_cast(__node* op1, __node* op2)
5556 {
5557 __left_ = op1;
5558 __right_ = op2;
5559 }
5560 virtual size_t first_size() const
5561 {
5562 if (__cached_size_ == -1)
5563 const_cast<long&>(__cached_size_) = __left_->size() + 16 + __right_->size();
5564 return __cached_size_;
5565 }
5566 virtual char* first_demangled_name(char* buf) const
5567 {
5568 strncpy(buf, "dynamic_cast<", 13);
5569 buf += 13;
5570 buf = __left_->get_demangled_name(buf);
5571 *buf++ = '>';
5572 *buf++ = '(';
5573 buf = __right_->get_demangled_name(buf);
5574 *buf++ = ')';
5575 return buf;
5576 }
5577 virtual ptrdiff_t print_first(char* f, char* l) const
5578 {
5579 const ptrdiff_t r = l - f;
5580 const ptrdiff_t n1 = sizeof("dynamic_cast<>()") - 1;
5581 if (r < n1)
5582 return n1 + __left_->print(l, l) + __right_->print(l, l);
5583 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5584 if (r < n1 + sz1)
5585 return n1 + sz1 + __right_->print(l, l);
5586 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5587 if (r >= n1 + sz1 + sz2)
5588 {
5589 *f++ = 'd';
5590 *f++ = 'y';
5591 *f++ = 'n';
5592 *f++ = 'a';
5593 *f++ = 'm';
5594 *f++ = 'i';
5595 *f++ = 'c';
5596 *f++ = '_';
5597 *f++ = 'c';
5598 *f++ = 'a';
5599 *f++ = 's';
5600 *f++ = 't';
5601 *f = '<';
5602 f += 1+sz1;
5603 *f++ = '>';
5604 *f = '(';
5605 f += 1+sz2;
5606 *f = ')';
5607 }
5608 return n1 + sz1 + sz2;
5609 }
5610 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5611 {
5612 return __left_->fix_forward_references(t_begin, t_end) &&
5613 __right_->fix_forward_references(t_begin, t_end);
5614 }
5615};
5616
5617class __reinterpret_cast
5618 : public __node
5619{
5620public:
5621
5622 __reinterpret_cast(__node* op1, __node* op2)
5623 {
5624 __left_ = op1;
5625 __right_ = op2;
5626 }
5627 virtual size_t first_size() const
5628 {
5629 if (__cached_size_ == -1)
5630 const_cast<long&>(__cached_size_) = __left_->size() + 20 + __right_->size();
5631 return __cached_size_;
5632 }
5633 virtual char* first_demangled_name(char* buf) const
5634 {
5635 strncpy(buf, "reinterpret_cast<", 17);
5636 buf += 17;
5637 buf = __left_->get_demangled_name(buf);
5638 *buf++ = '>';
5639 *buf++ = '(';
5640 buf = __right_->get_demangled_name(buf);
5641 *buf++ = ')';
5642 return buf;
5643 }
5644 virtual ptrdiff_t print_first(char* f, char* l) const
5645 {
5646 const ptrdiff_t r = l - f;
5647 const ptrdiff_t n1 = sizeof("reinterpret_cast<>()") - 1;
5648 if (r < n1)
5649 return n1 + __left_->print(l, l) + __right_->print(l, l);
5650 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5651 if (r < n1 + sz1)
5652 return n1 + sz1 + __right_->print(l, l);
5653 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5654 if (r >= n1 + sz1 + sz2)
5655 {
5656 *f++ = 'r';
5657 *f++ = 'e';
5658 *f++ = 'i';
5659 *f++ = 'n';
5660 *f++ = 't';
5661 *f++ = 'e';
5662 *f++ = 'r';
5663 *f++ = 'p';
5664 *f++ = 'r';
5665 *f++ = 'e';
5666 *f++ = 't';
5667 *f++ = '_';
5668 *f++ = 'c';
5669 *f++ = 'a';
5670 *f++ = 's';
5671 *f++ = 't';
5672 *f = '<';
5673 f += 1+sz1;
5674 *f++ = '>';
5675 *f = '(';
5676 f += 1+sz2;
5677 *f = ')';
5678 }
5679 return n1 + sz1 + sz2;
5680 }
5681 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5682 {
5683 return __left_->fix_forward_references(t_begin, t_end) &&
5684 __right_->fix_forward_references(t_begin, t_end);
5685 }
5686};
5687
5688class __static_cast
5689 : public __node
5690{
5691public:
5692
5693 __static_cast(__node* op1, __node* op2)
5694 {
5695 __left_ = op1;
5696 __right_ = op2;
5697 }
5698 virtual size_t first_size() const
5699 {
5700 if (__cached_size_ == -1)
5701 const_cast<long&>(__cached_size_) = __left_->size() + 15 + __right_->size();
5702 return __cached_size_;
5703 }
5704 virtual char* first_demangled_name(char* buf) const
5705 {
5706 strncpy(buf, "static_cast<", 12);
5707 buf += 12;
5708 buf = __left_->get_demangled_name(buf);
5709 *buf++ = '>';
5710 *buf++ = '(';
5711 buf = __right_->get_demangled_name(buf);
5712 *buf++ = ')';
5713 return buf;
5714 }
5715 virtual ptrdiff_t print_first(char* f, char* l) const
5716 {
5717 const ptrdiff_t r = l - f;
5718 const ptrdiff_t n1 = sizeof("static_cast<>()") - 1;
5719 if (r < n1)
5720 return n1 + __left_->print(l, l) + __right_->print(l, l);
5721 ptrdiff_t sz1 = __left_->print(f+(n1-3), l);
5722 if (r < n1 + sz1)
5723 return n1 + sz1 + __right_->print(l, l);
5724 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l);
5725 if (r >= n1 + sz1 + sz2)
5726 {
5727 *f++ = 's';
5728 *f++ = 't';
5729 *f++ = 'a';
5730 *f++ = 't';
5731 *f++ = 'i';
5732 *f++ = 'c';
5733 *f++ = '_';
5734 *f++ = 'c';
5735 *f++ = 'a';
5736 *f++ = 's';
5737 *f++ = 't';
5738 *f = '<';
5739 f += 1+sz1;
5740 *f++ = '>';
5741 *f = '(';
5742 f += 1+sz2;
5743 *f = ')';
5744 }
5745 return n1 + sz1 + sz2;
5746 }
5747 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5748 {
5749 return __left_->fix_forward_references(t_begin, t_end) &&
5750 __right_->fix_forward_references(t_begin, t_end);
5751 }
5752};
5753
5754class __call_expr
5755 : public __node
5756{
5757public:
5758
5759 __call_expr(__node* op1, __node* op2)
5760 {
5761 __left_ = op1;
5762 __right_ = op2;
5763 }
5764 virtual size_t first_size() const
5765 {
5766 if (__cached_size_ == -1)
5767 {
5768 size_t off = __left_->size() + 2;
5769 if (__right_)
5770 off += __right_->size();
5771 const_cast<long&>(__cached_size_) = off;
5772 }
5773 return __cached_size_;
5774 }
5775 virtual char* first_demangled_name(char* buf) const
5776 {
5777 buf = __left_->get_demangled_name(buf);
5778 *buf++ = '(';
5779 if (__right_)
5780 buf = __right_->get_demangled_name(buf);
5781 *buf++ = ')';
5782 return buf;
5783 }
5784 virtual ptrdiff_t print_first(char* f, char* l) const
5785 {
5786 const ptrdiff_t r = l - f;
5787 const ptrdiff_t n1 = sizeof("()") - 1;
5788 if (r < n1)
5789 return n1 + __left_->print(l, l) + (__right_ ? __right_->print(l, l) : 0);
5790 ptrdiff_t sz1 = __left_->print(f, l);
5791 if (r < n1 + sz1)
5792 return n1 + sz1 + (__right_ ? __right_->print(l, l) : 0);
5793 ptrdiff_t sz2 = __right_ ? __right_->print(f+sz1+1, l) : 0;
5794 if (r >= n1 + sz1 + sz2)
5795 {
5796 f += sz1;
5797 *f = '(';
5798 f += 1+sz2;
5799 *f = ')';
5800 }
5801 return n1 + sz1 + sz2;
5802 }
5803 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5804 {
5805 bool r = __left_->fix_forward_references(t_begin, t_end);
5806 if (__right_)
5807 r = r && __right_->fix_forward_references(t_begin, t_end);
5808 return r;
5809 }
5810};
5811
5812class __delete_array_expr
5813 : public __node
5814{
5815public:
5816
5817 __delete_array_expr(bool global, __node* op)
5818 {
5819 __size_ = global;
5820 __right_ = op;
5821 }
5822 virtual size_t first_size() const
5823 {
5824 if (__cached_size_ == -1)
5825 const_cast<long&>(__cached_size_) = (__size_ ? 2 : 0) + 9 + __right_->size();
5826 return __cached_size_;
5827 }
5828 virtual char* first_demangled_name(char* buf) const
5829 {
5830 if (__size_)
5831 {
5832 *buf++ = ':';
5833 *buf++ = ':';
5834 }
5835 strncpy(buf, "delete[] ", 9);
5836 return __right_->get_demangled_name(buf+9);
5837 }
5838 virtual ptrdiff_t print_first(char* f, char* l) const
5839 {
5840 const ptrdiff_t r = l - f;
5841 const ptrdiff_t n1 = sizeof("delete[] ") - 1 + (__size_ ? 2 : 0);
5842 if (r < n1)
5843 return n1 + __right_->print(l, l);
5844 ptrdiff_t sz1 = __right_->print(f+n1, l);
5845 if (r >= n1 + sz1)
5846 {
5847 if (__size_)
5848 {
5849 *f++ = ':';
5850 *f++ = ':';
5851 }
5852 *f++ = 'd';
5853 *f++ = 'e';
5854 *f++ = 'l';
5855 *f++ = 'e';
5856 *f++ = 't';
5857 *f++ = 'e';
5858 *f++ = '[';
5859 *f++ = ']';
5860 *f = ' ';
5861 }
5862 return n1 + sz1;
5863 }
5864 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5865 {
5866 return __right_->fix_forward_references(t_begin, t_end);
5867 }
5868};
5869
5870class __delete_expr
5871 : public __node
5872{
5873public:
5874
5875 __delete_expr(bool global, __node* op)
5876 {
5877 __size_ = global;
5878 __right_ = op;
5879 }
5880 virtual size_t first_size() const
5881 {
5882 if (__cached_size_ == -1)
5883 const_cast<long&>(__cached_size_) = (__size_ ? 2 : 0) + 7 + __right_->size();
5884 return __cached_size_;
5885 }
5886 virtual char* first_demangled_name(char* buf) const
5887 {
5888 if (__size_)
5889 {
5890 *buf++ = ':';
5891 *buf++ = ':';
5892 }
5893 strncpy(buf, "delete ", 7);
5894 return __right_->get_demangled_name(buf+7);
5895 }
5896 virtual ptrdiff_t print_first(char* f, char* l) const
5897 {
5898 const ptrdiff_t r = l - f;
5899 const ptrdiff_t n1 = sizeof("delete ") - 1 + (__size_ ? 2 : 0);
5900 if (r < n1)
5901 return n1 + __right_->print(l, l);
5902 ptrdiff_t sz1 = __right_->print(f+n1, l);
5903 if (r >= n1 + sz1)
5904 {
5905 if (__size_)
5906 {
5907 *f++ = ':';
5908 *f++ = ':';
5909 }
5910 *f++ = 'd';
5911 *f++ = 'e';
5912 *f++ = 'l';
5913 *f++ = 'e';
5914 *f++ = 't';
5915 *f++ = 'e';
5916 *f = ' ';
5917 }
5918 return n1 + sz1;
5919 }
5920 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5921 {
5922 return __right_->fix_forward_references(t_begin, t_end);
5923 }
5924};
5925
5926class __new_expr
5927 : public __node
5928{
5929public:
5930
5931 __new_expr(bool global, bool is_array, bool has_init,
5932 __node* expr, __node* type, __node* init)
5933 {
5934 __size_ = (unsigned)global |
5935 ((unsigned)is_array << 1) |
5936 ((unsigned)has_init << 2);
5937 __left_ = expr;
5938 __name_ = (const char*)type;
5939 __right_ = init;
5940 }
5941 virtual size_t first_size() const
5942 {
5943 if (__cached_size_ == -1)
5944 {
5945 size_t off = 4;
5946 if (__size_ & 1)
5947 off += 2;
5948 if (__size_ & 2)
5949 off += 2;
5950 if (__left_)
5951 {
5952 off += 2;
5953 off += __left_->size();
5954 }
5955 __node* type = (__node*)__name_;
5956 off += type->size();
5957 if (__size_ & 4)
5958 {
5959 off += 2;
5960 if (__right_)
5961 off += __right_->size();
5962 }
5963 const_cast<long&>(__cached_size_) = off;
5964 }
5965 return __cached_size_;
5966 }
5967 virtual char* first_demangled_name(char* buf) const
5968 {
5969 if (__size_ & 1)
5970 {
5971 *buf++ = ':';
5972 *buf++ = ':';
5973 }
5974 *buf++ = 'n';
5975 *buf++ = 'e';
5976 *buf++ = 'w';
5977 if (__size_ & 2)
5978 {
5979 *buf++ = '[';
5980 *buf++ = ']';
5981 }
5982 if (__left_)
5983 {
5984 *buf++ = '(';
5985 buf = __left_->get_demangled_name(buf);
5986 *buf++ = ')';
5987 }
5988 *buf++ = ' ';
5989 __node* type = (__node*)__name_;
5990 buf = type->get_demangled_name(buf);
5991 if (__size_ & 4)
5992 {
5993 *buf++ = '(';
5994 if (__right_)
5995 buf = __right_->get_demangled_name(buf);
5996 *buf++ = ')';
5997 }
5998 return buf;
5999 }
6000 virtual ptrdiff_t print_first(char* f, char* l) const
6001 {
6002 const ptrdiff_t r = l - f;
6003 const ptrdiff_t n1 = sizeof("new ") - 1 + (__size_ & 1 ? 2 : 0) +
6004 (__size_ & 2 ? 2 : 0) + (__left_ ? 2 : 0) + (__size_ & 4 ? 2 : 0);
6005 __node* type = (__node*)__name_;
6006 if (r < n1)
6007 return n1 + (__left_ ? __left_->print(l, l) : 0) +
6008 type->print(l, l) +
6009 (__right_ ? __right_->print(l, l) : 0);
6010 ptrdiff_t sz1 = __left_ ? __left_->print(f+4+
6011 (__size_ & 1 ? 2 : 0) +
6012 (__size_ & 2 ? 2 : 0), l) : 0;
6013 if (r < n1 + sz1)
6014 return n1 + sz1 + type->print(l, l) +
6015 (__right_ ? __right_->print(l, l) : 0);
6016 ptrdiff_t sz2 = type->print(f+(n1-(__size_ & 4 ? 2 : 0)+sz1), l);
6017 if (r < n1 + sz1 + sz2)
6018 return n1 + sz1 + sz2 + (__right_ ? __right_->print(l, l) : 0);
6019 ptrdiff_t sz3 = __right_ ? __right_->print(f+(n1-1)+sz1+sz2, l) : 0;
6020 if (r >= n1 + sz1 + sz2 + sz3)
6021 {
6022 if (__size_ & 1)
6023 {
6024 *f++ = ':';
6025 *f++ = ':';
6026 }
6027 *f++ = 'n';
6028 *f++ = 'e';
6029 *f++ = 'w';
6030 if (__size_ & 2)
6031 {
6032 *f++ = '[';
6033 *f++ = ']';
6034 }
6035 if (__left_)
6036 {
6037 *f = '(';
6038 f += 1 + sz1;
6039 *f++ = ')';
6040 }
6041 *f = ' ';
6042 if (__size_ & 4)
6043 {
6044 f += 1 + sz2;
6045 *f = '(';
6046 f += 1 + sz3;
6047 *f = ')';
6048 }
6049 }
6050 return n1 + sz1 + sz2 + sz3;
6051 }
6052 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6053 {
6054 __node* type = (__node*)__name_;
6055 bool r = type->fix_forward_references(t_begin, t_end);
6056 if (__left_)
6057 r = r && __left_->fix_forward_references(t_begin, t_end);;
6058 if (__right_)
6059 r = r && __right_->fix_forward_references(t_begin, t_end);;
6060 return r;
6061 }
6062};
6063
6064class __dot_star_expr
6065 : public __node
6066{
6067public:
6068
6069 __dot_star_expr(__node* op1, __node* op2)
6070 {
6071 __left_ = op1;
6072 __right_ = op2;
6073 }
6074 virtual size_t first_size() const
6075 {
6076 if (__cached_size_ == -1)
6077 const_cast<long&>(__cached_size_) = __left_->size() + 2 + __right_->size();
6078 return __cached_size_;
6079 }
6080 virtual char* first_demangled_name(char* buf) const
6081 {
6082 buf = __left_->get_demangled_name(buf);
6083 *buf++ = '.';
6084 *buf++ = '*';
6085 return __right_->get_demangled_name(buf);
6086 }
6087 virtual ptrdiff_t print_first(char* f, char* l) const
6088 {
6089 const ptrdiff_t r = l - f;
6090 const ptrdiff_t n = sizeof(".*") - 1;
6091 if (r < n)
6092 return n + __left_->print(l, l) + __right_->print(l, l);
6093 ptrdiff_t sz1 = __left_->print(f, l);
6094 if (r < n + sz1)
6095 return n + sz1 + __right_->print(l, l);
6096 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
6097 if (r >= n + sz1 + sz2)
6098 {
6099 f += sz1;
6100 *f++ = '.';
6101 *f = '*';
6102 }
6103 return n + sz1 + sz2;
6104 }
6105 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6106 {
6107 return __left_->fix_forward_references(t_begin, t_end) &&
6108 __right_->fix_forward_references(t_begin, t_end);
6109 }
6110};
6111
6112class __dot_expr
6113 : public __node
6114{
6115public:
6116
6117 __dot_expr(__node* op1, __node* op2)
6118 {
6119 __left_ = op1;
6120 __right_ = op2;
6121 }
6122 virtual size_t first_size() const
6123 {
6124 if (__cached_size_ == -1)
6125 const_cast<long&>(__cached_size_) = __left_->size() + 1 + __right_->size();
6126 return __cached_size_;
6127 }
6128 virtual char* first_demangled_name(char* buf) const
6129 {
6130 buf = __left_->get_demangled_name(buf);
6131 *buf++ = '.';
6132 return __right_->get_demangled_name(buf);
6133 }
6134 virtual ptrdiff_t print_first(char* f, char* l) const
6135 {
6136 const ptrdiff_t r = l - f;
6137 const ptrdiff_t n = sizeof(".") - 1;
6138 if (r < n)
6139 return n + __left_->print(l, l) + __right_->print(l, l);
6140 ptrdiff_t sz1 = __left_->print(f, l);
6141 if (r < n + sz1)
6142 return n + sz1 + __right_->print(l, l);
6143 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
6144 if (r >= n + sz1 + sz2)
6145 f[sz1] = '.';
6146 return n + sz1 + sz2;
6147 }
6148 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6149 {
6150 return __left_->fix_forward_references(t_begin, t_end) &&
6151 __right_->fix_forward_references(t_begin, t_end);
6152 }
6153};
6154
6155class __arrow_expr
6156 : public __node
6157{
6158public:
6159
6160 __arrow_expr(__node* op1, __node* op2)
6161 {
6162 __left_ = op1;
6163 __right_ = op2;
6164 }
6165 virtual size_t first_size() const
6166 {
6167 if (__cached_size_ == -1)
6168 const_cast<long&>(__cached_size_) = __left_->size() + 2 + __right_->size();
6169 return __cached_size_;
6170 }
6171 virtual char* first_demangled_name(char* buf) const
6172 {
6173 buf = __left_->get_demangled_name(buf);
6174 *buf++ = '-';
6175 *buf++ = '>';
6176 return __right_->get_demangled_name(buf);
6177 }
6178 virtual ptrdiff_t print_first(char* f, char* l) const
6179 {
6180 const ptrdiff_t r = l - f;
6181 const ptrdiff_t n = sizeof("->") - 1;
6182 if (r < n)
6183 return n + __left_->print(l, l) + __right_->print(l, l);
6184 ptrdiff_t sz1 = __left_->print(f, l);
6185 if (r < n + sz1)
6186 return n + sz1 + __right_->print(l, l);
6187 ptrdiff_t sz2 = __right_->print(f+sz1+n, l);
6188 if (r >= n + sz1 + sz2)
6189 {
6190 f += sz1;
6191 *f++ = '-';
6192 *f = '>';
6193 }
6194 return n + sz1 + sz2;
6195 }
6196 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6197 {
6198 return __left_->fix_forward_references(t_begin, t_end) &&
6199 __right_->fix_forward_references(t_begin, t_end);
6200 }
6201};
6202
6203class __std_qualified_name
6204 : public __node
6205{
6206 static const ptrdiff_t n = sizeof("std") - 1;
6207public:
6208
6209 __std_qualified_name()
6210 {
6211 }
6212 virtual size_t first_size() const
6213 {
6214 return n;
6215 }
6216
6217 virtual char* first_demangled_name(char* buf) const
6218 {
6219 *buf++ = 's';
6220 *buf++ = 't';
6221 *buf++ = 'd';
6222 return buf;
6223 }
6224 virtual ptrdiff_t print_first(char* f, char* l) const
6225 {
6226 const ptrdiff_t r = l - f;
6227 if (r >= n)
6228 {
6229 *f++ = 's';
6230 *f++ = 't';
6231 *f = 'd';
6232 }
6233 return n;
6234 }
6235};
6236
6237class __sub_allocator
6238 : public __node
6239{
6240 static const ptrdiff_t n = sizeof("std::allocator") - 1;
6241public:
6242
6243 virtual size_t first_size() const
6244 {
6245 return n;
6246 }
6247 virtual char* first_demangled_name(char* buf) const
6248 {
6249 strncpy(buf, "std::allocator", n);
6250 return buf + n;
6251 }
6252 virtual ptrdiff_t print_first(char* f, char* l) const
6253 {
6254 const ptrdiff_t r = l - f;
6255 if (r >= n)
6256 {
6257 *f++ = 's';
6258 *f++ = 't';
6259 *f++ = 'd';
6260 *f++ = ':';
6261 *f++ = ':';
6262 *f++ = 'a';
6263 *f++ = 'l';
6264 *f++ = 'l';
6265 *f++ = 'o';
6266 *f++ = 'c';
6267 *f++ = 'a';
6268 *f++ = 't';
6269 *f++ = 'o';
6270 *f = 'r';
6271 }
6272 return n;
6273 }
6274};
6275
6276class __sub_basic_string
6277 : public __node
6278{
6279 static const ptrdiff_t n = sizeof("std::basic_string") - 1;
6280public:
6281
6282 virtual size_t first_size() const
6283 {
6284 return n;
6285 }
6286 virtual char* first_demangled_name(char* buf) const
6287 {
6288 strncpy(buf, "std::basic_string", n);
6289 return buf + n;
6290 }
6291 virtual ptrdiff_t print_first(char* f, char* l) const
6292 {
6293 const ptrdiff_t r = l - f;
6294 if (r >= n)
6295 {
6296 *f++ = 's';
6297 *f++ = 't';
6298 *f++ = 'd';
6299 *f++ = ':';
6300 *f++ = ':';
6301 *f++ = 'b';
6302 *f++ = 'a';
6303 *f++ = 's';
6304 *f++ = 'i';
6305 *f++ = 'c';
6306 *f++ = '_';
6307 *f++ = 's';
6308 *f++ = 't';
6309 *f++ = 'r';
6310 *f++ = 'i';
6311 *f++ = 'n';
6312 *f = 'g';
6313 }
6314 return n;
6315 }
6316};
6317
6318class __sub_string
6319 : public __node
6320{
6321 static const size_t n = sizeof("std::string") - 1;
6322 static const size_t ne = sizeof("std::basic_string<char, std::char_traits<char>, std::allocator<char> >") - 1;
6323public:
6324
6325 virtual size_t first_size() const
6326 {
6327 if (__size_)
6328 return ne;
6329 return n;
6330 }
6331 virtual char* first_demangled_name(char* buf) const
6332 {
6333 if (__size_)
6334 {
6335 strncpy(buf, "std::basic_string<char, std::char_traits<char>, std::allocator<char> >", ne);
6336 buf += ne;
6337 }
6338 else
6339 {
6340 strncpy(buf, "std::string", n);
6341 buf += n;
6342 }
6343 return buf;
6344 }
6345
6346 virtual ptrdiff_t print_first(char* f, char* l) const
6347 {
6348 const ptrdiff_t r = l - f;
6349 if (__size_)
6350 {
6351 const ptrdiff_t n1 =
6352 sizeof("std::basic_string<char, std::char_traits<char>,"
6353 " std::allocator<char> >") - 1;
6354 if (r >= n1)
6355 strncpy(f, "std::basic_string<char, std::char_traits<char>,"
6356 " std::allocator<char> >", n1);
6357 return n1;
6358 }
6359 const ptrdiff_t n2 = sizeof("std::string") - 1;
6360 if (r >= n2)
6361 {
6362 *f++ = 's';
6363 *f++ = 't';
6364 *f++ = 'd';
6365 *f++ = ':';
6366 *f++ = ':';
6367 *f++ = 's';
6368 *f++ = 't';
6369 *f++ = 'r';
6370 *f++ = 'i';
6371 *f++ = 'n';
6372 *f = 'g';
6373 }
6374 return n2;
6375 }
6376 virtual size_t base_size() const
6377 {
6378 return 12;
6379 }
6380 virtual char* get_base_name(char* buf) const
6381 {
6382 strncpy(buf, "basic_string", 12);
6383 return buf + 12;
6384 }
6385 virtual ptrdiff_t print_base_name(char* f, char* l) const
6386 {
6387 const ptrdiff_t r = l - f;
6388 const ptrdiff_t n = sizeof("basic_string") - 1;
6389 if (r >= n)
6390 {
6391 *f++ = 'b';
6392 *f++ = 'a';
6393 *f++ = 's';
6394 *f++ = 'i';
6395 *f++ = 'c';
6396 *f++ = '_';
6397 *f++ = 's';
6398 *f++ = 't';
6399 *f++ = 'r';
6400 *f++ = 'i';
6401 *f++ = 'n';
6402 *f = 'g';
6403 }
6404 return n;
6405 }
6406
6407 virtual __node* base_name() const
6408 {
6409 const_cast<size_t&>(__size_) = true;
6410 return const_cast<__node*>(static_cast<const __node*>(this));
6411 }
6412};
6413
6414class __sub_istream
6415 : public __node
6416{
6417 static const ptrdiff_t n = sizeof("std::istream") - 1;
6418public:
6419
6420 virtual size_t first_size() const {return n;}
6421 virtual char* first_demangled_name(char* buf) const
6422 {
6423 strncpy(buf, "std::istream", n);
6424 return buf + n;
6425 }
6426 virtual ptrdiff_t print_first(char* f, char* l) const
6427 {
6428 const ptrdiff_t r = l - f;
6429 if (r >= n)
6430 {
6431 *f++ = 's';
6432 *f++ = 't';
6433 *f++ = 'd';
6434 *f++ = ':';
6435 *f++ = ':';
6436 *f++ = 'i';
6437 *f++ = 's';
6438 *f++ = 't';
6439 *f++ = 'r';
6440 *f++ = 'e';
6441 *f++ = 'a';
6442 *f = 'm';
6443 }
6444 return n;
6445 }
6446};
6447
6448class __sub_ostream
6449 : public __node
6450{
6451 static const ptrdiff_t n = sizeof("std::ostream") - 1;
6452public:
6453
6454 virtual size_t first_size() const {return n;}
6455 virtual char* first_demangled_name(char* buf) const
6456 {
6457 strncpy(buf, "std::ostream", n);
6458 return buf + n;
6459 }
6460 virtual ptrdiff_t print_first(char* f, char* l) const
6461 {
6462 const ptrdiff_t r = l - f;
6463 if (r >= n)
6464 {
6465 *f++ = 's';
6466 *f++ = 't';
6467 *f++ = 'd';
6468 *f++ = ':';
6469 *f++ = ':';
6470 *f++ = 'o';
6471 *f++ = 's';
6472 *f++ = 't';
6473 *f++ = 'r';
6474 *f++ = 'e';
6475 *f++ = 'a';
6476 *f = 'm';
6477 }
6478 return n;
6479 }
6480};
6481
6482class __sub_iostream
6483 : public __node
6484{
6485 static const ptrdiff_t n = sizeof("std::iostream") - 1;
6486public:
6487
6488 virtual size_t first_size() const {return n;}
6489 virtual char* first_demangled_name(char* buf) const
6490 {
6491 strncpy(buf, "std::iostream", n);
6492 return buf + n;
6493 }
6494 virtual ptrdiff_t print_first(char* f, char* l) const
6495 {
6496 const ptrdiff_t r = l - f;
6497 if (r >= n)
6498 {
6499 *f++ = 's';
6500 *f++ = 't';
6501 *f++ = 'd';
6502 *f++ = ':';
6503 *f++ = ':';
6504 *f++ = 'i';
6505 *f++ = 'o';
6506 *f++ = 's';
6507 *f++ = 't';
6508 *f++ = 'r';
6509 *f++ = 'e';
6510 *f++ = 'a';
6511 *f = 'm';
6512 }
6513 return n;
6514 }
6515};
6516
6517class __sub
6518 : public __node
6519{
6520public:
6521
6522 explicit __sub(__node* arg)
6523 {
6524 __left_ = arg;
6525 }
6526 explicit __sub(size_t arg)
6527 {
6528 __size_ = arg;
6529 }
6530 virtual size_t first_size() const
6531 {
6532 return __left_->first_size();
6533 }
6534 virtual char* first_demangled_name(char* buf) const
6535 {
6536 return __left_->first_demangled_name(buf);
6537 }
6538 virtual size_t second_size() const
6539 {
6540 return __left_->second_size();
6541 }
6542 virtual char* second_demangled_name(char* buf) const
6543 {
6544 return __left_->second_demangled_name(buf);
6545 }
6546 virtual ptrdiff_t print_first(char* f, char* l) const
6547 {
6548 return __left_->print_first(f, l);
6549 }
6550 virtual ptrdiff_t print_second(char* f, char* l) const
6551 {
6552 return __left_->print_second(f, l);
6553 }
6554 virtual bool ends_with_template() const
6555 {
6556 return __left_->ends_with_template();
6557 }
6558 virtual __node* base_name() const
6559 {
6560 return __left_->base_name();
6561 }
6562 virtual bool is_reference_or_pointer_to_function_or_array() const
6563 {
6564 return __left_->is_reference_or_pointer_to_function_or_array();
6565 }
6566 virtual bool is_function() const
6567 {
6568 return __left_->is_function();
6569 }
6570 virtual bool is_cv_qualifer() const
6571 {
6572 return __left_->is_cv_qualifer();
6573 }
6574 virtual bool is_ctor_dtor_conv() const
6575 {
6576 return __left_->is_ctor_dtor_conv();
6577 }
6578 virtual bool is_array() const
6579 {
6580 return __left_->is_array();
6581 }
6582 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6583 {
6584 if (__left_ == 0)
6585 {
6586 if (__size_ < t_end - t_begin)
6587 {
6588 __left_ = t_begin[__size_];
6589 __size_ = 0;
6590 }
6591 else
6592 return false;
6593 }
6594 return true;
6595 }
6596 virtual size_t list_len() const
6597 {
6598 return __left_->list_len();
6599 }
6600 virtual bool is_sub() const
6601 {
6602 return true;
6603 }
6604};
6605
6606class __unscoped_template_name
6607 : public __node
6608{
6609public:
6610 __unscoped_template_name(__node* name, __node* args)
6611 {__left_ = name; __right_ = args;}
6612
6613 virtual size_t first_size() const
6614 {
6615 if (__cached_size_ == -1)
6616 const_cast<long&>(__cached_size_) = __left_->size() + __right_->size();
6617 return __cached_size_;
6618 }
6619 virtual char* first_demangled_name(char* buf) const
6620 {
6621 buf = __left_->get_demangled_name(buf);
6622 return __right_->get_demangled_name(buf);
6623 }
6624 virtual ptrdiff_t print_first(char* f, char* l) const
6625 {
6626 const ptrdiff_t r = l - f;
6627 ptrdiff_t sz1 = __left_->print(f, l);
6628 if (r < sz1)
6629 return sz1 + __right_->print(l, l);
6630 return sz1 + __right_->print(f + sz1, l);
6631 }
6632 virtual bool ends_with_template() const
6633 {
6634 return __right_->ends_with_template();
6635 }
6636 virtual __node* base_name() const
6637 {
6638 return __left_->base_name();
6639 }
6640 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6641 {
6642 return __left_->fix_forward_references(t_begin, t_end) &&
6643 __right_->fix_forward_references(t_begin, t_end);
6644 }
6645};
6646
6647// length == 0: __left_ == NULL
6648// length == 1: __left_ != NULL, __right_ == NULL
6649// length > 1: __left_ != NULL, __right_ != NULL
6650class __list
6651 : public __node
6652{
6653public:
6654 explicit __list(__node* type)
6655 {__left_ = type;}
6656
6657 virtual size_t first_size() const
6658 {
6659 if (__cached_size_ == -1)
6660 {
6661 if (__left_ == NULL)
6662 const_cast<long&>(__cached_size_) = 0;
6663 else if (__right_ == NULL)
6664 const_cast<long&>(__cached_size_) = __left_->size();
6665 else
6666 {
6667 size_t off = __right_->size();
6668 if (off > 0)
6669 off += 2;
6670 const_cast<long&>(__cached_size_) = __left_->size() + off;
6671 }
6672 }
6673 return __cached_size_;
6674 }
6675 virtual char* first_demangled_name(char* buf) const
6676 {
6677 if (__left_ != NULL)
6678 {
6679 char* t = __left_->get_demangled_name(buf + (__size_ ? 2 : 0));
6680 if (__size_ == 0)
6681 buf = t;
6682 else if (t != buf+2)
6683 {
6684 *buf++ = ',';
6685 *buf++ = ' ';
6686 buf = t;
6687 }
6688 if (__right_)
6689 buf = __right_->get_demangled_name(buf);
6690 }
6691 return buf;
6692 }
6693 virtual ptrdiff_t print_first(char* f, char* l) const
6694 {
6695 if (__left_ == 0)
6696 return 0;
6697 const ptrdiff_t r = l - f;
6698 ptrdiff_t n = 0;
6699 if (__size_)
6700 {
6701 n = 2;
6702 if (r < n)
6703 {
6704 ptrdiff_t sz1 = __left_->print(l, l);
6705 if (sz1 == 0)
6706 n = 0;
6707 return n + sz1 + (__right_ ? __right_->print(l, l) : 0);
6708 }
6709 }
6710 const ptrdiff_t sz1 = __left_->print(f+n, l);
6711 if (sz1 == 0)
6712 n = 0;
6713 else if (n != 0)
6714 {
6715 f[0] = ',';
6716 f[1] = ' ';
6717 }
6718 const ptrdiff_t sz2 = __right_ ? __right_->print(f+std::min(n+sz1, r), l) : 0;
6719 return n + sz1 + sz2;
6720 }
6721 virtual bool ends_with_template() const
6722 {
6723 if (__right_ != NULL)
6724 return __right_->ends_with_template();
6725 if (__left_ != NULL)
6726 return __left_->ends_with_template();
6727 return false;
6728 }
6729 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6730 {
6731 bool r = true;
6732 if (__left_)
6733 r = r && __left_->fix_forward_references(t_begin, t_end);
6734 if (__right_)
6735 r = r && __right_->fix_forward_references(t_begin, t_end);
6736 return r;
6737 }
6738 virtual size_t list_len() const
6739 {
6740 if (!__left_)
6741 return 0;
6742 if (!__right_)
6743 return 1;
6744 return 1 + __right_->list_len();
6745 }
6746};
6747
6748class __template_args
6749 : public __node
6750{
6751public:
6752 __template_args(__node* name, __node* list)
6753 {
6754 __left_ = name;
6755 __right_ = list;
6756 }
6757
6758 virtual size_t first_size() const
6759 {
6760 if (__cached_size_ == -1)
6761 {
6762 size_t off = 2;
6763 if (__right_)
6764 {
6765 if (__right_->ends_with_template())
6766 ++off;
6767 off += __right_->size();
6768 }
6769 const_cast<long&>(__cached_size_) = __left_->size() + off;
6770 }
6771 return __cached_size_;
6772 }
6773 virtual char* first_demangled_name(char* buf) const
6774 {
6775 buf = __left_->get_demangled_name(buf);
6776 *buf++ = '<';
6777 if (__right_)
6778 {
6779 buf = __right_->get_demangled_name(buf);
6780 if (buf[-1] == '>')
6781 *buf++ = ' ';
6782 }
6783 *buf++ = '>';
6784 return buf;
6785 }
6786 virtual ptrdiff_t print_first(char* f, char* l) const
6787 {
6788 const ptrdiff_t r = l - f;
6789 const ptrdiff_t sz1 = __left_->print(f, l);
6790 ptrdiff_t sz2 = 0;
6791 ptrdiff_t n = 2;
6792 if (__right_)
6793 {
6794 sz2 = __right_->print(f+std::min(sz1+1, r), l);
6795 if (r >= sz1 + sz2 + 2)
6796 {
6797 if (f[sz1+sz2] == '>')
6798 {
6799 f[sz1+sz2+1] = ' ';
6800 ++n;
6801 }
6802 }
6803 else if (__right_->ends_with_template())
6804 ++n;
6805 }
6806 if (r >= sz1 + sz2 + n)
6807 {
6808 f[sz1] = '<';
6809 f[sz1+sz2+n-1] = '>';
6810 }
6811 return n + sz1 + sz2;
6812 }
6813
6814 virtual bool ends_with_template() const
6815 {
6816 return true;
6817 }
6818 virtual __node* base_name() const
6819 {
6820 return __left_->base_name();
6821 }
6822 virtual bool is_ctor_dtor_conv() const
6823 {
6824 return __left_->is_ctor_dtor_conv();
6825 }
6826 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6827 {
6828 bool r = __left_->fix_forward_references(t_begin, t_end);
6829 if (__right_)
6830 r = r && __right_->fix_forward_references(t_begin, t_end);
6831 return r;
6832 }
6833};
6834
6835class __function_args
6836 : public __node
6837{
6838public:
6839 __function_args(__node* list)
6840 {__right_ = list;}
6841
6842 virtual size_t first_size() const
6843 {
6844 if (__cached_size_ == -1)
6845 const_cast<long&>(__cached_size_) = 2 + __right_->size();
6846 return __cached_size_;
6847 }
6848 virtual char* first_demangled_name(char* buf) const
6849 {
6850 *buf++ = '(';
6851 buf = __right_->get_demangled_name(buf);
6852 *buf++ = ')';
6853 return buf;
6854 }
6855 virtual ptrdiff_t print_first(char* f, char* l) const
6856 {
6857 const ptrdiff_t r = l - f;
6858 const ptrdiff_t n = 2;
6859 if (r < n)
6860 return n + __right_->print(l, l);
6861 ptrdiff_t sz1 = __right_->print(f+1, l);
6862 if (r >= n + sz1)
6863 {
6864 *f = '(';
6865 f += 1 + sz1;
6866 *f = ')';
6867 }
6868 return n + sz1;
6869 }
6870 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6871 {
6872 return __right_->fix_forward_references(t_begin, t_end);
6873 }
6874};
6875
6876class __cv_qualifiers
6877 : public __node
6878{
6879public:
6880 __cv_qualifiers(size_t cv, __node* type)
6881 {
6882 __left_ = type;
6883 __size_ = __left_->is_function() ? cv << 5 : cv;
6884 }
6885
6886 virtual size_t first_size() const
6887 {
6888 size_t s = __left_->first_size();
6889 if (__size_ & 4)
6890 s += sizeof(" restrict")-1;
6891 if (__size_ & 2)
6892 s += sizeof(" volatile")-1;
6893 if (__size_ & 1)
6894 s += sizeof(" const")-1;
6895 if (__size_ & 8)
6896 s += sizeof(" &")-1;
6897 if (__size_ & 16)
6898 s += sizeof(" &&")-1;
6899 return s;
6900 }
6901 virtual char* first_demangled_name(char* buf) const
6902 {
6903 buf = __left_->first_demangled_name(buf);
6904 if (__size_ & 1)
6905 {
6906 const size_t n = sizeof(" const")-1;
6907 strncpy(buf, " const", n);
6908 buf += n;
6909 }
6910 if (__size_ & 2)
6911 {
6912 const size_t n = sizeof(" volatile")-1;
6913 strncpy(buf, " volatile", n);
6914 buf += n;
6915 }
6916 if (__size_ & 4)
6917 {
6918 const size_t n = sizeof(" restrict")-1;
6919 strncpy(buf, " restrict", n);
6920 buf += n;
6921 }
6922 if (__size_ & 8)
6923 {
6924 *buf++ = ' ';
6925 *buf++ = '&';
6926 }
6927 if (__size_ & 16)
6928 {
6929 *buf++ = ' ';
6930 *buf++ = '&';
6931 *buf++ = '&';
6932 }
6933 return buf;
6934 }
6935 virtual ptrdiff_t print_first(char* f, char* l) const
6936 {
6937 const ptrdiff_t r = l - f;
6938 const ptrdiff_t sz = __left_->print_first(f, l);
6939 ptrdiff_t n = 0;
6940 if (__size_ & 0x1F)
6941 {
6942 if (__size_ & 1)
6943 {
6944 const ptrdiff_t d = sizeof(" const")-1;
6945 if (r >= sz + n + d)
6946 {
6947 char* t = f + sz + n;
6948 *t++ = ' ';
6949 *t++ = 'c';
6950 *t++ = 'o';
6951 *t++ = 'n';
6952 *t++ = 's';
6953 *t = 't';
6954 }
6955 n += d;
6956 }
6957 if (__size_ & 2)
6958 {
6959 const ptrdiff_t d = sizeof(" volatile")-1;
6960 if (r >= sz + n + d)
6961 {
6962 char* t = f + sz + n;
6963 *t++ = ' ';
6964 *t++ = 'v';
6965 *t++ = 'o';
6966 *t++ = 'l';
6967 *t++ = 'a';
6968 *t++ = 't';
6969 *t++ = 'i';
6970 *t++ = 'l';
6971 *t = 'e';
6972 }
6973 n += d;
6974 }
6975 if (__size_ & 4)
6976 {
6977 const ptrdiff_t d = sizeof(" restrict")-1;
6978 if (r >= sz + n + d)
6979 {
6980 char* t = f + sz + n;
6981 *t++ = ' ';
6982 *t++ = 'r';
6983 *t++ = 'e';
6984 *t++ = 's';
6985 *t++ = 't';
6986 *t++ = 'r';
6987 *t++ = 'i';
6988 *t++ = 'c';
6989 *t = 't';
6990 }
6991 n += d;
6992 }
6993 if (__size_ & 8)
6994 {
6995 const ptrdiff_t d = sizeof(" &")-1;
6996 if (r >= sz + n + d)
6997 {
6998 char* t = f + sz + n;
6999 *t++ = ' ';
7000 *t = '&';
7001 }
7002 n += d;
7003 }
7004 if (__size_ & 16)
7005 {
7006 const ptrdiff_t d = sizeof(" &&")-1;
7007 if (r >= sz + n + d)
7008 {
7009 char* t = f + sz + n;
7010 *t++ = ' ';
7011 *t++ = '&';
7012 *t = '&';
7013 }
7014 n += d;
7015 }
7016 }
7017 return n + sz;
7018 }
7019 virtual size_t second_size() const
7020 {
7021 size_t s = __left_->second_size();
7022 if (__size_ & 128)
7023 s += sizeof(" restrict")-1;
7024 if (__size_ & 64)
7025 s += sizeof(" volatile")-1;
7026 if (__size_ & 32)
7027 s += sizeof(" const")-1;
7028 if (__size_ & 256)
7029 s += sizeof(" &")-1;
7030 if (__size_ & 512)
7031 s += sizeof(" &&")-1;
7032 return s;
7033 }
7034 virtual char* second_demangled_name(char* buf) const
7035 {
7036 buf = __left_->second_demangled_name(buf);
7037 if (__size_ & 32)
7038 {
7039 const size_t n = sizeof(" const")-1;
7040 strncpy(buf, " const", n);
7041 buf += n;
7042 }
7043 if (__size_ & 64)
7044 {
7045 const size_t n = sizeof(" volatile")-1;
7046 strncpy(buf, " volatile", n);
7047 buf += n;
7048 }
7049 if (__size_ & 128)
7050 {
7051 const size_t n = sizeof(" restrict")-1;
7052 strncpy(buf, " restrict", n);
7053 buf += n;
7054 }
7055 if (__size_ & 256)
7056 {
7057 *buf++ = ' ';
7058 *buf++ = '&';
7059 }
7060 if (__size_ & 512)
7061 {
7062 *buf++ = ' ';
7063 *buf++ = '&';
7064 *buf++ = '&';
7065 }
7066 return buf;
7067 }
7068 virtual ptrdiff_t print_second(char* f, char* l) const
7069 {
7070 const ptrdiff_t r = l - f;
7071 const ptrdiff_t sz = __left_->print_second(f, l);
7072 ptrdiff_t n = 0;
7073 if (__size_ & 0x3E0)
7074 {
7075 if (__size_ & 32)
7076 {
7077 const ptrdiff_t d = sizeof(" const")-1;
7078 if (r >= sz + n + d)
7079 {
7080 char* t = f + sz + n;
7081 *t++ = ' ';
7082 *t++ = 'c';
7083 *t++ = 'o';
7084 *t++ = 'n';
7085 *t++ = 's';
7086 *t = 't';
7087 }
7088 n += d;
7089 }
7090 if (__size_ & 64)
7091 {
7092 const ptrdiff_t d = sizeof(" volatile")-1;
7093 if (r >= sz + n + d)
7094 {
7095 char* t = f + sz + n;
7096 *t++ = ' ';
7097 *t++ = 'v';
7098 *t++ = 'o';
7099 *t++ = 'l';
7100 *t++ = 'a';
7101 *t++ = 't';
7102 *t++ = 'i';
7103 *t++ = 'l';
7104 *t = 'e';
7105 }
7106 n += d;
7107 }
7108 if (__size_ & 128)
7109 {
7110 const ptrdiff_t d = sizeof(" restrict")-1;
7111 if (r >= sz + n + d)
7112 {
7113 char* t = f + sz + n;
7114 *t++ = ' ';
7115 *t++ = 'r';
7116 *t++ = 'e';
7117 *t++ = 's';
7118 *t++ = 't';
7119 *t++ = 'r';
7120 *t++ = 'i';
7121 *t++ = 'c';
7122 *t = 't';
7123 }
7124 n += d;
7125 }
7126 if (__size_ & 256)
7127 {
7128 const ptrdiff_t d = sizeof(" &")-1;
7129 if (r >= sz + n + d)
7130 {
7131 char* t = f + sz + n;
7132 *t++ = ' ';
7133 *t = '&';
7134 }
7135 n += d;
7136 }
7137 if (__size_ & 512)
7138 {
7139 const ptrdiff_t d = sizeof(" &&")-1;
7140 if (r >= sz + n + d)
7141 {
7142 char* t = f + sz + n;
7143 *t++ = ' ';
7144 *t++ = '&';
7145 *t = '&';
7146 }
7147 n += d;
7148 }
7149 }
7150 return n + sz;
7151 }
7152 virtual __node* base_name() const
7153 {
7154 return __left_->base_name();
7155 }
7156 virtual bool is_reference_or_pointer_to_function_or_array() const
7157 {
7158 return __left_->is_reference_or_pointer_to_function_or_array();
7159 }
7160 virtual bool is_function() const
7161 {
7162 return __left_->is_function();
7163 }
7164 virtual bool is_cv_qualifer() const
7165 {
7166 return true;
7167 }
7168 virtual __node* extract_cv(__node*& rt) const
7169 {
7170 if (rt == this)
7171 {
7172 rt = __left_;
7173 return const_cast<__node*>(static_cast<const __node*>(this));
7174 }
7175 return 0;
7176 }
7177 virtual bool ends_with_template() const
7178 {
7179 return __left_->ends_with_template();
7180 }
7181 virtual bool is_ctor_dtor_conv() const
7182 {
7183 return __left_->is_ctor_dtor_conv();
7184 }
7185 virtual bool is_array() const
7186 {
7187 return __left_->is_array();
7188 }
7189 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7190 {
7191 return __left_->fix_forward_references(t_begin, t_end);
7192 }
7193 virtual size_t list_len() const
7194 {
7195 return __left_->list_len();
7196 }
7197};
7198
7199class __extended_qualifier
7200 : public __node
7201{
7202public:
7203 __extended_qualifier(__node* name, __node* type)
7204 {
7205 __left_ = type;
7206 __right_ = name;
7207 __size_ = __left_->is_function() ? 1 : 0;
7208 }
7209
7210 virtual size_t first_size() const
7211 {
7212 size_t s = __left_->first_size();
7213 if (__size_ == 0)
7214 s += __right_->size() + 1;
7215 return s;
7216 }
7217 virtual char* first_demangled_name(char* buf) const
7218 {
7219 buf = __left_->first_demangled_name(buf);
7220 if (__size_ == 0)
7221 {
7222 *buf++ = ' ';
7223 buf = __right_->get_demangled_name(buf);
7224 }
7225 return buf;
7226 }
7227 virtual ptrdiff_t print_first(char* f, char* l) const
7228 {
7229 const ptrdiff_t r = l - f;
7230 const ptrdiff_t sz1 = __left_->print_first(f, l);
7231 ptrdiff_t sz2 = 0;
7232 ptrdiff_t n = 0;
7233 if (__size_ == 0)
7234 {
7235 if (r < sz1 + 1)
7236 return sz1 + 1 + __right_->print(l, l);
7237 sz2 = __right_->print(f+1+sz1, l);
7238 n = 1;
7239 f[sz1] = ' ';
7240 }
7241 return n + sz1 + sz2;
7242 }
7243 virtual size_t second_size() const
7244 {
7245 size_t s = __left_->second_size();
7246 if (__size_ == 1)
7247 s += __right_->size() + 1;
7248 return s;
7249 }
7250 virtual char* second_demangled_name(char* buf) const
7251 {
7252 buf = __left_->second_demangled_name(buf);
7253 if (__size_ == 1)
7254 {
7255 *buf++ = ' ';
7256 buf = __right_->get_demangled_name(buf);
7257 }
7258 return buf;
7259 }
7260 virtual ptrdiff_t print_second(char* f, char* l) const
7261 {
7262 const ptrdiff_t r = l - f;
7263 const ptrdiff_t sz1 = __left_->print_second(f, l);
7264 ptrdiff_t sz2 = 0;
7265 ptrdiff_t n = 0;
7266 if (__size_ == 1)
7267 {
7268 if (r < sz1 + 1)
7269 return sz1 + 1 + __right_->print(l, l);
7270 sz2 = __right_->print(f+1+sz1, l);
7271 n = 1;
7272 f[sz1] = ' ';
7273 }
7274 return n + sz1 + sz2;
7275 }
7276 virtual __node* base_name() const
7277 {
7278 return __left_->base_name();
7279 }
7280 virtual bool is_reference_or_pointer_to_function_or_array() const
7281 {
7282 return __left_->is_reference_or_pointer_to_function_or_array();
7283 }
7284 virtual bool is_function() const
7285 {
7286 return __left_->is_function();
7287 }
7288 virtual bool is_cv_qualifer() const
7289 {
7290 return true;
7291 }
7292 virtual __node* extract_cv(__node*& rt) const
7293 {
7294 if (rt == this)
7295 {
7296 rt = __left_;
7297 return const_cast<__node*>(static_cast<const __node*>(this));
7298 }
7299 return 0;
7300 }
7301 virtual bool ends_with_template() const
7302 {
7303 return __left_->ends_with_template();
7304 }
7305 virtual bool is_ctor_dtor_conv() const
7306 {
7307 return __left_->is_ctor_dtor_conv();
7308 }
7309 virtual bool is_array() const
7310 {
7311 return __left_->is_array();
7312 }
7313 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7314 {
7315 return __left_->fix_forward_references(t_begin, t_end);
7316 }
7317 virtual size_t list_len() const
7318 {
7319 return __left_->list_len();
7320 }
7321};
7322
7323class __function
7324 : public __node
7325{
7326public:
7327
7328 __function(__node* name, __node* signature, size_t ret_goes_first = true)
7329 {
7330 __size_ = ret_goes_first;
7331 __left_ = name;
7332 __right_ = signature;
7333 }
7334
7335 virtual size_t first_size() const
7336 {
7337 size_t off = 0;
7338 if (__size_)
7339 {
7340 off = __right_->first_size();
7341 if (off > 0 && (__left_ == NULL ||
7342 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7343 ++off;
7344 }
7345 else
7346 off = 5;
7347 if (__left_)
7348 off += __left_->first_size();
7349 else
7350 ++off;
7351 return off;
7352 }
7353
7354 virtual size_t second_size() const
7355 {
7356 size_t off = 0;
7357 if (__left_ == NULL)
7358 off = 1;
7359 off += __right_->second_size();
7360 if (!__size_)
7361 {
7362 off += 2;
7363 off += __right_->first_size();
7364 }
7365 return off;
7366 }
7367
7368 virtual char* first_demangled_name(char* buf) const
7369 {
7370 if (__size_)
7371 {
7372 const char* t = buf;
7373 buf = __right_->first_demangled_name(buf);
7374 if (buf != t && (__left_ == NULL ||
7375 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7376 *buf++ = ' ';
7377 }
7378 else
7379 {
7380 strncpy(buf, "auto ", 5);
7381 buf += 5;
7382 }
7383 if (__left_)
7384 buf = __left_->first_demangled_name(buf);
7385 else
7386 *buf++ = '(';
7387 return buf;
7388 }
7389 virtual ptrdiff_t print_first(char* f, char* l) const
7390 {
7391 const ptrdiff_t r = l - f;
7392 ptrdiff_t n = 0;
7393 ptrdiff_t sz1 = 0;
7394 ptrdiff_t sz2 = 0;
7395 if (__size_)
7396 {
7397 sz1 = __right_->print_first(f, l);
7398 if (sz1 != 0 && (__left_ == NULL ||
7399 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7400 {
7401 ++n;
7402 if (r >= sz1 + 1)
7403 f[sz1] = ' ';
7404 }
7405 }
7406 else
7407 {
7408 n = 5;
7409 if (r >= 5)
7410 {
7411 char* t = f;
7412 *t++ = 'a';
7413 *t++ = 'u';
7414 *t++ = 't';
7415 *t++ = 'o';
7416 *t++ = ' ';
7417 }
7418 }
7419 if (__left_)
7420 sz2 = __left_->print_first(f + std::min(n + sz1, r), l);
7421 else
7422 {
7423 ++n;
7424 if (r >= n + sz1)
7425 f[n+sz1-1] = '(';
7426 }
7427 return n + sz1 + sz2;
7428 }
7429
7430 virtual char* second_demangled_name(char* buf) const
7431 {
7432 if (__left_ == NULL)
7433 *buf++ = ')';
7434 buf = __right_->second_demangled_name(buf);
7435 if (!__size_)
7436 {
7437 *buf++ = '-';
7438 *buf++ = '>';
7439 buf = __right_->first_demangled_name(buf);
7440 }
7441 return buf;
7442 }
7443 virtual ptrdiff_t print_second(char* f, char* l) const
7444 {
7445 const ptrdiff_t r = l - f;
7446 ptrdiff_t n = 0;
7447 ptrdiff_t sz1 = 0;
7448 ptrdiff_t sz2 = 0;
7449 if (__left_ == NULL)
7450 {
7451 n = 1;
7452 if (r >= 1)
7453 *f = ')';
7454 }
7455 sz1 = __right_->print_second(f+std::min(r, n), l);
7456 if (!__size_)
7457 {
7458 if (r > n+sz1+1)
7459 {
7460 f[n+sz1] = '-';
7461 f[n+sz1+1] = '>';
7462 }
7463 n += 2;
7464 sz2 = __right_->print_first(f+std::min(r, n+sz1), l);
7465 }
7466 return n + sz1 + sz2;
7467 }
7468
Howard Hinnantf36e6a62011-08-12 17:33:10 +00007469 virtual char* get_demangled_name(char* buf) const
7470 {
7471 if (__size_)
7472 {
7473 const char* t = buf;
7474 buf = __right_->first_demangled_name(buf);
7475 if (buf != t && (__left_ == NULL ||
7476 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7477 *buf++ = ' ';
7478 }
7479 else
7480 {
7481 strncpy(buf, "auto ", 5);
7482 buf += 5;
7483 }
7484 if (__left_)
7485 buf = __left_->first_demangled_name(buf);
7486 buf = __right_->second_demangled_name(buf);
7487 if (!__size_)
7488 {
7489 *buf++ = '-';
7490 *buf++ = '>';
7491 buf = __right_->first_demangled_name(buf);
7492 }
7493 return buf;
7494 }
7495
7496 virtual size_t size() const
7497 {
7498 if (__cached_size_ == -1)
7499 {
7500 size_t off = 0;
7501 if (__size_)
7502 {
7503 off = __right_->first_size();
7504 if (off > 0 && (__left_ == NULL ||
7505 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7506 ++off;
7507 }
7508 else
7509 off = 5;
7510 if (__left_)
7511 off += __left_->first_size();
7512 off += __right_->second_size();
7513 if (!__size_)
7514 {
7515 off += 2;
7516 off += __right_->first_size();
7517 }
7518 const_cast<long&>(__cached_size_) = off;
7519 }
7520 return __cached_size_;
7521 }
7522
7523 virtual ptrdiff_t print(char* f, char* l) const
7524 {
7525 const ptrdiff_t r = l - f;
7526 ptrdiff_t n = 0;
7527 ptrdiff_t sz1 = 0;
7528 ptrdiff_t sz2 = 0;
7529 if (__size_)
7530 {
7531 sz1 = __right_->print_first(f, l);
7532 if (sz1 != 0 && (__left_ == NULL ||
7533 !__right_->__left_->is_reference_or_pointer_to_function_or_array()))
7534 {
7535 ++n;
7536 if (r >= sz1 + 1)
7537 f[sz1] = ' ';
7538 }
7539 }
7540 else
7541 {
7542 n = 5;
7543 if (r >= 5)
7544 {
7545 char* t = f;
7546 *t++ = 'a';
7547 *t++ = 'u';
7548 *t++ = 't';
7549 *t++ = 'o';
7550 *t++ = ' ';
7551 }
7552 }
7553 if (__left_)
7554 sz2 = __left_->print_first(f + std::min(n + sz1, r), l);
7555 n += sz1 + sz2;
7556 sz2 = 0;
7557 sz1 = __right_->print_second(f+std::min(r, n), l);
7558 if (!__size_)
7559 {
7560 if (r > n+sz1+1)
7561 {
7562 f[n+sz1] = '-';
7563 f[n+sz1+1] = '>';
7564 }
7565 n += 2;
7566 sz2 = __right_->print_first(f+std::min(r, n+sz1), l);
7567 }
7568 return n + sz1 + sz2;
7569 }
7570
Howard Hinnant4fbf16a2011-05-05 15:27:28 +00007571 virtual bool is_function() const
7572 {
7573 return true;
7574 }
7575 virtual bool is_ctor_dtor_conv() const
7576 {
7577 return __left_->is_ctor_dtor_conv();
7578 }
7579 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7580 {
7581 bool r = true;
7582 if (__left_)
7583 r = r && __left_->fix_forward_references(t_begin, t_end);
7584 r = r && __right_->fix_forward_references(t_begin, t_end);
7585 return r;
7586 }
7587};
7588
7589class __function_signature
7590 : public __node
7591{
7592public:
7593 __function_signature(__node* ret, __node* args)
7594 {
7595 __left_ = ret;
7596 __right_ = args;
7597 }
7598 virtual size_t first_size() const
7599 {
7600 return __left_ ? __left_->first_size() : 0;
7601 }
7602
7603 virtual size_t second_size() const
7604 {
7605 return 2 + (__right_ ? __right_->size() : 0)
7606 + (__left_ ? __left_->second_size() : 0);
7607 }
7608
7609 virtual char* first_demangled_name(char* buf) const
7610 {
7611 if (__left_)
7612 buf = __left_->first_demangled_name(buf);
7613 return buf;
7614 }
7615 virtual ptrdiff_t print_first(char* f, char* l) const
7616 {
7617 return __left_ ? __left_->print_first(f, l) : 0;
7618 }
7619
7620 virtual char* second_demangled_name(char* buf) const
7621 {
7622 *buf++ = '(';
7623 if (__right_)
7624 buf = __right_->get_demangled_name(buf);
7625 *buf++ = ')';
7626 if (__left_)
7627 buf = __left_->second_demangled_name(buf);
7628 return buf;
7629 }
7630 virtual ptrdiff_t print_second(char* f, char* l) const
7631 {
7632 const ptrdiff_t r = l - f;
7633 const ptrdiff_t sz1 = __right_ ? __right_->print(f+std::min<ptrdiff_t>(1, r), l) : 0;
7634 const ptrdiff_t sz2 = __left_ ? __left_->print_second(f+std::min(2+sz1, r), l) : 0;
7635 if (r >= 2 + sz1 + sz2)
7636 {
7637 *f = '(';
7638 f += 1 + sz1;
7639 *f = ')';
7640 }
7641 return 2 + sz1 + sz2;
7642 }
7643 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7644 {
7645 bool r = true;
7646 if (__left_)
7647 r = r && __left_->fix_forward_references(t_begin, t_end);
7648 if (__right_)
7649 r = r && __right_->fix_forward_references(t_begin, t_end);
7650 return r;
7651 }
7652};
7653
7654class __pointer_to
7655 : public __node
7656{
7657public:
7658
7659 explicit __pointer_to(__node* type)
7660 {
7661 __left_ = type;
7662 }
7663 virtual size_t first_size() const
7664 {
7665 return __left_->first_size() + (__left_->is_array() ? 3 : 1);
7666 }
7667 virtual size_t second_size() const
7668 {
7669 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7670 }
7671 virtual char* first_demangled_name(char* buf) const
7672 {
7673 buf = __left_->first_demangled_name(buf);
7674 if (__left_->is_array())
7675 {
7676 *buf++ = ' ';
7677 *buf++ = '(';
7678 *buf++ = '*';
7679 }
7680 else
7681 *buf++ = '*';
7682 return buf;
7683 }
7684 virtual ptrdiff_t print_first(char* f, char* l) const
7685 {
7686 const ptrdiff_t r = l - f;
7687 const ptrdiff_t sz = __left_->print_first(f, l);
7688 ptrdiff_t n;
7689 if (__left_->is_array())
7690 {
7691 n = 3;
7692 if (r >= sz + n)
7693 {
7694 f += sz;
7695 *f++ = ' ';
7696 *f++ = '(';
7697 *f = '*';
7698 }
7699 }
7700 else
7701 {
7702 n = 1;
7703 if (r >= sz + n)
7704 f[sz] = '*';
7705 }
7706 return sz + n;
7707 }
7708 virtual char* second_demangled_name(char* buf) const
7709 {
7710 if (__left_->is_array())
7711 *buf++ = ')';
7712 return __left_->second_demangled_name(buf);
7713 }
7714 virtual ptrdiff_t print_second(char* f, char* l) const
7715 {
7716 const ptrdiff_t r = l - f;
7717 ptrdiff_t n = 0;
7718 if (__left_->is_array())
7719 {
7720 n = 1;
7721 if (r > n)
7722 *f = ')';
7723 }
7724 return __left_->print_second(f + std::min(n, r), l) + n;
7725 }
7726 virtual __node* base_name() const
7727 {
7728 return __left_->base_name();
7729 }
7730 virtual bool is_reference_or_pointer_to_function_or_array() const
7731 {
7732 return __left_->is_function() ||
7733 __left_->is_reference_or_pointer_to_function_or_array();
7734 }
7735 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7736 {
7737 return __left_->fix_forward_references(t_begin, t_end);
7738 }
7739 virtual size_t list_len() const
7740 {
7741 return __left_->list_len();
7742 }
7743};
7744
7745class __lvalue_reference_to
7746 : public __node
7747{
7748public:
7749
7750 explicit __lvalue_reference_to(__node* type)
7751 {
7752 __left_ = type;
7753 }
7754 virtual size_t first_size() const
7755 {
7756 return __left_->first_size() + (__left_->is_array() ? 3 : 1);
7757 }
7758 virtual size_t second_size() const
7759 {
7760 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7761 }
7762 virtual char* first_demangled_name(char* buf) const
7763 {
7764 buf = __left_->first_demangled_name(buf);
7765 if (__left_->is_array())
7766 {
7767 *buf++ = ' ';
7768 *buf++ = '(';
7769 *buf++ = '&';
7770 }
7771 else
7772 *buf++ = '&';
7773 return buf;
7774 }
7775 virtual ptrdiff_t print_first(char* f, char* l) const
7776 {
7777 const ptrdiff_t r = l - f;
7778 const ptrdiff_t sz = __left_->print_first(f, l);
7779 ptrdiff_t n;
7780 if (__left_->is_array())
7781 {
7782 n = 3;
7783 if (r >= sz + n)
7784 {
7785 f += sz;
7786 *f++ = ' ';
7787 *f++ = '(';
7788 *f = '&';
7789 }
7790 }
7791 else
7792 {
7793 n = 1;
7794 if (r >= sz + n)
7795 f[sz] = '&';
7796 }
7797 return sz + n;
7798 }
7799 virtual char* second_demangled_name(char* buf) const
7800 {
7801 if (__left_->is_array())
7802 *buf++ = ')';
7803 return __left_->second_demangled_name(buf);
7804 }
7805 virtual ptrdiff_t print_second(char* f, char* l) const
7806 {
7807 const ptrdiff_t r = l - f;
7808 ptrdiff_t n = 0;
7809 if (__left_->is_array())
7810 {
7811 n = 1;
7812 if (r > n)
7813 *f = ')';
7814 }
7815 return __left_->print_second(f + std::min(n, r), l) + n;
7816 }
7817 virtual __node* base_name() const
7818 {
7819 return __left_->base_name();
7820 }
7821 virtual bool is_reference_or_pointer_to_function_or_array() const
7822 {
7823 return __left_->is_function();
7824 }
7825 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7826 {
7827 return __left_->fix_forward_references(t_begin, t_end);
7828 }
7829 virtual size_t list_len() const
7830 {
7831 return __left_->list_len();
7832 }
7833};
7834
7835class __rvalue_reference_to
7836 : public __node
7837{
7838public:
7839
7840 explicit __rvalue_reference_to(__node* type)
7841 {
7842 __left_ = type;
7843 }
7844 virtual size_t first_size() const
7845 {
7846 return __left_->first_size() + (__left_->is_array() ? 4 : 2);
7847 }
7848 virtual size_t second_size() const
7849 {
7850 return __left_->second_size() + (__left_->is_array() ? 1 : 0);
7851 }
7852 virtual char* first_demangled_name(char* buf) const
7853 {
7854 buf = __left_->first_demangled_name(buf);
7855 if (__left_->is_array())
7856 {
7857 strncpy(buf, " (&&", 4);
7858 buf += 4;
7859 }
7860 else
7861 {
7862 *buf++ = '&';
7863 *buf++ = '&';
7864 }
7865 return buf;
7866 }
7867 virtual ptrdiff_t print_first(char* f, char* l) const
7868 {
7869 const ptrdiff_t r = l - f;
7870 const ptrdiff_t sz = __left_->print_first(f, l);
7871 ptrdiff_t n;
7872 if (__left_->is_array())
7873 {
7874 n = 4;
7875 if (r >= sz + n)
7876 {
7877 f += sz;
7878 *f++ = ' ';
7879 *f++ = '(';
7880 *f++ = '&';
7881 *f = '&';
7882 }
7883 }
7884 else
7885 {
7886 n = 2;
7887 if (r >= sz + n)
7888 {
7889 f += sz;
7890 *f++ = '&';
7891 *f = '&';
7892 }
7893 }
7894 return sz + n;
7895 }
7896 virtual char* second_demangled_name(char* buf) const
7897 {
7898 if (__left_->is_array())
7899 *buf++ = ')';
7900 return __left_->second_demangled_name(buf);
7901 }
7902 virtual ptrdiff_t print_second(char* f, char* l) const
7903 {
7904 const ptrdiff_t r = l - f;
7905 ptrdiff_t n = 0;
7906 if (__left_->is_array())
7907 {
7908 n = 1;
7909 if (r > n)
7910 *f = ')';
7911 }
7912 return __left_->print_second(f + std::min(n, r), l) + n;
7913 }
7914 virtual __node* base_name() const
7915 {
7916 return __left_->base_name();
7917 }
7918 virtual bool is_reference_or_pointer_to_function_or_array() const
7919 {
7920 return __left_->is_function();
7921 }
7922 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7923 {
7924 return __left_->fix_forward_references(t_begin, t_end);
7925 }
7926 virtual size_t list_len() const
7927 {
7928 return __left_->list_len();
7929 }
7930};
7931
7932class __d_complex
7933 : public __node
7934{
7935 static const size_t n = sizeof(" complex") - 1;
7936public:
7937
7938 explicit __d_complex(__node* type)
7939 {
7940 __left_ = type;
7941 }
7942 virtual size_t first_size() const
7943 {
7944 if (__cached_size_ == -1)
7945 const_cast<long&>(__cached_size_) = n + __left_->size();
7946 return __cached_size_;
7947 }
7948 virtual char* first_demangled_name(char* buf) const
7949 {
7950 buf = __left_->get_demangled_name(buf);
7951 strncpy(buf, " complex", n);
7952 return buf + n;
7953 }
7954 virtual ptrdiff_t print_first(char* f, char* l) const
7955 {
7956 const ptrdiff_t r = l - f;
7957 const ptrdiff_t sz = __left_->print(f, l);
7958 const ptrdiff_t n = sizeof(" complex") - 1;
7959 if (r >= sz + n)
7960 {
7961 f += sz;
7962 *f++ = ' ';
7963 *f++ = 'c';
7964 *f++ = 'o';
7965 *f++ = 'm';
7966 *f++ = 'p';
7967 *f++ = 'l';
7968 *f++ = 'e';
7969 *f = 'x';
7970 }
7971 return sz + n;
7972 }
7973 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
7974 {
7975 return __left_->fix_forward_references(t_begin, t_end);
7976 }
7977};
7978
7979class __imaginary
7980 : public __node
7981{
7982 static const size_t n = sizeof(" imaginary") - 1;
7983public:
7984
7985 explicit __imaginary(__node* type)
7986 {
7987 __left_ = type;
7988 }
7989 virtual size_t first_size() const
7990 {
7991 if (__cached_size_ == -1)
7992 const_cast<long&>(__cached_size_) = n + __left_->size();
7993 return __cached_size_;
7994 }
7995 virtual char* first_demangled_name(char* buf) const
7996 {
7997 buf = __left_->get_demangled_name(buf);
7998 strncpy(buf, " imaginary", n);
7999 return buf + n;
8000 }
8001 virtual ptrdiff_t print_first(char* f, char* l) const
8002 {
8003 const ptrdiff_t r = l - f;
8004 const ptrdiff_t sz = __left_->print(f, l);
8005 const ptrdiff_t n = sizeof(" imaginary") - 1;
8006 if (r >= sz + n)
8007 {
8008 f += sz;
8009 *f++ = ' ';
8010 *f++ = 'i';
8011 *f++ = 'm';
8012 *f++ = 'a';
8013 *f++ = 'g';
8014 *f++ = 'i';
8015 *f++ = 'n';
8016 *f++ = 'a';
8017 *f++ = 'r';
8018 *f = 'y';
8019 }
8020 return sz + n;
8021 }
8022 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
8023 {
8024 return __left_->fix_forward_references(t_begin, t_end);
8025 }
8026};
8027
8028class __pack_expansion
8029 : public __node
8030{
8031public:
8032
8033 explicit __pack_expansion(__node* type)
8034 {
8035 __left_ = type;
8036 }
8037 virtual size_t first_size() const
8038 {
8039 if (__cached_size_ == -1)
8040 {
8041 size_t len = __left_->list_len();
8042 size_t off = 0;
8043 if (len != 0)
8044 {
8045 if (__left_->is_sub() || len == 1)
8046 off = __left_->size();
8047 else
8048 {
8049 __node* top = __left_;
8050 __node* bottom = top;
8051 while (!bottom->__left_->is_sub())
8052 bottom = bottom->__left_;
8053 __node* sub = bottom->__left_;
8054 __node* i = sub->__left_;
8055 bool first = true;
8056 top->reset_cached_size();
8057 while (i)
8058 {
8059 if (!first)
8060 off += 2;
8061 bottom->__left_ = i->__left_;
8062 off += top->size();
8063 top->reset_cached_size();
8064 i = i->__right_;
8065 first = false;
8066 }
8067 bottom->__left_ = sub;
8068 }
8069 }
8070 const_cast<long&>(__cached_size_) = off;
8071 }
8072 return __cached_size_;
8073 }
8074 virtual char* first_demangled_name(char* buf) const
8075 {
8076 size_t len = __left_->list_len();
8077 if (len != 0)
8078 {
8079 if (__left_->is_sub() || len == 1)
8080 buf = __left_->get_demangled_name(buf);
8081 else
8082 {
8083 __node* top = __left_;
8084 __node* bottom = top;
8085 while (!bottom->__left_->is_sub())
8086 bottom = bottom->__left_;
8087 __node* sub = bottom->__left_;
8088 __node* i = sub->__left_;
8089 bool first = true;
8090 top->reset_cached_size();
8091 while (i)
8092 {
8093 if (!first)
8094 {
8095 *buf++ = ',';
8096 *buf++ = ' ';
8097 }
8098 bottom->__left_ = i->__left_;
8099 buf = top->get_demangled_name(buf);
8100 top->reset_cached_size();
8101 i = i->__right_;
8102 first = false;
8103 }
8104 bottom->__left_ = sub;
8105 }
8106 }
8107 return buf;
8108 }
8109 virtual ptrdiff_t print_first(char* f, char* l) const
8110 {
8111 const ptrdiff_t r = l - f;
8112 const ptrdiff_t len = __left_->list_len();
8113 ptrdiff_t sz = 0;
8114 if (len != 0)
8115 {
8116 if (__left_->is_sub() || len == 1)
8117 sz = __left_->print(f, l);
8118 else
8119 {
8120 __node* top = __left_;
8121 __node* bottom = top;
8122 while (!bottom->__left_->is_sub())
8123 bottom = bottom->__left_;
8124 __node* sub = bottom->__left_;
8125 __node* i = sub->__left_;
8126 bool first = true;
8127 while (i)
8128 {
8129 if (!first)
8130 {
8131 if (r >= sz+2)
8132 {
8133 f[sz] = ',';
8134 f[sz+1] = ' ';
8135 }
8136 sz += 2;
8137 }
8138 bottom->__left_ = i->__left_;
8139 sz += top->print(f+std::min(sz, r), l);
8140 i = i->__right_;
8141 first = false;
8142 }
8143 bottom->__left_ = sub;
8144 }
8145 }
8146 return sz;
8147 }
8148 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
8149 {
8150 return __left_->fix_forward_references(t_begin, t_end);
8151 }
8152};
8153
8154class __void
8155 : public __node
8156{
8157 static const size_t n = sizeof("void") - 1;
8158public:
8159
8160 virtual size_t first_size() const {return n;}
8161 virtual char* first_demangled_name(char* buf) const
8162 {
8163 strncpy(buf, "void", n);
8164 return buf + n;
8165 }
8166 virtual ptrdiff_t print_first(char* f, char* l) const
8167 {
8168 const ptrdiff_t r = l - f;
8169 if (r >= n)
8170 {
8171 *f++ = 'v';
8172 *f++ = 'o';
8173 *f++ = 'i';
8174 *f = 'd';
8175 }
8176 return n;
8177 }
8178};
8179
8180class __wchar_t
8181 : public __node
8182{
8183 static const size_t n = sizeof("wchar_t") - 1;
8184public:
8185
8186 virtual size_t first_size() const {return n;}
8187 virtual char* first_demangled_name(char* buf) const
8188 {
8189 strncpy(buf, "wchar_t", n);
8190 return buf + n;
8191 }
8192 virtual ptrdiff_t print_first(char* f, char* l) const
8193 {
8194 const ptrdiff_t r = l - f;
8195 if (r >= n)
8196 {
8197 *f++ = 'w';
8198 *f++ = 'c';
8199 *f++ = 'h';
8200 *f++ = 'a';
8201 *f++ = 'r';
8202 *f++ = '_';
8203 *f = 't';
8204 }
8205 return n;
8206 }
8207};
8208
8209class __wchar_t_literal
8210 : public __node
8211{
8212public:
8213 explicit __wchar_t_literal(const char* __first, const char* __last)
8214 {
8215 __name_ = __first;
8216 __size_ = __last - __first;
8217 }
8218
8219 virtual size_t first_size() const
8220 {
8221 return __size_+9;
8222 }
8223 virtual char* first_demangled_name(char* buf) const
8224 {
8225 strncpy(buf, "(wchar_t)", 9);
8226 buf += 9;
8227 strncpy(buf, __name_, __size_);
8228 return buf + __size_;
8229 }
8230 virtual ptrdiff_t print_first(char* f, char* l) const
8231 {
8232 const ptrdiff_t r = l - f;
8233 const ptrdiff_t n = sizeof("(wchar_t)") - 1;
8234 if (r >= n + __size_)
8235 {
8236 *f++ = '(';
8237 *f++ = 'w';
8238 *f++ = 'c';
8239 *f++ = 'h';
8240 *f++ = 'a';
8241 *f++ = 'r';
8242 *f++ = '_';
8243 *f++ = 't';
8244 *f++ = ')';
8245 strncpy(f, __name_, __size_);
8246 }
8247 return n + __size_;
8248 }
8249};
8250
8251class __bool
8252 : public __node
8253{
8254 static const size_t n = sizeof("bool") - 1;
8255public:
8256
8257 virtual size_t first_size() const {return n;}
8258 virtual char* first_demangled_name(char* buf) const
8259 {
8260 strncpy(buf, "bool", n);
8261 return buf + n;
8262 }
8263 virtual ptrdiff_t print_first(char* f, char* l) const
8264 {
8265 const ptrdiff_t r = l - f;
8266 if (r >= n)
8267 {
8268 *f++ = 'b';
8269 *f++ = 'o';
8270 *f++ = 'o';
8271 *f = 'l';
8272 }
8273 return n;
8274 }
8275};
8276
8277class __bool_literal
8278 : public __node
8279{
8280public:
8281 explicit __bool_literal(const char* __name, unsigned __size)
8282 {
8283 __name_ = __name;
8284 __size_ = __size;
8285 }
8286
8287 virtual size_t first_size() const
8288 {
8289 return __size_;
8290 }
8291 virtual char* first_demangled_name(char* buf) const
8292 {
8293 strncpy(buf, __name_, __size_);
8294 return buf + __size_;
8295 }
8296 virtual ptrdiff_t print_first(char* f, char* l) const
8297 {
8298 const ptrdiff_t r = l - f;
8299 if (r >= __size_)
8300 strncpy(f, __name_, __size_);
8301 return __size_;
8302 }
8303};
8304
8305class __char
8306 : public __node
8307{
8308 static const size_t n = sizeof("char") - 1;
8309public:
8310
8311 virtual size_t first_size() const {return n;}
8312 virtual char* first_demangled_name(char* buf) const
8313 {
8314 strncpy(buf, "char", n);
8315 return buf + n;
8316 }
8317 virtual ptrdiff_t print_first(char* f, char* l) const
8318 {
8319 const ptrdiff_t r = l - f;
8320 if (r >= n)
8321 {
8322 *f++ = 'c';
8323 *f++ = 'h';
8324 *f++ = 'a';
8325 *f = 'r';
8326 }
8327 return n;
8328 }
8329};
8330
8331class __char_literal
8332 : public __node
8333{
8334public:
8335 explicit __char_literal(const char* __first, const char* __last)
8336 {
8337 __name_ = __first;
8338 __size_ = __last - __first;
8339 }
8340
8341 virtual size_t first_size() const
8342 {
8343 return __size_+6;
8344 }
8345 virtual char* first_demangled_name(char* buf) const
8346 {
8347 strncpy(buf, "(char)", 6);
8348 buf += 6;
8349 if (*__name_ == 'n')
8350 {
8351 *buf++ = '-'; // strncpy(buf+6, "-", 1);
8352 strncpy(buf, __name_+1, __size_-1);
8353 buf += __size_ - 1;
8354 }
8355 else
8356 {
8357 strncpy(buf, __name_, __size_);
8358 buf += __size_;
8359 }
8360 return buf;
8361 }
8362 virtual ptrdiff_t print_first(char* f, char* l) const
8363 {
8364 const ptrdiff_t r = l - f;
8365 const ptrdiff_t n = sizeof("(char)") - 1;
8366 if (r >= __size_ + n)
8367 {
8368 *f++ = '(';
8369 *f++ = 'c';
8370 *f++ = 'h';
8371 *f++ = 'a';
8372 *f++ = 'r';
8373 *f++ = ')';
8374 if (*__name_ == 'n')
8375 {
8376 *f++ = '-';
8377 strncpy(f, __name_+1, __size_-1);
8378 }
8379 else
8380 strncpy(f, __name_, __size_);
8381 }
8382 return __size_ + n;
8383 }
8384};
8385
8386class __signed_char
8387 : public __node
8388{
8389 static const size_t n = sizeof("signed char") - 1;
8390public:
8391
8392 virtual size_t first_size() const {return n;}
8393 virtual char* first_demangled_name(char* buf) const
8394 {
8395 strncpy(buf, "signed char", n);
8396 return buf + n;
8397 }
8398 virtual ptrdiff_t print_first(char* f, char* l) const
8399 {
8400 const ptrdiff_t r = l - f;
8401 if (r >= n)
8402 {
8403 *f++ = 's';
8404 *f++ = 'i';
8405 *f++ = 'g';
8406 *f++ = 'n';
8407 *f++ = 'e';
8408 *f++ = 'd';
8409 *f++ = ' ';
8410 *f++ = 'c';
8411 *f++ = 'h';
8412 *f++ = 'a';
8413 *f = 'r';
8414 }
8415 return n;
8416 }
8417};
8418
8419class __signed_char_literal
8420 : public __node
8421{
8422public:
8423 explicit __signed_char_literal(const char* __first, const char* __last)
8424 {
8425 __name_ = __first;
8426 __size_ = __last - __first;
8427 }
8428
8429 virtual size_t first_size() const
8430 {
8431 return __size_+13;
8432 }
8433 virtual char* first_demangled_name(char* buf) const
8434 {
8435 strncpy(buf, "(signed char)", 13);
8436 buf += 13;
8437 if (*__name_ == 'n')
8438 {
8439 *buf++ = '-';
8440 strncpy(buf, __name_+1, __size_-1);
8441 buf += __size_ - 1;
8442 }
8443 else
8444 {
8445 strncpy(buf, __name_, __size_);
8446 buf += __size_;
8447 }
8448 return buf;
8449 }
8450 virtual ptrdiff_t print_first(char* f, char* l) const
8451 {
8452 const ptrdiff_t r = l - f;
8453 const ptrdiff_t n = sizeof("(signed char)") - 1;
8454 if (r >= __size_ + n)
8455 {
8456 *f++ = '(';
8457 *f++ = 's';
8458 *f++ = 'i';
8459 *f++ = 'g';
8460 *f++ = 'n';
8461 *f++ = 'e';
8462 *f++ = 'd';
8463 *f++ = ' ';
8464 *f++ = 'c';
8465 *f++ = 'h';
8466 *f++ = 'a';
8467 *f++ = 'r';
8468 *f++ = ')';
8469 if (*__name_ == 'n')
8470 {
8471 *f++ = '-';
8472 strncpy(f, __name_+1, __size_-1);
8473 }
8474 else
8475 strncpy(f, __name_, __size_);
8476 }
8477 return __size_ + n;
8478 }
8479};
8480
8481class __unsigned_char
8482 : public __node
8483{
8484 static const size_t n = sizeof("unsigned char") - 1;
8485public:
8486
8487 virtual size_t first_size() const {return n;}
8488 virtual char* first_demangled_name(char* buf) const
8489 {
8490 strncpy(buf, "unsigned char", n);
8491 return buf + n;
8492 }
8493 virtual ptrdiff_t print_first(char* f, char* l) const
8494 {
8495 const ptrdiff_t r = l - f;
8496 if (r >= n)
8497 {
8498 *f++ = 'u';
8499 *f++ = 'n';
8500 *f++ = 's';
8501 *f++ = 'i';
8502 *f++ = 'g';
8503 *f++ = 'n';
8504 *f++ = 'e';
8505 *f++ = 'd';
8506 *f++ = ' ';
8507 *f++ = 'c';
8508 *f++ = 'h';
8509 *f++ = 'a';
8510 *f = 'r';
8511 }
8512 return n;
8513 }
8514};
8515
8516class __unsigned_char_literal
8517 : public __node
8518{
8519public:
8520 explicit __unsigned_char_literal(const char* __first, const char* __last)
8521 {
8522 __name_ = __first;
8523 __size_ = __last - __first;
8524 }
8525
8526 virtual size_t first_size() const
8527 {
8528 return __size_+15;
8529 }
8530 virtual char* first_demangled_name(char* buf) const
8531 {
8532 strncpy(buf, "(unsigned char)", 15);
8533 buf += 15;
8534 strncpy(buf, __name_, __size_);
8535 return buf + __size_;
8536 }
8537 virtual ptrdiff_t print_first(char* f, char* l) const
8538 {
8539 const ptrdiff_t r = l - f;
8540 const ptrdiff_t n = sizeof("(unsigned char)") - 1;
8541 if (r >= __size_ + n)
8542 {
8543 *f++ = '(';
8544 *f++ = 'u';
8545 *f++ = 'n';
8546 *f++ = 's';
8547 *f++ = 'i';
8548 *f++ = 'g';
8549 *f++ = 'n';
8550 *f++ = 'e';
8551 *f++ = 'd';
8552 *f++ = ' ';
8553 *f++ = 'c';
8554 *f++ = 'h';
8555 *f++ = 'a';
8556 *f++ = 'r';
8557 *f++ = ')';
8558 strncpy(f, __name_, __size_);
8559 }
8560 return __size_ + n;
8561 }
8562};
8563
8564class __short
8565 : public __node
8566{
8567 static const size_t n = sizeof("short") - 1;
8568public:
8569
8570 virtual size_t first_size() const {return n;}
8571 virtual char* first_demangled_name(char* buf) const
8572 {
8573 strncpy(buf, "short", n);
8574 return buf + n;
8575 }
8576 virtual ptrdiff_t print_first(char* f, char* l) const
8577 {
8578 const ptrdiff_t r = l - f;
8579 if (r >= n)
8580 {
8581 *f++ = 's';
8582 *f++ = 'h';
8583 *f++ = 'o';
8584 *f++ = 'r';
8585 *f = 't';
8586 }
8587 return n;
8588 }
8589};
8590
8591class __short_literal
8592 : public __node
8593{
8594public:
8595 explicit __short_literal(const char* __first, const char* __last)
8596 {
8597 __name_ = __first;
8598 __size_ = __last - __first;
8599 }
8600
8601 virtual size_t first_size() const
8602 {
8603 return __size_+7;
8604 }
8605 virtual char* first_demangled_name(char* buf) const
8606 {
8607 strncpy(buf, "(short)", 7);
8608 buf += 7;
8609 if (*__name_ == 'n')
8610 {
8611 *buf++ = '-';
8612 strncpy(buf, __name_+1, __size_-1);
8613 buf += __size_ - 1;
8614 }
8615 else
8616 {
8617 strncpy(buf, __name_, __size_);
8618 buf += __size_;
8619 }
8620 return buf;
8621 }
8622 virtual ptrdiff_t print_first(char* f, char* l) const
8623 {
8624 const ptrdiff_t r = l - f;
8625 const ptrdiff_t n = sizeof("(short)") - 1;
8626 if (r >= __size_ + n)
8627 {
8628 *f++ = '(';
8629 *f++ = 's';
8630 *f++ = 'h';
8631 *f++ = 'o';
8632 *f++ = 'r';
8633 *f++ = 't';
8634 *f++ = ')';
8635 if (*__name_ == 'n')
8636 {
8637 *f++ = '-';
8638 strncpy(f, __name_+1, __size_-1);
8639 }
8640 else
8641 strncpy(f, __name_, __size_);
8642 }
8643 return __size_ + n;
8644 }
8645};
8646
8647class __unsigned_short
8648 : public __node
8649{
8650 static const size_t n = sizeof("unsigned short") - 1;
8651public:
8652
8653 virtual size_t first_size() const {return n;}
8654 virtual char* first_demangled_name(char* buf) const
8655 {
8656 strncpy(buf, "unsigned short", n);
8657 return buf + n;
8658 }
8659 virtual ptrdiff_t print_first(char* f, char* l) const
8660 {
8661 const ptrdiff_t r = l - f;
8662 if (r >= n)
8663 {
8664 *f++ = 'u';
8665 *f++ = 'n';
8666 *f++ = 's';
8667 *f++ = 'i';
8668 *f++ = 'g';
8669 *f++ = 'n';
8670 *f++ = 'e';
8671 *f++ = 'd';
8672 *f++ = ' ';
8673 *f++ = 's';
8674 *f++ = 'h';
8675 *f++ = 'o';
8676 *f++ = 'r';
8677 *f = 't';
8678 }
8679 return n;
8680 }
8681};
8682
8683class __unsigned_short_literal
8684 : public __node
8685{
8686public:
8687 explicit __unsigned_short_literal(const char* __first, const char* __last)
8688 {
8689 __name_ = __first;
8690 __size_ = __last - __first;
8691 }
8692
8693 virtual size_t first_size() const
8694 {
8695 return __size_+16;
8696 }
8697 virtual char* first_demangled_name(char* buf) const
8698 {
8699 strncpy(buf, "(unsigned short)", 16);
8700 buf += 16;
8701 strncpy(buf, __name_, __size_);
8702 return buf + __size_;
8703 }
8704 virtual ptrdiff_t print_first(char* f, char* l) const
8705 {
8706 const ptrdiff_t r = l - f;
8707 const ptrdiff_t n = sizeof("(unsigned short)") - 1;
8708 if (r >= __size_ + n)
8709 {
8710 *f++ = '(';
8711 *f++ = 'u';
8712 *f++ = 'n';
8713 *f++ = 's';
8714 *f++ = 'i';
8715 *f++ = 'g';
8716 *f++ = 'n';
8717 *f++ = 'e';
8718 *f++ = 'd';
8719 *f++ = ' ';
8720 *f++ = 's';
8721 *f++ = 'h';
8722 *f++ = 'o';
8723 *f++ = 'r';
8724 *f++ = 't';
8725 *f++ = ')';
8726 strncpy(f, __name_, __size_);
8727 }
8728 return __size_ + n;
8729 }
8730};
8731
8732class __int
8733 : public __node
8734{
8735 static const size_t n = sizeof("int") - 1;
8736public:
8737
8738 virtual size_t first_size() const {return n;}
8739 virtual char* first_demangled_name(char* buf) const
8740 {
8741 *buf++ = 'i';
8742 *buf++ = 'n';
8743 *buf++ = 't';
8744 return buf;
8745 }
8746 virtual ptrdiff_t print_first(char* f, char* l) const
8747 {
8748 const ptrdiff_t r = l - f;
8749 if (r >= n)
8750 {
8751 *f++ = 'i';
8752 *f++ = 'n';
8753 *f = 't';
8754 }
8755 return n;
8756 }
8757};
8758
8759class __int_literal
8760 : public __node
8761{
8762public:
8763 explicit __int_literal(const char* __first, const char* __last)
8764 {
8765 __name_ = __first;
8766 __size_ = __last - __first;
8767 }
8768
8769 virtual size_t first_size() const
8770 {
8771 return __size_;
8772 }
8773 virtual char* first_demangled_name(char* buf) const
8774 {
8775 if (*__name_ == 'n')
8776 {
8777 *buf++ = '-';
8778 strncpy(buf, __name_+1, __size_-1);
8779 buf += __size_ - 1;
8780 }
8781 else
8782 {
8783 strncpy(buf, __name_, __size_);
8784 buf += __size_;
8785 }
8786 return buf;
8787 }
8788 virtual ptrdiff_t print_first(char* f, char* l) const
8789 {
8790 const ptrdiff_t r = l - f;
8791 if (r >= __size_)
8792 {
8793 if (*__name_ == 'n')
8794 {
8795 *f++ = '-';
8796 strncpy(f, __name_+1, __size_-1);
8797 }
8798 else
8799 strncpy(f, __name_, __size_);
8800 }
8801 return __size_;
8802 }
8803};
8804
8805class __unsigned_int
8806 : public __node
8807{
8808 static const size_t n = sizeof("unsigned int") - 1;
8809public:
8810
8811 virtual size_t first_size() const {return n;}
8812 virtual char* first_demangled_name(char* buf) const
8813 {
8814 strncpy(buf, "unsigned int", n);
8815 return buf + n;
8816 }
8817 virtual ptrdiff_t print_first(char* f, char* l) const
8818 {
8819 const ptrdiff_t r = l - f;
8820 if (r >= n)
8821 {
8822 *f++ = 'u';
8823 *f++ = 'n';
8824 *f++ = 's';
8825 *f++ = 'i';
8826 *f++ = 'g';
8827 *f++ = 'n';
8828 *f++ = 'e';
8829 *f++ = 'd';
8830 *f++ = ' ';
8831 *f++ = 'i';
8832 *f++ = 'n';
8833 *f = 't';
8834 }
8835 return n;
8836 }
8837};
8838
8839class __unsigned_int_literal
8840 : public __node
8841{
8842public:
8843 explicit __unsigned_int_literal(const char* __first, const char* __last)
8844 {
8845 __name_ = __first;
8846 __size_ = __last - __first;
8847 }
8848
8849 virtual size_t first_size() const
8850 {
8851 return __size_+1;
8852 }
8853 virtual char* first_demangled_name(char* buf) const
8854 {
8855 strncpy(buf, __name_, __size_);
8856 buf += __size_;
8857 *buf++ = 'u';
8858 return buf;
8859 }
8860 virtual ptrdiff_t print_first(char* f, char* l) const
8861 {
8862 const ptrdiff_t r = l - f;
8863 const ptrdiff_t n = sizeof("u") - 1;
8864 if (r >= __size_ + n)
8865 {
8866 strncpy(f, __name_, __size_);
8867 f[__size_] = 'u';
8868 }
8869 return __size_ + n;
8870 }
8871};
8872
8873class __long
8874 : public __node
8875{
8876 static const size_t n = sizeof("long") - 1;
8877public:
8878
8879 virtual size_t first_size() const {return n;}
8880 virtual char* first_demangled_name(char* buf) const
8881 {
8882 strncpy(buf, "long", n);
8883 return buf + n;
8884 }
8885 virtual ptrdiff_t print_first(char* f, char* l) const
8886 {
8887 const ptrdiff_t r = l - f;
8888 if (r >= n)
8889 {
8890 *f++ = 'l';
8891 *f++ = 'o';
8892 *f++ = 'n';
8893 *f = 'g';
8894 }
8895 return n;
8896 }
8897};
8898
8899class __long_literal
8900 : public __node
8901{
8902public:
8903 explicit __long_literal(const char* __first, const char* __last)
8904 {
8905 __name_ = __first;
8906 __size_ = __last - __first;
8907 }
8908
8909 virtual size_t first_size() const
8910 {
8911 return __size_+1;
8912 }
8913 virtual char* first_demangled_name(char* buf) const
8914 {
8915 if (*__name_ == 'n')
8916 {
8917 *buf++ = '-'; // strncpy(buf, "-", 1);
8918 strncpy(buf, __name_+1, __size_-1);
8919 buf += __size_ - 1;
8920 }
8921 else
8922 {
8923 strncpy(buf, __name_, __size_);
8924 buf += __size_;
8925 }
8926 *buf++ = 'l';
8927 return buf;
8928 }
8929 virtual ptrdiff_t print_first(char* f, char* l) const
8930 {
8931 const ptrdiff_t r = l - f;
8932 const ptrdiff_t n = sizeof("l") - 1;
8933 if (r >= __size_ + n)
8934 {
8935 if (*__name_ == 'n')
8936 {
8937 *f++ = '-';
8938 strncpy(f, __name_+1, __size_-1);
8939 f += __size_-1;
8940 }
8941 else
8942 {
8943 strncpy(f, __name_, __size_);
8944 f += __size_;
8945 }
8946 *f = 'l';
8947 }
8948 return __size_ + n;
8949 }
8950};
8951
8952class __unsigned_long
8953 : public __node
8954{
8955 static const size_t n = sizeof("unsigned long") - 1;
8956public:
8957
8958 virtual size_t first_size() const {return n;}
8959 virtual char* first_demangled_name(char* buf) const
8960 {
8961 strncpy(buf, "unsigned long", n);
8962 return buf + n;
8963 }
8964 virtual ptrdiff_t print_first(char* f, char* l) const
8965 {
8966 const ptrdiff_t r = l - f;
8967 if (r >= n)
8968 {
8969 *f++ = 'u';
8970 *f++ = 'n';
8971 *f++ = 's';
8972 *f++ = 'i';
8973 *f++ = 'g';
8974 *f++ = 'n';
8975 *f++ = 'e';
8976 *f++ = 'd';
8977 *f++ = ' ';
8978 *f++ = 'l';
8979 *f++ = 'o';
8980 *f++ = 'n';
8981 *f = 'g';
8982 }
8983 return n;
8984 }
8985};
8986
8987class __unsigned_long_literal
8988 : public __node
8989{
8990public:
8991 explicit __unsigned_long_literal(const char* __first, const char* __last)
8992 {
8993 __name_ = __first;
8994 __size_ = __last - __first;
8995 }
8996
8997 virtual size_t first_size() const
8998 {
8999 return __size_+2;
9000 }
9001 virtual char* first_demangled_name(char* buf) const
9002 {
9003 strncpy(buf, __name_, __size_);
9004 buf += __size_;
9005 *buf++ = 'u';
9006 *buf++ = 'l';
9007 return buf;
9008 }
9009 virtual ptrdiff_t print_first(char* f, char* l) const
9010 {
9011 const ptrdiff_t r = l - f;
9012 const ptrdiff_t n = sizeof("ul") - 1;
9013 if (r >= __size_ + n)
9014 {
9015 strncpy(f, __name_, __size_);
9016 f += __size_;
9017 *f++ = 'u';
9018 *f = 'l';
9019 }
9020 return __size_ + n;
9021 }
9022};
9023
9024class __long_long
9025 : public __node
9026{
9027 static const size_t n = sizeof("long long") - 1;
9028public:
9029
9030 virtual size_t first_size() const {return n;}
9031 virtual char* first_demangled_name(char* buf) const
9032 {
9033 strncpy(buf, "long long", n);
9034 return buf + n;
9035 }
9036 virtual ptrdiff_t print_first(char* f, char* l) const
9037 {
9038 const ptrdiff_t r = l - f;
9039 if (r >= n)
9040 {
9041 *f++ = 'l';
9042 *f++ = 'o';
9043 *f++ = 'n';
9044 *f++ = 'g';
9045 *f++ = ' ';
9046 *f++ = 'l';
9047 *f++ = 'o';
9048 *f++ = 'n';
9049 *f = 'g';
9050 }
9051 return n;
9052 }
9053};
9054
9055class __long_long_literal
9056 : public __node
9057{
9058public:
9059 explicit __long_long_literal(const char* __first, const char* __last)
9060 {
9061 __name_ = __first;
9062 __size_ = __last - __first;
9063 }
9064
9065 virtual size_t first_size() const
9066 {
9067 return __size_+2;
9068 }
9069 virtual char* first_demangled_name(char* buf) const
9070 {
9071 if (*__name_ == 'n')
9072 {
9073 *buf++ = '-';
9074 strncpy(buf, __name_+1, __size_-1);
9075 buf += __size_ - 1;
9076 }
9077 else
9078 {
9079 strncpy(buf, __name_, __size_);
9080 buf += __size_;
9081 }
9082 *buf++ = 'l';
9083 *buf++ = 'l';
9084 return buf;
9085 }
9086 virtual ptrdiff_t print_first(char* f, char* l) const
9087 {
9088 const ptrdiff_t r = l - f;
9089 const ptrdiff_t n = sizeof("ll") - 1;
9090 if (r >= __size_ + n)
9091 {
9092 if (*__name_ == 'n')
9093 {
9094 *f++ = '-';
9095 strncpy(f, __name_+1, __size_-1);
9096 f += __size_-1;
9097 }
9098 else
9099 {
9100 strncpy(f, __name_, __size_);
9101 f += __size_;
9102 }
9103 *f++ = 'l';
9104 *f = 'l';
9105 }
9106 return __size_ + n;
9107 }
9108};
9109
9110class __unsigned_long_long
9111 : public __node
9112{
9113 static const size_t n = sizeof("unsigned long long") - 1;
9114public:
9115
9116 virtual size_t first_size() const {return n;}
9117 virtual char* first_demangled_name(char* buf) const
9118 {
9119 strncpy(buf, "unsigned long long", n);
9120 return buf + n;
9121 }
9122 virtual ptrdiff_t print_first(char* f, char* l) const
9123 {
9124 const ptrdiff_t r = l - f;
9125 if (r >= n)
9126 {
9127 *f++ = 'u';
9128 *f++ = 'n';
9129 *f++ = 's';
9130 *f++ = 'i';
9131 *f++ = 'g';
9132 *f++ = 'n';
9133 *f++ = 'e';
9134 *f++ = 'd';
9135 *f++ = ' ';
9136 *f++ = 'l';
9137 *f++ = 'o';
9138 *f++ = 'n';
9139 *f++ = 'g';
9140 *f++ = ' ';
9141 *f++ = 'l';
9142 *f++ = 'o';
9143 *f++ = 'n';
9144 *f = 'g';
9145 }
9146 return n;
9147 }
9148};
9149
9150class __unsigned_long_long_literal
9151 : public __node
9152{
9153public:
9154 explicit __unsigned_long_long_literal(const char* __first, const char* __last)
9155 {
9156 __name_ = __first;
9157 __size_ = __last - __first;
9158 }
9159
9160 virtual size_t first_size() const
9161 {
9162 return __size_+3;
9163 }
9164 virtual char* first_demangled_name(char* buf) const
9165 {
9166 strncpy(buf, __name_, __size_);
9167 buf += __size_;
9168 *buf++ = 'u';
9169 *buf++ = 'l';
9170 *buf++ = 'l';
9171 return buf;
9172 }
9173 virtual ptrdiff_t print_first(char* f, char* l) const
9174 {
9175 const ptrdiff_t r = l - f;
9176 const ptrdiff_t n = sizeof("ull") - 1;
9177 if (r >= __size_ + n)
9178 {
9179 strncpy(f, __name_, __size_);
9180 f += __size_;
9181 *f++ = 'u';
9182 *f++ = 'l';
9183 *f = 'l';
9184 }
9185 return __size_ + n;
9186 }
9187};
9188
9189class __int128
9190 : public __node
9191{
9192 static const size_t n = sizeof("__int128") - 1;
9193public:
9194
9195 virtual size_t first_size() const {return n;}
9196 virtual char* first_demangled_name(char* buf) const
9197 {
9198 strncpy(buf, "__int128", n);
9199 return buf + n;
9200 }
9201 virtual ptrdiff_t print_first(char* f, char* l) const
9202 {
9203 const ptrdiff_t r = l - f;
9204 if (r >= n)
9205 {
9206 *f++ = '_';
9207 *f++ = '_';
9208 *f++ = 'i';
9209 *f++ = 'n';
9210 *f++ = 't';
9211 *f++ = '1';
9212 *f++ = '2';
9213 *f = '8';
9214 }
9215 return n;
9216 }
9217};
9218
9219class __int128_literal
9220 : public __node
9221{
9222public:
9223 explicit __int128_literal(const char* __first, const char* __last)
9224 {
9225 __name_ = __first;
9226 __size_ = __last - __first;
9227 }
9228
9229 virtual size_t first_size() const
9230 {
9231 return __size_+10;
9232 }
9233 virtual char* first_demangled_name(char* buf) const
9234 {
9235 strncpy(buf, "(__int128)", 10);
9236 buf += 10;
9237 if (*__name_ == 'n')
9238 {
9239 *buf++ = '-';
9240 strncpy(buf, __name_+1, __size_-1);
9241 buf += __size_ - 1;
9242 }
9243 else
9244 {
9245 strncpy(buf, __name_, __size_);
9246 buf += __size_;
9247 }
9248 return buf;
9249 }
9250 virtual ptrdiff_t print_first(char* f, char* l) const
9251 {
9252 const ptrdiff_t r = l - f;
9253 const ptrdiff_t n = sizeof("(__int128)") - 1;
9254 if (r >= __size_ + n)
9255 {
9256 *f++ = '(';
9257 *f++ = '_';
9258 *f++ = '_';
9259 *f++ = 'i';
9260 *f++ = 'n';
9261 *f++ = 't';
9262 *f++ = '1';
9263 *f++ = '2';
9264 *f++ = '8';
9265 *f = ')';
9266 if (*__name_ == 'n')
9267 {
9268 *f++ = '-';
9269 strncpy(f, __name_+1, __size_-1);
9270 }
9271 else
9272 strncpy(f, __name_, __size_);
9273 }
9274 return __size_ + n;
9275 }
9276};
9277
9278class __unsigned_int128
9279 : public __node
9280{
9281 static const size_t n = sizeof("unsigned __int128") - 1;
9282public:
9283
9284 virtual size_t first_size() const {return n;}
9285 virtual char* first_demangled_name(char* buf) const
9286 {
9287 strncpy(buf, "unsigned __int128", n);
9288 return buf + n;
9289 }
9290 virtual ptrdiff_t print_first(char* f, char* l) const
9291 {
9292 const ptrdiff_t r = l - f;
9293 if (r >= n)
9294 {
9295 *f++ = 'u';
9296 *f++ = 'n';
9297 *f++ = 's';
9298 *f++ = 'i';
9299 *f++ = 'g';
9300 *f++ = 'n';
9301 *f++ = 'e';
9302 *f++ = 'd';
9303 *f++ = ' ';
9304 *f++ = '_';
9305 *f++ = '_';
9306 *f++ = 'i';
9307 *f++ = 'n';
9308 *f++ = 't';
9309 *f++ = '1';
9310 *f++ = '2';
9311 *f = '8';
9312 }
9313 return n;
9314 }
9315};
9316
9317class __unsigned_int128_literal
9318 : public __node
9319{
9320public:
9321 explicit __unsigned_int128_literal(const char* __first, const char* __last)
9322 {
9323 __name_ = __first;
9324 __size_ = __last - __first;
9325 }
9326
9327 virtual size_t first_size() const
9328 {
9329 return __size_+19;
9330 }
9331 virtual char* first_demangled_name(char* buf) const
9332 {
9333 strncpy(buf, "(unsigned __int128)", 19);
9334 buf += 19;
9335 strncpy(buf, __name_, __size_);
9336 return buf + __size_;
9337 }
9338 virtual ptrdiff_t print_first(char* f, char* l) const
9339 {
9340 const ptrdiff_t r = l - f;
9341 const ptrdiff_t n = sizeof("(unsigned __int128)") - 1;
9342 if (r >= __size_ + n)
9343 {
9344 *f++ = '(';
9345 *f++ = 'u';
9346 *f++ = 'n';
9347 *f++ = 's';
9348 *f++ = 'i';
9349 *f++ = 'g';
9350 *f++ = 'n';
9351 *f++ = 'e';
9352 *f++ = 'd';
9353 *f++ = ' ';
9354 *f++ = '_';
9355 *f++ = '_';
9356 *f++ = 'i';
9357 *f++ = 'n';
9358 *f++ = 't';
9359 *f++ = '1';
9360 *f++ = '2';
9361 *f++ = '8';
9362 *f = ')';
9363 strncpy(f, __name_, __size_);
9364 }
9365 return __size_ + n;
9366 }
9367};
9368
9369class __float_literal
9370 : public __node
9371{
9372public:
9373 explicit __float_literal(float value)
9374 {
9375 __value_ = value;
9376 }
9377
9378 virtual size_t first_size() const
9379 {
9380 if (__cached_size_ == -1)
9381 {
9382 char num[20] = {0};
9383 float v = static_cast<float>(__value_);
9384 const_cast<long&>(__cached_size_) = sprintf(num, "%a", v)+1;
9385 }
9386 return __cached_size_;
9387 }
9388 virtual char* first_demangled_name(char* buf) const
9389 {
9390 char num[20] = {0};
9391 float v = static_cast<float>(__value_);
9392 int n = sprintf(num, "%a", v);
9393 strncpy(buf, num, n);
9394 buf += n;
9395 *buf++ = 'f';
9396 return buf;
9397 }
9398 virtual ptrdiff_t print_first(char* f, char* l) const
9399 {
9400 const ptrdiff_t r = l - f;
9401 char num[20] = {0};
9402 float v = static_cast<float>(__value_);
9403 ptrdiff_t n = sprintf(num, "%a", v);
9404 if (r >= n+1)
9405 {
9406 strncpy(f, num, n);
9407 f[n] = 'f';
9408 }
9409 ++n;
9410 return n;
9411 }
9412};
9413
9414class __float
9415 : public __node
9416{
9417 static const size_t n = sizeof("float") - 1;
9418public:
9419
9420 virtual size_t first_size() const {return n;}
9421 virtual char* first_demangled_name(char* buf) const
9422 {
9423 strncpy(buf, "float", n);
9424 return buf + n;
9425 }
9426 virtual ptrdiff_t print_first(char* f, char* l) const
9427 {
9428 const ptrdiff_t r = l - f;
9429 if (r >= n)
9430 {
9431 *f++ = 'f';
9432 *f++ = 'l';
9433 *f++ = 'o';
9434 *f++ = 'a';
9435 *f = 't';
9436 }
9437 return n;
9438 }
9439};
9440
9441class __double_literal
9442 : public __node
9443{
9444public:
9445 explicit __double_literal(double value)
9446 {
9447 __value_ = value;
9448 }
9449
9450 virtual size_t first_size() const
9451 {
9452 if (__cached_size_ == -1)
9453 {
9454 char num[30] = {0};
9455 double v = static_cast<double>(__value_);
9456 const_cast<long&>(__cached_size_) = sprintf(num, "%a", v);
9457 }
9458 return __cached_size_;
9459 }
9460 virtual char* first_demangled_name(char* buf) const
9461 {
9462 char num[30] = {0};
9463 double v = static_cast<double>(__value_);
9464 int n = sprintf(num, "%a", v);
9465 strncpy(buf, num, n);
9466 return buf + n;
9467 }
9468 virtual ptrdiff_t print_first(char* f, char* l) const
9469 {
9470 const ptrdiff_t r = l - f;
9471 char num[30] = {0};
9472 double v = static_cast<double>(__value_);
9473 const ptrdiff_t n = sprintf(num, "%a", v);
9474 if (r >= n)
9475 strncpy(f, num, n);
9476 return n;
9477 }
9478};
9479
9480class __double
9481 : public __node
9482{
9483 static const size_t n = sizeof("double") - 1;
9484public:
9485
9486 virtual size_t first_size() const {return n;}
9487 virtual char* first_demangled_name(char* buf) const
9488 {
9489 strncpy(buf, "double", n);
9490 return buf + n;
9491 }
9492 virtual ptrdiff_t print_first(char* f, char* l) const
9493 {
9494 const ptrdiff_t r = l - f;
9495 if (r >= n)
9496 {
9497 *f++ = 'd';
9498 *f++ = 'o';
9499 *f++ = 'u';
9500 *f++ = 'b';
9501 *f++ = 'l';
9502 *f = 'e';
9503 }
9504 return n;
9505 }
9506};
9507
9508class __long_double
9509 : public __node
9510{
9511 static const size_t n = sizeof("long double") - 1;
9512public:
9513
9514 virtual size_t first_size() const {return n;}
9515 virtual char* first_demangled_name(char* buf) const
9516 {
9517 strncpy(buf, "long double", n);
9518 return buf + n;
9519 }
9520 virtual ptrdiff_t print_first(char* f, char* l) const
9521 {
9522 const ptrdiff_t r = l - f;
9523 if (r >= n)
9524 {
9525 *f++ = 'l';
9526 *f++ = 'o';
9527 *f++ = 'n';
9528 *f++ = 'g';
9529 *f++ = ' ';
9530 *f++ = 'd';
9531 *f++ = 'o';
9532 *f++ = 'u';
9533 *f++ = 'b';
9534 *f++ = 'l';
9535 *f = 'e';
9536 }
9537 return n;
9538 }
9539};
9540
9541class __float128
9542 : public __node
9543{
9544 static const size_t n = sizeof("__float128") - 1;
9545public:
9546
9547 virtual size_t first_size() const {return n;}
9548 virtual char* first_demangled_name(char* buf) const
9549 {
9550 strncpy(buf, "__float128", n);
9551 return buf + n;
9552 }
9553 virtual ptrdiff_t print_first(char* f, char* l) const
9554 {
9555 const ptrdiff_t r = l - f;
9556 if (r >= n)
9557 {
9558 *f++ = '_';
9559 *f++ = '_';
9560 *f++ = 'f';
9561 *f++ = 'l';
9562 *f++ = 'o';
9563 *f++ = 'a';
9564 *f++ = 't';
9565 *f++ = '1';
9566 *f++ = '2';
9567 *f = '8';
9568 }
9569 return n;
9570 }
9571};
9572
9573class __ellipsis
9574 : public __node
9575{
9576 static const size_t n = sizeof("...") - 1;
9577public:
9578
9579 virtual size_t first_size() const {return n;}
9580 virtual char* first_demangled_name(char* buf) const
9581 {
9582 *buf++ = '.';
9583 *buf++ = '.';
9584 *buf++ = '.';
9585 return buf;
9586 }
9587 virtual ptrdiff_t print_first(char* f, char* l) const
9588 {
9589 const ptrdiff_t r = l - f;
9590 if (r >= n)
9591 {
9592 *f++ = '.';
9593 *f++ = '.';
9594 *f = '.';
9595 }
9596 return n;
9597 }
9598};
9599
9600class __decimal64
9601 : public __node
9602{
9603 static const size_t n = sizeof("decimal64") - 1;
9604public:
9605
9606 virtual size_t first_size() const {return n;}
9607 virtual char* first_demangled_name(char* buf) const
9608 {
9609 strncpy(buf, "decimal64", n);
9610 return buf + n;
9611 }
9612 virtual ptrdiff_t print_first(char* f, char* l) const
9613 {
9614 const ptrdiff_t r = l - f;
9615 if (r >= n)
9616 {
9617 *f++ = 'd';
9618 *f++ = 'e';
9619 *f++ = 'c';
9620 *f++ = 'i';
9621 *f++ = 'm';
9622 *f++ = 'a';
9623 *f++ = 'l';
9624 *f++ = '6';
9625 *f = '4';
9626 }
9627 return n;
9628 }
9629};
9630
9631class __decimal128
9632 : public __node
9633{
9634 static const size_t n = sizeof("decimal128") - 1;
9635public:
9636
9637 virtual size_t first_size() const {return n;}
9638 virtual char* first_demangled_name(char* buf) const
9639 {
9640 strncpy(buf, "decimal128", n);
9641 return buf + n;
9642 }
9643 virtual ptrdiff_t print_first(char* f, char* l) const
9644 {
9645 const ptrdiff_t r = l - f;
9646 if (r >= n)
9647 {
9648 *f++ = 'd';
9649 *f++ = 'e';
9650 *f++ = 'c';
9651 *f++ = 'i';
9652 *f++ = 'm';
9653 *f++ = 'a';
9654 *f++ = 'l';
9655 *f++ = '1';
9656 *f++ = '2';
9657 *f = '8';
9658 }
9659 return n;
9660 }
9661};
9662
9663class __decimal32
9664 : public __node
9665{
9666 static const size_t n = sizeof("decimal32") - 1;
9667public:
9668
9669 virtual size_t first_size() const {return n;}
9670 virtual char* first_demangled_name(char* buf) const
9671 {
9672 strncpy(buf, "decimal32", n);
9673 return buf + n;
9674 }
9675 virtual ptrdiff_t print_first(char* f, char* l) const
9676 {
9677 const ptrdiff_t r = l - f;
9678 if (r >= n)
9679 {
9680 *f++ = 'd';
9681 *f++ = 'e';
9682 *f++ = 'c';
9683 *f++ = 'i';
9684 *f++ = 'm';
9685 *f++ = 'a';
9686 *f++ = 'l';
9687 *f++ = '3';
9688 *f = '2';
9689 }
9690 return n;
9691 }
9692};
9693
9694class __decimal16
9695 : public __node
9696{
9697 static const size_t n = sizeof("decimal16") - 1;
9698public:
9699
9700 virtual size_t first_size() const {return n;}
9701 virtual char* first_demangled_name(char* buf) const
9702 {
9703 strncpy(buf, "decimal16", n);
9704 return buf + n;
9705 }
9706 virtual ptrdiff_t print_first(char* f, char* l) const
9707 {
9708 const ptrdiff_t r = l - f;
9709 if (r >= n)
9710 {
9711 *f++ = 'd';
9712 *f++ = 'e';
9713 *f++ = 'c';
9714 *f++ = 'i';
9715 *f++ = 'm';
9716 *f++ = 'a';
9717 *f++ = 'l';
9718 *f++ = '1';
9719 *f = '6';
9720 }
9721 return n;
9722 }
9723};
9724
9725class __d_char32_t
9726 : public __node
9727{
9728 static const size_t n = sizeof("char32_t") - 1;
9729public:
9730
9731 virtual size_t first_size() const {return n;}
9732 virtual char* first_demangled_name(char* buf) const
9733 {
9734 strncpy(buf, "char32_t", n);
9735 return buf + n;
9736 }
9737 virtual ptrdiff_t print_first(char* f, char* l) const
9738 {
9739 const ptrdiff_t r = l - f;
9740 if (r >= n)
9741 {
9742 *f++ = 'c';
9743 *f++ = 'h';
9744 *f++ = 'a';
9745 *f++ = 'r';
9746 *f++ = '3';
9747 *f++ = '2';
9748 *f++ = '_';
9749 *f = 't';
9750 }
9751 return n;
9752 }
9753};
9754
9755class __d_char16_t
9756 : public __node
9757{
9758 static const size_t n = sizeof("char16_t") - 1;
9759public:
9760
9761 virtual size_t first_size() const {return n;}
9762 virtual char* first_demangled_name(char* buf) const
9763 {
9764 strncpy(buf, "char16_t", n);
9765 return buf + n;
9766 }
9767 virtual ptrdiff_t print_first(char* f, char* l) const
9768 {
9769 const ptrdiff_t r = l - f;
9770 if (r >= n)
9771 {
9772 *f++ = 'c';
9773 *f++ = 'h';
9774 *f++ = 'a';
9775 *f++ = 'r';
9776 *f++ = '1';
9777 *f++ = '6';
9778 *f++ = '_';
9779 *f = 't';
9780 }
9781 return n;
9782 }
9783};
9784
9785class __auto
9786 : public __node
9787{
9788 static const size_t n = sizeof("auto") - 1;
9789public:
9790
9791 virtual size_t first_size() const {return n;}
9792 virtual char* first_demangled_name(char* buf) const
9793 {
9794 strncpy(buf, "auto", n);
9795 return buf + n;
9796 }
9797 virtual ptrdiff_t print_first(char* f, char* l) const
9798 {
9799 const ptrdiff_t r = l - f;
9800 if (r >= n)
9801 {
9802 *f++ = 'a';
9803 *f++ = 'u';
9804 *f++ = 't';
9805 *f = 'o';
9806 }
9807 return n;
9808 }
9809};
9810
9811class __nullptr_t
9812 : public __node
9813{
9814 static const size_t n = sizeof("std::nullptr_t") - 1;
9815public:
9816
9817 virtual size_t first_size() const {return n;}
9818 virtual char* first_demangled_name(char* buf) const
9819 {
9820 strncpy(buf, "std::nullptr_t", n);
9821 return buf + n;
9822 }
9823 virtual ptrdiff_t print_first(char* f, char* l) const
9824 {
9825 const ptrdiff_t r = l - f;
9826 if (r >= n)
9827 {
9828 *f++ = 's';
9829 *f++ = 't';
9830 *f++ = 'd';
9831 *f++ = ':';
9832 *f++ = ':';
9833 *f++ = 'n';
9834 *f++ = 'u';
9835 *f++ = 'l';
9836 *f++ = 'l';
9837 *f++ = 'p';
9838 *f++ = 't';
9839 *f++ = 'r';
9840 *f++ = '_';
9841 *f = 't';
9842 }
9843 return n;
9844 }
9845};
9846
9847class __array
9848 : public __node
9849{
9850public:
9851
9852 explicit __array(__node* type)
9853 {
9854 __left_ = type;
9855 }
9856
9857 __array(__node* type, size_t dim)
9858 {
9859 __left_ = type;
9860 __size_ = dim;
9861 }
9862
9863 __array(__node* type, __node* dim)
9864 {
9865 __left_ = type;
9866 __right_ = dim;
9867 }
9868
9869 virtual size_t size() const
9870 {
9871 if (__cached_size_ == -1)
9872 {
9873 size_t r = __left_->size() + 3;
9874 if (__right_ != 0)
9875 r += __right_->size();
9876 else if (__size_ != 0)
9877 r += snprintf(0, 0, "%ld", __size_);
9878 const_cast<long&>(__cached_size_) = r;
9879 }
9880 return __cached_size_;
9881 }
9882
9883 virtual char* get_demangled_name(char* buf) const
9884 {
9885 buf = __left_->get_demangled_name(buf);
9886 *buf++ = ' ';
9887 *buf++ = '[';
9888 if (__right_ != 0)
9889 buf = __right_->get_demangled_name(buf);
9890 else if (__size_ != 0)
9891 {
9892 size_t rs = sprintf(buf, "%ld", __size_);
9893 buf += rs;
9894 }
9895 *buf++ = ']';
9896 return buf;
9897 }
9898 virtual ptrdiff_t print(char* f, char* l) const
9899 {
9900 const ptrdiff_t r = l - f;
9901 const ptrdiff_t n = 3;
9902 const ptrdiff_t sz1 = __left_->print(f, l);
9903 char buf[20];
9904 ptrdiff_t sz2 = 0;
9905 if (__right_ != 0)
9906 sz2 = __right_->print(f+std::min(sz1+(n-1), r), l);
9907 else if (__size_ != 0)
9908 {
9909 sz2 = sprintf(buf, "%ld", __size_);
9910 if (r >= sz1 + sz2 + n)
9911 strncpy(f+sz1+2, buf, sz2);
9912 }
9913 if (r >= sz1 + sz2 + n)
9914 {
9915 f += sz1;
9916 *f++ = ' ';
9917 *f = '[';
9918 f += 1 + sz2;
9919 *f = ']';
9920 }
9921 return sz1 + sz2 + n;
9922 }
9923
9924 virtual size_t first_size() const
9925 {
9926 return __left_->first_size();
9927 }
9928
9929 virtual char* first_demangled_name(char* buf) const
9930 {
9931 return __left_->first_demangled_name(buf);
9932 }
9933
9934 virtual ptrdiff_t print_first(char* f, char* l) const
9935 {
9936 return __left_->print_first(f, l);
9937 }
9938
9939 virtual size_t second_size() const
9940 {
9941 size_t r = 2 + __left_->second_size();
9942 if (!__left_->is_array())
9943 ++r;
9944 if (__right_ != 0)
9945 r += __right_->size();
9946 else if (__size_ != 0)
9947 r += snprintf(0, 0, "%ld", __size_);
9948 return r;
9949 }
9950
9951 virtual char* second_demangled_name(char* buf) const
9952 {
9953 *buf++ = ' ';
9954 *buf++ = '[';
9955 if (__right_ != 0)
9956 buf = __right_->get_demangled_name(buf);
9957 else if (__size_ != 0)
9958 {
9959 size_t off = sprintf(buf, "%ld", __size_);
9960 buf += off;
9961 }
9962 char* t = buf;
9963 buf = __left_->second_demangled_name(buf);
9964 *t = ']';
9965 if (buf == t)
9966 ++buf;
9967 return buf;
9968 }
9969 virtual ptrdiff_t print_second(char* f, char* l) const
9970 {
9971 const ptrdiff_t r = l - f;
9972 ptrdiff_t n = 2;
9973 char buf[20];
9974 ptrdiff_t sz2 = 0;
9975 if (__right_ != 0)
9976 sz2 = __right_->print(f+std::min(n, r), l);
9977 else if (__size_ != 0)
9978 {
9979 sz2 = sprintf(buf, "%ld", __size_);
9980 if (r >= sz2 + 3)
9981 strncpy(f+2, buf, sz2);
9982 }
9983 const ptrdiff_t sz1 = __left_->print_second(f+std::min(2+sz2, r), l);
9984 if (sz1 == 0)
9985 ++n;
9986 if (r >= sz1 + sz2 + n)
9987 {
9988 *f++ = ' ';
9989 *f = '[';
9990 f += 1 + sz2;
9991 *f = ']';
9992 }
9993 return sz1 + sz2 + n;
9994 }
9995 virtual bool is_array() const
9996 {
9997 return true;
9998 }
9999 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10000 {
10001 bool r = __left_->fix_forward_references(t_begin, t_end);
10002 if (__right_)
10003 r = r && __right_->fix_forward_references(t_begin, t_end);
10004 return r;
10005 }
10006};
10007
10008class __pointer_to_member_type
10009 : public __node
10010{
10011public:
10012
10013 __pointer_to_member_type(__node* class_type, __node* member_type)
10014 {
10015 __left_ = class_type;
10016 __right_ = member_type;
10017 }
10018
10019 virtual size_t first_size() const
10020 {
10021 if (__cached_size_ == -1)
10022 const_cast<long&>(__cached_size_) = __left_->size() + 3 + __right_->size();
10023 return __cached_size_;
10024 }
10025 virtual char* first_demangled_name(char* buf) const
10026 {
10027 buf = __right_->first_demangled_name(buf);
10028 buf = __left_->get_demangled_name(buf);
10029 *buf++ = ':';
10030 *buf++ = ':';
10031 *buf++ = '*';
10032 return __right_->second_demangled_name(buf);
10033 }
10034 virtual ptrdiff_t print_first(char* f, char* l) const
10035 {
10036 const ptrdiff_t r = l - f;
10037 const ptrdiff_t n = 3;
10038 const ptrdiff_t sz1 = __right_->print_first(f, l);
10039 const ptrdiff_t sz2 = __left_->print(f+std::min(sz1, r), l);
10040 const ptrdiff_t sz3 = __right_->print_second(f+std::min(sz1+sz2+n, r), l);
10041 if (r >= sz1 + sz2 + sz3 + n)
10042 {
10043 f += sz1 + sz2;
10044 *f++ = ':';
10045 *f++ = ':';
10046 *f = '*';
10047 }
10048 return sz1 + sz2 + sz3 + n;
10049 }
10050 virtual __node* base_name() const
10051 {
10052 return __left_->base_name();
10053 }
10054 virtual bool is_reference_or_pointer_to_function_or_array() const
10055 {
10056 return __right_->is_function();
10057 }
10058 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10059 {
10060 return __left_->fix_forward_references(t_begin, t_end) &&
10061 __right_->fix_forward_references(t_begin, t_end);
10062 }
10063};
10064
10065class __decltype_node
10066 : public __node
10067{
10068public:
10069
10070 explicit __decltype_node(__node* expr)
10071 {
10072 __right_ = expr;
10073 }
10074
10075 virtual size_t first_size() const
10076 {
10077 if (__cached_size_ == -1)
10078 const_cast<long&>(__cached_size_) = 10 + __right_->size();
10079 return __cached_size_;
10080 }
10081
10082 virtual char* first_demangled_name(char* buf) const
10083 {
10084 strncpy(buf, "decltype(", 9);
10085 buf += 9;
10086 buf = __right_->get_demangled_name(buf);
10087 *buf++ = ')';
10088 return buf;
10089 }
10090 virtual ptrdiff_t print_first(char* f, char* l) const
10091 {
10092 const ptrdiff_t r = l - f;
10093 const ptrdiff_t n = sizeof("decltype()") - 1;
10094 const ptrdiff_t sz1 = __right_->print(f+std::min(n-1, r), l);
10095 if (r >= sz1 + n)
10096 {
10097 *f++ = 'd';
10098 *f++ = 'e';
10099 *f++ = 'c';
10100 *f++ = 'l';
10101 *f++ = 't';
10102 *f++ = 'y';
10103 *f++ = 'p';
10104 *f++ = 'e';
10105 *f = '(';
10106 f += 1 + sz1;
10107 *f = ')';
10108 }
10109 return sz1 + n;
10110 }
10111 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10112 {
10113 return __right_->fix_forward_references(t_begin, t_end);
10114 }
10115};
10116
10117class __nested_delimeter
10118 : public __node
10119{
10120public:
10121
10122 explicit __nested_delimeter(__node* prev, __node* arg)
10123 {
10124 __left_ = prev;
10125 __right_ = arg;
10126 }
10127
10128 virtual size_t first_size() const
10129 {
10130 if (__cached_size_ == -1)
10131 const_cast<long&>(__cached_size_) = __left_->size() + __right_->size() + 2;
10132 return __cached_size_;
10133 }
10134
10135 virtual char* first_demangled_name(char* buf) const
10136 {
10137 buf = __left_->get_demangled_name(buf);
10138 *buf++ = ':';
10139 *buf++ = ':';
10140 return __right_->get_demangled_name(buf);
10141 }
10142 virtual ptrdiff_t print_first(char* f, char* l) const
10143 {
10144 const ptrdiff_t r = l - f;
10145 const ptrdiff_t n = sizeof("::") - 1;
10146 const ptrdiff_t sz1 = __left_->print(f, l);
10147 if (r >= sz1 + n)
10148 {
10149 f += sz1;
10150 *f++ = ':';
10151 *f++ = ':';
10152 }
10153 const ptrdiff_t sz2 = __right_->print(f, l);
10154 return sz1 + n + sz2;
10155 }
10156
10157 virtual bool ends_with_template() const
10158 {
10159 return __right_->ends_with_template();
10160 }
10161 virtual __node* base_name() const
10162 {
10163 return __right_->base_name();
10164 }
10165 virtual bool is_ctor_dtor_conv() const
10166 {
10167 return __right_->is_ctor_dtor_conv();
10168 }
10169 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10170 {
10171 return __left_->fix_forward_references(t_begin, t_end) &&
10172 __right_->fix_forward_references(t_begin, t_end);
10173 }
10174 virtual __node* extract_cv(__node*& rt) const
10175 {
10176 return __right_->extract_cv(const_cast<__node*&>(__right_));
10177 }
10178};
10179
10180class __unresolved_name
10181 : public __node
10182{
10183public:
10184
10185 __unresolved_name(__node* prev, __node* arg)
10186 {
10187 __left_ = prev;
10188 __right_ = arg;
10189 }
10190
10191 __unresolved_name(bool global, __node* prev, __node* arg)
10192 {
10193 __size_ = global;
10194 __left_ = prev;
10195 __right_ = arg;
10196 }
10197
10198 virtual size_t first_size() const
10199 {
10200 if (__cached_size_ == -1)
10201 const_cast<long&>(__cached_size_) = (__left_ ? __left_->size() + 2 : 0) +
10202 __right_->size() + __size_ * 2;
10203 return __cached_size_;
10204 }
10205
10206 virtual char* first_demangled_name(char* buf) const
10207 {
10208 if (__size_)
10209 {
10210 *buf++ = ':';
10211 *buf++ = ':';
10212 }
10213 if (__left_)
10214 {
10215 buf = __left_->get_demangled_name(buf);
10216 *buf++ = ':';
10217 *buf++ = ':';
10218 }
10219 return __right_->get_demangled_name(buf);
10220 }
10221 virtual ptrdiff_t print_first(char* f, char* l) const
10222 {
10223 const ptrdiff_t r = l - f;
10224 ptrdiff_t n = 0;
10225 if (__size_)
10226 {
10227 n = 2;
10228 if (r >= n)
10229 {
10230 f[0] = ':';
10231 f[1] = ':';
10232 }
10233 }
10234 ptrdiff_t sz1 = 0;
10235 if (__left_)
10236 {
10237 sz1 = __left_->print(f+std::min(n, r), l);
10238 n += 2;
10239 if (r >= sz1 + n)
10240 {
10241 f[sz1 + n - 2] = ':';
10242 f[sz1 + n - 1] = ':';
10243 }
10244 }
10245 const ptrdiff_t sz2 = __right_->print(f+std::min(sz1+n, r), l);
10246 return sz1 + n + sz2;
10247 }
10248
10249 virtual bool ends_with_template() const
10250 {
10251 return __right_->ends_with_template();
10252 }
10253 virtual __node* base_name() const
10254 {
10255 return __right_->base_name();
10256 }
10257 virtual bool is_ctor_dtor_conv() const
10258 {
10259 return __right_->is_ctor_dtor_conv();
10260 }
10261 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10262 {
10263 bool r = true;
10264 if (__left_)
10265 r = __left_->fix_forward_references(t_begin, t_end);
10266 return r && __right_->fix_forward_references(t_begin, t_end);
10267 }
10268 virtual __node* extract_cv(__node*& rt) const
10269 {
10270 return __right_->extract_cv(const_cast<__node*&>(__right_));
10271 }
10272};
10273
10274class __string_literal
10275 : public __node
10276{
10277public:
10278
10279 virtual size_t first_size() const
10280 {
10281 return 14;
10282 }
10283
10284 virtual char* first_demangled_name(char* buf) const
10285 {
10286 strncpy(buf, "string literal", 14);
10287 return buf + 14;
10288 }
10289 virtual ptrdiff_t print_first(char* f, char* l) const
10290 {
10291 const ptrdiff_t r = l - f;
10292 const ptrdiff_t n = sizeof("string literal") - 1;
10293 if (r >= n)
10294 {
10295 *f++ = 's';
10296 *f++ = 't';
10297 *f++ = 'r';
10298 *f++ = 'i';
10299 *f++ = 'n';
10300 *f++ = 'g';
10301 *f++ = ' ';
10302 *f++ = 'l';
10303 *f++ = 'i';
10304 *f++ = 't';
10305 *f++ = 'e';
10306 *f++ = 'r';
10307 *f++ = 'a';
10308 *f = 'l';
10309 }
10310 return n;
10311 }
10312};
10313
10314class __constructor
10315 : public __node
10316{
10317public:
10318
10319 explicit __constructor(__node* name)
10320 {
10321 __right_ = name;
10322 }
10323
10324 virtual size_t first_size() const
10325 {
10326 if (__cached_size_ == -1)
10327 const_cast<long&>(__cached_size_) = __right_->base_size();
10328 return __cached_size_;
10329 }
10330
10331 virtual char* first_demangled_name(char* buf) const
10332 {
10333 return __right_->get_base_name(buf);
10334 }
10335 virtual ptrdiff_t print_first(char* f, char* l) const
10336 {
10337 return __right_->print_base_name(f, l);
10338 }
10339 virtual __node* base_name() const
10340 {
10341 return __right_->base_name();
10342 }
10343 virtual bool ends_with_template() const
10344 {
10345 return __right_->ends_with_template();
10346 }
10347 virtual bool is_ctor_dtor_conv() const
10348 {
10349 return true;
10350 }
10351 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10352 {
10353 return __right_->fix_forward_references(t_begin, t_end);
10354 }
10355};
10356
10357class __destructor
10358 : public __node
10359{
10360public:
10361
10362 explicit __destructor(__node* name)
10363 {
10364 __right_ = name;
10365 }
10366
10367 virtual size_t first_size() const
10368 {
10369 if (__cached_size_ == -1)
10370 const_cast<long&>(__cached_size_) = __right_->base_size() + 1;
10371 return __cached_size_;
10372 }
10373
10374 virtual char* first_demangled_name(char* buf) const
10375 {
10376 *buf++ = '~';
10377 return __right_->get_base_name(buf);
10378 }
10379 virtual ptrdiff_t print_first(char* f, char* l) const
10380 {
10381 const ptrdiff_t r = l - f;
10382 const ptrdiff_t n = 1;
10383 const ptrdiff_t sz = __right_->print_base_name(f+std::min(n, r), l);
10384 if (r >= n + sz)
10385 *f = '~';
10386 return n + sz;
10387 }
10388 virtual __node* base_name() const
10389 {
10390 return __right_->base_name();
10391 }
10392 virtual bool is_ctor_dtor_conv() const
10393 {
10394 return true;
10395 }
10396 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10397 {
10398 return __right_->fix_forward_references(t_begin, t_end);
10399 }
10400};
10401
10402class __dot_suffix
10403 : public __node
10404{
10405public:
10406 __dot_suffix(__node* name, const char* suffix, unsigned sz)
10407 {
10408 __left_ = name;
10409 __name_ = suffix;
10410 __size_ = sz;
10411 }
10412
10413 virtual size_t first_size() const
10414 {
10415 if (__cached_size_ == -1)
10416 {
10417 size_t off = __left_->size();
10418 off += __size_ + 3;
10419 const_cast<long&>(__cached_size_) = off;
10420 }
10421 return __cached_size_;
10422 }
10423 virtual char* first_demangled_name(char* buf) const
10424 {
10425 buf = __left_->get_demangled_name(buf);
10426 *buf++ = ' ';
10427 *buf++ = '(';
10428 strncpy(buf, __name_, __size_);
10429 buf += __size_;
10430 *buf++ = ')';
10431 return buf;
10432 }
10433 virtual ptrdiff_t print_first(char* f, char* l) const
10434 {
10435 const ptrdiff_t r = l - f;
10436 const ptrdiff_t n = 3 + __size_;
10437 const ptrdiff_t sz = __left_->print(f, l);
10438 if (r >= n + sz)
10439 {
10440 f += sz;
10441 *f++ = ' ';
10442 *f++ = '(';
10443 strncpy(f, __name_, __size_);
10444 f += __size_;
10445 *f = ')';
10446 }
10447 return n + sz;
10448 }
10449 virtual __node* base_name() const
10450 {
10451 return __left_->base_name();
10452 }
10453 virtual bool fix_forward_references(__node** t_begin, __node** t_end)
10454 {
10455 return __left_->fix_forward_references(t_begin, t_end);
10456 }
10457};
10458
10459
10460enum {invalid_args = -3, invalid_mangled_name, memory_alloc_failure, success,
10461 not_yet_implemented};
10462
10463__demangle_tree::__demangle_tree(const char* mangled_name, char* buf, size_t bs)
10464 : __mangled_name_begin_(0), __mangled_name_end_(0),
10465 __status_(invalid_mangled_name), __root_(0),
10466 __node_begin_(0), __node_end_(0), __node_cap_(0),
10467 __sub_begin_(0), __sub_end_(0), __sub_cap_(0),
10468 __t_begin_(0), __t_end_(0), __t_cap_(0),
10469 __tag_templates_(true),
10470 __fix_forward_references_(false)
10471{
10472 size_t n = strlen(mangled_name);
10473 size_t ms = n + 2*n*sizeof(__node) + 2*n*sizeof(__node*);
10474 char* m;
10475 if (ms <= bs)
10476 {
10477 m = buf;
10478 __owns_buf_ = false;
10479 }
10480 else
10481 {
10482 m = static_cast<char*>(malloc(ms));
10483 __owns_buf_ = true;
10484 }
10485 if (m == NULL)
10486 {
10487 __status_ = memory_alloc_failure;
10488 return;
10489 }
10490 __node_begin_ = __node_end_ = (__node*)(m);
10491 __node_cap_ = __node_begin_ + 2*n;
10492 __sub_begin_ = __sub_end_ = (__node**)(__node_cap_);
10493 __sub_cap_ = __sub_begin_ + n;
10494 __t_begin_ = __t_end_ = (__node**)(__sub_cap_);
10495 __t_cap_ = __t_begin_ + n;
10496 __mangled_name_begin_ = (const char*)(__t_cap_);
10497 __mangled_name_end_ = __mangled_name_begin_ + n;
10498 strncpy(const_cast<char*>(__mangled_name_begin_), mangled_name, n);
10499}
10500
10501__demangle_tree::~__demangle_tree()
10502{
10503 if (__owns_buf_)
10504 free(__node_begin_);
10505}
10506
10507__demangle_tree::__demangle_tree(__demangle_tree& t)
10508 : __mangled_name_begin_(t.__mangled_name_begin_),
10509 __mangled_name_end_(t.__mangled_name_end_),
10510 __status_(t.__status_), __root_(t.__root_),
10511 __node_begin_(t.__node_begin_), __node_end_(t.__node_end_),
10512 __node_cap_(t.__node_cap_),
10513 __sub_begin_(t.__sub_begin_), __sub_end_(t.__sub_end_),
10514 __sub_cap_(t.__sub_cap_),
10515 __t_begin_(t.__t_begin_), __t_end_(t.__t_end_),
10516 __t_cap_(t.__t_cap_),
10517 __tag_templates_(t.__tag_templates_),
10518 __fix_forward_references_(t.__fix_forward_references_),
10519 __owns_buf_(t.__owns_buf_)
10520{
10521 t.__mangled_name_begin_ = 0;
10522 t.__mangled_name_end_ = 0;
10523 t.__status_ = invalid_mangled_name;
10524 t.__root_ = 0;
10525 t.__node_begin_ = t.__node_end_ = t.__node_cap_ = 0;
10526 t.__sub_begin_ = t.__sub_end_ = t.__sub_cap_ = 0;
10527 t.__t_begin_ = t.__t_end_ = t.__t_cap_ = 0;
10528 t.__owns_buf_ = false;
10529}
10530
10531__demangle_tree::__demangle_tree(__demangle_tree_rv rv)
10532 : __mangled_name_begin_(rv.ptr_->__mangled_name_begin_),
10533 __mangled_name_end_(rv.ptr_->__mangled_name_end_),
10534 __status_(rv.ptr_->__status_), __root_(rv.ptr_->__root_),
10535 __node_begin_(rv.ptr_->__node_begin_), __node_end_(rv.ptr_->__node_end_),
10536 __node_cap_(rv.ptr_->__node_cap_),
10537 __sub_begin_(rv.ptr_->__sub_begin_), __sub_end_(rv.ptr_->__sub_end_),
10538 __sub_cap_(rv.ptr_->__sub_cap_),
10539 __t_begin_(rv.ptr_->__t_begin_), __t_end_(rv.ptr_->__t_end_),
10540 __t_cap_(rv.ptr_->__t_cap_),
10541 __tag_templates_(rv.ptr_->__tag_templates_),
10542 __fix_forward_references_(rv.ptr_->__fix_forward_references_),
10543 __owns_buf_(rv.ptr_->__owns_buf_)
10544{
10545 rv.ptr_->__mangled_name_begin_ = 0;
10546 rv.ptr_->__mangled_name_end_ = 0;
10547 rv.ptr_->__status_ = invalid_mangled_name;
10548 rv.ptr_->__root_ = 0;
10549 rv.ptr_->__node_begin_ = rv.ptr_->__node_end_ = rv.ptr_->__node_cap_ = 0;
10550 rv.ptr_->__sub_begin_ = rv.ptr_->__sub_end_ = rv.ptr_->__sub_cap_ = 0;
10551 rv.ptr_->__t_begin_ = rv.ptr_->__t_end_ = rv.ptr_->__t_cap_ = 0;
10552 rv.ptr_->__owns_buf_ = false;
10553}
10554
10555int
10556__demangle_tree::__status() const
10557{
10558 return __status_;
10559}
10560
10561size_t
10562__demangle_tree::size() const
10563{
10564 return __status_ == success ? __root_->size() : 0;
10565}
10566
10567char*
10568__demangle_tree::__get_demangled_name(char* buf) const
10569{
10570 if (__status_ == success)
10571 return __root_->get_demangled_name(buf);
10572 return 0;
10573}
10574
10575template <class _Tp>
10576bool
10577__demangle_tree::__make()
10578{
10579 if (__node_end_ < __node_cap_)
10580 {
10581 ::new (__node_end_) _Tp();
10582 __root_ = __node_end_;
10583 ++__node_end_;
10584 return true;
10585 }
10586 __status_ = memory_alloc_failure;
10587 return false;
10588}
10589
10590template <class _Tp, class _A0>
10591bool
10592__demangle_tree::__make(_A0 __a0)
10593{
10594 if (__node_end_ < __node_cap_)
10595 {
10596 ::new (__node_end_) _Tp(__a0);
10597 __root_ = __node_end_;
10598 ++__node_end_;
10599 return true;
10600 }
10601 __status_ = memory_alloc_failure;
10602 return false;
10603}
10604
10605template <class _Tp, class _A0, class _A1>
10606bool
10607__demangle_tree::__make(_A0 __a0, _A1 __a1)
10608{
10609 if (__node_end_ < __node_cap_)
10610 {
10611 ::new (__node_end_) _Tp(__a0, __a1);
10612 __root_ = __node_end_;
10613 ++__node_end_;
10614 return true;
10615 }
10616 __status_ = memory_alloc_failure;
10617 return false;
10618}
10619
10620template <class _Tp, class _A0, class _A1, class _A2>
10621bool
10622__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2)
10623{
10624 if (__node_end_ < __node_cap_)
10625 {
10626 ::new (__node_end_) _Tp(__a0, __a1, __a2);
10627 __root_ = __node_end_;
10628 ++__node_end_;
10629 return true;
10630 }
10631 __status_ = memory_alloc_failure;
10632 return false;
10633}
10634
10635template <class _Tp, class _A0, class _A1, class _A2, class _A3>
10636bool
10637__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3)
10638{
10639 if (__node_end_ < __node_cap_)
10640 {
10641 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3);
10642 __root_ = __node_end_;
10643 ++__node_end_;
10644 return true;
10645 }
10646 __status_ = memory_alloc_failure;
10647 return false;
10648}
10649
10650template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4>
10651bool
10652__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4)
10653{
10654 if (__node_end_ < __node_cap_)
10655 {
10656 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4);
10657 __root_ = __node_end_;
10658 ++__node_end_;
10659 return true;
10660 }
10661 __status_ = memory_alloc_failure;
10662 return false;
10663}
10664
10665template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4,
10666 class _A5>
10667bool
10668__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4,
10669 _A5 __a5)
10670{
10671 if (__node_end_ < __node_cap_)
10672 {
10673 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4, __a5);
10674 __root_ = __node_end_;
10675 ++__node_end_;
10676 return true;
10677 }
10678 __status_ = memory_alloc_failure;
10679 return false;
10680}
10681
10682// <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const
10683// [R | O] # & or &&
10684
10685const char*
10686__demangle_tree::__parse_cv_qualifiers(const char* first, const char* last,
10687 unsigned& cv, bool look_for_ref_quals)
10688{
10689 if (look_for_ref_quals)
10690 {
10691 for (; first != last; ++first)
10692 {
10693 switch (*first)
10694 {
10695 case 'r':
10696 cv |= 4;
10697 break;
10698 case 'V':
10699 cv |= 2;
10700 break;
10701 case 'K':
10702 cv |= 1;
10703 break;
10704 case 'R':
10705 cv |= 8;
10706 break;
10707 case 'O':
10708 cv |= 16;
10709 break;
10710 default:
10711 return first;
10712 }
10713 }
10714 }
10715 else
10716 {
10717 for (; first != last; ++first)
10718 {
10719 switch (*first)
10720 {
10721 case 'r':
10722 cv |= 4;
10723 break;
10724 case 'V':
10725 cv |= 2;
10726 break;
10727 case 'K':
10728 cv |= 1;
10729 break;
10730 default:
10731 return first;
10732 }
10733 }
10734 }
10735 return first;
10736}
10737
10738// <builtin-type> ::= v # void
10739// ::= w # wchar_t
10740// ::= b # bool
10741// ::= c # char
10742// ::= a # signed char
10743// ::= h # unsigned char
10744// ::= s # short
10745// ::= t # unsigned short
10746// ::= i # int
10747// ::= j # unsigned int
10748// ::= l # long
10749// ::= m # unsigned long
10750// ::= x # long long, __int64
10751// ::= y # unsigned long long, __int64
10752// ::= n # __int128
10753// ::= o # unsigned __int128
10754// ::= f # float
10755// ::= d # double
10756// ::= e # long double, __float80
10757// ::= g # __float128
10758// ::= z # ellipsis
10759// ::= Dd # IEEE 754r decimal floating point (64 bits)
10760// ::= De # IEEE 754r decimal floating point (128 bits)
10761// ::= Df # IEEE 754r decimal floating point (32 bits)
10762// ::= Dh # IEEE 754r half-precision floating point (16 bits)
10763// ::= Di # char32_t
10764// ::= Ds # char16_t
10765// ::= Da # auto (in dependent new-expressions)
10766// ::= Dn # std::nullptr_t (i.e., decltype(nullptr))
10767// ::= u <source-name> # vendor extended type
10768
10769const char*
10770__demangle_tree::__parse_builtin_type(const char* first, const char* last)
10771{
10772 if (first != last)
10773 {
10774 switch (*first)
10775 {
10776 case 'v':
10777 if (__make<__void>())
10778 ++first;
10779 break;
10780 case 'w':
10781 if (__make<__wchar_t>())
10782 ++first;
10783 break;
10784 case 'b':
10785 if (__make<__bool>())
10786 ++first;
10787 break;
10788 case 'c':
10789 if (__make<__char>())
10790 ++first;
10791 break;
10792 case 'a':
10793 if (__make<__signed_char>())
10794 ++first;
10795 break;
10796 case 'h':
10797 if (__make<__unsigned_char>())
10798 ++first;
10799 break;
10800 case 's':
10801 if (__make<__short>())
10802 ++first;
10803 break;
10804 case 't':
10805 if (__make<__unsigned_short>())
10806 ++first;
10807 break;
10808 case 'i':
10809 if (__make<__int>())
10810 ++first;
10811 break;
10812 case 'j':
10813 if (__make<__unsigned_int>())
10814 ++first;
10815 break;
10816 case 'l':
10817 if (__make<__long>())
10818 ++first;
10819 break;
10820 case 'm':
10821 if (__make<__unsigned_long>())
10822 ++first;
10823 break;
10824 case 'x':
10825 if (__make<__long_long>())
10826 ++first;
10827 break;
10828 case 'y':
10829 if (__make<__unsigned_long_long>())
10830 ++first;
10831 break;
10832 case 'n':
10833 if (__make<__int128>())
10834 ++first;
10835 break;
10836 case 'o':
10837 if (__make<__unsigned_int128>())
10838 ++first;
10839 break;
10840 case 'f':
10841 if (__make<__float>())
10842 ++first;
10843 break;
10844 case 'd':
10845 if (__make<__double>())
10846 ++first;
10847 break;
10848 case 'e':
10849 if (__make<__long_double>())
10850 ++first;
10851 break;
10852 case 'g':
10853 if (__make<__float128>())
10854 ++first;
10855 break;
10856 case 'z':
10857 if (__make<__ellipsis>())
10858 ++first;
10859 break;
10860 case 'D':
10861 if (first+1 != last)
10862 {
10863 switch (first[1])
10864 {
10865 case 'd':
10866 if (__make<__decimal64>())
10867 first += 2;
10868 break;
10869 case 'e':
10870 if (__make<__decimal128>())
10871 first += 2;
10872 break;
10873 case 'f':
10874 if (__make<__decimal32>())
10875 first += 2;
10876 break;
10877 case 'h':
10878 if (__make<__decimal16>())
10879 first += 2;
10880 break;
10881 case 'i':
10882 if (__make<__d_char32_t>())
10883 first += 2;
10884 break;
10885 case 's':
10886 if (__make<__d_char16_t>())
10887 first += 2;
10888 break;
10889 case 'a':
10890 if (__make<__auto>())
10891 first += 2;
10892 break;
10893 case 'n':
10894 if (__make<__nullptr_t>())
10895 first += 2;
10896 break;
10897 }
10898 }
10899 break;
10900 }
10901 }
10902 return first;
10903}
10904
10905// <bare-function-type> ::= <signature type>+
10906// # types are possible return type, then parameter types
10907
10908const char*
10909__demangle_tree::__parse_bare_function_type(const char* first, const char* last)
10910{
10911 if (first != last)
10912 {
10913 __tag_templates_ = false;
10914 const char* t = __parse_type(first, last);
10915 if (t != first && __make<__list>(__root_))
10916 {
10917 const char* t0 = t;
10918 __node* head = __root_;
10919 __node* prev = head;
10920 while (true)
10921 {
10922 t = __parse_type(t0, last);
10923 if (t != t0)
10924 {
10925 if (__make<__list>(__root_))
10926 {
10927 t0 = t;
10928 prev->__right_ = __root_;
10929 __root_->__size_ = prev->__size_ + 1;
10930 prev = __root_;
10931 }
10932 else
10933 break;
10934 }
10935 else
10936 {
10937 first = t;
10938 __root_ = head;
10939 break;
10940 }
10941 }
10942 }
10943 __tag_templates_ = true;
10944 }
10945 return first;
10946}
10947
10948// <function-type> ::= F [Y] <bare-function-type> E
10949
10950const char*
10951__demangle_tree::__parse_function_type(const char* first, const char* last)
10952{
10953 if (first != last && *first == 'F')
10954 {
10955 const char* t = first+1;
10956 if (t != last)
10957 {
10958 bool externC = false;
10959 if (*t == 'Y')
10960 {
10961 externC = true;
10962 if (++t == last)
10963 return first;
10964 }
10965 const char* t1 = __parse_type(t, last);
10966 if (t1 != t)
10967 {
10968 __node* ret = __root_;
10969 t = t1;
10970 t1 = __parse_bare_function_type(t, last);
10971 if (t1 != t && t1 != last && *t1 == 'E')
10972 {
10973 if (dynamic_cast<__void*>(__root_->__left_) != NULL)
10974 __root_->__left_ = NULL;
10975 if (__make<__function_signature>(ret, __root_))
10976 {
10977 if (__make<__function>((__node*)0, __root_))
10978 first = t1+1;
10979 }
10980 }
10981 }
10982 }
10983 }
10984 return first;
10985}
10986
10987const char*
10988__demangle_tree::__parse_hex_number(const char* first, const char* last, unsigned long long& n)
10989{
10990 const char* t = first;
10991 for (; t != last && isxdigit(*t); ++t)
10992 {
10993 if (t == first)
10994 n = 0;
10995 if (isdigit(*t))
10996 n = n * 16 + *t - '0';
10997 else if (isupper(*t))
10998 n = n * 16 + *t - 'A' + 10;
10999 else
11000 n = n * 16 + *t - 'a' + 10;
11001 }
11002 first = t;
11003 return first;
11004}
11005
11006// <expr-primary> ::= L <type> <value number> E # integer literal
11007// ::= L <type> <value float> E # floating literal
11008// ::= L <string type> E # string literal
11009// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
11010// ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
11011// ::= L <mangled-name> E # external name
11012
11013const char*
11014__demangle_tree::__parse_expr_primary(const char* first, const char* last)
11015{
11016 if (last - first >= 4 && *first == 'L')
11017 {
11018 switch (first[1])
11019 {
11020 case 'w':
11021 {
11022 const char* t = __parse_number(first+2, last);
11023 if (t != first+2 && t != last && *t == 'E')
11024 {
11025 if (__make<__wchar_t_literal>(first+2, t))
11026 first = t+1;
11027 }
11028 }
11029 break;
11030 case 'b':
11031 if (first[3] == 'E')
11032 {
11033 switch (first[2])
11034 {
11035 case '0':
11036 if (__make<__bool_literal>("false", 5))
11037 first += 4;
11038 break;
11039 case '1':
11040 if (__make<__bool_literal>("true", 4))
11041 first += 4;
11042 break;
11043 }
11044 }
11045 break;
11046 case 'c':
11047 {
11048 const char* t = __parse_number(first+2, last);
11049 if (t != first+2 && t != last && *t == 'E')
11050 {
11051 if (__make<__char_literal>(first+2, t))
11052 first = t+1;
11053 }
11054 }
11055 break;
11056 case 'a':
11057 {
11058 const char* t = __parse_number(first+2, last);
11059 if (t != first+2 && t != last && *t == 'E')
11060 {
11061 if (__make<__signed_char_literal>(first+2, t))
11062 first = t+1;
11063 }
11064 }
11065 break;
11066 case 'h':
11067 {
11068 const char* t = __parse_number(first+2, last);
11069 if (t != first+2 && t != last && *t == 'E')
11070 {
11071 if (__make<__unsigned_char_literal>(first+2, t))
11072 first = t+1;
11073 }
11074 }
11075 break;
11076 case 's':
11077 {
11078 const char* t = __parse_number(first+2, last);
11079 if (t != first+2 && t != last && *t == 'E')
11080 {
11081 if (__make<__short_literal>(first+2, t))
11082 first = t+1;
11083 }
11084 }
11085 break;
11086 case 't':
11087 {
11088 const char* t = __parse_number(first+2, last);
11089 if (t != first+2 && t != last && *t == 'E')
11090 {
11091 if (__make<__unsigned_short_literal>(first+2, t))
11092 first = t+1;
11093 }
11094 }
11095 break;
11096 case 'i':
11097 {
11098 const char* t = __parse_number(first+2, last);
11099 if (t != first+2 && t != last && *t == 'E')
11100 {
11101 if (__make<__int_literal>(first+2, t))
11102 first = t+1;
11103 }
11104 }
11105 break;
11106 case 'j':
11107 {
11108 const char* t = __parse_number(first+2, last);
11109 if (t != first+2 && t != last && *t == 'E')
11110 {
11111 if (__make<__unsigned_int_literal>(first+2, t))
11112 first = t+1;
11113 }
11114 }
11115 break;
11116 case 'l':
11117 {
11118 const char* t = __parse_number(first+2, last);
11119 if (t != first+2 && t != last && *t == 'E')
11120 {
11121 if (__make<__long_literal>(first+2, t))
11122 first = t+1;
11123 }
11124 }
11125 break;
11126 case 'm':
11127 {
11128 const char* t = __parse_number(first+2, last);
11129 if (t != first+2 && t != last && *t == 'E')
11130 {
11131 if (__make<__unsigned_long_literal>(first+2, t))
11132 first = t+1;
11133 }
11134 }
11135 break;
11136 case 'x':
11137 {
11138 const char* t = __parse_number(first+2, last);
11139 if (t != first+2 && t != last && *t == 'E')
11140 {
11141 if (__make<__long_long_literal>(first+2, t))
11142 first = t+1;
11143 }
11144 }
11145 break;
11146 case 'y':
11147 {
11148 const char* t = __parse_number(first+2, last);
11149 if (t != first+2 && t != last && *t == 'E')
11150 {
11151 if (__make<__unsigned_long_long_literal>(first+2, t))
11152 first = t+1;
11153 }
11154 }
11155 break;
11156 case 'n':
11157 {
11158 const char* t = __parse_number(first+2, last);
11159 if (t != first+2 && t != last && *t == 'E')
11160 {
11161 if (__make<__int128_literal>(first+2, t))
11162 first = t+1;
11163 }
11164 }
11165 break;
11166 case 'o':
11167 {
11168 const char* t = __parse_number(first+2, last);
11169 if (t != first+2 && t != last && *t == 'E')
11170 {
11171 if (__make<__unsigned_int128_literal>(first+2, t))
11172 first = t+1;
11173 }
11174 }
11175 break;
11176 case 'f':
11177 {
11178 if (last - (first+2) <= 8)
11179 return first;
11180 unsigned long long j;
11181 const char* t = __parse_hex_number(first+2, first+10, j);
11182 if (t != first+2 && t != last && *t == 'E')
11183 {
11184 unsigned i = static_cast<unsigned>(j);
11185 float value = *(float*)&i;
11186 if (__make<__float_literal>(value))
11187 first = t+1;
11188 }
11189 }
11190 break;
11191 case 'd':
11192 {
11193 if (last - (first+2) <= 16)
11194 return first;
11195 unsigned long long j;
11196 const char* t = __parse_hex_number(first+2, first+18, j);
11197 if (t != first+2 && t != last && *t == 'E')
11198 {
11199 double value = *(double*)&j;
11200 if (__make<__double_literal>(value))
11201 first = t+1;
11202 }
11203 }
11204 break;
11205 case 'e':
11206 break;
11207 case '_':
11208 if (first[2] == 'Z')
11209 {
11210 const char* t = __parse_encoding(first+3, last);
11211 if (t != first+3 && t != last && *t == 'E')
11212 first = t+1;
11213 }
11214 break;
11215 default:
11216 {
11217 // might be named type
11218 const char* t = __parse_type(first+1, last);
11219 if (t != first+1 && t != last)
11220 {
11221 if (*t != 'E')
11222 {
11223 const char* n = t;
11224 for (; n != last && isdigit(*n); ++n)
11225 ;
11226 if (n != t && n != last && *n == 'E')
11227 {
11228 if (__make<__cast_literal>(__root_, t, n))
11229 {
11230 first = n+1;
11231 break;
11232 }
11233 }
11234 }
11235 else
11236 {
11237 first = t+1;
11238 break;
11239 }
11240 }
11241 }
11242 assert(!"case in __parse_expr_primary not implemented");
11243 }
11244 }
11245 return first;
11246}
11247
11248const char*
11249__demangle_tree::__parse_unnamed_type_name(const char* first, const char* last)
11250{
11251 if (first != last && *first == 'U')
11252 {
11253 assert(!"__parse_unnamed_type_name not implemented");
11254 }
11255 return first;
11256}
11257
11258// <ctor-dtor-name> ::= C1 # complete object constructor
11259// ::= C2 # base object constructor
11260// ::= C3 # complete object allocating constructor
11261// ::= D0 # deleting destructor
11262// ::= D1 # complete object destructor
11263// ::= D2 # base object destructor
11264
11265const char*
11266__demangle_tree::__parse_ctor_dtor_name(const char* first, const char* last)
11267{
11268 if (last-first >= 2)
11269 {
11270 switch (first[0])
11271 {
11272 case 'C':
11273 switch (first[1])
11274 {
11275 case '1':
11276 case '2':
11277 case '3':
11278 if (__make<__constructor>(__root_->base_name()))
11279 first += 2;
11280 break;
11281 }
11282 break;
11283 case 'D':
11284 switch (first[1])
11285 {
11286 case '0':
11287 case '1':
11288 case '2':
11289 if (__make<__destructor>(__root_->base_name()))
11290 first += 2;
11291 break;
11292 }
11293 break;
11294 }
11295 }
11296 return first;
11297}
11298
11299const char*
11300__demangle_tree::__parse_unscoped_template_name(const char* first, const char* last)
11301{
11302 assert(!"__parse_unscoped_template_name not implemented");
11303}
11304
11305// <discriminator> := _ <non-negative number> # when number < 10
11306// := __ <non-negative number> _ # when number >= 10
11307// extension := decimal-digit+
11308
11309const char*
11310__demangle_tree::__parse_discriminator(const char* first, const char* last)
11311{
11312 // parse but ignore discriminator
11313 if (first != last)
11314 {
11315 if (*first == '_')
11316 {
11317 const char* t1 = first+1;
11318 if (t1 != last)
11319 {
11320 if (isdigit(*t1))
11321 first = t1+1;
11322 else if (*t1 == '_')
11323 {
11324 for (++t1; t1 != last && isdigit(*t1); ++t1)
11325 ;
11326 if (t1 != last && *t1 == '_')
11327 first = t1 + 1;
11328 }
11329 }
11330 }
11331 else if (isdigit(*first))
11332 {
11333 const char* t1 = first+1;
11334 for (; t1 != last && isdigit(*t1); ++t1)
11335 ;
11336 first = t1;
11337 }
11338 }
11339 return first;
11340}
11341
11342// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
11343// := Z <function encoding> E s [<discriminator>]
11344// := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
11345
11346const char*
11347__demangle_tree::__parse_local_name(const char* first, const char* last)
11348{
11349 if (first != last && *first == 'Z')
11350 {
11351 const char* t = __parse_encoding(first+1, last);
11352 if (t != first+1 && t != last && *t == 'E' && ++t != last)
11353 {
11354 __node* encoding = __root_;
11355 switch (*t)
11356 {
11357 case 's':
11358 {
11359 const char*t1 = __parse_discriminator(t+1, last);
11360 if (__make<__string_literal>())
11361 {
11362 if (__make<__nested_delimeter>(encoding, __root_))
11363 first = t1;
11364 }
11365 }
11366 break;
11367 case 'd':
11368 assert(!"__parse_local_name d not implemented");
11369 break;
11370 default:
11371 {
11372 const char*t1 = __parse_name(t, last);
11373 if (t1 != t)
11374 {
11375 // parse but ignore discriminator
11376 t1 = __parse_discriminator(t1, last);
11377 if (__make<__nested_delimeter>(encoding, __root_))
11378 first = t1;
11379 }
11380 }
11381 break;
11382 }
11383 }
11384 }
11385 return first;
11386}
11387
11388// <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f())
11389// ::= <simple-id> # e.g., ~A<2*N>
11390
11391const char*
11392__demangle_tree::__parse_destructor_name(const char* first, const char* last)
11393{
11394 if (first != last)
11395 {
11396 const char* t = __parse_unresolved_type(first, last);
11397 if (t == first)
11398 t = __parse_simple_id(first, last);
11399 if (t != first && __make<__destructor>(__root_))
11400 first = t;
11401 }
11402 return first;
11403}
11404
11405// <simple-id> ::= <source-name> [ <template-args> ]
11406
11407const char*
11408__demangle_tree::__parse_simple_id(const char* first, const char* last)
11409{
11410 if (first != last)
11411 {
11412 const char* t = __parse_source_name(first, last);
11413 if (t != first)
11414 first = __parse_template_args(t, last);
11415 else
11416 first = t;
11417 }
11418 return first;
11419}
11420
11421// <base-unresolved-name> ::= <simple-id> # unresolved name
11422// extension ::= <operator-name> # unresolved operator-function-id
11423// extension ::= <operator-name> <template-args> # unresolved operator template-id
11424// ::= on <operator-name> # unresolved operator-function-id
11425// ::= on <operator-name> <template-args> # unresolved operator template-id
11426// ::= dn <destructor-name> # destructor or pseudo-destructor;
11427// # e.g. ~X or ~X<N-1>
11428
11429const char*
11430__demangle_tree::__parse_base_unresolved_name(const char* first, const char* last)
11431{
11432 if (last - first >= 2)
11433 {
11434 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
11435 {
11436 if (first[0] == 'o')
11437 {
11438 const char* t = __parse_operator_name(first+2, last);
11439 if (t != first+2)
11440 first = __parse_template_args(t, last);
11441 else
11442 first = t;
11443 }
11444 else
11445 {
11446 const char* t = __parse_destructor_name(first+2, last);
11447 if (t != first+2)
11448 first = t;
11449 }
11450 }
11451 else
11452 {
11453 const char* t = __parse_simple_id(first, last);
11454 if (t == first)
11455 {
11456 t = __parse_operator_name(first, last);
11457 if (t != first)
11458 t = __parse_template_args(t, last);
11459 }
11460 if (t != first)
11461 first = t;
11462 }
11463 }
11464 return first;
11465}
11466
11467// <unresolved-type> ::= <template-param>
11468// ::= <decltype>
11469// ::= <substitution>
11470
11471const char*
11472__demangle_tree::__parse_unresolved_type(const char* first, const char* last)
11473{
11474 if (first != last)
11475 {
11476 const char* t;
11477 switch (*first)
11478 {
11479 case 'T':
11480 t = __parse_template_param(first, last);
11481 if (t != first)
11482 {
11483 if (__sub_end_ == __sub_cap_)
11484 __status_ = memory_alloc_failure;
11485 else
11486 {
11487 *__sub_end_++ = __root_;
11488 first = t;
11489 }
11490 }
11491 break;
11492 case 'D':
11493 t = __parse_decltype(first, last);
11494 if (t != first)
11495 {
11496 if (__sub_end_ == __sub_cap_)
11497 __status_ = memory_alloc_failure;
11498 else
11499 {
11500 *__sub_end_++ = __root_;
11501 first = t;
11502 }
11503 }
11504 break;
11505 case 'S':
11506 t = __parse_substitution(first, last);
11507 if (t != first)
11508 first = t;
11509 break;
11510 }
11511 }
11512 return first;
11513}
11514
Howard Hinnant6f716a02011-06-22 19:27:39 +000011515// <unresolved-qualifier-level> ::= <source-name> [ <template-args> ]
11516
11517const char*
11518__demangle_tree::__parse_unresolved_qualifier_level(const char* first, const char* last)
11519{
11520 if (first != last)
11521 {
11522 const char* t = __parse_source_name(first, last);
11523 if (t != first)
11524 first = __parse_template_args(t, last);
11525 }
11526 return first;
11527}
11528
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011529// <unresolved-name>
Howard Hinnant6f716a02011-06-22 19:27:39 +000011530// extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011531// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
11532// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
11533// # A::x, N::y, A<T>::z; "gs" means leading "::"
Howard Hinnant6f716a02011-06-22 19:27:39 +000011534// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
11535// # T::N::x /decltype(p)::N::x
11536// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011537
11538const char*
11539__demangle_tree::__parse_unresolved_name(const char* first, const char* last)
11540{
11541 if (last - first > 2)
11542 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011543 const char* t = first;
11544 bool global = false;
11545 if (t[0] == 'g' && t[1] == 's')
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011546 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011547 global = true;
11548 t += 2;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011549 }
Howard Hinnant6f716a02011-06-22 19:27:39 +000011550 const char* t2 = __parse_base_unresolved_name(t, last);
11551 if (t2 != t)
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011552 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011553 if (__make<__unresolved_name>(global, (__node*)0, __root_))
11554 first = t2;
11555 }
11556 else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
11557 {
11558 if (!global && t[2] == 'N')
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011559 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011560 t2 = __parse_unresolved_type(t+3, last);
11561 if (t2 != t+3 && t2 != last)
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011562 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011563 t = __parse_template_args(t2, last);
11564 if (t == last)
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011565 return first;
Howard Hinnant6f716a02011-06-22 19:27:39 +000011566 __node* name = __root_;
11567 while (*t != 'E')
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011568 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000011569 t2 = __parse_unresolved_qualifier_level(t, last);
11570 if (t2 == t || t2 == last)
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011571 return first;
11572 if (!__make<__nested_delimeter>(name, __root_))
11573 return first;
11574 name = __root_;
Howard Hinnant6f716a02011-06-22 19:27:39 +000011575 t = t2;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011576 }
Howard Hinnant6f716a02011-06-22 19:27:39 +000011577 t2 = __parse_base_unresolved_name(++t, last);
11578 if (t2 != t && __make<__unresolved_name>(false, name, __root_))
11579 first = t2;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011580 }
Howard Hinnant6f716a02011-06-22 19:27:39 +000011581 }
11582 else
11583 {
11584 if (!global)
11585 {
11586 t2 = __parse_unresolved_type(t+2, last);
11587 if (t2 != t+2)
11588 {
11589 t = t2;
11590 __node* name = __root_;
11591 t2 = __parse_base_unresolved_name(t, last);
11592 if (t2 != t && __make<__unresolved_name>(false, name, __root_))
11593 return t2;
11594 return first;
11595 }
11596 }
11597 t2 = __parse_unresolved_qualifier_level(t+2, last);
11598 if (t2 != t+2 && t2 != last)
11599 {
11600 __node* name = __root_;
11601 t = t2;
11602 while (*t != 'E')
11603 {
11604 t2 = __parse_unresolved_qualifier_level(t, last);
11605 if (t2 == t || t2 == last)
11606 return first;
11607 if (!__make<__nested_delimeter>(name, __root_))
11608 return first;
11609 name = __root_;
11610 t = t2;
11611 }
11612 t2 = __parse_base_unresolved_name(++t, last);
11613 if (t2 != t && __make<__unresolved_name>(global, name, __root_))
11614 first = t2;
11615 }
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000011616 }
11617 }
11618 }
11619 return first;
11620}
11621
11622// <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter
11623// ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters
11624// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter
11625// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers>
11626
11627const char*
11628__demangle_tree::__parse_function_param(const char* first, const char* last)
11629{
11630 if (last - first >= 3 && *first == 'f')
11631 {
11632 if (first[1] == 'p')
11633 {
11634 assert(!"__parse_function_param not implemented");
11635 }
11636 else if (first[1] == 'L')
11637 {
11638 assert(!"__parse_function_param not implemented");
11639 }
11640 }
11641 return first;
11642}
11643
11644// at <type> # alignof (a type)
11645
11646const char*
11647__demangle_tree::__parse_alignof_expr(const char* first, const char* last)
11648{
11649 if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
11650 {
11651 const char* t = __parse_type(first+2, last);
11652 if (t != first+2)
11653 {
11654 if (__make<__operator_alignof_expression>(__root_))
11655 first = t;
11656 }
11657 }
11658 return first;
11659}
11660
11661// cc <type> <expression> # const_cast<type> (expression)
11662
11663const char*
11664__demangle_tree::__parse_const_cast_expr(const char* first, const char* last)
11665{
11666 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
11667 {
11668 const char* t = __parse_type(first+2, last);
11669 if (t != first+2)
11670 {
11671 __node* type = __root_;
11672 const char* t1 = __parse_expression(t, last);
11673 if (t1 != t)
11674 {
11675 if (__make<__const_cast>(type, __root_))
11676 first = t1;
11677 }
11678 }
11679 }
11680 return first;
11681}
11682
11683// cl <expression>+ E # call
11684
11685const char*
11686__demangle_tree::__parse_call_expr(const char* first, const char* last)
11687{
11688 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
11689 {
11690 const char* t = __parse_expression(first+2, last);
11691 if (t != first+2)
11692 {
11693 if (t == last)
11694 return first;
11695 __node* name = __root_;
11696 __node* args = 0;
11697 __node* prev = 0;
11698 while (*t != 'E')
11699 {
11700 const char* t1 = __parse_expression(t, last);
11701 if (t1 == t || t1 == last)
11702 return first;
11703 if (!__make<__list>(__root_))
11704 return first;
11705 if (args == 0)
11706 args = __root_;
11707 if (prev)
11708 {
11709 prev->__right_ = __root_;
11710 __root_->__size_ = prev->__size_ + 1;
11711 }
11712 prev = __root_;
11713 t = t1;
11714 }
11715 ++t;
11716 if (__make<__call_expr>(name, args))
11717 first = t;
11718 }
11719 }
11720 return first;
11721}
11722
11723// cv <type> <expression> # conversion with one argument
11724// cv <type> _ <expression>* E # conversion with a different number of arguments
11725
11726const char*
11727__demangle_tree::__parse_conversion_expr(const char* first, const char* last)
11728{
11729 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
11730 {
11731 const char* t = __parse_type(first+2, last);
11732 if (t != first+2 && t != last)
11733 {
11734 __node* type = __root_;
11735 __node* args = 0;
11736 if (*t != '_')
11737 {
11738 const char* t1 = __parse_expression(t, last);
11739 if (t1 == t)
11740 return first;
11741 args = __root_;
11742 t = t1;
11743 }
11744 else
11745 {
11746 ++t;
11747 if (t == last)
11748 return first;
11749 __node* prev = 0;
11750 while (*t != 'E')
11751 {
11752 const char* t1 = __parse_expression(t, last);
11753 if (t1 == t || t1 == last)
11754 return first;
11755 if (!__make<__list>(__root_))
11756 return first;
11757 if (args == 0)
11758 args = __root_;
11759 if (prev)
11760 {
11761 prev->__right_ = __root_;
11762 __root_->__size_ = prev->__size_ + 1;
11763 }
11764 prev = __root_;
11765 t = t1;
11766 }
11767 ++t;
11768 }
11769 if (__make<__operator_cast>(type, args))
11770 first = t;
11771 }
11772 }
11773 return first;
11774}
11775
11776// [gs] da <expression> # delete[] expression
11777
11778const char*
11779__demangle_tree::__parse_delete_array_expr(const char* first, const char* last)
11780{
11781 if (last - first >= 4)
11782 {
11783 const char* t = first;
11784 bool parsed_gs = false;
11785 if (t[0] == 'g' && t[1] == 's')
11786 {
11787 t += 2;
11788 parsed_gs = true;
11789 }
11790 if (t[0] == 'd' && t[1] == 'a')
11791 {
11792 t += 2;
11793 const char* t1 = __parse_expression(t, last);
11794 if (t1 != t)
11795 {
11796 if (__make<__delete_array_expr>(parsed_gs, __root_))
11797 first = t1;
11798 }
11799 }
11800 }
11801 return first;
11802}
11803
11804// dc <type> <expression> # dynamic_cast<type> (expression)
11805
11806const char*
11807__demangle_tree::__parse_dynamic_cast_expr(const char* first, const char* last)
11808{
11809 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
11810 {
11811 const char* t = __parse_type(first+2, last);
11812 if (t != first+2)
11813 {
11814 __node* type = __root_;
11815 const char* t1 = __parse_expression(t, last);
11816 if (t1 != t)
11817 {
11818 if (__make<__dynamic_cast>(type, __root_))
11819 first = t1;
11820 }
11821 }
11822 }
11823 return first;
11824}
11825
11826// [gs] dl <expression> # delete expression
11827
11828const char*
11829__demangle_tree::__parse_delete_expr(const char* first, const char* last)
11830{
11831 if (last - first >= 4)
11832 {
11833 const char* t = first;
11834 bool parsed_gs = false;
11835 if (t[0] == 'g' && t[1] == 's')
11836 {
11837 t += 2;
11838 parsed_gs = true;
11839 }
11840 if (t[0] == 'd' && t[1] == 'l')
11841 {
11842 t += 2;
11843 const char* t1 = __parse_expression(t, last);
11844 if (t1 != t)
11845 {
11846 if (__make<__delete_expr>(parsed_gs, __root_))
11847 first = t1;
11848 }
11849 }
11850 }
11851 return first;
11852}
11853
11854// ds <expression> <expression> # expr.*expr
11855
11856const char*
11857__demangle_tree::__parse_dot_star_expr(const char* first, const char* last)
11858{
11859 if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
11860 {
11861 const char* t = __parse_expression(first+2, last);
11862 if (t != first+2)
11863 {
11864 __node* expr = __root_;
11865 const char* t1 = __parse_expression(t, last);
11866 if (t1 != t)
11867 {
11868 if (__make<__dot_star_expr>(expr, __root_))
11869 first = t1;
11870 }
11871 }
11872 }
11873 return first;
11874}
11875
11876// dt <expression> <unresolved-name> # expr.name
11877
11878const char*
11879__demangle_tree::__parse_dot_expr(const char* first, const char* last)
11880{
11881 if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
11882 {
11883 const char* t = __parse_expression(first+2, last);
11884 if (t != first+2)
11885 {
11886 __node* expr = __root_;
11887 const char* t1 = __parse_unresolved_name(t, last);
11888 if (t1 != t)
11889 {
11890 if (__make<__dot_expr>(expr, __root_))
11891 first = t1;
11892 }
11893 }
11894 }
11895 return first;
11896}
11897
11898// mm_ <expression> # prefix --
11899
11900const char*
11901__demangle_tree::__parse_decrement_expr(const char* first, const char* last)
11902{
11903 if (last - first > 3 && first[0] == 'm' && first[1] == 'm' && first[2] == '_')
11904 {
11905 const char* t = __parse_expression(first+3, last);
11906 if (t != first+3)
11907 {
11908 if (__make<__operator_decrement>(true, __root_))
11909 first = t;
11910 }
11911 }
11912 return first;
11913}
11914
11915// pp_ <expression> # prefix ++
11916
11917const char*
11918__demangle_tree::__parse_increment_expr(const char* first, const char* last)
11919{
11920 if (last - first > 3 && first[0] == 'p' && first[1] == 'p' && first[2] == '_')
11921 {
11922 const char* t = __parse_expression(first+3, last);
11923 if (t != first+3)
11924 {
11925 if (__make<__operator_increment>(true, __root_))
11926 first = t;
11927 }
11928 }
11929 return first;
11930}
11931
11932// [gs] nw <expression>* _ <type> E # new (expr-list) type
11933// [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
11934// [gs] na <expression>* _ <type> E # new[] (expr-list) type
11935// [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
11936// <initializer> ::= pi <expression>* E # parenthesized initialization
11937
11938const char*
11939__demangle_tree::__parse_new_expr(const char* first, const char* last)
11940{
11941 if (last - first >= 4)
11942 {
11943 const char* t = first;
11944 bool parsed_gs = false;
11945 if (t[0] == 'g' && t[1] == 's')
11946 {
11947 t += 2;
11948 parsed_gs = true;
11949 }
11950 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
11951 {
11952 bool is_array = t[1] == 'a';
11953 t += 2;
11954 if (t == last)
11955 return first;
11956 __node* expr = 0;
11957 __node* prev = 0;
11958 while (*t != '_')
11959 {
11960 const char* t1 = __parse_expression(t, last);
11961 if (t1 == t || t1 == last)
11962 return first;
11963 if (!__make<__list>(__root_))
11964 return first;
11965 if (expr == 0)
11966 expr = __root_;
11967 if (prev)
11968 {
11969 prev->__right_ = __root_;
11970 __root_->__size_ = prev->__size_ + 1;
11971 }
11972 prev = __root_;
11973 t = t1;
11974 }
11975 ++t;
11976 const char* t1 = __parse_type(t, last);
11977 if (t1 == t || t1 == last)
11978 return first;
11979 t = t1;
11980 __node* type = __root_;
11981 __node* init = 0;
11982 prev = 0;
11983 bool has_init = false;
11984 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
11985 {
11986 t += 2;
11987 has_init = true;
11988 while (*t != 'E')
11989 {
11990 t1 = __parse_expression(t, last);
11991 if (t1 == t || t1 == last)
11992 return first;
11993 if (!__make<__list>(__root_))
11994 return first;
11995 if (init == 0)
11996 init = __root_;
11997 if (prev)
11998 {
11999 prev->__right_ = __root_;
12000 __root_->__size_ = prev->__size_ + 1;
12001 }
12002 prev = __root_;
12003 t = t1;
12004 }
12005 }
12006 if (*t != 'E')
12007 return first;
12008 if (__make<__new_expr>(parsed_gs, is_array, has_init,
12009 expr, type, init))
12010 first = t;
12011 }
12012 }
12013 return first;
12014}
12015
12016// pt <expression> <unresolved-name> # expr->name
12017
12018const char*
12019__demangle_tree::__parse_arrow_expr(const char* first, const char* last)
12020{
12021 if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
12022 {
12023 const char* t = __parse_expression(first+2, last);
12024 if (t != first+2)
12025 {
12026 __node* expr = __root_;
12027 const char* t1 = __parse_unresolved_name(t, last);
12028 if (t1 != t)
12029 {
12030 if (__make<__arrow_expr>(expr, __root_))
12031 first = t1;
12032 }
12033 }
12034 }
12035 return first;
12036}
12037
12038// rc <type> <expression> # reinterpret_cast<type> (expression)
12039
12040const char*
12041__demangle_tree::__parse_reinterpret_cast_expr(const char* first, const char* last)
12042{
12043 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
12044 {
12045 const char* t = __parse_type(first+2, last);
12046 if (t != first+2)
12047 {
12048 __node* type = __root_;
12049 const char* t1 = __parse_expression(t, last);
12050 if (t1 != t)
12051 {
12052 if (__make<__reinterpret_cast>(type, __root_))
12053 first = t1;
12054 }
12055 }
12056 }
12057 return first;
12058}
12059
12060// sc <type> <expression> # static_cast<type> (expression)
12061
12062const char*
12063__demangle_tree::__parse_static_cast_expr(const char* first, const char* last)
12064{
12065 if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
12066 {
12067 const char* t = __parse_type(first+2, last);
12068 if (t != first+2)
12069 {
12070 __node* type = __root_;
12071 const char* t1 = __parse_expression(t, last);
12072 if (t1 != t)
12073 {
12074 if (__make<__static_cast>(type, __root_))
12075 first = t1;
12076 }
12077 }
12078 }
12079 return first;
12080}
12081
12082// st <type> # sizeof (a type)
12083
12084const char*
12085__demangle_tree::__parse_sizeof_type_expr(const char* first, const char* last)
12086{
12087 if (last - first >= 3 && first[0] == 's' && first[1] == 't')
12088 {
12089 const char* t = __parse_type(first+2, last);
12090 if (t != first+2)
12091 {
12092 if (__make<__operator_sizeof_expression>(__root_))
12093 first = t;
12094 }
12095 }
12096 return first;
12097}
12098
12099// sZ <template-param> # size of a parameter pack
12100
12101const char*
12102__demangle_tree::__parse_sizeof_param_pack_expr(const char* first, const char* last)
12103{
12104 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
12105 {
12106 const char* t = __parse_template_param(first+2, last);
12107 if (t != first+2)
12108 {
12109 if (__make<__operator_sizeof_param_pack>(__root_))
12110 first = t;
12111 }
12112 }
12113 return first;
12114}
12115
12116// sZ <function-param> # size of a function parameter pack
12117
12118const char*
12119__demangle_tree::__parse_sizeof_function_param_pack_expr(const char* first, const char* last)
12120{
12121 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
12122 {
12123 const char* t = __parse_function_param(first+2, last);
12124 if (t != first+2)
12125 {
12126 if (__make<__operator_sizeof_param_pack>(__root_))
12127 first = t;
12128 }
12129 }
12130 return first;
12131}
12132
12133// sp <expression> # pack expansion
12134
12135const char*
12136__demangle_tree::__parse_pack_expansion(const char* first, const char* last)
12137{
12138 if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
12139 {
12140 const char* t = __parse_expression(first+2, last);
12141 if (t != first+2)
12142 {
12143 if (__make<__pack_expansion>(__root_))
12144 first = t;
12145 }
12146 }
12147 return first;
12148}
12149
12150// te <expression> # typeid (expression)
12151// ti <type> # typeid (type)
12152
12153const char*
12154__demangle_tree::__parse_typeid_expr(const char* first, const char* last)
12155{
12156 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
12157 {
12158 const char* t;
12159 if (first[1] == 'e')
12160 t = __parse_expression(first+2, last);
12161 else
12162 t = __parse_type(first+2, last);
12163 if (t != first+2)
12164 {
12165 if (__make<__typeid>(__root_))
12166 first = t;
12167 }
12168 }
12169 return first;
12170}
12171
12172// tw <expression> # throw expression
12173
12174const char*
12175__demangle_tree::__parse_throw_expr(const char* first, const char* last)
12176{
12177 if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
12178 {
12179 const char* t = __parse_expression(first+2, last);
12180 if (t != first+2)
12181 {
12182 if (__make<__throw>(__root_))
12183 first = t;
12184 }
12185 }
12186 return first;
12187}
12188
12189// <expression> ::= <unary operator-name> <expression>
12190// ::= <binary operator-name> <expression> <expression>
12191// ::= <ternary operator-name> <expression> <expression> <expression>
12192// ::= cl <expression>+ E # call
12193// ::= cv <type> <expression> # conversion with one argument
12194// ::= cv <type> _ <expression>* E # conversion with a different number of arguments
12195// ::= [gs] nw <expression>* _ <type> E # new (expr-list) type
12196// ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
12197// ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type
12198// ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
12199// ::= [gs] dl <expression> # delete expression
12200// ::= [gs] da <expression> # delete[] expression
12201// ::= pp_ <expression> # prefix ++
12202// ::= mm_ <expression> # prefix --
12203// ::= ti <type> # typeid (type)
12204// ::= te <expression> # typeid (expression)
12205// ::= dc <type> <expression> # dynamic_cast<type> (expression)
12206// ::= sc <type> <expression> # static_cast<type> (expression)
12207// ::= cc <type> <expression> # const_cast<type> (expression)
12208// ::= rc <type> <expression> # reinterpret_cast<type> (expression)
12209// ::= st <type> # sizeof (a type)
12210// ::= at <type> # alignof (a type)
12211// ::= <template-param>
12212// ::= <function-param>
12213// ::= dt <expression> <unresolved-name> # expr.name
12214// ::= pt <expression> <unresolved-name> # expr->name
12215// ::= ds <expression> <expression> # expr.*expr
12216// ::= sZ <template-param> # size of a parameter pack
12217// ::= sZ <function-param> # size of a function parameter pack
12218// ::= sp <expression> # pack expansion
12219// ::= tw <expression> # throw expression
12220// ::= tr # throw with no operand (rethrow)
12221// ::= <unresolved-name> # f(p), N::f(p), ::f(p),
12222// # freestanding dependent name (e.g., T::x),
12223// # objectless nonstatic member reference
12224// ::= <expr-primary>
12225
12226const char*
12227__demangle_tree::__parse_expression(const char* first, const char* last)
12228{
12229 if (last - first >= 2)
12230 {
12231 const char* t = first;
12232 bool parsed_gs = false;
12233 if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
12234 {
12235 t += 2;
12236 parsed_gs = true;
12237 }
12238 switch (*t)
12239 {
12240 case 'L':
12241 t = __parse_expr_primary(first, last);
12242 break;
12243 case 'T':
12244 t = __parse_template_param(first, last);
12245 break;
12246 case 'f':
12247 t = __parse_function_param(first, last);
12248 break;
12249 case 'a':
12250 if (t[1] == 't')
12251 t = __parse_alignof_expr(first, last);
12252 break;
12253 case 'c':
12254 switch (t[1])
12255 {
12256 case 'c':
12257 t = __parse_const_cast_expr(first, last);
12258 break;
12259 case 'l':
12260 t = __parse_call_expr(first, last);
12261 break;
12262 case 'v':
12263 t = __parse_conversion_expr(first, last);
12264 break;
12265 }
12266 break;
12267 case 'd':
12268 switch (t[1])
12269 {
12270 case 'a':
12271 t = __parse_delete_array_expr(first, last);
12272 break;
12273 case 'c':
12274 t = __parse_dynamic_cast_expr(first, last);
12275 break;
12276 case 'l':
12277 t = __parse_delete_expr(first, last);
12278 break;
12279 case 's':
12280 t = __parse_dot_star_expr(first, last);
12281 break;
12282 case 't':
12283 t = __parse_dot_expr(first, last);
12284 break;
12285 }
12286 break;
12287 case 'm':
12288 t = __parse_decrement_expr(first, last);
12289 break;
12290 case 'n':
12291 switch (t[1])
12292 {
12293 case 'a':
12294 case 'w':
12295 t = __parse_new_expr(first, last);
12296 break;
12297 }
12298 break;
12299 case 'p':
12300 switch (t[1])
12301 {
12302 case 'p':
12303 t = __parse_increment_expr(first, last);
12304 break;
12305 case 't':
12306 t = __parse_arrow_expr(first, last);
12307 break;
12308 }
12309 break;
12310 case 'r':
12311 t = __parse_reinterpret_cast_expr(first, last);
12312 break;
12313 case 's':
12314 switch (t[1])
12315 {
12316 case 'c':
12317 t = __parse_static_cast_expr(first, last);
12318 break;
12319 case 'p':
12320 t = __parse_pack_expansion(first, last);
12321 break;
12322 case 't':
12323 t = __parse_sizeof_type_expr(first, last);
12324 break;
12325 case 'Z':
12326 if (last - t >= 3)
12327 {
12328 switch (t[2])
12329 {
12330 case 'T':
12331 t = __parse_sizeof_param_pack_expr(first, last);
12332 break;
12333 case 'f':
12334 t = __parse_sizeof_function_param_pack_expr(first, last);
12335 break;
12336 }
12337 }
12338 break;
12339 }
12340 break;
12341 case 't':
12342 switch (t[1])
12343 {
12344 case 'e':
12345 case 'i':
12346 t = __parse_typeid_expr(first, last);
12347 break;
12348 case 'r':
12349 if (__make<__rethrow>())
12350 t = first +2;
12351 break;
12352 case 'w':
12353 t = __parse_throw_expr(first, last);
12354 break;
12355 }
12356 break;
12357 }
12358 if ((!parsed_gs && t == first) || (parsed_gs && t == first+2))
12359 {
12360 int op;
12361 t = __parse_operator_name(first, last, &op);
12362 if (t == first)
12363 first = __parse_unresolved_name(first, last);
12364 else
12365 first = t;
12366 }
12367 else
12368 first = t;
12369 }
12370 return first;
12371}
12372
12373// <array-type> ::= A <positive dimension number> _ <element type>
12374// ::= A [<dimension expression>] _ <element type>
12375
12376const char*
12377__demangle_tree::__parse_array_type(const char* first, const char* last)
12378{
12379 if (first != last && *first == 'A' && first+1 != last)
12380 {
12381 if (first[1] == '_')
12382 {
12383 const char* t = __parse_type(first+2, last);
12384 if (t != first+2)
12385 {
12386 if (__make<__array>(__root_))
12387 first = t;
12388 }
12389 }
12390 else if ('1' <= first[1] && first[1] <= '9')
12391 {
12392 size_t dim = first[1] - '0';
12393 const char* t = first+2;
12394 for (; t != last && isdigit(*t); ++t)
12395 dim = dim * 10 + *t - '0';
12396 if (t != last && *t == '_')
12397 {
12398 const char* t2 = __parse_type(t+1, last);
12399 if (t2 != t+1)
12400 {
12401 if (__make<__array>(__root_, dim))
12402 first = t2;
12403 }
12404 }
12405 }
12406 else
12407 {
12408 const char* t = __parse_expression(first+1, last);
12409 if (t != first+1 && t != last && *t == '_')
12410 {
12411 __node* dim = __root_;
12412 const char* t2 = __parse_type(++t, last);
12413 if (t2 != t)
12414 {
12415 if (__make<__array>(__root_, dim))
12416 first = t2;
12417 }
12418 }
12419 }
12420 }
12421 return first;
12422}
12423
12424// <class-enum-type> ::= <name>
12425
12426const char*
12427__demangle_tree::__parse_class_enum_type(const char* first, const char* last)
12428{
12429 return __parse_name(first, last);
12430}
12431
12432// <pointer-to-member-type> ::= M <class type> <member type>
12433
12434const char*
12435__demangle_tree::__parse_pointer_to_member_type(const char* first, const char* last)
12436{
12437 if (first != last && *first == 'M')
12438 {
12439 const char* t = __parse_type(first+1, last);
12440 if (t != first+1)
12441 {
12442 __node* class_type = __root_;
12443 const char* t2 = __parse_type(t, last, true, true);
12444 if (t2 != t)
12445 {
12446 if (__make<__pointer_to_member_type>(class_type, __root_))
12447 first = t2;
12448 }
12449 }
12450 }
12451 return first;
12452}
12453
12454// <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x)
12455// ::= DT <expression> E # decltype of an expression (C++0x)
12456
12457const char*
12458__demangle_tree::__parse_decltype(const char* first, const char* last)
12459{
12460 if (last - first >= 4 && first[0] == 'D')
12461 {
12462 switch (first[1])
12463 {
12464 case 't':
12465 case 'T':
12466 {
12467 const char* t = __parse_expression(first+2, last);
12468 if (t != first+2 && t != last && *t == 'E')
12469 {
12470 if (__make<__decltype_node>(__root_))
12471 first = t+1;
12472 }
12473 }
12474 break;
12475 }
12476 }
12477 return first;
12478}
12479
12480// <template-param> ::= T_ # first template parameter
12481// ::= T <parameter-2 non-negative number> _
12482
12483const char*
12484__demangle_tree::__parse_template_param(const char* first, const char* last)
12485{
12486 if (last - first >= 2)
12487 {
12488 if (*first == 'T')
12489 {
12490 if (first[1] == '_')
12491 {
12492 if (__t_begin_ != __t_end_)
12493 {
12494 if (__make<__sub>(*__t_begin_))
12495 first += 2;
12496 }
12497 else
12498 {
12499 if (__make<__sub>(size_t(0)))
12500 {
12501 first += 2;
12502 __fix_forward_references_ = true;
12503 }
12504 }
12505 }
12506 else if (isdigit(first[1]))
12507 {
12508 const char* t = first+1;
12509 size_t sub = *t - '0';
12510 for (++t; t != last && isdigit(*t); ++t)
12511 {
12512 sub *= 10;
12513 sub += *t - '0';
12514 }
12515 if (t == last || *t != '_')
12516 return first;
12517 ++sub;
12518 if (sub < __t_end_ - __t_begin_)
12519 {
12520 if (__make<__sub>(__t_begin_[sub]))
12521 first = t+1;
12522 }
12523 else
12524 {
12525 if (__make<__sub>(sub))
12526 {
12527 first = t+1;
12528 __fix_forward_references_ = true;
12529 }
12530 }
12531 }
12532 }
12533 }
12534 return first;
12535}
12536
12537// <type> ::= <builtin-type>
12538// ::= <function-type>
12539// ::= <class-enum-type>
12540// ::= <array-type>
12541// ::= <pointer-to-member-type>
12542// ::= <template-param>
12543// ::= <template-template-param> <template-args>
12544// ::= <decltype>
12545// ::= <substitution>
12546// ::= <CV-qualifiers> <type>
12547// ::= P <type> # pointer-to
12548// ::= R <type> # reference-to
12549// ::= O <type> # rvalue reference-to (C++0x)
12550// ::= C <type> # complex pair (C 2000)
12551// ::= G <type> # imaginary (C 2000)
12552// ::= Dp <type> # pack expansion (C++0x)
12553// ::= U <source-name> <type> # vendor extended type qualifier
12554
12555const char*
12556__demangle_tree::__parse_type(const char* first, const char* last,
12557 bool try_to_parse_template_args,
12558 bool look_for_ref_quals)
12559{
12560 unsigned cv = 0;
12561 const char* t = __parse_cv_qualifiers(first, last, cv, look_for_ref_quals);
12562 if (t != first)
12563 {
12564 const char* t2 = __parse_type(t, last, try_to_parse_template_args);
12565 if (t2 != t)
12566 {
12567 if (__make<__cv_qualifiers>(cv, __root_))
12568 {
12569 if (__sub_end_ == __sub_cap_)
12570 __status_ = memory_alloc_failure;
12571 else
12572 {
12573 *__sub_end_++ = __root_;
12574 first = t2;
12575 }
12576 }
12577 }
12578 return first;
12579 }
12580 if (first != last)
12581 {
12582 switch (*first)
12583 {
12584 case 'A':
12585 t = __parse_array_type(first, last);
12586 if (t != first)
12587 {
12588 if (__sub_end_ == __sub_cap_)
12589 __status_ = memory_alloc_failure;
12590 else
12591 {
12592 *__sub_end_++ = __root_;
12593 first = t;
12594 }
12595 }
12596 break;
12597 case 'C':
12598 t = __parse_type(first+1, last, try_to_parse_template_args);
12599 if (t != first+1)
12600 {
12601 if (__make<__d_complex>(__root_))
12602 {
12603 if (__sub_end_ == __sub_cap_)
12604 __status_ = memory_alloc_failure;
12605 else
12606 {
12607 *__sub_end_++ = __root_;
12608 first = t;
12609 }
12610 }
12611 return first;
12612 }
12613 break;
12614 case 'F':
12615 t = __parse_function_type(first, last);
12616 if (t != first)
12617 {
12618 if (__sub_end_ == __sub_cap_)
12619 __status_ = memory_alloc_failure;
12620 else
12621 {
12622 *__sub_end_++ = __root_;
12623 first = t;
12624 }
12625 }
12626 break;
12627 case 'G':
12628 t = __parse_type(first+1, last, try_to_parse_template_args);
12629 if (t != first+1)
12630 {
12631 if (__make<__imaginary>(__root_))
12632 {
12633 if (__sub_end_ == __sub_cap_)
12634 __status_ = memory_alloc_failure;
12635 else
12636 {
12637 *__sub_end_++ = __root_;
12638 first = t;
12639 }
12640 }
12641 return first;
12642 }
12643 break;
12644 case 'M':
12645 t = __parse_pointer_to_member_type(first, last);
12646 if (t != first)
12647 {
12648 if (__sub_end_ == __sub_cap_)
12649 __status_ = memory_alloc_failure;
12650 else
12651 {
12652 *__sub_end_++ = __root_;
12653 first = t;
12654 }
12655 }
12656 break;
12657 case 'O':
12658 t = __parse_type(first+1, last, try_to_parse_template_args);
12659 if (t != first+1)
12660 {
12661 if (__make<__rvalue_reference_to>(__root_))
12662 {
12663 if (__sub_end_ == __sub_cap_)
12664 __status_ = memory_alloc_failure;
12665 else
12666 {
12667 *__sub_end_++ = __root_;
12668 first = t;
12669 }
12670 }
12671 return first;
12672 }
12673 break;
12674 case 'P':
12675 t = __parse_type(first+1, last, try_to_parse_template_args);
12676 if (t != first+1)
12677 {
12678 if (__make<__pointer_to>(__root_))
12679 {
12680 if (__sub_end_ == __sub_cap_)
12681 __status_ = memory_alloc_failure;
12682 else
12683 {
12684 *__sub_end_++ = __root_;
12685 first = t;
12686 }
12687 }
12688 return first;
12689 }
12690 break;
12691 case 'R':
12692 t = __parse_type(first+1, last, try_to_parse_template_args);
12693 if (t != first+1)
12694 {
12695 if (__make<__lvalue_reference_to>(__root_))
12696 {
12697 if (__sub_end_ == __sub_cap_)
12698 __status_ = memory_alloc_failure;
12699 else
12700 {
12701 *__sub_end_++ = __root_;
12702 first = t;
12703 }
12704 }
12705 return first;
12706 }
12707 break;
12708 case 'T':
12709 t = __parse_template_param(first, last);
12710 if (t != first)
12711 {
12712 if (__sub_end_ == __sub_cap_)
12713 __status_ = memory_alloc_failure;
12714 else
12715 {
12716 *__sub_end_++ = __root_;
12717 if (try_to_parse_template_args)
12718 {
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000012719 const char* t2 = __parse_template_args(t, last);
12720 if (t2 != t)
12721 {
12722 if (__sub_end_ < __sub_cap_)
12723 {
12724 *__sub_end_++ = __root_;
12725 first = t2;
12726 }
12727 else
12728 __status_ = memory_alloc_failure;
12729 }
12730 else
12731 {
12732 first = t;
12733 }
12734 }
12735 else
12736 {
12737 first = t;
12738 }
12739 }
12740 }
12741 break;
12742 case 'U':
12743 if (first+1 != last)
12744 {
12745 t = __parse_source_name(first+1, last);
12746 if (t != first+1)
12747 {
12748 __node* name = __root_;
12749 const char* t2 = __parse_type(t, last, try_to_parse_template_args);
12750 if (t2 != t)
12751 {
12752 if (__make<__extended_qualifier>(name, __root_))
12753 {
12754 if (__sub_end_ == __sub_cap_)
12755 __status_ = memory_alloc_failure;
12756 else
12757 {
12758 *__sub_end_++ = __root_;
12759 first = t2;
12760 }
12761 }
12762 return first;
12763 }
12764 }
12765 }
12766 break;
12767 case 'S':
12768 if (first+1 != last && first[1] == 't')
12769 {
12770 t = __parse_class_enum_type(first, last);
12771 if (t != first)
12772 {
12773 if (__sub_end_ == __sub_cap_)
12774 __status_ = memory_alloc_failure;
12775 else
12776 {
12777 *__sub_end_++ = __root_;
12778 first = t;
12779 }
12780 }
12781 }
12782 else
12783 {
12784 t = __parse_substitution(first, last);
12785 if (t != first)
12786 {
12787 first = t;
12788 // Parsed a substitution. If the substitution is a
12789 // <template-param> it might be followed by <template-args>.
12790 t = __parse_template_args(first, last);
12791 if (t != first)
12792 {
12793 // Need to create substitution for <template-template-param> <template-args>
12794 if (__sub_end_ == __sub_cap_)
12795 __status_ = memory_alloc_failure;
12796 else
12797 {
12798 *__sub_end_++ = __root_;
12799 first = t;
12800 }
12801 }
12802 }
12803 }
12804 break;
12805 case 'D':
12806 if (first+1 != last)
12807 {
12808 switch (first[1])
12809 {
12810 case 'p':
12811 t = __parse_type(first+2, last, try_to_parse_template_args);
12812 if (t != first+1)
12813 {
12814 if (__make<__pack_expansion>(__root_))
12815 {
12816 if (__sub_end_ == __sub_cap_)
12817 __status_ = memory_alloc_failure;
12818 else
12819 {
12820 *__sub_end_++ = __root_;
12821 first = t;
12822 }
12823 }
12824 return first;
12825 }
12826 break;
12827 case 't':
12828 case 'T':
12829 t = __parse_decltype(first, last);
12830 if (t != first)
12831 {
12832 if (__sub_end_ == __sub_cap_)
12833 __status_ = memory_alloc_failure;
12834 else
12835 {
12836 *__sub_end_++ = __root_;
12837 first = t;
12838 }
12839 return first;
12840 }
12841 break;
12842 }
12843 }
12844 // drop through
12845 default:
12846 // must check for builtin-types before class-enum-types to avoid
12847 // ambiguities with operator-names
12848 t = __parse_builtin_type(first, last);
12849 if (t != first)
12850 {
12851 first = t;
12852 }
12853 else
12854 {
12855 t = __parse_class_enum_type(first, last);
12856 if (t != first)
12857 {
12858 if (__sub_end_ == __sub_cap_)
12859 __status_ = memory_alloc_failure;
12860 else
12861 {
12862 *__sub_end_++ = __root_;
12863 first = t;
12864 }
12865 }
12866 }
12867 break;
12868 }
12869 }
12870 return first;
12871}
12872
12873// <number> ::= [n] <non-negative decimal integer>
12874
12875const char*
12876__demangle_tree::__parse_number(const char* first, const char* last)
12877{
12878 if (first != last)
12879 {
12880 const char* t = first;
12881 if (*t == 'n')
12882 ++t;
12883 if (t != last)
12884 {
12885 if (*t == '0')
12886 {
12887 first = t+1;
12888 }
12889 else if ('1' <= *t && *t <= '9')
12890 {
12891 first = t+1;
12892 while (first != last && isdigit(*first))
12893 ++first;
12894 }
12895 }
12896 }
12897 return first;
12898}
12899
12900// <call-offset> ::= h <nv-offset> _
12901// ::= v <v-offset> _
12902//
12903// <nv-offset> ::= <offset number>
12904// # non-virtual base override
12905//
12906// <v-offset> ::= <offset number> _ <virtual offset number>
12907// # virtual base override, with vcall offset
12908
12909const char*
12910__demangle_tree::__parse_call_offset(const char* first, const char* last)
12911{
12912 if (first != last)
12913 {
12914 switch (*first)
12915 {
12916 case 'h':
12917 {
12918 const char* t = __parse_number(first + 1, last);
12919 if (t != first + 1 && t != last && *t == '_')
12920 first = t + 1;
12921 }
12922 break;
12923 case 'v':
12924 {
12925 const char* t = __parse_number(first + 1, last);
12926 if (t != first + 1 && t != last && *t == '_')
12927 {
12928 const char* t2 = __parse_number(++t, last);
12929 if (t2 != t && t2 != last && *t2 == '_')
12930 first = t2 + 1;
12931 }
12932 }
12933 break;
12934 }
12935 }
12936 return first;
12937}
12938
12939// <special-name> ::= TV <type> # virtual table
12940// ::= TT <type> # VTT structure (construction vtable index)
12941// ::= TI <type> # typeinfo structure
12942// ::= TS <type> # typeinfo name (null-terminated byte string)
12943// ::= Tc <call-offset> <call-offset> <base encoding>
12944// # base is the nominal target function of thunk
12945// # first call-offset is 'this' adjustment
12946// # second call-offset is result adjustment
12947// ::= T <call-offset> <base encoding>
12948// # base is the nominal target function of thunk
12949// ::= GV <object name> # Guard variable for one-time initialization
12950// # No <type>
Howard Hinnant10115242011-12-09 20:07:56 +000012951// extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
12952// extension ::= GR <object name> # reference temporary for object
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000012953
12954const char*
12955__demangle_tree::__parse_special_name(const char* first, const char* last)
12956{
12957 if (last - first > 2)
12958 {
12959 const char* t;
12960 switch (*first)
12961 {
12962 case 'T':
12963 switch (first[1])
12964 {
12965 case 'V':
12966 // TV <type> # virtual table
12967 t = __parse_type(first+2, last);
12968 if (t != first+2 && __make<__vtable>(__root_))
12969 first = t;
12970 break;
12971 case 'T':
12972 // TT <type> # VTT structure (construction vtable index)
12973 t = __parse_type(first+2, last);
12974 if (t != first+2 && __make<__VTT>(__root_))
12975 first = t;
12976 break;
12977 case 'I':
12978 // TI <type> # typeinfo structure
12979 t = __parse_type(first+2, last);
12980 if (t != first+2 && __make<__typeinfo>(__root_))
12981 first = t;
12982 break;
12983 case 'S':
12984 // TS <type> # typeinfo name (null-terminated byte string)
12985 t = __parse_type(first+2, last);
12986 if (t != first+2 && __make<__typeinfo_name>(__root_))
12987 first = t;
12988 break;
12989 case 'c':
12990 // Tc <call-offset> <call-offset> <base encoding>
12991 {
12992 const char* t0 = __parse_call_offset(first+2, last);
12993 if (t0 == first+2)
12994 break;
12995 const char* t1 = __parse_call_offset(t0, last);
12996 if (t1 == t0)
12997 break;
12998 t = __parse_encoding(t1, last);
12999 if (t != t1 && __make<__covariant_return_thunk>(__root_))
13000 first = t;
13001 }
13002 break;
Howard Hinnant10115242011-12-09 20:07:56 +000013003 case 'C':
13004 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
13005 t = __parse_type(first+2, last);
13006 if (t != first+2)
13007 {
13008 __node* op1 = __root_;
13009 const char* t0 = __parse_number(t, last);
13010 if (t0 != t && t0 != last && *t0 == '_')
13011 {
13012 const char* t1 = __parse_type(++t0, last);
13013 if (t1 != t0)
13014 {
13015 if (__make<__construction_vtable>(__root_, op1))
13016 first = t1;
13017 }
13018 }
13019 }
13020 break;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000013021 default:
13022 // T <call-offset> <base encoding>
13023 {
13024 const char* t0 = __parse_call_offset(first+1, last);
13025 if (t0 == first+1)
13026 break;
13027 t = __parse_encoding(t0, last);
13028 if (t != t0)
13029 {
13030 if (first[2] == 'v')
13031 {
13032 if (__make<__virtual_thunk>(__root_))
13033 first = t;
13034 }
13035 else
13036 {
13037 if (__make<__non_virtual_thunk>(__root_))
13038 first = t;
13039 }
13040 }
13041 }
13042 break;
13043 }
13044 break;
13045 case 'G':
Howard Hinnant10115242011-12-09 20:07:56 +000013046 switch (first[1])
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000013047 {
Howard Hinnant10115242011-12-09 20:07:56 +000013048 case 'V':
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000013049 // GV <object name> # Guard variable for one-time initialization
13050 t = __parse_name(first+2, last);
13051 if (t != first+2 && __make<__guard_variable>(__root_))
13052 first = t;
Howard Hinnant10115242011-12-09 20:07:56 +000013053 break;
13054 case 'R':
13055 // extension ::= GR <object name> # reference temporary for object
13056 t = __parse_name(first+2, last);
13057 if (t != first+2 && __make<__reference_temporary>(__root_))
13058 first = t;
13059 break;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000013060 }
13061 break;
13062 }
13063 }
13064 return first;
13065}
13066
13067// <operator-name>
13068// ::= aa # &&
13069// ::= ad # & (unary)
13070// ::= an # &
13071// ::= aN # &=
13072// ::= aS # =
13073// ::= at # alignof (a type)
13074// ::= az # alignof (an expression)
13075// ::= cl # ()
13076// ::= cm # ,
13077// ::= co # ~
13078// ::= cv <type> # (cast)
13079// ::= da # delete[]
13080// ::= de # * (unary)
13081// ::= dl # delete
13082// ::= dv # /
13083// ::= dV # /=
13084// ::= eo # ^
13085// ::= eO # ^=
13086// ::= eq # ==
13087// ::= ge # >=
13088// ::= gt # >
13089// ::= ix # []
13090// ::= le # <=
13091// ::= ls # <<
13092// ::= lS # <<=
13093// ::= lt # <
13094// ::= mi # -
13095// ::= mI # -=
13096// ::= ml # *
13097// ::= mL # *=
13098// ::= mm # -- (postfix in <expression> context)
13099// ::= na # new[]
13100// ::= ne # !=
13101// ::= ng # - (unary)
13102// ::= nt # !
13103// ::= nw # new
13104// ::= oo # ||
13105// ::= or # |
13106// ::= oR # |=
13107// ::= pm # ->*
13108// ::= pl # +
13109// ::= pL # +=
13110// ::= pp # ++ (postfix in <expression> context)
13111// ::= ps # + (unary)
13112// ::= pt # ->
13113// ::= qu # ?
13114// ::= rm # %
13115// ::= rM # %=
13116// ::= rs # >>
13117// ::= rS # >>=
13118// ::= st # sizeof (a type)
13119// ::= sz # sizeof (an expression)
13120// ::= v <digit> <source-name> # vendor extended operator
13121
13122const char*
13123__demangle_tree::__parse_operator_name(const char* first, const char* last, int* type)
13124{
13125 if (last - first >= 2)
13126 {
13127 switch (*first)
13128 {
13129 case 'a':
13130 switch (first[1])
13131 {
13132 case 'a':
13133 // &&
13134 if (type)
13135 {
13136 const char* t = __parse_expression(first+2, last);
13137 if (t != first+2)
13138 {
13139 __node* op1 = __root_;
13140 const char* t2 = __parse_expression(t, last);
13141 if (t != t2)
13142 {
13143 if (__make<__operator_logical_and>(op1, __root_))
13144 {
13145 *type = 2;
13146 first = t2;
13147 }
13148 }
13149 }
13150 }
13151 else
13152 {
13153 if (__make<__operator_logical_and>())
13154 first += 2;
13155 }
13156 break;
13157 case 'd':
13158 // & (unary)
13159 if (type)
13160 {
13161 const char* t = __parse_expression(first+2, last);
13162 if (t != first+2)
13163 {
13164 if (__make<__operator_addressof>(__root_))
13165 {
13166 *type = 1;
13167 first = t;
13168 }
13169 }
13170 }
13171 else
13172 {
13173 if (__make<__operator_addressof>())
13174 first += 2;
13175 }
13176 break;
13177 case 'n':
13178 // &
13179 if (type)
13180 {
13181 const char* t = __parse_expression(first+2, last);
13182 if (t != first+2)
13183 {
13184 __node* op1 = __root_;
13185 const char* t2 = __parse_expression(t, last);
13186 if (t != t2)
13187 {
13188 if (__make<__operator_bit_and>(op1, __root_))
13189 {
13190 *type = 2;
13191 first = t2;
13192 }
13193 }
13194 }
13195 }
13196 else
13197 {
13198 if (__make<__operator_bit_and>())
13199 first += 2;
13200 }
13201 break;
13202 case 'N':
13203 // &=
13204 if (type)
13205 {
13206 const char* t = __parse_expression(first+2, last);
13207 if (t != first+2)
13208 {
13209 __node* op1 = __root_;
13210 const char* t2 = __parse_expression(t, last);
13211 if (t != t2)
13212 {
13213 if (__make<__operator_and_equal>(op1, __root_))
13214 {
13215 *type = 2;
13216 first = t2;
13217 }
13218 }
13219 }
13220 }
13221 else
13222 {
13223 if (__make<__operator_and_equal>())
13224 first += 2;
13225 }
13226 break;
13227 case 'S':
13228 // =
13229 if (type)
13230 {
13231 const char* t = __parse_expression(first+2, last);
13232 if (t != first+2)
13233 {
13234 __node* op1 = __root_;
13235 const char* t2 = __parse_expression(t, last);
13236 if (t != t2)
13237 {
13238 if (__make<__operator_equal>(op1, __root_))
13239 {
13240 *type = 2;
13241 first = t2;
13242 }
13243 }
13244 }
13245 }
13246 else
13247 {
13248 if (__make<__operator_equal>())
13249 first += 2;
13250 }
13251 break;
13252 case 't':
13253 // alignof (a type)
13254 if (type)
13255 {
13256 const char* t = __parse_expression(first+2, last);
13257 if (t != first+2)
13258 {
13259 if (__make<__operator_alignof_type>(__root_))
13260 {
13261 *type = -1;
13262 first = t;
13263 }
13264 }
13265 }
13266 else
13267 {
13268 if (__make<__operator_alignof_type>())
13269 first += 2;
13270 }
13271 break;
13272 case 'z':
13273 // alignof (an expression)
13274 if (type)
13275 {
13276 const char* t = __parse_expression(first+2, last);
13277 if (t != first+2)
13278 {
13279 if (__make<__operator_alignof_expression>(__root_))
13280 {
13281 *type = -1;
13282 first = t;
13283 }
13284 }
13285 }
13286 else
13287 {
13288 if (__make<__operator_alignof_expression>())
13289 first += 2;
13290 }
13291 break;
13292 }
13293 break;
13294 case 'c':
13295 switch (first[1])
13296 {
13297 case 'l':
13298 // ()
13299 if (__make<__operator_paren>())
13300 {
13301 first += 2;
13302 if (type)
13303 *type = -1;
13304 }
13305 break;
13306 case 'm':
13307 // ,
13308 if (type)
13309 {
13310 const char* t = __parse_expression(first+2, last);
13311 if (t != first+2)
13312 {
13313 __node* op1 = __root_;
13314 const char* t2 = __parse_expression(t, last);
13315 if (t != t2)
13316 {
13317 if (__make<__operator_comma>(op1, __root_))
13318 {
13319 *type = 2;
13320 first = t2;
13321 }
13322 }
13323 }
13324 }
13325 else
13326 {
13327 if (__make<__operator_comma>())
13328 first += 2;
13329 }
13330 break;
13331 case 'o':
13332 // ~
13333 if (type)
13334 {
13335 const char* t = __parse_expression(first+2, last);
13336 if (t != first+2)
13337 {
13338 if (__make<__operator_tilda>(__root_))
13339 {
13340 *type = 1;
13341 first = t;
13342 }
13343 }
13344 }
13345 else
13346 {
13347 if (__make<__operator_tilda>())
13348 first += 2;
13349 }
13350 break;
13351 case 'v':
13352 // cast <type>
13353 {
13354 const char* t = __parse_type(first+2, last, false);
13355 if (t != first+2)
13356 {
13357 __node* cast_type = __root_;
13358 if (type)
13359 {
13360 const char* t2 = __parse_expression(t, last);
13361 if (t2 != t)
13362 {
13363 if (__make<__operator_cast>(cast_type, __root_))
13364 {
13365 *type = -1;
13366 first = t2;
13367 }
13368 }
13369 }
13370 else
13371 {
13372 if (__make<__operator_cast>(cast_type))
13373 first = t;
13374 }
13375 }
13376 }
13377 break;
13378 }
13379 break;
13380 case 'd':
13381 switch (first[1])
13382 {
13383 case 'a':
13384 // delete[]
13385 if (__make<__operator_delete_array>())
13386 {
13387 first += 2;
13388 if (type)
13389 *type = -1;
13390 }
13391 break;
13392 case 'e':
13393 // * (unary)
13394 if (type)
13395 {
13396 const char* t = __parse_expression(first+2, last);
13397 if (t != first+2)
13398 {
13399 if (__make<__operator_dereference>(__root_))
13400 {
13401 *type = 1;
13402 first = t;
13403 }
13404 }
13405 }
13406 else
13407 {
13408 if (__make<__operator_dereference>())
13409 first += 2;
13410 }
13411 break;
13412 case 'l':
13413 // delete
13414 if (__make<__operator_delete>())
13415 {
13416 first += 2;
13417 if (type)
13418 *type = -1;
13419 }
13420 break;
13421 case 'v':
13422 // /
13423 if (type)
13424 {
13425 const char* t = __parse_expression(first+2, last);
13426 if (t != first+2)
13427 {
13428 __node* op1 = __root_;
13429 const char* t2 = __parse_expression(t, last);
13430 if (t != t2)
13431 {
13432 if (__make<__operator_divide>(op1, __root_))
13433 {
13434 *type = 2;
13435 first = t2;
13436 }
13437 }
13438 }
13439 }
13440 else
13441 {
13442 if (__make<__operator_divide>())
13443 first += 2;
13444 }
13445 break;
13446 case 'V':
13447 // /=
13448 if (type)
13449 {
13450 const char* t = __parse_expression(first+2, last);
13451 if (t != first+2)
13452 {
13453 __node* op1 = __root_;
13454 const char* t2 = __parse_expression(t, last);
13455 if (t != t2)
13456 {
13457 if (__make<__operator_divide_equal>(op1, __root_))
13458 {
13459 *type = 2;
13460 first = t2;
13461 }
13462 }
13463 }
13464 }
13465 else
13466 {
13467 if (__make<__operator_divide_equal>())
13468 first += 2;
13469 }
13470 break;
13471 }
13472 break;
13473 case 'e':
13474 switch (first[1])
13475 {
13476 case 'o':
13477 // ^
13478 if (type)
13479 {
13480 const char* t = __parse_expression(first+2, last);
13481 if (t != first+2)
13482 {
13483 __node* op1 = __root_;
13484 const char* t2 = __parse_expression(t, last);
13485 if (t != t2)
13486 {
13487 if (__make<__operator_xor>(op1, __root_))
13488 {
13489 *type = 2;
13490 first = t2;
13491 }
13492 }
13493 }
13494 }
13495 else
13496 {
13497 if (__make<__operator_xor>())
13498 first += 2;
13499 }
13500 break;
13501 case 'O':
13502 // ^=
13503 if (type)
13504 {
13505 const char* t = __parse_expression(first+2, last);
13506 if (t != first+2)
13507 {
13508 __node* op1 = __root_;
13509 const char* t2 = __parse_expression(t, last);
13510 if (t != t2)
13511 {
13512 if (__make<__operator_xor_equal>(op1, __root_))
13513 {
13514 *type = 2;
13515 first = t2;
13516 }
13517 }
13518 }
13519 }
13520 else
13521 {
13522 if (__make<__operator_xor_equal>())
13523 first += 2;
13524 }
13525 break;
13526 case 'q':
13527 // ==
13528 if (type)
13529 {
13530 const char* t = __parse_expression(first+2, last);
13531 if (t != first+2)
13532 {
13533 __node* op1 = __root_;
13534 const char* t2 = __parse_expression(t, last);
13535 if (t != t2)
13536 {
13537 if (__make<__operator_equality>(op1, __root_))
13538 {
13539 *type = 2;
13540 first = t2;
13541 }
13542 }
13543 }
13544 }
13545 else
13546 {
13547 if (__make<__operator_equality>())
13548 first += 2;
13549 }
13550 break;
13551 }
13552 break;
13553 case 'g':
13554 switch (first[1])
13555 {
13556 case 'e':
13557 // >=
13558 if (type)
13559 {
13560 const char* t = __parse_expression(first+2, last);
13561 if (t != first+2)
13562 {
13563 __node* op1 = __root_;
13564 const char* t2 = __parse_expression(t, last);
13565 if (t != t2)
13566 {
13567 if (__make<__operator_greater_equal>(op1, __root_))
13568 {
13569 *type = 2;
13570 first = t2;
13571 }
13572 }
13573 }
13574 }
13575 else
13576 {
13577 if (__make<__operator_greater_equal>())
13578 first += 2;
13579 }
13580 break;
13581 case 't':
13582 // >
13583 if (type)
13584 {
13585 const char* t = __parse_expression(first+2, last);
13586 if (t != first+2)
13587 {
13588 __node* op1 = __root_;
13589 const char* t2 = __parse_expression(t, last);
13590 if (t != t2)
13591 {
13592 if (__make<__operator_greater>(op1, __root_))
13593 {
13594 *type = 2;
13595 first = t2;
13596 }
13597 }
13598 }
13599 }
13600 else
13601 {
13602 if (__make<__operator_greater>())
13603 first += 2;
13604 }
13605 break;
13606 }
13607 break;
13608 case 'i':
13609 // []
13610 if (first[1] == 'x' && __make<__operator_brackets>())
13611 {
13612 first += 2;
13613 if (type)
13614 *type = -1;
13615 }
13616 break;
13617 case 'l':
13618 switch (first[1])
13619 {
13620 case 'e':
13621 // <=
13622 if (type)
13623 {
13624 const char* t = __parse_expression(first+2, last);
13625 if (t != first+2)
13626 {
13627 __node* op1 = __root_;
13628 const char* t2 = __parse_expression(t, last);
13629 if (t != t2)
13630 {
13631 if (__make<__operator_less_equal>(op1, __root_))
13632 {
13633 *type = 2;
13634 first = t2;
13635 }
13636 }
13637 }
13638 }
13639 else
13640 {
13641 if (__make<__operator_less_equal>())
13642 first += 2;
13643 }
13644 break;
13645 case 's':
13646 // <<
13647 if (type)
13648 {
13649 const char* t = __parse_expression(first+2, last);
13650 if (t != first+2)
13651 {
13652 __node* op1 = __root_;
13653 const char* t2 = __parse_expression(t, last);
13654 if (t != t2)
13655 {
13656 if (__make<__operator_left_shift>(op1, __root_))
13657 {
13658 *type = 2;
13659 first = t2;
13660 }
13661 }
13662 }
13663 }
13664 else
13665 {
13666 if (__make<__operator_left_shift>())
13667 first += 2;
13668 }
13669 break;
13670 case 'S':
13671 // <<=
13672 if (type)
13673 {
13674 const char* t = __parse_expression(first+2, last);
13675 if (t != first+2)
13676 {
13677 __node* op1 = __root_;
13678 const char* t2 = __parse_expression(t, last);
13679 if (t != t2)
13680 {
13681 if (__make<__operator_left_shift_equal>(op1, __root_))
13682 {
13683 *type = 2;
13684 first = t2;
13685 }
13686 }
13687 }
13688 }
13689 else
13690 {
13691 if (__make<__operator_left_shift_equal>())
13692 first += 2;
13693 }
13694 break;
13695 case 't':
13696 // <
13697 if (type)
13698 {
13699 const char* t = __parse_expression(first+2, last);
13700 if (t != first+2)
13701 {
13702 __node* op1 = __root_;
13703 const char* t2 = __parse_expression(t, last);
13704 if (t != t2)
13705 {
13706 if (__make<__operator_less>(op1, __root_))
13707 {
13708 *type = 2;
13709 first = t2;
13710 }
13711 }
13712 }
13713 }
13714 else
13715 {
13716 if (__make<__operator_less>())
13717 first += 2;
13718 }
13719 break;
13720 }
13721 break;
13722 case 'm':
13723 switch (first[1])
13724 {
13725 case 'i':
13726 // -
13727 if (type)
13728 {
13729 const char* t = __parse_expression(first+2, last);
13730 if (t != first+2)
13731 {
13732 __node* op1 = __root_;
13733 const char* t2 = __parse_expression(t, last);
13734 if (t != t2)
13735 {
13736 if (__make<__operator_minus>(op1, __root_))
13737 {
13738 *type = 2;
13739 first = t2;
13740 }
13741 }
13742 }
13743 }
13744 else
13745 {
13746 if (__make<__operator_minus>())
13747 first += 2;
13748 }
13749 break;
13750 case 'I':
13751 // -=
13752 if (type)
13753 {
13754 const char* t = __parse_expression(first+2, last);
13755 if (t != first+2)
13756 {
13757 __node* op1 = __root_;
13758 const char* t2 = __parse_expression(t, last);
13759 if (t != t2)
13760 {
13761 if (__make<__operator_minus_equal>(op1, __root_))
13762 {
13763 *type = 2;
13764 first = t2;
13765 }
13766 }
13767 }
13768 }
13769 else
13770 {
13771 if (__make<__operator_minus_equal>())
13772 first += 2;
13773 }
13774 break;
13775 case 'l':
13776 // *
13777 if (type)
13778 {
13779 const char* t = __parse_expression(first+2, last);
13780 if (t != first+2)
13781 {
13782 __node* op1 = __root_;
13783 const char* t2 = __parse_expression(t, last);
13784 if (t != t2)
13785 {
13786 if (__make<__operator_times>(op1, __root_))
13787 {
13788 *type = 2;
13789 first = t2;
13790 }
13791 }
13792 }
13793 }
13794 else
13795 {
13796 if (__make<__operator_times>())
13797 first += 2;
13798 }
13799 break;
13800 case 'L':
13801 // *=
13802 if (type)
13803 {
13804 const char* t = __parse_expression(first+2, last);
13805 if (t != first+2)
13806 {
13807 __node* op1 = __root_;
13808 const char* t2 = __parse_expression(t, last);
13809 if (t != t2)
13810 {
13811 if (__make<__operator_times_equal>(op1, __root_))
13812 {
13813 *type = 2;
13814 first = t2;
13815 }
13816 }
13817 }
13818 }
13819 else
13820 {
13821 if (__make<__operator_times_equal>())
13822 first += 2;
13823 }
13824 break;
13825 case 'm':
13826 // -- (postfix in <expression> context)
13827 if (type)
13828 {
13829 const char* t = __parse_expression(first+2, last);
13830 if (t != first+2)
13831 {
13832 if (__make<__operator_decrement>(false, __root_))
13833 {
13834 *type = 1;
13835 first = t;
13836 }
13837 }
13838 }
13839 else
13840 {
13841 if (__make<__operator_decrement>())
13842 first += 2;
13843 }
13844 break;
13845 }
13846 break;
13847 case 'n':
13848 switch (first[1])
13849 {
13850 case 'a':
13851 // new[]
13852 if (__make<__operator_new_array>())
13853 {
13854 first += 2;
13855 if (type)
13856 *type = -1;
13857 }
13858 break;
13859 case 'e':
13860 // !=
13861 if (type)
13862 {
13863 const char* t = __parse_expression(first+2, last);
13864 if (t != first+2)
13865 {
13866 __node* op1 = __root_;
13867 const char* t2 = __parse_expression(t, last);
13868 if (t != t2)
13869 {
13870 if (__make<__operator_not_equal>(op1, __root_))
13871 {
13872 *type = 2;
13873 first = t2;
13874 }
13875 }
13876 }
13877 }
13878 else
13879 {
13880 if (__make<__operator_not_equal>())
13881 first += 2;
13882 }
13883 break;
13884 case 'g':
13885 // - (unary)
13886 if (type)
13887 {
13888 const char* t = __parse_expression(first+2, last);
13889 if (t != first+2)
13890 {
13891 if (__make<__operator_negate>(__root_))
13892 {
13893 *type = 1;
13894 first = t;
13895 }
13896 }
13897 }
13898 else
13899 {
13900 if (__make<__operator_negate>())
13901 first += 2;
13902 }
13903 break;
13904 case 't':
13905 // !
13906 if (type)
13907 {
13908 const char* t = __parse_expression(first+2, last);
13909 if (t != first+2)
13910 {
13911 if (__make<__operator_logical_not>(__root_))
13912 {
13913 *type = 1;
13914 first = t;
13915 }
13916 }
13917 }
13918 else
13919 {
13920 if (__make<__operator_logical_not>())
13921 first += 2;
13922 }
13923 break;
13924 case 'w':
13925 // new
13926 if (__make<__operator_new>())
13927 {
13928 first += 2;
13929 if (type)
13930 *type = -1;
13931 }
13932 break;
13933 }
13934 break;
13935 case 'o':
13936 switch (first[1])
13937 {
13938 case 'o':
13939 // ||
13940 if (type)
13941 {
13942 const char* t = __parse_expression(first+2, last);
13943 if (t != first+2)
13944 {
13945 __node* op1 = __root_;
13946 const char* t2 = __parse_expression(t, last);
13947 if (t != t2)
13948 {
13949 if (__make<__operator_logical_or>(op1, __root_))
13950 {
13951 *type = 2;
13952 first = t2;
13953 }
13954 }
13955 }
13956 }
13957 else
13958 {
13959 if (__make<__operator_logical_or>())
13960 first += 2;
13961 }
13962 break;
13963 case 'r':
13964 // |
13965 if (type)
13966 {
13967 const char* t = __parse_expression(first+2, last);
13968 if (t != first+2)
13969 {
13970 __node* op1 = __root_;
13971 const char* t2 = __parse_expression(t, last);
13972 if (t != t2)
13973 {
13974 if (__make<__operator_bit_or>(op1, __root_))
13975 {
13976 *type = 2;
13977 first = t2;
13978 }
13979 }
13980 }
13981 }
13982 else
13983 {
13984 if (__make<__operator_bit_or>())
13985 first += 2;
13986 }
13987 break;
13988 case 'R':
13989 // |=
13990 if (type)
13991 {
13992 const char* t = __parse_expression(first+2, last);
13993 if (t != first+2)
13994 {
13995 __node* op1 = __root_;
13996 const char* t2 = __parse_expression(t, last);
13997 if (t != t2)
13998 {
13999 if (__make<__operator_or_equal>(op1, __root_))
14000 {
14001 *type = 2;
14002 first = t2;
14003 }
14004 }
14005 }
14006 }
14007 else
14008 {
14009 if (__make<__operator_or_equal>())
14010 first += 2;
14011 }
14012 break;
14013 }
14014 break;
14015 case 'p':
14016 switch (first[1])
14017 {
14018 case 'm':
14019 // ->*
14020 if (type)
14021 {
14022 const char* t = __parse_expression(first+2, last);
14023 if (t != first+2)
14024 {
14025 __node* op1 = __root_;
14026 const char* t2 = __parse_expression(t, last);
14027 if (t != t2)
14028 {
14029 if (__make<__operator_pointer_to_member>(op1, __root_))
14030 {
14031 *type = 2;
14032 first = t2;
14033 }
14034 }
14035 }
14036 }
14037 else
14038 {
14039 if (__make<__operator_pointer_to_member>())
14040 first += 2;
14041 }
14042 break;
14043 case 'l':
14044 // +
14045 if (type)
14046 {
14047 const char* t = __parse_expression(first+2, last);
14048 if (t != first+2)
14049 {
14050 __node* op1 = __root_;
14051 const char* t2 = __parse_expression(t, last);
14052 if (t != t2)
14053 {
14054 if (__make<__operator_plus>(op1, __root_))
14055 {
14056 *type = 2;
14057 first = t2;
14058 }
14059 }
14060 }
14061 }
14062 else
14063 {
14064 if (__make<__operator_plus>())
14065 first += 2;
14066 }
14067 break;
14068 case 'L':
14069 // +=
14070 if (type)
14071 {
14072 const char* t = __parse_expression(first+2, last);
14073 if (t != first+2)
14074 {
14075 __node* op1 = __root_;
14076 const char* t2 = __parse_expression(t, last);
14077 if (t != t2)
14078 {
14079 if (__make<__operator_plus_equal>(op1, __root_))
14080 {
14081 *type = 2;
14082 first = t2;
14083 }
14084 }
14085 }
14086 }
14087 else
14088 {
14089 if (__make<__operator_plus_equal>())
14090 first += 2;
14091 }
14092 break;
14093 case 'p':
14094 // ++ (postfix in <expression> context)
14095 if (type)
14096 {
14097 const char* t = __parse_expression(first+2, last);
14098 if (t != first+2)
14099 {
14100 if (__make<__operator_increment>(false, __root_))
14101 {
14102 *type = 1;
14103 first = t;
14104 }
14105 }
14106 }
14107 else
14108 {
14109 if (__make<__operator_increment>())
14110 first += 2;
14111 }
14112 break;
14113 case 's':
14114 // + (unary)
14115 if (type)
14116 {
14117 const char* t = __parse_expression(first+2, last);
14118 if (t != first+2)
14119 {
14120 if (__make<__operator_unary_plus>(__root_))
14121 {
14122 *type = 1;
14123 first = t;
14124 }
14125 }
14126 }
14127 else
14128 {
14129 if (__make<__operator_unary_plus>())
14130 first += 2;
14131 }
14132 break;
14133 case 't':
14134 // ->
14135 if (type)
14136 {
14137 const char* t = __parse_expression(first+2, last);
14138 if (t != first+2)
14139 {
14140 __node* op1 = __root_;
14141 const char* t2 = __parse_expression(t, last);
14142 if (t != t2)
14143 {
14144 if (__make<__operator_arrow>(op1, __root_))
14145 {
14146 *type = 2;
14147 first = t2;
14148 }
14149 }
14150 }
14151 }
14152 else
14153 {
14154 if (__make<__operator_arrow>())
14155 first += 2;
14156 }
14157 break;
14158 }
14159 break;
14160 case 'q':
14161 // ?
14162 if (first[1] == 'u')
14163 {
14164 if (type)
14165 {
14166 const char* t = __parse_expression(first+2, last);
14167 if (t != first+2)
14168 {
14169 __node* op1 = __root_;
14170 const char* t2 = __parse_expression(t, last);
14171 if (t != t2)
14172 {
14173 __node* op2 = __root_;
14174 const char* t3 = __parse_expression(t2, last);
14175 if (t3 != t2)
14176 {
14177 if (__make<__operator_conditional>(op1, op2, __root_))
14178 {
14179 *type = 3;
14180 first = t3;
14181 }
14182 }
14183 }
14184 }
14185 }
14186 else
14187 {
14188 if (__make<__operator_conditional>())
14189 first += 2;
14190 }
14191 }
14192 break;
14193 case 'r':
14194 switch (first[1])
14195 {
14196 case 'm':
14197 // %
14198 if (type)
14199 {
14200 const char* t = __parse_expression(first+2, last);
14201 if (t != first+2)
14202 {
14203 __node* op1 = __root_;
14204 const char* t2 = __parse_expression(t, last);
14205 if (t != t2)
14206 {
14207 if (__make<__operator_mod>(op1, __root_))
14208 {
14209 *type = 2;
14210 first = t2;
14211 }
14212 }
14213 }
14214 }
14215 else
14216 {
14217 if (__make<__operator_mod>())
14218 first += 2;
14219 }
14220 break;
14221 case 'M':
14222 // %=
14223 if (type)
14224 {
14225 const char* t = __parse_expression(first+2, last);
14226 if (t != first+2)
14227 {
14228 __node* op1 = __root_;
14229 const char* t2 = __parse_expression(t, last);
14230 if (t != t2)
14231 {
14232 if (__make<__operator_mod_equal>(op1, __root_))
14233 {
14234 *type = 2;
14235 first = t2;
14236 }
14237 }
14238 }
14239 }
14240 else
14241 {
14242 if (__make<__operator_mod_equal>())
14243 first += 2;
14244 }
14245 break;
14246 case 's':
14247 // >>
14248 if (type)
14249 {
14250 const char* t = __parse_expression(first+2, last);
14251 if (t != first+2)
14252 {
14253 __node* op1 = __root_;
14254 const char* t2 = __parse_expression(t, last);
14255 if (t != t2)
14256 {
14257 if (__make<__operator_right_shift>(op1, __root_))
14258 {
14259 *type = 2;
14260 first = t2;
14261 }
14262 }
14263 }
14264 }
14265 else
14266 {
14267 if (__make<__operator_right_shift>())
14268 first += 2;
14269 }
14270 break;
14271 case 'S':
14272 // >>=
14273 if (type)
14274 {
14275 const char* t = __parse_expression(first+2, last);
14276 if (t != first+2)
14277 {
14278 __node* op1 = __root_;
14279 const char* t2 = __parse_expression(t, last);
14280 if (t != t2)
14281 {
14282 if (__make<__operator_right_shift_equal>(op1, __root_))
14283 {
14284 *type = 2;
14285 first = t2;
14286 }
14287 }
14288 }
14289 }
14290 else
14291 {
14292 if (__make<__operator_right_shift_equal>())
14293 first += 2;
14294 }
14295 break;
14296 }
14297 break;
14298 case 's':
14299 switch (first[1])
14300 {
14301 case 't':
14302 // sizeof (a type)
14303 if (type)
14304 {
14305 const char* t = __parse_expression(first+2, last);
14306 if (t != first+2)
14307 {
14308 if (__make<__operator_sizeof_type>(__root_))
14309 {
14310 *type = -1;
14311 first = t;
14312 }
14313 }
14314 }
14315 else
14316 {
14317 if (__make<__operator_sizeof_type>())
14318 first += 2;
14319 }
14320 break;
14321 case 'z':
14322 // sizeof (an expression)
14323 if (type)
14324 {
14325 const char* t = __parse_expression(first+2, last);
14326 if (t != first+2)
14327 {
14328 if (__make<__operator_sizeof_expression>(__root_))
14329 {
14330 *type = -1;
14331 first = t;
14332 }
14333 }
14334 }
14335 else
14336 {
14337 if (__make<__operator_sizeof_expression>())
14338 first += 2;
14339 }
14340 break;
14341 }
14342 break;
14343 }
14344 }
14345 return first;
14346}
14347
14348// <source-name> ::= <positive length number> <identifier>
14349
14350const char*
14351__demangle_tree::__parse_source_name(const char* first, const char* last)
14352{
14353 if (first != last)
14354 {
14355 char c = *first;
14356 if ('1' <= c && c <= '9' && first+1 != last)
14357 {
14358 const char* t = first+1;
14359 size_t n = c - '0';
14360 for (c = *t; '0' <= c && c <= '9'; c = *t)
14361 {
14362 n = n * 10 + c - '0';
14363 if (++t == last)
14364 return first;
14365 }
14366 if (last - t >= n && __make<__source_name>(t, n))
14367 first = t + n;
14368 }
14369 }
14370 return first;
14371}
14372
14373// <unqualified-name> ::= <operator-name>
14374// ::= <ctor-dtor-name>
14375// ::= <source-name>
14376// ::= <unnamed-type-name>
14377
14378const char*
14379__demangle_tree::__parse_unqualified_name(const char* first, const char* last)
14380{
14381 const char* t = __parse_source_name(first, last);
14382 if (t == first)
14383 {
14384 t = __parse_ctor_dtor_name(first, last);
14385 if (t == first)
14386 {
14387 t = __parse_operator_name(first, last);
14388 if (t == first)
14389 first = __parse_unnamed_type_name(first, last);
14390 else
14391 first = t;
14392 }
14393 else
14394 first = t;
14395 }
14396 else
14397 first = t;
14398 return first;
14399}
14400
14401// <unscoped-name> ::= <unqualified-name>
14402// ::= St <unqualified-name> # ::std::
14403// extension ::= StL<unqualified-name>
14404
14405const char*
14406__demangle_tree::__parse_unscoped_name(const char* first, const char* last)
14407{
14408 if (last - first >= 2)
14409 {
14410 const char* t0 = first;
14411 if (first[0] == 'S' && first[1] == 't')
14412 {
14413 t0 += 2;
14414 if (t0 != last && *t0 == 'L')
14415 ++t0;
14416 }
14417 const char* t1 = __parse_unqualified_name(t0, last);
14418 if (t1 != t0)
14419 {
14420 if (t0 != first)
14421 {
14422 __node* name = __root_;
14423 if (__make<__std_qualified_name>())
14424 {
14425 if (__make<__nested_delimeter>(__root_, name))
14426 first = t1;
14427 }
14428 }
14429 else
14430 first = t1;
14431 }
14432 }
14433 return first;
14434}
14435
14436// <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
14437// ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
14438//
14439// <prefix> ::= <prefix> <unqualified-name>
14440// ::= <template-prefix> <template-args>
14441// ::= <template-param>
14442// ::= <decltype>
14443// ::= # empty
14444// ::= <substitution>
14445// ::= <prefix> <data-member-prefix>
14446// extension ::= L
14447//
14448// <template-prefix> ::= <prefix> <template unqualified-name>
14449// ::= <template-param>
14450// ::= <substitution>
14451
14452const char*
14453__demangle_tree::__parse_nested_name(const char* first, const char* last)
14454{
14455 if (first != last && *first == 'N')
14456 {
14457 unsigned cv = 0;
14458 const char* t0 = __parse_cv_qualifiers(first+1, last, cv, true);
14459 __node* prev = NULL;
14460 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
14461 {
14462 t0 += 2;
14463 if (!__make<__std_qualified_name>())
14464 return first;
14465 prev = __root_;
14466 }
14467 while (t0 != last)
14468 {
14469 bool can_sub = true;
14470 bool make_nested = true;
14471 const char* t1;
14472 switch (*t0)
14473 {
14474 case '1':
14475 case '2':
14476 case '3':
14477 case '4':
14478 case '5':
14479 case '6':
14480 case '7':
14481 case '8':
14482 case '9':
14483 t1 = __parse_source_name(t0, last);
14484 if (t1 == t0 || t1 == last)
14485 return first;
14486 if (*t1 == 'M')
14487 {
14488 // This is a data-member-prefix
14489 ++t1;
14490 }
14491 else if (*t1 == 'I')
14492 {
14493 // has following <template-args>
14494 if (prev)
14495 {
14496 if (!__make<__nested_delimeter>(prev, __root_))
14497 return first;
14498 make_nested = false;
14499 }
14500 if (__sub_end_ == __sub_cap_)
14501 {
14502 __status_ = memory_alloc_failure;
14503 return first;
14504 }
14505 else
14506 *__sub_end_++ = __root_;
14507 const char* t2 = __parse_template_args(t1, last);
14508 if (t2 == t1)
14509 return first;
14510 t1 = t2;
14511 }
14512 break;
14513 case 'D':
14514 if (t0+1 != last && (t0[1] == 't' || t0[1] == 'T'))
14515 {
14516 t1 = __parse_decltype(t0, last);
14517 break;
14518 }
14519 // check for Dt, DT here, else drop through
14520 case 'C':
14521 t1 = __parse_ctor_dtor_name(t0, last);
14522 if (t1 == t0 || t1 == last)
14523 return first;
14524 if (*t1 == 'I')
14525 {
14526 // has following <template-args>
14527 if (prev)
14528 {
14529 if (!__make<__nested_delimeter>(prev, __root_))
14530 return first;
14531 make_nested = false;
14532 }
14533 if (__sub_end_ == __sub_cap_)
14534 {
14535 __status_ = memory_alloc_failure;
14536 return first;
14537 }
14538 else
14539 *__sub_end_++ = __root_;
14540 const char* t2 = __parse_template_args(t1, last);
14541 if (t2 == t1)
14542 return first;
14543 t1 = t2;
14544 }
14545 break;
14546 case 'U':
14547 assert(!"__parse_nested_name U");
14548 // could have following <template-args>
14549 break;
14550 case 'T':
14551 t1 = __parse_template_param(t0, last);
14552 if (t1 == t0 || t1 == last)
14553 return first;
14554 if (*t1 == 'I')
14555 {
14556 // has following <template-args>
14557 if (prev)
14558 {
14559 if (!__make<__nested_delimeter>(prev, __root_))
14560 return first;
14561 make_nested = false;
14562 }
14563 if (__sub_end_ == __sub_cap_)
14564 {
14565 __status_ = memory_alloc_failure;
14566 return first;
14567 }
14568 else
14569 *__sub_end_++ = __root_;
14570 const char* t2 = __parse_template_args(t1, last);
14571 if (t2 == t1)
14572 return first;
14573 t1 = t2;
14574 }
14575 break;
14576 case 'S':
14577 t1 = __parse_substitution(t0, last);
14578 if (t1 == t0 || t1 == last)
14579 return first;
14580 if (*t1 == 'I')
14581 {
14582 const char* t2 = __parse_template_args(t1, last);
14583 if (t2 == t1)
14584 return first;
14585 t1 = t2;
14586 }
14587 else
14588 can_sub = false;
14589 break;
14590 case 'L':
14591 // extension: ignore L here
14592 ++t0;
14593 continue;
14594 default:
14595 t1 = __parse_operator_name(t0, last);
14596 if (t1 == t0 || t1 == last)
14597 return first;
14598 if (*t1 == 'I')
14599 {
14600 // has following <template-args>
14601 if (prev)
14602 {
14603 if (!__make<__nested_delimeter>(prev, __root_))
14604 return first;
14605 make_nested = false;
14606 }
14607 if (__sub_end_ == __sub_cap_)
14608 {
14609 __status_ = memory_alloc_failure;
14610 return first;
14611 }
14612 else
14613 *__sub_end_++ = __root_;
14614 const char* t2 = __parse_template_args(t1, last);
14615 if (t2 == t1)
14616 return first;
14617 t1 = t2;
14618 }
14619 break;
14620 }
14621 if (t1 == t0 || t1 == last)
14622 return first;
14623 if (prev && make_nested)
14624 {
14625 if (!__make<__nested_delimeter>(prev, __root_))
14626 return first;
14627 can_sub = true;
14628 }
14629 if (can_sub && *t1 != 'E')
14630 {
14631 if (__sub_end_ == __sub_cap_)
14632 {
14633 __status_ = memory_alloc_failure;
14634 return first;
14635 }
14636 else
14637 *__sub_end_++ = __root_;
14638 }
14639 if (*t1 == 'E')
14640 {
14641 if (cv != 0)
14642 {
14643 if (!__make<__cv_qualifiers>(cv, __root_))
14644 return first;
14645 }
14646 first = t1+1;
14647 break;
14648 }
14649 prev = __root_;
14650 t0 = t1;
14651 }
14652 }
14653 return first;
14654}
14655
14656// <template-arg> ::= <type> # type or template
14657// ::= X <expression> E # expression
14658// ::= <expr-primary> # simple expressions
14659// ::= J <template-arg>* E # argument pack
14660// ::= LZ <encoding> E # extension
14661
14662const char*
14663__demangle_tree::__parse_template_arg(const char* first, const char* last)
14664{
14665 if (first != last)
14666 {
14667 const char* t;
14668 switch (*first)
14669 {
14670 case 'X':
14671 t = __parse_expression(first+1, last);
14672 if (t != first+1)
14673 {
14674 if (t != last && *t == 'E')
14675 first = t+1;
14676 }
14677 break;
14678 case 'J':
14679 t = first+1;
14680 if (t == last)
14681 return first;
14682 if (*t == 'E')
14683 {
14684 if (__make<__list>((__node*)0))
14685 first = t+1;
14686 }
14687 else
14688 {
14689 __node* list = NULL;
14690 __node* prev = NULL;
14691 do
14692 {
14693 const char* t2 = __parse_template_arg(t, last);
14694 if (t2 == t || !__make<__list>(__root_))
14695 return first;
14696 if (list == 0)
14697 list = __root_;
14698 if (prev)
14699 {
14700 prev->__right_ = __root_;
14701 __root_->__size_ = prev->__size_ + 1;
14702 }
14703 prev = __root_;
14704 t = t2;
14705 } while (t != last && *t != 'E');
14706 first = t+1;
14707 __root_ = list;
14708 }
14709 break;
14710 case 'L':
14711 // <expr-primary> or LZ <encoding> E
14712 if (first+1 != last && first[1] == 'Z')
14713 {
14714 t = __parse_encoding(first+2, last);
14715 if (t != first+2 && t != last && *t == 'E')
14716 first = t+1;
14717 }
14718 else
14719 first = __parse_expr_primary(first, last);
14720 break;
14721 default:
14722 // <type>
14723 first = __parse_type(first, last);
14724 break;
14725 }
14726 }
14727 return first;
14728}
14729
14730// <template-args> ::= I <template-arg>* E
14731// extension, the abi says <template-arg>+
14732
14733const char*
14734__demangle_tree::__parse_template_args(const char* first, const char* last)
14735{
14736 if (last - first >= 2 && *first == 'I')
14737 {
14738 __node* args = NULL;
14739 __node* prev = NULL;
14740 __node* name = __root_;
14741 bool prev_tag_templates = __tag_templates_;
14742 __tag_templates_ = false;
14743 if (prev_tag_templates)
14744 __t_end_ = __t_begin_;
14745 const char* t = first+1;
14746 while (*t != 'E')
14747 {
14748 const char* t2 = __parse_template_arg(t, last);
14749 if (t2 == t || t2 == last)
14750 break;
14751 if (!__make<__list>(__root_))
14752 return first;
14753 if (args == 0)
14754 args = __root_;
14755 if (prev)
14756 {
14757 prev->__right_ = __root_;
14758 __root_->__size_ = prev->__size_ + 1;
14759 }
14760 prev = __root_;
14761 if (prev_tag_templates)
14762 {
14763 if (__t_end_ == __t_cap_)
14764 {
14765 __status_ = memory_alloc_failure;
14766 return first;
14767 }
14768 if (__root_->__left_)
14769 *__t_end_++ = __root_->__left_;
14770 else
14771 *__t_end_++ = __root_;
14772 }
14773 t = t2;
14774 }
14775 if (t != last && *t == 'E')
14776 {
14777 if (__make<__template_args>(name, args))
14778 first = t+1;
14779 }
14780 __tag_templates_ = prev_tag_templates;
14781 }
14782 return first;
14783}
14784
14785// <substitution> ::= S <seq-id> _
14786// ::= S_
14787// <substitution> ::= Sa # ::std::allocator
14788// <substitution> ::= Sb # ::std::basic_string
14789// <substitution> ::= Ss # ::std::basic_string < char,
14790// ::std::char_traits<char>,
14791// ::std::allocator<char> >
14792// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
14793// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
14794// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
14795
14796const char*
14797__demangle_tree::__parse_substitution(const char* first, const char* last)
14798{
14799 if (last - first >= 2)
14800 {
14801 if (*first == 'S')
14802 {
14803 switch (first[1])
14804 {
14805 case 'a':
14806 if (__make<__sub_allocator>())
14807 first += 2;
14808 break;
14809 case 'b':
14810 if (__make<__sub_basic_string>())
14811 first += 2;
14812 break;
14813 case 's':
14814 if (__make<__sub_string>())
14815 first += 2;
14816 break;
14817 case 'i':
14818 if (__make<__sub_istream>())
14819 first += 2;
14820 break;
14821 case 'o':
14822 if (__make<__sub_ostream>())
14823 first += 2;
14824 break;
14825 case 'd':
14826 if (__make<__sub_iostream>())
14827 first += 2;
14828 break;
14829 case '_':
14830 if (__sub_begin_ != __sub_end_)
14831 {
14832 if (__make<__sub>(*__sub_begin_))
14833 first += 2;
14834 }
14835 break;
14836 default:
14837 if (isdigit(first[1]) || isupper(first[1]))
14838 {
14839 size_t sub = 0;
14840 const char* t = first+1;
14841 if (isdigit(*t))
14842 sub = *t - '0';
14843 else
14844 sub = *t - 'A' + 10;
14845 for (++t; t != last && (isdigit(*t) || isupper(*t)); ++t)
14846 {
14847 sub *= 36;
14848 if (isdigit(*t))
14849 sub += *t - '0';
14850 else
14851 sub += *t - 'A' + 10;
14852 }
14853 if (t == last || *t != '_')
14854 return first;
14855 ++sub;
14856 if (sub < __sub_end_ - __sub_begin_)
14857 {
14858 if (__make<__sub>(__sub_begin_[sub]))
14859 first = t+1;
14860 }
14861 }
14862 break;
14863 }
14864 }
14865 }
14866 return first;
14867}
14868
14869// <name> ::= <nested-name>
14870// ::= <local-name> # See Scope Encoding below
14871// ::= <unscoped-template-name> <template-args>
14872// ::= <unscoped-name>
14873
14874const char*
14875__demangle_tree::__parse_name(const char* first, const char* last)
14876{
14877 if (first != last)
14878 {
14879 const char* t0 = first;
14880 // extension: ignore L here
14881 if (*t0 == 'L')
14882 ++t0;
14883 const char* t = __parse_nested_name(t0, last);
14884 if (t == t0)
14885 {
14886 t = __parse_local_name(t0, last);
14887 if (t == t0)
14888 {
14889 // not <nested-name> nor <local-name>
14890 // Try to parse <unscoped-template-name> <template-args> or
14891 // <unscoped-name> which are nearly ambiguous.
14892 // This logic occurs nowhere else.
14893 if (last - t0 >= 2)
14894 {
14895 if (t0[0] == 'S' && (t0[1] == '_' ||
14896 isdigit(t0[1]) ||
14897 isupper(t0[1]) ||
14898 t0[1] == 'a' ||
14899 t0[1] == 'b'))
14900 {
14901 t = __parse_substitution(t0, last);
14902 if (t != t0)
14903 {
14904 const char* t2 = __parse_template_args(t, last);
14905 if (t2 != t)
14906 first = t2;
14907 }
14908 }
14909 else // Not a substitution, except maybe St
14910 {
14911 t = __parse_unscoped_name(t0, last);
14912 if (t != t0)
14913 {
14914 // unscoped-name might be <unscoped-template-name>
14915 if (t != last && *t == 'I')
14916 {
14917 if (__sub_end_ == __sub_cap_)
14918 {
14919 __status_ = memory_alloc_failure;
14920 return first;
14921 }
14922 *__sub_end_++ = __root_;
14923 const char* t2 = __parse_template_args(t, last);
14924 if (t2 != t)
14925 first = t2;
14926 }
14927 else
14928 {
14929 // <unscoped-name>
14930 first = t;
14931 }
14932 }
14933 }
14934 }
14935 }
14936 else
14937 first = t;
14938 }
14939 else
14940 first = t;
14941 }
14942 return first;
14943}
14944
14945// extension
14946// <dot-suffix> := .<anything and everything>
14947
14948const char*
14949__demangle_tree::__parse_dot_suffix(const char* first, const char* last)
14950{
14951 if (first != last && *first == '.')
14952 {
14953 if (__make<__dot_suffix>(__root_, first, last-first))
14954 first = last;
14955 }
14956 return first;
14957}
14958
14959// <encoding> ::= <function name> <bare-function-type>
14960// ::= <data name>
14961// ::= <special-name>
14962
14963const char*
14964__demangle_tree::__parse_encoding(const char* first, const char* last)
14965{
14966 const char* t = __parse_name(first, last);
14967 if (t != first)
14968 {
Howard Hinnant6f716a02011-06-22 19:27:39 +000014969 if (t != last && *t != 'E' && *t != '.')
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000014970 {
14971 __node* name = __root_;
14972 bool has_return = name->ends_with_template() &&
14973 !name->is_ctor_dtor_conv();
14974 __node* ret = NULL;
14975 const char* t2;
14976 __tag_templates_ = false;
14977 if (has_return)
14978 {
14979 t2 = __parse_type(t, last);
14980 if (t2 != t)
14981 {
14982 ret = __root_;
14983 t = t2;
14984 }
14985 else
14986 return first;
14987 }
14988 t2 = __parse_bare_function_type(t, last);
14989 if (t2 != t)
14990 {
14991 if (dynamic_cast<__void*>(__root_->__left_) != NULL)
14992 __root_->__left_ = NULL;
14993 if (__make<__function_signature>(ret, __root_))
14994 {
14995 __node* cv = name->extract_cv(name);
14996 if (__make<__function>(name, __root_))
14997 {
14998 if (cv)
14999 {
15000 cv->__left_ = __root_;
15001 cv->__size_ <<= 5;
15002 __root_ = cv;
15003 }
15004 first = t2;
15005 }
15006 }
15007 }
15008 __tag_templates_ = true;
15009 }
15010 else
15011 first = t;
15012 }
15013 else
15014 first = __parse_special_name(first, last);
15015 return first;
15016}
15017
15018// <mangled-name> ::= _Z<encoding>
15019// ::= <type>
15020
15021void
15022__demangle_tree::__parse()
15023{
15024 if (__mangled_name_begin_ == __mangled_name_end_)
15025 {
15026 __status_ = invalid_mangled_name;
15027 return;
15028 }
15029 const char* t = NULL;
15030 if (__mangled_name_end_ - __mangled_name_begin_ >= 2 &&
15031 __mangled_name_begin_[0] == '_' &&
15032 __mangled_name_begin_[1] == 'Z')
15033 {
15034 t = __parse_encoding(__mangled_name_begin_+2, __mangled_name_end_);
15035 if (t != __mangled_name_begin_+2 && t != __mangled_name_end_ && *t == '.')
15036 t = __parse_dot_suffix(t, __mangled_name_end_);
15037 }
15038 else
15039 t = __parse_type(__mangled_name_begin_, __mangled_name_end_);
15040 if (t == __mangled_name_end_ && __root_)
15041 {
15042 if (__fix_forward_references_)
15043 {
15044 if (__root_->fix_forward_references(__t_begin_, __t_end_))
15045 __status_ = success;
15046 }
15047 else
15048 __status_ = success;
15049 }
15050}
15051
15052#pragma GCC visibility pop
15053#pragma GCC visibility push(default)
15054
15055__demangle_tree
15056__demangle(const char* mangled_name, char* buf, size_t bs)
15057{
15058 __demangle_tree t(mangled_name, buf, bs);
15059 if (t.__status() == invalid_mangled_name)
15060 t.__parse();
15061 return t;
15062}
15063
15064__demangle_tree
15065__demangle(const char* mangled_name)
15066{
15067 return __demangle(mangled_name, 0, 0);
15068}
15069
15070char*
15071__demangle(__demangle_tree dmg_tree, char* buf, size_t* n, int* status)
15072{
15073 if (dmg_tree.__status() != success)
15074 {
15075 if (status)
15076 *status = dmg_tree.__status();
15077 return NULL;
15078 }
15079#ifdef DEBUGGING
15080display(dmg_tree.__root_);
15081printf("\n");
15082#endif
15083 const size_t bs = buf == NULL ? 0 : *n;
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000015084 ptrdiff_t sm = dmg_tree.__mangled_name_end_ - dmg_tree.__mangled_name_begin_;
Howard Hinnant1e6731d2011-12-01 00:08:59 +000015085 ptrdiff_t est = sm + 60 * (
15086 (dmg_tree.__node_end_ - dmg_tree.__node_begin_) +
15087 (dmg_tree.__sub_end_ - dmg_tree.__sub_begin_) +
15088 (dmg_tree.__t_end_ - dmg_tree.__t_begin_));
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000015089 const unsigned N = 4096;
15090 char tmp[N];
15091 ptrdiff_t s;
15092 if (est <= bs)
15093 {
15094 char* e = dmg_tree.__get_demangled_name(buf);
15095 *e++ = '\0';
15096 s = e - buf;
15097 }
15098 else if (est <= N)
15099 {
15100 char* e = dmg_tree.__get_demangled_name(tmp);
15101 *e++ = '\0';
15102 s = e - tmp;
15103 }
15104 else
15105 s = dmg_tree.size() + 1;
15106 if (s > bs)
15107 {
15108 buf = static_cast<char*>(realloc(buf, s));
15109 if (buf == NULL)
15110 {
15111 if (status)
15112 *status = memory_alloc_failure;
15113 return NULL;
15114 }
15115 if (n)
15116 *n = s;
15117 }
15118 if (est > bs)
15119 {
15120 if (est <= N)
15121 strncpy(buf, tmp, s);
15122 else
15123 *dmg_tree.__get_demangled_name(buf) = '\0';
15124 }
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000015125 if (status)
15126 *status = success;
15127 return buf;
15128}
15129
15130} // __libcxxabi
15131
15132extern "C"
15133{
15134
15135char*
15136__cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status)
15137{
15138 if (mangled_name == NULL || (buf != NULL && n == NULL))
15139 {
15140 if (status)
15141 *status = __libcxxabi::invalid_args;
15142 return NULL;
15143 }
15144 const size_t bs = 64 * 1024;
Howard Hinnant828959c2011-11-28 21:03:21 +000015145 __attribute((aligned(16))) char static_buf[bs];
Howard Hinnant4fbf16a2011-05-05 15:27:28 +000015146
15147 buf = __libcxxabi::__demangle(__libcxxabi::__demangle(mangled_name,
15148 static_buf, bs),
15149 buf, n, status);
15150 return buf;
15151}
15152
15153} // extern "C"
15154
15155} // abi