1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2 Copyright (C) 2003, 2004, 2005, 2007, 2008,
3 2009, 2010, 2011 Free Software Foundation, Inc.
4 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
28 #include "cxx-pretty-print.h"
29 #include "tree-pretty-print.h"
31 /* Translate if being used for diagnostics, but not for dump files or
33 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
35 static void pp_cxx_unqualified_id (cxx_pretty_printer
*, tree
);
36 static void pp_cxx_nested_name_specifier (cxx_pretty_printer
*, tree
);
37 static void pp_cxx_qualified_id (cxx_pretty_printer
*, tree
);
38 static void pp_cxx_assignment_expression (cxx_pretty_printer
*, tree
);
39 static void pp_cxx_expression (cxx_pretty_printer
*, tree
);
40 static void pp_cxx_template_argument_list (cxx_pretty_printer
*, tree
);
41 static void pp_cxx_type_specifier_seq (cxx_pretty_printer
*, tree
);
42 static void pp_cxx_ptr_operator (cxx_pretty_printer
*, tree
);
43 static void pp_cxx_type_id (cxx_pretty_printer
*, tree
);
44 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer
*, tree
);
45 static void pp_cxx_declarator (cxx_pretty_printer
*, tree
);
46 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer
*, tree
);
47 static void pp_cxx_abstract_declarator (cxx_pretty_printer
*, tree
);
48 static void pp_cxx_statement (cxx_pretty_printer
*, tree
);
49 static void pp_cxx_template_parameter (cxx_pretty_printer
*, tree
);
50 static void pp_cxx_cast_expression (cxx_pretty_printer
*, tree
);
51 static void pp_cxx_typeid_expression (cxx_pretty_printer
*, tree
);
55 pp_cxx_nonconsecutive_character (cxx_pretty_printer
*pp
, int c
)
57 const char *p
= pp_last_position_in_text (pp
);
59 if (p
!= NULL
&& *p
== c
)
60 pp_cxx_whitespace (pp
);
62 pp_base (pp
)->padding
= pp_none
;
65 #define pp_cxx_storage_class_specifier(PP, T) \
66 pp_c_storage_class_specifier (pp_c_base (PP), T)
67 #define pp_cxx_expression_list(PP, T) \
68 pp_c_expression_list (pp_c_base (PP), T)
69 #define pp_cxx_space_for_pointer_operator(PP, T) \
70 pp_c_space_for_pointer_operator (pp_c_base (PP), T)
71 #define pp_cxx_init_declarator(PP, T) \
72 pp_c_init_declarator (pp_c_base (PP), T)
73 #define pp_cxx_call_argument_list(PP, T) \
74 pp_c_call_argument_list (pp_c_base (PP), T)
77 pp_cxx_colon_colon (cxx_pretty_printer
*pp
)
80 pp_base (pp
)->padding
= pp_none
;
84 pp_cxx_begin_template_argument_list (cxx_pretty_printer
*pp
)
86 pp_cxx_nonconsecutive_character (pp
, '<');
90 pp_cxx_end_template_argument_list (cxx_pretty_printer
*pp
)
92 pp_cxx_nonconsecutive_character (pp
, '>');
96 pp_cxx_separate_with (cxx_pretty_printer
*pp
, int c
)
98 pp_separate_with (pp
, c
);
99 pp_base (pp
)->padding
= pp_none
;
105 is_destructor_name (tree name
)
107 return name
== complete_dtor_identifier
108 || name
== base_dtor_identifier
109 || name
== deleting_dtor_identifier
;
112 /* conversion-function-id:
113 operator conversion-type-id
116 type-specifier-seq conversion-declarator(opt)
118 conversion-declarator:
119 ptr-operator conversion-declarator(opt) */
122 pp_cxx_conversion_function_id (cxx_pretty_printer
*pp
, tree t
)
124 pp_cxx_ws_string (pp
, "operator");
125 pp_cxx_type_specifier_seq (pp
, TREE_TYPE (t
));
129 pp_cxx_template_id (cxx_pretty_printer
*pp
, tree t
)
131 pp_cxx_unqualified_id (pp
, TREE_OPERAND (t
, 0));
132 pp_cxx_begin_template_argument_list (pp
);
133 pp_cxx_template_argument_list (pp
, TREE_OPERAND (t
, 1));
134 pp_cxx_end_template_argument_list (pp
);
137 /* Prints the unqualified part of the id-expression T.
142 conversion-function-id
147 pp_cxx_unqualified_id (cxx_pretty_printer
*pp
, tree t
)
149 enum tree_code code
= TREE_CODE (t
);
153 pp_cxx_ws_string (pp
, M_("<return-value>"));
170 case IDENTIFIER_NODE
:
172 pp_cxx_ws_string (pp
, M_("<unnamed>"));
173 else if (IDENTIFIER_TYPENAME_P (t
))
174 pp_cxx_conversion_function_id (pp
, t
);
177 if (is_destructor_name (t
))
180 /* FIXME: Why is this necessary? */
182 t
= constructor_name (TREE_TYPE (t
));
184 pp_cxx_tree_identifier (pp
, t
);
188 case TEMPLATE_ID_EXPR
:
189 pp_cxx_template_id (pp
, t
);
193 pp_cxx_unqualified_id (pp
, BASELINK_FUNCTIONS (t
));
200 case UNBOUND_CLASS_TEMPLATE
:
201 pp_cxx_unqualified_id (pp
, TYPE_NAME (t
));
202 if (CLASS_TYPE_P (t
) && CLASSTYPE_USE_TEMPLATE (t
))
204 pp_cxx_begin_template_argument_list (pp
);
205 pp_cxx_template_argument_list (pp
, INNERMOST_TEMPLATE_ARGS
206 (CLASSTYPE_TI_ARGS (t
)));
207 pp_cxx_end_template_argument_list (pp
);
212 pp_cxx_complement (pp
);
213 pp_cxx_unqualified_id (pp
, TREE_OPERAND (t
, 0));
216 case TEMPLATE_TYPE_PARM
:
217 case TEMPLATE_TEMPLATE_PARM
:
218 if (TYPE_IDENTIFIER (t
))
219 pp_cxx_unqualified_id (pp
, TYPE_IDENTIFIER (t
));
221 pp_cxx_canonical_template_parameter (pp
, t
);
224 case TEMPLATE_PARM_INDEX
:
225 pp_cxx_unqualified_id (pp
, TEMPLATE_PARM_DECL (t
));
228 case BOUND_TEMPLATE_TEMPLATE_PARM
:
229 pp_cxx_cv_qualifier_seq (pp
, t
);
230 pp_cxx_unqualified_id (pp
, TYPE_IDENTIFIER (t
));
231 pp_cxx_begin_template_argument_list (pp
);
232 pp_cxx_template_argument_list (pp
, TYPE_TI_ARGS (t
));
233 pp_cxx_end_template_argument_list (pp
);
237 pp_unsupported_tree (pp
, t
);
242 /* Pretty-print out the token sequence ":: template" in template codes
243 where it is needed to "inline declare" the (following) member as
244 a template. This situation arises when SCOPE of T is dependent
245 on template parameters. */
248 pp_cxx_template_keyword_if_needed (cxx_pretty_printer
*pp
, tree scope
, tree t
)
250 if (TREE_CODE (t
) == TEMPLATE_ID_EXPR
251 && TYPE_P (scope
) && dependent_type_p (scope
))
252 pp_cxx_ws_string (pp
, "template");
255 /* nested-name-specifier:
256 class-or-namespace-name :: nested-name-specifier(opt)
257 class-or-namespace-name :: template nested-name-specifier */
260 pp_cxx_nested_name_specifier (cxx_pretty_printer
*pp
, tree t
)
262 if (!SCOPE_FILE_SCOPE_P (t
) && t
!= pp
->enclosing_scope
)
264 tree scope
= TYPE_P (t
) ? TYPE_CONTEXT (t
) : DECL_CONTEXT (t
);
265 pp_cxx_nested_name_specifier (pp
, scope
);
266 pp_cxx_template_keyword_if_needed (pp
, scope
, t
);
267 pp_cxx_unqualified_id (pp
, t
);
268 pp_cxx_colon_colon (pp
);
273 nested-name-specifier template(opt) unqualified-id */
276 pp_cxx_qualified_id (cxx_pretty_printer
*pp
, tree t
)
278 switch (TREE_CODE (t
))
280 /* A pointer-to-member is always qualified. */
282 pp_cxx_nested_name_specifier (pp
, PTRMEM_CST_CLASS (t
));
283 pp_cxx_unqualified_id (pp
, PTRMEM_CST_MEMBER (t
));
286 /* In Standard C++, functions cannot possibly be used as
287 nested-name-specifiers. However, there are situations where
288 is "makes sense" to output the surrounding function name for the
289 purpose of emphasizing on the scope kind. Just printing the
290 function name might not be sufficient as it may be overloaded; so,
291 we decorate the function with its signature too.
292 FIXME: This is probably the wrong pretty-printing for conversion
293 functions and some function templates. */
297 if (DECL_FUNCTION_MEMBER_P (t
))
298 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
299 pp_cxx_unqualified_id
300 (pp
, DECL_CONSTRUCTOR_P (t
) ? DECL_CONTEXT (t
) : t
);
301 pp_cxx_parameter_declaration_clause (pp
, TREE_TYPE (t
));
306 pp_cxx_nested_name_specifier (pp
, TREE_OPERAND (t
, 0));
307 pp_cxx_unqualified_id (pp
, TREE_OPERAND (t
, 1));
312 tree scope
= TYPE_P (t
) ? TYPE_CONTEXT (t
) : DECL_CONTEXT (t
);
313 if (scope
!= pp
->enclosing_scope
)
315 pp_cxx_nested_name_specifier (pp
, scope
);
316 pp_cxx_template_keyword_if_needed (pp
, scope
, t
);
318 pp_cxx_unqualified_id (pp
, t
);
326 pp_cxx_constant (cxx_pretty_printer
*pp
, tree t
)
328 switch (TREE_CODE (t
))
332 const bool in_parens
= PAREN_STRING_LITERAL_P (t
);
334 pp_cxx_left_paren (pp
);
335 pp_c_constant (pp_c_base (pp
), t
);
337 pp_cxx_right_paren (pp
);
342 if (NULLPTR_TYPE_P (TREE_TYPE (t
)))
344 pp_string (pp
, "nullptr");
347 /* else fall through. */
350 pp_c_constant (pp_c_base (pp
), t
);
360 pp_cxx_id_expression (cxx_pretty_printer
*pp
, tree t
)
362 if (TREE_CODE (t
) == OVERLOAD
)
364 if (DECL_P (t
) && DECL_CONTEXT (t
))
365 pp_cxx_qualified_id (pp
, t
);
367 pp_cxx_unqualified_id (pp
, t
);
370 /* user-defined literal:
374 pp_cxx_userdef_literal (cxx_pretty_printer
*pp
, tree t
)
376 pp_cxx_constant (pp
, USERDEF_LITERAL_VALUE (t
));
377 pp_cxx_id_expression (pp
, USERDEF_LITERAL_SUFFIX_ID (t
));
381 /* primary-expression:
385 :: operator-function-id
391 __builtin_va_arg ( assignment-expression , type-id )
392 __builtin_offsetof ( type-id, offsetof-expression )
394 __has_nothrow_assign ( type-id )
395 __has_nothrow_constructor ( type-id )
396 __has_nothrow_copy ( type-id )
397 __has_trivial_assign ( type-id )
398 __has_trivial_constructor ( type-id )
399 __has_trivial_copy ( type-id )
400 __has_trivial_destructor ( type-id )
401 __has_virtual_destructor ( type-id )
402 __is_abstract ( type-id )
403 __is_base_of ( type-id , type-id )
404 __is_class ( type-id )
405 __is_convertible_to ( type-id , type-id )
406 __is_empty ( type-id )
407 __is_enum ( type-id )
408 __is_literal_type ( type-id )
410 __is_polymorphic ( type-id )
411 __is_std_layout ( type-id )
412 __is_trivial ( type-id )
413 __is_union ( type-id ) */
416 pp_cxx_primary_expression (cxx_pretty_printer
*pp
, tree t
)
418 switch (TREE_CODE (t
))
424 pp_cxx_constant (pp
, t
);
427 case USERDEF_LITERAL
:
428 pp_cxx_userdef_literal (pp
, t
);
432 t
= BASELINK_FUNCTIONS (t
);
440 pp_cxx_id_expression (pp
, t
);
444 case TEMPLATE_TYPE_PARM
:
445 case TEMPLATE_TEMPLATE_PARM
:
446 case TEMPLATE_PARM_INDEX
:
447 pp_cxx_unqualified_id (pp
, t
);
451 pp_cxx_left_paren (pp
);
452 pp_cxx_statement (pp
, STMT_EXPR_STMT (t
));
453 pp_cxx_right_paren (pp
);
457 pp_cxx_trait_expression (pp
, t
);
461 pp_cxx_va_arg_expression (pp
, t
);
465 pp_cxx_offsetof_expression (pp
, t
);
469 pp_c_primary_expression (pp_c_base (pp
), t
);
474 /* postfix-expression:
476 postfix-expression [ expression ]
477 postfix-expression ( expression-list(opt) )
478 simple-type-specifier ( expression-list(opt) )
479 typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
480 typename ::(opt) nested-name-specifier template(opt)
481 template-id ( expression-list(opt) )
482 postfix-expression . template(opt) ::(opt) id-expression
483 postfix-expression -> template(opt) ::(opt) id-expression
484 postfix-expression . pseudo-destructor-name
485 postfix-expression -> pseudo-destructor-name
486 postfix-expression ++
487 postfix-expression --
488 dynamic_cast < type-id > ( expression )
489 static_cast < type-id > ( expression )
490 reinterpret_cast < type-id > ( expression )
491 const_cast < type-id > ( expression )
492 typeid ( expression )
493 typeid ( type-id ) */
496 pp_cxx_postfix_expression (cxx_pretty_printer
*pp
, tree t
)
498 enum tree_code code
= TREE_CODE (t
);
505 tree fun
= (code
== AGGR_INIT_EXPR
? AGGR_INIT_EXPR_FN (t
)
507 tree saved_scope
= pp
->enclosing_scope
;
508 bool skipfirst
= false;
511 if (TREE_CODE (fun
) == ADDR_EXPR
)
512 fun
= TREE_OPERAND (fun
, 0);
514 /* In templates, where there is no way to tell whether a given
515 call uses an actual member function. So the parser builds
516 FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
517 instantiation time. */
518 if (TREE_CODE (fun
) != FUNCTION_DECL
)
520 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun
))
522 tree object
= (code
== AGGR_INIT_EXPR
523 ? (AGGR_INIT_VIA_CTOR_P (t
)
524 ? AGGR_INIT_EXPR_SLOT (t
)
525 : AGGR_INIT_EXPR_ARG (t
, 0))
526 : CALL_EXPR_ARG (t
, 0));
528 while (TREE_CODE (object
) == NOP_EXPR
)
529 object
= TREE_OPERAND (object
, 0);
531 if (TREE_CODE (object
) == ADDR_EXPR
)
532 object
= TREE_OPERAND (object
, 0);
534 if (TREE_CODE (TREE_TYPE (object
)) != POINTER_TYPE
)
536 pp_cxx_postfix_expression (pp
, object
);
541 pp_cxx_postfix_expression (pp
, object
);
545 pp
->enclosing_scope
= strip_pointer_operator (TREE_TYPE (object
));
548 pp_cxx_postfix_expression (pp
, fun
);
549 pp
->enclosing_scope
= saved_scope
;
550 pp_cxx_left_paren (pp
);
551 if (code
== AGGR_INIT_EXPR
)
553 aggr_init_expr_arg_iterator iter
;
554 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
560 pp_cxx_expression (pp
, arg
);
561 if (more_aggr_init_expr_args_p (&iter
))
562 pp_cxx_separate_with (pp
, ',');
568 call_expr_arg_iterator iter
;
569 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
575 pp_cxx_expression (pp
, arg
);
576 if (more_call_expr_args_p (&iter
))
577 pp_cxx_separate_with (pp
, ',');
581 pp_cxx_right_paren (pp
);
583 if (code
== AGGR_INIT_EXPR
&& AGGR_INIT_VIA_CTOR_P (t
))
585 pp_cxx_separate_with (pp
, ',');
586 pp_cxx_postfix_expression (pp
, AGGR_INIT_EXPR_SLOT (t
));
599 pp_cxx_primary_expression (pp
, t
);
602 case DYNAMIC_CAST_EXPR
:
603 case STATIC_CAST_EXPR
:
604 case REINTERPRET_CAST_EXPR
:
605 case CONST_CAST_EXPR
:
606 if (code
== DYNAMIC_CAST_EXPR
)
607 pp_cxx_ws_string (pp
, "dynamic_cast");
608 else if (code
== STATIC_CAST_EXPR
)
609 pp_cxx_ws_string (pp
, "static_cast");
610 else if (code
== REINTERPRET_CAST_EXPR
)
611 pp_cxx_ws_string (pp
, "reinterpret_cast");
613 pp_cxx_ws_string (pp
, "const_cast");
614 pp_cxx_begin_template_argument_list (pp
);
615 pp_cxx_type_id (pp
, TREE_TYPE (t
));
616 pp_cxx_end_template_argument_list (pp
);
618 pp_cxx_expression (pp
, TREE_OPERAND (t
, 0));
622 case EMPTY_CLASS_EXPR
:
623 pp_cxx_type_id (pp
, TREE_TYPE (t
));
629 pp_cxx_typeid_expression (pp
, t
);
632 case PSEUDO_DTOR_EXPR
:
633 pp_cxx_postfix_expression (pp
, TREE_OPERAND (t
, 0));
635 pp_cxx_qualified_id (pp
, TREE_OPERAND (t
, 1));
636 pp_cxx_colon_colon (pp
);
638 pp_cxx_unqualified_id (pp
, TREE_OPERAND (t
, 2));
642 pp_cxx_postfix_expression (pp
, TREE_OPERAND (t
, 0));
647 pp_c_postfix_expression (pp_c_base (pp
), t
);
653 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
654 ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
660 type-specifier-seq new-declarator(opt)
663 ptr-operator new-declarator(opt)
664 direct-new-declarator
666 direct-new-declarator
668 direct-new-declarator [ constant-expression ]
671 ( expression-list(opt) ) */
674 pp_cxx_new_expression (cxx_pretty_printer
*pp
, tree t
)
676 enum tree_code code
= TREE_CODE (t
);
677 tree type
= TREE_OPERAND (t
, 1);
678 tree init
= TREE_OPERAND (t
, 2);
683 if (NEW_EXPR_USE_GLOBAL (t
))
684 pp_cxx_colon_colon (pp
);
685 pp_cxx_ws_string (pp
, "new");
686 if (TREE_OPERAND (t
, 0))
688 pp_cxx_call_argument_list (pp
, TREE_OPERAND (t
, 0));
691 if (TREE_CODE (type
) == ARRAY_REF
)
692 type
= build_cplus_array_type
693 (TREE_OPERAND (type
, 0),
694 build_index_type (fold_build2_loc (input_location
,
695 MINUS_EXPR
, integer_type_node
,
696 TREE_OPERAND (type
, 1),
698 pp_cxx_type_id (pp
, type
);
702 if (TREE_CODE (init
) == TREE_LIST
)
703 pp_c_expression_list (pp_c_base (pp
), init
);
704 else if (init
== void_zero_node
)
705 ; /* OK, empty initializer list. */
707 pp_cxx_expression (pp
, init
);
713 pp_unsupported_tree (pp
, t
);
717 /* delete-expression:
718 ::(opt) delete cast-expression
719 ::(opt) delete [ ] cast-expression */
722 pp_cxx_delete_expression (cxx_pretty_printer
*pp
, tree t
)
724 enum tree_code code
= TREE_CODE (t
);
728 case VEC_DELETE_EXPR
:
729 if (DELETE_EXPR_USE_GLOBAL (t
))
730 pp_cxx_colon_colon (pp
);
731 pp_cxx_ws_string (pp
, "delete");
733 if (code
== VEC_DELETE_EXPR
734 || DELETE_EXPR_USE_VEC (t
))
736 pp_left_bracket (pp
);
737 pp_right_bracket (pp
);
740 pp_c_cast_expression (pp_c_base (pp
), TREE_OPERAND (t
, 0));
744 pp_unsupported_tree (pp
, t
);
752 unary-operator cast-expression
753 sizeof unary-expression
755 sizeof ... ( identifier )
759 unary-operator: one of
763 __alignof__ unary-expression
764 __alignof__ ( type-id ) */
767 pp_cxx_unary_expression (cxx_pretty_printer
*pp
, tree t
)
769 enum tree_code code
= TREE_CODE (t
);
774 pp_cxx_new_expression (pp
, t
);
778 case VEC_DELETE_EXPR
:
779 pp_cxx_delete_expression (pp
, t
);
783 if (PACK_EXPANSION_P (TREE_OPERAND (t
, 0)))
785 pp_cxx_ws_string (pp
, "sizeof");
786 pp_cxx_ws_string (pp
, "...");
787 pp_cxx_whitespace (pp
);
788 pp_cxx_left_paren (pp
);
789 if (TYPE_P (TREE_OPERAND (t
, 0)))
790 pp_cxx_type_id (pp
, TREE_OPERAND (t
, 0));
792 pp_unary_expression (pp
, TREE_OPERAND (t
, 0));
793 pp_cxx_right_paren (pp
);
799 pp_cxx_ws_string (pp
, code
== SIZEOF_EXPR
? "sizeof" : "__alignof__");
800 pp_cxx_whitespace (pp
);
801 if (TYPE_P (TREE_OPERAND (t
, 0)))
803 pp_cxx_left_paren (pp
);
804 pp_cxx_type_id (pp
, TREE_OPERAND (t
, 0));
805 pp_cxx_right_paren (pp
);
808 pp_unary_expression (pp
, TREE_OPERAND (t
, 0));
812 pp_cxx_ws_string (pp
, "@encode");
813 pp_cxx_whitespace (pp
);
814 pp_cxx_left_paren (pp
);
815 pp_cxx_type_id (pp
, TREE_OPERAND (t
, 0));
816 pp_cxx_right_paren (pp
);
820 pp_cxx_ws_string (pp
, "noexcept");
821 pp_cxx_whitespace (pp
);
822 pp_cxx_left_paren (pp
);
823 pp_cxx_expression (pp
, TREE_OPERAND (t
, 0));
824 pp_cxx_right_paren (pp
);
827 case UNARY_PLUS_EXPR
:
829 pp_cxx_cast_expression (pp
, TREE_OPERAND (t
, 0));
833 pp_c_unary_expression (pp_c_base (pp
), t
);
840 ( type-id ) cast-expression */
843 pp_cxx_cast_expression (cxx_pretty_printer
*pp
, tree t
)
845 switch (TREE_CODE (t
))
848 case IMPLICIT_CONV_EXPR
:
849 pp_cxx_type_id (pp
, TREE_TYPE (t
));
850 pp_cxx_call_argument_list (pp
, TREE_OPERAND (t
, 0));
854 pp_c_cast_expression (pp_c_base (pp
), t
);
861 pm-expression .* cast-expression
862 pm-expression ->* cast-expression */
865 pp_cxx_pm_expression (cxx_pretty_printer
*pp
, tree t
)
867 switch (TREE_CODE (t
))
869 /* Handle unfortunate OFFSET_REF overloading here. */
871 if (TYPE_P (TREE_OPERAND (t
, 0)))
873 pp_cxx_qualified_id (pp
, t
);
876 /* Else fall through. */
879 pp_cxx_pm_expression (pp
, TREE_OPERAND (t
, 0));
880 if (TREE_CODE (t
) == MEMBER_REF
)
885 pp_cxx_cast_expression (pp
, TREE_OPERAND (t
, 1));
890 pp_cxx_cast_expression (pp
, t
);
895 /* multiplicative-expression:
897 multiplicative-expression * pm-expression
898 multiplicative-expression / pm-expression
899 multiplicative-expression % pm-expression */
902 pp_cxx_multiplicative_expression (cxx_pretty_printer
*pp
, tree e
)
904 enum tree_code code
= TREE_CODE (e
);
910 pp_cxx_multiplicative_expression (pp
, TREE_OPERAND (e
, 0));
912 if (code
== MULT_EXPR
)
914 else if (code
== TRUNC_DIV_EXPR
)
919 pp_cxx_pm_expression (pp
, TREE_OPERAND (e
, 1));
923 pp_cxx_pm_expression (pp
, e
);
928 /* conditional-expression:
929 logical-or-expression
930 logical-or-expression ? expression : assignment-expression */
933 pp_cxx_conditional_expression (cxx_pretty_printer
*pp
, tree e
)
935 if (TREE_CODE (e
) == COND_EXPR
)
937 pp_c_logical_or_expression (pp_c_base (pp
), TREE_OPERAND (e
, 0));
941 pp_cxx_expression (pp
, TREE_OPERAND (e
, 1));
943 pp_cxx_assignment_expression (pp
, TREE_OPERAND (e
, 2));
946 pp_c_logical_or_expression (pp_c_base (pp
), e
);
949 /* Pretty-print a compound assignment operator token as indicated by T. */
952 pp_cxx_assignment_operator (cxx_pretty_printer
*pp
, tree t
)
956 switch (TREE_CODE (t
))
979 op
= tree_code_name
[TREE_CODE (t
)];
983 pp_cxx_ws_string (pp
, op
);
987 /* assignment-expression:
988 conditional-expression
989 logical-or-expression assignment-operator assignment-expression
993 throw assignment-expression(opt)
995 assignment-operator: one of
996 = *= /= %= += -= >>= <<= &= ^= |= */
999 pp_cxx_assignment_expression (cxx_pretty_printer
*pp
, tree e
)
1001 switch (TREE_CODE (e
))
1005 pp_c_logical_or_expression (pp_c_base (pp
), TREE_OPERAND (e
, 0));
1009 pp_cxx_assignment_expression (pp
, TREE_OPERAND (e
, 1));
1013 pp_cxx_ws_string (pp
, "throw");
1014 if (TREE_OPERAND (e
, 0))
1015 pp_cxx_assignment_expression (pp
, TREE_OPERAND (e
, 0));
1019 pp_c_logical_or_expression (pp_c_base (pp
), TREE_OPERAND (e
, 0));
1020 pp_cxx_assignment_operator (pp
, TREE_OPERAND (e
, 1));
1021 pp_cxx_assignment_expression (pp
, TREE_OPERAND (e
, 2));
1025 pp_cxx_conditional_expression (pp
, e
);
1031 pp_cxx_expression (cxx_pretty_printer
*pp
, tree t
)
1033 switch (TREE_CODE (t
))
1039 pp_cxx_constant (pp
, t
);
1042 case USERDEF_LITERAL
:
1043 pp_cxx_userdef_literal (pp
, t
);
1047 pp_cxx_unqualified_id (pp
, t
);
1055 pp_cxx_qualified_id (pp
, t
);
1059 t
= OVL_CURRENT (t
);
1067 case TEMPLATE_TYPE_PARM
:
1068 case TEMPLATE_PARM_INDEX
:
1069 case TEMPLATE_TEMPLATE_PARM
:
1071 pp_cxx_primary_expression (pp
, t
);
1075 case DYNAMIC_CAST_EXPR
:
1076 case STATIC_CAST_EXPR
:
1077 case REINTERPRET_CAST_EXPR
:
1078 case CONST_CAST_EXPR
:
1082 case EMPTY_CLASS_EXPR
:
1084 case PSEUDO_DTOR_EXPR
:
1085 case AGGR_INIT_EXPR
:
1087 pp_cxx_postfix_expression (pp
, t
);
1092 pp_cxx_new_expression (pp
, t
);
1096 case VEC_DELETE_EXPR
:
1097 pp_cxx_delete_expression (pp
, t
);
1103 pp_cxx_unary_expression (pp
, t
);
1107 case IMPLICIT_CONV_EXPR
:
1108 pp_cxx_cast_expression (pp
, t
);
1114 pp_cxx_pm_expression (pp
, t
);
1118 case TRUNC_DIV_EXPR
:
1119 case TRUNC_MOD_EXPR
:
1120 pp_cxx_multiplicative_expression (pp
, t
);
1124 pp_cxx_conditional_expression (pp
, t
);
1131 pp_cxx_assignment_expression (pp
, t
);
1134 case NON_DEPENDENT_EXPR
:
1135 case MUST_NOT_THROW_EXPR
:
1136 pp_cxx_expression (pp
, TREE_OPERAND (t
, 0));
1139 case EXPR_PACK_EXPANSION
:
1140 pp_cxx_expression (pp
, PACK_EXPANSION_PATTERN (t
));
1141 pp_cxx_ws_string (pp
, "...");
1144 case TEMPLATE_ID_EXPR
:
1145 pp_cxx_template_id (pp
, t
);
1148 case NONTYPE_ARGUMENT_PACK
:
1150 tree args
= ARGUMENT_PACK_ARGS (t
);
1151 int i
, len
= TREE_VEC_LENGTH (args
);
1152 for (i
= 0; i
< len
; ++i
)
1155 pp_cxx_separate_with (pp
, ',');
1156 pp_cxx_expression (pp
, TREE_VEC_ELT (args
, i
));
1162 pp_c_expression (pp_c_base (pp
), t
);
1170 /* function-specifier:
1176 pp_cxx_function_specifier (cxx_pretty_printer
*pp
, tree t
)
1178 switch (TREE_CODE (t
))
1181 if (DECL_VIRTUAL_P (t
))
1182 pp_cxx_ws_string (pp
, "virtual");
1183 else if (DECL_CONSTRUCTOR_P (t
) && DECL_NONCONVERTING_P (t
))
1184 pp_cxx_ws_string (pp
, "explicit");
1186 pp_c_function_specifier (pp_c_base (pp
), t
);
1193 /* decl-specifier-seq:
1194 decl-specifier-seq(opt) decl-specifier
1197 storage-class-specifier
1204 pp_cxx_decl_specifier_seq (cxx_pretty_printer
*pp
, tree t
)
1206 switch (TREE_CODE (t
))
1212 pp_cxx_storage_class_specifier (pp
, t
);
1213 pp_cxx_decl_specifier_seq (pp
, TREE_TYPE (t
));
1217 pp_cxx_ws_string (pp
, "typedef");
1218 pp_cxx_decl_specifier_seq (pp
, TREE_TYPE (t
));
1222 /* Constructors don't have return types. And conversion functions
1223 do not have a type-specifier in their return types. */
1224 if (DECL_CONSTRUCTOR_P (t
) || DECL_CONV_FN_P (t
))
1225 pp_cxx_function_specifier (pp
, t
);
1226 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t
))
1227 pp_cxx_decl_specifier_seq (pp
, TREE_TYPE (TREE_TYPE (t
)));
1230 pp_c_declaration_specifiers (pp_c_base (pp
), t
);
1235 /* simple-type-specifier:
1236 ::(opt) nested-name-specifier(opt) type-name
1237 ::(opt) nested-name-specifier(opt) template(opt) template-id
1251 pp_cxx_simple_type_specifier (cxx_pretty_printer
*pp
, tree t
)
1253 switch (TREE_CODE (t
))
1258 pp_cxx_qualified_id (pp
, t
);
1261 case TEMPLATE_TYPE_PARM
:
1262 case TEMPLATE_TEMPLATE_PARM
:
1263 case TEMPLATE_PARM_INDEX
:
1264 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1265 pp_cxx_unqualified_id (pp
, t
);
1269 pp_cxx_ws_string (pp
, "typename");
1270 pp_cxx_nested_name_specifier (pp
, TYPE_CONTEXT (t
));
1271 pp_cxx_unqualified_id (pp
, TYPE_NAME (t
));
1275 pp_c_type_specifier (pp_c_base (pp
), t
);
1280 /* type-specifier-seq:
1281 type-specifier type-specifier-seq(opt)
1284 simple-type-specifier
1287 elaborated-type-specifier
1291 pp_cxx_type_specifier_seq (cxx_pretty_printer
*pp
, tree t
)
1293 switch (TREE_CODE (t
))
1296 case TEMPLATE_TYPE_PARM
:
1297 case TEMPLATE_TEMPLATE_PARM
:
1299 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1300 pp_cxx_cv_qualifier_seq (pp
, t
);
1301 pp_cxx_simple_type_specifier (pp
, t
);
1305 pp_cxx_type_specifier_seq (pp
, TREE_TYPE (t
));
1306 pp_cxx_space_for_pointer_operator (pp
, TREE_TYPE (t
));
1307 pp_cxx_nested_name_specifier (pp
, TYPE_METHOD_BASETYPE (t
));
1311 pp_cxx_ws_string (pp
, "decltype");
1312 pp_cxx_left_paren (pp
);
1313 pp_cxx_expression (pp
, DECLTYPE_TYPE_EXPR (t
));
1314 pp_cxx_right_paren (pp
);
1318 if (TYPE_PTRMEMFUNC_P (t
))
1320 tree pfm
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
1321 pp_cxx_decl_specifier_seq (pp
, TREE_TYPE (TREE_TYPE (pfm
)));
1322 pp_cxx_whitespace (pp
);
1323 pp_cxx_ptr_operator (pp
, t
);
1326 /* else fall through */
1329 if (!(TREE_CODE (t
) == FUNCTION_DECL
&& DECL_CONSTRUCTOR_P (t
)))
1330 pp_c_specifier_qualifier_list (pp_c_base (pp
), t
);
1335 * cv-qualifier-seq(opt)
1337 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1340 pp_cxx_ptr_operator (cxx_pretty_printer
*pp
, tree t
)
1342 if (!TYPE_P (t
) && TREE_CODE (t
) != TYPE_DECL
)
1344 switch (TREE_CODE (t
))
1346 case REFERENCE_TYPE
:
1348 if (TYPE_PTR_OR_PTRMEM_P (TREE_TYPE (t
)))
1349 pp_cxx_ptr_operator (pp
, TREE_TYPE (t
));
1350 pp_c_attributes_display (pp_c_base (pp
),
1351 TYPE_ATTRIBUTES (TREE_TYPE (t
)));
1352 if (TREE_CODE (t
) == POINTER_TYPE
)
1355 pp_cxx_cv_qualifier_seq (pp
, t
);
1362 if (TYPE_PTRMEMFUNC_P (t
))
1364 pp_cxx_left_paren (pp
);
1365 pp_cxx_nested_name_specifier (pp
, TYPE_PTRMEMFUNC_OBJECT_TYPE (t
));
1370 if (TYPE_PTRMEM_P (t
))
1372 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
1373 pp_cxx_left_paren (pp
);
1374 pp_cxx_nested_name_specifier (pp
, TYPE_PTRMEM_CLASS_TYPE (t
));
1376 pp_cxx_cv_qualifier_seq (pp
, t
);
1379 /* else fall through. */
1382 pp_unsupported_tree (pp
, t
);
1388 pp_cxx_implicit_parameter_type (tree mf
)
1390 return class_of_this_parm (TREE_TYPE (mf
));
1394 parameter-declaration:
1395 decl-specifier-seq declarator
1396 decl-specifier-seq declarator = assignment-expression
1397 decl-specifier-seq abstract-declarator(opt)
1398 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1401 pp_cxx_parameter_declaration (cxx_pretty_printer
*pp
, tree t
)
1403 pp_cxx_decl_specifier_seq (pp
, t
);
1405 pp_cxx_abstract_declarator (pp
, t
);
1407 pp_cxx_declarator (pp
, t
);
1410 /* parameter-declaration-clause:
1411 parameter-declaration-list(opt) ...(opt)
1412 parameter-declaration-list , ...
1414 parameter-declaration-list:
1415 parameter-declaration
1416 parameter-declaration-list , parameter-declaration */
1419 pp_cxx_parameter_declaration_clause (cxx_pretty_printer
*pp
, tree t
)
1421 tree args
= TYPE_P (t
) ? NULL
: FUNCTION_FIRST_USER_PARM (t
);
1423 TYPE_P (t
) ? TYPE_ARG_TYPES (t
) : FUNCTION_FIRST_USER_PARMTYPE (t
);
1424 const bool abstract
= args
== NULL
1425 || pp_c_base (pp
)->flags
& pp_c_flag_abstract
;
1428 /* Skip artificial parameter for nonstatic member functions. */
1429 if (TREE_CODE (t
) == METHOD_TYPE
)
1430 types
= TREE_CHAIN (types
);
1432 pp_cxx_left_paren (pp
);
1433 for (; args
; args
= TREE_CHAIN (args
), types
= TREE_CHAIN (types
))
1436 pp_cxx_separate_with (pp
, ',');
1438 pp_cxx_parameter_declaration (pp
, abstract
? TREE_VALUE (types
) : args
);
1439 if (!abstract
&& pp_c_base (pp
)->flags
& pp_cxx_flag_default_argument
)
1441 pp_cxx_whitespace (pp
);
1443 pp_cxx_whitespace (pp
);
1444 pp_cxx_assignment_expression (pp
, TREE_PURPOSE (types
));
1447 pp_cxx_right_paren (pp
);
1450 /* exception-specification:
1451 throw ( type-id-list(opt) )
1455 type-id-list , type-id */
1458 pp_cxx_exception_specification (cxx_pretty_printer
*pp
, tree t
)
1460 tree ex_spec
= TYPE_RAISES_EXCEPTIONS (t
);
1461 bool need_comma
= false;
1463 if (ex_spec
== NULL
)
1465 if (TREE_PURPOSE (ex_spec
))
1467 pp_cxx_ws_string (pp
, "noexcept");
1468 pp_cxx_whitespace (pp
);
1469 pp_cxx_left_paren (pp
);
1470 if (DEFERRED_NOEXCEPT_SPEC_P (ex_spec
))
1471 pp_cxx_ws_string (pp
, "<uninstantiated>");
1473 pp_cxx_expression (pp
, TREE_PURPOSE (ex_spec
));
1474 pp_cxx_right_paren (pp
);
1477 pp_cxx_ws_string (pp
, "throw");
1478 pp_cxx_left_paren (pp
);
1479 for (; ex_spec
&& TREE_VALUE (ex_spec
); ex_spec
= TREE_CHAIN (ex_spec
))
1481 tree type
= TREE_VALUE (ex_spec
);
1482 tree argpack
= NULL_TREE
;
1485 if (ARGUMENT_PACK_P (type
))
1487 argpack
= ARGUMENT_PACK_ARGS (type
);
1488 len
= TREE_VEC_LENGTH (argpack
);
1491 for (i
= 0; i
< len
; ++i
)
1494 type
= TREE_VEC_ELT (argpack
, i
);
1497 pp_cxx_separate_with (pp
, ',');
1501 pp_cxx_type_id (pp
, type
);
1504 pp_cxx_right_paren (pp
);
1507 /* direct-declarator:
1509 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1510 exception-specification(opt)
1511 direct-declaration [ constant-expression(opt) ]
1515 pp_cxx_direct_declarator (cxx_pretty_printer
*pp
, tree t
)
1517 switch (TREE_CODE (t
))
1525 pp_cxx_space_for_pointer_operator (pp
, TREE_TYPE (t
));
1527 if ((TREE_CODE (t
) == PARM_DECL
&& FUNCTION_PARAMETER_PACK_P (t
))
1528 || template_parameter_pack_p (t
))
1529 /* A function parameter pack or non-type template
1531 pp_cxx_ws_string (pp
, "...");
1533 pp_cxx_id_expression (pp
, DECL_NAME (t
));
1535 pp_cxx_abstract_declarator (pp
, TREE_TYPE (t
));
1539 pp_cxx_space_for_pointer_operator (pp
, TREE_TYPE (TREE_TYPE (t
)));
1540 pp_cxx_id_expression (pp
, t
);
1541 pp_cxx_parameter_declaration_clause (pp
, t
);
1543 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t
))
1545 pp_base (pp
)->padding
= pp_before
;
1546 pp_cxx_cv_qualifier_seq (pp
, pp_cxx_implicit_parameter_type (t
));
1549 pp_cxx_exception_specification (pp
, TREE_TYPE (t
));
1554 case TEMPLATE_TYPE_PARM
:
1555 case TEMPLATE_PARM_INDEX
:
1556 case TEMPLATE_TEMPLATE_PARM
:
1560 pp_c_direct_declarator (pp_c_base (pp
), t
);
1567 ptr-operator declarator */
1570 pp_cxx_declarator (cxx_pretty_printer
*pp
, tree t
)
1572 pp_cxx_direct_declarator (pp
, t
);
1575 /* ctor-initializer:
1576 : mem-initializer-list
1578 mem-initializer-list:
1580 mem-initializer , mem-initializer-list
1583 mem-initializer-id ( expression-list(opt) )
1586 ::(opt) nested-name-specifier(opt) class-name
1590 pp_cxx_ctor_initializer (cxx_pretty_printer
*pp
, tree t
)
1592 t
= TREE_OPERAND (t
, 0);
1593 pp_cxx_whitespace (pp
);
1595 pp_cxx_whitespace (pp
);
1596 for (; t
; t
= TREE_CHAIN (t
))
1598 tree purpose
= TREE_PURPOSE (t
);
1599 bool is_pack
= PACK_EXPANSION_P (purpose
);
1602 pp_cxx_primary_expression (pp
, PACK_EXPANSION_PATTERN (purpose
));
1604 pp_cxx_primary_expression (pp
, purpose
);
1605 pp_cxx_call_argument_list (pp
, TREE_VALUE (t
));
1607 pp_cxx_ws_string (pp
, "...");
1609 pp_cxx_separate_with (pp
, ',');
1613 /* function-definition:
1614 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1615 decl-specifier-seq(opt) declarator function-try-block */
1618 pp_cxx_function_definition (cxx_pretty_printer
*pp
, tree t
)
1620 tree saved_scope
= pp
->enclosing_scope
;
1621 pp_cxx_decl_specifier_seq (pp
, t
);
1622 pp_cxx_declarator (pp
, t
);
1623 pp_needs_newline (pp
) = true;
1624 pp
->enclosing_scope
= DECL_CONTEXT (t
);
1625 if (DECL_SAVED_TREE (t
))
1626 pp_cxx_statement (pp
, DECL_SAVED_TREE (t
));
1628 pp_cxx_semicolon (pp
);
1629 pp_newline_and_flush (pp
);
1630 pp
->enclosing_scope
= saved_scope
;
1633 /* abstract-declarator:
1634 ptr-operator abstract-declarator(opt)
1635 direct-abstract-declarator */
1638 pp_cxx_abstract_declarator (cxx_pretty_printer
*pp
, tree t
)
1640 if (TYPE_PTRMEM_P (t
))
1641 pp_cxx_right_paren (pp
);
1642 else if (POINTER_TYPE_P (t
))
1644 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
1645 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
1646 pp_cxx_right_paren (pp
);
1649 pp_cxx_direct_abstract_declarator (pp
, t
);
1652 /* direct-abstract-declarator:
1653 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1654 cv-qualifier-seq(opt) exception-specification(opt)
1655 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1656 ( abstract-declarator ) */
1659 pp_cxx_direct_abstract_declarator (cxx_pretty_printer
*pp
, tree t
)
1661 switch (TREE_CODE (t
))
1663 case REFERENCE_TYPE
:
1664 pp_cxx_abstract_declarator (pp
, t
);
1668 if (TYPE_PTRMEMFUNC_P (t
))
1669 pp_cxx_direct_abstract_declarator (pp
, TYPE_PTRMEMFUNC_FN_TYPE (t
));
1674 pp_cxx_parameter_declaration_clause (pp
, t
);
1675 pp_cxx_direct_abstract_declarator (pp
, TREE_TYPE (t
));
1676 if (TREE_CODE (t
) == METHOD_TYPE
)
1678 pp_base (pp
)->padding
= pp_before
;
1679 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (t
));
1681 pp_cxx_exception_specification (pp
, t
);
1685 case TEMPLATE_TYPE_PARM
:
1686 case TEMPLATE_TEMPLATE_PARM
:
1687 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1688 case UNBOUND_CLASS_TEMPLATE
:
1692 pp_c_direct_abstract_declarator (pp_c_base (pp
), t
);
1698 type-specifier-seq abstract-declarator(opt) */
1701 pp_cxx_type_id (cxx_pretty_printer
*pp
, tree t
)
1703 pp_flags saved_flags
= pp_c_base (pp
)->flags
;
1704 pp_c_base (pp
)->flags
|= pp_c_flag_abstract
;
1706 switch (TREE_CODE (t
))
1713 case BOUND_TEMPLATE_TEMPLATE_PARM
:
1714 case UNBOUND_CLASS_TEMPLATE
:
1715 case TEMPLATE_TEMPLATE_PARM
:
1716 case TEMPLATE_TYPE_PARM
:
1717 case TEMPLATE_PARM_INDEX
:
1720 case UNDERLYING_TYPE
:
1722 case TEMPLATE_ID_EXPR
:
1723 pp_cxx_type_specifier_seq (pp
, t
);
1726 case TYPE_PACK_EXPANSION
:
1727 pp_cxx_type_id (pp
, PACK_EXPANSION_PATTERN (t
));
1728 pp_cxx_ws_string (pp
, "...");
1732 pp_c_type_id (pp_c_base (pp
), t
);
1736 pp_c_base (pp
)->flags
= saved_flags
;
1739 /* template-argument-list:
1740 template-argument ...(opt)
1741 template-argument-list, template-argument ...(opt)
1744 assignment-expression
1749 pp_cxx_template_argument_list (cxx_pretty_printer
*pp
, tree t
)
1752 bool need_comma
= false;
1756 for (i
= 0; i
< TREE_VEC_LENGTH (t
); ++i
)
1758 tree arg
= TREE_VEC_ELT (t
, i
);
1759 tree argpack
= NULL_TREE
;
1762 if (ARGUMENT_PACK_P (arg
))
1764 argpack
= ARGUMENT_PACK_ARGS (arg
);
1765 len
= TREE_VEC_LENGTH (argpack
);
1768 for (idx
= 0; idx
< len
; idx
++)
1771 arg
= TREE_VEC_ELT (argpack
, idx
);
1774 pp_cxx_separate_with (pp
, ',');
1778 if (TYPE_P (arg
) || (TREE_CODE (arg
) == TEMPLATE_DECL
1779 && TYPE_P (DECL_TEMPLATE_RESULT (arg
))))
1780 pp_cxx_type_id (pp
, arg
);
1782 pp_cxx_expression (pp
, arg
);
1789 pp_cxx_exception_declaration (cxx_pretty_printer
*pp
, tree t
)
1791 t
= DECL_EXPR_DECL (t
);
1792 pp_cxx_type_specifier_seq (pp
, t
);
1794 pp_cxx_abstract_declarator (pp
, t
);
1796 pp_cxx_declarator (pp
, t
);
1802 pp_cxx_statement (cxx_pretty_printer
*pp
, tree t
)
1804 switch (TREE_CODE (t
))
1806 case CTOR_INITIALIZER
:
1807 pp_cxx_ctor_initializer (pp
, t
);
1811 pp_cxx_ws_string (pp
, "using");
1812 pp_cxx_ws_string (pp
, "namespace");
1813 if (DECL_CONTEXT (t
))
1814 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
1815 pp_cxx_qualified_id (pp
, USING_STMT_NAMESPACE (t
));
1819 pp_cxx_ws_string (pp
, "using");
1820 pp_cxx_nested_name_specifier (pp
, USING_DECL_SCOPE (t
));
1821 pp_cxx_unqualified_id (pp
, DECL_NAME (t
));
1828 try compound-statement handler-seq */
1830 pp_maybe_newline_and_indent (pp
, 0);
1831 pp_cxx_ws_string (pp
, "try");
1832 pp_newline_and_indent (pp
, 3);
1833 pp_cxx_statement (pp
, TRY_STMTS (t
));
1834 pp_newline_and_indent (pp
, -3);
1838 pp_cxx_statement (pp
, TRY_HANDLERS (t
));
1843 handler handler-seq(opt)
1846 catch ( exception-declaration ) compound-statement
1848 exception-declaration:
1849 type-specifier-seq declarator
1850 type-specifier-seq abstract-declarator
1853 pp_cxx_ws_string (pp
, "catch");
1854 pp_cxx_left_paren (pp
);
1855 pp_cxx_exception_declaration (pp
, HANDLER_PARMS (t
));
1856 pp_cxx_right_paren (pp
);
1857 pp_indentation (pp
) += 3;
1858 pp_needs_newline (pp
) = true;
1859 pp_cxx_statement (pp
, HANDLER_BODY (t
));
1860 pp_indentation (pp
) -= 3;
1861 pp_needs_newline (pp
) = true;
1864 /* selection-statement:
1865 if ( expression ) statement
1866 if ( expression ) statement else statement */
1868 pp_cxx_ws_string (pp
, "if");
1869 pp_cxx_whitespace (pp
);
1870 pp_cxx_left_paren (pp
);
1871 pp_cxx_expression (pp
, IF_COND (t
));
1872 pp_cxx_right_paren (pp
);
1873 pp_newline_and_indent (pp
, 2);
1874 pp_cxx_statement (pp
, THEN_CLAUSE (t
));
1875 pp_newline_and_indent (pp
, -2);
1876 if (ELSE_CLAUSE (t
))
1878 tree else_clause
= ELSE_CLAUSE (t
);
1879 pp_cxx_ws_string (pp
, "else");
1880 if (TREE_CODE (else_clause
) == IF_STMT
)
1881 pp_cxx_whitespace (pp
);
1883 pp_newline_and_indent (pp
, 2);
1884 pp_cxx_statement (pp
, else_clause
);
1885 if (TREE_CODE (else_clause
) != IF_STMT
)
1886 pp_newline_and_indent (pp
, -2);
1891 pp_cxx_ws_string (pp
, "switch");
1893 pp_cxx_left_paren (pp
);
1894 pp_cxx_expression (pp
, SWITCH_STMT_COND (t
));
1895 pp_cxx_right_paren (pp
);
1896 pp_indentation (pp
) += 3;
1897 pp_needs_newline (pp
) = true;
1898 pp_cxx_statement (pp
, SWITCH_STMT_BODY (t
));
1899 pp_newline_and_indent (pp
, -3);
1902 /* iteration-statement:
1903 while ( expression ) statement
1904 do statement while ( expression ) ;
1905 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1906 for ( declaration expression(opt) ; expression(opt) ) statement */
1908 pp_cxx_ws_string (pp
, "while");
1910 pp_cxx_left_paren (pp
);
1911 pp_cxx_expression (pp
, WHILE_COND (t
));
1912 pp_cxx_right_paren (pp
);
1913 pp_newline_and_indent (pp
, 3);
1914 pp_cxx_statement (pp
, WHILE_BODY (t
));
1915 pp_indentation (pp
) -= 3;
1916 pp_needs_newline (pp
) = true;
1920 pp_cxx_ws_string (pp
, "do");
1921 pp_newline_and_indent (pp
, 3);
1922 pp_cxx_statement (pp
, DO_BODY (t
));
1923 pp_newline_and_indent (pp
, -3);
1924 pp_cxx_ws_string (pp
, "while");
1926 pp_cxx_left_paren (pp
);
1927 pp_cxx_expression (pp
, DO_COND (t
));
1928 pp_cxx_right_paren (pp
);
1929 pp_cxx_semicolon (pp
);
1930 pp_needs_newline (pp
) = true;
1934 pp_cxx_ws_string (pp
, "for");
1936 pp_cxx_left_paren (pp
);
1937 if (FOR_INIT_STMT (t
))
1938 pp_cxx_statement (pp
, FOR_INIT_STMT (t
));
1940 pp_cxx_semicolon (pp
);
1941 pp_needs_newline (pp
) = false;
1942 pp_cxx_whitespace (pp
);
1944 pp_cxx_expression (pp
, FOR_COND (t
));
1945 pp_cxx_semicolon (pp
);
1946 pp_needs_newline (pp
) = false;
1947 pp_cxx_whitespace (pp
);
1949 pp_cxx_expression (pp
, FOR_EXPR (t
));
1950 pp_cxx_right_paren (pp
);
1951 pp_newline_and_indent (pp
, 3);
1952 pp_cxx_statement (pp
, FOR_BODY (t
));
1953 pp_indentation (pp
) -= 3;
1954 pp_needs_newline (pp
) = true;
1957 case RANGE_FOR_STMT
:
1958 pp_cxx_ws_string (pp
, "for");
1960 pp_cxx_left_paren (pp
);
1961 pp_cxx_statement (pp
, RANGE_FOR_DECL (t
));
1963 pp_needs_newline (pp
) = false;
1966 pp_cxx_statement (pp
, RANGE_FOR_EXPR (t
));
1967 pp_cxx_right_paren (pp
);
1968 pp_newline_and_indent (pp
, 3);
1969 pp_cxx_statement (pp
, FOR_BODY (t
));
1970 pp_indentation (pp
) -= 3;
1971 pp_needs_newline (pp
) = true;
1977 return expression(opt) ; */
1980 pp_string (pp
, TREE_CODE (t
) == BREAK_STMT
? "break" : "continue");
1981 pp_cxx_semicolon (pp
);
1982 pp_needs_newline (pp
) = true;
1985 /* expression-statement:
1986 expression(opt) ; */
1988 pp_cxx_expression (pp
, EXPR_STMT_EXPR (t
));
1989 pp_cxx_semicolon (pp
);
1990 pp_needs_newline (pp
) = true;
1994 pp_cxx_ws_string (pp
, "try");
1995 pp_newline_and_indent (pp
, 2);
1996 pp_cxx_statement (pp
, CLEANUP_BODY (t
));
1997 pp_newline_and_indent (pp
, -2);
1998 pp_cxx_ws_string (pp
, CLEANUP_EH_ONLY (t
) ? "catch" : "finally");
1999 pp_newline_and_indent (pp
, 2);
2000 pp_cxx_statement (pp
, CLEANUP_EXPR (t
));
2001 pp_newline_and_indent (pp
, -2);
2005 pp_cxx_declaration (pp
, t
);
2009 pp_c_statement (pp_c_base (pp
), t
);
2014 /* original-namespace-definition:
2015 namespace identifier { namespace-body }
2017 As an edge case, we also handle unnamed namespace definition here. */
2020 pp_cxx_original_namespace_definition (cxx_pretty_printer
*pp
, tree t
)
2022 pp_cxx_ws_string (pp
, "namespace");
2023 if (DECL_CONTEXT (t
))
2024 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
2026 pp_cxx_unqualified_id (pp
, t
);
2027 pp_cxx_whitespace (pp
);
2028 pp_cxx_left_brace (pp
);
2029 /* We do not print the namespace-body. */
2030 pp_cxx_whitespace (pp
);
2031 pp_cxx_right_brace (pp
);
2037 namespace-alias-definition:
2038 namespace identifier = qualified-namespace-specifier ;
2040 qualified-namespace-specifier:
2041 ::(opt) nested-name-specifier(opt) namespace-name */
2044 pp_cxx_namespace_alias_definition (cxx_pretty_printer
*pp
, tree t
)
2046 pp_cxx_ws_string (pp
, "namespace");
2047 if (DECL_CONTEXT (t
))
2048 pp_cxx_nested_name_specifier (pp
, DECL_CONTEXT (t
));
2049 pp_cxx_unqualified_id (pp
, t
);
2050 pp_cxx_whitespace (pp
);
2052 pp_cxx_whitespace (pp
);
2053 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t
)))
2054 pp_cxx_nested_name_specifier (pp
,
2055 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t
)));
2056 pp_cxx_qualified_id (pp
, DECL_NAMESPACE_ALIAS (t
));
2057 pp_cxx_semicolon (pp
);
2060 /* simple-declaration:
2061 decl-specifier-seq(opt) init-declarator-list(opt) */
2064 pp_cxx_simple_declaration (cxx_pretty_printer
*pp
, tree t
)
2066 pp_cxx_decl_specifier_seq (pp
, t
);
2067 pp_cxx_init_declarator (pp
, t
);
2068 pp_cxx_semicolon (pp
);
2069 pp_needs_newline (pp
) = true;
2073 template-parameter-list:
2075 template-parameter-list , template-parameter */
2078 pp_cxx_template_parameter_list (cxx_pretty_printer
*pp
, tree t
)
2080 const int n
= TREE_VEC_LENGTH (t
);
2082 for (i
= 0; i
< n
; ++i
)
2085 pp_cxx_separate_with (pp
, ',');
2086 pp_cxx_template_parameter (pp
, TREE_VEC_ELT (t
, i
));
2090 /* template-parameter:
2092 parameter-declaration
2095 class ...(opt) identifier(opt)
2096 class identifier(opt) = type-id
2097 typename identifier(opt)
2098 typename ...(opt) identifier(opt) = type-id
2099 template < template-parameter-list > class ...(opt) identifier(opt)
2100 template < template-parameter-list > class identifier(opt) = template-name */
2103 pp_cxx_template_parameter (cxx_pretty_printer
*pp
, tree t
)
2105 tree parameter
= TREE_VALUE (t
);
2106 switch (TREE_CODE (parameter
))
2109 pp_cxx_ws_string (pp
, "class");
2110 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
2111 pp_cxx_ws_string (pp
, "...");
2112 if (DECL_NAME (parameter
))
2113 pp_cxx_tree_identifier (pp
, DECL_NAME (parameter
));
2114 /* FIXME: Check if we should print also default argument. */
2118 pp_cxx_parameter_declaration (pp
, parameter
);
2125 pp_unsupported_tree (pp
, t
);
2130 /* Pretty-print a template parameter in the canonical form
2131 "template-parameter-<level>-<position in parameter list>". */
2134 pp_cxx_canonical_template_parameter (cxx_pretty_printer
*pp
, tree parm
)
2136 const enum tree_code code
= TREE_CODE (parm
);
2138 /* Brings type template parameters to the canonical forms. */
2139 if (code
== TEMPLATE_TYPE_PARM
|| code
== TEMPLATE_TEMPLATE_PARM
2140 || code
== BOUND_TEMPLATE_TEMPLATE_PARM
)
2141 parm
= TEMPLATE_TYPE_PARM_INDEX (parm
);
2143 pp_cxx_begin_template_argument_list (pp
);
2144 pp_cxx_ws_string (pp
, M_("template-parameter-"));
2145 pp_wide_integer (pp
, TEMPLATE_PARM_LEVEL (parm
));
2147 pp_wide_integer (pp
, TEMPLATE_PARM_IDX (parm
) + 1);
2148 pp_cxx_end_template_argument_list (pp
);
2152 template-declaration:
2153 export(opt) template < template-parameter-list > declaration */
2156 pp_cxx_template_declaration (cxx_pretty_printer
*pp
, tree t
)
2158 tree tmpl
= most_general_template (t
);
2161 pp_maybe_newline_and_indent (pp
, 0);
2162 for (level
= DECL_TEMPLATE_PARMS (tmpl
); level
; level
= TREE_CHAIN (level
))
2164 pp_cxx_ws_string (pp
, "template");
2165 pp_cxx_begin_template_argument_list (pp
);
2166 pp_cxx_template_parameter_list (pp
, TREE_VALUE (level
));
2167 pp_cxx_end_template_argument_list (pp
);
2168 pp_newline_and_indent (pp
, 3);
2170 if (TREE_CODE (t
) == FUNCTION_DECL
&& DECL_SAVED_TREE (t
))
2171 pp_cxx_function_definition (pp
, t
);
2173 pp_cxx_simple_declaration (pp
, t
);
2177 pp_cxx_explicit_specialization (cxx_pretty_printer
*pp
, tree t
)
2179 pp_unsupported_tree (pp
, t
);
2183 pp_cxx_explicit_instantiation (cxx_pretty_printer
*pp
, tree t
)
2185 pp_unsupported_tree (pp
, t
);
2192 template-declaration
2193 explicit-instantiation
2194 explicit-specialization
2195 linkage-specification
2196 namespace-definition
2201 namespace-alias-definition
2204 static_assert-declaration */
2206 pp_cxx_declaration (cxx_pretty_printer
*pp
, tree t
)
2208 if (TREE_CODE (t
) == STATIC_ASSERT
)
2210 pp_cxx_ws_string (pp
, "static_assert");
2211 pp_cxx_left_paren (pp
);
2212 pp_cxx_expression (pp
, STATIC_ASSERT_CONDITION (t
));
2213 pp_cxx_separate_with (pp
, ',');
2214 pp_cxx_expression (pp
, STATIC_ASSERT_MESSAGE (t
));
2215 pp_cxx_right_paren (pp
);
2217 else if (!DECL_LANG_SPECIFIC (t
))
2218 pp_cxx_simple_declaration (pp
, t
);
2219 else if (DECL_USE_TEMPLATE (t
))
2220 switch (DECL_USE_TEMPLATE (t
))
2223 pp_cxx_template_declaration (pp
, t
);
2227 pp_cxx_explicit_specialization (pp
, t
);
2231 pp_cxx_explicit_instantiation (pp
, t
);
2237 else switch (TREE_CODE (t
))
2241 pp_cxx_simple_declaration (pp
, t
);
2245 if (DECL_SAVED_TREE (t
))
2246 pp_cxx_function_definition (pp
, t
);
2248 pp_cxx_simple_declaration (pp
, t
);
2251 case NAMESPACE_DECL
:
2252 if (DECL_NAMESPACE_ALIAS (t
))
2253 pp_cxx_namespace_alias_definition (pp
, t
);
2255 pp_cxx_original_namespace_definition (pp
, t
);
2259 pp_unsupported_tree (pp
, t
);
2265 pp_cxx_typeid_expression (cxx_pretty_printer
*pp
, tree t
)
2267 t
= TREE_OPERAND (t
, 0);
2268 pp_cxx_ws_string (pp
, "typeid");
2269 pp_cxx_left_paren (pp
);
2271 pp_cxx_type_id (pp
, t
);
2273 pp_cxx_expression (pp
, t
);
2274 pp_cxx_right_paren (pp
);
2278 pp_cxx_va_arg_expression (cxx_pretty_printer
*pp
, tree t
)
2280 pp_cxx_ws_string (pp
, "va_arg");
2281 pp_cxx_left_paren (pp
);
2282 pp_cxx_assignment_expression (pp
, TREE_OPERAND (t
, 0));
2283 pp_cxx_separate_with (pp
, ',');
2284 pp_cxx_type_id (pp
, TREE_TYPE (t
));
2285 pp_cxx_right_paren (pp
);
2289 pp_cxx_offsetof_expression_1 (cxx_pretty_printer
*pp
, tree t
)
2291 switch (TREE_CODE (t
))
2294 if (TREE_CODE (TREE_OPERAND (t
, 0)) == STATIC_CAST_EXPR
2295 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t
, 0))))
2297 pp_cxx_type_id (pp
, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))));
2298 pp_cxx_separate_with (pp
, ',');
2303 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2305 if (TREE_CODE (TREE_OPERAND (t
, 0)) != ARROW_EXPR
)
2307 pp_cxx_expression (pp
, TREE_OPERAND (t
, 1));
2310 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2312 pp_left_bracket (pp
);
2313 pp_cxx_expression (pp
, TREE_OPERAND (t
, 1));
2314 pp_right_bracket (pp
);
2322 pp_cxx_offsetof_expression (cxx_pretty_printer
*pp
, tree t
)
2324 pp_cxx_ws_string (pp
, "offsetof");
2325 pp_cxx_left_paren (pp
);
2326 if (!pp_cxx_offsetof_expression_1 (pp
, TREE_OPERAND (t
, 0)))
2327 pp_cxx_expression (pp
, TREE_OPERAND (t
, 0));
2328 pp_cxx_right_paren (pp
);
2332 pp_cxx_trait_expression (cxx_pretty_printer
*pp
, tree t
)
2334 cp_trait_kind kind
= TRAIT_EXPR_KIND (t
);
2338 case CPTK_HAS_NOTHROW_ASSIGN
:
2339 pp_cxx_ws_string (pp
, "__has_nothrow_assign");
2341 case CPTK_HAS_TRIVIAL_ASSIGN
:
2342 pp_cxx_ws_string (pp
, "__has_trivial_assign");
2344 case CPTK_HAS_NOTHROW_CONSTRUCTOR
:
2345 pp_cxx_ws_string (pp
, "__has_nothrow_constructor");
2347 case CPTK_HAS_TRIVIAL_CONSTRUCTOR
:
2348 pp_cxx_ws_string (pp
, "__has_trivial_constructor");
2350 case CPTK_HAS_NOTHROW_COPY
:
2351 pp_cxx_ws_string (pp
, "__has_nothrow_copy");
2353 case CPTK_HAS_TRIVIAL_COPY
:
2354 pp_cxx_ws_string (pp
, "__has_trivial_copy");
2356 case CPTK_HAS_TRIVIAL_DESTRUCTOR
:
2357 pp_cxx_ws_string (pp
, "__has_trivial_destructor");
2359 case CPTK_HAS_VIRTUAL_DESTRUCTOR
:
2360 pp_cxx_ws_string (pp
, "__has_virtual_destructor");
2362 case CPTK_IS_ABSTRACT
:
2363 pp_cxx_ws_string (pp
, "__is_abstract");
2365 case CPTK_IS_BASE_OF
:
2366 pp_cxx_ws_string (pp
, "__is_base_of");
2369 pp_cxx_ws_string (pp
, "__is_class");
2371 case CPTK_IS_CONVERTIBLE_TO
:
2372 pp_cxx_ws_string (pp
, "__is_convertible_to");
2375 pp_cxx_ws_string (pp
, "__is_empty");
2378 pp_cxx_ws_string (pp
, "__is_enum");
2381 pp_cxx_ws_string (pp
, "__is_final");
2384 pp_cxx_ws_string (pp
, "__is_pod");
2386 case CPTK_IS_POLYMORPHIC
:
2387 pp_cxx_ws_string (pp
, "__is_polymorphic");
2389 case CPTK_IS_STD_LAYOUT
:
2390 pp_cxx_ws_string (pp
, "__is_std_layout");
2392 case CPTK_IS_TRIVIAL
:
2393 pp_cxx_ws_string (pp
, "__is_trivial");
2396 pp_cxx_ws_string (pp
, "__is_union");
2398 case CPTK_IS_LITERAL_TYPE
:
2399 pp_cxx_ws_string (pp
, "__is_literal_type");
2406 pp_cxx_left_paren (pp
);
2407 pp_cxx_type_id (pp
, TRAIT_EXPR_TYPE1 (t
));
2409 if (kind
== CPTK_IS_BASE_OF
|| kind
== CPTK_IS_CONVERTIBLE_TO
)
2411 pp_cxx_separate_with (pp
, ',');
2412 pp_cxx_type_id (pp
, TRAIT_EXPR_TYPE2 (t
));
2415 pp_cxx_right_paren (pp
);
2418 typedef c_pretty_print_fn pp_fun
;
2420 /* Initialization of a C++ pretty-printer object. */
2423 pp_cxx_pretty_printer_init (cxx_pretty_printer
*pp
)
2425 pp_c_pretty_printer_init (pp_c_base (pp
));
2426 pp_set_line_maximum_length (pp
, 0);
2428 pp
->c_base
.declaration
= (pp_fun
) pp_cxx_declaration
;
2429 pp
->c_base
.declaration_specifiers
= (pp_fun
) pp_cxx_decl_specifier_seq
;
2430 pp
->c_base
.function_specifier
= (pp_fun
) pp_cxx_function_specifier
;
2431 pp
->c_base
.type_specifier_seq
= (pp_fun
) pp_cxx_type_specifier_seq
;
2432 pp
->c_base
.declarator
= (pp_fun
) pp_cxx_declarator
;
2433 pp
->c_base
.direct_declarator
= (pp_fun
) pp_cxx_direct_declarator
;
2434 pp
->c_base
.parameter_list
= (pp_fun
) pp_cxx_parameter_declaration_clause
;
2435 pp
->c_base
.type_id
= (pp_fun
) pp_cxx_type_id
;
2436 pp
->c_base
.abstract_declarator
= (pp_fun
) pp_cxx_abstract_declarator
;
2437 pp
->c_base
.direct_abstract_declarator
=
2438 (pp_fun
) pp_cxx_direct_abstract_declarator
;
2439 pp
->c_base
.simple_type_specifier
= (pp_fun
)pp_cxx_simple_type_specifier
;
2441 /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */
2443 pp
->c_base
.constant
= (pp_fun
) pp_cxx_constant
;
2444 pp
->c_base
.id_expression
= (pp_fun
) pp_cxx_id_expression
;
2445 pp
->c_base
.primary_expression
= (pp_fun
) pp_cxx_primary_expression
;
2446 pp
->c_base
.postfix_expression
= (pp_fun
) pp_cxx_postfix_expression
;
2447 pp
->c_base
.unary_expression
= (pp_fun
) pp_cxx_unary_expression
;
2448 pp
->c_base
.multiplicative_expression
= (pp_fun
) pp_cxx_multiplicative_expression
;
2449 pp
->c_base
.conditional_expression
= (pp_fun
) pp_cxx_conditional_expression
;
2450 pp
->c_base
.assignment_expression
= (pp_fun
) pp_cxx_assignment_expression
;
2451 pp
->c_base
.expression
= (pp_fun
) pp_cxx_expression
;
2452 pp
->enclosing_scope
= global_namespace
;