Home | History | Annotate | Line # | Download | only in libiberty
cp-demangle.c revision 1.10
      1 /* Demangler for g++ V3 ABI.
      2    Copyright (C) 2003-2025 Free Software Foundation, Inc.
      3    Written by Ian Lance Taylor <ian (at) wasabisystems.com>.
      4 
      5    This file is part of the libiberty library, which is part of GCC.
      6 
      7    This file is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 2 of the License, or
     10    (at your option) any later version.
     11 
     12    In addition to the permissions in the GNU General Public License, the
     13    Free Software Foundation gives you unlimited permission to link the
     14    compiled version of this file into combinations with other programs,
     15    and to distribute those combinations without any restriction coming
     16    from the use of this file.  (The General Public License restrictions
     17    do apply in other respects; for example, they cover modification of
     18    the file, and distribution when not linked into a combined
     19    executable.)
     20 
     21    This program is distributed in the hope that it will be useful,
     22    but WITHOUT ANY WARRANTY; without even the implied warranty of
     23    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     24    GNU General Public License for more details.
     25 
     26    You should have received a copy of the GNU General Public License
     27    along with this program; if not, write to the Free Software
     28    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
     29 */
     30 
     31 /* This code implements a demangler for the g++ V3 ABI.  The ABI is
     32    described on this web page:
     33        https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
     34 
     35    This code was written while looking at the demangler written by
     36    Alex Samuel <samuel (at) codesourcery.com>.
     37 
     38    This code first pulls the mangled name apart into a list of
     39    components, and then walks the list generating the demangled
     40    name.
     41 
     42    This file will normally define the following functions, q.v.:
     43       char *cplus_demangle_v3(const char *mangled, int options)
     44       char *java_demangle_v3(const char *mangled)
     45       int cplus_demangle_v3_callback(const char *mangled, int options,
     46                                      demangle_callbackref callback)
     47       int java_demangle_v3_callback(const char *mangled,
     48                                     demangle_callbackref callback)
     49       enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name)
     50       enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name)
     51 
     52    Also, the interface to the component list is public, and defined in
     53    demangle.h.  The interface consists of these types, which are
     54    defined in demangle.h:
     55       enum demangle_component_type
     56       struct demangle_component
     57       demangle_callbackref
     58    and these functions defined in this file:
     59       cplus_demangle_fill_name
     60       cplus_demangle_fill_extended_operator
     61       cplus_demangle_fill_ctor
     62       cplus_demangle_fill_dtor
     63       cplus_demangle_print
     64       cplus_demangle_print_callback
     65    and other functions defined in the file cp-demint.c.
     66 
     67    This file also defines some other functions and variables which are
     68    only to be used by the file cp-demint.c.
     69 
     70    Preprocessor macros you can define while compiling this file:
     71 
     72    IN_LIBGCC2
     73       If defined, this file defines the following functions, q.v.:
     74          char *__cxa_demangle (const char *mangled, char *buf, size_t *len,
     75                                int *status)
     76          int __gcclibcxx_demangle_callback (const char *,
     77                                             void (*)
     78                                               (const char *, size_t, void *),
     79                                             void *)
     80       instead of cplus_demangle_v3[_callback]() and
     81       java_demangle_v3[_callback]().
     82 
     83    IN_GLIBCPP_V3
     84       If defined, this file defines only __cxa_demangle() and
     85       __gcclibcxx_demangle_callback(), and no other publically visible
     86       functions or variables.
     87 
     88    STANDALONE_DEMANGLER
     89       If defined, this file defines a main() function which demangles
     90       any arguments, or, if none, demangles stdin.
     91 
     92    CP_DEMANGLE_DEBUG
     93       If defined, turns on debugging mode, which prints information on
     94       stdout about the mangled string.  This is not generally useful.
     95 
     96    CHECK_DEMANGLER
     97       If defined, additional sanity checks will be performed.  It will
     98       cause some slowdown, but will allow to catch out-of-bound access
     99       errors earlier.  This macro is intended for testing and debugging.  */
    100 
    101 #if defined (_AIX) && !defined (__GNUC__)
    102  #pragma alloca
    103 #endif
    104 
    105 #ifdef HAVE_CONFIG_H
    106 #include "config.h"
    107 #endif
    108 
    109 #include <stdio.h>
    110 
    111 #ifdef HAVE_STDLIB_H
    112 #include <stdlib.h>
    113 #endif
    114 #ifdef HAVE_STRING_H
    115 #include <string.h>
    116 #endif
    117 
    118 #ifdef HAVE_ALLOCA_H
    119 # include <alloca.h>
    120 #else
    121 # ifndef alloca
    122 #  ifdef __GNUC__
    123 #   define alloca __builtin_alloca
    124 #  else
    125 extern char *alloca ();
    126 #  endif /* __GNUC__ */
    127 # endif /* alloca */
    128 #endif /* HAVE_ALLOCA_H */
    129 
    130 #ifdef HAVE_LIMITS_H
    131 #include <limits.h>
    132 #endif
    133 #ifndef INT_MAX
    134 # define INT_MAX       (int)(((unsigned int) ~0) >> 1)          /* 0x7FFFFFFF */
    135 #endif
    136 
    137 #include "ansidecl.h"
    138 #include "libiberty.h"
    139 #include "demangle.h"
    140 #include "cp-demangle.h"
    141 
    142 /* If IN_GLIBCPP_V3 is defined, some functions are made static.  We
    143    also rename them via #define to avoid compiler errors when the
    144    static definition conflicts with the extern declaration in a header
    145    file.  */
    146 #ifdef IN_GLIBCPP_V3
    147 
    148 #define CP_STATIC_IF_GLIBCPP_V3 static
    149 
    150 #define cplus_demangle_fill_name d_fill_name
    151 static int d_fill_name (struct demangle_component *, const char *, int);
    152 
    153 #define cplus_demangle_fill_extended_operator d_fill_extended_operator
    154 static int
    155 d_fill_extended_operator (struct demangle_component *, int,
    156                           struct demangle_component *);
    157 
    158 #define cplus_demangle_fill_ctor d_fill_ctor
    159 static int
    160 d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds,
    161              struct demangle_component *);
    162 
    163 #define cplus_demangle_fill_dtor d_fill_dtor
    164 static int
    165 d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds,
    166              struct demangle_component *);
    167 
    168 #define cplus_demangle_mangled_name d_mangled_name
    169 static struct demangle_component *d_mangled_name (struct d_info *, int);
    170 
    171 #define cplus_demangle_type d_type
    172 static struct demangle_component *d_type (struct d_info *);
    173 
    174 #define cplus_demangle_print d_print
    175 static char *d_print (int, struct demangle_component *, int, size_t *);
    176 
    177 #define cplus_demangle_print_callback d_print_callback
    178 static int d_print_callback (int, struct demangle_component *,
    179                              demangle_callbackref, void *);
    180 
    181 #define cplus_demangle_init_info d_init_info
    182 static void d_init_info (const char *, int, size_t, struct d_info *);
    183 
    184 #else /* ! defined(IN_GLIBCPP_V3) */
    185 #define CP_STATIC_IF_GLIBCPP_V3
    186 #endif /* ! defined(IN_GLIBCPP_V3) */
    187 
    188 /* See if the compiler supports dynamic arrays.  */
    189 
    190 #ifdef __GNUC__
    191 #define CP_DYNAMIC_ARRAYS
    192 #else
    193 #ifdef __STDC__
    194 #ifdef __STDC_VERSION__
    195 #if __STDC_VERSION__ >= 199901L && !__STDC_NO_VLA__
    196 #define CP_DYNAMIC_ARRAYS
    197 #endif /* __STDC_VERSION__ >= 199901L && !__STDC_NO_VLA__ */
    198 #endif /* defined (__STDC_VERSION__) */
    199 #endif /* defined (__STDC__) */
    200 #endif /* ! defined (__GNUC__) */
    201 
    202 /* We avoid pulling in the ctype tables, to prevent pulling in
    203    additional unresolved symbols when this code is used in a library.
    204    FIXME: Is this really a valid reason?  This comes from the original
    205    V3 demangler code.
    206 
    207    As of this writing this file has the following undefined references
    208    when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy,
    209    strcat, strlen.  */
    210 
    211 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
    212 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
    213 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
    214 
    215 /* The prefix prepended by GCC to an identifier represnting the
    216    anonymous namespace.  */
    217 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
    218 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \
    219   (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1)
    220 
    221 /* Information we keep for the standard substitutions.  */
    222 
    223 struct d_standard_sub_info
    224 {
    225   /* The code for this substitution.  */
    226   char code;
    227   /* The simple string it expands to.  */
    228   const char *simple_expansion;
    229   /* The length of the simple expansion.  */
    230   int simple_len;
    231   /* The results of a full, verbose, expansion.  This is used when
    232      qualifying a constructor/destructor, or when in verbose mode.  */
    233   const char *full_expansion;
    234   /* The length of the full expansion.  */
    235   int full_len;
    236   /* What to set the last_name field of d_info to; NULL if we should
    237      not set it.  This is only relevant when qualifying a
    238      constructor/destructor.  */
    239   const char *set_last_name;
    240   /* The length of set_last_name.  */
    241   int set_last_name_len;
    242 };
    243 
    244 /* Accessors for subtrees of struct demangle_component.  */
    245 
    246 #define d_left(dc) ((dc)->u.s_binary.left)
    247 #define d_right(dc) ((dc)->u.s_binary.right)
    248 
    249 /* A list of templates.  This is used while printing.  */
    250 
    251 struct d_print_template
    252 {
    253   /* Next template on the list.  */
    254   struct d_print_template *next;
    255   /* This template.  */
    256   const struct demangle_component *template_decl;
    257 };
    258 
    259 /* A list of type modifiers.  This is used while printing.  */
    260 
    261 struct d_print_mod
    262 {
    263   /* Next modifier on the list.  These are in the reverse of the order
    264      in which they appeared in the mangled string.  */
    265   struct d_print_mod *next;
    266   /* The modifier.  */
    267   struct demangle_component *mod;
    268   /* Whether this modifier was printed.  */
    269   int printed;
    270   /* The list of templates which applies to this modifier.  */
    271   struct d_print_template *templates;
    272 };
    273 
    274 /* We use these structures to hold information during printing.  */
    275 
    276 struct d_growable_string
    277 {
    278   /* Buffer holding the result.  */
    279   char *buf;
    280   /* Current length of data in buffer.  */
    281   size_t len;
    282   /* Allocated size of buffer.  */
    283   size_t alc;
    284   /* Set to 1 if we had a memory allocation failure.  */
    285   int allocation_failure;
    286 };
    287 
    288 /* Stack of components, innermost first, used to avoid loops.  */
    289 
    290 struct d_component_stack
    291 {
    292   /* This component.  */
    293   const struct demangle_component *dc;
    294   /* This component's parent.  */
    295   const struct d_component_stack *parent;
    296 };
    297 
    298 /* A demangle component and some scope captured when it was first
    299    traversed.  */
    300 
    301 struct d_saved_scope
    302 {
    303   /* The component whose scope this is.  */
    304   const struct demangle_component *container;
    305   /* The list of templates, if any, that was current when this
    306      scope was captured.  */
    307   struct d_print_template *templates;
    308 };
    309 
    310 /* Checkpoint structure to allow backtracking.  This holds copies
    311    of the fields of struct d_info that need to be restored
    312    if a trial parse needs to be backtracked over.  */
    313 
    314 struct d_info_checkpoint
    315 {
    316   const char *n;
    317   int next_comp;
    318   int next_sub;
    319   int expansion;
    320 };
    321 
    322 /* Maximum number of times d_print_comp may be called recursively.  */
    323 #define MAX_RECURSION_COUNT 1024
    324 
    325 enum { D_PRINT_BUFFER_LENGTH = 256 };
    326 struct d_print_info
    327 {
    328   /* Fixed-length allocated buffer for demangled data, flushed to the
    329      callback with a NUL termination once full.  */
    330   char buf[D_PRINT_BUFFER_LENGTH];
    331   /* Current length of data in buffer.  */
    332   size_t len;
    333   /* The last character printed, saved individually so that it survives
    334      any buffer flush.  */
    335   char last_char;
    336   /* Callback function to handle demangled buffer flush.  */
    337   demangle_callbackref callback;
    338   /* Opaque callback argument.  */
    339   void *opaque;
    340   /* The current list of templates, if any.  */
    341   struct d_print_template *templates;
    342   /* The current list of modifiers (e.g., pointer, reference, etc.),
    343      if any.  */
    344   struct d_print_mod *modifiers;
    345   /* Set to 1 if we saw a demangling error.  */
    346   int demangle_failure;
    347   /* Number of times d_print_comp was recursively called.  Should not
    348      be bigger than MAX_RECURSION_COUNT.  */
    349   int recursion;
    350   /* 1 more than the number of explicit template parms of a lambda.  Template
    351      parm references >= are actually 'auto'.  */
    352   int lambda_tpl_parms;
    353   /* The current index into any template argument packs we are using
    354      for printing, or -1 to print the whole pack.  */
    355   int pack_index;
    356   /* Number of d_print_flush calls so far.  */
    357   unsigned long int flush_count;
    358   /* Stack of components, innermost first, used to avoid loops.  */
    359   const struct d_component_stack *component_stack;
    360   /* Array of saved scopes for evaluating substitutions.  */
    361   struct d_saved_scope *saved_scopes;
    362   /* Index of the next unused saved scope in the above array.  */
    363   int next_saved_scope;
    364   /* Number of saved scopes in the above array.  */
    365   int num_saved_scopes;
    366   /* Array of templates for saving into scopes.  */
    367   struct d_print_template *copy_templates;
    368   /* Index of the next unused copy template in the above array.  */
    369   int next_copy_template;
    370   /* Number of copy templates in the above array.  */
    371   int num_copy_templates;
    372   /* The nearest enclosing template, if any.  */
    373   const struct demangle_component *current_template;
    374 };
    375 
    376 #ifdef CP_DEMANGLE_DEBUG
    377 static void d_dump (struct demangle_component *, int);
    378 #endif
    379 
    380 static struct demangle_component *
    381 d_make_empty (struct d_info *);
    382 
    383 static struct demangle_component *
    384 d_make_comp (struct d_info *, enum demangle_component_type,
    385              struct demangle_component *,
    386              struct demangle_component *);
    387 
    388 static struct demangle_component *
    389 d_make_name (struct d_info *, const char *, int);
    390 
    391 static struct demangle_component *
    392 d_make_demangle_mangled_name (struct d_info *, const char *);
    393 
    394 static struct demangle_component *
    395 d_make_builtin_type (struct d_info *,
    396                      const struct demangle_builtin_type_info *);
    397 
    398 static struct demangle_component *
    399 d_make_operator (struct d_info *,
    400                  const struct demangle_operator_info *);
    401 
    402 static struct demangle_component *
    403 d_make_extended_operator (struct d_info *, int,
    404                           struct demangle_component *);
    405 
    406 static struct demangle_component *
    407 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds,
    408              struct demangle_component *);
    409 
    410 static struct demangle_component *
    411 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds,
    412              struct demangle_component *);
    413 
    414 static struct demangle_component *
    415 d_make_template_param (struct d_info *, int);
    416 
    417 static struct demangle_component *
    418 d_make_sub (struct d_info *, const char *, int);
    419 
    420 static int
    421 has_return_type (struct demangle_component *);
    422 
    423 static int
    424 is_ctor_dtor_or_conversion (struct demangle_component *);
    425 
    426 static struct demangle_component *d_encoding (struct d_info *, int);
    427 
    428 static struct demangle_component *d_name (struct d_info *, int substable);
    429 
    430 static struct demangle_component *d_nested_name (struct d_info *);
    431 
    432 static int d_maybe_module_name (struct d_info *, struct demangle_component **);
    433 
    434 static struct demangle_component *d_prefix (struct d_info *, int);
    435 
    436 static struct demangle_component *d_unqualified_name (struct d_info *,
    437 	struct demangle_component *scope, struct demangle_component *module);
    438 
    439 static struct demangle_component *d_source_name (struct d_info *);
    440 
    441 static int d_number (struct d_info *);
    442 
    443 static struct demangle_component *d_identifier (struct d_info *, int);
    444 
    445 static struct demangle_component *d_operator_name (struct d_info *);
    446 
    447 static struct demangle_component *d_special_name (struct d_info *);
    448 
    449 static struct demangle_component *d_parmlist (struct d_info *);
    450 
    451 static int d_call_offset (struct d_info *, int);
    452 
    453 static struct demangle_component *d_ctor_dtor_name (struct d_info *);
    454 
    455 static struct demangle_component **
    456 d_cv_qualifiers (struct d_info *, struct demangle_component **, int);
    457 
    458 static struct demangle_component *
    459 d_ref_qualifier (struct d_info *, struct demangle_component *);
    460 
    461 static struct demangle_component *
    462 d_function_type (struct d_info *);
    463 
    464 static struct demangle_component *
    465 d_bare_function_type (struct d_info *, int);
    466 
    467 static struct demangle_component *
    468 d_class_enum_type (struct d_info *, int);
    469 
    470 static struct demangle_component *d_array_type (struct d_info *);
    471 
    472 static struct demangle_component *d_vector_type (struct d_info *);
    473 
    474 static struct demangle_component *
    475 d_pointer_to_member_type (struct d_info *);
    476 
    477 static struct demangle_component *
    478 d_template_param (struct d_info *);
    479 
    480 static struct demangle_component *d_template_args (struct d_info *);
    481 static struct demangle_component *d_template_args_1 (struct d_info *);
    482 
    483 static struct demangle_component *
    484 d_template_arg (struct d_info *);
    485 
    486 static struct demangle_component *d_expression (struct d_info *);
    487 
    488 static struct demangle_component *d_expr_primary (struct d_info *);
    489 
    490 static struct demangle_component *d_local_name (struct d_info *);
    491 
    492 static int d_discriminator (struct d_info *);
    493 
    494 static struct demangle_component *d_template_parm (struct d_info *, int *bad);
    495 
    496 static struct demangle_component *d_template_head (struct d_info *, int *bad);
    497 
    498 static struct demangle_component *d_lambda (struct d_info *);
    499 
    500 static struct demangle_component *d_unnamed_type (struct d_info *);
    501 
    502 static struct demangle_component *
    503 d_clone_suffix (struct d_info *, struct demangle_component *);
    504 
    505 static int
    506 d_add_substitution (struct d_info *, struct demangle_component *);
    507 
    508 static struct demangle_component *d_substitution (struct d_info *, int);
    509 
    510 static void d_checkpoint (struct d_info *, struct d_info_checkpoint *);
    511 
    512 static void d_backtrack (struct d_info *, struct d_info_checkpoint *);
    513 
    514 static void d_growable_string_init (struct d_growable_string *, size_t);
    515 
    516 static inline void
    517 d_growable_string_resize (struct d_growable_string *, size_t);
    518 
    519 static inline void
    520 d_growable_string_append_buffer (struct d_growable_string *,
    521                                  const char *, size_t);
    522 static void
    523 d_growable_string_callback_adapter (const char *, size_t, void *);
    524 
    525 static void
    526 d_print_init (struct d_print_info *, demangle_callbackref, void *,
    527 	      struct demangle_component *);
    528 
    529 static inline void d_print_error (struct d_print_info *);
    530 
    531 static inline int d_print_saw_error (struct d_print_info *);
    532 
    533 static inline void d_print_flush (struct d_print_info *);
    534 
    535 static inline void d_append_char (struct d_print_info *, char);
    536 
    537 static inline void d_append_buffer (struct d_print_info *,
    538                                     const char *, size_t);
    539 
    540 static inline void d_append_string (struct d_print_info *, const char *);
    541 
    542 static inline char d_last_char (struct d_print_info *);
    543 
    544 static void
    545 d_print_comp (struct d_print_info *, int, struct demangle_component *);
    546 
    547 static void
    548 d_print_java_identifier (struct d_print_info *, const char *, int);
    549 
    550 static void
    551 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int);
    552 
    553 static void
    554 d_print_mod (struct d_print_info *, int, struct demangle_component *);
    555 
    556 static void
    557 d_print_function_type (struct d_print_info *, int,
    558                        struct demangle_component *,
    559                        struct d_print_mod *);
    560 
    561 static void
    562 d_print_array_type (struct d_print_info *, int,
    563                     struct demangle_component *,
    564                     struct d_print_mod *);
    565 
    566 static void
    567 d_print_expr_op (struct d_print_info *, int, struct demangle_component *);
    568 
    569 static void d_print_cast (struct d_print_info *, int,
    570 			  struct demangle_component *);
    571 static void d_print_conversion (struct d_print_info *, int,
    572 				struct demangle_component *);
    573 
    574 static int d_demangle_callback (const char *, int,
    575                                 demangle_callbackref, void *);
    576 static char *d_demangle (const char *, int, size_t *);
    577 
    578 #define FNQUAL_COMPONENT_CASE				\
    579     case DEMANGLE_COMPONENT_RESTRICT_THIS:		\
    580     case DEMANGLE_COMPONENT_VOLATILE_THIS:		\
    581     case DEMANGLE_COMPONENT_CONST_THIS:			\
    582     case DEMANGLE_COMPONENT_REFERENCE_THIS:		\
    583     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:	\
    584     case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:	\
    585     case DEMANGLE_COMPONENT_TRANSACTION_SAFE:		\
    586     case DEMANGLE_COMPONENT_NOEXCEPT:			\
    587     case DEMANGLE_COMPONENT_THROW_SPEC
    588 
    589 /* True iff TYPE is a demangling component representing a
    590    function-type-qualifier.  */
    591 
    592 static int
    593 is_fnqual_component_type (enum demangle_component_type type)
    594 {
    595   switch (type)
    596     {
    597     FNQUAL_COMPONENT_CASE:
    598       return 1;
    599     default:
    600       break;
    601     }
    602   return 0;
    603 }
    604 
    605 
    606 #ifdef CP_DEMANGLE_DEBUG
    607 
    608 static void
    609 d_dump (struct demangle_component *dc, int indent)
    610 {
    611   int i;
    612 
    613   if (dc == NULL)
    614     {
    615       if (indent == 0)
    616         printf ("failed demangling\n");
    617       return;
    618     }
    619 
    620   for (i = 0; i < indent; ++i)
    621     putchar (' ');
    622 
    623   switch (dc->type)
    624     {
    625     case DEMANGLE_COMPONENT_NAME:
    626       printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s);
    627       return;
    628     case DEMANGLE_COMPONENT_TAGGED_NAME:
    629       printf ("tagged name\n");
    630       d_dump (dc->u.s_binary.left, indent + 2);
    631       d_dump (dc->u.s_binary.right, indent + 2);
    632       return;
    633     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
    634       printf ("template parameter %ld\n", dc->u.s_number.number);
    635       return;
    636     case DEMANGLE_COMPONENT_TPARM_OBJ:
    637       printf ("template parameter object\n");
    638       break;
    639     case DEMANGLE_COMPONENT_FUNCTION_PARAM:
    640       printf ("function parameter %ld\n", dc->u.s_number.number);
    641       return;
    642     case DEMANGLE_COMPONENT_CTOR:
    643       printf ("constructor %d\n", (int) dc->u.s_ctor.kind);
    644       d_dump (dc->u.s_ctor.name, indent + 2);
    645       return;
    646     case DEMANGLE_COMPONENT_DTOR:
    647       printf ("destructor %d\n", (int) dc->u.s_dtor.kind);
    648       d_dump (dc->u.s_dtor.name, indent + 2);
    649       return;
    650     case DEMANGLE_COMPONENT_SUB_STD:
    651       printf ("standard substitution %s\n", dc->u.s_string.string);
    652       return;
    653     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
    654       printf ("builtin type %s\n", dc->u.s_builtin.type->name);
    655       return;
    656     case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
    657       {
    658 	char suffix[2] = { dc->u.s_extended_builtin.suffix, 0 };
    659 	printf ("builtin type %s%d%s\n", dc->u.s_extended_builtin.type->name,
    660 		dc->u.s_extended_builtin.arg, suffix);
    661       }
    662       return;
    663     case DEMANGLE_COMPONENT_OPERATOR:
    664       printf ("operator %s\n", dc->u.s_operator.op->name);
    665       return;
    666     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
    667       printf ("extended operator with %d args\n",
    668 	      dc->u.s_extended_operator.args);
    669       d_dump (dc->u.s_extended_operator.name, indent + 2);
    670       return;
    671 
    672     case DEMANGLE_COMPONENT_QUAL_NAME:
    673       printf ("qualified name\n");
    674       break;
    675     case DEMANGLE_COMPONENT_LOCAL_NAME:
    676       printf ("local name\n");
    677       break;
    678     case DEMANGLE_COMPONENT_TYPED_NAME:
    679       printf ("typed name\n");
    680       break;
    681     case DEMANGLE_COMPONENT_TEMPLATE:
    682       printf ("template\n");
    683       break;
    684     case DEMANGLE_COMPONENT_VTABLE:
    685       printf ("vtable\n");
    686       break;
    687     case DEMANGLE_COMPONENT_VTT:
    688       printf ("VTT\n");
    689       break;
    690     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
    691       printf ("construction vtable\n");
    692       break;
    693     case DEMANGLE_COMPONENT_TYPEINFO:
    694       printf ("typeinfo\n");
    695       break;
    696     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
    697       printf ("typeinfo name\n");
    698       break;
    699     case DEMANGLE_COMPONENT_TYPEINFO_FN:
    700       printf ("typeinfo function\n");
    701       break;
    702     case DEMANGLE_COMPONENT_THUNK:
    703       printf ("thunk\n");
    704       break;
    705     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
    706       printf ("virtual thunk\n");
    707       break;
    708     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
    709       printf ("covariant thunk\n");
    710       break;
    711     case DEMANGLE_COMPONENT_JAVA_CLASS:
    712       printf ("java class\n");
    713       break;
    714     case DEMANGLE_COMPONENT_GUARD:
    715       printf ("guard\n");
    716       break;
    717     case DEMANGLE_COMPONENT_REFTEMP:
    718       printf ("reference temporary\n");
    719       break;
    720     case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
    721       printf ("hidden alias\n");
    722       break;
    723     case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
    724       printf ("transaction clone\n");
    725       break;
    726     case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
    727       printf ("non-transaction clone\n");
    728       break;
    729     case DEMANGLE_COMPONENT_RESTRICT:
    730       printf ("restrict\n");
    731       break;
    732     case DEMANGLE_COMPONENT_VOLATILE:
    733       printf ("volatile\n");
    734       break;
    735     case DEMANGLE_COMPONENT_CONST:
    736       printf ("const\n");
    737       break;
    738     case DEMANGLE_COMPONENT_RESTRICT_THIS:
    739       printf ("restrict this\n");
    740       break;
    741     case DEMANGLE_COMPONENT_VOLATILE_THIS:
    742       printf ("volatile this\n");
    743       break;
    744     case DEMANGLE_COMPONENT_CONST_THIS:
    745       printf ("const this\n");
    746       break;
    747     case DEMANGLE_COMPONENT_REFERENCE_THIS:
    748       printf ("reference this\n");
    749       break;
    750     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
    751       printf ("rvalue reference this\n");
    752       break;
    753     case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:
    754       printf ("explicit object parameter\n");
    755       break;
    756     case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
    757       printf ("transaction_safe this\n");
    758       break;
    759     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
    760       printf ("vendor type qualifier\n");
    761       break;
    762     case DEMANGLE_COMPONENT_POINTER:
    763       printf ("pointer\n");
    764       break;
    765     case DEMANGLE_COMPONENT_REFERENCE:
    766       printf ("reference\n");
    767       break;
    768     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
    769       printf ("rvalue reference\n");
    770       break;
    771     case DEMANGLE_COMPONENT_COMPLEX:
    772       printf ("complex\n");
    773       break;
    774     case DEMANGLE_COMPONENT_IMAGINARY:
    775       printf ("imaginary\n");
    776       break;
    777     case DEMANGLE_COMPONENT_VENDOR_TYPE:
    778       printf ("vendor type\n");
    779       break;
    780     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
    781       printf ("function type\n");
    782       break;
    783     case DEMANGLE_COMPONENT_ARRAY_TYPE:
    784       printf ("array type\n");
    785       break;
    786     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
    787       printf ("pointer to member type\n");
    788       break;
    789     case DEMANGLE_COMPONENT_ARGLIST:
    790       printf ("argument list\n");
    791       break;
    792     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
    793       printf ("template argument list\n");
    794       break;
    795     case DEMANGLE_COMPONENT_INITIALIZER_LIST:
    796       printf ("initializer list\n");
    797       break;
    798     case DEMANGLE_COMPONENT_CAST:
    799       printf ("cast\n");
    800       break;
    801     case DEMANGLE_COMPONENT_CONVERSION:
    802       printf ("conversion operator\n");
    803       break;
    804     case DEMANGLE_COMPONENT_NULLARY:
    805       printf ("nullary operator\n");
    806       break;
    807     case DEMANGLE_COMPONENT_UNARY:
    808       printf ("unary operator\n");
    809       break;
    810     case DEMANGLE_COMPONENT_BINARY:
    811       printf ("binary operator\n");
    812       break;
    813     case DEMANGLE_COMPONENT_BINARY_ARGS:
    814       printf ("binary operator arguments\n");
    815       break;
    816     case DEMANGLE_COMPONENT_TRINARY:
    817       printf ("trinary operator\n");
    818       break;
    819     case DEMANGLE_COMPONENT_TRINARY_ARG1:
    820       printf ("trinary operator arguments 1\n");
    821       break;
    822     case DEMANGLE_COMPONENT_TRINARY_ARG2:
    823       printf ("trinary operator arguments 1\n");
    824       break;
    825     case DEMANGLE_COMPONENT_LITERAL:
    826       printf ("literal\n");
    827       break;
    828     case DEMANGLE_COMPONENT_LITERAL_NEG:
    829       printf ("negative literal\n");
    830       break;
    831     case DEMANGLE_COMPONENT_VENDOR_EXPR:
    832       printf ("vendor expression\n");
    833       break;
    834     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
    835       printf ("java resource\n");
    836       break;
    837     case DEMANGLE_COMPONENT_COMPOUND_NAME:
    838       printf ("compound name\n");
    839       break;
    840     case DEMANGLE_COMPONENT_CHARACTER:
    841       printf ("character '%c'\n",  dc->u.s_character.character);
    842       return;
    843     case DEMANGLE_COMPONENT_NUMBER:
    844       printf ("number %ld\n", dc->u.s_number.number);
    845       return;
    846     case DEMANGLE_COMPONENT_DECLTYPE:
    847       printf ("decltype\n");
    848       break;
    849     case DEMANGLE_COMPONENT_PACK_EXPANSION:
    850       printf ("pack expansion\n");
    851       break;
    852     case DEMANGLE_COMPONENT_TLS_INIT:
    853       printf ("tls init function\n");
    854       break;
    855     case DEMANGLE_COMPONENT_TLS_WRAPPER:
    856       printf ("tls wrapper function\n");
    857       break;
    858     case DEMANGLE_COMPONENT_DEFAULT_ARG:
    859       printf ("default argument %d\n", dc->u.s_unary_num.num);
    860       d_dump (dc->u.s_unary_num.sub, indent+2);
    861       return;
    862     case DEMANGLE_COMPONENT_LAMBDA:
    863       printf ("lambda %d\n", dc->u.s_unary_num.num);
    864       d_dump (dc->u.s_unary_num.sub, indent+2);
    865       return;
    866     }
    867 
    868   d_dump (d_left (dc), indent + 2);
    869   d_dump (d_right (dc), indent + 2);
    870 }
    871 
    872 #endif /* CP_DEMANGLE_DEBUG */
    873 
    874 /* Fill in a DEMANGLE_COMPONENT_NAME.  */
    875 
    876 CP_STATIC_IF_GLIBCPP_V3
    877 int
    878 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len)
    879 {
    880   if (p == NULL || s == NULL || len <= 0)
    881     return 0;
    882   p->d_printing = 0;
    883   p->d_counting = 0;
    884   p->type = DEMANGLE_COMPONENT_NAME;
    885   p->u.s_name.s = s;
    886   p->u.s_name.len = len;
    887   return 1;
    888 }
    889 
    890 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR.  */
    891 
    892 CP_STATIC_IF_GLIBCPP_V3
    893 int
    894 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args,
    895                                        struct demangle_component *name)
    896 {
    897   if (p == NULL || args < 0 || name == NULL)
    898     return 0;
    899   p->d_printing = 0;
    900   p->d_counting = 0;
    901   p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR;
    902   p->u.s_extended_operator.args = args;
    903   p->u.s_extended_operator.name = name;
    904   return 1;
    905 }
    906 
    907 /* Fill in a DEMANGLE_COMPONENT_CTOR.  */
    908 
    909 CP_STATIC_IF_GLIBCPP_V3
    910 int
    911 cplus_demangle_fill_ctor (struct demangle_component *p,
    912                           enum gnu_v3_ctor_kinds kind,
    913                           struct demangle_component *name)
    914 {
    915   if (p == NULL
    916       || name == NULL
    917       || (int) kind < gnu_v3_complete_object_ctor
    918       || (int) kind > gnu_v3_object_ctor_group)
    919     return 0;
    920   p->d_printing = 0;
    921   p->d_counting = 0;
    922   p->type = DEMANGLE_COMPONENT_CTOR;
    923   p->u.s_ctor.kind = kind;
    924   p->u.s_ctor.name = name;
    925   return 1;
    926 }
    927 
    928 /* Fill in a DEMANGLE_COMPONENT_DTOR.  */
    929 
    930 CP_STATIC_IF_GLIBCPP_V3
    931 int
    932 cplus_demangle_fill_dtor (struct demangle_component *p,
    933                           enum gnu_v3_dtor_kinds kind,
    934                           struct demangle_component *name)
    935 {
    936   if (p == NULL
    937       || name == NULL
    938       || (int) kind < gnu_v3_deleting_dtor
    939       || (int) kind > gnu_v3_object_dtor_group)
    940     return 0;
    941   p->d_printing = 0;
    942   p->d_counting = 0;
    943   p->type = DEMANGLE_COMPONENT_DTOR;
    944   p->u.s_dtor.kind = kind;
    945   p->u.s_dtor.name = name;
    946   return 1;
    947 }
    948 
    949 /* Add a new component.  */
    950 
    951 static struct demangle_component *
    952 d_make_empty (struct d_info *di)
    953 {
    954   struct demangle_component *p;
    955 
    956   if (di->next_comp >= di->num_comps)
    957     return NULL;
    958   p = &di->comps[di->next_comp];
    959   p->d_printing = 0;
    960   p->d_counting = 0;
    961   ++di->next_comp;
    962   return p;
    963 }
    964 
    965 /* Add a new generic component.  */
    966 
    967 static struct demangle_component *
    968 d_make_comp (struct d_info *di, enum demangle_component_type type,
    969              struct demangle_component *left,
    970              struct demangle_component *right)
    971 {
    972   struct demangle_component *p;
    973 
    974   /* We check for errors here.  A typical error would be a NULL return
    975      from a subroutine.  We catch those here, and return NULL
    976      upward.  */
    977   switch (type)
    978     {
    979       /* These types require two parameters.  */
    980     case DEMANGLE_COMPONENT_QUAL_NAME:
    981     case DEMANGLE_COMPONENT_LOCAL_NAME:
    982     case DEMANGLE_COMPONENT_TYPED_NAME:
    983     case DEMANGLE_COMPONENT_TAGGED_NAME:
    984     case DEMANGLE_COMPONENT_TEMPLATE:
    985     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
    986     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
    987     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
    988     case DEMANGLE_COMPONENT_UNARY:
    989     case DEMANGLE_COMPONENT_BINARY:
    990     case DEMANGLE_COMPONENT_BINARY_ARGS:
    991     case DEMANGLE_COMPONENT_TRINARY:
    992     case DEMANGLE_COMPONENT_TRINARY_ARG1:
    993     case DEMANGLE_COMPONENT_LITERAL:
    994     case DEMANGLE_COMPONENT_LITERAL_NEG:
    995     case DEMANGLE_COMPONENT_VENDOR_EXPR:
    996     case DEMANGLE_COMPONENT_COMPOUND_NAME:
    997     case DEMANGLE_COMPONENT_VECTOR_TYPE:
    998     case DEMANGLE_COMPONENT_CLONE:
    999     case DEMANGLE_COMPONENT_MODULE_ENTITY:
   1000     case DEMANGLE_COMPONENT_CONSTRAINTS:
   1001       if (left == NULL || right == NULL)
   1002 	return NULL;
   1003       break;
   1004 
   1005       /* These types only require one parameter.  */
   1006     case DEMANGLE_COMPONENT_VTABLE:
   1007     case DEMANGLE_COMPONENT_VTT:
   1008     case DEMANGLE_COMPONENT_TYPEINFO:
   1009     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
   1010     case DEMANGLE_COMPONENT_TYPEINFO_FN:
   1011     case DEMANGLE_COMPONENT_THUNK:
   1012     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
   1013     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
   1014     case DEMANGLE_COMPONENT_JAVA_CLASS:
   1015     case DEMANGLE_COMPONENT_GUARD:
   1016     case DEMANGLE_COMPONENT_TLS_INIT:
   1017     case DEMANGLE_COMPONENT_TLS_WRAPPER:
   1018     case DEMANGLE_COMPONENT_REFTEMP:
   1019     case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
   1020     case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
   1021     case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
   1022     case DEMANGLE_COMPONENT_POINTER:
   1023     case DEMANGLE_COMPONENT_REFERENCE:
   1024     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
   1025     case DEMANGLE_COMPONENT_COMPLEX:
   1026     case DEMANGLE_COMPONENT_IMAGINARY:
   1027     case DEMANGLE_COMPONENT_VENDOR_TYPE:
   1028     case DEMANGLE_COMPONENT_CAST:
   1029     case DEMANGLE_COMPONENT_CONVERSION:
   1030     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
   1031     case DEMANGLE_COMPONENT_DECLTYPE:
   1032     case DEMANGLE_COMPONENT_PACK_EXPANSION:
   1033     case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
   1034     case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
   1035     case DEMANGLE_COMPONENT_NULLARY:
   1036     case DEMANGLE_COMPONENT_TRINARY_ARG2:
   1037     case DEMANGLE_COMPONENT_TPARM_OBJ:
   1038     case DEMANGLE_COMPONENT_STRUCTURED_BINDING:
   1039     case DEMANGLE_COMPONENT_MODULE_INIT:
   1040     case DEMANGLE_COMPONENT_TEMPLATE_HEAD:
   1041     case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM:
   1042     case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM:
   1043     case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM:
   1044     case DEMANGLE_COMPONENT_FRIEND:
   1045       if (left == NULL)
   1046 	return NULL;
   1047       break;
   1048 
   1049       /* This needs a right parameter, but the left parameter can be
   1050 	 empty.  */
   1051     case DEMANGLE_COMPONENT_ARRAY_TYPE:
   1052     case DEMANGLE_COMPONENT_INITIALIZER_LIST:
   1053     case DEMANGLE_COMPONENT_MODULE_NAME:
   1054     case DEMANGLE_COMPONENT_MODULE_PARTITION:
   1055       if (right == NULL)
   1056 	return NULL;
   1057       break;
   1058 
   1059       /* These are allowed to have no parameters--in some cases they
   1060 	 will be filled in later.  */
   1061     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
   1062     case DEMANGLE_COMPONENT_RESTRICT:
   1063     case DEMANGLE_COMPONENT_VOLATILE:
   1064     case DEMANGLE_COMPONENT_CONST:
   1065     case DEMANGLE_COMPONENT_ARGLIST:
   1066     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
   1067     case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM:
   1068     FNQUAL_COMPONENT_CASE:
   1069       break;
   1070 
   1071       /* Other types should not be seen here.  */
   1072     default:
   1073       return NULL;
   1074     }
   1075 
   1076   p = d_make_empty (di);
   1077   if (p != NULL)
   1078     {
   1079       p->type = type;
   1080       p->u.s_binary.left = left;
   1081       p->u.s_binary.right = right;
   1082     }
   1083   return p;
   1084 }
   1085 
   1086 /* Add a new demangle mangled name component.  */
   1087 
   1088 static struct demangle_component *
   1089 d_make_demangle_mangled_name (struct d_info *di, const char *s)
   1090 {
   1091   if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z')
   1092     return d_make_name (di, s, strlen (s));
   1093   d_advance (di, 2);
   1094   return d_encoding (di, 0);
   1095 }
   1096 
   1097 /* Add a new name component.  */
   1098 
   1099 static struct demangle_component *
   1100 d_make_name (struct d_info *di, const char *s, int len)
   1101 {
   1102   struct demangle_component *p;
   1103 
   1104   p = d_make_empty (di);
   1105   if (! cplus_demangle_fill_name (p, s, len))
   1106     return NULL;
   1107   return p;
   1108 }
   1109 
   1110 /* Add a new builtin type component.  */
   1111 
   1112 static struct demangle_component *
   1113 d_make_builtin_type (struct d_info *di,
   1114                      const struct demangle_builtin_type_info *type)
   1115 {
   1116   struct demangle_component *p;
   1117 
   1118   if (type == NULL)
   1119     return NULL;
   1120   p = d_make_empty (di);
   1121   if (p != NULL)
   1122     {
   1123       p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
   1124       p->u.s_builtin.type = type;
   1125     }
   1126   return p;
   1127 }
   1128 
   1129 /* Add a new extended builtin type component.  */
   1130 
   1131 static struct demangle_component *
   1132 d_make_extended_builtin_type (struct d_info *di,
   1133 			      const struct demangle_builtin_type_info *type,
   1134 			      short arg, char suffix)
   1135 {
   1136   struct demangle_component *p;
   1137 
   1138   if (type == NULL)
   1139     return NULL;
   1140   p = d_make_empty (di);
   1141   if (p != NULL)
   1142     {
   1143       p->type = DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE;
   1144       p->u.s_extended_builtin.type = type;
   1145       p->u.s_extended_builtin.arg = arg;
   1146       p->u.s_extended_builtin.suffix = suffix;
   1147     }
   1148   return p;
   1149 }
   1150 
   1151 /* Add a new operator component.  */
   1152 
   1153 static struct demangle_component *
   1154 d_make_operator (struct d_info *di, const struct demangle_operator_info *op)
   1155 {
   1156   struct demangle_component *p;
   1157 
   1158   p = d_make_empty (di);
   1159   if (p != NULL)
   1160     {
   1161       p->type = DEMANGLE_COMPONENT_OPERATOR;
   1162       p->u.s_operator.op = op;
   1163     }
   1164   return p;
   1165 }
   1166 
   1167 /* Add a new extended operator component.  */
   1168 
   1169 static struct demangle_component *
   1170 d_make_extended_operator (struct d_info *di, int args,
   1171                           struct demangle_component *name)
   1172 {
   1173   struct demangle_component *p;
   1174 
   1175   p = d_make_empty (di);
   1176   if (! cplus_demangle_fill_extended_operator (p, args, name))
   1177     return NULL;
   1178   return p;
   1179 }
   1180 
   1181 static struct demangle_component *
   1182 d_make_default_arg (struct d_info *di, int num,
   1183 		    struct demangle_component *sub)
   1184 {
   1185   struct demangle_component *p = d_make_empty (di);
   1186   if (p)
   1187     {
   1188       p->type = DEMANGLE_COMPONENT_DEFAULT_ARG;
   1189       p->u.s_unary_num.num = num;
   1190       p->u.s_unary_num.sub = sub;
   1191     }
   1192   return p;
   1193 }
   1194 
   1195 /* Add a new constructor component.  */
   1196 
   1197 static struct demangle_component *
   1198 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind,
   1199              struct demangle_component *name)
   1200 {
   1201   struct demangle_component *p;
   1202 
   1203   p = d_make_empty (di);
   1204   if (! cplus_demangle_fill_ctor (p, kind, name))
   1205     return NULL;
   1206   return p;
   1207 }
   1208 
   1209 /* Add a new destructor component.  */
   1210 
   1211 static struct demangle_component *
   1212 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind,
   1213              struct demangle_component *name)
   1214 {
   1215   struct demangle_component *p;
   1216 
   1217   p = d_make_empty (di);
   1218   if (! cplus_demangle_fill_dtor (p, kind, name))
   1219     return NULL;
   1220   return p;
   1221 }
   1222 
   1223 /* Add a new template parameter.  */
   1224 
   1225 static struct demangle_component *
   1226 d_make_template_param (struct d_info *di, int i)
   1227 {
   1228   struct demangle_component *p;
   1229 
   1230   p = d_make_empty (di);
   1231   if (p != NULL)
   1232     {
   1233       p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM;
   1234       p->u.s_number.number = i;
   1235     }
   1236   return p;
   1237 }
   1238 
   1239 /* Add a new function parameter.  */
   1240 
   1241 static struct demangle_component *
   1242 d_make_function_param (struct d_info *di, int i)
   1243 {
   1244   struct demangle_component *p;
   1245 
   1246   p = d_make_empty (di);
   1247   if (p != NULL)
   1248     {
   1249       p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM;
   1250       p->u.s_number.number = i;
   1251     }
   1252   return p;
   1253 }
   1254 
   1255 /* Add a new standard substitution component.  */
   1256 
   1257 static struct demangle_component *
   1258 d_make_sub (struct d_info *di, const char *name, int len)
   1259 {
   1260   struct demangle_component *p;
   1261 
   1262   p = d_make_empty (di);
   1263   if (p != NULL)
   1264     {
   1265       p->type = DEMANGLE_COMPONENT_SUB_STD;
   1266       p->u.s_string.string = name;
   1267       p->u.s_string.len = len;
   1268     }
   1269   return p;
   1270 }
   1271 
   1272 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]*
   1273 
   1274    TOP_LEVEL is non-zero when called at the top level.  */
   1275 
   1276 CP_STATIC_IF_GLIBCPP_V3
   1277 struct demangle_component *
   1278 cplus_demangle_mangled_name (struct d_info *di, int top_level)
   1279 {
   1280   struct demangle_component *p;
   1281 
   1282   if (! d_check_char (di, '_')
   1283       /* Allow missing _ if not at toplevel to work around a
   1284 	 bug in G++ abi-version=2 mangling; see the comment in
   1285 	 write_template_arg.  */
   1286       && top_level)
   1287     return NULL;
   1288   if (! d_check_char (di, 'Z'))
   1289     return NULL;
   1290   p = d_encoding (di, top_level);
   1291 
   1292   /* If at top level and parsing parameters, check for a clone
   1293      suffix.  */
   1294   if (top_level && (di->options & DMGL_PARAMS) != 0)
   1295     while (d_peek_char (di) == '.'
   1296 	   && (IS_LOWER (d_peek_next_char (di))
   1297 	       || d_peek_next_char (di) == '_'
   1298 	       || IS_DIGIT (d_peek_next_char (di))))
   1299       p = d_clone_suffix (di, p);
   1300 
   1301   return p;
   1302 }
   1303 
   1304 /* Return whether a function should have a return type.  The argument
   1305    is the function name, which may be qualified in various ways.  The
   1306    rules are that template functions have return types with some
   1307    exceptions, function types which are not part of a function name
   1308    mangling have return types with some exceptions, and non-template
   1309    function names do not have return types.  The exceptions are that
   1310    constructors, destructors, and conversion operators do not have
   1311    return types.  */
   1312 
   1313 static int
   1314 has_return_type (struct demangle_component *dc)
   1315 {
   1316   if (dc == NULL)
   1317     return 0;
   1318   switch (dc->type)
   1319     {
   1320     default:
   1321       return 0;
   1322     case DEMANGLE_COMPONENT_LOCAL_NAME:
   1323       return has_return_type (d_right (dc));
   1324     case DEMANGLE_COMPONENT_TEMPLATE:
   1325       return ! is_ctor_dtor_or_conversion (d_left (dc));
   1326     FNQUAL_COMPONENT_CASE:
   1327       return has_return_type (d_left (dc));
   1328     }
   1329 }
   1330 
   1331 /* Return whether a name is a constructor, a destructor, or a
   1332    conversion operator.  */
   1333 
   1334 static int
   1335 is_ctor_dtor_or_conversion (struct demangle_component *dc)
   1336 {
   1337   if (dc == NULL)
   1338     return 0;
   1339   switch (dc->type)
   1340     {
   1341     default:
   1342       return 0;
   1343     case DEMANGLE_COMPONENT_QUAL_NAME:
   1344     case DEMANGLE_COMPONENT_LOCAL_NAME:
   1345       return is_ctor_dtor_or_conversion (d_right (dc));
   1346     case DEMANGLE_COMPONENT_CTOR:
   1347     case DEMANGLE_COMPONENT_DTOR:
   1348     case DEMANGLE_COMPONENT_CONVERSION:
   1349       return 1;
   1350     }
   1351 }
   1352 
   1353 /* [ Q <constraint-expression> ] */
   1354 
   1355 static struct demangle_component *
   1356 d_maybe_constraints (struct d_info *di, struct demangle_component *dc)
   1357 {
   1358   if (d_peek_char (di) == 'Q')
   1359     {
   1360       d_advance (di, 1);
   1361       struct demangle_component *expr = d_expression (di);
   1362       if (expr == NULL)
   1363 	return NULL;
   1364       dc = d_make_comp (di, DEMANGLE_COMPONENT_CONSTRAINTS, dc, expr);
   1365     }
   1366   return dc;
   1367 }
   1368 
   1369 /* <encoding> ::= <(function) name> <bare-function-type>
   1370               ::= <(data) name>
   1371               ::= <special-name>
   1372 
   1373    TOP_LEVEL is non-zero when called at the top level, in which case
   1374    if DMGL_PARAMS is not set we do not demangle the function
   1375    parameters.  We only set this at the top level, because otherwise
   1376    we would not correctly demangle names in local scopes.  */
   1377 
   1378 static struct demangle_component *
   1379 d_encoding (struct d_info *di, int top_level)
   1380 {
   1381   char peek = d_peek_char (di);
   1382   struct demangle_component *dc;
   1383 
   1384   if (peek == 'G' || peek == 'T')
   1385     dc = d_special_name (di);
   1386   else
   1387     {
   1388       dc = d_name (di, 0);
   1389 
   1390       if (!dc)
   1391 	/* Failed already.  */;
   1392       else if (top_level && (di->options & DMGL_PARAMS) == 0)
   1393 	{
   1394 	  /* Strip off any initial CV-qualifiers, as they really apply
   1395 	     to the `this' parameter, and they were not output by the
   1396 	     v2 demangler without DMGL_PARAMS.  */
   1397 	  while (is_fnqual_component_type (dc->type))
   1398 	    dc = d_left (dc);
   1399 
   1400 	  /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then
   1401 	     there may be function-qualifiers on its right argument which
   1402 	     really apply here; this happens when parsing a class
   1403 	     which is local to a function.  */
   1404 	  if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
   1405 	    {
   1406 	      while (d_right (dc) != NULL
   1407 		     && is_fnqual_component_type (d_right (dc)->type))
   1408 		d_right (dc) = d_left (d_right (dc));
   1409 
   1410 	      if (d_right (dc) == NULL)
   1411 		dc = NULL;
   1412 	    }
   1413 	}
   1414       else
   1415 	{
   1416 	  peek = d_peek_char (di);
   1417 	  if (peek != '\0' && peek != 'E')
   1418 	    {
   1419 	      struct demangle_component *ftype;
   1420 
   1421 	      ftype = d_bare_function_type (di, has_return_type (dc));
   1422 	      if (!ftype)
   1423 		return NULL;
   1424 
   1425 	      /* If this is a non-top-level local-name, clear the
   1426 		 return type, so it doesn't confuse the user by
   1427 		 being confused with the return type of whaever
   1428 		 this is nested within.  */
   1429 	      if (!top_level && dc->type == DEMANGLE_COMPONENT_LOCAL_NAME
   1430 		  && ftype->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
   1431 		d_left (ftype) = NULL;
   1432 
   1433 	      ftype = d_maybe_constraints (di, ftype);
   1434 
   1435 	      dc = d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME,
   1436 				dc, ftype);
   1437 	    }
   1438 	}
   1439     }
   1440 
   1441   return dc;
   1442 }
   1443 
   1444 /* <tagged-name> ::= <name> B <source-name> */
   1445 
   1446 static struct demangle_component *
   1447 d_abi_tags (struct d_info *di, struct demangle_component *dc)
   1448 {
   1449   struct demangle_component *hold_last_name;
   1450   char peek;
   1451 
   1452   /* Preserve the last name, so the ABI tag doesn't clobber it.  */
   1453   hold_last_name = di->last_name;
   1454 
   1455   while (peek = d_peek_char (di),
   1456 	 peek == 'B')
   1457     {
   1458       struct demangle_component *tag;
   1459       d_advance (di, 1);
   1460       tag = d_source_name (di);
   1461       dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
   1462     }
   1463 
   1464   di->last_name = hold_last_name;
   1465 
   1466   return dc;
   1467 }
   1468 
   1469 /* <name> ::= <nested-name>
   1470           ::= <unscoped-name>
   1471           ::= <unscoped-template-name> <template-args>
   1472           ::= <local-name>
   1473 
   1474    <unscoped-name> ::= <unqualified-name>
   1475                    ::= St <unqualified-name>
   1476 
   1477    <unscoped-template-name> ::= <unscoped-name>
   1478                             ::= <substitution>
   1479 */
   1480 
   1481 static struct demangle_component *
   1482 d_name (struct d_info *di, int substable)
   1483 {
   1484   char peek = d_peek_char (di);
   1485   struct demangle_component *dc = NULL;
   1486   struct demangle_component *module = NULL;
   1487   int subst = 0;
   1488 
   1489   switch (peek)
   1490     {
   1491     case 'N':
   1492       dc = d_nested_name (di);
   1493       break;
   1494 
   1495     case 'Z':
   1496       dc = d_local_name (di);
   1497       break;
   1498 
   1499     case 'U':
   1500       dc = d_unqualified_name (di, NULL, NULL);
   1501       break;
   1502 
   1503     case 'S':
   1504       {
   1505 	if (d_peek_next_char (di) == 't')
   1506 	  {
   1507 	    d_advance (di, 2);
   1508 	    dc = d_make_name (di, "std", 3);
   1509 	    di->expansion += 3;
   1510 	  }
   1511 
   1512 	if (d_peek_char (di) == 'S')
   1513 	  {
   1514 	    module = d_substitution (di, 0);
   1515 	    if (!module)
   1516 	      return NULL;
   1517 	    if (!(module->type == DEMANGLE_COMPONENT_MODULE_NAME
   1518 		  || module->type == DEMANGLE_COMPONENT_MODULE_PARTITION))
   1519 	      {
   1520 		if (dc)
   1521 		  return NULL;
   1522 		subst = 1;
   1523 		dc = module;
   1524 		module = NULL;
   1525 	      }
   1526 	  }
   1527       }
   1528       /* FALLTHROUGH */
   1529 
   1530     case 'L':
   1531     default:
   1532       if (!subst)
   1533 	dc = d_unqualified_name (di, dc, module);
   1534       if (d_peek_char (di) == 'I')
   1535 	{
   1536 	  /* This is <template-args>, which means that we just saw
   1537 	     <unscoped-template-name>, which is a substitution
   1538 	     candidate.  */
   1539 	  if (!subst && !d_add_substitution (di, dc))
   1540 	    return NULL;
   1541 	  dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc,
   1542 			    d_template_args (di));
   1543 	  subst = 0;
   1544 	}
   1545       break;
   1546     }
   1547   if (substable && !subst && !d_add_substitution (di, dc))
   1548     return NULL;
   1549   return dc;
   1550 }
   1551 
   1552 /* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
   1553                  ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
   1554                  ::= N H <prefix> <unqualified-name> E
   1555                  ::= N H <template-prefix> <template-args> E
   1556 */
   1557 
   1558 static struct demangle_component *
   1559 d_nested_name (struct d_info *di)
   1560 {
   1561   struct demangle_component *ret;
   1562   struct demangle_component **pret;
   1563   struct demangle_component *rqual;
   1564 
   1565   if (! d_check_char (di, 'N'))
   1566     return NULL;
   1567 
   1568   if (d_peek_char (di) == 'H')
   1569     {
   1570       d_advance (di, 1);
   1571       di->expansion += sizeof "this";
   1572       pret = &ret;
   1573       rqual = d_make_comp (di, DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION,
   1574 			   NULL, NULL);
   1575     }
   1576   else
   1577     {
   1578       pret = d_cv_qualifiers (di, &ret, 1);
   1579       if (pret == NULL)
   1580 	return NULL;
   1581 
   1582       /* Parse the ref-qualifier now and then attach it
   1583 	 once we have something to attach it to.  */
   1584       rqual = d_ref_qualifier (di, NULL);
   1585     }
   1586 
   1587   *pret = d_prefix (di, 1);
   1588   if (*pret == NULL)
   1589     return NULL;
   1590 
   1591   if (rqual)
   1592     {
   1593       d_left (rqual) = ret;
   1594       ret = rqual;
   1595     }
   1596 
   1597   if (! d_check_char (di, 'E'))
   1598     return NULL;
   1599 
   1600   return ret;
   1601 }
   1602 
   1603 /* <prefix> ::= <prefix> <unqualified-name>
   1604             ::= <template-prefix> <template-args>
   1605             ::= <template-param>
   1606             ::= <decltype>
   1607             ::=
   1608             ::= <substitution>
   1609 
   1610    <template-prefix> ::= <prefix> <(template) unqualified-name>
   1611                      ::= <template-param>
   1612                      ::= <substitution>
   1613 
   1614    SUBST is true if we should add substitutions (as normal), false
   1615    if not (in an unresolved-name).  */
   1616 
   1617 static struct demangle_component *
   1618 d_prefix (struct d_info *di, int substable)
   1619 {
   1620   struct demangle_component *ret = NULL;
   1621 
   1622   for (;;)
   1623     {
   1624       char peek = d_peek_char (di);
   1625 
   1626       /* The older code accepts a <local-name> here, but I don't see
   1627 	 that in the grammar.  The older code does not accept a
   1628 	 <template-param> here.  */
   1629 
   1630       if (peek == 'D'
   1631 	  && (d_peek_next_char (di) == 'T'
   1632 	      || d_peek_next_char (di) == 't'))
   1633 	{
   1634 	  /* Decltype.  */
   1635 	  if (ret)
   1636 	    return NULL;
   1637 	  ret = cplus_demangle_type (di);
   1638 	}
   1639       else if (peek == 'I')
   1640 	{
   1641 	  if (ret == NULL)
   1642 	    return NULL;
   1643 	  struct demangle_component *dc = d_template_args (di);
   1644 	  if (!dc)
   1645 	    return NULL;
   1646 	  ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, dc);
   1647 	}
   1648       else if (peek == 'T')
   1649 	{
   1650 	  if (ret)
   1651 	    return NULL;
   1652 	  ret = d_template_param (di);
   1653 	}
   1654       else if (peek == 'M')
   1655 	{
   1656 	  /* Initializer scope for a lambda.  We already added it as a
   1657   	     substitution candidate, don't do that again.  */
   1658 	  d_advance (di, 1);
   1659 	  continue;
   1660 	}
   1661       else
   1662 	{
   1663 	  struct demangle_component *module = NULL;
   1664 	  if (peek == 'S')
   1665 	    {
   1666 	      module = d_substitution (di, 1);
   1667 	      if (!module)
   1668 		return NULL;
   1669 	      if (!(module->type == DEMANGLE_COMPONENT_MODULE_NAME
   1670 		    || module->type == DEMANGLE_COMPONENT_MODULE_PARTITION))
   1671 		{
   1672 		  if (ret)
   1673 		    return NULL;
   1674 		  ret = module;
   1675 		  continue;
   1676 		}
   1677 	    }
   1678 	  ret = d_unqualified_name (di, ret, module);
   1679 	}
   1680 
   1681       if (!ret)
   1682 	break;
   1683 
   1684       if (d_peek_char (di) == 'E')
   1685 	break;
   1686 
   1687       if (substable && !d_add_substitution (di, ret))
   1688 	return NULL;
   1689     }
   1690 
   1691   return ret;
   1692 }
   1693 
   1694 static int
   1695 d_maybe_module_name (struct d_info *di, struct demangle_component **name)
   1696 {
   1697   while (d_peek_char (di) == 'W')
   1698     {
   1699       d_advance (di, 1);
   1700       enum demangle_component_type code = DEMANGLE_COMPONENT_MODULE_NAME;
   1701       if (d_peek_char (di) == 'P')
   1702 	{
   1703 	  code = DEMANGLE_COMPONENT_MODULE_PARTITION;
   1704 	  d_advance (di, 1);
   1705 	}
   1706 
   1707       *name = d_make_comp (di, code, *name, d_source_name (di));
   1708       if (!*name)
   1709 	return 0;
   1710       if (!d_add_substitution (di, *name))
   1711 	return 0;
   1712     }
   1713   return 1;
   1714 }
   1715 
   1716 /* <unqualified-name> ::= [<module-name>] <operator-name> [<abi-tags>]
   1717                       ::= [<module-name>] <ctor-dtor-name> [<abi-tags>]
   1718                       ::= [<module-name>] <source-name> [<abi-tags>]
   1719 		      ::= [<module-name>] F <source-name> [<abi-tags>]
   1720 		      ::= [<module-name>] <local-source-name>  [<abi-tags>]
   1721                       ::= [<module-name>] DC <source-name>+ E [<abi-tags>]
   1722     <local-source-name>	::= L <source-name> <discriminator> [<abi-tags>]
   1723 */
   1724 
   1725 static struct demangle_component *
   1726 d_unqualified_name (struct d_info *di, struct demangle_component *scope,
   1727 		    struct demangle_component *module)
   1728 {
   1729   struct demangle_component *ret;
   1730   char peek;
   1731   int member_like_friend = 0;
   1732 
   1733   if (!d_maybe_module_name (di, &module))
   1734     return NULL;
   1735 
   1736   peek = d_peek_char (di);
   1737   if (peek == 'F')
   1738     {
   1739       member_like_friend = 1;
   1740       d_advance (di, 1);
   1741       peek = d_peek_char (di);
   1742     }
   1743   if (IS_DIGIT (peek))
   1744     ret = d_source_name (di);
   1745   else if (IS_LOWER (peek))
   1746     {
   1747       int was_expr = di->is_expression;
   1748       if (peek == 'o' && d_peek_next_char (di) == 'n')
   1749 	{
   1750 	  d_advance (di, 2);
   1751 	  /* Treat cv as naming a conversion operator.  */
   1752 	  di->is_expression = 0;
   1753 	}
   1754       ret = d_operator_name (di);
   1755       di->is_expression = was_expr;
   1756       if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR)
   1757 	{
   1758 	  di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2;
   1759 	  if (!strcmp (ret->u.s_operator.op->code, "li"))
   1760 	    ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret,
   1761 			       d_source_name (di));
   1762 	}
   1763     }
   1764   else if (peek == 'D' && d_peek_next_char (di) == 'C')
   1765     {
   1766       // structured binding
   1767       d_advance (di, 2);
   1768       struct demangle_component *prev = NULL;
   1769       do
   1770 	{
   1771 	  struct demangle_component *next =
   1772 	    d_make_comp (di, DEMANGLE_COMPONENT_STRUCTURED_BINDING,
   1773 			 d_source_name (di), NULL);
   1774 	  if (prev)
   1775 	    d_right (prev) = next;
   1776 	  else
   1777 	    ret = next;
   1778 	  prev = next;
   1779 	}
   1780       while (prev && d_peek_char (di) != 'E');
   1781       if (prev)
   1782 	d_advance (di, 1);
   1783       else
   1784 	ret = NULL;
   1785     }
   1786   else if (peek == 'C' || peek == 'D')
   1787     ret = d_ctor_dtor_name (di);
   1788   else if (peek == 'L')
   1789     {
   1790       d_advance (di, 1);
   1791 
   1792       ret = d_source_name (di);
   1793       if (ret == NULL)
   1794 	return NULL;
   1795       if (! d_discriminator (di))
   1796 	return NULL;
   1797     }
   1798   else if (peek == 'U')
   1799     {
   1800       switch (d_peek_next_char (di))
   1801 	{
   1802 	case 'l':
   1803 	  ret = d_lambda (di);
   1804 	  break;
   1805 	case 't':
   1806 	  ret = d_unnamed_type (di);
   1807 	  break;
   1808 	default:
   1809 	  return NULL;
   1810 	}
   1811     }
   1812   else
   1813     return NULL;
   1814 
   1815   if (module)
   1816     ret = d_make_comp (di, DEMANGLE_COMPONENT_MODULE_ENTITY, ret, module);
   1817   if (d_peek_char (di) == 'B')
   1818     ret = d_abi_tags (di, ret);
   1819   if (member_like_friend)
   1820     ret = d_make_comp (di, DEMANGLE_COMPONENT_FRIEND, ret, NULL);
   1821   if (scope)
   1822     ret = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, scope, ret);
   1823 
   1824   return ret;
   1825 }
   1826 
   1827 /* <source-name> ::= <(positive length) number> <identifier>  */
   1828 
   1829 static struct demangle_component *
   1830 d_source_name (struct d_info *di)
   1831 {
   1832   int len;
   1833   struct demangle_component *ret;
   1834 
   1835   len = d_number (di);
   1836   if (len <= 0)
   1837     return NULL;
   1838   ret = d_identifier (di, len);
   1839   di->last_name = ret;
   1840   return ret;
   1841 }
   1842 
   1843 /* number ::= [n] <(non-negative decimal integer)>  */
   1844 
   1845 static int
   1846 d_number (struct d_info *di)
   1847 {
   1848   int negative;
   1849   char peek;
   1850   int ret;
   1851 
   1852   negative = 0;
   1853   peek = d_peek_char (di);
   1854   if (peek == 'n')
   1855     {
   1856       negative = 1;
   1857       d_advance (di, 1);
   1858       peek = d_peek_char (di);
   1859     }
   1860 
   1861   ret = 0;
   1862   while (1)
   1863     {
   1864       if (! IS_DIGIT (peek))
   1865 	{
   1866 	  if (negative)
   1867 	    ret = - ret;
   1868 	  return ret;
   1869 	}
   1870       if (ret > ((INT_MAX - (peek - '0')) / 10))
   1871         return -1;
   1872       ret = ret * 10 + (peek - '0');
   1873       d_advance (di, 1);
   1874       peek = d_peek_char (di);
   1875     }
   1876 }
   1877 
   1878 /* Like d_number, but returns a demangle_component.  */
   1879 
   1880 static struct demangle_component *
   1881 d_number_component (struct d_info *di)
   1882 {
   1883   struct demangle_component *ret = d_make_empty (di);
   1884   if (ret)
   1885     {
   1886       ret->type = DEMANGLE_COMPONENT_NUMBER;
   1887       ret->u.s_number.number = d_number (di);
   1888     }
   1889   return ret;
   1890 }
   1891 
   1892 /* identifier ::= <(unqualified source code identifier)>  */
   1893 
   1894 static struct demangle_component *
   1895 d_identifier (struct d_info *di, int len)
   1896 {
   1897   const char *name;
   1898 
   1899   name = d_str (di);
   1900 
   1901   if (di->send - name < len)
   1902     return NULL;
   1903 
   1904   d_advance (di, len);
   1905 
   1906   /* A Java mangled name may have a trailing '$' if it is a C++
   1907      keyword.  This '$' is not included in the length count.  We just
   1908      ignore the '$'.  */
   1909   if ((di->options & DMGL_JAVA) != 0
   1910       && d_peek_char (di) == '$')
   1911     d_advance (di, 1);
   1912 
   1913   /* Look for something which looks like a gcc encoding of an
   1914      anonymous namespace, and replace it with a more user friendly
   1915      name.  */
   1916   if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
   1917       && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
   1918 		 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
   1919     {
   1920       const char *s;
   1921 
   1922       s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN;
   1923       if ((*s == '.' || *s == '_' || *s == '$')
   1924 	  && s[1] == 'N')
   1925 	{
   1926 	  di->expansion -= len - sizeof "(anonymous namespace)";
   1927 	  return d_make_name (di, "(anonymous namespace)",
   1928 			      sizeof "(anonymous namespace)" - 1);
   1929 	}
   1930     }
   1931 
   1932   return d_make_name (di, name, len);
   1933 }
   1934 
   1935 /* operator_name ::= many different two character encodings.
   1936                  ::= cv <type>
   1937                  ::= v <digit> <source-name>
   1938 
   1939    This list is sorted for binary search.  */
   1940 
   1941 #define NL(s) s, (sizeof s) - 1
   1942 
   1943 CP_STATIC_IF_GLIBCPP_V3
   1944 const struct demangle_operator_info cplus_demangle_operators[] =
   1945 {
   1946   { "aN", NL ("&="),        2 },
   1947   { "aS", NL ("="),         2 },
   1948   { "aa", NL ("&&"),        2 },
   1949   { "ad", NL ("&"),         1 },
   1950   { "an", NL ("&"),         2 },
   1951   { "at", NL ("alignof "),   1 },
   1952   { "aw", NL ("co_await "), 1 },
   1953   { "az", NL ("alignof "),   1 },
   1954   { "cc", NL ("const_cast"), 2 },
   1955   { "cl", NL ("()"),        2 },
   1956   { "cm", NL (","),         2 },
   1957   { "co", NL ("~"),         1 },
   1958   { "dV", NL ("/="),        2 },
   1959   { "dX", NL ("[...]="),     3 }, /* [expr...expr] = expr */
   1960   { "da", NL ("delete[] "), 1 },
   1961   { "dc", NL ("dynamic_cast"), 2 },
   1962   { "de", NL ("*"),         1 },
   1963   { "di", NL ("="),         2 }, /* .name = expr */
   1964   { "dl", NL ("delete "),   1 },
   1965   { "ds", NL (".*"),        2 },
   1966   { "dt", NL ("."),         2 },
   1967   { "dv", NL ("/"),         2 },
   1968   { "dx", NL ("]="),        2 }, /* [expr] = expr */
   1969   { "eO", NL ("^="),        2 },
   1970   { "eo", NL ("^"),         2 },
   1971   { "eq", NL ("=="),        2 },
   1972   { "fL", NL ("..."),       3 },
   1973   { "fR", NL ("..."),       3 },
   1974   { "fl", NL ("..."),       2 },
   1975   { "fr", NL ("..."),       2 },
   1976   { "ge", NL (">="),        2 },
   1977   { "gs", NL ("::"),	    1 },
   1978   { "gt", NL (">"),         2 },
   1979   { "ix", NL ("[]"),        2 },
   1980   { "lS", NL ("<<="),       2 },
   1981   { "le", NL ("<="),        2 },
   1982   { "li", NL ("operator\"\" "), 1 },
   1983   { "ls", NL ("<<"),        2 },
   1984   { "lt", NL ("<"),         2 },
   1985   { "mI", NL ("-="),        2 },
   1986   { "mL", NL ("*="),        2 },
   1987   { "mi", NL ("-"),         2 },
   1988   { "ml", NL ("*"),         2 },
   1989   { "mm", NL ("--"),        1 },
   1990   { "na", NL ("new[]"),     3 },
   1991   { "ne", NL ("!="),        2 },
   1992   { "ng", NL ("-"),         1 },
   1993   { "nt", NL ("!"),         1 },
   1994   { "nw", NL ("new"),       3 },
   1995   { "nx", NL ("noexcept"),  1 },
   1996   { "oR", NL ("|="),        2 },
   1997   { "oo", NL ("||"),        2 },
   1998   { "or", NL ("|"),         2 },
   1999   { "pL", NL ("+="),        2 },
   2000   { "pl", NL ("+"),         2 },
   2001   { "pm", NL ("->*"),       2 },
   2002   { "pp", NL ("++"),        1 },
   2003   { "ps", NL ("+"),         1 },
   2004   { "pt", NL ("->"),        2 },
   2005   { "qu", NL ("?"),         3 },
   2006   { "rM", NL ("%="),        2 },
   2007   { "rS", NL (">>="),       2 },
   2008   { "rc", NL ("reinterpret_cast"), 2 },
   2009   { "rm", NL ("%"),         2 },
   2010   { "rs", NL (">>"),        2 },
   2011   { "sP", NL ("sizeof..."), 1 },
   2012   { "sZ", NL ("sizeof..."), 1 },
   2013   { "sc", NL ("static_cast"), 2 },
   2014   { "ss", NL ("<=>"),       2 },
   2015   { "st", NL ("sizeof "),   1 },
   2016   { "sz", NL ("sizeof "),   1 },
   2017   { "tr", NL ("throw"),     0 },
   2018   { "tw", NL ("throw "),    1 },
   2019   { NULL, NULL, 0,          0 }
   2020 };
   2021 
   2022 static struct demangle_component *
   2023 d_operator_name (struct d_info *di)
   2024 {
   2025   char c1;
   2026   char c2;
   2027 
   2028   c1 = d_next_char (di);
   2029   c2 = d_next_char (di);
   2030   if (c1 == 'v' && IS_DIGIT (c2))
   2031     return d_make_extended_operator (di, c2 - '0', d_source_name (di));
   2032   else if (c1 == 'c' && c2 == 'v')
   2033     {
   2034       struct demangle_component *type;
   2035       int was_conversion = di->is_conversion;
   2036       struct demangle_component *res;
   2037 
   2038       di->is_conversion = ! di->is_expression;
   2039       type = cplus_demangle_type (di);
   2040       if (di->is_conversion)
   2041 	res = d_make_comp (di, DEMANGLE_COMPONENT_CONVERSION, type, NULL);
   2042       else
   2043 	res = d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
   2044       di->is_conversion = was_conversion;
   2045       return res;
   2046     }
   2047   else
   2048     {
   2049       /* LOW is the inclusive lower bound.  */
   2050       int low = 0;
   2051       /* HIGH is the exclusive upper bound.  We subtract one to ignore
   2052 	 the sentinel at the end of the array.  */
   2053       int high = ((sizeof (cplus_demangle_operators)
   2054 		   / sizeof (cplus_demangle_operators[0]))
   2055 		  - 1);
   2056 
   2057       while (1)
   2058 	{
   2059 	  int i;
   2060 	  const struct demangle_operator_info *p;
   2061 
   2062 	  i = low + (high - low) / 2;
   2063 	  p = cplus_demangle_operators + i;
   2064 
   2065 	  if (c1 == p->code[0] && c2 == p->code[1])
   2066 	    return d_make_operator (di, p);
   2067 
   2068 	  if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1]))
   2069 	    high = i;
   2070 	  else
   2071 	    low = i + 1;
   2072 	  if (low == high)
   2073 	    return NULL;
   2074 	}
   2075     }
   2076 }
   2077 
   2078 static struct demangle_component *
   2079 d_make_character (struct d_info *di, int c)
   2080 {
   2081   struct demangle_component *p;
   2082   p = d_make_empty (di);
   2083   if (p != NULL)
   2084     {
   2085       p->type = DEMANGLE_COMPONENT_CHARACTER;
   2086       p->u.s_character.character = c;
   2087     }
   2088   return p;
   2089 }
   2090 
   2091 static struct demangle_component *
   2092 d_java_resource (struct d_info *di)
   2093 {
   2094   struct demangle_component *p = NULL;
   2095   struct demangle_component *next = NULL;
   2096   int len, i;
   2097   char c;
   2098   const char *str;
   2099 
   2100   len = d_number (di);
   2101   if (len <= 1)
   2102     return NULL;
   2103 
   2104   /* Eat the leading '_'.  */
   2105   if (d_next_char (di) != '_')
   2106     return NULL;
   2107   len--;
   2108 
   2109   str = d_str (di);
   2110   i = 0;
   2111 
   2112   while (len > 0)
   2113     {
   2114       c = str[i];
   2115       if (!c)
   2116 	return NULL;
   2117 
   2118       /* Each chunk is either a '$' escape...  */
   2119       if (c == '$')
   2120 	{
   2121 	  i++;
   2122 	  switch (str[i++])
   2123 	    {
   2124 	    case 'S':
   2125 	      c = '/';
   2126 	      break;
   2127 	    case '_':
   2128 	      c = '.';
   2129 	      break;
   2130 	    case '$':
   2131 	      c = '$';
   2132 	      break;
   2133 	    default:
   2134 	      return NULL;
   2135 	    }
   2136 	  next = d_make_character (di, c);
   2137 	  d_advance (di, i);
   2138 	  str = d_str (di);
   2139 	  len -= i;
   2140 	  i = 0;
   2141 	  if (next == NULL)
   2142 	    return NULL;
   2143 	}
   2144       /* ... or a sequence of characters.  */
   2145       else
   2146 	{
   2147 	  while (i < len && str[i] && str[i] != '$')
   2148 	    i++;
   2149 
   2150 	  next = d_make_name (di, str, i);
   2151 	  d_advance (di, i);
   2152 	  str = d_str (di);
   2153 	  len -= i;
   2154 	  i = 0;
   2155 	  if (next == NULL)
   2156 	    return NULL;
   2157 	}
   2158 
   2159       if (p == NULL)
   2160 	p = next;
   2161       else
   2162 	{
   2163 	  p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next);
   2164 	  if (p == NULL)
   2165 	    return NULL;
   2166 	}
   2167     }
   2168 
   2169   p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL);
   2170 
   2171   return p;
   2172 }
   2173 
   2174 /* <special-name> ::= TV <type>
   2175                   ::= TT <type>
   2176                   ::= TI <type>
   2177                   ::= TS <type>
   2178 		  ::= TA <template-arg>
   2179                   ::= GV <(object) name>
   2180                   ::= T <call-offset> <(base) encoding>
   2181                   ::= Tc <call-offset> <call-offset> <(base) encoding>
   2182    Also g++ extensions:
   2183                   ::= TC <type> <(offset) number> _ <(base) type>
   2184                   ::= TF <type>
   2185                   ::= TJ <type>
   2186                   ::= GR <name>
   2187 		  ::= GA <encoding>
   2188 		  ::= Gr <resource name>
   2189 		  ::= GTt <encoding>
   2190 		  ::= GTn <encoding>
   2191 */
   2192 
   2193 static struct demangle_component *
   2194 d_special_name (struct d_info *di)
   2195 {
   2196   di->expansion += 20;
   2197   if (d_check_char (di, 'T'))
   2198     {
   2199       switch (d_next_char (di))
   2200 	{
   2201 	case 'V':
   2202 	  di->expansion -= 5;
   2203 	  return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE,
   2204 			      cplus_demangle_type (di), NULL);
   2205 	case 'T':
   2206 	  di->expansion -= 10;
   2207 	  return d_make_comp (di, DEMANGLE_COMPONENT_VTT,
   2208 			      cplus_demangle_type (di), NULL);
   2209 	case 'I':
   2210 	  return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO,
   2211 			      cplus_demangle_type (di), NULL);
   2212 	case 'S':
   2213 	  return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME,
   2214 			      cplus_demangle_type (di), NULL);
   2215 
   2216 	case 'h':
   2217 	  if (! d_call_offset (di, 'h'))
   2218 	    return NULL;
   2219 	  return d_make_comp (di, DEMANGLE_COMPONENT_THUNK,
   2220 			      d_encoding (di, 0), NULL);
   2221 
   2222 	case 'v':
   2223 	  if (! d_call_offset (di, 'v'))
   2224 	    return NULL;
   2225 	  return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK,
   2226 			      d_encoding (di, 0), NULL);
   2227 
   2228 	case 'c':
   2229 	  if (! d_call_offset (di, '\0'))
   2230 	    return NULL;
   2231 	  if (! d_call_offset (di, '\0'))
   2232 	    return NULL;
   2233 	  return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK,
   2234 			      d_encoding (di, 0), NULL);
   2235 
   2236 	case 'C':
   2237 	  {
   2238 	    struct demangle_component *derived_type;
   2239 	    int offset;
   2240 	    struct demangle_component *base_type;
   2241 
   2242 	    derived_type = cplus_demangle_type (di);
   2243 	    offset = d_number (di);
   2244 	    if (offset < 0)
   2245 	      return NULL;
   2246 	    if (! d_check_char (di, '_'))
   2247 	      return NULL;
   2248 	    base_type = cplus_demangle_type (di);
   2249 	    /* We don't display the offset.  FIXME: We should display
   2250 	       it in verbose mode.  */
   2251 	    di->expansion += 5;
   2252 	    return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE,
   2253 				base_type, derived_type);
   2254 	  }
   2255 
   2256 	case 'F':
   2257 	  return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN,
   2258 			      cplus_demangle_type (di), NULL);
   2259 	case 'J':
   2260 	  return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS,
   2261 			      cplus_demangle_type (di), NULL);
   2262 
   2263 	case 'H':
   2264 	  return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT,
   2265 			      d_name (di, 0), NULL);
   2266 
   2267 	case 'W':
   2268 	  return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER,
   2269 			      d_name (di, 0), NULL);
   2270 
   2271 	case 'A':
   2272 	  return d_make_comp (di, DEMANGLE_COMPONENT_TPARM_OBJ,
   2273 			      d_template_arg (di), NULL);
   2274 
   2275 	default:
   2276 	  return NULL;
   2277 	}
   2278     }
   2279   else if (d_check_char (di, 'G'))
   2280     {
   2281       switch (d_next_char (di))
   2282 	{
   2283 	case 'V':
   2284 	  return d_make_comp (di, DEMANGLE_COMPONENT_GUARD,
   2285 			      d_name (di, 0), NULL);
   2286 
   2287 	case 'R':
   2288 	  {
   2289 	    struct demangle_component *name = d_name (di, 0);
   2290 	    return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name,
   2291 				d_number_component (di));
   2292 	  }
   2293 
   2294 	case 'A':
   2295 	  return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
   2296 			      d_encoding (di, 0), NULL);
   2297 
   2298 	case 'I':
   2299 	  {
   2300 	    struct demangle_component *module = NULL;
   2301 	    if (!d_maybe_module_name (di, &module) || !module)
   2302 	      return NULL;
   2303 	    return d_make_comp (di, DEMANGLE_COMPONENT_MODULE_INIT,
   2304 				module, NULL);
   2305 	  }
   2306 	case 'T':
   2307 	  switch (d_next_char (di))
   2308 	    {
   2309 	    case 'n':
   2310 	      return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE,
   2311 				  d_encoding (di, 0), NULL);
   2312 	    default:
   2313 	      /* ??? The proposal is that other letters (such as 'h') stand
   2314 		 for different variants of transaction cloning, such as
   2315 		 compiling directly for hardware transaction support.  But
   2316 		 they still should all be transactional clones of some sort
   2317 		 so go ahead and call them that.  */
   2318 	    case 't':
   2319 	      return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE,
   2320 				  d_encoding (di, 0), NULL);
   2321 	    }
   2322 
   2323 	case 'r':
   2324 	  return d_java_resource (di);
   2325 
   2326 	default:
   2327 	  return NULL;
   2328 	}
   2329     }
   2330   else
   2331     return NULL;
   2332 }
   2333 
   2334 /* <call-offset> ::= h <nv-offset> _
   2335                  ::= v <v-offset> _
   2336 
   2337    <nv-offset> ::= <(offset) number>
   2338 
   2339    <v-offset> ::= <(offset) number> _ <(virtual offset) number>
   2340 
   2341    The C parameter, if not '\0', is a character we just read which is
   2342    the start of the <call-offset>.
   2343 
   2344    We don't display the offset information anywhere.  FIXME: We should
   2345    display it in verbose mode.  */
   2346 
   2347 static int
   2348 d_call_offset (struct d_info *di, int c)
   2349 {
   2350   if (c == '\0')
   2351     c = d_next_char (di);
   2352 
   2353   if (c == 'h')
   2354     d_number (di);
   2355   else if (c == 'v')
   2356     {
   2357       d_number (di);
   2358       if (! d_check_char (di, '_'))
   2359 	return 0;
   2360       d_number (di);
   2361     }
   2362   else
   2363     return 0;
   2364 
   2365   if (! d_check_char (di, '_'))
   2366     return 0;
   2367 
   2368   return 1;
   2369 }
   2370 
   2371 /* <ctor-dtor-name> ::= C1
   2372                     ::= C2
   2373                     ::= C3
   2374                     ::= D0
   2375                     ::= D1
   2376                     ::= D2
   2377 */
   2378 
   2379 static struct demangle_component *
   2380 d_ctor_dtor_name (struct d_info *di)
   2381 {
   2382   if (di->last_name != NULL)
   2383     {
   2384       if (di->last_name->type == DEMANGLE_COMPONENT_NAME)
   2385 	di->expansion += di->last_name->u.s_name.len;
   2386       else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD)
   2387 	di->expansion += di->last_name->u.s_string.len;
   2388     }
   2389   switch (d_peek_char (di))
   2390     {
   2391     case 'C':
   2392       {
   2393 	enum gnu_v3_ctor_kinds kind;
   2394 	int inheriting = 0;
   2395 
   2396 	if (d_peek_next_char (di) == 'I')
   2397 	  {
   2398 	    inheriting = 1;
   2399 	    d_advance (di, 1);
   2400 	  }
   2401 
   2402 	switch (d_peek_next_char (di))
   2403 	  {
   2404 	  case '1':
   2405 	    kind = gnu_v3_complete_object_ctor;
   2406 	    break;
   2407 	  case '2':
   2408 	    kind = gnu_v3_base_object_ctor;
   2409 	    break;
   2410 	  case '3':
   2411 	    kind = gnu_v3_complete_object_allocating_ctor;
   2412 	    break;
   2413           case '4':
   2414 	    kind = gnu_v3_unified_ctor;
   2415 	    break;
   2416 	  case '5':
   2417 	    kind = gnu_v3_object_ctor_group;
   2418 	    break;
   2419 	  default:
   2420 	    return NULL;
   2421 	  }
   2422 
   2423 	d_advance (di, 2);
   2424 
   2425 	if (inheriting)
   2426 	  cplus_demangle_type (di);
   2427 
   2428 	return d_make_ctor (di, kind, di->last_name);
   2429       }
   2430 
   2431     case 'D':
   2432       {
   2433 	enum gnu_v3_dtor_kinds kind;
   2434 
   2435 	switch (d_peek_next_char (di))
   2436 	  {
   2437 	  case '0':
   2438 	    kind = gnu_v3_deleting_dtor;
   2439 	    break;
   2440 	  case '1':
   2441 	    kind = gnu_v3_complete_object_dtor;
   2442 	    break;
   2443 	  case '2':
   2444 	    kind = gnu_v3_base_object_dtor;
   2445 	    break;
   2446           /*  digit '3' is not used */
   2447 	  case '4':
   2448 	    kind = gnu_v3_unified_dtor;
   2449 	    break;
   2450 	  case '5':
   2451 	    kind = gnu_v3_object_dtor_group;
   2452 	    break;
   2453 	  default:
   2454 	    return NULL;
   2455 	  }
   2456 	d_advance (di, 2);
   2457 	return d_make_dtor (di, kind, di->last_name);
   2458       }
   2459 
   2460     default:
   2461       return NULL;
   2462     }
   2463 }
   2464 
   2465 /* True iff we're looking at an order-insensitive type-qualifier, including
   2466    function-type-qualifiers.  */
   2467 
   2468 static int
   2469 next_is_type_qual (struct d_info *di)
   2470 {
   2471   char peek = d_peek_char (di);
   2472   if (peek == 'r' || peek == 'V' || peek == 'K')
   2473     return 1;
   2474   if (peek == 'D')
   2475     {
   2476       peek = d_peek_next_char (di);
   2477       if (peek == 'x' || peek == 'o' || peek == 'O' || peek == 'w')
   2478 	return 1;
   2479     }
   2480   return 0;
   2481 }
   2482 
   2483 /* <type> ::= <builtin-type>
   2484           ::= <function-type>
   2485           ::= <class-enum-type>
   2486           ::= <array-type>
   2487           ::= <pointer-to-member-type>
   2488           ::= <template-param>
   2489           ::= <template-template-param> <template-args>
   2490           ::= <substitution>
   2491           ::= <CV-qualifiers> <type>
   2492           ::= P <type>
   2493           ::= R <type>
   2494           ::= O <type> (C++0x)
   2495           ::= C <type>
   2496           ::= G <type>
   2497           ::= U <source-name> <type>
   2498 
   2499    <builtin-type> ::= various one letter codes
   2500                   ::= u <source-name>
   2501 */
   2502 
   2503 CP_STATIC_IF_GLIBCPP_V3
   2504 const struct demangle_builtin_type_info
   2505 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] =
   2506 {
   2507   /* a */ { NL ("signed char"),	NL ("signed char"),	D_PRINT_DEFAULT },
   2508   /* b */ { NL ("bool"),	NL ("boolean"),		D_PRINT_BOOL },
   2509   /* c */ { NL ("char"),	NL ("byte"),		D_PRINT_DEFAULT },
   2510   /* d */ { NL ("double"),	NL ("double"),		D_PRINT_FLOAT },
   2511   /* e */ { NL ("long double"),	NL ("long double"),	D_PRINT_FLOAT },
   2512   /* f */ { NL ("float"),	NL ("float"),		D_PRINT_FLOAT },
   2513   /* g */ { NL ("__float128"),	NL ("__float128"),	D_PRINT_FLOAT },
   2514   /* h */ { NL ("unsigned char"), NL ("unsigned char"),	D_PRINT_DEFAULT },
   2515   /* i */ { NL ("int"),		NL ("int"),		D_PRINT_INT },
   2516   /* j */ { NL ("unsigned int"), NL ("unsigned"),	D_PRINT_UNSIGNED },
   2517   /* k */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
   2518   /* l */ { NL ("long"),	NL ("long"),		D_PRINT_LONG },
   2519   /* m */ { NL ("unsigned long"), NL ("unsigned long"),	D_PRINT_UNSIGNED_LONG },
   2520   /* n */ { NL ("__int128"),	NL ("__int128"),	D_PRINT_DEFAULT },
   2521   /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
   2522 	    D_PRINT_DEFAULT },
   2523   /* p */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
   2524   /* q */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
   2525   /* r */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
   2526   /* s */ { NL ("short"),	NL ("short"),		D_PRINT_DEFAULT },
   2527   /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
   2528   /* u */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
   2529   /* v */ { NL ("void"),	NL ("void"),		D_PRINT_VOID },
   2530   /* w */ { NL ("wchar_t"),	NL ("char"),		D_PRINT_DEFAULT },
   2531   /* x */ { NL ("long long"),	NL ("long"),		D_PRINT_LONG_LONG },
   2532   /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
   2533 	    D_PRINT_UNSIGNED_LONG_LONG },
   2534   /* z */ { NL ("..."),		NL ("..."),		D_PRINT_DEFAULT },
   2535   /* 26 */ { NL ("decimal32"),	NL ("decimal32"),	D_PRINT_DEFAULT },
   2536   /* 27 */ { NL ("decimal64"),	NL ("decimal64"),	D_PRINT_DEFAULT },
   2537   /* 28 */ { NL ("decimal128"),	NL ("decimal128"),	D_PRINT_DEFAULT },
   2538   /* 29 */ { NL ("half"),	NL ("half"),		D_PRINT_FLOAT },
   2539   /* 30 */ { NL ("char8_t"),	NL ("char8_t"),		D_PRINT_DEFAULT },
   2540   /* 31 */ { NL ("char16_t"),	NL ("char16_t"),	D_PRINT_DEFAULT },
   2541   /* 32 */ { NL ("char32_t"),	NL ("char32_t"),	D_PRINT_DEFAULT },
   2542   /* 33 */ { NL ("decltype(nullptr)"),	NL ("decltype(nullptr)"),
   2543 	     D_PRINT_DEFAULT },
   2544   /* 34 */ { NL ("_Float"),	NL ("_Float"),		D_PRINT_FLOAT },
   2545   /* 35 */ { NL ("std::bfloat16_t"), NL ("std::bfloat16_t"), D_PRINT_FLOAT },
   2546 };
   2547 
   2548 CP_STATIC_IF_GLIBCPP_V3
   2549 struct demangle_component *
   2550 cplus_demangle_type (struct d_info *di)
   2551 {
   2552   char peek;
   2553   struct demangle_component *ret;
   2554   int can_subst;
   2555 
   2556   /* The ABI specifies that when CV-qualifiers are used, the base type
   2557      is substitutable, and the fully qualified type is substitutable,
   2558      but the base type with a strict subset of the CV-qualifiers is
   2559      not substitutable.  The natural recursive implementation of the
   2560      CV-qualifiers would cause subsets to be substitutable, so instead
   2561      we pull them all off now.
   2562 
   2563      FIXME: The ABI says that order-insensitive vendor qualifiers
   2564      should be handled in the same way, but we have no way to tell
   2565      which vendor qualifiers are order-insensitive and which are
   2566      order-sensitive.  So we just assume that they are all
   2567      order-sensitive.  g++ 3.4 supports only one vendor qualifier,
   2568      __vector, and it treats it as order-sensitive when mangling
   2569      names.  */
   2570 
   2571   if (next_is_type_qual (di))
   2572     {
   2573       struct demangle_component **pret;
   2574 
   2575       pret = d_cv_qualifiers (di, &ret, 0);
   2576       if (pret == NULL)
   2577 	return NULL;
   2578       if (d_peek_char (di) == 'F')
   2579 	{
   2580 	  /* cv-qualifiers before a function type apply to 'this',
   2581 	     so avoid adding the unqualified function type to
   2582 	     the substitution list.  */
   2583 	  *pret = d_function_type (di);
   2584 	}
   2585       else
   2586 	*pret = cplus_demangle_type (di);
   2587       if (!*pret)
   2588 	return NULL;
   2589       if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
   2590 	  || (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS)
   2591 	{
   2592 	  /* Move the ref-qualifier outside the cv-qualifiers so that
   2593 	     they are printed in the right order.  */
   2594 	  struct demangle_component *fn = d_left (*pret);
   2595 	  d_left (*pret) = ret;
   2596 	  ret = *pret;
   2597 	  *pret = fn;
   2598 	}
   2599       if (! d_add_substitution (di, ret))
   2600 	return NULL;
   2601       return ret;
   2602     }
   2603 
   2604   can_subst = 1;
   2605 
   2606   peek = d_peek_char (di);
   2607   switch (peek)
   2608     {
   2609     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
   2610     case 'h': case 'i': case 'j':           case 'l': case 'm': case 'n':
   2611     case 'o':                               case 's': case 't':
   2612     case 'v': case 'w': case 'x': case 'y': case 'z':
   2613       ret = d_make_builtin_type (di,
   2614 				 &cplus_demangle_builtin_types[peek - 'a']);
   2615       di->expansion += ret->u.s_builtin.type->len;
   2616       can_subst = 0;
   2617       d_advance (di, 1);
   2618       break;
   2619 
   2620     case 'u':
   2621       d_advance (di, 1);
   2622       ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE,
   2623 			 d_source_name (di), NULL);
   2624       break;
   2625 
   2626     case 'F':
   2627       ret = d_function_type (di);
   2628       break;
   2629 
   2630     case 'A':
   2631       ret = d_array_type (di);
   2632       break;
   2633 
   2634     case 'M':
   2635       ret = d_pointer_to_member_type (di);
   2636       break;
   2637 
   2638     case 'T':
   2639       ret = d_template_param (di);
   2640       if (d_peek_char (di) == 'I')
   2641 	{
   2642 	  /* This may be <template-template-param> <template-args>.
   2643 	     If this is the type for a conversion operator, we can
   2644 	     have a <template-template-param> here only by following
   2645 	     a derivation like this:
   2646 
   2647 	     <nested-name>
   2648 	     -> <template-prefix> <template-args>
   2649 	     -> <prefix> <template-unqualified-name> <template-args>
   2650 	     -> <unqualified-name> <template-unqualified-name> <template-args>
   2651 	     -> <source-name> <template-unqualified-name> <template-args>
   2652 	     -> <source-name> <operator-name> <template-args>
   2653 	     -> <source-name> cv <type> <template-args>
   2654 	     -> <source-name> cv <template-template-param> <template-args> <template-args>
   2655 
   2656 	     where the <template-args> is followed by another.
   2657 	     Otherwise, we must have a derivation like this:
   2658 
   2659 	     <nested-name>
   2660 	     -> <template-prefix> <template-args>
   2661 	     -> <prefix> <template-unqualified-name> <template-args>
   2662 	     -> <unqualified-name> <template-unqualified-name> <template-args>
   2663 	     -> <source-name> <template-unqualified-name> <template-args>
   2664 	     -> <source-name> <operator-name> <template-args>
   2665 	     -> <source-name> cv <type> <template-args>
   2666 	     -> <source-name> cv <template-param> <template-args>
   2667 
   2668 	     where we need to leave the <template-args> to be processed
   2669 	     by d_prefix (following the <template-prefix>).
   2670 
   2671 	     The <template-template-param> part is a substitution
   2672 	     candidate.  */
   2673 	  if (! di->is_conversion)
   2674 	    {
   2675 	      if (! d_add_substitution (di, ret))
   2676 		return NULL;
   2677 	      ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
   2678 				 d_template_args (di));
   2679 	    }
   2680 	  else
   2681 	    {
   2682 	      struct demangle_component *args;
   2683 	      struct d_info_checkpoint checkpoint;
   2684 
   2685 	      d_checkpoint (di, &checkpoint);
   2686 	      args = d_template_args (di);
   2687 	      if (d_peek_char (di) == 'I')
   2688 		{
   2689 		  if (! d_add_substitution (di, ret))
   2690 		    return NULL;
   2691 		  ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
   2692 				     args);
   2693 		}
   2694 	      else
   2695 		d_backtrack (di, &checkpoint);
   2696 	    }
   2697 	}
   2698       break;
   2699 
   2700     case 'O':
   2701       d_advance (di, 1);
   2702       ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE,
   2703                          cplus_demangle_type (di), NULL);
   2704       break;
   2705 
   2706     case 'P':
   2707       d_advance (di, 1);
   2708       ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER,
   2709 			 cplus_demangle_type (di), NULL);
   2710       break;
   2711 
   2712     case 'R':
   2713       d_advance (di, 1);
   2714       ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE,
   2715                          cplus_demangle_type (di), NULL);
   2716       break;
   2717 
   2718     case 'C':
   2719       d_advance (di, 1);
   2720       ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX,
   2721 			 cplus_demangle_type (di), NULL);
   2722       break;
   2723 
   2724     case 'G':
   2725       d_advance (di, 1);
   2726       ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY,
   2727 			 cplus_demangle_type (di), NULL);
   2728       break;
   2729 
   2730     case 'U':
   2731       d_advance (di, 1);
   2732       ret = d_source_name (di);
   2733       if (d_peek_char (di) == 'I')
   2734 	ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret,
   2735 			   d_template_args (di));
   2736       ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL,
   2737 			 cplus_demangle_type (di), ret);
   2738       break;
   2739 
   2740     case 'D':
   2741       can_subst = 0;
   2742       d_advance (di, 1);
   2743       peek = d_next_char (di);
   2744       switch (peek)
   2745 	{
   2746 	case 'T':
   2747 	case 't':
   2748 	  /* decltype (expression) */
   2749 	  ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
   2750 			     d_expression (di), NULL);
   2751 	  if (ret && d_next_char (di) != 'E')
   2752 	    ret = NULL;
   2753 	  can_subst = 1;
   2754 	  break;
   2755 
   2756 	case 'p':
   2757 	  /* Pack expansion.  */
   2758 	  ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
   2759 			     cplus_demangle_type (di), NULL);
   2760 	  can_subst = 1;
   2761 	  break;
   2762 
   2763 	case 'a':
   2764 	  /* auto */
   2765 	  ret = d_make_name (di, "auto", 4);
   2766 	  break;
   2767 	case 'c':
   2768 	  /* decltype(auto) */
   2769 	  ret = d_make_name (di, "decltype(auto)", 14);
   2770 	  break;
   2771 
   2772 	case 'f':
   2773 	  /* 32-bit decimal floating point */
   2774 	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]);
   2775 	  di->expansion += ret->u.s_builtin.type->len;
   2776 	  break;
   2777 	case 'd':
   2778 	  /* 64-bit DFP */
   2779 	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]);
   2780 	  di->expansion += ret->u.s_builtin.type->len;
   2781 	  break;
   2782 	case 'e':
   2783 	  /* 128-bit DFP */
   2784 	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]);
   2785 	  di->expansion += ret->u.s_builtin.type->len;
   2786 	  break;
   2787 	case 'h':
   2788 	  /* 16-bit half-precision FP */
   2789 	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]);
   2790 	  di->expansion += ret->u.s_builtin.type->len;
   2791 	  break;
   2792 	case 'u':
   2793 	  /* char8_t */
   2794 	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
   2795 	  di->expansion += ret->u.s_builtin.type->len;
   2796 	  break;
   2797 	case 's':
   2798 	  /* char16_t */
   2799 	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
   2800 	  di->expansion += ret->u.s_builtin.type->len;
   2801 	  break;
   2802 	case 'i':
   2803 	  /* char32_t */
   2804 	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]);
   2805 	  di->expansion += ret->u.s_builtin.type->len;
   2806 	  break;
   2807 
   2808 	case 'F':
   2809 	  /* DF<number>_ - _Float<number>.
   2810 	     DF<number>x - _Float<number>x
   2811 	     DF16b - std::bfloat16_t.  */
   2812 	  {
   2813 	    int arg = d_number (di);
   2814 	    char buf[12];
   2815 	    char suffix = 0;
   2816 	    if (d_peek_char (di) == 'b')
   2817 	      {
   2818 		if (arg != 16)
   2819 		  return NULL;
   2820 		d_advance (di, 1);
   2821 		ret = d_make_builtin_type (di,
   2822 					   &cplus_demangle_builtin_types[35]);
   2823 		di->expansion += ret->u.s_builtin.type->len;
   2824 		break;
   2825 	      }
   2826 	    if (d_peek_char (di) == 'x')
   2827 	      suffix = 'x';
   2828 	    if (!suffix && d_peek_char (di) != '_')
   2829 	      return NULL;
   2830 	    ret
   2831 	      = d_make_extended_builtin_type (di,
   2832 					      &cplus_demangle_builtin_types[34],
   2833 					      arg, suffix);
   2834 	    d_advance (di, 1);
   2835 	    sprintf (buf, "%d", arg);
   2836 	    di->expansion += ret->u.s_extended_builtin.type->len
   2837 			     + strlen (buf) + (suffix != 0);
   2838 	    break;
   2839 	  }
   2840 
   2841 	case 'v':
   2842 	  ret = d_vector_type (di);
   2843 	  can_subst = 1;
   2844 	  break;
   2845 
   2846         case 'n':
   2847           /* decltype(nullptr) */
   2848 	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[33]);
   2849 	  di->expansion += ret->u.s_builtin.type->len;
   2850 	  break;
   2851 
   2852 	default:
   2853 	  return NULL;
   2854 	}
   2855       break;
   2856 
   2857     default:
   2858       return d_class_enum_type (di, 1);
   2859     }
   2860 
   2861   if (can_subst)
   2862     {
   2863       if (! d_add_substitution (di, ret))
   2864 	return NULL;
   2865     }
   2866 
   2867   return ret;
   2868 }
   2869 
   2870 /* <CV-qualifiers> ::= [r] [V] [K] [Dx] */
   2871 
   2872 static struct demangle_component **
   2873 d_cv_qualifiers (struct d_info *di,
   2874                  struct demangle_component **pret, int member_fn)
   2875 {
   2876   struct demangle_component **pstart;
   2877   char peek;
   2878 
   2879   pstart = pret;
   2880   peek = d_peek_char (di);
   2881   while (next_is_type_qual (di))
   2882     {
   2883       enum demangle_component_type t;
   2884       struct demangle_component *right = NULL;
   2885 
   2886       d_advance (di, 1);
   2887       if (peek == 'r')
   2888 	{
   2889 	  t = (member_fn
   2890 	       ? DEMANGLE_COMPONENT_RESTRICT_THIS
   2891 	       : DEMANGLE_COMPONENT_RESTRICT);
   2892 	  di->expansion += sizeof "restrict";
   2893 	}
   2894       else if (peek == 'V')
   2895 	{
   2896 	  t = (member_fn
   2897 	       ? DEMANGLE_COMPONENT_VOLATILE_THIS
   2898 	       : DEMANGLE_COMPONENT_VOLATILE);
   2899 	  di->expansion += sizeof "volatile";
   2900 	}
   2901       else if (peek == 'K')
   2902 	{
   2903 	  t = (member_fn
   2904 	       ? DEMANGLE_COMPONENT_CONST_THIS
   2905 	       : DEMANGLE_COMPONENT_CONST);
   2906 	  di->expansion += sizeof "const";
   2907 	}
   2908       else
   2909 	{
   2910 	  peek = d_next_char (di);
   2911 	  if (peek == 'x')
   2912 	    {
   2913 	      t = DEMANGLE_COMPONENT_TRANSACTION_SAFE;
   2914 	      di->expansion += sizeof "transaction_safe";
   2915 	    }
   2916 	  else if (peek == 'o'
   2917 		   || peek == 'O')
   2918 	    {
   2919 	      t = DEMANGLE_COMPONENT_NOEXCEPT;
   2920 	      di->expansion += sizeof "noexcept";
   2921 	      if (peek == 'O')
   2922 		{
   2923 		  right = d_expression (di);
   2924 		  if (right == NULL)
   2925 		    return NULL;
   2926 		  if (! d_check_char (di, 'E'))
   2927 		    return NULL;
   2928 		}
   2929 	    }
   2930 	  else if (peek == 'w')
   2931 	    {
   2932 	      t = DEMANGLE_COMPONENT_THROW_SPEC;
   2933 	      di->expansion += sizeof "throw";
   2934 	      right = d_parmlist (di);
   2935 	      if (right == NULL)
   2936 		return NULL;
   2937 	      if (! d_check_char (di, 'E'))
   2938 		return NULL;
   2939 	    }
   2940 	  else
   2941 	    return NULL;
   2942 	}
   2943 
   2944       *pret = d_make_comp (di, t, NULL, right);
   2945       if (*pret == NULL)
   2946 	return NULL;
   2947       pret = &d_left (*pret);
   2948 
   2949       peek = d_peek_char (di);
   2950     }
   2951 
   2952   if (!member_fn && peek == 'F')
   2953     {
   2954       while (pstart != pret)
   2955 	{
   2956 	  switch ((*pstart)->type)
   2957 	    {
   2958 	    case DEMANGLE_COMPONENT_RESTRICT:
   2959 	      (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS;
   2960 	      break;
   2961 	    case DEMANGLE_COMPONENT_VOLATILE:
   2962 	      (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS;
   2963 	      break;
   2964 	    case DEMANGLE_COMPONENT_CONST:
   2965 	      (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS;
   2966 	      break;
   2967 	    default:
   2968 	      break;
   2969 	    }
   2970 	  pstart = &d_left (*pstart);
   2971 	}
   2972     }
   2973 
   2974   return pret;
   2975 }
   2976 
   2977 /* <ref-qualifier> ::= R
   2978                    ::= O */
   2979 
   2980 static struct demangle_component *
   2981 d_ref_qualifier (struct d_info *di, struct demangle_component *sub)
   2982 {
   2983   struct demangle_component *ret = sub;
   2984   char peek;
   2985 
   2986   peek = d_peek_char (di);
   2987   if (peek == 'R' || peek == 'O')
   2988     {
   2989       enum demangle_component_type t;
   2990       if (peek == 'R')
   2991 	{
   2992 	  t = DEMANGLE_COMPONENT_REFERENCE_THIS;
   2993 	  di->expansion += sizeof "&";
   2994 	}
   2995       else
   2996 	{
   2997 	  t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS;
   2998 	  di->expansion += sizeof "&&";
   2999 	}
   3000       d_advance (di, 1);
   3001 
   3002       ret = d_make_comp (di, t, ret, NULL);
   3003     }
   3004 
   3005   return ret;
   3006 }
   3007 
   3008 /* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] [T] E  */
   3009 
   3010 static struct demangle_component *
   3011 d_function_type (struct d_info *di)
   3012 {
   3013   struct demangle_component *ret = NULL;
   3014 
   3015   if ((di->options & DMGL_NO_RECURSE_LIMIT) == 0)
   3016     {
   3017       if (di->recursion_level > DEMANGLE_RECURSION_LIMIT)
   3018 	/* FIXME: There ought to be a way to report
   3019 	   that the recursion limit has been reached.  */
   3020 	return NULL;
   3021 
   3022       di->recursion_level ++;
   3023     }
   3024 
   3025   if (d_check_char (di, 'F'))
   3026     {
   3027       if (d_peek_char (di) == 'Y')
   3028 	{
   3029 	  /* Function has C linkage.  We don't print this information.
   3030 	     FIXME: We should print it in verbose mode.  */
   3031 	  d_advance (di, 1);
   3032 	}
   3033       ret = d_bare_function_type (di, 1);
   3034       ret = d_ref_qualifier (di, ret);
   3035 
   3036       if (! d_check_char (di, 'E'))
   3037 	ret = NULL;
   3038     }
   3039 
   3040   if ((di->options & DMGL_NO_RECURSE_LIMIT) == 0)
   3041     di->recursion_level --;
   3042   return ret;
   3043 }
   3044 
   3045 /* <type>+ */
   3046 
   3047 static struct demangle_component *
   3048 d_parmlist (struct d_info *di)
   3049 {
   3050   struct demangle_component *tl;
   3051   struct demangle_component **ptl;
   3052 
   3053   tl = NULL;
   3054   ptl = &tl;
   3055   while (1)
   3056     {
   3057       struct demangle_component *type;
   3058 
   3059       char peek = d_peek_char (di);
   3060       if (peek == '\0' || peek == 'E' || peek == '.' || peek == 'Q')
   3061 	break;
   3062       if ((peek == 'R' || peek == 'O')
   3063 	  && d_peek_next_char (di) == 'E')
   3064 	/* Function ref-qualifier, not a ref prefix for a parameter type.  */
   3065 	break;
   3066       type = cplus_demangle_type (di);
   3067       if (type == NULL)
   3068 	return NULL;
   3069       *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL);
   3070       if (*ptl == NULL)
   3071 	return NULL;
   3072       ptl = &d_right (*ptl);
   3073     }
   3074 
   3075   /* There should be at least one parameter type besides the optional
   3076      return type.  A function which takes no arguments will have a
   3077      single parameter type void.  */
   3078   if (tl == NULL)
   3079     return NULL;
   3080 
   3081   /* If we have a single parameter type void, omit it.  */
   3082   if (d_right (tl) == NULL
   3083       && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
   3084       && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID)
   3085     {
   3086       di->expansion -= d_left (tl)->u.s_builtin.type->len;
   3087       d_left (tl) = NULL;
   3088     }
   3089 
   3090   return tl;
   3091 }
   3092 
   3093 /* <bare-function-type> ::= [J]<type>+  */
   3094 
   3095 static struct demangle_component *
   3096 d_bare_function_type (struct d_info *di, int has_return_type)
   3097 {
   3098   struct demangle_component *return_type;
   3099   struct demangle_component *tl;
   3100   char peek;
   3101 
   3102   /* Detect special qualifier indicating that the first argument
   3103      is the return type.  */
   3104   peek = d_peek_char (di);
   3105   if (peek == 'J')
   3106     {
   3107       d_advance (di, 1);
   3108       has_return_type = 1;
   3109     }
   3110 
   3111   if (has_return_type)
   3112     {
   3113       return_type = cplus_demangle_type (di);
   3114       if (return_type == NULL)
   3115 	return NULL;
   3116     }
   3117   else
   3118     return_type = NULL;
   3119 
   3120   tl = d_parmlist (di);
   3121   if (tl == NULL)
   3122     return NULL;
   3123 
   3124   return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE,
   3125 		      return_type, tl);
   3126 }
   3127 
   3128 /* <class-enum-type> ::= <name>  */
   3129 
   3130 static struct demangle_component *
   3131 d_class_enum_type (struct d_info *di, int substable)
   3132 {
   3133   return d_name (di, substable);
   3134 }
   3135 
   3136 /* <array-type> ::= A <(positive dimension) number> _ <(element) type>
   3137                 ::= A [<(dimension) expression>] _ <(element) type>
   3138 */
   3139 
   3140 static struct demangle_component *
   3141 d_array_type (struct d_info *di)
   3142 {
   3143   char peek;
   3144   struct demangle_component *dim;
   3145 
   3146   if (! d_check_char (di, 'A'))
   3147     return NULL;
   3148 
   3149   peek = d_peek_char (di);
   3150   if (peek == '_')
   3151     dim = NULL;
   3152   else if (IS_DIGIT (peek))
   3153     {
   3154       const char *s;
   3155 
   3156       s = d_str (di);
   3157       do
   3158 	{
   3159 	  d_advance (di, 1);
   3160 	  peek = d_peek_char (di);
   3161 	}
   3162       while (IS_DIGIT (peek));
   3163       dim = d_make_name (di, s, d_str (di) - s);
   3164       if (dim == NULL)
   3165 	return NULL;
   3166     }
   3167   else
   3168     {
   3169       dim = d_expression (di);
   3170       if (dim == NULL)
   3171 	return NULL;
   3172     }
   3173 
   3174   if (! d_check_char (di, '_'))
   3175     return NULL;
   3176 
   3177   return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim,
   3178 		      cplus_demangle_type (di));
   3179 }
   3180 
   3181 /* <vector-type> ::= Dv <number> _ <type>
   3182                  ::= Dv _ <expression> _ <type> */
   3183 
   3184 static struct demangle_component *
   3185 d_vector_type (struct d_info *di)
   3186 {
   3187   char peek;
   3188   struct demangle_component *dim;
   3189 
   3190   peek = d_peek_char (di);
   3191   if (peek == '_')
   3192     {
   3193       d_advance (di, 1);
   3194       dim = d_expression (di);
   3195     }
   3196   else
   3197     dim = d_number_component (di);
   3198 
   3199   if (dim == NULL)
   3200     return NULL;
   3201 
   3202   if (! d_check_char (di, '_'))
   3203     return NULL;
   3204 
   3205   return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim,
   3206 		      cplus_demangle_type (di));
   3207 }
   3208 
   3209 /* <pointer-to-member-type> ::= M <(class) type> <(member) type>  */
   3210 
   3211 static struct demangle_component *
   3212 d_pointer_to_member_type (struct d_info *di)
   3213 {
   3214   struct demangle_component *cl;
   3215   struct demangle_component *mem;
   3216 
   3217   if (! d_check_char (di, 'M'))
   3218     return NULL;
   3219 
   3220   cl = cplus_demangle_type (di);
   3221   if (cl == NULL)
   3222     return NULL;
   3223 
   3224   /* The ABI says, "The type of a non-static member function is considered
   3225      to be different, for the purposes of substitution, from the type of a
   3226      namespace-scope or static member function whose type appears
   3227      similar. The types of two non-static member functions are considered
   3228      to be different, for the purposes of substitution, if the functions
   3229      are members of different classes. In other words, for the purposes of
   3230      substitution, the class of which the function is a member is
   3231      considered part of the type of function."
   3232 
   3233      For a pointer to member function, this call to cplus_demangle_type
   3234      will end up adding a (possibly qualified) non-member function type to
   3235      the substitution table, which is not correct; however, the member
   3236      function type will never be used in a substitution, so putting the
   3237      wrong type in the substitution table is harmless.  */
   3238 
   3239   mem = cplus_demangle_type (di);
   3240   if (mem == NULL)
   3241     return NULL;
   3242 
   3243   return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem);
   3244 }
   3245 
   3246 /* <non-negative number> _ */
   3247 
   3248 static int
   3249 d_compact_number (struct d_info *di)
   3250 {
   3251   int num;
   3252   if (d_peek_char (di) == '_')
   3253     num = 0;
   3254   else if (d_peek_char (di) == 'n')
   3255     return -1;
   3256   else
   3257     num = d_number (di) + 1;
   3258 
   3259   if (num < 0 || ! d_check_char (di, '_'))
   3260     return -1;
   3261   return num;
   3262 }
   3263 
   3264 /* <template-param> ::= T_
   3265                     ::= T <(parameter-2 non-negative) number> _
   3266 */
   3267 
   3268 static struct demangle_component *
   3269 d_template_param (struct d_info *di)
   3270 {
   3271   int param;
   3272 
   3273   if (! d_check_char (di, 'T'))
   3274     return NULL;
   3275 
   3276   param = d_compact_number (di);
   3277   if (param < 0)
   3278     return NULL;
   3279 
   3280   return d_make_template_param (di, param);
   3281 }
   3282 
   3283 /* <template-args> ::= I <template-arg>+ E  */
   3284 
   3285 static struct demangle_component *
   3286 d_template_args (struct d_info *di)
   3287 {
   3288   if (d_peek_char (di) != 'I'
   3289       && d_peek_char (di) != 'J')
   3290     return NULL;
   3291   d_advance (di, 1);
   3292 
   3293   return d_template_args_1 (di);
   3294 }
   3295 
   3296 /* <template-arg>* [Q <constraint-expression>] E  */
   3297 
   3298 static struct demangle_component *
   3299 d_template_args_1 (struct d_info *di)
   3300 {
   3301   struct demangle_component *hold_last_name;
   3302   struct demangle_component *al;
   3303   struct demangle_component **pal;
   3304 
   3305   /* Preserve the last name we saw--don't let the template arguments
   3306      clobber it, as that would give us the wrong name for a subsequent
   3307      constructor or destructor.  */
   3308   hold_last_name = di->last_name;
   3309 
   3310   if (d_peek_char (di) == 'E')
   3311     {
   3312       /* An argument pack can be empty.  */
   3313       d_advance (di, 1);
   3314       return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL);
   3315     }
   3316 
   3317   al = NULL;
   3318   pal = &al;
   3319   while (1)
   3320     {
   3321       struct demangle_component *a;
   3322 
   3323       a = d_template_arg (di);
   3324       if (a == NULL)
   3325 	return NULL;
   3326 
   3327       *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL);
   3328       if (*pal == NULL)
   3329 	return NULL;
   3330       pal = &d_right (*pal);
   3331 
   3332       char peek = d_peek_char (di);
   3333       if (peek == 'E' || peek == 'Q')
   3334 	break;
   3335     }
   3336 
   3337   al = d_maybe_constraints (di, al);
   3338 
   3339   if (d_peek_char (di) != 'E')
   3340     return NULL;
   3341   d_advance (di, 1);
   3342 
   3343   di->last_name = hold_last_name;
   3344 
   3345   return al;
   3346 }
   3347 
   3348 /* <template-arg> ::= <type>
   3349                   ::= X <expression> E
   3350                   ::= <expr-primary>
   3351 */
   3352 
   3353 static struct demangle_component *
   3354 d_template_arg (struct d_info *di)
   3355 {
   3356   struct demangle_component *ret;
   3357 
   3358   switch (d_peek_char (di))
   3359     {
   3360     case 'X':
   3361       d_advance (di, 1);
   3362       ret = d_expression (di);
   3363       if (! d_check_char (di, 'E'))
   3364 	return NULL;
   3365       return ret;
   3366 
   3367     case 'L':
   3368       return d_expr_primary (di);
   3369 
   3370     case 'I':
   3371     case 'J':
   3372       /* An argument pack.  */
   3373       return d_template_args (di);
   3374 
   3375     default:
   3376       return cplus_demangle_type (di);
   3377     }
   3378 }
   3379 
   3380 /* Parse a sequence of expressions until we hit the terminator
   3381    character.  */
   3382 
   3383 static struct demangle_component *
   3384 d_exprlist (struct d_info *di, char terminator)
   3385 {
   3386   struct demangle_component *list = NULL;
   3387   struct demangle_component **p = &list;
   3388 
   3389   if (d_peek_char (di) == terminator)
   3390     {
   3391       d_advance (di, 1);
   3392       return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL);
   3393     }
   3394 
   3395   while (1)
   3396     {
   3397       struct demangle_component *arg = d_expression (di);
   3398       if (arg == NULL)
   3399 	return NULL;
   3400 
   3401       *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
   3402       if (*p == NULL)
   3403 	return NULL;
   3404       p = &d_right (*p);
   3405 
   3406       if (d_peek_char (di) == terminator)
   3407 	{
   3408 	  d_advance (di, 1);
   3409 	  break;
   3410 	}
   3411     }
   3412 
   3413   return list;
   3414 }
   3415 
   3416 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
   3417    dynamic_cast, static_cast or reinterpret_cast.  */
   3418 
   3419 static int
   3420 op_is_new_cast (struct demangle_component *op)
   3421 {
   3422   const char *code = op->u.s_operator.op->code;
   3423   return (code[1] == 'c'
   3424 	  && (code[0] == 's' || code[0] == 'd'
   3425 	      || code[0] == 'c' || code[0] == 'r'));
   3426 }
   3427 
   3428 /*   <unresolved-name> ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
   3429        ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
   3430        # T::N::x /decltype(p)::N::x
   3431        ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
   3432        # A::x, N::y, A<T>::z; "gs" means leading "::"
   3433        ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
   3434 
   3435      "gs" is handled elsewhere, as a unary operator.  */
   3436 
   3437 static struct demangle_component *
   3438 d_unresolved_name (struct d_info *di)
   3439 {
   3440   struct demangle_component *type;
   3441   struct demangle_component *name;
   3442   char peek;
   3443 
   3444   /* Consume the "sr".  */
   3445   d_advance (di, 2);
   3446 
   3447   peek = d_peek_char (di);
   3448   if (di->unresolved_name_state
   3449       && (IS_DIGIT (peek)
   3450 	  || IS_LOWER (peek)
   3451 	  || peek == 'C'
   3452 	  || peek == 'U'
   3453 	  || peek == 'L'))
   3454     {
   3455       /* The third production is ambiguous with the old unresolved-name syntax
   3456 	 of <type> <base-unresolved-name>; in the old mangling, A::x was mangled
   3457 	 as sr1A1x, now sr1AE1x.  So we first try to demangle using the new
   3458 	 mangling, then with the old if that fails.  */
   3459       di->unresolved_name_state = -1;
   3460       type = d_prefix (di, 0);
   3461       if (d_peek_char (di) == 'E')
   3462 	d_advance (di, 1);
   3463     }
   3464   else
   3465     type = cplus_demangle_type (di);
   3466   name = d_unqualified_name (di, type, NULL);
   3467   if (d_peek_char (di) == 'I')
   3468     name = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
   3469 			d_template_args (di));
   3470   return name;
   3471 }
   3472 
   3473 /* <expression> ::= <(unary) operator-name> <expression>
   3474                 ::= <(binary) operator-name> <expression> <expression>
   3475                 ::= <(trinary) operator-name> <expression> <expression> <expression>
   3476 		::= cl <expression>+ E
   3477                 ::= st <type>
   3478                 ::= <template-param>
   3479 		::= u <source-name> <template-arg>* E # vendor extended expression
   3480 		::= <unresolved-name>
   3481                 ::= <expr-primary>
   3482 
   3483   <braced-expression> ::= <expression>
   3484 		      ::= di <field source-name> <braced-expression>	# .name = expr
   3485 		      ::= dx <index expression> <braced-expression>	# [expr] = expr
   3486 		      ::= dX <range begin expression> <range end expression> <braced-expression>
   3487 									# [expr ... expr] = expr
   3488 */
   3489 
   3490 static struct demangle_component *
   3491 d_expression_1 (struct d_info *di)
   3492 {
   3493   char peek;
   3494 
   3495   peek = d_peek_char (di);
   3496   if (peek == 'L')
   3497     return d_expr_primary (di);
   3498   else if (peek == 'T')
   3499     return d_template_param (di);
   3500   else if (peek == 's' && d_peek_next_char (di) == 'r')
   3501     return d_unresolved_name (di);
   3502   else if (peek == 's' && d_peek_next_char (di) == 'p')
   3503     {
   3504       d_advance (di, 2);
   3505       return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION,
   3506 			  d_expression_1 (di), NULL);
   3507     }
   3508   else if (peek == 'f' && d_peek_next_char (di) == 'p')
   3509     {
   3510       /* Function parameter used in a late-specified return type.  */
   3511       int index;
   3512       d_advance (di, 2);
   3513       if (d_peek_char (di) == 'T')
   3514 	{
   3515 	  /* 'this' parameter.  */
   3516 	  d_advance (di, 1);
   3517 	  index = 0;
   3518 	}
   3519       else
   3520 	{
   3521 	  index = d_compact_number (di);
   3522 	  if (index == INT_MAX || index == -1)
   3523 	    return NULL;
   3524 	  index++;
   3525 	}
   3526       return d_make_function_param (di, index);
   3527     }
   3528   else if (IS_DIGIT (peek)
   3529 	   || (peek == 'o' && d_peek_next_char (di) == 'n'))
   3530     {
   3531       /* We can get an unqualified name as an expression in the case of
   3532          a dependent function call, i.e. decltype(f(t)).  */
   3533       struct demangle_component *name;
   3534 
   3535       if (peek == 'o')
   3536 	/* operator-function-id, i.e. operator+(t).  */
   3537 	d_advance (di, 2);
   3538 
   3539       name = d_unqualified_name (di, NULL, NULL);
   3540       if (name == NULL)
   3541 	return NULL;
   3542       if (d_peek_char (di) == 'I')
   3543 	return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
   3544 			    d_template_args (di));
   3545       else
   3546 	return name;
   3547     }
   3548   else if ((peek == 'i' || peek == 't')
   3549 	   && d_peek_next_char (di) == 'l')
   3550     {
   3551       /* Brace-enclosed initializer list, untyped or typed.  */
   3552       struct demangle_component *type = NULL;
   3553       d_advance (di, 2);
   3554       if (peek == 't')
   3555 	type = cplus_demangle_type (di);
   3556       if (!d_peek_char (di) || !d_peek_next_char (di))
   3557 	return NULL;
   3558       return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
   3559 			  type, d_exprlist (di, 'E'));
   3560     }
   3561   else if (peek == 'u')
   3562     {
   3563       /* A vendor extended expression.  */
   3564       struct demangle_component *name, *args;
   3565       d_advance (di, 1);
   3566       name = d_source_name (di);
   3567       args = d_template_args_1 (di);
   3568       return d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_EXPR, name, args);
   3569     }
   3570   else
   3571     {
   3572       struct demangle_component *op;
   3573       const char *code = NULL;
   3574       int args;
   3575 
   3576       op = d_operator_name (di);
   3577       if (op == NULL)
   3578 	return NULL;
   3579 
   3580       if (op->type == DEMANGLE_COMPONENT_OPERATOR)
   3581 	{
   3582 	  code = op->u.s_operator.op->code;
   3583 	  di->expansion += op->u.s_operator.op->len - 2;
   3584 	  if (strcmp (code, "st") == 0)
   3585 	    return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
   3586 				cplus_demangle_type (di));
   3587 	}
   3588 
   3589       switch (op->type)
   3590 	{
   3591 	default:
   3592 	  return NULL;
   3593 	case DEMANGLE_COMPONENT_OPERATOR:
   3594 	  args = op->u.s_operator.op->args;
   3595 	  break;
   3596 	case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
   3597 	  args = op->u.s_extended_operator.args;
   3598 	  break;
   3599 	case DEMANGLE_COMPONENT_CAST:
   3600 	  args = 1;
   3601 	  break;
   3602 	}
   3603 
   3604       switch (args)
   3605 	{
   3606 	case 0:
   3607 	  return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL);
   3608 
   3609 	case 1:
   3610 	  {
   3611 	    struct demangle_component *operand;
   3612 	    int suffix = 0;
   3613 
   3614 	    if (code && (code[0] == 'p' || code[0] == 'm')
   3615 		&& code[1] == code[0])
   3616 	      /* pp_ and mm_ are the prefix variants.  */
   3617 	      suffix = !d_check_char (di, '_');
   3618 
   3619 	    if (op->type == DEMANGLE_COMPONENT_CAST
   3620 		&& d_check_char (di, '_'))
   3621 	      operand = d_exprlist (di, 'E');
   3622 	    else if (code && !strcmp (code, "sP"))
   3623 	      operand = d_template_args_1 (di);
   3624 	    else
   3625 	      operand = d_expression_1 (di);
   3626 
   3627 	    if (suffix)
   3628 	      /* Indicate the suffix variant for d_print_comp.  */
   3629 	      operand = d_make_comp (di, DEMANGLE_COMPONENT_BINARY_ARGS,
   3630 				     operand, operand);
   3631 
   3632 	    return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, operand);
   3633 	  }
   3634 	case 2:
   3635 	  {
   3636 	    struct demangle_component *left;
   3637 	    struct demangle_component *right;
   3638 
   3639 	    if (code == NULL)
   3640 	      return NULL;
   3641 	    if (op_is_new_cast (op))
   3642 	      left = cplus_demangle_type (di);
   3643 	    else if (code[0] == 'f')
   3644 	      /* fold-expression.  */
   3645 	      left = d_operator_name (di);
   3646 	    else if (!strcmp (code, "di"))
   3647 	      left = d_unqualified_name (di, NULL, NULL);
   3648 	    else
   3649 	      left = d_expression_1 (di);
   3650 	    if (!strcmp (code, "cl"))
   3651 	      right = d_exprlist (di, 'E');
   3652 	    else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
   3653 	      {
   3654 		peek = d_peek_char (di);
   3655 		/* These codes start a qualified name.  */
   3656 		if ((peek == 'g' && d_peek_next_char (di) == 's')
   3657 		    || (peek == 's' && d_peek_next_char (di) == 'r'))
   3658 		  right = d_expression_1 (di);
   3659 		else
   3660 		  {
   3661 		    /* Otherwise it's an unqualified name.  We use
   3662 		       d_unqualified_name rather than d_expression_1 here for
   3663 		       old mangled names that didn't add 'on' before operator
   3664 		       names.  */
   3665 		    right = d_unqualified_name (di, NULL, NULL);
   3666 		    if (d_peek_char (di) == 'I')
   3667 		      right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE,
   3668 					   right, d_template_args (di));
   3669 		  }
   3670 	      }
   3671 	    else
   3672 	      right = d_expression_1 (di);
   3673 
   3674 	    return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
   3675 				d_make_comp (di,
   3676 					     DEMANGLE_COMPONENT_BINARY_ARGS,
   3677 					     left, right));
   3678 	  }
   3679 	case 3:
   3680 	  {
   3681 	    struct demangle_component *first;
   3682 	    struct demangle_component *second;
   3683 	    struct demangle_component *third;
   3684 
   3685 	    if (code == NULL)
   3686 	      return NULL;
   3687 	    else if (!strcmp (code, "qu")
   3688 		     || !strcmp (code, "dX"))
   3689 	      {
   3690 		/* ?: expression.  */
   3691 		first = d_expression_1 (di);
   3692 		second = d_expression_1 (di);
   3693 		third = d_expression_1 (di);
   3694 		if (third == NULL)
   3695 		  return NULL;
   3696 	      }
   3697 	    else if (code[0] == 'f')
   3698 	      {
   3699 		/* fold-expression.  */
   3700 		first = d_operator_name (di);
   3701 		second = d_expression_1 (di);
   3702 		third = d_expression_1 (di);
   3703 		if (third == NULL)
   3704 		  return NULL;
   3705 	      }
   3706 	    else if (code[0] == 'n')
   3707 	      {
   3708 		/* new-expression.  */
   3709 		if (code[1] != 'w' && code[1] != 'a')
   3710 		  return NULL;
   3711 		first = d_exprlist (di, '_');
   3712 		second = cplus_demangle_type (di);
   3713 		if (d_peek_char (di) == 'E')
   3714 		  {
   3715 		    d_advance (di, 1);
   3716 		    third = NULL;
   3717 		  }
   3718 		else if (d_peek_char (di) == 'p'
   3719 			 && d_peek_next_char (di) == 'i')
   3720 		  {
   3721 		    /* Parenthesized initializer.  */
   3722 		    d_advance (di, 2);
   3723 		    third = d_exprlist (di, 'E');
   3724 		  }
   3725 		else if (d_peek_char (di) == 'i'
   3726 			 && d_peek_next_char (di) == 'l')
   3727 		  /* initializer-list.  */
   3728 		  third = d_expression_1 (di);
   3729 		else
   3730 		  return NULL;
   3731 	      }
   3732 	    else
   3733 	      return NULL;
   3734 	    return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op,
   3735 				d_make_comp (di,
   3736 					     DEMANGLE_COMPONENT_TRINARY_ARG1,
   3737 					     first,
   3738 					     d_make_comp (di,
   3739 							  DEMANGLE_COMPONENT_TRINARY_ARG2,
   3740 							  second, third)));
   3741 	  }
   3742 	default:
   3743 	  return NULL;
   3744 	}
   3745     }
   3746 }
   3747 
   3748 static struct demangle_component *
   3749 d_expression (struct d_info *di)
   3750 {
   3751   struct demangle_component *ret;
   3752   int was_expression = di->is_expression;
   3753 
   3754   di->is_expression = 1;
   3755   ret = d_expression_1 (di);
   3756   di->is_expression = was_expression;
   3757   return ret;
   3758 }
   3759 
   3760 /* <expr-primary> ::= L <type> <(value) number> E
   3761                   ::= L <type> <(value) float> E
   3762                   ::= L <mangled-name> E
   3763 */
   3764 
   3765 static struct demangle_component *
   3766 d_expr_primary (struct d_info *di)
   3767 {
   3768   struct demangle_component *ret;
   3769 
   3770   if (! d_check_char (di, 'L'))
   3771     return NULL;
   3772   if (d_peek_char (di) == '_'
   3773       /* Workaround for G++ bug; see comment in write_template_arg.  */
   3774       || d_peek_char (di) == 'Z')
   3775     ret = cplus_demangle_mangled_name (di, 0);
   3776   else
   3777     {
   3778       struct demangle_component *type;
   3779       enum demangle_component_type t;
   3780       const char *s;
   3781 
   3782       type = cplus_demangle_type (di);
   3783       if (type == NULL)
   3784 	return NULL;
   3785 
   3786       /* If we have a type we know how to print, we aren't going to
   3787 	 print the type name itself.  */
   3788       if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
   3789 	  && type->u.s_builtin.type->print != D_PRINT_DEFAULT)
   3790 	di->expansion -= type->u.s_builtin.type->len;
   3791 
   3792       if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE
   3793 	  && strcmp (type->u.s_builtin.type->name,
   3794 		     cplus_demangle_builtin_types[33].name) == 0)
   3795 	{
   3796 	  if (d_peek_char (di) == 'E')
   3797 	    {
   3798 	      d_advance (di, 1);
   3799 	      return type;
   3800 	    }
   3801 	}
   3802 
   3803       /* Rather than try to interpret the literal value, we just
   3804 	 collect it as a string.  Note that it's possible to have a
   3805 	 floating point literal here.  The ABI specifies that the
   3806 	 format of such literals is machine independent.  That's fine,
   3807 	 but what's not fine is that versions of g++ up to 3.2 with
   3808 	 -fabi-version=1 used upper case letters in the hex constant,
   3809 	 and dumped out gcc's internal representation.  That makes it
   3810 	 hard to tell where the constant ends, and hard to dump the
   3811 	 constant in any readable form anyhow.  We don't attempt to
   3812 	 handle these cases.  */
   3813 
   3814       t = DEMANGLE_COMPONENT_LITERAL;
   3815       if (d_peek_char (di) == 'n')
   3816 	{
   3817 	  t = DEMANGLE_COMPONENT_LITERAL_NEG;
   3818 	  d_advance (di, 1);
   3819 	}
   3820       s = d_str (di);
   3821       while (d_peek_char (di) != 'E')
   3822 	{
   3823 	  if (d_peek_char (di) == '\0')
   3824 	    return NULL;
   3825 	  d_advance (di, 1);
   3826 	}
   3827       ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s));
   3828     }
   3829   if (! d_check_char (di, 'E'))
   3830     return NULL;
   3831   return ret;
   3832 }
   3833 
   3834 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>]
   3835                 ::= Z <(function) encoding> E s [<discriminator>]
   3836                 ::= Z <(function) encoding> E d [<parameter> number>] _ <entity name>
   3837 */
   3838 
   3839 static struct demangle_component *
   3840 d_local_name (struct d_info *di)
   3841 {
   3842   struct demangle_component *function;
   3843   struct demangle_component *name;
   3844 
   3845   if (! d_check_char (di, 'Z'))
   3846     return NULL;
   3847 
   3848   function = d_encoding (di, 0);
   3849   if (!function)
   3850     return NULL;
   3851 
   3852   if (! d_check_char (di, 'E'))
   3853     return NULL;
   3854 
   3855   if (d_peek_char (di) == 's')
   3856     {
   3857       d_advance (di, 1);
   3858       if (! d_discriminator (di))
   3859 	return NULL;
   3860       name = d_make_name (di, "string literal", sizeof "string literal" - 1);
   3861     }
   3862   else
   3863     {
   3864       int num = -1;
   3865 
   3866       if (d_peek_char (di) == 'd')
   3867 	{
   3868 	  /* Default argument scope: d <number> _.  */
   3869 	  d_advance (di, 1);
   3870 	  num = d_compact_number (di);
   3871 	  if (num < 0)
   3872 	    return NULL;
   3873 	}
   3874 
   3875       name = d_name (di, 0);
   3876 
   3877       if (name
   3878 	  /* Lambdas and unnamed types have internal discriminators
   3879 	     and are not functions.  */
   3880 	  && name->type != DEMANGLE_COMPONENT_LAMBDA
   3881 	  && name->type != DEMANGLE_COMPONENT_UNNAMED_TYPE)
   3882 	{
   3883 	  /* Read and ignore an optional discriminator.  */
   3884 	  if (! d_discriminator (di))
   3885 	    return NULL;
   3886 	}
   3887 
   3888       if (num >= 0)
   3889 	name = d_make_default_arg (di, num, name);
   3890     }
   3891 
   3892   /* Elide the return type of the containing function so as to not
   3893      confuse the user thinking it is the return type of whatever local
   3894      function we might be containing.  */
   3895   if (function->type == DEMANGLE_COMPONENT_TYPED_NAME
   3896       && d_right (function)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
   3897     d_left (d_right (function)) = NULL;
   3898 
   3899   return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
   3900 }
   3901 
   3902 /* <discriminator> ::= _ <number>    # when number < 10
   3903                    ::= __ <number> _ # when number >= 10
   3904 
   3905    <discriminator> ::= _ <number>    # when number >=10
   3906    is also accepted to support gcc versions that wrongly mangled that way.
   3907 
   3908    We demangle the discriminator, but we don't print it out.  FIXME:
   3909    We should print it out in verbose mode.  */
   3910 
   3911 static int
   3912 d_discriminator (struct d_info *di)
   3913 {
   3914   int discrim, num_underscores = 1;
   3915 
   3916   if (d_peek_char (di) != '_')
   3917     return 1;
   3918   d_advance (di, 1);
   3919   if (d_peek_char (di) == '_')
   3920     {
   3921       ++num_underscores;
   3922       d_advance (di, 1);
   3923     }
   3924 
   3925   discrim = d_number (di);
   3926   if (discrim < 0)
   3927     return 0;
   3928   if (num_underscores > 1 && discrim >= 10)
   3929     {
   3930       if (d_peek_char (di) == '_')
   3931 	d_advance (di, 1);
   3932       else
   3933 	return 0;
   3934     }
   3935 
   3936   return 1;
   3937 }
   3938 
   3939 /* <template-parm> ::= Ty
   3940                    ::= Tn <type>
   3941 		   ::= Tt <template-head> E
   3942 		   ::= Tp <template-parm>  */
   3943 
   3944 static struct demangle_component *
   3945 d_template_parm (struct d_info *di, int *bad)
   3946 {
   3947   if (d_peek_char (di) != 'T')
   3948     return NULL;
   3949 
   3950   struct demangle_component *op;
   3951   enum demangle_component_type kind;
   3952   switch (d_peek_next_char (di))
   3953     {
   3954     default:
   3955       return NULL;
   3956 
   3957     case 'p': /* Pack  */
   3958       d_advance (di, 2);
   3959       op = d_template_parm (di, bad);
   3960       kind = DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM;
   3961       if (!op)
   3962 	{
   3963 	  *bad = 1;
   3964 	  return NULL;
   3965 	}
   3966       break;
   3967 
   3968     case 'y': /* Typename  */
   3969       d_advance (di, 2);
   3970       op = NULL;
   3971       kind = DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM;
   3972       break;
   3973 
   3974     case 'n': /* Non-Type  */
   3975       d_advance (di, 2);
   3976       op = cplus_demangle_type (di);
   3977       kind = DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM;
   3978       if (!op)
   3979 	{
   3980 	  *bad = 1;
   3981 	  return NULL;
   3982 	}
   3983       break;
   3984 
   3985     case 't': /* Template */
   3986       d_advance (di, 2);
   3987       op = d_template_head (di, bad);
   3988       kind = DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM;
   3989       if (!op || !d_check_char (di, 'E'))
   3990 	{
   3991 	  *bad = 1;
   3992 	  return NULL;
   3993 	}
   3994     }
   3995 
   3996   return d_make_comp (di, kind, op, NULL);
   3997 }
   3998 
   3999 /* <template-head> ::= <template-head>? <template-parm>  */
   4000 
   4001 static struct demangle_component *
   4002 d_template_head (struct d_info *di, int *bad)
   4003 {
   4004   struct demangle_component *res = NULL, **slot = &res;
   4005   struct demangle_component *op;
   4006 
   4007   while ((op = d_template_parm (di, bad)))
   4008     {
   4009       *slot = op;
   4010       slot = &d_right (op);
   4011     }
   4012 
   4013   /* Wrap it in a template head, to make concatenating with any parm list, and
   4014      printing simpler.  */
   4015   if (res)
   4016     res = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_HEAD, res, NULL);
   4017 
   4018   return res;
   4019 }
   4020 
   4021 /* <closure-type-name> ::= Ul <template-head>? <lambda-sig> E [ <nonnegative number> ] _ */
   4022 
   4023 static struct demangle_component *
   4024 d_lambda (struct d_info *di)
   4025 {
   4026   if (! d_check_char (di, 'U'))
   4027     return NULL;
   4028   if (! d_check_char (di, 'l'))
   4029     return NULL;
   4030 
   4031   int bad = 0;
   4032   struct demangle_component *head = d_template_head (di, &bad);
   4033   if (bad)
   4034     return NULL;
   4035 
   4036   struct demangle_component *tl = d_parmlist (di);
   4037   if (tl == NULL)
   4038     return NULL;
   4039   if (head)
   4040     {
   4041       d_right (head) = tl;
   4042       tl = head;
   4043     }
   4044 
   4045   if (! d_check_char (di, 'E'))
   4046     return NULL;
   4047 
   4048   int num = d_compact_number (di);
   4049   if (num < 0)
   4050     return NULL;
   4051 
   4052   struct demangle_component *ret = d_make_empty (di);
   4053   if (ret)
   4054     {
   4055       ret->type = DEMANGLE_COMPONENT_LAMBDA;
   4056       ret->u.s_unary_num.sub = tl;
   4057       ret->u.s_unary_num.num = num;
   4058     }
   4059 
   4060   return ret;
   4061 }
   4062 
   4063 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
   4064 
   4065 static struct demangle_component *
   4066 d_unnamed_type (struct d_info *di)
   4067 {
   4068   struct demangle_component *ret;
   4069   int num;
   4070 
   4071   if (! d_check_char (di, 'U'))
   4072     return NULL;
   4073   if (! d_check_char (di, 't'))
   4074     return NULL;
   4075 
   4076   num = d_compact_number (di);
   4077   if (num < 0)
   4078     return NULL;
   4079 
   4080   ret = d_make_empty (di);
   4081   if (ret)
   4082     {
   4083       ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE;
   4084       ret->u.s_number.number = num;
   4085     }
   4086 
   4087   if (! d_add_substitution (di, ret))
   4088     return NULL;
   4089 
   4090   return ret;
   4091 }
   4092 
   4093 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]*
   4094 */
   4095 
   4096 static struct demangle_component *
   4097 d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
   4098 {
   4099   const char *suffix = d_str (di);
   4100   const char *pend = suffix;
   4101   struct demangle_component *n;
   4102 
   4103   if (*pend == '.' && (IS_LOWER (pend[1]) || IS_DIGIT (pend[1])
   4104 		       || pend[1] == '_'))
   4105     {
   4106       pend += 2;
   4107       while (IS_LOWER (*pend) || IS_DIGIT (*pend) || *pend == '_')
   4108 	++pend;
   4109     }
   4110   while (*pend == '.' && IS_DIGIT (pend[1]))
   4111     {
   4112       pend += 2;
   4113       while (IS_DIGIT (*pend))
   4114 	++pend;
   4115     }
   4116   d_advance (di, pend - suffix);
   4117   n = d_make_name (di, suffix, pend - suffix);
   4118   return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n);
   4119 }
   4120 
   4121 /* Add a new substitution.  */
   4122 
   4123 static int
   4124 d_add_substitution (struct d_info *di, struct demangle_component *dc)
   4125 {
   4126   if (dc == NULL)
   4127     return 0;
   4128   if (di->next_sub >= di->num_subs)
   4129     return 0;
   4130   di->subs[di->next_sub] = dc;
   4131   ++di->next_sub;
   4132   return 1;
   4133 }
   4134 
   4135 /* <substitution> ::= S <seq-id> _
   4136                   ::= S_
   4137                   ::= St
   4138                   ::= Sa
   4139                   ::= Sb
   4140                   ::= Ss
   4141                   ::= Si
   4142                   ::= So
   4143                   ::= Sd
   4144 
   4145    If PREFIX is non-zero, then this type is being used as a prefix in
   4146    a qualified name.  In this case, for the standard substitutions, we
   4147    need to check whether we are being used as a prefix for a
   4148    constructor or destructor, and return a full template name.
   4149    Otherwise we will get something like std::iostream::~iostream()
   4150    which does not correspond particularly well to any function which
   4151    actually appears in the source.
   4152 */
   4153 
   4154 static const struct d_standard_sub_info standard_subs[] =
   4155 {
   4156   { 't', NL ("std"),
   4157     NL ("std"),
   4158     NULL, 0 },
   4159   { 'a', NL ("std::allocator"),
   4160     NL ("std::allocator"),
   4161     NL ("allocator") },
   4162   { 'b', NL ("std::basic_string"),
   4163     NL ("std::basic_string"),
   4164     NL ("basic_string") },
   4165   { 's', NL ("std::string"),
   4166     NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
   4167     NL ("basic_string") },
   4168   { 'i', NL ("std::istream"),
   4169     NL ("std::basic_istream<char, std::char_traits<char> >"),
   4170     NL ("basic_istream") },
   4171   { 'o', NL ("std::ostream"),
   4172     NL ("std::basic_ostream<char, std::char_traits<char> >"),
   4173     NL ("basic_ostream") },
   4174   { 'd', NL ("std::iostream"),
   4175     NL ("std::basic_iostream<char, std::char_traits<char> >"),
   4176     NL ("basic_iostream") }
   4177 };
   4178 
   4179 static struct demangle_component *
   4180 d_substitution (struct d_info *di, int prefix)
   4181 {
   4182   char c;
   4183 
   4184   if (! d_check_char (di, 'S'))
   4185     return NULL;
   4186 
   4187   c = d_next_char (di);
   4188   if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
   4189     {
   4190       unsigned int id;
   4191 
   4192       id = 0;
   4193       if (c != '_')
   4194 	{
   4195 	  do
   4196 	    {
   4197 	      unsigned int new_id;
   4198 
   4199 	      if (IS_DIGIT (c))
   4200 		new_id = id * 36 + c - '0';
   4201 	      else if (IS_UPPER (c))
   4202 		new_id = id * 36 + c - 'A' + 10;
   4203 	      else
   4204 		return NULL;
   4205 	      if (new_id < id)
   4206 		return NULL;
   4207 	      id = new_id;
   4208 	      c = d_next_char (di);
   4209 	    }
   4210 	  while (c != '_');
   4211 
   4212 	  ++id;
   4213 	}
   4214 
   4215       if (id >= (unsigned int) di->next_sub)
   4216 	return NULL;
   4217 
   4218       return di->subs[id];
   4219     }
   4220   else
   4221     {
   4222       int verbose;
   4223       const struct d_standard_sub_info *p;
   4224       const struct d_standard_sub_info *pend;
   4225 
   4226       verbose = (di->options & DMGL_VERBOSE) != 0;
   4227       if (! verbose && prefix)
   4228 	{
   4229 	  char peek;
   4230 
   4231 	  peek = d_peek_char (di);
   4232 	  if (peek == 'C' || peek == 'D')
   4233 	    verbose = 1;
   4234 	}
   4235 
   4236       pend = (&standard_subs[0]
   4237 	      + sizeof standard_subs / sizeof standard_subs[0]);
   4238       for (p = &standard_subs[0]; p < pend; ++p)
   4239 	{
   4240 	  if (c == p->code)
   4241 	    {
   4242 	      const char *s;
   4243 	      int len;
   4244 	      struct demangle_component *dc;
   4245 
   4246 	      if (p->set_last_name != NULL)
   4247 		di->last_name = d_make_sub (di, p->set_last_name,
   4248 					    p->set_last_name_len);
   4249 	      if (verbose)
   4250 		{
   4251 		  s = p->full_expansion;
   4252 		  len = p->full_len;
   4253 		}
   4254 	      else
   4255 		{
   4256 		  s = p->simple_expansion;
   4257 		  len = p->simple_len;
   4258 		}
   4259 	      di->expansion += len;
   4260 	      dc = d_make_sub (di, s, len);
   4261 	      if (d_peek_char (di) == 'B')
   4262 		{
   4263 		  /* If there are ABI tags on the abbreviation, it becomes
   4264 		     a substitution candidate.  */
   4265 		  dc = d_abi_tags (di, dc);
   4266 		  if (! d_add_substitution (di, dc))
   4267 		    return NULL;
   4268 		}
   4269 	      return dc;
   4270 	    }
   4271 	}
   4272 
   4273       return NULL;
   4274     }
   4275 }
   4276 
   4277 static void
   4278 d_checkpoint (struct d_info *di, struct d_info_checkpoint *checkpoint)
   4279 {
   4280   checkpoint->n = di->n;
   4281   checkpoint->next_comp = di->next_comp;
   4282   checkpoint->next_sub = di->next_sub;
   4283   checkpoint->expansion = di->expansion;
   4284 }
   4285 
   4286 static void
   4287 d_backtrack (struct d_info *di, struct d_info_checkpoint *checkpoint)
   4288 {
   4289   di->n = checkpoint->n;
   4290   di->next_comp = checkpoint->next_comp;
   4291   di->next_sub = checkpoint->next_sub;
   4292   di->expansion = checkpoint->expansion;
   4293 }
   4294 
   4295 /* Initialize a growable string.  */
   4296 
   4297 static void
   4298 d_growable_string_init (struct d_growable_string *dgs, size_t estimate)
   4299 {
   4300   dgs->buf = NULL;
   4301   dgs->len = 0;
   4302   dgs->alc = 0;
   4303   dgs->allocation_failure = 0;
   4304 
   4305   if (estimate > 0)
   4306     d_growable_string_resize (dgs, estimate);
   4307 }
   4308 
   4309 /* Grow a growable string to a given size.  */
   4310 
   4311 static inline void
   4312 d_growable_string_resize (struct d_growable_string *dgs, size_t need)
   4313 {
   4314   size_t newalc;
   4315   char *newbuf;
   4316 
   4317   if (dgs->allocation_failure)
   4318     return;
   4319 
   4320   /* Start allocation at two bytes to avoid any possibility of confusion
   4321      with the special value of 1 used as a return in *palc to indicate
   4322      allocation failures.  */
   4323   newalc = dgs->alc > 0 ? dgs->alc : 2;
   4324   while (newalc < need)
   4325     newalc <<= 1;
   4326 
   4327   newbuf = (char *) realloc (dgs->buf, newalc);
   4328   if (newbuf == NULL)
   4329     {
   4330       free (dgs->buf);
   4331       dgs->buf = NULL;
   4332       dgs->len = 0;
   4333       dgs->alc = 0;
   4334       dgs->allocation_failure = 1;
   4335       return;
   4336     }
   4337   dgs->buf = newbuf;
   4338   dgs->alc = newalc;
   4339 }
   4340 
   4341 /* Append a buffer to a growable string.  */
   4342 
   4343 static inline void
   4344 d_growable_string_append_buffer (struct d_growable_string *dgs,
   4345                                  const char *s, size_t l)
   4346 {
   4347   size_t need;
   4348 
   4349   need = dgs->len + l + 1;
   4350   if (need > dgs->alc)
   4351     d_growable_string_resize (dgs, need);
   4352 
   4353   if (dgs->allocation_failure)
   4354     return;
   4355 
   4356   memcpy (dgs->buf + dgs->len, s, l);
   4357   dgs->buf[dgs->len + l] = '\0';
   4358   dgs->len += l;
   4359 }
   4360 
   4361 /* Bridge growable strings to the callback mechanism.  */
   4362 
   4363 static void
   4364 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque)
   4365 {
   4366   struct d_growable_string *dgs = (struct d_growable_string*) opaque;
   4367 
   4368   d_growable_string_append_buffer (dgs, s, l);
   4369 }
   4370 
   4371 /* Walk the tree, counting the number of templates encountered, and
   4372    the number of times a scope might be saved.  These counts will be
   4373    used to allocate data structures for d_print_comp, so the logic
   4374    here must mirror the logic d_print_comp will use.  It is not
   4375    important that the resulting numbers are exact, so long as they
   4376    are larger than the actual numbers encountered.  */
   4377 
   4378 static void
   4379 d_count_templates_scopes (struct d_print_info *dpi,
   4380 			  struct demangle_component *dc)
   4381 {
   4382   if (dc == NULL || dc->d_counting > 1 || dpi->recursion > MAX_RECURSION_COUNT)
   4383     return;
   4384 
   4385   ++ dc->d_counting;
   4386 
   4387   switch (dc->type)
   4388     {
   4389     case DEMANGLE_COMPONENT_NAME:
   4390     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
   4391     case DEMANGLE_COMPONENT_FUNCTION_PARAM:
   4392     case DEMANGLE_COMPONENT_SUB_STD:
   4393     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
   4394     case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
   4395     case DEMANGLE_COMPONENT_OPERATOR:
   4396     case DEMANGLE_COMPONENT_CHARACTER:
   4397     case DEMANGLE_COMPONENT_NUMBER:
   4398     case DEMANGLE_COMPONENT_UNNAMED_TYPE:
   4399     case DEMANGLE_COMPONENT_STRUCTURED_BINDING:
   4400     case DEMANGLE_COMPONENT_MODULE_NAME:
   4401     case DEMANGLE_COMPONENT_MODULE_PARTITION:
   4402     case DEMANGLE_COMPONENT_MODULE_INIT:
   4403     case DEMANGLE_COMPONENT_FIXED_TYPE:
   4404     case DEMANGLE_COMPONENT_TEMPLATE_HEAD:
   4405     case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM:
   4406     case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM:
   4407     case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM:
   4408     case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM:
   4409       break;
   4410 
   4411     case DEMANGLE_COMPONENT_TEMPLATE:
   4412       dpi->num_copy_templates++;
   4413       goto recurse_left_right;
   4414 
   4415     case DEMANGLE_COMPONENT_REFERENCE:
   4416     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
   4417       if (d_left (dc)->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
   4418 	dpi->num_saved_scopes++;
   4419       goto recurse_left_right;
   4420 
   4421     case DEMANGLE_COMPONENT_QUAL_NAME:
   4422     case DEMANGLE_COMPONENT_LOCAL_NAME:
   4423     case DEMANGLE_COMPONENT_TYPED_NAME:
   4424     case DEMANGLE_COMPONENT_VTABLE:
   4425     case DEMANGLE_COMPONENT_VTT:
   4426     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
   4427     case DEMANGLE_COMPONENT_TYPEINFO:
   4428     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
   4429     case DEMANGLE_COMPONENT_TYPEINFO_FN:
   4430     case DEMANGLE_COMPONENT_THUNK:
   4431     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
   4432     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
   4433     case DEMANGLE_COMPONENT_JAVA_CLASS:
   4434     case DEMANGLE_COMPONENT_GUARD:
   4435     case DEMANGLE_COMPONENT_TLS_INIT:
   4436     case DEMANGLE_COMPONENT_TLS_WRAPPER:
   4437     case DEMANGLE_COMPONENT_REFTEMP:
   4438     case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
   4439     case DEMANGLE_COMPONENT_RESTRICT:
   4440     case DEMANGLE_COMPONENT_VOLATILE:
   4441     case DEMANGLE_COMPONENT_CONST:
   4442     case DEMANGLE_COMPONENT_RESTRICT_THIS:
   4443     case DEMANGLE_COMPONENT_VOLATILE_THIS:
   4444     case DEMANGLE_COMPONENT_CONST_THIS:
   4445     case DEMANGLE_COMPONENT_REFERENCE_THIS:
   4446     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
   4447     case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:
   4448     case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
   4449     case DEMANGLE_COMPONENT_NOEXCEPT:
   4450     case DEMANGLE_COMPONENT_THROW_SPEC:
   4451     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
   4452     case DEMANGLE_COMPONENT_POINTER:
   4453     case DEMANGLE_COMPONENT_COMPLEX:
   4454     case DEMANGLE_COMPONENT_IMAGINARY:
   4455     case DEMANGLE_COMPONENT_VENDOR_TYPE:
   4456     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
   4457     case DEMANGLE_COMPONENT_ARRAY_TYPE:
   4458     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
   4459     case DEMANGLE_COMPONENT_VECTOR_TYPE:
   4460     case DEMANGLE_COMPONENT_ARGLIST:
   4461     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
   4462     case DEMANGLE_COMPONENT_TPARM_OBJ:
   4463     case DEMANGLE_COMPONENT_INITIALIZER_LIST:
   4464     case DEMANGLE_COMPONENT_CAST:
   4465     case DEMANGLE_COMPONENT_CONVERSION:
   4466     case DEMANGLE_COMPONENT_NULLARY:
   4467     case DEMANGLE_COMPONENT_UNARY:
   4468     case DEMANGLE_COMPONENT_BINARY:
   4469     case DEMANGLE_COMPONENT_BINARY_ARGS:
   4470     case DEMANGLE_COMPONENT_TRINARY:
   4471     case DEMANGLE_COMPONENT_TRINARY_ARG1:
   4472     case DEMANGLE_COMPONENT_TRINARY_ARG2:
   4473     case DEMANGLE_COMPONENT_LITERAL:
   4474     case DEMANGLE_COMPONENT_LITERAL_NEG:
   4475     case DEMANGLE_COMPONENT_VENDOR_EXPR:
   4476     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
   4477     case DEMANGLE_COMPONENT_COMPOUND_NAME:
   4478     case DEMANGLE_COMPONENT_DECLTYPE:
   4479     case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
   4480     case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
   4481     case DEMANGLE_COMPONENT_PACK_EXPANSION:
   4482     case DEMANGLE_COMPONENT_TAGGED_NAME:
   4483     case DEMANGLE_COMPONENT_CLONE:
   4484     case DEMANGLE_COMPONENT_CONSTRAINTS:
   4485     recurse_left_right:
   4486       /* PR 89394 - Check for too much recursion.  */
   4487       if (dpi->recursion > DEMANGLE_RECURSION_LIMIT)
   4488 	/* FIXME: There ought to be a way to report to the
   4489 	   user that the recursion limit has been reached.  */
   4490 	return;
   4491 
   4492       ++ dpi->recursion;
   4493       d_count_templates_scopes (dpi, d_left (dc));
   4494       d_count_templates_scopes (dpi, d_right (dc));
   4495       -- dpi->recursion;
   4496       break;
   4497 
   4498     case DEMANGLE_COMPONENT_CTOR:
   4499       d_count_templates_scopes (dpi, dc->u.s_ctor.name);
   4500       break;
   4501 
   4502     case DEMANGLE_COMPONENT_DTOR:
   4503       d_count_templates_scopes (dpi, dc->u.s_dtor.name);
   4504       break;
   4505 
   4506     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
   4507       d_count_templates_scopes (dpi, dc->u.s_extended_operator.name);
   4508       break;
   4509 
   4510     case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
   4511     case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
   4512     case DEMANGLE_COMPONENT_MODULE_ENTITY:
   4513     case DEMANGLE_COMPONENT_FRIEND:
   4514       d_count_templates_scopes (dpi, d_left (dc));
   4515       break;
   4516 
   4517     case DEMANGLE_COMPONENT_LAMBDA:
   4518     case DEMANGLE_COMPONENT_DEFAULT_ARG:
   4519       d_count_templates_scopes (dpi, dc->u.s_unary_num.sub);
   4520       break;
   4521     }
   4522 }
   4523 
   4524 /* Initialize a print information structure.  */
   4525 
   4526 static void
   4527 d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
   4528 	      void *opaque, struct demangle_component *dc)
   4529 {
   4530   dpi->len = 0;
   4531   dpi->last_char = '\0';
   4532   dpi->templates = NULL;
   4533   dpi->modifiers = NULL;
   4534   dpi->pack_index = 0;
   4535   dpi->flush_count = 0;
   4536 
   4537   dpi->callback = callback;
   4538   dpi->opaque = opaque;
   4539 
   4540   dpi->demangle_failure = 0;
   4541   dpi->recursion = 0;
   4542   dpi->lambda_tpl_parms = 0;
   4543 
   4544   dpi->component_stack = NULL;
   4545 
   4546   dpi->saved_scopes = NULL;
   4547   dpi->next_saved_scope = 0;
   4548   dpi->num_saved_scopes = 0;
   4549 
   4550   dpi->copy_templates = NULL;
   4551   dpi->next_copy_template = 0;
   4552   dpi->num_copy_templates = 0;
   4553 
   4554   d_count_templates_scopes (dpi, dc);
   4555   /* If we did not reach the recursion limit, then reset the
   4556      current recursion value back to 0, so that we can print
   4557      the templates.  */
   4558   if (dpi->recursion < DEMANGLE_RECURSION_LIMIT)
   4559     dpi->recursion = 0;
   4560   dpi->num_copy_templates *= dpi->num_saved_scopes;
   4561 
   4562   dpi->current_template = NULL;
   4563 }
   4564 
   4565 /* Indicate that an error occurred during printing, and test for error.  */
   4566 
   4567 static inline void
   4568 d_print_error (struct d_print_info *dpi)
   4569 {
   4570   dpi->demangle_failure = 1;
   4571 }
   4572 
   4573 static inline int
   4574 d_print_saw_error (struct d_print_info *dpi)
   4575 {
   4576   return dpi->demangle_failure != 0;
   4577 }
   4578 
   4579 /* Flush buffered characters to the callback.  */
   4580 
   4581 static inline void
   4582 d_print_flush (struct d_print_info *dpi)
   4583 {
   4584   dpi->buf[dpi->len] = '\0';
   4585   dpi->callback (dpi->buf, dpi->len, dpi->opaque);
   4586   dpi->len = 0;
   4587   dpi->flush_count++;
   4588 }
   4589 
   4590 /* Append characters and buffers for printing.  */
   4591 
   4592 static inline void
   4593 d_append_char (struct d_print_info *dpi, char c)
   4594 {
   4595   if (dpi->len == sizeof (dpi->buf) - 1)
   4596     d_print_flush (dpi);
   4597 
   4598   dpi->buf[dpi->len++] = c;
   4599   dpi->last_char = c;
   4600 }
   4601 
   4602 static inline void
   4603 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l)
   4604 {
   4605   size_t i;
   4606 
   4607   for (i = 0; i < l; i++)
   4608     d_append_char (dpi, s[i]);
   4609 }
   4610 
   4611 static inline void
   4612 d_append_string (struct d_print_info *dpi, const char *s)
   4613 {
   4614   d_append_buffer (dpi, s, strlen (s));
   4615 }
   4616 
   4617 static inline void
   4618 d_append_num (struct d_print_info *dpi, int l)
   4619 {
   4620   char buf[25];
   4621   sprintf (buf,"%d", l);
   4622   d_append_string (dpi, buf);
   4623 }
   4624 
   4625 static inline char
   4626 d_last_char (struct d_print_info *dpi)
   4627 {
   4628   return dpi->last_char;
   4629 }
   4630 
   4631 /* Turn components into a human readable string.  OPTIONS is the
   4632    options bits passed to the demangler.  DC is the tree to print.
   4633    CALLBACK is a function to call to flush demangled string segments
   4634    as they fill the intermediate buffer, and OPAQUE is a generalized
   4635    callback argument.  On success, this returns 1.  On failure,
   4636    it returns 0, indicating a bad parse.  It does not use heap
   4637    memory to build an output string, so cannot encounter memory
   4638    allocation failure.  */
   4639 
   4640 CP_STATIC_IF_GLIBCPP_V3
   4641 int
   4642 cplus_demangle_print_callback (int options,
   4643                                struct demangle_component *dc,
   4644                                demangle_callbackref callback, void *opaque)
   4645 {
   4646   struct d_print_info dpi;
   4647 
   4648   d_print_init (&dpi, callback, opaque, dc);
   4649 
   4650   {
   4651 #ifdef CP_DYNAMIC_ARRAYS
   4652     /* Avoid zero-length VLAs, which are prohibited by the C99 standard
   4653        and flagged as errors by Address Sanitizer.  */
   4654     __extension__ struct d_saved_scope scopes[(dpi.num_saved_scopes > 0)
   4655                                               ? dpi.num_saved_scopes : 1];
   4656     __extension__ struct d_print_template temps[(dpi.num_copy_templates > 0)
   4657                                                 ? dpi.num_copy_templates : 1];
   4658 
   4659     dpi.saved_scopes = scopes;
   4660     dpi.copy_templates = temps;
   4661 #else
   4662     dpi.saved_scopes = alloca (dpi.num_saved_scopes
   4663 			       * sizeof (*dpi.saved_scopes));
   4664     dpi.copy_templates = alloca (dpi.num_copy_templates
   4665 				 * sizeof (*dpi.copy_templates));
   4666 #endif
   4667 
   4668     d_print_comp (&dpi, options, dc);
   4669   }
   4670 
   4671   d_print_flush (&dpi);
   4672 
   4673   return ! d_print_saw_error (&dpi);
   4674 }
   4675 
   4676 /* Turn components into a human readable string.  OPTIONS is the
   4677    options bits passed to the demangler.  DC is the tree to print.
   4678    ESTIMATE is a guess at the length of the result.  This returns a
   4679    string allocated by malloc, or NULL on error.  On success, this
   4680    sets *PALC to the size of the allocated buffer.  On failure, this
   4681    sets *PALC to 0 for a bad parse, or to 1 for a memory allocation
   4682    failure.  */
   4683 
   4684 CP_STATIC_IF_GLIBCPP_V3
   4685 char *
   4686 cplus_demangle_print (int options, struct demangle_component *dc,
   4687                       int estimate, size_t *palc)
   4688 {
   4689   struct d_growable_string dgs;
   4690 
   4691   d_growable_string_init (&dgs, estimate);
   4692 
   4693   if (! cplus_demangle_print_callback (options, dc,
   4694                                        d_growable_string_callback_adapter,
   4695                                        &dgs))
   4696     {
   4697       free (dgs.buf);
   4698       *palc = 0;
   4699       return NULL;
   4700     }
   4701 
   4702   *palc = dgs.allocation_failure ? 1 : dgs.alc;
   4703   return dgs.buf;
   4704 }
   4705 
   4706 /* Returns the I'th element of the template arglist ARGS, or NULL on
   4707    failure.  If I is negative, return the entire arglist.  */
   4708 
   4709 static struct demangle_component *
   4710 d_index_template_argument (struct demangle_component *args, int i)
   4711 {
   4712   struct demangle_component *a;
   4713 
   4714   if (i < 0)
   4715     /* Print the whole argument pack.  */
   4716     return args;
   4717 
   4718   for (a = args;
   4719        a != NULL;
   4720        a = d_right (a))
   4721     {
   4722       if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
   4723 	return NULL;
   4724       if (i <= 0)
   4725 	break;
   4726       --i;
   4727     }
   4728   if (i != 0 || a == NULL)
   4729     return NULL;
   4730 
   4731   return d_left (a);
   4732 }
   4733 
   4734 /* Returns the template argument from the current context indicated by DC,
   4735    which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL.  */
   4736 
   4737 static struct demangle_component *
   4738 d_lookup_template_argument (struct d_print_info *dpi,
   4739 			    const struct demangle_component *dc)
   4740 {
   4741   if (dpi->templates == NULL)
   4742     {
   4743       d_print_error (dpi);
   4744       return NULL;
   4745     }
   4746 
   4747   return d_index_template_argument
   4748     (d_right (dpi->templates->template_decl),
   4749      dc->u.s_number.number);
   4750 }
   4751 
   4752 /* Returns a template argument pack used in DC (any will do), or NULL.  */
   4753 
   4754 static struct demangle_component *
   4755 d_find_pack (struct d_print_info *dpi,
   4756 	     const struct demangle_component *dc)
   4757 {
   4758   struct demangle_component *a;
   4759   if (dc == NULL)
   4760     return NULL;
   4761 
   4762   switch (dc->type)
   4763     {
   4764     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
   4765       a = d_lookup_template_argument (dpi, dc);
   4766       if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
   4767 	return a;
   4768       return NULL;
   4769 
   4770     case DEMANGLE_COMPONENT_PACK_EXPANSION:
   4771       return NULL;
   4772 
   4773     case DEMANGLE_COMPONENT_LAMBDA:
   4774     case DEMANGLE_COMPONENT_NAME:
   4775     case DEMANGLE_COMPONENT_TAGGED_NAME:
   4776     case DEMANGLE_COMPONENT_OPERATOR:
   4777     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
   4778     case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
   4779     case DEMANGLE_COMPONENT_SUB_STD:
   4780     case DEMANGLE_COMPONENT_CHARACTER:
   4781     case DEMANGLE_COMPONENT_FUNCTION_PARAM:
   4782     case DEMANGLE_COMPONENT_UNNAMED_TYPE:
   4783     case DEMANGLE_COMPONENT_DEFAULT_ARG:
   4784     case DEMANGLE_COMPONENT_NUMBER:
   4785       return NULL;
   4786 
   4787     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
   4788       return d_find_pack (dpi, dc->u.s_extended_operator.name);
   4789     case DEMANGLE_COMPONENT_CTOR:
   4790       return d_find_pack (dpi, dc->u.s_ctor.name);
   4791     case DEMANGLE_COMPONENT_DTOR:
   4792       return d_find_pack (dpi, dc->u.s_dtor.name);
   4793 
   4794     default:
   4795       a = d_find_pack (dpi, d_left (dc));
   4796       if (a)
   4797 	return a;
   4798       return d_find_pack (dpi, d_right (dc));
   4799     }
   4800 }
   4801 
   4802 /* Returns the length of the template argument pack DC.  */
   4803 
   4804 static int
   4805 d_pack_length (const struct demangle_component *dc)
   4806 {
   4807   int count = 0;
   4808   while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST
   4809 	 && d_left (dc) != NULL)
   4810     {
   4811       ++count;
   4812       dc = d_right (dc);
   4813     }
   4814   return count;
   4815 }
   4816 
   4817 /* Returns the number of template args in DC, expanding any pack expansions
   4818    found there.  */
   4819 
   4820 static int
   4821 d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
   4822 {
   4823   int count = 0;
   4824   for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
   4825        dc = d_right (dc))
   4826     {
   4827       struct demangle_component *elt = d_left (dc);
   4828       if (elt == NULL)
   4829 	break;
   4830       if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
   4831 	{
   4832 	  struct demangle_component *a = d_find_pack (dpi, d_left (elt));
   4833 	  count += d_pack_length (a);
   4834 	}
   4835       else
   4836 	++count;
   4837     }
   4838   return count;
   4839 }
   4840 
   4841 /* DC is a component of a mangled expression.  Print it, wrapped in parens
   4842    if needed.  */
   4843 
   4844 static void
   4845 d_print_subexpr (struct d_print_info *dpi, int options,
   4846 		 struct demangle_component *dc)
   4847 {
   4848   int simple = 0;
   4849   if (dc->type == DEMANGLE_COMPONENT_NAME
   4850       || dc->type == DEMANGLE_COMPONENT_QUAL_NAME
   4851       || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST
   4852       || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM)
   4853     simple = 1;
   4854   if (!simple)
   4855     d_append_char (dpi, '(');
   4856   d_print_comp (dpi, options, dc);
   4857   if (!simple)
   4858     d_append_char (dpi, ')');
   4859 }
   4860 
   4861 /* Save the current scope.  */
   4862 
   4863 static void
   4864 d_save_scope (struct d_print_info *dpi,
   4865 	      const struct demangle_component *container)
   4866 {
   4867   struct d_saved_scope *scope;
   4868   struct d_print_template *src, **link;
   4869 
   4870   if (dpi->next_saved_scope >= dpi->num_saved_scopes)
   4871     {
   4872       d_print_error (dpi);
   4873       return;
   4874     }
   4875   scope = &dpi->saved_scopes[dpi->next_saved_scope];
   4876   dpi->next_saved_scope++;
   4877 
   4878   scope->container = container;
   4879   link = &scope->templates;
   4880 
   4881   for (src = dpi->templates; src != NULL; src = src->next)
   4882     {
   4883       struct d_print_template *dst;
   4884 
   4885       if (dpi->next_copy_template >= dpi->num_copy_templates)
   4886 	{
   4887 	  d_print_error (dpi);
   4888 	  return;
   4889 	}
   4890       dst = &dpi->copy_templates[dpi->next_copy_template];
   4891       dpi->next_copy_template++;
   4892 
   4893       dst->template_decl = src->template_decl;
   4894       *link = dst;
   4895       link = &dst->next;
   4896     }
   4897 
   4898   *link = NULL;
   4899 }
   4900 
   4901 /* Attempt to locate a previously saved scope.  Returns NULL if no
   4902    corresponding saved scope was found.  */
   4903 
   4904 static struct d_saved_scope *
   4905 d_get_saved_scope (struct d_print_info *dpi,
   4906 		   const struct demangle_component *container)
   4907 {
   4908   int i;
   4909 
   4910   for (i = 0; i < dpi->next_saved_scope; i++)
   4911     if (dpi->saved_scopes[i].container == container)
   4912       return &dpi->saved_scopes[i];
   4913 
   4914   return NULL;
   4915 }
   4916 
   4917 /* If DC is a C++17 fold-expression, print it and return true; otherwise
   4918    return false.  */
   4919 
   4920 static int
   4921 d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
   4922 			       struct demangle_component *dc)
   4923 {
   4924   struct demangle_component *ops, *operator_, *op1, *op2;
   4925   int save_idx;
   4926 
   4927   const char *fold_code = d_left (dc)->u.s_operator.op->code;
   4928   if (fold_code[0] != 'f')
   4929     return 0;
   4930 
   4931   ops = d_right (dc);
   4932   operator_ = d_left (ops);
   4933   op1 = d_right (ops);
   4934   op2 = 0;
   4935   if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
   4936     {
   4937       op2 = d_right (op1);
   4938       op1 = d_left (op1);
   4939     }
   4940 
   4941   /* Print the whole pack.  */
   4942   save_idx = dpi->pack_index;
   4943   dpi->pack_index = -1;
   4944 
   4945   switch (fold_code[1])
   4946     {
   4947       /* Unary left fold, (... + X).  */
   4948     case 'l':
   4949       d_append_string (dpi, "(...");
   4950       d_print_expr_op (dpi, options, operator_);
   4951       d_print_subexpr (dpi, options, op1);
   4952       d_append_char (dpi, ')');
   4953       break;
   4954 
   4955       /* Unary right fold, (X + ...).  */
   4956     case 'r':
   4957       d_append_char (dpi, '(');
   4958       d_print_subexpr (dpi, options, op1);
   4959       d_print_expr_op (dpi, options, operator_);
   4960       d_append_string (dpi, "...)");
   4961       break;
   4962 
   4963       /* Binary left fold, (42 + ... + X).  */
   4964     case 'L':
   4965       /* Binary right fold, (X + ... + 42).  */
   4966     case 'R':
   4967       d_append_char (dpi, '(');
   4968       d_print_subexpr (dpi, options, op1);
   4969       d_print_expr_op (dpi, options, operator_);
   4970       d_append_string (dpi, "...");
   4971       d_print_expr_op (dpi, options, operator_);
   4972       d_print_subexpr (dpi, options, op2);
   4973       d_append_char (dpi, ')');
   4974       break;
   4975     }
   4976 
   4977   dpi->pack_index = save_idx;
   4978   return 1;
   4979 }
   4980 
   4981 /* True iff DC represents a C99-style designated initializer.  */
   4982 
   4983 static int
   4984 is_designated_init (struct demangle_component *dc)
   4985 {
   4986   if (dc->type != DEMANGLE_COMPONENT_BINARY
   4987       && dc->type != DEMANGLE_COMPONENT_TRINARY)
   4988     return 0;
   4989 
   4990   struct demangle_component *op = d_left (dc);
   4991   const char *code = op->u.s_operator.op->code;
   4992   return (code[0] == 'd'
   4993 	  && (code[1] == 'i' || code[1] == 'x' || code[1] == 'X'));
   4994 }
   4995 
   4996 /* If DC represents a C99-style designated initializer, print it and return
   4997    true; otherwise, return false.  */
   4998 
   4999 static int
   5000 d_maybe_print_designated_init (struct d_print_info *dpi, int options,
   5001 			       struct demangle_component *dc)
   5002 {
   5003   if (!is_designated_init (dc))
   5004     return 0;
   5005 
   5006   const char *code = d_left (dc)->u.s_operator.op->code;
   5007 
   5008   struct demangle_component *operands = d_right (dc);
   5009   struct demangle_component *op1 = d_left (operands);
   5010   struct demangle_component *op2 = d_right (operands);
   5011 
   5012   if (code[1] == 'i')
   5013     d_append_char (dpi, '.');
   5014   else
   5015     d_append_char (dpi, '[');
   5016 
   5017   d_print_comp (dpi, options, op1);
   5018   if (code[1] == 'X')
   5019     {
   5020       d_append_string (dpi, " ... ");
   5021       d_print_comp (dpi, options, d_left (op2));
   5022       op2 = d_right (op2);
   5023     }
   5024   if (code[1] != 'i')
   5025     d_append_char (dpi, ']');
   5026   if (is_designated_init (op2))
   5027     {
   5028       /* Don't put '=' or '(' between chained designators.  */
   5029       d_print_comp (dpi, options, op2);
   5030     }
   5031   else
   5032     {
   5033       d_append_char (dpi, '=');
   5034       d_print_subexpr (dpi, options, op2);
   5035     }
   5036   return 1;
   5037 }
   5038 
   5039 static void
   5040 d_print_lambda_parm_name (struct d_print_info *dpi, int type, unsigned index)
   5041 {
   5042   const char *str;
   5043   switch (type)
   5044     {
   5045     default:
   5046       dpi->demangle_failure = 1;
   5047       str = "";
   5048       break;
   5049 
   5050     case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM:
   5051       str = "$T";
   5052       break;
   5053 
   5054     case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM:
   5055       str = "$N";
   5056       break;
   5057 
   5058     case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM:
   5059       str = "$TT";
   5060       break;
   5061     }
   5062   d_append_string (dpi, str);
   5063   d_append_num (dpi, index);
   5064 }
   5065 
   5066 /* Subroutine to handle components.  */
   5067 
   5068 static void
   5069 d_print_comp_inner (struct d_print_info *dpi, int options,
   5070 		    struct demangle_component *dc)
   5071 {
   5072   /* Magic variable to let reference smashing skip over the next modifier
   5073      without needing to modify *dc.  */
   5074   struct demangle_component *mod_inner = NULL;
   5075 
   5076   /* Variable used to store the current templates while a previously
   5077      captured scope is used.  */
   5078   struct d_print_template *saved_templates;
   5079 
   5080   /* Nonzero if templates have been stored in the above variable.  */
   5081   int need_template_restore = 0;
   5082 
   5083   if (dc == NULL)
   5084     {
   5085       d_print_error (dpi);
   5086       return;
   5087     }
   5088   if (d_print_saw_error (dpi))
   5089     return;
   5090 
   5091   switch (dc->type)
   5092     {
   5093     case DEMANGLE_COMPONENT_NAME:
   5094       if ((options & DMGL_JAVA) == 0)
   5095 	d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len);
   5096       else
   5097 	d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len);
   5098       return;
   5099 
   5100     case DEMANGLE_COMPONENT_TAGGED_NAME:
   5101       d_print_comp (dpi, options, d_left (dc));
   5102       d_append_string (dpi, "[abi:");
   5103       d_print_comp (dpi, options, d_right (dc));
   5104       d_append_char (dpi, ']');
   5105       return;
   5106 
   5107     case DEMANGLE_COMPONENT_STRUCTURED_BINDING:
   5108       d_append_char (dpi, '[');
   5109       for (;;)
   5110 	{
   5111 	  d_print_comp (dpi, options, d_left (dc));
   5112 	  dc = d_right (dc);
   5113 	  if (!dc)
   5114 	    break;
   5115 	  d_append_string (dpi, ", ");
   5116 	}
   5117       d_append_char (dpi, ']');
   5118       return;
   5119 
   5120     case DEMANGLE_COMPONENT_MODULE_ENTITY:
   5121       d_print_comp (dpi, options, d_left (dc));
   5122       d_append_char (dpi, '@');
   5123       d_print_comp (dpi, options, d_right (dc));
   5124       return;
   5125 
   5126     case DEMANGLE_COMPONENT_MODULE_NAME:
   5127     case DEMANGLE_COMPONENT_MODULE_PARTITION:
   5128       {
   5129 	if (d_left (dc))
   5130 	  d_print_comp (dpi, options, d_left (dc));
   5131 	char c = dc->type == DEMANGLE_COMPONENT_MODULE_PARTITION
   5132 	  ? ':' : d_left (dc) ? '.' : 0;
   5133 	if (c)
   5134 	  d_append_char (dpi, c);
   5135 	d_print_comp (dpi, options, d_right (dc));
   5136       }
   5137       return;
   5138 
   5139     case DEMANGLE_COMPONENT_QUAL_NAME:
   5140     case DEMANGLE_COMPONENT_LOCAL_NAME:
   5141       d_print_comp (dpi, options, d_left (dc));
   5142       if ((options & DMGL_JAVA) == 0)
   5143 	d_append_string (dpi, "::");
   5144       else
   5145 	d_append_char (dpi, '.');
   5146       {
   5147 	struct demangle_component *local_name = d_right (dc);
   5148 	if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
   5149 	  {
   5150 	    d_append_string (dpi, "{default arg#");
   5151 	    d_append_num (dpi, local_name->u.s_unary_num.num + 1);
   5152 	    d_append_string (dpi, "}::");
   5153 	    local_name = local_name->u.s_unary_num.sub;
   5154 	  }
   5155 	d_print_comp (dpi, options, local_name);
   5156       }
   5157       return;
   5158 
   5159     case DEMANGLE_COMPONENT_TYPED_NAME:
   5160       {
   5161 	struct d_print_mod *hold_modifiers;
   5162 	struct demangle_component *typed_name;
   5163 	struct d_print_mod adpm[4];
   5164 	unsigned int i;
   5165 	struct d_print_template dpt;
   5166 
   5167 	/* Pass the name down to the type so that it can be printed in
   5168 	   the right place for the type.  We also have to pass down
   5169 	   any CV-qualifiers, which apply to the this parameter.  */
   5170 	hold_modifiers = dpi->modifiers;
   5171 	dpi->modifiers = 0;
   5172 	i = 0;
   5173 	typed_name = d_left (dc);
   5174 	while (typed_name != NULL)
   5175 	  {
   5176 	    if (i >= sizeof adpm / sizeof adpm[0])
   5177 	      {
   5178 		d_print_error (dpi);
   5179 		return;
   5180 	      }
   5181 
   5182 	    adpm[i].next = dpi->modifiers;
   5183 	    dpi->modifiers = &adpm[i];
   5184 	    adpm[i].mod = typed_name;
   5185 	    adpm[i].printed = 0;
   5186 	    adpm[i].templates = dpi->templates;
   5187 	    ++i;
   5188 
   5189 	    if (!is_fnqual_component_type (typed_name->type))
   5190 	      break;
   5191 
   5192 	    typed_name = d_left (typed_name);
   5193 	  }
   5194 
   5195 	if (typed_name == NULL)
   5196 	  {
   5197 	    d_print_error (dpi);
   5198 	    return;
   5199 	  }
   5200 
   5201 	/* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
   5202 	   there may be CV-qualifiers on its right argument which
   5203 	   really apply here; this happens when parsing a class that
   5204 	   is local to a function.  */
   5205 	if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME)
   5206 	  {
   5207 	    typed_name = d_right (typed_name);
   5208 	    if (typed_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
   5209 	      typed_name = typed_name->u.s_unary_num.sub;
   5210 	    while (typed_name != NULL
   5211 		   && is_fnqual_component_type (typed_name->type))
   5212 	      {
   5213 		if (i >= sizeof adpm / sizeof adpm[0])
   5214 		  {
   5215 		    d_print_error (dpi);
   5216 		    return;
   5217 		  }
   5218 
   5219 		adpm[i] = adpm[i - 1];
   5220 		adpm[i].next = &adpm[i - 1];
   5221 		dpi->modifiers = &adpm[i];
   5222 
   5223 		adpm[i - 1].mod = typed_name;
   5224 		adpm[i - 1].printed = 0;
   5225 		adpm[i - 1].templates = dpi->templates;
   5226 		++i;
   5227 
   5228 		typed_name = d_left (typed_name);
   5229 	      }
   5230 	    if (typed_name == NULL)
   5231 	      {
   5232 		d_print_error (dpi);
   5233 		return;
   5234 	      }
   5235 	  }
   5236 
   5237 	/* If typed_name is a template, then it applies to the
   5238 	   function type as well.  */
   5239 	if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
   5240 	  {
   5241 	    dpt.next = dpi->templates;
   5242 	    dpi->templates = &dpt;
   5243 	    dpt.template_decl = typed_name;
   5244 
   5245 	    /* Constraints are mangled as part of the template argument list,
   5246 	       so they wrap the _TEMPLATE_ARGLIST.  But
   5247 	       d_lookup_template_argument expects the RHS of _TEMPLATE to be
   5248 	       the _ARGLIST, and constraints need to refer to these args.  So
   5249 	       move the _CONSTRAINTS out of the _TEMPLATE and onto the type.
   5250 	       This will result in them being printed after the () like a
   5251 	       trailing requires-clause, but that seems like our best option
   5252 	       given that we aren't printing a template-head.  */
   5253 	    struct demangle_component *tnr = d_right (typed_name);
   5254 	    if (tnr->type == DEMANGLE_COMPONENT_CONSTRAINTS)
   5255 	      {
   5256 		d_right (typed_name) = d_left (tnr);
   5257 		d_left (tnr) = d_right (dc);
   5258 		d_right (dc) = tnr;
   5259 	      }
   5260 	  }
   5261 
   5262 	d_print_comp (dpi, options, d_right (dc));
   5263 
   5264 	if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE)
   5265 	  dpi->templates = dpt.next;
   5266 
   5267 	/* If the modifiers didn't get printed by the type, print them
   5268 	   now.  */
   5269 	while (i > 0)
   5270 	  {
   5271 	    --i;
   5272 	    if (! adpm[i].printed)
   5273 	      {
   5274 		d_append_char (dpi, ' ');
   5275 		d_print_mod (dpi, options, adpm[i].mod);
   5276 	      }
   5277 	  }
   5278 
   5279 	dpi->modifiers = hold_modifiers;
   5280 
   5281 	return;
   5282       }
   5283 
   5284     case DEMANGLE_COMPONENT_TEMPLATE:
   5285       {
   5286 	struct d_print_mod *hold_dpm;
   5287 	struct demangle_component *dcl;
   5288 	const struct demangle_component *hold_current;
   5289 
   5290 	/* This template may need to be referenced by a cast operator
   5291 	   contained in its subtree.  */
   5292 	hold_current = dpi->current_template;
   5293 	dpi->current_template = dc;
   5294 
   5295 	/* Don't push modifiers into a template definition.  Doing so
   5296 	   could give the wrong definition for a template argument.
   5297 	   Instead, treat the template essentially as a name.  */
   5298 
   5299 	hold_dpm = dpi->modifiers;
   5300 	dpi->modifiers = NULL;
   5301 
   5302         dcl = d_left (dc);
   5303 
   5304         if ((options & DMGL_JAVA) != 0
   5305             && dcl->type == DEMANGLE_COMPONENT_NAME
   5306             && dcl->u.s_name.len == 6
   5307             && strncmp (dcl->u.s_name.s, "JArray", 6) == 0)
   5308           {
   5309             /* Special-case Java arrays, so that JArray<TYPE> appears
   5310                instead as TYPE[].  */
   5311 
   5312             d_print_comp (dpi, options, d_right (dc));
   5313             d_append_string (dpi, "[]");
   5314           }
   5315         else
   5316           {
   5317 	    d_print_comp (dpi, options, dcl);
   5318 	    if (d_last_char (dpi) == '<')
   5319 	      d_append_char (dpi, ' ');
   5320 	    d_append_char (dpi, '<');
   5321 	    d_print_comp (dpi, options, d_right (dc));
   5322 	    /* Avoid generating two consecutive '>' characters, to avoid
   5323 	       the C++ syntactic ambiguity.  */
   5324 	    if (d_last_char (dpi) == '>')
   5325 	      d_append_char (dpi, ' ');
   5326 	    d_append_char (dpi, '>');
   5327           }
   5328 
   5329 	dpi->modifiers = hold_dpm;
   5330 	dpi->current_template = hold_current;
   5331 
   5332 	return;
   5333       }
   5334 
   5335     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
   5336       if (dpi->lambda_tpl_parms > dc->u.s_number.number + 1)
   5337 	{
   5338 	  const struct demangle_component *a
   5339 	    = d_left (dpi->templates->template_decl);
   5340 	  unsigned c;
   5341 	  for (c = dc->u.s_number.number; a && c; c--)
   5342 	    a = d_right (a);
   5343 	  if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM)
   5344 	    a = d_left (a);
   5345 	  if (!a)
   5346 	    dpi->demangle_failure = 1;
   5347 	  else
   5348 	    d_print_lambda_parm_name (dpi, a->type, dc->u.s_number.number);
   5349 	}
   5350       else if (dpi->lambda_tpl_parms)
   5351 	{
   5352 	  /* Show the template parm index, as that's how g++ displays
   5353 	     these, and future proofs us against potential
   5354 	     '[]<typename T> (T *a, T *b) {...}'.  */
   5355 	  d_append_buffer (dpi, "auto:", 5);
   5356 	  d_append_num (dpi, dc->u.s_number.number + 1);
   5357 	}
   5358       else
   5359 	{
   5360 	  struct d_print_template *hold_dpt;
   5361 	  struct demangle_component *a = d_lookup_template_argument (dpi, dc);
   5362 
   5363 	  if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
   5364 	    a = d_index_template_argument (a, dpi->pack_index);
   5365 
   5366 	  if (a == NULL)
   5367 	    {
   5368 	      d_print_error (dpi);
   5369 	      return;
   5370 	    }
   5371 
   5372 	  /* While processing this parameter, we need to pop the list
   5373 	     of templates.  This is because the template parameter may
   5374 	     itself be a reference to a parameter of an outer
   5375 	     template.  */
   5376 
   5377 	  hold_dpt = dpi->templates;
   5378 	  dpi->templates = hold_dpt->next;
   5379 
   5380 	  d_print_comp (dpi, options, a);
   5381 
   5382 	  dpi->templates = hold_dpt;
   5383 	}
   5384       return;
   5385 
   5386     case DEMANGLE_COMPONENT_TPARM_OBJ:
   5387       d_append_string (dpi, "template parameter object for ");
   5388       d_print_comp (dpi, options, d_left (dc));
   5389       return;
   5390 
   5391     case DEMANGLE_COMPONENT_CTOR:
   5392       d_print_comp (dpi, options, dc->u.s_ctor.name);
   5393       return;
   5394 
   5395     case DEMANGLE_COMPONENT_DTOR:
   5396       d_append_char (dpi, '~');
   5397       d_print_comp (dpi, options, dc->u.s_dtor.name);
   5398       return;
   5399 
   5400     case DEMANGLE_COMPONENT_MODULE_INIT:
   5401       d_append_string (dpi, "initializer for module ");
   5402       d_print_comp (dpi, options, d_left (dc));
   5403       return;
   5404 
   5405     case DEMANGLE_COMPONENT_VTABLE:
   5406       d_append_string (dpi, "vtable for ");
   5407       d_print_comp (dpi, options, d_left (dc));
   5408       return;
   5409 
   5410     case DEMANGLE_COMPONENT_VTT:
   5411       d_append_string (dpi, "VTT for ");
   5412       d_print_comp (dpi, options, d_left (dc));
   5413       return;
   5414 
   5415     case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
   5416       d_append_string (dpi, "construction vtable for ");
   5417       d_print_comp (dpi, options, d_left (dc));
   5418       d_append_string (dpi, "-in-");
   5419       d_print_comp (dpi, options, d_right (dc));
   5420       return;
   5421 
   5422     case DEMANGLE_COMPONENT_TYPEINFO:
   5423       d_append_string (dpi, "typeinfo for ");
   5424       d_print_comp (dpi, options, d_left (dc));
   5425       return;
   5426 
   5427     case DEMANGLE_COMPONENT_TYPEINFO_NAME:
   5428       d_append_string (dpi, "typeinfo name for ");
   5429       d_print_comp (dpi, options, d_left (dc));
   5430       return;
   5431 
   5432     case DEMANGLE_COMPONENT_TYPEINFO_FN:
   5433       d_append_string (dpi, "typeinfo fn for ");
   5434       d_print_comp (dpi, options, d_left (dc));
   5435       return;
   5436 
   5437     case DEMANGLE_COMPONENT_THUNK:
   5438       d_append_string (dpi, "non-virtual thunk to ");
   5439       d_print_comp (dpi, options, d_left (dc));
   5440       return;
   5441 
   5442     case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
   5443       d_append_string (dpi, "virtual thunk to ");
   5444       d_print_comp (dpi, options, d_left (dc));
   5445       return;
   5446 
   5447     case DEMANGLE_COMPONENT_COVARIANT_THUNK:
   5448       d_append_string (dpi, "covariant return thunk to ");
   5449       d_print_comp (dpi, options, d_left (dc));
   5450       return;
   5451 
   5452     case DEMANGLE_COMPONENT_JAVA_CLASS:
   5453       d_append_string (dpi, "java Class for ");
   5454       d_print_comp (dpi, options, d_left (dc));
   5455       return;
   5456 
   5457     case DEMANGLE_COMPONENT_GUARD:
   5458       d_append_string (dpi, "guard variable for ");
   5459       d_print_comp (dpi, options, d_left (dc));
   5460       return;
   5461 
   5462     case DEMANGLE_COMPONENT_TLS_INIT:
   5463       d_append_string (dpi, "TLS init function for ");
   5464       d_print_comp (dpi, options, d_left (dc));
   5465       return;
   5466 
   5467     case DEMANGLE_COMPONENT_TLS_WRAPPER:
   5468       d_append_string (dpi, "TLS wrapper function for ");
   5469       d_print_comp (dpi, options, d_left (dc));
   5470       return;
   5471 
   5472     case DEMANGLE_COMPONENT_REFTEMP:
   5473       d_append_string (dpi, "reference temporary #");
   5474       d_print_comp (dpi, options, d_right (dc));
   5475       d_append_string (dpi, " for ");
   5476       d_print_comp (dpi, options, d_left (dc));
   5477       return;
   5478 
   5479     case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
   5480       d_append_string (dpi, "hidden alias for ");
   5481       d_print_comp (dpi, options, d_left (dc));
   5482       return;
   5483 
   5484     case DEMANGLE_COMPONENT_TRANSACTION_CLONE:
   5485       d_append_string (dpi, "transaction clone for ");
   5486       d_print_comp (dpi, options, d_left (dc));
   5487       return;
   5488 
   5489     case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE:
   5490       d_append_string (dpi, "non-transaction clone for ");
   5491       d_print_comp (dpi, options, d_left (dc));
   5492       return;
   5493 
   5494     case DEMANGLE_COMPONENT_SUB_STD:
   5495       d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
   5496       return;
   5497 
   5498     case DEMANGLE_COMPONENT_RESTRICT:
   5499     case DEMANGLE_COMPONENT_VOLATILE:
   5500     case DEMANGLE_COMPONENT_CONST:
   5501       {
   5502 	struct d_print_mod *pdpm;
   5503 
   5504 	/* When printing arrays, it's possible to have cases where the
   5505 	   same CV-qualifier gets pushed on the stack multiple times.
   5506 	   We only need to print it once.  */
   5507 
   5508 	for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next)
   5509 	  {
   5510 	    if (! pdpm->printed)
   5511 	      {
   5512 		if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT
   5513 		    && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE
   5514 		    && pdpm->mod->type != DEMANGLE_COMPONENT_CONST)
   5515 		  break;
   5516 		if (pdpm->mod->type == dc->type)
   5517 		  {
   5518 		    d_print_comp (dpi, options, d_left (dc));
   5519 		    return;
   5520 		  }
   5521 	      }
   5522 	  }
   5523       }
   5524       goto modifier;
   5525 
   5526     case DEMANGLE_COMPONENT_REFERENCE:
   5527     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
   5528       {
   5529 	/* Handle reference smashing: & + && = &.  */
   5530 	struct demangle_component *sub = d_left (dc);
   5531 	if (!dpi->lambda_tpl_parms
   5532 	    && sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
   5533 	  {
   5534 	    struct d_saved_scope *scope = d_get_saved_scope (dpi, sub);
   5535 	    struct demangle_component *a;
   5536 
   5537 	    if (scope == NULL)
   5538 	      {
   5539 		/* This is the first time SUB has been traversed.
   5540 		   We need to capture the current templates so
   5541 		   they can be restored if SUB is reentered as a
   5542 		   substitution.  */
   5543 		d_save_scope (dpi, sub);
   5544 		if (d_print_saw_error (dpi))
   5545 		  return;
   5546 	      }
   5547 	    else
   5548 	      {
   5549 		const struct d_component_stack *dcse;
   5550 		int found_self_or_parent = 0;
   5551 
   5552 		/* This traversal is reentering SUB as a substition.
   5553 		   If we are not beneath SUB or DC in the tree then we
   5554 		   need to restore SUB's template stack temporarily.  */
   5555 		for (dcse = dpi->component_stack; dcse != NULL;
   5556 		     dcse = dcse->parent)
   5557 		  {
   5558 		    if (dcse->dc == sub
   5559 			|| (dcse->dc == dc
   5560 			    && dcse != dpi->component_stack))
   5561 		      {
   5562 			found_self_or_parent = 1;
   5563 			break;
   5564 		      }
   5565 		  }
   5566 
   5567 		if (!found_self_or_parent)
   5568 		  {
   5569 		    saved_templates = dpi->templates;
   5570 		    dpi->templates = scope->templates;
   5571 		    need_template_restore = 1;
   5572 		  }
   5573 	      }
   5574 
   5575 	    a = d_lookup_template_argument (dpi, sub);
   5576 	    if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
   5577 	      a = d_index_template_argument (a, dpi->pack_index);
   5578 
   5579 	    if (a == NULL)
   5580 	      {
   5581 		if (need_template_restore)
   5582 		  dpi->templates = saved_templates;
   5583 
   5584 		d_print_error (dpi);
   5585 		return;
   5586 	      }
   5587 
   5588 	    sub = a;
   5589 	  }
   5590 
   5591 	if (sub->type == DEMANGLE_COMPONENT_REFERENCE
   5592 	    || sub->type == dc->type)
   5593 	  dc = sub;
   5594 	else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE)
   5595 	  mod_inner = d_left (sub);
   5596       }
   5597       /* Fall through.  */
   5598 
   5599     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
   5600     case DEMANGLE_COMPONENT_POINTER:
   5601     case DEMANGLE_COMPONENT_COMPLEX:
   5602     case DEMANGLE_COMPONENT_IMAGINARY:
   5603     FNQUAL_COMPONENT_CASE:
   5604     modifier:
   5605       {
   5606 	/* We keep a list of modifiers on the stack.  */
   5607 	struct d_print_mod dpm;
   5608 
   5609 	dpm.next = dpi->modifiers;
   5610 	dpi->modifiers = &dpm;
   5611 	dpm.mod = dc;
   5612 	dpm.printed = 0;
   5613 	dpm.templates = dpi->templates;
   5614 
   5615 	if (!mod_inner)
   5616 	  mod_inner = d_left (dc);
   5617 
   5618 	d_print_comp (dpi, options, mod_inner);
   5619 
   5620 	/* If the modifier didn't get printed by the type, print it
   5621 	   now.  */
   5622 	if (! dpm.printed)
   5623 	  d_print_mod (dpi, options, dc);
   5624 
   5625 	dpi->modifiers = dpm.next;
   5626 
   5627 	if (need_template_restore)
   5628 	  dpi->templates = saved_templates;
   5629 
   5630 	return;
   5631       }
   5632 
   5633     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
   5634       if ((options & DMGL_JAVA) == 0)
   5635 	d_append_buffer (dpi, dc->u.s_builtin.type->name,
   5636 			 dc->u.s_builtin.type->len);
   5637       else
   5638 	d_append_buffer (dpi, dc->u.s_builtin.type->java_name,
   5639 			 dc->u.s_builtin.type->java_len);
   5640       return;
   5641 
   5642     case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
   5643       d_append_buffer (dpi, dc->u.s_extended_builtin.type->name,
   5644 		       dc->u.s_extended_builtin.type->len);
   5645       d_append_num (dpi, dc->u.s_extended_builtin.arg);
   5646       if (dc->u.s_extended_builtin.suffix)
   5647 	d_append_buffer (dpi, &dc->u.s_extended_builtin.suffix, 1);
   5648       return;
   5649 
   5650     case DEMANGLE_COMPONENT_VENDOR_TYPE:
   5651       d_print_comp (dpi, options, d_left (dc));
   5652       return;
   5653 
   5654     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
   5655       {
   5656 	if ((options & DMGL_RET_POSTFIX) != 0)
   5657 	  d_print_function_type (dpi,
   5658 				 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
   5659 				 dc, dpi->modifiers);
   5660 
   5661 	/* Print return type if present */
   5662 	if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0)
   5663 	  d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
   5664 			d_left (dc));
   5665 	else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0)
   5666 	  {
   5667 	    struct d_print_mod dpm;
   5668 
   5669 	    /* We must pass this type down as a modifier in order to
   5670 	       print it in the right location.  */
   5671 	    dpm.next = dpi->modifiers;
   5672 	    dpi->modifiers = &dpm;
   5673 	    dpm.mod = dc;
   5674 	    dpm.printed = 0;
   5675 	    dpm.templates = dpi->templates;
   5676 
   5677 	    d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
   5678 			  d_left (dc));
   5679 
   5680 	    dpi->modifiers = dpm.next;
   5681 
   5682 	    if (dpm.printed)
   5683 	      return;
   5684 
   5685 	    /* In standard prefix notation, there is a space between the
   5686 	       return type and the function signature.  */
   5687 	    if ((options & DMGL_RET_POSTFIX) == 0)
   5688 	      d_append_char (dpi, ' ');
   5689 	  }
   5690 
   5691 	if ((options & DMGL_RET_POSTFIX) == 0)
   5692 	  d_print_function_type (dpi,
   5693 				 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP),
   5694 				 dc, dpi->modifiers);
   5695 
   5696 	return;
   5697       }
   5698 
   5699     case DEMANGLE_COMPONENT_ARRAY_TYPE:
   5700       {
   5701 	struct d_print_mod *hold_modifiers;
   5702 	struct d_print_mod adpm[4];
   5703 	unsigned int i;
   5704 	struct d_print_mod *pdpm;
   5705 
   5706 	/* We must pass this type down as a modifier in order to print
   5707 	   multi-dimensional arrays correctly.  If the array itself is
   5708 	   CV-qualified, we act as though the element type were
   5709 	   CV-qualified.  We do this by copying the modifiers down
   5710 	   rather than fiddling pointers, so that we don't wind up
   5711 	   with a d_print_mod higher on the stack pointing into our
   5712 	   stack frame after we return.  */
   5713 
   5714 	hold_modifiers = dpi->modifiers;
   5715 
   5716 	adpm[0].next = hold_modifiers;
   5717 	dpi->modifiers = &adpm[0];
   5718 	adpm[0].mod = dc;
   5719 	adpm[0].printed = 0;
   5720 	adpm[0].templates = dpi->templates;
   5721 
   5722 	i = 1;
   5723 	pdpm = hold_modifiers;
   5724 	while (pdpm != NULL
   5725 	       && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT
   5726 		   || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE
   5727 		   || pdpm->mod->type == DEMANGLE_COMPONENT_CONST))
   5728 	  {
   5729 	    if (! pdpm->printed)
   5730 	      {
   5731 		if (i >= sizeof adpm / sizeof adpm[0])
   5732 		  {
   5733 		    d_print_error (dpi);
   5734 		    return;
   5735 		  }
   5736 
   5737 		adpm[i] = *pdpm;
   5738 		adpm[i].next = dpi->modifiers;
   5739 		dpi->modifiers = &adpm[i];
   5740 		pdpm->printed = 1;
   5741 		++i;
   5742 	      }
   5743 
   5744 	    pdpm = pdpm->next;
   5745 	  }
   5746 
   5747 	d_print_comp (dpi, options, d_right (dc));
   5748 
   5749 	dpi->modifiers = hold_modifiers;
   5750 
   5751 	if (adpm[0].printed)
   5752 	  return;
   5753 
   5754 	while (i > 1)
   5755 	  {
   5756 	    --i;
   5757 	    d_print_mod (dpi, options, adpm[i].mod);
   5758 	  }
   5759 
   5760 	d_print_array_type (dpi, options, dc, dpi->modifiers);
   5761 
   5762 	return;
   5763       }
   5764 
   5765     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
   5766     case DEMANGLE_COMPONENT_VECTOR_TYPE:
   5767       {
   5768 	struct d_print_mod dpm;
   5769 
   5770 	dpm.next = dpi->modifiers;
   5771 	dpi->modifiers = &dpm;
   5772 	dpm.mod = dc;
   5773 	dpm.printed = 0;
   5774 	dpm.templates = dpi->templates;
   5775 
   5776 	d_print_comp (dpi, options, d_right (dc));
   5777 
   5778 	/* If the modifier didn't get printed by the type, print it
   5779 	   now.  */
   5780 	if (! dpm.printed)
   5781 	  d_print_mod (dpi, options, dc);
   5782 
   5783 	dpi->modifiers = dpm.next;
   5784 
   5785 	return;
   5786       }
   5787 
   5788     case DEMANGLE_COMPONENT_ARGLIST:
   5789     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
   5790       if (d_left (dc) != NULL)
   5791 	d_print_comp (dpi, options, d_left (dc));
   5792       if (d_right (dc) != NULL)
   5793 	{
   5794 	  size_t len;
   5795 	  unsigned long int flush_count;
   5796 	  /* Make sure ", " isn't flushed by d_append_string, otherwise
   5797 	     dpi->len -= 2 wouldn't work.  */
   5798 	  if (dpi->len >= sizeof (dpi->buf) - 2)
   5799 	    d_print_flush (dpi);
   5800 	  d_append_string (dpi, ", ");
   5801 	  len = dpi->len;
   5802 	  flush_count = dpi->flush_count;
   5803 	  d_print_comp (dpi, options, d_right (dc));
   5804 	  /* If that didn't print anything (which can happen with empty
   5805 	     template argument packs), remove the comma and space.  */
   5806 	  if (dpi->flush_count == flush_count && dpi->len == len)
   5807 	    dpi->len -= 2;
   5808 	}
   5809       return;
   5810 
   5811     case DEMANGLE_COMPONENT_INITIALIZER_LIST:
   5812       {
   5813 	struct demangle_component *type = d_left (dc);
   5814 	struct demangle_component *list = d_right (dc);
   5815 
   5816 	if (type)
   5817 	  d_print_comp (dpi, options, type);
   5818 	d_append_char (dpi, '{');
   5819 	d_print_comp (dpi, options, list);
   5820 	d_append_char (dpi, '}');
   5821       }
   5822       return;
   5823 
   5824     case DEMANGLE_COMPONENT_OPERATOR:
   5825       {
   5826 	const struct demangle_operator_info *op = dc->u.s_operator.op;
   5827 	int len = op->len;
   5828 
   5829 	d_append_string (dpi, "operator");
   5830 	/* Add a space before new/delete.  */
   5831 	if (IS_LOWER (op->name[0]))
   5832 	  d_append_char (dpi, ' ');
   5833 	/* Omit a trailing space.  */
   5834 	if (op->name[len-1] == ' ')
   5835 	  --len;
   5836 	d_append_buffer (dpi, op->name, len);
   5837 	return;
   5838       }
   5839 
   5840     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
   5841       d_append_string (dpi, "operator ");
   5842       d_print_comp (dpi, options, dc->u.s_extended_operator.name);
   5843       return;
   5844 
   5845     case DEMANGLE_COMPONENT_CONVERSION:
   5846       d_append_string (dpi, "operator ");
   5847       d_print_conversion (dpi, options, dc);
   5848       return;
   5849 
   5850     case DEMANGLE_COMPONENT_NULLARY:
   5851       d_print_expr_op (dpi, options, d_left (dc));
   5852       return;
   5853 
   5854     case DEMANGLE_COMPONENT_UNARY:
   5855       {
   5856 	struct demangle_component *op = d_left (dc);
   5857 	struct demangle_component *operand = d_right (dc);
   5858 	const char *code = NULL;
   5859 
   5860 	if (op->type == DEMANGLE_COMPONENT_OPERATOR)
   5861 	  {
   5862 	    code = op->u.s_operator.op->code;
   5863 	    if (!strcmp (code, "ad"))
   5864 	      {
   5865 		/* Don't print the argument list for the address of a
   5866 		   function.  */
   5867 		if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME
   5868 		    && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME
   5869 		    && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
   5870 		  operand = d_left (operand);
   5871 	      }
   5872 	    if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS)
   5873 	      {
   5874 		/* This indicates a suffix operator.  */
   5875 		operand = d_left (operand);
   5876 		d_print_subexpr (dpi, options, operand);
   5877 		d_print_expr_op (dpi, options, op);
   5878 		return;
   5879 	      }
   5880 	  }
   5881 
   5882 	/* For sizeof..., just print the pack length.  */
   5883 	if (code && !strcmp (code, "sZ"))
   5884 	  {
   5885 	    struct demangle_component *a = d_find_pack (dpi, operand);
   5886 	    int len = d_pack_length (a);
   5887 	    d_append_num (dpi, len);
   5888 	    return;
   5889 	  }
   5890 	else if (code && !strcmp (code, "sP"))
   5891 	  {
   5892 	    int len = d_args_length (dpi, operand);
   5893 	    d_append_num (dpi, len);
   5894 	    return;
   5895 	  }
   5896 
   5897 	if (op->type != DEMANGLE_COMPONENT_CAST)
   5898 	  d_print_expr_op (dpi, options, op);
   5899 	else
   5900 	  {
   5901 	    d_append_char (dpi, '(');
   5902 	    d_print_cast (dpi, options, op);
   5903 	    d_append_char (dpi, ')');
   5904 	  }
   5905 	if (code && !strcmp (code, "gs"))
   5906 	  /* Avoid parens after '::'.  */
   5907 	  d_print_comp (dpi, options, operand);
   5908 	else if (code && (!strcmp (code, "st") || !strcmp (code, "nx")))
   5909 	  /* Always print parens for sizeof (type) and noexcept(expr).  */
   5910 	  {
   5911 	    d_append_char (dpi, '(');
   5912 	    d_print_comp (dpi, options, operand);
   5913 	    d_append_char (dpi, ')');
   5914 	  }
   5915 	else
   5916 	  d_print_subexpr (dpi, options, operand);
   5917       }
   5918       return;
   5919 
   5920     case DEMANGLE_COMPONENT_BINARY:
   5921       if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS)
   5922 	{
   5923 	  d_print_error (dpi);
   5924 	  return;
   5925 	}
   5926 
   5927       if (op_is_new_cast (d_left (dc)))
   5928 	{
   5929 	  d_print_expr_op (dpi, options, d_left (dc));
   5930 	  d_append_char (dpi, '<');
   5931 	  d_print_comp (dpi, options, d_left (d_right (dc)));
   5932 	  d_append_string (dpi, ">(");
   5933 	  d_print_comp (dpi, options, d_right (d_right (dc)));
   5934 	  d_append_char (dpi, ')');
   5935 	  return;
   5936 	}
   5937 
   5938       if (d_maybe_print_fold_expression (dpi, options, dc))
   5939 	return;
   5940 
   5941       if (d_maybe_print_designated_init (dpi, options, dc))
   5942 	return;
   5943 
   5944       /* We wrap an expression which uses the greater-than operator in
   5945 	 an extra layer of parens so that it does not get confused
   5946 	 with the '>' which ends the template parameters.  */
   5947       if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
   5948 	  && d_left (dc)->u.s_operator.op->len == 1
   5949 	  && d_left (dc)->u.s_operator.op->name[0] == '>')
   5950 	d_append_char (dpi, '(');
   5951 
   5952       if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0
   5953           && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME)
   5954 	{
   5955 	  /* Function call used in an expression should not have printed types
   5956 	     of the function arguments.  Values of the function arguments still
   5957 	     get printed below.  */
   5958 
   5959 	  const struct demangle_component *func = d_left (d_right (dc));
   5960 
   5961 	  if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
   5962 	    d_print_error (dpi);
   5963 	  d_print_subexpr (dpi, options, d_left (func));
   5964 	}
   5965       else
   5966 	d_print_subexpr (dpi, options, d_left (d_right (dc)));
   5967       if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0)
   5968 	{
   5969 	  d_append_char (dpi, '[');
   5970 	  d_print_comp (dpi, options, d_right (d_right (dc)));
   5971 	  d_append_char (dpi, ']');
   5972 	}
   5973       else
   5974 	{
   5975 	  if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0)
   5976 	    d_print_expr_op (dpi, options, d_left (dc));
   5977 	  d_print_subexpr (dpi, options, d_right (d_right (dc)));
   5978 	}
   5979 
   5980       if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR
   5981 	  && d_left (dc)->u.s_operator.op->len == 1
   5982 	  && d_left (dc)->u.s_operator.op->name[0] == '>')
   5983 	d_append_char (dpi, ')');
   5984 
   5985       return;
   5986 
   5987     case DEMANGLE_COMPONENT_BINARY_ARGS:
   5988       /* We should only see this as part of DEMANGLE_COMPONENT_BINARY.  */
   5989       d_print_error (dpi);
   5990       return;
   5991 
   5992     case DEMANGLE_COMPONENT_TRINARY:
   5993       if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1
   5994 	  || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2)
   5995 	{
   5996 	  d_print_error (dpi);
   5997 	  return;
   5998 	}
   5999       if (d_maybe_print_fold_expression (dpi, options, dc))
   6000 	return;
   6001       if (d_maybe_print_designated_init (dpi, options, dc))
   6002 	return;
   6003       {
   6004 	struct demangle_component *op = d_left (dc);
   6005 	struct demangle_component *first = d_left (d_right (dc));
   6006 	struct demangle_component *second = d_left (d_right (d_right (dc)));
   6007 	struct demangle_component *third = d_right (d_right (d_right (dc)));
   6008 
   6009 	if (!strcmp (op->u.s_operator.op->code, "qu"))
   6010 	  {
   6011 	    d_print_subexpr (dpi, options, first);
   6012 	    d_print_expr_op (dpi, options, op);
   6013 	    d_print_subexpr (dpi, options, second);
   6014 	    d_append_string (dpi, " : ");
   6015 	    d_print_subexpr (dpi, options, third);
   6016 	  }
   6017 	else
   6018 	  {
   6019 	    d_append_string (dpi, "new ");
   6020 	    if (d_left (first) != NULL)
   6021 	      {
   6022 		d_print_subexpr (dpi, options, first);
   6023 		d_append_char (dpi, ' ');
   6024 	      }
   6025 	    d_print_comp (dpi, options, second);
   6026 	    if (third)
   6027 	      d_print_subexpr (dpi, options, third);
   6028 	  }
   6029       }
   6030       return;
   6031 
   6032     case DEMANGLE_COMPONENT_TRINARY_ARG1:
   6033     case DEMANGLE_COMPONENT_TRINARY_ARG2:
   6034       /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY.  */
   6035       d_print_error (dpi);
   6036       return;
   6037 
   6038     case DEMANGLE_COMPONENT_LITERAL:
   6039     case DEMANGLE_COMPONENT_LITERAL_NEG:
   6040       {
   6041 	enum d_builtin_type_print tp;
   6042 
   6043 	/* For some builtin types, produce simpler output.  */
   6044 	tp = D_PRINT_DEFAULT;
   6045 	if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE)
   6046 	  {
   6047 	    tp = d_left (dc)->u.s_builtin.type->print;
   6048 	    switch (tp)
   6049 	      {
   6050 	      case D_PRINT_INT:
   6051 	      case D_PRINT_UNSIGNED:
   6052 	      case D_PRINT_LONG:
   6053 	      case D_PRINT_UNSIGNED_LONG:
   6054 	      case D_PRINT_LONG_LONG:
   6055 	      case D_PRINT_UNSIGNED_LONG_LONG:
   6056 		if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME)
   6057 		  {
   6058 		    if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
   6059 		      d_append_char (dpi, '-');
   6060 		    d_print_comp (dpi, options, d_right (dc));
   6061 		    switch (tp)
   6062 		      {
   6063 		      default:
   6064 			break;
   6065 		      case D_PRINT_UNSIGNED:
   6066 			d_append_char (dpi, 'u');
   6067 			break;
   6068 		      case D_PRINT_LONG:
   6069 			d_append_char (dpi, 'l');
   6070 			break;
   6071 		      case D_PRINT_UNSIGNED_LONG:
   6072 			d_append_string (dpi, "ul");
   6073 			break;
   6074 		      case D_PRINT_LONG_LONG:
   6075 			d_append_string (dpi, "ll");
   6076 			break;
   6077 		      case D_PRINT_UNSIGNED_LONG_LONG:
   6078 			d_append_string (dpi, "ull");
   6079 			break;
   6080 		      }
   6081 		    return;
   6082 		  }
   6083 		break;
   6084 
   6085 	      case D_PRINT_BOOL:
   6086 		if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME
   6087 		    && d_right (dc)->u.s_name.len == 1
   6088 		    && dc->type == DEMANGLE_COMPONENT_LITERAL)
   6089 		  {
   6090 		    switch (d_right (dc)->u.s_name.s[0])
   6091 		      {
   6092 		      case '0':
   6093 			d_append_string (dpi, "false");
   6094 			return;
   6095 		      case '1':
   6096 			d_append_string (dpi, "true");
   6097 			return;
   6098 		      default:
   6099 			break;
   6100 		      }
   6101 		  }
   6102 		break;
   6103 
   6104 	      default:
   6105 		break;
   6106 	      }
   6107 	  }
   6108 
   6109 	d_append_char (dpi, '(');
   6110 	d_print_comp (dpi, options, d_left (dc));
   6111 	d_append_char (dpi, ')');
   6112 	if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG)
   6113 	  d_append_char (dpi, '-');
   6114 	if (tp == D_PRINT_FLOAT)
   6115 	  d_append_char (dpi, '[');
   6116 	d_print_comp (dpi, options, d_right (dc));
   6117 	if (tp == D_PRINT_FLOAT)
   6118 	  d_append_char (dpi, ']');
   6119       }
   6120       return;
   6121 
   6122     case DEMANGLE_COMPONENT_VENDOR_EXPR:
   6123       d_print_comp (dpi, options, d_left (dc));
   6124       d_append_char (dpi, '(');
   6125       d_print_comp (dpi, options, d_right (dc));
   6126       d_append_char (dpi, ')');
   6127       return;
   6128 
   6129     case DEMANGLE_COMPONENT_NUMBER:
   6130       d_append_num (dpi, dc->u.s_number.number);
   6131       return;
   6132 
   6133     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
   6134       d_append_string (dpi, "java resource ");
   6135       d_print_comp (dpi, options, d_left (dc));
   6136       return;
   6137 
   6138     case DEMANGLE_COMPONENT_COMPOUND_NAME:
   6139       d_print_comp (dpi, options, d_left (dc));
   6140       d_print_comp (dpi, options, d_right (dc));
   6141       return;
   6142 
   6143     case DEMANGLE_COMPONENT_CHARACTER:
   6144       d_append_char (dpi, dc->u.s_character.character);
   6145       return;
   6146 
   6147     case DEMANGLE_COMPONENT_DECLTYPE:
   6148       d_append_string (dpi, "decltype (");
   6149       d_print_comp (dpi, options, d_left (dc));
   6150       d_append_char (dpi, ')');
   6151       return;
   6152 
   6153     case DEMANGLE_COMPONENT_PACK_EXPANSION:
   6154       {
   6155 	struct demangle_component *a = NULL;
   6156 
   6157 	if (!dpi->lambda_tpl_parms)
   6158 	  a = d_find_pack (dpi, d_left (dc));
   6159 	if (a == NULL)
   6160 	  {
   6161 	    /* d_find_pack won't find anything if the only packs involved
   6162 	       in this expansion are function parameter packs; in that
   6163 	       case, just print the pattern and "...".  */
   6164 	    d_print_subexpr (dpi, options, d_left (dc));
   6165 	    d_append_string (dpi, "...");
   6166 	  }
   6167 	else
   6168 	  {
   6169 	    int len = d_pack_length (a);
   6170 	    int i;
   6171 
   6172 	    dc = d_left (dc);
   6173 	    for (i = 0; i < len; ++i)
   6174 	      {
   6175 		if (i)
   6176 		  d_append_string (dpi, ", ");
   6177 		dpi->pack_index = i;
   6178 		d_print_comp (dpi, options, dc);
   6179 	      }
   6180 	  }
   6181       }
   6182       return;
   6183 
   6184     case DEMANGLE_COMPONENT_FUNCTION_PARAM:
   6185       {
   6186 	long num = dc->u.s_number.number;
   6187 	if (num == 0)
   6188 	  d_append_string (dpi, "this");
   6189 	else
   6190 	  {
   6191 	    d_append_string (dpi, "{parm#");
   6192 	    d_append_num (dpi, num);
   6193 	    d_append_char (dpi, '}');
   6194 	  }
   6195       }
   6196       return;
   6197 
   6198     case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS:
   6199       d_append_string (dpi, "global constructors keyed to ");
   6200       d_print_comp (dpi, options, dc->u.s_binary.left);
   6201       return;
   6202 
   6203     case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS:
   6204       d_append_string (dpi, "global destructors keyed to ");
   6205       d_print_comp (dpi, options, dc->u.s_binary.left);
   6206       return;
   6207 
   6208     case DEMANGLE_COMPONENT_LAMBDA:
   6209       {
   6210 	d_append_string (dpi, "{lambda");
   6211 	struct demangle_component *parms = dc->u.s_unary_num.sub;
   6212 	struct d_print_template dpt;
   6213 	/* Generic lambda auto parms are mangled as the (synthedic) template
   6214 	   type parm they are.  We need to tell the printer that (a) we're in
   6215 	   a lambda, and (b) the number of synthetic parms.  */
   6216 	int saved_tpl_parms = dpi->lambda_tpl_parms;
   6217 	dpi->lambda_tpl_parms = 0;
   6218 	/* Hang any lambda head as-if template args.  */
   6219 	dpt.template_decl = NULL;
   6220 	dpt.next = dpi->templates;
   6221 	dpi->templates = &dpt;
   6222 	if (parms && parms->type == DEMANGLE_COMPONENT_TEMPLATE_HEAD)
   6223 	  {
   6224 	    dpt.template_decl = parms;
   6225 
   6226 	    d_append_char (dpi, '<');
   6227 	    struct demangle_component *parm;
   6228 	    for (parm = d_left (parms); parm; parm = d_right (parm))
   6229 	      {
   6230 		if (dpi->lambda_tpl_parms++)
   6231 		  d_append_string (dpi, ", ");
   6232 		d_print_comp (dpi, options, parm);
   6233 		d_append_char (dpi, ' ');
   6234 		if (parm->type == DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM)
   6235 		  parm = d_left (parm);
   6236 		d_print_lambda_parm_name (dpi, parm->type,
   6237 					  dpi->lambda_tpl_parms - 1);
   6238 	      }
   6239 	    d_append_char (dpi, '>');
   6240 
   6241 	    parms = d_right (parms);
   6242 	  }
   6243 	dpi->lambda_tpl_parms++;
   6244 
   6245 	d_append_char (dpi, '(');
   6246 	d_print_comp (dpi, options, parms);
   6247 	dpi->lambda_tpl_parms = saved_tpl_parms;
   6248 	dpi->templates = dpt.next;
   6249 	d_append_string (dpi, ")#");
   6250 	d_append_num (dpi, dc->u.s_unary_num.num + 1);
   6251 	d_append_char (dpi, '}');
   6252       }
   6253       return;
   6254 
   6255     case DEMANGLE_COMPONENT_UNNAMED_TYPE:
   6256       d_append_string (dpi, "{unnamed type#");
   6257       d_append_num (dpi, dc->u.s_number.number + 1);
   6258       d_append_char (dpi, '}');
   6259       return;
   6260 
   6261     case DEMANGLE_COMPONENT_CLONE:
   6262       d_print_comp (dpi, options, d_left (dc));
   6263       d_append_string (dpi, " [clone ");
   6264       d_print_comp (dpi, options, d_right (dc));
   6265       d_append_char (dpi, ']');
   6266       return;
   6267 
   6268     case DEMANGLE_COMPONENT_FRIEND:
   6269       d_print_comp (dpi, options, d_left (dc));
   6270       d_append_string (dpi, "[friend]");
   6271       return;
   6272 
   6273     case DEMANGLE_COMPONENT_TEMPLATE_HEAD:
   6274       {
   6275 	d_append_char (dpi, '<');
   6276 	int count = 0;
   6277 	struct demangle_component *parm;
   6278 	for (parm = d_left (dc); parm; parm = d_right (parm))
   6279 	  {
   6280 	    if (count++)
   6281 	      d_append_string (dpi, ", ");
   6282 	    d_print_comp (dpi, options, parm);
   6283 	  }
   6284 	d_append_char (dpi, '>');
   6285       }
   6286       return;
   6287 
   6288     case DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM:
   6289       d_append_string (dpi, "typename");
   6290       return;
   6291 
   6292     case DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM:
   6293       d_print_comp (dpi, options, d_left (dc));
   6294       return;
   6295 
   6296     case DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM:
   6297       d_append_string (dpi, "template");
   6298       d_print_comp (dpi, options, d_left (dc));
   6299       d_append_string (dpi, " class");
   6300       return;
   6301 
   6302     case DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM:
   6303       d_print_comp (dpi, options, d_left (dc));
   6304       d_append_string (dpi, "...");
   6305       return;
   6306 
   6307     case DEMANGLE_COMPONENT_CONSTRAINTS:
   6308       d_print_comp (dpi, options, d_left (dc));
   6309       d_append_string (dpi, " requires ");
   6310       d_print_comp (dpi, options, d_right (dc));
   6311       return;
   6312 
   6313     default:
   6314       d_print_error (dpi);
   6315       return;
   6316     }
   6317 }
   6318 
   6319 static void
   6320 d_print_comp (struct d_print_info *dpi, int options,
   6321 	      struct demangle_component *dc)
   6322 {
   6323   struct d_component_stack self;
   6324   if (dc == NULL || dc->d_printing > 1 || dpi->recursion > MAX_RECURSION_COUNT)
   6325     {
   6326       d_print_error (dpi);
   6327       return;
   6328     }
   6329 
   6330   dc->d_printing++;
   6331   dpi->recursion++;
   6332 
   6333   self.dc = dc;
   6334   self.parent = dpi->component_stack;
   6335   dpi->component_stack = &self;
   6336 
   6337   d_print_comp_inner (dpi, options, dc);
   6338 
   6339   dpi->component_stack = self.parent;
   6340   dc->d_printing--;
   6341   dpi->recursion--;
   6342 }
   6343 
   6344 /* Print a Java dentifier.  For Java we try to handle encoded extended
   6345    Unicode characters.  The C++ ABI doesn't mention Unicode encoding,
   6346    so we don't it for C++.  Characters are encoded as
   6347    __U<hex-char>+_.  */
   6348 
   6349 static void
   6350 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len)
   6351 {
   6352   const char *p;
   6353   const char *end;
   6354 
   6355   end = name + len;
   6356   for (p = name; p < end; ++p)
   6357     {
   6358       if (end - p > 3
   6359 	  && p[0] == '_'
   6360 	  && p[1] == '_'
   6361 	  && p[2] == 'U')
   6362 	{
   6363 	  unsigned long c;
   6364 	  const char *q;
   6365 
   6366 	  c = 0;
   6367 	  for (q = p + 3; q < end; ++q)
   6368 	    {
   6369 	      int dig;
   6370 
   6371 	      if (IS_DIGIT (*q))
   6372 		dig = *q - '0';
   6373 	      else if (*q >= 'A' && *q <= 'F')
   6374 		dig = *q - 'A' + 10;
   6375 	      else if (*q >= 'a' && *q <= 'f')
   6376 		dig = *q - 'a' + 10;
   6377 	      else
   6378 		break;
   6379 
   6380 	      c = c * 16 + dig;
   6381 	    }
   6382 	  /* If the Unicode character is larger than 256, we don't try
   6383 	     to deal with it here.  FIXME.  */
   6384 	  if (q < end && *q == '_' && c < 256)
   6385 	    {
   6386 	      d_append_char (dpi, c);
   6387 	      p = q;
   6388 	      continue;
   6389 	    }
   6390 	}
   6391 
   6392       d_append_char (dpi, *p);
   6393     }
   6394 }
   6395 
   6396 /* Print a list of modifiers.  SUFFIX is 1 if we are printing
   6397    qualifiers on this after printing a function.  */
   6398 
   6399 static void
   6400 d_print_mod_list (struct d_print_info *dpi, int options,
   6401                   struct d_print_mod *mods, int suffix)
   6402 {
   6403   struct d_print_template *hold_dpt;
   6404 
   6405   if (mods == NULL || d_print_saw_error (dpi))
   6406     return;
   6407 
   6408   if (mods->printed
   6409       || (! suffix
   6410 	  && (is_fnqual_component_type (mods->mod->type))))
   6411     {
   6412       d_print_mod_list (dpi, options, mods->next, suffix);
   6413       return;
   6414     }
   6415 
   6416   mods->printed = 1;
   6417 
   6418   hold_dpt = dpi->templates;
   6419   dpi->templates = mods->templates;
   6420 
   6421   if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE)
   6422     {
   6423       d_print_function_type (dpi, options, mods->mod, mods->next);
   6424       dpi->templates = hold_dpt;
   6425       return;
   6426     }
   6427   else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
   6428     {
   6429       d_print_array_type (dpi, options, mods->mod, mods->next);
   6430       dpi->templates = hold_dpt;
   6431       return;
   6432     }
   6433   else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME)
   6434     {
   6435       struct d_print_mod *hold_modifiers;
   6436       struct demangle_component *dc;
   6437 
   6438       /* When this is on the modifier stack, we have pulled any
   6439 	 qualifiers off the right argument already.  Otherwise, we
   6440 	 print it as usual, but don't let the left argument see any
   6441 	 modifiers.  */
   6442 
   6443       hold_modifiers = dpi->modifiers;
   6444       dpi->modifiers = NULL;
   6445       d_print_comp (dpi, options, d_left (mods->mod));
   6446       dpi->modifiers = hold_modifiers;
   6447 
   6448       if ((options & DMGL_JAVA) == 0)
   6449 	d_append_string (dpi, "::");
   6450       else
   6451 	d_append_char (dpi, '.');
   6452 
   6453       dc = d_right (mods->mod);
   6454 
   6455       if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG)
   6456 	{
   6457 	  d_append_string (dpi, "{default arg#");
   6458 	  d_append_num (dpi, dc->u.s_unary_num.num + 1);
   6459 	  d_append_string (dpi, "}::");
   6460 	  dc = dc->u.s_unary_num.sub;
   6461 	}
   6462 
   6463       while (is_fnqual_component_type (dc->type))
   6464 	dc = d_left (dc);
   6465 
   6466       d_print_comp (dpi, options, dc);
   6467 
   6468       dpi->templates = hold_dpt;
   6469       return;
   6470     }
   6471 
   6472   d_print_mod (dpi, options, mods->mod);
   6473 
   6474   dpi->templates = hold_dpt;
   6475 
   6476   d_print_mod_list (dpi, options, mods->next, suffix);
   6477 }
   6478 
   6479 /* Print a modifier.  */
   6480 
   6481 static void
   6482 d_print_mod (struct d_print_info *dpi, int options,
   6483              struct demangle_component *mod)
   6484 {
   6485   switch (mod->type)
   6486     {
   6487     case DEMANGLE_COMPONENT_RESTRICT:
   6488     case DEMANGLE_COMPONENT_RESTRICT_THIS:
   6489       d_append_string (dpi, " restrict");
   6490       return;
   6491     case DEMANGLE_COMPONENT_VOLATILE:
   6492     case DEMANGLE_COMPONENT_VOLATILE_THIS:
   6493       d_append_string (dpi, " volatile");
   6494       return;
   6495     case DEMANGLE_COMPONENT_CONST:
   6496     case DEMANGLE_COMPONENT_CONST_THIS:
   6497       d_append_string (dpi, " const");
   6498       return;
   6499     case DEMANGLE_COMPONENT_TRANSACTION_SAFE:
   6500       d_append_string (dpi, " transaction_safe");
   6501       return;
   6502     case DEMANGLE_COMPONENT_NOEXCEPT:
   6503       d_append_string (dpi, " noexcept");
   6504       if (d_right (mod))
   6505 	{
   6506 	  d_append_char (dpi, '(');
   6507 	  d_print_comp (dpi, options, d_right (mod));
   6508 	  d_append_char (dpi, ')');
   6509 	}
   6510       return;
   6511     case DEMANGLE_COMPONENT_THROW_SPEC:
   6512       d_append_string (dpi, " throw");
   6513       if (d_right (mod))
   6514 	{
   6515 	  d_append_char (dpi, '(');
   6516 	  d_print_comp (dpi, options, d_right (mod));
   6517 	  d_append_char (dpi, ')');
   6518 	}
   6519       return;
   6520     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
   6521       d_append_char (dpi, ' ');
   6522       d_print_comp (dpi, options, d_right (mod));
   6523       return;
   6524     case DEMANGLE_COMPONENT_POINTER:
   6525       /* There is no pointer symbol in Java.  */
   6526       if ((options & DMGL_JAVA) == 0)
   6527 	d_append_char (dpi, '*');
   6528       return;
   6529     case DEMANGLE_COMPONENT_REFERENCE_THIS:
   6530       /* For the ref-qualifier, put a space before the &.  */
   6531       d_append_char (dpi, ' ');
   6532       /* FALLTHRU */
   6533     case DEMANGLE_COMPONENT_REFERENCE:
   6534       d_append_char (dpi, '&');
   6535       return;
   6536     case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
   6537       d_append_char (dpi, ' ');
   6538       /* FALLTHRU */
   6539     case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
   6540       d_append_string (dpi, "&&");
   6541       return;
   6542     case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:
   6543       return;
   6544     case DEMANGLE_COMPONENT_COMPLEX:
   6545       d_append_string (dpi, " _Complex");
   6546       return;
   6547     case DEMANGLE_COMPONENT_IMAGINARY:
   6548       d_append_string (dpi, " _Imaginary");
   6549       return;
   6550     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
   6551       if (d_last_char (dpi) != '(')
   6552 	d_append_char (dpi, ' ');
   6553       d_print_comp (dpi, options, d_left (mod));
   6554       d_append_string (dpi, "::*");
   6555       return;
   6556     case DEMANGLE_COMPONENT_TYPED_NAME:
   6557       d_print_comp (dpi, options, d_left (mod));
   6558       return;
   6559     case DEMANGLE_COMPONENT_VECTOR_TYPE:
   6560       d_append_string (dpi, " __vector(");
   6561       d_print_comp (dpi, options, d_left (mod));
   6562       d_append_char (dpi, ')');
   6563       return;
   6564 
   6565     default:
   6566       /* Otherwise, we have something that won't go back on the
   6567 	 modifier stack, so we can just print it.  */
   6568       d_print_comp (dpi, options, mod);
   6569       return;
   6570     }
   6571 }
   6572 
   6573 /* Print a function type, except for the return type.  */
   6574 
   6575 static void
   6576 d_print_function_type (struct d_print_info *dpi, int options,
   6577                        struct demangle_component *dc,
   6578                        struct d_print_mod *mods)
   6579 {
   6580   int need_paren;
   6581   int need_space;
   6582   int xobj_memfn;
   6583   struct d_print_mod *p;
   6584   struct d_print_mod *hold_modifiers;
   6585 
   6586   need_paren = 0;
   6587   need_space = 0;
   6588   xobj_memfn = 0;
   6589   for (p = mods; p != NULL; p = p->next)
   6590     {
   6591       if (p->printed)
   6592 	break;
   6593 
   6594       switch (p->mod->type)
   6595 	{
   6596 	case DEMANGLE_COMPONENT_POINTER:
   6597 	case DEMANGLE_COMPONENT_REFERENCE:
   6598 	case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
   6599 	  need_paren = 1;
   6600 	  break;
   6601 	case DEMANGLE_COMPONENT_RESTRICT:
   6602 	case DEMANGLE_COMPONENT_VOLATILE:
   6603 	case DEMANGLE_COMPONENT_CONST:
   6604 	case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
   6605 	case DEMANGLE_COMPONENT_COMPLEX:
   6606 	case DEMANGLE_COMPONENT_IMAGINARY:
   6607 	case DEMANGLE_COMPONENT_PTRMEM_TYPE:
   6608 	  need_space = 1;
   6609 	  need_paren = 1;
   6610 	  break;
   6611 	case DEMANGLE_COMPONENT_XOBJ_MEMBER_FUNCTION:
   6612 	  xobj_memfn = 1;
   6613 	  break;
   6614 	default:
   6615 	  break;
   6616 	}
   6617       if (need_paren)
   6618 	break;
   6619     }
   6620 
   6621   if (need_paren)
   6622     {
   6623       if (! need_space)
   6624 	{
   6625 	  if (d_last_char (dpi) != '('
   6626 	      && d_last_char (dpi) != '*')
   6627 	    need_space = 1;
   6628 	}
   6629       if (need_space && d_last_char (dpi) != ' ')
   6630 	d_append_char (dpi, ' ');
   6631       d_append_char (dpi, '(');
   6632     }
   6633 
   6634   hold_modifiers = dpi->modifiers;
   6635   dpi->modifiers = NULL;
   6636 
   6637   d_print_mod_list (dpi, options, mods, 0);
   6638 
   6639   if (need_paren)
   6640     d_append_char (dpi, ')');
   6641 
   6642   d_append_char (dpi, '(');
   6643   if (xobj_memfn)
   6644     d_append_string (dpi, "this ");
   6645 
   6646   if (d_right (dc) != NULL)
   6647     d_print_comp (dpi, options, d_right (dc));
   6648 
   6649   d_append_char (dpi, ')');
   6650 
   6651   d_print_mod_list (dpi, options, mods, 1);
   6652 
   6653   dpi->modifiers = hold_modifiers;
   6654 }
   6655 
   6656 /* Print an array type, except for the element type.  */
   6657 
   6658 static void
   6659 d_print_array_type (struct d_print_info *dpi, int options,
   6660                     struct demangle_component *dc,
   6661                     struct d_print_mod *mods)
   6662 {
   6663   int need_space;
   6664 
   6665   need_space = 1;
   6666   if (mods != NULL)
   6667     {
   6668       int need_paren;
   6669       struct d_print_mod *p;
   6670 
   6671       need_paren = 0;
   6672       for (p = mods; p != NULL; p = p->next)
   6673 	{
   6674 	  if (! p->printed)
   6675 	    {
   6676 	      if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE)
   6677 		{
   6678 		  need_space = 0;
   6679 		  break;
   6680 		}
   6681 	      else
   6682 		{
   6683 		  need_paren = 1;
   6684 		  need_space = 1;
   6685 		  break;
   6686 		}
   6687 	    }
   6688 	}
   6689 
   6690       if (need_paren)
   6691 	d_append_string (dpi, " (");
   6692 
   6693       d_print_mod_list (dpi, options, mods, 0);
   6694 
   6695       if (need_paren)
   6696 	d_append_char (dpi, ')');
   6697     }
   6698 
   6699   if (need_space)
   6700     d_append_char (dpi, ' ');
   6701 
   6702   d_append_char (dpi, '[');
   6703 
   6704   if (d_left (dc) != NULL)
   6705     d_print_comp (dpi, options, d_left (dc));
   6706 
   6707   d_append_char (dpi, ']');
   6708 }
   6709 
   6710 /* Print an operator in an expression.  */
   6711 
   6712 static void
   6713 d_print_expr_op (struct d_print_info *dpi, int options,
   6714                  struct demangle_component *dc)
   6715 {
   6716   if (dc->type == DEMANGLE_COMPONENT_OPERATOR)
   6717     d_append_buffer (dpi, dc->u.s_operator.op->name,
   6718 		     dc->u.s_operator.op->len);
   6719   else
   6720     d_print_comp (dpi, options, dc);
   6721 }
   6722 
   6723 /* Print a cast.  */
   6724 
   6725 static void
   6726 d_print_cast (struct d_print_info *dpi, int options,
   6727 	      struct demangle_component *dc)
   6728 {
   6729   d_print_comp (dpi, options, d_left (dc));
   6730 }
   6731 
   6732 /* Print a conversion operator.  */
   6733 
   6734 static void
   6735 d_print_conversion (struct d_print_info *dpi, int options,
   6736 		    struct demangle_component *dc)
   6737 {
   6738   struct d_print_template dpt;
   6739 
   6740   /* For a conversion operator, we need the template parameters from
   6741      the enclosing template in scope for processing the type.  */
   6742   if (dpi->current_template != NULL)
   6743     {
   6744       dpt.next = dpi->templates;
   6745       dpi->templates = &dpt;
   6746       dpt.template_decl = dpi->current_template;
   6747     }
   6748 
   6749   d_print_comp (dpi, options, d_left (dc));
   6750 
   6751   if (dpi->current_template != NULL)
   6752     dpi->templates = dpt.next;
   6753 }
   6754 
   6755 /* Initialize the information structure we use to pass around
   6756    information.  */
   6757 
   6758 CP_STATIC_IF_GLIBCPP_V3
   6759 void
   6760 cplus_demangle_init_info (const char *mangled, int options, size_t len,
   6761                           struct d_info *di)
   6762 {
   6763   di->s = mangled;
   6764   di->send = mangled + len;
   6765   di->options = options;
   6766 
   6767   di->n = mangled;
   6768 
   6769   /* We cannot need more components than twice the number of chars in
   6770      the mangled string.  Most components correspond directly to
   6771      chars, but the ARGLIST types are exceptions.  */
   6772   di->num_comps = 2 * len;
   6773   di->next_comp = 0;
   6774 
   6775   /* Similarly, we cannot need more substitutions than there are
   6776      chars in the mangled string.  */
   6777   di->num_subs = len;
   6778   di->next_sub = 0;
   6779 
   6780   di->last_name = NULL;
   6781 
   6782   di->expansion = 0;
   6783   di->is_expression = 0;
   6784   di->is_conversion = 0;
   6785   di->recursion_level = 0;
   6786 }
   6787 
   6788 /* Internal implementation for the demangler.  If MANGLED is a g++ v3 ABI
   6789    mangled name, return strings in repeated callback giving the demangled
   6790    name.  OPTIONS is the usual libiberty demangler options.  On success,
   6791    this returns 1.  On failure, returns 0.  */
   6792 
   6793 static int
   6794 d_demangle_callback (const char *mangled, int options,
   6795                      demangle_callbackref callback, void *opaque)
   6796 {
   6797   enum
   6798     {
   6799       DCT_TYPE,
   6800       DCT_MANGLED,
   6801       DCT_GLOBAL_CTORS,
   6802       DCT_GLOBAL_DTORS
   6803     }
   6804   type;
   6805   struct d_info di;
   6806   struct demangle_component *dc;
   6807   int status;
   6808 
   6809   if (mangled[0] == '_' && mangled[1] == 'Z')
   6810     type = DCT_MANGLED;
   6811   else if (strncmp (mangled, "_GLOBAL_", 8) == 0
   6812 	   && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$')
   6813 	   && (mangled[9] == 'D' || mangled[9] == 'I')
   6814 	   && mangled[10] == '_')
   6815     type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS;
   6816   else
   6817     {
   6818       if ((options & DMGL_TYPES) == 0)
   6819 	return 0;
   6820       type = DCT_TYPE;
   6821     }
   6822 
   6823   di.unresolved_name_state = 1;
   6824 
   6825  again:
   6826   cplus_demangle_init_info (mangled, options, strlen (mangled), &di);
   6827 
   6828   /* PR 87675 - Check for a mangled string that is so long
   6829      that we do not have enough stack space to demangle it.  */
   6830   if (((options & DMGL_NO_RECURSE_LIMIT) == 0)
   6831       /* This check is a bit arbitrary, since what we really want to do is to
   6832 	 compare the sizes of the di.comps and di.subs arrays against the
   6833 	 amount of stack space remaining.  But there is no portable way to do
   6834 	 this, so instead we use the recursion limit as a guide to the maximum
   6835 	 size of the arrays.  */
   6836       && (unsigned long) di.num_comps > DEMANGLE_RECURSION_LIMIT)
   6837     {
   6838       /* FIXME: We need a way to indicate that a stack limit has been reached.  */
   6839       return 0;
   6840     }
   6841 
   6842   {
   6843 #ifdef CP_DYNAMIC_ARRAYS
   6844     __extension__ struct demangle_component comps[di.num_comps];
   6845     __extension__ struct demangle_component *subs[di.num_subs];
   6846 
   6847     di.comps = comps;
   6848     di.subs = subs;
   6849 #else
   6850     di.comps = alloca (di.num_comps * sizeof (*di.comps));
   6851     di.subs = alloca (di.num_subs * sizeof (*di.subs));
   6852 #endif
   6853 
   6854     switch (type)
   6855       {
   6856       case DCT_TYPE:
   6857 	dc = cplus_demangle_type (&di);
   6858 	break;
   6859       case DCT_MANGLED:
   6860 	dc = cplus_demangle_mangled_name (&di, 1);
   6861 	break;
   6862       case DCT_GLOBAL_CTORS:
   6863       case DCT_GLOBAL_DTORS:
   6864 	d_advance (&di, 11);
   6865 	dc = d_make_comp (&di,
   6866 			  (type == DCT_GLOBAL_CTORS
   6867 			   ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS
   6868 			   : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS),
   6869 			  d_make_demangle_mangled_name (&di, d_str (&di)),
   6870 			  NULL);
   6871 	d_advance (&di, strlen (d_str (&di)));
   6872 	break;
   6873       default:
   6874 	abort (); /* We have listed all the cases.  */
   6875       }
   6876 
   6877     /* If DMGL_PARAMS is set, then if we didn't consume the entire
   6878        mangled string, then we didn't successfully demangle it.  If
   6879        DMGL_PARAMS is not set, we didn't look at the trailing
   6880        parameters.  */
   6881     if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0')
   6882       dc = NULL;
   6883 
   6884     /* See discussion in d_unresolved_name.  */
   6885     if (dc == NULL && di.unresolved_name_state == -1)
   6886       {
   6887 	di.unresolved_name_state = 0;
   6888 	goto again;
   6889       }
   6890 
   6891 #ifdef CP_DEMANGLE_DEBUG
   6892     d_dump (dc, 0);
   6893 #endif
   6894 
   6895     status = (dc != NULL)
   6896              ? cplus_demangle_print_callback (options, dc, callback, opaque)
   6897              : 0;
   6898   }
   6899 
   6900   return status;
   6901 }
   6902 
   6903 /* Entry point for the demangler.  If MANGLED is a g++ v3 ABI mangled
   6904    name, return a buffer allocated with malloc holding the demangled
   6905    name.  OPTIONS is the usual libiberty demangler options.  On
   6906    success, this sets *PALC to the allocated size of the returned
   6907    buffer.  On failure, this sets *PALC to 0 for a bad name, or 1 for
   6908    a memory allocation failure, and returns NULL.  */
   6909 
   6910 static char *
   6911 d_demangle (const char *mangled, int options, size_t *palc)
   6912 {
   6913   struct d_growable_string dgs;
   6914   int status;
   6915 
   6916   d_growable_string_init (&dgs, 0);
   6917 
   6918   status = d_demangle_callback (mangled, options,
   6919                                 d_growable_string_callback_adapter, &dgs);
   6920   if (status == 0)
   6921     {
   6922       free (dgs.buf);
   6923       *palc = 0;
   6924       return NULL;
   6925     }
   6926 
   6927   *palc = dgs.allocation_failure ? 1 : dgs.alc;
   6928   return dgs.buf;
   6929 }
   6930 
   6931 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
   6932 
   6933 extern char *__cxa_demangle (const char *, char *, size_t *, int *);
   6934 
   6935 /* ia64 ABI-mandated entry point in the C++ runtime library for
   6936    performing demangling.  MANGLED_NAME is a NUL-terminated character
   6937    string containing the name to be demangled.
   6938 
   6939    OUTPUT_BUFFER is a region of memory, allocated with malloc, of
   6940    *LENGTH bytes, into which the demangled name is stored.  If
   6941    OUTPUT_BUFFER is not long enough, it is expanded using realloc.
   6942    OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
   6943    is placed in a region of memory allocated with malloc.
   6944 
   6945    If LENGTH is non-NULL, the length of the buffer containing the
   6946    demangled name, is placed in *LENGTH.
   6947 
   6948    The return value is a pointer to the start of the NUL-terminated
   6949    demangled name, or NULL if the demangling fails.  The caller is
   6950    responsible for deallocating this memory using free.
   6951 
   6952    *STATUS is set to one of the following values:
   6953       0: The demangling operation succeeded.
   6954      -1: A memory allocation failure occurred.
   6955      -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
   6956      -3: One of the arguments is invalid.
   6957 
   6958    The demangling is performed using the C++ ABI mangling rules, with
   6959    GNU extensions.  */
   6960 
   6961 char *
   6962 __cxa_demangle (const char *mangled_name, char *output_buffer,
   6963                 size_t *length, int *status)
   6964 {
   6965   char *demangled;
   6966   size_t alc;
   6967 
   6968   if (mangled_name == NULL)
   6969     {
   6970       if (status != NULL)
   6971 	*status = -3;
   6972       return NULL;
   6973     }
   6974 
   6975   if (output_buffer != NULL && length == NULL)
   6976     {
   6977       if (status != NULL)
   6978 	*status = -3;
   6979       return NULL;
   6980     }
   6981 
   6982   demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc);
   6983 
   6984   if (demangled == NULL)
   6985     {
   6986       if (status != NULL)
   6987 	{
   6988 	  if (alc == 1)
   6989 	    *status = -1;
   6990 	  else
   6991 	    *status = -2;
   6992 	}
   6993       return NULL;
   6994     }
   6995 
   6996   if (output_buffer == NULL)
   6997     {
   6998       if (length != NULL)
   6999 	*length = alc;
   7000     }
   7001   else
   7002     {
   7003       if (strlen (demangled) < *length)
   7004 	{
   7005 	  strcpy (output_buffer, demangled);
   7006 	  free (demangled);
   7007 	  demangled = output_buffer;
   7008 	}
   7009       else
   7010 	{
   7011 	  free (output_buffer);
   7012 	  *length = alc;
   7013 	}
   7014     }
   7015 
   7016   if (status != NULL)
   7017     *status = 0;
   7018 
   7019   return demangled;
   7020 }
   7021 
   7022 extern int __gcclibcxx_demangle_callback (const char *,
   7023                                           void (*)
   7024                                             (const char *, size_t, void *),
   7025                                           void *);
   7026 
   7027 /* Alternative, allocationless entry point in the C++ runtime library
   7028    for performing demangling.  MANGLED_NAME is a NUL-terminated character
   7029    string containing the name to be demangled.
   7030 
   7031    CALLBACK is a callback function, called with demangled string
   7032    segments as demangling progresses; it is called at least once,
   7033    but may be called more than once.  OPAQUE is a generalized pointer
   7034    used as a callback argument.
   7035 
   7036    The return code is one of the following values, equivalent to
   7037    the STATUS values of __cxa_demangle() (excluding -1, since this
   7038    function performs no memory allocations):
   7039       0: The demangling operation succeeded.
   7040      -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
   7041      -3: One of the arguments is invalid.
   7042 
   7043    The demangling is performed using the C++ ABI mangling rules, with
   7044    GNU extensions.  */
   7045 
   7046 int
   7047 __gcclibcxx_demangle_callback (const char *mangled_name,
   7048                                void (*callback) (const char *, size_t, void *),
   7049                                void *opaque)
   7050 {
   7051   int status;
   7052 
   7053   if (mangled_name == NULL || callback == NULL)
   7054     return -3;
   7055 
   7056   status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES,
   7057                                 callback, opaque);
   7058   if (status == 0)
   7059     return -2;
   7060 
   7061   return 0;
   7062 }
   7063 
   7064 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
   7065 
   7066 /* Entry point for libiberty demangler.  If MANGLED is a g++ v3 ABI
   7067    mangled name, return a buffer allocated with malloc holding the
   7068    demangled name.  Otherwise, return NULL.  */
   7069 
   7070 char *
   7071 cplus_demangle_v3 (const char *mangled, int options)
   7072 {
   7073   size_t alc;
   7074 
   7075   return d_demangle (mangled, options, &alc);
   7076 }
   7077 
   7078 int
   7079 cplus_demangle_v3_callback (const char *mangled, int options,
   7080                             demangle_callbackref callback, void *opaque)
   7081 {
   7082   return d_demangle_callback (mangled, options, callback, opaque);
   7083 }
   7084 
   7085 /* Demangle a Java symbol.  Java uses a subset of the V3 ABI C++ mangling
   7086    conventions, but the output formatting is a little different.
   7087    This instructs the C++ demangler not to emit pointer characters ("*"), to
   7088    use Java's namespace separator symbol ("." instead of "::"), and to output
   7089    JArray<TYPE> as TYPE[].  */
   7090 
   7091 char *
   7092 java_demangle_v3 (const char *mangled)
   7093 {
   7094   size_t alc;
   7095 
   7096   return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc);
   7097 }
   7098 
   7099 int
   7100 java_demangle_v3_callback (const char *mangled,
   7101                            demangle_callbackref callback, void *opaque)
   7102 {
   7103   return d_demangle_callback (mangled,
   7104                               DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX,
   7105                               callback, opaque);
   7106 }
   7107 
   7108 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
   7109 
   7110 #ifndef IN_GLIBCPP_V3
   7111 
   7112 /* Demangle a string in order to find out whether it is a constructor
   7113    or destructor.  Return non-zero on success.  Set *CTOR_KIND and
   7114    *DTOR_KIND appropriately.  */
   7115 
   7116 static int
   7117 is_ctor_or_dtor (const char *mangled,
   7118                  enum gnu_v3_ctor_kinds *ctor_kind,
   7119                  enum gnu_v3_dtor_kinds *dtor_kind)
   7120 {
   7121   struct d_info di;
   7122   struct demangle_component *dc;
   7123   int ret;
   7124 
   7125   *ctor_kind = (enum gnu_v3_ctor_kinds) 0;
   7126   *dtor_kind = (enum gnu_v3_dtor_kinds) 0;
   7127 
   7128   cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di);
   7129 
   7130   {
   7131 #ifdef CP_DYNAMIC_ARRAYS
   7132     __extension__ struct demangle_component comps[di.num_comps];
   7133     __extension__ struct demangle_component *subs[di.num_subs];
   7134 
   7135     di.comps = comps;
   7136     di.subs = subs;
   7137 #else
   7138     di.comps = alloca (di.num_comps * sizeof (*di.comps));
   7139     di.subs = alloca (di.num_subs * sizeof (*di.subs));
   7140 #endif
   7141 
   7142     dc = cplus_demangle_mangled_name (&di, 1);
   7143 
   7144     /* Note that because we did not pass DMGL_PARAMS, we don't expect
   7145        to demangle the entire string.  */
   7146 
   7147     ret = 0;
   7148     while (dc != NULL)
   7149       {
   7150 	switch (dc->type)
   7151 	  {
   7152 	    /* These cannot appear on a constructor or destructor.  */
   7153 	  case DEMANGLE_COMPONENT_RESTRICT_THIS:
   7154 	  case DEMANGLE_COMPONENT_VOLATILE_THIS:
   7155 	  case DEMANGLE_COMPONENT_CONST_THIS:
   7156 	  case DEMANGLE_COMPONENT_REFERENCE_THIS:
   7157 	  case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
   7158 	  default:
   7159 	    dc = NULL;
   7160 	    break;
   7161 	  case DEMANGLE_COMPONENT_TYPED_NAME:
   7162 	  case DEMANGLE_COMPONENT_TEMPLATE:
   7163 	    dc = d_left (dc);
   7164 	    break;
   7165 	  case DEMANGLE_COMPONENT_QUAL_NAME:
   7166 	  case DEMANGLE_COMPONENT_LOCAL_NAME:
   7167 	    dc = d_right (dc);
   7168 	    break;
   7169 	  case DEMANGLE_COMPONENT_CTOR:
   7170 	    *ctor_kind = dc->u.s_ctor.kind;
   7171 	    ret = 1;
   7172 	    dc = NULL;
   7173 	    break;
   7174 	  case DEMANGLE_COMPONENT_DTOR:
   7175 	    *dtor_kind = dc->u.s_dtor.kind;
   7176 	    ret = 1;
   7177 	    dc = NULL;
   7178 	    break;
   7179 	  }
   7180       }
   7181   }
   7182 
   7183   return ret;
   7184 }
   7185 
   7186 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor
   7187    name.  A non-zero return indicates the type of constructor.  */
   7188 
   7189 enum gnu_v3_ctor_kinds
   7190 is_gnu_v3_mangled_ctor (const char *name)
   7191 {
   7192   enum gnu_v3_ctor_kinds ctor_kind;
   7193   enum gnu_v3_dtor_kinds dtor_kind;
   7194 
   7195   if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
   7196     return (enum gnu_v3_ctor_kinds) 0;
   7197   return ctor_kind;
   7198 }
   7199 
   7200 
   7201 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor
   7202    name.  A non-zero return indicates the type of destructor.  */
   7203 
   7204 enum gnu_v3_dtor_kinds
   7205 is_gnu_v3_mangled_dtor (const char *name)
   7206 {
   7207   enum gnu_v3_ctor_kinds ctor_kind;
   7208   enum gnu_v3_dtor_kinds dtor_kind;
   7209 
   7210   if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind))
   7211     return (enum gnu_v3_dtor_kinds) 0;
   7212   return dtor_kind;
   7213 }
   7214 
   7215 #endif /* IN_GLIBCPP_V3 */
   7216 
   7217 #ifdef STANDALONE_DEMANGLER
   7218 
   7219 #include "getopt.h"
   7220 #include "dyn-string.h"
   7221 
   7222 static void print_usage (FILE* fp, int exit_value);
   7223 
   7224 #define IS_ALPHA(CHAR)                                                  \
   7225   (((CHAR) >= 'a' && (CHAR) <= 'z')                                     \
   7226    || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
   7227 
   7228 /* Non-zero if CHAR is a character than can occur in a mangled name.  */
   7229 #define is_mangled_char(CHAR)                                           \
   7230   (IS_ALPHA (CHAR) || IS_DIGIT (CHAR)                                   \
   7231    || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
   7232 
   7233 /* The name of this program, as invoked.  */
   7234 const char* program_name;
   7235 
   7236 /* Prints usage summary to FP and then exits with EXIT_VALUE.  */
   7237 
   7238 static void
   7239 print_usage (FILE* fp, int exit_value)
   7240 {
   7241   fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
   7242   fprintf (fp, "Options:\n");
   7243   fprintf (fp, "  -h,--help       Display this message.\n");
   7244   fprintf (fp, "  -p,--no-params  Don't display function parameters\n");
   7245   fprintf (fp, "  -v,--verbose    Produce verbose demanglings.\n");
   7246   fprintf (fp, "If names are provided, they are demangled.  Otherwise filters standard input.\n");
   7247 
   7248   exit (exit_value);
   7249 }
   7250 
   7251 /* Option specification for getopt_long.  */
   7252 static const struct option long_options[] =
   7253 {
   7254   { "help",	 no_argument, NULL, 'h' },
   7255   { "no-params", no_argument, NULL, 'p' },
   7256   { "verbose",   no_argument, NULL, 'v' },
   7257   { NULL,        no_argument, NULL, 0   },
   7258 };
   7259 
   7260 /* Main entry for a demangling filter executable.  It will demangle
   7261    its command line arguments, if any.  If none are provided, it will
   7262    filter stdin to stdout, replacing any recognized mangled C++ names
   7263    with their demangled equivalents.  */
   7264 
   7265 int
   7266 main (int argc, char *argv[])
   7267 {
   7268   int i;
   7269   int opt_char;
   7270   int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES;
   7271 
   7272   /* Use the program name of this program, as invoked.  */
   7273   program_name = argv[0];
   7274 
   7275   /* Parse options.  */
   7276   do
   7277     {
   7278       opt_char = getopt_long (argc, argv, "hpv", long_options, NULL);
   7279       switch (opt_char)
   7280 	{
   7281 	case '?':  /* Unrecognized option.  */
   7282 	  print_usage (stderr, 1);
   7283 	  break;
   7284 
   7285 	case 'h':
   7286 	  print_usage (stdout, 0);
   7287 	  break;
   7288 
   7289 	case 'p':
   7290 	  options &= ~ DMGL_PARAMS;
   7291 	  break;
   7292 
   7293 	case 'v':
   7294 	  options |= DMGL_VERBOSE;
   7295 	  break;
   7296 	}
   7297     }
   7298   while (opt_char != -1);
   7299 
   7300   if (optind == argc)
   7301     /* No command line arguments were provided.  Filter stdin.  */
   7302     {
   7303       dyn_string_t mangled = dyn_string_new (3);
   7304       char *s;
   7305 
   7306       /* Read all of input.  */
   7307       while (!feof (stdin))
   7308 	{
   7309 	  char c;
   7310 
   7311 	  /* Pile characters into mangled until we hit one that can't
   7312 	     occur in a mangled name.  */
   7313 	  c = getchar ();
   7314 	  while (!feof (stdin) && is_mangled_char (c))
   7315 	    {
   7316 	      dyn_string_append_char (mangled, c);
   7317 	      if (feof (stdin))
   7318 		break;
   7319 	      c = getchar ();
   7320 	    }
   7321 
   7322 	  if (dyn_string_length (mangled) > 0)
   7323 	    {
   7324 #ifdef IN_GLIBCPP_V3
   7325 	      s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL);
   7326 #else
   7327 	      s = cplus_demangle_v3 (dyn_string_buf (mangled), options);
   7328 #endif
   7329 
   7330 	      if (s != NULL)
   7331 		{
   7332 		  fputs (s, stdout);
   7333 		  free (s);
   7334 		}
   7335 	      else
   7336 		{
   7337 		  /* It might not have been a mangled name.  Print the
   7338 		     original text.  */
   7339 		  fputs (dyn_string_buf (mangled), stdout);
   7340 		}
   7341 
   7342 	      dyn_string_clear (mangled);
   7343 	    }
   7344 
   7345 	  /* If we haven't hit EOF yet, we've read one character that
   7346 	     can't occur in a mangled name, so print it out.  */
   7347 	  if (!feof (stdin))
   7348 	    putchar (c);
   7349 	}
   7350 
   7351       dyn_string_delete (mangled);
   7352     }
   7353   else
   7354     /* Demangle command line arguments.  */
   7355     {
   7356       /* Loop over command line arguments.  */
   7357       for (i = optind; i < argc; ++i)
   7358 	{
   7359 	  char *s;
   7360 #ifdef IN_GLIBCPP_V3
   7361 	  int status;
   7362 #endif
   7363 
   7364 	  /* Attempt to demangle.  */
   7365 #ifdef IN_GLIBCPP_V3
   7366 	  s = __cxa_demangle (argv[i], NULL, NULL, &status);
   7367 #else
   7368 	  s = cplus_demangle_v3 (argv[i], options);
   7369 #endif
   7370 
   7371 	  /* If it worked, print the demangled name.  */
   7372 	  if (s != NULL)
   7373 	    {
   7374 	      printf ("%s\n", s);
   7375 	      free (s);
   7376 	    }
   7377 	  else
   7378 	    {
   7379 #ifdef IN_GLIBCPP_V3
   7380 	      fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status);
   7381 #else
   7382 	      fprintf (stderr, "Failed: %s\n", argv[i]);
   7383 #endif
   7384 	    }
   7385 	}
   7386     }
   7387 
   7388   return 0;
   7389 }
   7390 
   7391 #endif /* STANDALONE_DEMANGLER */
   7392