1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2 Copyright (C) 2003-2013 Free Software Foundation, Inc.
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
27 #include "cxx-pretty-print.h"
28 #include "tree-pretty-print.h"
30 /* Translate if being used for diagnostics, but not for dump files or
32 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
34 static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
35 static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
36 static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
37 static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
38 static void pp_cxx_expression (cxx_pretty_printer *, tree);
39 static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
40 static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
41 static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
42 static void pp_cxx_type_id (cxx_pretty_printer *, tree);
43 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
44 static void pp_cxx_declarator (cxx_pretty_printer *, tree);
45 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
46 static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
47 static void pp_cxx_statement (cxx_pretty_printer *, tree);
48 static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
49 static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
50 static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
54 pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
56 const char *p = pp_last_position_in_text (pp);
58 if (p != NULL && *p == c)
59 pp_cxx_whitespace (pp);
61 pp_base (pp)->padding = pp_none;
64 #define pp_cxx_storage_class_specifier(PP, T) \
65 pp_c_storage_class_specifier (pp_c_base (PP), T)
66 #define pp_cxx_expression_list(PP, T) \
67 pp_c_expression_list (pp_c_base (PP), T)
68 #define pp_cxx_space_for_pointer_operator(PP, T) \
69 pp_c_space_for_pointer_operator (pp_c_base (PP), T)
70 #define pp_cxx_init_declarator(PP, T) \
71 pp_c_init_declarator (pp_c_base (PP), T)
72 #define pp_cxx_call_argument_list(PP, T) \
73 pp_c_call_argument_list (pp_c_base (PP), T)
76 pp_cxx_colon_colon (cxx_pretty_printer *pp)
79 pp_base (pp)->padding = pp_none;
83 pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
85 pp_cxx_nonconsecutive_character (pp, '<');
89 pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
91 pp_cxx_nonconsecutive_character (pp, '>');
95 pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
97 pp_separate_with (pp, c);
98 pp_base (pp)->padding = pp_none;
104 is_destructor_name (tree name)
106 return name == complete_dtor_identifier
107 || name == base_dtor_identifier
108 || name == deleting_dtor_identifier;
111 /* conversion-function-id:
112 operator conversion-type-id
115 type-specifier-seq conversion-declarator(opt)
117 conversion-declarator:
118 ptr-operator conversion-declarator(opt) */
121 pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
123 pp_cxx_ws_string (pp, "operator");
124 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
128 pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
130 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
131 pp_cxx_begin_template_argument_list (pp);
132 pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
133 pp_cxx_end_template_argument_list (pp);
136 /* Prints the unqualified part of the id-expression T.
141 conversion-function-id
146 pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
148 enum tree_code code = TREE_CODE (t);
152 pp_cxx_ws_string (pp, M_("<return-value>"));
169 case IDENTIFIER_NODE:
171 pp_cxx_ws_string (pp, M_("<unnamed>"));
172 else if (IDENTIFIER_TYPENAME_P (t))
173 pp_cxx_conversion_function_id (pp, t);
176 if (is_destructor_name (t))
179 /* FIXME: Why is this necessary? */
181 t = constructor_name (TREE_TYPE (t));
183 pp_cxx_tree_identifier (pp, t);
187 case TEMPLATE_ID_EXPR:
188 pp_cxx_template_id (pp, t);
192 pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
199 case UNBOUND_CLASS_TEMPLATE:
200 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
201 if (CLASS_TYPE_P (t) && CLASSTYPE_USE_TEMPLATE (t))
203 pp_cxx_begin_template_argument_list (pp);
204 pp_cxx_template_argument_list (pp, INNERMOST_TEMPLATE_ARGS
205 (CLASSTYPE_TI_ARGS (t)));
206 pp_cxx_end_template_argument_list (pp);
211 pp_cxx_complement (pp);
212 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
215 case TEMPLATE_TYPE_PARM:
216 case TEMPLATE_TEMPLATE_PARM:
217 if (TYPE_IDENTIFIER (t))
218 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
220 pp_cxx_canonical_template_parameter (pp, t);
223 case TEMPLATE_PARM_INDEX:
224 pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
227 case BOUND_TEMPLATE_TEMPLATE_PARM:
228 pp_cxx_cv_qualifier_seq (pp, t);
229 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
230 pp_cxx_begin_template_argument_list (pp);
231 pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
232 pp_cxx_end_template_argument_list (pp);
236 pp_unsupported_tree (pp, t);
241 /* Pretty-print out the token sequence ":: template" in template codes
242 where it is needed to "inline declare" the (following) member as
243 a template. This situation arises when SCOPE of T is dependent
244 on template parameters. */
247 pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
249 if (TREE_CODE (t) == TEMPLATE_ID_EXPR
250 && TYPE_P (scope) && dependent_type_p (scope))
251 pp_cxx_ws_string (pp, "template");
254 /* nested-name-specifier:
255 class-or-namespace-name :: nested-name-specifier(opt)
256 class-or-namespace-name :: template nested-name-specifier */
259 pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
261 if (!SCOPE_FILE_SCOPE_P (t) && t != pp->enclosing_scope)
263 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
264 pp_cxx_nested_name_specifier (pp, scope);
265 pp_cxx_template_keyword_if_needed (pp, scope, t);
266 pp_cxx_unqualified_id (pp, t);
267 pp_cxx_colon_colon (pp);
272 nested-name-specifier template(opt) unqualified-id */
275 pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
277 switch (TREE_CODE (t))
279 /* A pointer-to-member is always qualified. */
281 pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
282 pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
285 /* In Standard C++, functions cannot possibly be used as
286 nested-name-specifiers. However, there are situations where
287 is "makes sense" to output the surrounding function name for the
288 purpose of emphasizing on the scope kind. Just printing the
289 function name might not be sufficient as it may be overloaded; so,
290 we decorate the function with its signature too.
291 FIXME: This is probably the wrong pretty-printing for conversion
292 functions and some function templates. */
296 if (DECL_FUNCTION_MEMBER_P (t))
297 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
298 pp_cxx_unqualified_id
299 (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
300 pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
305 pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
306 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
311 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
312 if (scope != pp->enclosing_scope)
314 pp_cxx_nested_name_specifier (pp, scope);
315 pp_cxx_template_keyword_if_needed (pp, scope, t);
317 pp_cxx_unqualified_id (pp, t);
325 pp_cxx_constant (cxx_pretty_printer *pp, tree t)
327 switch (TREE_CODE (t))
331 const bool in_parens = PAREN_STRING_LITERAL_P (t);
333 pp_cxx_left_paren (pp);
334 pp_c_constant (pp_c_base (pp), t);
336 pp_cxx_right_paren (pp);
341 if (NULLPTR_TYPE_P (TREE_TYPE (t)))
343 pp_string (pp, "nullptr");
346 /* else fall through. */
349 pp_c_constant (pp_c_base (pp), t);
359 pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
361 if (TREE_CODE (t) == OVERLOAD)
363 if (DECL_P (t) && DECL_CONTEXT (t))
364 pp_cxx_qualified_id (pp, t);
366 pp_cxx_unqualified_id (pp, t);
369 /* user-defined literal:
373 pp_cxx_userdef_literal (cxx_pretty_printer *pp, tree t)
375 pp_cxx_constant (pp, USERDEF_LITERAL_VALUE (t));
376 pp_cxx_id_expression (pp, USERDEF_LITERAL_SUFFIX_ID (t));
380 /* primary-expression:
384 :: operator-function-id
390 __builtin_va_arg ( assignment-expression , type-id )
391 __builtin_offsetof ( type-id, offsetof-expression )
393 __has_nothrow_assign ( type-id )
394 __has_nothrow_constructor ( type-id )
395 __has_nothrow_copy ( type-id )
396 __has_trivial_assign ( type-id )
397 __has_trivial_constructor ( type-id )
398 __has_trivial_copy ( type-id )
399 __has_trivial_destructor ( type-id )
400 __has_virtual_destructor ( type-id )
401 __is_abstract ( type-id )
402 __is_base_of ( type-id , type-id )
403 __is_class ( type-id )
404 __is_convertible_to ( type-id , type-id )
405 __is_empty ( type-id )
406 __is_enum ( type-id )
407 __is_literal_type ( type-id )
409 __is_polymorphic ( type-id )
410 __is_std_layout ( type-id )
411 __is_trivial ( type-id )
412 __is_union ( type-id ) */
415 pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
417 switch (TREE_CODE (t))
423 pp_cxx_constant (pp, t);
426 case USERDEF_LITERAL:
427 pp_cxx_userdef_literal (pp, t);
431 t = BASELINK_FUNCTIONS (t);
439 pp_cxx_id_expression (pp, t);
443 case TEMPLATE_TYPE_PARM:
444 case TEMPLATE_TEMPLATE_PARM:
445 case TEMPLATE_PARM_INDEX:
446 pp_cxx_unqualified_id (pp, t);
450 pp_cxx_left_paren (pp);
451 pp_cxx_statement (pp, STMT_EXPR_STMT (t));
452 pp_cxx_right_paren (pp);
456 pp_cxx_trait_expression (pp, t);
460 pp_cxx_va_arg_expression (pp, t);
464 pp_cxx_offsetof_expression (pp, t);
468 pp_c_primary_expression (pp_c_base (pp), t);
473 /* postfix-expression:
475 postfix-expression [ expression ]
476 postfix-expression ( expression-list(opt) )
477 simple-type-specifier ( expression-list(opt) )
478 typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
479 typename ::(opt) nested-name-specifier template(opt)
480 template-id ( expression-list(opt) )
481 postfix-expression . template(opt) ::(opt) id-expression
482 postfix-expression -> template(opt) ::(opt) id-expression
483 postfix-expression . pseudo-destructor-name
484 postfix-expression -> pseudo-destructor-name
485 postfix-expression ++
486 postfix-expression --
487 dynamic_cast < type-id > ( expression )
488 static_cast < type-id > ( expression )
489 reinterpret_cast < type-id > ( expression )
490 const_cast < type-id > ( expression )
491 typeid ( expression )
492 typeid ( type-id ) */
495 pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
497 enum tree_code code = TREE_CODE (t);
504 tree fun = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t)
506 tree saved_scope = pp->enclosing_scope;
507 bool skipfirst = false;
510 if (TREE_CODE (fun) == ADDR_EXPR)
511 fun = TREE_OPERAND (fun, 0);
513 /* In templates, where there is no way to tell whether a given
514 call uses an actual member function. So the parser builds
515 FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
516 instantiation time. */
517 if (TREE_CODE (fun) != FUNCTION_DECL)
519 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
521 tree object = (code == AGGR_INIT_EXPR
522 ? (AGGR_INIT_VIA_CTOR_P (t)
523 ? AGGR_INIT_EXPR_SLOT (t)
524 : AGGR_INIT_EXPR_ARG (t, 0))
525 : CALL_EXPR_ARG (t, 0));
527 while (TREE_CODE (object) == NOP_EXPR)
528 object = TREE_OPERAND (object, 0);
530 if (TREE_CODE (object) == ADDR_EXPR)
531 object = TREE_OPERAND (object, 0);
533 if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
535 pp_cxx_postfix_expression (pp, object);
540 pp_cxx_postfix_expression (pp, object);
544 pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
547 pp_cxx_postfix_expression (pp, fun);
548 pp->enclosing_scope = saved_scope;
549 pp_cxx_left_paren (pp);
550 if (code == AGGR_INIT_EXPR)
552 aggr_init_expr_arg_iterator iter;
553 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
559 pp_cxx_expression (pp, arg);
560 if (more_aggr_init_expr_args_p (&iter))
561 pp_cxx_separate_with (pp, ',');
567 call_expr_arg_iterator iter;
568 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
574 pp_cxx_expression (pp, arg);
575 if (more_call_expr_args_p (&iter))
576 pp_cxx_separate_with (pp, ',');
580 pp_cxx_right_paren (pp);
582 if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
584 pp_cxx_separate_with (pp, ',');
585 pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t));
598 pp_cxx_primary_expression (pp, t);
601 case DYNAMIC_CAST_EXPR:
602 case STATIC_CAST_EXPR:
603 case REINTERPRET_CAST_EXPR:
604 case CONST_CAST_EXPR:
605 if (code == DYNAMIC_CAST_EXPR)
606 pp_cxx_ws_string (pp, "dynamic_cast");
607 else if (code == STATIC_CAST_EXPR)
608 pp_cxx_ws_string (pp, "static_cast");
609 else if (code == REINTERPRET_CAST_EXPR)
610 pp_cxx_ws_string (pp, "reinterpret_cast");
612 pp_cxx_ws_string (pp, "const_cast");
613 pp_cxx_begin_template_argument_list (pp);
614 pp_cxx_type_id (pp, TREE_TYPE (t));
615 pp_cxx_end_template_argument_list (pp);
617 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
621 case EMPTY_CLASS_EXPR:
622 pp_cxx_type_id (pp, TREE_TYPE (t));
628 pp_cxx_typeid_expression (pp, t);
631 case PSEUDO_DTOR_EXPR:
632 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
634 pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
635 pp_cxx_colon_colon (pp);
637 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
641 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
646 pp_c_postfix_expression (pp_c_base (pp), t);
652 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
653 ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
659 type-specifier-seq new-declarator(opt)
662 ptr-operator new-declarator(opt)
663 direct-new-declarator
665 direct-new-declarator
667 direct-new-declarator [ constant-expression ]
670 ( expression-list(opt) ) */
673 pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
675 enum tree_code code = TREE_CODE (t);
676 tree type = TREE_OPERAND (t, 1);
677 tree init = TREE_OPERAND (t, 2);
682 if (NEW_EXPR_USE_GLOBAL (t))
683 pp_cxx_colon_colon (pp);
684 pp_cxx_ws_string (pp, "new");
685 if (TREE_OPERAND (t, 0))
687 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
690 if (TREE_CODE (type) == ARRAY_REF)
691 type = build_cplus_array_type
692 (TREE_OPERAND (type, 0),
693 build_index_type (fold_build2_loc (input_location,
694 MINUS_EXPR, integer_type_node,
695 TREE_OPERAND (type, 1),
697 pp_cxx_type_id (pp, type);
701 if (TREE_CODE (init) == TREE_LIST)
702 pp_c_expression_list (pp_c_base (pp), init);
703 else if (init == void_zero_node)
704 ; /* OK, empty initializer list. */
706 pp_cxx_expression (pp, init);
712 pp_unsupported_tree (pp, t);
716 /* delete-expression:
717 ::(opt) delete cast-expression
718 ::(opt) delete [ ] cast-expression */
721 pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
723 enum tree_code code = TREE_CODE (t);
727 case VEC_DELETE_EXPR:
728 if (DELETE_EXPR_USE_GLOBAL (t))
729 pp_cxx_colon_colon (pp);
730 pp_cxx_ws_string (pp, "delete");
732 if (code == VEC_DELETE_EXPR
733 || DELETE_EXPR_USE_VEC (t))
735 pp_left_bracket (pp);
736 pp_right_bracket (pp);
739 pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
743 pp_unsupported_tree (pp, t);
751 unary-operator cast-expression
752 sizeof unary-expression
754 sizeof ... ( identifier )
758 unary-operator: one of
762 __alignof__ unary-expression
763 __alignof__ ( type-id ) */
766 pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
768 enum tree_code code = TREE_CODE (t);
773 pp_cxx_new_expression (pp, t);
777 case VEC_DELETE_EXPR:
778 pp_cxx_delete_expression (pp, t);
782 if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
784 pp_cxx_ws_string (pp, "sizeof");
785 pp_cxx_ws_string (pp, "...");
786 pp_cxx_whitespace (pp);
787 pp_cxx_left_paren (pp);
788 if (TYPE_P (TREE_OPERAND (t, 0)))
789 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
791 pp_unary_expression (pp, TREE_OPERAND (t, 0));
792 pp_cxx_right_paren (pp);
798 pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
799 pp_cxx_whitespace (pp);
800 if (TREE_CODE (t) == SIZEOF_EXPR && SIZEOF_EXPR_TYPE_P (t))
802 pp_cxx_left_paren (pp);
803 pp_cxx_type_id (pp, TREE_TYPE (TREE_OPERAND (t, 0)));
804 pp_cxx_right_paren (pp);
806 else if (TYPE_P (TREE_OPERAND (t, 0)))
808 pp_cxx_left_paren (pp);
809 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
810 pp_cxx_right_paren (pp);
813 pp_unary_expression (pp, TREE_OPERAND (t, 0));
817 pp_cxx_ws_string (pp, "@encode");
818 pp_cxx_whitespace (pp);
819 pp_cxx_left_paren (pp);
820 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
821 pp_cxx_right_paren (pp);
825 pp_cxx_ws_string (pp, "noexcept");
826 pp_cxx_whitespace (pp);
827 pp_cxx_left_paren (pp);
828 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
829 pp_cxx_right_paren (pp);
832 case UNARY_PLUS_EXPR:
834 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
838 pp_c_unary_expression (pp_c_base (pp), t);
845 ( type-id ) cast-expression */
848 pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
850 switch (TREE_CODE (t))
853 case IMPLICIT_CONV_EXPR:
854 pp_cxx_type_id (pp, TREE_TYPE (t));
855 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
859 pp_c_cast_expression (pp_c_base (pp), t);
866 pm-expression .* cast-expression
867 pm-expression ->* cast-expression */
870 pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
872 switch (TREE_CODE (t))
874 /* Handle unfortunate OFFSET_REF overloading here. */
876 if (TYPE_P (TREE_OPERAND (t, 0)))
878 pp_cxx_qualified_id (pp, t);
881 /* Else fall through. */
884 pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
885 if (TREE_CODE (t) == MEMBER_REF)
890 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
895 pp_cxx_cast_expression (pp, t);
900 /* multiplicative-expression:
902 multiplicative-expression * pm-expression
903 multiplicative-expression / pm-expression
904 multiplicative-expression % pm-expression */
907 pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
909 enum tree_code code = TREE_CODE (e);
915 pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
917 if (code == MULT_EXPR)
919 else if (code == TRUNC_DIV_EXPR)
924 pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
928 pp_cxx_pm_expression (pp, e);
933 /* conditional-expression:
934 logical-or-expression
935 logical-or-expression ? expression : assignment-expression */
938 pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
940 if (TREE_CODE (e) == COND_EXPR)
942 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
946 pp_cxx_expression (pp, TREE_OPERAND (e, 1));
948 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
951 pp_c_logical_or_expression (pp_c_base (pp), e);
954 /* Pretty-print a compound assignment operator token as indicated by T. */
957 pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
961 switch (TREE_CODE (t))
984 op = tree_code_name[TREE_CODE (t)];
988 pp_cxx_ws_string (pp, op);
992 /* assignment-expression:
993 conditional-expression
994 logical-or-expression assignment-operator assignment-expression
998 throw assignment-expression(opt)
1000 assignment-operator: one of
1001 = *= /= %= += -= >>= <<= &= ^= |= */
1004 pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
1006 switch (TREE_CODE (e))
1010 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
1014 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
1018 pp_cxx_ws_string (pp, "throw");
1019 if (TREE_OPERAND (e, 0))
1020 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
1024 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
1025 pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
1026 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
1030 pp_cxx_conditional_expression (pp, e);
1036 pp_cxx_expression (cxx_pretty_printer *pp, tree t)
1038 switch (TREE_CODE (t))
1044 pp_cxx_constant (pp, t);
1047 case USERDEF_LITERAL:
1048 pp_cxx_userdef_literal (pp, t);
1052 pp_cxx_unqualified_id (pp, t);
1060 pp_cxx_qualified_id (pp, t);
1064 t = OVL_CURRENT (t);
1072 case TEMPLATE_TYPE_PARM:
1073 case TEMPLATE_PARM_INDEX:
1074 case TEMPLATE_TEMPLATE_PARM:
1076 pp_cxx_primary_expression (pp, t);
1080 case DYNAMIC_CAST_EXPR:
1081 case STATIC_CAST_EXPR:
1082 case REINTERPRET_CAST_EXPR:
1083 case CONST_CAST_EXPR:
1087 case EMPTY_CLASS_EXPR:
1089 case PSEUDO_DTOR_EXPR:
1090 case AGGR_INIT_EXPR:
1092 pp_cxx_postfix_expression (pp, t);
1097 pp_cxx_new_expression (pp, t);
1101 case VEC_DELETE_EXPR:
1102 pp_cxx_delete_expression (pp, t);
1108 pp_cxx_unary_expression (pp, t);
1112 case IMPLICIT_CONV_EXPR:
1113 pp_cxx_cast_expression (pp, t);
1119 pp_cxx_pm_expression (pp, t);
1123 case TRUNC_DIV_EXPR:
1124 case TRUNC_MOD_EXPR:
1125 pp_cxx_multiplicative_expression (pp, t);
1129 pp_cxx_conditional_expression (pp, t);
1136 pp_cxx_assignment_expression (pp, t);
1139 case NON_DEPENDENT_EXPR:
1140 case MUST_NOT_THROW_EXPR:
1141 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
1144 case EXPR_PACK_EXPANSION:
1145 pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t));
1146 pp_cxx_ws_string (pp, "...");
1149 case TEMPLATE_ID_EXPR:
1150 pp_cxx_template_id (pp, t);
1153 case NONTYPE_ARGUMENT_PACK:
1155 tree args = ARGUMENT_PACK_ARGS (t);
1156 int i, len = TREE_VEC_LENGTH (args);
1157 for (i = 0; i < len; ++i)
1160 pp_cxx_separate_with (pp, ',');
1161 pp_cxx_expression (pp, TREE_VEC_ELT (args, i));
1167 pp_cxx_ws_string (pp, "<lambda>");
1171 pp_c_expression (pp_c_base (pp), t);
1179 /* function-specifier:
1185 pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
1187 switch (TREE_CODE (t))
1190 if (DECL_VIRTUAL_P (t))
1191 pp_cxx_ws_string (pp, "virtual");
1192 else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1193 pp_cxx_ws_string (pp, "explicit");
1195 pp_c_function_specifier (pp_c_base (pp), t);
1202 /* decl-specifier-seq:
1203 decl-specifier-seq(opt) decl-specifier
1206 storage-class-specifier
1213 pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
1215 switch (TREE_CODE (t))
1221 pp_cxx_storage_class_specifier (pp, t);
1222 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1226 pp_cxx_ws_string (pp, "typedef");
1227 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1231 /* Constructors don't have return types. And conversion functions
1232 do not have a type-specifier in their return types. */
1233 if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1234 pp_cxx_function_specifier (pp, t);
1235 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1236 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1239 pp_c_declaration_specifiers (pp_c_base (pp), t);
1244 /* simple-type-specifier:
1245 ::(opt) nested-name-specifier(opt) type-name
1246 ::(opt) nested-name-specifier(opt) template(opt) template-id
1260 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1262 switch (TREE_CODE (t))
1267 pp_cxx_qualified_id (pp, t);
1270 case TEMPLATE_TYPE_PARM:
1271 case TEMPLATE_TEMPLATE_PARM:
1272 case TEMPLATE_PARM_INDEX:
1273 case BOUND_TEMPLATE_TEMPLATE_PARM:
1274 pp_cxx_unqualified_id (pp, t);
1278 pp_cxx_ws_string (pp, "typename");
1279 pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1280 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1284 pp_c_type_specifier (pp_c_base (pp), t);
1289 /* type-specifier-seq:
1290 type-specifier type-specifier-seq(opt)
1293 simple-type-specifier
1296 elaborated-type-specifier
1300 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1302 switch (TREE_CODE (t))
1305 case TEMPLATE_TYPE_PARM:
1306 case TEMPLATE_TEMPLATE_PARM:
1308 case BOUND_TEMPLATE_TEMPLATE_PARM:
1309 pp_cxx_cv_qualifier_seq (pp, t);
1310 pp_cxx_simple_type_specifier (pp, t);
1314 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1315 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1316 pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1320 pp_cxx_ws_string (pp, "decltype");
1321 pp_cxx_left_paren (pp);
1322 pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1323 pp_cxx_right_paren (pp);
1327 if (TYPE_PTRMEMFUNC_P (t))
1329 tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1330 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1331 pp_cxx_whitespace (pp);
1332 pp_cxx_ptr_operator (pp, t);
1335 /* else fall through */
1338 if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1339 pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1344 * cv-qualifier-seq(opt)
1346 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1349 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1351 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1353 switch (TREE_CODE (t))
1355 case REFERENCE_TYPE:
1357 if (TYPE_PTR_OR_PTRMEM_P (TREE_TYPE (t)))
1358 pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1359 pp_c_attributes_display (pp_c_base (pp),
1360 TYPE_ATTRIBUTES (TREE_TYPE (t)));
1361 if (TREE_CODE (t) == POINTER_TYPE)
1364 pp_cxx_cv_qualifier_seq (pp, t);
1371 if (TYPE_PTRMEMFUNC_P (t))
1373 pp_cxx_left_paren (pp);
1374 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1379 if (TYPE_PTRMEM_P (t))
1381 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1382 pp_cxx_left_paren (pp);
1383 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1385 pp_cxx_cv_qualifier_seq (pp, t);
1388 /* else fall through. */
1391 pp_unsupported_tree (pp, t);
1397 pp_cxx_implicit_parameter_type (tree mf)
1399 return class_of_this_parm (TREE_TYPE (mf));
1403 parameter-declaration:
1404 decl-specifier-seq declarator
1405 decl-specifier-seq declarator = assignment-expression
1406 decl-specifier-seq abstract-declarator(opt)
1407 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1410 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1412 pp_cxx_decl_specifier_seq (pp, t);
1414 pp_cxx_abstract_declarator (pp, t);
1416 pp_cxx_declarator (pp, t);
1419 /* parameter-declaration-clause:
1420 parameter-declaration-list(opt) ...(opt)
1421 parameter-declaration-list , ...
1423 parameter-declaration-list:
1424 parameter-declaration
1425 parameter-declaration-list , parameter-declaration */
1428 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1430 tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1432 TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1433 const bool abstract = args == NULL
1434 || pp_c_base (pp)->flags & pp_c_flag_abstract;
1437 /* Skip artificial parameter for nonstatic member functions. */
1438 if (TREE_CODE (t) == METHOD_TYPE)
1439 types = TREE_CHAIN (types);
1441 pp_cxx_left_paren (pp);
1442 for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1445 pp_cxx_separate_with (pp, ',');
1447 pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1448 if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1450 pp_cxx_whitespace (pp);
1452 pp_cxx_whitespace (pp);
1453 pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1456 pp_cxx_right_paren (pp);
1459 /* exception-specification:
1460 throw ( type-id-list(opt) )
1464 type-id-list , type-id */
1467 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1469 tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1470 bool need_comma = false;
1472 if (ex_spec == NULL)
1474 if (TREE_PURPOSE (ex_spec))
1476 pp_cxx_ws_string (pp, "noexcept");
1477 pp_cxx_whitespace (pp);
1478 pp_cxx_left_paren (pp);
1479 if (DEFERRED_NOEXCEPT_SPEC_P (ex_spec))
1480 pp_cxx_ws_string (pp, "<uninstantiated>");
1482 pp_cxx_expression (pp, TREE_PURPOSE (ex_spec));
1483 pp_cxx_right_paren (pp);
1486 pp_cxx_ws_string (pp, "throw");
1487 pp_cxx_left_paren (pp);
1488 for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1490 tree type = TREE_VALUE (ex_spec);
1491 tree argpack = NULL_TREE;
1494 if (ARGUMENT_PACK_P (type))
1496 argpack = ARGUMENT_PACK_ARGS (type);
1497 len = TREE_VEC_LENGTH (argpack);
1500 for (i = 0; i < len; ++i)
1503 type = TREE_VEC_ELT (argpack, i);
1506 pp_cxx_separate_with (pp, ',');
1510 pp_cxx_type_id (pp, type);
1513 pp_cxx_right_paren (pp);
1516 /* direct-declarator:
1518 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1519 exception-specification(opt)
1520 direct-declaration [ constant-expression(opt) ]
1524 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1526 switch (TREE_CODE (t))
1534 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1536 if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1537 || template_parameter_pack_p (t))
1538 /* A function parameter pack or non-type template
1540 pp_cxx_ws_string (pp, "...");
1542 pp_cxx_id_expression (pp, DECL_NAME (t));
1544 pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1548 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1549 pp_cxx_id_expression (pp, t);
1550 pp_cxx_parameter_declaration_clause (pp, t);
1552 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1554 pp_base (pp)->padding = pp_before;
1555 pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1558 pp_cxx_exception_specification (pp, TREE_TYPE (t));
1563 case TEMPLATE_TYPE_PARM:
1564 case TEMPLATE_PARM_INDEX:
1565 case TEMPLATE_TEMPLATE_PARM:
1569 pp_c_direct_declarator (pp_c_base (pp), t);
1576 ptr-operator declarator */
1579 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1581 pp_cxx_direct_declarator (pp, t);
1584 /* ctor-initializer:
1585 : mem-initializer-list
1587 mem-initializer-list:
1589 mem-initializer , mem-initializer-list
1592 mem-initializer-id ( expression-list(opt) )
1595 ::(opt) nested-name-specifier(opt) class-name
1599 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1601 t = TREE_OPERAND (t, 0);
1602 pp_cxx_whitespace (pp);
1604 pp_cxx_whitespace (pp);
1605 for (; t; t = TREE_CHAIN (t))
1607 tree purpose = TREE_PURPOSE (t);
1608 bool is_pack = PACK_EXPANSION_P (purpose);
1611 pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1613 pp_cxx_primary_expression (pp, purpose);
1614 pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1616 pp_cxx_ws_string (pp, "...");
1618 pp_cxx_separate_with (pp, ',');
1622 /* function-definition:
1623 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1624 decl-specifier-seq(opt) declarator function-try-block */
1627 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1629 tree saved_scope = pp->enclosing_scope;
1630 pp_cxx_decl_specifier_seq (pp, t);
1631 pp_cxx_declarator (pp, t);
1632 pp_needs_newline (pp) = true;
1633 pp->enclosing_scope = DECL_CONTEXT (t);
1634 if (DECL_SAVED_TREE (t))
1635 pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1637 pp_cxx_semicolon (pp);
1638 pp_newline_and_flush (pp);
1639 pp->enclosing_scope = saved_scope;
1642 /* abstract-declarator:
1643 ptr-operator abstract-declarator(opt)
1644 direct-abstract-declarator */
1647 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1649 if (TYPE_PTRMEM_P (t))
1650 pp_cxx_right_paren (pp);
1651 else if (POINTER_TYPE_P (t))
1653 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1654 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1655 pp_cxx_right_paren (pp);
1658 pp_cxx_direct_abstract_declarator (pp, t);
1661 /* direct-abstract-declarator:
1662 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1663 cv-qualifier-seq(opt) exception-specification(opt)
1664 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1665 ( abstract-declarator ) */
1668 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1670 switch (TREE_CODE (t))
1672 case REFERENCE_TYPE:
1673 pp_cxx_abstract_declarator (pp, t);
1677 if (TYPE_PTRMEMFUNC_P (t))
1678 pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1683 pp_cxx_parameter_declaration_clause (pp, t);
1684 pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1685 if (TREE_CODE (t) == METHOD_TYPE)
1687 pp_base (pp)->padding = pp_before;
1688 pp_cxx_cv_qualifier_seq (pp, class_of_this_parm (t));
1690 pp_cxx_exception_specification (pp, t);
1694 case TEMPLATE_TYPE_PARM:
1695 case TEMPLATE_TEMPLATE_PARM:
1696 case BOUND_TEMPLATE_TEMPLATE_PARM:
1697 case UNBOUND_CLASS_TEMPLATE:
1701 pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1707 type-specifier-seq abstract-declarator(opt) */
1710 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1712 pp_flags saved_flags = pp_c_base (pp)->flags;
1713 pp_c_base (pp)->flags |= pp_c_flag_abstract;
1715 switch (TREE_CODE (t))
1722 case BOUND_TEMPLATE_TEMPLATE_PARM:
1723 case UNBOUND_CLASS_TEMPLATE:
1724 case TEMPLATE_TEMPLATE_PARM:
1725 case TEMPLATE_TYPE_PARM:
1726 case TEMPLATE_PARM_INDEX:
1729 case UNDERLYING_TYPE:
1731 case TEMPLATE_ID_EXPR:
1732 pp_cxx_type_specifier_seq (pp, t);
1735 case TYPE_PACK_EXPANSION:
1736 pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1737 pp_cxx_ws_string (pp, "...");
1741 pp_c_type_id (pp_c_base (pp), t);
1745 pp_c_base (pp)->flags = saved_flags;
1748 /* template-argument-list:
1749 template-argument ...(opt)
1750 template-argument-list, template-argument ...(opt)
1753 assignment-expression
1758 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1761 bool need_comma = false;
1765 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1767 tree arg = TREE_VEC_ELT (t, i);
1768 tree argpack = NULL_TREE;
1771 if (ARGUMENT_PACK_P (arg))
1773 argpack = ARGUMENT_PACK_ARGS (arg);
1774 len = TREE_VEC_LENGTH (argpack);
1777 for (idx = 0; idx < len; idx++)
1780 arg = TREE_VEC_ELT (argpack, idx);
1783 pp_cxx_separate_with (pp, ',');
1787 if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1788 && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1789 pp_cxx_type_id (pp, arg);
1791 pp_cxx_expression (pp, arg);
1798 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1800 t = DECL_EXPR_DECL (t);
1801 pp_cxx_type_specifier_seq (pp, t);
1803 pp_cxx_abstract_declarator (pp, t);
1805 pp_cxx_declarator (pp, t);
1811 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1813 switch (TREE_CODE (t))
1815 case CTOR_INITIALIZER:
1816 pp_cxx_ctor_initializer (pp, t);
1820 pp_cxx_ws_string (pp, "using");
1821 pp_cxx_ws_string (pp, "namespace");
1822 if (DECL_CONTEXT (t))
1823 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1824 pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1828 pp_cxx_ws_string (pp, "using");
1829 pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1830 pp_cxx_unqualified_id (pp, DECL_NAME (t));
1837 try compound-statement handler-seq */
1839 pp_maybe_newline_and_indent (pp, 0);
1840 pp_cxx_ws_string (pp, "try");
1841 pp_newline_and_indent (pp, 3);
1842 pp_cxx_statement (pp, TRY_STMTS (t));
1843 pp_newline_and_indent (pp, -3);
1847 pp_cxx_statement (pp, TRY_HANDLERS (t));
1852 handler handler-seq(opt)
1855 catch ( exception-declaration ) compound-statement
1857 exception-declaration:
1858 type-specifier-seq declarator
1859 type-specifier-seq abstract-declarator
1862 pp_cxx_ws_string (pp, "catch");
1863 pp_cxx_left_paren (pp);
1864 pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1865 pp_cxx_right_paren (pp);
1866 pp_indentation (pp) += 3;
1867 pp_needs_newline (pp) = true;
1868 pp_cxx_statement (pp, HANDLER_BODY (t));
1869 pp_indentation (pp) -= 3;
1870 pp_needs_newline (pp) = true;
1873 /* selection-statement:
1874 if ( expression ) statement
1875 if ( expression ) statement else statement */
1877 pp_cxx_ws_string (pp, "if");
1878 pp_cxx_whitespace (pp);
1879 pp_cxx_left_paren (pp);
1880 pp_cxx_expression (pp, IF_COND (t));
1881 pp_cxx_right_paren (pp);
1882 pp_newline_and_indent (pp, 2);
1883 pp_cxx_statement (pp, THEN_CLAUSE (t));
1884 pp_newline_and_indent (pp, -2);
1885 if (ELSE_CLAUSE (t))
1887 tree else_clause = ELSE_CLAUSE (t);
1888 pp_cxx_ws_string (pp, "else");
1889 if (TREE_CODE (else_clause) == IF_STMT)
1890 pp_cxx_whitespace (pp);
1892 pp_newline_and_indent (pp, 2);
1893 pp_cxx_statement (pp, else_clause);
1894 if (TREE_CODE (else_clause) != IF_STMT)
1895 pp_newline_and_indent (pp, -2);
1900 pp_cxx_ws_string (pp, "switch");
1902 pp_cxx_left_paren (pp);
1903 pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1904 pp_cxx_right_paren (pp);
1905 pp_indentation (pp) += 3;
1906 pp_needs_newline (pp) = true;
1907 pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1908 pp_newline_and_indent (pp, -3);
1911 /* iteration-statement:
1912 while ( expression ) statement
1913 do statement while ( expression ) ;
1914 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1915 for ( declaration expression(opt) ; expression(opt) ) statement */
1917 pp_cxx_ws_string (pp, "while");
1919 pp_cxx_left_paren (pp);
1920 pp_cxx_expression (pp, WHILE_COND (t));
1921 pp_cxx_right_paren (pp);
1922 pp_newline_and_indent (pp, 3);
1923 pp_cxx_statement (pp, WHILE_BODY (t));
1924 pp_indentation (pp) -= 3;
1925 pp_needs_newline (pp) = true;
1929 pp_cxx_ws_string (pp, "do");
1930 pp_newline_and_indent (pp, 3);
1931 pp_cxx_statement (pp, DO_BODY (t));
1932 pp_newline_and_indent (pp, -3);
1933 pp_cxx_ws_string (pp, "while");
1935 pp_cxx_left_paren (pp);
1936 pp_cxx_expression (pp, DO_COND (t));
1937 pp_cxx_right_paren (pp);
1938 pp_cxx_semicolon (pp);
1939 pp_needs_newline (pp) = true;
1943 pp_cxx_ws_string (pp, "for");
1945 pp_cxx_left_paren (pp);
1946 if (FOR_INIT_STMT (t))
1947 pp_cxx_statement (pp, FOR_INIT_STMT (t));
1949 pp_cxx_semicolon (pp);
1950 pp_needs_newline (pp) = false;
1951 pp_cxx_whitespace (pp);
1953 pp_cxx_expression (pp, FOR_COND (t));
1954 pp_cxx_semicolon (pp);
1955 pp_needs_newline (pp) = false;
1956 pp_cxx_whitespace (pp);
1958 pp_cxx_expression (pp, FOR_EXPR (t));
1959 pp_cxx_right_paren (pp);
1960 pp_newline_and_indent (pp, 3);
1961 pp_cxx_statement (pp, FOR_BODY (t));
1962 pp_indentation (pp) -= 3;
1963 pp_needs_newline (pp) = true;
1966 case RANGE_FOR_STMT:
1967 pp_cxx_ws_string (pp, "for");
1969 pp_cxx_left_paren (pp);
1970 pp_cxx_statement (pp, RANGE_FOR_DECL (t));
1972 pp_needs_newline (pp) = false;
1975 pp_cxx_statement (pp, RANGE_FOR_EXPR (t));
1976 pp_cxx_right_paren (pp);
1977 pp_newline_and_indent (pp, 3);
1978 pp_cxx_statement (pp, FOR_BODY (t));
1979 pp_indentation (pp) -= 3;
1980 pp_needs_newline (pp) = true;
1986 return expression(opt) ; */
1989 pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1990 pp_cxx_semicolon (pp);
1991 pp_needs_newline (pp) = true;
1994 /* expression-statement:
1995 expression(opt) ; */
1997 pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1998 pp_cxx_semicolon (pp);
1999 pp_needs_newline (pp) = true;
2003 pp_cxx_ws_string (pp, "try");
2004 pp_newline_and_indent (pp, 2);
2005 pp_cxx_statement (pp, CLEANUP_BODY (t));
2006 pp_newline_and_indent (pp, -2);
2007 pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
2008 pp_newline_and_indent (pp, 2);
2009 pp_cxx_statement (pp, CLEANUP_EXPR (t));
2010 pp_newline_and_indent (pp, -2);
2014 pp_cxx_declaration (pp, t);
2018 pp_c_statement (pp_c_base (pp), t);
2023 /* original-namespace-definition:
2024 namespace identifier { namespace-body }
2026 As an edge case, we also handle unnamed namespace definition here. */
2029 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
2031 pp_cxx_ws_string (pp, "namespace");
2032 if (DECL_CONTEXT (t))
2033 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2035 pp_cxx_unqualified_id (pp, t);
2036 pp_cxx_whitespace (pp);
2037 pp_cxx_left_brace (pp);
2038 /* We do not print the namespace-body. */
2039 pp_cxx_whitespace (pp);
2040 pp_cxx_right_brace (pp);
2046 namespace-alias-definition:
2047 namespace identifier = qualified-namespace-specifier ;
2049 qualified-namespace-specifier:
2050 ::(opt) nested-name-specifier(opt) namespace-name */
2053 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
2055 pp_cxx_ws_string (pp, "namespace");
2056 if (DECL_CONTEXT (t))
2057 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2058 pp_cxx_unqualified_id (pp, t);
2059 pp_cxx_whitespace (pp);
2061 pp_cxx_whitespace (pp);
2062 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
2063 pp_cxx_nested_name_specifier (pp,
2064 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
2065 pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
2066 pp_cxx_semicolon (pp);
2069 /* simple-declaration:
2070 decl-specifier-seq(opt) init-declarator-list(opt) */
2073 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
2075 pp_cxx_decl_specifier_seq (pp, t);
2076 pp_cxx_init_declarator (pp, t);
2077 pp_cxx_semicolon (pp);
2078 pp_needs_newline (pp) = true;
2082 template-parameter-list:
2084 template-parameter-list , template-parameter */
2087 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2089 const int n = TREE_VEC_LENGTH (t);
2091 for (i = 0; i < n; ++i)
2094 pp_cxx_separate_with (pp, ',');
2095 pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2099 /* template-parameter:
2101 parameter-declaration
2104 class ...(opt) identifier(opt)
2105 class identifier(opt) = type-id
2106 typename identifier(opt)
2107 typename ...(opt) identifier(opt) = type-id
2108 template < template-parameter-list > class ...(opt) identifier(opt)
2109 template < template-parameter-list > class identifier(opt) = template-name */
2112 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2114 tree parameter = TREE_VALUE (t);
2115 switch (TREE_CODE (parameter))
2118 pp_cxx_ws_string (pp, "class");
2119 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2120 pp_cxx_ws_string (pp, "...");
2121 if (DECL_NAME (parameter))
2122 pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2123 /* FIXME: Check if we should print also default argument. */
2127 pp_cxx_parameter_declaration (pp, parameter);
2134 pp_unsupported_tree (pp, t);
2139 /* Pretty-print a template parameter in the canonical form
2140 "template-parameter-<level>-<position in parameter list>". */
2143 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2145 const enum tree_code code = TREE_CODE (parm);
2147 /* Brings type template parameters to the canonical forms. */
2148 if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2149 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2150 parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2152 pp_cxx_begin_template_argument_list (pp);
2153 pp_cxx_ws_string (pp, M_("template-parameter-"));
2154 pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2156 pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2157 pp_cxx_end_template_argument_list (pp);
2161 template-declaration:
2162 export(opt) template < template-parameter-list > declaration */
2165 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2167 tree tmpl = most_general_template (t);
2170 pp_maybe_newline_and_indent (pp, 0);
2171 for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2173 pp_cxx_ws_string (pp, "template");
2174 pp_cxx_begin_template_argument_list (pp);
2175 pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2176 pp_cxx_end_template_argument_list (pp);
2177 pp_newline_and_indent (pp, 3);
2179 if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2180 pp_cxx_function_definition (pp, t);
2182 pp_cxx_simple_declaration (pp, t);
2186 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2188 pp_unsupported_tree (pp, t);
2192 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2194 pp_unsupported_tree (pp, t);
2201 template-declaration
2202 explicit-instantiation
2203 explicit-specialization
2204 linkage-specification
2205 namespace-definition
2210 namespace-alias-definition
2213 static_assert-declaration */
2215 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2217 if (TREE_CODE (t) == STATIC_ASSERT)
2219 pp_cxx_ws_string (pp, "static_assert");
2220 pp_cxx_left_paren (pp);
2221 pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2222 pp_cxx_separate_with (pp, ',');
2223 pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2224 pp_cxx_right_paren (pp);
2226 else if (!DECL_LANG_SPECIFIC (t))
2227 pp_cxx_simple_declaration (pp, t);
2228 else if (DECL_USE_TEMPLATE (t))
2229 switch (DECL_USE_TEMPLATE (t))
2232 pp_cxx_template_declaration (pp, t);
2236 pp_cxx_explicit_specialization (pp, t);
2240 pp_cxx_explicit_instantiation (pp, t);
2246 else switch (TREE_CODE (t))
2250 pp_cxx_simple_declaration (pp, t);
2254 if (DECL_SAVED_TREE (t))
2255 pp_cxx_function_definition (pp, t);
2257 pp_cxx_simple_declaration (pp, t);
2260 case NAMESPACE_DECL:
2261 if (DECL_NAMESPACE_ALIAS (t))
2262 pp_cxx_namespace_alias_definition (pp, t);
2264 pp_cxx_original_namespace_definition (pp, t);
2268 pp_unsupported_tree (pp, t);
2274 pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2276 t = TREE_OPERAND (t, 0);
2277 pp_cxx_ws_string (pp, "typeid");
2278 pp_cxx_left_paren (pp);
2280 pp_cxx_type_id (pp, t);
2282 pp_cxx_expression (pp, t);
2283 pp_cxx_right_paren (pp);
2287 pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2289 pp_cxx_ws_string (pp, "va_arg");
2290 pp_cxx_left_paren (pp);
2291 pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2292 pp_cxx_separate_with (pp, ',');
2293 pp_cxx_type_id (pp, TREE_TYPE (t));
2294 pp_cxx_right_paren (pp);
2298 pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2300 switch (TREE_CODE (t))
2303 if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2304 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2306 pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2307 pp_cxx_separate_with (pp, ',');
2312 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2314 if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2316 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2319 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2321 pp_left_bracket (pp);
2322 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2323 pp_right_bracket (pp);
2331 pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2333 pp_cxx_ws_string (pp, "offsetof");
2334 pp_cxx_left_paren (pp);
2335 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2336 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2337 pp_cxx_right_paren (pp);
2341 pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2343 cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2347 case CPTK_HAS_NOTHROW_ASSIGN:
2348 pp_cxx_ws_string (pp, "__has_nothrow_assign");
2350 case CPTK_HAS_TRIVIAL_ASSIGN:
2351 pp_cxx_ws_string (pp, "__has_trivial_assign");
2353 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2354 pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2356 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2357 pp_cxx_ws_string (pp, "__has_trivial_constructor");
2359 case CPTK_HAS_NOTHROW_COPY:
2360 pp_cxx_ws_string (pp, "__has_nothrow_copy");
2362 case CPTK_HAS_TRIVIAL_COPY:
2363 pp_cxx_ws_string (pp, "__has_trivial_copy");
2365 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2366 pp_cxx_ws_string (pp, "__has_trivial_destructor");
2368 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2369 pp_cxx_ws_string (pp, "__has_virtual_destructor");
2371 case CPTK_IS_ABSTRACT:
2372 pp_cxx_ws_string (pp, "__is_abstract");
2374 case CPTK_IS_BASE_OF:
2375 pp_cxx_ws_string (pp, "__is_base_of");
2378 pp_cxx_ws_string (pp, "__is_class");
2380 case CPTK_IS_CONVERTIBLE_TO:
2381 pp_cxx_ws_string (pp, "__is_convertible_to");
2384 pp_cxx_ws_string (pp, "__is_empty");
2387 pp_cxx_ws_string (pp, "__is_enum");
2390 pp_cxx_ws_string (pp, "__is_final");
2393 pp_cxx_ws_string (pp, "__is_pod");
2395 case CPTK_IS_POLYMORPHIC:
2396 pp_cxx_ws_string (pp, "__is_polymorphic");
2398 case CPTK_IS_STD_LAYOUT:
2399 pp_cxx_ws_string (pp, "__is_std_layout");
2401 case CPTK_IS_TRIVIAL:
2402 pp_cxx_ws_string (pp, "__is_trivial");
2405 pp_cxx_ws_string (pp, "__is_union");
2407 case CPTK_IS_LITERAL_TYPE:
2408 pp_cxx_ws_string (pp, "__is_literal_type");
2415 pp_cxx_left_paren (pp);
2416 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2418 if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2420 pp_cxx_separate_with (pp, ',');
2421 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2424 pp_cxx_right_paren (pp);
2427 typedef c_pretty_print_fn pp_fun;
2429 /* Initialization of a C++ pretty-printer object. */
2432 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2434 pp_c_pretty_printer_init (pp_c_base (pp));
2435 pp_set_line_maximum_length (pp, 0);
2437 pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2438 pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2439 pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2440 pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2441 pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2442 pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2443 pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2444 pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2445 pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2446 pp->c_base.direct_abstract_declarator =
2447 (pp_fun) pp_cxx_direct_abstract_declarator;
2448 pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2450 /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */
2452 pp->c_base.constant = (pp_fun) pp_cxx_constant;
2453 pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2454 pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2455 pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2456 pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2457 pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2458 pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2459 pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2460 pp->c_base.expression = (pp_fun) pp_cxx_expression;
2461 pp->enclosing_scope = global_namespace;