1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2 Copyright (C) 2003, 2004, 2005, 2007, 2008,
3 2009, 2010, 2011 Free Software Foundation, Inc.
4 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
28 #include "cxx-pretty-print.h"
29 #include "tree-pretty-print.h"
31 /* Translate if being used for diagnostics, but not for dump files or
33 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
35 static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
36 static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
37 static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
38 static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
39 static void pp_cxx_expression (cxx_pretty_printer *, tree);
40 static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
41 static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
42 static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
43 static void pp_cxx_type_id (cxx_pretty_printer *, tree);
44 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
45 static void pp_cxx_declarator (cxx_pretty_printer *, tree);
46 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
47 static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
48 static void pp_cxx_statement (cxx_pretty_printer *, tree);
49 static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
50 static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
51 static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
55 pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
57 const char *p = pp_last_position_in_text (pp);
59 if (p != NULL && *p == c)
60 pp_cxx_whitespace (pp);
62 pp_base (pp)->padding = pp_none;
65 #define pp_cxx_storage_class_specifier(PP, T) \
66 pp_c_storage_class_specifier (pp_c_base (PP), T)
67 #define pp_cxx_expression_list(PP, T) \
68 pp_c_expression_list (pp_c_base (PP), T)
69 #define pp_cxx_space_for_pointer_operator(PP, T) \
70 pp_c_space_for_pointer_operator (pp_c_base (PP), T)
71 #define pp_cxx_init_declarator(PP, T) \
72 pp_c_init_declarator (pp_c_base (PP), T)
73 #define pp_cxx_call_argument_list(PP, T) \
74 pp_c_call_argument_list (pp_c_base (PP), T)
77 pp_cxx_colon_colon (cxx_pretty_printer *pp)
80 pp_base (pp)->padding = pp_none;
84 pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
86 pp_cxx_nonconsecutive_character (pp, '<');
90 pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
92 pp_cxx_nonconsecutive_character (pp, '>');
96 pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
98 pp_separate_with (pp, c);
99 pp_base (pp)->padding = pp_none;
105 is_destructor_name (tree name)
107 return name == complete_dtor_identifier
108 || name == base_dtor_identifier
109 || name == deleting_dtor_identifier;
112 /* conversion-function-id:
113 operator conversion-type-id
116 type-specifier-seq conversion-declarator(opt)
118 conversion-declarator:
119 ptr-operator conversion-declarator(opt) */
122 pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
124 pp_cxx_ws_string (pp, "operator");
125 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
129 pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
131 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
132 pp_cxx_begin_template_argument_list (pp);
133 pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
134 pp_cxx_end_template_argument_list (pp);
137 /* Prints the unqualified part of the id-expression T.
142 conversion-function-id
147 pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
149 enum tree_code code = TREE_CODE (t);
153 pp_cxx_ws_string (pp, M_("<return-value>"));
170 case IDENTIFIER_NODE:
172 pp_cxx_ws_string (pp, M_("<unnamed>"));
173 else if (IDENTIFIER_TYPENAME_P (t))
174 pp_cxx_conversion_function_id (pp, t);
177 if (is_destructor_name (t))
180 /* FIXME: Why is this necessary? */
182 t = constructor_name (TREE_TYPE (t));
184 pp_cxx_tree_identifier (pp, t);
188 case TEMPLATE_ID_EXPR:
189 pp_cxx_template_id (pp, t);
193 pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
200 case UNBOUND_CLASS_TEMPLATE:
201 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
202 if (CLASS_TYPE_P (t) && CLASSTYPE_USE_TEMPLATE (t))
204 pp_cxx_begin_template_argument_list (pp);
205 pp_cxx_template_argument_list (pp, INNERMOST_TEMPLATE_ARGS
206 (CLASSTYPE_TI_ARGS (t)));
207 pp_cxx_end_template_argument_list (pp);
212 pp_cxx_complement (pp);
213 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
216 case TEMPLATE_TYPE_PARM:
217 case TEMPLATE_TEMPLATE_PARM:
218 if (TYPE_IDENTIFIER (t))
219 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
221 pp_cxx_canonical_template_parameter (pp, t);
224 case TEMPLATE_PARM_INDEX:
225 pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
228 case BOUND_TEMPLATE_TEMPLATE_PARM:
229 pp_cxx_cv_qualifier_seq (pp, t);
230 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
231 pp_cxx_begin_template_argument_list (pp);
232 pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
233 pp_cxx_end_template_argument_list (pp);
237 pp_unsupported_tree (pp, t);
242 /* Pretty-print out the token sequence ":: template" in template codes
243 where it is needed to "inline declare" the (following) member as
244 a template. This situation arises when SCOPE of T is dependent
245 on template parameters. */
248 pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
250 if (TREE_CODE (t) == TEMPLATE_ID_EXPR
251 && TYPE_P (scope) && dependent_type_p (scope))
252 pp_cxx_ws_string (pp, "template");
255 /* nested-name-specifier:
256 class-or-namespace-name :: nested-name-specifier(opt)
257 class-or-namespace-name :: template nested-name-specifier */
260 pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
262 if (!SCOPE_FILE_SCOPE_P (t) && t != pp->enclosing_scope)
264 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
265 pp_cxx_nested_name_specifier (pp, scope);
266 pp_cxx_template_keyword_if_needed (pp, scope, t);
267 pp_cxx_unqualified_id (pp, t);
268 pp_cxx_colon_colon (pp);
273 nested-name-specifier template(opt) unqualified-id */
276 pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
278 switch (TREE_CODE (t))
280 /* A pointer-to-member is always qualified. */
282 pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
283 pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
286 /* In Standard C++, functions cannot possibly be used as
287 nested-name-specifiers. However, there are situations where
288 is "makes sense" to output the surrounding function name for the
289 purpose of emphasizing on the scope kind. Just printing the
290 function name might not be sufficient as it may be overloaded; so,
291 we decorate the function with its signature too.
292 FIXME: This is probably the wrong pretty-printing for conversion
293 functions and some function templates. */
297 if (DECL_FUNCTION_MEMBER_P (t))
298 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
299 pp_cxx_unqualified_id
300 (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
301 pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
306 pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
307 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
312 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
313 if (scope != pp->enclosing_scope)
315 pp_cxx_nested_name_specifier (pp, scope);
316 pp_cxx_template_keyword_if_needed (pp, scope, t);
318 pp_cxx_unqualified_id (pp, t);
326 pp_cxx_constant (cxx_pretty_printer *pp, tree t)
328 switch (TREE_CODE (t))
332 const bool in_parens = PAREN_STRING_LITERAL_P (t);
334 pp_cxx_left_paren (pp);
335 pp_c_constant (pp_c_base (pp), t);
337 pp_cxx_right_paren (pp);
342 if (NULLPTR_TYPE_P (TREE_TYPE (t)))
344 pp_string (pp, "nullptr");
347 /* else fall through. */
350 pp_c_constant (pp_c_base (pp), t);
360 pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
362 if (TREE_CODE (t) == OVERLOAD)
364 if (DECL_P (t) && DECL_CONTEXT (t))
365 pp_cxx_qualified_id (pp, t);
367 pp_cxx_unqualified_id (pp, t);
370 /* primary-expression:
374 :: operator-function-id
380 __builtin_va_arg ( assignment-expression , type-id )
381 __builtin_offsetof ( type-id, offsetof-expression )
383 __has_nothrow_assign ( type-id )
384 __has_nothrow_constructor ( type-id )
385 __has_nothrow_copy ( type-id )
386 __has_trivial_assign ( type-id )
387 __has_trivial_constructor ( type-id )
388 __has_trivial_copy ( type-id )
389 __has_trivial_destructor ( type-id )
390 __has_virtual_destructor ( type-id )
391 __is_abstract ( type-id )
392 __is_base_of ( type-id , type-id )
393 __is_class ( type-id )
394 __is_convertible_to ( type-id , type-id )
395 __is_empty ( type-id )
396 __is_enum ( type-id )
397 __is_literal_type ( type-id )
399 __is_polymorphic ( type-id )
400 __is_std_layout ( type-id )
401 __is_trivial ( type-id )
402 __is_union ( type-id ) */
405 pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
407 switch (TREE_CODE (t))
413 pp_cxx_constant (pp, t);
417 t = BASELINK_FUNCTIONS (t);
425 pp_cxx_id_expression (pp, t);
429 case TEMPLATE_TYPE_PARM:
430 case TEMPLATE_TEMPLATE_PARM:
431 case TEMPLATE_PARM_INDEX:
432 pp_cxx_unqualified_id (pp, t);
436 pp_cxx_left_paren (pp);
437 pp_cxx_statement (pp, STMT_EXPR_STMT (t));
438 pp_cxx_right_paren (pp);
442 pp_cxx_trait_expression (pp, t);
446 pp_cxx_va_arg_expression (pp, t);
450 pp_cxx_offsetof_expression (pp, t);
454 pp_c_primary_expression (pp_c_base (pp), t);
459 /* postfix-expression:
461 postfix-expression [ expression ]
462 postfix-expression ( expression-list(opt) )
463 simple-type-specifier ( expression-list(opt) )
464 typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
465 typename ::(opt) nested-name-specifier template(opt)
466 template-id ( expression-list(opt) )
467 postfix-expression . template(opt) ::(opt) id-expression
468 postfix-expression -> template(opt) ::(opt) id-expression
469 postfix-expression . pseudo-destructor-name
470 postfix-expression -> pseudo-destructor-name
471 postfix-expression ++
472 postfix-expression --
473 dynamic_cast < type-id > ( expression )
474 static_cast < type-id > ( expression )
475 reinterpret_cast < type-id > ( expression )
476 const_cast < type-id > ( expression )
477 typeid ( expression )
478 typeid ( type-id ) */
481 pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
483 enum tree_code code = TREE_CODE (t);
490 tree fun = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t)
492 tree saved_scope = pp->enclosing_scope;
493 bool skipfirst = false;
496 if (TREE_CODE (fun) == ADDR_EXPR)
497 fun = TREE_OPERAND (fun, 0);
499 /* In templates, where there is no way to tell whether a given
500 call uses an actual member function. So the parser builds
501 FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
502 instantiation time. */
503 if (TREE_CODE (fun) != FUNCTION_DECL)
505 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
507 tree object = (code == AGGR_INIT_EXPR
508 ? (AGGR_INIT_VIA_CTOR_P (t)
509 ? AGGR_INIT_EXPR_SLOT (t)
510 : AGGR_INIT_EXPR_ARG (t, 0))
511 : CALL_EXPR_ARG (t, 0));
513 while (TREE_CODE (object) == NOP_EXPR)
514 object = TREE_OPERAND (object, 0);
516 if (TREE_CODE (object) == ADDR_EXPR)
517 object = TREE_OPERAND (object, 0);
519 if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
521 pp_cxx_postfix_expression (pp, object);
526 pp_cxx_postfix_expression (pp, object);
530 pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
533 pp_cxx_postfix_expression (pp, fun);
534 pp->enclosing_scope = saved_scope;
535 pp_cxx_left_paren (pp);
536 if (code == AGGR_INIT_EXPR)
538 aggr_init_expr_arg_iterator iter;
539 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
545 pp_cxx_expression (pp, arg);
546 if (more_aggr_init_expr_args_p (&iter))
547 pp_cxx_separate_with (pp, ',');
553 call_expr_arg_iterator iter;
554 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
560 pp_cxx_expression (pp, arg);
561 if (more_call_expr_args_p (&iter))
562 pp_cxx_separate_with (pp, ',');
566 pp_cxx_right_paren (pp);
568 if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
570 pp_cxx_separate_with (pp, ',');
571 pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t));
584 pp_cxx_primary_expression (pp, t);
587 case DYNAMIC_CAST_EXPR:
588 case STATIC_CAST_EXPR:
589 case REINTERPRET_CAST_EXPR:
590 case CONST_CAST_EXPR:
591 if (code == DYNAMIC_CAST_EXPR)
592 pp_cxx_ws_string (pp, "dynamic_cast");
593 else if (code == STATIC_CAST_EXPR)
594 pp_cxx_ws_string (pp, "static_cast");
595 else if (code == REINTERPRET_CAST_EXPR)
596 pp_cxx_ws_string (pp, "reinterpret_cast");
598 pp_cxx_ws_string (pp, "const_cast");
599 pp_cxx_begin_template_argument_list (pp);
600 pp_cxx_type_id (pp, TREE_TYPE (t));
601 pp_cxx_end_template_argument_list (pp);
603 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
607 case EMPTY_CLASS_EXPR:
608 pp_cxx_type_id (pp, TREE_TYPE (t));
614 pp_cxx_typeid_expression (pp, t);
617 case PSEUDO_DTOR_EXPR:
618 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
620 pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
621 pp_cxx_colon_colon (pp);
623 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
627 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
632 pp_c_postfix_expression (pp_c_base (pp), t);
638 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
639 ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
645 type-specifier-seq new-declarator(opt)
648 ptr-operator new-declarator(opt)
649 direct-new-declarator
651 direct-new-declarator
653 direct-new-declarator [ constant-expression ]
656 ( expression-list(opt) ) */
659 pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
661 enum tree_code code = TREE_CODE (t);
662 tree type = TREE_OPERAND (t, 1);
663 tree init = TREE_OPERAND (t, 2);
668 if (NEW_EXPR_USE_GLOBAL (t))
669 pp_cxx_colon_colon (pp);
670 pp_cxx_ws_string (pp, "new");
671 if (TREE_OPERAND (t, 0))
673 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
676 if (TREE_CODE (type) == ARRAY_REF)
677 type = build_cplus_array_type
678 (TREE_OPERAND (type, 0),
679 build_index_type (fold_build2_loc (input_location,
680 MINUS_EXPR, integer_type_node,
681 TREE_OPERAND (type, 1),
683 pp_cxx_type_id (pp, type);
687 if (TREE_CODE (init) == TREE_LIST)
688 pp_c_expression_list (pp_c_base (pp), init);
689 else if (init == void_zero_node)
690 ; /* OK, empty initializer list. */
692 pp_cxx_expression (pp, init);
698 pp_unsupported_tree (pp, t);
702 /* delete-expression:
703 ::(opt) delete cast-expression
704 ::(opt) delete [ ] cast-expression */
707 pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
709 enum tree_code code = TREE_CODE (t);
713 case VEC_DELETE_EXPR:
714 if (DELETE_EXPR_USE_GLOBAL (t))
715 pp_cxx_colon_colon (pp);
716 pp_cxx_ws_string (pp, "delete");
718 if (code == VEC_DELETE_EXPR
719 || DELETE_EXPR_USE_VEC (t))
721 pp_left_bracket (pp);
722 pp_right_bracket (pp);
725 pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
729 pp_unsupported_tree (pp, t);
737 unary-operator cast-expression
738 sizeof unary-expression
740 sizeof ... ( identifier )
744 unary-operator: one of
748 __alignof__ unary-expression
749 __alignof__ ( type-id ) */
752 pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
754 enum tree_code code = TREE_CODE (t);
759 pp_cxx_new_expression (pp, t);
763 case VEC_DELETE_EXPR:
764 pp_cxx_delete_expression (pp, t);
768 if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
770 pp_cxx_ws_string (pp, "sizeof");
771 pp_cxx_ws_string (pp, "...");
772 pp_cxx_whitespace (pp);
773 pp_cxx_left_paren (pp);
774 if (TYPE_P (TREE_OPERAND (t, 0)))
775 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
777 pp_unary_expression (pp, TREE_OPERAND (t, 0));
778 pp_cxx_right_paren (pp);
784 pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
785 pp_cxx_whitespace (pp);
786 if (TYPE_P (TREE_OPERAND (t, 0)))
788 pp_cxx_left_paren (pp);
789 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
790 pp_cxx_right_paren (pp);
793 pp_unary_expression (pp, TREE_OPERAND (t, 0));
797 pp_cxx_ws_string (pp, "@encode");
798 pp_cxx_whitespace (pp);
799 pp_cxx_left_paren (pp);
800 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
801 pp_cxx_right_paren (pp);
805 pp_cxx_ws_string (pp, "noexcept");
806 pp_cxx_whitespace (pp);
807 pp_cxx_left_paren (pp);
808 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
809 pp_cxx_right_paren (pp);
812 case UNARY_PLUS_EXPR:
814 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
818 pp_c_unary_expression (pp_c_base (pp), t);
825 ( type-id ) cast-expression */
828 pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
830 switch (TREE_CODE (t))
833 case IMPLICIT_CONV_EXPR:
834 pp_cxx_type_id (pp, TREE_TYPE (t));
835 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
839 pp_c_cast_expression (pp_c_base (pp), t);
846 pm-expression .* cast-expression
847 pm-expression ->* cast-expression */
850 pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
852 switch (TREE_CODE (t))
854 /* Handle unfortunate OFFSET_REF overloading here. */
856 if (TYPE_P (TREE_OPERAND (t, 0)))
858 pp_cxx_qualified_id (pp, t);
861 /* Else fall through. */
864 pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
865 if (TREE_CODE (t) == MEMBER_REF)
870 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
875 pp_cxx_cast_expression (pp, t);
880 /* multiplicative-expression:
882 multiplicative-expression * pm-expression
883 multiplicative-expression / pm-expression
884 multiplicative-expression % pm-expression */
887 pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
889 enum tree_code code = TREE_CODE (e);
895 pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
897 if (code == MULT_EXPR)
899 else if (code == TRUNC_DIV_EXPR)
904 pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
908 pp_cxx_pm_expression (pp, e);
913 /* conditional-expression:
914 logical-or-expression
915 logical-or-expression ? expression : assignment-expression */
918 pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
920 if (TREE_CODE (e) == COND_EXPR)
922 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
926 pp_cxx_expression (pp, TREE_OPERAND (e, 1));
928 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
931 pp_c_logical_or_expression (pp_c_base (pp), e);
934 /* Pretty-print a compound assignment operator token as indicated by T. */
937 pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
941 switch (TREE_CODE (t))
964 op = tree_code_name[TREE_CODE (t)];
968 pp_cxx_ws_string (pp, op);
972 /* assignment-expression:
973 conditional-expression
974 logical-or-expression assignment-operator assignment-expression
978 throw assignment-expression(opt)
980 assignment-operator: one of
981 = *= /= %= += -= >>= <<= &= ^= |= */
984 pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
986 switch (TREE_CODE (e))
990 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
994 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
998 pp_cxx_ws_string (pp, "throw");
999 if (TREE_OPERAND (e, 0))
1000 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
1004 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
1005 pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
1006 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
1010 pp_cxx_conditional_expression (pp, e);
1016 pp_cxx_expression (cxx_pretty_printer *pp, tree t)
1018 switch (TREE_CODE (t))
1024 pp_cxx_constant (pp, t);
1028 pp_cxx_unqualified_id (pp, t);
1036 pp_cxx_qualified_id (pp, t);
1040 t = OVL_CURRENT (t);
1048 case TEMPLATE_TYPE_PARM:
1049 case TEMPLATE_PARM_INDEX:
1050 case TEMPLATE_TEMPLATE_PARM:
1052 pp_cxx_primary_expression (pp, t);
1056 case DYNAMIC_CAST_EXPR:
1057 case STATIC_CAST_EXPR:
1058 case REINTERPRET_CAST_EXPR:
1059 case CONST_CAST_EXPR:
1063 case EMPTY_CLASS_EXPR:
1065 case PSEUDO_DTOR_EXPR:
1066 case AGGR_INIT_EXPR:
1068 pp_cxx_postfix_expression (pp, t);
1073 pp_cxx_new_expression (pp, t);
1077 case VEC_DELETE_EXPR:
1078 pp_cxx_delete_expression (pp, t);
1084 pp_cxx_unary_expression (pp, t);
1088 case IMPLICIT_CONV_EXPR:
1089 pp_cxx_cast_expression (pp, t);
1095 pp_cxx_pm_expression (pp, t);
1099 case TRUNC_DIV_EXPR:
1100 case TRUNC_MOD_EXPR:
1101 pp_cxx_multiplicative_expression (pp, t);
1105 pp_cxx_conditional_expression (pp, t);
1112 pp_cxx_assignment_expression (pp, t);
1115 case NON_DEPENDENT_EXPR:
1116 case MUST_NOT_THROW_EXPR:
1117 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
1120 case EXPR_PACK_EXPANSION:
1121 pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t));
1122 pp_cxx_ws_string (pp, "...");
1125 case TEMPLATE_ID_EXPR:
1126 pp_cxx_template_id (pp, t);
1129 case NONTYPE_ARGUMENT_PACK:
1131 tree args = ARGUMENT_PACK_ARGS (t);
1132 int i, len = TREE_VEC_LENGTH (args);
1133 for (i = 0; i < len; ++i)
1136 pp_cxx_separate_with (pp, ',');
1137 pp_cxx_expression (pp, TREE_VEC_ELT (args, i));
1143 pp_c_expression (pp_c_base (pp), t);
1151 /* function-specifier:
1157 pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
1159 switch (TREE_CODE (t))
1162 if (DECL_VIRTUAL_P (t))
1163 pp_cxx_ws_string (pp, "virtual");
1164 else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1165 pp_cxx_ws_string (pp, "explicit");
1167 pp_c_function_specifier (pp_c_base (pp), t);
1174 /* decl-specifier-seq:
1175 decl-specifier-seq(opt) decl-specifier
1178 storage-class-specifier
1185 pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
1187 switch (TREE_CODE (t))
1193 pp_cxx_storage_class_specifier (pp, t);
1194 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1198 pp_cxx_ws_string (pp, "typedef");
1199 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1203 /* Constructors don't have return types. And conversion functions
1204 do not have a type-specifier in their return types. */
1205 if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1206 pp_cxx_function_specifier (pp, t);
1207 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1208 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1211 pp_c_declaration_specifiers (pp_c_base (pp), t);
1216 /* simple-type-specifier:
1217 ::(opt) nested-name-specifier(opt) type-name
1218 ::(opt) nested-name-specifier(opt) template(opt) template-id
1232 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1234 switch (TREE_CODE (t))
1239 pp_cxx_qualified_id (pp, t);
1242 case TEMPLATE_TYPE_PARM:
1243 case TEMPLATE_TEMPLATE_PARM:
1244 case TEMPLATE_PARM_INDEX:
1245 pp_cxx_unqualified_id (pp, t);
1249 pp_cxx_ws_string (pp, "typename");
1250 pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1251 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1255 pp_c_type_specifier (pp_c_base (pp), t);
1260 /* type-specifier-seq:
1261 type-specifier type-specifier-seq(opt)
1264 simple-type-specifier
1267 elaborated-type-specifier
1271 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1273 switch (TREE_CODE (t))
1276 case TEMPLATE_TYPE_PARM:
1277 case TEMPLATE_TEMPLATE_PARM:
1279 case BOUND_TEMPLATE_TEMPLATE_PARM:
1280 pp_cxx_cv_qualifier_seq (pp, t);
1281 pp_cxx_simple_type_specifier (pp, t);
1285 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1286 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1287 pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1291 pp_cxx_ws_string (pp, "decltype");
1292 pp_cxx_left_paren (pp);
1293 pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1294 pp_cxx_right_paren (pp);
1298 if (TYPE_PTRMEMFUNC_P (t))
1300 tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1301 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1302 pp_cxx_whitespace (pp);
1303 pp_cxx_ptr_operator (pp, t);
1306 /* else fall through */
1309 if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1310 pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1315 * cv-qualifier-seq(opt)
1317 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1320 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1322 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1324 switch (TREE_CODE (t))
1326 case REFERENCE_TYPE:
1328 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
1329 || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
1330 pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1331 pp_c_attributes_display (pp_c_base (pp),
1332 TYPE_ATTRIBUTES (TREE_TYPE (t)));
1333 if (TREE_CODE (t) == POINTER_TYPE)
1336 pp_cxx_cv_qualifier_seq (pp, t);
1343 if (TYPE_PTRMEMFUNC_P (t))
1345 pp_cxx_left_paren (pp);
1346 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1351 if (TYPE_PTR_TO_MEMBER_P (t))
1353 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1354 pp_cxx_left_paren (pp);
1355 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1357 pp_cxx_cv_qualifier_seq (pp, t);
1360 /* else fall through. */
1363 pp_unsupported_tree (pp, t);
1369 pp_cxx_implicit_parameter_type (tree mf)
1371 return class_of_this_parm (TREE_TYPE (mf));
1375 parameter-declaration:
1376 decl-specifier-seq declarator
1377 decl-specifier-seq declarator = assignment-expression
1378 decl-specifier-seq abstract-declarator(opt)
1379 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1382 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1384 pp_cxx_decl_specifier_seq (pp, t);
1386 pp_cxx_abstract_declarator (pp, t);
1388 pp_cxx_declarator (pp, t);
1391 /* parameter-declaration-clause:
1392 parameter-declaration-list(opt) ...(opt)
1393 parameter-declaration-list , ...
1395 parameter-declaration-list:
1396 parameter-declaration
1397 parameter-declaration-list , parameter-declaration */
1400 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1402 tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1404 TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1405 const bool abstract = args == NULL
1406 || pp_c_base (pp)->flags & pp_c_flag_abstract;
1409 /* Skip artificial parameter for nonstatic member functions. */
1410 if (TREE_CODE (t) == METHOD_TYPE)
1411 types = TREE_CHAIN (types);
1413 pp_cxx_left_paren (pp);
1414 for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1417 pp_cxx_separate_with (pp, ',');
1419 pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1420 if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1422 pp_cxx_whitespace (pp);
1424 pp_cxx_whitespace (pp);
1425 pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1428 pp_cxx_right_paren (pp);
1431 /* exception-specification:
1432 throw ( type-id-list(opt) )
1436 type-id-list , type-id */
1439 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1441 tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1442 bool need_comma = false;
1444 if (ex_spec == NULL)
1446 if (TREE_PURPOSE (ex_spec))
1448 pp_cxx_ws_string (pp, "noexcept");
1449 pp_cxx_whitespace (pp);
1450 pp_cxx_left_paren (pp);
1451 if (DEFERRED_NOEXCEPT_SPEC_P (ex_spec))
1452 pp_cxx_ws_string (pp, "<uninstantiated>");
1454 pp_cxx_expression (pp, TREE_PURPOSE (ex_spec));
1455 pp_cxx_right_paren (pp);
1458 pp_cxx_ws_string (pp, "throw");
1459 pp_cxx_left_paren (pp);
1460 for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1462 tree type = TREE_VALUE (ex_spec);
1463 tree argpack = NULL_TREE;
1466 if (ARGUMENT_PACK_P (type))
1468 argpack = ARGUMENT_PACK_ARGS (type);
1469 len = TREE_VEC_LENGTH (argpack);
1472 for (i = 0; i < len; ++i)
1475 type = TREE_VEC_ELT (argpack, i);
1478 pp_cxx_separate_with (pp, ',');
1482 pp_cxx_type_id (pp, type);
1485 pp_cxx_right_paren (pp);
1488 /* direct-declarator:
1490 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1491 exception-specification(opt)
1492 direct-declaration [ constant-expression(opt) ]
1496 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1498 switch (TREE_CODE (t))
1506 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1508 if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1509 || template_parameter_pack_p (t))
1510 /* A function parameter pack or non-type template
1512 pp_cxx_ws_string (pp, "...");
1514 pp_cxx_id_expression (pp, DECL_NAME (t));
1516 pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1520 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1521 pp_cxx_id_expression (pp, t);
1522 pp_cxx_parameter_declaration_clause (pp, t);
1524 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1526 pp_base (pp)->padding = pp_before;
1527 pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1530 pp_cxx_exception_specification (pp, TREE_TYPE (t));
1535 case TEMPLATE_TYPE_PARM:
1536 case TEMPLATE_PARM_INDEX:
1537 case TEMPLATE_TEMPLATE_PARM:
1541 pp_c_direct_declarator (pp_c_base (pp), t);
1548 ptr-operator declarator */
1551 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1553 pp_cxx_direct_declarator (pp, t);
1556 /* ctor-initializer:
1557 : mem-initializer-list
1559 mem-initializer-list:
1561 mem-initializer , mem-initializer-list
1564 mem-initializer-id ( expression-list(opt) )
1567 ::(opt) nested-name-specifier(opt) class-name
1571 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1573 t = TREE_OPERAND (t, 0);
1574 pp_cxx_whitespace (pp);
1576 pp_cxx_whitespace (pp);
1577 for (; t; t = TREE_CHAIN (t))
1579 tree purpose = TREE_PURPOSE (t);
1580 bool is_pack = PACK_EXPANSION_P (purpose);
1583 pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1585 pp_cxx_primary_expression (pp, purpose);
1586 pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1588 pp_cxx_ws_string (pp, "...");
1590 pp_cxx_separate_with (pp, ',');
1594 /* function-definition:
1595 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1596 decl-specifier-seq(opt) declarator function-try-block */
1599 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1601 tree saved_scope = pp->enclosing_scope;
1602 pp_cxx_decl_specifier_seq (pp, t);
1603 pp_cxx_declarator (pp, t);
1604 pp_needs_newline (pp) = true;
1605 pp->enclosing_scope = DECL_CONTEXT (t);
1606 if (DECL_SAVED_TREE (t))
1607 pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1610 pp_cxx_semicolon (pp);
1611 pp_needs_newline (pp) = true;
1614 pp->enclosing_scope = saved_scope;
1617 /* abstract-declarator:
1618 ptr-operator abstract-declarator(opt)
1619 direct-abstract-declarator */
1622 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1624 if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t))
1625 pp_cxx_right_paren (pp);
1626 else if (POINTER_TYPE_P (t))
1628 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1629 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1630 pp_cxx_right_paren (pp);
1633 pp_cxx_direct_abstract_declarator (pp, t);
1636 /* direct-abstract-declarator:
1637 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1638 cv-qualifier-seq(opt) exception-specification(opt)
1639 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1640 ( abstract-declarator ) */
1643 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1645 switch (TREE_CODE (t))
1647 case REFERENCE_TYPE:
1648 pp_cxx_abstract_declarator (pp, t);
1652 if (TYPE_PTRMEMFUNC_P (t))
1653 pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1658 pp_cxx_parameter_declaration_clause (pp, t);
1659 pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1660 if (TREE_CODE (t) == METHOD_TYPE)
1662 pp_base (pp)->padding = pp_before;
1663 pp_cxx_cv_qualifier_seq (pp, class_of_this_parm (t));
1665 pp_cxx_exception_specification (pp, t);
1669 case TEMPLATE_TYPE_PARM:
1670 case TEMPLATE_TEMPLATE_PARM:
1671 case BOUND_TEMPLATE_TEMPLATE_PARM:
1672 case UNBOUND_CLASS_TEMPLATE:
1676 pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1682 type-specifier-seq abstract-declarator(opt) */
1685 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1687 pp_flags saved_flags = pp_c_base (pp)->flags;
1688 pp_c_base (pp)->flags |= pp_c_flag_abstract;
1690 switch (TREE_CODE (t))
1697 case BOUND_TEMPLATE_TEMPLATE_PARM:
1698 case UNBOUND_CLASS_TEMPLATE:
1699 case TEMPLATE_TEMPLATE_PARM:
1700 case TEMPLATE_TYPE_PARM:
1701 case TEMPLATE_PARM_INDEX:
1704 case UNDERLYING_TYPE:
1706 case TEMPLATE_ID_EXPR:
1707 pp_cxx_type_specifier_seq (pp, t);
1710 case TYPE_PACK_EXPANSION:
1711 pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1712 pp_cxx_ws_string (pp, "...");
1716 pp_c_type_id (pp_c_base (pp), t);
1720 pp_c_base (pp)->flags = saved_flags;
1723 /* template-argument-list:
1724 template-argument ...(opt)
1725 template-argument-list, template-argument ...(opt)
1728 assignment-expression
1733 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1736 bool need_comma = false;
1740 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1742 tree arg = TREE_VEC_ELT (t, i);
1743 tree argpack = NULL_TREE;
1746 if (ARGUMENT_PACK_P (arg))
1748 argpack = ARGUMENT_PACK_ARGS (arg);
1749 len = TREE_VEC_LENGTH (argpack);
1752 for (idx = 0; idx < len; idx++)
1755 arg = TREE_VEC_ELT (argpack, idx);
1758 pp_cxx_separate_with (pp, ',');
1762 if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1763 && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1764 pp_cxx_type_id (pp, arg);
1766 pp_cxx_expression (pp, arg);
1773 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1775 t = DECL_EXPR_DECL (t);
1776 pp_cxx_type_specifier_seq (pp, t);
1778 pp_cxx_abstract_declarator (pp, t);
1780 pp_cxx_declarator (pp, t);
1786 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1788 switch (TREE_CODE (t))
1790 case CTOR_INITIALIZER:
1791 pp_cxx_ctor_initializer (pp, t);
1795 pp_cxx_ws_string (pp, "using");
1796 pp_cxx_ws_string (pp, "namespace");
1797 if (DECL_CONTEXT (t))
1798 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1799 pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1803 pp_cxx_ws_string (pp, "using");
1804 pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1805 pp_cxx_unqualified_id (pp, DECL_NAME (t));
1812 try compound-statement handler-seq */
1814 pp_maybe_newline_and_indent (pp, 0);
1815 pp_cxx_ws_string (pp, "try");
1816 pp_newline_and_indent (pp, 3);
1817 pp_cxx_statement (pp, TRY_STMTS (t));
1818 pp_newline_and_indent (pp, -3);
1822 pp_cxx_statement (pp, TRY_HANDLERS (t));
1827 handler handler-seq(opt)
1830 catch ( exception-declaration ) compound-statement
1832 exception-declaration:
1833 type-specifier-seq declarator
1834 type-specifier-seq abstract-declarator
1837 pp_cxx_ws_string (pp, "catch");
1838 pp_cxx_left_paren (pp);
1839 pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1840 pp_cxx_right_paren (pp);
1841 pp_indentation (pp) += 3;
1842 pp_needs_newline (pp) = true;
1843 pp_cxx_statement (pp, HANDLER_BODY (t));
1844 pp_indentation (pp) -= 3;
1845 pp_needs_newline (pp) = true;
1848 /* selection-statement:
1849 if ( expression ) statement
1850 if ( expression ) statement else statement */
1852 pp_cxx_ws_string (pp, "if");
1853 pp_cxx_whitespace (pp);
1854 pp_cxx_left_paren (pp);
1855 pp_cxx_expression (pp, IF_COND (t));
1856 pp_cxx_right_paren (pp);
1857 pp_newline_and_indent (pp, 2);
1858 pp_cxx_statement (pp, THEN_CLAUSE (t));
1859 pp_newline_and_indent (pp, -2);
1860 if (ELSE_CLAUSE (t))
1862 tree else_clause = ELSE_CLAUSE (t);
1863 pp_cxx_ws_string (pp, "else");
1864 if (TREE_CODE (else_clause) == IF_STMT)
1865 pp_cxx_whitespace (pp);
1867 pp_newline_and_indent (pp, 2);
1868 pp_cxx_statement (pp, else_clause);
1869 if (TREE_CODE (else_clause) != IF_STMT)
1870 pp_newline_and_indent (pp, -2);
1875 pp_cxx_ws_string (pp, "switch");
1877 pp_cxx_left_paren (pp);
1878 pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1879 pp_cxx_right_paren (pp);
1880 pp_indentation (pp) += 3;
1881 pp_needs_newline (pp) = true;
1882 pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1883 pp_newline_and_indent (pp, -3);
1886 /* iteration-statement:
1887 while ( expression ) statement
1888 do statement while ( expression ) ;
1889 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1890 for ( declaration expression(opt) ; expression(opt) ) statement */
1892 pp_cxx_ws_string (pp, "while");
1894 pp_cxx_left_paren (pp);
1895 pp_cxx_expression (pp, WHILE_COND (t));
1896 pp_cxx_right_paren (pp);
1897 pp_newline_and_indent (pp, 3);
1898 pp_cxx_statement (pp, WHILE_BODY (t));
1899 pp_indentation (pp) -= 3;
1900 pp_needs_newline (pp) = true;
1904 pp_cxx_ws_string (pp, "do");
1905 pp_newline_and_indent (pp, 3);
1906 pp_cxx_statement (pp, DO_BODY (t));
1907 pp_newline_and_indent (pp, -3);
1908 pp_cxx_ws_string (pp, "while");
1910 pp_cxx_left_paren (pp);
1911 pp_cxx_expression (pp, DO_COND (t));
1912 pp_cxx_right_paren (pp);
1913 pp_cxx_semicolon (pp);
1914 pp_needs_newline (pp) = true;
1918 pp_cxx_ws_string (pp, "for");
1920 pp_cxx_left_paren (pp);
1921 if (FOR_INIT_STMT (t))
1922 pp_cxx_statement (pp, FOR_INIT_STMT (t));
1924 pp_cxx_semicolon (pp);
1925 pp_needs_newline (pp) = false;
1926 pp_cxx_whitespace (pp);
1928 pp_cxx_expression (pp, FOR_COND (t));
1929 pp_cxx_semicolon (pp);
1930 pp_needs_newline (pp) = false;
1931 pp_cxx_whitespace (pp);
1933 pp_cxx_expression (pp, FOR_EXPR (t));
1934 pp_cxx_right_paren (pp);
1935 pp_newline_and_indent (pp, 3);
1936 pp_cxx_statement (pp, FOR_BODY (t));
1937 pp_indentation (pp) -= 3;
1938 pp_needs_newline (pp) = true;
1941 case RANGE_FOR_STMT:
1942 pp_cxx_ws_string (pp, "for");
1944 pp_cxx_left_paren (pp);
1945 pp_cxx_statement (pp, RANGE_FOR_DECL (t));
1947 pp_needs_newline (pp) = false;
1950 pp_cxx_statement (pp, RANGE_FOR_EXPR (t));
1951 pp_cxx_right_paren (pp);
1952 pp_newline_and_indent (pp, 3);
1953 pp_cxx_statement (pp, FOR_BODY (t));
1954 pp_indentation (pp) -= 3;
1955 pp_needs_newline (pp) = true;
1961 return expression(opt) ; */
1964 pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1965 pp_cxx_semicolon (pp);
1966 pp_needs_newline (pp) = true;
1969 /* expression-statement:
1970 expression(opt) ; */
1972 pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1973 pp_cxx_semicolon (pp);
1974 pp_needs_newline (pp) = true;
1978 pp_cxx_ws_string (pp, "try");
1979 pp_newline_and_indent (pp, 2);
1980 pp_cxx_statement (pp, CLEANUP_BODY (t));
1981 pp_newline_and_indent (pp, -2);
1982 pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
1983 pp_newline_and_indent (pp, 2);
1984 pp_cxx_statement (pp, CLEANUP_EXPR (t));
1985 pp_newline_and_indent (pp, -2);
1989 pp_cxx_declaration (pp, t);
1993 pp_c_statement (pp_c_base (pp), t);
1998 /* original-namespace-definition:
1999 namespace identifier { namespace-body }
2001 As an edge case, we also handle unnamed namespace definition here. */
2004 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
2006 pp_cxx_ws_string (pp, "namespace");
2007 if (DECL_CONTEXT (t))
2008 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2010 pp_cxx_unqualified_id (pp, t);
2011 pp_cxx_whitespace (pp);
2012 pp_cxx_left_brace (pp);
2013 /* We do not print the namespace-body. */
2014 pp_cxx_whitespace (pp);
2015 pp_cxx_right_brace (pp);
2021 namespace-alias-definition:
2022 namespace identifier = qualified-namespace-specifier ;
2024 qualified-namespace-specifier:
2025 ::(opt) nested-name-specifier(opt) namespace-name */
2028 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
2030 pp_cxx_ws_string (pp, "namespace");
2031 if (DECL_CONTEXT (t))
2032 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2033 pp_cxx_unqualified_id (pp, t);
2034 pp_cxx_whitespace (pp);
2036 pp_cxx_whitespace (pp);
2037 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
2038 pp_cxx_nested_name_specifier (pp,
2039 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
2040 pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
2041 pp_cxx_semicolon (pp);
2044 /* simple-declaration:
2045 decl-specifier-seq(opt) init-declarator-list(opt) */
2048 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
2050 pp_cxx_decl_specifier_seq (pp, t);
2051 pp_cxx_init_declarator (pp, t);
2052 pp_cxx_semicolon (pp);
2053 pp_needs_newline (pp) = true;
2057 template-parameter-list:
2059 template-parameter-list , template-parameter */
2062 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2064 const int n = TREE_VEC_LENGTH (t);
2066 for (i = 0; i < n; ++i)
2069 pp_cxx_separate_with (pp, ',');
2070 pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2074 /* template-parameter:
2076 parameter-declaration
2079 class ...(opt) identifier(opt)
2080 class identifier(opt) = type-id
2081 typename identifier(opt)
2082 typename ...(opt) identifier(opt) = type-id
2083 template < template-parameter-list > class ...(opt) identifier(opt)
2084 template < template-parameter-list > class identifier(opt) = template-name */
2087 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2089 tree parameter = TREE_VALUE (t);
2090 switch (TREE_CODE (parameter))
2093 pp_cxx_ws_string (pp, "class");
2094 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2095 pp_cxx_ws_string (pp, "...");
2096 if (DECL_NAME (parameter))
2097 pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2098 /* FIXME: Check if we should print also default argument. */
2102 pp_cxx_parameter_declaration (pp, parameter);
2109 pp_unsupported_tree (pp, t);
2114 /* Pretty-print a template parameter in the canonical form
2115 "template-parameter-<level>-<position in parameter list>". */
2118 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2120 const enum tree_code code = TREE_CODE (parm);
2122 /* Brings type template parameters to the canonical forms. */
2123 if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2124 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2125 parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2127 pp_cxx_begin_template_argument_list (pp);
2128 pp_cxx_ws_string (pp, M_("template-parameter-"));
2129 pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2131 pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2132 pp_cxx_end_template_argument_list (pp);
2136 template-declaration:
2137 export(opt) template < template-parameter-list > declaration */
2140 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2142 tree tmpl = most_general_template (t);
2145 pp_maybe_newline_and_indent (pp, 0);
2146 for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2148 pp_cxx_ws_string (pp, "template");
2149 pp_cxx_begin_template_argument_list (pp);
2150 pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2151 pp_cxx_end_template_argument_list (pp);
2152 pp_newline_and_indent (pp, 3);
2154 if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2155 pp_cxx_function_definition (pp, t);
2157 pp_cxx_simple_declaration (pp, t);
2161 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2163 pp_unsupported_tree (pp, t);
2167 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2169 pp_unsupported_tree (pp, t);
2176 template-declaration
2177 explicit-instantiation
2178 explicit-specialization
2179 linkage-specification
2180 namespace-definition
2185 namespace-alias-definition
2188 static_assert-declaration */
2190 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2192 if (TREE_CODE (t) == STATIC_ASSERT)
2194 pp_cxx_ws_string (pp, "static_assert");
2195 pp_cxx_left_paren (pp);
2196 pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2197 pp_cxx_separate_with (pp, ',');
2198 pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2199 pp_cxx_right_paren (pp);
2201 else if (!DECL_LANG_SPECIFIC (t))
2202 pp_cxx_simple_declaration (pp, t);
2203 else if (DECL_USE_TEMPLATE (t))
2204 switch (DECL_USE_TEMPLATE (t))
2207 pp_cxx_template_declaration (pp, t);
2211 pp_cxx_explicit_specialization (pp, t);
2215 pp_cxx_explicit_instantiation (pp, t);
2221 else switch (TREE_CODE (t))
2225 pp_cxx_simple_declaration (pp, t);
2229 if (DECL_SAVED_TREE (t))
2230 pp_cxx_function_definition (pp, t);
2232 pp_cxx_simple_declaration (pp, t);
2235 case NAMESPACE_DECL:
2236 if (DECL_NAMESPACE_ALIAS (t))
2237 pp_cxx_namespace_alias_definition (pp, t);
2239 pp_cxx_original_namespace_definition (pp, t);
2243 pp_unsupported_tree (pp, t);
2249 pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2251 t = TREE_OPERAND (t, 0);
2252 pp_cxx_ws_string (pp, "typeid");
2253 pp_cxx_left_paren (pp);
2255 pp_cxx_type_id (pp, t);
2257 pp_cxx_expression (pp, t);
2258 pp_cxx_right_paren (pp);
2262 pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2264 pp_cxx_ws_string (pp, "va_arg");
2265 pp_cxx_left_paren (pp);
2266 pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2267 pp_cxx_separate_with (pp, ',');
2268 pp_cxx_type_id (pp, TREE_TYPE (t));
2269 pp_cxx_right_paren (pp);
2273 pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2275 switch (TREE_CODE (t))
2278 if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2279 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2281 pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2282 pp_cxx_separate_with (pp, ',');
2287 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2289 if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2291 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2294 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2296 pp_left_bracket (pp);
2297 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2298 pp_right_bracket (pp);
2306 pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2308 pp_cxx_ws_string (pp, "offsetof");
2309 pp_cxx_left_paren (pp);
2310 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2311 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2312 pp_cxx_right_paren (pp);
2316 pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2318 cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2322 case CPTK_HAS_NOTHROW_ASSIGN:
2323 pp_cxx_ws_string (pp, "__has_nothrow_assign");
2325 case CPTK_HAS_TRIVIAL_ASSIGN:
2326 pp_cxx_ws_string (pp, "__has_trivial_assign");
2328 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2329 pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2331 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2332 pp_cxx_ws_string (pp, "__has_trivial_constructor");
2334 case CPTK_HAS_NOTHROW_COPY:
2335 pp_cxx_ws_string (pp, "__has_nothrow_copy");
2337 case CPTK_HAS_TRIVIAL_COPY:
2338 pp_cxx_ws_string (pp, "__has_trivial_copy");
2340 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2341 pp_cxx_ws_string (pp, "__has_trivial_destructor");
2343 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2344 pp_cxx_ws_string (pp, "__has_virtual_destructor");
2346 case CPTK_IS_ABSTRACT:
2347 pp_cxx_ws_string (pp, "__is_abstract");
2349 case CPTK_IS_BASE_OF:
2350 pp_cxx_ws_string (pp, "__is_base_of");
2353 pp_cxx_ws_string (pp, "__is_class");
2355 case CPTK_IS_CONVERTIBLE_TO:
2356 pp_cxx_ws_string (pp, "__is_convertible_to");
2359 pp_cxx_ws_string (pp, "__is_empty");
2362 pp_cxx_ws_string (pp, "__is_enum");
2365 pp_cxx_ws_string (pp, "__is_pod");
2367 case CPTK_IS_POLYMORPHIC:
2368 pp_cxx_ws_string (pp, "__is_polymorphic");
2370 case CPTK_IS_STD_LAYOUT:
2371 pp_cxx_ws_string (pp, "__is_std_layout");
2373 case CPTK_IS_TRIVIAL:
2374 pp_cxx_ws_string (pp, "__is_trivial");
2377 pp_cxx_ws_string (pp, "__is_union");
2379 case CPTK_IS_LITERAL_TYPE:
2380 pp_cxx_ws_string (pp, "__is_literal_type");
2387 pp_cxx_left_paren (pp);
2388 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2390 if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2392 pp_cxx_separate_with (pp, ',');
2393 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2396 pp_cxx_right_paren (pp);
2399 typedef c_pretty_print_fn pp_fun;
2401 /* Initialization of a C++ pretty-printer object. */
2404 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2406 pp_c_pretty_printer_init (pp_c_base (pp));
2407 pp_set_line_maximum_length (pp, 0);
2409 pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2410 pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2411 pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2412 pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2413 pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2414 pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2415 pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2416 pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2417 pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2418 pp->c_base.direct_abstract_declarator =
2419 (pp_fun) pp_cxx_direct_abstract_declarator;
2420 pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2422 /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */
2424 pp->c_base.constant = (pp_fun) pp_cxx_constant;
2425 pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2426 pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2427 pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2428 pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2429 pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2430 pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2431 pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2432 pp->c_base.expression = (pp_fun) pp_cxx_expression;
2433 pp->enclosing_scope = global_namespace;