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 if (TYPE_PTRMEMFUNC_P (t))
1176 tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1177 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1178 pp_cxx_whitespace (pp);
1179 pp_cxx_ptr_operator (pp, t);
1184 /* Constructors don't have return types. And conversion functions
1185 do not have a type-specifier in their return types. */
1186 if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1187 pp_cxx_function_specifier (pp, t);
1188 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1189 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1192 pp_c_declaration_specifiers (pp_c_base (pp), t);
1197 /* simple-type-specifier:
1198 ::(opt) nested-name-specifier(opt) type-name
1199 ::(opt) nested-name-specifier(opt) template(opt) template-id
1213 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1215 switch (TREE_CODE (t))
1220 pp_cxx_qualified_id (pp, t);
1223 case TEMPLATE_TYPE_PARM:
1224 case TEMPLATE_TEMPLATE_PARM:
1225 case TEMPLATE_PARM_INDEX:
1226 pp_cxx_unqualified_id (pp, t);
1230 pp_cxx_ws_string (pp, "typename");
1231 pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1232 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1236 pp_c_type_specifier (pp_c_base (pp), t);
1241 /* type-specifier-seq:
1242 type-specifier type-specifier-seq(opt)
1245 simple-type-specifier
1248 elaborated-type-specifier
1252 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1254 switch (TREE_CODE (t))
1257 case TEMPLATE_TYPE_PARM:
1258 case TEMPLATE_TEMPLATE_PARM:
1260 case BOUND_TEMPLATE_TEMPLATE_PARM:
1261 pp_cxx_cv_qualifier_seq (pp, t);
1262 pp_cxx_simple_type_specifier (pp, t);
1266 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1267 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1268 pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1272 pp_cxx_ws_string (pp, "decltype");
1273 pp_cxx_left_paren (pp);
1274 pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1275 pp_cxx_right_paren (pp);
1279 if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1280 pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1285 * cv-qualifier-seq(opt)
1287 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1290 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1292 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1294 switch (TREE_CODE (t))
1296 case REFERENCE_TYPE:
1298 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
1299 || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
1300 pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1301 if (TREE_CODE (t) == POINTER_TYPE)
1304 pp_cxx_cv_qualifier_seq (pp, t);
1311 if (TYPE_PTRMEMFUNC_P (t))
1313 pp_cxx_left_paren (pp);
1314 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1319 if (TYPE_PTR_TO_MEMBER_P (t))
1321 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1322 pp_cxx_left_paren (pp);
1323 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1325 pp_cxx_cv_qualifier_seq (pp, t);
1328 /* else fall through. */
1331 pp_unsupported_tree (pp, t);
1337 pp_cxx_implicit_parameter_type (tree mf)
1339 return TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (mf))));
1343 parameter-declaration:
1344 decl-specifier-seq declarator
1345 decl-specifier-seq declarator = assignment-expression
1346 decl-specifier-seq abstract-declarator(opt)
1347 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1350 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1352 pp_cxx_decl_specifier_seq (pp, t);
1354 pp_cxx_abstract_declarator (pp, t);
1356 pp_cxx_declarator (pp, t);
1359 /* parameter-declaration-clause:
1360 parameter-declaration-list(opt) ...(opt)
1361 parameter-declaration-list , ...
1363 parameter-declaration-list:
1364 parameter-declaration
1365 parameter-declaration-list , parameter-declaration */
1368 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1370 tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1372 TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1373 const bool abstract = args == NULL
1374 || pp_c_base (pp)->flags & pp_c_flag_abstract;
1377 /* Skip artificial parameter for nonstatic member functions. */
1378 if (TREE_CODE (t) == METHOD_TYPE)
1379 types = TREE_CHAIN (types);
1381 pp_cxx_left_paren (pp);
1382 for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1385 pp_cxx_separate_with (pp, ',');
1387 pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1388 if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1390 pp_cxx_whitespace (pp);
1392 pp_cxx_whitespace (pp);
1393 pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1396 pp_cxx_right_paren (pp);
1399 /* exception-specification:
1400 throw ( type-id-list(opt) )
1404 type-id-list , type-id */
1407 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1409 tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1410 bool need_comma = false;
1412 if (!TYPE_NOTHROW_P (t) && ex_spec == NULL)
1414 pp_cxx_ws_string (pp, "throw");
1415 pp_cxx_left_paren (pp);
1416 for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1418 tree type = TREE_VALUE (ex_spec);
1419 tree argpack = NULL_TREE;
1422 if (ARGUMENT_PACK_P (type))
1424 argpack = ARGUMENT_PACK_ARGS (type);
1425 len = TREE_VEC_LENGTH (argpack);
1428 for (i = 0; i < len; ++i)
1431 type = TREE_VEC_ELT (argpack, i);
1434 pp_cxx_separate_with (pp, ',');
1438 pp_cxx_type_id (pp, type);
1441 pp_cxx_right_paren (pp);
1444 /* direct-declarator:
1446 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1447 exception-specification(opt)
1448 direct-declaration [ constant-expression(opt) ]
1452 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1454 switch (TREE_CODE (t))
1462 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1464 if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1465 || template_parameter_pack_p (t))
1466 /* A function parameter pack or non-type template
1468 pp_cxx_ws_string (pp, "...");
1470 pp_cxx_id_expression (pp, DECL_NAME (t));
1472 pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1476 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1477 pp_cxx_id_expression (pp, t);
1478 pp_cxx_parameter_declaration_clause (pp, t);
1480 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1482 pp_base (pp)->padding = pp_before;
1483 pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1486 pp_cxx_exception_specification (pp, TREE_TYPE (t));
1491 case TEMPLATE_TYPE_PARM:
1492 case TEMPLATE_PARM_INDEX:
1493 case TEMPLATE_TEMPLATE_PARM:
1497 pp_c_direct_declarator (pp_c_base (pp), t);
1504 ptr-operator declarator */
1507 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1509 pp_cxx_direct_declarator (pp, t);
1512 /* ctor-initializer:
1513 : mem-initializer-list
1515 mem-initializer-list:
1517 mem-initializer , mem-initializer-list
1520 mem-initializer-id ( expression-list(opt) )
1523 ::(opt) nested-name-specifier(opt) class-name
1527 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1529 t = TREE_OPERAND (t, 0);
1530 pp_cxx_whitespace (pp);
1532 pp_cxx_whitespace (pp);
1533 for (; t; t = TREE_CHAIN (t))
1535 tree purpose = TREE_PURPOSE (t);
1536 bool is_pack = PACK_EXPANSION_P (purpose);
1539 pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1541 pp_cxx_primary_expression (pp, purpose);
1542 pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1544 pp_cxx_ws_string (pp, "...");
1546 pp_cxx_separate_with (pp, ',');
1550 /* function-definition:
1551 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1552 decl-specifier-seq(opt) declarator function-try-block */
1555 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1557 tree saved_scope = pp->enclosing_scope;
1558 pp_cxx_decl_specifier_seq (pp, t);
1559 pp_cxx_declarator (pp, t);
1560 pp_needs_newline (pp) = true;
1561 pp->enclosing_scope = DECL_CONTEXT (t);
1562 if (DECL_SAVED_TREE (t))
1563 pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1566 pp_cxx_semicolon (pp);
1567 pp_needs_newline (pp) = true;
1570 pp->enclosing_scope = saved_scope;
1573 /* abstract-declarator:
1574 ptr-operator abstract-declarator(opt)
1575 direct-abstract-declarator */
1578 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1580 if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t))
1581 pp_cxx_right_paren (pp);
1582 else if (POINTER_TYPE_P (t))
1584 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1585 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1586 pp_cxx_right_paren (pp);
1589 pp_cxx_direct_abstract_declarator (pp, t);
1592 /* direct-abstract-declarator:
1593 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1594 cv-qualifier-seq(opt) exception-specification(opt)
1595 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1596 ( abstract-declarator ) */
1599 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1601 switch (TREE_CODE (t))
1603 case REFERENCE_TYPE:
1604 pp_cxx_abstract_declarator (pp, t);
1608 if (TYPE_PTRMEMFUNC_P (t))
1609 pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1614 pp_cxx_parameter_declaration_clause (pp, t);
1615 pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1616 if (TREE_CODE (t) == METHOD_TYPE)
1618 pp_base (pp)->padding = pp_before;
1619 pp_cxx_cv_qualifier_seq
1620 (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
1622 pp_cxx_exception_specification (pp, t);
1626 case TEMPLATE_TYPE_PARM:
1627 case TEMPLATE_TEMPLATE_PARM:
1628 case BOUND_TEMPLATE_TEMPLATE_PARM:
1629 case UNBOUND_CLASS_TEMPLATE:
1633 pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1639 type-specifier-seq abstract-declarator(opt) */
1642 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1644 pp_flags saved_flags = pp_c_base (pp)->flags;
1645 pp_c_base (pp)->flags |= pp_c_flag_abstract;
1647 switch (TREE_CODE (t))
1654 case BOUND_TEMPLATE_TEMPLATE_PARM:
1655 case UNBOUND_CLASS_TEMPLATE:
1656 case TEMPLATE_TEMPLATE_PARM:
1657 case TEMPLATE_TYPE_PARM:
1658 case TEMPLATE_PARM_INDEX:
1662 case TEMPLATE_ID_EXPR:
1663 pp_cxx_type_specifier_seq (pp, t);
1666 case TYPE_PACK_EXPANSION:
1667 pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1668 pp_cxx_ws_string (pp, "...");
1672 pp_c_type_id (pp_c_base (pp), t);
1676 pp_c_base (pp)->flags = saved_flags;
1679 /* template-argument-list:
1680 template-argument ...(opt)
1681 template-argument-list, template-argument ...(opt)
1684 assignment-expression
1689 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1692 bool need_comma = false;
1696 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1698 tree arg = TREE_VEC_ELT (t, i);
1699 tree argpack = NULL_TREE;
1702 if (ARGUMENT_PACK_P (arg))
1704 argpack = ARGUMENT_PACK_ARGS (arg);
1705 len = TREE_VEC_LENGTH (argpack);
1708 for (idx = 0; idx < len; idx++)
1711 arg = TREE_VEC_ELT (argpack, idx);
1714 pp_cxx_separate_with (pp, ',');
1718 if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1719 && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1720 pp_cxx_type_id (pp, arg);
1722 pp_cxx_expression (pp, arg);
1729 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1731 t = DECL_EXPR_DECL (t);
1732 pp_cxx_type_specifier_seq (pp, t);
1734 pp_cxx_abstract_declarator (pp, t);
1736 pp_cxx_declarator (pp, t);
1742 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1744 switch (TREE_CODE (t))
1746 case CTOR_INITIALIZER:
1747 pp_cxx_ctor_initializer (pp, t);
1751 pp_cxx_ws_string (pp, "using");
1752 pp_cxx_ws_string (pp, "namespace");
1753 if (DECL_CONTEXT (t))
1754 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1755 pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1759 pp_cxx_ws_string (pp, "using");
1760 pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1761 pp_cxx_unqualified_id (pp, DECL_NAME (t));
1768 try compound-statement handler-seq */
1770 pp_maybe_newline_and_indent (pp, 0);
1771 pp_cxx_ws_string (pp, "try");
1772 pp_newline_and_indent (pp, 3);
1773 pp_cxx_statement (pp, TRY_STMTS (t));
1774 pp_newline_and_indent (pp, -3);
1778 pp_cxx_statement (pp, TRY_HANDLERS (t));
1783 handler handler-seq(opt)
1786 catch ( exception-declaration ) compound-statement
1788 exception-declaration:
1789 type-specifier-seq declarator
1790 type-specifier-seq abstract-declarator
1793 pp_cxx_ws_string (pp, "catch");
1794 pp_cxx_left_paren (pp);
1795 pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1796 pp_cxx_right_paren (pp);
1797 pp_indentation (pp) += 3;
1798 pp_needs_newline (pp) = true;
1799 pp_cxx_statement (pp, HANDLER_BODY (t));
1800 pp_indentation (pp) -= 3;
1801 pp_needs_newline (pp) = true;
1804 /* selection-statement:
1805 if ( expression ) statement
1806 if ( expression ) statement else statement */
1808 pp_cxx_ws_string (pp, "if");
1809 pp_cxx_whitespace (pp);
1810 pp_cxx_left_paren (pp);
1811 pp_cxx_expression (pp, IF_COND (t));
1812 pp_cxx_right_paren (pp);
1813 pp_newline_and_indent (pp, 2);
1814 pp_cxx_statement (pp, THEN_CLAUSE (t));
1815 pp_newline_and_indent (pp, -2);
1816 if (ELSE_CLAUSE (t))
1818 tree else_clause = ELSE_CLAUSE (t);
1819 pp_cxx_ws_string (pp, "else");
1820 if (TREE_CODE (else_clause) == IF_STMT)
1821 pp_cxx_whitespace (pp);
1823 pp_newline_and_indent (pp, 2);
1824 pp_cxx_statement (pp, else_clause);
1825 if (TREE_CODE (else_clause) != IF_STMT)
1826 pp_newline_and_indent (pp, -2);
1831 pp_cxx_ws_string (pp, "switch");
1833 pp_cxx_left_paren (pp);
1834 pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1835 pp_cxx_right_paren (pp);
1836 pp_indentation (pp) += 3;
1837 pp_needs_newline (pp) = true;
1838 pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1839 pp_newline_and_indent (pp, -3);
1842 /* iteration-statement:
1843 while ( expression ) statement
1844 do statement while ( expression ) ;
1845 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1846 for ( declaration expression(opt) ; expression(opt) ) statement */
1848 pp_cxx_ws_string (pp, "while");
1850 pp_cxx_left_paren (pp);
1851 pp_cxx_expression (pp, WHILE_COND (t));
1852 pp_cxx_right_paren (pp);
1853 pp_newline_and_indent (pp, 3);
1854 pp_cxx_statement (pp, WHILE_BODY (t));
1855 pp_indentation (pp) -= 3;
1856 pp_needs_newline (pp) = true;
1860 pp_cxx_ws_string (pp, "do");
1861 pp_newline_and_indent (pp, 3);
1862 pp_cxx_statement (pp, DO_BODY (t));
1863 pp_newline_and_indent (pp, -3);
1864 pp_cxx_ws_string (pp, "while");
1866 pp_cxx_left_paren (pp);
1867 pp_cxx_expression (pp, DO_COND (t));
1868 pp_cxx_right_paren (pp);
1869 pp_cxx_semicolon (pp);
1870 pp_needs_newline (pp) = true;
1874 pp_cxx_ws_string (pp, "for");
1876 pp_cxx_left_paren (pp);
1877 if (FOR_INIT_STMT (t))
1878 pp_cxx_statement (pp, FOR_INIT_STMT (t));
1880 pp_cxx_semicolon (pp);
1881 pp_needs_newline (pp) = false;
1882 pp_cxx_whitespace (pp);
1884 pp_cxx_expression (pp, FOR_COND (t));
1885 pp_cxx_semicolon (pp);
1886 pp_needs_newline (pp) = false;
1887 pp_cxx_whitespace (pp);
1889 pp_cxx_expression (pp, FOR_EXPR (t));
1890 pp_cxx_right_paren (pp);
1891 pp_newline_and_indent (pp, 3);
1892 pp_cxx_statement (pp, FOR_BODY (t));
1893 pp_indentation (pp) -= 3;
1894 pp_needs_newline (pp) = true;
1900 return expression(opt) ; */
1903 pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1904 pp_cxx_semicolon (pp);
1905 pp_needs_newline (pp) = true;
1908 /* expression-statement:
1909 expression(opt) ; */
1911 pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1912 pp_cxx_semicolon (pp);
1913 pp_needs_newline (pp) = true;
1917 pp_cxx_ws_string (pp, "try");
1918 pp_newline_and_indent (pp, 2);
1919 pp_cxx_statement (pp, CLEANUP_BODY (t));
1920 pp_newline_and_indent (pp, -2);
1921 pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
1922 pp_newline_and_indent (pp, 2);
1923 pp_cxx_statement (pp, CLEANUP_EXPR (t));
1924 pp_newline_and_indent (pp, -2);
1928 pp_cxx_declaration (pp, t);
1932 pp_c_statement (pp_c_base (pp), t);
1937 /* original-namespace-definition:
1938 namespace identifier { namespace-body }
1940 As an edge case, we also handle unnamed namespace definition here. */
1943 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
1945 pp_cxx_ws_string (pp, "namespace");
1946 if (DECL_CONTEXT (t))
1947 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1949 pp_cxx_unqualified_id (pp, t);
1950 pp_cxx_whitespace (pp);
1951 pp_cxx_left_brace (pp);
1952 /* We do not print the namespace-body. */
1953 pp_cxx_whitespace (pp);
1954 pp_cxx_right_brace (pp);
1960 namespace-alias-definition:
1961 namespace identifier = qualified-namespace-specifier ;
1963 qualified-namespace-specifier:
1964 ::(opt) nested-name-specifier(opt) namespace-name */
1967 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
1969 pp_cxx_ws_string (pp, "namespace");
1970 if (DECL_CONTEXT (t))
1971 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1972 pp_cxx_unqualified_id (pp, t);
1973 pp_cxx_whitespace (pp);
1975 pp_cxx_whitespace (pp);
1976 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
1977 pp_cxx_nested_name_specifier (pp,
1978 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
1979 pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
1980 pp_cxx_semicolon (pp);
1983 /* simple-declaration:
1984 decl-specifier-seq(opt) init-declarator-list(opt) */
1987 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
1989 pp_cxx_decl_specifier_seq (pp, t);
1990 pp_cxx_init_declarator (pp, t);
1991 pp_cxx_semicolon (pp);
1992 pp_needs_newline (pp) = true;
1996 template-parameter-list:
1998 template-parameter-list , template-parameter */
2001 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2003 const int n = TREE_VEC_LENGTH (t);
2005 for (i = 0; i < n; ++i)
2008 pp_cxx_separate_with (pp, ',');
2009 pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2013 /* template-parameter:
2015 parameter-declaration
2018 class ...(opt) identifier(opt)
2019 class identifier(opt) = type-id
2020 typename identifier(opt)
2021 typename ...(opt) identifier(opt) = type-id
2022 template < template-parameter-list > class ...(opt) identifier(opt)
2023 template < template-parameter-list > class identifier(opt) = template-name */
2026 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2028 tree parameter = TREE_VALUE (t);
2029 switch (TREE_CODE (parameter))
2032 pp_cxx_ws_string (pp, "class");
2033 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2034 pp_cxx_ws_string (pp, "...");
2035 if (DECL_NAME (parameter))
2036 pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2037 /* FIXME: Check if we should print also default argument. */
2041 pp_cxx_parameter_declaration (pp, parameter);
2048 pp_unsupported_tree (pp, t);
2053 /* Pretty-print a template parameter in the canonical form
2054 "template-parameter-<level>-<position in parameter list>". */
2057 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2059 const enum tree_code code = TREE_CODE (parm);
2061 /* Brings type template parameters to the canonical forms. */
2062 if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2063 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2064 parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2066 pp_cxx_begin_template_argument_list (pp);
2067 pp_cxx_ws_string (pp, M_("template-parameter-"));
2068 pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2070 pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2071 pp_cxx_end_template_argument_list (pp);
2075 template-declaration:
2076 export(opt) template < template-parameter-list > declaration */
2079 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2081 tree tmpl = most_general_template (t);
2085 pp_maybe_newline_and_indent (pp, 0);
2086 for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2088 pp_cxx_ws_string (pp, "template");
2089 pp_cxx_begin_template_argument_list (pp);
2090 pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2091 pp_cxx_end_template_argument_list (pp);
2092 pp_newline_and_indent (pp, 3);
2095 if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2096 pp_cxx_function_definition (pp, t);
2098 pp_cxx_simple_declaration (pp, t);
2102 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2104 pp_unsupported_tree (pp, t);
2108 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2110 pp_unsupported_tree (pp, t);
2117 template-declaration
2118 explicit-instantiation
2119 explicit-specialization
2120 linkage-specification
2121 namespace-definition
2126 namespace-alias-definition
2129 static_assert-declaration */
2131 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2133 if (TREE_CODE (t) == STATIC_ASSERT)
2135 pp_cxx_ws_string (pp, "static_assert");
2136 pp_cxx_left_paren (pp);
2137 pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2138 pp_cxx_separate_with (pp, ',');
2139 pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2140 pp_cxx_right_paren (pp);
2142 else if (!DECL_LANG_SPECIFIC (t))
2143 pp_cxx_simple_declaration (pp, t);
2144 else if (DECL_USE_TEMPLATE (t))
2145 switch (DECL_USE_TEMPLATE (t))
2148 pp_cxx_template_declaration (pp, t);
2152 pp_cxx_explicit_specialization (pp, t);
2156 pp_cxx_explicit_instantiation (pp, t);
2162 else switch (TREE_CODE (t))
2166 pp_cxx_simple_declaration (pp, t);
2170 if (DECL_SAVED_TREE (t))
2171 pp_cxx_function_definition (pp, t);
2173 pp_cxx_simple_declaration (pp, t);
2176 case NAMESPACE_DECL:
2177 if (DECL_NAMESPACE_ALIAS (t))
2178 pp_cxx_namespace_alias_definition (pp, t);
2180 pp_cxx_original_namespace_definition (pp, t);
2184 pp_unsupported_tree (pp, t);
2190 pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2192 t = TREE_OPERAND (t, 0);
2193 pp_cxx_ws_string (pp, "typeid");
2194 pp_cxx_left_paren (pp);
2196 pp_cxx_type_id (pp, t);
2198 pp_cxx_expression (pp, t);
2199 pp_cxx_right_paren (pp);
2203 pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2205 pp_cxx_ws_string (pp, "va_arg");
2206 pp_cxx_left_paren (pp);
2207 pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2208 pp_cxx_separate_with (pp, ',');
2209 pp_cxx_type_id (pp, TREE_TYPE (t));
2210 pp_cxx_right_paren (pp);
2214 pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2216 switch (TREE_CODE (t))
2219 if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2220 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2222 pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2223 pp_cxx_separate_with (pp, ',');
2228 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2230 if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2232 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2235 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2237 pp_left_bracket (pp);
2238 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2239 pp_right_bracket (pp);
2247 pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2249 pp_cxx_ws_string (pp, "offsetof");
2250 pp_cxx_left_paren (pp);
2251 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2252 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2253 pp_cxx_right_paren (pp);
2257 pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2259 cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2263 case CPTK_HAS_NOTHROW_ASSIGN:
2264 pp_cxx_ws_string (pp, "__has_nothrow_assign");
2266 case CPTK_HAS_TRIVIAL_ASSIGN:
2267 pp_cxx_ws_string (pp, "__has_trivial_assign");
2269 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2270 pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2272 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2273 pp_cxx_ws_string (pp, "__has_trivial_constructor");
2275 case CPTK_HAS_NOTHROW_COPY:
2276 pp_cxx_ws_string (pp, "__has_nothrow_copy");
2278 case CPTK_HAS_TRIVIAL_COPY:
2279 pp_cxx_ws_string (pp, "__has_trivial_copy");
2281 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2282 pp_cxx_ws_string (pp, "__has_trivial_destructor");
2284 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2285 pp_cxx_ws_string (pp, "__has_virtual_destructor");
2287 case CPTK_IS_ABSTRACT:
2288 pp_cxx_ws_string (pp, "__is_abstract");
2290 case CPTK_IS_BASE_OF:
2291 pp_cxx_ws_string (pp, "__is_base_of");
2294 pp_cxx_ws_string (pp, "__is_class");
2296 case CPTK_IS_CONVERTIBLE_TO:
2297 pp_cxx_ws_string (pp, "__is_convertible_to");
2300 pp_cxx_ws_string (pp, "__is_empty");
2303 pp_cxx_ws_string (pp, "__is_enum");
2306 pp_cxx_ws_string (pp, "__is_pod");
2308 case CPTK_IS_POLYMORPHIC:
2309 pp_cxx_ws_string (pp, "__is_polymorphic");
2311 case CPTK_IS_STD_LAYOUT:
2312 pp_cxx_ws_string (pp, "__is_std_layout");
2314 case CPTK_IS_TRIVIAL:
2315 pp_cxx_ws_string (pp, "__is_trivial");
2318 pp_cxx_ws_string (pp, "__is_union");
2325 pp_cxx_left_paren (pp);
2326 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2328 if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2330 pp_cxx_separate_with (pp, ',');
2331 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2334 pp_cxx_right_paren (pp);
2337 typedef c_pretty_print_fn pp_fun;
2339 /* Initialization of a C++ pretty-printer object. */
2342 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2344 pp_c_pretty_printer_init (pp_c_base (pp));
2345 pp_set_line_maximum_length (pp, 0);
2347 pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2348 pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2349 pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2350 pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2351 pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2352 pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2353 pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2354 pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2355 pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2356 pp->c_base.direct_abstract_declarator =
2357 (pp_fun) pp_cxx_direct_abstract_declarator;
2358 pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2360 /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */
2362 pp->c_base.constant = (pp_fun) pp_cxx_constant;
2363 pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2364 pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2365 pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2366 pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2367 pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2368 pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2369 pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2370 pp->c_base.expression = (pp_fun) pp_cxx_expression;
2371 pp->enclosing_scope = global_namespace;