1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2 Copyright (C) 2003, 2004, 2005, 2007, 2008,
3 2009, 2010, 2011 Free Software Foundation, Inc.
4 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
28 #include "cxx-pretty-print.h"
29 #include "tree-pretty-print.h"
31 /* Translate if being used for diagnostics, but not for dump files or
33 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
35 static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
36 static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
37 static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
38 static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
39 static void pp_cxx_expression (cxx_pretty_printer *, tree);
40 static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
41 static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
42 static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
43 static void pp_cxx_type_id (cxx_pretty_printer *, tree);
44 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
45 static void pp_cxx_declarator (cxx_pretty_printer *, tree);
46 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
47 static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
48 static void pp_cxx_statement (cxx_pretty_printer *, tree);
49 static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
50 static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
51 static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
55 pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
57 const char *p = pp_last_position_in_text (pp);
59 if (p != NULL && *p == c)
60 pp_cxx_whitespace (pp);
62 pp_base (pp)->padding = pp_none;
65 #define pp_cxx_storage_class_specifier(PP, T) \
66 pp_c_storage_class_specifier (pp_c_base (PP), T)
67 #define pp_cxx_expression_list(PP, T) \
68 pp_c_expression_list (pp_c_base (PP), T)
69 #define pp_cxx_space_for_pointer_operator(PP, T) \
70 pp_c_space_for_pointer_operator (pp_c_base (PP), T)
71 #define pp_cxx_init_declarator(PP, T) \
72 pp_c_init_declarator (pp_c_base (PP), T)
73 #define pp_cxx_call_argument_list(PP, T) \
74 pp_c_call_argument_list (pp_c_base (PP), T)
77 pp_cxx_colon_colon (cxx_pretty_printer *pp)
80 pp_base (pp)->padding = pp_none;
84 pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
86 pp_cxx_nonconsecutive_character (pp, '<');
90 pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
92 pp_cxx_nonconsecutive_character (pp, '>');
96 pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
98 pp_separate_with (pp, c);
99 pp_base (pp)->padding = pp_none;
105 is_destructor_name (tree name)
107 return name == complete_dtor_identifier
108 || name == base_dtor_identifier
109 || name == deleting_dtor_identifier;
112 /* conversion-function-id:
113 operator conversion-type-id
116 type-specifier-seq conversion-declarator(opt)
118 conversion-declarator:
119 ptr-operator conversion-declarator(opt) */
122 pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
124 pp_cxx_ws_string (pp, "operator");
125 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
129 pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
131 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
132 pp_cxx_begin_template_argument_list (pp);
133 pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
134 pp_cxx_end_template_argument_list (pp);
137 /* Prints the unqualified part of the id-expression T.
142 conversion-function-id
147 pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
149 enum tree_code code = TREE_CODE (t);
153 pp_cxx_ws_string (pp, M_("<return-value>"));
170 case IDENTIFIER_NODE:
172 pp_cxx_ws_string (pp, M_("<unnamed>"));
173 else if (IDENTIFIER_TYPENAME_P (t))
174 pp_cxx_conversion_function_id (pp, t);
177 if (is_destructor_name (t))
180 /* FIXME: Why is this necessary? */
182 t = constructor_name (TREE_TYPE (t));
184 pp_cxx_tree_identifier (pp, t);
188 case TEMPLATE_ID_EXPR:
189 pp_cxx_template_id (pp, t);
193 pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
200 case UNBOUND_CLASS_TEMPLATE:
201 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
202 if (CLASS_TYPE_P (t) && CLASSTYPE_USE_TEMPLATE (t))
204 pp_cxx_begin_template_argument_list (pp);
205 pp_cxx_template_argument_list (pp, INNERMOST_TEMPLATE_ARGS
206 (CLASSTYPE_TI_ARGS (t)));
207 pp_cxx_end_template_argument_list (pp);
212 pp_cxx_complement (pp);
213 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
216 case TEMPLATE_TYPE_PARM:
217 case TEMPLATE_TEMPLATE_PARM:
218 if (TYPE_IDENTIFIER (t))
219 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
221 pp_cxx_canonical_template_parameter (pp, t);
224 case TEMPLATE_PARM_INDEX:
225 pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
228 case BOUND_TEMPLATE_TEMPLATE_PARM:
229 pp_cxx_cv_qualifier_seq (pp, t);
230 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
231 pp_cxx_begin_template_argument_list (pp);
232 pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
233 pp_cxx_end_template_argument_list (pp);
237 pp_unsupported_tree (pp, t);
242 /* Pretty-print out the token sequence ":: template" in template codes
243 where it is needed to "inline declare" the (following) member as
244 a template. This situation arises when SCOPE of T is dependent
245 on template parameters. */
248 pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
250 if (TREE_CODE (t) == TEMPLATE_ID_EXPR
251 && TYPE_P (scope) && dependent_type_p (scope))
252 pp_cxx_ws_string (pp, "template");
255 /* nested-name-specifier:
256 class-or-namespace-name :: nested-name-specifier(opt)
257 class-or-namespace-name :: template nested-name-specifier */
260 pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
262 if (!SCOPE_FILE_SCOPE_P (t) && t != pp->enclosing_scope)
264 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
265 pp_cxx_nested_name_specifier (pp, scope);
266 pp_cxx_template_keyword_if_needed (pp, scope, t);
267 pp_cxx_unqualified_id (pp, t);
268 pp_cxx_colon_colon (pp);
273 nested-name-specifier template(opt) unqualified-id */
276 pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
278 switch (TREE_CODE (t))
280 /* A pointer-to-member is always qualified. */
282 pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
283 pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
286 /* In Standard C++, functions cannot possibly be used as
287 nested-name-specifiers. However, there are situations where
288 is "makes sense" to output the surrounding function name for the
289 purpose of emphasizing on the scope kind. Just printing the
290 function name might not be sufficient as it may be overloaded; so,
291 we decorate the function with its signature too.
292 FIXME: This is probably the wrong pretty-printing for conversion
293 functions and some function templates. */
297 if (DECL_FUNCTION_MEMBER_P (t))
298 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
299 pp_cxx_unqualified_id
300 (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
301 pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
306 pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
307 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
312 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
313 if (scope != pp->enclosing_scope)
315 pp_cxx_nested_name_specifier (pp, scope);
316 pp_cxx_template_keyword_if_needed (pp, scope, t);
318 pp_cxx_unqualified_id (pp, t);
326 pp_cxx_constant (cxx_pretty_printer *pp, tree t)
328 switch (TREE_CODE (t))
332 const bool in_parens = PAREN_STRING_LITERAL_P (t);
334 pp_cxx_left_paren (pp);
335 pp_c_constant (pp_c_base (pp), t);
337 pp_cxx_right_paren (pp);
342 if (NULLPTR_TYPE_P (TREE_TYPE (t)))
344 pp_string (pp, "nullptr");
347 /* else fall through. */
350 pp_c_constant (pp_c_base (pp), t);
360 pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
362 if (TREE_CODE (t) == OVERLOAD)
364 if (DECL_P (t) && DECL_CONTEXT (t))
365 pp_cxx_qualified_id (pp, t);
367 pp_cxx_unqualified_id (pp, t);
370 /* primary-expression:
374 :: operator-function-id
380 __builtin_va_arg ( assignment-expression , type-id )
381 __builtin_offsetof ( type-id, offsetof-expression )
383 __has_nothrow_assign ( type-id )
384 __has_nothrow_constructor ( type-id )
385 __has_nothrow_copy ( type-id )
386 __has_trivial_assign ( type-id )
387 __has_trivial_constructor ( type-id )
388 __has_trivial_copy ( type-id )
389 __has_trivial_destructor ( type-id )
390 __has_virtual_destructor ( type-id )
391 __is_abstract ( type-id )
392 __is_base_of ( type-id , type-id )
393 __is_class ( type-id )
394 __is_convertible_to ( type-id , type-id )
395 __is_empty ( type-id )
396 __is_enum ( type-id )
398 __is_polymorphic ( type-id )
399 __is_union ( type-id ) */
402 pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
404 switch (TREE_CODE (t))
410 pp_cxx_constant (pp, t);
414 t = BASELINK_FUNCTIONS (t);
422 pp_cxx_id_expression (pp, t);
426 case TEMPLATE_TYPE_PARM:
427 case TEMPLATE_TEMPLATE_PARM:
428 case TEMPLATE_PARM_INDEX:
429 pp_cxx_unqualified_id (pp, t);
433 pp_cxx_left_paren (pp);
434 pp_cxx_statement (pp, STMT_EXPR_STMT (t));
435 pp_cxx_right_paren (pp);
439 pp_cxx_trait_expression (pp, t);
443 pp_cxx_va_arg_expression (pp, t);
447 pp_cxx_offsetof_expression (pp, t);
451 pp_c_primary_expression (pp_c_base (pp), t);
456 /* postfix-expression:
458 postfix-expression [ expression ]
459 postfix-expression ( expression-list(opt) )
460 simple-type-specifier ( expression-list(opt) )
461 typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
462 typename ::(opt) nested-name-specifier template(opt)
463 template-id ( expression-list(opt) )
464 postfix-expression . template(opt) ::(opt) id-expression
465 postfix-expression -> template(opt) ::(opt) id-expression
466 postfix-expression . pseudo-destructor-name
467 postfix-expression -> pseudo-destructor-name
468 postfix-expression ++
469 postfix-expression --
470 dynamic_cast < type-id > ( expression )
471 static_cast < type-id > ( expression )
472 reinterpret_cast < type-id > ( expression )
473 const_cast < type-id > ( expression )
474 typeid ( expression )
475 typeid ( type-id ) */
478 pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
480 enum tree_code code = TREE_CODE (t);
487 tree fun = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t)
489 tree saved_scope = pp->enclosing_scope;
490 bool skipfirst = false;
493 if (TREE_CODE (fun) == ADDR_EXPR)
494 fun = TREE_OPERAND (fun, 0);
496 /* In templates, where there is no way to tell whether a given
497 call uses an actual member function. So the parser builds
498 FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
499 instantiation time. */
500 if (TREE_CODE (fun) != FUNCTION_DECL)
502 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
504 tree object = (code == AGGR_INIT_EXPR
505 ? (AGGR_INIT_VIA_CTOR_P (t)
506 ? AGGR_INIT_EXPR_SLOT (t)
507 : AGGR_INIT_EXPR_ARG (t, 0))
508 : CALL_EXPR_ARG (t, 0));
510 while (TREE_CODE (object) == NOP_EXPR)
511 object = TREE_OPERAND (object, 0);
513 if (TREE_CODE (object) == ADDR_EXPR)
514 object = TREE_OPERAND (object, 0);
516 if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
518 pp_cxx_postfix_expression (pp, object);
523 pp_cxx_postfix_expression (pp, object);
527 pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
530 pp_cxx_postfix_expression (pp, fun);
531 pp->enclosing_scope = saved_scope;
532 pp_cxx_left_paren (pp);
533 if (code == AGGR_INIT_EXPR)
535 aggr_init_expr_arg_iterator iter;
536 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
542 pp_cxx_expression (pp, arg);
543 if (more_aggr_init_expr_args_p (&iter))
544 pp_cxx_separate_with (pp, ',');
550 call_expr_arg_iterator iter;
551 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
557 pp_cxx_expression (pp, arg);
558 if (more_call_expr_args_p (&iter))
559 pp_cxx_separate_with (pp, ',');
563 pp_cxx_right_paren (pp);
565 if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
567 pp_cxx_separate_with (pp, ',');
568 pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t));
581 pp_cxx_primary_expression (pp, t);
584 case DYNAMIC_CAST_EXPR:
585 case STATIC_CAST_EXPR:
586 case REINTERPRET_CAST_EXPR:
587 case CONST_CAST_EXPR:
588 if (code == DYNAMIC_CAST_EXPR)
589 pp_cxx_ws_string (pp, "dynamic_cast");
590 else if (code == STATIC_CAST_EXPR)
591 pp_cxx_ws_string (pp, "static_cast");
592 else if (code == REINTERPRET_CAST_EXPR)
593 pp_cxx_ws_string (pp, "reinterpret_cast");
595 pp_cxx_ws_string (pp, "const_cast");
596 pp_cxx_begin_template_argument_list (pp);
597 pp_cxx_type_id (pp, TREE_TYPE (t));
598 pp_cxx_end_template_argument_list (pp);
600 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
604 case EMPTY_CLASS_EXPR:
605 pp_cxx_type_id (pp, TREE_TYPE (t));
611 pp_cxx_typeid_expression (pp, t);
614 case PSEUDO_DTOR_EXPR:
615 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
617 pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
618 pp_cxx_colon_colon (pp);
620 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
624 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
629 pp_c_postfix_expression (pp_c_base (pp), t);
635 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
636 ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
642 type-specifier-seq new-declarator(opt)
645 ptr-operator new-declarator(opt)
646 direct-new-declarator
648 direct-new-declarator
650 direct-new-declarator [ constant-expression ]
653 ( expression-list(opt) ) */
656 pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
658 enum tree_code code = TREE_CODE (t);
659 tree type = TREE_OPERAND (t, 1);
660 tree init = TREE_OPERAND (t, 2);
665 if (NEW_EXPR_USE_GLOBAL (t))
666 pp_cxx_colon_colon (pp);
667 pp_cxx_ws_string (pp, "new");
668 if (TREE_OPERAND (t, 0))
670 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
673 if (TREE_CODE (type) == ARRAY_REF)
674 type = build_cplus_array_type
675 (TREE_OPERAND (type, 0),
676 build_index_type (fold_build2_loc (input_location,
677 MINUS_EXPR, integer_type_node,
678 TREE_OPERAND (type, 1),
680 pp_cxx_type_id (pp, type);
684 if (TREE_CODE (init) == TREE_LIST)
685 pp_c_expression_list (pp_c_base (pp), init);
686 else if (init == void_zero_node)
687 ; /* OK, empty initializer list. */
689 pp_cxx_expression (pp, init);
695 pp_unsupported_tree (pp, t);
699 /* delete-expression:
700 ::(opt) delete cast-expression
701 ::(opt) delete [ ] cast-expression */
704 pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
706 enum tree_code code = TREE_CODE (t);
710 case VEC_DELETE_EXPR:
711 if (DELETE_EXPR_USE_GLOBAL (t))
712 pp_cxx_colon_colon (pp);
713 pp_cxx_ws_string (pp, "delete");
715 if (code == VEC_DELETE_EXPR
716 || DELETE_EXPR_USE_VEC (t))
718 pp_left_bracket (pp);
719 pp_right_bracket (pp);
722 pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
726 pp_unsupported_tree (pp, t);
734 unary-operator cast-expression
735 sizeof unary-expression
737 sizeof ... ( identifier )
741 unary-operator: one of
745 __alignof__ unary-expression
746 __alignof__ ( type-id ) */
749 pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
751 enum tree_code code = TREE_CODE (t);
756 pp_cxx_new_expression (pp, t);
760 case VEC_DELETE_EXPR:
761 pp_cxx_delete_expression (pp, t);
765 if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
767 pp_cxx_ws_string (pp, "sizeof");
768 pp_cxx_ws_string (pp, "...");
769 pp_cxx_whitespace (pp);
770 pp_cxx_left_paren (pp);
771 if (TYPE_P (TREE_OPERAND (t, 0)))
772 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
774 pp_unary_expression (pp, TREE_OPERAND (t, 0));
775 pp_cxx_right_paren (pp);
781 pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
782 pp_cxx_whitespace (pp);
783 if (TYPE_P (TREE_OPERAND (t, 0)))
785 pp_cxx_left_paren (pp);
786 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
787 pp_cxx_right_paren (pp);
790 pp_unary_expression (pp, TREE_OPERAND (t, 0));
794 pp_cxx_ws_string (pp, "@encode");
795 pp_cxx_whitespace (pp);
796 pp_cxx_left_paren (pp);
797 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
798 pp_cxx_right_paren (pp);
802 pp_cxx_ws_string (pp, "noexcept");
803 pp_cxx_whitespace (pp);
804 pp_cxx_left_paren (pp);
805 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
806 pp_cxx_right_paren (pp);
809 case UNARY_PLUS_EXPR:
811 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
815 pp_c_unary_expression (pp_c_base (pp), t);
822 ( type-id ) cast-expression */
825 pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
827 switch (TREE_CODE (t))
830 pp_cxx_type_id (pp, TREE_TYPE (t));
831 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
835 pp_c_cast_expression (pp_c_base (pp), t);
842 pm-expression .* cast-expression
843 pm-expression ->* cast-expression */
846 pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
848 switch (TREE_CODE (t))
850 /* Handle unfortunate OFFSET_REF overloading here. */
852 if (TYPE_P (TREE_OPERAND (t, 0)))
854 pp_cxx_qualified_id (pp, t);
857 /* Else fall through. */
860 pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
861 if (TREE_CODE (t) == MEMBER_REF)
866 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
871 pp_cxx_cast_expression (pp, t);
876 /* multiplicative-expression:
878 multiplicative-expression * pm-expression
879 multiplicative-expression / pm-expression
880 multiplicative-expression % pm-expression */
883 pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
885 enum tree_code code = TREE_CODE (e);
891 pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
893 if (code == MULT_EXPR)
895 else if (code == TRUNC_DIV_EXPR)
900 pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
904 pp_cxx_pm_expression (pp, e);
909 /* conditional-expression:
910 logical-or-expression
911 logical-or-expression ? expression : assignment-expression */
914 pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
916 if (TREE_CODE (e) == COND_EXPR)
918 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
922 pp_cxx_expression (pp, TREE_OPERAND (e, 1));
924 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
927 pp_c_logical_or_expression (pp_c_base (pp), e);
930 /* Pretty-print a compound assignment operator token as indicated by T. */
933 pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
937 switch (TREE_CODE (t))
960 op = tree_code_name[TREE_CODE (t)];
964 pp_cxx_ws_string (pp, op);
968 /* assignment-expression:
969 conditional-expression
970 logical-or-expression assignment-operator assignment-expression
974 throw assignment-expression(opt)
976 assignment-operator: one of
977 = *= /= %= += -= >>= <<= &= ^= |= */
980 pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
982 switch (TREE_CODE (e))
986 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
990 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
994 pp_cxx_ws_string (pp, "throw");
995 if (TREE_OPERAND (e, 0))
996 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
1000 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
1001 pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
1002 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
1006 pp_cxx_conditional_expression (pp, e);
1012 pp_cxx_expression (cxx_pretty_printer *pp, tree t)
1014 switch (TREE_CODE (t))
1020 pp_cxx_constant (pp, t);
1024 pp_cxx_unqualified_id (pp, t);
1032 pp_cxx_qualified_id (pp, t);
1036 t = OVL_CURRENT (t);
1044 case TEMPLATE_TYPE_PARM:
1045 case TEMPLATE_PARM_INDEX:
1046 case TEMPLATE_TEMPLATE_PARM:
1048 pp_cxx_primary_expression (pp, t);
1052 case DYNAMIC_CAST_EXPR:
1053 case STATIC_CAST_EXPR:
1054 case REINTERPRET_CAST_EXPR:
1055 case CONST_CAST_EXPR:
1059 case EMPTY_CLASS_EXPR:
1061 case PSEUDO_DTOR_EXPR:
1062 case AGGR_INIT_EXPR:
1064 pp_cxx_postfix_expression (pp, t);
1069 pp_cxx_new_expression (pp, t);
1073 case VEC_DELETE_EXPR:
1074 pp_cxx_delete_expression (pp, t);
1080 pp_cxx_unary_expression (pp, t);
1084 pp_cxx_cast_expression (pp, t);
1090 pp_cxx_pm_expression (pp, t);
1094 case TRUNC_DIV_EXPR:
1095 case TRUNC_MOD_EXPR:
1096 pp_cxx_multiplicative_expression (pp, t);
1100 pp_cxx_conditional_expression (pp, t);
1107 pp_cxx_assignment_expression (pp, t);
1110 case NON_DEPENDENT_EXPR:
1111 case MUST_NOT_THROW_EXPR:
1112 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
1115 case EXPR_PACK_EXPANSION:
1116 pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t));
1117 pp_cxx_ws_string (pp, "...");
1120 case TEMPLATE_ID_EXPR:
1121 pp_cxx_template_id (pp, t);
1124 case NONTYPE_ARGUMENT_PACK:
1126 tree args = ARGUMENT_PACK_ARGS (t);
1127 int i, len = TREE_VEC_LENGTH (args);
1128 for (i = 0; i < len; ++i)
1131 pp_cxx_separate_with (pp, ',');
1132 pp_cxx_expression (pp, TREE_VEC_ELT (args, i));
1138 pp_c_expression (pp_c_base (pp), t);
1146 /* function-specifier:
1152 pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
1154 switch (TREE_CODE (t))
1157 if (DECL_VIRTUAL_P (t))
1158 pp_cxx_ws_string (pp, "virtual");
1159 else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1160 pp_cxx_ws_string (pp, "explicit");
1162 pp_c_function_specifier (pp_c_base (pp), t);
1169 /* decl-specifier-seq:
1170 decl-specifier-seq(opt) decl-specifier
1173 storage-class-specifier
1180 pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
1182 switch (TREE_CODE (t))
1188 pp_cxx_storage_class_specifier (pp, t);
1189 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1193 pp_cxx_ws_string (pp, "typedef");
1194 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1198 /* Constructors don't have return types. And conversion functions
1199 do not have a type-specifier in their return types. */
1200 if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1201 pp_cxx_function_specifier (pp, t);
1202 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1203 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1206 pp_c_declaration_specifiers (pp_c_base (pp), t);
1211 /* simple-type-specifier:
1212 ::(opt) nested-name-specifier(opt) type-name
1213 ::(opt) nested-name-specifier(opt) template(opt) template-id
1227 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1229 switch (TREE_CODE (t))
1234 pp_cxx_qualified_id (pp, t);
1237 case TEMPLATE_TYPE_PARM:
1238 case TEMPLATE_TEMPLATE_PARM:
1239 case TEMPLATE_PARM_INDEX:
1240 pp_cxx_unqualified_id (pp, t);
1244 pp_cxx_ws_string (pp, "typename");
1245 pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1246 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1250 pp_c_type_specifier (pp_c_base (pp), t);
1255 /* type-specifier-seq:
1256 type-specifier type-specifier-seq(opt)
1259 simple-type-specifier
1262 elaborated-type-specifier
1266 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1268 switch (TREE_CODE (t))
1271 case TEMPLATE_TYPE_PARM:
1272 case TEMPLATE_TEMPLATE_PARM:
1274 case BOUND_TEMPLATE_TEMPLATE_PARM:
1275 pp_cxx_cv_qualifier_seq (pp, t);
1276 pp_cxx_simple_type_specifier (pp, t);
1280 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1281 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1282 pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1286 pp_cxx_ws_string (pp, "decltype");
1287 pp_cxx_left_paren (pp);
1288 pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1289 pp_cxx_right_paren (pp);
1293 if (TYPE_PTRMEMFUNC_P (t))
1295 tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1296 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1297 pp_cxx_whitespace (pp);
1298 pp_cxx_ptr_operator (pp, t);
1301 /* else fall through */
1304 if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1305 pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1310 * cv-qualifier-seq(opt)
1312 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1315 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1317 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1319 switch (TREE_CODE (t))
1321 case REFERENCE_TYPE:
1323 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
1324 || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
1325 pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1326 pp_c_attributes_display (pp_c_base (pp),
1327 TYPE_ATTRIBUTES (TREE_TYPE (t)));
1328 if (TREE_CODE (t) == POINTER_TYPE)
1331 pp_cxx_cv_qualifier_seq (pp, t);
1338 if (TYPE_PTRMEMFUNC_P (t))
1340 pp_cxx_left_paren (pp);
1341 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1346 if (TYPE_PTR_TO_MEMBER_P (t))
1348 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1349 pp_cxx_left_paren (pp);
1350 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1352 pp_cxx_cv_qualifier_seq (pp, t);
1355 /* else fall through. */
1358 pp_unsupported_tree (pp, t);
1364 pp_cxx_implicit_parameter_type (tree mf)
1366 return class_of_this_parm (TREE_TYPE (mf));
1370 parameter-declaration:
1371 decl-specifier-seq declarator
1372 decl-specifier-seq declarator = assignment-expression
1373 decl-specifier-seq abstract-declarator(opt)
1374 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1377 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1379 pp_cxx_decl_specifier_seq (pp, t);
1381 pp_cxx_abstract_declarator (pp, t);
1383 pp_cxx_declarator (pp, t);
1386 /* parameter-declaration-clause:
1387 parameter-declaration-list(opt) ...(opt)
1388 parameter-declaration-list , ...
1390 parameter-declaration-list:
1391 parameter-declaration
1392 parameter-declaration-list , parameter-declaration */
1395 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1397 tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1399 TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1400 const bool abstract = args == NULL
1401 || pp_c_base (pp)->flags & pp_c_flag_abstract;
1404 /* Skip artificial parameter for nonstatic member functions. */
1405 if (TREE_CODE (t) == METHOD_TYPE)
1406 types = TREE_CHAIN (types);
1408 pp_cxx_left_paren (pp);
1409 for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1412 pp_cxx_separate_with (pp, ',');
1414 pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1415 if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1417 pp_cxx_whitespace (pp);
1419 pp_cxx_whitespace (pp);
1420 pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1423 pp_cxx_right_paren (pp);
1426 /* exception-specification:
1427 throw ( type-id-list(opt) )
1431 type-id-list , type-id */
1434 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1436 tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1437 bool need_comma = false;
1439 if (ex_spec == NULL)
1441 if (TREE_PURPOSE (ex_spec))
1443 pp_cxx_ws_string (pp, "noexcept");
1444 pp_cxx_whitespace (pp);
1445 pp_cxx_left_paren (pp);
1446 pp_cxx_expression (pp, TREE_PURPOSE (ex_spec));
1447 pp_cxx_right_paren (pp);
1450 pp_cxx_ws_string (pp, "throw");
1451 pp_cxx_left_paren (pp);
1452 for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1454 tree type = TREE_VALUE (ex_spec);
1455 tree argpack = NULL_TREE;
1458 if (ARGUMENT_PACK_P (type))
1460 argpack = ARGUMENT_PACK_ARGS (type);
1461 len = TREE_VEC_LENGTH (argpack);
1464 for (i = 0; i < len; ++i)
1467 type = TREE_VEC_ELT (argpack, i);
1470 pp_cxx_separate_with (pp, ',');
1474 pp_cxx_type_id (pp, type);
1477 pp_cxx_right_paren (pp);
1480 /* direct-declarator:
1482 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1483 exception-specification(opt)
1484 direct-declaration [ constant-expression(opt) ]
1488 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1490 switch (TREE_CODE (t))
1498 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1500 if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1501 || template_parameter_pack_p (t))
1502 /* A function parameter pack or non-type template
1504 pp_cxx_ws_string (pp, "...");
1506 pp_cxx_id_expression (pp, DECL_NAME (t));
1508 pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1512 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1513 pp_cxx_id_expression (pp, t);
1514 pp_cxx_parameter_declaration_clause (pp, t);
1516 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1518 pp_base (pp)->padding = pp_before;
1519 pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1522 pp_cxx_exception_specification (pp, TREE_TYPE (t));
1527 case TEMPLATE_TYPE_PARM:
1528 case TEMPLATE_PARM_INDEX:
1529 case TEMPLATE_TEMPLATE_PARM:
1533 pp_c_direct_declarator (pp_c_base (pp), t);
1540 ptr-operator declarator */
1543 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1545 pp_cxx_direct_declarator (pp, t);
1548 /* ctor-initializer:
1549 : mem-initializer-list
1551 mem-initializer-list:
1553 mem-initializer , mem-initializer-list
1556 mem-initializer-id ( expression-list(opt) )
1559 ::(opt) nested-name-specifier(opt) class-name
1563 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1565 t = TREE_OPERAND (t, 0);
1566 pp_cxx_whitespace (pp);
1568 pp_cxx_whitespace (pp);
1569 for (; t; t = TREE_CHAIN (t))
1571 tree purpose = TREE_PURPOSE (t);
1572 bool is_pack = PACK_EXPANSION_P (purpose);
1575 pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1577 pp_cxx_primary_expression (pp, purpose);
1578 pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1580 pp_cxx_ws_string (pp, "...");
1582 pp_cxx_separate_with (pp, ',');
1586 /* function-definition:
1587 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1588 decl-specifier-seq(opt) declarator function-try-block */
1591 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1593 tree saved_scope = pp->enclosing_scope;
1594 pp_cxx_decl_specifier_seq (pp, t);
1595 pp_cxx_declarator (pp, t);
1596 pp_needs_newline (pp) = true;
1597 pp->enclosing_scope = DECL_CONTEXT (t);
1598 if (DECL_SAVED_TREE (t))
1599 pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1602 pp_cxx_semicolon (pp);
1603 pp_needs_newline (pp) = true;
1606 pp->enclosing_scope = saved_scope;
1609 /* abstract-declarator:
1610 ptr-operator abstract-declarator(opt)
1611 direct-abstract-declarator */
1614 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1616 if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t))
1617 pp_cxx_right_paren (pp);
1618 else if (POINTER_TYPE_P (t))
1620 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1621 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1622 pp_cxx_right_paren (pp);
1625 pp_cxx_direct_abstract_declarator (pp, t);
1628 /* direct-abstract-declarator:
1629 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1630 cv-qualifier-seq(opt) exception-specification(opt)
1631 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1632 ( abstract-declarator ) */
1635 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1637 switch (TREE_CODE (t))
1639 case REFERENCE_TYPE:
1640 pp_cxx_abstract_declarator (pp, t);
1644 if (TYPE_PTRMEMFUNC_P (t))
1645 pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1650 pp_cxx_parameter_declaration_clause (pp, t);
1651 pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1652 if (TREE_CODE (t) == METHOD_TYPE)
1654 pp_base (pp)->padding = pp_before;
1655 pp_cxx_cv_qualifier_seq (pp, class_of_this_parm (t));
1657 pp_cxx_exception_specification (pp, t);
1661 case TEMPLATE_TYPE_PARM:
1662 case TEMPLATE_TEMPLATE_PARM:
1663 case BOUND_TEMPLATE_TEMPLATE_PARM:
1664 case UNBOUND_CLASS_TEMPLATE:
1668 pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1674 type-specifier-seq abstract-declarator(opt) */
1677 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1679 pp_flags saved_flags = pp_c_base (pp)->flags;
1680 pp_c_base (pp)->flags |= pp_c_flag_abstract;
1682 switch (TREE_CODE (t))
1689 case BOUND_TEMPLATE_TEMPLATE_PARM:
1690 case UNBOUND_CLASS_TEMPLATE:
1691 case TEMPLATE_TEMPLATE_PARM:
1692 case TEMPLATE_TYPE_PARM:
1693 case TEMPLATE_PARM_INDEX:
1696 case UNDERLYING_TYPE:
1698 case TEMPLATE_ID_EXPR:
1699 pp_cxx_type_specifier_seq (pp, t);
1702 case TYPE_PACK_EXPANSION:
1703 pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1704 pp_cxx_ws_string (pp, "...");
1708 pp_c_type_id (pp_c_base (pp), t);
1712 pp_c_base (pp)->flags = saved_flags;
1715 /* template-argument-list:
1716 template-argument ...(opt)
1717 template-argument-list, template-argument ...(opt)
1720 assignment-expression
1725 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1728 bool need_comma = false;
1732 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1734 tree arg = TREE_VEC_ELT (t, i);
1735 tree argpack = NULL_TREE;
1738 if (ARGUMENT_PACK_P (arg))
1740 argpack = ARGUMENT_PACK_ARGS (arg);
1741 len = TREE_VEC_LENGTH (argpack);
1744 for (idx = 0; idx < len; idx++)
1747 arg = TREE_VEC_ELT (argpack, idx);
1750 pp_cxx_separate_with (pp, ',');
1754 if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1755 && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1756 pp_cxx_type_id (pp, arg);
1758 pp_cxx_expression (pp, arg);
1765 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1767 t = DECL_EXPR_DECL (t);
1768 pp_cxx_type_specifier_seq (pp, t);
1770 pp_cxx_abstract_declarator (pp, t);
1772 pp_cxx_declarator (pp, t);
1778 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1780 switch (TREE_CODE (t))
1782 case CTOR_INITIALIZER:
1783 pp_cxx_ctor_initializer (pp, t);
1787 pp_cxx_ws_string (pp, "using");
1788 pp_cxx_ws_string (pp, "namespace");
1789 if (DECL_CONTEXT (t))
1790 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1791 pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1795 pp_cxx_ws_string (pp, "using");
1796 pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1797 pp_cxx_unqualified_id (pp, DECL_NAME (t));
1804 try compound-statement handler-seq */
1806 pp_maybe_newline_and_indent (pp, 0);
1807 pp_cxx_ws_string (pp, "try");
1808 pp_newline_and_indent (pp, 3);
1809 pp_cxx_statement (pp, TRY_STMTS (t));
1810 pp_newline_and_indent (pp, -3);
1814 pp_cxx_statement (pp, TRY_HANDLERS (t));
1819 handler handler-seq(opt)
1822 catch ( exception-declaration ) compound-statement
1824 exception-declaration:
1825 type-specifier-seq declarator
1826 type-specifier-seq abstract-declarator
1829 pp_cxx_ws_string (pp, "catch");
1830 pp_cxx_left_paren (pp);
1831 pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1832 pp_cxx_right_paren (pp);
1833 pp_indentation (pp) += 3;
1834 pp_needs_newline (pp) = true;
1835 pp_cxx_statement (pp, HANDLER_BODY (t));
1836 pp_indentation (pp) -= 3;
1837 pp_needs_newline (pp) = true;
1840 /* selection-statement:
1841 if ( expression ) statement
1842 if ( expression ) statement else statement */
1844 pp_cxx_ws_string (pp, "if");
1845 pp_cxx_whitespace (pp);
1846 pp_cxx_left_paren (pp);
1847 pp_cxx_expression (pp, IF_COND (t));
1848 pp_cxx_right_paren (pp);
1849 pp_newline_and_indent (pp, 2);
1850 pp_cxx_statement (pp, THEN_CLAUSE (t));
1851 pp_newline_and_indent (pp, -2);
1852 if (ELSE_CLAUSE (t))
1854 tree else_clause = ELSE_CLAUSE (t);
1855 pp_cxx_ws_string (pp, "else");
1856 if (TREE_CODE (else_clause) == IF_STMT)
1857 pp_cxx_whitespace (pp);
1859 pp_newline_and_indent (pp, 2);
1860 pp_cxx_statement (pp, else_clause);
1861 if (TREE_CODE (else_clause) != IF_STMT)
1862 pp_newline_and_indent (pp, -2);
1867 pp_cxx_ws_string (pp, "switch");
1869 pp_cxx_left_paren (pp);
1870 pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1871 pp_cxx_right_paren (pp);
1872 pp_indentation (pp) += 3;
1873 pp_needs_newline (pp) = true;
1874 pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1875 pp_newline_and_indent (pp, -3);
1878 /* iteration-statement:
1879 while ( expression ) statement
1880 do statement while ( expression ) ;
1881 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1882 for ( declaration expression(opt) ; expression(opt) ) statement */
1884 pp_cxx_ws_string (pp, "while");
1886 pp_cxx_left_paren (pp);
1887 pp_cxx_expression (pp, WHILE_COND (t));
1888 pp_cxx_right_paren (pp);
1889 pp_newline_and_indent (pp, 3);
1890 pp_cxx_statement (pp, WHILE_BODY (t));
1891 pp_indentation (pp) -= 3;
1892 pp_needs_newline (pp) = true;
1896 pp_cxx_ws_string (pp, "do");
1897 pp_newline_and_indent (pp, 3);
1898 pp_cxx_statement (pp, DO_BODY (t));
1899 pp_newline_and_indent (pp, -3);
1900 pp_cxx_ws_string (pp, "while");
1902 pp_cxx_left_paren (pp);
1903 pp_cxx_expression (pp, DO_COND (t));
1904 pp_cxx_right_paren (pp);
1905 pp_cxx_semicolon (pp);
1906 pp_needs_newline (pp) = true;
1910 pp_cxx_ws_string (pp, "for");
1912 pp_cxx_left_paren (pp);
1913 if (FOR_INIT_STMT (t))
1914 pp_cxx_statement (pp, FOR_INIT_STMT (t));
1916 pp_cxx_semicolon (pp);
1917 pp_needs_newline (pp) = false;
1918 pp_cxx_whitespace (pp);
1920 pp_cxx_expression (pp, FOR_COND (t));
1921 pp_cxx_semicolon (pp);
1922 pp_needs_newline (pp) = false;
1923 pp_cxx_whitespace (pp);
1925 pp_cxx_expression (pp, FOR_EXPR (t));
1926 pp_cxx_right_paren (pp);
1927 pp_newline_and_indent (pp, 3);
1928 pp_cxx_statement (pp, FOR_BODY (t));
1929 pp_indentation (pp) -= 3;
1930 pp_needs_newline (pp) = true;
1933 case RANGE_FOR_STMT:
1934 pp_cxx_ws_string (pp, "for");
1936 pp_cxx_left_paren (pp);
1937 pp_cxx_statement (pp, RANGE_FOR_DECL (t));
1939 pp_needs_newline (pp) = false;
1942 pp_cxx_statement (pp, RANGE_FOR_EXPR (t));
1943 pp_cxx_right_paren (pp);
1944 pp_newline_and_indent (pp, 3);
1945 pp_cxx_statement (pp, FOR_BODY (t));
1946 pp_indentation (pp) -= 3;
1947 pp_needs_newline (pp) = true;
1953 return expression(opt) ; */
1956 pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1957 pp_cxx_semicolon (pp);
1958 pp_needs_newline (pp) = true;
1961 /* expression-statement:
1962 expression(opt) ; */
1964 pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1965 pp_cxx_semicolon (pp);
1966 pp_needs_newline (pp) = true;
1970 pp_cxx_ws_string (pp, "try");
1971 pp_newline_and_indent (pp, 2);
1972 pp_cxx_statement (pp, CLEANUP_BODY (t));
1973 pp_newline_and_indent (pp, -2);
1974 pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
1975 pp_newline_and_indent (pp, 2);
1976 pp_cxx_statement (pp, CLEANUP_EXPR (t));
1977 pp_newline_and_indent (pp, -2);
1981 pp_cxx_declaration (pp, t);
1985 pp_c_statement (pp_c_base (pp), t);
1990 /* original-namespace-definition:
1991 namespace identifier { namespace-body }
1993 As an edge case, we also handle unnamed namespace definition here. */
1996 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
1998 pp_cxx_ws_string (pp, "namespace");
1999 if (DECL_CONTEXT (t))
2000 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2002 pp_cxx_unqualified_id (pp, t);
2003 pp_cxx_whitespace (pp);
2004 pp_cxx_left_brace (pp);
2005 /* We do not print the namespace-body. */
2006 pp_cxx_whitespace (pp);
2007 pp_cxx_right_brace (pp);
2013 namespace-alias-definition:
2014 namespace identifier = qualified-namespace-specifier ;
2016 qualified-namespace-specifier:
2017 ::(opt) nested-name-specifier(opt) namespace-name */
2020 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
2022 pp_cxx_ws_string (pp, "namespace");
2023 if (DECL_CONTEXT (t))
2024 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2025 pp_cxx_unqualified_id (pp, t);
2026 pp_cxx_whitespace (pp);
2028 pp_cxx_whitespace (pp);
2029 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
2030 pp_cxx_nested_name_specifier (pp,
2031 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
2032 pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
2033 pp_cxx_semicolon (pp);
2036 /* simple-declaration:
2037 decl-specifier-seq(opt) init-declarator-list(opt) */
2040 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
2042 pp_cxx_decl_specifier_seq (pp, t);
2043 pp_cxx_init_declarator (pp, t);
2044 pp_cxx_semicolon (pp);
2045 pp_needs_newline (pp) = true;
2049 template-parameter-list:
2051 template-parameter-list , template-parameter */
2054 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2056 const int n = TREE_VEC_LENGTH (t);
2058 for (i = 0; i < n; ++i)
2061 pp_cxx_separate_with (pp, ',');
2062 pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2066 /* template-parameter:
2068 parameter-declaration
2071 class ...(opt) identifier(opt)
2072 class identifier(opt) = type-id
2073 typename identifier(opt)
2074 typename ...(opt) identifier(opt) = type-id
2075 template < template-parameter-list > class ...(opt) identifier(opt)
2076 template < template-parameter-list > class identifier(opt) = template-name */
2079 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2081 tree parameter = TREE_VALUE (t);
2082 switch (TREE_CODE (parameter))
2085 pp_cxx_ws_string (pp, "class");
2086 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2087 pp_cxx_ws_string (pp, "...");
2088 if (DECL_NAME (parameter))
2089 pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2090 /* FIXME: Check if we should print also default argument. */
2094 pp_cxx_parameter_declaration (pp, parameter);
2101 pp_unsupported_tree (pp, t);
2106 /* Pretty-print a template parameter in the canonical form
2107 "template-parameter-<level>-<position in parameter list>". */
2110 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2112 const enum tree_code code = TREE_CODE (parm);
2114 /* Brings type template parameters to the canonical forms. */
2115 if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2116 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2117 parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2119 pp_cxx_begin_template_argument_list (pp);
2120 pp_cxx_ws_string (pp, M_("template-parameter-"));
2121 pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2123 pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2124 pp_cxx_end_template_argument_list (pp);
2128 template-declaration:
2129 export(opt) template < template-parameter-list > declaration */
2132 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2134 tree tmpl = most_general_template (t);
2138 pp_maybe_newline_and_indent (pp, 0);
2139 for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2141 pp_cxx_ws_string (pp, "template");
2142 pp_cxx_begin_template_argument_list (pp);
2143 pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2144 pp_cxx_end_template_argument_list (pp);
2145 pp_newline_and_indent (pp, 3);
2148 if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2149 pp_cxx_function_definition (pp, t);
2151 pp_cxx_simple_declaration (pp, t);
2155 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2157 pp_unsupported_tree (pp, t);
2161 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2163 pp_unsupported_tree (pp, t);
2170 template-declaration
2171 explicit-instantiation
2172 explicit-specialization
2173 linkage-specification
2174 namespace-definition
2179 namespace-alias-definition
2182 static_assert-declaration */
2184 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2186 if (TREE_CODE (t) == STATIC_ASSERT)
2188 pp_cxx_ws_string (pp, "static_assert");
2189 pp_cxx_left_paren (pp);
2190 pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2191 pp_cxx_separate_with (pp, ',');
2192 pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2193 pp_cxx_right_paren (pp);
2195 else if (!DECL_LANG_SPECIFIC (t))
2196 pp_cxx_simple_declaration (pp, t);
2197 else if (DECL_USE_TEMPLATE (t))
2198 switch (DECL_USE_TEMPLATE (t))
2201 pp_cxx_template_declaration (pp, t);
2205 pp_cxx_explicit_specialization (pp, t);
2209 pp_cxx_explicit_instantiation (pp, t);
2215 else switch (TREE_CODE (t))
2219 pp_cxx_simple_declaration (pp, t);
2223 if (DECL_SAVED_TREE (t))
2224 pp_cxx_function_definition (pp, t);
2226 pp_cxx_simple_declaration (pp, t);
2229 case NAMESPACE_DECL:
2230 if (DECL_NAMESPACE_ALIAS (t))
2231 pp_cxx_namespace_alias_definition (pp, t);
2233 pp_cxx_original_namespace_definition (pp, t);
2237 pp_unsupported_tree (pp, t);
2243 pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2245 t = TREE_OPERAND (t, 0);
2246 pp_cxx_ws_string (pp, "typeid");
2247 pp_cxx_left_paren (pp);
2249 pp_cxx_type_id (pp, t);
2251 pp_cxx_expression (pp, t);
2252 pp_cxx_right_paren (pp);
2256 pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2258 pp_cxx_ws_string (pp, "va_arg");
2259 pp_cxx_left_paren (pp);
2260 pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2261 pp_cxx_separate_with (pp, ',');
2262 pp_cxx_type_id (pp, TREE_TYPE (t));
2263 pp_cxx_right_paren (pp);
2267 pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2269 switch (TREE_CODE (t))
2272 if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2273 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2275 pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2276 pp_cxx_separate_with (pp, ',');
2281 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2283 if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2285 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2288 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2290 pp_left_bracket (pp);
2291 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2292 pp_right_bracket (pp);
2300 pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2302 pp_cxx_ws_string (pp, "offsetof");
2303 pp_cxx_left_paren (pp);
2304 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2305 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2306 pp_cxx_right_paren (pp);
2310 pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2312 cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2316 case CPTK_HAS_NOTHROW_ASSIGN:
2317 pp_cxx_ws_string (pp, "__has_nothrow_assign");
2319 case CPTK_HAS_TRIVIAL_ASSIGN:
2320 pp_cxx_ws_string (pp, "__has_trivial_assign");
2322 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2323 pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2325 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2326 pp_cxx_ws_string (pp, "__has_trivial_constructor");
2328 case CPTK_HAS_NOTHROW_COPY:
2329 pp_cxx_ws_string (pp, "__has_nothrow_copy");
2331 case CPTK_HAS_TRIVIAL_COPY:
2332 pp_cxx_ws_string (pp, "__has_trivial_copy");
2334 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2335 pp_cxx_ws_string (pp, "__has_trivial_destructor");
2337 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2338 pp_cxx_ws_string (pp, "__has_virtual_destructor");
2340 case CPTK_IS_ABSTRACT:
2341 pp_cxx_ws_string (pp, "__is_abstract");
2343 case CPTK_IS_BASE_OF:
2344 pp_cxx_ws_string (pp, "__is_base_of");
2347 pp_cxx_ws_string (pp, "__is_class");
2349 case CPTK_IS_CONVERTIBLE_TO:
2350 pp_cxx_ws_string (pp, "__is_convertible_to");
2353 pp_cxx_ws_string (pp, "__is_empty");
2356 pp_cxx_ws_string (pp, "__is_enum");
2359 pp_cxx_ws_string (pp, "__is_pod");
2361 case CPTK_IS_POLYMORPHIC:
2362 pp_cxx_ws_string (pp, "__is_polymorphic");
2364 case CPTK_IS_STD_LAYOUT:
2365 pp_cxx_ws_string (pp, "__is_std_layout");
2367 case CPTK_IS_TRIVIAL:
2368 pp_cxx_ws_string (pp, "__is_trivial");
2371 pp_cxx_ws_string (pp, "__is_union");
2373 case CPTK_IS_LITERAL_TYPE:
2374 pp_cxx_ws_string (pp, "__is_literal_type");
2381 pp_cxx_left_paren (pp);
2382 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2384 if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2386 pp_cxx_separate_with (pp, ',');
2387 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2390 pp_cxx_right_paren (pp);
2393 typedef c_pretty_print_fn pp_fun;
2395 /* Initialization of a C++ pretty-printer object. */
2398 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2400 pp_c_pretty_printer_init (pp_c_base (pp));
2401 pp_set_line_maximum_length (pp, 0);
2403 pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2404 pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2405 pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2406 pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2407 pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2408 pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2409 pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2410 pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2411 pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2412 pp->c_base.direct_abstract_declarator =
2413 (pp_fun) pp_cxx_direct_abstract_declarator;
2414 pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2416 /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */
2418 pp->c_base.constant = (pp_fun) pp_cxx_constant;
2419 pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2420 pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2421 pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2422 pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2423 pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2424 pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2425 pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2426 pp->c_base.expression = (pp_fun) pp_cxx_expression;
2427 pp->enclosing_scope = global_namespace;