Move stdio.h to common-defs.h
[external/binutils.git] / gdb / cp-name-parser.y
1 /* YACC parser for C++ names, for GDB.
2
3    Copyright (C) 2003-2014 Free Software Foundation, Inc.
4
5    Parts of the lexer are based on c-exp.y from GDB.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22 /* Note that malloc's and realloc's in this file are transformed to
23    xmalloc and xrealloc respectively by the same sed command in the
24    makefile that remaps any other malloc/realloc inserted by the parser
25    generator.  Doing this with #defines and trying to control the interaction
26    with include files (<malloc.h> and <stdlib.h> for example) just became
27    too messy, particularly when such includes can be inserted at random
28    times by the parser generator.  */
29
30 %{
31
32 #include "defs.h"
33
34 #include <stdlib.h>
35 #include <unistd.h>
36 #include <string.h>
37
38 #include "safe-ctype.h"
39 #include "libiberty.h"
40 #include "demangle.h"
41 #include "cp-support.h"
42 #include "gdb_assert.h"
43
44 /* Bison does not make it easy to create a parser without global
45    state, unfortunately.  Here are all the global variables used
46    in this parser.  */
47
48 /* LEXPTR is the current pointer into our lex buffer.  PREV_LEXPTR
49    is the start of the last token lexed, only used for diagnostics.
50    ERROR_LEXPTR is the first place an error occurred.  GLOBAL_ERRMSG
51    is the first error message encountered.  */
52
53 static const char *lexptr, *prev_lexptr, *error_lexptr, *global_errmsg;
54
55 /* The components built by the parser are allocated ahead of time,
56    and cached in this structure.  */
57
58 #define ALLOC_CHUNK 100
59
60 struct demangle_info {
61   int used;
62   struct demangle_info *next;
63   struct demangle_component comps[ALLOC_CHUNK];
64 };
65
66 static struct demangle_info *demangle_info;
67
68 static struct demangle_component *
69 d_grab (void)
70 {
71   struct demangle_info *more;
72
73   if (demangle_info->used >= ALLOC_CHUNK)
74     {
75       if (demangle_info->next == NULL)
76         {
77           more = malloc (sizeof (struct demangle_info));
78           more->next = NULL;
79           demangle_info->next = more;
80         }
81       else
82         more = demangle_info->next;
83
84       more->used = 0;
85       demangle_info = more;
86     }
87   return &demangle_info->comps[demangle_info->used++];
88 }
89
90 /* The parse tree created by the parser is stored here after a successful
91    parse.  */
92
93 static struct demangle_component *global_result;
94
95 /* Prototypes for helper functions used when constructing the parse
96    tree.  */
97
98 static struct demangle_component *d_qualify (struct demangle_component *, int,
99                                              int);
100
101 static struct demangle_component *d_int_type (int);
102
103 static struct demangle_component *d_unary (const char *,
104                                            struct demangle_component *);
105 static struct demangle_component *d_binary (const char *,
106                                             struct demangle_component *,
107                                             struct demangle_component *);
108
109 /* Flags passed to d_qualify.  */
110
111 #define QUAL_CONST 1
112 #define QUAL_RESTRICT 2
113 #define QUAL_VOLATILE 4
114
115 /* Flags passed to d_int_type.  */
116
117 #define INT_CHAR        (1 << 0)
118 #define INT_SHORT       (1 << 1)
119 #define INT_LONG        (1 << 2)
120 #define INT_LLONG       (1 << 3)
121
122 #define INT_SIGNED      (1 << 4)
123 #define INT_UNSIGNED    (1 << 5)
124
125 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
126    as well as gratuitiously global symbol names, so we can have multiple
127    yacc generated parsers in gdb.  Note that these are only the variables
128    produced by yacc.  If other parser generators (bison, byacc, etc) produce
129    additional global names that conflict at link time, then those parser
130    generators need to be fixed instead of adding those names to this list. */
131
132 #define yymaxdepth cpname_maxdepth
133 #define yyparse cpname_parse
134 #define yylex   cpname_lex
135 #define yyerror cpname_error
136 #define yylval  cpname_lval
137 #define yychar  cpname_char
138 #define yydebug cpname_debug
139 #define yypact  cpname_pact     
140 #define yyr1    cpname_r1                       
141 #define yyr2    cpname_r2                       
142 #define yydef   cpname_def              
143 #define yychk   cpname_chk              
144 #define yypgo   cpname_pgo              
145 #define yyact   cpname_act              
146 #define yyexca  cpname_exca
147 #define yyerrflag cpname_errflag
148 #define yynerrs cpname_nerrs
149 #define yyps    cpname_ps
150 #define yypv    cpname_pv
151 #define yys     cpname_s
152 #define yy_yys  cpname_yys
153 #define yystate cpname_state
154 #define yytmp   cpname_tmp
155 #define yyv     cpname_v
156 #define yy_yyv  cpname_yyv
157 #define yyval   cpname_val
158 #define yylloc  cpname_lloc
159 #define yyreds  cpname_reds             /* With YYDEBUG defined */
160 #define yytoks  cpname_toks             /* With YYDEBUG defined */
161 #define yyname  cpname_name             /* With YYDEBUG defined */
162 #define yyrule  cpname_rule             /* With YYDEBUG defined */
163 #define yylhs   cpname_yylhs
164 #define yylen   cpname_yylen
165 #define yydefred cpname_yydefred
166 #define yydgoto cpname_yydgoto
167 #define yysindex cpname_yysindex
168 #define yyrindex cpname_yyrindex
169 #define yygindex cpname_yygindex
170 #define yytable  cpname_yytable
171 #define yycheck  cpname_yycheck
172 #define yyss    cpname_yyss
173 #define yysslim cpname_yysslim
174 #define yyssp   cpname_yyssp
175 #define yystacksize cpname_yystacksize
176 #define yyvs    cpname_yyvs
177 #define yyvsp   cpname_yyvsp
178
179 int yyparse (void);
180 static int yylex (void);
181 static void yyerror (char *);
182
183 /* Enable yydebug for the stand-alone parser.  */
184 #ifdef TEST_CPNAMES
185 # define YYDEBUG        1
186 #endif
187
188 /* Helper functions.  These wrap the demangler tree interface, handle
189    allocation from our global store, and return the allocated component.  */
190
191 static struct demangle_component *
192 fill_comp (enum demangle_component_type d_type, struct demangle_component *lhs,
193            struct demangle_component *rhs)
194 {
195   struct demangle_component *ret = d_grab ();
196   int i;
197
198   i = cplus_demangle_fill_component (ret, d_type, lhs, rhs);
199   gdb_assert (i);
200
201   return ret;
202 }
203
204 static struct demangle_component *
205 make_empty (enum demangle_component_type d_type)
206 {
207   struct demangle_component *ret = d_grab ();
208   ret->type = d_type;
209   return ret;
210 }
211
212 static struct demangle_component *
213 make_operator (const char *name, int args)
214 {
215   struct demangle_component *ret = d_grab ();
216   int i;
217
218   i = cplus_demangle_fill_operator (ret, name, args);
219   gdb_assert (i);
220
221   return ret;
222 }
223
224 static struct demangle_component *
225 make_dtor (enum gnu_v3_dtor_kinds kind, struct demangle_component *name)
226 {
227   struct demangle_component *ret = d_grab ();
228   int i;
229
230   i = cplus_demangle_fill_dtor (ret, kind, name);
231   gdb_assert (i);
232
233   return ret;
234 }
235
236 static struct demangle_component *
237 make_builtin_type (const char *name)
238 {
239   struct demangle_component *ret = d_grab ();
240   int i;
241
242   i = cplus_demangle_fill_builtin_type (ret, name);
243   gdb_assert (i);
244
245   return ret;
246 }
247
248 static struct demangle_component *
249 make_name (const char *name, int len)
250 {
251   struct demangle_component *ret = d_grab ();
252   int i;
253
254   i = cplus_demangle_fill_name (ret, name, len);
255   gdb_assert (i);
256
257   return ret;
258 }
259
260 #define d_left(dc) (dc)->u.s_binary.left
261 #define d_right(dc) (dc)->u.s_binary.right
262
263 %}
264
265 %union
266   {
267     struct demangle_component *comp;
268     struct nested {
269       struct demangle_component *comp;
270       struct demangle_component **last;
271     } nested;
272     struct {
273       struct demangle_component *comp, *last;
274     } nested1;
275     struct {
276       struct demangle_component *comp, **last;
277       struct nested fn;
278       struct demangle_component *start;
279       int fold_flag;
280     } abstract;
281     int lval;
282     const char *opname;
283   }
284
285 %type <comp> exp exp1 type start start_opt operator colon_name
286 %type <comp> unqualified_name colon_ext_name
287 %type <comp> template template_arg
288 %type <comp> builtin_type
289 %type <comp> typespec_2 array_indicator
290 %type <comp> colon_ext_only ext_only_name
291
292 %type <comp> demangler_special function conversion_op
293 %type <nested> conversion_op_name
294
295 %type <abstract> abstract_declarator direct_abstract_declarator
296 %type <abstract> abstract_declarator_fn
297 %type <nested> declarator direct_declarator function_arglist
298
299 %type <nested> declarator_1 direct_declarator_1
300
301 %type <nested> template_params function_args
302 %type <nested> ptr_operator
303
304 %type <nested1> nested_name
305
306 %type <lval> qualifier qualifiers qualifiers_opt
307
308 %type <lval> int_part int_seq
309
310 %token <comp> INT
311 %token <comp> FLOAT
312
313 %token <comp> NAME
314 %type <comp> name
315
316 %token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON
317 %token TEMPLATE
318 %token ERROR
319 %token NEW DELETE OPERATOR
320 %token STATIC_CAST REINTERPRET_CAST DYNAMIC_CAST
321
322 /* Special type cases, put in to allow the parser to distinguish different
323    legal basetypes.  */
324 %token SIGNED_KEYWORD LONG SHORT INT_KEYWORD CONST_KEYWORD VOLATILE_KEYWORD DOUBLE_KEYWORD BOOL
325 %token ELLIPSIS RESTRICT VOID FLOAT_KEYWORD CHAR WCHAR_T
326
327 %token <opname> ASSIGN_MODIFY
328
329 /* C++ */
330 %token TRUEKEYWORD
331 %token FALSEKEYWORD
332
333 /* Non-C++ things we get from the demangler.  */
334 %token <lval> DEMANGLER_SPECIAL
335 %token CONSTRUCTION_VTABLE CONSTRUCTION_IN
336
337 /* Precedence declarations.  */
338
339 /* Give NAME lower precedence than COLONCOLON, so that nested_name will
340    associate greedily.  */
341 %nonassoc NAME
342
343 /* Give NEW and DELETE lower precedence than ']', because we can not
344    have an array of type operator new.  This causes NEW '[' to be
345    parsed as operator new[].  */
346 %nonassoc NEW DELETE
347
348 /* Give VOID higher precedence than NAME.  Then we can use %prec NAME
349    to prefer (VOID) to (function_args).  */
350 %nonassoc VOID
351
352 /* Give VOID lower precedence than ')' for similar reasons.  */
353 %nonassoc ')'
354
355 %left ','
356 %right '=' ASSIGN_MODIFY
357 %right '?'
358 %left OROR
359 %left ANDAND
360 %left '|'
361 %left '^'
362 %left '&'
363 %left EQUAL NOTEQUAL
364 %left '<' '>' LEQ GEQ
365 %left LSH RSH
366 %left '@'
367 %left '+' '-'
368 %left '*' '/' '%'
369 %right UNARY INCREMENT DECREMENT
370
371 /* We don't need a precedence for '(' in this reduced grammar, and it
372    can mask some unpleasant bugs, so disable it for now.  */
373
374 %right ARROW '.' '[' /* '(' */
375 %left COLONCOLON
376
377 \f
378 %%
379
380 result          :       start
381                         { global_result = $1; }
382                 ;
383
384 start           :       type
385
386                 |       demangler_special
387
388                 |       function
389
390                 ;
391
392 start_opt       :       /* */
393                         { $$ = NULL; }
394                 |       COLONCOLON start
395                         { $$ = $2; }
396                 ;
397
398 function
399                 /* Function with a return type.  declarator_1 is used to prevent
400                    ambiguity with the next rule.  */
401                 :       typespec_2 declarator_1
402                         { $$ = $2.comp;
403                           *$2.last = $1;
404                         }
405
406                 /* Function without a return type.  We need to use typespec_2
407                    to prevent conflicts from qualifiers_opt - harmless.  The
408                    start_opt is used to handle "function-local" variables and
409                    types.  */
410                 |       typespec_2 function_arglist start_opt
411                         { $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
412                           if ($3) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $3); }
413                 |       colon_ext_only function_arglist start_opt
414                         { $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
415                           if ($3) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $3); }
416
417                 |       conversion_op_name start_opt
418                         { $$ = $1.comp;
419                           if ($2) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $2); }
420                 |       conversion_op_name abstract_declarator_fn
421                         { if ($2.last)
422                             {
423                                /* First complete the abstract_declarator's type using
424                                   the typespec from the conversion_op_name.  */
425                               *$2.last = *$1.last;
426                               /* Then complete the conversion_op_name with the type.  */
427                               *$1.last = $2.comp;
428                             }
429                           /* If we have an arglist, build a function type.  */
430                           if ($2.fn.comp)
431                             $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1.comp, $2.fn.comp);
432                           else
433                             $$ = $1.comp;
434                           if ($2.start) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $2.start);
435                         }
436                 ;
437
438 demangler_special
439                 :       DEMANGLER_SPECIAL start
440                         { $$ = make_empty ($1);
441                           d_left ($$) = $2;
442                           d_right ($$) = NULL; }
443                 |       CONSTRUCTION_VTABLE start CONSTRUCTION_IN start
444                         { $$ = fill_comp (DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, $2, $4); }
445                 ;
446
447 operator        :       OPERATOR NEW
448                         {
449                           /* Match the whitespacing of cplus_demangle_operators.
450                              It would abort on unrecognized string otherwise.  */
451                           $$ = make_operator ("new", 3);
452                         }
453                 |       OPERATOR DELETE
454                         {
455                           /* Match the whitespacing of cplus_demangle_operators.
456                              It would abort on unrecognized string otherwise.  */
457                           $$ = make_operator ("delete ", 1);
458                         }
459                 |       OPERATOR NEW '[' ']'
460                         {
461                           /* Match the whitespacing of cplus_demangle_operators.
462                              It would abort on unrecognized string otherwise.  */
463                           $$ = make_operator ("new[]", 3);
464                         }
465                 |       OPERATOR DELETE '[' ']'
466                         {
467                           /* Match the whitespacing of cplus_demangle_operators.
468                              It would abort on unrecognized string otherwise.  */
469                           $$ = make_operator ("delete[] ", 1);
470                         }
471                 |       OPERATOR '+'
472                         { $$ = make_operator ("+", 2); }
473                 |       OPERATOR '-'
474                         { $$ = make_operator ("-", 2); }
475                 |       OPERATOR '*'
476                         { $$ = make_operator ("*", 2); }
477                 |       OPERATOR '/'
478                         { $$ = make_operator ("/", 2); }
479                 |       OPERATOR '%'
480                         { $$ = make_operator ("%", 2); }
481                 |       OPERATOR '^'
482                         { $$ = make_operator ("^", 2); }
483                 |       OPERATOR '&'
484                         { $$ = make_operator ("&", 2); }
485                 |       OPERATOR '|'
486                         { $$ = make_operator ("|", 2); }
487                 |       OPERATOR '~'
488                         { $$ = make_operator ("~", 1); }
489                 |       OPERATOR '!'
490                         { $$ = make_operator ("!", 1); }
491                 |       OPERATOR '='
492                         { $$ = make_operator ("=", 2); }
493                 |       OPERATOR '<'
494                         { $$ = make_operator ("<", 2); }
495                 |       OPERATOR '>'
496                         { $$ = make_operator (">", 2); }
497                 |       OPERATOR ASSIGN_MODIFY
498                         { $$ = make_operator ($2, 2); }
499                 |       OPERATOR LSH
500                         { $$ = make_operator ("<<", 2); }
501                 |       OPERATOR RSH
502                         { $$ = make_operator (">>", 2); }
503                 |       OPERATOR EQUAL
504                         { $$ = make_operator ("==", 2); }
505                 |       OPERATOR NOTEQUAL
506                         { $$ = make_operator ("!=", 2); }
507                 |       OPERATOR LEQ
508                         { $$ = make_operator ("<=", 2); }
509                 |       OPERATOR GEQ
510                         { $$ = make_operator (">=", 2); }
511                 |       OPERATOR ANDAND
512                         { $$ = make_operator ("&&", 2); }
513                 |       OPERATOR OROR
514                         { $$ = make_operator ("||", 2); }
515                 |       OPERATOR INCREMENT
516                         { $$ = make_operator ("++", 1); }
517                 |       OPERATOR DECREMENT
518                         { $$ = make_operator ("--", 1); }
519                 |       OPERATOR ','
520                         { $$ = make_operator (",", 2); }
521                 |       OPERATOR ARROW '*'
522                         { $$ = make_operator ("->*", 2); }
523                 |       OPERATOR ARROW
524                         { $$ = make_operator ("->", 2); }
525                 |       OPERATOR '(' ')'
526                         { $$ = make_operator ("()", 2); }
527                 |       OPERATOR '[' ']'
528                         { $$ = make_operator ("[]", 2); }
529                 ;
530
531                 /* Conversion operators.  We don't try to handle some of
532                    the wackier demangler output for function pointers,
533                    since it's not clear that it's parseable.  */
534 conversion_op
535                 :       OPERATOR typespec_2
536                         { $$ = fill_comp (DEMANGLE_COMPONENT_CAST, $2, NULL); }
537                 ;
538
539 conversion_op_name
540                 :       nested_name conversion_op
541                         { $$.comp = $1.comp;
542                           d_right ($1.last) = $2;
543                           $$.last = &d_left ($2);
544                         }
545                 |       conversion_op
546                         { $$.comp = $1;
547                           $$.last = &d_left ($1);
548                         }
549                 |       COLONCOLON nested_name conversion_op
550                         { $$.comp = $2.comp;
551                           d_right ($2.last) = $3;
552                           $$.last = &d_left ($3);
553                         }
554                 |       COLONCOLON conversion_op
555                         { $$.comp = $2;
556                           $$.last = &d_left ($2);
557                         }
558                 ;
559
560 /* DEMANGLE_COMPONENT_NAME */
561 /* This accepts certain invalid placements of '~'.  */
562 unqualified_name:       operator
563                 |       operator '<' template_params '>'
564                         { $$ = fill_comp (DEMANGLE_COMPONENT_TEMPLATE, $1, $3.comp); }
565                 |       '~' NAME
566                         { $$ = make_dtor (gnu_v3_complete_object_dtor, $2); }
567                 ;
568
569 /* This rule is used in name and nested_name, and expanded inline there
570    for efficiency.  */
571 /*
572 scope_id        :       NAME
573                 |       template
574                 ;
575 */
576
577 colon_name      :       name
578                 |       COLONCOLON name
579                         { $$ = $2; }
580                 ;
581
582 /* DEMANGLE_COMPONENT_QUAL_NAME */
583 /* DEMANGLE_COMPONENT_CTOR / DEMANGLE_COMPONENT_DTOR ? */
584 name            :       nested_name NAME %prec NAME
585                         { $$ = $1.comp; d_right ($1.last) = $2; }
586                 |       NAME %prec NAME
587                 |       nested_name template %prec NAME
588                         { $$ = $1.comp; d_right ($1.last) = $2; }
589                 |       template %prec NAME
590                 ;
591
592 colon_ext_name  :       colon_name
593                 |       colon_ext_only
594                 ;
595
596 colon_ext_only  :       ext_only_name
597                 |       COLONCOLON ext_only_name
598                         { $$ = $2; }
599                 ;
600
601 ext_only_name   :       nested_name unqualified_name
602                         { $$ = $1.comp; d_right ($1.last) = $2; }
603                 |       unqualified_name
604                 ;
605
606 nested_name     :       NAME COLONCOLON
607                         { $$.comp = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
608                           d_left ($$.comp) = $1;
609                           d_right ($$.comp) = NULL;
610                           $$.last = $$.comp;
611                         }
612                 |       nested_name NAME COLONCOLON
613                         { $$.comp = $1.comp;
614                           d_right ($1.last) = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
615                           $$.last = d_right ($1.last);
616                           d_left ($$.last) = $2;
617                           d_right ($$.last) = NULL;
618                         }
619                 |       template COLONCOLON
620                         { $$.comp = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
621                           d_left ($$.comp) = $1;
622                           d_right ($$.comp) = NULL;
623                           $$.last = $$.comp;
624                         }
625                 |       nested_name template COLONCOLON
626                         { $$.comp = $1.comp;
627                           d_right ($1.last) = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
628                           $$.last = d_right ($1.last);
629                           d_left ($$.last) = $2;
630                           d_right ($$.last) = NULL;
631                         }
632                 ;
633
634 /* DEMANGLE_COMPONENT_TEMPLATE */
635 /* DEMANGLE_COMPONENT_TEMPLATE_ARGLIST */
636 template        :       NAME '<' template_params '>'
637                         { $$ = fill_comp (DEMANGLE_COMPONENT_TEMPLATE, $1, $3.comp); }
638                 ;
639
640 template_params :       template_arg
641                         { $$.comp = fill_comp (DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, $1, NULL);
642                         $$.last = &d_right ($$.comp); }
643                 |       template_params ',' template_arg
644                         { $$.comp = $1.comp;
645                           *$1.last = fill_comp (DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, $3, NULL);
646                           $$.last = &d_right (*$1.last);
647                         }
648                 ;
649
650 /* "type" is inlined into template_arg and function_args.  */
651
652 /* Also an integral constant-expression of integral type, and a
653    pointer to member (?) */
654 template_arg    :       typespec_2
655                 |       typespec_2 abstract_declarator
656                         { $$ = $2.comp;
657                           *$2.last = $1;
658                         }
659                 |       '&' start
660                         { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $2); }
661                 |       '&' '(' start ')'
662                         { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $3); }
663                 |       exp
664                 ;
665
666 function_args   :       typespec_2
667                         { $$.comp = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $1, NULL);
668                           $$.last = &d_right ($$.comp);
669                         }
670                 |       typespec_2 abstract_declarator
671                         { *$2.last = $1;
672                           $$.comp = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $2.comp, NULL);
673                           $$.last = &d_right ($$.comp);
674                         }
675                 |       function_args ',' typespec_2
676                         { *$1.last = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $3, NULL);
677                           $$.comp = $1.comp;
678                           $$.last = &d_right (*$1.last);
679                         }
680                 |       function_args ',' typespec_2 abstract_declarator
681                         { *$4.last = $3;
682                           *$1.last = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $4.comp, NULL);
683                           $$.comp = $1.comp;
684                           $$.last = &d_right (*$1.last);
685                         }
686                 |       function_args ',' ELLIPSIS
687                         { *$1.last
688                             = fill_comp (DEMANGLE_COMPONENT_ARGLIST,
689                                            make_builtin_type ("..."),
690                                            NULL);
691                           $$.comp = $1.comp;
692                           $$.last = &d_right (*$1.last);
693                         }
694                 ;
695
696 function_arglist:       '(' function_args ')' qualifiers_opt %prec NAME
697                         { $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, $2.comp);
698                           $$.last = &d_left ($$.comp);
699                           $$.comp = d_qualify ($$.comp, $4, 1); }
700                 |       '(' VOID ')' qualifiers_opt
701                         { $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, NULL);
702                           $$.last = &d_left ($$.comp);
703                           $$.comp = d_qualify ($$.comp, $4, 1); }
704                 |       '(' ')' qualifiers_opt
705                         { $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, NULL);
706                           $$.last = &d_left ($$.comp);
707                           $$.comp = d_qualify ($$.comp, $3, 1); }
708                 ;
709
710 /* Should do something about DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL */
711 qualifiers_opt  :       /* epsilon */
712                         { $$ = 0; }
713                 |       qualifiers
714                 ;
715
716 qualifier       :       RESTRICT
717                         { $$ = QUAL_RESTRICT; }
718                 |       VOLATILE_KEYWORD
719                         { $$ = QUAL_VOLATILE; }
720                 |       CONST_KEYWORD
721                         { $$ = QUAL_CONST; }
722                 ;
723
724 qualifiers      :       qualifier
725                 |       qualifier qualifiers
726                         { $$ = $1 | $2; }
727                 ;
728
729 /* This accepts all sorts of invalid constructions and produces
730    invalid output for them - an error would be better.  */
731
732 int_part        :       INT_KEYWORD
733                         { $$ = 0; }
734                 |       SIGNED_KEYWORD
735                         { $$ = INT_SIGNED; }
736                 |       UNSIGNED
737                         { $$ = INT_UNSIGNED; }
738                 |       CHAR
739                         { $$ = INT_CHAR; }
740                 |       LONG
741                         { $$ = INT_LONG; }
742                 |       SHORT
743                         { $$ = INT_SHORT; }
744                 ;
745
746 int_seq         :       int_part
747                 |       int_seq int_part
748                         { $$ = $1 | $2; if ($1 & $2 & INT_LONG) $$ = $1 | INT_LLONG; }
749                 ;
750
751 builtin_type    :       int_seq
752                         { $$ = d_int_type ($1); }
753                 |       FLOAT_KEYWORD
754                         { $$ = make_builtin_type ("float"); }
755                 |       DOUBLE_KEYWORD
756                         { $$ = make_builtin_type ("double"); }
757                 |       LONG DOUBLE_KEYWORD
758                         { $$ = make_builtin_type ("long double"); }
759                 |       BOOL
760                         { $$ = make_builtin_type ("bool"); }
761                 |       WCHAR_T
762                         { $$ = make_builtin_type ("wchar_t"); }
763                 |       VOID
764                         { $$ = make_builtin_type ("void"); }
765                 ;
766
767 ptr_operator    :       '*' qualifiers_opt
768                         { $$.comp = make_empty (DEMANGLE_COMPONENT_POINTER);
769                           $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL;
770                           $$.last = &d_left ($$.comp);
771                           $$.comp = d_qualify ($$.comp, $2, 0); }
772                 /* g++ seems to allow qualifiers after the reference?  */
773                 |       '&'
774                         { $$.comp = make_empty (DEMANGLE_COMPONENT_REFERENCE);
775                           $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL;
776                           $$.last = &d_left ($$.comp); }
777                 |       nested_name '*' qualifiers_opt
778                         { $$.comp = make_empty (DEMANGLE_COMPONENT_PTRMEM_TYPE);
779                           $$.comp->u.s_binary.left = $1.comp;
780                           /* Convert the innermost DEMANGLE_COMPONENT_QUAL_NAME to a DEMANGLE_COMPONENT_NAME.  */
781                           *$1.last = *d_left ($1.last);
782                           $$.comp->u.s_binary.right = NULL;
783                           $$.last = &d_right ($$.comp);
784                           $$.comp = d_qualify ($$.comp, $3, 0); }
785                 |       COLONCOLON nested_name '*' qualifiers_opt
786                         { $$.comp = make_empty (DEMANGLE_COMPONENT_PTRMEM_TYPE);
787                           $$.comp->u.s_binary.left = $2.comp;
788                           /* Convert the innermost DEMANGLE_COMPONENT_QUAL_NAME to a DEMANGLE_COMPONENT_NAME.  */
789                           *$2.last = *d_left ($2.last);
790                           $$.comp->u.s_binary.right = NULL;
791                           $$.last = &d_right ($$.comp);
792                           $$.comp = d_qualify ($$.comp, $4, 0); }
793                 ;
794
795 array_indicator :       '[' ']'
796                         { $$ = make_empty (DEMANGLE_COMPONENT_ARRAY_TYPE);
797                           d_left ($$) = NULL;
798                         }
799                 |       '[' INT ']'
800                         { $$ = make_empty (DEMANGLE_COMPONENT_ARRAY_TYPE);
801                           d_left ($$) = $2;
802                         }
803                 ;
804
805 /* Details of this approach inspired by the G++ < 3.4 parser.  */
806
807 /* This rule is only used in typespec_2, and expanded inline there for
808    efficiency.  */
809 /*
810 typespec        :       builtin_type
811                 |       colon_name
812                 ;
813 */
814
815 typespec_2      :       builtin_type qualifiers
816                         { $$ = d_qualify ($1, $2, 0); }
817                 |       builtin_type
818                 |       qualifiers builtin_type qualifiers
819                         { $$ = d_qualify ($2, $1 | $3, 0); }
820                 |       qualifiers builtin_type
821                         { $$ = d_qualify ($2, $1, 0); }
822
823                 |       name qualifiers
824                         { $$ = d_qualify ($1, $2, 0); }
825                 |       name
826                 |       qualifiers name qualifiers
827                         { $$ = d_qualify ($2, $1 | $3, 0); }
828                 |       qualifiers name
829                         { $$ = d_qualify ($2, $1, 0); }
830
831                 |       COLONCOLON name qualifiers
832                         { $$ = d_qualify ($2, $3, 0); }
833                 |       COLONCOLON name
834                         { $$ = $2; }
835                 |       qualifiers COLONCOLON name qualifiers
836                         { $$ = d_qualify ($3, $1 | $4, 0); }
837                 |       qualifiers COLONCOLON name
838                         { $$ = d_qualify ($3, $1, 0); }
839                 ;
840
841 abstract_declarator
842                 :       ptr_operator
843                         { $$.comp = $1.comp; $$.last = $1.last;
844                           $$.fn.comp = NULL; $$.fn.last = NULL; }
845                 |       ptr_operator abstract_declarator
846                         { $$ = $2; $$.fn.comp = NULL; $$.fn.last = NULL;
847                           if ($2.fn.comp) { $$.last = $2.fn.last; *$2.last = $2.fn.comp; }
848                           *$$.last = $1.comp;
849                           $$.last = $1.last; }
850                 |       direct_abstract_declarator
851                         { $$.fn.comp = NULL; $$.fn.last = NULL;
852                           if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
853                         }
854                 ;
855
856 direct_abstract_declarator
857                 :       '(' abstract_declarator ')'
858                         { $$ = $2; $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 1;
859                           if ($2.fn.comp) { $$.last = $2.fn.last; *$2.last = $2.fn.comp; }
860                         }
861                 |       direct_abstract_declarator function_arglist
862                         { $$.fold_flag = 0;
863                           if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
864                           if ($1.fold_flag)
865                             {
866                               *$$.last = $2.comp;
867                               $$.last = $2.last;
868                             }
869                           else
870                             $$.fn = $2;
871                         }
872                 |       direct_abstract_declarator array_indicator
873                         { $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 0;
874                           if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
875                           *$1.last = $2;
876                           $$.last = &d_right ($2);
877                         }
878                 |       array_indicator
879                         { $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 0;
880                           $$.comp = $1;
881                           $$.last = &d_right ($1);
882                         }
883                 /* G++ has the following except for () and (type).  Then
884                    (type) is handled in regcast_or_absdcl and () is handled
885                    in fcast_or_absdcl.
886
887                    However, this is only useful for function types, and
888                    generates reduce/reduce conflicts with direct_declarator.
889                    We're interested in pointer-to-function types, and in
890                    functions, but not in function types - so leave this
891                    out.  */
892                 /* |    function_arglist */
893                 ;
894
895 abstract_declarator_fn
896                 :       ptr_operator
897                         { $$.comp = $1.comp; $$.last = $1.last;
898                           $$.fn.comp = NULL; $$.fn.last = NULL; $$.start = NULL; }
899                 |       ptr_operator abstract_declarator_fn
900                         { $$ = $2;
901                           if ($2.last)
902                             *$$.last = $1.comp;
903                           else
904                             $$.comp = $1.comp;
905                           $$.last = $1.last;
906                         }
907                 |       direct_abstract_declarator
908                         { $$.comp = $1.comp; $$.last = $1.last; $$.fn = $1.fn; $$.start = NULL; }
909                 |       direct_abstract_declarator function_arglist COLONCOLON start
910                         { $$.start = $4;
911                           if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
912                           if ($1.fold_flag)
913                             {
914                               *$$.last = $2.comp;
915                               $$.last = $2.last;
916                             }
917                           else
918                             $$.fn = $2;
919                         }
920                 |       function_arglist start_opt
921                         { $$.fn = $1;
922                           $$.start = $2;
923                           $$.comp = NULL; $$.last = NULL;
924                         }
925                 ;
926
927 type            :       typespec_2
928                 |       typespec_2 abstract_declarator
929                         { $$ = $2.comp;
930                           *$2.last = $1;
931                         }
932                 ;
933
934 declarator      :       ptr_operator declarator
935                         { $$.comp = $2.comp;
936                           $$.last = $1.last;
937                           *$2.last = $1.comp; }
938                 |       direct_declarator
939                 ;
940
941 direct_declarator
942                 :       '(' declarator ')'
943                         { $$ = $2; }
944                 |       direct_declarator function_arglist
945                         { $$.comp = $1.comp;
946                           *$1.last = $2.comp;
947                           $$.last = $2.last;
948                         }
949                 |       direct_declarator array_indicator
950                         { $$.comp = $1.comp;
951                           *$1.last = $2;
952                           $$.last = &d_right ($2);
953                         }
954                 |       colon_ext_name
955                         { $$.comp = make_empty (DEMANGLE_COMPONENT_TYPED_NAME);
956                           d_left ($$.comp) = $1;
957                           $$.last = &d_right ($$.comp);
958                         }
959                 ;
960
961 /* These are similar to declarator and direct_declarator except that they
962    do not permit ( colon_ext_name ), which is ambiguous with a function
963    argument list.  They also don't permit a few other forms with redundant
964    parentheses around the colon_ext_name; any colon_ext_name in parentheses
965    must be followed by an argument list or an array indicator, or preceded
966    by a pointer.  */
967 declarator_1    :       ptr_operator declarator_1
968                         { $$.comp = $2.comp;
969                           $$.last = $1.last;
970                           *$2.last = $1.comp; }
971                 |       colon_ext_name
972                         { $$.comp = make_empty (DEMANGLE_COMPONENT_TYPED_NAME);
973                           d_left ($$.comp) = $1;
974                           $$.last = &d_right ($$.comp);
975                         }
976                 |       direct_declarator_1
977
978                         /* Function local variable or type.  The typespec to
979                            our left is the type of the containing function. 
980                            This should be OK, because function local types
981                            can not be templates, so the return types of their
982                            members will not be mangled.  If they are hopefully
983                            they'll end up to the right of the ::.  */
984                 |       colon_ext_name function_arglist COLONCOLON start
985                         { $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
986                           $$.last = $2.last;
987                           $$.comp = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$.comp, $4);
988                         }
989                 |       direct_declarator_1 function_arglist COLONCOLON start
990                         { $$.comp = $1.comp;
991                           *$1.last = $2.comp;
992                           $$.last = $2.last;
993                           $$.comp = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$.comp, $4);
994                         }
995                 ;
996
997 direct_declarator_1
998                 :       '(' ptr_operator declarator ')'
999                         { $$.comp = $3.comp;
1000                           $$.last = $2.last;
1001                           *$3.last = $2.comp; }
1002                 |       direct_declarator_1 function_arglist
1003                         { $$.comp = $1.comp;
1004                           *$1.last = $2.comp;
1005                           $$.last = $2.last;
1006                         }
1007                 |       direct_declarator_1 array_indicator
1008                         { $$.comp = $1.comp;
1009                           *$1.last = $2;
1010                           $$.last = &d_right ($2);
1011                         }
1012                 |       colon_ext_name function_arglist
1013                         { $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
1014                           $$.last = $2.last;
1015                         }
1016                 |       colon_ext_name array_indicator
1017                         { $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2);
1018                           $$.last = &d_right ($2);
1019                         }
1020                 ;
1021
1022 exp     :       '(' exp1 ')'
1023                 { $$ = $2; }
1024         ;
1025
1026 /* Silly trick.  Only allow '>' when parenthesized, in order to
1027    handle conflict with templates.  */
1028 exp1    :       exp
1029         ;
1030
1031 exp1    :       exp '>' exp
1032                 { $$ = d_binary (">", $1, $3); }
1033         ;
1034
1035 /* References.  Not allowed everywhere in template parameters, only
1036    at the top level, but treat them as expressions in case they are wrapped
1037    in parentheses.  */
1038 exp1    :       '&' start
1039                 { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $2); }
1040         |       '&' '(' start ')'
1041                 { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $3); }
1042         ;
1043
1044 /* Expressions, not including the comma operator.  */
1045 exp     :       '-' exp    %prec UNARY
1046                 { $$ = d_unary ("-", $2); }
1047         ;
1048
1049 exp     :       '!' exp    %prec UNARY
1050                 { $$ = d_unary ("!", $2); }
1051         ;
1052
1053 exp     :       '~' exp    %prec UNARY
1054                 { $$ = d_unary ("~", $2); }
1055         ;
1056
1057 /* Casts.  First your normal C-style cast.  If exp is a LITERAL, just change
1058    its type.  */
1059
1060 exp     :       '(' type ')' exp  %prec UNARY
1061                 { if ($4->type == DEMANGLE_COMPONENT_LITERAL
1062                       || $4->type == DEMANGLE_COMPONENT_LITERAL_NEG)
1063                     {
1064                       $$ = $4;
1065                       d_left ($4) = $2;
1066                     }
1067                   else
1068                     $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1069                                       fill_comp (DEMANGLE_COMPONENT_CAST, $2, NULL),
1070                                       $4);
1071                 }
1072         ;
1073
1074 /* Mangling does not differentiate between these, so we don't need to
1075    either.  */
1076 exp     :       STATIC_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1077                 { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1078                                     fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1079                                     $6);
1080                 }
1081         ;
1082
1083 exp     :       DYNAMIC_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1084                 { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1085                                     fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1086                                     $6);
1087                 }
1088         ;
1089
1090 exp     :       REINTERPRET_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1091                 { $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1092                                     fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1093                                     $6);
1094                 }
1095         ;
1096
1097 /* Another form of C++-style cast is "type ( exp1 )".  This creates too many
1098    conflicts to support.  For a while we supported the simpler
1099    "typespec_2 ( exp1 )", but that conflicts with "& ( start )" as a
1100    reference, deep within the wilderness of abstract declarators:
1101    Qux<int(&(*))> vs Qux<int(&(var))>, a shift-reduce conflict at the
1102    innermost left parenthesis.  So we do not support function-like casts.
1103    Fortunately they never appear in demangler output.  */
1104
1105 /* TO INVESTIGATE: ._0 style anonymous names; anonymous namespaces */
1106
1107 /* Binary operators in order of decreasing precedence.  */
1108
1109 exp     :       exp '*' exp
1110                 { $$ = d_binary ("*", $1, $3); }
1111         ;
1112
1113 exp     :       exp '/' exp
1114                 { $$ = d_binary ("/", $1, $3); }
1115         ;
1116
1117 exp     :       exp '%' exp
1118                 { $$ = d_binary ("%", $1, $3); }
1119         ;
1120
1121 exp     :       exp '+' exp
1122                 { $$ = d_binary ("+", $1, $3); }
1123         ;
1124
1125 exp     :       exp '-' exp
1126                 { $$ = d_binary ("-", $1, $3); }
1127         ;
1128
1129 exp     :       exp LSH exp
1130                 { $$ = d_binary ("<<", $1, $3); }
1131         ;
1132
1133 exp     :       exp RSH exp
1134                 { $$ = d_binary (">>", $1, $3); }
1135         ;
1136
1137 exp     :       exp EQUAL exp
1138                 { $$ = d_binary ("==", $1, $3); }
1139         ;
1140
1141 exp     :       exp NOTEQUAL exp
1142                 { $$ = d_binary ("!=", $1, $3); }
1143         ;
1144
1145 exp     :       exp LEQ exp
1146                 { $$ = d_binary ("<=", $1, $3); }
1147         ;
1148
1149 exp     :       exp GEQ exp
1150                 { $$ = d_binary (">=", $1, $3); }
1151         ;
1152
1153 exp     :       exp '<' exp
1154                 { $$ = d_binary ("<", $1, $3); }
1155         ;
1156
1157 exp     :       exp '&' exp
1158                 { $$ = d_binary ("&", $1, $3); }
1159         ;
1160
1161 exp     :       exp '^' exp
1162                 { $$ = d_binary ("^", $1, $3); }
1163         ;
1164
1165 exp     :       exp '|' exp
1166                 { $$ = d_binary ("|", $1, $3); }
1167         ;
1168
1169 exp     :       exp ANDAND exp
1170                 { $$ = d_binary ("&&", $1, $3); }
1171         ;
1172
1173 exp     :       exp OROR exp
1174                 { $$ = d_binary ("||", $1, $3); }
1175         ;
1176
1177 /* Not 100% sure these are necessary, but they're harmless.  */
1178 exp     :       exp ARROW NAME
1179                 { $$ = d_binary ("->", $1, $3); }
1180         ;
1181
1182 exp     :       exp '.' NAME
1183                 { $$ = d_binary (".", $1, $3); }
1184         ;
1185
1186 exp     :       exp '?' exp ':' exp     %prec '?'
1187                 { $$ = fill_comp (DEMANGLE_COMPONENT_TRINARY, make_operator ("?", 3),
1188                                     fill_comp (DEMANGLE_COMPONENT_TRINARY_ARG1, $1,
1189                                                  fill_comp (DEMANGLE_COMPONENT_TRINARY_ARG2, $3, $5)));
1190                 }
1191         ;
1192                           
1193 exp     :       INT
1194         ;
1195
1196 /* Not generally allowed.  */
1197 exp     :       FLOAT
1198         ;
1199
1200 exp     :       SIZEOF '(' type ')'     %prec UNARY
1201                 {
1202                   /* Match the whitespacing of cplus_demangle_operators.
1203                      It would abort on unrecognized string otherwise.  */
1204                   $$ = d_unary ("sizeof ", $3);
1205                 }
1206         ;
1207
1208 /* C++.  */
1209 exp     :       TRUEKEYWORD    
1210                 { struct demangle_component *i;
1211                   i = make_name ("1", 1);
1212                   $$ = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1213                                     make_builtin_type ("bool"),
1214                                     i);
1215                 }
1216         ;
1217
1218 exp     :       FALSEKEYWORD   
1219                 { struct demangle_component *i;
1220                   i = make_name ("0", 1);
1221                   $$ = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1222                                     make_builtin_type ("bool"),
1223                                     i);
1224                 }
1225         ;
1226
1227 /* end of C++.  */
1228
1229 %%
1230
1231 /* Apply QUALIFIERS to LHS and return a qualified component.  IS_METHOD
1232    is set if LHS is a method, in which case the qualifiers are logically
1233    applied to "this".  We apply qualifiers in a consistent order; LHS
1234    may already be qualified; duplicate qualifiers are not created.  */
1235
1236 struct demangle_component *
1237 d_qualify (struct demangle_component *lhs, int qualifiers, int is_method)
1238 {
1239   struct demangle_component **inner_p;
1240   enum demangle_component_type type;
1241
1242   /* For now the order is CONST (innermost), VOLATILE, RESTRICT.  */
1243
1244 #define HANDLE_QUAL(TYPE, MTYPE, QUAL)                          \
1245   if ((qualifiers & QUAL) && (type != TYPE) && (type != MTYPE)) \
1246     {                                                           \
1247       *inner_p = fill_comp (is_method ? MTYPE : TYPE,   \
1248                               *inner_p, NULL);                  \
1249       inner_p = &d_left (*inner_p);                             \
1250       type = (*inner_p)->type;                                  \
1251     }                                                           \
1252   else if (type == TYPE || type == MTYPE)                       \
1253     {                                                           \
1254       inner_p = &d_left (*inner_p);                             \
1255       type = (*inner_p)->type;                                  \
1256     }
1257
1258   inner_p = &lhs;
1259
1260   type = (*inner_p)->type;
1261
1262   HANDLE_QUAL (DEMANGLE_COMPONENT_RESTRICT, DEMANGLE_COMPONENT_RESTRICT_THIS, QUAL_RESTRICT);
1263   HANDLE_QUAL (DEMANGLE_COMPONENT_VOLATILE, DEMANGLE_COMPONENT_VOLATILE_THIS, QUAL_VOLATILE);
1264   HANDLE_QUAL (DEMANGLE_COMPONENT_CONST, DEMANGLE_COMPONENT_CONST_THIS, QUAL_CONST);
1265
1266   return lhs;
1267 }
1268
1269 /* Return a builtin type corresponding to FLAGS.  */
1270
1271 static struct demangle_component *
1272 d_int_type (int flags)
1273 {
1274   const char *name;
1275
1276   switch (flags)
1277     {
1278     case INT_SIGNED | INT_CHAR:
1279       name = "signed char";
1280       break;
1281     case INT_CHAR:
1282       name = "char";
1283       break;
1284     case INT_UNSIGNED | INT_CHAR:
1285       name = "unsigned char";
1286       break;
1287     case 0:
1288     case INT_SIGNED:
1289       name = "int";
1290       break;
1291     case INT_UNSIGNED:
1292       name = "unsigned int";
1293       break;
1294     case INT_LONG:
1295     case INT_SIGNED | INT_LONG:
1296       name = "long";
1297       break;
1298     case INT_UNSIGNED | INT_LONG:
1299       name = "unsigned long";
1300       break;
1301     case INT_SHORT:
1302     case INT_SIGNED | INT_SHORT:
1303       name = "short";
1304       break;
1305     case INT_UNSIGNED | INT_SHORT:
1306       name = "unsigned short";
1307       break;
1308     case INT_LLONG | INT_LONG:
1309     case INT_SIGNED | INT_LLONG | INT_LONG:
1310       name = "long long";
1311       break;
1312     case INT_UNSIGNED | INT_LLONG | INT_LONG:
1313       name = "unsigned long long";
1314       break;
1315     default:
1316       return NULL;
1317     }
1318
1319   return make_builtin_type (name);
1320 }
1321
1322 /* Wrapper to create a unary operation.  */
1323
1324 static struct demangle_component *
1325 d_unary (const char *name, struct demangle_component *lhs)
1326 {
1327   return fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator (name, 1), lhs);
1328 }
1329
1330 /* Wrapper to create a binary operation.  */
1331
1332 static struct demangle_component *
1333 d_binary (const char *name, struct demangle_component *lhs, struct demangle_component *rhs)
1334 {
1335   return fill_comp (DEMANGLE_COMPONENT_BINARY, make_operator (name, 2),
1336                       fill_comp (DEMANGLE_COMPONENT_BINARY_ARGS, lhs, rhs));
1337 }
1338
1339 /* Find the end of a symbol name starting at LEXPTR.  */
1340
1341 static const char *
1342 symbol_end (const char *lexptr)
1343 {
1344   const char *p = lexptr;
1345
1346   while (*p && (ISALNUM (*p) || *p == '_' || *p == '$' || *p == '.'))
1347     p++;
1348
1349   return p;
1350 }
1351
1352 /* Take care of parsing a number (anything that starts with a digit).
1353    The number starts at P and contains LEN characters.  Store the result in
1354    YYLVAL.  */
1355
1356 static int
1357 parse_number (const char *p, int len, int parsed_float)
1358 {
1359   int unsigned_p = 0;
1360
1361   /* Number of "L" suffixes encountered.  */
1362   int long_p = 0;
1363
1364   struct demangle_component *signed_type;
1365   struct demangle_component *unsigned_type;
1366   struct demangle_component *type, *name;
1367   enum demangle_component_type literal_type;
1368
1369   if (p[0] == '-')
1370     {
1371       literal_type = DEMANGLE_COMPONENT_LITERAL_NEG;
1372       p++;
1373       len--;
1374     }
1375   else
1376     literal_type = DEMANGLE_COMPONENT_LITERAL;
1377
1378   if (parsed_float)
1379     {
1380       /* It's a float since it contains a point or an exponent.  */
1381       char c;
1382
1383       /* The GDB lexer checks the result of scanf at this point.  Not doing
1384          this leaves our error checking slightly weaker but only for invalid
1385          data.  */
1386
1387       /* See if it has `f' or `l' suffix (float or long double).  */
1388
1389       c = TOLOWER (p[len - 1]);
1390
1391       if (c == 'f')
1392         {
1393           len--;
1394           type = make_builtin_type ("float");
1395         }
1396       else if (c == 'l')
1397         {
1398           len--;
1399           type = make_builtin_type ("long double");
1400         }
1401       else if (ISDIGIT (c) || c == '.')
1402         type = make_builtin_type ("double");
1403       else
1404         return ERROR;
1405
1406       name = make_name (p, len);
1407       yylval.comp = fill_comp (literal_type, type, name);
1408
1409       return FLOAT;
1410     }
1411
1412   /* This treats 0x1 and 1 as different literals.  We also do not
1413      automatically generate unsigned types.  */
1414
1415   long_p = 0;
1416   unsigned_p = 0;
1417   while (len > 0)
1418     {
1419       if (p[len - 1] == 'l' || p[len - 1] == 'L')
1420         {
1421           len--;
1422           long_p++;
1423           continue;
1424         }
1425       if (p[len - 1] == 'u' || p[len - 1] == 'U')
1426         {
1427           len--;
1428           unsigned_p++;
1429           continue;
1430         }
1431       break;
1432     }
1433
1434   if (long_p == 0)
1435     {
1436       unsigned_type = make_builtin_type ("unsigned int");
1437       signed_type = make_builtin_type ("int");
1438     }
1439   else if (long_p == 1)
1440     {
1441       unsigned_type = make_builtin_type ("unsigned long");
1442       signed_type = make_builtin_type ("long");
1443     }
1444   else
1445     {
1446       unsigned_type = make_builtin_type ("unsigned long long");
1447       signed_type = make_builtin_type ("long long");
1448     }
1449
1450    if (unsigned_p)
1451      type = unsigned_type;
1452    else
1453      type = signed_type;
1454
1455    name = make_name (p, len);
1456    yylval.comp = fill_comp (literal_type, type, name);
1457
1458    return INT;
1459 }
1460
1461 static char backslashable[] = "abefnrtv";
1462 static char represented[] = "\a\b\e\f\n\r\t\v";
1463
1464 /* Translate the backslash the way we would in the host character set.  */
1465 static int
1466 c_parse_backslash (int host_char, int *target_char)
1467 {
1468   const char *ix;
1469   ix = strchr (backslashable, host_char);
1470   if (! ix)
1471     return 0;
1472   else
1473     *target_char = represented[ix - backslashable];
1474   return 1;
1475 }
1476
1477 /* Parse a C escape sequence.  STRING_PTR points to a variable
1478    containing a pointer to the string to parse.  That pointer
1479    should point to the character after the \.  That pointer
1480    is updated past the characters we use.  The value of the
1481    escape sequence is returned.
1482
1483    A negative value means the sequence \ newline was seen,
1484    which is supposed to be equivalent to nothing at all.
1485
1486    If \ is followed by a null character, we return a negative
1487    value and leave the string pointer pointing at the null character.
1488
1489    If \ is followed by 000, we return 0 and leave the string pointer
1490    after the zeros.  A value of 0 does not mean end of string.  */
1491
1492 static int
1493 cp_parse_escape (const char **string_ptr)
1494 {
1495   int target_char;
1496   int c = *(*string_ptr)++;
1497   if (c_parse_backslash (c, &target_char))
1498     return target_char;
1499   else
1500     switch (c)
1501       {
1502       case '\n':
1503         return -2;
1504       case 0:
1505         (*string_ptr)--;
1506         return 0;
1507       case '^':
1508         {
1509           c = *(*string_ptr)++;
1510
1511           if (c == '?')
1512             return 0177;
1513           else if (c == '\\')
1514             target_char = cp_parse_escape (string_ptr);
1515           else
1516             target_char = c;
1517
1518           /* Now target_char is something like `c', and we want to find
1519              its control-character equivalent.  */
1520           target_char = target_char & 037;
1521
1522           return target_char;
1523         }
1524
1525       case '0':
1526       case '1':
1527       case '2':
1528       case '3':
1529       case '4':
1530       case '5':
1531       case '6':
1532       case '7':
1533         {
1534           int i = c - '0';
1535           int count = 0;
1536           while (++count < 3)
1537             {
1538               c = (**string_ptr);
1539               if (c >= '0' && c <= '7')
1540                 {
1541                   (*string_ptr)++;
1542                   i *= 8;
1543                   i += c - '0';
1544                 }
1545               else
1546                 {
1547                   break;
1548                 }
1549             }
1550           return i;
1551         }
1552       default:
1553         return c;
1554       }
1555 }
1556
1557 #define HANDLE_SPECIAL(string, comp)                            \
1558   if (strncmp (tokstart, string, sizeof (string) - 1) == 0)     \
1559     {                                                           \
1560       lexptr = tokstart + sizeof (string) - 1;                  \
1561       yylval.lval = comp;                                       \
1562       return DEMANGLER_SPECIAL;                                 \
1563     }
1564
1565 #define HANDLE_TOKEN2(string, token)                    \
1566   if (lexptr[1] == string[1])                           \
1567     {                                                   \
1568       lexptr += 2;                                      \
1569       yylval.opname = string;                           \
1570       return token;                                     \
1571     }      
1572
1573 #define HANDLE_TOKEN3(string, token)                    \
1574   if (lexptr[1] == string[1] && lexptr[2] == string[2]) \
1575     {                                                   \
1576       lexptr += 3;                                      \
1577       yylval.opname = string;                           \
1578       return token;                                     \
1579     }      
1580
1581 /* Read one token, getting characters through LEXPTR.  */
1582
1583 static int
1584 yylex (void)
1585 {
1586   int c;
1587   int namelen;
1588   const char *tokstart;
1589
1590  retry:
1591   prev_lexptr = lexptr;
1592   tokstart = lexptr;
1593
1594   switch (c = *tokstart)
1595     {
1596     case 0:
1597       return 0;
1598
1599     case ' ':
1600     case '\t':
1601     case '\n':
1602       lexptr++;
1603       goto retry;
1604
1605     case '\'':
1606       /* We either have a character constant ('0' or '\177' for example)
1607          or we have a quoted symbol reference ('foo(int,int)' in C++
1608          for example). */
1609       lexptr++;
1610       c = *lexptr++;
1611       if (c == '\\')
1612         c = cp_parse_escape (&lexptr);
1613       else if (c == '\'')
1614         {
1615           yyerror (_("empty character constant"));
1616           return ERROR;
1617         }
1618
1619       c = *lexptr++;
1620       if (c != '\'')
1621         {
1622           yyerror (_("invalid character constant"));
1623           return ERROR;
1624         }
1625
1626       /* FIXME: We should refer to a canonical form of the character,
1627          presumably the same one that appears in manglings - the decimal
1628          representation.  But if that isn't in our input then we have to
1629          allocate memory for it somewhere.  */
1630       yylval.comp = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1631                                  make_builtin_type ("char"),
1632                                  make_name (tokstart, lexptr - tokstart));
1633
1634       return INT;
1635
1636     case '(':
1637       if (strncmp (tokstart, "(anonymous namespace)", 21) == 0)
1638         {
1639           lexptr += 21;
1640           yylval.comp = make_name ("(anonymous namespace)",
1641                                      sizeof "(anonymous namespace)" - 1);
1642           return NAME;
1643         }
1644         /* FALL THROUGH */
1645
1646     case ')':
1647     case ',':
1648       lexptr++;
1649       return c;
1650
1651     case '.':
1652       if (lexptr[1] == '.' && lexptr[2] == '.')
1653         {
1654           lexptr += 3;
1655           return ELLIPSIS;
1656         }
1657
1658       /* Might be a floating point number.  */
1659       if (lexptr[1] < '0' || lexptr[1] > '9')
1660         goto symbol;            /* Nope, must be a symbol. */
1661
1662       goto try_number;
1663
1664     case '-':
1665       HANDLE_TOKEN2 ("-=", ASSIGN_MODIFY);
1666       HANDLE_TOKEN2 ("--", DECREMENT);
1667       HANDLE_TOKEN2 ("->", ARROW);
1668
1669       /* For construction vtables.  This is kind of hokey.  */
1670       if (strncmp (tokstart, "-in-", 4) == 0)
1671         {
1672           lexptr += 4;
1673           return CONSTRUCTION_IN;
1674         }
1675
1676       if (lexptr[1] < '0' || lexptr[1] > '9')
1677         {
1678           lexptr++;
1679           return '-';
1680         }
1681       /* FALL THRU into number case.  */
1682
1683     try_number:
1684     case '0':
1685     case '1':
1686     case '2':
1687     case '3':
1688     case '4':
1689     case '5':
1690     case '6':
1691     case '7':
1692     case '8':
1693     case '9':
1694       {
1695         /* It's a number.  */
1696         int got_dot = 0, got_e = 0, toktype;
1697         const char *p = tokstart;
1698         int hex = 0;
1699
1700         if (c == '-')
1701           p++;
1702
1703         if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1704           {
1705             p += 2;
1706             hex = 1;
1707           }
1708         else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1709           {
1710             p += 2;
1711             hex = 0;
1712           }
1713
1714         for (;; ++p)
1715           {
1716             /* This test includes !hex because 'e' is a valid hex digit
1717                and thus does not indicate a floating point number when
1718                the radix is hex.  */
1719             if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1720               got_dot = got_e = 1;
1721             /* This test does not include !hex, because a '.' always indicates
1722                a decimal floating point number regardless of the radix.
1723
1724                NOTE drow/2005-03-09: This comment is not accurate in C99;
1725                however, it's not clear that all the floating point support
1726                in this file is doing any good here.  */
1727             else if (!got_dot && *p == '.')
1728               got_dot = 1;
1729             else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1730                      && (*p == '-' || *p == '+'))
1731               /* This is the sign of the exponent, not the end of the
1732                  number.  */
1733               continue;
1734             /* We will take any letters or digits.  parse_number will
1735                complain if past the radix, or if L or U are not final.  */
1736             else if (! ISALNUM (*p))
1737               break;
1738           }
1739         toktype = parse_number (tokstart, p - tokstart, got_dot|got_e);
1740         if (toktype == ERROR)
1741           {
1742             char *err_copy = (char *) alloca (p - tokstart + 1);
1743
1744             memcpy (err_copy, tokstart, p - tokstart);
1745             err_copy[p - tokstart] = 0;
1746             yyerror (_("invalid number"));
1747             return ERROR;
1748           }
1749         lexptr = p;
1750         return toktype;
1751       }
1752
1753     case '+':
1754       HANDLE_TOKEN2 ("+=", ASSIGN_MODIFY);
1755       HANDLE_TOKEN2 ("++", INCREMENT);
1756       lexptr++;
1757       return c;
1758     case '*':
1759       HANDLE_TOKEN2 ("*=", ASSIGN_MODIFY);
1760       lexptr++;
1761       return c;
1762     case '/':
1763       HANDLE_TOKEN2 ("/=", ASSIGN_MODIFY);
1764       lexptr++;
1765       return c;
1766     case '%':
1767       HANDLE_TOKEN2 ("%=", ASSIGN_MODIFY);
1768       lexptr++;
1769       return c;
1770     case '|':
1771       HANDLE_TOKEN2 ("|=", ASSIGN_MODIFY);
1772       HANDLE_TOKEN2 ("||", OROR);
1773       lexptr++;
1774       return c;
1775     case '&':
1776       HANDLE_TOKEN2 ("&=", ASSIGN_MODIFY);
1777       HANDLE_TOKEN2 ("&&", ANDAND);
1778       lexptr++;
1779       return c;
1780     case '^':
1781       HANDLE_TOKEN2 ("^=", ASSIGN_MODIFY);
1782       lexptr++;
1783       return c;
1784     case '!':
1785       HANDLE_TOKEN2 ("!=", NOTEQUAL);
1786       lexptr++;
1787       return c;
1788     case '<':
1789       HANDLE_TOKEN3 ("<<=", ASSIGN_MODIFY);
1790       HANDLE_TOKEN2 ("<=", LEQ);
1791       HANDLE_TOKEN2 ("<<", LSH);
1792       lexptr++;
1793       return c;
1794     case '>':
1795       HANDLE_TOKEN3 (">>=", ASSIGN_MODIFY);
1796       HANDLE_TOKEN2 (">=", GEQ);
1797       HANDLE_TOKEN2 (">>", RSH);
1798       lexptr++;
1799       return c;
1800     case '=':
1801       HANDLE_TOKEN2 ("==", EQUAL);
1802       lexptr++;
1803       return c;
1804     case ':':
1805       HANDLE_TOKEN2 ("::", COLONCOLON);
1806       lexptr++;
1807       return c;
1808
1809     case '[':
1810     case ']':
1811     case '?':
1812     case '@':
1813     case '~':
1814     case '{':
1815     case '}':
1816     symbol:
1817       lexptr++;
1818       return c;
1819
1820     case '"':
1821       /* These can't occur in C++ names.  */
1822       yyerror (_("unexpected string literal"));
1823       return ERROR;
1824     }
1825
1826   if (!(c == '_' || c == '$' || ISALPHA (c)))
1827     {
1828       /* We must have come across a bad character (e.g. ';').  */
1829       yyerror (_("invalid character"));
1830       return ERROR;
1831     }
1832
1833   /* It's a name.  See how long it is.  */
1834   namelen = 0;
1835   do
1836     c = tokstart[++namelen];
1837   while (ISALNUM (c) || c == '_' || c == '$');
1838
1839   lexptr += namelen;
1840
1841   /* Catch specific keywords.  Notice that some of the keywords contain
1842      spaces, and are sorted by the length of the first word.  They must
1843      all include a trailing space in the string comparison.  */
1844   switch (namelen)
1845     {
1846     case 16:
1847       if (strncmp (tokstart, "reinterpret_cast", 16) == 0)
1848         return REINTERPRET_CAST;
1849       break;
1850     case 12:
1851       if (strncmp (tokstart, "construction vtable for ", 24) == 0)
1852         {
1853           lexptr = tokstart + 24;
1854           return CONSTRUCTION_VTABLE;
1855         }
1856       if (strncmp (tokstart, "dynamic_cast", 12) == 0)
1857         return DYNAMIC_CAST;
1858       break;
1859     case 11:
1860       if (strncmp (tokstart, "static_cast", 11) == 0)
1861         return STATIC_CAST;
1862       break;
1863     case 9:
1864       HANDLE_SPECIAL ("covariant return thunk to ", DEMANGLE_COMPONENT_COVARIANT_THUNK);
1865       HANDLE_SPECIAL ("reference temporary for ", DEMANGLE_COMPONENT_REFTEMP);
1866       break;
1867     case 8:
1868       HANDLE_SPECIAL ("typeinfo for ", DEMANGLE_COMPONENT_TYPEINFO);
1869       HANDLE_SPECIAL ("typeinfo fn for ", DEMANGLE_COMPONENT_TYPEINFO_FN);
1870       HANDLE_SPECIAL ("typeinfo name for ", DEMANGLE_COMPONENT_TYPEINFO_NAME);
1871       if (strncmp (tokstart, "operator", 8) == 0)
1872         return OPERATOR;
1873       if (strncmp (tokstart, "restrict", 8) == 0)
1874         return RESTRICT;
1875       if (strncmp (tokstart, "unsigned", 8) == 0)
1876         return UNSIGNED;
1877       if (strncmp (tokstart, "template", 8) == 0)
1878         return TEMPLATE;
1879       if (strncmp (tokstart, "volatile", 8) == 0)
1880         return VOLATILE_KEYWORD;
1881       break;
1882     case 7:
1883       HANDLE_SPECIAL ("virtual thunk to ", DEMANGLE_COMPONENT_VIRTUAL_THUNK);
1884       if (strncmp (tokstart, "wchar_t", 7) == 0)
1885         return WCHAR_T;
1886       break;
1887     case 6:
1888       if (strncmp (tokstart, "global constructors keyed to ", 29) == 0)
1889         {
1890           const char *p;
1891           lexptr = tokstart + 29;
1892           yylval.lval = DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS;
1893           /* Find the end of the symbol.  */
1894           p = symbol_end (lexptr);
1895           yylval.comp = make_name (lexptr, p - lexptr);
1896           lexptr = p;
1897           return DEMANGLER_SPECIAL;
1898         }
1899       if (strncmp (tokstart, "global destructors keyed to ", 28) == 0)
1900         {
1901           const char *p;
1902           lexptr = tokstart + 28;
1903           yylval.lval = DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS;
1904           /* Find the end of the symbol.  */
1905           p = symbol_end (lexptr);
1906           yylval.comp = make_name (lexptr, p - lexptr);
1907           lexptr = p;
1908           return DEMANGLER_SPECIAL;
1909         }
1910
1911       HANDLE_SPECIAL ("vtable for ", DEMANGLE_COMPONENT_VTABLE);
1912       if (strncmp (tokstart, "delete", 6) == 0)
1913         return DELETE;
1914       if (strncmp (tokstart, "struct", 6) == 0)
1915         return STRUCT;
1916       if (strncmp (tokstart, "signed", 6) == 0)
1917         return SIGNED_KEYWORD;
1918       if (strncmp (tokstart, "sizeof", 6) == 0)
1919         return SIZEOF;
1920       if (strncmp (tokstart, "double", 6) == 0)
1921         return DOUBLE_KEYWORD;
1922       break;
1923     case 5:
1924       HANDLE_SPECIAL ("guard variable for ", DEMANGLE_COMPONENT_GUARD);
1925       if (strncmp (tokstart, "false", 5) == 0)
1926         return FALSEKEYWORD;
1927       if (strncmp (tokstart, "class", 5) == 0)
1928         return CLASS;
1929       if (strncmp (tokstart, "union", 5) == 0)
1930         return UNION;
1931       if (strncmp (tokstart, "float", 5) == 0)
1932         return FLOAT_KEYWORD;
1933       if (strncmp (tokstart, "short", 5) == 0)
1934         return SHORT;
1935       if (strncmp (tokstart, "const", 5) == 0)
1936         return CONST_KEYWORD;
1937       break;
1938     case 4:
1939       if (strncmp (tokstart, "void", 4) == 0)
1940         return VOID;
1941       if (strncmp (tokstart, "bool", 4) == 0)
1942         return BOOL;
1943       if (strncmp (tokstart, "char", 4) == 0)
1944         return CHAR;
1945       if (strncmp (tokstart, "enum", 4) == 0)
1946         return ENUM;
1947       if (strncmp (tokstart, "long", 4) == 0)
1948         return LONG;
1949       if (strncmp (tokstart, "true", 4) == 0)
1950         return TRUEKEYWORD;
1951       break;
1952     case 3:
1953       HANDLE_SPECIAL ("VTT for ", DEMANGLE_COMPONENT_VTT);
1954       HANDLE_SPECIAL ("non-virtual thunk to ", DEMANGLE_COMPONENT_THUNK);
1955       if (strncmp (tokstart, "new", 3) == 0)
1956         return NEW;
1957       if (strncmp (tokstart, "int", 3) == 0)
1958         return INT_KEYWORD;
1959       break;
1960     default:
1961       break;
1962     }
1963
1964   yylval.comp = make_name (tokstart, namelen);
1965   return NAME;
1966 }
1967
1968 static void
1969 yyerror (char *msg)
1970 {
1971   if (global_errmsg)
1972     return;
1973
1974   error_lexptr = prev_lexptr;
1975   global_errmsg = msg ? msg : "parse error";
1976 }
1977
1978 /* Allocate a chunk of the components we'll need to build a tree.  We
1979    generally allocate too many components, but the extra memory usage
1980    doesn't hurt because the trees are temporary and the storage is
1981    reused.  More may be allocated later, by d_grab.  */
1982 static struct demangle_info *
1983 allocate_info (void)
1984 {
1985   struct demangle_info *info = malloc (sizeof (struct demangle_info));
1986
1987   info->next = NULL;
1988   info->used = 0;
1989   return info;
1990 }
1991
1992 /* Convert RESULT to a string.  The return value is allocated
1993    using xmalloc.  ESTIMATED_LEN is used only as a guide to the
1994    length of the result.  This functions handles a few cases that
1995    cplus_demangle_print does not, specifically the global destructor
1996    and constructor labels.  */
1997
1998 char *
1999 cp_comp_to_string (struct demangle_component *result, int estimated_len)
2000 {
2001   size_t err;
2002
2003   return cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, result, estimated_len,
2004                                &err);
2005 }
2006
2007 /* A convenience function to allocate and initialize a new struct
2008    demangled_parse_info.  */
2009
2010 struct demangle_parse_info *
2011 cp_new_demangle_parse_info (void)
2012 {
2013   struct demangle_parse_info *info;
2014
2015   info = malloc (sizeof (struct demangle_parse_info));
2016   info->info = NULL;
2017   info->tree = NULL;
2018   obstack_init (&info->obstack);
2019
2020   return info;
2021 }
2022
2023 /* Free any memory associated with the given PARSE_INFO.  */
2024
2025 void
2026 cp_demangled_name_parse_free (struct demangle_parse_info *parse_info)
2027 {
2028   struct demangle_info *info = parse_info->info;
2029
2030   /* Free any allocated chunks of memory for the parse.  */
2031   while (info != NULL)
2032     {
2033       struct demangle_info *next = info->next;
2034
2035       free (info);
2036       info = next;
2037     }
2038
2039   /* Free any memory allocated during typedef replacement.  */
2040   obstack_free (&parse_info->obstack, NULL);
2041
2042   /* Free the parser info.  */
2043   free (parse_info);
2044 }
2045
2046 /* Merge the two parse trees given by DEST and SRC.  The parse tree
2047    in SRC is attached to DEST at the node represented by TARGET.
2048    SRC is then freed.
2049
2050    NOTE 1: Since there is no API to merge obstacks, this function does
2051    even attempt to try it.  Fortunately, we do not (yet?) need this ability.
2052    The code will assert if SRC->obstack is not empty.
2053
2054    NOTE 2: The string from which SRC was parsed must not be freed, since
2055    this function will place pointers to that string into DEST.  */
2056
2057 void
2058 cp_merge_demangle_parse_infos (struct demangle_parse_info *dest,
2059                                struct demangle_component *target,
2060                                struct demangle_parse_info *src)
2061
2062 {
2063   struct demangle_info *di;
2064
2065   /* Copy the SRC's parse data into DEST.  */
2066   *target = *src->tree;
2067   di = dest->info;
2068   while (di->next != NULL)
2069     di = di->next;
2070   di->next = src->info;
2071
2072   /* Clear the (pointer to) SRC's parse data so that it is not freed when
2073      cp_demangled_parse_info_free is called.  */
2074   src->info = NULL;
2075
2076   /* Free SRC.  */
2077   cp_demangled_name_parse_free (src);
2078 }
2079
2080 /* Convert a demangled name to a demangle_component tree.  On success,
2081    a structure containing the root of the new tree is returned; it must
2082    be freed by calling cp_demangled_name_parse_free. On error, NULL is
2083    returned, and an error message will be set in *ERRMSG (which does
2084    not need to be freed).  */
2085
2086 struct demangle_parse_info *
2087 cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg)
2088 {
2089   static char errbuf[60];
2090   struct demangle_parse_info *result;
2091
2092   prev_lexptr = lexptr = demangled_name;
2093   error_lexptr = NULL;
2094   global_errmsg = NULL;
2095
2096   demangle_info = allocate_info ();
2097
2098   result = cp_new_demangle_parse_info ();
2099   result->info = demangle_info;
2100
2101   if (yyparse ())
2102     {
2103       if (global_errmsg && errmsg)
2104         {
2105           snprintf (errbuf, sizeof (errbuf) - 2, "%s, near `%s",
2106                     global_errmsg, error_lexptr);
2107           strcat (errbuf, "'");
2108           *errmsg = errbuf;
2109         }
2110       cp_demangled_name_parse_free (result);
2111       return NULL;
2112     }
2113
2114   result->tree = global_result;
2115   global_result = NULL;
2116
2117   return result;
2118 }
2119
2120 #ifdef TEST_CPNAMES
2121
2122 static void
2123 cp_print (struct demangle_component *result)
2124 {
2125   char *str;
2126   size_t err = 0;
2127
2128   str = cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, result, 64, &err);
2129   if (str == NULL)
2130     return;
2131
2132   fputs (str, stdout);
2133
2134   free (str);
2135 }
2136
2137 static char
2138 trim_chars (char *lexptr, char **extra_chars)
2139 {
2140   char *p = (char *) symbol_end (lexptr);
2141   char c = 0;
2142
2143   if (*p)
2144     {
2145       c = *p;
2146       *p = 0;
2147       *extra_chars = p + 1;
2148     }
2149
2150   return c;
2151 }
2152
2153 /* When this file is built as a standalone program, xmalloc comes from
2154    libiberty --- in which case we have to provide xfree ourselves.  */
2155
2156 void
2157 xfree (void *ptr)
2158 {
2159   if (ptr != NULL)
2160     {
2161       /* Literal `free' would get translated back to xfree again.  */
2162       CONCAT2 (fr,ee) (ptr);
2163     }
2164 }
2165
2166 /* GDB normally defines internal_error itself, but when this file is built
2167    as a standalone program, we must also provide an implementation.  */
2168
2169 void
2170 internal_error (const char *file, int line, const char *fmt, ...)
2171 {
2172   va_list ap;
2173
2174   va_start (ap, fmt);
2175   fprintf (stderr, "%s:%d: internal error: ", file, line);
2176   vfprintf (stderr, fmt, ap);
2177   exit (1);
2178 }
2179
2180 int
2181 main (int argc, char **argv)
2182 {
2183   char *str2, *extra_chars = "", c;
2184   char buf[65536];
2185   int arg;
2186   const char *errmsg;
2187   struct demangle_parse_info *result;
2188
2189   arg = 1;
2190   if (argv[arg] && strcmp (argv[arg], "--debug") == 0)
2191     {
2192       yydebug = 1;
2193       arg++;
2194     }
2195
2196   if (argv[arg] == NULL)
2197     while (fgets (buf, 65536, stdin) != NULL)
2198       {
2199         int len;
2200         buf[strlen (buf) - 1] = 0;
2201         /* Use DMGL_VERBOSE to get expanded standard substitutions.  */
2202         c = trim_chars (buf, &extra_chars);
2203         str2 = cplus_demangle (buf, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
2204         if (str2 == NULL)
2205           {
2206             printf ("Demangling error\n");
2207             if (c)
2208               printf ("%s%c%s\n", buf, c, extra_chars);
2209             else
2210               printf ("%s\n", buf);
2211             continue;
2212           }
2213         result = cp_demangled_name_to_comp (str2, &errmsg);
2214         if (result == NULL)
2215           {
2216             fputs (errmsg, stderr);
2217             fputc ('\n', stderr);
2218             continue;
2219           }
2220
2221         cp_print (result->tree);
2222         cp_demangled_name_parse_free (result);
2223
2224         free (str2);
2225         if (c)
2226           {
2227             putchar (c);
2228             fputs (extra_chars, stdout);
2229           }
2230         putchar ('\n');
2231       }
2232   else
2233     {
2234       result = cp_demangled_name_to_comp (argv[arg], &errmsg);
2235       if (result == NULL)
2236         {
2237           fputs (errmsg, stderr);
2238           fputc ('\n', stderr);
2239           return 0;
2240         }
2241       cp_print (result->tree);
2242       cp_demangled_name_parse_free (result);
2243       putchar ('\n');
2244     }
2245   return 0;
2246 }
2247
2248 #endif