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