Home | History | Annotate | Line # | Download | only in cp
cxx-pretty-print.cc revision 1.1.1.1
      1  1.1  mrg /* Implementation of subroutines for the GNU C++ pretty-printer.
      2  1.1  mrg    Copyright (C) 2003-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Gabriel Dos Reis <gdr (at) integrable-solutions.net>
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      8  1.1  mrg the terms of the GNU General Public License as published by the Free
      9  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     10  1.1  mrg version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15  1.1  mrg for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #include "config.h"
     22  1.1  mrg #include "system.h"
     23  1.1  mrg #include "coretypes.h"
     24  1.1  mrg #include "cp-tree.h"
     25  1.1  mrg #include "cxx-pretty-print.h"
     26  1.1  mrg #include "tree-pretty-print.h"
     27  1.1  mrg 
     28  1.1  mrg static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
     29  1.1  mrg static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
     30  1.1  mrg static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
     31  1.1  mrg static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
     32  1.1  mrg static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
     33  1.1  mrg static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
     34  1.1  mrg static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
     35  1.1  mrg static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
     36  1.1  mrg static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
     37  1.1  mrg static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
     38  1.1  mrg static void pp_cxx_unary_left_fold_expression (cxx_pretty_printer *, tree);
     39  1.1  mrg static void pp_cxx_unary_right_fold_expression (cxx_pretty_printer *, tree);
     40  1.1  mrg static void pp_cxx_binary_fold_expression (cxx_pretty_printer *, tree);
     41  1.1  mrg static void pp_cxx_concept_definition (cxx_pretty_printer *, tree);
     42  1.1  mrg 
     43  1.1  mrg 
     45  1.1  mrg static inline void
     46  1.1  mrg pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
     47  1.1  mrg {
     48  1.1  mrg   const char *p = pp_last_position_in_text (pp);
     49  1.1  mrg 
     50  1.1  mrg   if (p != NULL && *p == c)
     51  1.1  mrg     pp_cxx_whitespace (pp);
     52  1.1  mrg   pp_character (pp, c);
     53  1.1  mrg   pp->padding = pp_none;
     54  1.1  mrg }
     55  1.1  mrg 
     56  1.1  mrg #define pp_cxx_expression_list(PP, T)    \
     57  1.1  mrg    pp_c_expression_list (PP, T)
     58  1.1  mrg #define pp_cxx_space_for_pointer_operator(PP, T)  \
     59  1.1  mrg    pp_c_space_for_pointer_operator (PP, T)
     60  1.1  mrg #define pp_cxx_init_declarator(PP, T)    \
     61  1.1  mrg    pp_c_init_declarator (PP, T)
     62  1.1  mrg #define pp_cxx_call_argument_list(PP, T) \
     63  1.1  mrg    pp_c_call_argument_list (PP, T)
     64  1.1  mrg 
     65  1.1  mrg void
     66  1.1  mrg pp_cxx_colon_colon (cxx_pretty_printer *pp)
     67  1.1  mrg {
     68  1.1  mrg   pp_colon_colon (pp);
     69  1.1  mrg   pp->padding = pp_none;
     70  1.1  mrg }
     71  1.1  mrg 
     72  1.1  mrg void
     73  1.1  mrg pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
     74  1.1  mrg {
     75  1.1  mrg   pp_cxx_nonconsecutive_character (pp, '<');
     76  1.1  mrg }
     77  1.1  mrg 
     78  1.1  mrg void
     79  1.1  mrg pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
     80  1.1  mrg {
     81  1.1  mrg   pp_cxx_nonconsecutive_character (pp, '>');
     82  1.1  mrg }
     83  1.1  mrg 
     84  1.1  mrg void
     85  1.1  mrg pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
     86  1.1  mrg {
     87  1.1  mrg   pp_separate_with (pp, c);
     88  1.1  mrg   pp->padding = pp_none;
     89  1.1  mrg }
     90  1.1  mrg 
     91  1.1  mrg /* Expressions.  */
     92  1.1  mrg 
     93  1.1  mrg /* conversion-function-id:
     94  1.1  mrg       operator conversion-type-id
     95  1.1  mrg 
     96  1.1  mrg    conversion-type-id:
     97  1.1  mrg       type-specifier-seq conversion-declarator(opt)
     98  1.1  mrg 
     99  1.1  mrg    conversion-declarator:
    100  1.1  mrg       ptr-operator conversion-declarator(opt)  */
    101  1.1  mrg 
    102  1.1  mrg static inline void
    103  1.1  mrg pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
    104  1.1  mrg {
    105  1.1  mrg   pp_cxx_ws_string (pp, "operator");
    106  1.1  mrg   pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
    107  1.1  mrg }
    108  1.1  mrg 
    109  1.1  mrg static inline void
    110  1.1  mrg pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
    111  1.1  mrg {
    112  1.1  mrg   pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
    113  1.1  mrg   pp_cxx_begin_template_argument_list (pp);
    114  1.1  mrg   pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
    115  1.1  mrg   pp_cxx_end_template_argument_list (pp);
    116  1.1  mrg }
    117  1.1  mrg 
    118  1.1  mrg /* Prints the unqualified part of the id-expression T.
    119  1.1  mrg 
    120  1.1  mrg    unqualified-id:
    121  1.1  mrg      identifier
    122  1.1  mrg      operator-function-id
    123  1.1  mrg      conversion-function-id
    124  1.1  mrg      ~ class-name
    125  1.1  mrg      template-id  */
    126  1.1  mrg 
    127  1.1  mrg static void
    128  1.1  mrg pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
    129  1.1  mrg {
    130  1.1  mrg   enum tree_code code = TREE_CODE (t);
    131  1.1  mrg   switch (code)
    132  1.1  mrg     {
    133  1.1  mrg     case RESULT_DECL:
    134  1.1  mrg       pp->translate_string ("<return-value>");
    135  1.1  mrg       break;
    136  1.1  mrg 
    137  1.1  mrg     case OVERLOAD:
    138  1.1  mrg       t = OVL_FIRST (t);
    139  1.1  mrg       /* FALLTHRU */
    140  1.1  mrg     case VAR_DECL:
    141  1.1  mrg     case PARM_DECL:
    142  1.1  mrg     case CONST_DECL:
    143  1.1  mrg     case TYPE_DECL:
    144  1.1  mrg     case FUNCTION_DECL:
    145  1.1  mrg     case NAMESPACE_DECL:
    146  1.1  mrg     case FIELD_DECL:
    147  1.1  mrg     case LABEL_DECL:
    148  1.1  mrg     case USING_DECL:
    149  1.1  mrg     case TEMPLATE_DECL:
    150  1.1  mrg       t = DECL_NAME (t);
    151  1.1  mrg       /* FALLTHRU */
    152  1.1  mrg 
    153  1.1  mrg     case IDENTIFIER_NODE:
    154  1.1  mrg       if (t == NULL)
    155  1.1  mrg 	pp->translate_string ("<unnamed>");
    156  1.1  mrg       else if (IDENTIFIER_CONV_OP_P (t))
    157  1.1  mrg 	pp_cxx_conversion_function_id (pp, t);
    158  1.1  mrg       else
    159  1.1  mrg 	pp_cxx_tree_identifier (pp, t);
    160  1.1  mrg       break;
    161  1.1  mrg 
    162  1.1  mrg     case TEMPLATE_ID_EXPR:
    163  1.1  mrg       pp_cxx_template_id (pp, t);
    164  1.1  mrg       break;
    165  1.1  mrg 
    166  1.1  mrg     case BASELINK:
    167  1.1  mrg       pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
    168  1.1  mrg       break;
    169  1.1  mrg 
    170  1.1  mrg     case RECORD_TYPE:
    171  1.1  mrg     case UNION_TYPE:
    172  1.1  mrg     case ENUMERAL_TYPE:
    173  1.1  mrg     case TYPENAME_TYPE:
    174  1.1  mrg     case UNBOUND_CLASS_TEMPLATE:
    175  1.1  mrg       pp_cxx_unqualified_id (pp, TYPE_NAME (t));
    176  1.1  mrg       if (tree ti = TYPE_TEMPLATE_INFO_MAYBE_ALIAS (t))
    177  1.1  mrg 	if (PRIMARY_TEMPLATE_P (TI_TEMPLATE (ti)))
    178  1.1  mrg 	  {
    179  1.1  mrg 	    pp_cxx_begin_template_argument_list (pp);
    180  1.1  mrg 	    tree args = INNERMOST_TEMPLATE_ARGS (TI_ARGS (ti));
    181  1.1  mrg 	    pp_cxx_template_argument_list (pp, args);
    182  1.1  mrg 	    pp_cxx_end_template_argument_list (pp);
    183  1.1  mrg 	  }
    184  1.1  mrg       break;
    185  1.1  mrg 
    186  1.1  mrg     case BIT_NOT_EXPR:
    187  1.1  mrg       pp_cxx_complement (pp);
    188  1.1  mrg       pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
    189  1.1  mrg       break;
    190  1.1  mrg 
    191  1.1  mrg     case TEMPLATE_TYPE_PARM:
    192  1.1  mrg     case TEMPLATE_TEMPLATE_PARM:
    193  1.1  mrg       if (template_placeholder_p (t))
    194  1.1  mrg 	{
    195  1.1  mrg 	  t = TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t));
    196  1.1  mrg 	  pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
    197  1.1  mrg 	  pp_string (pp, "<...auto...>");
    198  1.1  mrg 	}
    199  1.1  mrg       else if (TYPE_IDENTIFIER (t))
    200  1.1  mrg 	pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
    201  1.1  mrg       else
    202  1.1  mrg 	pp_cxx_canonical_template_parameter (pp, t);
    203  1.1  mrg       break;
    204  1.1  mrg 
    205  1.1  mrg     case TEMPLATE_PARM_INDEX:
    206  1.1  mrg       pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
    207  1.1  mrg       break;
    208  1.1  mrg 
    209  1.1  mrg     case BOUND_TEMPLATE_TEMPLATE_PARM:
    210  1.1  mrg       pp_cxx_cv_qualifier_seq (pp, t);
    211  1.1  mrg       pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
    212  1.1  mrg       pp_cxx_begin_template_argument_list (pp);
    213  1.1  mrg       pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
    214  1.1  mrg       pp_cxx_end_template_argument_list (pp);
    215  1.1  mrg       break;
    216  1.1  mrg 
    217  1.1  mrg     default:
    218  1.1  mrg       pp_unsupported_tree (pp, t);
    219  1.1  mrg       break;
    220  1.1  mrg     }
    221  1.1  mrg }
    222  1.1  mrg 
    223  1.1  mrg /* Pretty-print out the token sequence ":: template" in template codes
    224  1.1  mrg    where it is needed to "inline declare" the (following) member as
    225  1.1  mrg    a template.  This situation arises when SCOPE of T is dependent
    226  1.1  mrg    on template parameters.  */
    227  1.1  mrg 
    228  1.1  mrg static inline void
    229  1.1  mrg pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
    230  1.1  mrg {
    231  1.1  mrg   if (TREE_CODE (t) == TEMPLATE_ID_EXPR
    232  1.1  mrg       && TYPE_P (scope) && dependent_type_p (scope))
    233  1.1  mrg     pp_cxx_ws_string (pp, "template");
    234  1.1  mrg }
    235  1.1  mrg 
    236  1.1  mrg /* nested-name-specifier:
    237  1.1  mrg       class-or-namespace-name :: nested-name-specifier(opt)
    238  1.1  mrg       class-or-namespace-name :: template nested-name-specifier   */
    239  1.1  mrg 
    240  1.1  mrg static void
    241  1.1  mrg pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
    242  1.1  mrg {
    243  1.1  mrg   /* FIXME: When diagnosing references to concepts (especially as types?)
    244  1.1  mrg      we end up adding too many '::' to the name. This is partially due
    245  1.1  mrg      to the fact that pp->enclosing_namespace is null.  */
    246  1.1  mrg   if (t == global_namespace)
    247  1.1  mrg     {
    248  1.1  mrg       pp_cxx_colon_colon (pp);
    249  1.1  mrg     }
    250  1.1  mrg   else if (!SCOPE_FILE_SCOPE_P (t) && t != pp->enclosing_scope)
    251  1.1  mrg     {
    252  1.1  mrg       tree scope = get_containing_scope (t);
    253  1.1  mrg       pp_cxx_nested_name_specifier (pp, scope);
    254  1.1  mrg       pp_cxx_template_keyword_if_needed (pp, scope, t);
    255  1.1  mrg       pp_cxx_unqualified_id (pp, t);
    256  1.1  mrg       pp_cxx_colon_colon (pp);
    257  1.1  mrg     }
    258  1.1  mrg }
    259  1.1  mrg 
    260  1.1  mrg /* qualified-id:
    261  1.1  mrg       nested-name-specifier template(opt) unqualified-id  */
    262  1.1  mrg 
    263  1.1  mrg static void
    264  1.1  mrg pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
    265  1.1  mrg {
    266  1.1  mrg   switch (TREE_CODE (t))
    267  1.1  mrg     {
    268  1.1  mrg       /* A pointer-to-member is always qualified.  */
    269  1.1  mrg     case PTRMEM_CST:
    270  1.1  mrg       pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
    271  1.1  mrg       pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
    272  1.1  mrg       break;
    273  1.1  mrg 
    274  1.1  mrg       /* In Standard C++, functions cannot possibly be used as
    275  1.1  mrg 	 nested-name-specifiers.  However, there are situations where
    276  1.1  mrg 	 is "makes sense" to output the surrounding function name for the
    277  1.1  mrg 	 purpose of emphasizing on the scope kind.  Just printing the
    278  1.1  mrg 	 function name might not be sufficient as it may be overloaded; so,
    279  1.1  mrg 	 we decorate the function with its signature too.
    280  1.1  mrg 	 FIXME:  This is probably the wrong pretty-printing for conversion
    281  1.1  mrg 	 functions and some function templates.  */
    282  1.1  mrg     case OVERLOAD:
    283  1.1  mrg       t = OVL_FIRST (t);
    284  1.1  mrg       /* FALLTHRU */
    285  1.1  mrg     case FUNCTION_DECL:
    286  1.1  mrg       if (DECL_FUNCTION_MEMBER_P (t))
    287  1.1  mrg 	pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
    288  1.1  mrg       pp_cxx_unqualified_id
    289  1.1  mrg 	(pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
    290  1.1  mrg       pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
    291  1.1  mrg       break;
    292  1.1  mrg 
    293  1.1  mrg     case OFFSET_REF:
    294  1.1  mrg     case SCOPE_REF:
    295  1.1  mrg       pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
    296  1.1  mrg       pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
    297  1.1  mrg       break;
    298  1.1  mrg 
    299  1.1  mrg     default:
    300  1.1  mrg       {
    301  1.1  mrg 	tree scope = get_containing_scope (t);
    302  1.1  mrg 	if (scope != pp->enclosing_scope)
    303  1.1  mrg 	  {
    304  1.1  mrg 	    pp_cxx_nested_name_specifier (pp, scope);
    305  1.1  mrg 	    pp_cxx_template_keyword_if_needed (pp, scope, t);
    306  1.1  mrg 	  }
    307  1.1  mrg 	pp_cxx_unqualified_id (pp, t);
    308  1.1  mrg       }
    309  1.1  mrg       break;
    310  1.1  mrg     }
    311  1.1  mrg }
    312  1.1  mrg 
    313  1.1  mrg /* Given a value e of ENUMERAL_TYPE:
    314  1.1  mrg    Print out the first ENUMERATOR id with value e, if one is found,
    315  1.1  mrg    (including nested names but excluding the enum name if unscoped)
    316  1.1  mrg    else print out the value as a C-style cast (type-id)value.  */
    317  1.1  mrg 
    318  1.1  mrg static void
    319  1.1  mrg pp_cxx_enumeration_constant (cxx_pretty_printer *pp, tree e)
    320  1.1  mrg {
    321  1.1  mrg   tree type = TREE_TYPE (e);
    322  1.1  mrg   tree value = NULL_TREE;
    323  1.1  mrg 
    324  1.1  mrg   /* Find the name of this constant.  */
    325  1.1  mrg   if ((pp->flags & pp_c_flag_gnu_v3) == 0)
    326  1.1  mrg     for (value = TYPE_VALUES (type); value != NULL_TREE;
    327  1.1  mrg 	 value = TREE_CHAIN (value))
    328  1.1  mrg       if (tree_int_cst_equal (DECL_INITIAL (TREE_VALUE (value)), e))
    329  1.1  mrg 	break;
    330  1.1  mrg 
    331  1.1  mrg   if (value != NULL_TREE)
    332  1.1  mrg     {
    333  1.1  mrg       if (!ENUM_IS_SCOPED (type))
    334  1.1  mrg 	type = get_containing_scope (type);
    335  1.1  mrg       pp_cxx_nested_name_specifier (pp, type);
    336  1.1  mrg       pp->id_expression (TREE_PURPOSE (value));
    337  1.1  mrg     }
    338  1.1  mrg   else
    339  1.1  mrg     {
    340  1.1  mrg       /* Value must have been cast.  */
    341  1.1  mrg        pp_c_type_cast (pp, type);
    342  1.1  mrg        pp_c_integer_constant (pp, e);
    343  1.1  mrg     }
    344  1.1  mrg }
    345  1.1  mrg 
    346  1.1  mrg 
    347  1.1  mrg void
    348  1.1  mrg cxx_pretty_printer::constant (tree t)
    349  1.1  mrg {
    350  1.1  mrg   switch (TREE_CODE (t))
    351  1.1  mrg     {
    352  1.1  mrg     case STRING_CST:
    353  1.1  mrg       {
    354  1.1  mrg 	const bool in_parens = PAREN_STRING_LITERAL_P (t);
    355  1.1  mrg 	if (in_parens)
    356  1.1  mrg 	  pp_cxx_left_paren (this);
    357  1.1  mrg 	c_pretty_printer::constant (t);
    358  1.1  mrg 	if (in_parens)
    359  1.1  mrg 	  pp_cxx_right_paren (this);
    360  1.1  mrg       }
    361  1.1  mrg       break;
    362  1.1  mrg 
    363  1.1  mrg     case INTEGER_CST:
    364  1.1  mrg       if (NULLPTR_TYPE_P (TREE_TYPE (t)))
    365  1.1  mrg 	{
    366  1.1  mrg 	  pp_string (this, "nullptr");
    367  1.1  mrg 	  break;
    368  1.1  mrg 	}
    369  1.1  mrg       else if (TREE_CODE (TREE_TYPE (t)) == ENUMERAL_TYPE)
    370  1.1  mrg 	{
    371  1.1  mrg 	  pp_cxx_enumeration_constant (this, t);
    372  1.1  mrg 	  break;
    373  1.1  mrg 	}
    374  1.1  mrg       /* fall through.  */
    375  1.1  mrg 
    376  1.1  mrg     default:
    377  1.1  mrg       c_pretty_printer::constant (t);
    378  1.1  mrg       break;
    379  1.1  mrg     }
    380  1.1  mrg }
    381  1.1  mrg 
    382  1.1  mrg /* id-expression:
    383  1.1  mrg       unqualified-id
    384  1.1  mrg       qualified-id   */
    385  1.1  mrg 
    386  1.1  mrg void
    387  1.1  mrg cxx_pretty_printer::id_expression (tree t)
    388  1.1  mrg {
    389  1.1  mrg   if (TREE_CODE (t) == OVERLOAD)
    390  1.1  mrg     t = OVL_FIRST (t);
    391  1.1  mrg   if (DECL_P (t) && DECL_CONTEXT (t))
    392  1.1  mrg     pp_cxx_qualified_id (this, t);
    393  1.1  mrg   else
    394  1.1  mrg     pp_cxx_unqualified_id (this, t);
    395  1.1  mrg }
    396  1.1  mrg 
    397  1.1  mrg /* user-defined literal:
    398  1.1  mrg       literal ud-suffix  */
    399  1.1  mrg 
    400  1.1  mrg void
    401  1.1  mrg pp_cxx_userdef_literal (cxx_pretty_printer *pp, tree t)
    402  1.1  mrg {
    403  1.1  mrg   pp->constant (USERDEF_LITERAL_VALUE (t));
    404  1.1  mrg   pp->id_expression (USERDEF_LITERAL_SUFFIX_ID (t));
    405  1.1  mrg }
    406  1.1  mrg 
    407  1.1  mrg 
    408  1.1  mrg /* primary-expression:
    409  1.1  mrg      literal
    410  1.1  mrg      this
    411  1.1  mrg      :: identifier
    412  1.1  mrg      :: operator-function-id
    413  1.1  mrg      :: qualifier-id
    414  1.1  mrg      ( expression )
    415  1.1  mrg      id-expression
    416  1.1  mrg 
    417  1.1  mrg    GNU Extensions:
    418  1.1  mrg      __builtin_va_arg ( assignment-expression , type-id )
    419  1.1  mrg      __builtin_offsetof ( type-id, offsetof-expression )
    420  1.1  mrg      __builtin_addressof ( expression )
    421  1.1  mrg 
    422  1.1  mrg      __has_nothrow_assign ( type-id )
    423  1.1  mrg      __has_nothrow_constructor ( type-id )
    424  1.1  mrg      __has_nothrow_copy ( type-id )
    425  1.1  mrg      __has_trivial_assign ( type-id )
    426  1.1  mrg      __has_trivial_constructor ( type-id )
    427  1.1  mrg      __has_trivial_copy ( type-id )
    428  1.1  mrg      __has_unique_object_representations ( type-id )
    429  1.1  mrg      __has_trivial_destructor ( type-id )
    430  1.1  mrg      __has_virtual_destructor ( type-id )
    431  1.1  mrg      __is_abstract ( type-id )
    432  1.1  mrg      __is_base_of ( type-id , type-id )
    433  1.1  mrg      __is_class ( type-id )
    434  1.1  mrg      __is_empty ( type-id )
    435  1.1  mrg      __is_enum ( type-id )
    436  1.1  mrg      __is_literal_type ( type-id )
    437  1.1  mrg      __is_pod ( type-id )
    438  1.1  mrg      __is_polymorphic ( type-id )
    439  1.1  mrg      __is_std_layout ( type-id )
    440  1.1  mrg      __is_trivial ( type-id )
    441  1.1  mrg      __is_union ( type-id )  */
    442  1.1  mrg 
    443  1.1  mrg void
    444  1.1  mrg cxx_pretty_printer::primary_expression (tree t)
    445  1.1  mrg {
    446  1.1  mrg   switch (TREE_CODE (t))
    447  1.1  mrg     {
    448  1.1  mrg     case VOID_CST:
    449  1.1  mrg     case INTEGER_CST:
    450  1.1  mrg     case REAL_CST:
    451  1.1  mrg     case COMPLEX_CST:
    452  1.1  mrg     case STRING_CST:
    453  1.1  mrg       constant (t);
    454  1.1  mrg       break;
    455  1.1  mrg 
    456  1.1  mrg     case USERDEF_LITERAL:
    457  1.1  mrg       pp_cxx_userdef_literal (this, t);
    458  1.1  mrg       break;
    459  1.1  mrg 
    460  1.1  mrg     case BASELINK:
    461  1.1  mrg       t = BASELINK_FUNCTIONS (t);
    462  1.1  mrg       /* FALLTHRU */
    463  1.1  mrg     case VAR_DECL:
    464  1.1  mrg     case PARM_DECL:
    465  1.1  mrg     case FIELD_DECL:
    466  1.1  mrg     case FUNCTION_DECL:
    467  1.1  mrg     case OVERLOAD:
    468  1.1  mrg     case CONST_DECL:
    469  1.1  mrg     case TEMPLATE_DECL:
    470  1.1  mrg       id_expression (t);
    471  1.1  mrg       break;
    472  1.1  mrg 
    473  1.1  mrg     case RESULT_DECL:
    474  1.1  mrg     case TEMPLATE_TYPE_PARM:
    475  1.1  mrg     case TEMPLATE_TEMPLATE_PARM:
    476  1.1  mrg     case TEMPLATE_PARM_INDEX:
    477  1.1  mrg       pp_cxx_unqualified_id (this, t);
    478  1.1  mrg       break;
    479  1.1  mrg 
    480  1.1  mrg     case STMT_EXPR:
    481  1.1  mrg       pp_cxx_left_paren (this);
    482  1.1  mrg       statement (STMT_EXPR_STMT (t));
    483  1.1  mrg       pp_cxx_right_paren (this);
    484  1.1  mrg       break;
    485  1.1  mrg 
    486  1.1  mrg     case TRAIT_EXPR:
    487  1.1  mrg       pp_cxx_trait_expression (this, t);
    488  1.1  mrg       break;
    489  1.1  mrg 
    490  1.1  mrg     case VA_ARG_EXPR:
    491  1.1  mrg       pp_cxx_va_arg_expression (this, t);
    492  1.1  mrg       break;
    493  1.1  mrg 
    494  1.1  mrg     case OFFSETOF_EXPR:
    495  1.1  mrg       pp_cxx_offsetof_expression (this, t);
    496  1.1  mrg       break;
    497  1.1  mrg 
    498  1.1  mrg     case ADDRESSOF_EXPR:
    499  1.1  mrg       pp_cxx_addressof_expression (this, t);
    500  1.1  mrg       break;
    501  1.1  mrg 
    502  1.1  mrg     case REQUIRES_EXPR:
    503  1.1  mrg       pp_cxx_requires_expr (this, t);
    504  1.1  mrg       break;
    505  1.1  mrg 
    506  1.1  mrg     default:
    507  1.1  mrg       c_pretty_printer::primary_expression (t);
    508  1.1  mrg       break;
    509  1.1  mrg     }
    510  1.1  mrg }
    511  1.1  mrg 
    512  1.1  mrg /* postfix-expression:
    513  1.1  mrg      primary-expression
    514  1.1  mrg      postfix-expression [ expression ]
    515  1.1  mrg      postfix-expression ( expression-list(opt) )
    516  1.1  mrg      simple-type-specifier ( expression-list(opt) )
    517  1.1  mrg      typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
    518  1.1  mrg      typename ::(opt) nested-name-specifier template(opt)
    519  1.1  mrg 				       template-id ( expression-list(opt) )
    520  1.1  mrg      postfix-expression . template(opt) ::(opt) id-expression
    521  1.1  mrg      postfix-expression -> template(opt) ::(opt) id-expression
    522  1.1  mrg      postfix-expression . pseudo-destructor-name
    523  1.1  mrg      postfix-expression -> pseudo-destructor-name
    524  1.1  mrg      postfix-expression ++
    525  1.1  mrg      postfix-expression --
    526  1.1  mrg      dynamic_cast < type-id > ( expression )
    527  1.1  mrg      static_cast < type-id > ( expression )
    528  1.1  mrg      reinterpret_cast < type-id > ( expression )
    529  1.1  mrg      const_cast < type-id > ( expression )
    530  1.1  mrg      typeid ( expression )
    531  1.1  mrg      typeid ( type-id )  */
    532  1.1  mrg 
    533  1.1  mrg void
    534  1.1  mrg cxx_pretty_printer::postfix_expression (tree t)
    535  1.1  mrg {
    536  1.1  mrg   enum tree_code code = TREE_CODE (t);
    537  1.1  mrg 
    538  1.1  mrg   switch (code)
    539  1.1  mrg     {
    540  1.1  mrg     case AGGR_INIT_EXPR:
    541  1.1  mrg     case CALL_EXPR:
    542  1.1  mrg       {
    543  1.1  mrg 	tree fun = cp_get_callee (t);
    544  1.1  mrg 	tree saved_scope = enclosing_scope;
    545  1.1  mrg 	bool skipfirst = false;
    546  1.1  mrg 	tree arg;
    547  1.1  mrg 
    548  1.1  mrg 	if (TREE_CODE (fun) == ADDR_EXPR)
    549  1.1  mrg 	  fun = TREE_OPERAND (fun, 0);
    550  1.1  mrg 
    551  1.1  mrg 	/* In templates, where there is no way to tell whether a given
    552  1.1  mrg 	   call uses an actual member function.  So the parser builds
    553  1.1  mrg 	   FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
    554  1.1  mrg 	   instantiation time.  */
    555  1.1  mrg 	if (TREE_CODE (fun) != FUNCTION_DECL)
    556  1.1  mrg 	  ;
    557  1.1  mrg 	else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
    558  1.1  mrg 	  {
    559  1.1  mrg 	    tree object = (code == AGGR_INIT_EXPR
    560  1.1  mrg 			   ? (AGGR_INIT_VIA_CTOR_P (t)
    561  1.1  mrg 			      ? AGGR_INIT_EXPR_SLOT (t)
    562  1.1  mrg 			      : AGGR_INIT_EXPR_ARG (t, 0))
    563  1.1  mrg 			   : CALL_EXPR_ARG (t, 0));
    564  1.1  mrg 
    565  1.1  mrg 	    while (TREE_CODE (object) == NOP_EXPR)
    566  1.1  mrg 	      object = TREE_OPERAND (object, 0);
    567  1.1  mrg 
    568  1.1  mrg 	    if (TREE_CODE (object) == ADDR_EXPR)
    569  1.1  mrg 	      object = TREE_OPERAND (object, 0);
    570  1.1  mrg 
    571  1.1  mrg 	    if (!TYPE_PTR_P (TREE_TYPE (object)))
    572  1.1  mrg 	      {
    573  1.1  mrg 		postfix_expression (object);
    574  1.1  mrg 		pp_cxx_dot (this);
    575  1.1  mrg 	      }
    576  1.1  mrg 	    else
    577  1.1  mrg 	      {
    578  1.1  mrg 		postfix_expression (object);
    579  1.1  mrg 		pp_cxx_arrow (this);
    580  1.1  mrg 	      }
    581  1.1  mrg 	    skipfirst = true;
    582  1.1  mrg 	    enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
    583  1.1  mrg 	  }
    584  1.1  mrg 
    585  1.1  mrg 	postfix_expression (fun);
    586  1.1  mrg 	enclosing_scope = saved_scope;
    587  1.1  mrg 	pp_cxx_left_paren (this);
    588  1.1  mrg 	if (code == AGGR_INIT_EXPR)
    589  1.1  mrg 	  {
    590  1.1  mrg 	    aggr_init_expr_arg_iterator iter;
    591  1.1  mrg 	    FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
    592  1.1  mrg 	      {
    593  1.1  mrg 		if (skipfirst)
    594  1.1  mrg 		  skipfirst = false;
    595  1.1  mrg 		else
    596  1.1  mrg 		  {
    597  1.1  mrg 		    expression (arg);
    598  1.1  mrg 		    if (more_aggr_init_expr_args_p (&iter))
    599  1.1  mrg 		      pp_cxx_separate_with (this, ',');
    600  1.1  mrg 		  }
    601  1.1  mrg 	      }
    602  1.1  mrg 	  }
    603  1.1  mrg 	else
    604  1.1  mrg 	  {
    605  1.1  mrg 	    call_expr_arg_iterator iter;
    606  1.1  mrg 	    FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
    607  1.1  mrg 	      {
    608  1.1  mrg 		if (skipfirst)
    609  1.1  mrg 		  skipfirst = false;
    610  1.1  mrg 		else
    611  1.1  mrg 		  {
    612  1.1  mrg 		    expression (arg);
    613  1.1  mrg 		    if (more_call_expr_args_p (&iter))
    614  1.1  mrg 		      pp_cxx_separate_with (this, ',');
    615  1.1  mrg 		  }
    616  1.1  mrg 	      }
    617  1.1  mrg 	  }
    618  1.1  mrg 	pp_cxx_right_paren (this);
    619  1.1  mrg       }
    620  1.1  mrg       if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
    621  1.1  mrg 	{
    622  1.1  mrg 	  pp_cxx_separate_with (this, ',');
    623  1.1  mrg 	  postfix_expression (AGGR_INIT_EXPR_SLOT (t));
    624  1.1  mrg 	}
    625  1.1  mrg       break;
    626  1.1  mrg 
    627  1.1  mrg     case BASELINK:
    628  1.1  mrg     case VAR_DECL:
    629  1.1  mrg     case PARM_DECL:
    630  1.1  mrg     case FIELD_DECL:
    631  1.1  mrg     case FUNCTION_DECL:
    632  1.1  mrg     case OVERLOAD:
    633  1.1  mrg     case CONST_DECL:
    634  1.1  mrg     case TEMPLATE_DECL:
    635  1.1  mrg     case RESULT_DECL:
    636  1.1  mrg       primary_expression (t);
    637  1.1  mrg       break;
    638  1.1  mrg 
    639  1.1  mrg     case DYNAMIC_CAST_EXPR:
    640  1.1  mrg     case STATIC_CAST_EXPR:
    641  1.1  mrg     case REINTERPRET_CAST_EXPR:
    642  1.1  mrg     case CONST_CAST_EXPR:
    643  1.1  mrg       if (code == DYNAMIC_CAST_EXPR)
    644  1.1  mrg 	pp_cxx_ws_string (this, "dynamic_cast");
    645  1.1  mrg       else if (code == STATIC_CAST_EXPR)
    646  1.1  mrg 	pp_cxx_ws_string (this, "static_cast");
    647  1.1  mrg       else if (code == REINTERPRET_CAST_EXPR)
    648  1.1  mrg 	pp_cxx_ws_string (this, "reinterpret_cast");
    649  1.1  mrg       else
    650  1.1  mrg 	pp_cxx_ws_string (this, "const_cast");
    651  1.1  mrg       pp_cxx_begin_template_argument_list (this);
    652  1.1  mrg       type_id (TREE_TYPE (t));
    653  1.1  mrg       pp_cxx_end_template_argument_list (this);
    654  1.1  mrg       pp_left_paren (this);
    655  1.1  mrg       expression (TREE_OPERAND (t, 0));
    656  1.1  mrg       pp_right_paren (this);
    657  1.1  mrg       break;
    658  1.1  mrg 
    659  1.1  mrg     case BIT_CAST_EXPR:
    660  1.1  mrg       pp_cxx_ws_string (this, "__builtin_bit_cast");
    661  1.1  mrg       pp_left_paren (this);
    662  1.1  mrg       type_id (TREE_TYPE (t));
    663  1.1  mrg       pp_comma (this);
    664  1.1  mrg       expression (TREE_OPERAND (t, 0));
    665  1.1  mrg       pp_right_paren (this);
    666  1.1  mrg       break;
    667  1.1  mrg 
    668  1.1  mrg     case EMPTY_CLASS_EXPR:
    669  1.1  mrg       type_id (TREE_TYPE (t));
    670  1.1  mrg       pp_left_paren (this);
    671  1.1  mrg       pp_right_paren (this);
    672  1.1  mrg       break;
    673  1.1  mrg 
    674  1.1  mrg     case TYPEID_EXPR:
    675  1.1  mrg       pp_cxx_typeid_expression (this, t);
    676  1.1  mrg       break;
    677  1.1  mrg 
    678  1.1  mrg     case PSEUDO_DTOR_EXPR:
    679  1.1  mrg       postfix_expression (TREE_OPERAND (t, 0));
    680  1.1  mrg       pp_cxx_dot (this);
    681  1.1  mrg       if (TREE_OPERAND (t, 1))
    682  1.1  mrg 	{
    683  1.1  mrg 	  pp_cxx_qualified_id (this, TREE_OPERAND (t, 1));
    684  1.1  mrg 	  pp_cxx_colon_colon (this);
    685  1.1  mrg 	}
    686  1.1  mrg       pp_complement (this);
    687  1.1  mrg       pp_cxx_unqualified_id (this, TREE_OPERAND (t, 2));
    688  1.1  mrg       break;
    689  1.1  mrg 
    690  1.1  mrg     case ARROW_EXPR:
    691  1.1  mrg       postfix_expression (TREE_OPERAND (t, 0));
    692  1.1  mrg       pp_cxx_arrow (this);
    693  1.1  mrg       break;
    694  1.1  mrg 
    695  1.1  mrg     default:
    696  1.1  mrg       c_pretty_printer::postfix_expression (t);
    697  1.1  mrg       break;
    698  1.1  mrg     }
    699  1.1  mrg }
    700  1.1  mrg 
    701  1.1  mrg /* new-expression:
    702  1.1  mrg       ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
    703  1.1  mrg       ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
    704  1.1  mrg 
    705  1.1  mrg    new-placement:
    706  1.1  mrg       ( expression-list )
    707  1.1  mrg 
    708  1.1  mrg    new-type-id:
    709  1.1  mrg       type-specifier-seq new-declarator(opt)
    710  1.1  mrg 
    711  1.1  mrg    new-declarator:
    712  1.1  mrg       ptr-operator new-declarator(opt)
    713  1.1  mrg       direct-new-declarator
    714  1.1  mrg 
    715  1.1  mrg    direct-new-declarator
    716  1.1  mrg       [ expression ]
    717  1.1  mrg       direct-new-declarator [ constant-expression ]
    718  1.1  mrg 
    719  1.1  mrg    new-initializer:
    720  1.1  mrg       ( expression-list(opt) )  */
    721  1.1  mrg 
    722  1.1  mrg static void
    723  1.1  mrg pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
    724  1.1  mrg {
    725  1.1  mrg   enum tree_code code = TREE_CODE (t);
    726  1.1  mrg   tree type = TREE_OPERAND (t, 1);
    727  1.1  mrg   tree init = TREE_OPERAND (t, 2);
    728  1.1  mrg   switch (code)
    729  1.1  mrg     {
    730  1.1  mrg     case NEW_EXPR:
    731  1.1  mrg     case VEC_NEW_EXPR:
    732  1.1  mrg       if (NEW_EXPR_USE_GLOBAL (t))
    733  1.1  mrg 	pp_cxx_colon_colon (pp);
    734  1.1  mrg       pp_cxx_ws_string (pp, "new");
    735  1.1  mrg       if (TREE_OPERAND (t, 0))
    736  1.1  mrg 	{
    737  1.1  mrg 	  pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
    738  1.1  mrg 	  pp_space (pp);
    739  1.1  mrg 	}
    740  1.1  mrg       if (TREE_CODE (type) == ARRAY_REF)
    741  1.1  mrg 	type = build_cplus_array_type
    742  1.1  mrg 	  (TREE_OPERAND (type, 0),
    743  1.1  mrg 	   build_index_type (fold_build2_loc (input_location,
    744  1.1  mrg 					  MINUS_EXPR, integer_type_node,
    745  1.1  mrg 					  TREE_OPERAND (type, 1),
    746  1.1  mrg 					  integer_one_node)));
    747  1.1  mrg       pp->type_id (type);
    748  1.1  mrg       if (init)
    749  1.1  mrg 	{
    750  1.1  mrg 	  pp_left_paren (pp);
    751  1.1  mrg 	  if (TREE_CODE (init) == TREE_LIST)
    752  1.1  mrg 	    pp_c_expression_list (pp, init);
    753  1.1  mrg 	  else if (init == void_node)
    754  1.1  mrg 	    ;			/* OK, empty initializer list.  */
    755  1.1  mrg 	  else
    756  1.1  mrg 	    pp->expression (init);
    757  1.1  mrg 	  pp_right_paren (pp);
    758  1.1  mrg 	}
    759  1.1  mrg       break;
    760  1.1  mrg 
    761  1.1  mrg     default:
    762  1.1  mrg       pp_unsupported_tree (pp, t);
    763  1.1  mrg     }
    764  1.1  mrg }
    765  1.1  mrg 
    766  1.1  mrg /* delete-expression:
    767  1.1  mrg       ::(opt) delete cast-expression
    768  1.1  mrg       ::(opt) delete [ ] cast-expression   */
    769  1.1  mrg 
    770  1.1  mrg static void
    771  1.1  mrg pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
    772  1.1  mrg {
    773  1.1  mrg   enum tree_code code = TREE_CODE (t);
    774  1.1  mrg   switch (code)
    775  1.1  mrg     {
    776  1.1  mrg     case DELETE_EXPR:
    777  1.1  mrg     case VEC_DELETE_EXPR:
    778  1.1  mrg       if (DELETE_EXPR_USE_GLOBAL (t))
    779  1.1  mrg 	pp_cxx_colon_colon (pp);
    780  1.1  mrg       pp_cxx_ws_string (pp, "delete");
    781  1.1  mrg       pp_space (pp);
    782  1.1  mrg       if (code == VEC_DELETE_EXPR
    783  1.1  mrg 	  || DELETE_EXPR_USE_VEC (t))
    784  1.1  mrg 	{
    785  1.1  mrg 	  pp_left_bracket (pp);
    786  1.1  mrg 	  pp_right_bracket (pp);
    787  1.1  mrg 	  pp_space (pp);
    788  1.1  mrg 	}
    789  1.1  mrg       pp_c_cast_expression (pp, TREE_OPERAND (t, 0));
    790  1.1  mrg       break;
    791  1.1  mrg 
    792  1.1  mrg     default:
    793  1.1  mrg       pp_unsupported_tree (pp, t);
    794  1.1  mrg     }
    795  1.1  mrg }
    796  1.1  mrg 
    797  1.1  mrg /* unary-expression:
    798  1.1  mrg       postfix-expression
    799  1.1  mrg       ++ cast-expression
    800  1.1  mrg       -- cast-expression
    801  1.1  mrg       unary-operator cast-expression
    802  1.1  mrg       sizeof unary-expression
    803  1.1  mrg       sizeof ( type-id )
    804  1.1  mrg       sizeof ... ( identifier )
    805  1.1  mrg       new-expression
    806  1.1  mrg       delete-expression
    807  1.1  mrg 
    808  1.1  mrg    unary-operator: one of
    809  1.1  mrg       *   &   +   -  !
    810  1.1  mrg 
    811  1.1  mrg    GNU extensions:
    812  1.1  mrg       __alignof__ unary-expression
    813  1.1  mrg       __alignof__ ( type-id )  */
    814  1.1  mrg 
    815  1.1  mrg void
    816  1.1  mrg cxx_pretty_printer::unary_expression (tree t)
    817  1.1  mrg {
    818  1.1  mrg   enum tree_code code = TREE_CODE (t);
    819  1.1  mrg   switch (code)
    820  1.1  mrg     {
    821  1.1  mrg     case NEW_EXPR:
    822  1.1  mrg     case VEC_NEW_EXPR:
    823  1.1  mrg       pp_cxx_new_expression (this, t);
    824  1.1  mrg       break;
    825  1.1  mrg 
    826  1.1  mrg     case DELETE_EXPR:
    827  1.1  mrg     case VEC_DELETE_EXPR:
    828  1.1  mrg       pp_cxx_delete_expression (this, t);
    829  1.1  mrg       break;
    830  1.1  mrg 
    831  1.1  mrg     case SIZEOF_EXPR:
    832  1.1  mrg       if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
    833  1.1  mrg 	{
    834  1.1  mrg 	  pp_cxx_ws_string (this, "sizeof");
    835  1.1  mrg 	  pp_cxx_ws_string (this, "...");
    836  1.1  mrg 	  pp_cxx_whitespace (this);
    837  1.1  mrg 	  pp_cxx_left_paren (this);
    838  1.1  mrg 	  if (TYPE_P (TREE_OPERAND (t, 0)))
    839  1.1  mrg 	    type_id (TREE_OPERAND (t, 0));
    840  1.1  mrg 	  else
    841  1.1  mrg 	    unary_expression (TREE_OPERAND (t, 0));
    842  1.1  mrg 	  pp_cxx_right_paren (this);
    843  1.1  mrg 	  break;
    844  1.1  mrg 	}
    845  1.1  mrg       /* Fall through  */
    846  1.1  mrg 
    847  1.1  mrg     case ALIGNOF_EXPR:
    848  1.1  mrg       pp_cxx_ws_string (this, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
    849  1.1  mrg       pp_cxx_whitespace (this);
    850  1.1  mrg       if (TREE_CODE (t) == SIZEOF_EXPR && SIZEOF_EXPR_TYPE_P (t))
    851  1.1  mrg 	{
    852  1.1  mrg 	  pp_cxx_left_paren (this);
    853  1.1  mrg 	  type_id (TREE_TYPE (TREE_OPERAND (t, 0)));
    854  1.1  mrg 	  pp_cxx_right_paren (this);
    855  1.1  mrg 	}
    856  1.1  mrg       else if (TYPE_P (TREE_OPERAND (t, 0)))
    857  1.1  mrg 	{
    858  1.1  mrg 	  pp_cxx_left_paren (this);
    859  1.1  mrg 	  type_id (TREE_OPERAND (t, 0));
    860  1.1  mrg 	  pp_cxx_right_paren (this);
    861  1.1  mrg 	}
    862  1.1  mrg       else
    863  1.1  mrg 	unary_expression (TREE_OPERAND (t, 0));
    864  1.1  mrg       break;
    865  1.1  mrg 
    866  1.1  mrg     case AT_ENCODE_EXPR:
    867  1.1  mrg       pp_cxx_ws_string (this, "@encode");
    868  1.1  mrg       pp_cxx_whitespace (this);
    869  1.1  mrg       pp_cxx_left_paren (this);
    870  1.1  mrg       type_id (TREE_OPERAND (t, 0));
    871  1.1  mrg       pp_cxx_right_paren (this);
    872  1.1  mrg       break;
    873  1.1  mrg 
    874  1.1  mrg     case NOEXCEPT_EXPR:
    875  1.1  mrg       pp_cxx_ws_string (this, "noexcept");
    876  1.1  mrg       pp_cxx_whitespace (this);
    877  1.1  mrg       pp_cxx_left_paren (this);
    878  1.1  mrg       expression (TREE_OPERAND (t, 0));
    879  1.1  mrg       pp_cxx_right_paren (this);
    880  1.1  mrg       break;
    881  1.1  mrg 
    882  1.1  mrg     case UNARY_PLUS_EXPR:
    883  1.1  mrg       pp_plus (this);
    884  1.1  mrg       pp_cxx_cast_expression (this, TREE_OPERAND (t, 0));
    885  1.1  mrg       break;
    886  1.1  mrg 
    887  1.1  mrg     default:
    888  1.1  mrg       c_pretty_printer::unary_expression (t);
    889  1.1  mrg       break;
    890  1.1  mrg     }
    891  1.1  mrg }
    892  1.1  mrg 
    893  1.1  mrg /* cast-expression:
    894  1.1  mrg       unary-expression
    895  1.1  mrg       ( type-id ) cast-expression  */
    896  1.1  mrg 
    897  1.1  mrg static void
    898  1.1  mrg pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
    899  1.1  mrg {
    900  1.1  mrg   switch (TREE_CODE (t))
    901  1.1  mrg     {
    902  1.1  mrg     case CAST_EXPR:
    903  1.1  mrg     case IMPLICIT_CONV_EXPR:
    904  1.1  mrg       pp->type_id (TREE_TYPE (t));
    905  1.1  mrg       pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
    906  1.1  mrg       break;
    907  1.1  mrg 
    908  1.1  mrg     default:
    909  1.1  mrg       pp_c_cast_expression (pp, t);
    910  1.1  mrg       break;
    911  1.1  mrg     }
    912  1.1  mrg }
    913  1.1  mrg 
    914  1.1  mrg /* pm-expression:
    915  1.1  mrg       cast-expression
    916  1.1  mrg       pm-expression .* cast-expression
    917  1.1  mrg       pm-expression ->* cast-expression  */
    918  1.1  mrg 
    919  1.1  mrg static void
    920  1.1  mrg pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
    921  1.1  mrg {
    922  1.1  mrg   switch (TREE_CODE (t))
    923  1.1  mrg     {
    924  1.1  mrg       /* Handle unfortunate OFFSET_REF overloading here.  */
    925  1.1  mrg     case OFFSET_REF:
    926  1.1  mrg       if (TYPE_P (TREE_OPERAND (t, 0)))
    927  1.1  mrg 	{
    928  1.1  mrg 	  pp_cxx_qualified_id (pp, t);
    929  1.1  mrg 	  break;
    930  1.1  mrg 	}
    931  1.1  mrg       /* Fall through.  */
    932  1.1  mrg     case MEMBER_REF:
    933  1.1  mrg     case DOTSTAR_EXPR:
    934  1.1  mrg       pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
    935  1.1  mrg       if (TREE_CODE (t) == MEMBER_REF)
    936  1.1  mrg 	pp_cxx_arrow (pp);
    937  1.1  mrg       else
    938  1.1  mrg 	pp_cxx_dot (pp);
    939  1.1  mrg       pp_star(pp);
    940  1.1  mrg       pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
    941  1.1  mrg       break;
    942  1.1  mrg 
    943  1.1  mrg 
    944  1.1  mrg     default:
    945  1.1  mrg       pp_cxx_cast_expression (pp, t);
    946  1.1  mrg       break;
    947  1.1  mrg     }
    948  1.1  mrg }
    949  1.1  mrg 
    950  1.1  mrg /* multiplicative-expression:
    951  1.1  mrg       pm-expression
    952  1.1  mrg       multiplicative-expression * pm-expression
    953  1.1  mrg       multiplicative-expression / pm-expression
    954  1.1  mrg       multiplicative-expression % pm-expression  */
    955  1.1  mrg 
    956  1.1  mrg void
    957  1.1  mrg cxx_pretty_printer::multiplicative_expression (tree e)
    958  1.1  mrg {
    959  1.1  mrg   enum tree_code code = TREE_CODE (e);
    960  1.1  mrg   switch (code)
    961  1.1  mrg     {
    962  1.1  mrg     case MULT_EXPR:
    963  1.1  mrg     case TRUNC_DIV_EXPR:
    964  1.1  mrg     case TRUNC_MOD_EXPR:
    965  1.1  mrg     case EXACT_DIV_EXPR:
    966  1.1  mrg     case RDIV_EXPR:
    967  1.1  mrg       multiplicative_expression (TREE_OPERAND (e, 0));
    968  1.1  mrg       pp_space (this);
    969  1.1  mrg       if (code == MULT_EXPR)
    970  1.1  mrg 	pp_star (this);
    971  1.1  mrg       else if (code != TRUNC_MOD_EXPR)
    972  1.1  mrg 	pp_slash (this);
    973  1.1  mrg       else
    974  1.1  mrg 	pp_modulo (this);
    975  1.1  mrg       pp_space (this);
    976  1.1  mrg       pp_cxx_pm_expression (this, TREE_OPERAND (e, 1));
    977  1.1  mrg       break;
    978  1.1  mrg 
    979  1.1  mrg     default:
    980  1.1  mrg       pp_cxx_pm_expression (this, e);
    981  1.1  mrg       break;
    982  1.1  mrg     }
    983  1.1  mrg }
    984  1.1  mrg 
    985  1.1  mrg /* conditional-expression:
    986  1.1  mrg       logical-or-expression
    987  1.1  mrg       logical-or-expression ?  expression  : assignment-expression  */
    988  1.1  mrg 
    989  1.1  mrg void
    990  1.1  mrg cxx_pretty_printer::conditional_expression (tree e)
    991  1.1  mrg {
    992  1.1  mrg   if (TREE_CODE (e) == COND_EXPR)
    993  1.1  mrg     {
    994  1.1  mrg       pp_c_logical_or_expression (this, TREE_OPERAND (e, 0));
    995  1.1  mrg       pp_space (this);
    996  1.1  mrg       pp_question (this);
    997  1.1  mrg       pp_space (this);
    998  1.1  mrg       expression (TREE_OPERAND (e, 1));
    999  1.1  mrg       pp_space (this);
   1000  1.1  mrg       assignment_expression (TREE_OPERAND (e, 2));
   1001  1.1  mrg     }
   1002  1.1  mrg   else
   1003  1.1  mrg     pp_c_logical_or_expression (this, e);
   1004  1.1  mrg }
   1005  1.1  mrg 
   1006  1.1  mrg /* Pretty-print a compound assignment operator token as indicated by T.  */
   1007  1.1  mrg 
   1008  1.1  mrg static void
   1009  1.1  mrg pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
   1010  1.1  mrg {
   1011  1.1  mrg   const char *op;
   1012  1.1  mrg 
   1013  1.1  mrg   switch (TREE_CODE (t))
   1014  1.1  mrg     {
   1015  1.1  mrg     case NOP_EXPR:
   1016  1.1  mrg       op = "=";
   1017  1.1  mrg       break;
   1018  1.1  mrg 
   1019  1.1  mrg     case PLUS_EXPR:
   1020  1.1  mrg       op = "+=";
   1021  1.1  mrg       break;
   1022  1.1  mrg 
   1023  1.1  mrg     case MINUS_EXPR:
   1024  1.1  mrg       op = "-=";
   1025  1.1  mrg       break;
   1026  1.1  mrg 
   1027  1.1  mrg     case TRUNC_DIV_EXPR:
   1028  1.1  mrg       op = "/=";
   1029  1.1  mrg       break;
   1030  1.1  mrg 
   1031  1.1  mrg     case TRUNC_MOD_EXPR:
   1032  1.1  mrg       op = "%=";
   1033  1.1  mrg       break;
   1034  1.1  mrg 
   1035  1.1  mrg     default:
   1036  1.1  mrg       op = get_tree_code_name (TREE_CODE (t));
   1037  1.1  mrg       break;
   1038  1.1  mrg     }
   1039  1.1  mrg 
   1040  1.1  mrg   pp_cxx_ws_string (pp, op);
   1041  1.1  mrg }
   1042  1.1  mrg 
   1043  1.1  mrg 
   1044  1.1  mrg /* assignment-expression:
   1045  1.1  mrg       conditional-expression
   1046  1.1  mrg       logical-or-expression assignment-operator assignment-expression
   1047  1.1  mrg       throw-expression
   1048  1.1  mrg 
   1049  1.1  mrg    throw-expression:
   1050  1.1  mrg        throw assignment-expression(opt)
   1051  1.1  mrg 
   1052  1.1  mrg    assignment-operator: one of
   1053  1.1  mrg       =    *=    /=    %=    +=    -=    >>=    <<=    &=    ^=    |=  */
   1054  1.1  mrg 
   1055  1.1  mrg void
   1056  1.1  mrg cxx_pretty_printer::assignment_expression (tree e)
   1057  1.1  mrg {
   1058  1.1  mrg   switch (TREE_CODE (e))
   1059  1.1  mrg     {
   1060  1.1  mrg     case MODIFY_EXPR:
   1061  1.1  mrg     case INIT_EXPR:
   1062  1.1  mrg       pp_c_logical_or_expression (this, TREE_OPERAND (e, 0));
   1063  1.1  mrg       pp_space (this);
   1064  1.1  mrg       pp_equal (this);
   1065  1.1  mrg       pp_space (this);
   1066  1.1  mrg       assignment_expression (TREE_OPERAND (e, 1));
   1067  1.1  mrg       break;
   1068  1.1  mrg 
   1069  1.1  mrg     case THROW_EXPR:
   1070  1.1  mrg       pp_cxx_ws_string (this, "throw");
   1071  1.1  mrg       if (TREE_OPERAND (e, 0))
   1072  1.1  mrg 	assignment_expression (TREE_OPERAND (e, 0));
   1073  1.1  mrg       break;
   1074  1.1  mrg 
   1075  1.1  mrg     case MODOP_EXPR:
   1076  1.1  mrg       pp_c_logical_or_expression (this, TREE_OPERAND (e, 0));
   1077  1.1  mrg       pp_cxx_assignment_operator (this, TREE_OPERAND (e, 1));
   1078  1.1  mrg       assignment_expression (TREE_OPERAND (e, 2));
   1079  1.1  mrg       break;
   1080  1.1  mrg 
   1081  1.1  mrg     default:
   1082  1.1  mrg       conditional_expression (e);
   1083  1.1  mrg       break;
   1084  1.1  mrg     }
   1085  1.1  mrg }
   1086  1.1  mrg 
   1087  1.1  mrg void
   1088  1.1  mrg cxx_pretty_printer::expression (tree t)
   1089  1.1  mrg {
   1090  1.1  mrg   switch (TREE_CODE (t))
   1091  1.1  mrg     {
   1092  1.1  mrg     case STRING_CST:
   1093  1.1  mrg     case VOID_CST:
   1094  1.1  mrg     case INTEGER_CST:
   1095  1.1  mrg     case REAL_CST:
   1096  1.1  mrg     case COMPLEX_CST:
   1097  1.1  mrg       constant (t);
   1098  1.1  mrg       break;
   1099  1.1  mrg 
   1100  1.1  mrg     case USERDEF_LITERAL:
   1101  1.1  mrg       pp_cxx_userdef_literal (this, t);
   1102  1.1  mrg       break;
   1103  1.1  mrg 
   1104  1.1  mrg     case RESULT_DECL:
   1105  1.1  mrg       pp_cxx_unqualified_id (this, t);
   1106  1.1  mrg       break;
   1107  1.1  mrg 
   1108  1.1  mrg #if 0
   1109  1.1  mrg     case OFFSET_REF:
   1110  1.1  mrg #endif
   1111  1.1  mrg     case SCOPE_REF:
   1112  1.1  mrg     case PTRMEM_CST:
   1113  1.1  mrg       pp_cxx_qualified_id (this, t);
   1114  1.1  mrg       break;
   1115  1.1  mrg 
   1116  1.1  mrg     case OVERLOAD:
   1117  1.1  mrg       t = OVL_FIRST (t);
   1118  1.1  mrg       /* FALLTHRU */
   1119  1.1  mrg     case VAR_DECL:
   1120  1.1  mrg     case PARM_DECL:
   1121  1.1  mrg     case FIELD_DECL:
   1122  1.1  mrg     case CONST_DECL:
   1123  1.1  mrg     case FUNCTION_DECL:
   1124  1.1  mrg     case BASELINK:
   1125  1.1  mrg     case TEMPLATE_DECL:
   1126  1.1  mrg     case TEMPLATE_TYPE_PARM:
   1127  1.1  mrg     case TEMPLATE_PARM_INDEX:
   1128  1.1  mrg     case TEMPLATE_TEMPLATE_PARM:
   1129  1.1  mrg     case STMT_EXPR:
   1130  1.1  mrg     case REQUIRES_EXPR:
   1131  1.1  mrg       primary_expression (t);
   1132  1.1  mrg       break;
   1133  1.1  mrg 
   1134  1.1  mrg     case CALL_EXPR:
   1135  1.1  mrg     case DYNAMIC_CAST_EXPR:
   1136  1.1  mrg     case STATIC_CAST_EXPR:
   1137  1.1  mrg     case REINTERPRET_CAST_EXPR:
   1138  1.1  mrg     case CONST_CAST_EXPR:
   1139  1.1  mrg #if 0
   1140  1.1  mrg     case MEMBER_REF:
   1141  1.1  mrg #endif
   1142  1.1  mrg     case EMPTY_CLASS_EXPR:
   1143  1.1  mrg     case TYPEID_EXPR:
   1144  1.1  mrg     case PSEUDO_DTOR_EXPR:
   1145  1.1  mrg     case AGGR_INIT_EXPR:
   1146  1.1  mrg     case ARROW_EXPR:
   1147  1.1  mrg       postfix_expression (t);
   1148  1.1  mrg       break;
   1149  1.1  mrg 
   1150  1.1  mrg     case NEW_EXPR:
   1151  1.1  mrg     case VEC_NEW_EXPR:
   1152  1.1  mrg       pp_cxx_new_expression (this, t);
   1153  1.1  mrg       break;
   1154  1.1  mrg 
   1155  1.1  mrg     case DELETE_EXPR:
   1156  1.1  mrg     case VEC_DELETE_EXPR:
   1157  1.1  mrg       pp_cxx_delete_expression (this, t);
   1158  1.1  mrg       break;
   1159  1.1  mrg 
   1160  1.1  mrg     case SIZEOF_EXPR:
   1161  1.1  mrg     case ALIGNOF_EXPR:
   1162  1.1  mrg     case NOEXCEPT_EXPR:
   1163  1.1  mrg     case UNARY_PLUS_EXPR:
   1164  1.1  mrg       unary_expression (t);
   1165  1.1  mrg       break;
   1166  1.1  mrg 
   1167  1.1  mrg     case CAST_EXPR:
   1168  1.1  mrg     case IMPLICIT_CONV_EXPR:
   1169  1.1  mrg       pp_cxx_cast_expression (this, t);
   1170  1.1  mrg       break;
   1171  1.1  mrg 
   1172  1.1  mrg     case OFFSET_REF:
   1173  1.1  mrg     case MEMBER_REF:
   1174  1.1  mrg     case DOTSTAR_EXPR:
   1175  1.1  mrg       pp_cxx_pm_expression (this, t);
   1176  1.1  mrg       break;
   1177  1.1  mrg 
   1178  1.1  mrg     case MULT_EXPR:
   1179  1.1  mrg     case TRUNC_DIV_EXPR:
   1180  1.1  mrg     case TRUNC_MOD_EXPR:
   1181  1.1  mrg     case EXACT_DIV_EXPR:
   1182  1.1  mrg     case RDIV_EXPR:
   1183  1.1  mrg       multiplicative_expression (t);
   1184  1.1  mrg       break;
   1185  1.1  mrg 
   1186  1.1  mrg     case COND_EXPR:
   1187  1.1  mrg       conditional_expression (t);
   1188  1.1  mrg       break;
   1189  1.1  mrg 
   1190  1.1  mrg     case MODIFY_EXPR:
   1191  1.1  mrg     case INIT_EXPR:
   1192  1.1  mrg     case THROW_EXPR:
   1193  1.1  mrg     case MODOP_EXPR:
   1194  1.1  mrg       assignment_expression (t);
   1195  1.1  mrg       break;
   1196  1.1  mrg 
   1197  1.1  mrg     case NON_DEPENDENT_EXPR:
   1198  1.1  mrg     case MUST_NOT_THROW_EXPR:
   1199  1.1  mrg       expression (TREE_OPERAND (t, 0));
   1200  1.1  mrg       break;
   1201  1.1  mrg 
   1202  1.1  mrg     case EXPR_PACK_EXPANSION:
   1203  1.1  mrg       expression (PACK_EXPANSION_PATTERN (t));
   1204  1.1  mrg       pp_cxx_ws_string (this, "...");
   1205  1.1  mrg       break;
   1206  1.1  mrg 
   1207  1.1  mrg     case UNARY_LEFT_FOLD_EXPR:
   1208  1.1  mrg       pp_cxx_unary_left_fold_expression (this, t);
   1209  1.1  mrg       break;
   1210  1.1  mrg 
   1211  1.1  mrg     case UNARY_RIGHT_FOLD_EXPR:
   1212  1.1  mrg       pp_cxx_unary_right_fold_expression (this, t);
   1213  1.1  mrg     break;
   1214  1.1  mrg 
   1215  1.1  mrg     case BINARY_LEFT_FOLD_EXPR:
   1216  1.1  mrg     case BINARY_RIGHT_FOLD_EXPR:
   1217  1.1  mrg       pp_cxx_binary_fold_expression (this, t);
   1218  1.1  mrg       break;
   1219  1.1  mrg 
   1220  1.1  mrg     case TEMPLATE_ID_EXPR:
   1221  1.1  mrg       pp_cxx_template_id (this, t);
   1222  1.1  mrg       break;
   1223  1.1  mrg 
   1224  1.1  mrg     case NONTYPE_ARGUMENT_PACK:
   1225  1.1  mrg       {
   1226  1.1  mrg 	tree args = ARGUMENT_PACK_ARGS (t);
   1227  1.1  mrg 	int i, len = TREE_VEC_LENGTH (args);
   1228  1.1  mrg 	pp_cxx_left_brace (this);
   1229  1.1  mrg 	for (i = 0; i < len; ++i)
   1230  1.1  mrg 	  {
   1231  1.1  mrg 	    if (i > 0)
   1232  1.1  mrg 	      pp_cxx_separate_with (this, ',');
   1233  1.1  mrg 	    expression (TREE_VEC_ELT (args, i));
   1234  1.1  mrg 	  }
   1235  1.1  mrg 	pp_cxx_right_brace (this);
   1236  1.1  mrg       }
   1237  1.1  mrg       break;
   1238  1.1  mrg 
   1239  1.1  mrg     case LAMBDA_EXPR:
   1240  1.1  mrg       pp_cxx_ws_string (this, "<lambda>");
   1241  1.1  mrg       break;
   1242  1.1  mrg 
   1243  1.1  mrg     case TRAIT_EXPR:
   1244  1.1  mrg       pp_cxx_trait_expression (this, t);
   1245  1.1  mrg       break;
   1246  1.1  mrg 
   1247  1.1  mrg     case ATOMIC_CONSTR:
   1248  1.1  mrg     case CHECK_CONSTR:
   1249  1.1  mrg     case CONJ_CONSTR:
   1250  1.1  mrg     case DISJ_CONSTR:
   1251  1.1  mrg       pp_cxx_constraint (this, t);
   1252  1.1  mrg       break;
   1253  1.1  mrg 
   1254  1.1  mrg     case PAREN_EXPR:
   1255  1.1  mrg       pp_cxx_left_paren (this);
   1256  1.1  mrg       expression (TREE_OPERAND (t, 0));
   1257  1.1  mrg       pp_cxx_right_paren (this);
   1258  1.1  mrg       break;
   1259  1.1  mrg 
   1260  1.1  mrg     default:
   1261  1.1  mrg       c_pretty_printer::expression (t);
   1262  1.1  mrg       break;
   1263  1.1  mrg     }
   1264  1.1  mrg }
   1265  1.1  mrg 
   1266  1.1  mrg 
   1267  1.1  mrg /* Declarations.  */
   1268  1.1  mrg 
   1269  1.1  mrg /* function-specifier:
   1270  1.1  mrg       inline
   1271  1.1  mrg       virtual
   1272  1.1  mrg       explicit   */
   1273  1.1  mrg 
   1274  1.1  mrg void
   1275  1.1  mrg cxx_pretty_printer::function_specifier (tree t)
   1276  1.1  mrg {
   1277  1.1  mrg   switch (TREE_CODE (t))
   1278  1.1  mrg     {
   1279  1.1  mrg     case FUNCTION_DECL:
   1280  1.1  mrg       if (DECL_VIRTUAL_P (t))
   1281  1.1  mrg 	pp_cxx_ws_string (this, "virtual");
   1282  1.1  mrg       else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
   1283  1.1  mrg 	pp_cxx_ws_string (this, "explicit");
   1284  1.1  mrg       else
   1285  1.1  mrg         c_pretty_printer::function_specifier (t);
   1286  1.1  mrg 
   1287  1.1  mrg     default:
   1288  1.1  mrg       break;
   1289  1.1  mrg     }
   1290  1.1  mrg }
   1291  1.1  mrg 
   1292  1.1  mrg /* decl-specifier-seq:
   1293  1.1  mrg       decl-specifier-seq(opt) decl-specifier
   1294  1.1  mrg 
   1295  1.1  mrg    decl-specifier:
   1296  1.1  mrg       storage-class-specifier
   1297  1.1  mrg       type-specifier
   1298  1.1  mrg       function-specifier
   1299  1.1  mrg       friend
   1300  1.1  mrg       typedef  */
   1301  1.1  mrg 
   1302  1.1  mrg void
   1303  1.1  mrg cxx_pretty_printer::declaration_specifiers (tree t)
   1304  1.1  mrg {
   1305  1.1  mrg   switch (TREE_CODE (t))
   1306  1.1  mrg     {
   1307  1.1  mrg     case VAR_DECL:
   1308  1.1  mrg     case PARM_DECL:
   1309  1.1  mrg     case CONST_DECL:
   1310  1.1  mrg     case FIELD_DECL:
   1311  1.1  mrg       storage_class_specifier (t);
   1312  1.1  mrg       declaration_specifiers (TREE_TYPE (t));
   1313  1.1  mrg       break;
   1314  1.1  mrg 
   1315  1.1  mrg     case TYPE_DECL:
   1316  1.1  mrg       pp_cxx_ws_string (this, "typedef");
   1317  1.1  mrg       declaration_specifiers (TREE_TYPE (t));
   1318  1.1  mrg       break;
   1319  1.1  mrg 
   1320  1.1  mrg     case FUNCTION_DECL:
   1321  1.1  mrg       /* Constructors don't have return types.  And conversion functions
   1322  1.1  mrg 	 do not have a type-specifier in their return types.  */
   1323  1.1  mrg       if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
   1324  1.1  mrg 	function_specifier (t);
   1325  1.1  mrg       else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
   1326  1.1  mrg 	declaration_specifiers (TREE_TYPE (TREE_TYPE (t)));
   1327  1.1  mrg       else
   1328  1.1  mrg         c_pretty_printer::declaration_specifiers (t);
   1329  1.1  mrg       break;
   1330  1.1  mrg     default:
   1331  1.1  mrg         c_pretty_printer::declaration_specifiers (t);
   1332  1.1  mrg       break;
   1333  1.1  mrg     }
   1334  1.1  mrg }
   1335  1.1  mrg 
   1336  1.1  mrg /* simple-type-specifier:
   1337  1.1  mrg       ::(opt) nested-name-specifier(opt) type-name
   1338  1.1  mrg       ::(opt) nested-name-specifier(opt) template(opt) template-id
   1339  1.1  mrg       decltype-specifier
   1340  1.1  mrg       char
   1341  1.1  mrg       wchar_t
   1342  1.1  mrg       bool
   1343  1.1  mrg       short
   1344  1.1  mrg       int
   1345  1.1  mrg       long
   1346  1.1  mrg       signed
   1347  1.1  mrg       unsigned
   1348  1.1  mrg       float
   1349  1.1  mrg       double
   1350  1.1  mrg       void  */
   1351  1.1  mrg 
   1352  1.1  mrg void
   1353  1.1  mrg cxx_pretty_printer::simple_type_specifier (tree t)
   1354  1.1  mrg {
   1355  1.1  mrg   switch (TREE_CODE (t))
   1356  1.1  mrg     {
   1357  1.1  mrg     case RECORD_TYPE:
   1358  1.1  mrg     case UNION_TYPE:
   1359  1.1  mrg     case ENUMERAL_TYPE:
   1360  1.1  mrg       pp_cxx_qualified_id (this, t);
   1361  1.1  mrg       break;
   1362  1.1  mrg 
   1363  1.1  mrg     case TEMPLATE_TYPE_PARM:
   1364  1.1  mrg     case TEMPLATE_TEMPLATE_PARM:
   1365  1.1  mrg     case TEMPLATE_PARM_INDEX:
   1366  1.1  mrg     case BOUND_TEMPLATE_TEMPLATE_PARM:
   1367  1.1  mrg       pp_cxx_unqualified_id (this, t);
   1368  1.1  mrg       if (tree c = PLACEHOLDER_TYPE_CONSTRAINTS (t))
   1369  1.1  mrg         pp_cxx_constrained_type_spec (this, c);
   1370  1.1  mrg       break;
   1371  1.1  mrg 
   1372  1.1  mrg     case TYPENAME_TYPE:
   1373  1.1  mrg       pp_cxx_ws_string (this, "typename");
   1374  1.1  mrg       pp_cxx_nested_name_specifier (this, TYPE_CONTEXT (t));
   1375  1.1  mrg       pp_cxx_unqualified_id (this, TYPENAME_TYPE_FULLNAME (t));
   1376  1.1  mrg       break;
   1377  1.1  mrg 
   1378  1.1  mrg     case DECLTYPE_TYPE:
   1379  1.1  mrg       pp_cxx_ws_string (this, "decltype");
   1380  1.1  mrg       pp_cxx_left_paren (this);
   1381  1.1  mrg       this->expression (DECLTYPE_TYPE_EXPR (t));
   1382  1.1  mrg       pp_cxx_right_paren (this);
   1383  1.1  mrg       break;
   1384  1.1  mrg 
   1385  1.1  mrg     case NULLPTR_TYPE:
   1386  1.1  mrg       pp_cxx_ws_string (this, "std::nullptr_t");
   1387  1.1  mrg       break;
   1388  1.1  mrg 
   1389  1.1  mrg     default:
   1390  1.1  mrg       c_pretty_printer::simple_type_specifier (t);
   1391  1.1  mrg       break;
   1392  1.1  mrg     }
   1393  1.1  mrg }
   1394  1.1  mrg 
   1395  1.1  mrg /* type-specifier-seq:
   1396  1.1  mrg       type-specifier type-specifier-seq(opt)
   1397  1.1  mrg 
   1398  1.1  mrg    type-specifier:
   1399  1.1  mrg       simple-type-specifier
   1400  1.1  mrg       class-specifier
   1401  1.1  mrg       enum-specifier
   1402  1.1  mrg       elaborated-type-specifier
   1403  1.1  mrg       cv-qualifier   */
   1404  1.1  mrg 
   1405  1.1  mrg static void
   1406  1.1  mrg pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
   1407  1.1  mrg {
   1408  1.1  mrg   switch (TREE_CODE (t))
   1409  1.1  mrg     {
   1410  1.1  mrg     case TEMPLATE_DECL:
   1411  1.1  mrg     case TEMPLATE_TYPE_PARM:
   1412  1.1  mrg     case TEMPLATE_TEMPLATE_PARM:
   1413  1.1  mrg     case TYPE_DECL:
   1414  1.1  mrg     case BOUND_TEMPLATE_TEMPLATE_PARM:
   1415  1.1  mrg     case DECLTYPE_TYPE:
   1416  1.1  mrg     case NULLPTR_TYPE:
   1417  1.1  mrg       pp_cxx_cv_qualifier_seq (pp, t);
   1418  1.1  mrg       pp->simple_type_specifier (t);
   1419  1.1  mrg       break;
   1420  1.1  mrg 
   1421  1.1  mrg     case METHOD_TYPE:
   1422  1.1  mrg       pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
   1423  1.1  mrg       pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
   1424  1.1  mrg       pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
   1425  1.1  mrg       break;
   1426  1.1  mrg 
   1427  1.1  mrg     case RECORD_TYPE:
   1428  1.1  mrg       if (TYPE_PTRMEMFUNC_P (t))
   1429  1.1  mrg 	{
   1430  1.1  mrg 	  tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
   1431  1.1  mrg 	  pp->declaration_specifiers (TREE_TYPE (TREE_TYPE (pfm)));
   1432  1.1  mrg 	  pp_cxx_whitespace (pp);
   1433  1.1  mrg 	  pp_cxx_ptr_operator (pp, t);
   1434  1.1  mrg 	  break;
   1435  1.1  mrg 	}
   1436  1.1  mrg       /* fall through */
   1437  1.1  mrg 
   1438  1.1  mrg     case OFFSET_TYPE:
   1439  1.1  mrg       if (TYPE_PTRDATAMEM_P (t))
   1440  1.1  mrg 	{
   1441  1.1  mrg 	  pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
   1442  1.1  mrg 	  pp_cxx_whitespace (pp);
   1443  1.1  mrg 	  pp_cxx_ptr_operator (pp, t);
   1444  1.1  mrg 	  break;
   1445  1.1  mrg 	}
   1446  1.1  mrg       /* fall through */
   1447  1.1  mrg 
   1448  1.1  mrg     default:
   1449  1.1  mrg       if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
   1450  1.1  mrg 	pp_c_specifier_qualifier_list (pp, t);
   1451  1.1  mrg     }
   1452  1.1  mrg }
   1453  1.1  mrg 
   1454  1.1  mrg /* ptr-operator:
   1455  1.1  mrg       * cv-qualifier-seq(opt)
   1456  1.1  mrg       &
   1457  1.1  mrg       ::(opt) nested-name-specifier * cv-qualifier-seq(opt)  */
   1458  1.1  mrg 
   1459  1.1  mrg static void
   1460  1.1  mrg pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
   1461  1.1  mrg {
   1462  1.1  mrg   if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
   1463  1.1  mrg     t = TREE_TYPE (t);
   1464  1.1  mrg   switch (TREE_CODE (t))
   1465  1.1  mrg     {
   1466  1.1  mrg     case REFERENCE_TYPE:
   1467  1.1  mrg     case POINTER_TYPE:
   1468  1.1  mrg       if (TYPE_PTR_OR_PTRMEM_P (TREE_TYPE (t)))
   1469  1.1  mrg 	pp_cxx_ptr_operator (pp, TREE_TYPE (t));
   1470  1.1  mrg       pp_c_attributes_display (pp, TYPE_ATTRIBUTES (TREE_TYPE (t)));
   1471  1.1  mrg       if (TYPE_PTR_P (t))
   1472  1.1  mrg 	{
   1473  1.1  mrg 	  pp_star (pp);
   1474  1.1  mrg 	  pp_cxx_cv_qualifier_seq (pp, t);
   1475  1.1  mrg 	}
   1476  1.1  mrg       else
   1477  1.1  mrg 	pp_ampersand (pp);
   1478  1.1  mrg       break;
   1479  1.1  mrg 
   1480  1.1  mrg     case RECORD_TYPE:
   1481  1.1  mrg       if (TYPE_PTRMEMFUNC_P (t))
   1482  1.1  mrg 	{
   1483  1.1  mrg 	  pp_cxx_left_paren (pp);
   1484  1.1  mrg 	  pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
   1485  1.1  mrg 	  pp_star (pp);
   1486  1.1  mrg 	  break;
   1487  1.1  mrg 	}
   1488  1.1  mrg       /* FALLTHRU */
   1489  1.1  mrg     case OFFSET_TYPE:
   1490  1.1  mrg       if (TYPE_PTRMEM_P (t))
   1491  1.1  mrg 	{
   1492  1.1  mrg 	  if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
   1493  1.1  mrg 	    pp_cxx_left_paren (pp);
   1494  1.1  mrg 	  pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
   1495  1.1  mrg 	  pp_star (pp);
   1496  1.1  mrg 	  pp_cxx_cv_qualifier_seq (pp, t);
   1497  1.1  mrg 	  break;
   1498  1.1  mrg 	}
   1499  1.1  mrg       /* fall through.  */
   1500  1.1  mrg 
   1501  1.1  mrg     default:
   1502  1.1  mrg       pp_unsupported_tree (pp, t);
   1503  1.1  mrg       break;
   1504  1.1  mrg     }
   1505  1.1  mrg }
   1506  1.1  mrg 
   1507  1.1  mrg static inline tree
   1508  1.1  mrg pp_cxx_implicit_parameter_type (tree mf)
   1509  1.1  mrg {
   1510  1.1  mrg   return class_of_this_parm (TREE_TYPE (mf));
   1511  1.1  mrg }
   1512  1.1  mrg 
   1513  1.1  mrg /*
   1514  1.1  mrg    parameter-declaration:
   1515  1.1  mrg       decl-specifier-seq declarator
   1516  1.1  mrg       decl-specifier-seq declarator = assignment-expression
   1517  1.1  mrg       decl-specifier-seq abstract-declarator(opt)
   1518  1.1  mrg       decl-specifier-seq abstract-declarator(opt) assignment-expression  */
   1519  1.1  mrg 
   1520  1.1  mrg static inline void
   1521  1.1  mrg pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
   1522  1.1  mrg {
   1523  1.1  mrg   pp->declaration_specifiers (t);
   1524  1.1  mrg   if (TYPE_P (t))
   1525  1.1  mrg     pp->abstract_declarator (t);
   1526  1.1  mrg   else
   1527  1.1  mrg     pp->declarator (t);
   1528  1.1  mrg }
   1529  1.1  mrg 
   1530  1.1  mrg /* parameter-declaration-clause:
   1531  1.1  mrg       parameter-declaration-list(opt) ...(opt)
   1532  1.1  mrg       parameter-declaration-list , ...
   1533  1.1  mrg 
   1534  1.1  mrg    parameter-declaration-list:
   1535  1.1  mrg       parameter-declaration
   1536  1.1  mrg       parameter-declaration-list , parameter-declaration  */
   1537  1.1  mrg 
   1538  1.1  mrg static void
   1539  1.1  mrg pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
   1540  1.1  mrg {
   1541  1.1  mrg   gcc_assert (FUNC_OR_METHOD_TYPE_P (t) || TREE_CODE (t) == FUNCTION_DECL);
   1542  1.1  mrg   tree types, args;
   1543  1.1  mrg   if (TYPE_P (t))
   1544  1.1  mrg     {
   1545  1.1  mrg       types = TYPE_ARG_TYPES (t);
   1546  1.1  mrg       args = NULL_TREE;
   1547  1.1  mrg     }
   1548  1.1  mrg   else
   1549  1.1  mrg     {
   1550  1.1  mrg       types = FUNCTION_FIRST_USER_PARMTYPE (t);
   1551  1.1  mrg       args = FUNCTION_FIRST_USER_PARM (t);
   1552  1.1  mrg     }
   1553  1.1  mrg   bool abstract = !args || (pp->flags & pp_c_flag_abstract);
   1554  1.1  mrg 
   1555  1.1  mrg   /* Skip artificial parameter for non-static member functions.  */
   1556  1.1  mrg   if (TREE_CODE (t) == METHOD_TYPE)
   1557  1.1  mrg     types = TREE_CHAIN (types);
   1558  1.1  mrg 
   1559  1.1  mrg   bool first = true;
   1560  1.1  mrg   pp_cxx_left_paren (pp);
   1561  1.1  mrg   for (; types != void_list_node; types = TREE_CHAIN (types))
   1562  1.1  mrg     {
   1563  1.1  mrg       if (!first)
   1564  1.1  mrg 	pp_cxx_separate_with (pp, ',');
   1565  1.1  mrg       first = false;
   1566  1.1  mrg       if (!types)
   1567  1.1  mrg 	{
   1568  1.1  mrg 	  pp_cxx_ws_string (pp, "...");
   1569  1.1  mrg 	  break;
   1570  1.1  mrg 	}
   1571  1.1  mrg       pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
   1572  1.1  mrg       if (!abstract && pp->flags & pp_cxx_flag_default_argument)
   1573  1.1  mrg 	{
   1574  1.1  mrg 	  pp_cxx_whitespace (pp);
   1575  1.1  mrg 	  pp_equal (pp);
   1576  1.1  mrg 	  pp_cxx_whitespace (pp);
   1577  1.1  mrg 	  pp->assignment_expression (TREE_PURPOSE (types));
   1578  1.1  mrg 	}
   1579  1.1  mrg       if (!abstract)
   1580  1.1  mrg 	args = TREE_CHAIN (args);
   1581  1.1  mrg     }
   1582  1.1  mrg   pp_cxx_right_paren (pp);
   1583  1.1  mrg }
   1584  1.1  mrg 
   1585  1.1  mrg /* exception-specification:
   1586  1.1  mrg       throw ( type-id-list(opt) )
   1587  1.1  mrg 
   1588  1.1  mrg    type-id-list
   1589  1.1  mrg       type-id
   1590  1.1  mrg       type-id-list , type-id   */
   1591  1.1  mrg 
   1592  1.1  mrg static void
   1593  1.1  mrg pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
   1594  1.1  mrg {
   1595  1.1  mrg   tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
   1596  1.1  mrg   bool need_comma = false;
   1597  1.1  mrg 
   1598  1.1  mrg   if (ex_spec == NULL)
   1599  1.1  mrg     return;
   1600  1.1  mrg   if (TREE_PURPOSE (ex_spec))
   1601  1.1  mrg     {
   1602  1.1  mrg       pp_cxx_ws_string (pp, "noexcept");
   1603  1.1  mrg       pp_cxx_whitespace (pp);
   1604  1.1  mrg       pp_cxx_left_paren (pp);
   1605  1.1  mrg       if (DEFERRED_NOEXCEPT_SPEC_P (ex_spec))
   1606  1.1  mrg 	pp_cxx_ws_string (pp, "<uninstantiated>");
   1607  1.1  mrg       else
   1608  1.1  mrg 	pp->expression (TREE_PURPOSE (ex_spec));
   1609  1.1  mrg       pp_cxx_right_paren (pp);
   1610  1.1  mrg       return;
   1611  1.1  mrg     }
   1612  1.1  mrg   pp_cxx_ws_string (pp, "throw");
   1613  1.1  mrg   pp_cxx_left_paren (pp);
   1614  1.1  mrg   for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
   1615  1.1  mrg     {
   1616  1.1  mrg       tree type = TREE_VALUE (ex_spec);
   1617  1.1  mrg       tree argpack = NULL_TREE;
   1618  1.1  mrg       int i, len = 1;
   1619  1.1  mrg 
   1620  1.1  mrg       if (ARGUMENT_PACK_P (type))
   1621  1.1  mrg 	{
   1622  1.1  mrg 	  argpack = ARGUMENT_PACK_ARGS (type);
   1623  1.1  mrg 	  len = TREE_VEC_LENGTH (argpack);
   1624  1.1  mrg 	}
   1625  1.1  mrg 
   1626  1.1  mrg       for (i = 0; i < len; ++i)
   1627  1.1  mrg 	{
   1628  1.1  mrg 	  if (argpack)
   1629  1.1  mrg 	    type = TREE_VEC_ELT (argpack, i);
   1630  1.1  mrg 
   1631  1.1  mrg 	  if (need_comma)
   1632  1.1  mrg 	    pp_cxx_separate_with (pp, ',');
   1633  1.1  mrg 	  else
   1634  1.1  mrg 	    need_comma = true;
   1635  1.1  mrg 
   1636  1.1  mrg 	  pp->type_id (type);
   1637  1.1  mrg 	}
   1638  1.1  mrg     }
   1639  1.1  mrg   pp_cxx_right_paren (pp);
   1640  1.1  mrg }
   1641  1.1  mrg 
   1642  1.1  mrg /* direct-declarator:
   1643  1.1  mrg       declarator-id
   1644  1.1  mrg       direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
   1645  1.1  mrg 					    exception-specification(opt)
   1646  1.1  mrg       direct-declaration [ constant-expression(opt) ]
   1647  1.1  mrg       ( declarator )  */
   1648  1.1  mrg 
   1649  1.1  mrg void
   1650  1.1  mrg cxx_pretty_printer::direct_declarator (tree t)
   1651  1.1  mrg {
   1652  1.1  mrg   switch (TREE_CODE (t))
   1653  1.1  mrg     {
   1654  1.1  mrg     case VAR_DECL:
   1655  1.1  mrg     case PARM_DECL:
   1656  1.1  mrg     case CONST_DECL:
   1657  1.1  mrg     case FIELD_DECL:
   1658  1.1  mrg       if (DECL_NAME (t))
   1659  1.1  mrg 	{
   1660  1.1  mrg 	  pp_cxx_space_for_pointer_operator (this, TREE_TYPE (t));
   1661  1.1  mrg 
   1662  1.1  mrg 	  if ((TREE_CODE (t) == PARM_DECL && DECL_PACK_P (t))
   1663  1.1  mrg 	      || template_parameter_pack_p (t))
   1664  1.1  mrg 	    /* A function parameter pack or non-type template
   1665  1.1  mrg 	       parameter pack.  */
   1666  1.1  mrg 	    pp_cxx_ws_string (this, "...");
   1667  1.1  mrg 
   1668  1.1  mrg 	  id_expression (DECL_NAME (t));
   1669  1.1  mrg 	}
   1670  1.1  mrg       abstract_declarator (TREE_TYPE (t));
   1671  1.1  mrg       break;
   1672  1.1  mrg 
   1673  1.1  mrg     case FUNCTION_DECL:
   1674  1.1  mrg       pp_cxx_space_for_pointer_operator (this, TREE_TYPE (TREE_TYPE (t)));
   1675  1.1  mrg       expression (t);
   1676  1.1  mrg       pp_cxx_parameter_declaration_clause (this, t);
   1677  1.1  mrg 
   1678  1.1  mrg       if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
   1679  1.1  mrg 	{
   1680  1.1  mrg 	  padding = pp_before;
   1681  1.1  mrg 	  pp_cxx_cv_qualifier_seq (this, pp_cxx_implicit_parameter_type (t));
   1682  1.1  mrg 	}
   1683  1.1  mrg 
   1684  1.1  mrg       pp_cxx_exception_specification (this, TREE_TYPE (t));
   1685  1.1  mrg       break;
   1686  1.1  mrg 
   1687  1.1  mrg     case TYPENAME_TYPE:
   1688  1.1  mrg     case TEMPLATE_DECL:
   1689  1.1  mrg     case TEMPLATE_TYPE_PARM:
   1690  1.1  mrg     case TEMPLATE_PARM_INDEX:
   1691  1.1  mrg     case TEMPLATE_TEMPLATE_PARM:
   1692  1.1  mrg       break;
   1693  1.1  mrg 
   1694  1.1  mrg     default:
   1695  1.1  mrg       c_pretty_printer::direct_declarator (t);
   1696  1.1  mrg       break;
   1697  1.1  mrg     }
   1698  1.1  mrg }
   1699  1.1  mrg 
   1700  1.1  mrg /* declarator:
   1701  1.1  mrg    direct-declarator
   1702  1.1  mrg    ptr-operator declarator  */
   1703  1.1  mrg 
   1704  1.1  mrg void
   1705  1.1  mrg cxx_pretty_printer::declarator (tree t)
   1706  1.1  mrg {
   1707  1.1  mrg   direct_declarator (t);
   1708  1.1  mrg 
   1709  1.1  mrg   // Print a requires clause.
   1710  1.1  mrg   if (flag_concepts)
   1711  1.1  mrg     if (tree ci = get_constraints (t))
   1712  1.1  mrg       if (tree reqs = CI_DECLARATOR_REQS (ci))
   1713  1.1  mrg         pp_cxx_requires_clause (this, reqs);
   1714  1.1  mrg }
   1715  1.1  mrg 
   1716  1.1  mrg /* ctor-initializer:
   1717  1.1  mrg       : mem-initializer-list
   1718  1.1  mrg 
   1719  1.1  mrg    mem-initializer-list:
   1720  1.1  mrg       mem-initializer
   1721  1.1  mrg       mem-initializer , mem-initializer-list
   1722  1.1  mrg 
   1723  1.1  mrg    mem-initializer:
   1724  1.1  mrg       mem-initializer-id ( expression-list(opt) )
   1725  1.1  mrg 
   1726  1.1  mrg    mem-initializer-id:
   1727  1.1  mrg       ::(opt) nested-name-specifier(opt) class-name
   1728  1.1  mrg       identifier   */
   1729  1.1  mrg 
   1730  1.1  mrg static void
   1731  1.1  mrg pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
   1732  1.1  mrg {
   1733  1.1  mrg   t = TREE_OPERAND (t, 0);
   1734  1.1  mrg   pp_cxx_whitespace (pp);
   1735  1.1  mrg   pp_colon (pp);
   1736  1.1  mrg   pp_cxx_whitespace (pp);
   1737  1.1  mrg   for (; t; t = TREE_CHAIN (t))
   1738  1.1  mrg     {
   1739  1.1  mrg       tree purpose = TREE_PURPOSE (t);
   1740  1.1  mrg       bool is_pack = PACK_EXPANSION_P (purpose);
   1741  1.1  mrg 
   1742  1.1  mrg       if (is_pack)
   1743  1.1  mrg 	pp->primary_expression (PACK_EXPANSION_PATTERN (purpose));
   1744  1.1  mrg       else
   1745  1.1  mrg 	pp->primary_expression (purpose);
   1746  1.1  mrg       pp_cxx_call_argument_list (pp, TREE_VALUE (t));
   1747  1.1  mrg       if (is_pack)
   1748  1.1  mrg 	pp_cxx_ws_string (pp, "...");
   1749  1.1  mrg       if (TREE_CHAIN (t))
   1750  1.1  mrg 	pp_cxx_separate_with (pp, ',');
   1751  1.1  mrg     }
   1752  1.1  mrg }
   1753  1.1  mrg 
   1754  1.1  mrg /* function-definition:
   1755  1.1  mrg       decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
   1756  1.1  mrg       decl-specifier-seq(opt) declarator function-try-block  */
   1757  1.1  mrg 
   1758  1.1  mrg static void
   1759  1.1  mrg pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
   1760  1.1  mrg {
   1761  1.1  mrg   tree saved_scope = pp->enclosing_scope;
   1762  1.1  mrg   pp->declaration_specifiers (t);
   1763  1.1  mrg   pp->declarator (t);
   1764  1.1  mrg   pp_needs_newline (pp) = true;
   1765  1.1  mrg   pp->enclosing_scope = DECL_CONTEXT (t);
   1766  1.1  mrg   if (DECL_SAVED_TREE (t))
   1767  1.1  mrg     pp->statement (DECL_SAVED_TREE (t));
   1768  1.1  mrg   else
   1769  1.1  mrg     pp_cxx_semicolon (pp);
   1770  1.1  mrg   pp_newline_and_flush (pp);
   1771  1.1  mrg   pp->enclosing_scope = saved_scope;
   1772  1.1  mrg }
   1773  1.1  mrg 
   1774  1.1  mrg /* abstract-declarator:
   1775  1.1  mrg       ptr-operator abstract-declarator(opt)
   1776  1.1  mrg       direct-abstract-declarator  */
   1777  1.1  mrg 
   1778  1.1  mrg void
   1779  1.1  mrg cxx_pretty_printer::abstract_declarator (tree t)
   1780  1.1  mrg {
   1781  1.1  mrg   /* pp_cxx_ptr_operator prints '(' for a pointer-to-member function,
   1782  1.1  mrg      or a pointer-to-data-member of array type:
   1783  1.1  mrg 
   1784  1.1  mrg        void (X::*)()
   1785  1.1  mrg        int (X::*)[5]
   1786  1.1  mrg 
   1787  1.1  mrg      but not for a pointer-to-data-member of non-array type:
   1788  1.1  mrg 
   1789  1.1  mrg        int X::*
   1790  1.1  mrg 
   1791  1.1  mrg      so be mindful of that.  */
   1792  1.1  mrg   if (TYPE_PTRMEMFUNC_P (t)
   1793  1.1  mrg       || (TYPE_PTRDATAMEM_P (t)
   1794  1.1  mrg 	  && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE))
   1795  1.1  mrg     pp_cxx_right_paren (this);
   1796  1.1  mrg   else if (INDIRECT_TYPE_P (t))
   1797  1.1  mrg     {
   1798  1.1  mrg       if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
   1799  1.1  mrg 	  || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
   1800  1.1  mrg 	pp_cxx_right_paren (this);
   1801  1.1  mrg       t = TREE_TYPE (t);
   1802  1.1  mrg     }
   1803  1.1  mrg   direct_abstract_declarator (t);
   1804  1.1  mrg }
   1805  1.1  mrg 
   1806  1.1  mrg /* direct-abstract-declarator:
   1807  1.1  mrg       direct-abstract-declarator(opt) ( parameter-declaration-clause )
   1808  1.1  mrg 			   cv-qualifier-seq(opt) exception-specification(opt)
   1809  1.1  mrg       direct-abstract-declarator(opt) [ constant-expression(opt) ]
   1810  1.1  mrg       ( abstract-declarator )  */
   1811  1.1  mrg 
   1812  1.1  mrg void
   1813  1.1  mrg cxx_pretty_printer::direct_abstract_declarator (tree t)
   1814  1.1  mrg {
   1815  1.1  mrg   switch (TREE_CODE (t))
   1816  1.1  mrg     {
   1817  1.1  mrg     case REFERENCE_TYPE:
   1818  1.1  mrg       abstract_declarator (t);
   1819  1.1  mrg       break;
   1820  1.1  mrg 
   1821  1.1  mrg     case RECORD_TYPE:
   1822  1.1  mrg       if (TYPE_PTRMEMFUNC_P (t))
   1823  1.1  mrg 	direct_abstract_declarator (TYPE_PTRMEMFUNC_FN_TYPE (t));
   1824  1.1  mrg       break;
   1825  1.1  mrg 
   1826  1.1  mrg     case OFFSET_TYPE:
   1827  1.1  mrg       if (TYPE_PTRDATAMEM_P (t))
   1828  1.1  mrg 	direct_abstract_declarator (TREE_TYPE (t));
   1829  1.1  mrg       break;
   1830  1.1  mrg 
   1831  1.1  mrg     case METHOD_TYPE:
   1832  1.1  mrg     case FUNCTION_TYPE:
   1833  1.1  mrg       pp_cxx_parameter_declaration_clause (this, t);
   1834  1.1  mrg       direct_abstract_declarator (TREE_TYPE (t));
   1835  1.1  mrg       if (TREE_CODE (t) == METHOD_TYPE)
   1836  1.1  mrg 	{
   1837  1.1  mrg 	  padding = pp_before;
   1838  1.1  mrg 	  pp_cxx_cv_qualifier_seq (this, class_of_this_parm (t));
   1839  1.1  mrg 	}
   1840  1.1  mrg       pp_cxx_exception_specification (this, t);
   1841  1.1  mrg       break;
   1842  1.1  mrg 
   1843  1.1  mrg     case TYPENAME_TYPE:
   1844  1.1  mrg     case TEMPLATE_TYPE_PARM:
   1845  1.1  mrg     case TEMPLATE_TEMPLATE_PARM:
   1846  1.1  mrg     case BOUND_TEMPLATE_TEMPLATE_PARM:
   1847  1.1  mrg     case UNBOUND_CLASS_TEMPLATE:
   1848  1.1  mrg     case DECLTYPE_TYPE:
   1849  1.1  mrg       break;
   1850  1.1  mrg 
   1851  1.1  mrg     default:
   1852  1.1  mrg       c_pretty_printer::direct_abstract_declarator (t);
   1853  1.1  mrg       break;
   1854  1.1  mrg     }
   1855  1.1  mrg }
   1856  1.1  mrg 
   1857  1.1  mrg /* type-id:
   1858  1.1  mrg      type-specifier-seq abstract-declarator(opt) */
   1859  1.1  mrg 
   1860  1.1  mrg void
   1861  1.1  mrg cxx_pretty_printer::type_id (tree t)
   1862  1.1  mrg {
   1863  1.1  mrg   pp_flags saved_flags = flags;
   1864  1.1  mrg   flags |= pp_c_flag_abstract;
   1865  1.1  mrg 
   1866  1.1  mrg   switch (TREE_CODE (t))
   1867  1.1  mrg     {
   1868  1.1  mrg     case TYPE_DECL:
   1869  1.1  mrg     case UNION_TYPE:
   1870  1.1  mrg     case RECORD_TYPE:
   1871  1.1  mrg     case ENUMERAL_TYPE:
   1872  1.1  mrg     case TYPENAME_TYPE:
   1873  1.1  mrg     case BOUND_TEMPLATE_TEMPLATE_PARM:
   1874  1.1  mrg     case UNBOUND_CLASS_TEMPLATE:
   1875  1.1  mrg     case TEMPLATE_TEMPLATE_PARM:
   1876  1.1  mrg     case TEMPLATE_TYPE_PARM:
   1877  1.1  mrg     case TEMPLATE_PARM_INDEX:
   1878  1.1  mrg     case TEMPLATE_DECL:
   1879  1.1  mrg     case TYPEOF_TYPE:
   1880  1.1  mrg     case UNDERLYING_TYPE:
   1881  1.1  mrg     case DECLTYPE_TYPE:
   1882  1.1  mrg     case NULLPTR_TYPE:
   1883  1.1  mrg     case TEMPLATE_ID_EXPR:
   1884  1.1  mrg     case OFFSET_TYPE:
   1885  1.1  mrg       pp_cxx_type_specifier_seq (this, t);
   1886  1.1  mrg       if (TYPE_PTRMEM_P (t))
   1887  1.1  mrg 	abstract_declarator (t);
   1888  1.1  mrg       break;
   1889  1.1  mrg 
   1890  1.1  mrg     case TYPE_PACK_EXPANSION:
   1891  1.1  mrg       type_id (PACK_EXPANSION_PATTERN (t));
   1892  1.1  mrg       pp_cxx_ws_string (this, "...");
   1893  1.1  mrg       break;
   1894  1.1  mrg 
   1895  1.1  mrg     case TYPE_ARGUMENT_PACK:
   1896  1.1  mrg       {
   1897  1.1  mrg 	tree args = ARGUMENT_PACK_ARGS (t);
   1898  1.1  mrg 	int len = TREE_VEC_LENGTH (args);
   1899  1.1  mrg 	pp_cxx_left_brace (this);
   1900  1.1  mrg 	for (int i = 0; i < len; ++i)
   1901  1.1  mrg 	  {
   1902  1.1  mrg 	    if (i > 0)
   1903  1.1  mrg 	      pp_cxx_separate_with (this, ',');
   1904  1.1  mrg 	    type_id (TREE_VEC_ELT (args, i));
   1905  1.1  mrg 	  }
   1906  1.1  mrg 	pp_cxx_right_brace (this);
   1907  1.1  mrg       }
   1908  1.1  mrg       break;
   1909  1.1  mrg 
   1910  1.1  mrg     default:
   1911  1.1  mrg       c_pretty_printer::type_id (t);
   1912  1.1  mrg       break;
   1913  1.1  mrg     }
   1914  1.1  mrg 
   1915  1.1  mrg   flags = saved_flags;
   1916  1.1  mrg }
   1917  1.1  mrg 
   1918  1.1  mrg /* template-argument-list:
   1919  1.1  mrg       template-argument ...(opt)
   1920  1.1  mrg       template-argument-list, template-argument ...(opt)
   1921  1.1  mrg 
   1922  1.1  mrg    template-argument:
   1923  1.1  mrg       assignment-expression
   1924  1.1  mrg       type-id
   1925  1.1  mrg       template-name  */
   1926  1.1  mrg 
   1927  1.1  mrg static void
   1928  1.1  mrg pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
   1929  1.1  mrg {
   1930  1.1  mrg   int i;
   1931  1.1  mrg   bool need_comma = false;
   1932  1.1  mrg 
   1933  1.1  mrg   if (t == NULL)
   1934  1.1  mrg     return;
   1935  1.1  mrg   for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
   1936  1.1  mrg     {
   1937  1.1  mrg       tree arg = TREE_VEC_ELT (t, i);
   1938  1.1  mrg       tree argpack = NULL_TREE;
   1939  1.1  mrg       int idx, len = 1;
   1940  1.1  mrg 
   1941  1.1  mrg       if (ARGUMENT_PACK_P (arg))
   1942  1.1  mrg 	{
   1943  1.1  mrg 	  argpack = ARGUMENT_PACK_ARGS (arg);
   1944  1.1  mrg 	  len = TREE_VEC_LENGTH (argpack);
   1945  1.1  mrg 	}
   1946  1.1  mrg 
   1947  1.1  mrg       for (idx = 0; idx < len; idx++)
   1948  1.1  mrg 	{
   1949  1.1  mrg 	  if (argpack)
   1950  1.1  mrg 	    arg = TREE_VEC_ELT (argpack, idx);
   1951  1.1  mrg 
   1952  1.1  mrg 	  if (need_comma)
   1953  1.1  mrg 	    pp_cxx_separate_with (pp, ',');
   1954  1.1  mrg 	  else
   1955  1.1  mrg 	    need_comma = true;
   1956  1.1  mrg 
   1957  1.1  mrg 	  if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
   1958  1.1  mrg 			       && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
   1959  1.1  mrg 	    pp->type_id (arg);
   1960  1.1  mrg 	  else if (template_parm_object_p (arg))
   1961  1.1  mrg 	    pp->expression (DECL_INITIAL (arg));
   1962  1.1  mrg 	  else
   1963  1.1  mrg 	    pp->expression (arg);
   1964  1.1  mrg 	}
   1965  1.1  mrg     }
   1966  1.1  mrg }
   1967  1.1  mrg 
   1968  1.1  mrg 
   1969  1.1  mrg static void
   1970  1.1  mrg pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
   1971  1.1  mrg {
   1972  1.1  mrg   t = DECL_EXPR_DECL (t);
   1973  1.1  mrg   pp_cxx_type_specifier_seq (pp, t);
   1974  1.1  mrg   if (TYPE_P (t))
   1975  1.1  mrg     pp->abstract_declarator (t);
   1976  1.1  mrg   else
   1977  1.1  mrg     pp->declarator (t);
   1978  1.1  mrg }
   1979  1.1  mrg 
   1980  1.1  mrg /* Statements.  */
   1981  1.1  mrg 
   1982  1.1  mrg void
   1983  1.1  mrg cxx_pretty_printer::statement (tree t)
   1984  1.1  mrg {
   1985  1.1  mrg   switch (TREE_CODE (t))
   1986  1.1  mrg     {
   1987  1.1  mrg     case CTOR_INITIALIZER:
   1988  1.1  mrg       pp_cxx_ctor_initializer (this, t);
   1989  1.1  mrg       break;
   1990  1.1  mrg 
   1991  1.1  mrg     case USING_STMT:
   1992  1.1  mrg       pp_cxx_ws_string (this, "using");
   1993  1.1  mrg       pp_cxx_ws_string (this, "namespace");
   1994  1.1  mrg       if (DECL_CONTEXT (t))
   1995  1.1  mrg 	pp_cxx_nested_name_specifier (this, DECL_CONTEXT (t));
   1996  1.1  mrg       pp_cxx_qualified_id (this, USING_STMT_NAMESPACE (t));
   1997  1.1  mrg       break;
   1998  1.1  mrg 
   1999  1.1  mrg     case USING_DECL:
   2000  1.1  mrg       pp_cxx_ws_string (this, "using");
   2001  1.1  mrg       pp_cxx_nested_name_specifier (this, USING_DECL_SCOPE (t));
   2002  1.1  mrg       pp_cxx_unqualified_id (this, DECL_NAME (t));
   2003  1.1  mrg       break;
   2004  1.1  mrg 
   2005  1.1  mrg     case EH_SPEC_BLOCK:
   2006  1.1  mrg       break;
   2007  1.1  mrg 
   2008  1.1  mrg       /* try-block:
   2009  1.1  mrg 	    try compound-statement handler-seq  */
   2010  1.1  mrg     case TRY_BLOCK:
   2011  1.1  mrg       pp_maybe_newline_and_indent (this, 0);
   2012  1.1  mrg       pp_cxx_ws_string (this, "try");
   2013  1.1  mrg       pp_newline_and_indent (this, 3);
   2014  1.1  mrg       statement (TRY_STMTS (t));
   2015  1.1  mrg       pp_newline_and_indent (this, -3);
   2016  1.1  mrg       if (CLEANUP_P (t))
   2017  1.1  mrg 	;
   2018  1.1  mrg       else
   2019  1.1  mrg 	statement (TRY_HANDLERS (t));
   2020  1.1  mrg       break;
   2021  1.1  mrg 
   2022  1.1  mrg       /*
   2023  1.1  mrg 	 handler-seq:
   2024  1.1  mrg 	    handler handler-seq(opt)
   2025  1.1  mrg 
   2026  1.1  mrg 	 handler:
   2027  1.1  mrg 	 catch ( exception-declaration ) compound-statement
   2028  1.1  mrg 
   2029  1.1  mrg 	 exception-declaration:
   2030  1.1  mrg 	    type-specifier-seq declarator
   2031  1.1  mrg 	    type-specifier-seq abstract-declarator
   2032  1.1  mrg 	    ...   */
   2033  1.1  mrg     case HANDLER:
   2034  1.1  mrg       pp_cxx_ws_string (this, "catch");
   2035  1.1  mrg       pp_cxx_left_paren (this);
   2036  1.1  mrg       pp_cxx_exception_declaration (this, HANDLER_PARMS (t));
   2037  1.1  mrg       pp_cxx_right_paren (this);
   2038  1.1  mrg       pp_indentation (this) += 3;
   2039  1.1  mrg       pp_needs_newline (this) = true;
   2040  1.1  mrg       statement (HANDLER_BODY (t));
   2041  1.1  mrg       pp_indentation (this) -= 3;
   2042  1.1  mrg       pp_needs_newline (this) = true;
   2043  1.1  mrg       break;
   2044  1.1  mrg 
   2045  1.1  mrg       /* selection-statement:
   2046  1.1  mrg 	    if ( expression ) statement
   2047  1.1  mrg 	    if ( expression ) statement else statement  */
   2048  1.1  mrg     case IF_STMT:
   2049  1.1  mrg       pp_cxx_ws_string (this, "if");
   2050  1.1  mrg       pp_cxx_whitespace (this);
   2051  1.1  mrg       pp_cxx_left_paren (this);
   2052  1.1  mrg       expression (IF_COND (t));
   2053  1.1  mrg       pp_cxx_right_paren (this);
   2054  1.1  mrg       pp_newline_and_indent (this, 2);
   2055  1.1  mrg       statement (THEN_CLAUSE (t));
   2056  1.1  mrg       pp_newline_and_indent (this, -2);
   2057  1.1  mrg       if (ELSE_CLAUSE (t))
   2058  1.1  mrg 	{
   2059  1.1  mrg 	  tree else_clause = ELSE_CLAUSE (t);
   2060  1.1  mrg 	  pp_cxx_ws_string (this, "else");
   2061  1.1  mrg 	  if (TREE_CODE (else_clause) == IF_STMT)
   2062  1.1  mrg 	    pp_cxx_whitespace (this);
   2063  1.1  mrg 	  else
   2064  1.1  mrg 	    pp_newline_and_indent (this, 2);
   2065  1.1  mrg 	  statement (else_clause);
   2066  1.1  mrg 	  if (TREE_CODE (else_clause) != IF_STMT)
   2067  1.1  mrg 	    pp_newline_and_indent (this, -2);
   2068  1.1  mrg 	}
   2069  1.1  mrg       break;
   2070  1.1  mrg 
   2071  1.1  mrg     case RANGE_FOR_STMT:
   2072  1.1  mrg       pp_cxx_ws_string (this, "for");
   2073  1.1  mrg       pp_space (this);
   2074  1.1  mrg       pp_cxx_left_paren (this);
   2075  1.1  mrg       if (RANGE_FOR_INIT_STMT (t))
   2076  1.1  mrg 	{
   2077  1.1  mrg 	  statement (RANGE_FOR_INIT_STMT (t));
   2078  1.1  mrg 	  pp_needs_newline (this) = false;
   2079  1.1  mrg 	  pp_cxx_whitespace (this);
   2080  1.1  mrg 	}
   2081  1.1  mrg       statement (RANGE_FOR_DECL (t));
   2082  1.1  mrg       pp_space (this);
   2083  1.1  mrg       pp_needs_newline (this) = false;
   2084  1.1  mrg       pp_colon (this);
   2085  1.1  mrg       pp_space (this);
   2086  1.1  mrg       statement (RANGE_FOR_EXPR (t));
   2087  1.1  mrg       pp_cxx_right_paren (this);
   2088  1.1  mrg       pp_newline_and_indent (this, 3);
   2089  1.1  mrg       statement (FOR_BODY (t));
   2090  1.1  mrg       pp_indentation (this) -= 3;
   2091  1.1  mrg       pp_needs_newline (this) = true;
   2092  1.1  mrg       break;
   2093  1.1  mrg 
   2094  1.1  mrg       /* expression-statement:
   2095  1.1  mrg 	    expression(opt) ;  */
   2096  1.1  mrg     case EXPR_STMT:
   2097  1.1  mrg       expression (EXPR_STMT_EXPR (t));
   2098  1.1  mrg       pp_cxx_semicolon (this);
   2099  1.1  mrg       pp_needs_newline (this) = true;
   2100  1.1  mrg       break;
   2101  1.1  mrg 
   2102  1.1  mrg     case CLEANUP_STMT:
   2103  1.1  mrg       pp_cxx_ws_string (this, "try");
   2104  1.1  mrg       pp_newline_and_indent (this, 2);
   2105  1.1  mrg       statement (CLEANUP_BODY (t));
   2106  1.1  mrg       pp_newline_and_indent (this, -2);
   2107  1.1  mrg       pp_cxx_ws_string (this, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
   2108  1.1  mrg       pp_newline_and_indent (this, 2);
   2109  1.1  mrg       statement (CLEANUP_EXPR (t));
   2110  1.1  mrg       pp_newline_and_indent (this, -2);
   2111  1.1  mrg       break;
   2112  1.1  mrg 
   2113  1.1  mrg     case STATIC_ASSERT:
   2114  1.1  mrg       declaration (t);
   2115  1.1  mrg       break;
   2116  1.1  mrg 
   2117  1.1  mrg     case OMP_DEPOBJ:
   2118  1.1  mrg       pp_cxx_ws_string (this, "#pragma omp depobj");
   2119  1.1  mrg       pp_space (this);
   2120  1.1  mrg       pp_cxx_left_paren (this);
   2121  1.1  mrg       expression (OMP_DEPOBJ_DEPOBJ (t));
   2122  1.1  mrg       pp_cxx_right_paren (this);
   2123  1.1  mrg       if (OMP_DEPOBJ_CLAUSES (t) && OMP_DEPOBJ_CLAUSES (t) != error_mark_node)
   2124  1.1  mrg 	{
   2125  1.1  mrg 	  if (TREE_CODE (OMP_DEPOBJ_CLAUSES (t)) == OMP_CLAUSE)
   2126  1.1  mrg 	    dump_omp_clauses (this, OMP_DEPOBJ_CLAUSES (t),
   2127  1.1  mrg 			      pp_indentation (this), TDF_NONE);
   2128  1.1  mrg 	  else
   2129  1.1  mrg 	    switch (tree_to_uhwi (OMP_DEPOBJ_CLAUSES (t)))
   2130  1.1  mrg 	      {
   2131  1.1  mrg 	      case OMP_CLAUSE_DEPEND_IN:
   2132  1.1  mrg 		pp_cxx_ws_string (this, " update(in)");
   2133  1.1  mrg 		break;
   2134  1.1  mrg 	      case OMP_CLAUSE_DEPEND_INOUT:
   2135  1.1  mrg 		pp_cxx_ws_string (this, " update(inout)");
   2136  1.1  mrg 		break;
   2137  1.1  mrg 	      case OMP_CLAUSE_DEPEND_OUT:
   2138  1.1  mrg 		pp_cxx_ws_string (this, " update(out)");
   2139  1.1  mrg 		break;
   2140  1.1  mrg 	      case OMP_CLAUSE_DEPEND_MUTEXINOUTSET:
   2141  1.1  mrg 		pp_cxx_ws_string (this, " update(mutexinoutset)");
   2142  1.1  mrg 		break;
   2143  1.1  mrg 	      case OMP_CLAUSE_DEPEND_LAST:
   2144  1.1  mrg 		pp_cxx_ws_string (this, " destroy");
   2145  1.1  mrg 		break;
   2146  1.1  mrg 	      default:
   2147  1.1  mrg 		break;
   2148  1.1  mrg 	      }
   2149  1.1  mrg 	}
   2150  1.1  mrg       pp_needs_newline (this) = true;
   2151  1.1  mrg       break;
   2152  1.1  mrg 
   2153  1.1  mrg     default:
   2154  1.1  mrg       c_pretty_printer::statement (t);
   2155  1.1  mrg       break;
   2156  1.1  mrg     }
   2157  1.1  mrg }
   2158  1.1  mrg 
   2159  1.1  mrg /* original-namespace-definition:
   2160  1.1  mrg       namespace identifier { namespace-body }
   2161  1.1  mrg 
   2162  1.1  mrg   As an edge case, we also handle unnamed namespace definition here.  */
   2163  1.1  mrg 
   2164  1.1  mrg static void
   2165  1.1  mrg pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
   2166  1.1  mrg {
   2167  1.1  mrg   pp_cxx_ws_string (pp, "namespace");
   2168  1.1  mrg   if (DECL_CONTEXT (t))
   2169  1.1  mrg     pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
   2170  1.1  mrg   if (DECL_NAME (t))
   2171  1.1  mrg     pp_cxx_unqualified_id (pp, t);
   2172  1.1  mrg   pp_cxx_whitespace (pp);
   2173  1.1  mrg   pp_cxx_left_brace (pp);
   2174  1.1  mrg   /* We do not print the namespace-body.  */
   2175  1.1  mrg   pp_cxx_whitespace (pp);
   2176  1.1  mrg   pp_cxx_right_brace (pp);
   2177  1.1  mrg }
   2178  1.1  mrg 
   2179  1.1  mrg /* namespace-alias:
   2180  1.1  mrg       identifier
   2181  1.1  mrg 
   2182  1.1  mrg    namespace-alias-definition:
   2183  1.1  mrg       namespace identifier = qualified-namespace-specifier ;
   2184  1.1  mrg 
   2185  1.1  mrg    qualified-namespace-specifier:
   2186  1.1  mrg       ::(opt) nested-name-specifier(opt) namespace-name   */
   2187  1.1  mrg 
   2188  1.1  mrg static void
   2189  1.1  mrg pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
   2190  1.1  mrg {
   2191  1.1  mrg   pp_cxx_ws_string (pp, "namespace");
   2192  1.1  mrg   if (DECL_CONTEXT (t))
   2193  1.1  mrg     pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
   2194  1.1  mrg   pp_cxx_unqualified_id (pp, t);
   2195  1.1  mrg   pp_cxx_whitespace (pp);
   2196  1.1  mrg   pp_equal (pp);
   2197  1.1  mrg   pp_cxx_whitespace (pp);
   2198  1.1  mrg   if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
   2199  1.1  mrg     pp_cxx_nested_name_specifier (pp,
   2200  1.1  mrg 				  DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
   2201  1.1  mrg   pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
   2202  1.1  mrg   pp_cxx_semicolon (pp);
   2203  1.1  mrg }
   2204  1.1  mrg 
   2205  1.1  mrg /* simple-declaration:
   2206  1.1  mrg       decl-specifier-seq(opt) init-declarator-list(opt)  */
   2207  1.1  mrg 
   2208  1.1  mrg static void
   2209  1.1  mrg pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
   2210  1.1  mrg {
   2211  1.1  mrg   pp->declaration_specifiers (t);
   2212  1.1  mrg   pp_cxx_init_declarator (pp, t);
   2213  1.1  mrg   pp_cxx_semicolon (pp);
   2214  1.1  mrg   pp_needs_newline (pp) = true;
   2215  1.1  mrg }
   2216  1.1  mrg 
   2217  1.1  mrg /*
   2218  1.1  mrg   template-parameter-list:
   2219  1.1  mrg      template-parameter
   2220  1.1  mrg      template-parameter-list , template-parameter  */
   2221  1.1  mrg 
   2222  1.1  mrg static inline void
   2223  1.1  mrg pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
   2224  1.1  mrg {
   2225  1.1  mrg   const int n = TREE_VEC_LENGTH (t);
   2226  1.1  mrg   int i;
   2227  1.1  mrg   for (i = 0; i < n; ++i)
   2228  1.1  mrg     {
   2229  1.1  mrg       if (i)
   2230  1.1  mrg 	pp_cxx_separate_with (pp, ',');
   2231  1.1  mrg       pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
   2232  1.1  mrg     }
   2233  1.1  mrg }
   2234  1.1  mrg 
   2235  1.1  mrg /* template-parameter:
   2236  1.1  mrg       type-parameter
   2237  1.1  mrg       parameter-declaration
   2238  1.1  mrg 
   2239  1.1  mrg    type-parameter:
   2240  1.1  mrg      class ...(opt) identifier(opt)
   2241  1.1  mrg      class identifier(opt) = type-id
   2242  1.1  mrg      typename identifier(opt)
   2243  1.1  mrg      typename ...(opt) identifier(opt) = type-id
   2244  1.1  mrg      template < template-parameter-list > class ...(opt) identifier(opt)
   2245  1.1  mrg      template < template-parameter-list > class identifier(opt) = template-name  */
   2246  1.1  mrg 
   2247  1.1  mrg static void
   2248  1.1  mrg pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
   2249  1.1  mrg {
   2250  1.1  mrg   tree parameter =  TREE_VALUE (t);
   2251  1.1  mrg   switch (TREE_CODE (parameter))
   2252  1.1  mrg     {
   2253  1.1  mrg     case TYPE_DECL:
   2254  1.1  mrg       pp_cxx_ws_string (pp, "class");
   2255  1.1  mrg       if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
   2256  1.1  mrg 	pp_cxx_ws_string (pp, "...");
   2257  1.1  mrg       if (DECL_NAME (parameter))
   2258  1.1  mrg 	pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
   2259  1.1  mrg       /* FIXME: Check if we should print also default argument.  */
   2260  1.1  mrg       break;
   2261  1.1  mrg 
   2262  1.1  mrg     case PARM_DECL:
   2263  1.1  mrg       pp_cxx_parameter_declaration (pp, parameter);
   2264  1.1  mrg       break;
   2265  1.1  mrg 
   2266  1.1  mrg     case TEMPLATE_DECL:
   2267  1.1  mrg       break;
   2268  1.1  mrg 
   2269  1.1  mrg     default:
   2270  1.1  mrg       pp_unsupported_tree (pp, t);
   2271  1.1  mrg       break;
   2272  1.1  mrg     }
   2273  1.1  mrg }
   2274  1.1  mrg 
   2275  1.1  mrg /* Pretty-print a template parameter in the canonical form
   2276  1.1  mrg    "template-parameter-<level>-<position in parameter list>".  */
   2277  1.1  mrg 
   2278  1.1  mrg void
   2279  1.1  mrg pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
   2280  1.1  mrg {
   2281  1.1  mrg   const enum tree_code code = TREE_CODE (parm);
   2282  1.1  mrg 
   2283  1.1  mrg   /* Brings type template parameters to the canonical forms.  */
   2284  1.1  mrg   if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
   2285  1.1  mrg       || code == BOUND_TEMPLATE_TEMPLATE_PARM)
   2286  1.1  mrg     parm = TEMPLATE_TYPE_PARM_INDEX (parm);
   2287  1.1  mrg 
   2288  1.1  mrg   pp_cxx_begin_template_argument_list (pp);
   2289  1.1  mrg   pp->translate_string ("template-parameter-");
   2290  1.1  mrg   pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
   2291  1.1  mrg   pp_minus (pp);
   2292  1.1  mrg   pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
   2293  1.1  mrg   pp_cxx_end_template_argument_list (pp);
   2294  1.1  mrg }
   2295  1.1  mrg 
   2296  1.1  mrg /* Print a constrained-type-specifier.  */
   2297  1.1  mrg 
   2298  1.1  mrg void
   2299  1.1  mrg pp_cxx_constrained_type_spec (cxx_pretty_printer *pp, tree c)
   2300  1.1  mrg {
   2301  1.1  mrg   pp_cxx_whitespace (pp);
   2302  1.1  mrg   pp_cxx_left_bracket (pp);
   2303  1.1  mrg   pp->translate_string ("requires");
   2304  1.1  mrg   pp_cxx_whitespace (pp);
   2305  1.1  mrg   if (c == error_mark_node)
   2306  1.1  mrg     {
   2307  1.1  mrg       pp_cxx_ws_string(pp, "<unsatisfied-type-constraint>");
   2308  1.1  mrg       return;
   2309  1.1  mrg     }
   2310  1.1  mrg   tree t, a;
   2311  1.1  mrg   placeholder_extract_concept_and_args (c, t, a);
   2312  1.1  mrg   pp->id_expression (t);
   2313  1.1  mrg   pp_cxx_begin_template_argument_list (pp);
   2314  1.1  mrg   pp_cxx_ws_string (pp, "<placeholder>");
   2315  1.1  mrg   pp_cxx_separate_with (pp, ',');
   2316  1.1  mrg   tree args = make_tree_vec (TREE_VEC_LENGTH (a) - 1);
   2317  1.1  mrg   for (int i = 0; i < TREE_VEC_LENGTH (a) - 1; ++i)
   2318  1.1  mrg     TREE_VEC_ELT (args, i) = TREE_VEC_ELT (a, i + 1);
   2319  1.1  mrg   pp_cxx_template_argument_list (pp, args);
   2320  1.1  mrg   ggc_free (args);
   2321  1.1  mrg   pp_cxx_end_template_argument_list (pp);
   2322  1.1  mrg   pp_cxx_right_bracket (pp);
   2323  1.1  mrg }
   2324  1.1  mrg 
   2325  1.1  mrg /*
   2326  1.1  mrg   template-declaration:
   2327  1.1  mrg      export(opt) template < template-parameter-list > declaration
   2328  1.1  mrg 
   2329  1.1  mrg   Concept extensions:
   2330  1.1  mrg 
   2331  1.1  mrg   template-declaration:
   2332  1.1  mrg      export(opt) template < template-parameter-list >
   2333  1.1  mrg        requires-clause(opt) declaration */
   2334  1.1  mrg 
   2335  1.1  mrg static void
   2336  1.1  mrg pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
   2337  1.1  mrg {
   2338  1.1  mrg   tree tmpl = most_general_template (t);
   2339  1.1  mrg   tree level;
   2340  1.1  mrg 
   2341  1.1  mrg   pp_maybe_newline_and_indent (pp, 0);
   2342  1.1  mrg   for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
   2343  1.1  mrg     {
   2344  1.1  mrg       pp_cxx_ws_string (pp, "template");
   2345  1.1  mrg       pp_cxx_begin_template_argument_list (pp);
   2346  1.1  mrg       pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
   2347  1.1  mrg       pp_cxx_end_template_argument_list (pp);
   2348  1.1  mrg       pp_newline_and_indent (pp, 3);
   2349  1.1  mrg     }
   2350  1.1  mrg 
   2351  1.1  mrg   if (flag_concepts)
   2352  1.1  mrg     if (tree ci = get_constraints (t))
   2353  1.1  mrg       if (tree reqs = CI_TEMPLATE_REQS (ci))
   2354  1.1  mrg          {
   2355  1.1  mrg             pp_cxx_requires_clause (pp, reqs);
   2356  1.1  mrg             pp_newline_and_indent (pp, 6);
   2357  1.1  mrg          }
   2358  1.1  mrg 
   2359  1.1  mrg   if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
   2360  1.1  mrg     pp_cxx_function_definition (pp, t);
   2361  1.1  mrg   else if (TREE_CODE (t) == CONCEPT_DECL)
   2362  1.1  mrg     pp_cxx_concept_definition (pp, t);
   2363  1.1  mrg   else
   2364  1.1  mrg     pp_cxx_simple_declaration (pp, t);
   2365  1.1  mrg }
   2366  1.1  mrg 
   2367  1.1  mrg static void
   2368  1.1  mrg pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
   2369  1.1  mrg {
   2370  1.1  mrg   pp_unsupported_tree (pp, t);
   2371  1.1  mrg }
   2372  1.1  mrg 
   2373  1.1  mrg static void
   2374  1.1  mrg pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
   2375  1.1  mrg {
   2376  1.1  mrg   pp_unsupported_tree (pp, t);
   2377  1.1  mrg }
   2378  1.1  mrg 
   2379  1.1  mrg static void
   2380  1.1  mrg pp_cxx_concept_definition (cxx_pretty_printer *pp, tree t)
   2381  1.1  mrg {
   2382  1.1  mrg   pp_cxx_unqualified_id (pp, DECL_NAME (t));
   2383  1.1  mrg   pp_cxx_whitespace (pp);
   2384  1.1  mrg   pp_cxx_ws_string (pp, "=");
   2385  1.1  mrg   pp_cxx_whitespace (pp);
   2386  1.1  mrg   pp->expression (DECL_INITIAL (t));
   2387  1.1  mrg   pp_cxx_semicolon (pp);
   2388  1.1  mrg }
   2389  1.1  mrg 
   2390  1.1  mrg /*
   2391  1.1  mrg     declaration:
   2392  1.1  mrg        block-declaration
   2393  1.1  mrg        function-definition
   2394  1.1  mrg        template-declaration
   2395  1.1  mrg        explicit-instantiation
   2396  1.1  mrg        explicit-specialization
   2397  1.1  mrg        linkage-specification
   2398  1.1  mrg        namespace-definition
   2399  1.1  mrg 
   2400  1.1  mrg     block-declaration:
   2401  1.1  mrg        simple-declaration
   2402  1.1  mrg        asm-definition
   2403  1.1  mrg        namespace-alias-definition
   2404  1.1  mrg        using-declaration
   2405  1.1  mrg        using-directive
   2406  1.1  mrg        static_assert-declaration */
   2407  1.1  mrg void
   2408  1.1  mrg cxx_pretty_printer::declaration (tree t)
   2409  1.1  mrg {
   2410  1.1  mrg   if (TREE_CODE (t) == STATIC_ASSERT)
   2411  1.1  mrg     {
   2412  1.1  mrg       pp_cxx_ws_string (this, "static_assert");
   2413  1.1  mrg       pp_cxx_left_paren (this);
   2414  1.1  mrg       expression (STATIC_ASSERT_CONDITION (t));
   2415  1.1  mrg       pp_cxx_separate_with (this, ',');
   2416  1.1  mrg       expression (STATIC_ASSERT_MESSAGE (t));
   2417  1.1  mrg       pp_cxx_right_paren (this);
   2418  1.1  mrg     }
   2419  1.1  mrg   else if (!DECL_LANG_SPECIFIC (t))
   2420  1.1  mrg     pp_cxx_simple_declaration (this, t);
   2421  1.1  mrg   else if (DECL_USE_TEMPLATE (t))
   2422  1.1  mrg     switch (DECL_USE_TEMPLATE (t))
   2423  1.1  mrg       {
   2424  1.1  mrg       case 1:
   2425  1.1  mrg 	pp_cxx_template_declaration (this, t);
   2426  1.1  mrg 	break;
   2427  1.1  mrg 
   2428  1.1  mrg       case 2:
   2429  1.1  mrg 	pp_cxx_explicit_specialization (this, t);
   2430  1.1  mrg 	break;
   2431  1.1  mrg 
   2432  1.1  mrg       case 3:
   2433  1.1  mrg 	pp_cxx_explicit_instantiation (this, t);
   2434  1.1  mrg 	break;
   2435  1.1  mrg 
   2436  1.1  mrg       default:
   2437  1.1  mrg 	break;
   2438  1.1  mrg       }
   2439  1.1  mrg   else switch (TREE_CODE (t))
   2440  1.1  mrg     {
   2441  1.1  mrg     case VAR_DECL:
   2442  1.1  mrg     case TYPE_DECL:
   2443  1.1  mrg       pp_cxx_simple_declaration (this, t);
   2444  1.1  mrg       break;
   2445  1.1  mrg 
   2446  1.1  mrg     case FUNCTION_DECL:
   2447  1.1  mrg       if (DECL_SAVED_TREE (t))
   2448  1.1  mrg 	pp_cxx_function_definition (this, t);
   2449  1.1  mrg       else
   2450  1.1  mrg 	pp_cxx_simple_declaration (this, t);
   2451  1.1  mrg       break;
   2452  1.1  mrg 
   2453  1.1  mrg     case NAMESPACE_DECL:
   2454  1.1  mrg       if (DECL_NAMESPACE_ALIAS (t))
   2455  1.1  mrg 	pp_cxx_namespace_alias_definition (this, t);
   2456  1.1  mrg       else
   2457  1.1  mrg 	pp_cxx_original_namespace_definition (this, t);
   2458  1.1  mrg       break;
   2459  1.1  mrg 
   2460  1.1  mrg     default:
   2461  1.1  mrg       pp_unsupported_tree (this, t);
   2462  1.1  mrg       break;
   2463  1.1  mrg     }
   2464  1.1  mrg }
   2465  1.1  mrg 
   2466  1.1  mrg static void
   2467  1.1  mrg pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
   2468  1.1  mrg {
   2469  1.1  mrg   t = TREE_OPERAND (t, 0);
   2470  1.1  mrg   pp_cxx_ws_string (pp, "typeid");
   2471  1.1  mrg   pp_cxx_left_paren (pp);
   2472  1.1  mrg   if (TYPE_P (t))
   2473  1.1  mrg     pp->type_id (t);
   2474  1.1  mrg   else
   2475  1.1  mrg     pp->expression (t);
   2476  1.1  mrg   pp_cxx_right_paren (pp);
   2477  1.1  mrg }
   2478  1.1  mrg 
   2479  1.1  mrg void
   2480  1.1  mrg pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
   2481  1.1  mrg {
   2482  1.1  mrg   pp_cxx_ws_string (pp, "va_arg");
   2483  1.1  mrg   pp_cxx_left_paren (pp);
   2484  1.1  mrg   pp->assignment_expression (TREE_OPERAND (t, 0));
   2485  1.1  mrg   pp_cxx_separate_with (pp, ',');
   2486  1.1  mrg   pp->type_id (TREE_TYPE (t));
   2487  1.1  mrg   pp_cxx_right_paren (pp);
   2488  1.1  mrg }
   2489  1.1  mrg 
   2490  1.1  mrg static bool
   2491  1.1  mrg pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
   2492  1.1  mrg {
   2493  1.1  mrg   switch (TREE_CODE (t))
   2494  1.1  mrg     {
   2495  1.1  mrg     case ARROW_EXPR:
   2496  1.1  mrg       if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
   2497  1.1  mrg 	  && INDIRECT_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
   2498  1.1  mrg 	{
   2499  1.1  mrg 	  pp->type_id (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
   2500  1.1  mrg 	  pp_cxx_separate_with (pp, ',');
   2501  1.1  mrg 	  return true;
   2502  1.1  mrg 	}
   2503  1.1  mrg       return false;
   2504  1.1  mrg     case COMPONENT_REF:
   2505  1.1  mrg       if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
   2506  1.1  mrg 	return false;
   2507  1.1  mrg       if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
   2508  1.1  mrg 	pp_cxx_dot (pp);
   2509  1.1  mrg       pp->expression (TREE_OPERAND (t, 1));
   2510  1.1  mrg       return true;
   2511  1.1  mrg     case ARRAY_REF:
   2512  1.1  mrg       if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
   2513  1.1  mrg 	return false;
   2514  1.1  mrg       pp_left_bracket (pp);
   2515  1.1  mrg       pp->expression (TREE_OPERAND (t, 1));
   2516  1.1  mrg       pp_right_bracket (pp);
   2517  1.1  mrg       return true;
   2518  1.1  mrg     default:
   2519  1.1  mrg       return false;
   2520  1.1  mrg     }
   2521  1.1  mrg }
   2522  1.1  mrg 
   2523  1.1  mrg void
   2524  1.1  mrg pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
   2525  1.1  mrg {
   2526  1.1  mrg   pp_cxx_ws_string (pp, "offsetof");
   2527  1.1  mrg   pp_cxx_left_paren (pp);
   2528  1.1  mrg   if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
   2529  1.1  mrg     pp->expression (TREE_OPERAND (t, 0));
   2530  1.1  mrg   pp_cxx_right_paren (pp);
   2531  1.1  mrg }
   2532  1.1  mrg 
   2533  1.1  mrg void
   2534  1.1  mrg pp_cxx_addressof_expression (cxx_pretty_printer *pp, tree t)
   2535  1.1  mrg {
   2536  1.1  mrg   pp_cxx_ws_string (pp, "__builtin_addressof");
   2537  1.1  mrg   pp_cxx_left_paren (pp);
   2538  1.1  mrg   pp->expression (TREE_OPERAND (t, 0));
   2539  1.1  mrg   pp_cxx_right_paren (pp);
   2540  1.1  mrg }
   2541  1.1  mrg 
   2542  1.1  mrg static char const*
   2543  1.1  mrg get_fold_operator (tree t)
   2544  1.1  mrg {
   2545  1.1  mrg   ovl_op_info_t *info = OVL_OP_INFO (FOLD_EXPR_MODIFY_P (t),
   2546  1.1  mrg 				     FOLD_EXPR_OP (t));
   2547  1.1  mrg   return info->name;
   2548  1.1  mrg }
   2549  1.1  mrg 
   2550  1.1  mrg void
   2551  1.1  mrg pp_cxx_unary_left_fold_expression (cxx_pretty_printer *pp, tree t)
   2552  1.1  mrg {
   2553  1.1  mrg   char const* op = get_fold_operator (t);
   2554  1.1  mrg   tree expr = PACK_EXPANSION_PATTERN (FOLD_EXPR_PACK (t));
   2555  1.1  mrg   pp_cxx_left_paren (pp);
   2556  1.1  mrg   pp_cxx_ws_string (pp, "...");
   2557  1.1  mrg   pp_cxx_ws_string (pp, op);
   2558  1.1  mrg   pp->expression (expr);
   2559  1.1  mrg   pp_cxx_right_paren (pp);
   2560  1.1  mrg }
   2561  1.1  mrg 
   2562  1.1  mrg void
   2563  1.1  mrg pp_cxx_unary_right_fold_expression (cxx_pretty_printer *pp, tree t)
   2564  1.1  mrg {
   2565  1.1  mrg   char const* op = get_fold_operator (t);
   2566  1.1  mrg   tree expr = PACK_EXPANSION_PATTERN (FOLD_EXPR_PACK (t));
   2567  1.1  mrg   pp_cxx_left_paren (pp);
   2568  1.1  mrg   pp->expression (expr);
   2569  1.1  mrg   pp_space (pp);
   2570  1.1  mrg   pp_cxx_ws_string (pp, op);
   2571  1.1  mrg   pp_cxx_ws_string (pp, "...");
   2572  1.1  mrg   pp_cxx_right_paren (pp);
   2573  1.1  mrg }
   2574  1.1  mrg 
   2575  1.1  mrg void
   2576  1.1  mrg pp_cxx_binary_fold_expression (cxx_pretty_printer *pp, tree t)
   2577  1.1  mrg {
   2578  1.1  mrg   char const* op = get_fold_operator (t);
   2579  1.1  mrg   tree t1 = TREE_OPERAND (t, 1);
   2580  1.1  mrg   tree t2 = TREE_OPERAND (t, 2);
   2581  1.1  mrg   if (t1 == FOLD_EXPR_PACK (t))
   2582  1.1  mrg     t1 = PACK_EXPANSION_PATTERN (t1);
   2583  1.1  mrg   else
   2584  1.1  mrg     t2 = PACK_EXPANSION_PATTERN (t2);
   2585  1.1  mrg   pp_cxx_left_paren (pp);
   2586  1.1  mrg   pp->expression (t1);
   2587  1.1  mrg   pp_cxx_ws_string (pp, op);
   2588  1.1  mrg   pp_cxx_ws_string (pp, "...");
   2589  1.1  mrg   pp_cxx_ws_string (pp, op);
   2590  1.1  mrg   pp->expression (t2);
   2591  1.1  mrg   pp_cxx_right_paren (pp);
   2592  1.1  mrg }
   2593  1.1  mrg 
   2594  1.1  mrg void
   2595  1.1  mrg pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
   2596  1.1  mrg {
   2597  1.1  mrg   cp_trait_kind kind = TRAIT_EXPR_KIND (t);
   2598  1.1  mrg 
   2599  1.1  mrg   switch (kind)
   2600  1.1  mrg     {
   2601  1.1  mrg     case CPTK_HAS_NOTHROW_ASSIGN:
   2602  1.1  mrg       pp_cxx_ws_string (pp, "__has_nothrow_assign");
   2603  1.1  mrg       break;
   2604  1.1  mrg     case CPTK_HAS_TRIVIAL_ASSIGN:
   2605  1.1  mrg       pp_cxx_ws_string (pp, "__has_trivial_assign");
   2606  1.1  mrg       break;
   2607  1.1  mrg     case CPTK_HAS_NOTHROW_CONSTRUCTOR:
   2608  1.1  mrg       pp_cxx_ws_string (pp, "__has_nothrow_constructor");
   2609  1.1  mrg       break;
   2610  1.1  mrg     case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
   2611  1.1  mrg       pp_cxx_ws_string (pp, "__has_trivial_constructor");
   2612  1.1  mrg       break;
   2613  1.1  mrg     case CPTK_HAS_NOTHROW_COPY:
   2614  1.1  mrg       pp_cxx_ws_string (pp, "__has_nothrow_copy");
   2615  1.1  mrg       break;
   2616  1.1  mrg     case CPTK_HAS_TRIVIAL_COPY:
   2617  1.1  mrg       pp_cxx_ws_string (pp, "__has_trivial_copy");
   2618  1.1  mrg       break;
   2619  1.1  mrg     case CPTK_HAS_TRIVIAL_DESTRUCTOR:
   2620  1.1  mrg       pp_cxx_ws_string (pp, "__has_trivial_destructor");
   2621  1.1  mrg       break;
   2622  1.1  mrg     case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
   2623  1.1  mrg       pp_cxx_ws_string (pp, "__has_unique_object_representations");
   2624  1.1  mrg       break;
   2625  1.1  mrg     case CPTK_HAS_VIRTUAL_DESTRUCTOR:
   2626  1.1  mrg       pp_cxx_ws_string (pp, "__has_virtual_destructor");
   2627  1.1  mrg       break;
   2628  1.1  mrg     case CPTK_IS_ABSTRACT:
   2629  1.1  mrg       pp_cxx_ws_string (pp, "__is_abstract");
   2630  1.1  mrg       break;
   2631  1.1  mrg     case CPTK_IS_AGGREGATE:
   2632  1.1  mrg       pp_cxx_ws_string (pp, "__is_aggregate");
   2633  1.1  mrg       break;
   2634  1.1  mrg     case CPTK_IS_BASE_OF:
   2635  1.1  mrg       pp_cxx_ws_string (pp, "__is_base_of");
   2636  1.1  mrg       break;
   2637  1.1  mrg     case CPTK_IS_CLASS:
   2638  1.1  mrg       pp_cxx_ws_string (pp, "__is_class");
   2639  1.1  mrg       break;
   2640  1.1  mrg     case CPTK_IS_EMPTY:
   2641  1.1  mrg       pp_cxx_ws_string (pp, "__is_empty");
   2642  1.1  mrg       break;
   2643  1.1  mrg     case CPTK_IS_ENUM:
   2644  1.1  mrg       pp_cxx_ws_string (pp, "__is_enum");
   2645  1.1  mrg       break;
   2646  1.1  mrg     case CPTK_IS_FINAL:
   2647  1.1  mrg       pp_cxx_ws_string (pp, "__is_final");
   2648  1.1  mrg       break;
   2649  1.1  mrg     case CPTK_IS_LAYOUT_COMPATIBLE:
   2650  1.1  mrg       pp_cxx_ws_string (pp, "__is_layout_compatible");
   2651  1.1  mrg       break;
   2652  1.1  mrg     case CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF:
   2653  1.1  mrg       pp_cxx_ws_string (pp, "__is_pointer_interconvertible_base_of");
   2654  1.1  mrg       break;
   2655  1.1  mrg     case CPTK_IS_POD:
   2656  1.1  mrg       pp_cxx_ws_string (pp, "__is_pod");
   2657  1.1  mrg       break;
   2658  1.1  mrg     case CPTK_IS_POLYMORPHIC:
   2659  1.1  mrg       pp_cxx_ws_string (pp, "__is_polymorphic");
   2660  1.1  mrg       break;
   2661  1.1  mrg     case CPTK_IS_SAME_AS:
   2662  1.1  mrg       pp_cxx_ws_string (pp, "__is_same");
   2663  1.1  mrg       break;
   2664  1.1  mrg     case CPTK_IS_STD_LAYOUT:
   2665  1.1  mrg       pp_cxx_ws_string (pp, "__is_std_layout");
   2666  1.1  mrg       break;
   2667  1.1  mrg     case CPTK_IS_TRIVIAL:
   2668  1.1  mrg       pp_cxx_ws_string (pp, "__is_trivial");
   2669  1.1  mrg       break;
   2670  1.1  mrg     case CPTK_IS_TRIVIALLY_ASSIGNABLE:
   2671  1.1  mrg       pp_cxx_ws_string (pp, "__is_trivially_assignable");
   2672  1.1  mrg       break;
   2673  1.1  mrg     case CPTK_IS_TRIVIALLY_CONSTRUCTIBLE:
   2674  1.1  mrg       pp_cxx_ws_string (pp, "__is_trivially_constructible");
   2675  1.1  mrg       break;
   2676  1.1  mrg     case CPTK_IS_TRIVIALLY_COPYABLE:
   2677  1.1  mrg       pp_cxx_ws_string (pp, "__is_trivially_copyable");
   2678  1.1  mrg       break;
   2679  1.1  mrg     case CPTK_IS_UNION:
   2680  1.1  mrg       pp_cxx_ws_string (pp, "__is_union");
   2681  1.1  mrg       break;
   2682  1.1  mrg     case CPTK_IS_LITERAL_TYPE:
   2683  1.1  mrg       pp_cxx_ws_string (pp, "__is_literal_type");
   2684  1.1  mrg       break;
   2685  1.1  mrg     case CPTK_IS_ASSIGNABLE:
   2686  1.1  mrg       pp_cxx_ws_string (pp, "__is_assignable");
   2687  1.1  mrg       break;
   2688  1.1  mrg     case CPTK_IS_CONSTRUCTIBLE:
   2689  1.1  mrg       pp_cxx_ws_string (pp, "__is_constructible");
   2690  1.1  mrg       break;
   2691  1.1  mrg     case CPTK_IS_NOTHROW_ASSIGNABLE:
   2692  1.1  mrg       pp_cxx_ws_string (pp, "__is_nothrow_assignable");
   2693  1.1  mrg       break;
   2694  1.1  mrg     case CPTK_IS_NOTHROW_CONSTRUCTIBLE:
   2695  1.1  mrg       pp_cxx_ws_string (pp, "__is_nothrow_constructible");
   2696  1.1  mrg       break;
   2697  1.1  mrg 
   2698  1.1  mrg     default:
   2699  1.1  mrg       gcc_unreachable ();
   2700  1.1  mrg     }
   2701  1.1  mrg 
   2702  1.1  mrg   pp_cxx_left_paren (pp);
   2703  1.1  mrg   pp->type_id (TRAIT_EXPR_TYPE1 (t));
   2704  1.1  mrg 
   2705  1.1  mrg   if (kind == CPTK_IS_BASE_OF
   2706  1.1  mrg       || kind == CPTK_IS_SAME_AS
   2707  1.1  mrg       || kind == CPTK_IS_LAYOUT_COMPATIBLE
   2708  1.1  mrg       || kind == CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF)
   2709  1.1  mrg     {
   2710  1.1  mrg       pp_cxx_separate_with (pp, ',');
   2711  1.1  mrg       pp->type_id (TRAIT_EXPR_TYPE2 (t));
   2712  1.1  mrg     }
   2713  1.1  mrg 
   2714  1.1  mrg   pp_cxx_right_paren (pp);
   2715  1.1  mrg }
   2716  1.1  mrg 
   2717  1.1  mrg // requires-clause:
   2718  1.1  mrg //    'requires' logical-or-expression
   2719  1.1  mrg void
   2720  1.1  mrg pp_cxx_requires_clause (cxx_pretty_printer *pp, tree t)
   2721  1.1  mrg {
   2722  1.1  mrg   if (!t)
   2723  1.1  mrg     return;
   2724  1.1  mrg   pp->padding = pp_before;
   2725  1.1  mrg   pp_cxx_ws_string (pp, "requires");
   2726  1.1  mrg   pp_space (pp);
   2727  1.1  mrg   pp->expression (t);
   2728  1.1  mrg }
   2729  1.1  mrg 
   2730  1.1  mrg /* requirement:
   2731  1.1  mrg      simple-requirement
   2732  1.1  mrg      compound-requirement
   2733  1.1  mrg      type-requirement
   2734  1.1  mrg      nested-requirement */
   2735  1.1  mrg static void
   2736  1.1  mrg pp_cxx_requirement (cxx_pretty_printer *pp, tree t)
   2737  1.1  mrg {
   2738  1.1  mrg   switch (TREE_CODE (t))
   2739  1.1  mrg     {
   2740  1.1  mrg     case SIMPLE_REQ:
   2741  1.1  mrg       pp_cxx_simple_requirement (pp, t);
   2742  1.1  mrg       break;
   2743  1.1  mrg 
   2744  1.1  mrg     case TYPE_REQ:
   2745  1.1  mrg       pp_cxx_type_requirement (pp, t);
   2746  1.1  mrg       break;
   2747  1.1  mrg 
   2748  1.1  mrg     case COMPOUND_REQ:
   2749  1.1  mrg       pp_cxx_compound_requirement (pp, t);
   2750  1.1  mrg       break;
   2751  1.1  mrg 
   2752  1.1  mrg     case NESTED_REQ:
   2753  1.1  mrg       pp_cxx_nested_requirement (pp, t);
   2754  1.1  mrg       break;
   2755  1.1  mrg 
   2756  1.1  mrg     default:
   2757  1.1  mrg       gcc_unreachable ();
   2758  1.1  mrg     }
   2759  1.1  mrg }
   2760  1.1  mrg 
   2761  1.1  mrg // requirement-list:
   2762  1.1  mrg //    requirement
   2763  1.1  mrg //    requirement-list ';' requirement[opt]
   2764  1.1  mrg //
   2765  1.1  mrg static void
   2766  1.1  mrg pp_cxx_requirement_list (cxx_pretty_printer *pp, tree t)
   2767  1.1  mrg {
   2768  1.1  mrg   for (; t; t = TREE_CHAIN (t))
   2769  1.1  mrg     pp_cxx_requirement (pp, TREE_VALUE (t));
   2770  1.1  mrg }
   2771  1.1  mrg 
   2772  1.1  mrg // requirement-body:
   2773  1.1  mrg //    '{' requirement-list '}'
   2774  1.1  mrg static void
   2775  1.1  mrg pp_cxx_requirement_body (cxx_pretty_printer *pp, tree t)
   2776  1.1  mrg {
   2777  1.1  mrg   pp_cxx_left_brace (pp);
   2778  1.1  mrg   pp_cxx_requirement_list (pp, t);
   2779  1.1  mrg   pp_cxx_right_brace (pp);
   2780  1.1  mrg }
   2781  1.1  mrg 
   2782  1.1  mrg // requires-expression:
   2783  1.1  mrg //    'requires' requirement-parameter-list requirement-body
   2784  1.1  mrg void
   2785  1.1  mrg pp_cxx_requires_expr (cxx_pretty_printer *pp, tree t)
   2786  1.1  mrg {
   2787  1.1  mrg   pp_string (pp, "requires");
   2788  1.1  mrg   if (tree parms = REQUIRES_EXPR_PARMS (t))
   2789  1.1  mrg     {
   2790  1.1  mrg       bool first = true;
   2791  1.1  mrg       pp_cxx_left_paren (pp);
   2792  1.1  mrg       for (; parms; parms = TREE_CHAIN (parms))
   2793  1.1  mrg 	{
   2794  1.1  mrg 	  if (!first)
   2795  1.1  mrg 	    pp_cxx_separate_with (pp, ',' );
   2796  1.1  mrg 	  first = false;
   2797  1.1  mrg 	  pp_cxx_parameter_declaration (pp, parms);
   2798  1.1  mrg 	}
   2799  1.1  mrg       pp_cxx_right_paren (pp);
   2800  1.1  mrg       pp_cxx_whitespace (pp);
   2801  1.1  mrg     }
   2802  1.1  mrg   pp_cxx_requirement_body (pp, TREE_OPERAND (t, 1));
   2803  1.1  mrg }
   2804  1.1  mrg 
   2805  1.1  mrg /* simple-requirement:
   2806  1.1  mrg      expression ';' */
   2807  1.1  mrg void
   2808  1.1  mrg pp_cxx_simple_requirement (cxx_pretty_printer *pp, tree t)
   2809  1.1  mrg {
   2810  1.1  mrg   pp->expression (TREE_OPERAND (t, 0));
   2811  1.1  mrg   pp_cxx_semicolon (pp);
   2812  1.1  mrg }
   2813  1.1  mrg 
   2814  1.1  mrg /* type-requirement:
   2815  1.1  mrg      typename type-name ';' */
   2816  1.1  mrg void
   2817  1.1  mrg pp_cxx_type_requirement (cxx_pretty_printer *pp, tree t)
   2818  1.1  mrg {
   2819  1.1  mrg   pp->type_id (TREE_OPERAND (t, 0));
   2820  1.1  mrg   pp_cxx_semicolon (pp);
   2821  1.1  mrg }
   2822  1.1  mrg 
   2823  1.1  mrg /* compound-requirement:
   2824  1.1  mrg      '{' expression '}' 'noexcept' [opt] trailing-return-type [opt] */
   2825  1.1  mrg void
   2826  1.1  mrg pp_cxx_compound_requirement (cxx_pretty_printer *pp, tree t)
   2827  1.1  mrg {
   2828  1.1  mrg   pp_cxx_left_brace (pp);
   2829  1.1  mrg   pp->expression (TREE_OPERAND (t, 0));
   2830  1.1  mrg   pp_cxx_right_brace (pp);
   2831  1.1  mrg 
   2832  1.1  mrg   if (COMPOUND_REQ_NOEXCEPT_P (t))
   2833  1.1  mrg     pp_cxx_ws_string (pp, "noexcept");
   2834  1.1  mrg 
   2835  1.1  mrg   if (tree type = TREE_OPERAND (t, 1))
   2836  1.1  mrg     {
   2837  1.1  mrg       pp_cxx_whitespace (pp);
   2838  1.1  mrg       pp_cxx_ws_string (pp, "->");
   2839  1.1  mrg       pp->type_id (type);
   2840  1.1  mrg     }
   2841  1.1  mrg   pp_cxx_semicolon (pp);
   2842  1.1  mrg }
   2843  1.1  mrg 
   2844  1.1  mrg /* nested requirement:
   2845  1.1  mrg      'requires' constraint-expression */
   2846  1.1  mrg void
   2847  1.1  mrg pp_cxx_nested_requirement (cxx_pretty_printer *pp, tree t)
   2848  1.1  mrg {
   2849  1.1  mrg   pp_cxx_ws_string (pp, "requires");
   2850  1.1  mrg   pp->expression (TREE_OPERAND (t, 0));
   2851  1.1  mrg   pp_cxx_semicolon (pp);
   2852  1.1  mrg }
   2853  1.1  mrg 
   2854  1.1  mrg void
   2855  1.1  mrg pp_cxx_check_constraint (cxx_pretty_printer *pp, tree t)
   2856  1.1  mrg {
   2857  1.1  mrg   tree decl = CHECK_CONSTR_CONCEPT (t);
   2858  1.1  mrg   tree tmpl = DECL_TI_TEMPLATE (decl);
   2859  1.1  mrg   tree args = CHECK_CONSTR_ARGS (t);
   2860  1.1  mrg   tree id = build_nt (TEMPLATE_ID_EXPR, tmpl, args);
   2861  1.1  mrg 
   2862  1.1  mrg   if (TREE_CODE (decl) == CONCEPT_DECL)
   2863  1.1  mrg     pp->expression (id);
   2864  1.1  mrg   else if (VAR_P (decl))
   2865  1.1  mrg     pp->expression (id);
   2866  1.1  mrg   else if (TREE_CODE (decl) == FUNCTION_DECL)
   2867  1.1  mrg     {
   2868  1.1  mrg       tree call = build_vl_exp (CALL_EXPR, 2);
   2869  1.1  mrg       TREE_OPERAND (call, 0) = integer_two_node;
   2870  1.1  mrg       TREE_OPERAND (call, 1) = id;
   2871  1.1  mrg       pp->expression (call);
   2872  1.1  mrg     }
   2873  1.1  mrg   else
   2874  1.1  mrg     gcc_unreachable ();
   2875  1.1  mrg }
   2876  1.1  mrg 
   2877  1.1  mrg /* Output the "[with ...]" clause for a parameter mapping of an atomic
   2878  1.1  mrg    constraint.   */
   2879  1.1  mrg 
   2880  1.1  mrg void
   2881  1.1  mrg pp_cxx_parameter_mapping (cxx_pretty_printer *pp, tree map)
   2882  1.1  mrg {
   2883  1.1  mrg   pp_cxx_whitespace (pp);
   2884  1.1  mrg   pp_cxx_left_bracket (pp);
   2885  1.1  mrg   pp->translate_string ("with");
   2886  1.1  mrg   pp_cxx_whitespace (pp);
   2887  1.1  mrg 
   2888  1.1  mrg   for (tree p = map; p; p = TREE_CHAIN (p))
   2889  1.1  mrg     {
   2890  1.1  mrg       tree parm = TREE_VALUE (p);
   2891  1.1  mrg       tree arg = TREE_PURPOSE (p);
   2892  1.1  mrg 
   2893  1.1  mrg       if (TYPE_P (parm))
   2894  1.1  mrg 	pp->type_id (parm);
   2895  1.1  mrg       else if (tree name = DECL_NAME (TEMPLATE_PARM_DECL (parm)))
   2896  1.1  mrg 	pp_cxx_tree_identifier (pp, name);
   2897  1.1  mrg       else
   2898  1.1  mrg 	pp->translate_string ("<unnamed>");
   2899  1.1  mrg 
   2900  1.1  mrg       pp_cxx_whitespace (pp);
   2901  1.1  mrg       pp_equal (pp);
   2902  1.1  mrg       pp_cxx_whitespace (pp);
   2903  1.1  mrg 
   2904  1.1  mrg       if (TYPE_P (arg) || DECL_TEMPLATE_TEMPLATE_PARM_P (arg))
   2905  1.1  mrg 	pp->type_id (arg);
   2906  1.1  mrg       else
   2907  1.1  mrg 	pp->expression (arg);
   2908  1.1  mrg 
   2909  1.1  mrg       if (TREE_CHAIN (p) != NULL_TREE)
   2910  1.1  mrg 	pp_cxx_separate_with (pp, ';');
   2911  1.1  mrg     }
   2912  1.1  mrg 
   2913  1.1  mrg   pp_cxx_right_bracket (pp);
   2914  1.1  mrg }
   2915  1.1  mrg 
   2916  1.1  mrg void
   2917  1.1  mrg pp_cxx_atomic_constraint (cxx_pretty_printer *pp, tree t)
   2918  1.1  mrg {
   2919  1.1  mrg   /* Emit the expression.  */
   2920  1.1  mrg   pp->expression (ATOMIC_CONSTR_EXPR (t));
   2921  1.1  mrg 
   2922  1.1  mrg   /* Emit the parameter mapping.  */
   2923  1.1  mrg   tree map = ATOMIC_CONSTR_MAP (t);
   2924  1.1  mrg   if (map && map != error_mark_node)
   2925  1.1  mrg     pp_cxx_parameter_mapping (pp, map);
   2926  1.1  mrg }
   2927  1.1  mrg 
   2928  1.1  mrg void
   2929  1.1  mrg pp_cxx_conjunction (cxx_pretty_printer *pp, tree t)
   2930  1.1  mrg {
   2931  1.1  mrg   pp_cxx_constraint (pp, TREE_OPERAND (t, 0));
   2932  1.1  mrg   pp_string (pp, " /\\ ");
   2933  1.1  mrg   pp_cxx_constraint (pp, TREE_OPERAND (t, 1));
   2934  1.1  mrg }
   2935  1.1  mrg 
   2936  1.1  mrg void
   2937  1.1  mrg pp_cxx_disjunction (cxx_pretty_printer *pp, tree t)
   2938  1.1  mrg {
   2939  1.1  mrg   pp_cxx_constraint (pp, TREE_OPERAND (t, 0));
   2940  1.1  mrg   pp_string (pp, " \\/ ");
   2941  1.1  mrg   pp_cxx_constraint (pp, TREE_OPERAND (t, 1));
   2942  1.1  mrg }
   2943  1.1  mrg 
   2944  1.1  mrg void
   2945  1.1  mrg pp_cxx_constraint (cxx_pretty_printer *pp, tree t)
   2946  1.1  mrg {
   2947  1.1  mrg   if (t == error_mark_node)
   2948  1.1  mrg     return pp->expression (t);
   2949  1.1  mrg 
   2950  1.1  mrg   switch (TREE_CODE (t))
   2951  1.1  mrg     {
   2952  1.1  mrg     case ATOMIC_CONSTR:
   2953  1.1  mrg       pp_cxx_atomic_constraint (pp, t);
   2954  1.1  mrg       break;
   2955  1.1  mrg 
   2956  1.1  mrg     case CHECK_CONSTR:
   2957  1.1  mrg       pp_cxx_check_constraint (pp, t);
   2958  1.1  mrg       break;
   2959  1.1  mrg 
   2960  1.1  mrg     case CONJ_CONSTR:
   2961  1.1  mrg       pp_cxx_conjunction (pp, t);
   2962  1.1  mrg       break;
   2963  1.1  mrg 
   2964  1.1  mrg     case DISJ_CONSTR:
   2965  1.1  mrg       pp_cxx_disjunction (pp, t);
   2966  1.1  mrg       break;
   2967  1.1  mrg 
   2968  1.1  mrg     case EXPR_PACK_EXPANSION:
   2969  1.1  mrg       pp->expression (TREE_OPERAND (t, 0));
   2970  1.1  mrg       break;
   2971  1.1  mrg 
   2972  1.1  mrg     default:
   2973  1.1  mrg       gcc_unreachable ();
   2974  1.1  mrg     }
   2975  1.1  mrg }
   2976  1.1  mrg 
   2977  1.1  mrg 
   2978  1.1  mrg typedef c_pretty_print_fn pp_fun;
   2980  1.1  mrg 
   2981  1.1  mrg /* Initialization of a C++ pretty-printer object.  */
   2982  1.1  mrg 
   2983  1.1  mrg cxx_pretty_printer::cxx_pretty_printer ()
   2984  1.1  mrg   : c_pretty_printer (),
   2985  1.1  mrg     enclosing_scope (global_namespace)
   2986  1.1  mrg {
   2987  1.1  mrg   type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
   2988  1.1  mrg   parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
   2989  1.1  mrg }
   2990  1.1  mrg 
   2991  1.1  mrg /* cxx_pretty_printer's implementation of pretty_printer::clone vfunc.  */
   2992  1.1  mrg 
   2993  1.1  mrg pretty_printer *
   2994  1.1  mrg cxx_pretty_printer::clone () const
   2995  1.1  mrg {
   2996             return new cxx_pretty_printer (*this);
   2997           }
   2998