1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2 Copyright (C) 2003, 2004, 2005, 2007, 2008,
3 2009 Free Software Foundation, Inc.
4 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
28 #include "cxx-pretty-print.h"
32 /* Translate if being used for diagnostics, but not for dump files or
34 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
36 static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
37 static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
38 static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
39 static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
40 static void pp_cxx_expression (cxx_pretty_printer *, tree);
41 static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
42 static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
43 static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
44 static void pp_cxx_type_id (cxx_pretty_printer *, tree);
45 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
46 static void pp_cxx_declarator (cxx_pretty_printer *, tree);
47 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
48 static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
49 static void pp_cxx_statement (cxx_pretty_printer *, tree);
50 static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
51 static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
52 static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
56 pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
58 const char *p = pp_last_position_in_text (pp);
60 if (p != NULL && *p == c)
61 pp_cxx_whitespace (pp);
63 pp_base (pp)->padding = pp_none;
66 #define pp_cxx_storage_class_specifier(PP, T) \
67 pp_c_storage_class_specifier (pp_c_base (PP), T)
68 #define pp_cxx_expression_list(PP, T) \
69 pp_c_expression_list (pp_c_base (PP), T)
70 #define pp_cxx_space_for_pointer_operator(PP, T) \
71 pp_c_space_for_pointer_operator (pp_c_base (PP), T)
72 #define pp_cxx_init_declarator(PP, T) \
73 pp_c_init_declarator (pp_c_base (PP), T)
74 #define pp_cxx_call_argument_list(PP, T) \
75 pp_c_call_argument_list (pp_c_base (PP), T)
78 pp_cxx_colon_colon (cxx_pretty_printer *pp)
81 pp_base (pp)->padding = pp_none;
85 pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
87 pp_cxx_nonconsecutive_character (pp, '<');
91 pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
93 pp_cxx_nonconsecutive_character (pp, '>');
97 pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
99 pp_separate_with (pp, c);
100 pp_base (pp)->padding = pp_none;
106 is_destructor_name (tree name)
108 return name == complete_dtor_identifier
109 || name == base_dtor_identifier
110 || name == deleting_dtor_identifier;
113 /* conversion-function-id:
114 operator conversion-type-id
117 type-specifier-seq conversion-declarator(opt)
119 conversion-declarator:
120 ptr-operator conversion-declarator(opt) */
123 pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
125 pp_cxx_ws_string (pp, "operator");
126 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
130 pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
132 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
133 pp_cxx_begin_template_argument_list (pp);
134 pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
135 pp_cxx_end_template_argument_list (pp);
138 /* Prints the unqualified part of the id-expression T.
143 conversion-function-id
148 pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
150 enum tree_code code = TREE_CODE (t);
154 pp_cxx_ws_string (pp, M_("<return-value>"));
171 case IDENTIFIER_NODE:
173 pp_cxx_ws_string (pp, M_("<unnamed>"));
174 else if (IDENTIFIER_TYPENAME_P (t))
175 pp_cxx_conversion_function_id (pp, t);
178 if (is_destructor_name (t))
181 /* FIXME: Why is this necessary? */
183 t = constructor_name (TREE_TYPE (t));
185 pp_cxx_tree_identifier (pp, t);
189 case TEMPLATE_ID_EXPR:
190 pp_cxx_template_id (pp, t);
194 pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
201 case UNBOUND_CLASS_TEMPLATE:
202 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
203 if (CLASS_TYPE_P (t) && CLASSTYPE_USE_TEMPLATE (t))
205 pp_cxx_begin_template_argument_list (pp);
206 pp_cxx_template_argument_list (pp, 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 (t != NULL && 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 pp_c_constant (pp_c_base (pp), t);
352 pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
354 if (TREE_CODE (t) == OVERLOAD)
356 if (DECL_P (t) && DECL_CONTEXT (t))
357 pp_cxx_qualified_id (pp, t);
359 pp_cxx_unqualified_id (pp, t);
362 /* primary-expression:
366 :: operator-function-id
372 __builtin_va_arg ( assignment-expression , type-id )
373 __builtin_offsetof ( type-id, offsetof-expression )
375 __has_nothrow_assign ( type-id )
376 __has_nothrow_constructor ( type-id )
377 __has_nothrow_copy ( type-id )
378 __has_trivial_assign ( type-id )
379 __has_trivial_constructor ( type-id )
380 __has_trivial_copy ( type-id )
381 __has_trivial_destructor ( type-id )
382 __has_virtual_destructor ( type-id )
383 __is_abstract ( type-id )
384 __is_base_of ( type-id , type-id )
385 __is_class ( type-id )
386 __is_convertible_to ( type-id , type-id )
387 __is_empty ( type-id )
388 __is_enum ( type-id )
390 __is_polymorphic ( type-id )
391 __is_union ( type-id ) */
394 pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
396 switch (TREE_CODE (t))
402 pp_cxx_constant (pp, t);
406 t = BASELINK_FUNCTIONS (t);
414 pp_cxx_id_expression (pp, t);
418 case TEMPLATE_TYPE_PARM:
419 case TEMPLATE_TEMPLATE_PARM:
420 case TEMPLATE_PARM_INDEX:
421 pp_cxx_unqualified_id (pp, t);
425 pp_cxx_left_paren (pp);
426 pp_cxx_statement (pp, STMT_EXPR_STMT (t));
427 pp_cxx_right_paren (pp);
431 pp_cxx_trait_expression (pp, t);
435 pp_cxx_va_arg_expression (pp, t);
439 pp_cxx_offsetof_expression (pp, t);
443 pp_c_primary_expression (pp_c_base (pp), t);
448 /* postfix-expression:
450 postfix-expression [ expression ]
451 postfix-expression ( expression-list(opt) )
452 simple-type-specifier ( expression-list(opt) )
453 typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
454 typename ::(opt) nested-name-specifier template(opt)
455 template-id ( expression-list(opt) )
456 postfix-expression . template(opt) ::(opt) id-expression
457 postfix-expression -> template(opt) ::(opt) id-expression
458 postfix-expression . pseudo-destructor-name
459 postfix-expression -> pseudo-destructor-name
460 postfix-expression ++
461 postfix-expression --
462 dynamic_cast < type-id > ( expression )
463 static_cast < type-id > ( expression )
464 reinterpret_cast < type-id > ( expression )
465 const_cast < type-id > ( expression )
466 typeid ( expression )
467 typeid ( type-id ) */
470 pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
472 enum tree_code code = TREE_CODE (t);
479 tree fun = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t)
481 tree saved_scope = pp->enclosing_scope;
482 bool skipfirst = false;
485 if (TREE_CODE (fun) == ADDR_EXPR)
486 fun = TREE_OPERAND (fun, 0);
488 /* In templates, where there is no way to tell whether a given
489 call uses an actual member function. So the parser builds
490 FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
491 instantiation time. */
492 if (TREE_CODE (fun) != FUNCTION_DECL)
494 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
496 tree object = (code == AGGR_INIT_EXPR
497 ? (AGGR_INIT_VIA_CTOR_P (t)
498 ? AGGR_INIT_EXPR_SLOT (t)
499 : AGGR_INIT_EXPR_ARG (t, 0))
500 : CALL_EXPR_ARG (t, 0));
502 while (TREE_CODE (object) == NOP_EXPR)
503 object = TREE_OPERAND (object, 0);
505 if (TREE_CODE (object) == ADDR_EXPR)
506 object = TREE_OPERAND (object, 0);
508 if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
510 pp_cxx_postfix_expression (pp, object);
515 pp_cxx_postfix_expression (pp, object);
519 pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
522 pp_cxx_postfix_expression (pp, fun);
523 pp->enclosing_scope = saved_scope;
524 pp_cxx_left_paren (pp);
525 if (code == AGGR_INIT_EXPR)
527 aggr_init_expr_arg_iterator iter;
528 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
534 pp_cxx_expression (pp, arg);
535 if (more_aggr_init_expr_args_p (&iter))
536 pp_cxx_separate_with (pp, ',');
542 call_expr_arg_iterator iter;
543 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
549 pp_cxx_expression (pp, arg);
550 if (more_call_expr_args_p (&iter))
551 pp_cxx_separate_with (pp, ',');
555 pp_cxx_right_paren (pp);
557 if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
559 pp_cxx_separate_with (pp, ',');
560 pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t));
573 pp_cxx_primary_expression (pp, t);
576 case DYNAMIC_CAST_EXPR:
577 case STATIC_CAST_EXPR:
578 case REINTERPRET_CAST_EXPR:
579 case CONST_CAST_EXPR:
580 if (code == DYNAMIC_CAST_EXPR)
581 pp_cxx_ws_string (pp, "dynamic_cast");
582 else if (code == STATIC_CAST_EXPR)
583 pp_cxx_ws_string (pp, "static_cast");
584 else if (code == REINTERPRET_CAST_EXPR)
585 pp_cxx_ws_string (pp, "reinterpret_cast");
587 pp_cxx_ws_string (pp, "const_cast");
588 pp_cxx_begin_template_argument_list (pp);
589 pp_cxx_type_id (pp, TREE_TYPE (t));
590 pp_cxx_end_template_argument_list (pp);
592 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
596 case EMPTY_CLASS_EXPR:
597 pp_cxx_type_id (pp, TREE_TYPE (t));
603 pp_cxx_typeid_expression (pp, t);
606 case PSEUDO_DTOR_EXPR:
607 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
609 pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
610 pp_cxx_colon_colon (pp);
612 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
616 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
621 pp_c_postfix_expression (pp_c_base (pp), t);
627 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
628 ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
634 type-specifier-seq new-declarator(opt)
637 ptr-operator new-declarator(opt)
638 direct-new-declarator
640 direct-new-declarator
642 direct-new-declarator [ constant-expression ]
645 ( expression-list(opt) ) */
648 pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
650 enum tree_code code = TREE_CODE (t);
651 tree type = TREE_OPERAND (t, 1);
652 tree init = TREE_OPERAND (t, 2);
657 if (NEW_EXPR_USE_GLOBAL (t))
658 pp_cxx_colon_colon (pp);
659 pp_cxx_ws_string (pp, "new");
660 if (TREE_OPERAND (t, 0))
662 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
665 if (TREE_CODE (type) == ARRAY_REF)
666 type = build_cplus_array_type
667 (TREE_OPERAND (type, 0),
668 build_index_type (fold_build2_loc (input_location,
669 MINUS_EXPR, integer_type_node,
670 TREE_OPERAND (type, 1),
672 pp_cxx_type_id (pp, type);
676 if (TREE_CODE (init) == TREE_LIST)
677 pp_c_expression_list (pp_c_base (pp), init);
678 else if (init == void_zero_node)
679 ; /* OK, empty initializer list. */
681 pp_cxx_expression (pp, init);
687 pp_unsupported_tree (pp, t);
691 /* delete-expression:
692 ::(opt) delete cast-expression
693 ::(opt) delete [ ] cast-expression */
696 pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
698 enum tree_code code = TREE_CODE (t);
702 case VEC_DELETE_EXPR:
703 if (DELETE_EXPR_USE_GLOBAL (t))
704 pp_cxx_colon_colon (pp);
705 pp_cxx_ws_string (pp, "delete");
707 if (code == VEC_DELETE_EXPR
708 || DELETE_EXPR_USE_VEC (t))
710 pp_left_bracket (pp);
711 pp_right_bracket (pp);
714 pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
718 pp_unsupported_tree (pp, t);
726 unary-operator cast-expression
727 sizeof unary-expression
729 sizeof ... ( identifier )
733 unary-operator: one of
737 __alignof__ unary-expression
738 __alignof__ ( type-id ) */
741 pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
743 enum tree_code code = TREE_CODE (t);
748 pp_cxx_new_expression (pp, t);
752 case VEC_DELETE_EXPR:
753 pp_cxx_delete_expression (pp, t);
757 if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
759 pp_cxx_ws_string (pp, "sizeof");
760 pp_cxx_ws_string (pp, "...");
761 pp_cxx_whitespace (pp);
762 pp_cxx_left_paren (pp);
763 if (TYPE_P (TREE_OPERAND (t, 0)))
764 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
766 pp_unary_expression (pp, TREE_OPERAND (t, 0));
767 pp_cxx_right_paren (pp);
773 pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
774 pp_cxx_whitespace (pp);
775 if (TYPE_P (TREE_OPERAND (t, 0)))
777 pp_cxx_left_paren (pp);
778 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
779 pp_cxx_right_paren (pp);
782 pp_unary_expression (pp, TREE_OPERAND (t, 0));
785 case UNARY_PLUS_EXPR:
787 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
791 pp_c_unary_expression (pp_c_base (pp), t);
798 ( type-id ) cast-expression */
801 pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
803 switch (TREE_CODE (t))
806 pp_cxx_type_id (pp, TREE_TYPE (t));
807 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
811 pp_c_cast_expression (pp_c_base (pp), t);
818 pm-expression .* cast-expression
819 pm-expression ->* cast-expression */
822 pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
824 switch (TREE_CODE (t))
826 /* Handle unfortunate OFFSET_REF overloading here. */
828 if (TYPE_P (TREE_OPERAND (t, 0)))
830 pp_cxx_qualified_id (pp, t);
833 /* Else fall through. */
836 pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
837 if (TREE_CODE (t) == MEMBER_REF)
842 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
847 pp_cxx_cast_expression (pp, t);
852 /* multiplicative-expression:
854 multiplicative-expression * pm-expression
855 multiplicative-expression / pm-expression
856 multiplicative-expression % pm-expression */
859 pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
861 enum tree_code code = TREE_CODE (e);
867 pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
869 if (code == MULT_EXPR)
871 else if (code == TRUNC_DIV_EXPR)
876 pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
880 pp_cxx_pm_expression (pp, e);
885 /* conditional-expression:
886 logical-or-expression
887 logical-or-expression ? expression : assignment-expression */
890 pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
892 if (TREE_CODE (e) == COND_EXPR)
894 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
898 pp_cxx_expression (pp, TREE_OPERAND (e, 1));
900 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
903 pp_c_logical_or_expression (pp_c_base (pp), e);
906 /* Pretty-print a compound assignment operator token as indicated by T. */
909 pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
913 switch (TREE_CODE (t))
936 op = tree_code_name[TREE_CODE (t)];
940 pp_cxx_ws_string (pp, op);
944 /* assignment-expression:
945 conditional-expression
946 logical-or-expression assignment-operator assignment-expression
950 throw assignment-expression(opt)
952 assignment-operator: one of
953 = *= /= %= += -= >>= <<= &= ^= |= */
956 pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
958 switch (TREE_CODE (e))
962 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
966 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
970 pp_cxx_ws_string (pp, "throw");
971 if (TREE_OPERAND (e, 0))
972 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
976 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
977 pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
978 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
982 pp_cxx_conditional_expression (pp, e);
988 pp_cxx_expression (cxx_pretty_printer *pp, tree t)
990 switch (TREE_CODE (t))
996 pp_cxx_constant (pp, t);
1000 pp_cxx_unqualified_id (pp, t);
1008 pp_cxx_qualified_id (pp, t);
1012 t = OVL_CURRENT (t);
1020 case TEMPLATE_TYPE_PARM:
1021 case TEMPLATE_PARM_INDEX:
1022 case TEMPLATE_TEMPLATE_PARM:
1024 pp_cxx_primary_expression (pp, t);
1028 case DYNAMIC_CAST_EXPR:
1029 case STATIC_CAST_EXPR:
1030 case REINTERPRET_CAST_EXPR:
1031 case CONST_CAST_EXPR:
1035 case EMPTY_CLASS_EXPR:
1037 case PSEUDO_DTOR_EXPR:
1038 case AGGR_INIT_EXPR:
1040 pp_cxx_postfix_expression (pp, t);
1045 pp_cxx_new_expression (pp, t);
1049 case VEC_DELETE_EXPR:
1050 pp_cxx_delete_expression (pp, t);
1055 pp_cxx_unary_expression (pp, t);
1059 pp_cxx_cast_expression (pp, t);
1065 pp_cxx_pm_expression (pp, t);
1069 case TRUNC_DIV_EXPR:
1070 case TRUNC_MOD_EXPR:
1071 pp_cxx_multiplicative_expression (pp, t);
1075 pp_cxx_conditional_expression (pp, t);
1082 pp_cxx_assignment_expression (pp, t);
1085 case NON_DEPENDENT_EXPR:
1086 case MUST_NOT_THROW_EXPR:
1087 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
1090 case EXPR_PACK_EXPANSION:
1091 pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t));
1092 pp_cxx_ws_string (pp, "...");
1095 case TEMPLATE_ID_EXPR:
1096 pp_cxx_template_id (pp, t);
1099 case NONTYPE_ARGUMENT_PACK:
1101 tree args = ARGUMENT_PACK_ARGS (t);
1102 int i, len = TREE_VEC_LENGTH (args);
1103 for (i = 0; i < len; ++i)
1106 pp_cxx_separate_with (pp, ',');
1107 pp_cxx_expression (pp, TREE_VEC_ELT (args, i));
1113 pp_c_expression (pp_c_base (pp), t);
1121 /* function-specifier:
1127 pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
1129 switch (TREE_CODE (t))
1132 if (DECL_VIRTUAL_P (t))
1133 pp_cxx_ws_string (pp, "virtual");
1134 else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1135 pp_cxx_ws_string (pp, "explicit");
1137 pp_c_function_specifier (pp_c_base (pp), t);
1144 /* decl-specifier-seq:
1145 decl-specifier-seq(opt) decl-specifier
1148 storage-class-specifier
1155 pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
1157 switch (TREE_CODE (t))
1163 pp_cxx_storage_class_specifier (pp, t);
1164 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1168 pp_cxx_ws_string (pp, "typedef");
1169 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1173 if (TYPE_PTRMEMFUNC_P (t))
1175 tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1176 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1177 pp_cxx_whitespace (pp);
1178 pp_cxx_ptr_operator (pp, t);
1183 /* Constructors don't have return types. And conversion functions
1184 do not have a type-specifier in their return types. */
1185 if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1186 pp_cxx_function_specifier (pp, t);
1187 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1188 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1191 pp_c_declaration_specifiers (pp_c_base (pp), t);
1196 /* simple-type-specifier:
1197 ::(opt) nested-name-specifier(opt) type-name
1198 ::(opt) nested-name-specifier(opt) template(opt) template-id
1212 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1214 switch (TREE_CODE (t))
1219 pp_cxx_qualified_id (pp, t);
1222 case TEMPLATE_TYPE_PARM:
1223 case TEMPLATE_TEMPLATE_PARM:
1224 case TEMPLATE_PARM_INDEX:
1225 pp_cxx_unqualified_id (pp, t);
1229 pp_cxx_ws_string (pp, "typename");
1230 pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1231 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1235 pp_c_type_specifier (pp_c_base (pp), t);
1240 /* type-specifier-seq:
1241 type-specifier type-specifier-seq(opt)
1244 simple-type-specifier
1247 elaborated-type-specifier
1251 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1253 switch (TREE_CODE (t))
1256 case TEMPLATE_TYPE_PARM:
1257 case TEMPLATE_TEMPLATE_PARM:
1259 case BOUND_TEMPLATE_TEMPLATE_PARM:
1260 pp_cxx_cv_qualifier_seq (pp, t);
1261 pp_cxx_simple_type_specifier (pp, t);
1265 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1266 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1267 pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1271 pp_cxx_ws_string (pp, "decltype");
1272 pp_cxx_left_paren (pp);
1273 pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1274 pp_cxx_right_paren (pp);
1278 if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1279 pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1284 * cv-qualifier-seq(opt)
1286 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1289 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1291 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1293 switch (TREE_CODE (t))
1295 case REFERENCE_TYPE:
1297 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
1298 || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
1299 pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1300 if (TREE_CODE (t) == POINTER_TYPE)
1303 pp_cxx_cv_qualifier_seq (pp, t);
1310 if (TYPE_PTRMEMFUNC_P (t))
1312 pp_cxx_left_paren (pp);
1313 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1318 if (TYPE_PTR_TO_MEMBER_P (t))
1320 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1321 pp_cxx_left_paren (pp);
1322 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1324 pp_cxx_cv_qualifier_seq (pp, t);
1327 /* else fall through. */
1330 pp_unsupported_tree (pp, t);
1336 pp_cxx_implicit_parameter_type (tree mf)
1338 return TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (mf))));
1342 parameter-declaration:
1343 decl-specifier-seq declarator
1344 decl-specifier-seq declarator = assignment-expression
1345 decl-specifier-seq abstract-declarator(opt)
1346 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1349 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1351 pp_cxx_decl_specifier_seq (pp, t);
1353 pp_cxx_abstract_declarator (pp, t);
1355 pp_cxx_declarator (pp, t);
1358 /* parameter-declaration-clause:
1359 parameter-declaration-list(opt) ...(opt)
1360 parameter-declaration-list , ...
1362 parameter-declaration-list:
1363 parameter-declaration
1364 parameter-declaration-list , parameter-declaration */
1367 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1369 tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1371 TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1372 const bool abstract = args == NULL
1373 || pp_c_base (pp)->flags & pp_c_flag_abstract;
1376 /* Skip artificial parameter for nonstatic member functions. */
1377 if (TREE_CODE (t) == METHOD_TYPE)
1378 types = TREE_CHAIN (types);
1380 pp_cxx_left_paren (pp);
1381 for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1384 pp_cxx_separate_with (pp, ',');
1386 pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1387 if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1389 pp_cxx_whitespace (pp);
1391 pp_cxx_whitespace (pp);
1392 pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1395 pp_cxx_right_paren (pp);
1398 /* exception-specification:
1399 throw ( type-id-list(opt) )
1403 type-id-list , type-id */
1406 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1408 tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1409 bool need_comma = false;
1411 if (!TYPE_NOTHROW_P (t) && ex_spec == NULL)
1413 pp_cxx_ws_string (pp, "throw");
1414 pp_cxx_left_paren (pp);
1415 for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1417 tree type = TREE_VALUE (ex_spec);
1418 tree argpack = NULL_TREE;
1421 if (ARGUMENT_PACK_P (type))
1423 argpack = ARGUMENT_PACK_ARGS (type);
1424 len = TREE_VEC_LENGTH (argpack);
1427 for (i = 0; i < len; ++i)
1430 type = TREE_VEC_ELT (argpack, i);
1433 pp_cxx_separate_with (pp, ',');
1437 pp_cxx_type_id (pp, type);
1440 pp_cxx_right_paren (pp);
1443 /* direct-declarator:
1445 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1446 exception-specification(opt)
1447 direct-declaration [ constant-expression(opt) ]
1451 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1453 switch (TREE_CODE (t))
1461 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1463 if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1464 || template_parameter_pack_p (t))
1465 /* A function parameter pack or non-type template
1467 pp_cxx_ws_string (pp, "...");
1469 pp_cxx_id_expression (pp, DECL_NAME (t));
1471 pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1475 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1476 pp_cxx_id_expression (pp, t);
1477 pp_cxx_parameter_declaration_clause (pp, t);
1479 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1481 pp_base (pp)->padding = pp_before;
1482 pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1485 pp_cxx_exception_specification (pp, TREE_TYPE (t));
1490 case TEMPLATE_TYPE_PARM:
1491 case TEMPLATE_PARM_INDEX:
1492 case TEMPLATE_TEMPLATE_PARM:
1496 pp_c_direct_declarator (pp_c_base (pp), t);
1503 ptr-operator declarator */
1506 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1508 pp_cxx_direct_declarator (pp, t);
1511 /* ctor-initializer:
1512 : mem-initializer-list
1514 mem-initializer-list:
1516 mem-initializer , mem-initializer-list
1519 mem-initializer-id ( expression-list(opt) )
1522 ::(opt) nested-name-specifier(opt) class-name
1526 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1528 t = TREE_OPERAND (t, 0);
1529 pp_cxx_whitespace (pp);
1531 pp_cxx_whitespace (pp);
1532 for (; t; t = TREE_CHAIN (t))
1534 tree purpose = TREE_PURPOSE (t);
1535 bool is_pack = PACK_EXPANSION_P (purpose);
1538 pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1540 pp_cxx_primary_expression (pp, purpose);
1541 pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1543 pp_cxx_ws_string (pp, "...");
1545 pp_cxx_separate_with (pp, ',');
1549 /* function-definition:
1550 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1551 decl-specifier-seq(opt) declarator function-try-block */
1554 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1556 tree saved_scope = pp->enclosing_scope;
1557 pp_cxx_decl_specifier_seq (pp, t);
1558 pp_cxx_declarator (pp, t);
1559 pp_needs_newline (pp) = true;
1560 pp->enclosing_scope = DECL_CONTEXT (t);
1561 if (DECL_SAVED_TREE (t))
1562 pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1565 pp_cxx_semicolon (pp);
1566 pp_needs_newline (pp) = true;
1569 pp->enclosing_scope = saved_scope;
1572 /* abstract-declarator:
1573 ptr-operator abstract-declarator(opt)
1574 direct-abstract-declarator */
1577 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1579 if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t))
1580 pp_cxx_right_paren (pp);
1581 else if (POINTER_TYPE_P (t))
1583 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1584 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1585 pp_cxx_right_paren (pp);
1588 pp_cxx_direct_abstract_declarator (pp, t);
1591 /* direct-abstract-declarator:
1592 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1593 cv-qualifier-seq(opt) exception-specification(opt)
1594 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1595 ( abstract-declarator ) */
1598 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1600 switch (TREE_CODE (t))
1602 case REFERENCE_TYPE:
1603 pp_cxx_abstract_declarator (pp, t);
1607 if (TYPE_PTRMEMFUNC_P (t))
1608 pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1613 pp_cxx_parameter_declaration_clause (pp, t);
1614 pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1615 if (TREE_CODE (t) == METHOD_TYPE)
1617 pp_base (pp)->padding = pp_before;
1618 pp_cxx_cv_qualifier_seq
1619 (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
1621 pp_cxx_exception_specification (pp, t);
1625 case TEMPLATE_TYPE_PARM:
1626 case TEMPLATE_TEMPLATE_PARM:
1627 case BOUND_TEMPLATE_TEMPLATE_PARM:
1628 case UNBOUND_CLASS_TEMPLATE:
1632 pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1638 type-specifier-seq abstract-declarator(opt) */
1641 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1643 pp_flags saved_flags = pp_c_base (pp)->flags;
1644 pp_c_base (pp)->flags |= pp_c_flag_abstract;
1646 switch (TREE_CODE (t))
1653 case BOUND_TEMPLATE_TEMPLATE_PARM:
1654 case UNBOUND_CLASS_TEMPLATE:
1655 case TEMPLATE_TEMPLATE_PARM:
1656 case TEMPLATE_TYPE_PARM:
1657 case TEMPLATE_PARM_INDEX:
1661 case TEMPLATE_ID_EXPR:
1662 pp_cxx_type_specifier_seq (pp, t);
1665 case TYPE_PACK_EXPANSION:
1666 pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1667 pp_cxx_ws_string (pp, "...");
1671 pp_c_type_id (pp_c_base (pp), t);
1675 pp_c_base (pp)->flags = saved_flags;
1678 /* template-argument-list:
1679 template-argument ...(opt)
1680 template-argument-list, template-argument ...(opt)
1683 assignment-expression
1688 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1691 bool need_comma = false;
1695 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1697 tree arg = TREE_VEC_ELT (t, i);
1698 tree argpack = NULL_TREE;
1701 if (ARGUMENT_PACK_P (arg))
1703 argpack = ARGUMENT_PACK_ARGS (arg);
1704 len = TREE_VEC_LENGTH (argpack);
1707 for (idx = 0; idx < len; idx++)
1710 arg = TREE_VEC_ELT (argpack, idx);
1713 pp_cxx_separate_with (pp, ',');
1717 if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1718 && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1719 pp_cxx_type_id (pp, arg);
1721 pp_cxx_expression (pp, arg);
1728 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1730 t = DECL_EXPR_DECL (t);
1731 pp_cxx_type_specifier_seq (pp, t);
1733 pp_cxx_abstract_declarator (pp, t);
1735 pp_cxx_declarator (pp, t);
1741 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1743 switch (TREE_CODE (t))
1745 case CTOR_INITIALIZER:
1746 pp_cxx_ctor_initializer (pp, t);
1750 pp_cxx_ws_string (pp, "using");
1751 pp_cxx_ws_string (pp, "namespace");
1752 if (DECL_CONTEXT (t))
1753 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1754 pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1758 pp_cxx_ws_string (pp, "using");
1759 pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1760 pp_cxx_unqualified_id (pp, DECL_NAME (t));
1767 try compound-statement handler-seq */
1769 pp_maybe_newline_and_indent (pp, 0);
1770 pp_cxx_ws_string (pp, "try");
1771 pp_newline_and_indent (pp, 3);
1772 pp_cxx_statement (pp, TRY_STMTS (t));
1773 pp_newline_and_indent (pp, -3);
1777 pp_cxx_statement (pp, TRY_HANDLERS (t));
1782 handler handler-seq(opt)
1785 catch ( exception-declaration ) compound-statement
1787 exception-declaration:
1788 type-specifier-seq declarator
1789 type-specifier-seq abstract-declarator
1792 pp_cxx_ws_string (pp, "catch");
1793 pp_cxx_left_paren (pp);
1794 pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1795 pp_cxx_right_paren (pp);
1796 pp_indentation (pp) += 3;
1797 pp_needs_newline (pp) = true;
1798 pp_cxx_statement (pp, HANDLER_BODY (t));
1799 pp_indentation (pp) -= 3;
1800 pp_needs_newline (pp) = true;
1803 /* selection-statement:
1804 if ( expression ) statement
1805 if ( expression ) statement else statement */
1807 pp_cxx_ws_string (pp, "if");
1808 pp_cxx_whitespace (pp);
1809 pp_cxx_left_paren (pp);
1810 pp_cxx_expression (pp, IF_COND (t));
1811 pp_cxx_right_paren (pp);
1812 pp_newline_and_indent (pp, 2);
1813 pp_cxx_statement (pp, THEN_CLAUSE (t));
1814 pp_newline_and_indent (pp, -2);
1815 if (ELSE_CLAUSE (t))
1817 tree else_clause = ELSE_CLAUSE (t);
1818 pp_cxx_ws_string (pp, "else");
1819 if (TREE_CODE (else_clause) == IF_STMT)
1820 pp_cxx_whitespace (pp);
1822 pp_newline_and_indent (pp, 2);
1823 pp_cxx_statement (pp, else_clause);
1824 if (TREE_CODE (else_clause) != IF_STMT)
1825 pp_newline_and_indent (pp, -2);
1830 pp_cxx_ws_string (pp, "switch");
1832 pp_cxx_left_paren (pp);
1833 pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1834 pp_cxx_right_paren (pp);
1835 pp_indentation (pp) += 3;
1836 pp_needs_newline (pp) = true;
1837 pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1838 pp_newline_and_indent (pp, -3);
1841 /* iteration-statement:
1842 while ( expression ) statement
1843 do statement while ( expression ) ;
1844 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1845 for ( declaration expression(opt) ; expression(opt) ) statement */
1847 pp_cxx_ws_string (pp, "while");
1849 pp_cxx_left_paren (pp);
1850 pp_cxx_expression (pp, WHILE_COND (t));
1851 pp_cxx_right_paren (pp);
1852 pp_newline_and_indent (pp, 3);
1853 pp_cxx_statement (pp, WHILE_BODY (t));
1854 pp_indentation (pp) -= 3;
1855 pp_needs_newline (pp) = true;
1859 pp_cxx_ws_string (pp, "do");
1860 pp_newline_and_indent (pp, 3);
1861 pp_cxx_statement (pp, DO_BODY (t));
1862 pp_newline_and_indent (pp, -3);
1863 pp_cxx_ws_string (pp, "while");
1865 pp_cxx_left_paren (pp);
1866 pp_cxx_expression (pp, DO_COND (t));
1867 pp_cxx_right_paren (pp);
1868 pp_cxx_semicolon (pp);
1869 pp_needs_newline (pp) = true;
1873 pp_cxx_ws_string (pp, "for");
1875 pp_cxx_left_paren (pp);
1876 if (FOR_INIT_STMT (t))
1877 pp_cxx_statement (pp, FOR_INIT_STMT (t));
1879 pp_cxx_semicolon (pp);
1880 pp_needs_newline (pp) = false;
1881 pp_cxx_whitespace (pp);
1883 pp_cxx_expression (pp, FOR_COND (t));
1884 pp_cxx_semicolon (pp);
1885 pp_needs_newline (pp) = false;
1886 pp_cxx_whitespace (pp);
1888 pp_cxx_expression (pp, FOR_EXPR (t));
1889 pp_cxx_right_paren (pp);
1890 pp_newline_and_indent (pp, 3);
1891 pp_cxx_statement (pp, FOR_BODY (t));
1892 pp_indentation (pp) -= 3;
1893 pp_needs_newline (pp) = true;
1899 return expression(opt) ; */
1902 pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1903 pp_cxx_semicolon (pp);
1904 pp_needs_newline (pp) = true;
1907 /* expression-statement:
1908 expression(opt) ; */
1910 pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1911 pp_cxx_semicolon (pp);
1912 pp_needs_newline (pp) = true;
1916 pp_cxx_ws_string (pp, "try");
1917 pp_newline_and_indent (pp, 2);
1918 pp_cxx_statement (pp, CLEANUP_BODY (t));
1919 pp_newline_and_indent (pp, -2);
1920 pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
1921 pp_newline_and_indent (pp, 2);
1922 pp_cxx_statement (pp, CLEANUP_EXPR (t));
1923 pp_newline_and_indent (pp, -2);
1927 pp_cxx_declaration (pp, t);
1931 pp_c_statement (pp_c_base (pp), t);
1936 /* original-namespace-definition:
1937 namespace identifier { namespace-body }
1939 As an edge case, we also handle unnamed namespace definition here. */
1942 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
1944 pp_cxx_ws_string (pp, "namespace");
1945 if (DECL_CONTEXT (t))
1946 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1948 pp_cxx_unqualified_id (pp, t);
1949 pp_cxx_whitespace (pp);
1950 pp_cxx_left_brace (pp);
1951 /* We do not print the namespace-body. */
1952 pp_cxx_whitespace (pp);
1953 pp_cxx_right_brace (pp);
1959 namespace-alias-definition:
1960 namespace identifier = qualified-namespace-specifier ;
1962 qualified-namespace-specifier:
1963 ::(opt) nested-name-specifier(opt) namespace-name */
1966 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
1968 pp_cxx_ws_string (pp, "namespace");
1969 if (DECL_CONTEXT (t))
1970 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1971 pp_cxx_unqualified_id (pp, t);
1972 pp_cxx_whitespace (pp);
1974 pp_cxx_whitespace (pp);
1975 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
1976 pp_cxx_nested_name_specifier (pp,
1977 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
1978 pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
1979 pp_cxx_semicolon (pp);
1982 /* simple-declaration:
1983 decl-specifier-seq(opt) init-declarator-list(opt) */
1986 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
1988 pp_cxx_decl_specifier_seq (pp, t);
1989 pp_cxx_init_declarator (pp, t);
1990 pp_cxx_semicolon (pp);
1991 pp_needs_newline (pp) = true;
1995 template-parameter-list:
1997 template-parameter-list , template-parameter */
2000 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2002 const int n = TREE_VEC_LENGTH (t);
2004 for (i = 0; i < n; ++i)
2007 pp_cxx_separate_with (pp, ',');
2008 pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2012 /* template-parameter:
2014 parameter-declaration
2017 class ...(opt) identifier(opt)
2018 class identifier(opt) = type-id
2019 typename identifier(opt)
2020 typename ...(opt) identifier(opt) = type-id
2021 template < template-parameter-list > class ...(opt) identifier(opt)
2022 template < template-parameter-list > class identifier(opt) = template-name */
2025 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2027 tree parameter = TREE_VALUE (t);
2028 switch (TREE_CODE (parameter))
2031 pp_cxx_ws_string (pp, "class");
2032 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2033 pp_cxx_ws_string (pp, "...");
2034 if (DECL_NAME (parameter))
2035 pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2036 /* FIXME: Check if we should print also default argument. */
2040 pp_cxx_parameter_declaration (pp, parameter);
2047 pp_unsupported_tree (pp, t);
2052 /* Pretty-print a template parameter in the canonical form
2053 "template-parameter-<level>-<position in parameter list>". */
2056 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2058 const enum tree_code code = TREE_CODE (parm);
2060 /* Brings type template parameters to the canonical forms. */
2061 if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2062 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2063 parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2065 pp_cxx_begin_template_argument_list (pp);
2066 pp_cxx_ws_string (pp, M_("template-parameter-"));
2067 pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2069 pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2070 pp_cxx_end_template_argument_list (pp);
2074 template-declaration:
2075 export(opt) template < template-parameter-list > declaration */
2078 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2080 tree tmpl = most_general_template (t);
2084 pp_maybe_newline_and_indent (pp, 0);
2085 for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2087 pp_cxx_ws_string (pp, "template");
2088 pp_cxx_begin_template_argument_list (pp);
2089 pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2090 pp_cxx_end_template_argument_list (pp);
2091 pp_newline_and_indent (pp, 3);
2094 if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2095 pp_cxx_function_definition (pp, t);
2097 pp_cxx_simple_declaration (pp, t);
2101 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2103 pp_unsupported_tree (pp, t);
2107 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2109 pp_unsupported_tree (pp, t);
2116 template-declaration
2117 explicit-instantiation
2118 explicit-specialization
2119 linkage-specification
2120 namespace-definition
2125 namespace-alias-definition
2128 static_assert-declaration */
2130 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2132 if (TREE_CODE (t) == STATIC_ASSERT)
2134 pp_cxx_ws_string (pp, "static_assert");
2135 pp_cxx_left_paren (pp);
2136 pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2137 pp_cxx_separate_with (pp, ',');
2138 pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2139 pp_cxx_right_paren (pp);
2141 else if (!DECL_LANG_SPECIFIC (t))
2142 pp_cxx_simple_declaration (pp, t);
2143 else if (DECL_USE_TEMPLATE (t))
2144 switch (DECL_USE_TEMPLATE (t))
2147 pp_cxx_template_declaration (pp, t);
2151 pp_cxx_explicit_specialization (pp, t);
2155 pp_cxx_explicit_instantiation (pp, t);
2161 else switch (TREE_CODE (t))
2165 pp_cxx_simple_declaration (pp, t);
2169 if (DECL_SAVED_TREE (t))
2170 pp_cxx_function_definition (pp, t);
2172 pp_cxx_simple_declaration (pp, t);
2175 case NAMESPACE_DECL:
2176 if (DECL_NAMESPACE_ALIAS (t))
2177 pp_cxx_namespace_alias_definition (pp, t);
2179 pp_cxx_original_namespace_definition (pp, t);
2183 pp_unsupported_tree (pp, t);
2189 pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2191 t = TREE_OPERAND (t, 0);
2192 pp_cxx_ws_string (pp, "typeid");
2193 pp_cxx_left_paren (pp);
2195 pp_cxx_type_id (pp, t);
2197 pp_cxx_expression (pp, t);
2198 pp_cxx_right_paren (pp);
2202 pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2204 pp_cxx_ws_string (pp, "va_arg");
2205 pp_cxx_left_paren (pp);
2206 pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2207 pp_cxx_separate_with (pp, ',');
2208 pp_cxx_type_id (pp, TREE_TYPE (t));
2209 pp_cxx_right_paren (pp);
2213 pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2215 switch (TREE_CODE (t))
2218 if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2219 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2221 pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2222 pp_cxx_separate_with (pp, ',');
2227 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2229 if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2231 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2234 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2236 pp_left_bracket (pp);
2237 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2238 pp_right_bracket (pp);
2246 pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2248 pp_cxx_ws_string (pp, "offsetof");
2249 pp_cxx_left_paren (pp);
2250 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2251 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2252 pp_cxx_right_paren (pp);
2256 pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2258 cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2262 case CPTK_HAS_NOTHROW_ASSIGN:
2263 pp_cxx_ws_string (pp, "__has_nothrow_assign");
2265 case CPTK_HAS_TRIVIAL_ASSIGN:
2266 pp_cxx_ws_string (pp, "__has_trivial_assign");
2268 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2269 pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2271 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2272 pp_cxx_ws_string (pp, "__has_trivial_constructor");
2274 case CPTK_HAS_NOTHROW_COPY:
2275 pp_cxx_ws_string (pp, "__has_nothrow_copy");
2277 case CPTK_HAS_TRIVIAL_COPY:
2278 pp_cxx_ws_string (pp, "__has_trivial_copy");
2280 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2281 pp_cxx_ws_string (pp, "__has_trivial_destructor");
2283 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2284 pp_cxx_ws_string (pp, "__has_virtual_destructor");
2286 case CPTK_IS_ABSTRACT:
2287 pp_cxx_ws_string (pp, "__is_abstract");
2289 case CPTK_IS_BASE_OF:
2290 pp_cxx_ws_string (pp, "__is_base_of");
2293 pp_cxx_ws_string (pp, "__is_class");
2295 case CPTK_IS_CONVERTIBLE_TO:
2296 pp_cxx_ws_string (pp, "__is_convertible_to");
2299 pp_cxx_ws_string (pp, "__is_empty");
2302 pp_cxx_ws_string (pp, "__is_enum");
2305 pp_cxx_ws_string (pp, "__is_pod");
2307 case CPTK_IS_POLYMORPHIC:
2308 pp_cxx_ws_string (pp, "__is_polymorphic");
2310 case CPTK_IS_STD_LAYOUT:
2311 pp_cxx_ws_string (pp, "__is_std_layout");
2313 case CPTK_IS_TRIVIAL:
2314 pp_cxx_ws_string (pp, "__is_trivial");
2317 pp_cxx_ws_string (pp, "__is_union");
2324 pp_cxx_left_paren (pp);
2325 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2327 if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2329 pp_cxx_separate_with (pp, ',');
2330 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2333 pp_cxx_right_paren (pp);
2336 typedef c_pretty_print_fn pp_fun;
2338 /* Initialization of a C++ pretty-printer object. */
2341 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2343 pp_c_pretty_printer_init (pp_c_base (pp));
2344 pp_set_line_maximum_length (pp, 0);
2346 pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2347 pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2348 pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2349 pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2350 pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2351 pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2352 pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2353 pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2354 pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2355 pp->c_base.direct_abstract_declarator =
2356 (pp_fun) pp_cxx_direct_abstract_declarator;
2357 pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2359 /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */
2361 pp->c_base.constant = (pp_fun) pp_cxx_constant;
2362 pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2363 pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2364 pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2365 pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2366 pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2367 pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2368 pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2369 pp->c_base.expression = (pp_fun) pp_cxx_expression;
2370 pp->enclosing_scope = global_namespace;