xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/c-family/c-pretty-print.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* Subroutines common to both C and C++ pretty-printers.
2    Copyright (C) 2002-2015 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 "hash-set.h"
26 #include "machmode.h"
27 #include "vec.h"
28 #include "double-int.h"
29 #include "input.h"
30 #include "alias.h"
31 #include "symtab.h"
32 #include "options.h"
33 #include "wide-int.h"
34 #include "inchash.h"
35 #include "tree.h"
36 #include "stor-layout.h"
37 #include "attribs.h"
38 #include "intl.h"
39 #include "c-pretty-print.h"
40 #include "tree-pretty-print.h"
41 #include "tree-iterator.h"
42 #include "diagnostic.h"
43 #include "wide-int-print.h"
44 
45 /* The pretty-printer code is primarily designed to closely follow
46    (GNU) C and C++ grammars.  That is to be contrasted with spaghetti
47    codes we used to have in the past.  Following a structured
48    approach (preferably the official grammars) is believed to make it
49    much easier to add extensions and nifty pretty-printing effects that
50    takes expression or declaration contexts into account.  */
51 
52 
53 #define pp_c_maybe_whitespace(PP)            \
54    do {                                      \
55      if ((PP)->padding == pp_before) \
56        pp_c_whitespace (PP);                 \
57    } while (0)
58 
59 /* literal  */
60 static void pp_c_char (c_pretty_printer *, int);
61 
62 /* postfix-expression  */
63 static void pp_c_initializer_list (c_pretty_printer *, tree);
64 static void pp_c_brace_enclosed_initializer_list (c_pretty_printer *, tree);
65 
66 static void pp_c_additive_expression (c_pretty_printer *, tree);
67 static void pp_c_shift_expression (c_pretty_printer *, tree);
68 static void pp_c_relational_expression (c_pretty_printer *, tree);
69 static void pp_c_equality_expression (c_pretty_printer *, tree);
70 static void pp_c_and_expression (c_pretty_printer *, tree);
71 static void pp_c_exclusive_or_expression (c_pretty_printer *, tree);
72 static void pp_c_inclusive_or_expression (c_pretty_printer *, tree);
73 static void pp_c_logical_and_expression (c_pretty_printer *, tree);
74 
75 /* declarations.  */
76 
77 
78 /* Helper functions.  */
79 
80 void
81 pp_c_whitespace (c_pretty_printer *pp)
82 {
83   pp_space (pp);
84   pp->padding = pp_none;
85 }
86 
87 void
88 pp_c_left_paren (c_pretty_printer *pp)
89 {
90   pp_left_paren (pp);
91   pp->padding = pp_none;
92 }
93 
94 void
95 pp_c_right_paren (c_pretty_printer *pp)
96 {
97   pp_right_paren (pp);
98   pp->padding = pp_none;
99 }
100 
101 void
102 pp_c_left_brace (c_pretty_printer *pp)
103 {
104   pp_left_brace (pp);
105   pp->padding = pp_none;
106 }
107 
108 void
109 pp_c_right_brace (c_pretty_printer *pp)
110 {
111   pp_right_brace (pp);
112   pp->padding = pp_none;
113 }
114 
115 void
116 pp_c_left_bracket (c_pretty_printer *pp)
117 {
118   pp_left_bracket (pp);
119   pp->padding = pp_none;
120 }
121 
122 void
123 pp_c_right_bracket (c_pretty_printer *pp)
124 {
125   pp_right_bracket (pp);
126   pp->padding = pp_none;
127 }
128 
129 void
130 pp_c_dot (c_pretty_printer *pp)
131 {
132   pp_dot (pp);
133   pp->padding = pp_none;
134 }
135 
136 void
137 pp_c_ampersand (c_pretty_printer *pp)
138 {
139   pp_ampersand (pp);
140   pp->padding = pp_none;
141 }
142 
143 void
144 pp_c_star (c_pretty_printer *pp)
145 {
146   pp_star (pp);
147   pp->padding = pp_none;
148 }
149 
150 void
151 pp_c_arrow (c_pretty_printer *pp)
152 {
153   pp_arrow (pp);
154   pp->padding = pp_none;
155 }
156 
157 void
158 pp_c_semicolon (c_pretty_printer *pp)
159 {
160   pp_semicolon (pp);
161   pp->padding = pp_none;
162 }
163 
164 void
165 pp_c_complement (c_pretty_printer *pp)
166 {
167   pp_complement (pp);
168   pp->padding = pp_none;
169 }
170 
171 void
172 pp_c_exclamation (c_pretty_printer *pp)
173 {
174   pp_exclamation (pp);
175   pp->padding = pp_none;
176 }
177 
178 /* Print out the external representation of QUALIFIERS.  */
179 
180 void
181 pp_c_cv_qualifiers (c_pretty_printer *pp, int qualifiers, bool func_type)
182 {
183   const char *p = pp_last_position_in_text (pp);
184   bool previous = false;
185 
186   if (!qualifiers)
187     return;
188 
189   /* The C programming language does not have references, but it is much
190      simpler to handle those here rather than going through the same
191      logic in the C++ pretty-printer.  */
192   if (p != NULL && (*p == '*' || *p == '&'))
193     pp_c_whitespace (pp);
194 
195   if (qualifiers & TYPE_QUAL_ATOMIC)
196     {
197       pp_c_ws_string (pp, "_Atomic");
198       previous = true;
199     }
200 
201   if (qualifiers & TYPE_QUAL_CONST)
202     {
203       if (previous)
204         pp_c_whitespace (pp);
205       pp_c_ws_string (pp, func_type ? "__attribute__((const))" : "const");
206       previous = true;
207     }
208 
209   if (qualifiers & TYPE_QUAL_VOLATILE)
210     {
211       if (previous)
212         pp_c_whitespace (pp);
213       pp_c_ws_string (pp, func_type ? "__attribute__((noreturn))" : "volatile");
214       previous = true;
215     }
216 
217   if (qualifiers & TYPE_QUAL_RESTRICT)
218     {
219       if (previous)
220         pp_c_whitespace (pp);
221       pp_c_ws_string (pp, (flag_isoc99 && !c_dialect_cxx ()
222 			   ? "restrict" : "__restrict__"));
223     }
224 }
225 
226 /* Pretty-print T using the type-cast notation '( type-name )'.  */
227 
228 static void
229 pp_c_type_cast (c_pretty_printer *pp, tree t)
230 {
231   pp_c_left_paren (pp);
232   pp->type_id (t);
233   pp_c_right_paren (pp);
234 }
235 
236 /* We're about to pretty-print a pointer type as indicated by T.
237    Output a whitespace, if needed, preparing for subsequent output.  */
238 
239 void
240 pp_c_space_for_pointer_operator (c_pretty_printer *pp, tree t)
241 {
242   if (POINTER_TYPE_P (t))
243     {
244       tree pointee = strip_pointer_operator (TREE_TYPE (t));
245       if (TREE_CODE (pointee) != ARRAY_TYPE
246 	  && TREE_CODE (pointee) != FUNCTION_TYPE)
247 	pp_c_whitespace (pp);
248     }
249 }
250 
251 
252 /* Declarations.  */
253 
254 /* C++ cv-qualifiers are called type-qualifiers in C.  Print out the
255    cv-qualifiers of T.  If T is a declaration then it is the cv-qualifier
256    of its type.  Take care of possible extensions.
257 
258    type-qualifier-list:
259        type-qualifier
260        type-qualifier-list type-qualifier
261 
262    type-qualifier:
263        const
264        restrict                              -- C99
265        __restrict__                          -- GNU C
266        address-space-qualifier		     -- GNU C
267        volatile
268        _Atomic                               -- C11
269 
270    address-space-qualifier:
271        identifier			     -- GNU C  */
272 
273 void
274 pp_c_type_qualifier_list (c_pretty_printer *pp, tree t)
275 {
276   int qualifiers;
277 
278   if (!t || t == error_mark_node)
279     return;
280 
281   if (!TYPE_P (t))
282     t = TREE_TYPE (t);
283 
284   qualifiers = TYPE_QUALS (t);
285   pp_c_cv_qualifiers (pp, qualifiers,
286 		      TREE_CODE (t) == FUNCTION_TYPE);
287 
288   if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (t)))
289     {
290       const char *as = c_addr_space_name (TYPE_ADDR_SPACE (t));
291       pp_c_identifier (pp, as);
292     }
293 }
294 
295 /* pointer:
296       * type-qualifier-list(opt)
297       * type-qualifier-list(opt) pointer  */
298 
299 static void
300 pp_c_pointer (c_pretty_printer *pp, tree t)
301 {
302   if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
303     t = TREE_TYPE (t);
304   switch (TREE_CODE (t))
305     {
306     case POINTER_TYPE:
307       /* It is easier to handle C++ reference types here.  */
308     case REFERENCE_TYPE:
309       if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
310 	pp_c_pointer (pp, TREE_TYPE (t));
311       if (TREE_CODE (t) == POINTER_TYPE)
312 	pp_c_star (pp);
313       else
314 	pp_c_ampersand (pp);
315       pp_c_type_qualifier_list (pp, t);
316       break;
317 
318       /* ??? This node is now in GENERIC and so shouldn't be here.  But
319 	 we'll fix that later.  */
320     case DECL_EXPR:
321       pp->declaration (DECL_EXPR_DECL (t));
322       pp_needs_newline (pp) = true;
323       break;
324 
325     default:
326       pp_unsupported_tree (pp, t);
327     }
328 }
329 
330 /* simple-type-specifier:
331      type-specifier
332 
333    type-specifier:
334       void
335       char
336       short
337       int
338       long
339       float
340       double
341       signed
342       unsigned
343       _Bool                          -- C99
344       _Complex                       -- C99
345       _Imaginary                     -- C99
346       struct-or-union-specifier
347       enum-specifier
348       typedef-name.
349 
350   GNU extensions.
351   simple-type-specifier:
352       __complex__
353       __vector__   */
354 
355 void
356 c_pretty_printer::simple_type_specifier (tree t)
357 {
358   const enum tree_code code = TREE_CODE (t);
359   switch (code)
360     {
361     case ERROR_MARK:
362       translate_string ("<type-error>");
363       break;
364 
365     case IDENTIFIER_NODE:
366       pp_c_identifier (this, IDENTIFIER_POINTER (t));
367       break;
368 
369     case VOID_TYPE:
370     case BOOLEAN_TYPE:
371     case INTEGER_TYPE:
372     case REAL_TYPE:
373     case FIXED_POINT_TYPE:
374       if (TYPE_NAME (t))
375 	{
376 	  t = TYPE_NAME (t);
377 	  simple_type_specifier (t);
378 	}
379       else
380 	{
381 	  int prec = TYPE_PRECISION (t);
382 	  if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (t)))
383 	    t = c_common_type_for_mode (TYPE_MODE (t), TYPE_SATURATING (t));
384 	  else
385 	    t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
386 	  if (TYPE_NAME (t))
387 	    {
388 	      simple_type_specifier (t);
389 	      if (TYPE_PRECISION (t) != prec)
390 		{
391 		  pp_colon (this);
392 		  pp_decimal_int (this, prec);
393 		}
394 	    }
395 	  else
396 	    {
397 	      switch (code)
398 		{
399 		case INTEGER_TYPE:
400 		  translate_string (TYPE_UNSIGNED (t)
401                                     ? "<unnamed-unsigned:"
402                                     : "<unnamed-signed:");
403 		  break;
404 		case REAL_TYPE:
405 		  translate_string ("<unnamed-float:");
406 		  break;
407 		case FIXED_POINT_TYPE:
408 		  translate_string ("<unnamed-fixed:");
409 		  break;
410 		default:
411 		  gcc_unreachable ();
412 		}
413 	      pp_decimal_int (this, prec);
414 	      pp_greater (this);
415 	    }
416 	}
417       break;
418 
419     case TYPE_DECL:
420       if (DECL_NAME (t))
421 	id_expression (t);
422       else
423 	translate_string ("<typedef-error>");
424       break;
425 
426     case UNION_TYPE:
427     case RECORD_TYPE:
428     case ENUMERAL_TYPE:
429       if (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL)
430 	/* Don't decorate the type if this is a typedef name.  */;
431       else if (code == UNION_TYPE)
432 	pp_c_ws_string (this, "union");
433       else if (code == RECORD_TYPE)
434 	pp_c_ws_string (this, "struct");
435       else if (code == ENUMERAL_TYPE)
436 	pp_c_ws_string (this, "enum");
437       else
438 	translate_string ("<tag-error>");
439 
440       if (TYPE_NAME (t))
441 	id_expression (TYPE_NAME (t));
442       else
443 	translate_string ("<anonymous>");
444       break;
445 
446     default:
447       pp_unsupported_tree (this, t);
448       break;
449     }
450 }
451 
452 /* specifier-qualifier-list:
453       type-specifier specifier-qualifier-list-opt
454       type-qualifier specifier-qualifier-list-opt
455 
456 
457   Implementation note:  Because of the non-linearities in array or
458   function declarations, this routine prints not just the
459   specifier-qualifier-list of such entities or types of such entities,
460   but also the 'pointer' production part of their declarators.  The
461   remaining part is done by declarator() or abstract_declarator().  */
462 
463 void
464 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
465 {
466   const enum tree_code code = TREE_CODE (t);
467 
468   if (!(pp->flags & pp_c_flag_gnu_v3) && code != POINTER_TYPE)
469     pp_c_type_qualifier_list (pp, t);
470   switch (code)
471     {
472     case REFERENCE_TYPE:
473     case POINTER_TYPE:
474       {
475 	/* Get the types-specifier of this type.  */
476 	tree pointee = strip_pointer_operator (TREE_TYPE (t));
477 	pp_c_specifier_qualifier_list (pp, pointee);
478 	if (TREE_CODE (pointee) == ARRAY_TYPE
479 	    || TREE_CODE (pointee) == FUNCTION_TYPE)
480 	  {
481 	    pp_c_whitespace (pp);
482 	    pp_c_left_paren (pp);
483 	    pp_c_attributes_display (pp, TYPE_ATTRIBUTES (pointee));
484 	  }
485 	else if (!c_dialect_cxx ())
486 	  pp_c_whitespace (pp);
487 	pp_ptr_operator (pp, t);
488       }
489       break;
490 
491     case FUNCTION_TYPE:
492     case ARRAY_TYPE:
493       pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
494       break;
495 
496     case VECTOR_TYPE:
497     case COMPLEX_TYPE:
498       if (code == COMPLEX_TYPE)
499 	pp_c_ws_string (pp, (flag_isoc99 && !c_dialect_cxx ()
500 			     ? "_Complex" : "__complex__"));
501       else if (code == VECTOR_TYPE)
502 	{
503 	  pp_c_ws_string (pp, "__vector");
504 	  pp_c_left_paren (pp);
505 	  pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (t));
506 	  pp_c_right_paren (pp);
507 	  pp_c_whitespace (pp);
508 	}
509       pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
510       break;
511 
512     default:
513       pp->simple_type_specifier (t);
514       break;
515     }
516   if ((pp->flags & pp_c_flag_gnu_v3) && code != POINTER_TYPE)
517     pp_c_type_qualifier_list (pp, t);
518 }
519 
520 /* parameter-type-list:
521       parameter-list
522       parameter-list , ...
523 
524    parameter-list:
525       parameter-declaration
526       parameter-list , parameter-declaration
527 
528    parameter-declaration:
529       declaration-specifiers declarator
530       declaration-specifiers abstract-declarator(opt)   */
531 
532 void
533 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
534 {
535   bool want_parm_decl = DECL_P (t) && !(pp->flags & pp_c_flag_abstract);
536   tree parms = want_parm_decl ? DECL_ARGUMENTS (t) :  TYPE_ARG_TYPES (t);
537   pp_c_left_paren (pp);
538   if (parms == void_list_node)
539     pp_c_ws_string (pp, "void");
540   else
541     {
542       bool first = true;
543       for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
544 	{
545 	  if (!first)
546 	    pp_separate_with (pp, ',');
547 	  first = false;
548 	  pp->declaration_specifiers
549 	    (want_parm_decl ? parms : TREE_VALUE (parms));
550 	  if (want_parm_decl)
551 	    pp->declarator (parms);
552 	  else
553 	    pp->abstract_declarator (TREE_VALUE (parms));
554 	}
555     }
556   pp_c_right_paren (pp);
557 }
558 
559 /* abstract-declarator:
560       pointer
561       pointer(opt) direct-abstract-declarator  */
562 
563 void
564 c_pretty_printer::abstract_declarator (tree t)
565 {
566   if (TREE_CODE (t) == POINTER_TYPE)
567     {
568       if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
569 	  || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
570 	pp_c_right_paren (this);
571       t = TREE_TYPE (t);
572     }
573 
574   direct_abstract_declarator (t);
575 }
576 
577 /* direct-abstract-declarator:
578       ( abstract-declarator )
579       direct-abstract-declarator(opt) [ assignment-expression(opt) ]
580       direct-abstract-declarator(opt) [ * ]
581       direct-abstract-declarator(opt) ( parameter-type-list(opt) )  */
582 
583 void
584 c_pretty_printer::direct_abstract_declarator (tree t)
585 {
586   switch (TREE_CODE (t))
587     {
588     case POINTER_TYPE:
589       abstract_declarator (t);
590       break;
591 
592     case FUNCTION_TYPE:
593       pp_c_parameter_type_list (this, t);
594       direct_abstract_declarator (TREE_TYPE (t));
595       break;
596 
597     case ARRAY_TYPE:
598       pp_c_left_bracket (this);
599       if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
600 	{
601 	  tree maxval = TYPE_MAX_VALUE (TYPE_DOMAIN (t));
602 	  tree type = TREE_TYPE (maxval);
603 
604 	  if (tree_fits_shwi_p (maxval))
605 	    pp_wide_integer (this, tree_to_shwi (maxval) + 1);
606 	  else
607 	    expression (fold_build2 (PLUS_EXPR, type, maxval,
608                                      build_int_cst (type, 1)));
609 	}
610       pp_c_right_bracket (this);
611       direct_abstract_declarator (TREE_TYPE (t));
612       break;
613 
614     case IDENTIFIER_NODE:
615     case VOID_TYPE:
616     case BOOLEAN_TYPE:
617     case INTEGER_TYPE:
618     case REAL_TYPE:
619     case FIXED_POINT_TYPE:
620     case ENUMERAL_TYPE:
621     case RECORD_TYPE:
622     case UNION_TYPE:
623     case VECTOR_TYPE:
624     case COMPLEX_TYPE:
625     case TYPE_DECL:
626       break;
627 
628     default:
629       pp_unsupported_tree (this, t);
630       break;
631     }
632 }
633 
634 /* type-name:
635       specifier-qualifier-list  abstract-declarator(opt)  */
636 
637 void
638 c_pretty_printer::type_id (tree t)
639 {
640   pp_c_specifier_qualifier_list (this, t);
641   abstract_declarator (t);
642 }
643 
644 /* storage-class-specifier:
645       typedef
646       extern
647       static
648       auto
649       register  */
650 
651 void
652 c_pretty_printer::storage_class_specifier (tree t)
653 {
654   if (TREE_CODE (t) == TYPE_DECL)
655     pp_c_ws_string (this, "typedef");
656   else if (DECL_P (t))
657     {
658       if (DECL_REGISTER (t))
659 	pp_c_ws_string (this, "register");
660       else if (TREE_STATIC (t) && TREE_CODE (t) == VAR_DECL)
661 	pp_c_ws_string (this, "static");
662     }
663 }
664 
665 /* function-specifier:
666       inline   */
667 
668 void
669 c_pretty_printer::function_specifier (tree t)
670 {
671   if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
672     pp_c_ws_string (this, "inline");
673 }
674 
675 /* declaration-specifiers:
676       storage-class-specifier declaration-specifiers(opt)
677       type-specifier declaration-specifiers(opt)
678       type-qualifier declaration-specifiers(opt)
679       function-specifier declaration-specifiers(opt)  */
680 
681 void
682 c_pretty_printer::declaration_specifiers (tree t)
683 {
684   storage_class_specifier (t);
685   function_specifier (t);
686   pp_c_specifier_qualifier_list (this, DECL_P (t) ?  TREE_TYPE (t) : t);
687 }
688 
689 /* direct-declarator
690       identifier
691       ( declarator )
692       direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
693       direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
694       direct-declarator [ type-qualifier-list static assignment-expression ]
695       direct-declarator [ type-qualifier-list * ]
696       direct-declarator ( parameter-type-list )
697       direct-declarator ( identifier-list(opt) )  */
698 
699 void
700 c_pretty_printer::direct_declarator (tree t)
701 {
702   switch (TREE_CODE (t))
703     {
704     case VAR_DECL:
705     case PARM_DECL:
706     case TYPE_DECL:
707     case FIELD_DECL:
708     case LABEL_DECL:
709       pp_c_space_for_pointer_operator (this, TREE_TYPE (t));
710       pp_c_tree_decl_identifier (this, t);
711       break;
712 
713     case ARRAY_TYPE:
714     case POINTER_TYPE:
715       abstract_declarator (TREE_TYPE (t));
716       break;
717 
718     case FUNCTION_TYPE:
719       pp_parameter_list (this, t);
720       abstract_declarator (TREE_TYPE (t));
721       break;
722 
723     case FUNCTION_DECL:
724       pp_c_space_for_pointer_operator (this, TREE_TYPE (TREE_TYPE (t)));
725       pp_c_tree_decl_identifier (this, t);
726       if (flags & pp_c_flag_abstract)
727 	abstract_declarator (TREE_TYPE (t));
728       else
729 	{
730 	  pp_parameter_list (this, t);
731 	  abstract_declarator (TREE_TYPE (TREE_TYPE (t)));
732 	}
733       break;
734 
735     case INTEGER_TYPE:
736     case REAL_TYPE:
737     case FIXED_POINT_TYPE:
738     case ENUMERAL_TYPE:
739     case UNION_TYPE:
740     case RECORD_TYPE:
741       break;
742 
743     default:
744       pp_unsupported_tree (this, t);
745       break;
746     }
747 }
748 
749 
750 /* declarator:
751       pointer(opt)  direct-declarator   */
752 
753 void
754 c_pretty_printer::declarator (tree t)
755 {
756   switch (TREE_CODE (t))
757     {
758     case INTEGER_TYPE:
759     case REAL_TYPE:
760     case FIXED_POINT_TYPE:
761     case ENUMERAL_TYPE:
762     case UNION_TYPE:
763     case RECORD_TYPE:
764       break;
765 
766     case VAR_DECL:
767     case PARM_DECL:
768     case FIELD_DECL:
769     case ARRAY_TYPE:
770     case FUNCTION_TYPE:
771     case FUNCTION_DECL:
772     case TYPE_DECL:
773       direct_declarator (t);
774     break;
775 
776 
777     default:
778       pp_unsupported_tree (this, t);
779       break;
780     }
781 }
782 
783 /* declaration:
784       declaration-specifiers init-declarator-list(opt) ;  */
785 
786 void
787 c_pretty_printer::declaration (tree t)
788 {
789   declaration_specifiers (t);
790   pp_c_init_declarator (this, t);
791 }
792 
793 /* Pretty-print ATTRIBUTES using GNU C extension syntax.  */
794 
795 void
796 pp_c_attributes (c_pretty_printer *pp, tree attributes)
797 {
798   if (attributes == NULL_TREE)
799     return;
800 
801   pp_c_ws_string (pp, "__attribute__");
802   pp_c_left_paren (pp);
803   pp_c_left_paren (pp);
804   for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
805     {
806       pp_tree_identifier (pp, TREE_PURPOSE (attributes));
807       if (TREE_VALUE (attributes))
808 	pp_c_call_argument_list (pp, TREE_VALUE (attributes));
809 
810       if (TREE_CHAIN (attributes))
811 	pp_separate_with (pp, ',');
812     }
813   pp_c_right_paren (pp);
814   pp_c_right_paren (pp);
815 }
816 
817 /* Pretty-print ATTRIBUTES using GNU C extension syntax for attributes
818    marked to be displayed on disgnostic.  */
819 
820 void
821 pp_c_attributes_display (c_pretty_printer *pp, tree a)
822 {
823   bool is_first = true;
824 
825   if (a == NULL_TREE)
826     return;
827 
828   for (; a != NULL_TREE; a = TREE_CHAIN (a))
829     {
830       const struct attribute_spec *as;
831       as = lookup_attribute_spec (TREE_PURPOSE (a));
832       if (!as || as->affects_type_identity == false)
833         continue;
834       if (is_first)
835        {
836          pp_c_ws_string (pp, "__attribute__");
837          pp_c_left_paren (pp);
838          pp_c_left_paren (pp);
839          is_first = false;
840        }
841       else
842        {
843          pp_separate_with (pp, ',');
844        }
845       pp_tree_identifier (pp, TREE_PURPOSE (a));
846       if (TREE_VALUE (a))
847        pp_c_call_argument_list (pp, TREE_VALUE (a));
848     }
849 
850   if (!is_first)
851     {
852       pp_c_right_paren (pp);
853       pp_c_right_paren (pp);
854       pp_c_whitespace (pp);
855     }
856 }
857 
858 /* function-definition:
859       declaration-specifiers declarator compound-statement  */
860 
861 void
862 pp_c_function_definition (c_pretty_printer *pp, tree t)
863 {
864   pp->declaration_specifiers (t);
865   pp->declarator (t);
866   pp_needs_newline (pp) = true;
867   pp->statement (DECL_SAVED_TREE (t));
868   pp_newline_and_flush (pp);
869 }
870 
871 
872 /* Expressions.  */
873 
874 /* Print out a c-char.  This is called solely for characters which are
875    in the *target* execution character set.  We ought to convert them
876    back to the *host* execution character set before printing, but we
877    have no way to do this at present.  A decent compromise is to print
878    all characters as if they were in the host execution character set,
879    and not attempt to recover any named escape characters, but render
880    all unprintables as octal escapes.  If the host and target character
881    sets are the same, this produces relatively readable output.  If they
882    are not the same, strings may appear as gibberish, but that's okay
883    (in fact, it may well be what the reader wants, e.g. if they are looking
884    to see if conversion to the target character set happened correctly).
885 
886    A special case: we need to prefix \, ", and ' with backslashes.  It is
887    correct to do so for the *host*'s \, ", and ', because the rest of the
888    file appears in the host character set.  */
889 
890 static void
891 pp_c_char (c_pretty_printer *pp, int c)
892 {
893   if (ISPRINT (c))
894     {
895       switch (c)
896 	{
897 	case '\\': pp_string (pp, "\\\\"); break;
898 	case '\'': pp_string (pp, "\\\'"); break;
899 	case '\"': pp_string (pp, "\\\""); break;
900 	default:   pp_character (pp, c);
901 	}
902     }
903   else
904     pp_scalar (pp, "\\%03o", (unsigned) c);
905 }
906 
907 /* Print out a STRING literal.  */
908 
909 void
910 pp_c_string_literal (c_pretty_printer *pp, tree s)
911 {
912   const char *p = TREE_STRING_POINTER (s);
913   int n = TREE_STRING_LENGTH (s) - 1;
914   int i;
915   pp_doublequote (pp);
916   for (i = 0; i < n; ++i)
917     pp_c_char (pp, p[i]);
918   pp_doublequote (pp);
919 }
920 
921 /* Pretty-print a VOID_CST (void_node).  */
922 
923 static void
924 pp_c_void_constant (c_pretty_printer *pp)
925 {
926   pp_c_type_cast (pp, void_type_node);
927   pp_string (pp, "0");
928 }
929 
930 /* Pretty-print an INTEGER literal.  */
931 
932 static void
933 pp_c_integer_constant (c_pretty_printer *pp, tree i)
934 {
935   int idx;
936 
937   /* We are going to compare the type of I to other types using
938      pointer comparison so we need to use its canonical type.  */
939   tree type =
940     TYPE_CANONICAL (TREE_TYPE (i))
941     ? TYPE_CANONICAL (TREE_TYPE (i))
942     : TREE_TYPE (i);
943 
944   if (tree_fits_shwi_p (i))
945     pp_wide_integer (pp, tree_to_shwi (i));
946   else if (tree_fits_uhwi_p (i))
947     pp_unsigned_wide_integer (pp, tree_to_uhwi (i));
948   else
949     {
950       wide_int wi = i;
951 
952       if (wi::lt_p (i, 0, TYPE_SIGN (TREE_TYPE (i))))
953 	{
954 	  pp_minus (pp);
955 	  wi = -wi;
956 	}
957       print_hex (wi, pp_buffer (pp)->digit_buffer);
958       pp_string (pp, pp_buffer (pp)->digit_buffer);
959     }
960   if (TYPE_UNSIGNED (type))
961     pp_character (pp, 'u');
962   if (type == long_integer_type_node || type == long_unsigned_type_node)
963     pp_character (pp, 'l');
964   else if (type == long_long_integer_type_node
965 	   || type == long_long_unsigned_type_node)
966     pp_string (pp, "ll");
967   else for (idx = 0; idx < NUM_INT_N_ENTS; idx ++)
968     if (int_n_enabled_p[idx])
969       {
970 	char buf[2+20];
971 	if (type == int_n_trees[idx].signed_type
972 	    || type == int_n_trees[idx].unsigned_type)
973 	  {
974 	    sprintf (buf, "I%d", int_n_data[idx].bitsize);
975 	    pp_string (pp, buf);
976 	  }
977       }
978 }
979 
980 /* Print out a CHARACTER literal.  */
981 
982 static void
983 pp_c_character_constant (c_pretty_printer *pp, tree c)
984 {
985   pp_quote (pp);
986   pp_c_char (pp, (unsigned) TREE_INT_CST_LOW (c));
987   pp_quote (pp);
988 }
989 
990 /* Print out a BOOLEAN literal.  */
991 
992 static void
993 pp_c_bool_constant (c_pretty_printer *pp, tree b)
994 {
995   if (b == boolean_false_node)
996     {
997       if (c_dialect_cxx ())
998 	pp_c_ws_string (pp, "false");
999       else if (flag_isoc99)
1000 	pp_c_ws_string (pp, "_False");
1001       else
1002 	pp_unsupported_tree (pp, b);
1003     }
1004   else if (b == boolean_true_node)
1005     {
1006       if (c_dialect_cxx ())
1007 	pp_c_ws_string (pp, "true");
1008       else if (flag_isoc99)
1009 	pp_c_ws_string (pp, "_True");
1010       else
1011 	pp_unsupported_tree (pp, b);
1012     }
1013   else if (TREE_CODE (b) == INTEGER_CST)
1014     pp_c_integer_constant (pp, b);
1015   else
1016     pp_unsupported_tree (pp, b);
1017 }
1018 
1019 /* Attempt to print out an ENUMERATOR.  Return true on success.  Else return
1020    false; that means the value was obtained by a cast, in which case
1021    print out the type-id part of the cast-expression -- the casted value
1022    is then printed by pp_c_integer_literal.  */
1023 
1024 static bool
1025 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
1026 {
1027   bool value_is_named = true;
1028   tree type = TREE_TYPE (e);
1029   tree value;
1030 
1031   /* Find the name of this constant.  */
1032   for (value = TYPE_VALUES (type);
1033        value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
1034        value = TREE_CHAIN (value))
1035     ;
1036 
1037   if (value != NULL_TREE)
1038     pp->id_expression (TREE_PURPOSE (value));
1039   else
1040     {
1041       /* Value must have been cast.  */
1042       pp_c_type_cast (pp, type);
1043       value_is_named = false;
1044     }
1045 
1046   return value_is_named;
1047 }
1048 
1049 /* Print out a REAL value as a decimal-floating-constant.  */
1050 
1051 static void
1052 pp_c_floating_constant (c_pretty_printer *pp, tree r)
1053 {
1054   const struct real_format *fmt
1055     = REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (r)));
1056 
1057   REAL_VALUE_TYPE floating_cst = TREE_REAL_CST (r);
1058   bool is_decimal = floating_cst.decimal;
1059 
1060   /* See ISO C++ WG N1822.  Note: The fraction 643/2136 approximates
1061      log10(2) to 7 significant digits.  */
1062   int max_digits10 = 2 + (is_decimal ? fmt->p : fmt->p * 643L / 2136);
1063 
1064   real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
1065 		   sizeof (pp_buffer (pp)->digit_buffer),
1066 		   max_digits10, 1);
1067 
1068   pp_string (pp, pp_buffer(pp)->digit_buffer);
1069   if (TREE_TYPE (r) == float_type_node)
1070     pp_character (pp, 'f');
1071   else if (TREE_TYPE (r) == long_double_type_node)
1072     pp_character (pp, 'l');
1073   else if (TREE_TYPE (r) == dfloat128_type_node)
1074     pp_string (pp, "dl");
1075   else if (TREE_TYPE (r) == dfloat64_type_node)
1076     pp_string (pp, "dd");
1077   else if (TREE_TYPE (r) == dfloat32_type_node)
1078     pp_string (pp, "df");
1079 }
1080 
1081 /* Print out a FIXED value as a decimal-floating-constant.  */
1082 
1083 static void
1084 pp_c_fixed_constant (c_pretty_printer *pp, tree r)
1085 {
1086   fixed_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_FIXED_CST (r),
1087 		   sizeof (pp_buffer (pp)->digit_buffer));
1088   pp_string (pp, pp_buffer(pp)->digit_buffer);
1089 }
1090 
1091 /* Pretty-print a compound literal expression.  GNU extensions include
1092    vector constants.  */
1093 
1094 static void
1095 pp_c_compound_literal (c_pretty_printer *pp, tree e)
1096 {
1097   tree type = TREE_TYPE (e);
1098   pp_c_type_cast (pp, type);
1099 
1100   switch (TREE_CODE (type))
1101     {
1102     case RECORD_TYPE:
1103     case UNION_TYPE:
1104     case ARRAY_TYPE:
1105     case VECTOR_TYPE:
1106     case COMPLEX_TYPE:
1107       pp_c_brace_enclosed_initializer_list (pp, e);
1108       break;
1109 
1110     default:
1111       pp_unsupported_tree (pp, e);
1112       break;
1113     }
1114 }
1115 
1116 /* Pretty-print a COMPLEX_EXPR expression.  */
1117 
1118 static void
1119 pp_c_complex_expr (c_pretty_printer *pp, tree e)
1120 {
1121   /* Handle a few common special cases, otherwise fallback
1122      to printing it as compound literal.  */
1123   tree type = TREE_TYPE (e);
1124   tree realexpr = TREE_OPERAND (e, 0);
1125   tree imagexpr = TREE_OPERAND (e, 1);
1126 
1127   /* Cast of an COMPLEX_TYPE expression to a different COMPLEX_TYPE.  */
1128   if (TREE_CODE (realexpr) == NOP_EXPR
1129       && TREE_CODE (imagexpr) == NOP_EXPR
1130       && TREE_TYPE (realexpr) == TREE_TYPE (type)
1131       && TREE_TYPE (imagexpr) == TREE_TYPE (type)
1132       && TREE_CODE (TREE_OPERAND (realexpr, 0)) == REALPART_EXPR
1133       && TREE_CODE (TREE_OPERAND (imagexpr, 0)) == IMAGPART_EXPR
1134       && TREE_OPERAND (TREE_OPERAND (realexpr, 0), 0)
1135 	 == TREE_OPERAND (TREE_OPERAND (imagexpr, 0), 0))
1136     {
1137       pp_c_type_cast (pp, type);
1138       pp->expression (TREE_OPERAND (TREE_OPERAND (realexpr, 0), 0));
1139       return;
1140     }
1141 
1142   /* Cast of an scalar expression to COMPLEX_TYPE.  */
1143   if ((integer_zerop (imagexpr) || real_zerop (imagexpr))
1144       && TREE_TYPE (realexpr) == TREE_TYPE (type))
1145     {
1146       pp_c_type_cast (pp, type);
1147       if (TREE_CODE (realexpr) == NOP_EXPR)
1148 	realexpr = TREE_OPERAND (realexpr, 0);
1149       pp->expression (realexpr);
1150       return;
1151     }
1152 
1153   pp_c_compound_literal (pp, e);
1154 }
1155 
1156 /* constant:
1157       integer-constant
1158       floating-constant
1159       fixed-point-constant
1160       enumeration-constant
1161       character-constant   */
1162 
1163 void
1164 c_pretty_printer::constant (tree e)
1165 {
1166   const enum tree_code code = TREE_CODE (e);
1167 
1168   switch (code)
1169     {
1170     case VOID_CST:
1171       pp_c_void_constant (this);
1172       break;
1173 
1174     case INTEGER_CST:
1175       {
1176 	tree type = TREE_TYPE (e);
1177 	if (type == boolean_type_node)
1178 	  pp_c_bool_constant (this, e);
1179 	else if (type == char_type_node)
1180 	  pp_c_character_constant (this, e);
1181 	else if (TREE_CODE (type) == ENUMERAL_TYPE
1182 		 && pp_c_enumeration_constant (this, e))
1183 	  ;
1184 	else
1185 	  pp_c_integer_constant (this, e);
1186       }
1187       break;
1188 
1189     case REAL_CST:
1190       pp_c_floating_constant (this, e);
1191       break;
1192 
1193     case FIXED_CST:
1194       pp_c_fixed_constant (this, e);
1195       break;
1196 
1197     case STRING_CST:
1198       pp_c_string_literal (this, e);
1199       break;
1200 
1201     case COMPLEX_CST:
1202       /* Sometimes, we are confused and we think a complex literal
1203          is a constant.  Such thing is a compound literal which
1204          grammatically belongs to postfix-expr production.  */
1205       pp_c_compound_literal (this, e);
1206       break;
1207 
1208     default:
1209       pp_unsupported_tree (this, e);
1210       break;
1211     }
1212 }
1213 
1214 /* Pretty-print a string such as an identifier, without changing its
1215    encoding, preceded by whitespace is necessary.  */
1216 
1217 void
1218 pp_c_ws_string (c_pretty_printer *pp, const char *str)
1219 {
1220   pp_c_maybe_whitespace (pp);
1221   pp_string (pp, str);
1222   pp->padding = pp_before;
1223 }
1224 
1225 void
1226 c_pretty_printer::translate_string (const char *gmsgid)
1227 {
1228   if (pp_translate_identifiers (this))
1229     pp_c_ws_string (this, _(gmsgid));
1230   else
1231     pp_c_ws_string (this, gmsgid);
1232 }
1233 
1234 /* Pretty-print an IDENTIFIER_NODE, which may contain UTF-8 sequences
1235    that need converting to the locale encoding, preceded by whitespace
1236    is necessary.  */
1237 
1238 void
1239 pp_c_identifier (c_pretty_printer *pp, const char *id)
1240 {
1241   pp_c_maybe_whitespace (pp);
1242   pp_identifier (pp, id);
1243   pp->padding = pp_before;
1244 }
1245 
1246 /* Pretty-print a C primary-expression.
1247    primary-expression:
1248       identifier
1249       constant
1250       string-literal
1251       ( expression )   */
1252 
1253 void
1254 c_pretty_printer::primary_expression (tree e)
1255 {
1256   switch (TREE_CODE (e))
1257     {
1258     case VAR_DECL:
1259     case PARM_DECL:
1260     case FIELD_DECL:
1261     case CONST_DECL:
1262     case FUNCTION_DECL:
1263     case LABEL_DECL:
1264       pp_c_tree_decl_identifier (this, e);
1265       break;
1266 
1267     case IDENTIFIER_NODE:
1268       pp_c_tree_identifier (this, e);
1269       break;
1270 
1271     case ERROR_MARK:
1272       translate_string ("<erroneous-expression>");
1273       break;
1274 
1275     case RESULT_DECL:
1276       translate_string ("<return-value>");
1277       break;
1278 
1279     case VOID_CST:
1280     case INTEGER_CST:
1281     case REAL_CST:
1282     case FIXED_CST:
1283     case STRING_CST:
1284       constant (e);
1285       break;
1286 
1287     case TARGET_EXPR:
1288       pp_c_ws_string (this, "__builtin_memcpy");
1289       pp_c_left_paren (this);
1290       pp_ampersand (this);
1291       primary_expression (TREE_OPERAND (e, 0));
1292       pp_separate_with (this, ',');
1293       pp_ampersand (this);
1294       initializer (TREE_OPERAND (e, 1));
1295       if (TREE_OPERAND (e, 2))
1296 	{
1297 	  pp_separate_with (this, ',');
1298 	  expression (TREE_OPERAND (e, 2));
1299 	}
1300       pp_c_right_paren (this);
1301       break;
1302 
1303     default:
1304       /* FIXME:  Make sure we won't get into an infinite loop.  */
1305       pp_c_left_paren (this);
1306       expression (e);
1307       pp_c_right_paren (this);
1308       break;
1309     }
1310 }
1311 
1312 /* Print out a C initializer -- also support C compound-literals.
1313    initializer:
1314       assignment-expression:
1315       { initializer-list }
1316       { initializer-list , }   */
1317 
1318 void
1319 c_pretty_printer::initializer (tree e)
1320 {
1321   if (TREE_CODE (e) == CONSTRUCTOR)
1322     pp_c_brace_enclosed_initializer_list (this, e);
1323   else
1324     expression (e);
1325 }
1326 
1327 /* init-declarator:
1328       declarator:
1329       declarator = initializer   */
1330 
1331 void
1332 pp_c_init_declarator (c_pretty_printer *pp, tree t)
1333 {
1334   pp->declarator (t);
1335   /* We don't want to output function definitions here.  There are handled
1336      elsewhere (and the syntactic form is bogus anyway).  */
1337   if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
1338     {
1339       tree init = DECL_INITIAL (t);
1340       /* This C++ bit is handled here because it is easier to do so.
1341 	 In templates, the C++ parser builds a TREE_LIST for a
1342 	 direct-initialization; the TREE_PURPOSE is the variable to
1343 	 initialize and the TREE_VALUE is the initializer.  */
1344       if (TREE_CODE (init) == TREE_LIST)
1345 	{
1346 	  pp_c_left_paren (pp);
1347 	  pp->expression (TREE_VALUE (init));
1348 	  pp_right_paren (pp);
1349 	}
1350       else
1351 	{
1352 	  pp_space (pp);
1353 	  pp_equal (pp);
1354 	  pp_space (pp);
1355 	  pp->initializer (init);
1356 	}
1357     }
1358 }
1359 
1360 /* initializer-list:
1361       designation(opt) initializer
1362       initializer-list , designation(opt) initializer
1363 
1364    designation:
1365       designator-list =
1366 
1367    designator-list:
1368       designator
1369       designator-list designator
1370 
1371    designator:
1372       [ constant-expression ]
1373       identifier   */
1374 
1375 static void
1376 pp_c_initializer_list (c_pretty_printer *pp, tree e)
1377 {
1378   tree type = TREE_TYPE (e);
1379   const enum tree_code code = TREE_CODE (type);
1380 
1381   if (TREE_CODE (e) == CONSTRUCTOR)
1382     {
1383       pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
1384       return;
1385     }
1386 
1387   switch (code)
1388     {
1389     case RECORD_TYPE:
1390     case UNION_TYPE:
1391     case ARRAY_TYPE:
1392       {
1393 	tree init = TREE_OPERAND (e, 0);
1394 	for (; init != NULL_TREE; init = TREE_CHAIN (init))
1395 	  {
1396 	    if (code == RECORD_TYPE || code == UNION_TYPE)
1397 	      {
1398 		pp_c_dot (pp);
1399 		pp->primary_expression (TREE_PURPOSE (init));
1400 	      }
1401 	    else
1402 	      {
1403 		pp_c_left_bracket (pp);
1404 		if (TREE_PURPOSE (init))
1405 		  pp->constant (TREE_PURPOSE (init));
1406 		pp_c_right_bracket (pp);
1407 	      }
1408 	    pp_c_whitespace (pp);
1409 	    pp_equal (pp);
1410 	    pp_c_whitespace (pp);
1411 	    pp->initializer (TREE_VALUE (init));
1412 	    if (TREE_CHAIN (init))
1413 	      pp_separate_with (pp, ',');
1414 	  }
1415       }
1416       return;
1417 
1418     case VECTOR_TYPE:
1419       if (TREE_CODE (e) == VECTOR_CST)
1420 	{
1421 	  unsigned i;
1422 	  for (i = 0; i < VECTOR_CST_NELTS (e); ++i)
1423 	    {
1424 	      if (i > 0)
1425 		pp_separate_with (pp, ',');
1426 	      pp->expression (VECTOR_CST_ELT (e, i));
1427 	    }
1428 	}
1429       else
1430 	break;
1431       return;
1432 
1433     case COMPLEX_TYPE:
1434       if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
1435 	{
1436 	  const bool cst = TREE_CODE (e) == COMPLEX_CST;
1437 	  pp->expression (cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
1438 	  pp_separate_with (pp, ',');
1439 	  pp->expression (cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
1440 	}
1441       else
1442 	break;
1443       return;
1444 
1445     default:
1446       break;
1447     }
1448 
1449   pp_unsupported_tree (pp, type);
1450 }
1451 
1452 /* Pretty-print a brace-enclosed initializer-list.  */
1453 
1454 static void
1455 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
1456 {
1457   pp_c_left_brace (pp);
1458   pp_c_initializer_list (pp, l);
1459   pp_c_right_brace (pp);
1460 }
1461 
1462 
1463 /*  This is a convenient function, used to bridge gap between C and C++
1464     grammars.
1465 
1466     id-expression:
1467        identifier  */
1468 
1469 void
1470 c_pretty_printer::id_expression (tree t)
1471 {
1472   switch (TREE_CODE (t))
1473     {
1474     case VAR_DECL:
1475     case PARM_DECL:
1476     case CONST_DECL:
1477     case TYPE_DECL:
1478     case FUNCTION_DECL:
1479     case FIELD_DECL:
1480     case LABEL_DECL:
1481       pp_c_tree_decl_identifier (this, t);
1482       break;
1483 
1484     case IDENTIFIER_NODE:
1485       pp_c_tree_identifier (this, t);
1486       break;
1487 
1488     default:
1489       pp_unsupported_tree (this, t);
1490       break;
1491     }
1492 }
1493 
1494 /* postfix-expression:
1495       primary-expression
1496       postfix-expression [ expression ]
1497       postfix-expression ( argument-expression-list(opt) )
1498       postfix-expression . identifier
1499       postfix-expression -> identifier
1500       postfix-expression ++
1501       postfix-expression --
1502       ( type-name ) { initializer-list }
1503       ( type-name ) { initializer-list , }  */
1504 
1505 void
1506 c_pretty_printer::postfix_expression (tree e)
1507 {
1508   enum tree_code code = TREE_CODE (e);
1509   switch (code)
1510     {
1511     case POSTINCREMENT_EXPR:
1512     case POSTDECREMENT_EXPR:
1513       postfix_expression (TREE_OPERAND (e, 0));
1514       pp_string (this, code == POSTINCREMENT_EXPR ? "++" : "--");
1515       break;
1516 
1517     case ARRAY_REF:
1518       postfix_expression (TREE_OPERAND (e, 0));
1519       pp_c_left_bracket (this);
1520       expression (TREE_OPERAND (e, 1));
1521       pp_c_right_bracket (this);
1522       break;
1523 
1524     case ARRAY_NOTATION_REF:
1525       postfix_expression (ARRAY_NOTATION_ARRAY (e));
1526       pp_c_left_bracket (this);
1527       expression (ARRAY_NOTATION_START (e));
1528       pp_colon (this);
1529       expression (ARRAY_NOTATION_LENGTH (e));
1530       pp_colon (this);
1531       expression (ARRAY_NOTATION_STRIDE (e));
1532       pp_c_right_bracket (this);
1533       break;
1534 
1535     case CALL_EXPR:
1536       {
1537 	call_expr_arg_iterator iter;
1538 	tree arg;
1539 	postfix_expression (CALL_EXPR_FN (e));
1540 	pp_c_left_paren (this);
1541 	FOR_EACH_CALL_EXPR_ARG (arg, iter, e)
1542 	  {
1543 	    expression (arg);
1544 	    if (more_call_expr_args_p (&iter))
1545 	      pp_separate_with (this, ',');
1546 	  }
1547 	pp_c_right_paren (this);
1548 	break;
1549       }
1550 
1551     case UNORDERED_EXPR:
1552       pp_c_ws_string (this, flag_isoc99
1553 			   ? "isunordered"
1554 			   : "__builtin_isunordered");
1555       goto two_args_fun;
1556 
1557     case ORDERED_EXPR:
1558       pp_c_ws_string (this, flag_isoc99
1559 			   ? "!isunordered"
1560 			   : "!__builtin_isunordered");
1561       goto two_args_fun;
1562 
1563     case UNLT_EXPR:
1564       pp_c_ws_string (this, flag_isoc99
1565 			   ? "!isgreaterequal"
1566 			   : "!__builtin_isgreaterequal");
1567       goto two_args_fun;
1568 
1569     case UNLE_EXPR:
1570       pp_c_ws_string (this, flag_isoc99
1571 			   ? "!isgreater"
1572 			   : "!__builtin_isgreater");
1573       goto two_args_fun;
1574 
1575     case UNGT_EXPR:
1576       pp_c_ws_string (this, flag_isoc99
1577 			   ? "!islessequal"
1578 			   : "!__builtin_islessequal");
1579       goto two_args_fun;
1580 
1581     case UNGE_EXPR:
1582       pp_c_ws_string (this, flag_isoc99
1583 			   ? "!isless"
1584 			   : "!__builtin_isless");
1585       goto two_args_fun;
1586 
1587     case UNEQ_EXPR:
1588       pp_c_ws_string (this, flag_isoc99
1589 			   ? "!islessgreater"
1590 			   : "!__builtin_islessgreater");
1591       goto two_args_fun;
1592 
1593     case LTGT_EXPR:
1594       pp_c_ws_string (this, flag_isoc99
1595 			   ? "islessgreater"
1596 			   : "__builtin_islessgreater");
1597       goto two_args_fun;
1598 
1599     two_args_fun:
1600       pp_c_left_paren (this);
1601       expression (TREE_OPERAND (e, 0));
1602       pp_separate_with (this, ',');
1603       expression (TREE_OPERAND (e, 1));
1604       pp_c_right_paren (this);
1605       break;
1606 
1607     case ABS_EXPR:
1608       pp_c_ws_string (this, "__builtin_abs");
1609       pp_c_left_paren (this);
1610       expression (TREE_OPERAND (e, 0));
1611       pp_c_right_paren (this);
1612       break;
1613 
1614     case COMPONENT_REF:
1615       {
1616 	tree object = TREE_OPERAND (e, 0);
1617 	if (TREE_CODE (object) == INDIRECT_REF)
1618 	  {
1619 	    postfix_expression (TREE_OPERAND (object, 0));
1620 	    pp_c_arrow (this);
1621 	  }
1622 	else
1623 	  {
1624 	    postfix_expression (object);
1625 	    pp_c_dot (this);
1626 	  }
1627 	expression (TREE_OPERAND (e, 1));
1628       }
1629       break;
1630 
1631     case BIT_FIELD_REF:
1632       {
1633 	tree type = TREE_TYPE (e);
1634 
1635 	type = signed_or_unsigned_type_for (TYPE_UNSIGNED (type), type);
1636 	if (type
1637 	    && tree_int_cst_equal (TYPE_SIZE (type), TREE_OPERAND (e, 1)))
1638 	  {
1639 	    HOST_WIDE_INT bitpos = tree_to_shwi (TREE_OPERAND (e, 2));
1640 	    HOST_WIDE_INT size = tree_to_shwi (TYPE_SIZE (type));
1641 	    if ((bitpos % size) == 0)
1642 	      {
1643 		pp_c_left_paren (this);
1644 		pp_c_left_paren (this);
1645 		type_id (type);
1646 		pp_c_star (this);
1647 		pp_c_right_paren (this);
1648 		pp_c_ampersand (this);
1649 		expression (TREE_OPERAND (e, 0));
1650 		pp_c_right_paren (this);
1651 		pp_c_left_bracket (this);
1652 		pp_wide_integer (this, bitpos / size);
1653 		pp_c_right_bracket (this);
1654 		break;
1655 	      }
1656 	  }
1657 	pp_unsupported_tree (this, e);
1658       }
1659       break;
1660 
1661     case MEM_REF:
1662       expression (e);
1663       break;
1664 
1665     case COMPLEX_CST:
1666     case VECTOR_CST:
1667       pp_c_compound_literal (this, e);
1668       break;
1669 
1670     case COMPLEX_EXPR:
1671       pp_c_complex_expr (this, e);
1672       break;
1673 
1674     case COMPOUND_LITERAL_EXPR:
1675       e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
1676       /* Fall through.  */
1677     case CONSTRUCTOR:
1678       initializer (e);
1679       break;
1680 
1681     case VA_ARG_EXPR:
1682       pp_c_ws_string (this, "__builtin_va_arg");
1683       pp_c_left_paren (this);
1684       assignment_expression (TREE_OPERAND (e, 0));
1685       pp_separate_with (this, ',');
1686       type_id (TREE_TYPE (e));
1687       pp_c_right_paren (this);
1688       break;
1689 
1690     case ADDR_EXPR:
1691       if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
1692 	{
1693           id_expression (TREE_OPERAND (e, 0));
1694 	  break;
1695 	}
1696       /* else fall through.  */
1697 
1698     default:
1699       primary_expression (e);
1700       break;
1701     }
1702 }
1703 
1704 /* Print out an expression-list; E is expected to be a TREE_LIST.  */
1705 
1706 void
1707 pp_c_expression_list (c_pretty_printer *pp, tree e)
1708 {
1709   for (; e != NULL_TREE; e = TREE_CHAIN (e))
1710     {
1711       pp->expression (TREE_VALUE (e));
1712       if (TREE_CHAIN (e))
1713 	pp_separate_with (pp, ',');
1714     }
1715 }
1716 
1717 /* Print out V, which contains the elements of a constructor.  */
1718 
1719 void
1720 pp_c_constructor_elts (c_pretty_printer *pp, vec<constructor_elt, va_gc> *v)
1721 {
1722   unsigned HOST_WIDE_INT ix;
1723   tree value;
1724 
1725   FOR_EACH_CONSTRUCTOR_VALUE (v, ix, value)
1726     {
1727       pp->expression (value);
1728       if (ix != vec_safe_length (v) - 1)
1729 	pp_separate_with (pp, ',');
1730     }
1731 }
1732 
1733 /* Print out an expression-list in parens, as if it were the argument
1734    list to a function.  */
1735 
1736 void
1737 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
1738 {
1739   pp_c_left_paren (pp);
1740   if (t && TREE_CODE (t) == TREE_LIST)
1741     pp_c_expression_list (pp, t);
1742   pp_c_right_paren (pp);
1743 }
1744 
1745 /* unary-expression:
1746       postfix-expression
1747       ++ cast-expression
1748       -- cast-expression
1749       unary-operator cast-expression
1750       sizeof unary-expression
1751       sizeof ( type-id )
1752 
1753   unary-operator: one of
1754       * &  + - ! ~
1755 
1756    GNU extensions.
1757    unary-expression:
1758       __alignof__ unary-expression
1759       __alignof__ ( type-id )
1760       __real__ unary-expression
1761       __imag__ unary-expression  */
1762 
1763 void
1764 c_pretty_printer::unary_expression (tree e)
1765 {
1766   enum tree_code code = TREE_CODE (e);
1767   switch (code)
1768     {
1769     case PREINCREMENT_EXPR:
1770     case PREDECREMENT_EXPR:
1771       pp_string (this, code == PREINCREMENT_EXPR ? "++" : "--");
1772       unary_expression (TREE_OPERAND (e, 0));
1773       break;
1774 
1775     case ADDR_EXPR:
1776     case INDIRECT_REF:
1777     case NEGATE_EXPR:
1778     case BIT_NOT_EXPR:
1779     case TRUTH_NOT_EXPR:
1780     case CONJ_EXPR:
1781       /* String literal are used by address.  */
1782       if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
1783 	pp_ampersand (this);
1784       else if (code == INDIRECT_REF)
1785 	pp_c_star (this);
1786       else if (code == NEGATE_EXPR)
1787 	pp_minus (this);
1788       else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
1789 	pp_complement (this);
1790       else if (code == TRUTH_NOT_EXPR)
1791 	pp_exclamation (this);
1792       pp_c_cast_expression (this, TREE_OPERAND (e, 0));
1793       break;
1794 
1795     case MEM_REF:
1796       if (TREE_CODE (TREE_OPERAND (e, 0)) == ADDR_EXPR
1797 	  && integer_zerop (TREE_OPERAND (e, 1)))
1798 	expression (TREE_OPERAND (TREE_OPERAND (e, 0), 0));
1799       else
1800 	{
1801 	  pp_c_star (this);
1802 	  if (!integer_zerop (TREE_OPERAND (e, 1)))
1803 	    {
1804 	      pp_c_left_paren (this);
1805 	      if (!integer_onep (TYPE_SIZE_UNIT
1806 				 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (e, 0))))))
1807 		pp_c_type_cast (this, ptr_type_node);
1808 	    }
1809 	  pp_c_cast_expression (this, TREE_OPERAND (e, 0));
1810 	  if (!integer_zerop (TREE_OPERAND (e, 1)))
1811 	    {
1812 	      pp_plus (this);
1813 	      pp_c_integer_constant (this,
1814 				     fold_convert (ssizetype,
1815 						   TREE_OPERAND (e, 1)));
1816 	      pp_c_right_paren (this);
1817 	    }
1818 	}
1819       break;
1820 
1821     case REALPART_EXPR:
1822     case IMAGPART_EXPR:
1823       pp_c_ws_string (this, code == REALPART_EXPR ? "__real__" : "__imag__");
1824       pp_c_whitespace (this);
1825       unary_expression (TREE_OPERAND (e, 0));
1826       break;
1827 
1828     default:
1829       postfix_expression (e);
1830       break;
1831     }
1832 }
1833 
1834 /* cast-expression:
1835       unary-expression
1836       ( type-name ) cast-expression  */
1837 
1838 void
1839 pp_c_cast_expression (c_pretty_printer *pp, tree e)
1840 {
1841   switch (TREE_CODE (e))
1842     {
1843     case FLOAT_EXPR:
1844     case FIX_TRUNC_EXPR:
1845     CASE_CONVERT:
1846     case VIEW_CONVERT_EXPR:
1847       pp_c_type_cast (pp, TREE_TYPE (e));
1848       pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1849       break;
1850 
1851     default:
1852       pp->unary_expression (e);
1853     }
1854 }
1855 
1856 /* multiplicative-expression:
1857       cast-expression
1858       multiplicative-expression * cast-expression
1859       multiplicative-expression / cast-expression
1860       multiplicative-expression % cast-expression   */
1861 
1862 void
1863 c_pretty_printer::multiplicative_expression (tree e)
1864 {
1865   enum tree_code code = TREE_CODE (e);
1866   switch (code)
1867     {
1868     case MULT_EXPR:
1869     case TRUNC_DIV_EXPR:
1870     case TRUNC_MOD_EXPR:
1871       multiplicative_expression (TREE_OPERAND (e, 0));
1872       pp_c_whitespace (this);
1873       if (code == MULT_EXPR)
1874 	pp_c_star (this);
1875       else if (code == TRUNC_DIV_EXPR)
1876 	pp_slash (this);
1877       else
1878 	pp_modulo (this);
1879       pp_c_whitespace (this);
1880       pp_c_cast_expression (this, TREE_OPERAND (e, 1));
1881       break;
1882 
1883     default:
1884       pp_c_cast_expression (this, e);
1885       break;
1886     }
1887 }
1888 
1889 /* additive-expression:
1890       multiplicative-expression
1891       additive-expression + multiplicative-expression
1892       additive-expression - multiplicative-expression   */
1893 
1894 static void
1895 pp_c_additive_expression (c_pretty_printer *pp, tree e)
1896 {
1897   enum tree_code code = TREE_CODE (e);
1898   switch (code)
1899     {
1900     case POINTER_PLUS_EXPR:
1901     case PLUS_EXPR:
1902     case MINUS_EXPR:
1903       pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
1904       pp_c_whitespace (pp);
1905       if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
1906 	pp_plus (pp);
1907       else
1908 	pp_minus (pp);
1909       pp_c_whitespace (pp);
1910       pp->multiplicative_expression (TREE_OPERAND (e, 1));
1911       break;
1912 
1913     default:
1914       pp->multiplicative_expression (e);
1915       break;
1916     }
1917 }
1918 
1919 /* additive-expression:
1920       additive-expression
1921       shift-expression << additive-expression
1922       shift-expression >> additive-expression   */
1923 
1924 static void
1925 pp_c_shift_expression (c_pretty_printer *pp, tree e)
1926 {
1927   enum tree_code code = TREE_CODE (e);
1928   switch (code)
1929     {
1930     case LSHIFT_EXPR:
1931     case RSHIFT_EXPR:
1932       pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
1933       pp_c_whitespace (pp);
1934       pp_string (pp, code == LSHIFT_EXPR ? "<<" : ">>");
1935       pp_c_whitespace (pp);
1936       pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
1937       break;
1938 
1939     default:
1940       pp_c_additive_expression (pp, e);
1941     }
1942 }
1943 
1944 /* relational-expression:
1945       shift-expression
1946       relational-expression < shift-expression
1947       relational-expression > shift-expression
1948       relational-expression <= shift-expression
1949       relational-expression >= shift-expression   */
1950 
1951 static void
1952 pp_c_relational_expression (c_pretty_printer *pp, tree e)
1953 {
1954   enum tree_code code = TREE_CODE (e);
1955   switch (code)
1956     {
1957     case LT_EXPR:
1958     case GT_EXPR:
1959     case LE_EXPR:
1960     case GE_EXPR:
1961       pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
1962       pp_c_whitespace (pp);
1963       if (code == LT_EXPR)
1964 	pp_less (pp);
1965       else if (code == GT_EXPR)
1966 	pp_greater (pp);
1967       else if (code == LE_EXPR)
1968 	pp_less_equal (pp);
1969       else if (code == GE_EXPR)
1970 	pp_greater_equal (pp);
1971       pp_c_whitespace (pp);
1972       pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
1973       break;
1974 
1975     default:
1976       pp_c_shift_expression (pp, e);
1977       break;
1978     }
1979 }
1980 
1981 /* equality-expression:
1982       relational-expression
1983       equality-expression == relational-expression
1984       equality-equality != relational-expression  */
1985 
1986 static void
1987 pp_c_equality_expression (c_pretty_printer *pp, tree e)
1988 {
1989   enum tree_code code = TREE_CODE (e);
1990   switch (code)
1991     {
1992     case EQ_EXPR:
1993     case NE_EXPR:
1994       pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
1995       pp_c_whitespace (pp);
1996       pp_string (pp, code == EQ_EXPR ? "==" : "!=");
1997       pp_c_whitespace (pp);
1998       pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
1999       break;
2000 
2001     default:
2002       pp_c_relational_expression (pp, e);
2003       break;
2004     }
2005 }
2006 
2007 /* AND-expression:
2008       equality-expression
2009       AND-expression & equality-equality   */
2010 
2011 static void
2012 pp_c_and_expression (c_pretty_printer *pp, tree e)
2013 {
2014   if (TREE_CODE (e) == BIT_AND_EXPR)
2015     {
2016       pp_c_and_expression (pp, TREE_OPERAND (e, 0));
2017       pp_c_whitespace (pp);
2018       pp_ampersand (pp);
2019       pp_c_whitespace (pp);
2020       pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
2021     }
2022   else
2023     pp_c_equality_expression (pp, e);
2024 }
2025 
2026 /* exclusive-OR-expression:
2027      AND-expression
2028      exclusive-OR-expression ^ AND-expression  */
2029 
2030 static void
2031 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
2032 {
2033   if (TREE_CODE (e) == BIT_XOR_EXPR
2034       || TREE_CODE (e) == TRUTH_XOR_EXPR)
2035     {
2036       pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
2037       if (TREE_CODE (e) == BIT_XOR_EXPR)
2038 	pp_c_maybe_whitespace (pp);
2039       else
2040 	pp_c_whitespace (pp);
2041       pp_carret (pp);
2042       pp_c_whitespace (pp);
2043       pp_c_and_expression (pp, TREE_OPERAND (e, 1));
2044     }
2045   else
2046     pp_c_and_expression (pp, e);
2047 }
2048 
2049 /* inclusive-OR-expression:
2050      exclusive-OR-expression
2051      inclusive-OR-expression | exclusive-OR-expression  */
2052 
2053 static void
2054 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
2055 {
2056   if (TREE_CODE (e) == BIT_IOR_EXPR)
2057     {
2058       pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
2059       pp_c_whitespace (pp);
2060       pp_bar (pp);
2061       pp_c_whitespace (pp);
2062       pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
2063     }
2064   else
2065     pp_c_exclusive_or_expression (pp, e);
2066 }
2067 
2068 /* logical-AND-expression:
2069       inclusive-OR-expression
2070       logical-AND-expression && inclusive-OR-expression  */
2071 
2072 static void
2073 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
2074 {
2075   if (TREE_CODE (e) == TRUTH_ANDIF_EXPR
2076       || TREE_CODE (e) == TRUTH_AND_EXPR)
2077     {
2078       pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
2079       pp_c_whitespace (pp);
2080       pp_ampersand_ampersand (pp);
2081       pp_c_whitespace (pp);
2082       pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
2083     }
2084   else
2085     pp_c_inclusive_or_expression (pp, e);
2086 }
2087 
2088 /* logical-OR-expression:
2089       logical-AND-expression
2090       logical-OR-expression || logical-AND-expression  */
2091 
2092 void
2093 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
2094 {
2095   if (TREE_CODE (e) == TRUTH_ORIF_EXPR
2096       || TREE_CODE (e) == TRUTH_OR_EXPR)
2097     {
2098       pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
2099       pp_c_whitespace (pp);
2100       pp_bar_bar (pp);
2101       pp_c_whitespace (pp);
2102       pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
2103     }
2104   else
2105     pp_c_logical_and_expression (pp, e);
2106 }
2107 
2108 /* conditional-expression:
2109       logical-OR-expression
2110       logical-OR-expression ? expression : conditional-expression  */
2111 
2112 void
2113 c_pretty_printer::conditional_expression (tree e)
2114 {
2115   if (TREE_CODE (e) == COND_EXPR)
2116     {
2117       pp_c_logical_or_expression (this, TREE_OPERAND (e, 0));
2118       pp_c_whitespace (this);
2119       pp_question (this);
2120       pp_c_whitespace (this);
2121       expression (TREE_OPERAND (e, 1));
2122       pp_c_whitespace (this);
2123       pp_colon (this);
2124       pp_c_whitespace (this);
2125       conditional_expression (TREE_OPERAND (e, 2));
2126     }
2127   else
2128     pp_c_logical_or_expression (this, e);
2129 }
2130 
2131 
2132 /* assignment-expression:
2133       conditional-expression
2134       unary-expression assignment-operator  assignment-expression
2135 
2136    assignment-expression: one of
2137       =    *=    /=    %=    +=    -=    >>=    <<=    &=    ^=    |=  */
2138 
2139 void
2140 c_pretty_printer::assignment_expression (tree e)
2141 {
2142   if (TREE_CODE (e) == MODIFY_EXPR
2143       || TREE_CODE (e) == INIT_EXPR)
2144     {
2145       unary_expression (TREE_OPERAND (e, 0));
2146       pp_c_whitespace (this);
2147       pp_equal (this);
2148       pp_space (this);
2149       expression (TREE_OPERAND (e, 1));
2150     }
2151   else
2152     conditional_expression (e);
2153 }
2154 
2155 /* expression:
2156        assignment-expression
2157        expression , assignment-expression
2158 
2159   Implementation note:  instead of going through the usual recursion
2160   chain, I take the liberty of dispatching nodes to the appropriate
2161   functions.  This makes some redundancy, but it worths it. That also
2162   prevents a possible infinite recursion between primary_expression ()
2163   and expression ().  */
2164 
2165 void
2166 c_pretty_printer::expression (tree e)
2167 {
2168   switch (TREE_CODE (e))
2169     {
2170     case VOID_CST:
2171       pp_c_void_constant (this);
2172       break;
2173 
2174     case INTEGER_CST:
2175       pp_c_integer_constant (this, e);
2176       break;
2177 
2178     case REAL_CST:
2179       pp_c_floating_constant (this, e);
2180       break;
2181 
2182     case FIXED_CST:
2183       pp_c_fixed_constant (this, e);
2184       break;
2185 
2186     case STRING_CST:
2187       pp_c_string_literal (this, e);
2188       break;
2189 
2190     case IDENTIFIER_NODE:
2191     case FUNCTION_DECL:
2192     case VAR_DECL:
2193     case CONST_DECL:
2194     case PARM_DECL:
2195     case RESULT_DECL:
2196     case FIELD_DECL:
2197     case LABEL_DECL:
2198     case ERROR_MARK:
2199       primary_expression (e);
2200       break;
2201 
2202     case SSA_NAME:
2203       if (SSA_NAME_VAR (e)
2204 	  && !DECL_ARTIFICIAL (SSA_NAME_VAR (e)))
2205 	expression (SSA_NAME_VAR (e));
2206       else
2207 	translate_string ("<unknown>");
2208       break;
2209 
2210     case POSTINCREMENT_EXPR:
2211     case POSTDECREMENT_EXPR:
2212     case ARRAY_REF:
2213     case ARRAY_NOTATION_REF:
2214     case CALL_EXPR:
2215     case COMPONENT_REF:
2216     case BIT_FIELD_REF:
2217     case COMPLEX_CST:
2218     case COMPLEX_EXPR:
2219     case VECTOR_CST:
2220     case ORDERED_EXPR:
2221     case UNORDERED_EXPR:
2222     case LTGT_EXPR:
2223     case UNEQ_EXPR:
2224     case UNLE_EXPR:
2225     case UNLT_EXPR:
2226     case UNGE_EXPR:
2227     case UNGT_EXPR:
2228     case ABS_EXPR:
2229     case CONSTRUCTOR:
2230     case COMPOUND_LITERAL_EXPR:
2231     case VA_ARG_EXPR:
2232       postfix_expression (e);
2233       break;
2234 
2235     case CONJ_EXPR:
2236     case ADDR_EXPR:
2237     case INDIRECT_REF:
2238     case MEM_REF:
2239     case NEGATE_EXPR:
2240     case BIT_NOT_EXPR:
2241     case TRUTH_NOT_EXPR:
2242     case PREINCREMENT_EXPR:
2243     case PREDECREMENT_EXPR:
2244     case REALPART_EXPR:
2245     case IMAGPART_EXPR:
2246       unary_expression (e);
2247       break;
2248 
2249     case FLOAT_EXPR:
2250     case FIX_TRUNC_EXPR:
2251     CASE_CONVERT:
2252     case VIEW_CONVERT_EXPR:
2253       pp_c_cast_expression (this, e);
2254       break;
2255 
2256     case MULT_EXPR:
2257     case TRUNC_MOD_EXPR:
2258     case TRUNC_DIV_EXPR:
2259       multiplicative_expression (e);
2260       break;
2261 
2262     case LSHIFT_EXPR:
2263     case RSHIFT_EXPR:
2264       pp_c_shift_expression (this, e);
2265       break;
2266 
2267     case LT_EXPR:
2268     case GT_EXPR:
2269     case LE_EXPR:
2270     case GE_EXPR:
2271       pp_c_relational_expression (this, e);
2272       break;
2273 
2274     case BIT_AND_EXPR:
2275       pp_c_and_expression (this, e);
2276       break;
2277 
2278     case BIT_XOR_EXPR:
2279     case TRUTH_XOR_EXPR:
2280       pp_c_exclusive_or_expression (this, e);
2281       break;
2282 
2283     case BIT_IOR_EXPR:
2284       pp_c_inclusive_or_expression (this, e);
2285       break;
2286 
2287     case TRUTH_ANDIF_EXPR:
2288     case TRUTH_AND_EXPR:
2289       pp_c_logical_and_expression (this, e);
2290       break;
2291 
2292     case TRUTH_ORIF_EXPR:
2293     case TRUTH_OR_EXPR:
2294       pp_c_logical_or_expression (this, e);
2295       break;
2296 
2297     case EQ_EXPR:
2298     case NE_EXPR:
2299       pp_c_equality_expression (this, e);
2300       break;
2301 
2302     case COND_EXPR:
2303       conditional_expression (e);
2304       break;
2305 
2306     case POINTER_PLUS_EXPR:
2307     case PLUS_EXPR:
2308     case MINUS_EXPR:
2309       pp_c_additive_expression (this, e);
2310       break;
2311 
2312     case MODIFY_EXPR:
2313     case INIT_EXPR:
2314       assignment_expression (e);
2315       break;
2316 
2317     case COMPOUND_EXPR:
2318       pp_c_left_paren (this);
2319       expression (TREE_OPERAND (e, 0));
2320       pp_separate_with (this, ',');
2321       assignment_expression (TREE_OPERAND (e, 1));
2322       pp_c_right_paren (this);
2323       break;
2324 
2325     case NON_LVALUE_EXPR:
2326     case SAVE_EXPR:
2327       expression (TREE_OPERAND (e, 0));
2328       break;
2329 
2330     case TARGET_EXPR:
2331       postfix_expression (TREE_OPERAND (e, 1));
2332       break;
2333 
2334     case BIND_EXPR:
2335     case GOTO_EXPR:
2336       /* We don't yet have a way of dumping statements in a
2337          human-readable format.  */
2338       pp_string (this, "({...})");
2339       break;
2340 
2341     case C_MAYBE_CONST_EXPR:
2342       expression (C_MAYBE_CONST_EXPR_EXPR (e));
2343       break;
2344 
2345     default:
2346       pp_unsupported_tree (this, e);
2347       break;
2348     }
2349 }
2350 
2351 
2352 
2353 /* Statements.  */
2354 
2355 void
2356 c_pretty_printer::statement (tree stmt)
2357 {
2358   if (stmt == NULL)
2359     return;
2360 
2361   if (pp_needs_newline (this))
2362     pp_newline_and_indent (this, 0);
2363 
2364   dump_generic_node (this, stmt, pp_indentation (this), 0, true);
2365 }
2366 
2367 
2368 /* Initialize the PRETTY-PRINTER for handling C codes.  */
2369 
2370 c_pretty_printer::c_pretty_printer ()
2371   : pretty_printer (),
2372     offset_list (),
2373     flags ()
2374 {
2375   type_specifier_seq        = pp_c_specifier_qualifier_list;
2376   ptr_operator              = pp_c_pointer;
2377   parameter_list            = pp_c_parameter_type_list;
2378 }
2379 
2380 
2381 /* Print the tree T in full, on file FILE.  */
2382 
2383 void
2384 print_c_tree (FILE *file, tree t)
2385 {
2386   c_pretty_printer pp;
2387 
2388   pp_needs_newline (&pp) = true;
2389   pp.buffer->stream = file;
2390   pp.statement (t);
2391   pp_newline_and_flush (&pp);
2392 }
2393 
2394 /* Print the tree T in full, on stderr.  */
2395 
2396 DEBUG_FUNCTION void
2397 debug_c_tree (tree t)
2398 {
2399   print_c_tree (stderr, t);
2400   fputc ('\n', stderr);
2401 }
2402 
2403 /* Output the DECL_NAME of T.  If T has no DECL_NAME, output a string made
2404    up of T's memory address.  */
2405 
2406 void
2407 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
2408 {
2409   const char *name;
2410 
2411   gcc_assert (DECL_P (t));
2412 
2413   if (DECL_NAME (t))
2414     name = IDENTIFIER_POINTER (DECL_NAME (t));
2415   else
2416     {
2417       static char xname[8];
2418       sprintf (xname, "<U%4x>", ((unsigned)((uintptr_t)(t) & 0xffff)));
2419       name = xname;
2420     }
2421 
2422   pp_c_identifier (pp, name);
2423 }
2424