2002-07-30 Gabriel Dos Reis <gdr@nerim.net>
[official-gcc.git] / gcc / c-pretty-print.c
blob20a8003777618d0725719fda27d78764e8dfd787
1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002 Free Software Foundation, Inc.
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
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.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "real.h"
25 #include "c-pretty-print.h"
27 /* literal */
28 static void pp_c_char PARAMS ((c_pretty_print_info *, int));
29 static void pp_c_character_literal PARAMS ((c_pretty_print_info *, tree));
30 static void pp_c_bool_literal PARAMS ((c_pretty_print_info *, tree));
31 static bool pp_c_enumerator PARAMS ((c_pretty_print_info *, tree));
32 static void pp_c_integer_literal PARAMS ((c_pretty_print_info *, tree));
33 static void pp_c_real_literal PARAMS ((c_pretty_print_info *, tree));
34 static void pp_c_string_literal PARAMS ((c_pretty_print_info *, tree));
36 static void pp_c_primary_expression PARAMS ((c_pretty_print_info *, tree));
38 /* postfix-expression */
39 static void pp_c_initializer_list PARAMS ((c_pretty_print_info *, tree));
41 static void pp_c_unary_expression PARAMS ((c_pretty_print_info *, tree));
42 static void pp_c_multiplicative_expression PARAMS ((c_pretty_print_info *,
43 tree));
44 static void pp_c_additive_expression PARAMS ((c_pretty_print_info *, tree));
45 static void pp_c_shift_expression PARAMS ((c_pretty_print_info *, tree));
46 static void pp_c_relational_expression PARAMS ((c_pretty_print_info *, tree));
47 static void pp_c_equality_expression PARAMS ((c_pretty_print_info *, tree));
48 static void pp_c_and_expression PARAMS ((c_pretty_print_info *, tree));
49 static void pp_c_exclusive_or_expression PARAMS ((c_pretty_print_info *,
50 tree));
51 static void pp_c_inclusive_or_expression PARAMS ((c_pretty_print_info *,
52 tree));
53 static void pp_c_logical_and_expression PARAMS ((c_pretty_print_info *, tree));
54 static void pp_c_conditional_expression PARAMS ((c_pretty_print_info *, tree));
55 static void pp_c_assignment_expression PARAMS ((c_pretty_print_info *, tree));
57 /* Declarations. */
59 /* Print out CV-qualifiers. Take care of possible extension. */
60 void
61 pp_c_cv_qualifier (ppi, cv)
62 c_pretty_print_info *ppi;
63 int cv;
65 if (cv & TYPE_QUAL_CONST)
66 pp_c_identifier (ppi, "const");
67 if (cv & TYPE_QUAL_VOLATILE)
68 pp_c_identifier (ppi, "volatile");
69 if (cv & TYPE_QUAL_RESTRICT)
70 pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
74 /* Statements. */
77 /* Expressions. */
79 /* Print out a c-char. */
80 static void
81 pp_c_char (ppi, c)
82 c_pretty_print_info *ppi;
83 int c;
85 switch (c)
87 case TARGET_NEWLINE:
88 pp_identifier (ppi, "\\n");
89 break;
90 case TARGET_TAB:
91 pp_identifier (ppi, "\\t");
92 break;
93 case TARGET_VT:
94 pp_identifier (ppi, "\\v");
95 break;
96 case TARGET_BS:
97 pp_identifier (ppi, "\\b");
98 break;
99 case TARGET_CR:
100 pp_identifier (ppi, "\\r");
101 break;
102 case TARGET_FF:
103 pp_identifier (ppi, "\\f");
104 break;
105 case TARGET_BELL:
106 pp_identifier (ppi, "\\a");
107 break;
108 case '\\':
109 pp_identifier (ppi, "\\\\");
110 break;
111 case '\'':
112 pp_identifier (ppi, "\\'");
113 break;
114 case '\"':
115 pp_identifier (ppi, "\\\"");
116 break;
117 default:
118 if (ISPRINT (c))
119 pp_character (ppi, c);
120 else
121 pp_format_integer (ppi, "\\%03o", (unsigned) c);
122 break;
126 /* Print out a STRING literal. */
127 static inline void
128 pp_c_string_literal (ppi, s)
129 c_pretty_print_info *ppi;
130 tree s;
132 const char *p = TREE_STRING_POINTER (s);
133 int n = TREE_STRING_LENGTH (s) - 1;
134 int i;
135 pp_doublequote (ppi);
136 for (i = 0; i < n; ++i)
137 pp_c_char (ppi, p[i]);
138 pp_doublequote (ppi);
141 /* Print out a CHARACTER literal. */
142 static inline void
143 pp_c_character_literal (ppi, c)
144 c_pretty_print_info *ppi;
145 tree c;
147 pp_quote (ppi);
148 pp_c_char (ppi, tree_low_cst (c, 0));
149 pp_quote (ppi);
152 /* Print out a BOOLEAN literal. */
153 static inline void
154 pp_c_bool_literal (ppi, b)
155 c_pretty_print_info *ppi;
156 tree b;
158 if (b == boolean_false_node || integer_zerop (b))
160 if (c_language == clk_cplusplus)
161 pp_c_identifier (ppi, "false");
162 else if (c_language == clk_c && flag_isoc99)
163 pp_c_identifier (ppi, "_False");
164 else
165 pp_unsupported_tree (ppi, b);
167 else if (b == boolean_true_node)
169 if (c_language == clk_cplusplus)
170 pp_c_identifier (ppi, "true");
171 else if (c_language == clk_c && flag_isoc99)
172 pp_c_identifier (ppi, "_True");
173 else
174 pp_unsupported_tree (ppi, b);
176 else
177 pp_unsupported_tree (ppi, b);
180 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
181 false; that means the value was obtained by a cast, in which case
182 print out the type-id part of the cast-expression -- the casted value
183 is then printed by pp_c_integer_literal. */
184 static bool
185 pp_c_enumerator (ppi, e)
186 c_pretty_print_info *ppi;
187 tree e;
189 tree type = TREE_TYPE (e);
190 tree value;
192 /* Find the name of this constant. */
193 for (value = TYPE_VALUES (type);
194 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
195 value = TREE_CHAIN (value))
198 if (value != NULL_TREE)
199 pp_c_tree_identifier (ppi, TREE_PURPOSE (value));
200 else
202 /* Value must have been cast. */
203 pp_c_left_paren (ppi);
204 pp_type_id (ppi, type);
205 pp_c_right_paren (ppi);
206 return false;
209 return true;
212 /* Print out an INTEGER constant value. */
213 static void
214 pp_c_integer_literal (ppi, i)
215 c_pretty_print_info *ppi;
216 tree i;
218 tree type = TREE_TYPE (i);
220 if (type == boolean_type_node)
221 pp_c_bool_literal (ppi, i);
222 else if (type == char_type_node)
223 pp_c_character_literal (ppi, i);
224 else if (TREE_CODE (type) == ENUMERAL_TYPE
225 && pp_c_enumerator (ppi, i))
227 else
229 if (host_integerp (i, 0))
230 pp_wide_integer (ppi, TREE_INT_CST_LOW (i));
231 else
233 if (tree_int_cst_sgn (i) < 0)
235 static char format[10]; /* "%x%09999x\0" */
236 if (!format[0])
237 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
239 pp_c_char (ppi, '-');
240 i = build_int_2 (-TREE_INT_CST_LOW (i),
241 ~TREE_INT_CST_HIGH (i) + !TREE_INT_CST_LOW (i));
242 sprintf (pp_buffer (ppi)->digit_buffer, format,
243 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
244 pp_identifier (ppi, pp_buffer (ppi)->digit_buffer);
251 /* Print out a REAL value. */
252 static inline void
253 pp_c_real_literal (ppi, r)
254 c_pretty_print_info *ppi;
255 tree r;
257 REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (r), "%.16g",
258 pp_buffer (ppi)->digit_buffer);
259 pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
263 void
264 pp_c_literal (ppi, e)
265 c_pretty_print_info *ppi;
266 tree e;
268 switch (TREE_CODE (e))
270 case INTEGER_CST:
271 pp_c_integer_literal (ppi, e);
272 break;
274 case REAL_CST:
275 pp_c_real_literal (ppi, e);
276 break;
278 case STRING_CST:
279 pp_c_string_literal (ppi, e);
280 break;
282 default:
283 pp_unsupported_tree (ppi, e);
284 break;
288 /* Pretty-print a C primary-expression. */
289 static void
290 pp_c_primary_expression (ppi, e)
291 c_pretty_print_info *ppi;
292 tree e;
294 switch (TREE_CODE (e))
296 case VAR_DECL:
297 case PARM_DECL:
298 case FIELD_DECL:
299 case CONST_DECL:
300 case FUNCTION_DECL:
301 case LABEL_DECL:
302 e = DECL_NAME (e);
303 /* Fall through. */
304 case IDENTIFIER_NODE:
305 pp_c_tree_identifier (ppi, e);
306 break;
308 case ERROR_MARK:
309 pp_c_identifier (ppi, "<erroneous-expression>");
310 break;
312 case RESULT_DECL:
313 pp_c_identifier (ppi, "<return-value>");
314 break;
316 case INTEGER_CST:
317 case REAL_CST:
318 case STRING_CST:
319 pp_c_literal (ppi, e);
320 break;
322 case TARGET_EXPR:
323 pp_c_left_paren (ppi);
324 pp_c_identifier (ppi, "__builtin_memcpy");
325 pp_c_left_paren (ppi);
326 pp_ampersand (ppi);
327 pp_c_primary_expression (ppi, TREE_OPERAND (e, 0));
328 pp_separate_with (ppi, ',');
329 pp_ampersand (ppi);
330 pp_initializer (ppi, TREE_OPERAND (e, 1));
331 if (TREE_OPERAND (e, 2))
333 pp_separate_with (ppi, ',');
334 pp_c_expression (ppi, TREE_OPERAND (e, 2));
336 pp_c_right_paren (ppi);
338 default:
339 /* Make sure this call won't cause any infinite loop. */
340 pp_c_left_paren (ppi);
341 pp_c_expression (ppi, e);
342 pp_c_right_paren (ppi);
343 break;
347 /* Print out a C initializer -- also support C compound-literals. */
348 void
349 pp_c_initializer (ppi, e)
350 c_pretty_print_info *ppi;
351 tree e;
353 if (TREE_CODE (e) == CONSTRUCTOR)
355 enum tree_code code = TREE_CODE (TREE_TYPE (e));
356 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
358 pp_left_brace (ppi);
359 pp_c_initializer_list (ppi, e);
360 pp_right_brace (ppi);
362 else
363 pp_unsupported_tree (ppi, TREE_OPERAND (e, 1));
365 else
366 pp_assignment_expression (ppi, e);
369 static void
370 pp_c_initializer_list (ppi, e)
371 c_pretty_print_info *ppi;
372 tree e;
374 tree type = TREE_TYPE (e);
375 const enum tree_code code = TREE_CODE (type);
377 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
379 tree init = TREE_OPERAND (e, 1);
380 for (; init != NULL_TREE; init = TREE_CHAIN (init))
382 if (code == RECORD_TYPE || code == UNION_TYPE)
384 pp_dot (ppi);
385 pp_c_primary_expression (ppi, TREE_PURPOSE (init));
387 else
389 pp_c_left_bracket (ppi);
390 if (TREE_PURPOSE (init))
391 pp_c_literal (ppi, TREE_PURPOSE (init));
392 pp_c_right_bracket (ppi);
394 pp_c_whitespace (ppi);
395 pp_equal (ppi);
396 pp_c_whitespace (ppi);
397 pp_initializer (ppi, TREE_VALUE (init));
398 if (TREE_CHAIN (init))
399 pp_separate_with (ppi, ',');
402 else
403 pp_unsupported_tree (ppi, type);
406 void
407 pp_c_postfix_expression (ppi, e)
408 c_pretty_print_info *ppi;
409 tree e;
411 enum tree_code code = TREE_CODE (e);
412 switch (code)
414 case POSTINCREMENT_EXPR:
415 case POSTDECREMENT_EXPR:
416 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
417 pp_identifier (ppi, code == POSTINCREMENT_EXPR ? "++" : "--");
418 break;
420 case ARRAY_REF:
421 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
422 pp_c_left_bracket (ppi);
423 pp_c_expression (ppi, TREE_OPERAND (e, 1));
424 pp_c_right_bracket (ppi);
425 break;
427 case CALL_EXPR:
428 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
429 pp_c_left_paren (ppi);
430 pp_c_expression_list (ppi, TREE_OPERAND (e, 1));
431 pp_c_right_paren (ppi);
432 break;
434 case ABS_EXPR:
435 pp_c_identifier (ppi, "abs");
436 pp_c_left_paren (ppi);
437 pp_c_expression (ppi, TREE_OPERAND (e, 0));
438 pp_c_right_paren (ppi);
439 break;
441 case COMPONENT_REF:
443 tree object = TREE_OPERAND (e, 0);
444 if (TREE_CODE (object) == INDIRECT_REF)
446 pp_postfix_expression (ppi, TREE_OPERAND (object, 0));
447 pp_arrow (ppi);
449 else
451 pp_postfix_expression (ppi, object);
452 pp_dot (ppi);
454 pp_c_expression (ppi, TREE_OPERAND (e, 1));
456 break;
458 case COMPLEX_CST:
459 case VECTOR_CST:
460 case COMPLEX_EXPR:
461 pp_c_left_paren (ppi);
462 pp_type_id (ppi, TREE_TYPE (e));
463 pp_c_right_paren (ppi);
464 pp_left_brace (ppi);
466 if (code == COMPLEX_CST)
468 pp_c_expression (ppi, TREE_REALPART (e));
469 pp_separate_with (ppi, ',');
470 pp_c_expression (ppi, TREE_IMAGPART (e));
472 else if (code == VECTOR_CST)
473 pp_c_expression_list (ppi, TREE_VECTOR_CST_ELTS (e));
474 else if (code == COMPLEX_EXPR)
476 pp_c_expression (ppi, TREE_OPERAND (e, 0));
477 pp_separate_with (ppi, ',');
478 pp_c_expression (ppi, TREE_OPERAND (e, 1));
481 pp_right_brace (ppi);
482 break;
484 case CONSTRUCTOR:
485 pp_initializer (ppi, e);
486 break;
488 default:
489 pp_primary_expression (ppi, e);
490 break;
494 /* Print out an expession-list; E is expected to be a TREE_LIST */
495 void
496 pp_c_expression_list (ppi, e)
497 c_pretty_print_info *ppi;
498 tree e;
500 for (; e != NULL_TREE; e = TREE_CHAIN (e))
502 pp_c_assignment_expression (ppi, TREE_VALUE (e));
503 if (TREE_CHAIN (e))
504 pp_separate_with (ppi, ',');
508 static void
509 pp_c_unary_expression (ppi, e)
510 c_pretty_print_info *ppi;
511 tree e;
513 enum tree_code code = TREE_CODE (e);
514 switch (code)
516 case PREINCREMENT_EXPR:
517 case PREDECREMENT_EXPR:
518 pp_identifier (ppi, code == PREINCREMENT_EXPR ? "++" : "--");
519 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
520 break;
522 case ADDR_EXPR:
523 case INDIRECT_REF:
524 case CONVERT_EXPR:
525 case NEGATE_EXPR:
526 case BIT_NOT_EXPR:
527 case TRUTH_NOT_EXPR:
528 case CONJ_EXPR:
529 if (code == ADDR_EXPR)
530 pp_ampersand (ppi);
531 else if (code == INDIRECT_REF)
532 pp_star (ppi);
533 else if (code == NEGATE_EXPR)
534 pp_minus (ppi);
535 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
536 pp_complement (ppi);
537 else if (code == TRUTH_NOT_EXPR)
538 pp_exclamation (ppi);
539 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
540 break;
542 case SIZEOF_EXPR:
543 case ALIGNOF_EXPR:
544 pp_c_identifier (ppi, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
545 pp_c_whitespace (ppi);
546 if (TYPE_P (TREE_OPERAND (e, 0)))
548 pp_c_left_paren (ppi);
549 pp_type_id (ppi, TREE_OPERAND (e, 0));
550 pp_c_right_paren (ppi);
552 else
553 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
554 break;
556 case REALPART_EXPR:
557 case IMAGPART_EXPR:
558 pp_c_identifier (ppi, code == REALPART_EXPR ? "__real__" : "__imag__");
559 pp_c_whitespace (ppi);
560 pp_unary_expression (ppi, TREE_OPERAND (e, 0));
561 break;
563 default:
564 pp_postfix_expression (ppi, e);
565 break;
569 void
570 pp_c_cast_expression (ppi, e)
571 c_pretty_print_info *ppi;
572 tree e;
574 if (TREE_CODE (e) == CONVERT_EXPR || TREE_CODE (e) == FLOAT_EXPR)
576 pp_c_left_paren (ppi);
577 pp_type_id (ppi, TREE_TYPE (e));
578 pp_c_right_paren (ppi);
579 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
581 else
582 pp_unary_expression (ppi, e);
585 static void
586 pp_c_multiplicative_expression (ppi, e)
587 c_pretty_print_info *ppi;
588 tree e;
590 enum tree_code code = TREE_CODE (e);
591 switch (code)
593 case MULT_EXPR:
594 case TRUNC_DIV_EXPR:
595 case TRUNC_MOD_EXPR:
596 pp_c_multiplicative_expression (ppi, TREE_OPERAND (e, 0));
597 pp_c_whitespace (ppi);
598 if (code == MULT_EXPR)
599 pp_star (ppi);
600 else if (code == TRUNC_DIV_EXPR)
601 pp_slash (ppi);
602 else
603 pp_modulo (ppi);
604 pp_c_whitespace (ppi);
605 pp_c_cast_expression (ppi, TREE_OPERAND (e, 1));
606 break;
608 default:
609 pp_c_cast_expression (ppi, e);
610 break;
614 static inline void
615 pp_c_additive_expression (ppi, e)
616 c_pretty_print_info *ppi;
617 tree e;
619 enum tree_code code = TREE_CODE (e);
620 switch (code)
622 case PLUS_EXPR:
623 case MINUS_EXPR:
624 pp_c_additive_expression (ppi, TREE_OPERAND (e, 0));
625 pp_c_whitespace (ppi);
626 if (code == PLUS_EXPR)
627 pp_plus (ppi);
628 else
629 pp_minus (ppi);
630 pp_c_whitespace (ppi);
631 pp_multiplicative_expression (ppi, TREE_OPERAND (e, 1));
632 break;
634 default:
635 pp_multiplicative_expression (ppi, e);
636 break;
640 static inline void
641 pp_c_shift_expression (ppi, e)
642 c_pretty_print_info *ppi;
643 tree e;
645 enum tree_code code = TREE_CODE (e);
646 switch (code)
648 case LSHIFT_EXPR:
649 case RSHIFT_EXPR:
650 pp_c_shift_expression (ppi, TREE_OPERAND (e, 0));
651 pp_c_whitespace (ppi);
652 pp_identifier (ppi, code == LSHIFT_EXPR ? "<<" : ">>");
653 pp_c_whitespace (ppi);
654 pp_c_additive_expression (ppi, TREE_OPERAND (e, 1));
655 break;
657 default:
658 pp_c_additive_expression (ppi, e);
662 static void
663 pp_c_relational_expression (ppi, e)
664 c_pretty_print_info *ppi;
665 tree e;
667 enum tree_code code = TREE_CODE (e);
668 switch (code)
670 case LT_EXPR:
671 case GT_EXPR:
672 case LE_EXPR:
673 case GE_EXPR:
674 pp_c_relational_expression (ppi, TREE_OPERAND (e, 0));
675 pp_c_whitespace (ppi);
676 if (code == LT_EXPR)
677 pp_less (ppi);
678 else if (code == GT_EXPR)
679 pp_greater (ppi);
680 else if (code == LE_EXPR)
681 pp_identifier (ppi, "<=");
682 else if (code == GE_EXPR)
683 pp_identifier (ppi, ">=");
684 pp_c_whitespace (ppi);
685 pp_c_shift_expression (ppi, TREE_OPERAND (e, 1));
686 break;
688 default:
689 pp_c_shift_expression (ppi, e);
690 break;
694 static inline void
695 pp_c_equality_expression (ppi, e)
696 c_pretty_print_info *ppi;
697 tree e;
699 enum tree_code code = TREE_CODE (e);
700 switch (code)
702 case EQ_EXPR:
703 case NE_EXPR:
704 pp_c_equality_expression (ppi, TREE_OPERAND (e, 0));
705 pp_c_maybe_whitespace (ppi);
706 pp_identifier (ppi, code == EQ_EXPR ? "==" : "!=");
707 pp_c_whitespace (ppi);
708 pp_c_relational_expression (ppi, TREE_OPERAND (e, 1));
709 break;
711 default:
712 pp_c_relational_expression (ppi, e);
713 break;
717 static inline void
718 pp_c_and_expression (ppi, e)
719 c_pretty_print_info *ppi;
720 tree e;
722 if (TREE_CODE (e) == BIT_AND_EXPR)
724 pp_c_and_expression (ppi, TREE_OPERAND (e, 0));
725 pp_c_maybe_whitespace (ppi);
726 pp_ampersand (ppi);
727 pp_c_whitespace (ppi);
728 pp_c_equality_expression (ppi, TREE_OPERAND (e, 1));
730 else
731 pp_c_equality_expression (ppi, e);
734 static inline void
735 pp_c_exclusive_or_expression (ppi, e)
736 c_pretty_print_info *ppi;
737 tree e;
739 if (TREE_CODE (e) == BIT_XOR_EXPR)
741 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
742 pp_c_maybe_whitespace (ppi);
743 pp_carret (ppi);
744 pp_c_whitespace (ppi);
745 pp_c_and_expression (ppi, TREE_OPERAND (e, 1));
747 else
748 pp_c_and_expression (ppi, e);
751 static inline void
752 pp_c_inclusive_or_expression (ppi, e)
753 c_pretty_print_info *ppi;
754 tree e;
756 if (TREE_CODE (e) == BIT_IOR_EXPR)
758 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
759 pp_c_maybe_whitespace (ppi);
760 pp_bar (ppi);
761 pp_c_whitespace (ppi);
762 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 1));
764 else
765 pp_c_exclusive_or_expression (ppi, e);
768 static inline void
769 pp_c_logical_and_expression (ppi, e)
770 c_pretty_print_info *ppi;
771 tree e;
773 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
775 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 0));
776 pp_c_maybe_whitespace (ppi);
777 pp_identifier (ppi, "&&");
778 pp_c_whitespace (ppi);
779 pp_c_inclusive_or_expression (ppi, TREE_OPERAND (e, 1));
781 else
782 pp_c_inclusive_or_expression (ppi, e);
785 void
786 pp_c_logical_or_expression (ppi, e)
787 c_pretty_print_info *ppi;
788 tree e;
790 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
792 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
793 pp_c_maybe_whitespace (ppi);
794 pp_identifier (ppi, "||");
795 pp_c_whitespace (ppi);
796 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 1));
798 else
799 pp_c_logical_and_expression (ppi, e);
802 static void
803 pp_c_conditional_expression (ppi, e)
804 c_pretty_print_info *ppi;
805 tree e;
807 if (TREE_CODE (e) == COND_EXPR)
809 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
810 pp_c_maybe_whitespace (ppi);
811 pp_question (ppi);
812 pp_c_whitespace (ppi);
813 pp_c_expression (ppi, TREE_OPERAND (e, 1));
814 pp_c_maybe_whitespace (ppi);
815 pp_colon (ppi);
816 pp_c_whitespace (ppi);
817 pp_c_conditional_expression (ppi, TREE_OPERAND (e, 2));
819 else
820 pp_c_logical_or_expression (ppi, e);
824 /* Pretty-print a C assignment-expression. */
825 static void
826 pp_c_assignment_expression (ppi, e)
827 c_pretty_print_info *ppi;
828 tree e;
830 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
832 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
833 pp_c_maybe_whitespace (ppi);
834 pp_equal (ppi);
835 pp_whitespace (ppi);
836 pp_c_assignment_expression (ppi, TREE_OPERAND (e, 1));
838 else
839 pp_c_conditional_expression (ppi, e);
842 /* Pretty-print an expression. */
843 void
844 pp_c_expression (ppi, e)
845 c_pretty_print_info *ppi;
846 tree e;
848 switch (TREE_CODE (e))
850 case INTEGER_CST:
851 pp_c_integer_literal (ppi, e);
852 break;
854 case REAL_CST:
855 pp_c_real_literal (ppi, e);
856 break;
858 case STRING_CST:
859 pp_c_string_literal (ppi, e);
860 break;
862 case FUNCTION_DECL:
863 case VAR_DECL:
864 case CONST_DECL:
865 case PARM_DECL:
866 case RESULT_DECL:
867 case FIELD_DECL:
868 case LABEL_DECL:
869 case ERROR_MARK:
870 case TARGET_EXPR:
871 pp_c_primary_expression (ppi, e);
872 break;
874 case POSTINCREMENT_EXPR:
875 case POSTDECREMENT_EXPR:
876 case ARRAY_REF:
877 case CALL_EXPR:
878 case COMPONENT_REF:
879 case COMPLEX_CST:
880 case VECTOR_CST:
881 case ABS_EXPR:
882 case CONSTRUCTOR:
883 case COMPLEX_EXPR:
884 pp_c_postfix_expression (ppi, e);
885 break;
887 case CONJ_EXPR:
888 case ADDR_EXPR:
889 case INDIRECT_REF:
890 case NEGATE_EXPR:
891 case BIT_NOT_EXPR:
892 case TRUTH_NOT_EXPR:
893 case PREINCREMENT_EXPR:
894 case PREDECREMENT_EXPR:
895 case SIZEOF_EXPR:
896 case ALIGNOF_EXPR:
897 case REALPART_EXPR:
898 case IMAGPART_EXPR:
899 pp_c_unary_expression (ppi, e);
900 break;
902 case CONVERT_EXPR:
903 case FLOAT_EXPR:
904 pp_c_cast_expression (ppi, e);
905 break;
907 case MULT_EXPR:
908 case TRUNC_MOD_EXPR:
909 case TRUNC_DIV_EXPR:
910 pp_c_multiplicative_expression (ppi, e);
911 break;
913 case LSHIFT_EXPR:
914 case RSHIFT_EXPR:
915 pp_c_shift_expression (ppi, e);
916 break;
918 case LT_EXPR:
919 case GT_EXPR:
920 case LE_EXPR:
921 case GE_EXPR:
922 pp_c_relational_expression (ppi, e);
923 break;
925 case BIT_AND_EXPR:
926 pp_c_and_expression (ppi, e);
927 break;
929 case BIT_XOR_EXPR:
930 pp_c_exclusive_or_expression (ppi, e);
931 break;
933 case BIT_IOR_EXPR:
934 pp_c_inclusive_or_expression (ppi, e);
935 break;
937 case TRUTH_ANDIF_EXPR:
938 pp_c_logical_and_expression (ppi, e);
939 break;
941 case TRUTH_ORIF_EXPR:
942 pp_c_logical_or_expression (ppi, e);
943 break;
945 case COND_EXPR:
946 pp_c_conditional_expression (ppi, e);
947 break;
949 case MODIFY_EXPR:
950 case INIT_EXPR:
951 pp_c_assignment_expression (ppi, e);
952 break;
954 case NOP_EXPR:
955 pp_c_expression (ppi, TREE_OPERAND (e, 0));
956 break;
958 case COMPOUND_EXPR:
959 pp_c_left_paren (ppi);
960 pp_c_expression (ppi, TREE_OPERAND (e, 0));
961 pp_separate_with (ppi, ',');
962 pp_assignment_expression (ppi, TREE_OPERAND (e, 1));
963 pp_c_right_paren (ppi);
964 break;
967 default:
968 pp_unsupported_tree (ppi, e);
969 break;