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