xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/cp/cxx-pretty-print.c (revision fdd524d4ccd2bb0c6f67401e938dabf773eb0372)
1 /* Implementation of subroutines for the GNU C++ pretty-printer.
2    Copyright (C) 2003-2013 Free Software Foundation, Inc.
3    Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "intl.h"
26 #include "cp-tree.h"
27 #include "cxx-pretty-print.h"
28 #include "tree-pretty-print.h"
29 
30 /* Translate if being used for diagnostics, but not for dump files or
31    __PRETTY_FUNCTION.  */
32 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
33 
34 static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
35 static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
36 static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
37 static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
38 static void pp_cxx_expression (cxx_pretty_printer *, tree);
39 static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
40 static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
41 static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
42 static void pp_cxx_type_id (cxx_pretty_printer *, tree);
43 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
44 static void pp_cxx_declarator (cxx_pretty_printer *, tree);
45 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
46 static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
47 static void pp_cxx_statement (cxx_pretty_printer *, tree);
48 static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
49 static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
50 static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
51 
52 
53 static inline void
54 pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
55 {
56   const char *p = pp_last_position_in_text (pp);
57 
58   if (p != NULL && *p == c)
59     pp_cxx_whitespace (pp);
60   pp_character (pp, c);
61   pp_base (pp)->padding = pp_none;
62 }
63 
64 #define pp_cxx_storage_class_specifier(PP, T) \
65    pp_c_storage_class_specifier (pp_c_base (PP), T)
66 #define pp_cxx_expression_list(PP, T)    \
67    pp_c_expression_list (pp_c_base (PP), T)
68 #define pp_cxx_space_for_pointer_operator(PP, T)  \
69    pp_c_space_for_pointer_operator (pp_c_base (PP), T)
70 #define pp_cxx_init_declarator(PP, T)    \
71    pp_c_init_declarator (pp_c_base (PP), T)
72 #define pp_cxx_call_argument_list(PP, T) \
73    pp_c_call_argument_list (pp_c_base (PP), T)
74 
75 void
76 pp_cxx_colon_colon (cxx_pretty_printer *pp)
77 {
78   pp_colon_colon (pp);
79   pp_base (pp)->padding = pp_none;
80 }
81 
82 void
83 pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
84 {
85   pp_cxx_nonconsecutive_character (pp, '<');
86 }
87 
88 void
89 pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
90 {
91   pp_cxx_nonconsecutive_character (pp, '>');
92 }
93 
94 void
95 pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
96 {
97   pp_separate_with (pp, c);
98   pp_base (pp)->padding = pp_none;
99 }
100 
101 /* Expressions.  */
102 
103 static inline bool
104 is_destructor_name (tree name)
105 {
106   return name == complete_dtor_identifier
107     || name == base_dtor_identifier
108     || name == deleting_dtor_identifier;
109 }
110 
111 /* conversion-function-id:
112       operator conversion-type-id
113 
114    conversion-type-id:
115       type-specifier-seq conversion-declarator(opt)
116 
117    conversion-declarator:
118       ptr-operator conversion-declarator(opt)  */
119 
120 static inline void
121 pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
122 {
123   pp_cxx_ws_string (pp, "operator");
124   pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
125 }
126 
127 static inline void
128 pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
129 {
130   pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
131   pp_cxx_begin_template_argument_list (pp);
132   pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
133   pp_cxx_end_template_argument_list (pp);
134 }
135 
136 /* Prints the unqualified part of the id-expression T.
137 
138    unqualified-id:
139      identifier
140      operator-function-id
141      conversion-function-id
142      ~ class-name
143      template-id  */
144 
145 static void
146 pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
147 {
148   enum tree_code code = TREE_CODE (t);
149   switch (code)
150     {
151     case RESULT_DECL:
152       pp_cxx_ws_string (pp, M_("<return-value>"));
153       break;
154 
155     case OVERLOAD:
156       t = OVL_CURRENT (t);
157     case VAR_DECL:
158     case PARM_DECL:
159     case CONST_DECL:
160     case TYPE_DECL:
161     case FUNCTION_DECL:
162     case NAMESPACE_DECL:
163     case FIELD_DECL:
164     case LABEL_DECL:
165     case USING_DECL:
166     case TEMPLATE_DECL:
167       t = DECL_NAME (t);
168 
169     case IDENTIFIER_NODE:
170       if (t == NULL)
171 	pp_cxx_ws_string (pp, M_("<unnamed>"));
172       else if (IDENTIFIER_TYPENAME_P (t))
173 	pp_cxx_conversion_function_id (pp, t);
174       else
175 	{
176 	  if (is_destructor_name (t))
177 	    {
178 	      pp_complement (pp);
179 	      /* FIXME: Why is this necessary? */
180 	      if (TREE_TYPE (t))
181 		t = constructor_name (TREE_TYPE (t));
182 	    }
183 	  pp_cxx_tree_identifier (pp, t);
184 	}
185       break;
186 
187     case TEMPLATE_ID_EXPR:
188       pp_cxx_template_id (pp, t);
189       break;
190 
191     case BASELINK:
192       pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
193       break;
194 
195     case RECORD_TYPE:
196     case UNION_TYPE:
197     case ENUMERAL_TYPE:
198     case TYPENAME_TYPE:
199     case UNBOUND_CLASS_TEMPLATE:
200       pp_cxx_unqualified_id (pp, TYPE_NAME (t));
201       if (CLASS_TYPE_P (t) && CLASSTYPE_USE_TEMPLATE (t))
202 	{
203 	  pp_cxx_begin_template_argument_list (pp);
204 	  pp_cxx_template_argument_list (pp, INNERMOST_TEMPLATE_ARGS
205                                                  (CLASSTYPE_TI_ARGS (t)));
206 	  pp_cxx_end_template_argument_list (pp);
207 	}
208       break;
209 
210     case BIT_NOT_EXPR:
211       pp_cxx_complement (pp);
212       pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
213       break;
214 
215     case TEMPLATE_TYPE_PARM:
216     case TEMPLATE_TEMPLATE_PARM:
217       if (TYPE_IDENTIFIER (t))
218 	pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
219       else
220 	pp_cxx_canonical_template_parameter (pp, t);
221       break;
222 
223     case TEMPLATE_PARM_INDEX:
224       pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
225       break;
226 
227     case BOUND_TEMPLATE_TEMPLATE_PARM:
228       pp_cxx_cv_qualifier_seq (pp, t);
229       pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
230       pp_cxx_begin_template_argument_list (pp);
231       pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
232       pp_cxx_end_template_argument_list (pp);
233       break;
234 
235     default:
236       pp_unsupported_tree (pp, t);
237       break;
238     }
239 }
240 
241 /* Pretty-print out the token sequence ":: template" in template codes
242    where it is needed to "inline declare" the (following) member as
243    a template.  This situation arises when SCOPE of T is dependent
244    on template parameters.  */
245 
246 static inline void
247 pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
248 {
249   if (TREE_CODE (t) == TEMPLATE_ID_EXPR
250       && TYPE_P (scope) && dependent_type_p (scope))
251     pp_cxx_ws_string (pp, "template");
252 }
253 
254 /* nested-name-specifier:
255       class-or-namespace-name :: nested-name-specifier(opt)
256       class-or-namespace-name :: template nested-name-specifier   */
257 
258 static void
259 pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
260 {
261   if (!SCOPE_FILE_SCOPE_P (t) && t != pp->enclosing_scope)
262     {
263       tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
264       pp_cxx_nested_name_specifier (pp, scope);
265       pp_cxx_template_keyword_if_needed (pp, scope, t);
266       pp_cxx_unqualified_id (pp, t);
267       pp_cxx_colon_colon (pp);
268     }
269 }
270 
271 /* qualified-id:
272       nested-name-specifier template(opt) unqualified-id  */
273 
274 static void
275 pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
276 {
277   switch (TREE_CODE (t))
278     {
279       /* A pointer-to-member is always qualified.  */
280     case PTRMEM_CST:
281       pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
282       pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
283       break;
284 
285       /* In Standard C++, functions cannot possibly be used as
286 	 nested-name-specifiers.  However, there are situations where
287 	 is "makes sense" to output the surrounding function name for the
288 	 purpose of emphasizing on the scope kind.  Just printing the
289 	 function name might not be sufficient as it may be overloaded; so,
290 	 we decorate the function with its signature too.
291 	 FIXME:  This is probably the wrong pretty-printing for conversion
292 	 functions and some function templates.  */
293     case OVERLOAD:
294       t = OVL_CURRENT (t);
295     case FUNCTION_DECL:
296       if (DECL_FUNCTION_MEMBER_P (t))
297 	pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
298       pp_cxx_unqualified_id
299 	(pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
300       pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
301       break;
302 
303     case OFFSET_REF:
304     case SCOPE_REF:
305       pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
306       pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
307       break;
308 
309     default:
310       {
311 	tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
312 	if (scope != pp->enclosing_scope)
313 	  {
314 	    pp_cxx_nested_name_specifier (pp, scope);
315 	    pp_cxx_template_keyword_if_needed (pp, scope, t);
316 	  }
317 	pp_cxx_unqualified_id (pp, t);
318       }
319       break;
320     }
321 }
322 
323 
324 static void
325 pp_cxx_constant (cxx_pretty_printer *pp, tree t)
326 {
327   switch (TREE_CODE (t))
328     {
329     case STRING_CST:
330       {
331 	const bool in_parens = PAREN_STRING_LITERAL_P (t);
332 	if (in_parens)
333 	  pp_cxx_left_paren (pp);
334 	pp_c_constant (pp_c_base (pp), t);
335 	if (in_parens)
336 	  pp_cxx_right_paren (pp);
337       }
338       break;
339 
340     case INTEGER_CST:
341       if (NULLPTR_TYPE_P (TREE_TYPE (t)))
342 	{
343 	  pp_string (pp, "nullptr");
344 	  break;
345 	}
346       /* else fall through.  */
347 
348     default:
349       pp_c_constant (pp_c_base (pp), t);
350       break;
351     }
352 }
353 
354 /* id-expression:
355       unqualified-id
356       qualified-id   */
357 
358 static inline void
359 pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
360 {
361   if (TREE_CODE (t) == OVERLOAD)
362     t = OVL_CURRENT (t);
363   if (DECL_P (t) && DECL_CONTEXT (t))
364     pp_cxx_qualified_id (pp, t);
365   else
366     pp_cxx_unqualified_id (pp, t);
367 }
368 
369 /* user-defined literal:
370       literal ud-suffix  */
371 
372 void
373 pp_cxx_userdef_literal (cxx_pretty_printer *pp, tree t)
374 {
375   pp_cxx_constant (pp, USERDEF_LITERAL_VALUE (t));
376   pp_cxx_id_expression (pp, USERDEF_LITERAL_SUFFIX_ID (t));
377 }
378 
379 
380 /* primary-expression:
381      literal
382      this
383      :: identifier
384      :: operator-function-id
385      :: qualifier-id
386      ( expression )
387      id-expression
388 
389    GNU Extensions:
390      __builtin_va_arg ( assignment-expression , type-id )
391      __builtin_offsetof ( type-id, offsetof-expression )
392 
393      __has_nothrow_assign ( type-id )
394      __has_nothrow_constructor ( type-id )
395      __has_nothrow_copy ( type-id )
396      __has_trivial_assign ( type-id )
397      __has_trivial_constructor ( type-id )
398      __has_trivial_copy ( type-id )
399      __has_trivial_destructor ( type-id )
400      __has_virtual_destructor ( type-id )
401      __is_abstract ( type-id )
402      __is_base_of ( type-id , type-id )
403      __is_class ( type-id )
404      __is_convertible_to ( type-id , type-id )
405      __is_empty ( type-id )
406      __is_enum ( type-id )
407      __is_literal_type ( type-id )
408      __is_pod ( type-id )
409      __is_polymorphic ( type-id )
410      __is_std_layout ( type-id )
411      __is_trivial ( type-id )
412      __is_union ( type-id )  */
413 
414 static void
415 pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
416 {
417   switch (TREE_CODE (t))
418     {
419     case INTEGER_CST:
420     case REAL_CST:
421     case COMPLEX_CST:
422     case STRING_CST:
423       pp_cxx_constant (pp, t);
424       break;
425 
426     case USERDEF_LITERAL:
427       pp_cxx_userdef_literal (pp, t);
428       break;
429 
430     case BASELINK:
431       t = BASELINK_FUNCTIONS (t);
432     case VAR_DECL:
433     case PARM_DECL:
434     case FIELD_DECL:
435     case FUNCTION_DECL:
436     case OVERLOAD:
437     case CONST_DECL:
438     case TEMPLATE_DECL:
439       pp_cxx_id_expression (pp, t);
440       break;
441 
442     case RESULT_DECL:
443     case TEMPLATE_TYPE_PARM:
444     case TEMPLATE_TEMPLATE_PARM:
445     case TEMPLATE_PARM_INDEX:
446       pp_cxx_unqualified_id (pp, t);
447       break;
448 
449     case STMT_EXPR:
450       pp_cxx_left_paren (pp);
451       pp_cxx_statement (pp, STMT_EXPR_STMT (t));
452       pp_cxx_right_paren (pp);
453       break;
454 
455     case TRAIT_EXPR:
456       pp_cxx_trait_expression (pp, t);
457       break;
458 
459     case VA_ARG_EXPR:
460       pp_cxx_va_arg_expression (pp, t);
461       break;
462 
463     case OFFSETOF_EXPR:
464       pp_cxx_offsetof_expression (pp, t);
465       break;
466 
467     default:
468       pp_c_primary_expression (pp_c_base (pp), t);
469       break;
470     }
471 }
472 
473 /* postfix-expression:
474      primary-expression
475      postfix-expression [ expression ]
476      postfix-expression ( expression-list(opt) )
477      simple-type-specifier ( expression-list(opt) )
478      typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
479      typename ::(opt) nested-name-specifier template(opt)
480 				       template-id ( expression-list(opt) )
481      postfix-expression . template(opt) ::(opt) id-expression
482      postfix-expression -> template(opt) ::(opt) id-expression
483      postfix-expression . pseudo-destructor-name
484      postfix-expression -> pseudo-destructor-name
485      postfix-expression ++
486      postfix-expression --
487      dynamic_cast < type-id > ( expression )
488      static_cast < type-id > ( expression )
489      reinterpret_cast < type-id > ( expression )
490      const_cast < type-id > ( expression )
491      typeid ( expression )
492      typeid ( type-id )  */
493 
494 static void
495 pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
496 {
497   enum tree_code code = TREE_CODE (t);
498 
499   switch (code)
500     {
501     case AGGR_INIT_EXPR:
502     case CALL_EXPR:
503       {
504 	tree fun = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t)
505 					   : CALL_EXPR_FN (t));
506 	tree saved_scope = pp->enclosing_scope;
507 	bool skipfirst = false;
508 	tree arg;
509 
510 	if (TREE_CODE (fun) == ADDR_EXPR)
511 	  fun = TREE_OPERAND (fun, 0);
512 
513 	/* In templates, where there is no way to tell whether a given
514 	   call uses an actual member function.  So the parser builds
515 	   FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
516 	   instantiation time.  */
517 	if (TREE_CODE (fun) != FUNCTION_DECL)
518 	  ;
519 	else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
520 	  {
521 	    tree object = (code == AGGR_INIT_EXPR
522 			   ? (AGGR_INIT_VIA_CTOR_P (t)
523 			      ? AGGR_INIT_EXPR_SLOT (t)
524 			      : AGGR_INIT_EXPR_ARG (t, 0))
525 			   : CALL_EXPR_ARG (t, 0));
526 
527 	    while (TREE_CODE (object) == NOP_EXPR)
528 	      object = TREE_OPERAND (object, 0);
529 
530 	    if (TREE_CODE (object) == ADDR_EXPR)
531 	      object = TREE_OPERAND (object, 0);
532 
533 	    if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
534 	      {
535 		pp_cxx_postfix_expression (pp, object);
536 		pp_cxx_dot (pp);
537 	      }
538 	    else
539 	      {
540 		pp_cxx_postfix_expression (pp, object);
541 		pp_cxx_arrow (pp);
542 	      }
543 	    skipfirst = true;
544 	    pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
545 	  }
546 
547 	pp_cxx_postfix_expression (pp, fun);
548 	pp->enclosing_scope = saved_scope;
549 	pp_cxx_left_paren (pp);
550 	if (code == AGGR_INIT_EXPR)
551 	  {
552 	    aggr_init_expr_arg_iterator iter;
553 	    FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
554 	      {
555 		if (skipfirst)
556 		  skipfirst = false;
557 		else
558 		  {
559 		    pp_cxx_expression (pp, arg);
560 		    if (more_aggr_init_expr_args_p (&iter))
561 		      pp_cxx_separate_with (pp, ',');
562 		  }
563 	      }
564 	  }
565 	else
566 	  {
567 	    call_expr_arg_iterator iter;
568 	    FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
569 	      {
570 		if (skipfirst)
571 		  skipfirst = false;
572 		else
573 		  {
574 		    pp_cxx_expression (pp, arg);
575 		    if (more_call_expr_args_p (&iter))
576 		      pp_cxx_separate_with (pp, ',');
577 		  }
578 	      }
579 	  }
580 	pp_cxx_right_paren (pp);
581       }
582       if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
583 	{
584 	  pp_cxx_separate_with (pp, ',');
585 	  pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t));
586 	}
587       break;
588 
589     case BASELINK:
590     case VAR_DECL:
591     case PARM_DECL:
592     case FIELD_DECL:
593     case FUNCTION_DECL:
594     case OVERLOAD:
595     case CONST_DECL:
596     case TEMPLATE_DECL:
597     case RESULT_DECL:
598       pp_cxx_primary_expression (pp, t);
599       break;
600 
601     case DYNAMIC_CAST_EXPR:
602     case STATIC_CAST_EXPR:
603     case REINTERPRET_CAST_EXPR:
604     case CONST_CAST_EXPR:
605       if (code == DYNAMIC_CAST_EXPR)
606 	pp_cxx_ws_string (pp, "dynamic_cast");
607       else if (code == STATIC_CAST_EXPR)
608 	pp_cxx_ws_string (pp, "static_cast");
609       else if (code == REINTERPRET_CAST_EXPR)
610 	pp_cxx_ws_string (pp, "reinterpret_cast");
611       else
612 	pp_cxx_ws_string (pp, "const_cast");
613       pp_cxx_begin_template_argument_list (pp);
614       pp_cxx_type_id (pp, TREE_TYPE (t));
615       pp_cxx_end_template_argument_list (pp);
616       pp_left_paren (pp);
617       pp_cxx_expression (pp, TREE_OPERAND (t, 0));
618       pp_right_paren (pp);
619       break;
620 
621     case EMPTY_CLASS_EXPR:
622       pp_cxx_type_id (pp, TREE_TYPE (t));
623       pp_left_paren (pp);
624       pp_right_paren (pp);
625       break;
626 
627     case TYPEID_EXPR:
628       pp_cxx_typeid_expression (pp, t);
629       break;
630 
631     case PSEUDO_DTOR_EXPR:
632       pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
633       pp_cxx_dot (pp);
634       pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
635       pp_cxx_colon_colon (pp);
636       pp_complement (pp);
637       pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
638       break;
639 
640     case ARROW_EXPR:
641       pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
642       pp_cxx_arrow (pp);
643       break;
644 
645     default:
646       pp_c_postfix_expression (pp_c_base (pp), t);
647       break;
648     }
649 }
650 
651 /* new-expression:
652       ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
653       ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
654 
655    new-placement:
656       ( expression-list )
657 
658    new-type-id:
659       type-specifier-seq new-declarator(opt)
660 
661    new-declarator:
662       ptr-operator new-declarator(opt)
663       direct-new-declarator
664 
665    direct-new-declarator
666       [ expression ]
667       direct-new-declarator [ constant-expression ]
668 
669    new-initializer:
670       ( expression-list(opt) )  */
671 
672 static void
673 pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
674 {
675   enum tree_code code = TREE_CODE (t);
676   tree type = TREE_OPERAND (t, 1);
677   tree init = TREE_OPERAND (t, 2);
678   switch (code)
679     {
680     case NEW_EXPR:
681     case VEC_NEW_EXPR:
682       if (NEW_EXPR_USE_GLOBAL (t))
683 	pp_cxx_colon_colon (pp);
684       pp_cxx_ws_string (pp, "new");
685       if (TREE_OPERAND (t, 0))
686 	{
687 	  pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
688 	  pp_space (pp);
689 	}
690       if (TREE_CODE (type) == ARRAY_REF)
691 	type = build_cplus_array_type
692 	  (TREE_OPERAND (type, 0),
693 	   build_index_type (fold_build2_loc (input_location,
694 					  MINUS_EXPR, integer_type_node,
695 					  TREE_OPERAND (type, 1),
696 					  integer_one_node)));
697       pp_cxx_type_id (pp, type);
698       if (init)
699 	{
700 	  pp_left_paren (pp);
701 	  if (TREE_CODE (init) == TREE_LIST)
702 	    pp_c_expression_list (pp_c_base (pp), init);
703 	  else if (init == void_zero_node)
704 	    ;			/* OK, empty initializer list.  */
705 	  else
706 	    pp_cxx_expression (pp, init);
707 	  pp_right_paren (pp);
708 	}
709       break;
710 
711     default:
712       pp_unsupported_tree (pp, t);
713     }
714 }
715 
716 /* delete-expression:
717       ::(opt) delete cast-expression
718       ::(opt) delete [ ] cast-expression   */
719 
720 static void
721 pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
722 {
723   enum tree_code code = TREE_CODE (t);
724   switch (code)
725     {
726     case DELETE_EXPR:
727     case VEC_DELETE_EXPR:
728       if (DELETE_EXPR_USE_GLOBAL (t))
729 	pp_cxx_colon_colon (pp);
730       pp_cxx_ws_string (pp, "delete");
731       pp_space (pp);
732       if (code == VEC_DELETE_EXPR
733 	  || DELETE_EXPR_USE_VEC (t))
734 	{
735 	  pp_left_bracket (pp);
736 	  pp_right_bracket (pp);
737 	  pp_space (pp);
738 	}
739       pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
740       break;
741 
742     default:
743       pp_unsupported_tree (pp, t);
744     }
745 }
746 
747 /* unary-expression:
748       postfix-expression
749       ++ cast-expression
750       -- cast-expression
751       unary-operator cast-expression
752       sizeof unary-expression
753       sizeof ( type-id )
754       sizeof ... ( identifier )
755       new-expression
756       delete-expression
757 
758    unary-operator: one of
759       *   &   +   -  !
760 
761    GNU extensions:
762       __alignof__ unary-expression
763       __alignof__ ( type-id )  */
764 
765 static void
766 pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
767 {
768   enum tree_code code = TREE_CODE (t);
769   switch (code)
770     {
771     case NEW_EXPR:
772     case VEC_NEW_EXPR:
773       pp_cxx_new_expression (pp, t);
774       break;
775 
776     case DELETE_EXPR:
777     case VEC_DELETE_EXPR:
778       pp_cxx_delete_expression (pp, t);
779       break;
780 
781     case SIZEOF_EXPR:
782       if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
783 	{
784 	  pp_cxx_ws_string (pp, "sizeof");
785 	  pp_cxx_ws_string (pp, "...");
786 	  pp_cxx_whitespace (pp);
787 	  pp_cxx_left_paren (pp);
788 	  if (TYPE_P (TREE_OPERAND (t, 0)))
789 	    pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
790 	  else
791 	    pp_unary_expression (pp, TREE_OPERAND (t, 0));
792 	  pp_cxx_right_paren (pp);
793 	  break;
794 	}
795       /* Fall through  */
796 
797     case ALIGNOF_EXPR:
798       pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
799       pp_cxx_whitespace (pp);
800       if (TREE_CODE (t) == SIZEOF_EXPR && SIZEOF_EXPR_TYPE_P (t))
801 	{
802 	  pp_cxx_left_paren (pp);
803 	  pp_cxx_type_id (pp, TREE_TYPE (TREE_OPERAND (t, 0)));
804 	  pp_cxx_right_paren (pp);
805 	}
806       else if (TYPE_P (TREE_OPERAND (t, 0)))
807 	{
808 	  pp_cxx_left_paren (pp);
809 	  pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
810 	  pp_cxx_right_paren (pp);
811 	}
812       else
813 	pp_unary_expression (pp, TREE_OPERAND (t, 0));
814       break;
815 
816     case AT_ENCODE_EXPR:
817       pp_cxx_ws_string (pp, "@encode");
818       pp_cxx_whitespace (pp);
819       pp_cxx_left_paren (pp);
820       pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
821       pp_cxx_right_paren (pp);
822       break;
823 
824     case NOEXCEPT_EXPR:
825       pp_cxx_ws_string (pp, "noexcept");
826       pp_cxx_whitespace (pp);
827       pp_cxx_left_paren (pp);
828       pp_cxx_expression (pp, TREE_OPERAND (t, 0));
829       pp_cxx_right_paren (pp);
830       break;
831 
832     case UNARY_PLUS_EXPR:
833       pp_plus (pp);
834       pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
835       break;
836 
837     default:
838       pp_c_unary_expression (pp_c_base (pp), t);
839       break;
840     }
841 }
842 
843 /* cast-expression:
844       unary-expression
845       ( type-id ) cast-expression  */
846 
847 static void
848 pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
849 {
850   switch (TREE_CODE (t))
851     {
852     case CAST_EXPR:
853     case IMPLICIT_CONV_EXPR:
854       pp_cxx_type_id (pp, TREE_TYPE (t));
855       pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
856       break;
857 
858     default:
859       pp_c_cast_expression (pp_c_base (pp), t);
860       break;
861     }
862 }
863 
864 /* pm-expression:
865       cast-expression
866       pm-expression .* cast-expression
867       pm-expression ->* cast-expression  */
868 
869 static void
870 pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
871 {
872   switch (TREE_CODE (t))
873     {
874       /* Handle unfortunate OFFSET_REF overloading here.  */
875     case OFFSET_REF:
876       if (TYPE_P (TREE_OPERAND (t, 0)))
877 	{
878 	  pp_cxx_qualified_id (pp, t);
879 	  break;
880 	}
881       /* Else fall through.  */
882     case MEMBER_REF:
883     case DOTSTAR_EXPR:
884       pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
885       if (TREE_CODE (t) == MEMBER_REF)
886 	pp_cxx_arrow (pp);
887       else
888 	pp_cxx_dot (pp);
889       pp_star(pp);
890       pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
891       break;
892 
893 
894     default:
895       pp_cxx_cast_expression (pp, t);
896       break;
897     }
898 }
899 
900 /* multiplicative-expression:
901       pm-expression
902       multiplicative-expression * pm-expression
903       multiplicative-expression / pm-expression
904       multiplicative-expression % pm-expression  */
905 
906 static void
907 pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
908 {
909   enum tree_code code = TREE_CODE (e);
910   switch (code)
911     {
912     case MULT_EXPR:
913     case TRUNC_DIV_EXPR:
914     case TRUNC_MOD_EXPR:
915       pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
916       pp_space (pp);
917       if (code == MULT_EXPR)
918 	pp_star (pp);
919       else if (code == TRUNC_DIV_EXPR)
920 	pp_slash (pp);
921       else
922 	pp_modulo (pp);
923       pp_space (pp);
924       pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
925       break;
926 
927     default:
928       pp_cxx_pm_expression (pp, e);
929       break;
930     }
931 }
932 
933 /* conditional-expression:
934       logical-or-expression
935       logical-or-expression ?  expression  : assignment-expression  */
936 
937 static void
938 pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
939 {
940   if (TREE_CODE (e) == COND_EXPR)
941     {
942       pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
943       pp_space (pp);
944       pp_question (pp);
945       pp_space (pp);
946       pp_cxx_expression (pp, TREE_OPERAND (e, 1));
947       pp_space (pp);
948       pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
949     }
950   else
951     pp_c_logical_or_expression (pp_c_base (pp), e);
952 }
953 
954 /* Pretty-print a compound assignment operator token as indicated by T.  */
955 
956 static void
957 pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
958 {
959   const char *op;
960 
961   switch (TREE_CODE (t))
962     {
963     case NOP_EXPR:
964       op = "=";
965       break;
966 
967     case PLUS_EXPR:
968       op = "+=";
969       break;
970 
971     case MINUS_EXPR:
972       op = "-=";
973       break;
974 
975     case TRUNC_DIV_EXPR:
976       op = "/=";
977       break;
978 
979     case TRUNC_MOD_EXPR:
980       op = "%=";
981       break;
982 
983     default:
984       op = tree_code_name[TREE_CODE (t)];
985       break;
986     }
987 
988   pp_cxx_ws_string (pp, op);
989 }
990 
991 
992 /* assignment-expression:
993       conditional-expression
994       logical-or-expression assignment-operator assignment-expression
995       throw-expression
996 
997    throw-expression:
998        throw assignment-expression(opt)
999 
1000    assignment-operator: one of
1001       =    *=    /=    %=    +=    -=    >>=    <<=    &=    ^=    |=  */
1002 
1003 static void
1004 pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
1005 {
1006   switch (TREE_CODE (e))
1007     {
1008     case MODIFY_EXPR:
1009     case INIT_EXPR:
1010       pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
1011       pp_space (pp);
1012       pp_equal (pp);
1013       pp_space (pp);
1014       pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
1015       break;
1016 
1017     case THROW_EXPR:
1018       pp_cxx_ws_string (pp, "throw");
1019       if (TREE_OPERAND (e, 0))
1020 	pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
1021       break;
1022 
1023     case MODOP_EXPR:
1024       pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
1025       pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
1026       pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
1027       break;
1028 
1029     default:
1030       pp_cxx_conditional_expression (pp, e);
1031       break;
1032     }
1033 }
1034 
1035 static void
1036 pp_cxx_expression (cxx_pretty_printer *pp, tree t)
1037 {
1038   switch (TREE_CODE (t))
1039     {
1040     case STRING_CST:
1041     case INTEGER_CST:
1042     case REAL_CST:
1043     case COMPLEX_CST:
1044       pp_cxx_constant (pp, t);
1045       break;
1046 
1047     case USERDEF_LITERAL:
1048       pp_cxx_userdef_literal (pp, t);
1049       break;
1050 
1051     case RESULT_DECL:
1052       pp_cxx_unqualified_id (pp, t);
1053       break;
1054 
1055 #if 0
1056     case OFFSET_REF:
1057 #endif
1058     case SCOPE_REF:
1059     case PTRMEM_CST:
1060       pp_cxx_qualified_id (pp, t);
1061       break;
1062 
1063     case OVERLOAD:
1064       t = OVL_CURRENT (t);
1065     case VAR_DECL:
1066     case PARM_DECL:
1067     case FIELD_DECL:
1068     case CONST_DECL:
1069     case FUNCTION_DECL:
1070     case BASELINK:
1071     case TEMPLATE_DECL:
1072     case TEMPLATE_TYPE_PARM:
1073     case TEMPLATE_PARM_INDEX:
1074     case TEMPLATE_TEMPLATE_PARM:
1075     case STMT_EXPR:
1076       pp_cxx_primary_expression (pp, t);
1077       break;
1078 
1079     case CALL_EXPR:
1080     case DYNAMIC_CAST_EXPR:
1081     case STATIC_CAST_EXPR:
1082     case REINTERPRET_CAST_EXPR:
1083     case CONST_CAST_EXPR:
1084 #if 0
1085     case MEMBER_REF:
1086 #endif
1087     case EMPTY_CLASS_EXPR:
1088     case TYPEID_EXPR:
1089     case PSEUDO_DTOR_EXPR:
1090     case AGGR_INIT_EXPR:
1091     case ARROW_EXPR:
1092       pp_cxx_postfix_expression (pp, t);
1093       break;
1094 
1095     case NEW_EXPR:
1096     case VEC_NEW_EXPR:
1097       pp_cxx_new_expression (pp, t);
1098       break;
1099 
1100     case DELETE_EXPR:
1101     case VEC_DELETE_EXPR:
1102       pp_cxx_delete_expression (pp, t);
1103       break;
1104 
1105     case SIZEOF_EXPR:
1106     case ALIGNOF_EXPR:
1107     case NOEXCEPT_EXPR:
1108       pp_cxx_unary_expression (pp, t);
1109       break;
1110 
1111     case CAST_EXPR:
1112     case IMPLICIT_CONV_EXPR:
1113       pp_cxx_cast_expression (pp, t);
1114       break;
1115 
1116     case OFFSET_REF:
1117     case MEMBER_REF:
1118     case DOTSTAR_EXPR:
1119       pp_cxx_pm_expression (pp, t);
1120       break;
1121 
1122     case MULT_EXPR:
1123     case TRUNC_DIV_EXPR:
1124     case TRUNC_MOD_EXPR:
1125       pp_cxx_multiplicative_expression (pp, t);
1126       break;
1127 
1128     case COND_EXPR:
1129       pp_cxx_conditional_expression (pp, t);
1130       break;
1131 
1132     case MODIFY_EXPR:
1133     case INIT_EXPR:
1134     case THROW_EXPR:
1135     case MODOP_EXPR:
1136       pp_cxx_assignment_expression (pp, t);
1137       break;
1138 
1139     case NON_DEPENDENT_EXPR:
1140     case MUST_NOT_THROW_EXPR:
1141       pp_cxx_expression (pp, TREE_OPERAND (t, 0));
1142       break;
1143 
1144     case EXPR_PACK_EXPANSION:
1145       pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t));
1146       pp_cxx_ws_string (pp, "...");
1147       break;
1148 
1149     case TEMPLATE_ID_EXPR:
1150       pp_cxx_template_id (pp, t);
1151       break;
1152 
1153     case NONTYPE_ARGUMENT_PACK:
1154       {
1155 	tree args = ARGUMENT_PACK_ARGS (t);
1156 	int i, len = TREE_VEC_LENGTH (args);
1157 	for (i = 0; i < len; ++i)
1158 	  {
1159 	    if (i > 0)
1160 	      pp_cxx_separate_with (pp, ',');
1161 	    pp_cxx_expression (pp, TREE_VEC_ELT (args, i));
1162 	  }
1163       }
1164       break;
1165 
1166     case LAMBDA_EXPR:
1167       pp_cxx_ws_string (pp, "<lambda>");
1168       break;
1169 
1170     default:
1171       pp_c_expression (pp_c_base (pp), t);
1172       break;
1173     }
1174 }
1175 
1176 
1177 /* Declarations.  */
1178 
1179 /* function-specifier:
1180       inline
1181       virtual
1182       explicit   */
1183 
1184 static void
1185 pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
1186 {
1187   switch (TREE_CODE (t))
1188     {
1189     case FUNCTION_DECL:
1190       if (DECL_VIRTUAL_P (t))
1191 	pp_cxx_ws_string (pp, "virtual");
1192       else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1193 	pp_cxx_ws_string (pp, "explicit");
1194       else
1195 	pp_c_function_specifier (pp_c_base (pp), t);
1196 
1197     default:
1198       break;
1199     }
1200 }
1201 
1202 /* decl-specifier-seq:
1203       decl-specifier-seq(opt) decl-specifier
1204 
1205    decl-specifier:
1206       storage-class-specifier
1207       type-specifier
1208       function-specifier
1209       friend
1210       typedef  */
1211 
1212 static void
1213 pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
1214 {
1215   switch (TREE_CODE (t))
1216     {
1217     case VAR_DECL:
1218     case PARM_DECL:
1219     case CONST_DECL:
1220     case FIELD_DECL:
1221       pp_cxx_storage_class_specifier (pp, t);
1222       pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1223       break;
1224 
1225     case TYPE_DECL:
1226       pp_cxx_ws_string (pp, "typedef");
1227       pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1228       break;
1229 
1230     case FUNCTION_DECL:
1231       /* Constructors don't have return types.  And conversion functions
1232 	 do not have a type-specifier in their return types.  */
1233       if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1234 	pp_cxx_function_specifier (pp, t);
1235       else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1236 	pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1237       else
1238 	default:
1239       pp_c_declaration_specifiers (pp_c_base (pp), t);
1240       break;
1241     }
1242 }
1243 
1244 /* simple-type-specifier:
1245       ::(opt) nested-name-specifier(opt) type-name
1246       ::(opt) nested-name-specifier(opt) template(opt) template-id
1247       char
1248       wchar_t
1249       bool
1250       short
1251       int
1252       long
1253       signed
1254       unsigned
1255       float
1256       double
1257       void  */
1258 
1259 static void
1260 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1261 {
1262   switch (TREE_CODE (t))
1263     {
1264     case RECORD_TYPE:
1265     case UNION_TYPE:
1266     case ENUMERAL_TYPE:
1267       pp_cxx_qualified_id (pp, t);
1268       break;
1269 
1270     case TEMPLATE_TYPE_PARM:
1271     case TEMPLATE_TEMPLATE_PARM:
1272     case TEMPLATE_PARM_INDEX:
1273     case BOUND_TEMPLATE_TEMPLATE_PARM:
1274       pp_cxx_unqualified_id (pp, t);
1275       break;
1276 
1277     case TYPENAME_TYPE:
1278       pp_cxx_ws_string (pp, "typename");
1279       pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1280       pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1281       break;
1282 
1283     default:
1284       pp_c_type_specifier (pp_c_base (pp), t);
1285       break;
1286     }
1287 }
1288 
1289 /* type-specifier-seq:
1290       type-specifier type-specifier-seq(opt)
1291 
1292    type-specifier:
1293       simple-type-specifier
1294       class-specifier
1295       enum-specifier
1296       elaborated-type-specifier
1297       cv-qualifier   */
1298 
1299 static void
1300 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1301 {
1302   switch (TREE_CODE (t))
1303     {
1304     case TEMPLATE_DECL:
1305     case TEMPLATE_TYPE_PARM:
1306     case TEMPLATE_TEMPLATE_PARM:
1307     case TYPE_DECL:
1308     case BOUND_TEMPLATE_TEMPLATE_PARM:
1309       pp_cxx_cv_qualifier_seq (pp, t);
1310       pp_cxx_simple_type_specifier (pp, t);
1311       break;
1312 
1313     case METHOD_TYPE:
1314       pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1315       pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1316       pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1317       break;
1318 
1319     case DECLTYPE_TYPE:
1320       pp_cxx_ws_string (pp, "decltype");
1321       pp_cxx_left_paren (pp);
1322       pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1323       pp_cxx_right_paren (pp);
1324       break;
1325 
1326     case RECORD_TYPE:
1327       if (TYPE_PTRMEMFUNC_P (t))
1328 	{
1329 	  tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1330 	  pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1331 	  pp_cxx_whitespace (pp);
1332 	  pp_cxx_ptr_operator (pp, t);
1333 	  break;
1334 	}
1335       /* else fall through */
1336 
1337     default:
1338       if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1339 	pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1340     }
1341 }
1342 
1343 /* ptr-operator:
1344       * cv-qualifier-seq(opt)
1345       &
1346       ::(opt) nested-name-specifier * cv-qualifier-seq(opt)  */
1347 
1348 static void
1349 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1350 {
1351   if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1352     t = TREE_TYPE (t);
1353   switch (TREE_CODE (t))
1354     {
1355     case REFERENCE_TYPE:
1356     case POINTER_TYPE:
1357       if (TYPE_PTR_OR_PTRMEM_P (TREE_TYPE (t)))
1358 	pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1359       pp_c_attributes_display (pp_c_base (pp),
1360 			       TYPE_ATTRIBUTES (TREE_TYPE (t)));
1361       if (TREE_CODE (t) == POINTER_TYPE)
1362 	{
1363 	  pp_star (pp);
1364 	  pp_cxx_cv_qualifier_seq (pp, t);
1365 	}
1366       else
1367 	pp_ampersand (pp);
1368       break;
1369 
1370     case RECORD_TYPE:
1371       if (TYPE_PTRMEMFUNC_P (t))
1372 	{
1373 	  pp_cxx_left_paren (pp);
1374 	  pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1375 	  pp_star (pp);
1376 	  break;
1377 	}
1378     case OFFSET_TYPE:
1379       if (TYPE_PTRMEM_P (t))
1380 	{
1381 	  if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1382 	    pp_cxx_left_paren (pp);
1383 	  pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1384 	  pp_star (pp);
1385 	  pp_cxx_cv_qualifier_seq (pp, t);
1386 	  break;
1387 	}
1388       /* else fall through.  */
1389 
1390     default:
1391       pp_unsupported_tree (pp, t);
1392       break;
1393     }
1394 }
1395 
1396 static inline tree
1397 pp_cxx_implicit_parameter_type (tree mf)
1398 {
1399   return class_of_this_parm (TREE_TYPE (mf));
1400 }
1401 
1402 /*
1403    parameter-declaration:
1404       decl-specifier-seq declarator
1405       decl-specifier-seq declarator = assignment-expression
1406       decl-specifier-seq abstract-declarator(opt)
1407       decl-specifier-seq abstract-declarator(opt) assignment-expression  */
1408 
1409 static inline void
1410 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1411 {
1412   pp_cxx_decl_specifier_seq (pp, t);
1413   if (TYPE_P (t))
1414     pp_cxx_abstract_declarator (pp, t);
1415   else
1416     pp_cxx_declarator (pp, t);
1417 }
1418 
1419 /* parameter-declaration-clause:
1420       parameter-declaration-list(opt) ...(opt)
1421       parameter-declaration-list , ...
1422 
1423    parameter-declaration-list:
1424       parameter-declaration
1425       parameter-declaration-list , parameter-declaration  */
1426 
1427 static void
1428 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1429 {
1430   tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1431   tree types =
1432     TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1433   const bool abstract = args == NULL
1434     || pp_c_base (pp)->flags & pp_c_flag_abstract;
1435   bool first = true;
1436 
1437   /* Skip artificial parameter for nonstatic member functions.  */
1438   if (TREE_CODE (t) == METHOD_TYPE)
1439     types = TREE_CHAIN (types);
1440 
1441   pp_cxx_left_paren (pp);
1442   for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1443     {
1444       if (!first)
1445 	pp_cxx_separate_with (pp, ',');
1446       first = false;
1447       pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1448       if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1449 	{
1450 	  pp_cxx_whitespace (pp);
1451 	  pp_equal (pp);
1452 	  pp_cxx_whitespace (pp);
1453 	  pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1454 	}
1455     }
1456   pp_cxx_right_paren (pp);
1457 }
1458 
1459 /* exception-specification:
1460       throw ( type-id-list(opt) )
1461 
1462    type-id-list
1463       type-id
1464       type-id-list , type-id   */
1465 
1466 static void
1467 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1468 {
1469   tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1470   bool need_comma = false;
1471 
1472   if (ex_spec == NULL)
1473     return;
1474   if (TREE_PURPOSE (ex_spec))
1475     {
1476       pp_cxx_ws_string (pp, "noexcept");
1477       pp_cxx_whitespace (pp);
1478       pp_cxx_left_paren (pp);
1479       if (DEFERRED_NOEXCEPT_SPEC_P (ex_spec))
1480 	pp_cxx_ws_string (pp, "<uninstantiated>");
1481       else
1482 	pp_cxx_expression (pp, TREE_PURPOSE (ex_spec));
1483       pp_cxx_right_paren (pp);
1484       return;
1485     }
1486   pp_cxx_ws_string (pp, "throw");
1487   pp_cxx_left_paren (pp);
1488   for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1489     {
1490       tree type = TREE_VALUE (ex_spec);
1491       tree argpack = NULL_TREE;
1492       int i, len = 1;
1493 
1494       if (ARGUMENT_PACK_P (type))
1495 	{
1496 	  argpack = ARGUMENT_PACK_ARGS (type);
1497 	  len = TREE_VEC_LENGTH (argpack);
1498 	}
1499 
1500       for (i = 0; i < len; ++i)
1501 	{
1502 	  if (argpack)
1503 	    type = TREE_VEC_ELT (argpack, i);
1504 
1505 	  if (need_comma)
1506 	    pp_cxx_separate_with (pp, ',');
1507 	  else
1508 	    need_comma = true;
1509 
1510 	  pp_cxx_type_id (pp, type);
1511 	}
1512     }
1513   pp_cxx_right_paren (pp);
1514 }
1515 
1516 /* direct-declarator:
1517       declarator-id
1518       direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1519 					    exception-specification(opt)
1520       direct-declaration [ constant-expression(opt) ]
1521       ( declarator )  */
1522 
1523 static void
1524 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1525 {
1526   switch (TREE_CODE (t))
1527     {
1528     case VAR_DECL:
1529     case PARM_DECL:
1530     case CONST_DECL:
1531     case FIELD_DECL:
1532       if (DECL_NAME (t))
1533 	{
1534 	  pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1535 
1536 	  if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1537 	      || template_parameter_pack_p (t))
1538 	    /* A function parameter pack or non-type template
1539 	       parameter pack.  */
1540 	    pp_cxx_ws_string (pp, "...");
1541 
1542 	  pp_cxx_id_expression (pp, DECL_NAME (t));
1543 	}
1544       pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1545       break;
1546 
1547     case FUNCTION_DECL:
1548       pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1549       pp_cxx_id_expression (pp, t);
1550       pp_cxx_parameter_declaration_clause (pp, t);
1551 
1552       if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1553 	{
1554 	  pp_base (pp)->padding = pp_before;
1555 	  pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1556 	}
1557 
1558       pp_cxx_exception_specification (pp, TREE_TYPE (t));
1559       break;
1560 
1561     case TYPENAME_TYPE:
1562     case TEMPLATE_DECL:
1563     case TEMPLATE_TYPE_PARM:
1564     case TEMPLATE_PARM_INDEX:
1565     case TEMPLATE_TEMPLATE_PARM:
1566       break;
1567 
1568     default:
1569       pp_c_direct_declarator (pp_c_base (pp), t);
1570       break;
1571     }
1572 }
1573 
1574 /* declarator:
1575    direct-declarator
1576    ptr-operator declarator  */
1577 
1578 static void
1579 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1580 {
1581   pp_cxx_direct_declarator (pp, t);
1582 }
1583 
1584 /* ctor-initializer:
1585       : mem-initializer-list
1586 
1587    mem-initializer-list:
1588       mem-initializer
1589       mem-initializer , mem-initializer-list
1590 
1591    mem-initializer:
1592       mem-initializer-id ( expression-list(opt) )
1593 
1594    mem-initializer-id:
1595       ::(opt) nested-name-specifier(opt) class-name
1596       identifier   */
1597 
1598 static void
1599 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1600 {
1601   t = TREE_OPERAND (t, 0);
1602   pp_cxx_whitespace (pp);
1603   pp_colon (pp);
1604   pp_cxx_whitespace (pp);
1605   for (; t; t = TREE_CHAIN (t))
1606     {
1607       tree purpose = TREE_PURPOSE (t);
1608       bool is_pack = PACK_EXPANSION_P (purpose);
1609 
1610       if (is_pack)
1611 	pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1612       else
1613 	pp_cxx_primary_expression (pp, purpose);
1614       pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1615       if (is_pack)
1616 	pp_cxx_ws_string (pp, "...");
1617       if (TREE_CHAIN (t))
1618 	pp_cxx_separate_with (pp, ',');
1619     }
1620 }
1621 
1622 /* function-definition:
1623       decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1624       decl-specifier-seq(opt) declarator function-try-block  */
1625 
1626 static void
1627 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1628 {
1629   tree saved_scope = pp->enclosing_scope;
1630   pp_cxx_decl_specifier_seq (pp, t);
1631   pp_cxx_declarator (pp, t);
1632   pp_needs_newline (pp) = true;
1633   pp->enclosing_scope = DECL_CONTEXT (t);
1634   if (DECL_SAVED_TREE (t))
1635     pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1636   else
1637     pp_cxx_semicolon (pp);
1638   pp_newline_and_flush (pp);
1639   pp->enclosing_scope = saved_scope;
1640 }
1641 
1642 /* abstract-declarator:
1643       ptr-operator abstract-declarator(opt)
1644       direct-abstract-declarator  */
1645 
1646 static void
1647 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1648 {
1649   if (TYPE_PTRMEM_P (t))
1650     pp_cxx_right_paren (pp);
1651   else if (POINTER_TYPE_P (t))
1652     {
1653       if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1654 	  || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1655 	pp_cxx_right_paren (pp);
1656       t = TREE_TYPE (t);
1657     }
1658   pp_cxx_direct_abstract_declarator (pp, t);
1659 }
1660 
1661 /* direct-abstract-declarator:
1662       direct-abstract-declarator(opt) ( parameter-declaration-clause )
1663 			   cv-qualifier-seq(opt) exception-specification(opt)
1664       direct-abstract-declarator(opt) [ constant-expression(opt) ]
1665       ( abstract-declarator )  */
1666 
1667 static void
1668 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1669 {
1670   switch (TREE_CODE (t))
1671     {
1672     case REFERENCE_TYPE:
1673       pp_cxx_abstract_declarator (pp, t);
1674       break;
1675 
1676     case RECORD_TYPE:
1677       if (TYPE_PTRMEMFUNC_P (t))
1678 	pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1679       break;
1680 
1681     case METHOD_TYPE:
1682     case FUNCTION_TYPE:
1683       pp_cxx_parameter_declaration_clause (pp, t);
1684       pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1685       if (TREE_CODE (t) == METHOD_TYPE)
1686 	{
1687 	  pp_base (pp)->padding = pp_before;
1688 	  pp_cxx_cv_qualifier_seq (pp, class_of_this_parm (t));
1689 	}
1690       pp_cxx_exception_specification (pp, t);
1691       break;
1692 
1693     case TYPENAME_TYPE:
1694     case TEMPLATE_TYPE_PARM:
1695     case TEMPLATE_TEMPLATE_PARM:
1696     case BOUND_TEMPLATE_TEMPLATE_PARM:
1697     case UNBOUND_CLASS_TEMPLATE:
1698       break;
1699 
1700     default:
1701       pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1702       break;
1703     }
1704 }
1705 
1706 /* type-id:
1707      type-specifier-seq abstract-declarator(opt) */
1708 
1709 static void
1710 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1711 {
1712   pp_flags saved_flags = pp_c_base (pp)->flags;
1713   pp_c_base (pp)->flags |= pp_c_flag_abstract;
1714 
1715   switch (TREE_CODE (t))
1716     {
1717     case TYPE_DECL:
1718     case UNION_TYPE:
1719     case RECORD_TYPE:
1720     case ENUMERAL_TYPE:
1721     case TYPENAME_TYPE:
1722     case BOUND_TEMPLATE_TEMPLATE_PARM:
1723     case UNBOUND_CLASS_TEMPLATE:
1724     case TEMPLATE_TEMPLATE_PARM:
1725     case TEMPLATE_TYPE_PARM:
1726     case TEMPLATE_PARM_INDEX:
1727     case TEMPLATE_DECL:
1728     case TYPEOF_TYPE:
1729     case UNDERLYING_TYPE:
1730     case DECLTYPE_TYPE:
1731     case TEMPLATE_ID_EXPR:
1732       pp_cxx_type_specifier_seq (pp, t);
1733       break;
1734 
1735     case TYPE_PACK_EXPANSION:
1736       pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1737       pp_cxx_ws_string (pp, "...");
1738       break;
1739 
1740     default:
1741       pp_c_type_id (pp_c_base (pp), t);
1742       break;
1743     }
1744 
1745   pp_c_base (pp)->flags = saved_flags;
1746 }
1747 
1748 /* template-argument-list:
1749       template-argument ...(opt)
1750       template-argument-list, template-argument ...(opt)
1751 
1752    template-argument:
1753       assignment-expression
1754       type-id
1755       template-name  */
1756 
1757 static void
1758 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1759 {
1760   int i;
1761   bool need_comma = false;
1762 
1763   if (t == NULL)
1764     return;
1765   for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1766     {
1767       tree arg = TREE_VEC_ELT (t, i);
1768       tree argpack = NULL_TREE;
1769       int idx, len = 1;
1770 
1771       if (ARGUMENT_PACK_P (arg))
1772 	{
1773 	  argpack = ARGUMENT_PACK_ARGS (arg);
1774 	  len = TREE_VEC_LENGTH (argpack);
1775 	}
1776 
1777       for (idx = 0; idx < len; idx++)
1778 	{
1779 	  if (argpack)
1780 	    arg = TREE_VEC_ELT (argpack, idx);
1781 
1782 	  if (need_comma)
1783 	    pp_cxx_separate_with (pp, ',');
1784 	  else
1785 	    need_comma = true;
1786 
1787 	  if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1788 			       && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1789 	    pp_cxx_type_id (pp, arg);
1790 	  else
1791 	    pp_cxx_expression (pp, arg);
1792 	}
1793     }
1794 }
1795 
1796 
1797 static void
1798 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1799 {
1800   t = DECL_EXPR_DECL (t);
1801   pp_cxx_type_specifier_seq (pp, t);
1802   if (TYPE_P (t))
1803     pp_cxx_abstract_declarator (pp, t);
1804   else
1805     pp_cxx_declarator (pp, t);
1806 }
1807 
1808 /* Statements.  */
1809 
1810 static void
1811 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1812 {
1813   switch (TREE_CODE (t))
1814     {
1815     case CTOR_INITIALIZER:
1816       pp_cxx_ctor_initializer (pp, t);
1817       break;
1818 
1819     case USING_STMT:
1820       pp_cxx_ws_string (pp, "using");
1821       pp_cxx_ws_string (pp, "namespace");
1822       if (DECL_CONTEXT (t))
1823 	pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1824       pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1825       break;
1826 
1827     case USING_DECL:
1828       pp_cxx_ws_string (pp, "using");
1829       pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1830       pp_cxx_unqualified_id (pp, DECL_NAME (t));
1831       break;
1832 
1833     case EH_SPEC_BLOCK:
1834       break;
1835 
1836       /* try-block:
1837 	    try compound-statement handler-seq  */
1838     case TRY_BLOCK:
1839       pp_maybe_newline_and_indent (pp, 0);
1840       pp_cxx_ws_string (pp, "try");
1841       pp_newline_and_indent (pp, 3);
1842       pp_cxx_statement (pp, TRY_STMTS (t));
1843       pp_newline_and_indent (pp, -3);
1844       if (CLEANUP_P (t))
1845 	;
1846       else
1847 	pp_cxx_statement (pp, TRY_HANDLERS (t));
1848       break;
1849 
1850       /*
1851 	 handler-seq:
1852 	    handler handler-seq(opt)
1853 
1854 	 handler:
1855 	 catch ( exception-declaration ) compound-statement
1856 
1857 	 exception-declaration:
1858 	    type-specifier-seq declarator
1859 	    type-specifier-seq abstract-declarator
1860 	    ...   */
1861     case HANDLER:
1862       pp_cxx_ws_string (pp, "catch");
1863       pp_cxx_left_paren (pp);
1864       pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1865       pp_cxx_right_paren (pp);
1866       pp_indentation (pp) += 3;
1867       pp_needs_newline (pp) = true;
1868       pp_cxx_statement (pp, HANDLER_BODY (t));
1869       pp_indentation (pp) -= 3;
1870       pp_needs_newline (pp) = true;
1871       break;
1872 
1873       /* selection-statement:
1874 	    if ( expression ) statement
1875 	    if ( expression ) statement else statement  */
1876     case IF_STMT:
1877       pp_cxx_ws_string (pp, "if");
1878       pp_cxx_whitespace (pp);
1879       pp_cxx_left_paren (pp);
1880       pp_cxx_expression (pp, IF_COND (t));
1881       pp_cxx_right_paren (pp);
1882       pp_newline_and_indent (pp, 2);
1883       pp_cxx_statement (pp, THEN_CLAUSE (t));
1884       pp_newline_and_indent (pp, -2);
1885       if (ELSE_CLAUSE (t))
1886 	{
1887 	  tree else_clause = ELSE_CLAUSE (t);
1888 	  pp_cxx_ws_string (pp, "else");
1889 	  if (TREE_CODE (else_clause) == IF_STMT)
1890 	    pp_cxx_whitespace (pp);
1891 	  else
1892 	    pp_newline_and_indent (pp, 2);
1893 	  pp_cxx_statement (pp, else_clause);
1894 	  if (TREE_CODE (else_clause) != IF_STMT)
1895 	    pp_newline_and_indent (pp, -2);
1896 	}
1897       break;
1898 
1899     case SWITCH_STMT:
1900       pp_cxx_ws_string (pp, "switch");
1901       pp_space (pp);
1902       pp_cxx_left_paren (pp);
1903       pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1904       pp_cxx_right_paren (pp);
1905       pp_indentation (pp) += 3;
1906       pp_needs_newline (pp) = true;
1907       pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1908       pp_newline_and_indent (pp, -3);
1909       break;
1910 
1911       /* iteration-statement:
1912 	    while ( expression ) statement
1913 	    do statement while ( expression ) ;
1914 	    for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1915 	    for ( declaration expression(opt) ; expression(opt) ) statement  */
1916     case WHILE_STMT:
1917       pp_cxx_ws_string (pp, "while");
1918       pp_space (pp);
1919       pp_cxx_left_paren (pp);
1920       pp_cxx_expression (pp, WHILE_COND (t));
1921       pp_cxx_right_paren (pp);
1922       pp_newline_and_indent (pp, 3);
1923       pp_cxx_statement (pp, WHILE_BODY (t));
1924       pp_indentation (pp) -= 3;
1925       pp_needs_newline (pp) = true;
1926       break;
1927 
1928     case DO_STMT:
1929       pp_cxx_ws_string (pp, "do");
1930       pp_newline_and_indent (pp, 3);
1931       pp_cxx_statement (pp, DO_BODY (t));
1932       pp_newline_and_indent (pp, -3);
1933       pp_cxx_ws_string (pp, "while");
1934       pp_space (pp);
1935       pp_cxx_left_paren (pp);
1936       pp_cxx_expression (pp, DO_COND (t));
1937       pp_cxx_right_paren (pp);
1938       pp_cxx_semicolon (pp);
1939       pp_needs_newline (pp) = true;
1940       break;
1941 
1942     case FOR_STMT:
1943       pp_cxx_ws_string (pp, "for");
1944       pp_space (pp);
1945       pp_cxx_left_paren (pp);
1946       if (FOR_INIT_STMT (t))
1947 	pp_cxx_statement (pp, FOR_INIT_STMT (t));
1948       else
1949 	pp_cxx_semicolon (pp);
1950       pp_needs_newline (pp) = false;
1951       pp_cxx_whitespace (pp);
1952       if (FOR_COND (t))
1953 	pp_cxx_expression (pp, FOR_COND (t));
1954       pp_cxx_semicolon (pp);
1955       pp_needs_newline (pp) = false;
1956       pp_cxx_whitespace (pp);
1957       if (FOR_EXPR (t))
1958 	pp_cxx_expression (pp, FOR_EXPR (t));
1959       pp_cxx_right_paren (pp);
1960       pp_newline_and_indent (pp, 3);
1961       pp_cxx_statement (pp, FOR_BODY (t));
1962       pp_indentation (pp) -= 3;
1963       pp_needs_newline (pp) = true;
1964       break;
1965 
1966     case RANGE_FOR_STMT:
1967       pp_cxx_ws_string (pp, "for");
1968       pp_space (pp);
1969       pp_cxx_left_paren (pp);
1970       pp_cxx_statement (pp, RANGE_FOR_DECL (t));
1971       pp_space (pp);
1972       pp_needs_newline (pp) = false;
1973       pp_colon (pp);
1974       pp_space (pp);
1975       pp_cxx_statement (pp, RANGE_FOR_EXPR (t));
1976       pp_cxx_right_paren (pp);
1977       pp_newline_and_indent (pp, 3);
1978       pp_cxx_statement (pp, FOR_BODY (t));
1979       pp_indentation (pp) -= 3;
1980       pp_needs_newline (pp) = true;
1981       break;
1982 
1983       /* jump-statement:
1984 	    goto identifier;
1985 	    continue ;
1986 	    return expression(opt) ;  */
1987     case BREAK_STMT:
1988     case CONTINUE_STMT:
1989       pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1990       pp_cxx_semicolon (pp);
1991       pp_needs_newline (pp) = true;
1992       break;
1993 
1994       /* expression-statement:
1995 	    expression(opt) ;  */
1996     case EXPR_STMT:
1997       pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1998       pp_cxx_semicolon (pp);
1999       pp_needs_newline (pp) = true;
2000       break;
2001 
2002     case CLEANUP_STMT:
2003       pp_cxx_ws_string (pp, "try");
2004       pp_newline_and_indent (pp, 2);
2005       pp_cxx_statement (pp, CLEANUP_BODY (t));
2006       pp_newline_and_indent (pp, -2);
2007       pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
2008       pp_newline_and_indent (pp, 2);
2009       pp_cxx_statement (pp, CLEANUP_EXPR (t));
2010       pp_newline_and_indent (pp, -2);
2011       break;
2012 
2013     case STATIC_ASSERT:
2014       pp_cxx_declaration (pp, t);
2015       break;
2016 
2017     default:
2018       pp_c_statement (pp_c_base (pp), t);
2019       break;
2020     }
2021 }
2022 
2023 /* original-namespace-definition:
2024       namespace identifier { namespace-body }
2025 
2026   As an edge case, we also handle unnamed namespace definition here.  */
2027 
2028 static void
2029 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
2030 {
2031   pp_cxx_ws_string (pp, "namespace");
2032   if (DECL_CONTEXT (t))
2033     pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2034   if (DECL_NAME (t))
2035     pp_cxx_unqualified_id (pp, t);
2036   pp_cxx_whitespace (pp);
2037   pp_cxx_left_brace (pp);
2038   /* We do not print the namespace-body.  */
2039   pp_cxx_whitespace (pp);
2040   pp_cxx_right_brace (pp);
2041 }
2042 
2043 /* namespace-alias:
2044       identifier
2045 
2046    namespace-alias-definition:
2047       namespace identifier = qualified-namespace-specifier ;
2048 
2049    qualified-namespace-specifier:
2050       ::(opt) nested-name-specifier(opt) namespace-name   */
2051 
2052 static void
2053 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
2054 {
2055   pp_cxx_ws_string (pp, "namespace");
2056   if (DECL_CONTEXT (t))
2057     pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2058   pp_cxx_unqualified_id (pp, t);
2059   pp_cxx_whitespace (pp);
2060   pp_equal (pp);
2061   pp_cxx_whitespace (pp);
2062   if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
2063     pp_cxx_nested_name_specifier (pp,
2064 				  DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
2065   pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
2066   pp_cxx_semicolon (pp);
2067 }
2068 
2069 /* simple-declaration:
2070       decl-specifier-seq(opt) init-declarator-list(opt)  */
2071 
2072 static void
2073 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
2074 {
2075   pp_cxx_decl_specifier_seq (pp, t);
2076   pp_cxx_init_declarator (pp, t);
2077   pp_cxx_semicolon (pp);
2078   pp_needs_newline (pp) = true;
2079 }
2080 
2081 /*
2082   template-parameter-list:
2083      template-parameter
2084      template-parameter-list , template-parameter  */
2085 
2086 static inline void
2087 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2088 {
2089   const int n = TREE_VEC_LENGTH (t);
2090   int i;
2091   for (i = 0; i < n; ++i)
2092     {
2093       if (i)
2094 	pp_cxx_separate_with (pp, ',');
2095       pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2096     }
2097 }
2098 
2099 /* template-parameter:
2100       type-parameter
2101       parameter-declaration
2102 
2103    type-parameter:
2104      class ...(opt) identifier(opt)
2105      class identifier(opt) = type-id
2106      typename identifier(opt)
2107      typename ...(opt) identifier(opt) = type-id
2108      template < template-parameter-list > class ...(opt) identifier(opt)
2109      template < template-parameter-list > class identifier(opt) = template-name  */
2110 
2111 static void
2112 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2113 {
2114   tree parameter =  TREE_VALUE (t);
2115   switch (TREE_CODE (parameter))
2116     {
2117     case TYPE_DECL:
2118       pp_cxx_ws_string (pp, "class");
2119       if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2120 	pp_cxx_ws_string (pp, "...");
2121       if (DECL_NAME (parameter))
2122 	pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2123       /* FIXME: Check if we should print also default argument.  */
2124       break;
2125 
2126     case PARM_DECL:
2127       pp_cxx_parameter_declaration (pp, parameter);
2128       break;
2129 
2130     case TEMPLATE_DECL:
2131       break;
2132 
2133     default:
2134       pp_unsupported_tree (pp, t);
2135       break;
2136     }
2137 }
2138 
2139 /* Pretty-print a template parameter in the canonical form
2140    "template-parameter-<level>-<position in parameter list>".  */
2141 
2142 void
2143 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2144 {
2145   const enum tree_code code = TREE_CODE (parm);
2146 
2147   /* Brings type template parameters to the canonical forms.  */
2148   if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2149       || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2150     parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2151 
2152   pp_cxx_begin_template_argument_list (pp);
2153   pp_cxx_ws_string (pp, M_("template-parameter-"));
2154   pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2155   pp_minus (pp);
2156   pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2157   pp_cxx_end_template_argument_list (pp);
2158 }
2159 
2160 /*
2161   template-declaration:
2162      export(opt) template < template-parameter-list > declaration   */
2163 
2164 static void
2165 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2166 {
2167   tree tmpl = most_general_template (t);
2168   tree level;
2169 
2170   pp_maybe_newline_and_indent (pp, 0);
2171   for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2172     {
2173       pp_cxx_ws_string (pp, "template");
2174       pp_cxx_begin_template_argument_list (pp);
2175       pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2176       pp_cxx_end_template_argument_list (pp);
2177       pp_newline_and_indent (pp, 3);
2178     }
2179   if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2180     pp_cxx_function_definition (pp, t);
2181   else
2182     pp_cxx_simple_declaration (pp, t);
2183 }
2184 
2185 static void
2186 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2187 {
2188   pp_unsupported_tree (pp, t);
2189 }
2190 
2191 static void
2192 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2193 {
2194   pp_unsupported_tree (pp, t);
2195 }
2196 
2197 /*
2198     declaration:
2199        block-declaration
2200        function-definition
2201        template-declaration
2202        explicit-instantiation
2203        explicit-specialization
2204        linkage-specification
2205        namespace-definition
2206 
2207     block-declaration:
2208        simple-declaration
2209        asm-definition
2210        namespace-alias-definition
2211        using-declaration
2212        using-directive
2213        static_assert-declaration */
2214 void
2215 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2216 {
2217   if (TREE_CODE (t) == STATIC_ASSERT)
2218     {
2219       pp_cxx_ws_string (pp, "static_assert");
2220       pp_cxx_left_paren (pp);
2221       pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2222       pp_cxx_separate_with (pp, ',');
2223       pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2224       pp_cxx_right_paren (pp);
2225     }
2226   else if (!DECL_LANG_SPECIFIC (t))
2227     pp_cxx_simple_declaration (pp, t);
2228   else if (DECL_USE_TEMPLATE (t))
2229     switch (DECL_USE_TEMPLATE (t))
2230       {
2231       case 1:
2232 	pp_cxx_template_declaration (pp, t);
2233 	break;
2234 
2235       case 2:
2236 	pp_cxx_explicit_specialization (pp, t);
2237 	break;
2238 
2239       case 3:
2240 	pp_cxx_explicit_instantiation (pp, t);
2241 	break;
2242 
2243       default:
2244 	break;
2245       }
2246   else switch (TREE_CODE (t))
2247     {
2248     case VAR_DECL:
2249     case TYPE_DECL:
2250       pp_cxx_simple_declaration (pp, t);
2251       break;
2252 
2253     case FUNCTION_DECL:
2254       if (DECL_SAVED_TREE (t))
2255 	pp_cxx_function_definition (pp, t);
2256       else
2257 	pp_cxx_simple_declaration (pp, t);
2258       break;
2259 
2260     case NAMESPACE_DECL:
2261       if (DECL_NAMESPACE_ALIAS (t))
2262 	pp_cxx_namespace_alias_definition (pp, t);
2263       else
2264 	pp_cxx_original_namespace_definition (pp, t);
2265       break;
2266 
2267     default:
2268       pp_unsupported_tree (pp, t);
2269       break;
2270     }
2271 }
2272 
2273 static void
2274 pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2275 {
2276   t = TREE_OPERAND (t, 0);
2277   pp_cxx_ws_string (pp, "typeid");
2278   pp_cxx_left_paren (pp);
2279   if (TYPE_P (t))
2280     pp_cxx_type_id (pp, t);
2281   else
2282     pp_cxx_expression (pp, t);
2283   pp_cxx_right_paren (pp);
2284 }
2285 
2286 void
2287 pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2288 {
2289   pp_cxx_ws_string (pp, "va_arg");
2290   pp_cxx_left_paren (pp);
2291   pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2292   pp_cxx_separate_with (pp, ',');
2293   pp_cxx_type_id (pp, TREE_TYPE (t));
2294   pp_cxx_right_paren (pp);
2295 }
2296 
2297 static bool
2298 pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2299 {
2300   switch (TREE_CODE (t))
2301     {
2302     case ARROW_EXPR:
2303       if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2304 	  && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2305 	{
2306 	  pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2307 	  pp_cxx_separate_with (pp, ',');
2308 	  return true;
2309 	}
2310       return false;
2311     case COMPONENT_REF:
2312       if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2313 	return false;
2314       if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2315 	pp_cxx_dot (pp);
2316       pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2317       return true;
2318     case ARRAY_REF:
2319       if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2320 	return false;
2321       pp_left_bracket (pp);
2322       pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2323       pp_right_bracket (pp);
2324       return true;
2325     default:
2326       return false;
2327     }
2328 }
2329 
2330 void
2331 pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2332 {
2333   pp_cxx_ws_string (pp, "offsetof");
2334   pp_cxx_left_paren (pp);
2335   if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2336     pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2337   pp_cxx_right_paren (pp);
2338 }
2339 
2340 void
2341 pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2342 {
2343   cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2344 
2345   switch (kind)
2346     {
2347     case CPTK_HAS_NOTHROW_ASSIGN:
2348       pp_cxx_ws_string (pp, "__has_nothrow_assign");
2349       break;
2350     case CPTK_HAS_TRIVIAL_ASSIGN:
2351       pp_cxx_ws_string (pp, "__has_trivial_assign");
2352       break;
2353     case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2354       pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2355       break;
2356     case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2357       pp_cxx_ws_string (pp, "__has_trivial_constructor");
2358       break;
2359     case CPTK_HAS_NOTHROW_COPY:
2360       pp_cxx_ws_string (pp, "__has_nothrow_copy");
2361       break;
2362     case CPTK_HAS_TRIVIAL_COPY:
2363       pp_cxx_ws_string (pp, "__has_trivial_copy");
2364       break;
2365     case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2366       pp_cxx_ws_string (pp, "__has_trivial_destructor");
2367       break;
2368     case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2369       pp_cxx_ws_string (pp, "__has_virtual_destructor");
2370       break;
2371     case CPTK_IS_ABSTRACT:
2372       pp_cxx_ws_string (pp, "__is_abstract");
2373       break;
2374     case CPTK_IS_BASE_OF:
2375       pp_cxx_ws_string (pp, "__is_base_of");
2376       break;
2377     case CPTK_IS_CLASS:
2378       pp_cxx_ws_string (pp, "__is_class");
2379       break;
2380     case CPTK_IS_CONVERTIBLE_TO:
2381       pp_cxx_ws_string (pp, "__is_convertible_to");
2382       break;
2383     case CPTK_IS_EMPTY:
2384       pp_cxx_ws_string (pp, "__is_empty");
2385       break;
2386     case CPTK_IS_ENUM:
2387       pp_cxx_ws_string (pp, "__is_enum");
2388       break;
2389     case CPTK_IS_FINAL:
2390       pp_cxx_ws_string (pp, "__is_final");
2391       break;
2392     case CPTK_IS_POD:
2393       pp_cxx_ws_string (pp, "__is_pod");
2394       break;
2395     case CPTK_IS_POLYMORPHIC:
2396       pp_cxx_ws_string (pp, "__is_polymorphic");
2397       break;
2398     case CPTK_IS_STD_LAYOUT:
2399       pp_cxx_ws_string (pp, "__is_std_layout");
2400       break;
2401     case CPTK_IS_TRIVIAL:
2402       pp_cxx_ws_string (pp, "__is_trivial");
2403       break;
2404     case CPTK_IS_UNION:
2405       pp_cxx_ws_string (pp, "__is_union");
2406       break;
2407     case CPTK_IS_LITERAL_TYPE:
2408       pp_cxx_ws_string (pp, "__is_literal_type");
2409       break;
2410 
2411     default:
2412       gcc_unreachable ();
2413     }
2414 
2415   pp_cxx_left_paren (pp);
2416   pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2417 
2418   if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2419     {
2420       pp_cxx_separate_with (pp, ',');
2421       pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2422     }
2423 
2424   pp_cxx_right_paren (pp);
2425 }
2426 
2427 typedef c_pretty_print_fn pp_fun;
2428 
2429 /* Initialization of a C++ pretty-printer object.  */
2430 
2431 void
2432 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2433 {
2434   pp_c_pretty_printer_init (pp_c_base (pp));
2435   pp_set_line_maximum_length (pp, 0);
2436 
2437   pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2438   pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2439   pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2440   pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2441   pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2442   pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2443   pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2444   pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2445   pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2446   pp->c_base.direct_abstract_declarator =
2447     (pp_fun) pp_cxx_direct_abstract_declarator;
2448   pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2449 
2450   /* pp->c_base.statement = (pp_fun) pp_cxx_statement;  */
2451 
2452   pp->c_base.constant = (pp_fun) pp_cxx_constant;
2453   pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2454   pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2455   pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2456   pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2457   pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2458   pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2459   pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2460   pp->c_base.expression = (pp_fun) pp_cxx_expression;
2461   pp->enclosing_scope = global_namespace;
2462 }
2463