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
->padding
= pp_none
;
64 #define pp_cxx_storage_class_specifier(PP, T) \
65 pp_c_storage_class_specifier (PP, T)
66 #define pp_cxx_expression_list(PP, T) \
67 pp_c_expression_list (PP, T)
68 #define pp_cxx_space_for_pointer_operator(PP, T) \
69 pp_c_space_for_pointer_operator (PP, T)
70 #define pp_cxx_init_declarator(PP, T) \
71 pp_c_init_declarator (PP, T)
72 #define pp_cxx_call_argument_list(PP, T) \
73 pp_c_call_argument_list (PP, T)
76 pp_cxx_colon_colon (cxx_pretty_printer
*pp
)
79 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
->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
= get_containing_scope (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
= get_containing_scope (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 cxx_pretty_printer::constant (tree t
)
327 switch (TREE_CODE (t
))
331 const bool in_parens
= PAREN_STRING_LITERAL_P (t
);
333 pp_cxx_left_paren (this);
334 c_pretty_printer::constant (t
);
336 pp_cxx_right_paren (this);
341 if (NULLPTR_TYPE_P (TREE_TYPE (t
)))
343 pp_string (this, "nullptr");
346 /* else fall through. */
349 c_pretty_printer::constant (t
);
359 cxx_pretty_printer::id_expression (tree t
)
361 if (TREE_CODE (t
) == OVERLOAD
)
363 if (DECL_P (t
) && DECL_CONTEXT (t
))
364 pp_cxx_qualified_id (this, t
);
366 pp_cxx_unqualified_id (this, t
);
369 /* user-defined literal:
373 pp_cxx_userdef_literal (cxx_pretty_printer
*pp
, tree t
)
375 pp_constant (pp
, USERDEF_LITERAL_VALUE (t
));
376 pp_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
))
426 case USERDEF_LITERAL
:
427 pp_cxx_userdef_literal (pp
, t
);
431 t
= BASELINK_FUNCTIONS (t
);
439 pp_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
, 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 (!TYPE_PTR_P (TREE_TYPE (object
)))
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
, 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
, 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
, 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
, 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
, 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
, 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
, 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
, 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
, 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_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_cxx_left_paren (pp
);
1172 pp_cxx_expression (pp
, TREE_OPERAND (t
, 0));
1173 pp_cxx_right_paren (pp
);
1177 pp_c_expression (pp
, t
);
1185 /* function-specifier:
1191 pp_cxx_function_specifier (cxx_pretty_printer
*pp
, tree t
)
1193 switch (TREE_CODE (t
))
1196 if (DECL_VIRTUAL_P (t
))
1197 pp_cxx_ws_string (pp
, "virtual");
1198 else if (DECL_CONSTRUCTOR_P (t
) && DECL_NONCONVERTING_P (t
))
1199 pp_cxx_ws_string (pp
, "explicit");
1201 pp_c_function_specifier (pp
, t
);
1208 /* decl-specifier-seq:
1209 decl-specifier-seq(opt) decl-specifier
1212 storage-class-specifier
1219 pp_cxx_decl_specifier_seq (cxx_pretty_printer
*pp
, tree t
)
1221 switch (TREE_CODE (t
))
1227 pp_cxx_storage_class_specifier (pp
, t
);
1228 pp_cxx_decl_specifier_seq (pp
, TREE_TYPE (t
));
1232 pp_cxx_ws_string (pp
, "typedef");
1233 pp_cxx_decl_specifier_seq (pp
, TREE_TYPE (t
));
1237 /* Constructors don't have return types. And conversion functions
1238 do not have a type-specifier in their return types. */
1239 if (DECL_CONSTRUCTOR_P (t
) || DECL_CONV_FN_P (t
))
1240 pp_cxx_function_specifier (pp
, t
);
1241 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t
))
1242 pp_cxx_decl_specifier_seq (pp
, TREE_TYPE (TREE_TYPE (t
)));
1245 pp_c_declaration_specifiers (pp
, t
);
1250 /* simple-type-specifier:
1251 ::(opt) nested-name-specifier(opt) type-name
1252 ::(opt) nested-name-specifier(opt) template(opt) template-id
1266 pp_cxx_simple_type_specifier (cxx_pretty_printer
*pp
, tree t
)
1268 switch (TREE_CODE (t
))
1273 pp_cxx_qualified_id (pp
, t
);
1276 case TEMPLATE_TYPE_PARM
:
1277 case TEMPLATE_TEMPLATE_PARM
:
1278 case TEMPLATE_PARM_INDEX
:
1279 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1280 pp_cxx_unqualified_id (pp
, t
);
1284 pp_cxx_ws_string (pp
, "typename");
1285 pp_cxx_nested_name_specifier (pp
, TYPE_CONTEXT (t
));
1286 pp_cxx_unqualified_id (pp
, TYPE_NAME (t
));
1290 pp_c_type_specifier (pp
, t
);
1295 /* type-specifier-seq:
1296 type-specifier type-specifier-seq(opt)
1299 simple-type-specifier
1302 elaborated-type-specifier
1306 pp_cxx_type_specifier_seq (cxx_pretty_printer
*pp
, tree t
)
1308 switch (TREE_CODE (t
))
1311 case TEMPLATE_TYPE_PARM
:
1312 case TEMPLATE_TEMPLATE_PARM
:
1314 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1315 pp_cxx_cv_qualifier_seq (pp
, t
);
1316 pp_cxx_simple_type_specifier (pp
, t
);
1320 pp_cxx_type_specifier_seq (pp
, TREE_TYPE (t
));
1321 pp_cxx_space_for_pointer_operator (pp
, TREE_TYPE (t
));
1322 pp_cxx_nested_name_specifier (pp
, TYPE_METHOD_BASETYPE (t
));
1326 pp_cxx_ws_string (pp
, "decltype");
1327 pp_cxx_left_paren (pp
);
1328 pp_cxx_expression (pp
, DECLTYPE_TYPE_EXPR (t
));
1329 pp_cxx_right_paren (pp
);
1333 if (TYPE_PTRMEMFUNC_P (t
))
1335 tree pfm
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
1336 pp_cxx_decl_specifier_seq (pp
, TREE_TYPE (TREE_TYPE (pfm
)));
1337 pp_cxx_whitespace (pp
);
1338 pp_cxx_ptr_operator (pp
, t
);
1341 /* else fall through */
1344 if (!(TREE_CODE (t
) == FUNCTION_DECL
&& DECL_CONSTRUCTOR_P (t
)))
1345 pp_c_specifier_qualifier_list (pp
, t
);
1350 * cv-qualifier-seq(opt)
1352 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1355 pp_cxx_ptr_operator (cxx_pretty_printer
*pp
, tree t
)
1357 if (!TYPE_P (t
) && TREE_CODE (t
) != TYPE_DECL
)
1359 switch (TREE_CODE (t
))
1361 case REFERENCE_TYPE
:
1363 if (TYPE_PTR_OR_PTRMEM_P (TREE_TYPE (t
)))
1364 pp_cxx_ptr_operator (pp
, TREE_TYPE (t
));
1365 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (TREE_TYPE (t
)));
1369 pp_cxx_cv_qualifier_seq (pp
, t
);
1376 if (TYPE_PTRMEMFUNC_P (t
))
1378 pp_cxx_left_paren (pp
);
1379 pp_cxx_nested_name_specifier (pp
, TYPE_PTRMEMFUNC_OBJECT_TYPE (t
));
1384 if (TYPE_PTRMEM_P (t
))
1386 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
1387 pp_cxx_left_paren (pp
);
1388 pp_cxx_nested_name_specifier (pp
, TYPE_PTRMEM_CLASS_TYPE (t
));
1390 pp_cxx_cv_qualifier_seq (pp
, t
);
1393 /* else fall through. */
1396 pp_unsupported_tree (pp
, t
);
1402 pp_cxx_implicit_parameter_type (tree mf
)
1404 return class_of_this_parm (TREE_TYPE (mf
));
1408 parameter-declaration:
1409 decl-specifier-seq declarator
1410 decl-specifier-seq declarator = assignment-expression
1411 decl-specifier-seq abstract-declarator(opt)
1412 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1415 pp_cxx_parameter_declaration (cxx_pretty_printer
*pp
, tree t
)
1417 pp_cxx_decl_specifier_seq (pp
, t
);
1419 pp_cxx_abstract_declarator (pp
, t
);
1421 pp_cxx_declarator (pp
, t
);
1424 /* parameter-declaration-clause:
1425 parameter-declaration-list(opt) ...(opt)
1426 parameter-declaration-list , ...
1428 parameter-declaration-list:
1429 parameter-declaration
1430 parameter-declaration-list , parameter-declaration */
1433 pp_cxx_parameter_declaration_clause (cxx_pretty_printer
*pp
, tree t
)
1435 tree args
= TYPE_P (t
) ? NULL
: FUNCTION_FIRST_USER_PARM (t
);
1437 TYPE_P (t
) ? TYPE_ARG_TYPES (t
) : FUNCTION_FIRST_USER_PARMTYPE (t
);
1438 const bool abstract
= args
== NULL
|| pp
->flags
& pp_c_flag_abstract
;
1441 /* Skip artificial parameter for nonstatic member functions. */
1442 if (TREE_CODE (t
) == METHOD_TYPE
)
1443 types
= TREE_CHAIN (types
);
1445 pp_cxx_left_paren (pp
);
1446 for (; args
; args
= TREE_CHAIN (args
), types
= TREE_CHAIN (types
))
1449 pp_cxx_separate_with (pp
, ',');
1451 pp_cxx_parameter_declaration (pp
, abstract
? TREE_VALUE (types
) : args
);
1452 if (!abstract
&& pp
->flags
& pp_cxx_flag_default_argument
)
1454 pp_cxx_whitespace (pp
);
1456 pp_cxx_whitespace (pp
);
1457 pp_cxx_assignment_expression (pp
, TREE_PURPOSE (types
));
1460 pp_cxx_right_paren (pp
);
1463 /* exception-specification:
1464 throw ( type-id-list(opt) )
1468 type-id-list , type-id */
1471 pp_cxx_exception_specification (cxx_pretty_printer
*pp
, tree t
)
1473 tree ex_spec
= TYPE_RAISES_EXCEPTIONS (t
);
1474 bool need_comma
= false;
1476 if (ex_spec
== NULL
)
1478 if (TREE_PURPOSE (ex_spec
))
1480 pp_cxx_ws_string (pp
, "noexcept");
1481 pp_cxx_whitespace (pp
);
1482 pp_cxx_left_paren (pp
);
1483 if (DEFERRED_NOEXCEPT_SPEC_P (ex_spec
))
1484 pp_cxx_ws_string (pp
, "<uninstantiated>");
1486 pp_cxx_expression (pp
, TREE_PURPOSE (ex_spec
));
1487 pp_cxx_right_paren (pp
);
1490 pp_cxx_ws_string (pp
, "throw");
1491 pp_cxx_left_paren (pp
);
1492 for (; ex_spec
&& TREE_VALUE (ex_spec
); ex_spec
= TREE_CHAIN (ex_spec
))
1494 tree type
= TREE_VALUE (ex_spec
);
1495 tree argpack
= NULL_TREE
;
1498 if (ARGUMENT_PACK_P (type
))
1500 argpack
= ARGUMENT_PACK_ARGS (type
);
1501 len
= TREE_VEC_LENGTH (argpack
);
1504 for (i
= 0; i
< len
; ++i
)
1507 type
= TREE_VEC_ELT (argpack
, i
);
1510 pp_cxx_separate_with (pp
, ',');
1514 pp_cxx_type_id (pp
, type
);
1517 pp_cxx_right_paren (pp
);
1520 /* direct-declarator:
1522 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1523 exception-specification(opt)
1524 direct-declaration [ constant-expression(opt) ]
1528 pp_cxx_direct_declarator (cxx_pretty_printer
*pp
, tree t
)
1530 switch (TREE_CODE (t
))
1538 pp_cxx_space_for_pointer_operator (pp
, TREE_TYPE (t
));
1540 if ((TREE_CODE (t
) == PARM_DECL
&& FUNCTION_PARAMETER_PACK_P (t
))
1541 || template_parameter_pack_p (t
))
1542 /* A function parameter pack or non-type template
1544 pp_cxx_ws_string (pp
, "...");
1546 pp_id_expression (pp
, DECL_NAME (t
));
1548 pp_cxx_abstract_declarator (pp
, TREE_TYPE (t
));
1552 pp_cxx_space_for_pointer_operator (pp
, TREE_TYPE (TREE_TYPE (t
)));
1553 pp_id_expression (pp
, t
);
1554 pp_cxx_parameter_declaration_clause (pp
, t
);
1556 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t
))
1558 pp
->padding
= pp_before
;
1559 pp_cxx_cv_qualifier_seq (pp
, pp_cxx_implicit_parameter_type (t
));
1562 pp_cxx_exception_specification (pp
, TREE_TYPE (t
));
1567 case TEMPLATE_TYPE_PARM
:
1568 case TEMPLATE_PARM_INDEX
:
1569 case TEMPLATE_TEMPLATE_PARM
:
1573 pp_c_direct_declarator (pp
, t
);
1580 ptr-operator declarator */
1583 pp_cxx_declarator (cxx_pretty_printer
*pp
, tree t
)
1585 pp_cxx_direct_declarator (pp
, t
);
1588 /* ctor-initializer:
1589 : mem-initializer-list
1591 mem-initializer-list:
1593 mem-initializer , mem-initializer-list
1596 mem-initializer-id ( expression-list(opt) )
1599 ::(opt) nested-name-specifier(opt) class-name
1603 pp_cxx_ctor_initializer (cxx_pretty_printer
*pp
, tree t
)
1605 t
= TREE_OPERAND (t
, 0);
1606 pp_cxx_whitespace (pp
);
1608 pp_cxx_whitespace (pp
);
1609 for (; t
; t
= TREE_CHAIN (t
))
1611 tree purpose
= TREE_PURPOSE (t
);
1612 bool is_pack
= PACK_EXPANSION_P (purpose
);
1615 pp_cxx_primary_expression (pp
, PACK_EXPANSION_PATTERN (purpose
));
1617 pp_cxx_primary_expression (pp
, purpose
);
1618 pp_cxx_call_argument_list (pp
, TREE_VALUE (t
));
1620 pp_cxx_ws_string (pp
, "...");
1622 pp_cxx_separate_with (pp
, ',');
1626 /* function-definition:
1627 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1628 decl-specifier-seq(opt) declarator function-try-block */
1631 pp_cxx_function_definition (cxx_pretty_printer
*pp
, tree t
)
1633 tree saved_scope
= pp
->enclosing_scope
;
1634 pp_cxx_decl_specifier_seq (pp
, t
);
1635 pp_cxx_declarator (pp
, t
);
1636 pp_needs_newline (pp
) = true;
1637 pp
->enclosing_scope
= DECL_CONTEXT (t
);
1638 if (DECL_SAVED_TREE (t
))
1639 pp_cxx_statement (pp
, DECL_SAVED_TREE (t
));
1641 pp_cxx_semicolon (pp
);
1642 pp_newline_and_flush (pp
);
1643 pp
->enclosing_scope
= saved_scope
;
1646 /* abstract-declarator:
1647 ptr-operator abstract-declarator(opt)
1648 direct-abstract-declarator */
1651 pp_cxx_abstract_declarator (cxx_pretty_printer
*pp
, tree t
)
1653 if (TYPE_PTRMEM_P (t
))
1654 pp_cxx_right_paren (pp
);
1655 else if (POINTER_TYPE_P (t
))
1657 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
1658 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
1659 pp_cxx_right_paren (pp
);
1662 pp_cxx_direct_abstract_declarator (pp
, t
);
1665 /* direct-abstract-declarator:
1666 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1667 cv-qualifier-seq(opt) exception-specification(opt)
1668 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1669 ( abstract-declarator ) */
1672 pp_cxx_direct_abstract_declarator (cxx_pretty_printer
*pp
, tree t
)
1674 switch (TREE_CODE (t
))
1676 case REFERENCE_TYPE
:
1677 pp_cxx_abstract_declarator (pp
, t
);
1681 if (TYPE_PTRMEMFUNC_P (t
))
1682 pp_cxx_direct_abstract_declarator (pp
, TYPE_PTRMEMFUNC_FN_TYPE (t
));
1687 pp_cxx_parameter_declaration_clause (pp
, t
);
1688 pp_cxx_direct_abstract_declarator (pp
, TREE_TYPE (t
));
1689 if (TREE_CODE (t
) == METHOD_TYPE
)
1691 pp
->padding
= pp_before
;
1692 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (t
));
1694 pp_cxx_exception_specification (pp
, t
);
1698 case TEMPLATE_TYPE_PARM
:
1699 case TEMPLATE_TEMPLATE_PARM
:
1700 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1701 case UNBOUND_CLASS_TEMPLATE
:
1705 pp_c_direct_abstract_declarator (pp
, t
);
1711 type-specifier-seq abstract-declarator(opt) */
1714 pp_cxx_type_id (cxx_pretty_printer
*pp
, tree t
)
1716 pp_flags saved_flags
= pp
->flags
;
1717 pp
->flags
|= pp_c_flag_abstract
;
1719 switch (TREE_CODE (t
))
1726 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1727 case UNBOUND_CLASS_TEMPLATE
:
1728 case TEMPLATE_TEMPLATE_PARM
:
1729 case TEMPLATE_TYPE_PARM
:
1730 case TEMPLATE_PARM_INDEX
:
1733 case UNDERLYING_TYPE
:
1735 case TEMPLATE_ID_EXPR
:
1736 pp_cxx_type_specifier_seq (pp
, t
);
1739 case TYPE_PACK_EXPANSION
:
1740 pp_cxx_type_id (pp
, PACK_EXPANSION_PATTERN (t
));
1741 pp_cxx_ws_string (pp
, "...");
1745 pp_c_type_id (pp
, t
);
1749 pp
->flags
= saved_flags
;
1752 /* template-argument-list:
1753 template-argument ...(opt)
1754 template-argument-list, template-argument ...(opt)
1757 assignment-expression
1762 pp_cxx_template_argument_list (cxx_pretty_printer
*pp
, tree t
)
1765 bool need_comma
= false;
1769 for (i
= 0; i
< TREE_VEC_LENGTH (t
); ++i
)
1771 tree arg
= TREE_VEC_ELT (t
, i
);
1772 tree argpack
= NULL_TREE
;
1775 if (ARGUMENT_PACK_P (arg
))
1777 argpack
= ARGUMENT_PACK_ARGS (arg
);
1778 len
= TREE_VEC_LENGTH (argpack
);
1781 for (idx
= 0; idx
< len
; idx
++)
1784 arg
= TREE_VEC_ELT (argpack
, idx
);
1787 pp_cxx_separate_with (pp
, ',');
1791 if (TYPE_P (arg
) || (TREE_CODE (arg
) == TEMPLATE_DECL
1792 && TYPE_P (DECL_TEMPLATE_RESULT (arg
))))
1793 pp_cxx_type_id (pp
, arg
);
1795 pp_cxx_expression (pp
, arg
);
1802 pp_cxx_exception_declaration (cxx_pretty_printer
*pp
, tree t
)
1804 t
= DECL_EXPR_DECL (t
);
1805 pp_cxx_type_specifier_seq (pp
, t
);
1807 pp_cxx_abstract_declarator (pp
, t
);
1809 pp_cxx_declarator (pp
, t
);
1815 pp_cxx_statement (cxx_pretty_printer
*pp
, tree t
)
1817 switch (TREE_CODE (t
))
1819 case CTOR_INITIALIZER
:
1820 pp_cxx_ctor_initializer (pp
, t
);
1824 pp_cxx_ws_string (pp
, "using");
1825 pp_cxx_ws_string (pp
, "namespace");
1826 if (DECL_CONTEXT (t
))
1827 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
1828 pp_cxx_qualified_id (pp
, USING_STMT_NAMESPACE (t
));
1832 pp_cxx_ws_string (pp
, "using");
1833 pp_cxx_nested_name_specifier (pp
, USING_DECL_SCOPE (t
));
1834 pp_cxx_unqualified_id (pp
, DECL_NAME (t
));
1841 try compound-statement handler-seq */
1843 pp_maybe_newline_and_indent (pp
, 0);
1844 pp_cxx_ws_string (pp
, "try");
1845 pp_newline_and_indent (pp
, 3);
1846 pp_cxx_statement (pp
, TRY_STMTS (t
));
1847 pp_newline_and_indent (pp
, -3);
1851 pp_cxx_statement (pp
, TRY_HANDLERS (t
));
1856 handler handler-seq(opt)
1859 catch ( exception-declaration ) compound-statement
1861 exception-declaration:
1862 type-specifier-seq declarator
1863 type-specifier-seq abstract-declarator
1866 pp_cxx_ws_string (pp
, "catch");
1867 pp_cxx_left_paren (pp
);
1868 pp_cxx_exception_declaration (pp
, HANDLER_PARMS (t
));
1869 pp_cxx_right_paren (pp
);
1870 pp_indentation (pp
) += 3;
1871 pp_needs_newline (pp
) = true;
1872 pp_cxx_statement (pp
, HANDLER_BODY (t
));
1873 pp_indentation (pp
) -= 3;
1874 pp_needs_newline (pp
) = true;
1877 /* selection-statement:
1878 if ( expression ) statement
1879 if ( expression ) statement else statement */
1881 pp_cxx_ws_string (pp
, "if");
1882 pp_cxx_whitespace (pp
);
1883 pp_cxx_left_paren (pp
);
1884 pp_cxx_expression (pp
, IF_COND (t
));
1885 pp_cxx_right_paren (pp
);
1886 pp_newline_and_indent (pp
, 2);
1887 pp_cxx_statement (pp
, THEN_CLAUSE (t
));
1888 pp_newline_and_indent (pp
, -2);
1889 if (ELSE_CLAUSE (t
))
1891 tree else_clause
= ELSE_CLAUSE (t
);
1892 pp_cxx_ws_string (pp
, "else");
1893 if (TREE_CODE (else_clause
) == IF_STMT
)
1894 pp_cxx_whitespace (pp
);
1896 pp_newline_and_indent (pp
, 2);
1897 pp_cxx_statement (pp
, else_clause
);
1898 if (TREE_CODE (else_clause
) != IF_STMT
)
1899 pp_newline_and_indent (pp
, -2);
1904 pp_cxx_ws_string (pp
, "switch");
1906 pp_cxx_left_paren (pp
);
1907 pp_cxx_expression (pp
, SWITCH_STMT_COND (t
));
1908 pp_cxx_right_paren (pp
);
1909 pp_indentation (pp
) += 3;
1910 pp_needs_newline (pp
) = true;
1911 pp_cxx_statement (pp
, SWITCH_STMT_BODY (t
));
1912 pp_newline_and_indent (pp
, -3);
1915 /* iteration-statement:
1916 while ( expression ) statement
1917 do statement while ( expression ) ;
1918 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1919 for ( declaration expression(opt) ; expression(opt) ) statement */
1921 pp_cxx_ws_string (pp
, "while");
1923 pp_cxx_left_paren (pp
);
1924 pp_cxx_expression (pp
, WHILE_COND (t
));
1925 pp_cxx_right_paren (pp
);
1926 pp_newline_and_indent (pp
, 3);
1927 pp_cxx_statement (pp
, WHILE_BODY (t
));
1928 pp_indentation (pp
) -= 3;
1929 pp_needs_newline (pp
) = true;
1933 pp_cxx_ws_string (pp
, "do");
1934 pp_newline_and_indent (pp
, 3);
1935 pp_cxx_statement (pp
, DO_BODY (t
));
1936 pp_newline_and_indent (pp
, -3);
1937 pp_cxx_ws_string (pp
, "while");
1939 pp_cxx_left_paren (pp
);
1940 pp_cxx_expression (pp
, DO_COND (t
));
1941 pp_cxx_right_paren (pp
);
1942 pp_cxx_semicolon (pp
);
1943 pp_needs_newline (pp
) = true;
1947 pp_cxx_ws_string (pp
, "for");
1949 pp_cxx_left_paren (pp
);
1950 if (FOR_INIT_STMT (t
))
1951 pp_cxx_statement (pp
, FOR_INIT_STMT (t
));
1953 pp_cxx_semicolon (pp
);
1954 pp_needs_newline (pp
) = false;
1955 pp_cxx_whitespace (pp
);
1957 pp_cxx_expression (pp
, FOR_COND (t
));
1958 pp_cxx_semicolon (pp
);
1959 pp_needs_newline (pp
) = false;
1960 pp_cxx_whitespace (pp
);
1962 pp_cxx_expression (pp
, FOR_EXPR (t
));
1963 pp_cxx_right_paren (pp
);
1964 pp_newline_and_indent (pp
, 3);
1965 pp_cxx_statement (pp
, FOR_BODY (t
));
1966 pp_indentation (pp
) -= 3;
1967 pp_needs_newline (pp
) = true;
1970 case RANGE_FOR_STMT
:
1971 pp_cxx_ws_string (pp
, "for");
1973 pp_cxx_left_paren (pp
);
1974 pp_cxx_statement (pp
, RANGE_FOR_DECL (t
));
1976 pp_needs_newline (pp
) = false;
1979 pp_cxx_statement (pp
, RANGE_FOR_EXPR (t
));
1980 pp_cxx_right_paren (pp
);
1981 pp_newline_and_indent (pp
, 3);
1982 pp_cxx_statement (pp
, FOR_BODY (t
));
1983 pp_indentation (pp
) -= 3;
1984 pp_needs_newline (pp
) = true;
1990 return expression(opt) ; */
1993 pp_string (pp
, TREE_CODE (t
) == BREAK_STMT
? "break" : "continue");
1994 pp_cxx_semicolon (pp
);
1995 pp_needs_newline (pp
) = true;
1998 /* expression-statement:
1999 expression(opt) ; */
2001 pp_cxx_expression (pp
, EXPR_STMT_EXPR (t
));
2002 pp_cxx_semicolon (pp
);
2003 pp_needs_newline (pp
) = true;
2007 pp_cxx_ws_string (pp
, "try");
2008 pp_newline_and_indent (pp
, 2);
2009 pp_cxx_statement (pp
, CLEANUP_BODY (t
));
2010 pp_newline_and_indent (pp
, -2);
2011 pp_cxx_ws_string (pp
, CLEANUP_EH_ONLY (t
) ? "catch" : "finally");
2012 pp_newline_and_indent (pp
, 2);
2013 pp_cxx_statement (pp
, CLEANUP_EXPR (t
));
2014 pp_newline_and_indent (pp
, -2);
2018 pp_cxx_declaration (pp
, t
);
2022 pp_c_statement (pp
, t
);
2027 /* original-namespace-definition:
2028 namespace identifier { namespace-body }
2030 As an edge case, we also handle unnamed namespace definition here. */
2033 pp_cxx_original_namespace_definition (cxx_pretty_printer
*pp
, tree t
)
2035 pp_cxx_ws_string (pp
, "namespace");
2036 if (DECL_CONTEXT (t
))
2037 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
2039 pp_cxx_unqualified_id (pp
, t
);
2040 pp_cxx_whitespace (pp
);
2041 pp_cxx_left_brace (pp
);
2042 /* We do not print the namespace-body. */
2043 pp_cxx_whitespace (pp
);
2044 pp_cxx_right_brace (pp
);
2050 namespace-alias-definition:
2051 namespace identifier = qualified-namespace-specifier ;
2053 qualified-namespace-specifier:
2054 ::(opt) nested-name-specifier(opt) namespace-name */
2057 pp_cxx_namespace_alias_definition (cxx_pretty_printer
*pp
, tree t
)
2059 pp_cxx_ws_string (pp
, "namespace");
2060 if (DECL_CONTEXT (t
))
2061 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
2062 pp_cxx_unqualified_id (pp
, t
);
2063 pp_cxx_whitespace (pp
);
2065 pp_cxx_whitespace (pp
);
2066 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t
)))
2067 pp_cxx_nested_name_specifier (pp
,
2068 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t
)));
2069 pp_cxx_qualified_id (pp
, DECL_NAMESPACE_ALIAS (t
));
2070 pp_cxx_semicolon (pp
);
2073 /* simple-declaration:
2074 decl-specifier-seq(opt) init-declarator-list(opt) */
2077 pp_cxx_simple_declaration (cxx_pretty_printer
*pp
, tree t
)
2079 pp_cxx_decl_specifier_seq (pp
, t
);
2080 pp_cxx_init_declarator (pp
, t
);
2081 pp_cxx_semicolon (pp
);
2082 pp_needs_newline (pp
) = true;
2086 template-parameter-list:
2088 template-parameter-list , template-parameter */
2091 pp_cxx_template_parameter_list (cxx_pretty_printer
*pp
, tree t
)
2093 const int n
= TREE_VEC_LENGTH (t
);
2095 for (i
= 0; i
< n
; ++i
)
2098 pp_cxx_separate_with (pp
, ',');
2099 pp_cxx_template_parameter (pp
, TREE_VEC_ELT (t
, i
));
2103 /* template-parameter:
2105 parameter-declaration
2108 class ...(opt) identifier(opt)
2109 class identifier(opt) = type-id
2110 typename identifier(opt)
2111 typename ...(opt) identifier(opt) = type-id
2112 template < template-parameter-list > class ...(opt) identifier(opt)
2113 template < template-parameter-list > class identifier(opt) = template-name */
2116 pp_cxx_template_parameter (cxx_pretty_printer
*pp
, tree t
)
2118 tree parameter
= TREE_VALUE (t
);
2119 switch (TREE_CODE (parameter
))
2122 pp_cxx_ws_string (pp
, "class");
2123 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
2124 pp_cxx_ws_string (pp
, "...");
2125 if (DECL_NAME (parameter
))
2126 pp_cxx_tree_identifier (pp
, DECL_NAME (parameter
));
2127 /* FIXME: Check if we should print also default argument. */
2131 pp_cxx_parameter_declaration (pp
, parameter
);
2138 pp_unsupported_tree (pp
, t
);
2143 /* Pretty-print a template parameter in the canonical form
2144 "template-parameter-<level>-<position in parameter list>". */
2147 pp_cxx_canonical_template_parameter (cxx_pretty_printer
*pp
, tree parm
)
2149 const enum tree_code code
= TREE_CODE (parm
);
2151 /* Brings type template parameters to the canonical forms. */
2152 if (code
== TEMPLATE_TYPE_PARM
|| code
== TEMPLATE_TEMPLATE_PARM
2153 || code
== BOUND_TEMPLATE_TEMPLATE_PARM
)
2154 parm
= TEMPLATE_TYPE_PARM_INDEX (parm
);
2156 pp_cxx_begin_template_argument_list (pp
);
2157 pp_cxx_ws_string (pp
, M_("template-parameter-"));
2158 pp_wide_integer (pp
, TEMPLATE_PARM_LEVEL (parm
));
2160 pp_wide_integer (pp
, TEMPLATE_PARM_IDX (parm
) + 1);
2161 pp_cxx_end_template_argument_list (pp
);
2165 template-declaration:
2166 export(opt) template < template-parameter-list > declaration */
2169 pp_cxx_template_declaration (cxx_pretty_printer
*pp
, tree t
)
2171 tree tmpl
= most_general_template (t
);
2174 pp_maybe_newline_and_indent (pp
, 0);
2175 for (level
= DECL_TEMPLATE_PARMS (tmpl
); level
; level
= TREE_CHAIN (level
))
2177 pp_cxx_ws_string (pp
, "template");
2178 pp_cxx_begin_template_argument_list (pp
);
2179 pp_cxx_template_parameter_list (pp
, TREE_VALUE (level
));
2180 pp_cxx_end_template_argument_list (pp
);
2181 pp_newline_and_indent (pp
, 3);
2183 if (TREE_CODE (t
) == FUNCTION_DECL
&& DECL_SAVED_TREE (t
))
2184 pp_cxx_function_definition (pp
, t
);
2186 pp_cxx_simple_declaration (pp
, t
);
2190 pp_cxx_explicit_specialization (cxx_pretty_printer
*pp
, tree t
)
2192 pp_unsupported_tree (pp
, t
);
2196 pp_cxx_explicit_instantiation (cxx_pretty_printer
*pp
, tree t
)
2198 pp_unsupported_tree (pp
, t
);
2205 template-declaration
2206 explicit-instantiation
2207 explicit-specialization
2208 linkage-specification
2209 namespace-definition
2214 namespace-alias-definition
2217 static_assert-declaration */
2219 pp_cxx_declaration (cxx_pretty_printer
*pp
, tree t
)
2221 if (TREE_CODE (t
) == STATIC_ASSERT
)
2223 pp_cxx_ws_string (pp
, "static_assert");
2224 pp_cxx_left_paren (pp
);
2225 pp_cxx_expression (pp
, STATIC_ASSERT_CONDITION (t
));
2226 pp_cxx_separate_with (pp
, ',');
2227 pp_cxx_expression (pp
, STATIC_ASSERT_MESSAGE (t
));
2228 pp_cxx_right_paren (pp
);
2230 else if (!DECL_LANG_SPECIFIC (t
))
2231 pp_cxx_simple_declaration (pp
, t
);
2232 else if (DECL_USE_TEMPLATE (t
))
2233 switch (DECL_USE_TEMPLATE (t
))
2236 pp_cxx_template_declaration (pp
, t
);
2240 pp_cxx_explicit_specialization (pp
, t
);
2244 pp_cxx_explicit_instantiation (pp
, t
);
2250 else switch (TREE_CODE (t
))
2254 pp_cxx_simple_declaration (pp
, t
);
2258 if (DECL_SAVED_TREE (t
))
2259 pp_cxx_function_definition (pp
, t
);
2261 pp_cxx_simple_declaration (pp
, t
);
2264 case NAMESPACE_DECL
:
2265 if (DECL_NAMESPACE_ALIAS (t
))
2266 pp_cxx_namespace_alias_definition (pp
, t
);
2268 pp_cxx_original_namespace_definition (pp
, t
);
2272 pp_unsupported_tree (pp
, t
);
2278 pp_cxx_typeid_expression (cxx_pretty_printer
*pp
, tree t
)
2280 t
= TREE_OPERAND (t
, 0);
2281 pp_cxx_ws_string (pp
, "typeid");
2282 pp_cxx_left_paren (pp
);
2284 pp_cxx_type_id (pp
, t
);
2286 pp_cxx_expression (pp
, t
);
2287 pp_cxx_right_paren (pp
);
2291 pp_cxx_va_arg_expression (cxx_pretty_printer
*pp
, tree t
)
2293 pp_cxx_ws_string (pp
, "va_arg");
2294 pp_cxx_left_paren (pp
);
2295 pp_cxx_assignment_expression (pp
, TREE_OPERAND (t
, 0));
2296 pp_cxx_separate_with (pp
, ',');
2297 pp_cxx_type_id (pp
, TREE_TYPE (t
));
2298 pp_cxx_right_paren (pp
);
2302 pp_cxx_offsetof_expression_1 (cxx_pretty_printer
*pp
, tree t
)
2304 switch (TREE_CODE (t
))
2307 if (TREE_CODE (TREE_OPERAND (t
, 0)) == STATIC_CAST_EXPR
2308 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t
, 0))))
2310 pp_cxx_type_id (pp
, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))));
2311 pp_cxx_separate_with (pp
, ',');
2316 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2318 if (TREE_CODE (TREE_OPERAND (t
, 0)) != ARROW_EXPR
)
2320 pp_cxx_expression (pp
, TREE_OPERAND (t
, 1));
2323 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2325 pp_left_bracket (pp
);
2326 pp_cxx_expression (pp
, TREE_OPERAND (t
, 1));
2327 pp_right_bracket (pp
);
2335 pp_cxx_offsetof_expression (cxx_pretty_printer
*pp
, tree t
)
2337 pp_cxx_ws_string (pp
, "offsetof");
2338 pp_cxx_left_paren (pp
);
2339 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2340 pp_cxx_expression (pp
, TREE_OPERAND (t
, 0));
2341 pp_cxx_right_paren (pp
);
2345 pp_cxx_trait_expression (cxx_pretty_printer
*pp
, tree t
)
2347 cp_trait_kind kind
= TRAIT_EXPR_KIND (t
);
2351 case CPTK_HAS_NOTHROW_ASSIGN
:
2352 pp_cxx_ws_string (pp
, "__has_nothrow_assign");
2354 case CPTK_HAS_TRIVIAL_ASSIGN
:
2355 pp_cxx_ws_string (pp
, "__has_trivial_assign");
2357 case CPTK_HAS_NOTHROW_CONSTRUCTOR
:
2358 pp_cxx_ws_string (pp
, "__has_nothrow_constructor");
2360 case CPTK_HAS_TRIVIAL_CONSTRUCTOR
:
2361 pp_cxx_ws_string (pp
, "__has_trivial_constructor");
2363 case CPTK_HAS_NOTHROW_COPY
:
2364 pp_cxx_ws_string (pp
, "__has_nothrow_copy");
2366 case CPTK_HAS_TRIVIAL_COPY
:
2367 pp_cxx_ws_string (pp
, "__has_trivial_copy");
2369 case CPTK_HAS_TRIVIAL_DESTRUCTOR
:
2370 pp_cxx_ws_string (pp
, "__has_trivial_destructor");
2372 case CPTK_HAS_VIRTUAL_DESTRUCTOR
:
2373 pp_cxx_ws_string (pp
, "__has_virtual_destructor");
2375 case CPTK_IS_ABSTRACT
:
2376 pp_cxx_ws_string (pp
, "__is_abstract");
2378 case CPTK_IS_BASE_OF
:
2379 pp_cxx_ws_string (pp
, "__is_base_of");
2382 pp_cxx_ws_string (pp
, "__is_class");
2384 case CPTK_IS_CONVERTIBLE_TO
:
2385 pp_cxx_ws_string (pp
, "__is_convertible_to");
2388 pp_cxx_ws_string (pp
, "__is_empty");
2391 pp_cxx_ws_string (pp
, "__is_enum");
2394 pp_cxx_ws_string (pp
, "__is_final");
2397 pp_cxx_ws_string (pp
, "__is_pod");
2399 case CPTK_IS_POLYMORPHIC
:
2400 pp_cxx_ws_string (pp
, "__is_polymorphic");
2402 case CPTK_IS_STD_LAYOUT
:
2403 pp_cxx_ws_string (pp
, "__is_std_layout");
2405 case CPTK_IS_TRIVIAL
:
2406 pp_cxx_ws_string (pp
, "__is_trivial");
2409 pp_cxx_ws_string (pp
, "__is_union");
2411 case CPTK_IS_LITERAL_TYPE
:
2412 pp_cxx_ws_string (pp
, "__is_literal_type");
2419 pp_cxx_left_paren (pp
);
2420 pp_cxx_type_id (pp
, TRAIT_EXPR_TYPE1 (t
));
2422 if (kind
== CPTK_IS_BASE_OF
|| kind
== CPTK_IS_CONVERTIBLE_TO
)
2424 pp_cxx_separate_with (pp
, ',');
2425 pp_cxx_type_id (pp
, TRAIT_EXPR_TYPE2 (t
));
2428 pp_cxx_right_paren (pp
);
2431 typedef c_pretty_print_fn pp_fun
;
2433 /* Initialization of a C++ pretty-printer object. */
2435 cxx_pretty_printer::cxx_pretty_printer ()
2436 : c_pretty_printer (),
2437 enclosing_scope (global_namespace
)
2439 pp_set_line_maximum_length (this, 0);
2441 declaration
= (pp_fun
) pp_cxx_declaration
;
2442 declaration_specifiers
= (pp_fun
) pp_cxx_decl_specifier_seq
;
2443 function_specifier
= (pp_fun
) pp_cxx_function_specifier
;
2444 type_specifier_seq
= (pp_fun
) pp_cxx_type_specifier_seq
;
2445 declarator
= (pp_fun
) pp_cxx_declarator
;
2446 direct_declarator
= (pp_fun
) pp_cxx_direct_declarator
;
2447 parameter_list
= (pp_fun
) pp_cxx_parameter_declaration_clause
;
2448 type_id
= (pp_fun
) pp_cxx_type_id
;
2449 abstract_declarator
= (pp_fun
) pp_cxx_abstract_declarator
;
2450 direct_abstract_declarator
= (pp_fun
) pp_cxx_direct_abstract_declarator
;
2451 simple_type_specifier
= (pp_fun
) pp_cxx_simple_type_specifier
;
2453 /* pp->statement = (pp_fun) pp_cxx_statement; */
2455 primary_expression
= (pp_fun
) pp_cxx_primary_expression
;
2456 postfix_expression
= (pp_fun
) pp_cxx_postfix_expression
;
2457 unary_expression
= (pp_fun
) pp_cxx_unary_expression
;
2458 multiplicative_expression
= (pp_fun
) pp_cxx_multiplicative_expression
;
2459 conditional_expression
= (pp_fun
) pp_cxx_conditional_expression
;
2460 assignment_expression
= (pp_fun
) pp_cxx_assignment_expression
;
2461 expression
= (pp_fun
) pp_cxx_expression
;