1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2 Copyright (C) 2003, 2004, 2005, 2007, 2008,
3 2009 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"
32 /* Translate if being used for diagnostics, but not for dump files or
34 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
36 static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
37 static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
38 static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
39 static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
40 static void pp_cxx_expression (cxx_pretty_printer *, tree);
41 static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
42 static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
43 static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
44 static void pp_cxx_type_id (cxx_pretty_printer *, tree);
45 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
46 static void pp_cxx_declarator (cxx_pretty_printer *, tree);
47 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
48 static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
49 static void pp_cxx_statement (cxx_pretty_printer *, tree);
50 static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
51 static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
52 static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
56 pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
58 const char *p = pp_last_position_in_text (pp);
60 if (p != NULL && *p == c)
61 pp_cxx_whitespace (pp);
63 pp_base (pp)->padding = pp_none;
66 #define pp_cxx_storage_class_specifier(PP, T) \
67 pp_c_storage_class_specifier (pp_c_base (PP), T)
68 #define pp_cxx_expression_list(PP, T) \
69 pp_c_expression_list (pp_c_base (PP), T)
70 #define pp_cxx_space_for_pointer_operator(PP, T) \
71 pp_c_space_for_pointer_operator (pp_c_base (PP), T)
72 #define pp_cxx_init_declarator(PP, T) \
73 pp_c_init_declarator (pp_c_base (PP), T)
74 #define pp_cxx_call_argument_list(PP, T) \
75 pp_c_call_argument_list (pp_c_base (PP), T)
78 pp_cxx_colon_colon (cxx_pretty_printer *pp)
81 pp_base (pp)->padding = pp_none;
85 pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
87 pp_cxx_nonconsecutive_character (pp, '<');
91 pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
93 pp_cxx_nonconsecutive_character (pp, '>');
97 pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
99 pp_separate_with (pp, c);
100 pp_base (pp)->padding = pp_none;
106 is_destructor_name (tree name)
108 return name == complete_dtor_identifier
109 || name == base_dtor_identifier
110 || name == deleting_dtor_identifier;
113 /* conversion-function-id:
114 operator conversion-type-id
117 type-specifier-seq conversion-declarator(opt)
119 conversion-declarator:
120 ptr-operator conversion-declarator(opt) */
123 pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
125 pp_cxx_ws_string (pp, "operator");
126 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
130 pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
132 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
133 pp_cxx_begin_template_argument_list (pp);
134 pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
135 pp_cxx_end_template_argument_list (pp);
138 /* Prints the unqualified part of the id-expression T.
143 conversion-function-id
148 pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
150 enum tree_code code = TREE_CODE (t);
154 pp_cxx_ws_string (pp, M_("<return-value>"));
171 case IDENTIFIER_NODE:
173 pp_cxx_ws_string (pp, M_("<unnamed>"));
174 else if (IDENTIFIER_TYPENAME_P (t))
175 pp_cxx_conversion_function_id (pp, t);
178 if (is_destructor_name (t))
181 /* FIXME: Why is this necessary? */
183 t = constructor_name (TREE_TYPE (t));
185 pp_cxx_tree_identifier (pp, t);
189 case TEMPLATE_ID_EXPR:
190 pp_cxx_template_id (pp, t);
194 pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
201 case UNBOUND_CLASS_TEMPLATE:
202 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
203 if (CLASS_TYPE_P (t) && CLASSTYPE_USE_TEMPLATE (t))
205 pp_cxx_begin_template_argument_list (pp);
206 pp_cxx_template_argument_list (pp, INNERMOST_TEMPLATE_ARGS
207 (CLASSTYPE_TI_ARGS (t)));
208 pp_cxx_end_template_argument_list (pp);
213 pp_cxx_complement (pp);
214 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
217 case TEMPLATE_TYPE_PARM:
218 case TEMPLATE_TEMPLATE_PARM:
219 if (TYPE_IDENTIFIER (t))
220 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
222 pp_cxx_canonical_template_parameter (pp, t);
225 case TEMPLATE_PARM_INDEX:
226 pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
229 case BOUND_TEMPLATE_TEMPLATE_PARM:
230 pp_cxx_cv_qualifier_seq (pp, t);
231 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
232 pp_cxx_begin_template_argument_list (pp);
233 pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
234 pp_cxx_end_template_argument_list (pp);
238 pp_unsupported_tree (pp, t);
243 /* Pretty-print out the token sequence ":: template" in template codes
244 where it is needed to "inline declare" the (following) member as
245 a template. This situation arises when SCOPE of T is dependent
246 on template parameters. */
249 pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
251 if (TREE_CODE (t) == TEMPLATE_ID_EXPR
252 && TYPE_P (scope) && dependent_type_p (scope))
253 pp_cxx_ws_string (pp, "template");
256 /* nested-name-specifier:
257 class-or-namespace-name :: nested-name-specifier(opt)
258 class-or-namespace-name :: template nested-name-specifier */
261 pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
263 if (t != NULL && t != pp->enclosing_scope)
265 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
266 pp_cxx_nested_name_specifier (pp, scope);
267 pp_cxx_template_keyword_if_needed (pp, scope, t);
268 pp_cxx_unqualified_id (pp, t);
269 pp_cxx_colon_colon (pp);
274 nested-name-specifier template(opt) unqualified-id */
277 pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
279 switch (TREE_CODE (t))
281 /* A pointer-to-member is always qualified. */
283 pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
284 pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
287 /* In Standard C++, functions cannot possibly be used as
288 nested-name-specifiers. However, there are situations where
289 is "makes sense" to output the surrounding function name for the
290 purpose of emphasizing on the scope kind. Just printing the
291 function name might not be sufficient as it may be overloaded; so,
292 we decorate the function with its signature too.
293 FIXME: This is probably the wrong pretty-printing for conversion
294 functions and some function templates. */
298 if (DECL_FUNCTION_MEMBER_P (t))
299 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
300 pp_cxx_unqualified_id
301 (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
302 pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
307 pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
308 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
313 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
314 if (scope != pp->enclosing_scope)
316 pp_cxx_nested_name_specifier (pp, scope);
317 pp_cxx_template_keyword_if_needed (pp, scope, t);
319 pp_cxx_unqualified_id (pp, t);
327 pp_cxx_constant (cxx_pretty_printer *pp, tree t)
329 switch (TREE_CODE (t))
333 const bool in_parens = PAREN_STRING_LITERAL_P (t);
335 pp_cxx_left_paren (pp);
336 pp_c_constant (pp_c_base (pp), t);
338 pp_cxx_right_paren (pp);
343 pp_c_constant (pp_c_base (pp), t);
353 pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
355 if (TREE_CODE (t) == OVERLOAD)
357 if (DECL_P (t) && DECL_CONTEXT (t))
358 pp_cxx_qualified_id (pp, t);
360 pp_cxx_unqualified_id (pp, t);
363 /* primary-expression:
367 :: operator-function-id
373 __builtin_va_arg ( assignment-expression , type-id )
374 __builtin_offsetof ( type-id, offsetof-expression )
376 __has_nothrow_assign ( type-id )
377 __has_nothrow_constructor ( type-id )
378 __has_nothrow_copy ( type-id )
379 __has_trivial_assign ( type-id )
380 __has_trivial_constructor ( type-id )
381 __has_trivial_copy ( type-id )
382 __has_trivial_destructor ( type-id )
383 __has_virtual_destructor ( type-id )
384 __is_abstract ( type-id )
385 __is_base_of ( type-id , type-id )
386 __is_class ( type-id )
387 __is_convertible_to ( type-id , type-id )
388 __is_empty ( type-id )
389 __is_enum ( type-id )
391 __is_polymorphic ( type-id )
392 __is_union ( type-id ) */
395 pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
397 switch (TREE_CODE (t))
403 pp_cxx_constant (pp, t);
407 t = BASELINK_FUNCTIONS (t);
415 pp_cxx_id_expression (pp, t);
419 case TEMPLATE_TYPE_PARM:
420 case TEMPLATE_TEMPLATE_PARM:
421 case TEMPLATE_PARM_INDEX:
422 pp_cxx_unqualified_id (pp, t);
426 pp_cxx_left_paren (pp);
427 pp_cxx_statement (pp, STMT_EXPR_STMT (t));
428 pp_cxx_right_paren (pp);
432 pp_cxx_trait_expression (pp, t);
436 pp_cxx_va_arg_expression (pp, t);
440 pp_cxx_offsetof_expression (pp, t);
444 pp_c_primary_expression (pp_c_base (pp), t);
449 /* postfix-expression:
451 postfix-expression [ expression ]
452 postfix-expression ( expression-list(opt) )
453 simple-type-specifier ( expression-list(opt) )
454 typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
455 typename ::(opt) nested-name-specifier template(opt)
456 template-id ( expression-list(opt) )
457 postfix-expression . template(opt) ::(opt) id-expression
458 postfix-expression -> template(opt) ::(opt) id-expression
459 postfix-expression . pseudo-destructor-name
460 postfix-expression -> pseudo-destructor-name
461 postfix-expression ++
462 postfix-expression --
463 dynamic_cast < type-id > ( expression )
464 static_cast < type-id > ( expression )
465 reinterpret_cast < type-id > ( expression )
466 const_cast < type-id > ( expression )
467 typeid ( expression )
468 typeid ( type-id ) */
471 pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
473 enum tree_code code = TREE_CODE (t);
480 tree fun = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t)
482 tree saved_scope = pp->enclosing_scope;
483 bool skipfirst = false;
486 if (TREE_CODE (fun) == ADDR_EXPR)
487 fun = TREE_OPERAND (fun, 0);
489 /* In templates, where there is no way to tell whether a given
490 call uses an actual member function. So the parser builds
491 FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
492 instantiation time. */
493 if (TREE_CODE (fun) != FUNCTION_DECL)
495 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
497 tree object = (code == AGGR_INIT_EXPR
498 ? (AGGR_INIT_VIA_CTOR_P (t)
499 ? AGGR_INIT_EXPR_SLOT (t)
500 : AGGR_INIT_EXPR_ARG (t, 0))
501 : CALL_EXPR_ARG (t, 0));
503 while (TREE_CODE (object) == NOP_EXPR)
504 object = TREE_OPERAND (object, 0);
506 if (TREE_CODE (object) == ADDR_EXPR)
507 object = TREE_OPERAND (object, 0);
509 if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
511 pp_cxx_postfix_expression (pp, object);
516 pp_cxx_postfix_expression (pp, object);
520 pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
523 pp_cxx_postfix_expression (pp, fun);
524 pp->enclosing_scope = saved_scope;
525 pp_cxx_left_paren (pp);
526 if (code == AGGR_INIT_EXPR)
528 aggr_init_expr_arg_iterator iter;
529 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
535 pp_cxx_expression (pp, arg);
536 if (more_aggr_init_expr_args_p (&iter))
537 pp_cxx_separate_with (pp, ',');
543 call_expr_arg_iterator iter;
544 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
550 pp_cxx_expression (pp, arg);
551 if (more_call_expr_args_p (&iter))
552 pp_cxx_separate_with (pp, ',');
556 pp_cxx_right_paren (pp);
558 if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
560 pp_cxx_separate_with (pp, ',');
561 pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t));
574 pp_cxx_primary_expression (pp, t);
577 case DYNAMIC_CAST_EXPR:
578 case STATIC_CAST_EXPR:
579 case REINTERPRET_CAST_EXPR:
580 case CONST_CAST_EXPR:
581 if (code == DYNAMIC_CAST_EXPR)
582 pp_cxx_ws_string (pp, "dynamic_cast");
583 else if (code == STATIC_CAST_EXPR)
584 pp_cxx_ws_string (pp, "static_cast");
585 else if (code == REINTERPRET_CAST_EXPR)
586 pp_cxx_ws_string (pp, "reinterpret_cast");
588 pp_cxx_ws_string (pp, "const_cast");
589 pp_cxx_begin_template_argument_list (pp);
590 pp_cxx_type_id (pp, TREE_TYPE (t));
591 pp_cxx_end_template_argument_list (pp);
593 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
597 case EMPTY_CLASS_EXPR:
598 pp_cxx_type_id (pp, TREE_TYPE (t));
604 pp_cxx_typeid_expression (pp, t);
607 case PSEUDO_DTOR_EXPR:
608 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
610 pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
611 pp_cxx_colon_colon (pp);
613 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
617 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
622 pp_c_postfix_expression (pp_c_base (pp), t);
628 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
629 ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
635 type-specifier-seq new-declarator(opt)
638 ptr-operator new-declarator(opt)
639 direct-new-declarator
641 direct-new-declarator
643 direct-new-declarator [ constant-expression ]
646 ( expression-list(opt) ) */
649 pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
651 enum tree_code code = TREE_CODE (t);
652 tree type = TREE_OPERAND (t, 1);
653 tree init = TREE_OPERAND (t, 2);
658 if (NEW_EXPR_USE_GLOBAL (t))
659 pp_cxx_colon_colon (pp);
660 pp_cxx_ws_string (pp, "new");
661 if (TREE_OPERAND (t, 0))
663 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
666 if (TREE_CODE (type) == ARRAY_REF)
667 type = build_cplus_array_type
668 (TREE_OPERAND (type, 0),
669 build_index_type (fold_build2_loc (input_location,
670 MINUS_EXPR, integer_type_node,
671 TREE_OPERAND (type, 1),
673 pp_cxx_type_id (pp, type);
677 if (TREE_CODE (init) == TREE_LIST)
678 pp_c_expression_list (pp_c_base (pp), init);
679 else if (init == void_zero_node)
680 ; /* OK, empty initializer list. */
682 pp_cxx_expression (pp, init);
688 pp_unsupported_tree (pp, t);
692 /* delete-expression:
693 ::(opt) delete cast-expression
694 ::(opt) delete [ ] cast-expression */
697 pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
699 enum tree_code code = TREE_CODE (t);
703 case VEC_DELETE_EXPR:
704 if (DELETE_EXPR_USE_GLOBAL (t))
705 pp_cxx_colon_colon (pp);
706 pp_cxx_ws_string (pp, "delete");
708 if (code == VEC_DELETE_EXPR
709 || DELETE_EXPR_USE_VEC (t))
711 pp_left_bracket (pp);
712 pp_right_bracket (pp);
715 pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
719 pp_unsupported_tree (pp, t);
727 unary-operator cast-expression
728 sizeof unary-expression
730 sizeof ... ( identifier )
734 unary-operator: one of
738 __alignof__ unary-expression
739 __alignof__ ( type-id ) */
742 pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
744 enum tree_code code = TREE_CODE (t);
749 pp_cxx_new_expression (pp, t);
753 case VEC_DELETE_EXPR:
754 pp_cxx_delete_expression (pp, t);
758 if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
760 pp_cxx_ws_string (pp, "sizeof");
761 pp_cxx_ws_string (pp, "...");
762 pp_cxx_whitespace (pp);
763 pp_cxx_left_paren (pp);
764 if (TYPE_P (TREE_OPERAND (t, 0)))
765 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
767 pp_unary_expression (pp, TREE_OPERAND (t, 0));
768 pp_cxx_right_paren (pp);
774 pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
775 pp_cxx_whitespace (pp);
776 if (TYPE_P (TREE_OPERAND (t, 0)))
778 pp_cxx_left_paren (pp);
779 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
780 pp_cxx_right_paren (pp);
783 pp_unary_expression (pp, TREE_OPERAND (t, 0));
786 case UNARY_PLUS_EXPR:
788 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
792 pp_c_unary_expression (pp_c_base (pp), t);
799 ( type-id ) cast-expression */
802 pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
804 switch (TREE_CODE (t))
807 pp_cxx_type_id (pp, TREE_TYPE (t));
808 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
812 pp_c_cast_expression (pp_c_base (pp), t);
819 pm-expression .* cast-expression
820 pm-expression ->* cast-expression */
823 pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
825 switch (TREE_CODE (t))
827 /* Handle unfortunate OFFSET_REF overloading here. */
829 if (TYPE_P (TREE_OPERAND (t, 0)))
831 pp_cxx_qualified_id (pp, t);
834 /* Else fall through. */
837 pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
838 if (TREE_CODE (t) == MEMBER_REF)
843 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
848 pp_cxx_cast_expression (pp, t);
853 /* multiplicative-expression:
855 multiplicative-expression * pm-expression
856 multiplicative-expression / pm-expression
857 multiplicative-expression % pm-expression */
860 pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
862 enum tree_code code = TREE_CODE (e);
868 pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
870 if (code == MULT_EXPR)
872 else if (code == TRUNC_DIV_EXPR)
877 pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
881 pp_cxx_pm_expression (pp, e);
886 /* conditional-expression:
887 logical-or-expression
888 logical-or-expression ? expression : assignment-expression */
891 pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
893 if (TREE_CODE (e) == COND_EXPR)
895 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
899 pp_cxx_expression (pp, TREE_OPERAND (e, 1));
901 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
904 pp_c_logical_or_expression (pp_c_base (pp), e);
907 /* Pretty-print a compound assignment operator token as indicated by T. */
910 pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
914 switch (TREE_CODE (t))
937 op = tree_code_name[TREE_CODE (t)];
941 pp_cxx_ws_string (pp, op);
945 /* assignment-expression:
946 conditional-expression
947 logical-or-expression assignment-operator assignment-expression
951 throw assignment-expression(opt)
953 assignment-operator: one of
954 = *= /= %= += -= >>= <<= &= ^= |= */
957 pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
959 switch (TREE_CODE (e))
963 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
967 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
971 pp_cxx_ws_string (pp, "throw");
972 if (TREE_OPERAND (e, 0))
973 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
977 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
978 pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
979 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
983 pp_cxx_conditional_expression (pp, e);
989 pp_cxx_expression (cxx_pretty_printer *pp, tree t)
991 switch (TREE_CODE (t))
997 pp_cxx_constant (pp, t);
1001 pp_cxx_unqualified_id (pp, t);
1009 pp_cxx_qualified_id (pp, t);
1013 t = OVL_CURRENT (t);
1021 case TEMPLATE_TYPE_PARM:
1022 case TEMPLATE_PARM_INDEX:
1023 case TEMPLATE_TEMPLATE_PARM:
1025 pp_cxx_primary_expression (pp, t);
1029 case DYNAMIC_CAST_EXPR:
1030 case STATIC_CAST_EXPR:
1031 case REINTERPRET_CAST_EXPR:
1032 case CONST_CAST_EXPR:
1036 case EMPTY_CLASS_EXPR:
1038 case PSEUDO_DTOR_EXPR:
1039 case AGGR_INIT_EXPR:
1041 pp_cxx_postfix_expression (pp, t);
1046 pp_cxx_new_expression (pp, t);
1050 case VEC_DELETE_EXPR:
1051 pp_cxx_delete_expression (pp, t);
1056 pp_cxx_unary_expression (pp, t);
1060 pp_cxx_cast_expression (pp, t);
1066 pp_cxx_pm_expression (pp, t);
1070 case TRUNC_DIV_EXPR:
1071 case TRUNC_MOD_EXPR:
1072 pp_cxx_multiplicative_expression (pp, t);
1076 pp_cxx_conditional_expression (pp, t);
1083 pp_cxx_assignment_expression (pp, t);
1086 case NON_DEPENDENT_EXPR:
1087 case MUST_NOT_THROW_EXPR:
1088 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
1091 case EXPR_PACK_EXPANSION:
1092 pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t));
1093 pp_cxx_ws_string (pp, "...");
1096 case TEMPLATE_ID_EXPR:
1097 pp_cxx_template_id (pp, t);
1100 case NONTYPE_ARGUMENT_PACK:
1102 tree args = ARGUMENT_PACK_ARGS (t);
1103 int i, len = TREE_VEC_LENGTH (args);
1104 for (i = 0; i < len; ++i)
1107 pp_cxx_separate_with (pp, ',');
1108 pp_cxx_expression (pp, TREE_VEC_ELT (args, i));
1114 pp_c_expression (pp_c_base (pp), t);
1122 /* function-specifier:
1128 pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
1130 switch (TREE_CODE (t))
1133 if (DECL_VIRTUAL_P (t))
1134 pp_cxx_ws_string (pp, "virtual");
1135 else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1136 pp_cxx_ws_string (pp, "explicit");
1138 pp_c_function_specifier (pp_c_base (pp), t);
1145 /* decl-specifier-seq:
1146 decl-specifier-seq(opt) decl-specifier
1149 storage-class-specifier
1156 pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
1158 switch (TREE_CODE (t))
1164 pp_cxx_storage_class_specifier (pp, t);
1165 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1169 pp_cxx_ws_string (pp, "typedef");
1170 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1174 /* Constructors don't have return types. And conversion functions
1175 do not have a type-specifier in their return types. */
1176 if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1177 pp_cxx_function_specifier (pp, t);
1178 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1179 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1182 pp_c_declaration_specifiers (pp_c_base (pp), t);
1187 /* simple-type-specifier:
1188 ::(opt) nested-name-specifier(opt) type-name
1189 ::(opt) nested-name-specifier(opt) template(opt) template-id
1203 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1205 switch (TREE_CODE (t))
1210 pp_cxx_qualified_id (pp, t);
1213 case TEMPLATE_TYPE_PARM:
1214 case TEMPLATE_TEMPLATE_PARM:
1215 case TEMPLATE_PARM_INDEX:
1216 pp_cxx_unqualified_id (pp, t);
1220 pp_cxx_ws_string (pp, "typename");
1221 pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1222 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1226 pp_c_type_specifier (pp_c_base (pp), t);
1231 /* type-specifier-seq:
1232 type-specifier type-specifier-seq(opt)
1235 simple-type-specifier
1238 elaborated-type-specifier
1242 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1244 switch (TREE_CODE (t))
1247 case TEMPLATE_TYPE_PARM:
1248 case TEMPLATE_TEMPLATE_PARM:
1250 case BOUND_TEMPLATE_TEMPLATE_PARM:
1251 pp_cxx_cv_qualifier_seq (pp, t);
1252 pp_cxx_simple_type_specifier (pp, t);
1256 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1257 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1258 pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1262 pp_cxx_ws_string (pp, "decltype");
1263 pp_cxx_left_paren (pp);
1264 pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1265 pp_cxx_right_paren (pp);
1269 if (TYPE_PTRMEMFUNC_P (t))
1271 tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1272 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1273 pp_cxx_whitespace (pp);
1274 pp_cxx_ptr_operator (pp, t);
1277 /* else fall through */
1280 if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1281 pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1286 * cv-qualifier-seq(opt)
1288 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1291 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1293 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1295 switch (TREE_CODE (t))
1297 case REFERENCE_TYPE:
1299 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
1300 || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
1301 pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1302 if (TREE_CODE (t) == POINTER_TYPE)
1305 pp_cxx_cv_qualifier_seq (pp, t);
1312 if (TYPE_PTRMEMFUNC_P (t))
1314 pp_cxx_left_paren (pp);
1315 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1320 if (TYPE_PTR_TO_MEMBER_P (t))
1322 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1323 pp_cxx_left_paren (pp);
1324 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1326 pp_cxx_cv_qualifier_seq (pp, t);
1329 /* else fall through. */
1332 pp_unsupported_tree (pp, t);
1338 pp_cxx_implicit_parameter_type (tree mf)
1340 return TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (mf))));
1344 parameter-declaration:
1345 decl-specifier-seq declarator
1346 decl-specifier-seq declarator = assignment-expression
1347 decl-specifier-seq abstract-declarator(opt)
1348 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1351 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1353 pp_cxx_decl_specifier_seq (pp, t);
1355 pp_cxx_abstract_declarator (pp, t);
1357 pp_cxx_declarator (pp, t);
1360 /* parameter-declaration-clause:
1361 parameter-declaration-list(opt) ...(opt)
1362 parameter-declaration-list , ...
1364 parameter-declaration-list:
1365 parameter-declaration
1366 parameter-declaration-list , parameter-declaration */
1369 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1371 tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1373 TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1374 const bool abstract = args == NULL
1375 || pp_c_base (pp)->flags & pp_c_flag_abstract;
1378 /* Skip artificial parameter for nonstatic member functions. */
1379 if (TREE_CODE (t) == METHOD_TYPE)
1380 types = TREE_CHAIN (types);
1382 pp_cxx_left_paren (pp);
1383 for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1386 pp_cxx_separate_with (pp, ',');
1388 pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1389 if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1391 pp_cxx_whitespace (pp);
1393 pp_cxx_whitespace (pp);
1394 pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1397 pp_cxx_right_paren (pp);
1400 /* exception-specification:
1401 throw ( type-id-list(opt) )
1405 type-id-list , type-id */
1408 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1410 tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1411 bool need_comma = false;
1413 if (!TYPE_NOTHROW_P (t) && ex_spec == NULL)
1415 pp_cxx_ws_string (pp, "throw");
1416 pp_cxx_left_paren (pp);
1417 for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1419 tree type = TREE_VALUE (ex_spec);
1420 tree argpack = NULL_TREE;
1423 if (ARGUMENT_PACK_P (type))
1425 argpack = ARGUMENT_PACK_ARGS (type);
1426 len = TREE_VEC_LENGTH (argpack);
1429 for (i = 0; i < len; ++i)
1432 type = TREE_VEC_ELT (argpack, i);
1435 pp_cxx_separate_with (pp, ',');
1439 pp_cxx_type_id (pp, type);
1442 pp_cxx_right_paren (pp);
1445 /* direct-declarator:
1447 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1448 exception-specification(opt)
1449 direct-declaration [ constant-expression(opt) ]
1453 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1455 switch (TREE_CODE (t))
1463 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1465 if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1466 || template_parameter_pack_p (t))
1467 /* A function parameter pack or non-type template
1469 pp_cxx_ws_string (pp, "...");
1471 pp_cxx_id_expression (pp, DECL_NAME (t));
1473 pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1477 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1478 pp_cxx_id_expression (pp, t);
1479 pp_cxx_parameter_declaration_clause (pp, t);
1481 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1483 pp_base (pp)->padding = pp_before;
1484 pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1487 pp_cxx_exception_specification (pp, TREE_TYPE (t));
1492 case TEMPLATE_TYPE_PARM:
1493 case TEMPLATE_PARM_INDEX:
1494 case TEMPLATE_TEMPLATE_PARM:
1498 pp_c_direct_declarator (pp_c_base (pp), t);
1505 ptr-operator declarator */
1508 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1510 pp_cxx_direct_declarator (pp, t);
1513 /* ctor-initializer:
1514 : mem-initializer-list
1516 mem-initializer-list:
1518 mem-initializer , mem-initializer-list
1521 mem-initializer-id ( expression-list(opt) )
1524 ::(opt) nested-name-specifier(opt) class-name
1528 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1530 t = TREE_OPERAND (t, 0);
1531 pp_cxx_whitespace (pp);
1533 pp_cxx_whitespace (pp);
1534 for (; t; t = TREE_CHAIN (t))
1536 tree purpose = TREE_PURPOSE (t);
1537 bool is_pack = PACK_EXPANSION_P (purpose);
1540 pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1542 pp_cxx_primary_expression (pp, purpose);
1543 pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1545 pp_cxx_ws_string (pp, "...");
1547 pp_cxx_separate_with (pp, ',');
1551 /* function-definition:
1552 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1553 decl-specifier-seq(opt) declarator function-try-block */
1556 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1558 tree saved_scope = pp->enclosing_scope;
1559 pp_cxx_decl_specifier_seq (pp, t);
1560 pp_cxx_declarator (pp, t);
1561 pp_needs_newline (pp) = true;
1562 pp->enclosing_scope = DECL_CONTEXT (t);
1563 if (DECL_SAVED_TREE (t))
1564 pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1567 pp_cxx_semicolon (pp);
1568 pp_needs_newline (pp) = true;
1571 pp->enclosing_scope = saved_scope;
1574 /* abstract-declarator:
1575 ptr-operator abstract-declarator(opt)
1576 direct-abstract-declarator */
1579 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1581 if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t))
1582 pp_cxx_right_paren (pp);
1583 else if (POINTER_TYPE_P (t))
1585 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1586 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1587 pp_cxx_right_paren (pp);
1590 pp_cxx_direct_abstract_declarator (pp, t);
1593 /* direct-abstract-declarator:
1594 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1595 cv-qualifier-seq(opt) exception-specification(opt)
1596 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1597 ( abstract-declarator ) */
1600 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1602 switch (TREE_CODE (t))
1604 case REFERENCE_TYPE:
1605 pp_cxx_abstract_declarator (pp, t);
1609 if (TYPE_PTRMEMFUNC_P (t))
1610 pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1615 pp_cxx_parameter_declaration_clause (pp, t);
1616 pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1617 if (TREE_CODE (t) == METHOD_TYPE)
1619 pp_base (pp)->padding = pp_before;
1620 pp_cxx_cv_qualifier_seq
1621 (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
1623 pp_cxx_exception_specification (pp, t);
1627 case TEMPLATE_TYPE_PARM:
1628 case TEMPLATE_TEMPLATE_PARM:
1629 case BOUND_TEMPLATE_TEMPLATE_PARM:
1630 case UNBOUND_CLASS_TEMPLATE:
1634 pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1640 type-specifier-seq abstract-declarator(opt) */
1643 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1645 pp_flags saved_flags = pp_c_base (pp)->flags;
1646 pp_c_base (pp)->flags |= pp_c_flag_abstract;
1648 switch (TREE_CODE (t))
1655 case BOUND_TEMPLATE_TEMPLATE_PARM:
1656 case UNBOUND_CLASS_TEMPLATE:
1657 case TEMPLATE_TEMPLATE_PARM:
1658 case TEMPLATE_TYPE_PARM:
1659 case TEMPLATE_PARM_INDEX:
1663 case TEMPLATE_ID_EXPR:
1664 pp_cxx_type_specifier_seq (pp, t);
1667 case TYPE_PACK_EXPANSION:
1668 pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1669 pp_cxx_ws_string (pp, "...");
1673 pp_c_type_id (pp_c_base (pp), t);
1677 pp_c_base (pp)->flags = saved_flags;
1680 /* template-argument-list:
1681 template-argument ...(opt)
1682 template-argument-list, template-argument ...(opt)
1685 assignment-expression
1690 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1693 bool need_comma = false;
1697 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1699 tree arg = TREE_VEC_ELT (t, i);
1700 tree argpack = NULL_TREE;
1703 if (ARGUMENT_PACK_P (arg))
1705 argpack = ARGUMENT_PACK_ARGS (arg);
1706 len = TREE_VEC_LENGTH (argpack);
1709 for (idx = 0; idx < len; idx++)
1712 arg = TREE_VEC_ELT (argpack, idx);
1715 pp_cxx_separate_with (pp, ',');
1719 if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1720 && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1721 pp_cxx_type_id (pp, arg);
1723 pp_cxx_expression (pp, arg);
1730 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1732 t = DECL_EXPR_DECL (t);
1733 pp_cxx_type_specifier_seq (pp, t);
1735 pp_cxx_abstract_declarator (pp, t);
1737 pp_cxx_declarator (pp, t);
1743 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1745 switch (TREE_CODE (t))
1747 case CTOR_INITIALIZER:
1748 pp_cxx_ctor_initializer (pp, t);
1752 pp_cxx_ws_string (pp, "using");
1753 pp_cxx_ws_string (pp, "namespace");
1754 if (DECL_CONTEXT (t))
1755 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1756 pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1760 pp_cxx_ws_string (pp, "using");
1761 pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1762 pp_cxx_unqualified_id (pp, DECL_NAME (t));
1769 try compound-statement handler-seq */
1771 pp_maybe_newline_and_indent (pp, 0);
1772 pp_cxx_ws_string (pp, "try");
1773 pp_newline_and_indent (pp, 3);
1774 pp_cxx_statement (pp, TRY_STMTS (t));
1775 pp_newline_and_indent (pp, -3);
1779 pp_cxx_statement (pp, TRY_HANDLERS (t));
1784 handler handler-seq(opt)
1787 catch ( exception-declaration ) compound-statement
1789 exception-declaration:
1790 type-specifier-seq declarator
1791 type-specifier-seq abstract-declarator
1794 pp_cxx_ws_string (pp, "catch");
1795 pp_cxx_left_paren (pp);
1796 pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1797 pp_cxx_right_paren (pp);
1798 pp_indentation (pp) += 3;
1799 pp_needs_newline (pp) = true;
1800 pp_cxx_statement (pp, HANDLER_BODY (t));
1801 pp_indentation (pp) -= 3;
1802 pp_needs_newline (pp) = true;
1805 /* selection-statement:
1806 if ( expression ) statement
1807 if ( expression ) statement else statement */
1809 pp_cxx_ws_string (pp, "if");
1810 pp_cxx_whitespace (pp);
1811 pp_cxx_left_paren (pp);
1812 pp_cxx_expression (pp, IF_COND (t));
1813 pp_cxx_right_paren (pp);
1814 pp_newline_and_indent (pp, 2);
1815 pp_cxx_statement (pp, THEN_CLAUSE (t));
1816 pp_newline_and_indent (pp, -2);
1817 if (ELSE_CLAUSE (t))
1819 tree else_clause = ELSE_CLAUSE (t);
1820 pp_cxx_ws_string (pp, "else");
1821 if (TREE_CODE (else_clause) == IF_STMT)
1822 pp_cxx_whitespace (pp);
1824 pp_newline_and_indent (pp, 2);
1825 pp_cxx_statement (pp, else_clause);
1826 if (TREE_CODE (else_clause) != IF_STMT)
1827 pp_newline_and_indent (pp, -2);
1832 pp_cxx_ws_string (pp, "switch");
1834 pp_cxx_left_paren (pp);
1835 pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1836 pp_cxx_right_paren (pp);
1837 pp_indentation (pp) += 3;
1838 pp_needs_newline (pp) = true;
1839 pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1840 pp_newline_and_indent (pp, -3);
1843 /* iteration-statement:
1844 while ( expression ) statement
1845 do statement while ( expression ) ;
1846 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1847 for ( declaration expression(opt) ; expression(opt) ) statement */
1849 pp_cxx_ws_string (pp, "while");
1851 pp_cxx_left_paren (pp);
1852 pp_cxx_expression (pp, WHILE_COND (t));
1853 pp_cxx_right_paren (pp);
1854 pp_newline_and_indent (pp, 3);
1855 pp_cxx_statement (pp, WHILE_BODY (t));
1856 pp_indentation (pp) -= 3;
1857 pp_needs_newline (pp) = true;
1861 pp_cxx_ws_string (pp, "do");
1862 pp_newline_and_indent (pp, 3);
1863 pp_cxx_statement (pp, DO_BODY (t));
1864 pp_newline_and_indent (pp, -3);
1865 pp_cxx_ws_string (pp, "while");
1867 pp_cxx_left_paren (pp);
1868 pp_cxx_expression (pp, DO_COND (t));
1869 pp_cxx_right_paren (pp);
1870 pp_cxx_semicolon (pp);
1871 pp_needs_newline (pp) = true;
1875 pp_cxx_ws_string (pp, "for");
1877 pp_cxx_left_paren (pp);
1878 if (FOR_INIT_STMT (t))
1879 pp_cxx_statement (pp, FOR_INIT_STMT (t));
1881 pp_cxx_semicolon (pp);
1882 pp_needs_newline (pp) = false;
1883 pp_cxx_whitespace (pp);
1885 pp_cxx_expression (pp, FOR_COND (t));
1886 pp_cxx_semicolon (pp);
1887 pp_needs_newline (pp) = false;
1888 pp_cxx_whitespace (pp);
1890 pp_cxx_expression (pp, FOR_EXPR (t));
1891 pp_cxx_right_paren (pp);
1892 pp_newline_and_indent (pp, 3);
1893 pp_cxx_statement (pp, FOR_BODY (t));
1894 pp_indentation (pp) -= 3;
1895 pp_needs_newline (pp) = true;
1901 return expression(opt) ; */
1904 pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1905 pp_cxx_semicolon (pp);
1906 pp_needs_newline (pp) = true;
1909 /* expression-statement:
1910 expression(opt) ; */
1912 pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1913 pp_cxx_semicolon (pp);
1914 pp_needs_newline (pp) = true;
1918 pp_cxx_ws_string (pp, "try");
1919 pp_newline_and_indent (pp, 2);
1920 pp_cxx_statement (pp, CLEANUP_BODY (t));
1921 pp_newline_and_indent (pp, -2);
1922 pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
1923 pp_newline_and_indent (pp, 2);
1924 pp_cxx_statement (pp, CLEANUP_EXPR (t));
1925 pp_newline_and_indent (pp, -2);
1929 pp_cxx_declaration (pp, t);
1933 pp_c_statement (pp_c_base (pp), t);
1938 /* original-namespace-definition:
1939 namespace identifier { namespace-body }
1941 As an edge case, we also handle unnamed namespace definition here. */
1944 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
1946 pp_cxx_ws_string (pp, "namespace");
1947 if (DECL_CONTEXT (t))
1948 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1950 pp_cxx_unqualified_id (pp, t);
1951 pp_cxx_whitespace (pp);
1952 pp_cxx_left_brace (pp);
1953 /* We do not print the namespace-body. */
1954 pp_cxx_whitespace (pp);
1955 pp_cxx_right_brace (pp);
1961 namespace-alias-definition:
1962 namespace identifier = qualified-namespace-specifier ;
1964 qualified-namespace-specifier:
1965 ::(opt) nested-name-specifier(opt) namespace-name */
1968 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
1970 pp_cxx_ws_string (pp, "namespace");
1971 if (DECL_CONTEXT (t))
1972 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1973 pp_cxx_unqualified_id (pp, t);
1974 pp_cxx_whitespace (pp);
1976 pp_cxx_whitespace (pp);
1977 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
1978 pp_cxx_nested_name_specifier (pp,
1979 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
1980 pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
1981 pp_cxx_semicolon (pp);
1984 /* simple-declaration:
1985 decl-specifier-seq(opt) init-declarator-list(opt) */
1988 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
1990 pp_cxx_decl_specifier_seq (pp, t);
1991 pp_cxx_init_declarator (pp, t);
1992 pp_cxx_semicolon (pp);
1993 pp_needs_newline (pp) = true;
1997 template-parameter-list:
1999 template-parameter-list , template-parameter */
2002 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2004 const int n = TREE_VEC_LENGTH (t);
2006 for (i = 0; i < n; ++i)
2009 pp_cxx_separate_with (pp, ',');
2010 pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2014 /* template-parameter:
2016 parameter-declaration
2019 class ...(opt) identifier(opt)
2020 class identifier(opt) = type-id
2021 typename identifier(opt)
2022 typename ...(opt) identifier(opt) = type-id
2023 template < template-parameter-list > class ...(opt) identifier(opt)
2024 template < template-parameter-list > class identifier(opt) = template-name */
2027 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2029 tree parameter = TREE_VALUE (t);
2030 switch (TREE_CODE (parameter))
2033 pp_cxx_ws_string (pp, "class");
2034 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2035 pp_cxx_ws_string (pp, "...");
2036 if (DECL_NAME (parameter))
2037 pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2038 /* FIXME: Check if we should print also default argument. */
2042 pp_cxx_parameter_declaration (pp, parameter);
2049 pp_unsupported_tree (pp, t);
2054 /* Pretty-print a template parameter in the canonical form
2055 "template-parameter-<level>-<position in parameter list>". */
2058 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2060 const enum tree_code code = TREE_CODE (parm);
2062 /* Brings type template parameters to the canonical forms. */
2063 if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2064 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2065 parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2067 pp_cxx_begin_template_argument_list (pp);
2068 pp_cxx_ws_string (pp, M_("template-parameter-"));
2069 pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2071 pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2072 pp_cxx_end_template_argument_list (pp);
2076 template-declaration:
2077 export(opt) template < template-parameter-list > declaration */
2080 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2082 tree tmpl = most_general_template (t);
2086 pp_maybe_newline_and_indent (pp, 0);
2087 for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2089 pp_cxx_ws_string (pp, "template");
2090 pp_cxx_begin_template_argument_list (pp);
2091 pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2092 pp_cxx_end_template_argument_list (pp);
2093 pp_newline_and_indent (pp, 3);
2096 if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2097 pp_cxx_function_definition (pp, t);
2099 pp_cxx_simple_declaration (pp, t);
2103 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2105 pp_unsupported_tree (pp, t);
2109 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2111 pp_unsupported_tree (pp, t);
2118 template-declaration
2119 explicit-instantiation
2120 explicit-specialization
2121 linkage-specification
2122 namespace-definition
2127 namespace-alias-definition
2130 static_assert-declaration */
2132 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2134 if (TREE_CODE (t) == STATIC_ASSERT)
2136 pp_cxx_ws_string (pp, "static_assert");
2137 pp_cxx_left_paren (pp);
2138 pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2139 pp_cxx_separate_with (pp, ',');
2140 pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2141 pp_cxx_right_paren (pp);
2143 else if (!DECL_LANG_SPECIFIC (t))
2144 pp_cxx_simple_declaration (pp, t);
2145 else if (DECL_USE_TEMPLATE (t))
2146 switch (DECL_USE_TEMPLATE (t))
2149 pp_cxx_template_declaration (pp, t);
2153 pp_cxx_explicit_specialization (pp, t);
2157 pp_cxx_explicit_instantiation (pp, t);
2163 else switch (TREE_CODE (t))
2167 pp_cxx_simple_declaration (pp, t);
2171 if (DECL_SAVED_TREE (t))
2172 pp_cxx_function_definition (pp, t);
2174 pp_cxx_simple_declaration (pp, t);
2177 case NAMESPACE_DECL:
2178 if (DECL_NAMESPACE_ALIAS (t))
2179 pp_cxx_namespace_alias_definition (pp, t);
2181 pp_cxx_original_namespace_definition (pp, t);
2185 pp_unsupported_tree (pp, t);
2191 pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2193 t = TREE_OPERAND (t, 0);
2194 pp_cxx_ws_string (pp, "typeid");
2195 pp_cxx_left_paren (pp);
2197 pp_cxx_type_id (pp, t);
2199 pp_cxx_expression (pp, t);
2200 pp_cxx_right_paren (pp);
2204 pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2206 pp_cxx_ws_string (pp, "va_arg");
2207 pp_cxx_left_paren (pp);
2208 pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2209 pp_cxx_separate_with (pp, ',');
2210 pp_cxx_type_id (pp, TREE_TYPE (t));
2211 pp_cxx_right_paren (pp);
2215 pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2217 switch (TREE_CODE (t))
2220 if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2221 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2223 pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2224 pp_cxx_separate_with (pp, ',');
2229 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2231 if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2233 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2236 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2238 pp_left_bracket (pp);
2239 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2240 pp_right_bracket (pp);
2248 pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2250 pp_cxx_ws_string (pp, "offsetof");
2251 pp_cxx_left_paren (pp);
2252 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2253 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2254 pp_cxx_right_paren (pp);
2258 pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2260 cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2264 case CPTK_HAS_NOTHROW_ASSIGN:
2265 pp_cxx_ws_string (pp, "__has_nothrow_assign");
2267 case CPTK_HAS_TRIVIAL_ASSIGN:
2268 pp_cxx_ws_string (pp, "__has_trivial_assign");
2270 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2271 pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2273 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2274 pp_cxx_ws_string (pp, "__has_trivial_constructor");
2276 case CPTK_HAS_NOTHROW_COPY:
2277 pp_cxx_ws_string (pp, "__has_nothrow_copy");
2279 case CPTK_HAS_TRIVIAL_COPY:
2280 pp_cxx_ws_string (pp, "__has_trivial_copy");
2282 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2283 pp_cxx_ws_string (pp, "__has_trivial_destructor");
2285 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2286 pp_cxx_ws_string (pp, "__has_virtual_destructor");
2288 case CPTK_IS_ABSTRACT:
2289 pp_cxx_ws_string (pp, "__is_abstract");
2291 case CPTK_IS_BASE_OF:
2292 pp_cxx_ws_string (pp, "__is_base_of");
2295 pp_cxx_ws_string (pp, "__is_class");
2297 case CPTK_IS_CONVERTIBLE_TO:
2298 pp_cxx_ws_string (pp, "__is_convertible_to");
2301 pp_cxx_ws_string (pp, "__is_empty");
2304 pp_cxx_ws_string (pp, "__is_enum");
2307 pp_cxx_ws_string (pp, "__is_pod");
2309 case CPTK_IS_POLYMORPHIC:
2310 pp_cxx_ws_string (pp, "__is_polymorphic");
2312 case CPTK_IS_STD_LAYOUT:
2313 pp_cxx_ws_string (pp, "__is_std_layout");
2315 case CPTK_IS_TRIVIAL:
2316 pp_cxx_ws_string (pp, "__is_trivial");
2319 pp_cxx_ws_string (pp, "__is_union");
2326 pp_cxx_left_paren (pp);
2327 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2329 if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2331 pp_cxx_separate_with (pp, ',');
2332 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2335 pp_cxx_right_paren (pp);
2338 typedef c_pretty_print_fn pp_fun;
2340 /* Initialization of a C++ pretty-printer object. */
2343 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2345 pp_c_pretty_printer_init (pp_c_base (pp));
2346 pp_set_line_maximum_length (pp, 0);
2348 pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2349 pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2350 pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2351 pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2352 pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2353 pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2354 pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2355 pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2356 pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2357 pp->c_base.direct_abstract_declarator =
2358 (pp_fun) pp_cxx_direct_abstract_declarator;
2359 pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2361 /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */
2363 pp->c_base.constant = (pp_fun) pp_cxx_constant;
2364 pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2365 pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2366 pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2367 pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2368 pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2369 pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2370 pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2371 pp->c_base.expression = (pp_fun) pp_cxx_expression;
2372 pp->enclosing_scope = global_namespace;