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