/* Subroutines common to both C and C++ pretty-printers.
- Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
This file is part of GCC.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
#include "config.h"
#include "system.h"
case VOID_TYPE:
case BOOLEAN_TYPE:
- case CHAR_TYPE:
case INTEGER_TYPE:
case REAL_TYPE:
if (TYPE_NAME (t))
- t = TYPE_NAME (t);
+ {
+ t = TYPE_NAME (t);
+ pp_c_type_specifier (pp, t);
+ }
else
- t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
- pp_c_type_specifier (pp, t);
+ {
+ int prec = TYPE_PRECISION (t);
+ t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
+ if (TYPE_NAME (t))
+ {
+ pp_c_type_specifier (pp, t);
+ if (TYPE_PRECISION (t) != prec)
+ {
+ pp_string (pp, ":");
+ pp_decimal_int (pp, prec);
+ }
+ }
+ else
+ {
+ switch (code)
+ {
+ case INTEGER_TYPE:
+ pp_string (pp, (TYPE_UNSIGNED (t)
+ ? "<unnamed-unsigned:"
+ : "<unnamed-signed:"));
+ break;
+ case REAL_TYPE:
+ pp_string (pp, "<unnamed-float:");
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ pp_decimal_int (pp, prec);
+ pp_string (pp, ">");
+ }
+ }
break;
case TYPE_DECL:
pp_character (pp, 'f');
else if (TREE_TYPE (r) == long_double_type_node)
pp_character (pp, 'l');
+ else if (TREE_TYPE (r) == dfloat128_type_node)
+ pp_string (pp, "dl");
+ else if (TREE_TYPE (r) == dfloat64_type_node)
+ pp_string (pp, "dd");
+ else if (TREE_TYPE (r) == dfloat32_type_node)
+ pp_string (pp, "df");
}
/* Pretty-print a compound literal expression. GNU extensions include
pp_c_right_paren (pp);
break;
- case STMT_EXPR:
- pp_c_left_paren (pp);
- pp_statement (pp, STMT_EXPR_STMT (e));
- pp_c_right_paren (pp);
- break;
-
default:
/* FIXME: Make sure we won't get into an infinie loop. */
pp_c_left_paren (pp);
if (TREE_CODE (e) == VECTOR_CST)
pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
else if (TREE_CODE (e) == CONSTRUCTOR)
- pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
+ pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
else
break;
return;
case COMPLEX_TYPE:
if (TREE_CODE (e) == CONSTRUCTOR)
- pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
+ pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
else if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
{
const bool cst = TREE_CODE (e) == COMPLEX_CST;
pp_identifier (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
break;
- case ARROW_EXPR:
- pp_postfix_expression (pp, TREE_OPERAND (e, 0));
- pp_c_arrow (pp);
- break;
-
case ARRAY_REF:
pp_postfix_expression (pp, TREE_OPERAND (e, 0));
pp_c_left_bracket (pp);
}
}
+/* Print out V, which contains the elements of a constructor. */
+
+void
+pp_c_constructor_elts (c_pretty_printer *pp, VEC(constructor_elt,gc) *v)
+{
+ unsigned HOST_WIDE_INT ix;
+ tree value;
+
+ FOR_EACH_CONSTRUCTOR_VALUE (v, ix, value)
+ {
+ pp_expression (pp, value);
+ if (ix != VEC_length (constructor_elt, v) - 1)
+ pp_separate_with (pp, ',');
+ }
+}
+
/* Print out an expression-list in parens, as in a function call. */
void
pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
break;
- case SIZEOF_EXPR:
- case ALIGNOF_EXPR:
- pp_c_identifier (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
- pp_c_whitespace (pp);
- if (TYPE_P (TREE_OPERAND (e, 0)))
- pp_c_type_cast (pp, TREE_OPERAND (e, 0));
- else
- pp_unary_expression (pp, TREE_OPERAND (e, 0));
- break;
-
case REALPART_EXPR:
case IMAGPART_EXPR:
pp_c_identifier (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
case FLOAT_EXPR:
case FIX_TRUNC_EXPR:
case CONVERT_EXPR:
+ case NOP_EXPR:
pp_c_type_cast (pp, TREE_TYPE (e));
pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
break;
case FIELD_DECL:
case LABEL_DECL:
case ERROR_MARK:
- case STMT_EXPR:
pp_primary_expression (pp, e);
break;
case POSTINCREMENT_EXPR:
case POSTDECREMENT_EXPR:
- case ARROW_EXPR:
case ARRAY_REF:
case CALL_EXPR:
case COMPONENT_REF:
case TRUTH_NOT_EXPR:
case PREINCREMENT_EXPR:
case PREDECREMENT_EXPR:
- case SIZEOF_EXPR:
- case ALIGNOF_EXPR:
case REALPART_EXPR:
case IMAGPART_EXPR:
pp_c_unary_expression (pp, e);
case FLOAT_EXPR:
case FIX_TRUNC_EXPR:
case CONVERT_EXPR:
+ case NOP_EXPR:
pp_c_cast_expression (pp, e);
break;
pp_c_right_paren (pp);
break;
- case NOP_EXPR:
case NON_LVALUE_EXPR:
case SAVE_EXPR:
pp_expression (pp, TREE_OPERAND (e, 0));
\f
/* Statements. */
-/* statement:
- labeled-statement
- compound-statement
- expression-statement
- selection-statement
- iteration-statement
- jump-statement */
-
void
pp_c_statement (c_pretty_printer *pp, tree stmt)
{
- enum tree_code code;
-
if (stmt == NULL)
return;
if (pp_needs_newline (pp))
pp_newline_and_indent (pp, 0);
- code = TREE_CODE (stmt);
- switch (code)
- {
- /* expression-statement:
- expression(opt) ; */
- case EXPR_STMT:
- pp_expression (pp, EXPR_STMT_EXPR (stmt));
- pp_c_semicolon (pp);
- pp_needs_newline (pp) = true;
- break;
-
- default:
- dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
- break;
- }
+ dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
}
\f
pp->statement = pp_c_statement;
+ pp->constant = pp_c_constant;
pp->id_expression = pp_c_id_expression;
pp->primary_expression = pp_c_primary_expression;
pp->postfix_expression = pp_c_postfix_expression;