OSDN Git Service

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