1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2 Copyright (C) 2003-2020 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"
25 #include "cxx-pretty-print.h"
26 #include "tree-pretty-print.h"
28 static void pp_cxx_unqualified_id (cxx_pretty_printer
*, tree
);
29 static void pp_cxx_nested_name_specifier (cxx_pretty_printer
*, tree
);
30 static void pp_cxx_qualified_id (cxx_pretty_printer
*, tree
);
31 static void pp_cxx_template_argument_list (cxx_pretty_printer
*, tree
);
32 static void pp_cxx_type_specifier_seq (cxx_pretty_printer
*, tree
);
33 static void pp_cxx_ptr_operator (cxx_pretty_printer
*, tree
);
34 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer
*, tree
);
35 static void pp_cxx_template_parameter (cxx_pretty_printer
*, tree
);
36 static void pp_cxx_cast_expression (cxx_pretty_printer
*, tree
);
37 static void pp_cxx_typeid_expression (cxx_pretty_printer
*, tree
);
38 static void pp_cxx_unary_left_fold_expression (cxx_pretty_printer
*, tree
);
39 static void pp_cxx_unary_right_fold_expression (cxx_pretty_printer
*, tree
);
40 static void pp_cxx_binary_fold_expression (cxx_pretty_printer
*, tree
);
41 static void pp_cxx_concept_definition (cxx_pretty_printer
*, tree
);
45 pp_cxx_nonconsecutive_character (cxx_pretty_printer
*pp
, int c
)
47 const char *p
= pp_last_position_in_text (pp
);
49 if (p
!= NULL
&& *p
== c
)
50 pp_cxx_whitespace (pp
);
52 pp
->padding
= pp_none
;
55 #define pp_cxx_expression_list(PP, T) \
56 pp_c_expression_list (PP, T)
57 #define pp_cxx_space_for_pointer_operator(PP, T) \
58 pp_c_space_for_pointer_operator (PP, T)
59 #define pp_cxx_init_declarator(PP, T) \
60 pp_c_init_declarator (PP, T)
61 #define pp_cxx_call_argument_list(PP, T) \
62 pp_c_call_argument_list (PP, T)
65 pp_cxx_colon_colon (cxx_pretty_printer
*pp
)
68 pp
->padding
= pp_none
;
72 pp_cxx_begin_template_argument_list (cxx_pretty_printer
*pp
)
74 pp_cxx_nonconsecutive_character (pp
, '<');
78 pp_cxx_end_template_argument_list (cxx_pretty_printer
*pp
)
80 pp_cxx_nonconsecutive_character (pp
, '>');
84 pp_cxx_separate_with (cxx_pretty_printer
*pp
, int c
)
86 pp_separate_with (pp
, c
);
87 pp
->padding
= pp_none
;
92 /* conversion-function-id:
93 operator conversion-type-id
96 type-specifier-seq conversion-declarator(opt)
98 conversion-declarator:
99 ptr-operator conversion-declarator(opt) */
102 pp_cxx_conversion_function_id (cxx_pretty_printer
*pp
, tree t
)
104 pp_cxx_ws_string (pp
, "operator");
105 pp_cxx_type_specifier_seq (pp
, TREE_TYPE (t
));
109 pp_cxx_template_id (cxx_pretty_printer
*pp
, tree t
)
111 pp_cxx_unqualified_id (pp
, TREE_OPERAND (t
, 0));
112 pp_cxx_begin_template_argument_list (pp
);
113 pp_cxx_template_argument_list (pp
, TREE_OPERAND (t
, 1));
114 pp_cxx_end_template_argument_list (pp
);
117 /* Prints the unqualified part of the id-expression T.
122 conversion-function-id
127 pp_cxx_unqualified_id (cxx_pretty_printer
*pp
, tree t
)
129 enum tree_code code
= TREE_CODE (t
);
133 pp
->translate_string ("<return-value>");
152 case IDENTIFIER_NODE
:
154 pp
->translate_string ("<unnamed>");
155 else if (IDENTIFIER_CONV_OP_P (t
))
156 pp_cxx_conversion_function_id (pp
, t
);
158 pp_cxx_tree_identifier (pp
, t
);
161 case TEMPLATE_ID_EXPR
:
162 pp_cxx_template_id (pp
, t
);
166 pp_cxx_unqualified_id (pp
, BASELINK_FUNCTIONS (t
));
173 case UNBOUND_CLASS_TEMPLATE
:
174 pp_cxx_unqualified_id (pp
, TYPE_NAME (t
));
175 if (tree ti
= TYPE_TEMPLATE_INFO_MAYBE_ALIAS (t
))
177 pp_cxx_begin_template_argument_list (pp
);
178 tree args
= INNERMOST_TEMPLATE_ARGS (TI_ARGS (ti
));
179 pp_cxx_template_argument_list (pp
, args
);
180 pp_cxx_end_template_argument_list (pp
);
185 pp_cxx_complement (pp
);
186 pp_cxx_unqualified_id (pp
, TREE_OPERAND (t
, 0));
189 case TEMPLATE_TYPE_PARM
:
190 case TEMPLATE_TEMPLATE_PARM
:
191 if (template_placeholder_p (t
))
193 t
= TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t
));
194 pp_cxx_unqualified_id (pp
, TYPE_IDENTIFIER (t
));
195 pp_string (pp
, "<...auto...>");
197 else if (TYPE_IDENTIFIER (t
))
198 pp_cxx_unqualified_id (pp
, TYPE_IDENTIFIER (t
));
200 pp_cxx_canonical_template_parameter (pp
, t
);
203 case TEMPLATE_PARM_INDEX
:
204 pp_cxx_unqualified_id (pp
, TEMPLATE_PARM_DECL (t
));
207 case BOUND_TEMPLATE_TEMPLATE_PARM
:
208 pp_cxx_cv_qualifier_seq (pp
, t
);
209 pp_cxx_unqualified_id (pp
, TYPE_IDENTIFIER (t
));
210 pp_cxx_begin_template_argument_list (pp
);
211 pp_cxx_template_argument_list (pp
, TYPE_TI_ARGS (t
));
212 pp_cxx_end_template_argument_list (pp
);
216 pp_unsupported_tree (pp
, t
);
221 /* Pretty-print out the token sequence ":: template" in template codes
222 where it is needed to "inline declare" the (following) member as
223 a template. This situation arises when SCOPE of T is dependent
224 on template parameters. */
227 pp_cxx_template_keyword_if_needed (cxx_pretty_printer
*pp
, tree scope
, tree t
)
229 if (TREE_CODE (t
) == TEMPLATE_ID_EXPR
230 && TYPE_P (scope
) && dependent_type_p (scope
))
231 pp_cxx_ws_string (pp
, "template");
234 /* nested-name-specifier:
235 class-or-namespace-name :: nested-name-specifier(opt)
236 class-or-namespace-name :: template nested-name-specifier */
239 pp_cxx_nested_name_specifier (cxx_pretty_printer
*pp
, tree t
)
241 /* FIXME: When diagnosing references to concepts (especially as types?)
242 we end up adding too many '::' to the name. This is partially due
243 to the fact that pp->enclosing_namespace is null. */
244 if (t
== global_namespace
)
246 pp_cxx_colon_colon (pp
);
248 else if (!SCOPE_FILE_SCOPE_P (t
) && t
!= pp
->enclosing_scope
)
250 tree scope
= get_containing_scope (t
);
251 pp_cxx_nested_name_specifier (pp
, scope
);
252 pp_cxx_template_keyword_if_needed (pp
, scope
, t
);
253 pp_cxx_unqualified_id (pp
, t
);
254 pp_cxx_colon_colon (pp
);
259 nested-name-specifier template(opt) unqualified-id */
262 pp_cxx_qualified_id (cxx_pretty_printer
*pp
, tree t
)
264 switch (TREE_CODE (t
))
266 /* A pointer-to-member is always qualified. */
268 pp_cxx_nested_name_specifier (pp
, PTRMEM_CST_CLASS (t
));
269 pp_cxx_unqualified_id (pp
, PTRMEM_CST_MEMBER (t
));
272 /* In Standard C++, functions cannot possibly be used as
273 nested-name-specifiers. However, there are situations where
274 is "makes sense" to output the surrounding function name for the
275 purpose of emphasizing on the scope kind. Just printing the
276 function name might not be sufficient as it may be overloaded; so,
277 we decorate the function with its signature too.
278 FIXME: This is probably the wrong pretty-printing for conversion
279 functions and some function templates. */
284 if (DECL_FUNCTION_MEMBER_P (t
))
285 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
286 pp_cxx_unqualified_id
287 (pp
, DECL_CONSTRUCTOR_P (t
) ? DECL_CONTEXT (t
) : t
);
288 pp_cxx_parameter_declaration_clause (pp
, TREE_TYPE (t
));
293 pp_cxx_nested_name_specifier (pp
, TREE_OPERAND (t
, 0));
294 pp_cxx_unqualified_id (pp
, TREE_OPERAND (t
, 1));
299 tree scope
= get_containing_scope (t
);
300 if (scope
!= pp
->enclosing_scope
)
302 pp_cxx_nested_name_specifier (pp
, scope
);
303 pp_cxx_template_keyword_if_needed (pp
, scope
, t
);
305 pp_cxx_unqualified_id (pp
, t
);
311 /* Given a value e of ENUMERAL_TYPE:
312 Print out the first ENUMERATOR id with value e, if one is found,
313 (including nested names but excluding the enum name if unscoped)
314 else print out the value as a C-style cast (type-id)value. */
317 pp_cxx_enumeration_constant (cxx_pretty_printer
*pp
, tree e
)
319 tree type
= TREE_TYPE (e
);
320 tree value
= NULL_TREE
;
322 /* Find the name of this constant. */
323 if ((pp
->flags
& pp_c_flag_gnu_v3
) == 0)
324 for (value
= TYPE_VALUES (type
); value
!= NULL_TREE
;
325 value
= TREE_CHAIN (value
))
326 if (tree_int_cst_equal (DECL_INITIAL (TREE_VALUE (value
)), e
))
329 if (value
!= NULL_TREE
)
331 if (!ENUM_IS_SCOPED (type
))
332 type
= get_containing_scope (type
);
333 pp_cxx_nested_name_specifier (pp
, type
);
334 pp
->id_expression (TREE_PURPOSE (value
));
338 /* Value must have been cast. */
339 pp_c_type_cast (pp
, type
);
340 pp_c_integer_constant (pp
, e
);
346 cxx_pretty_printer::constant (tree t
)
348 switch (TREE_CODE (t
))
352 const bool in_parens
= PAREN_STRING_LITERAL_P (t
);
354 pp_cxx_left_paren (this);
355 c_pretty_printer::constant (t
);
357 pp_cxx_right_paren (this);
362 if (NULLPTR_TYPE_P (TREE_TYPE (t
)))
364 pp_string (this, "nullptr");
367 else if (TREE_CODE (TREE_TYPE (t
)) == ENUMERAL_TYPE
)
369 pp_cxx_enumeration_constant (this, t
);
375 c_pretty_printer::constant (t
);
385 cxx_pretty_printer::id_expression (tree t
)
387 if (TREE_CODE (t
) == OVERLOAD
)
389 if (DECL_P (t
) && DECL_CONTEXT (t
))
390 pp_cxx_qualified_id (this, t
);
392 pp_cxx_unqualified_id (this, t
);
395 /* user-defined literal:
399 pp_cxx_userdef_literal (cxx_pretty_printer
*pp
, tree t
)
401 pp
->constant (USERDEF_LITERAL_VALUE (t
));
402 pp
->id_expression (USERDEF_LITERAL_SUFFIX_ID (t
));
406 /* primary-expression:
410 :: operator-function-id
416 __builtin_va_arg ( assignment-expression , type-id )
417 __builtin_offsetof ( type-id, offsetof-expression )
418 __builtin_addressof ( expression )
420 __has_nothrow_assign ( type-id )
421 __has_nothrow_constructor ( type-id )
422 __has_nothrow_copy ( type-id )
423 __has_trivial_assign ( type-id )
424 __has_trivial_constructor ( type-id )
425 __has_trivial_copy ( type-id )
426 __has_unique_object_representations ( type-id )
427 __has_trivial_destructor ( type-id )
428 __has_virtual_destructor ( type-id )
429 __is_abstract ( type-id )
430 __is_base_of ( type-id , type-id )
431 __is_class ( type-id )
432 __is_empty ( type-id )
433 __is_enum ( type-id )
434 __is_literal_type ( type-id )
436 __is_polymorphic ( type-id )
437 __is_std_layout ( type-id )
438 __is_trivial ( type-id )
439 __is_union ( type-id ) */
442 cxx_pretty_printer::primary_expression (tree t
)
444 switch (TREE_CODE (t
))
454 case USERDEF_LITERAL
:
455 pp_cxx_userdef_literal (this, t
);
459 t
= BASELINK_FUNCTIONS (t
);
472 case TEMPLATE_TYPE_PARM
:
473 case TEMPLATE_TEMPLATE_PARM
:
474 case TEMPLATE_PARM_INDEX
:
475 pp_cxx_unqualified_id (this, t
);
479 pp_cxx_left_paren (this);
480 statement (STMT_EXPR_STMT (t
));
481 pp_cxx_right_paren (this);
485 pp_cxx_trait_expression (this, t
);
489 pp_cxx_va_arg_expression (this, t
);
493 pp_cxx_offsetof_expression (this, t
);
497 pp_cxx_addressof_expression (this, t
);
501 pp_cxx_requires_expr (this, t
);
505 c_pretty_printer::primary_expression (t
);
510 /* postfix-expression:
512 postfix-expression [ expression ]
513 postfix-expression ( expression-list(opt) )
514 simple-type-specifier ( expression-list(opt) )
515 typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
516 typename ::(opt) nested-name-specifier template(opt)
517 template-id ( expression-list(opt) )
518 postfix-expression . template(opt) ::(opt) id-expression
519 postfix-expression -> template(opt) ::(opt) id-expression
520 postfix-expression . pseudo-destructor-name
521 postfix-expression -> pseudo-destructor-name
522 postfix-expression ++
523 postfix-expression --
524 dynamic_cast < type-id > ( expression )
525 static_cast < type-id > ( expression )
526 reinterpret_cast < type-id > ( expression )
527 const_cast < type-id > ( expression )
528 typeid ( expression )
529 typeid ( type-id ) */
532 cxx_pretty_printer::postfix_expression (tree t
)
534 enum tree_code code
= TREE_CODE (t
);
541 tree fun
= cp_get_callee (t
);
542 tree saved_scope
= enclosing_scope
;
543 bool skipfirst
= false;
546 if (TREE_CODE (fun
) == ADDR_EXPR
)
547 fun
= TREE_OPERAND (fun
, 0);
549 /* In templates, where there is no way to tell whether a given
550 call uses an actual member function. So the parser builds
551 FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
552 instantiation time. */
553 if (TREE_CODE (fun
) != FUNCTION_DECL
)
555 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun
))
557 tree object
= (code
== AGGR_INIT_EXPR
558 ? (AGGR_INIT_VIA_CTOR_P (t
)
559 ? AGGR_INIT_EXPR_SLOT (t
)
560 : AGGR_INIT_EXPR_ARG (t
, 0))
561 : CALL_EXPR_ARG (t
, 0));
563 while (TREE_CODE (object
) == NOP_EXPR
)
564 object
= TREE_OPERAND (object
, 0);
566 if (TREE_CODE (object
) == ADDR_EXPR
)
567 object
= TREE_OPERAND (object
, 0);
569 if (!TYPE_PTR_P (TREE_TYPE (object
)))
571 postfix_expression (object
);
576 postfix_expression (object
);
580 enclosing_scope
= strip_pointer_operator (TREE_TYPE (object
));
583 postfix_expression (fun
);
584 enclosing_scope
= saved_scope
;
585 pp_cxx_left_paren (this);
586 if (code
== AGGR_INIT_EXPR
)
588 aggr_init_expr_arg_iterator iter
;
589 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
596 if (more_aggr_init_expr_args_p (&iter
))
597 pp_cxx_separate_with (this, ',');
603 call_expr_arg_iterator iter
;
604 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
611 if (more_call_expr_args_p (&iter
))
612 pp_cxx_separate_with (this, ',');
616 pp_cxx_right_paren (this);
618 if (code
== AGGR_INIT_EXPR
&& AGGR_INIT_VIA_CTOR_P (t
))
620 pp_cxx_separate_with (this, ',');
621 postfix_expression (AGGR_INIT_EXPR_SLOT (t
));
634 primary_expression (t
);
637 case DYNAMIC_CAST_EXPR
:
638 case STATIC_CAST_EXPR
:
639 case REINTERPRET_CAST_EXPR
:
640 case CONST_CAST_EXPR
:
641 if (code
== DYNAMIC_CAST_EXPR
)
642 pp_cxx_ws_string (this, "dynamic_cast");
643 else if (code
== STATIC_CAST_EXPR
)
644 pp_cxx_ws_string (this, "static_cast");
645 else if (code
== REINTERPRET_CAST_EXPR
)
646 pp_cxx_ws_string (this, "reinterpret_cast");
648 pp_cxx_ws_string (this, "const_cast");
649 pp_cxx_begin_template_argument_list (this);
650 type_id (TREE_TYPE (t
));
651 pp_cxx_end_template_argument_list (this);
652 pp_left_paren (this);
653 expression (TREE_OPERAND (t
, 0));
654 pp_right_paren (this);
657 case EMPTY_CLASS_EXPR
:
658 type_id (TREE_TYPE (t
));
659 pp_left_paren (this);
660 pp_right_paren (this);
664 pp_cxx_typeid_expression (this, t
);
667 case PSEUDO_DTOR_EXPR
:
668 postfix_expression (TREE_OPERAND (t
, 0));
670 if (TREE_OPERAND (t
, 1))
672 pp_cxx_qualified_id (this, TREE_OPERAND (t
, 1));
673 pp_cxx_colon_colon (this);
675 pp_complement (this);
676 pp_cxx_unqualified_id (this, TREE_OPERAND (t
, 2));
680 postfix_expression (TREE_OPERAND (t
, 0));
685 c_pretty_printer::postfix_expression (t
);
691 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
692 ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
698 type-specifier-seq new-declarator(opt)
701 ptr-operator new-declarator(opt)
702 direct-new-declarator
704 direct-new-declarator
706 direct-new-declarator [ constant-expression ]
709 ( expression-list(opt) ) */
712 pp_cxx_new_expression (cxx_pretty_printer
*pp
, tree t
)
714 enum tree_code code
= TREE_CODE (t
);
715 tree type
= TREE_OPERAND (t
, 1);
716 tree init
= TREE_OPERAND (t
, 2);
721 if (NEW_EXPR_USE_GLOBAL (t
))
722 pp_cxx_colon_colon (pp
);
723 pp_cxx_ws_string (pp
, "new");
724 if (TREE_OPERAND (t
, 0))
726 pp_cxx_call_argument_list (pp
, TREE_OPERAND (t
, 0));
729 if (TREE_CODE (type
) == ARRAY_REF
)
730 type
= build_cplus_array_type
731 (TREE_OPERAND (type
, 0),
732 build_index_type (fold_build2_loc (input_location
,
733 MINUS_EXPR
, integer_type_node
,
734 TREE_OPERAND (type
, 1),
740 if (TREE_CODE (init
) == TREE_LIST
)
741 pp_c_expression_list (pp
, init
);
742 else if (init
== void_node
)
743 ; /* OK, empty initializer list. */
745 pp
->expression (init
);
751 pp_unsupported_tree (pp
, t
);
755 /* delete-expression:
756 ::(opt) delete cast-expression
757 ::(opt) delete [ ] cast-expression */
760 pp_cxx_delete_expression (cxx_pretty_printer
*pp
, tree t
)
762 enum tree_code code
= TREE_CODE (t
);
766 case VEC_DELETE_EXPR
:
767 if (DELETE_EXPR_USE_GLOBAL (t
))
768 pp_cxx_colon_colon (pp
);
769 pp_cxx_ws_string (pp
, "delete");
771 if (code
== VEC_DELETE_EXPR
772 || DELETE_EXPR_USE_VEC (t
))
774 pp_left_bracket (pp
);
775 pp_right_bracket (pp
);
778 pp_c_cast_expression (pp
, TREE_OPERAND (t
, 0));
782 pp_unsupported_tree (pp
, t
);
790 unary-operator cast-expression
791 sizeof unary-expression
793 sizeof ... ( identifier )
797 unary-operator: one of
801 __alignof__ unary-expression
802 __alignof__ ( type-id ) */
805 cxx_pretty_printer::unary_expression (tree t
)
807 enum tree_code code
= TREE_CODE (t
);
812 pp_cxx_new_expression (this, t
);
816 case VEC_DELETE_EXPR
:
817 pp_cxx_delete_expression (this, t
);
821 if (PACK_EXPANSION_P (TREE_OPERAND (t
, 0)))
823 pp_cxx_ws_string (this, "sizeof");
824 pp_cxx_ws_string (this, "...");
825 pp_cxx_whitespace (this);
826 pp_cxx_left_paren (this);
827 if (TYPE_P (TREE_OPERAND (t
, 0)))
828 type_id (TREE_OPERAND (t
, 0));
830 unary_expression (TREE_OPERAND (t
, 0));
831 pp_cxx_right_paren (this);
837 pp_cxx_ws_string (this, code
== SIZEOF_EXPR
? "sizeof" : "__alignof__");
838 pp_cxx_whitespace (this);
839 if (TREE_CODE (t
) == SIZEOF_EXPR
&& SIZEOF_EXPR_TYPE_P (t
))
841 pp_cxx_left_paren (this);
842 type_id (TREE_TYPE (TREE_OPERAND (t
, 0)));
843 pp_cxx_right_paren (this);
845 else if (TYPE_P (TREE_OPERAND (t
, 0)))
847 pp_cxx_left_paren (this);
848 type_id (TREE_OPERAND (t
, 0));
849 pp_cxx_right_paren (this);
852 unary_expression (TREE_OPERAND (t
, 0));
856 pp_cxx_ws_string (this, "@encode");
857 pp_cxx_whitespace (this);
858 pp_cxx_left_paren (this);
859 type_id (TREE_OPERAND (t
, 0));
860 pp_cxx_right_paren (this);
864 pp_cxx_ws_string (this, "noexcept");
865 pp_cxx_whitespace (this);
866 pp_cxx_left_paren (this);
867 expression (TREE_OPERAND (t
, 0));
868 pp_cxx_right_paren (this);
871 case UNARY_PLUS_EXPR
:
873 pp_cxx_cast_expression (this, TREE_OPERAND (t
, 0));
877 c_pretty_printer::unary_expression (t
);
884 ( type-id ) cast-expression */
887 pp_cxx_cast_expression (cxx_pretty_printer
*pp
, tree t
)
889 switch (TREE_CODE (t
))
892 case IMPLICIT_CONV_EXPR
:
893 pp
->type_id (TREE_TYPE (t
));
894 pp_cxx_call_argument_list (pp
, TREE_OPERAND (t
, 0));
898 pp_c_cast_expression (pp
, t
);
905 pm-expression .* cast-expression
906 pm-expression ->* cast-expression */
909 pp_cxx_pm_expression (cxx_pretty_printer
*pp
, tree t
)
911 switch (TREE_CODE (t
))
913 /* Handle unfortunate OFFSET_REF overloading here. */
915 if (TYPE_P (TREE_OPERAND (t
, 0)))
917 pp_cxx_qualified_id (pp
, t
);
923 pp_cxx_pm_expression (pp
, TREE_OPERAND (t
, 0));
924 if (TREE_CODE (t
) == MEMBER_REF
)
929 pp_cxx_cast_expression (pp
, TREE_OPERAND (t
, 1));
934 pp_cxx_cast_expression (pp
, t
);
939 /* multiplicative-expression:
941 multiplicative-expression * pm-expression
942 multiplicative-expression / pm-expression
943 multiplicative-expression % pm-expression */
946 cxx_pretty_printer::multiplicative_expression (tree e
)
948 enum tree_code code
= TREE_CODE (e
);
956 multiplicative_expression (TREE_OPERAND (e
, 0));
958 if (code
== MULT_EXPR
)
960 else if (code
!= TRUNC_MOD_EXPR
)
965 pp_cxx_pm_expression (this, TREE_OPERAND (e
, 1));
969 pp_cxx_pm_expression (this, e
);
974 /* conditional-expression:
975 logical-or-expression
976 logical-or-expression ? expression : assignment-expression */
979 cxx_pretty_printer::conditional_expression (tree e
)
981 if (TREE_CODE (e
) == COND_EXPR
)
983 pp_c_logical_or_expression (this, TREE_OPERAND (e
, 0));
987 expression (TREE_OPERAND (e
, 1));
989 assignment_expression (TREE_OPERAND (e
, 2));
992 pp_c_logical_or_expression (this, e
);
995 /* Pretty-print a compound assignment operator token as indicated by T. */
998 pp_cxx_assignment_operator (cxx_pretty_printer
*pp
, tree t
)
1002 switch (TREE_CODE (t
))
1016 case TRUNC_DIV_EXPR
:
1020 case TRUNC_MOD_EXPR
:
1025 op
= get_tree_code_name (TREE_CODE (t
));
1029 pp_cxx_ws_string (pp
, op
);
1033 /* assignment-expression:
1034 conditional-expression
1035 logical-or-expression assignment-operator assignment-expression
1039 throw assignment-expression(opt)
1041 assignment-operator: one of
1042 = *= /= %= += -= >>= <<= &= ^= |= */
1045 cxx_pretty_printer::assignment_expression (tree e
)
1047 switch (TREE_CODE (e
))
1051 pp_c_logical_or_expression (this, TREE_OPERAND (e
, 0));
1055 assignment_expression (TREE_OPERAND (e
, 1));
1059 pp_cxx_ws_string (this, "throw");
1060 if (TREE_OPERAND (e
, 0))
1061 assignment_expression (TREE_OPERAND (e
, 0));
1065 pp_c_logical_or_expression (this, TREE_OPERAND (e
, 0));
1066 pp_cxx_assignment_operator (this, TREE_OPERAND (e
, 1));
1067 assignment_expression (TREE_OPERAND (e
, 2));
1071 conditional_expression (e
);
1077 cxx_pretty_printer::expression (tree t
)
1079 switch (TREE_CODE (t
))
1089 case USERDEF_LITERAL
:
1090 pp_cxx_userdef_literal (this, t
);
1094 pp_cxx_unqualified_id (this, t
);
1102 pp_cxx_qualified_id (this, t
);
1115 case TEMPLATE_TYPE_PARM
:
1116 case TEMPLATE_PARM_INDEX
:
1117 case TEMPLATE_TEMPLATE_PARM
:
1120 primary_expression (t
);
1124 case DYNAMIC_CAST_EXPR
:
1125 case STATIC_CAST_EXPR
:
1126 case REINTERPRET_CAST_EXPR
:
1127 case CONST_CAST_EXPR
:
1131 case EMPTY_CLASS_EXPR
:
1133 case PSEUDO_DTOR_EXPR
:
1134 case AGGR_INIT_EXPR
:
1136 postfix_expression (t
);
1141 pp_cxx_new_expression (this, t
);
1145 case VEC_DELETE_EXPR
:
1146 pp_cxx_delete_expression (this, t
);
1152 case UNARY_PLUS_EXPR
:
1153 unary_expression (t
);
1157 case IMPLICIT_CONV_EXPR
:
1158 pp_cxx_cast_expression (this, t
);
1164 pp_cxx_pm_expression (this, t
);
1168 case TRUNC_DIV_EXPR
:
1169 case TRUNC_MOD_EXPR
:
1170 case EXACT_DIV_EXPR
:
1172 multiplicative_expression (t
);
1176 conditional_expression (t
);
1183 assignment_expression (t
);
1186 case NON_DEPENDENT_EXPR
:
1187 case MUST_NOT_THROW_EXPR
:
1188 expression (TREE_OPERAND (t
, 0));
1191 case EXPR_PACK_EXPANSION
:
1192 expression (PACK_EXPANSION_PATTERN (t
));
1193 pp_cxx_ws_string (this, "...");
1196 case UNARY_LEFT_FOLD_EXPR
:
1197 pp_cxx_unary_left_fold_expression (this, t
);
1200 case UNARY_RIGHT_FOLD_EXPR
:
1201 pp_cxx_unary_right_fold_expression (this, t
);
1204 case BINARY_LEFT_FOLD_EXPR
:
1205 case BINARY_RIGHT_FOLD_EXPR
:
1206 pp_cxx_binary_fold_expression (this, t
);
1209 case TEMPLATE_ID_EXPR
:
1210 pp_cxx_template_id (this, t
);
1213 case NONTYPE_ARGUMENT_PACK
:
1215 tree args
= ARGUMENT_PACK_ARGS (t
);
1216 int i
, len
= TREE_VEC_LENGTH (args
);
1217 for (i
= 0; i
< len
; ++i
)
1220 pp_cxx_separate_with (this, ',');
1221 expression (TREE_VEC_ELT (args
, i
));
1227 pp_cxx_ws_string (this, "<lambda>");
1231 pp_cxx_trait_expression (this, t
);
1238 pp_cxx_constraint (this, t
);
1242 pp_cxx_left_paren (this);
1243 expression (TREE_OPERAND (t
, 0));
1244 pp_cxx_right_paren (this);
1248 c_pretty_printer::expression (t
);
1256 /* function-specifier:
1262 cxx_pretty_printer::function_specifier (tree t
)
1264 switch (TREE_CODE (t
))
1267 if (DECL_VIRTUAL_P (t
))
1268 pp_cxx_ws_string (this, "virtual");
1269 else if (DECL_CONSTRUCTOR_P (t
) && DECL_NONCONVERTING_P (t
))
1270 pp_cxx_ws_string (this, "explicit");
1272 c_pretty_printer::function_specifier (t
);
1279 /* decl-specifier-seq:
1280 decl-specifier-seq(opt) decl-specifier
1283 storage-class-specifier
1290 cxx_pretty_printer::declaration_specifiers (tree t
)
1292 switch (TREE_CODE (t
))
1298 storage_class_specifier (t
);
1299 declaration_specifiers (TREE_TYPE (t
));
1303 pp_cxx_ws_string (this, "typedef");
1304 declaration_specifiers (TREE_TYPE (t
));
1308 /* Constructors don't have return types. And conversion functions
1309 do not have a type-specifier in their return types. */
1310 if (DECL_CONSTRUCTOR_P (t
) || DECL_CONV_FN_P (t
))
1311 function_specifier (t
);
1312 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t
))
1313 declaration_specifiers (TREE_TYPE (TREE_TYPE (t
)));
1315 c_pretty_printer::declaration_specifiers (t
);
1318 c_pretty_printer::declaration_specifiers (t
);
1323 /* simple-type-specifier:
1324 ::(opt) nested-name-specifier(opt) type-name
1325 ::(opt) nested-name-specifier(opt) template(opt) template-id
1339 cxx_pretty_printer::simple_type_specifier (tree t
)
1341 switch (TREE_CODE (t
))
1346 pp_cxx_qualified_id (this, t
);
1349 case TEMPLATE_TYPE_PARM
:
1350 case TEMPLATE_TEMPLATE_PARM
:
1351 case TEMPLATE_PARM_INDEX
:
1352 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1353 pp_cxx_unqualified_id (this, t
);
1354 if (tree c
= PLACEHOLDER_TYPE_CONSTRAINTS (t
))
1355 pp_cxx_constrained_type_spec (this, c
);
1359 pp_cxx_ws_string (this, "typename");
1360 pp_cxx_nested_name_specifier (this, TYPE_CONTEXT (t
));
1361 pp_cxx_unqualified_id (this, TYPE_NAME (t
));
1365 c_pretty_printer::simple_type_specifier (t
);
1370 /* type-specifier-seq:
1371 type-specifier type-specifier-seq(opt)
1374 simple-type-specifier
1377 elaborated-type-specifier
1381 pp_cxx_type_specifier_seq (cxx_pretty_printer
*pp
, tree t
)
1383 switch (TREE_CODE (t
))
1386 case TEMPLATE_TYPE_PARM
:
1387 case TEMPLATE_TEMPLATE_PARM
:
1389 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1390 pp_cxx_cv_qualifier_seq (pp
, t
);
1391 pp
->simple_type_specifier (t
);
1395 pp_cxx_type_specifier_seq (pp
, TREE_TYPE (t
));
1396 pp_cxx_space_for_pointer_operator (pp
, TREE_TYPE (t
));
1397 pp_cxx_nested_name_specifier (pp
, TYPE_METHOD_BASETYPE (t
));
1401 pp_cxx_ws_string (pp
, "decltype");
1402 pp_cxx_left_paren (pp
);
1403 pp
->expression (DECLTYPE_TYPE_EXPR (t
));
1404 pp_cxx_right_paren (pp
);
1408 if (TYPE_PTRMEMFUNC_P (t
))
1410 tree pfm
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
1411 pp
->declaration_specifiers (TREE_TYPE (TREE_TYPE (pfm
)));
1412 pp_cxx_whitespace (pp
);
1413 pp_cxx_ptr_operator (pp
, t
);
1419 if (!(TREE_CODE (t
) == FUNCTION_DECL
&& DECL_CONSTRUCTOR_P (t
)))
1420 pp_c_specifier_qualifier_list (pp
, t
);
1425 * cv-qualifier-seq(opt)
1427 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1430 pp_cxx_ptr_operator (cxx_pretty_printer
*pp
, tree t
)
1432 if (!TYPE_P (t
) && TREE_CODE (t
) != TYPE_DECL
)
1434 switch (TREE_CODE (t
))
1436 case REFERENCE_TYPE
:
1438 if (TYPE_PTR_OR_PTRMEM_P (TREE_TYPE (t
)))
1439 pp_cxx_ptr_operator (pp
, TREE_TYPE (t
));
1440 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (TREE_TYPE (t
)));
1444 pp_cxx_cv_qualifier_seq (pp
, t
);
1451 if (TYPE_PTRMEMFUNC_P (t
))
1453 pp_cxx_left_paren (pp
);
1454 pp_cxx_nested_name_specifier (pp
, TYPE_PTRMEMFUNC_OBJECT_TYPE (t
));
1460 if (TYPE_PTRMEM_P (t
))
1462 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
1463 pp_cxx_left_paren (pp
);
1464 pp_cxx_nested_name_specifier (pp
, TYPE_PTRMEM_CLASS_TYPE (t
));
1466 pp_cxx_cv_qualifier_seq (pp
, t
);
1472 pp_unsupported_tree (pp
, t
);
1478 pp_cxx_implicit_parameter_type (tree mf
)
1480 return class_of_this_parm (TREE_TYPE (mf
));
1484 parameter-declaration:
1485 decl-specifier-seq declarator
1486 decl-specifier-seq declarator = assignment-expression
1487 decl-specifier-seq abstract-declarator(opt)
1488 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1491 pp_cxx_parameter_declaration (cxx_pretty_printer
*pp
, tree t
)
1493 pp
->declaration_specifiers (t
);
1495 pp
->abstract_declarator (t
);
1500 /* parameter-declaration-clause:
1501 parameter-declaration-list(opt) ...(opt)
1502 parameter-declaration-list , ...
1504 parameter-declaration-list:
1505 parameter-declaration
1506 parameter-declaration-list , parameter-declaration */
1509 pp_cxx_parameter_declaration_clause (cxx_pretty_printer
*pp
, tree t
)
1515 // For a requires clause or the explicit printing of a parameter list
1516 // we expect T to be a chain of PARM_DECLs. Otherwise, the list of
1517 // args and types are taken from the function decl T.
1518 if (TREE_CODE (t
) == PARM_DECL
)
1526 bool type_p
= TYPE_P (t
);
1527 args
= type_p
? NULL
: FUNCTION_FIRST_USER_PARM (t
);
1528 types
= type_p
? TYPE_ARG_TYPES (t
) : FUNCTION_FIRST_USER_PARMTYPE (t
);
1529 abstract
= args
== NULL
|| pp
->flags
& pp_c_flag_abstract
;
1533 /* Skip artificial parameter for nonstatic member functions. */
1534 if (TREE_CODE (t
) == METHOD_TYPE
)
1535 types
= TREE_CHAIN (types
);
1537 pp_cxx_left_paren (pp
);
1538 for (; args
; args
= TREE_CHAIN (args
), types
= TREE_CHAIN (types
))
1541 pp_cxx_separate_with (pp
, ',');
1543 pp_cxx_parameter_declaration (pp
, abstract
? TREE_VALUE (types
) : args
);
1544 if (!abstract
&& pp
->flags
& pp_cxx_flag_default_argument
)
1546 pp_cxx_whitespace (pp
);
1548 pp_cxx_whitespace (pp
);
1549 pp
->assignment_expression (TREE_PURPOSE (types
));
1552 pp_cxx_right_paren (pp
);
1555 /* exception-specification:
1556 throw ( type-id-list(opt) )
1560 type-id-list , type-id */
1563 pp_cxx_exception_specification (cxx_pretty_printer
*pp
, tree t
)
1565 tree ex_spec
= TYPE_RAISES_EXCEPTIONS (t
);
1566 bool need_comma
= false;
1568 if (ex_spec
== NULL
)
1570 if (TREE_PURPOSE (ex_spec
))
1572 pp_cxx_ws_string (pp
, "noexcept");
1573 pp_cxx_whitespace (pp
);
1574 pp_cxx_left_paren (pp
);
1575 if (DEFERRED_NOEXCEPT_SPEC_P (ex_spec
))
1576 pp_cxx_ws_string (pp
, "<uninstantiated>");
1578 pp
->expression (TREE_PURPOSE (ex_spec
));
1579 pp_cxx_right_paren (pp
);
1582 pp_cxx_ws_string (pp
, "throw");
1583 pp_cxx_left_paren (pp
);
1584 for (; ex_spec
&& TREE_VALUE (ex_spec
); ex_spec
= TREE_CHAIN (ex_spec
))
1586 tree type
= TREE_VALUE (ex_spec
);
1587 tree argpack
= NULL_TREE
;
1590 if (ARGUMENT_PACK_P (type
))
1592 argpack
= ARGUMENT_PACK_ARGS (type
);
1593 len
= TREE_VEC_LENGTH (argpack
);
1596 for (i
= 0; i
< len
; ++i
)
1599 type
= TREE_VEC_ELT (argpack
, i
);
1602 pp_cxx_separate_with (pp
, ',');
1609 pp_cxx_right_paren (pp
);
1612 /* direct-declarator:
1614 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1615 exception-specification(opt)
1616 direct-declaration [ constant-expression(opt) ]
1620 cxx_pretty_printer::direct_declarator (tree t
)
1622 switch (TREE_CODE (t
))
1630 pp_cxx_space_for_pointer_operator (this, TREE_TYPE (t
));
1632 if ((TREE_CODE (t
) == PARM_DECL
&& DECL_PACK_P (t
))
1633 || template_parameter_pack_p (t
))
1634 /* A function parameter pack or non-type template
1636 pp_cxx_ws_string (this, "...");
1638 id_expression (DECL_NAME (t
));
1640 abstract_declarator (TREE_TYPE (t
));
1644 pp_cxx_space_for_pointer_operator (this, TREE_TYPE (TREE_TYPE (t
)));
1646 pp_cxx_parameter_declaration_clause (this, t
);
1648 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t
))
1650 padding
= pp_before
;
1651 pp_cxx_cv_qualifier_seq (this, pp_cxx_implicit_parameter_type (t
));
1654 pp_cxx_exception_specification (this, TREE_TYPE (t
));
1659 case TEMPLATE_TYPE_PARM
:
1660 case TEMPLATE_PARM_INDEX
:
1661 case TEMPLATE_TEMPLATE_PARM
:
1665 c_pretty_printer::direct_declarator (t
);
1672 ptr-operator declarator */
1675 cxx_pretty_printer::declarator (tree t
)
1677 direct_declarator (t
);
1679 // Print a requires clause.
1681 if (tree ci
= get_constraints (t
))
1682 if (tree reqs
= CI_DECLARATOR_REQS (ci
))
1683 pp_cxx_requires_clause (this, reqs
);
1686 /* ctor-initializer:
1687 : mem-initializer-list
1689 mem-initializer-list:
1691 mem-initializer , mem-initializer-list
1694 mem-initializer-id ( expression-list(opt) )
1697 ::(opt) nested-name-specifier(opt) class-name
1701 pp_cxx_ctor_initializer (cxx_pretty_printer
*pp
, tree t
)
1703 t
= TREE_OPERAND (t
, 0);
1704 pp_cxx_whitespace (pp
);
1706 pp_cxx_whitespace (pp
);
1707 for (; t
; t
= TREE_CHAIN (t
))
1709 tree purpose
= TREE_PURPOSE (t
);
1710 bool is_pack
= PACK_EXPANSION_P (purpose
);
1713 pp
->primary_expression (PACK_EXPANSION_PATTERN (purpose
));
1715 pp
->primary_expression (purpose
);
1716 pp_cxx_call_argument_list (pp
, TREE_VALUE (t
));
1718 pp_cxx_ws_string (pp
, "...");
1720 pp_cxx_separate_with (pp
, ',');
1724 /* function-definition:
1725 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1726 decl-specifier-seq(opt) declarator function-try-block */
1729 pp_cxx_function_definition (cxx_pretty_printer
*pp
, tree t
)
1731 tree saved_scope
= pp
->enclosing_scope
;
1732 pp
->declaration_specifiers (t
);
1734 pp_needs_newline (pp
) = true;
1735 pp
->enclosing_scope
= DECL_CONTEXT (t
);
1736 if (DECL_SAVED_TREE (t
))
1737 pp
->statement (DECL_SAVED_TREE (t
));
1739 pp_cxx_semicolon (pp
);
1740 pp_newline_and_flush (pp
);
1741 pp
->enclosing_scope
= saved_scope
;
1744 /* abstract-declarator:
1745 ptr-operator abstract-declarator(opt)
1746 direct-abstract-declarator */
1749 cxx_pretty_printer::abstract_declarator (tree t
)
1751 if (TYPE_PTRMEM_P (t
))
1752 pp_cxx_right_paren (this);
1753 else if (INDIRECT_TYPE_P (t
))
1755 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
1756 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
1757 pp_cxx_right_paren (this);
1760 direct_abstract_declarator (t
);
1763 /* direct-abstract-declarator:
1764 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1765 cv-qualifier-seq(opt) exception-specification(opt)
1766 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1767 ( abstract-declarator ) */
1770 cxx_pretty_printer::direct_abstract_declarator (tree t
)
1772 switch (TREE_CODE (t
))
1774 case REFERENCE_TYPE
:
1775 abstract_declarator (t
);
1779 if (TYPE_PTRMEMFUNC_P (t
))
1780 direct_abstract_declarator (TYPE_PTRMEMFUNC_FN_TYPE (t
));
1785 pp_cxx_parameter_declaration_clause (this, t
);
1786 direct_abstract_declarator (TREE_TYPE (t
));
1787 if (TREE_CODE (t
) == METHOD_TYPE
)
1789 padding
= pp_before
;
1790 pp_cxx_cv_qualifier_seq (this, class_of_this_parm (t
));
1792 pp_cxx_exception_specification (this, t
);
1796 case TEMPLATE_TYPE_PARM
:
1797 case TEMPLATE_TEMPLATE_PARM
:
1798 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1799 case UNBOUND_CLASS_TEMPLATE
:
1803 c_pretty_printer::direct_abstract_declarator (t
);
1809 type-specifier-seq abstract-declarator(opt) */
1812 cxx_pretty_printer::type_id (tree t
)
1814 pp_flags saved_flags
= flags
;
1815 flags
|= pp_c_flag_abstract
;
1817 switch (TREE_CODE (t
))
1824 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1825 case UNBOUND_CLASS_TEMPLATE
:
1826 case TEMPLATE_TEMPLATE_PARM
:
1827 case TEMPLATE_TYPE_PARM
:
1828 case TEMPLATE_PARM_INDEX
:
1831 case UNDERLYING_TYPE
:
1833 case TEMPLATE_ID_EXPR
:
1834 pp_cxx_type_specifier_seq (this, t
);
1837 case TYPE_PACK_EXPANSION
:
1838 type_id (PACK_EXPANSION_PATTERN (t
));
1839 pp_cxx_ws_string (this, "...");
1843 c_pretty_printer::type_id (t
);
1847 flags
= saved_flags
;
1850 /* template-argument-list:
1851 template-argument ...(opt)
1852 template-argument-list, template-argument ...(opt)
1855 assignment-expression
1860 pp_cxx_template_argument_list (cxx_pretty_printer
*pp
, tree t
)
1863 bool need_comma
= false;
1867 for (i
= 0; i
< TREE_VEC_LENGTH (t
); ++i
)
1869 tree arg
= TREE_VEC_ELT (t
, i
);
1870 tree argpack
= NULL_TREE
;
1873 if (ARGUMENT_PACK_P (arg
))
1875 argpack
= ARGUMENT_PACK_ARGS (arg
);
1876 len
= TREE_VEC_LENGTH (argpack
);
1879 for (idx
= 0; idx
< len
; idx
++)
1882 arg
= TREE_VEC_ELT (argpack
, idx
);
1885 pp_cxx_separate_with (pp
, ',');
1889 if (TYPE_P (arg
) || (TREE_CODE (arg
) == TEMPLATE_DECL
1890 && TYPE_P (DECL_TEMPLATE_RESULT (arg
))))
1893 pp
->expression (arg
);
1900 pp_cxx_exception_declaration (cxx_pretty_printer
*pp
, tree t
)
1902 t
= DECL_EXPR_DECL (t
);
1903 pp_cxx_type_specifier_seq (pp
, t
);
1905 pp
->abstract_declarator (t
);
1913 cxx_pretty_printer::statement (tree t
)
1915 switch (TREE_CODE (t
))
1917 case CTOR_INITIALIZER
:
1918 pp_cxx_ctor_initializer (this, t
);
1922 pp_cxx_ws_string (this, "using");
1923 pp_cxx_ws_string (this, "namespace");
1924 if (DECL_CONTEXT (t
))
1925 pp_cxx_nested_name_specifier (this, DECL_CONTEXT (t
));
1926 pp_cxx_qualified_id (this, USING_STMT_NAMESPACE (t
));
1930 pp_cxx_ws_string (this, "using");
1931 pp_cxx_nested_name_specifier (this, USING_DECL_SCOPE (t
));
1932 pp_cxx_unqualified_id (this, DECL_NAME (t
));
1939 try compound-statement handler-seq */
1941 pp_maybe_newline_and_indent (this, 0);
1942 pp_cxx_ws_string (this, "try");
1943 pp_newline_and_indent (this, 3);
1944 statement (TRY_STMTS (t
));
1945 pp_newline_and_indent (this, -3);
1949 statement (TRY_HANDLERS (t
));
1954 handler handler-seq(opt)
1957 catch ( exception-declaration ) compound-statement
1959 exception-declaration:
1960 type-specifier-seq declarator
1961 type-specifier-seq abstract-declarator
1964 pp_cxx_ws_string (this, "catch");
1965 pp_cxx_left_paren (this);
1966 pp_cxx_exception_declaration (this, HANDLER_PARMS (t
));
1967 pp_cxx_right_paren (this);
1968 pp_indentation (this) += 3;
1969 pp_needs_newline (this) = true;
1970 statement (HANDLER_BODY (t
));
1971 pp_indentation (this) -= 3;
1972 pp_needs_newline (this) = true;
1975 /* selection-statement:
1976 if ( expression ) statement
1977 if ( expression ) statement else statement */
1979 pp_cxx_ws_string (this, "if");
1980 pp_cxx_whitespace (this);
1981 pp_cxx_left_paren (this);
1982 expression (IF_COND (t
));
1983 pp_cxx_right_paren (this);
1984 pp_newline_and_indent (this, 2);
1985 statement (THEN_CLAUSE (t
));
1986 pp_newline_and_indent (this, -2);
1987 if (ELSE_CLAUSE (t
))
1989 tree else_clause
= ELSE_CLAUSE (t
);
1990 pp_cxx_ws_string (this, "else");
1991 if (TREE_CODE (else_clause
) == IF_STMT
)
1992 pp_cxx_whitespace (this);
1994 pp_newline_and_indent (this, 2);
1995 statement (else_clause
);
1996 if (TREE_CODE (else_clause
) != IF_STMT
)
1997 pp_newline_and_indent (this, -2);
2002 pp_cxx_ws_string (this, "switch");
2004 pp_cxx_left_paren (this);
2005 expression (SWITCH_STMT_COND (t
));
2006 pp_cxx_right_paren (this);
2007 pp_indentation (this) += 3;
2008 pp_needs_newline (this) = true;
2009 statement (SWITCH_STMT_BODY (t
));
2010 pp_newline_and_indent (this, -3);
2013 /* iteration-statement:
2014 while ( expression ) statement
2015 do statement while ( expression ) ;
2016 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
2017 for ( declaration expression(opt) ; expression(opt) ) statement */
2019 pp_cxx_ws_string (this, "while");
2021 pp_cxx_left_paren (this);
2022 expression (WHILE_COND (t
));
2023 pp_cxx_right_paren (this);
2024 pp_newline_and_indent (this, 3);
2025 statement (WHILE_BODY (t
));
2026 pp_indentation (this) -= 3;
2027 pp_needs_newline (this) = true;
2031 pp_cxx_ws_string (this, "do");
2032 pp_newline_and_indent (this, 3);
2033 statement (DO_BODY (t
));
2034 pp_newline_and_indent (this, -3);
2035 pp_cxx_ws_string (this, "while");
2037 pp_cxx_left_paren (this);
2038 expression (DO_COND (t
));
2039 pp_cxx_right_paren (this);
2040 pp_cxx_semicolon (this);
2041 pp_needs_newline (this) = true;
2045 pp_cxx_ws_string (this, "for");
2047 pp_cxx_left_paren (this);
2048 if (FOR_INIT_STMT (t
))
2049 statement (FOR_INIT_STMT (t
));
2051 pp_cxx_semicolon (this);
2052 pp_needs_newline (this) = false;
2053 pp_cxx_whitespace (this);
2055 expression (FOR_COND (t
));
2056 pp_cxx_semicolon (this);
2057 pp_needs_newline (this) = false;
2058 pp_cxx_whitespace (this);
2060 expression (FOR_EXPR (t
));
2061 pp_cxx_right_paren (this);
2062 pp_newline_and_indent (this, 3);
2063 statement (FOR_BODY (t
));
2064 pp_indentation (this) -= 3;
2065 pp_needs_newline (this) = true;
2068 case RANGE_FOR_STMT
:
2069 pp_cxx_ws_string (this, "for");
2071 pp_cxx_left_paren (this);
2072 if (RANGE_FOR_INIT_STMT (t
))
2074 statement (RANGE_FOR_INIT_STMT (t
));
2075 pp_needs_newline (this) = false;
2076 pp_cxx_whitespace (this);
2078 statement (RANGE_FOR_DECL (t
));
2080 pp_needs_newline (this) = false;
2083 statement (RANGE_FOR_EXPR (t
));
2084 pp_cxx_right_paren (this);
2085 pp_newline_and_indent (this, 3);
2086 statement (FOR_BODY (t
));
2087 pp_indentation (this) -= 3;
2088 pp_needs_newline (this) = true;
2094 return expression(opt) ; */
2097 pp_string (this, TREE_CODE (t
) == BREAK_STMT
? "break" : "continue");
2098 pp_cxx_semicolon (this);
2099 pp_needs_newline (this) = true;
2102 /* expression-statement:
2103 expression(opt) ; */
2105 expression (EXPR_STMT_EXPR (t
));
2106 pp_cxx_semicolon (this);
2107 pp_needs_newline (this) = true;
2111 pp_cxx_ws_string (this, "try");
2112 pp_newline_and_indent (this, 2);
2113 statement (CLEANUP_BODY (t
));
2114 pp_newline_and_indent (this, -2);
2115 pp_cxx_ws_string (this, CLEANUP_EH_ONLY (t
) ? "catch" : "finally");
2116 pp_newline_and_indent (this, 2);
2117 statement (CLEANUP_EXPR (t
));
2118 pp_newline_and_indent (this, -2);
2126 pp_cxx_ws_string (this, "#pragma omp depobj");
2128 pp_cxx_left_paren (this);
2129 expression (OMP_DEPOBJ_DEPOBJ (t
));
2130 pp_cxx_right_paren (this);
2131 if (OMP_DEPOBJ_CLAUSES (t
) && OMP_DEPOBJ_CLAUSES (t
) != error_mark_node
)
2133 if (TREE_CODE (OMP_DEPOBJ_CLAUSES (t
)) == OMP_CLAUSE
)
2134 dump_omp_clauses (this, OMP_DEPOBJ_CLAUSES (t
),
2135 pp_indentation (this), TDF_NONE
);
2137 switch (tree_to_uhwi (OMP_DEPOBJ_CLAUSES (t
)))
2139 case OMP_CLAUSE_DEPEND_IN
:
2140 pp_cxx_ws_string (this, " update(in)");
2142 case OMP_CLAUSE_DEPEND_INOUT
:
2143 pp_cxx_ws_string (this, " update(inout)");
2145 case OMP_CLAUSE_DEPEND_OUT
:
2146 pp_cxx_ws_string (this, " update(out)");
2148 case OMP_CLAUSE_DEPEND_MUTEXINOUTSET
:
2149 pp_cxx_ws_string (this, " update(mutexinoutset)");
2151 case OMP_CLAUSE_DEPEND_LAST
:
2152 pp_cxx_ws_string (this, " destroy");
2158 pp_needs_newline (this) = true;
2162 c_pretty_printer::statement (t
);
2167 /* original-namespace-definition:
2168 namespace identifier { namespace-body }
2170 As an edge case, we also handle unnamed namespace definition here. */
2173 pp_cxx_original_namespace_definition (cxx_pretty_printer
*pp
, tree t
)
2175 pp_cxx_ws_string (pp
, "namespace");
2176 if (DECL_CONTEXT (t
))
2177 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
2179 pp_cxx_unqualified_id (pp
, t
);
2180 pp_cxx_whitespace (pp
);
2181 pp_cxx_left_brace (pp
);
2182 /* We do not print the namespace-body. */
2183 pp_cxx_whitespace (pp
);
2184 pp_cxx_right_brace (pp
);
2190 namespace-alias-definition:
2191 namespace identifier = qualified-namespace-specifier ;
2193 qualified-namespace-specifier:
2194 ::(opt) nested-name-specifier(opt) namespace-name */
2197 pp_cxx_namespace_alias_definition (cxx_pretty_printer
*pp
, tree t
)
2199 pp_cxx_ws_string (pp
, "namespace");
2200 if (DECL_CONTEXT (t
))
2201 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
2202 pp_cxx_unqualified_id (pp
, t
);
2203 pp_cxx_whitespace (pp
);
2205 pp_cxx_whitespace (pp
);
2206 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t
)))
2207 pp_cxx_nested_name_specifier (pp
,
2208 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t
)));
2209 pp_cxx_qualified_id (pp
, DECL_NAMESPACE_ALIAS (t
));
2210 pp_cxx_semicolon (pp
);
2213 /* simple-declaration:
2214 decl-specifier-seq(opt) init-declarator-list(opt) */
2217 pp_cxx_simple_declaration (cxx_pretty_printer
*pp
, tree t
)
2219 pp
->declaration_specifiers (t
);
2220 pp_cxx_init_declarator (pp
, t
);
2221 pp_cxx_semicolon (pp
);
2222 pp_needs_newline (pp
) = true;
2226 template-parameter-list:
2228 template-parameter-list , template-parameter */
2231 pp_cxx_template_parameter_list (cxx_pretty_printer
*pp
, tree t
)
2233 const int n
= TREE_VEC_LENGTH (t
);
2235 for (i
= 0; i
< n
; ++i
)
2238 pp_cxx_separate_with (pp
, ',');
2239 pp_cxx_template_parameter (pp
, TREE_VEC_ELT (t
, i
));
2243 /* template-parameter:
2245 parameter-declaration
2248 class ...(opt) identifier(opt)
2249 class identifier(opt) = type-id
2250 typename identifier(opt)
2251 typename ...(opt) identifier(opt) = type-id
2252 template < template-parameter-list > class ...(opt) identifier(opt)
2253 template < template-parameter-list > class identifier(opt) = template-name */
2256 pp_cxx_template_parameter (cxx_pretty_printer
*pp
, tree t
)
2258 tree parameter
= TREE_VALUE (t
);
2259 switch (TREE_CODE (parameter
))
2262 pp_cxx_ws_string (pp
, "class");
2263 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
2264 pp_cxx_ws_string (pp
, "...");
2265 if (DECL_NAME (parameter
))
2266 pp_cxx_tree_identifier (pp
, DECL_NAME (parameter
));
2267 /* FIXME: Check if we should print also default argument. */
2271 pp_cxx_parameter_declaration (pp
, parameter
);
2278 pp_unsupported_tree (pp
, t
);
2283 /* Pretty-print a template parameter in the canonical form
2284 "template-parameter-<level>-<position in parameter list>". */
2287 pp_cxx_canonical_template_parameter (cxx_pretty_printer
*pp
, tree parm
)
2289 const enum tree_code code
= TREE_CODE (parm
);
2291 /* Brings type template parameters to the canonical forms. */
2292 if (code
== TEMPLATE_TYPE_PARM
|| code
== TEMPLATE_TEMPLATE_PARM
2293 || code
== BOUND_TEMPLATE_TEMPLATE_PARM
)
2294 parm
= TEMPLATE_TYPE_PARM_INDEX (parm
);
2296 pp_cxx_begin_template_argument_list (pp
);
2297 pp
->translate_string ("template-parameter-");
2298 pp_wide_integer (pp
, TEMPLATE_PARM_LEVEL (parm
));
2300 pp_wide_integer (pp
, TEMPLATE_PARM_IDX (parm
) + 1);
2301 pp_cxx_end_template_argument_list (pp
);
2304 /* Print a constrained-type-specifier. */
2307 pp_cxx_constrained_type_spec (cxx_pretty_printer
*pp
, tree c
)
2309 pp_cxx_whitespace (pp
);
2310 pp_cxx_left_bracket (pp
);
2311 pp
->translate_string ("requires");
2312 pp_cxx_whitespace (pp
);
2313 if (c
== error_mark_node
)
2315 pp_cxx_ws_string(pp
, "<unsatisfied-type-constraint>");
2319 placeholder_extract_concept_and_args (c
, t
, a
);
2320 pp
->id_expression (t
);
2321 pp_cxx_begin_template_argument_list (pp
);
2322 pp_cxx_ws_string (pp
, "<placeholder>");
2323 pp_cxx_separate_with (pp
, ',');
2324 tree args
= make_tree_vec (TREE_VEC_LENGTH (a
) - 1);
2325 for (int i
= 0; i
< TREE_VEC_LENGTH (a
) - 1; ++i
)
2326 TREE_VEC_ELT (args
, i
) = TREE_VEC_ELT (a
, i
+ 1);
2327 pp_cxx_template_argument_list (pp
, args
);
2329 pp_cxx_end_template_argument_list (pp
);
2330 pp_cxx_right_bracket (pp
);
2334 template-declaration:
2335 export(opt) template < template-parameter-list > declaration
2339 template-declaration:
2340 export(opt) template < template-parameter-list >
2341 requires-clause(opt) declaration */
2344 pp_cxx_template_declaration (cxx_pretty_printer
*pp
, tree t
)
2346 tree tmpl
= most_general_template (t
);
2349 pp_maybe_newline_and_indent (pp
, 0);
2350 for (level
= DECL_TEMPLATE_PARMS (tmpl
); level
; level
= TREE_CHAIN (level
))
2352 pp_cxx_ws_string (pp
, "template");
2353 pp_cxx_begin_template_argument_list (pp
);
2354 pp_cxx_template_parameter_list (pp
, TREE_VALUE (level
));
2355 pp_cxx_end_template_argument_list (pp
);
2356 pp_newline_and_indent (pp
, 3);
2360 if (tree ci
= get_constraints (t
))
2361 if (tree reqs
= CI_TEMPLATE_REQS (ci
))
2363 pp_cxx_requires_clause (pp
, reqs
);
2364 pp_newline_and_indent (pp
, 6);
2367 if (TREE_CODE (t
) == FUNCTION_DECL
&& DECL_SAVED_TREE (t
))
2368 pp_cxx_function_definition (pp
, t
);
2369 else if (TREE_CODE (t
) == CONCEPT_DECL
)
2370 pp_cxx_concept_definition (pp
, t
);
2372 pp_cxx_simple_declaration (pp
, t
);
2376 pp_cxx_explicit_specialization (cxx_pretty_printer
*pp
, tree t
)
2378 pp_unsupported_tree (pp
, t
);
2382 pp_cxx_explicit_instantiation (cxx_pretty_printer
*pp
, tree t
)
2384 pp_unsupported_tree (pp
, t
);
2388 pp_cxx_concept_definition (cxx_pretty_printer
*pp
, tree t
)
2390 pp_cxx_unqualified_id (pp
, DECL_NAME (t
));
2391 pp_cxx_whitespace (pp
);
2392 pp_cxx_ws_string (pp
, "=");
2393 pp_cxx_whitespace (pp
);
2394 pp
->expression (DECL_INITIAL (t
));
2395 pp_cxx_semicolon (pp
);
2402 template-declaration
2403 explicit-instantiation
2404 explicit-specialization
2405 linkage-specification
2406 namespace-definition
2411 namespace-alias-definition
2414 static_assert-declaration */
2416 cxx_pretty_printer::declaration (tree t
)
2418 if (TREE_CODE (t
) == STATIC_ASSERT
)
2420 pp_cxx_ws_string (this, "static_assert");
2421 pp_cxx_left_paren (this);
2422 expression (STATIC_ASSERT_CONDITION (t
));
2423 pp_cxx_separate_with (this, ',');
2424 expression (STATIC_ASSERT_MESSAGE (t
));
2425 pp_cxx_right_paren (this);
2427 else if (!DECL_LANG_SPECIFIC (t
))
2428 pp_cxx_simple_declaration (this, t
);
2429 else if (DECL_USE_TEMPLATE (t
))
2430 switch (DECL_USE_TEMPLATE (t
))
2433 pp_cxx_template_declaration (this, t
);
2437 pp_cxx_explicit_specialization (this, t
);
2441 pp_cxx_explicit_instantiation (this, t
);
2447 else switch (TREE_CODE (t
))
2451 pp_cxx_simple_declaration (this, t
);
2455 if (DECL_SAVED_TREE (t
))
2456 pp_cxx_function_definition (this, t
);
2458 pp_cxx_simple_declaration (this, t
);
2461 case NAMESPACE_DECL
:
2462 if (DECL_NAMESPACE_ALIAS (t
))
2463 pp_cxx_namespace_alias_definition (this, t
);
2465 pp_cxx_original_namespace_definition (this, t
);
2469 pp_unsupported_tree (this, t
);
2475 pp_cxx_typeid_expression (cxx_pretty_printer
*pp
, tree t
)
2477 t
= TREE_OPERAND (t
, 0);
2478 pp_cxx_ws_string (pp
, "typeid");
2479 pp_cxx_left_paren (pp
);
2484 pp_cxx_right_paren (pp
);
2488 pp_cxx_va_arg_expression (cxx_pretty_printer
*pp
, tree t
)
2490 pp_cxx_ws_string (pp
, "va_arg");
2491 pp_cxx_left_paren (pp
);
2492 pp
->assignment_expression (TREE_OPERAND (t
, 0));
2493 pp_cxx_separate_with (pp
, ',');
2494 pp
->type_id (TREE_TYPE (t
));
2495 pp_cxx_right_paren (pp
);
2499 pp_cxx_offsetof_expression_1 (cxx_pretty_printer
*pp
, tree t
)
2501 switch (TREE_CODE (t
))
2504 if (TREE_CODE (TREE_OPERAND (t
, 0)) == STATIC_CAST_EXPR
2505 && INDIRECT_TYPE_P (TREE_TYPE (TREE_OPERAND (t
, 0))))
2507 pp
->type_id (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))));
2508 pp_cxx_separate_with (pp
, ',');
2513 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2515 if (TREE_CODE (TREE_OPERAND (t
, 0)) != ARROW_EXPR
)
2517 pp
->expression (TREE_OPERAND (t
, 1));
2520 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2522 pp_left_bracket (pp
);
2523 pp
->expression (TREE_OPERAND (t
, 1));
2524 pp_right_bracket (pp
);
2532 pp_cxx_offsetof_expression (cxx_pretty_printer
*pp
, tree t
)
2534 pp_cxx_ws_string (pp
, "offsetof");
2535 pp_cxx_left_paren (pp
);
2536 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2537 pp
->expression (TREE_OPERAND (t
, 0));
2538 pp_cxx_right_paren (pp
);
2542 pp_cxx_addressof_expression (cxx_pretty_printer
*pp
, tree t
)
2544 pp_cxx_ws_string (pp
, "__builtin_addressof");
2545 pp_cxx_left_paren (pp
);
2546 pp
->expression (TREE_OPERAND (t
, 0));
2547 pp_cxx_right_paren (pp
);
2551 get_fold_operator (tree t
)
2553 int op
= int_cst_value (FOLD_EXPR_OP (t
));
2554 ovl_op_info_t
*info
= OVL_OP_INFO (FOLD_EXPR_MODIFY_P (t
), op
);
2559 pp_cxx_unary_left_fold_expression (cxx_pretty_printer
*pp
, tree t
)
2561 char const* op
= get_fold_operator (t
);
2562 tree expr
= PACK_EXPANSION_PATTERN (FOLD_EXPR_PACK (t
));
2563 pp_cxx_left_paren (pp
);
2564 pp_cxx_ws_string (pp
, "...");
2565 pp_cxx_ws_string (pp
, op
);
2566 pp
->expression (expr
);
2567 pp_cxx_right_paren (pp
);
2571 pp_cxx_unary_right_fold_expression (cxx_pretty_printer
*pp
, tree t
)
2573 char const* op
= get_fold_operator (t
);
2574 tree expr
= PACK_EXPANSION_PATTERN (FOLD_EXPR_PACK (t
));
2575 pp_cxx_left_paren (pp
);
2576 pp
->expression (expr
);
2578 pp_cxx_ws_string (pp
, op
);
2579 pp_cxx_ws_string (pp
, "...");
2580 pp_cxx_right_paren (pp
);
2584 pp_cxx_binary_fold_expression (cxx_pretty_printer
*pp
, tree t
)
2586 char const* op
= get_fold_operator (t
);
2587 tree t1
= TREE_OPERAND (t
, 1);
2588 tree t2
= TREE_OPERAND (t
, 2);
2589 if (t1
== FOLD_EXPR_PACK (t
))
2590 t1
= PACK_EXPANSION_PATTERN (t1
);
2592 t2
= PACK_EXPANSION_PATTERN (t2
);
2593 pp_cxx_left_paren (pp
);
2594 pp
->expression (t1
);
2595 pp_cxx_ws_string (pp
, op
);
2596 pp_cxx_ws_string (pp
, "...");
2597 pp_cxx_ws_string (pp
, op
);
2598 pp
->expression (t2
);
2599 pp_cxx_right_paren (pp
);
2603 pp_cxx_trait_expression (cxx_pretty_printer
*pp
, tree t
)
2605 cp_trait_kind kind
= TRAIT_EXPR_KIND (t
);
2609 case CPTK_HAS_NOTHROW_ASSIGN
:
2610 pp_cxx_ws_string (pp
, "__has_nothrow_assign");
2612 case CPTK_HAS_TRIVIAL_ASSIGN
:
2613 pp_cxx_ws_string (pp
, "__has_trivial_assign");
2615 case CPTK_HAS_NOTHROW_CONSTRUCTOR
:
2616 pp_cxx_ws_string (pp
, "__has_nothrow_constructor");
2618 case CPTK_HAS_TRIVIAL_CONSTRUCTOR
:
2619 pp_cxx_ws_string (pp
, "__has_trivial_constructor");
2621 case CPTK_HAS_NOTHROW_COPY
:
2622 pp_cxx_ws_string (pp
, "__has_nothrow_copy");
2624 case CPTK_HAS_TRIVIAL_COPY
:
2625 pp_cxx_ws_string (pp
, "__has_trivial_copy");
2627 case CPTK_HAS_TRIVIAL_DESTRUCTOR
:
2628 pp_cxx_ws_string (pp
, "__has_trivial_destructor");
2630 case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS
:
2631 pp_cxx_ws_string (pp
, "__has_unique_object_representations");
2633 case CPTK_HAS_VIRTUAL_DESTRUCTOR
:
2634 pp_cxx_ws_string (pp
, "__has_virtual_destructor");
2636 case CPTK_IS_ABSTRACT
:
2637 pp_cxx_ws_string (pp
, "__is_abstract");
2639 case CPTK_IS_AGGREGATE
:
2640 pp_cxx_ws_string (pp
, "__is_aggregate");
2642 case CPTK_IS_BASE_OF
:
2643 pp_cxx_ws_string (pp
, "__is_base_of");
2646 pp_cxx_ws_string (pp
, "__is_class");
2649 pp_cxx_ws_string (pp
, "__is_empty");
2652 pp_cxx_ws_string (pp
, "__is_enum");
2655 pp_cxx_ws_string (pp
, "__is_final");
2658 pp_cxx_ws_string (pp
, "__is_pod");
2660 case CPTK_IS_POLYMORPHIC
:
2661 pp_cxx_ws_string (pp
, "__is_polymorphic");
2663 case CPTK_IS_SAME_AS
:
2664 pp_cxx_ws_string (pp
, "__is_same");
2666 case CPTK_IS_STD_LAYOUT
:
2667 pp_cxx_ws_string (pp
, "__is_std_layout");
2669 case CPTK_IS_TRIVIAL
:
2670 pp_cxx_ws_string (pp
, "__is_trivial");
2672 case CPTK_IS_TRIVIALLY_ASSIGNABLE
:
2673 pp_cxx_ws_string (pp
, "__is_trivially_assignable");
2675 case CPTK_IS_TRIVIALLY_CONSTRUCTIBLE
:
2676 pp_cxx_ws_string (pp
, "__is_trivially_constructible");
2678 case CPTK_IS_TRIVIALLY_COPYABLE
:
2679 pp_cxx_ws_string (pp
, "__is_trivially_copyable");
2682 pp_cxx_ws_string (pp
, "__is_union");
2684 case CPTK_IS_LITERAL_TYPE
:
2685 pp_cxx_ws_string (pp
, "__is_literal_type");
2687 case CPTK_IS_ASSIGNABLE
:
2688 pp_cxx_ws_string (pp
, "__is_assignable");
2690 case CPTK_IS_CONSTRUCTIBLE
:
2691 pp_cxx_ws_string (pp
, "__is_constructible");
2698 pp_cxx_left_paren (pp
);
2699 pp
->type_id (TRAIT_EXPR_TYPE1 (t
));
2701 if (kind
== CPTK_IS_BASE_OF
|| kind
== CPTK_IS_SAME_AS
)
2703 pp_cxx_separate_with (pp
, ',');
2704 pp
->type_id (TRAIT_EXPR_TYPE2 (t
));
2707 pp_cxx_right_paren (pp
);
2711 // 'requires' logical-or-expression
2713 pp_cxx_requires_clause (cxx_pretty_printer
*pp
, tree t
)
2717 pp
->padding
= pp_before
;
2718 pp_cxx_ws_string (pp
, "requires");
2725 compound-requirement
2727 nested-requirement */
2729 pp_cxx_requirement (cxx_pretty_printer
*pp
, tree t
)
2731 switch (TREE_CODE (t
))
2734 pp_cxx_simple_requirement (pp
, t
);
2738 pp_cxx_type_requirement (pp
, t
);
2742 pp_cxx_compound_requirement (pp
, t
);
2746 pp_cxx_nested_requirement (pp
, t
);
2754 // requirement-list:
2756 // requirement-list ';' requirement[opt]
2759 pp_cxx_requirement_list (cxx_pretty_printer
*pp
, tree t
)
2761 for (; t
; t
= TREE_CHAIN (t
))
2762 pp_cxx_requirement (pp
, TREE_VALUE (t
));
2765 // requirement-body:
2766 // '{' requirement-list '}'
2768 pp_cxx_requirement_body (cxx_pretty_printer
*pp
, tree t
)
2770 pp_cxx_left_brace (pp
);
2771 pp_cxx_requirement_list (pp
, t
);
2772 pp_cxx_right_brace (pp
);
2775 // requires-expression:
2776 // 'requires' requirement-parameter-list requirement-body
2778 pp_cxx_requires_expr (cxx_pretty_printer
*pp
, tree t
)
2780 pp_string (pp
, "requires");
2781 if (tree parms
= TREE_OPERAND (t
, 0))
2783 pp_cxx_parameter_declaration_clause (pp
, parms
);
2784 pp_cxx_whitespace (pp
);
2786 pp_cxx_requirement_body (pp
, TREE_OPERAND (t
, 1));
2789 /* simple-requirement:
2792 pp_cxx_simple_requirement (cxx_pretty_printer
*pp
, tree t
)
2794 pp
->expression (TREE_OPERAND (t
, 0));
2795 pp_cxx_semicolon (pp
);
2798 /* type-requirement:
2799 typename type-name ';' */
2801 pp_cxx_type_requirement (cxx_pretty_printer
*pp
, tree t
)
2803 pp
->type_id (TREE_OPERAND (t
, 0));
2804 pp_cxx_semicolon (pp
);
2807 /* compound-requirement:
2808 '{' expression '}' 'noexcept' [opt] trailing-return-type [opt] */
2810 pp_cxx_compound_requirement (cxx_pretty_printer
*pp
, tree t
)
2812 pp_cxx_left_brace (pp
);
2813 pp
->expression (TREE_OPERAND (t
, 0));
2814 pp_cxx_right_brace (pp
);
2816 if (COMPOUND_REQ_NOEXCEPT_P (t
))
2817 pp_cxx_ws_string (pp
, "noexcept");
2819 if (tree type
= TREE_OPERAND (t
, 1))
2821 pp_cxx_whitespace (pp
);
2822 pp_cxx_ws_string (pp
, "->");
2825 pp_cxx_semicolon (pp
);
2828 /* nested requirement:
2829 'requires' constraint-expression */
2831 pp_cxx_nested_requirement (cxx_pretty_printer
*pp
, tree t
)
2833 pp_cxx_ws_string (pp
, "requires");
2834 pp
->expression (TREE_OPERAND (t
, 0));
2835 pp_cxx_semicolon (pp
);
2839 pp_cxx_check_constraint (cxx_pretty_printer
*pp
, tree t
)
2841 tree decl
= CHECK_CONSTR_CONCEPT (t
);
2842 tree tmpl
= DECL_TI_TEMPLATE (decl
);
2843 tree args
= CHECK_CONSTR_ARGS (t
);
2844 tree id
= build_nt (TEMPLATE_ID_EXPR
, tmpl
, args
);
2846 if (TREE_CODE (decl
) == CONCEPT_DECL
)
2847 pp
->expression (id
);
2848 else if (VAR_P (decl
))
2849 pp
->expression (id
);
2850 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2852 tree call
= build_vl_exp (CALL_EXPR
, 2);
2853 TREE_OPERAND (call
, 0) = integer_two_node
;
2854 TREE_OPERAND (call
, 1) = id
;
2855 pp
->expression (call
);
2861 /* Output the "[with ...]" clause for a parameter mapping of an atomic
2865 pp_cxx_parameter_mapping (cxx_pretty_printer
*pp
, tree map
)
2867 for (tree p
= map
; p
; p
= TREE_CHAIN (p
))
2869 tree parm
= TREE_VALUE (p
);
2870 tree arg
= TREE_PURPOSE (p
);
2875 pp_cxx_tree_identifier (pp
, DECL_NAME (TEMPLATE_PARM_DECL (parm
)));
2877 pp_cxx_whitespace (pp
);
2879 pp_cxx_whitespace (pp
);
2881 if (TYPE_P (arg
) || DECL_TEMPLATE_TEMPLATE_PARM_P (arg
))
2884 pp
->expression (arg
);
2886 if (TREE_CHAIN (p
) != NULL_TREE
)
2887 pp_cxx_separate_with (pp
, ';');
2892 pp_cxx_atomic_constraint (cxx_pretty_printer
*pp
, tree t
)
2894 /* Emit the expression. */
2895 pp
->expression (ATOMIC_CONSTR_EXPR (t
));
2897 /* Emit the parameter mapping. */
2898 tree map
= ATOMIC_CONSTR_MAP (t
);
2899 if (map
&& map
!= error_mark_node
)
2901 pp_cxx_whitespace (pp
);
2902 pp_cxx_left_bracket (pp
);
2903 pp
->translate_string ("with");
2904 pp_cxx_whitespace (pp
);
2905 pp_cxx_parameter_mapping (pp
, map
);
2906 pp_cxx_right_bracket (pp
);
2911 pp_cxx_conjunction (cxx_pretty_printer
*pp
, tree t
)
2913 pp_cxx_constraint (pp
, TREE_OPERAND (t
, 0));
2914 pp_string (pp
, " /\\ ");
2915 pp_cxx_constraint (pp
, TREE_OPERAND (t
, 1));
2919 pp_cxx_disjunction (cxx_pretty_printer
*pp
, tree t
)
2921 pp_cxx_constraint (pp
, TREE_OPERAND (t
, 0));
2922 pp_string (pp
, " \\/ ");
2923 pp_cxx_constraint (pp
, TREE_OPERAND (t
, 1));
2927 pp_cxx_constraint (cxx_pretty_printer
*pp
, tree t
)
2929 if (t
== error_mark_node
)
2930 return pp
->expression (t
);
2932 switch (TREE_CODE (t
))
2935 pp_cxx_atomic_constraint (pp
, t
);
2939 pp_cxx_check_constraint (pp
, t
);
2943 pp_cxx_conjunction (pp
, t
);
2947 pp_cxx_disjunction (pp
, t
);
2950 case EXPR_PACK_EXPANSION
:
2951 pp
->expression (TREE_OPERAND (t
, 0));
2960 typedef c_pretty_print_fn pp_fun
;
2962 /* Initialization of a C++ pretty-printer object. */
2964 cxx_pretty_printer::cxx_pretty_printer ()
2965 : c_pretty_printer (),
2966 enclosing_scope (global_namespace
)
2968 type_specifier_seq
= (pp_fun
) pp_cxx_type_specifier_seq
;
2969 parameter_list
= (pp_fun
) pp_cxx_parameter_declaration_clause
;
2972 /* cxx_pretty_printer's implementation of pretty_printer::clone vfunc. */
2975 cxx_pretty_printer::clone () const
2977 return new cxx_pretty_printer (*this);