PR c++/37766
[official-gcc/constexpr.git] / gcc / cp / cxx-pretty-print.c
blob1d7f9cf2caf401b37f514247fe0283898f52f092
1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2 Copyright (C) 2003, 2004, 2005, 2007, 2008,
3 2009 Free Software Foundation, Inc.
4 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
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
16 for more details.
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/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "real.h"
27 #include "intl.h"
28 #include "cxx-pretty-print.h"
29 #include "cp-tree.h"
30 #include "toplev.h"
32 /* Translate if being used for diagnostics, but not for dump files or
33 __PRETTY_FUNCTION. */
34 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
36 static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
37 static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
38 static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
39 static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
40 static void pp_cxx_expression (cxx_pretty_printer *, tree);
41 static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
42 static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
43 static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
44 static void pp_cxx_type_id (cxx_pretty_printer *, tree);
45 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
46 static void pp_cxx_declarator (cxx_pretty_printer *, tree);
47 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
48 static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
49 static void pp_cxx_statement (cxx_pretty_printer *, tree);
50 static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
51 static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
52 static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
55 static inline void
56 pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
58 const char *p = pp_last_position_in_text (pp);
60 if (p != NULL && *p == c)
61 pp_cxx_whitespace (pp);
62 pp_character (pp, c);
63 pp_base (pp)->padding = pp_none;
66 #define pp_cxx_storage_class_specifier(PP, T) \
67 pp_c_storage_class_specifier (pp_c_base (PP), T)
68 #define pp_cxx_expression_list(PP, T) \
69 pp_c_expression_list (pp_c_base (PP), T)
70 #define pp_cxx_space_for_pointer_operator(PP, T) \
71 pp_c_space_for_pointer_operator (pp_c_base (PP), T)
72 #define pp_cxx_init_declarator(PP, T) \
73 pp_c_init_declarator (pp_c_base (PP), T)
74 #define pp_cxx_call_argument_list(PP, T) \
75 pp_c_call_argument_list (pp_c_base (PP), T)
77 void
78 pp_cxx_colon_colon (cxx_pretty_printer *pp)
80 pp_colon_colon (pp);
81 pp_base (pp)->padding = pp_none;
84 void
85 pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
87 pp_cxx_nonconsecutive_character (pp, '<');
90 void
91 pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
93 pp_cxx_nonconsecutive_character (pp, '>');
96 void
97 pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
99 pp_separate_with (pp, c);
100 pp_base (pp)->padding = pp_none;
103 /* Expressions. */
105 static inline bool
106 is_destructor_name (tree name)
108 return name == complete_dtor_identifier
109 || name == base_dtor_identifier
110 || name == deleting_dtor_identifier;
113 /* conversion-function-id:
114 operator conversion-type-id
116 conversion-type-id:
117 type-specifier-seq conversion-declarator(opt)
119 conversion-declarator:
120 ptr-operator conversion-declarator(opt) */
122 static inline void
123 pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
125 pp_cxx_ws_string (pp, "operator");
126 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
129 static inline void
130 pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
132 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
133 pp_cxx_begin_template_argument_list (pp);
134 pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
135 pp_cxx_end_template_argument_list (pp);
138 /* Prints the unqualified part of the id-expression T.
140 unqualified-id:
141 identifier
142 operator-function-id
143 conversion-function-id
144 ~ class-name
145 template-id */
147 static void
148 pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
150 enum tree_code code = TREE_CODE (t);
151 switch (code)
153 case RESULT_DECL:
154 pp_cxx_ws_string (pp, M_("<return-value>"));
155 break;
157 case OVERLOAD:
158 t = OVL_CURRENT (t);
159 case VAR_DECL:
160 case PARM_DECL:
161 case CONST_DECL:
162 case TYPE_DECL:
163 case FUNCTION_DECL:
164 case NAMESPACE_DECL:
165 case FIELD_DECL:
166 case LABEL_DECL:
167 case USING_DECL:
168 case TEMPLATE_DECL:
169 t = DECL_NAME (t);
171 case IDENTIFIER_NODE:
172 if (t == NULL)
173 pp_cxx_ws_string (pp, M_("<unnamed>"));
174 else if (IDENTIFIER_TYPENAME_P (t))
175 pp_cxx_conversion_function_id (pp, t);
176 else
178 if (is_destructor_name (t))
180 pp_complement (pp);
181 /* FIXME: Why is this necessary? */
182 if (TREE_TYPE (t))
183 t = constructor_name (TREE_TYPE (t));
185 pp_cxx_tree_identifier (pp, t);
187 break;
189 case TEMPLATE_ID_EXPR:
190 pp_cxx_template_id (pp, t);
191 break;
193 case BASELINK:
194 pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
195 break;
197 case RECORD_TYPE:
198 case UNION_TYPE:
199 case ENUMERAL_TYPE:
200 case TYPENAME_TYPE:
201 case UNBOUND_CLASS_TEMPLATE:
202 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
203 break;
205 case BIT_NOT_EXPR:
206 pp_cxx_complement (pp);
207 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
208 break;
210 case TEMPLATE_TYPE_PARM:
211 case TEMPLATE_TEMPLATE_PARM:
212 if (TYPE_IDENTIFIER (t))
213 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
214 else
215 pp_cxx_canonical_template_parameter (pp, t);
216 break;
218 case TEMPLATE_PARM_INDEX:
219 pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
220 break;
222 case BOUND_TEMPLATE_TEMPLATE_PARM:
223 pp_cxx_cv_qualifier_seq (pp, t);
224 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
225 pp_cxx_begin_template_argument_list (pp);
226 pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
227 pp_cxx_end_template_argument_list (pp);
228 break;
230 default:
231 pp_unsupported_tree (pp, t);
232 break;
236 /* Pretty-print out the token sequence ":: template" in template codes
237 where it is needed to "inline declare" the (following) member as
238 a template. This situation arises when SCOPE of T is dependent
239 on template parameters. */
241 static inline void
242 pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
244 if (TREE_CODE (t) == TEMPLATE_ID_EXPR
245 && TYPE_P (scope) && dependent_type_p (scope))
246 pp_cxx_ws_string (pp, "template");
249 /* nested-name-specifier:
250 class-or-namespace-name :: nested-name-specifier(opt)
251 class-or-namespace-name :: template nested-name-specifier */
253 static void
254 pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
256 if (t != NULL && t != pp->enclosing_scope)
258 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
259 pp_cxx_nested_name_specifier (pp, scope);
260 pp_cxx_template_keyword_if_needed (pp, scope, t);
261 pp_cxx_unqualified_id (pp, t);
262 pp_cxx_colon_colon (pp);
266 /* qualified-id:
267 nested-name-specifier template(opt) unqualified-id */
269 static void
270 pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
272 switch (TREE_CODE (t))
274 /* A pointer-to-member is always qualified. */
275 case PTRMEM_CST:
276 pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
277 pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
278 break;
280 /* In Standard C++, functions cannot possibly be used as
281 nested-name-specifiers. However, there are situations where
282 is "makes sense" to output the surrounding function name for the
283 purpose of emphasizing on the scope kind. Just printing the
284 function name might not be sufficient as it may be overloaded; so,
285 we decorate the function with its signature too.
286 FIXME: This is probably the wrong pretty-printing for conversion
287 functions and some function templates. */
288 case OVERLOAD:
289 t = OVL_CURRENT (t);
290 case FUNCTION_DECL:
291 if (DECL_FUNCTION_MEMBER_P (t))
292 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
293 pp_cxx_unqualified_id
294 (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
295 pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
296 break;
298 case OFFSET_REF:
299 case SCOPE_REF:
300 pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
301 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
302 break;
304 default:
306 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
307 if (scope != pp->enclosing_scope)
309 pp_cxx_nested_name_specifier (pp, scope);
310 pp_cxx_template_keyword_if_needed (pp, scope, t);
312 pp_cxx_unqualified_id (pp, t);
314 break;
319 static void
320 pp_cxx_constant (cxx_pretty_printer *pp, tree t)
322 switch (TREE_CODE (t))
324 case STRING_CST:
326 const bool in_parens = PAREN_STRING_LITERAL_P (t);
327 if (in_parens)
328 pp_cxx_left_paren (pp);
329 pp_c_constant (pp_c_base (pp), t);
330 if (in_parens)
331 pp_cxx_right_paren (pp);
333 break;
335 default:
336 pp_c_constant (pp_c_base (pp), t);
337 break;
341 /* id-expression:
342 unqualified-id
343 qualified-id */
345 static inline void
346 pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
348 if (TREE_CODE (t) == OVERLOAD)
349 t = OVL_CURRENT (t);
350 if (DECL_P (t) && DECL_CONTEXT (t))
351 pp_cxx_qualified_id (pp, t);
352 else
353 pp_cxx_unqualified_id (pp, t);
356 /* primary-expression:
357 literal
358 this
359 :: identifier
360 :: operator-function-id
361 :: qualifier-id
362 ( expression )
363 id-expression
365 GNU Extensions:
366 __builtin_va_arg ( assignment-expression , type-id )
367 __builtin_offsetof ( type-id, offsetof-expression )
369 __has_nothrow_assign ( type-id )
370 __has_nothrow_constructor ( type-id )
371 __has_nothrow_copy ( type-id )
372 __has_trivial_assign ( type-id )
373 __has_trivial_constructor ( type-id )
374 __has_trivial_copy ( type-id )
375 __has_trivial_destructor ( type-id )
376 __has_virtual_destructor ( type-id )
377 __is_abstract ( type-id )
378 __is_base_of ( type-id , type-id )
379 __is_class ( type-id )
380 __is_convertible_to ( type-id , type-id )
381 __is_empty ( type-id )
382 __is_enum ( type-id )
383 __is_pod ( type-id )
384 __is_polymorphic ( type-id )
385 __is_union ( type-id ) */
387 static void
388 pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
390 switch (TREE_CODE (t))
392 case INTEGER_CST:
393 case REAL_CST:
394 case COMPLEX_CST:
395 case STRING_CST:
396 pp_cxx_constant (pp, t);
397 break;
399 case BASELINK:
400 t = BASELINK_FUNCTIONS (t);
401 case VAR_DECL:
402 case PARM_DECL:
403 case FIELD_DECL:
404 case FUNCTION_DECL:
405 case OVERLOAD:
406 case CONST_DECL:
407 case TEMPLATE_DECL:
408 pp_cxx_id_expression (pp, t);
409 break;
411 case RESULT_DECL:
412 case TEMPLATE_TYPE_PARM:
413 case TEMPLATE_TEMPLATE_PARM:
414 case TEMPLATE_PARM_INDEX:
415 pp_cxx_unqualified_id (pp, t);
416 break;
418 case STMT_EXPR:
419 pp_cxx_left_paren (pp);
420 pp_cxx_statement (pp, STMT_EXPR_STMT (t));
421 pp_cxx_right_paren (pp);
422 break;
424 case TRAIT_EXPR:
425 pp_cxx_trait_expression (pp, t);
426 break;
428 case VA_ARG_EXPR:
429 pp_cxx_va_arg_expression (pp, t);
430 break;
432 case OFFSETOF_EXPR:
433 pp_cxx_offsetof_expression (pp, t);
434 break;
436 default:
437 pp_c_primary_expression (pp_c_base (pp), t);
438 break;
442 /* postfix-expression:
443 primary-expression
444 postfix-expression [ expression ]
445 postfix-expression ( expression-list(opt) )
446 simple-type-specifier ( expression-list(opt) )
447 typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
448 typename ::(opt) nested-name-specifier template(opt)
449 template-id ( expression-list(opt) )
450 postfix-expression . template(opt) ::(opt) id-expression
451 postfix-expression -> template(opt) ::(opt) id-expression
452 postfix-expression . pseudo-destructor-name
453 postfix-expression -> pseudo-destructor-name
454 postfix-expression ++
455 postfix-expression --
456 dynamic_cast < type-id > ( expression )
457 static_cast < type-id > ( expression )
458 reinterpret_cast < type-id > ( expression )
459 const_cast < type-id > ( expression )
460 typeid ( expression )
461 typeid ( type-id ) */
463 static void
464 pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
466 enum tree_code code = TREE_CODE (t);
468 switch (code)
470 case AGGR_INIT_EXPR:
471 case CALL_EXPR:
473 tree fun = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t)
474 : CALL_EXPR_FN (t));
475 tree saved_scope = pp->enclosing_scope;
476 bool skipfirst = false;
477 tree arg;
479 if (TREE_CODE (fun) == ADDR_EXPR)
480 fun = TREE_OPERAND (fun, 0);
482 /* In templates, where there is no way to tell whether a given
483 call uses an actual member function. So the parser builds
484 FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
485 instantiation time. */
486 if (TREE_CODE (fun) != FUNCTION_DECL)
488 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
490 tree object = (code == AGGR_INIT_EXPR
491 ? (AGGR_INIT_VIA_CTOR_P (t)
492 ? AGGR_INIT_EXPR_SLOT (t)
493 : AGGR_INIT_EXPR_ARG (t, 0))
494 : CALL_EXPR_ARG (t, 0));
496 while (TREE_CODE (object) == NOP_EXPR)
497 object = TREE_OPERAND (object, 0);
499 if (TREE_CODE (object) == ADDR_EXPR)
500 object = TREE_OPERAND (object, 0);
502 if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
504 pp_cxx_postfix_expression (pp, object);
505 pp_cxx_dot (pp);
507 else
509 pp_cxx_postfix_expression (pp, object);
510 pp_cxx_arrow (pp);
512 skipfirst = true;
513 pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
516 pp_cxx_postfix_expression (pp, fun);
517 pp->enclosing_scope = saved_scope;
518 pp_cxx_left_paren (pp);
519 if (code == AGGR_INIT_EXPR)
521 aggr_init_expr_arg_iterator iter;
522 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
524 if (skipfirst)
525 skipfirst = false;
526 else
528 pp_cxx_expression (pp, arg);
529 if (more_aggr_init_expr_args_p (&iter))
530 pp_cxx_separate_with (pp, ',');
534 else
536 call_expr_arg_iterator iter;
537 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
539 if (skipfirst)
540 skipfirst = false;
541 else
543 pp_cxx_expression (pp, arg);
544 if (more_call_expr_args_p (&iter))
545 pp_cxx_separate_with (pp, ',');
549 pp_cxx_right_paren (pp);
551 if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
553 pp_cxx_separate_with (pp, ',');
554 pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t));
556 break;
558 case BASELINK:
559 case VAR_DECL:
560 case PARM_DECL:
561 case FIELD_DECL:
562 case FUNCTION_DECL:
563 case OVERLOAD:
564 case CONST_DECL:
565 case TEMPLATE_DECL:
566 case RESULT_DECL:
567 pp_cxx_primary_expression (pp, t);
568 break;
570 case DYNAMIC_CAST_EXPR:
571 case STATIC_CAST_EXPR:
572 case REINTERPRET_CAST_EXPR:
573 case CONST_CAST_EXPR:
574 if (code == DYNAMIC_CAST_EXPR)
575 pp_cxx_ws_string (pp, "dynamic_cast");
576 else if (code == STATIC_CAST_EXPR)
577 pp_cxx_ws_string (pp, "static_cast");
578 else if (code == REINTERPRET_CAST_EXPR)
579 pp_cxx_ws_string (pp, "reinterpret_cast");
580 else
581 pp_cxx_ws_string (pp, "const_cast");
582 pp_cxx_begin_template_argument_list (pp);
583 pp_cxx_type_id (pp, TREE_TYPE (t));
584 pp_cxx_end_template_argument_list (pp);
585 pp_left_paren (pp);
586 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
587 pp_right_paren (pp);
588 break;
590 case EMPTY_CLASS_EXPR:
591 pp_cxx_type_id (pp, TREE_TYPE (t));
592 pp_left_paren (pp);
593 pp_right_paren (pp);
594 break;
596 case TYPEID_EXPR:
597 pp_cxx_typeid_expression (pp, t);
598 break;
600 case PSEUDO_DTOR_EXPR:
601 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
602 pp_cxx_dot (pp);
603 pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
604 pp_cxx_colon_colon (pp);
605 pp_complement (pp);
606 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
607 break;
609 case ARROW_EXPR:
610 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
611 pp_cxx_arrow (pp);
612 break;
614 default:
615 pp_c_postfix_expression (pp_c_base (pp), t);
616 break;
620 /* new-expression:
621 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
622 ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
624 new-placement:
625 ( expression-list )
627 new-type-id:
628 type-specifier-seq new-declarator(opt)
630 new-declarator:
631 ptr-operator new-declarator(opt)
632 direct-new-declarator
634 direct-new-declarator
635 [ expression ]
636 direct-new-declarator [ constant-expression ]
638 new-initializer:
639 ( expression-list(opt) ) */
641 static void
642 pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
644 enum tree_code code = TREE_CODE (t);
645 tree type = TREE_OPERAND (t, 1);
646 tree init = TREE_OPERAND (t, 2);
647 switch (code)
649 case NEW_EXPR:
650 case VEC_NEW_EXPR:
651 if (NEW_EXPR_USE_GLOBAL (t))
652 pp_cxx_colon_colon (pp);
653 pp_cxx_ws_string (pp, "new");
654 if (TREE_OPERAND (t, 0))
656 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
657 pp_space (pp);
659 if (TREE_CODE (type) == ARRAY_REF)
660 type = build_cplus_array_type
661 (TREE_OPERAND (type, 0),
662 build_index_type (fold_build2_loc (input_location,
663 MINUS_EXPR, integer_type_node,
664 TREE_OPERAND (type, 1),
665 integer_one_node)));
666 pp_cxx_type_id (pp, type);
667 if (init)
669 pp_left_paren (pp);
670 if (TREE_CODE (init) == TREE_LIST)
671 pp_c_expression_list (pp_c_base (pp), init);
672 else if (init == void_zero_node)
673 ; /* OK, empty initializer list. */
674 else
675 pp_cxx_expression (pp, init);
676 pp_right_paren (pp);
678 break;
680 default:
681 pp_unsupported_tree (pp, t);
685 /* delete-expression:
686 ::(opt) delete cast-expression
687 ::(opt) delete [ ] cast-expression */
689 static void
690 pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
692 enum tree_code code = TREE_CODE (t);
693 switch (code)
695 case DELETE_EXPR:
696 case VEC_DELETE_EXPR:
697 if (DELETE_EXPR_USE_GLOBAL (t))
698 pp_cxx_colon_colon (pp);
699 pp_cxx_ws_string (pp, "delete");
700 pp_space (pp);
701 if (code == VEC_DELETE_EXPR
702 || DELETE_EXPR_USE_VEC (t))
704 pp_left_bracket (pp);
705 pp_right_bracket (pp);
706 pp_space (pp);
708 pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
709 break;
711 default:
712 pp_unsupported_tree (pp, t);
716 /* unary-expression:
717 postfix-expression
718 ++ cast-expression
719 -- cast-expression
720 unary-operator cast-expression
721 sizeof unary-expression
722 sizeof ( type-id )
723 sizeof ... ( identifier )
724 new-expression
725 delete-expression
727 unary-operator: one of
728 * & + - !
730 GNU extensions:
731 __alignof__ unary-expression
732 __alignof__ ( type-id ) */
734 static void
735 pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
737 enum tree_code code = TREE_CODE (t);
738 switch (code)
740 case NEW_EXPR:
741 case VEC_NEW_EXPR:
742 pp_cxx_new_expression (pp, t);
743 break;
745 case DELETE_EXPR:
746 case VEC_DELETE_EXPR:
747 pp_cxx_delete_expression (pp, t);
748 break;
750 case SIZEOF_EXPR:
751 if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
753 pp_cxx_ws_string (pp, "sizeof");
754 pp_cxx_ws_string (pp, "...");
755 pp_cxx_whitespace (pp);
756 pp_cxx_left_paren (pp);
757 if (TYPE_P (TREE_OPERAND (t, 0)))
758 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
759 else
760 pp_unary_expression (pp, TREE_OPERAND (t, 0));
761 pp_cxx_right_paren (pp);
762 break;
764 /* Fall through */
766 case ALIGNOF_EXPR:
767 pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
768 pp_cxx_whitespace (pp);
769 if (TYPE_P (TREE_OPERAND (t, 0)))
771 pp_cxx_left_paren (pp);
772 pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
773 pp_cxx_right_paren (pp);
775 else
776 pp_unary_expression (pp, TREE_OPERAND (t, 0));
777 break;
779 case UNARY_PLUS_EXPR:
780 pp_plus (pp);
781 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
782 break;
784 default:
785 pp_c_unary_expression (pp_c_base (pp), t);
786 break;
790 /* cast-expression:
791 unary-expression
792 ( type-id ) cast-expression */
794 static void
795 pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
797 switch (TREE_CODE (t))
799 case CAST_EXPR:
800 pp_cxx_type_id (pp, TREE_TYPE (t));
801 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
802 break;
804 default:
805 pp_c_cast_expression (pp_c_base (pp), t);
806 break;
810 /* pm-expression:
811 cast-expression
812 pm-expression .* cast-expression
813 pm-expression ->* cast-expression */
815 static void
816 pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
818 switch (TREE_CODE (t))
820 /* Handle unfortunate OFFSET_REF overloading here. */
821 case OFFSET_REF:
822 if (TYPE_P (TREE_OPERAND (t, 0)))
824 pp_cxx_qualified_id (pp, t);
825 break;
827 /* Else fall through. */
828 case MEMBER_REF:
829 case DOTSTAR_EXPR:
830 pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
831 if (TREE_CODE (t) == MEMBER_REF)
832 pp_cxx_arrow (pp);
833 else
834 pp_cxx_dot (pp);
835 pp_star(pp);
836 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
837 break;
840 default:
841 pp_cxx_cast_expression (pp, t);
842 break;
846 /* multiplicative-expression:
847 pm-expression
848 multiplicative-expression * pm-expression
849 multiplicative-expression / pm-expression
850 multiplicative-expression % pm-expression */
852 static void
853 pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
855 enum tree_code code = TREE_CODE (e);
856 switch (code)
858 case MULT_EXPR:
859 case TRUNC_DIV_EXPR:
860 case TRUNC_MOD_EXPR:
861 pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
862 pp_space (pp);
863 if (code == MULT_EXPR)
864 pp_star (pp);
865 else if (code == TRUNC_DIV_EXPR)
866 pp_slash (pp);
867 else
868 pp_modulo (pp);
869 pp_space (pp);
870 pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
871 break;
873 default:
874 pp_cxx_pm_expression (pp, e);
875 break;
879 /* conditional-expression:
880 logical-or-expression
881 logical-or-expression ? expression : assignment-expression */
883 static void
884 pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
886 if (TREE_CODE (e) == COND_EXPR)
888 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
889 pp_space (pp);
890 pp_question (pp);
891 pp_space (pp);
892 pp_cxx_expression (pp, TREE_OPERAND (e, 1));
893 pp_space (pp);
894 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
896 else
897 pp_c_logical_or_expression (pp_c_base (pp), e);
900 /* Pretty-print a compound assignment operator token as indicated by T. */
902 static void
903 pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
905 const char *op;
907 switch (TREE_CODE (t))
909 case NOP_EXPR:
910 op = "=";
911 break;
913 case PLUS_EXPR:
914 op = "+=";
915 break;
917 case MINUS_EXPR:
918 op = "-=";
919 break;
921 case TRUNC_DIV_EXPR:
922 op = "/=";
923 break;
925 case TRUNC_MOD_EXPR:
926 op = "%=";
927 break;
929 default:
930 op = tree_code_name[TREE_CODE (t)];
931 break;
934 pp_cxx_ws_string (pp, op);
938 /* assignment-expression:
939 conditional-expression
940 logical-or-expression assignment-operator assignment-expression
941 throw-expression
943 throw-expression:
944 throw assignment-expression(opt)
946 assignment-operator: one of
947 = *= /= %= += -= >>= <<= &= ^= |= */
949 static void
950 pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
952 switch (TREE_CODE (e))
954 case MODIFY_EXPR:
955 case INIT_EXPR:
956 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
957 pp_space (pp);
958 pp_equal (pp);
959 pp_space (pp);
960 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
961 break;
963 case THROW_EXPR:
964 pp_cxx_ws_string (pp, "throw");
965 if (TREE_OPERAND (e, 0))
966 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
967 break;
969 case MODOP_EXPR:
970 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
971 pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
972 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
973 break;
975 default:
976 pp_cxx_conditional_expression (pp, e);
977 break;
981 static void
982 pp_cxx_expression (cxx_pretty_printer *pp, tree t)
984 switch (TREE_CODE (t))
986 case STRING_CST:
987 case INTEGER_CST:
988 case REAL_CST:
989 case COMPLEX_CST:
990 pp_cxx_constant (pp, t);
991 break;
993 case RESULT_DECL:
994 pp_cxx_unqualified_id (pp, t);
995 break;
997 #if 0
998 case OFFSET_REF:
999 #endif
1000 case SCOPE_REF:
1001 case PTRMEM_CST:
1002 pp_cxx_qualified_id (pp, t);
1003 break;
1005 case OVERLOAD:
1006 t = OVL_CURRENT (t);
1007 case VAR_DECL:
1008 case PARM_DECL:
1009 case FIELD_DECL:
1010 case CONST_DECL:
1011 case FUNCTION_DECL:
1012 case BASELINK:
1013 case TEMPLATE_DECL:
1014 case TEMPLATE_TYPE_PARM:
1015 case TEMPLATE_PARM_INDEX:
1016 case TEMPLATE_TEMPLATE_PARM:
1017 case STMT_EXPR:
1018 pp_cxx_primary_expression (pp, t);
1019 break;
1021 case CALL_EXPR:
1022 case DYNAMIC_CAST_EXPR:
1023 case STATIC_CAST_EXPR:
1024 case REINTERPRET_CAST_EXPR:
1025 case CONST_CAST_EXPR:
1026 #if 0
1027 case MEMBER_REF:
1028 #endif
1029 case EMPTY_CLASS_EXPR:
1030 case TYPEID_EXPR:
1031 case PSEUDO_DTOR_EXPR:
1032 case AGGR_INIT_EXPR:
1033 case ARROW_EXPR:
1034 pp_cxx_postfix_expression (pp, t);
1035 break;
1037 case NEW_EXPR:
1038 case VEC_NEW_EXPR:
1039 pp_cxx_new_expression (pp, t);
1040 break;
1042 case DELETE_EXPR:
1043 case VEC_DELETE_EXPR:
1044 pp_cxx_delete_expression (pp, t);
1045 break;
1047 case SIZEOF_EXPR:
1048 case ALIGNOF_EXPR:
1049 pp_cxx_unary_expression (pp, t);
1050 break;
1052 case CAST_EXPR:
1053 pp_cxx_cast_expression (pp, t);
1054 break;
1056 case OFFSET_REF:
1057 case MEMBER_REF:
1058 case DOTSTAR_EXPR:
1059 pp_cxx_pm_expression (pp, t);
1060 break;
1062 case MULT_EXPR:
1063 case TRUNC_DIV_EXPR:
1064 case TRUNC_MOD_EXPR:
1065 pp_cxx_multiplicative_expression (pp, t);
1066 break;
1068 case COND_EXPR:
1069 pp_cxx_conditional_expression (pp, t);
1070 break;
1072 case MODIFY_EXPR:
1073 case INIT_EXPR:
1074 case THROW_EXPR:
1075 case MODOP_EXPR:
1076 pp_cxx_assignment_expression (pp, t);
1077 break;
1079 case NON_DEPENDENT_EXPR:
1080 case MUST_NOT_THROW_EXPR:
1081 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
1082 break;
1084 case EXPR_PACK_EXPANSION:
1085 pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t));
1086 pp_cxx_ws_string (pp, "...");
1087 break;
1089 case NONTYPE_ARGUMENT_PACK:
1091 tree args = ARGUMENT_PACK_ARGS (t);
1092 int i, len = TREE_VEC_LENGTH (args);
1093 for (i = 0; i < len; ++i)
1095 if (i > 0)
1096 pp_cxx_separate_with (pp, ',');
1097 pp_cxx_expression (pp, TREE_VEC_ELT (args, i));
1100 break;
1102 default:
1103 pp_c_expression (pp_c_base (pp), t);
1104 break;
1109 /* Declarations. */
1111 /* function-specifier:
1112 inline
1113 virtual
1114 explicit */
1116 static void
1117 pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
1119 switch (TREE_CODE (t))
1121 case FUNCTION_DECL:
1122 if (DECL_VIRTUAL_P (t))
1123 pp_cxx_ws_string (pp, "virtual");
1124 else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1125 pp_cxx_ws_string (pp, "explicit");
1126 else
1127 pp_c_function_specifier (pp_c_base (pp), t);
1129 default:
1130 break;
1134 /* decl-specifier-seq:
1135 decl-specifier-seq(opt) decl-specifier
1137 decl-specifier:
1138 storage-class-specifier
1139 type-specifier
1140 function-specifier
1141 friend
1142 typedef */
1144 static void
1145 pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
1147 switch (TREE_CODE (t))
1149 case VAR_DECL:
1150 case PARM_DECL:
1151 case CONST_DECL:
1152 case FIELD_DECL:
1153 pp_cxx_storage_class_specifier (pp, t);
1154 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1155 break;
1157 case TYPE_DECL:
1158 pp_cxx_ws_string (pp, "typedef");
1159 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1160 break;
1162 case RECORD_TYPE:
1163 if (TYPE_PTRMEMFUNC_P (t))
1165 tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1166 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1167 pp_cxx_whitespace (pp);
1168 pp_cxx_ptr_operator (pp, t);
1170 break;
1172 case FUNCTION_DECL:
1173 /* Constructors don't have return types. And conversion functions
1174 do not have a type-specifier in their return types. */
1175 if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1176 pp_cxx_function_specifier (pp, t);
1177 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1178 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1179 else
1180 default:
1181 pp_c_declaration_specifiers (pp_c_base (pp), t);
1182 break;
1186 /* simple-type-specifier:
1187 ::(opt) nested-name-specifier(opt) type-name
1188 ::(opt) nested-name-specifier(opt) template(opt) template-id
1189 char
1190 wchar_t
1191 bool
1192 short
1194 long
1195 signed
1196 unsigned
1197 float
1198 double
1199 void */
1201 static void
1202 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1204 switch (TREE_CODE (t))
1206 case RECORD_TYPE:
1207 case UNION_TYPE:
1208 case ENUMERAL_TYPE:
1209 pp_cxx_qualified_id (pp, t);
1210 break;
1212 case TEMPLATE_TYPE_PARM:
1213 case TEMPLATE_TEMPLATE_PARM:
1214 case TEMPLATE_PARM_INDEX:
1215 pp_cxx_unqualified_id (pp, t);
1216 break;
1218 case TYPENAME_TYPE:
1219 pp_cxx_ws_string (pp, "typename");
1220 pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1221 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1222 break;
1224 default:
1225 pp_c_type_specifier (pp_c_base (pp), t);
1226 break;
1230 /* type-specifier-seq:
1231 type-specifier type-specifier-seq(opt)
1233 type-specifier:
1234 simple-type-specifier
1235 class-specifier
1236 enum-specifier
1237 elaborated-type-specifier
1238 cv-qualifier */
1240 static void
1241 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1243 switch (TREE_CODE (t))
1245 case TEMPLATE_DECL:
1246 case TEMPLATE_TYPE_PARM:
1247 case TEMPLATE_TEMPLATE_PARM:
1248 case TYPE_DECL:
1249 case BOUND_TEMPLATE_TEMPLATE_PARM:
1250 pp_cxx_cv_qualifier_seq (pp, t);
1251 pp_cxx_simple_type_specifier (pp, t);
1252 break;
1254 case METHOD_TYPE:
1255 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1256 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1257 pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1258 break;
1260 case DECLTYPE_TYPE:
1261 pp_cxx_ws_string (pp, "decltype");
1262 pp_cxx_left_paren (pp);
1263 pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1264 pp_cxx_right_paren (pp);
1265 break;
1267 default:
1268 if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1269 pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1273 /* ptr-operator:
1274 * cv-qualifier-seq(opt)
1276 ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1278 static void
1279 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1281 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1282 t = TREE_TYPE (t);
1283 switch (TREE_CODE (t))
1285 case REFERENCE_TYPE:
1286 case POINTER_TYPE:
1287 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
1288 || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
1289 pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1290 if (TREE_CODE (t) == POINTER_TYPE)
1292 pp_star (pp);
1293 pp_cxx_cv_qualifier_seq (pp, t);
1295 else
1296 pp_ampersand (pp);
1297 break;
1299 case RECORD_TYPE:
1300 if (TYPE_PTRMEMFUNC_P (t))
1302 pp_cxx_left_paren (pp);
1303 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1304 pp_star (pp);
1305 break;
1307 case OFFSET_TYPE:
1308 if (TYPE_PTR_TO_MEMBER_P (t))
1310 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1311 pp_cxx_left_paren (pp);
1312 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1313 pp_star (pp);
1314 pp_cxx_cv_qualifier_seq (pp, t);
1315 break;
1317 /* else fall through. */
1319 default:
1320 pp_unsupported_tree (pp, t);
1321 break;
1325 static inline tree
1326 pp_cxx_implicit_parameter_type (tree mf)
1328 return TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (mf))));
1332 parameter-declaration:
1333 decl-specifier-seq declarator
1334 decl-specifier-seq declarator = assignment-expression
1335 decl-specifier-seq abstract-declarator(opt)
1336 decl-specifier-seq abstract-declarator(opt) assignment-expression */
1338 static inline void
1339 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1341 pp_cxx_decl_specifier_seq (pp, t);
1342 if (TYPE_P (t))
1343 pp_cxx_abstract_declarator (pp, t);
1344 else
1345 pp_cxx_declarator (pp, t);
1348 /* parameter-declaration-clause:
1349 parameter-declaration-list(opt) ...(opt)
1350 parameter-declaration-list , ...
1352 parameter-declaration-list:
1353 parameter-declaration
1354 parameter-declaration-list , parameter-declaration */
1356 static void
1357 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1359 tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1360 tree types =
1361 TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1362 const bool abstract = args == NULL
1363 || pp_c_base (pp)->flags & pp_c_flag_abstract;
1364 bool first = true;
1366 /* Skip artificial parameter for nonstatic member functions. */
1367 if (TREE_CODE (t) == METHOD_TYPE)
1368 types = TREE_CHAIN (types);
1370 pp_cxx_left_paren (pp);
1371 for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1373 if (!first)
1374 pp_cxx_separate_with (pp, ',');
1375 first = false;
1376 pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1377 if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1379 pp_cxx_whitespace (pp);
1380 pp_equal (pp);
1381 pp_cxx_whitespace (pp);
1382 pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1385 pp_cxx_right_paren (pp);
1388 /* exception-specification:
1389 throw ( type-id-list(opt) )
1391 type-id-list
1392 type-id
1393 type-id-list , type-id */
1395 static void
1396 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1398 tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1399 bool need_comma = false;
1401 if (!TYPE_NOTHROW_P (t) && ex_spec == NULL)
1402 return;
1403 pp_cxx_ws_string (pp, "throw");
1404 pp_cxx_left_paren (pp);
1405 for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1407 tree type = TREE_VALUE (ex_spec);
1408 tree argpack = NULL_TREE;
1409 int i, len = 1;
1411 if (ARGUMENT_PACK_P (type))
1413 argpack = ARGUMENT_PACK_ARGS (type);
1414 len = TREE_VEC_LENGTH (argpack);
1417 for (i = 0; i < len; ++i)
1419 if (argpack)
1420 type = TREE_VEC_ELT (argpack, i);
1422 if (need_comma)
1423 pp_cxx_separate_with (pp, ',');
1424 else
1425 need_comma = true;
1427 pp_cxx_type_id (pp, type);
1430 pp_cxx_right_paren (pp);
1433 /* direct-declarator:
1434 declarator-id
1435 direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1436 exception-specification(opt)
1437 direct-declaration [ constant-expression(opt) ]
1438 ( declarator ) */
1440 static void
1441 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1443 switch (TREE_CODE (t))
1445 case VAR_DECL:
1446 case PARM_DECL:
1447 case CONST_DECL:
1448 case FIELD_DECL:
1449 if (DECL_NAME (t))
1451 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1453 if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1454 || template_parameter_pack_p (t))
1455 /* A function parameter pack or non-type template
1456 parameter pack. */
1457 pp_cxx_ws_string (pp, "...");
1459 pp_cxx_id_expression (pp, DECL_NAME (t));
1461 pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1462 break;
1464 case FUNCTION_DECL:
1465 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1466 pp_cxx_id_expression (pp, t);
1467 pp_cxx_parameter_declaration_clause (pp, t);
1469 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1471 pp_base (pp)->padding = pp_before;
1472 pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1475 pp_cxx_exception_specification (pp, TREE_TYPE (t));
1476 break;
1478 case TYPENAME_TYPE:
1479 case TEMPLATE_DECL:
1480 case TEMPLATE_TYPE_PARM:
1481 case TEMPLATE_PARM_INDEX:
1482 case TEMPLATE_TEMPLATE_PARM:
1483 break;
1485 default:
1486 pp_c_direct_declarator (pp_c_base (pp), t);
1487 break;
1491 /* declarator:
1492 direct-declarator
1493 ptr-operator declarator */
1495 static void
1496 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1498 pp_cxx_direct_declarator (pp, t);
1501 /* ctor-initializer:
1502 : mem-initializer-list
1504 mem-initializer-list:
1505 mem-initializer
1506 mem-initializer , mem-initializer-list
1508 mem-initializer:
1509 mem-initializer-id ( expression-list(opt) )
1511 mem-initializer-id:
1512 ::(opt) nested-name-specifier(opt) class-name
1513 identifier */
1515 static void
1516 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1518 t = TREE_OPERAND (t, 0);
1519 pp_cxx_whitespace (pp);
1520 pp_colon (pp);
1521 pp_cxx_whitespace (pp);
1522 for (; t; t = TREE_CHAIN (t))
1524 tree purpose = TREE_PURPOSE (t);
1525 bool is_pack = PACK_EXPANSION_P (purpose);
1527 if (is_pack)
1528 pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1529 else
1530 pp_cxx_primary_expression (pp, purpose);
1531 pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1532 if (is_pack)
1533 pp_cxx_ws_string (pp, "...");
1534 if (TREE_CHAIN (t))
1535 pp_cxx_separate_with (pp, ',');
1539 /* function-definition:
1540 decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1541 decl-specifier-seq(opt) declarator function-try-block */
1543 static void
1544 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1546 tree saved_scope = pp->enclosing_scope;
1547 pp_cxx_decl_specifier_seq (pp, t);
1548 pp_cxx_declarator (pp, t);
1549 pp_needs_newline (pp) = true;
1550 pp->enclosing_scope = DECL_CONTEXT (t);
1551 if (DECL_SAVED_TREE (t))
1552 pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1553 else
1555 pp_cxx_semicolon (pp);
1556 pp_needs_newline (pp) = true;
1558 pp_flush (pp);
1559 pp->enclosing_scope = saved_scope;
1562 /* abstract-declarator:
1563 ptr-operator abstract-declarator(opt)
1564 direct-abstract-declarator */
1566 static void
1567 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1569 if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t))
1570 pp_cxx_right_paren (pp);
1571 else if (POINTER_TYPE_P (t))
1573 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1574 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1575 pp_cxx_right_paren (pp);
1576 t = TREE_TYPE (t);
1578 pp_cxx_direct_abstract_declarator (pp, t);
1581 /* direct-abstract-declarator:
1582 direct-abstract-declarator(opt) ( parameter-declaration-clause )
1583 cv-qualifier-seq(opt) exception-specification(opt)
1584 direct-abstract-declarator(opt) [ constant-expression(opt) ]
1585 ( abstract-declarator ) */
1587 static void
1588 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1590 switch (TREE_CODE (t))
1592 case REFERENCE_TYPE:
1593 pp_cxx_abstract_declarator (pp, t);
1594 break;
1596 case RECORD_TYPE:
1597 if (TYPE_PTRMEMFUNC_P (t))
1598 pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1599 break;
1601 case METHOD_TYPE:
1602 case FUNCTION_TYPE:
1603 pp_cxx_parameter_declaration_clause (pp, t);
1604 pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1605 if (TREE_CODE (t) == METHOD_TYPE)
1607 pp_base (pp)->padding = pp_before;
1608 pp_cxx_cv_qualifier_seq
1609 (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
1611 pp_cxx_exception_specification (pp, t);
1612 break;
1614 case TYPENAME_TYPE:
1615 case TEMPLATE_TYPE_PARM:
1616 case TEMPLATE_TEMPLATE_PARM:
1617 case BOUND_TEMPLATE_TEMPLATE_PARM:
1618 case UNBOUND_CLASS_TEMPLATE:
1619 break;
1621 default:
1622 pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1623 break;
1627 /* type-id:
1628 type-specifier-seq abstract-declarator(opt) */
1630 static void
1631 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1633 pp_flags saved_flags = pp_c_base (pp)->flags;
1634 pp_c_base (pp)->flags |= pp_c_flag_abstract;
1636 switch (TREE_CODE (t))
1638 case TYPE_DECL:
1639 case UNION_TYPE:
1640 case RECORD_TYPE:
1641 case ENUMERAL_TYPE:
1642 case TYPENAME_TYPE:
1643 case BOUND_TEMPLATE_TEMPLATE_PARM:
1644 case UNBOUND_CLASS_TEMPLATE:
1645 case TEMPLATE_TEMPLATE_PARM:
1646 case TEMPLATE_TYPE_PARM:
1647 case TEMPLATE_PARM_INDEX:
1648 case TEMPLATE_DECL:
1649 case TYPEOF_TYPE:
1650 case DECLTYPE_TYPE:
1651 case TEMPLATE_ID_EXPR:
1652 pp_cxx_type_specifier_seq (pp, t);
1653 break;
1655 case TYPE_PACK_EXPANSION:
1656 pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1657 pp_cxx_ws_string (pp, "...");
1658 break;
1660 default:
1661 pp_c_type_id (pp_c_base (pp), t);
1662 break;
1665 pp_c_base (pp)->flags = saved_flags;
1668 /* template-argument-list:
1669 template-argument ...(opt)
1670 template-argument-list, template-argument ...(opt)
1672 template-argument:
1673 assignment-expression
1674 type-id
1675 template-name */
1677 static void
1678 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1680 int i;
1681 bool need_comma = false;
1683 if (t == NULL)
1684 return;
1685 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1687 tree arg = TREE_VEC_ELT (t, i);
1688 tree argpack = NULL_TREE;
1689 int idx, len = 1;
1691 if (ARGUMENT_PACK_P (arg))
1693 argpack = ARGUMENT_PACK_ARGS (arg);
1694 len = TREE_VEC_LENGTH (argpack);
1697 for (idx = 0; idx < len; idx++)
1699 if (argpack)
1700 arg = TREE_VEC_ELT (argpack, idx);
1702 if (need_comma)
1703 pp_cxx_separate_with (pp, ',');
1704 else
1705 need_comma = true;
1707 if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1708 && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1709 pp_cxx_type_id (pp, arg);
1710 else
1711 pp_cxx_expression (pp, arg);
1717 static void
1718 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1720 t = DECL_EXPR_DECL (t);
1721 pp_cxx_type_specifier_seq (pp, t);
1722 if (TYPE_P (t))
1723 pp_cxx_abstract_declarator (pp, t);
1724 else
1725 pp_cxx_declarator (pp, t);
1728 /* Statements. */
1730 static void
1731 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1733 switch (TREE_CODE (t))
1735 case CTOR_INITIALIZER:
1736 pp_cxx_ctor_initializer (pp, t);
1737 break;
1739 case USING_STMT:
1740 pp_cxx_ws_string (pp, "using");
1741 pp_cxx_ws_string (pp, "namespace");
1742 if (DECL_CONTEXT (t))
1743 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1744 pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1745 break;
1747 case USING_DECL:
1748 pp_cxx_ws_string (pp, "using");
1749 pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1750 pp_cxx_unqualified_id (pp, DECL_NAME (t));
1751 break;
1753 case EH_SPEC_BLOCK:
1754 break;
1756 /* try-block:
1757 try compound-statement handler-seq */
1758 case TRY_BLOCK:
1759 pp_maybe_newline_and_indent (pp, 0);
1760 pp_cxx_ws_string (pp, "try");
1761 pp_newline_and_indent (pp, 3);
1762 pp_cxx_statement (pp, TRY_STMTS (t));
1763 pp_newline_and_indent (pp, -3);
1764 if (CLEANUP_P (t))
1766 else
1767 pp_cxx_statement (pp, TRY_HANDLERS (t));
1768 break;
1771 handler-seq:
1772 handler handler-seq(opt)
1774 handler:
1775 catch ( exception-declaration ) compound-statement
1777 exception-declaration:
1778 type-specifier-seq declarator
1779 type-specifier-seq abstract-declarator
1780 ... */
1781 case HANDLER:
1782 pp_cxx_ws_string (pp, "catch");
1783 pp_cxx_left_paren (pp);
1784 pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1785 pp_cxx_right_paren (pp);
1786 pp_indentation (pp) += 3;
1787 pp_needs_newline (pp) = true;
1788 pp_cxx_statement (pp, HANDLER_BODY (t));
1789 pp_indentation (pp) -= 3;
1790 pp_needs_newline (pp) = true;
1791 break;
1793 /* selection-statement:
1794 if ( expression ) statement
1795 if ( expression ) statement else statement */
1796 case IF_STMT:
1797 pp_cxx_ws_string (pp, "if");
1798 pp_cxx_whitespace (pp);
1799 pp_cxx_left_paren (pp);
1800 pp_cxx_expression (pp, IF_COND (t));
1801 pp_cxx_right_paren (pp);
1802 pp_newline_and_indent (pp, 2);
1803 pp_cxx_statement (pp, THEN_CLAUSE (t));
1804 pp_newline_and_indent (pp, -2);
1805 if (ELSE_CLAUSE (t))
1807 tree else_clause = ELSE_CLAUSE (t);
1808 pp_cxx_ws_string (pp, "else");
1809 if (TREE_CODE (else_clause) == IF_STMT)
1810 pp_cxx_whitespace (pp);
1811 else
1812 pp_newline_and_indent (pp, 2);
1813 pp_cxx_statement (pp, else_clause);
1814 if (TREE_CODE (else_clause) != IF_STMT)
1815 pp_newline_and_indent (pp, -2);
1817 break;
1819 case SWITCH_STMT:
1820 pp_cxx_ws_string (pp, "switch");
1821 pp_space (pp);
1822 pp_cxx_left_paren (pp);
1823 pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1824 pp_cxx_right_paren (pp);
1825 pp_indentation (pp) += 3;
1826 pp_needs_newline (pp) = true;
1827 pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1828 pp_newline_and_indent (pp, -3);
1829 break;
1831 /* iteration-statement:
1832 while ( expression ) statement
1833 do statement while ( expression ) ;
1834 for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1835 for ( declaration expression(opt) ; expression(opt) ) statement */
1836 case WHILE_STMT:
1837 pp_cxx_ws_string (pp, "while");
1838 pp_space (pp);
1839 pp_cxx_left_paren (pp);
1840 pp_cxx_expression (pp, WHILE_COND (t));
1841 pp_cxx_right_paren (pp);
1842 pp_newline_and_indent (pp, 3);
1843 pp_cxx_statement (pp, WHILE_BODY (t));
1844 pp_indentation (pp) -= 3;
1845 pp_needs_newline (pp) = true;
1846 break;
1848 case DO_STMT:
1849 pp_cxx_ws_string (pp, "do");
1850 pp_newline_and_indent (pp, 3);
1851 pp_cxx_statement (pp, DO_BODY (t));
1852 pp_newline_and_indent (pp, -3);
1853 pp_cxx_ws_string (pp, "while");
1854 pp_space (pp);
1855 pp_cxx_left_paren (pp);
1856 pp_cxx_expression (pp, DO_COND (t));
1857 pp_cxx_right_paren (pp);
1858 pp_cxx_semicolon (pp);
1859 pp_needs_newline (pp) = true;
1860 break;
1862 case FOR_STMT:
1863 pp_cxx_ws_string (pp, "for");
1864 pp_space (pp);
1865 pp_cxx_left_paren (pp);
1866 if (FOR_INIT_STMT (t))
1867 pp_cxx_statement (pp, FOR_INIT_STMT (t));
1868 else
1869 pp_cxx_semicolon (pp);
1870 pp_needs_newline (pp) = false;
1871 pp_cxx_whitespace (pp);
1872 if (FOR_COND (t))
1873 pp_cxx_expression (pp, FOR_COND (t));
1874 pp_cxx_semicolon (pp);
1875 pp_needs_newline (pp) = false;
1876 pp_cxx_whitespace (pp);
1877 if (FOR_EXPR (t))
1878 pp_cxx_expression (pp, FOR_EXPR (t));
1879 pp_cxx_right_paren (pp);
1880 pp_newline_and_indent (pp, 3);
1881 pp_cxx_statement (pp, FOR_BODY (t));
1882 pp_indentation (pp) -= 3;
1883 pp_needs_newline (pp) = true;
1884 break;
1886 /* jump-statement:
1887 goto identifier;
1888 continue ;
1889 return expression(opt) ; */
1890 case BREAK_STMT:
1891 case CONTINUE_STMT:
1892 pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1893 pp_cxx_semicolon (pp);
1894 pp_needs_newline (pp) = true;
1895 break;
1897 /* expression-statement:
1898 expression(opt) ; */
1899 case EXPR_STMT:
1900 pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1901 pp_cxx_semicolon (pp);
1902 pp_needs_newline (pp) = true;
1903 break;
1905 case CLEANUP_STMT:
1906 pp_cxx_ws_string (pp, "try");
1907 pp_newline_and_indent (pp, 2);
1908 pp_cxx_statement (pp, CLEANUP_BODY (t));
1909 pp_newline_and_indent (pp, -2);
1910 pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
1911 pp_newline_and_indent (pp, 2);
1912 pp_cxx_statement (pp, CLEANUP_EXPR (t));
1913 pp_newline_and_indent (pp, -2);
1914 break;
1916 case STATIC_ASSERT:
1917 pp_cxx_declaration (pp, t);
1918 break;
1920 default:
1921 pp_c_statement (pp_c_base (pp), t);
1922 break;
1926 /* original-namespace-definition:
1927 namespace identifier { namespace-body }
1929 As an edge case, we also handle unnamed namespace definition here. */
1931 static void
1932 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
1934 pp_cxx_ws_string (pp, "namespace");
1935 if (DECL_CONTEXT (t))
1936 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1937 if (DECL_NAME (t))
1938 pp_cxx_unqualified_id (pp, t);
1939 pp_cxx_whitespace (pp);
1940 pp_cxx_left_brace (pp);
1941 /* We do not print the namespace-body. */
1942 pp_cxx_whitespace (pp);
1943 pp_cxx_right_brace (pp);
1946 /* namespace-alias:
1947 identifier
1949 namespace-alias-definition:
1950 namespace identifier = qualified-namespace-specifier ;
1952 qualified-namespace-specifier:
1953 ::(opt) nested-name-specifier(opt) namespace-name */
1955 static void
1956 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
1958 pp_cxx_ws_string (pp, "namespace");
1959 if (DECL_CONTEXT (t))
1960 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1961 pp_cxx_unqualified_id (pp, t);
1962 pp_cxx_whitespace (pp);
1963 pp_equal (pp);
1964 pp_cxx_whitespace (pp);
1965 if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
1966 pp_cxx_nested_name_specifier (pp,
1967 DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
1968 pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
1969 pp_cxx_semicolon (pp);
1972 /* simple-declaration:
1973 decl-specifier-seq(opt) init-declarator-list(opt) */
1975 static void
1976 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
1978 pp_cxx_decl_specifier_seq (pp, t);
1979 pp_cxx_init_declarator (pp, t);
1980 pp_cxx_semicolon (pp);
1981 pp_needs_newline (pp) = true;
1985 template-parameter-list:
1986 template-parameter
1987 template-parameter-list , template-parameter */
1989 static inline void
1990 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
1992 const int n = TREE_VEC_LENGTH (t);
1993 int i;
1994 for (i = 0; i < n; ++i)
1996 if (i)
1997 pp_cxx_separate_with (pp, ',');
1998 pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2002 /* template-parameter:
2003 type-parameter
2004 parameter-declaration
2006 type-parameter:
2007 class ...(opt) identifier(opt)
2008 class identifier(opt) = type-id
2009 typename identifier(opt)
2010 typename ...(opt) identifier(opt) = type-id
2011 template < template-parameter-list > class ...(opt) identifier(opt)
2012 template < template-parameter-list > class identifier(opt) = template-name */
2014 static void
2015 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2017 tree parameter = TREE_VALUE (t);
2018 switch (TREE_CODE (parameter))
2020 case TYPE_DECL:
2021 pp_cxx_ws_string (pp, "class");
2022 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2023 pp_cxx_ws_string (pp, "...");
2024 if (DECL_NAME (parameter))
2025 pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2026 /* FIXME: Check if we should print also default argument. */
2027 break;
2029 case PARM_DECL:
2030 pp_cxx_parameter_declaration (pp, parameter);
2031 break;
2033 case TEMPLATE_DECL:
2034 break;
2036 default:
2037 pp_unsupported_tree (pp, t);
2038 break;
2042 /* Pretty-print a template parameter in the canonical form
2043 "template-parameter-<level>-<position in parameter list>". */
2045 void
2046 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2048 const enum tree_code code = TREE_CODE (parm);
2050 /* Brings type template parameters to the canonical forms. */
2051 if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2052 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2053 parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2055 pp_cxx_begin_template_argument_list (pp);
2056 pp_cxx_ws_string (pp, M_("template-parameter-"));
2057 pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2058 pp_minus (pp);
2059 pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2060 pp_cxx_end_template_argument_list (pp);
2064 template-declaration:
2065 export(opt) template < template-parameter-list > declaration */
2067 static void
2068 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2070 tree tmpl = most_general_template (t);
2071 tree level;
2072 int i = 0;
2074 pp_maybe_newline_and_indent (pp, 0);
2075 for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2077 pp_cxx_ws_string (pp, "template");
2078 pp_cxx_begin_template_argument_list (pp);
2079 pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2080 pp_cxx_end_template_argument_list (pp);
2081 pp_newline_and_indent (pp, 3);
2082 i += 3;
2084 if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2085 pp_cxx_function_definition (pp, t);
2086 else
2087 pp_cxx_simple_declaration (pp, t);
2090 static void
2091 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2093 pp_unsupported_tree (pp, t);
2096 static void
2097 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2099 pp_unsupported_tree (pp, t);
2103 declaration:
2104 block-declaration
2105 function-definition
2106 template-declaration
2107 explicit-instantiation
2108 explicit-specialization
2109 linkage-specification
2110 namespace-definition
2112 block-declaration:
2113 simple-declaration
2114 asm-definition
2115 namespace-alias-definition
2116 using-declaration
2117 using-directive
2118 static_assert-declaration */
2119 void
2120 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2122 if (TREE_CODE (t) == STATIC_ASSERT)
2124 pp_cxx_ws_string (pp, "static_assert");
2125 pp_cxx_left_paren (pp);
2126 pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2127 pp_cxx_separate_with (pp, ',');
2128 pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2129 pp_cxx_right_paren (pp);
2131 else if (!DECL_LANG_SPECIFIC (t))
2132 pp_cxx_simple_declaration (pp, t);
2133 else if (DECL_USE_TEMPLATE (t))
2134 switch (DECL_USE_TEMPLATE (t))
2136 case 1:
2137 pp_cxx_template_declaration (pp, t);
2138 break;
2140 case 2:
2141 pp_cxx_explicit_specialization (pp, t);
2142 break;
2144 case 3:
2145 pp_cxx_explicit_instantiation (pp, t);
2146 break;
2148 default:
2149 break;
2151 else switch (TREE_CODE (t))
2153 case VAR_DECL:
2154 case TYPE_DECL:
2155 pp_cxx_simple_declaration (pp, t);
2156 break;
2158 case FUNCTION_DECL:
2159 if (DECL_SAVED_TREE (t))
2160 pp_cxx_function_definition (pp, t);
2161 else
2162 pp_cxx_simple_declaration (pp, t);
2163 break;
2165 case NAMESPACE_DECL:
2166 if (DECL_NAMESPACE_ALIAS (t))
2167 pp_cxx_namespace_alias_definition (pp, t);
2168 else
2169 pp_cxx_original_namespace_definition (pp, t);
2170 break;
2172 default:
2173 pp_unsupported_tree (pp, t);
2174 break;
2178 static void
2179 pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2181 t = TREE_OPERAND (t, 0);
2182 pp_cxx_ws_string (pp, "typeid");
2183 pp_cxx_left_paren (pp);
2184 if (TYPE_P (t))
2185 pp_cxx_type_id (pp, t);
2186 else
2187 pp_cxx_expression (pp, t);
2188 pp_cxx_right_paren (pp);
2191 void
2192 pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2194 pp_cxx_ws_string (pp, "va_arg");
2195 pp_cxx_left_paren (pp);
2196 pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2197 pp_cxx_separate_with (pp, ',');
2198 pp_cxx_type_id (pp, TREE_TYPE (t));
2199 pp_cxx_right_paren (pp);
2202 static bool
2203 pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2205 switch (TREE_CODE (t))
2207 case ARROW_EXPR:
2208 if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2209 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2211 pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2212 pp_cxx_separate_with (pp, ',');
2213 return true;
2215 return false;
2216 case COMPONENT_REF:
2217 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2218 return false;
2219 if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2220 pp_cxx_dot (pp);
2221 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2222 return true;
2223 case ARRAY_REF:
2224 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2225 return false;
2226 pp_left_bracket (pp);
2227 pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2228 pp_right_bracket (pp);
2229 return true;
2230 default:
2231 return false;
2235 void
2236 pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2238 pp_cxx_ws_string (pp, "offsetof");
2239 pp_cxx_left_paren (pp);
2240 if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2241 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2242 pp_cxx_right_paren (pp);
2245 void
2246 pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2248 cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2250 switch (kind)
2252 case CPTK_HAS_NOTHROW_ASSIGN:
2253 pp_cxx_ws_string (pp, "__has_nothrow_assign");
2254 break;
2255 case CPTK_HAS_TRIVIAL_ASSIGN:
2256 pp_cxx_ws_string (pp, "__has_trivial_assign");
2257 break;
2258 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2259 pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2260 break;
2261 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2262 pp_cxx_ws_string (pp, "__has_trivial_constructor");
2263 break;
2264 case CPTK_HAS_NOTHROW_COPY:
2265 pp_cxx_ws_string (pp, "__has_nothrow_copy");
2266 break;
2267 case CPTK_HAS_TRIVIAL_COPY:
2268 pp_cxx_ws_string (pp, "__has_trivial_copy");
2269 break;
2270 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2271 pp_cxx_ws_string (pp, "__has_trivial_destructor");
2272 break;
2273 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2274 pp_cxx_ws_string (pp, "__has_virtual_destructor");
2275 break;
2276 case CPTK_IS_ABSTRACT:
2277 pp_cxx_ws_string (pp, "__is_abstract");
2278 break;
2279 case CPTK_IS_BASE_OF:
2280 pp_cxx_ws_string (pp, "__is_base_of");
2281 break;
2282 case CPTK_IS_CLASS:
2283 pp_cxx_ws_string (pp, "__is_class");
2284 break;
2285 case CPTK_IS_CONVERTIBLE_TO:
2286 pp_cxx_ws_string (pp, "__is_convertible_to");
2287 break;
2288 case CPTK_IS_EMPTY:
2289 pp_cxx_ws_string (pp, "__is_empty");
2290 break;
2291 case CPTK_IS_ENUM:
2292 pp_cxx_ws_string (pp, "__is_enum");
2293 break;
2294 case CPTK_IS_POD:
2295 pp_cxx_ws_string (pp, "__is_pod");
2296 break;
2297 case CPTK_IS_POLYMORPHIC:
2298 pp_cxx_ws_string (pp, "__is_polymorphic");
2299 break;
2300 case CPTK_IS_STD_LAYOUT:
2301 pp_cxx_ws_string (pp, "__is_std_layout");
2302 break;
2303 case CPTK_IS_TRIVIAL:
2304 pp_cxx_ws_string (pp, "__is_trivial");
2305 break;
2306 case CPTK_IS_UNION:
2307 pp_cxx_ws_string (pp, "__is_union");
2308 break;
2310 default:
2311 gcc_unreachable ();
2314 pp_cxx_left_paren (pp);
2315 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2317 if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2319 pp_cxx_separate_with (pp, ',');
2320 pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2323 pp_cxx_right_paren (pp);
2326 typedef c_pretty_print_fn pp_fun;
2328 /* Initialization of a C++ pretty-printer object. */
2330 void
2331 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2333 pp_c_pretty_printer_init (pp_c_base (pp));
2334 pp_set_line_maximum_length (pp, 0);
2336 pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2337 pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2338 pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2339 pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2340 pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2341 pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2342 pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2343 pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2344 pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2345 pp->c_base.direct_abstract_declarator =
2346 (pp_fun) pp_cxx_direct_abstract_declarator;
2347 pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2349 /* pp->c_base.statement = (pp_fun) pp_cxx_statement; */
2351 pp->c_base.constant = (pp_fun) pp_cxx_constant;
2352 pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2353 pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2354 pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2355 pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2356 pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2357 pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2358 pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2359 pp->c_base.expression = (pp_fun) pp_cxx_expression;
2360 pp->enclosing_scope = global_namespace;