/* Call-backs for C++ error reporting.
This code is non-reentrant.
- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
- Free Software Foundation, Inc.
- This file is part of GNU CC.
+ Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002,
+ 2003, 2004 Free Software Foundation, Inc.
+ This file is part of GCC.
-GNU CC is free software; you can redistribute it and/or modify
+GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
-GNU CC is distributed in the hope that it will be useful,
+GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
+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. */
#include "config.h"
#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
#include "tree.h"
#include "cp-tree.h"
-#include "obstack.h"
+#include "real.h"
#include "toplev.h"
+#include "flags.h"
#include "diagnostic.h"
-
-enum pad { none, before, after };
-
-/* These constants can used as bit flags in the process of tree formatting.
-
- TFF_PLAIN_IDENTIFER: unqualified part of a name.
- TFF_NAMESPACE_SCOPE: the complete qualified-id form of a name.
- TFF_CLASS_SCOPE: if possible, include the class-name part of a
- qualified-id. This flag may be implied in some circumstances by
- TFF_NAMESPACE_SCOPE.
- TFF_SCOPE: the combinaison of the two above.
- TFF_CHASE_TYPDEF: print the original type-id instead of the typedef-name.
- TFF_DECL_SPECIFIERS: print decl-specifiers.
- TFF_CLASS_KEY_OR_ENUM: precede a class-type name (resp. enum name) with
- a class-key (resp. `enum').
- TFF_RETURN_TYPE: include function return type.
- TFF_FUNCTION_DEFAULT_ARGUMENTS: include function default parameter values.
- TFF_EXCEPTION_SPECIFICATION: show function exception specification.
- TFF_TEMPLATE_HEADER: show the template<...> hearder in a
- template-declaration.
- TFF_TEMPLATE_DEFAULT_ARGUMENTS: show template paramter default values. */
-
-#define TFF_PLAIN_IDENTIFIER (0)
-#define TFF_NAMESPACE_SCOPE (1)
-#define TFF_CLASS_SCOPE (1 << 1)
-#define TFF_CHASE_NAMESPACE_ALIAS (1 << 2)
-#define TFF_CHASE_TYPEDEF (1 << 3)
-#define TFF_DECL_SPECIFIERS (1 << 4)
-#define TFF_CLASS_KEY_OR_ENUM (1 << 5)
-#define TFF_RETURN_TYPE (1 << 6)
-#define TFF_FUNCTION_DEFAULT_ARGUMENTS (1 << 7)
-#define TFF_EXCEPTION_SPECIFICATION (1 << 8)
-#define TFF_TEMPLATE_HEADER (1 << 9)
-#define TFF_TEMPLATE_DEFAULT_ARGUMENTS (1 << 10)
-#define TFF_SCOPE (TFF_NAMESPACE_SCOPE | TFF_CLASS_SCOPE)
-
-/* This data structure bundles altogether, all the information necessary
- for pretty-printing a C++ source-level entity represented by a tree. */
-typedef struct
-{
- tree decl;
- int flags;
- enum pad pad;
-} tree_formatting_info, *tfi_t;
-
-#define tree_being_formatted(TFI) (TFI)->decl
-#define tree_formatting_flags(TFI) (TFI)->flags
-#define put_whitespace(TFI) (TFI)->pad
-
-#define sorry_for_unsupported_tree(T) \
- sorry ("`%s' not supported by %s", tree_code_name[(int) TREE_CODE (T)], \
- __FUNCTION__)
-
-#define print_scope_operator(BUFFER) output_add_string (BUFFER, "::")
-#define print_left_paren(BUFFER) output_add_character (BUFFER, '(')
-#define print_right_paren(BUFFER) output_add_character (BUFFER, ')')
-#define print_left_bracket(BUFFER) output_add_character (BUFFER, '[')
-#define print_right_bracket(BUFFER) output_add_character (BUFFER, ']')
-#define print_whitespace(BUFFER, TFI) \
- do { \
- output_add_space (BUFFER); \
- put_whitespace (TFI) = none; \
- } while (0)
-
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
-
-#define print_tree_identifier(BUFFER, TID) \
- output_add_string (BUFFER, IDENTIFIER_POINTER (TID))
-#define print_identifier(BUFFER, ID) output_add_string (BUFFER, ID)
-
-/* Obstack where we build text strings for overloading, etc. */
-static struct obstack scratch_obstack;
-static char *scratch_firstobj;
-
-# define OB_INIT() (scratch_firstobj ? (obstack_free (&scratch_obstack, scratch_firstobj), 0) : 0)
-# define OB_PUTC(C) (obstack_1grow (&scratch_obstack, (C)))
-# define OB_PUTC2(C1,C2) \
- (obstack_1grow (&scratch_obstack, (C1)), obstack_1grow (&scratch_obstack, (C2)))
-# define OB_PUTS(S) (obstack_grow (&scratch_obstack, (S), sizeof (S) - 1))
-# define OB_PUTID(ID) \
- (obstack_grow (&scratch_obstack, IDENTIFIER_POINTER (ID), \
- IDENTIFIER_LENGTH (ID)))
-# define OB_PUTCP(S) (obstack_grow (&scratch_obstack, (S), strlen (S)))
-# define OB_FINISH() (obstack_1grow (&scratch_obstack, '\0'))
-# define OB_PUTI(CST) do { sprintf (digit_buffer, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)(CST)); \
- OB_PUTCP (digit_buffer); } while (0)
-
-# define OB_END_TEMPLATE_ID() \
- (((obstack_next_free (&scratch_obstack) != obstack_base (&scratch_obstack) \
- && obstack_next_free (&scratch_obstack)[-1] == '>') \
- ? OB_PUTC (' ') : (void)0), OB_PUTC ('>'))
-
-# define NEXT_CODE(t) (TREE_CODE (TREE_TYPE (t)))
-
-static const char *args_to_string PARAMS ((tree, int));
-static const char *assop_to_string PARAMS ((enum tree_code, int));
-static const char *code_to_string PARAMS ((enum tree_code, int));
-static const char *cv_to_string PARAMS ((tree, int));
-static const char *decl_to_string PARAMS ((tree, int));
-static const char *expr_to_string PARAMS ((tree, int));
-static const char *fndecl_to_string PARAMS ((tree, int));
-static const char *op_to_string PARAMS ((enum tree_code, int));
-static const char *parm_to_string PARAMS ((int, int));
-static const char *type_to_string PARAMS ((tree, int));
-
-static void dump_type PARAMS ((tree, enum tree_string_flags));
-static void dump_typename PARAMS ((tree, enum tree_string_flags));
-static void dump_simple_decl PARAMS ((tree, tree, enum tree_string_flags));
-static void dump_decl PARAMS ((tree, enum tree_string_flags));
-static void dump_template_decl PARAMS ((tree, enum tree_string_flags));
-static void dump_function_decl PARAMS ((tree, enum tree_string_flags));
-static void dump_expr PARAMS ((tree, enum tree_string_flags));
-static void dump_unary_op PARAMS ((const char *, tree, enum tree_string_flags));
-static void dump_binary_op PARAMS ((const char *, tree, enum tree_string_flags));
-static void dump_aggr_type PARAMS ((tree, enum tree_string_flags));
-static enum pad dump_type_prefix PARAMS ((tree, enum tree_string_flags));
-static void dump_type_suffix PARAMS ((tree, enum tree_string_flags));
-static void dump_function_name PARAMS ((tree, enum tree_string_flags));
-static void dump_expr_list PARAMS ((tree, enum tree_string_flags));
-static void dump_global_iord PARAMS ((tree));
-static enum pad dump_qualifiers PARAMS ((tree, enum pad));
-static void dump_char PARAMS ((int));
-static void dump_parameters PARAMS ((tree, enum tree_string_flags));
-static void dump_exception_spec PARAMS ((tree, enum tree_string_flags));
-static const char *class_key_or_enum PARAMS ((tree));
-static tree ident_fndecl PARAMS ((tree));
-static void dump_template_argument PARAMS ((tree, enum tree_string_flags));
-static void dump_template_argument_list PARAMS ((tree, enum tree_string_flags));
-static void dump_template_parameter PARAMS ((tree, enum tree_string_flags));
-static void dump_template_bindings PARAMS ((tree, tree));
-static void dump_scope PARAMS ((tree, enum tree_string_flags));
-static void dump_template_parms PARAMS ((tree, int, enum tree_string_flags));
-
-static const char *function_category PARAMS ((tree));
-static void lang_print_error_function PARAMS ((const char *));
-static void maybe_print_instantiation_context PARAMS ((output_buffer *));
-static void print_instantiation_full_context PARAMS ((output_buffer *));
-static void print_instantiation_partial_context PARAMS ((output_buffer *, tree,
- const char *, int));
-static void cp_diagnostic_starter PARAMS ((output_buffer *,
- diagnostic_context *));
-static void cp_diagnostic_finalizer PARAMS ((output_buffer *,
- diagnostic_context *));
-static void cp_print_error_function PARAMS ((output_buffer *,
- diagnostic_context *));
-
-static int cp_tree_printer PARAMS ((output_buffer *));
-static void print_function_argument_list PARAMS ((output_buffer *, tfi_t));
-static void print_declaration PARAMS ((output_buffer *, tfi_t));
-static void print_expression PARAMS ((output_buffer *, tfi_t));
-static void print_function_declaration PARAMS ((output_buffer *, tfi_t));
-static void print_function_parameter PARAMS ((output_buffer *, int));
-static void print_type_id PARAMS ((output_buffer *, tfi_t));
-static void print_cv_qualifier_seq PARAMS ((output_buffer *, tfi_t));
-static void print_type_specifier_seq PARAMS ((output_buffer *, tfi_t));
-static void print_simple_type_specifier PARAMS ((output_buffer *, tfi_t));
-static void print_elaborated_type_specifier PARAMS ((output_buffer *, tfi_t));
-static void print_rest_of_abstract_declarator PARAMS ((output_buffer *,
- tfi_t));
-static void print_parameter_declaration_clause PARAMS ((output_buffer *,
- tfi_t));
-static void print_exception_specification PARAMS ((output_buffer *, tfi_t));
-static void print_nested_name_specifier PARAMS ((output_buffer *, tfi_t));
-static void print_template_id PARAMS ((output_buffer *, tfi_t));
-static void print_template_argument_list_start PARAMS ((output_buffer *));
-static void print_template_argument_list_end PARAMS ((output_buffer *));
-static tree typedef_original_name PARAMS ((tree));
-
-#define A args_to_string
-#define C code_to_string
-#define D decl_to_string
-#define E expr_to_string
-#define F fndecl_to_string
-#define L language_to_string
-#define O op_to_string
-#define P parm_to_string
-#define Q assop_to_string
-#define T type_to_string
-#define V cv_to_string
-
-#define o (cp_printer *) 0
-cp_printer * cp_printers[256] =
-{
-/*0 1 2 3 4 5 6 7 8 9 A B C D E F */
- o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x00 */
- o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x10 */
- o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x20 */
- o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x30 */
- o, A, o, C, D, E, F, o, o, o, o, o, L, o, o, O, /* 0x40 */
- P, Q, o, o, T, o, V, o, o, o, o, o, o, o, o, o, /* 0x50 */
- o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x60 */
- o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x70 */
-};
-#undef C
-#undef D
-#undef E
-#undef F
-#undef L
-#undef O
-#undef P
-#undef Q
-#undef T
-#undef V
-#undef o
+#include "langhooks-def.h"
+#include "cxx-pretty-print.h"
+
+#define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
+
+/* The global buffer where we dump everything. It is there only for
+ transitional purpose. It is expected, in the near future, to be
+ completely removed. */
+static cxx_pretty_printer scratch_pretty_printer;
+#define cxx_pp (&scratch_pretty_printer)
+
+# define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
+
+static const char *args_to_string (tree, int);
+static const char *assop_to_string (enum tree_code);
+static const char *code_to_string (enum tree_code);
+static const char *cv_to_string (tree, int);
+static const char *decl_to_string (tree, int);
+static const char *expr_to_string (tree);
+static const char *fndecl_to_string (tree, int);
+static const char *op_to_string (enum tree_code);
+static const char *parm_to_string (int);
+static const char *type_to_string (tree, int);
+
+static void dump_type (tree, int);
+static void dump_typename (tree, int);
+static void dump_simple_decl (tree, tree, int);
+static void dump_decl (tree, int);
+static void dump_template_decl (tree, int);
+static void dump_function_decl (tree, int);
+static void dump_expr (tree, int);
+static void dump_unary_op (const char *, tree, int);
+static void dump_binary_op (const char *, tree, int);
+static void dump_aggr_type (tree, int);
+static void dump_type_prefix (tree, int);
+static void dump_type_suffix (tree, int);
+static void dump_function_name (tree, int);
+static void dump_expr_list (tree, int);
+static void dump_global_iord (tree);
+static void dump_parameters (tree, int);
+static void dump_exception_spec (tree, int);
+static void dump_template_argument (tree, int);
+static void dump_template_argument_list (tree, int);
+static void dump_template_parameter (tree, int);
+static void dump_template_bindings (tree, tree);
+static void dump_scope (tree, int);
+static void dump_template_parms (tree, int, int);
+
+static const char *function_category (tree);
+static void maybe_print_instantiation_context (diagnostic_context *);
+static void print_instantiation_full_context (diagnostic_context *);
+static void print_instantiation_partial_context (diagnostic_context *,
+ tree, location_t);
+static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
+static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
+static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
+
+static bool cp_printer (pretty_printer *, text_info *);
+static tree locate_error (const char *, va_list);
+static location_t location_of (tree);
void
-init_error ()
+init_error (void)
{
- gcc_obstack_init (&scratch_obstack);
- scratch_firstobj = (char *)obstack_alloc (&scratch_obstack, 0);
+ diagnostic_starter (global_dc) = cp_diagnostic_starter;
+ diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
+ diagnostic_format_decoder (global_dc) = cp_printer;
- print_error_function = lang_print_error_function;
- lang_diagnostic_starter = cp_diagnostic_starter;
- lang_diagnostic_finalizer = cp_diagnostic_finalizer;
-
- lang_printer = cp_tree_printer;
+ pp_construct (pp_base (cxx_pp), NULL, 0);
+ pp_cxx_pretty_printer_init (cxx_pp);
}
/* Dump a scope, if deemed necessary. */
static void
-dump_scope (scope, flags)
- tree scope;
- enum tree_string_flags flags;
+dump_scope (tree scope, int flags)
{
+ int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
+
if (scope == NULL_TREE)
return;
{
if (scope != global_namespace)
{
- dump_decl (scope, (flags & (TS_PEDANTIC_NAME | TS_FUNC_SCOPE | TS_CHASE_TYPEDEFS))
- | TS_FUNC_NORETURN | TS_DECL_TYPE);
- OB_PUTS ("::");
+ dump_decl (scope, f);
+ pp_cxx_colon_colon (cxx_pp);
}
- else if (flags & TS_PEDANTIC_NAME)
- OB_PUTS ("::");
}
else if (AGGREGATE_TYPE_P (scope))
{
- dump_type (scope, (flags & (TS_PEDANTIC_NAME | TS_FUNC_SCOPE | TS_CHASE_TYPEDEFS))
- | TS_FUNC_NORETURN | TS_DECL_TYPE);
- OB_PUTS ("::");
- }
- else if ((flags & (TS_PEDANTIC_NAME | TS_FUNC_SCOPE))
- && TREE_CODE (scope) == FUNCTION_DECL)
- {
- dump_function_decl (scope, (flags & (TS_PEDANTIC_NAME | TS_FUNC_SCOPE | TS_CHASE_TYPEDEFS))
- | TS_FUNC_NORETURN | TS_DECL_TYPE);
- OB_PUTS ("::");
+ dump_type (scope, f);
+ pp_cxx_colon_colon (cxx_pp);
}
-}
-
-/* Dump type qualifiers, providing padding as requested. Return an
- indication of whether we dumped something. */
-
-static enum pad
-dump_qualifiers (t, p)
- tree t;
- enum pad p;
-{
- static const int masks[] =
- {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT};
- static const char *const names[] =
- {"const", "volatile", "__restrict"};
- int ix;
- int quals = TYPE_QUALS (t);
- int do_after = p == after;
-
- if (quals)
+ else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
{
- for (ix = 0; ix != 3; ix++)
- if (masks[ix] & quals)
- {
- if (p == before)
- OB_PUTC (' ');
- p = before;
- OB_PUTCP (names[ix]);
- }
- if (do_after)
- OB_PUTC (' ');
+ dump_function_decl (scope, f);
+ pp_cxx_colon_colon (cxx_pp);
}
- else
- p = none;
- return p;
}
-/* This must be large enough to hold any printed integer or floating-point
- value. */
-static char digit_buffer[128];
-
/* Dump the template ARGument under control of FLAGS. */
static void
-dump_template_argument (arg, flags)
- tree arg;
- enum tree_string_flags flags;
+dump_template_argument (tree arg, int flags)
{
if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
- dump_type (arg, flags & ~TS_AGGR_TAGS);
+ dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
else
- dump_expr (arg, (flags | TS_EXPR_PARENS) & ~TS_AGGR_TAGS);
+ dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
}
/* Dump a template-argument-list ARGS (always a TREE_VEC) under control
of FLAGS. */
static void
-dump_template_argument_list (args, flags)
- tree args;
- enum tree_string_flags flags;
+dump_template_argument_list (tree args, int flags)
{
int n = TREE_VEC_LENGTH (args);
int need_comma = 0;
for (i = 0; i< n; ++i)
{
if (need_comma)
- OB_PUTS (", ");
+ pp_separate_with_comma (cxx_pp);
dump_template_argument (TREE_VEC_ELT (args, i), flags);
need_comma = 1;
}
/* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
static void
-dump_template_parameter (parm, flags)
- tree parm;
- enum tree_string_flags flags;
+dump_template_parameter (tree parm, int flags)
{
tree p = TREE_VALUE (parm);
tree a = TREE_PURPOSE (parm);
if (TREE_CODE (p) == TYPE_DECL)
{
- if (flags & TS_DECL_TYPE)
+ if (flags & TFF_DECL_SPECIFIERS)
{
- OB_PUTS ("class");
+ pp_cxx_identifier (cxx_pp, "class");
if (DECL_NAME (p))
- {
- OB_PUTC (' ');
- OB_PUTID (DECL_NAME (p));
- }
+ pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
}
else if (DECL_NAME (p))
- OB_PUTID (DECL_NAME (p));
+ pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
else
- OB_PUTS ("{template default argument error}");
+ pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
}
else
- dump_decl (p, flags | TS_DECL_TYPE);
+ dump_decl (p, flags | TFF_DECL_SPECIFIERS);
- if ((flags & TS_PARM_DEFAULTS) && a != NULL_TREE)
+ if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
{
- OB_PUTS (" = ");
- if (TREE_CODE (a) == TYPE_DECL || TREE_CODE (a) == TEMPLATE_DECL)
- dump_type (a, flags & ~TS_CHASE_TYPEDEFS);
+ pp_cxx_whitespace (cxx_pp);
+ pp_equal (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
+ if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
+ dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
else
- dump_expr (a, flags | TS_EXPR_PARENS);
+ dump_expr (a, flags | TFF_EXPR_IN_PARENS);
}
}
TREE_VEC. */
static void
-dump_template_bindings (parms, args)
- tree parms, args;
+dump_template_bindings (tree parms, tree args)
{
int need_comma = 0;
}
if (need_comma)
- OB_PUTS (", ");
- dump_template_parameter (TREE_VEC_ELT (p, i), TS_PLAIN);
- OB_PUTS (" = ");
+ pp_separate_with_comma (cxx_pp);
+ dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
+ pp_cxx_whitespace (cxx_pp);
+ pp_equal (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
if (arg)
- dump_template_argument (arg, TS_PLAIN);
+ dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
else
- OB_PUTS ("{missing}");
+ pp_identifier (cxx_pp, "<missing>");
++arg_idx;
need_comma = 1;
}
}
-/* Dump into the obstack a human-readable equivalent of TYPE. FLAGS
- controls the format. */
+/* Dump a human-readable equivalent of TYPE. FLAGS controls the
+ format. */
static void
-dump_type (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_type (tree t, int flags)
{
if (t == NULL_TREE)
return;
switch (TREE_CODE (t))
{
case UNKNOWN_TYPE:
- OB_PUTS ("{unknown type}");
+ pp_identifier (cxx_pp, "<unknown type>");
break;
case TREE_LIST:
break;
case IDENTIFIER_NODE:
- OB_PUTID (t);
+ pp_cxx_tree_identifier (cxx_pp, t);
break;
- case TREE_VEC:
+ case TREE_BINFO:
dump_type (BINFO_TYPE (t), flags);
break;
break;
case TYPE_DECL:
- if (flags & TS_CHASE_TYPEDEFS)
+ if (flags & TFF_CHASE_TYPEDEF)
{
dump_type (DECL_ORIGINAL_TYPE (t)
? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
break;
}
- /* else fallthrough */
+ /* Else fall through. */
case TEMPLATE_DECL:
case NAMESPACE_DECL:
- dump_decl (t, flags & ~TS_DECL_TYPE);
- break;
-
- case COMPLEX_TYPE:
- OB_PUTS ("complex ");
- dump_type (TREE_TYPE (t), flags);
+ dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
break;
case INTEGER_TYPE:
- if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && TREE_UNSIGNED (t))
- OB_PUTS ("unsigned ");
- else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && !TREE_UNSIGNED (t))
- OB_PUTS ("signed ");
-
- /* fall through. */
case REAL_TYPE:
case VOID_TYPE:
case BOOLEAN_TYPE:
- {
- tree type;
- dump_qualifiers (t, after);
- type = flags & TS_CHASE_TYPEDEFS ? TYPE_MAIN_VARIANT (t) : t;
- if (TYPE_NAME (type) && TYPE_IDENTIFIER (type))
- OB_PUTID (TYPE_IDENTIFIER (type));
- else
- /* Types like intQI_type_node and friends have no names.
- These don't come up in user error messages, but it's nice
- to be able to print them from the debugger. */
- OB_PUTS ("{anonymous}");
- }
+ case COMPLEX_TYPE:
+ case VECTOR_TYPE:
+ pp_type_specifier_seq (cxx_pp, t);
break;
case TEMPLATE_TEMPLATE_PARM:
- /* For parameters inside template signature. */
+ /* For parameters inside template signature. */
if (TYPE_IDENTIFIER (t))
- OB_PUTID (TYPE_IDENTIFIER (t));
+ pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
else
- OB_PUTS ("{anonymous template template parameter}");
+ pp_cxx_canonical_template_parameter (cxx_pp, t);
break;
case BOUND_TEMPLATE_TEMPLATE_PARM:
{
tree args = TYPE_TI_ARGS (t);
- OB_PUTID (TYPE_IDENTIFIER (t));
- OB_PUTC ('<');
+ pp_cxx_cv_qualifier_seq (cxx_pp, t);
+ pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
+ pp_cxx_begin_template_argument_list (cxx_pp);
dump_template_argument_list (args, flags);
- OB_END_TEMPLATE_ID ();
+ pp_cxx_end_template_argument_list (cxx_pp);
}
break;
case TEMPLATE_TYPE_PARM:
- dump_qualifiers (t, after);
+ pp_cxx_cv_qualifier_seq (cxx_pp, t);
if (TYPE_IDENTIFIER (t))
- OB_PUTID (TYPE_IDENTIFIER (t));
+ pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
else
- OB_PUTS ("{anonymous template type parameter}");
+ pp_cxx_canonical_template_parameter
+ (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
break;
/* This is not always necessary for pointers and such, but doing this
break;
}
case TYPENAME_TYPE:
- OB_PUTS ("typename ");
+ pp_cxx_cv_qualifier_seq (cxx_pp, t);
+ pp_cxx_identifier (cxx_pp,
+ TYPENAME_IS_ENUM_P (t) ? "enum"
+ : TYPENAME_IS_CLASS_P (t) ? "class"
+ : "typename");
dump_typename (t, flags);
break;
+ case UNBOUND_CLASS_TEMPLATE:
+ dump_type (TYPE_CONTEXT (t), flags);
+ pp_cxx_colon_colon (cxx_pp);
+ pp_cxx_identifier (cxx_pp, "template");
+ dump_type (DECL_NAME (TYPE_NAME (t)), flags);
+ break;
+
case TYPEOF_TYPE:
- OB_PUTS ("__typeof (");
- dump_expr (TYPE_FIELDS (t), flags & ~TS_EXPR_PARENS);
- OB_PUTC (')');
+ pp_cxx_identifier (cxx_pp, "__typeof__");
+ pp_cxx_whitespace (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
+ dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
+ pp_cxx_right_paren (cxx_pp);
break;
default:
- sorry ("`%s' not supported by dump_type",
- tree_code_name[(int) TREE_CODE (t)]);
- /* Fall through to error. */
+ pp_unsupported_tree (cxx_pp, t);
+ /* Fall through to error. */
case ERROR_MARK:
- OB_PUTS ("{type error}");
+ pp_identifier (cxx_pp, "<type error>");
break;
}
}
a TYPENAME_TYPE. */
static void
-dump_typename (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_typename (tree t, int flags)
{
tree ctx = TYPE_CONTEXT (t);
if (TREE_CODE (ctx) == TYPENAME_TYPE)
dump_typename (ctx, flags);
else
- dump_type (ctx, flags & ~TS_AGGR_TAGS);
- OB_PUTS ("::");
+ dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
+ pp_cxx_colon_colon (cxx_pp);
dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
}
/* Return the name of the supplied aggregate, or enumeral type. */
-static const char *
-class_key_or_enum (t)
- tree t;
+const char *
+class_key_or_enum_as_string (tree t)
{
if (TREE_CODE (t) == ENUMERAL_TYPE)
return "enum";
in the form `class foo'. */
static void
-dump_aggr_type (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_aggr_type (tree t, int flags)
{
tree name;
- const char *variety = class_key_or_enum (t);
+ const char *variety = class_key_or_enum_as_string (t);
int typdef = 0;
int tmplate = 0;
- dump_qualifiers (t, after);
+ pp_cxx_cv_qualifier_seq (cxx_pp, t);
- if (flags & TS_AGGR_TAGS)
- {
- OB_PUTCP (variety);
- OB_PUTC (' ');
- }
+ if (flags & TFF_CLASS_KEY_OR_ENUM)
+ pp_cxx_identifier (cxx_pp, variety);
- if (flags & TS_CHASE_TYPEDEFS)
+ if (flags & TFF_CHASE_TYPEDEF)
t = TYPE_MAIN_VARIANT (t);
name = TYPE_NAME (t);
|| TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
|| DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
|| PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
- dump_scope (CP_DECL_CONTEXT (name), flags | TS_FUNC_SCOPE);
+ dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
if (tmplate)
{
/* Because the template names are mangled, we have to locate
if (name == 0 || ANON_AGGRNAME_P (name))
{
- OB_PUTS ("{anonymous");
- if (!(flags & TS_AGGR_TAGS))
- {
- OB_PUTC (' ');
- OB_PUTCP (variety);
- }
- OB_PUTC ('}');
+ if (flags & TFF_CLASS_KEY_OR_ENUM)
+ pp_identifier (cxx_pp, "<anonymous>");
+ else
+ pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
}
else
- OB_PUTID (name);
+ pp_cxx_tree_identifier (cxx_pp, name);
if (tmplate)
dump_template_parms (TYPE_TEMPLATE_INFO (t),
!CLASSTYPE_USE_TEMPLATE (t),
- flags & ~TS_TEMPLATE_PREFIX);
+ flags & ~TFF_TEMPLATE_HEADER);
}
/* Dump into the obstack the initial part of the output for a given type.
deal with prefix and suffix.
Arrays must also do this for DECL nodes, like int a[], and for things like
- int *[]&.
+ int *[]&. */
- Return indicates how you should pad an object name after this. I.e. you
- want to pad non-*, non-& cores, but not pad * or & types. */
-
-static enum pad
-dump_type_prefix (t, flags)
- tree t;
- enum tree_string_flags flags;
+static void
+dump_type_prefix (tree t, int flags)
{
- enum pad padding = before;
-
if (TYPE_PTRMEMFUNC_P (t))
{
t = TYPE_PTRMEMFUNC_FN_TYPE (t);
{
tree sub = TREE_TYPE (t);
- padding = dump_type_prefix (sub, flags);
- /* A tree for a member pointer looks like pointer to offset,
- so let the OFFSET_TYPE case handle it. */
- if (!TYPE_PTRMEM_P (t))
+ dump_type_prefix (sub, flags);
+ if (TREE_CODE (sub) == ARRAY_TYPE)
{
- if (padding != none)
- OB_PUTC (' ');
- if (TREE_CODE (sub) == ARRAY_TYPE)
- OB_PUTC ('(');
- OB_PUTC ("&*"[TREE_CODE (t) == POINTER_TYPE]);
- padding = dump_qualifiers (t, none);
+ pp_cxx_whitespace (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
}
+ pp_character (cxx_pp, "&*"[TREE_CODE (t) == POINTER_TYPE]);
+ pp_base (cxx_pp)->padding = pp_before;
+ pp_cxx_cv_qualifier_seq (cxx_pp, t);
}
break;
case OFFSET_TYPE:
offset_type:
- padding = dump_type_prefix (TREE_TYPE (t), flags);
+ dump_type_prefix (TREE_TYPE (t), flags);
if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
{
- if (padding != none)
- OB_PUTC (' ');
+ pp_maybe_space (cxx_pp);
+ if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
+ pp_cxx_left_paren (cxx_pp);
dump_type (TYPE_OFFSET_BASETYPE (t), flags);
- OB_PUTS ("::");
+ pp_cxx_colon_colon (cxx_pp);
}
- OB_PUTC ('*');
- padding = dump_qualifiers (t, none);
+ pp_cxx_star (cxx_pp);
+ pp_cxx_cv_qualifier_seq (cxx_pp, t);
+ pp_base (cxx_pp)->padding = pp_before;
break;
/* Can only be reached through function pointer -- this would not be
correct if FUNCTION_DECLs used it. */
case FUNCTION_TYPE:
- padding = dump_type_prefix (TREE_TYPE (t), flags);
- if (padding != none)
- OB_PUTC (' ');
- OB_PUTC ('(');
- padding = none;
+ dump_type_prefix (TREE_TYPE (t), flags);
+ pp_maybe_space (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
break;
case METHOD_TYPE:
- padding = dump_type_prefix (TREE_TYPE (t), flags);
- if (padding != none)
- OB_PUTC (' ');
- OB_PUTC ('(');
- padding = none;
+ dump_type_prefix (TREE_TYPE (t), flags);
+ pp_maybe_space (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
- OB_PUTS ("::");
+ pp_cxx_colon_colon (cxx_pp);
break;
case ARRAY_TYPE:
- padding = dump_type_prefix (TREE_TYPE (t), flags);
+ dump_type_prefix (TREE_TYPE (t), flags);
break;
case ENUMERAL_TYPE:
case VOID_TYPE:
case TYPENAME_TYPE:
case COMPLEX_TYPE:
+ case VECTOR_TYPE:
+ case TYPEOF_TYPE:
dump_type (t, flags);
- padding = before;
+ pp_base (cxx_pp)->padding = pp_before;
break;
default:
- sorry ("`%s' not supported by dump_type_prefix",
- tree_code_name[(int) TREE_CODE (t)]);
-
+ pp_unsupported_tree (cxx_pp, t);
+ /* fall through. */
case ERROR_MARK:
- OB_PUTS ("{typeprefixerror}");
+ pp_identifier (cxx_pp, "<typeprefixerror>");
break;
}
- return padding;
}
/* Dump the suffix of type T, under control of FLAGS. This is the part
which appears after the identifier (or function parms). */
static void
-dump_type_suffix (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_type_suffix (tree t, int flags)
{
if (TYPE_PTRMEMFUNC_P (t))
t = TYPE_PTRMEMFUNC_FN_TYPE (t);
case REFERENCE_TYPE:
case OFFSET_TYPE:
if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
dump_type_suffix (TREE_TYPE (t), flags);
break;
- /* Can only be reached through function pointer */
+ /* Can only be reached through function pointer. */
case FUNCTION_TYPE:
case METHOD_TYPE:
{
tree arg;
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
arg = TYPE_ARG_TYPES (t);
if (TREE_CODE (t) == METHOD_TYPE)
arg = TREE_CHAIN (arg);
/* Function pointers don't have default args. Not in standard C++,
anyway; they may in g++, but we'll just pretend otherwise. */
- dump_parameters (arg, flags & ~TS_PARM_DEFAULTS);
+ dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
if (TREE_CODE (t) == METHOD_TYPE)
- dump_qualifiers
- (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before);
- dump_type_suffix (TREE_TYPE (t), flags);
+ pp_cxx_cv_qualifier_seq
+ (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
+ else
+ pp_cxx_cv_qualifier_seq(cxx_pp, t);
dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
+ dump_type_suffix (TREE_TYPE (t), flags);
break;
}
case ARRAY_TYPE:
- OB_PUTC ('[');
+ pp_maybe_space (cxx_pp);
+ pp_cxx_left_bracket (cxx_pp);
if (TYPE_DOMAIN (t))
{
if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
- OB_PUTI (tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
+ pp_wide_integer
+ (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
- flags & ~TS_EXPR_PARENS);
+ flags & ~TFF_EXPR_IN_PARENS);
else
dump_expr (fold (cp_build_binary_op
(PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
integer_one_node)),
- flags & ~TS_EXPR_PARENS);
+ flags & ~TFF_EXPR_IN_PARENS);
}
- OB_PUTC (']');
+ pp_cxx_right_bracket (cxx_pp);
dump_type_suffix (TREE_TYPE (t), flags);
break;
case VOID_TYPE:
case TYPENAME_TYPE:
case COMPLEX_TYPE:
+ case VECTOR_TYPE:
+ case TYPEOF_TYPE:
break;
default:
- sorry ("`%s' not supported by dump_type_suffix",
- tree_code_name[(int) TREE_CODE (t)]);
-
+ pp_unsupported_tree (cxx_pp, t);
case ERROR_MARK:
/* Don't mark it here, we should have already done in
dump_type_prefix. */
}
}
-/* Return a function declaration which corresponds to the IDENTIFIER_NODE
- argument. */
-
-static tree
-ident_fndecl (t)
- tree t;
-{
- tree n = lookup_name (t, 0);
-
- if (n == NULL_TREE)
- return NULL_TREE;
-
- if (TREE_CODE (n) == FUNCTION_DECL)
- return n;
- else if (TREE_CODE (n) == TREE_LIST
- && TREE_CODE (TREE_VALUE (n)) == FUNCTION_DECL)
- return TREE_VALUE (n);
-
- my_friendly_abort (66);
- return NULL_TREE;
-}
-
-#ifndef NO_DOLLAR_IN_LABEL
-# define GLOBAL_THING "_GLOBAL_$"
-#else
-# ifndef NO_DOT_IN_LABEL
-# define GLOBAL_THING "_GLOBAL_."
-# else
-# define GLOBAL_THING "_GLOBAL__"
-# endif
-#endif
-
-#define GLOBAL_IORD_P(NODE) \
- ! strncmp (IDENTIFIER_POINTER(NODE), GLOBAL_THING, sizeof (GLOBAL_THING) - 1)
-
static void
-dump_global_iord (t)
- tree t;
+dump_global_iord (tree t)
{
- const char *name = IDENTIFIER_POINTER (t);
+ const char *p = NULL;
- OB_PUTS ("(static ");
- if (name [sizeof (GLOBAL_THING) - 1] == 'I')
- OB_PUTS ("initializers");
- else if (name [sizeof (GLOBAL_THING) - 1] == 'D')
- OB_PUTS ("destructors");
+ if (DECL_GLOBAL_CTOR_P (t))
+ p = "initializers";
+ else if (DECL_GLOBAL_DTOR_P (t))
+ p = "destructors";
else
- my_friendly_abort (352);
+ gcc_unreachable ();
- OB_PUTS (" for ");
- OB_PUTCP (input_filename);
- OB_PUTC (')');
+ pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
}
static void
-dump_simple_decl (t, type, flags)
- tree t;
- tree type;
- enum tree_string_flags flags;
+dump_simple_decl (tree t, tree type, int flags)
{
- if (flags & TS_DECL_TYPE)
+ if (flags & TFF_DECL_SPECIFIERS)
{
- if (dump_type_prefix (type, flags) != none)
- OB_PUTC (' ');
+ dump_type_prefix (type, flags);
+ pp_maybe_space (cxx_pp);
}
if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
dump_scope (CP_DECL_CONTEXT (t), flags);
if (DECL_NAME (t))
dump_decl (DECL_NAME (t), flags);
else
- OB_PUTS ("{anonymous}");
- if (flags & TS_DECL_TYPE)
+ pp_identifier (cxx_pp, "<anonymous>");
+ if (flags & TFF_DECL_SPECIFIERS)
dump_type_suffix (type, flags);
}
/* Dump a human readable string for the decl T under control of FLAGS. */
static void
-dump_decl (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_decl (tree t, int flags)
{
if (t == NULL_TREE)
return;
switch (TREE_CODE (t))
{
case TYPE_DECL:
- {
- /* Don't say 'typedef class A' */
- if (DECL_ARTIFICIAL (t))
- {
- if ((flags & TS_DECL_TYPE)
- && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
- /* Say `class T' not just `T'. */
- OB_PUTS ("class ");
-
- dump_type (TREE_TYPE (t), flags);
- break;
- }
- }
- if (flags & TS_DECORATE)
- OB_PUTS ("typedef ");
+ /* Don't say 'typedef class A' */
+ if (DECL_ARTIFICIAL (t))
+ {
+ if ((flags & TFF_DECL_SPECIFIERS)
+ && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
+ /* Say `class T' not just `T'. */
+ pp_cxx_identifier (cxx_pp, "class");
+
+ dump_type (TREE_TYPE (t), flags);
+ break;
+ }
+ if (flags & TFF_DECL_SPECIFIERS)
+ pp_cxx_identifier (cxx_pp, "typedef");
dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
flags);
case VAR_DECL:
if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
{
- OB_PUTS ("vtable for ");
- if (TYPE_P (DECL_CONTEXT (t)))
- dump_type (DECL_CONTEXT (t), flags);
- else
- /* This case can arise with -fno-vtable-thunks. See
- expand_upcast_fixups. It's not clear what to print
- here. */
- OB_PUTS ("{unknown type}");
+ pp_string (cxx_pp, "vtable for ");
+ gcc_assert (TYPE_P (DECL_CONTEXT (t)));
+ dump_type (DECL_CONTEXT (t), flags);
break;
}
- /* else fall through */
+ /* Else fall through. */
case FIELD_DECL:
case PARM_DECL:
+ case ALIAS_DECL:
dump_simple_decl (t, TREE_TYPE (t), flags);
break;
case RESULT_DECL:
- OB_PUTS ("{return} ");
+ pp_string (cxx_pp, "<return value> ");
dump_simple_decl (t, TREE_TYPE (t), flags);
break;
case NAMESPACE_DECL:
- dump_scope (CP_DECL_CONTEXT (t), flags);
- if (DECL_NAME (t) == anonymous_namespace_name)
- OB_PUTS ("{unnamed}");
+ if (flags & TFF_DECL_SPECIFIERS)
+ pp_cxx_declaration (cxx_pp, t);
else
- OB_PUTID (DECL_NAME (t));
+ {
+ dump_scope (CP_DECL_CONTEXT (t), flags);
+ if (DECL_NAME (t) == NULL_TREE)
+ pp_identifier (cxx_pp, "<unnamed>");
+ else
+ pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
+ }
break;
case SCOPE_REF:
- dump_decl (TREE_OPERAND (t, 0), flags & ~TS_DECL_TYPE);
- OB_PUTS ("::");
- dump_decl (TREE_OPERAND (t, 1), flags);
+ pp_expression (cxx_pp, t);
break;
case ARRAY_REF:
dump_decl (TREE_OPERAND (t, 0), flags);
- OB_PUTC ('[');
+ pp_cxx_left_bracket (cxx_pp);
dump_decl (TREE_OPERAND (t, 1), flags);
- OB_PUTC (']');
+ pp_cxx_right_bracket (cxx_pp);
break;
/* So that we can do dump_decl on an aggr type. */
dump_type (t, flags);
break;
+ case BIT_NOT_EXPR:
+ /* This is a pseudo destructor call which has not been folded into
+ a PSEUDO_DTOR_EXPR yet. */
+ pp_cxx_complement (cxx_pp);
+ dump_type (TREE_OPERAND (t, 0), flags);
+ break;
+
case TYPE_EXPR:
- my_friendly_abort (69);
+ gcc_unreachable ();
break;
/* These special cases are duplicated here so that other functions
- can feed identifiers to cp_error and get them demangled properly. */
+ can feed identifiers to error and get them demangled properly. */
case IDENTIFIER_NODE:
- { tree f;
- if (DESTRUCTOR_NAME_P (t)
- && (f = ident_fndecl (t))
- && DECL_LANGUAGE (f) == lang_cplusplus)
- {
- OB_PUTC ('~');
- dump_decl (DECL_NAME (f), flags);
- }
- else if (IDENTIFIER_TYPENAME_P (t))
- {
- OB_PUTS ("operator ");
- /* Not exactly IDENTIFIER_TYPE_VALUE. */
- dump_type (TREE_TYPE (t), flags);
- break;
- }
- else
- OB_PUTID (t);
- }
+ if (IDENTIFIER_TYPENAME_P (t))
+ {
+ pp_cxx_identifier (cxx_pp, "operator");
+ /* Not exactly IDENTIFIER_TYPE_VALUE. */
+ dump_type (TREE_TYPE (t), flags);
+ break;
+ }
+ else
+ pp_cxx_tree_identifier (cxx_pp, t);
break;
case OVERLOAD:
+ if (OVL_CHAIN (t))
+ {
+ t = OVL_CURRENT (t);
+ if (DECL_CLASS_SCOPE_P (t))
+ {
+ dump_type (DECL_CONTEXT (t), flags);
+ pp_cxx_colon_colon (cxx_pp);
+ }
+ else if (DECL_CONTEXT (t))
+ {
+ dump_decl (DECL_CONTEXT (t), flags);
+ pp_cxx_colon_colon (cxx_pp);
+ }
+ dump_decl (DECL_NAME (t), flags);
+ break;
+ }
+
+ /* If there's only one function, just treat it like an ordinary
+ FUNCTION_DECL. */
t = OVL_CURRENT (t);
/* Fall through. */
case FUNCTION_DECL:
- if (GLOBAL_IORD_P (DECL_ASSEMBLER_NAME (t)))
- dump_global_iord (DECL_ASSEMBLER_NAME (t));
- else if (! DECL_LANG_SPECIFIC (t))
- OB_PUTS ("{internal}");
- else if (flags & TS_PEDANTIC_NAME)
- dump_function_decl (t, flags | TS_FUNC_NORETURN | TS_DECL_TYPE);
+ if (! DECL_LANG_SPECIFIC (t))
+ pp_identifier (cxx_pp, "<built-in>");
+ else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
+ dump_global_iord (t);
else
dump_function_decl (t, flags);
break;
case TEMPLATE_DECL:
- if (flags & TS_PEDANTIC_NAME)
- dump_template_decl (t, flags | TS_FUNC_NORETURN | TS_DECL_TYPE);
- else
- dump_template_decl (t, flags);
+ dump_template_decl (t, flags);
break;
case TEMPLATE_ID_EXPR:
{
- tree args;
tree name = TREE_OPERAND (t, 0);
+
if (is_overloaded_fn (name))
name = DECL_NAME (get_first_fn (name));
dump_decl (name, flags);
- OB_PUTC ('<');
- for (args = TREE_OPERAND (t, 1); args; args = TREE_CHAIN (args))
- {
- dump_template_argument (TREE_VALUE (args), flags);
- if (TREE_CHAIN (args))
- OB_PUTS (", ");
- }
- OB_END_TEMPLATE_ID ();
+ pp_cxx_begin_template_argument_list (cxx_pp);
+ if (TREE_OPERAND (t, 1))
+ dump_template_argument_list (TREE_OPERAND (t, 1), flags);
+ pp_cxx_end_template_argument_list (cxx_pp);
}
break;
- case LOOKUP_EXPR:
- dump_decl (TREE_OPERAND (t, 0), flags);
- break;
-
case LABEL_DECL:
- OB_PUTID (DECL_NAME (t));
+ pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
break;
case CONST_DECL:
else if (DECL_NAME (t))
dump_decl (DECL_NAME (t), flags);
else if (DECL_INITIAL (t))
- dump_expr (DECL_INITIAL (t), flags | TS_EXPR_PARENS);
+ dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
else
- OB_PUTS ("enumerator");
+ pp_identifier (cxx_pp, "<enumerator>");
break;
case USING_DECL:
- OB_PUTS ("using ");
+ pp_cxx_identifier (cxx_pp, "using");
dump_type (DECL_INITIAL (t), flags);
- OB_PUTS ("::");
- OB_PUTID (DECL_NAME (t));
+ pp_cxx_colon_colon (cxx_pp);
+ dump_decl (DECL_NAME (t), flags);
+ break;
+
+ case BASELINK:
+ dump_decl (BASELINK_FUNCTIONS (t), flags);
+ break;
+
+ case NON_DEPENDENT_EXPR:
+ dump_expr (t, flags);
+ break;
+
+ case TEMPLATE_TYPE_PARM:
+ if (flags & TFF_DECL_SPECIFIERS)
+ pp_cxx_declaration (cxx_pp, t);
+ else
+ pp_type_id (cxx_pp, t);
break;
default:
- sorry ("`%s' not supported by dump_decl",
- tree_code_name[(int) TREE_CODE (t)]);
- /* Fallthrough to error. */
+ pp_unsupported_tree (cxx_pp, t);
+ /* Fall through to error. */
case ERROR_MARK:
- OB_PUTS ("{declaration error}");
+ pp_identifier (cxx_pp, "<declaration error>");
break;
}
}
'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
static void
-dump_template_decl (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_template_decl (tree t, int flags)
{
tree orig_parms = DECL_TEMPLATE_PARMS (t);
tree parms;
int i;
- if (flags & TS_TEMPLATE_PREFIX)
+ if (flags & TFF_TEMPLATE_HEADER)
{
for (parms = orig_parms = nreverse (orig_parms);
parms;
tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
int len = TREE_VEC_LENGTH (inner_parms);
- OB_PUTS ("template <");
+ pp_cxx_identifier (cxx_pp, "template");
+ pp_cxx_begin_template_argument_list (cxx_pp);
+
+ /* If we've shown the template prefix, we'd better show the
+ parameters' and decl's type too. */
+ flags |= TFF_DECL_SPECIFIERS;
+
for (i = 0; i < len; i++)
{
if (i)
- OB_PUTS (", ");
+ pp_separate_with_comma (cxx_pp);
dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
}
- OB_END_TEMPLATE_ID ();
- OB_PUTC (' ');
+ pp_cxx_end_template_argument_list (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
}
nreverse(orig_parms);
- /* If we've shown the template<args> prefix, we'd better show the
- decl's type too. */
- flags |= TS_DECL_TYPE;
+
+ if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
+ /* Say `template<arg> class TT' not just `template<arg> TT'. */
+ pp_cxx_identifier (cxx_pp, "class");
}
+
if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
dump_type (TREE_TYPE (t),
- ((flags & ~TS_AGGR_TAGS) | TS_TEMPLATE_PLAIN
- | (flags & TS_DECL_TYPE ? TS_AGGR_TAGS : 0)));
+ ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
+ | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
- dump_decl (DECL_TEMPLATE_RESULT (t), flags | TS_TEMPLATE_PLAIN);
- else if (TREE_TYPE (t) == NULL_TREE)
- my_friendly_abort (353);
+ dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
else
- switch (NEXT_CODE (t))
{
- case METHOD_TYPE:
- case FUNCTION_TYPE:
- dump_function_decl (t, flags | TS_TEMPLATE_PLAIN);
- break;
- default:
- /* This case can occur with some illegal code. */
- dump_type (TREE_TYPE (t),
- (flags & ~TS_AGGR_TAGS) | TS_TEMPLATE_PLAIN
- | (flags & TS_DECL_TYPE ? TS_AGGR_TAGS : 0));
+ gcc_assert (TREE_TYPE (t));
+ switch (NEXT_CODE (t))
+ {
+ case METHOD_TYPE:
+ case FUNCTION_TYPE:
+ dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
+ break;
+ default:
+ /* This case can occur with some invalid code. */
+ dump_type (TREE_TYPE (t),
+ (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
+ | (flags & TFF_DECL_SPECIFIERS
+ ? TFF_CLASS_KEY_OR_ENUM : 0));
+ }
}
}
/* Pretty print a function decl. There are several ways we want to print a
- function declaration. The TS_FUNC bits in FLAGS tells us how to behave.
- As cp_error can only apply the '#' flag once to give 0 and 1 for V, there
- is %D which doesn't print the throw specs, and %F which does. */
+ function declaration. The TFF_ bits in FLAGS tells us how to behave.
+ As error can only apply the '#' flag once to give 0 and 1 for V, there
+ is %D which doesn't print the throw specs, and %F which does. */
static void
-dump_function_decl (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_function_decl (tree t, int flags)
{
tree fntype;
tree parmtypes;
tree cname = NULL_TREE;
tree template_args = NULL_TREE;
tree template_parms = NULL_TREE;
- int show_return = !(flags & TS_FUNC_NORETURN) && (flags & TS_DECL_TYPE);
+ int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
if (TREE_CODE (t) == TEMPLATE_DECL)
t = DECL_TEMPLATE_RESULT (t);
}
fntype = TREE_TYPE (t);
- parmtypes = TYPE_ARG_TYPES (fntype);
+ parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
if (DECL_CLASS_SCOPE_P (t))
cname = DECL_CONTEXT (t);
- /* this is for partially instantiated template methods */
+ /* This is for partially instantiated template methods. */
else if (TREE_CODE (fntype) == METHOD_TYPE)
cname = TREE_TYPE (TREE_VALUE (parmtypes));
- if (!(flags & TS_DECORATE))
+ if (!(flags & TFF_DECL_SPECIFIERS))
/* OK */;
else if (DECL_STATIC_FUNCTION_P (t))
- OB_PUTS ("static ");
- else if (TYPE_POLYMORPHIC_P (t))
- OB_PUTS ("virtual ");
+ pp_cxx_identifier (cxx_pp, "static");
+ else if (DECL_VIRTUAL_P (t))
+ pp_cxx_identifier (cxx_pp, "virtual");
/* Print the return type? */
if (show_return)
show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
&& !DECL_DESTRUCTOR_P (t);
if (show_return)
- {
- if (dump_type_prefix (TREE_TYPE (fntype), flags) != none)
- OB_PUTC (' ');
- }
+ dump_type_prefix (TREE_TYPE (fntype), flags);
/* Print the function name. */
if (cname)
{
dump_type (cname, flags);
- OB_PUTS ("::");
+ pp_cxx_colon_colon (cxx_pp);
}
else
dump_scope (CP_DECL_CONTEXT (t), flags);
dump_function_name (t, flags);
- if (!(flags & TS_DECL_TYPE))
- return;
- if (TREE_CODE (fntype) == METHOD_TYPE && parmtypes)
- /* Skip "this" parameter. */
- parmtypes = TREE_CHAIN (parmtypes);
-
- /* Skip past the "in_charge" parameter. */
- if (DECL_HAS_IN_CHARGE_PARM_P (t))
- parmtypes = TREE_CHAIN (parmtypes);
-
- dump_parameters (parmtypes, flags);
+ if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
+ {
+ dump_parameters (parmtypes, flags);
- if (show_return)
- dump_type_suffix (TREE_TYPE (fntype), flags);
+ if (TREE_CODE (fntype) == METHOD_TYPE)
+ {
+ pp_base (cxx_pp)->padding = pp_before;
+ pp_cxx_cv_qualifier_seq
+ (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
+ }
- if (TREE_CODE (fntype) == METHOD_TYPE)
- dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
- before);
+ if (flags & TFF_EXCEPTION_SPECIFICATION)
+ {
+ pp_base (cxx_pp)->padding = pp_before;
+ dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
+ }
- if (flags & TS_FUNC_THROW)
- dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
+ if (show_return)
+ dump_type_suffix (TREE_TYPE (fntype), flags);
+ }
/* If T is a template instantiation, dump the parameter binding. */
if (template_parms != NULL_TREE && template_args != NULL_TREE)
{
- OB_PUTS (" [with ");
+ pp_cxx_whitespace (cxx_pp);
+ pp_cxx_left_bracket (cxx_pp);
+ pp_cxx_identifier (cxx_pp, "with");
+ pp_cxx_whitespace (cxx_pp);
dump_template_bindings (template_parms, template_args);
- OB_PUTC (']');
+ pp_cxx_right_bracket (cxx_pp);
}
}
/* Print a parameter list. If this is for a member function, the
member object ptr (and any other hidden args) should have
- already been removed. */
+ already been removed. */
static void
-dump_parameters (parmtypes, flags)
- tree parmtypes;
- enum tree_string_flags flags;
+dump_parameters (tree parmtypes, int flags)
{
int first;
- OB_PUTS (" (");
+
+ pp_cxx_left_paren (cxx_pp);
for (first = 1; parmtypes != void_list_node;
parmtypes = TREE_CHAIN (parmtypes))
{
if (!first)
- OB_PUTS (", ");
+ pp_separate_with_comma (cxx_pp);
first = 0;
if (!parmtypes)
{
- OB_PUTS ("...");
+ pp_cxx_identifier (cxx_pp, "...");
break;
}
dump_type (TREE_VALUE (parmtypes), flags);
- if ((flags & TS_PARM_DEFAULTS) && TREE_PURPOSE (parmtypes))
+ if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
{
- OB_PUTS (" = ");
- dump_expr (TREE_PURPOSE (parmtypes), flags | TS_EXPR_PARENS);
+ pp_cxx_whitespace (cxx_pp);
+ pp_equal (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
+ dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
}
}
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
}
-/* Print an exception specification. T is the exception specification. */
+/* Print an exception specification. T is the exception specification. */
static void
-dump_exception_spec (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_exception_spec (tree t, int flags)
{
if (t)
{
- OB_PUTS (" throw (");
+ pp_cxx_identifier (cxx_pp, "throw");
+ pp_cxx_whitespace (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
if (TREE_VALUE (t) != NULL_TREE)
while (1)
{
t = TREE_CHAIN (t);
if (!t)
break;
- OB_PUTS (", ");
+ pp_separate_with_comma (cxx_pp);
}
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
}
}
and destructors properly. */
static void
-dump_function_name (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_function_name (tree t, int flags)
{
tree name = DECL_NAME (t);
+ /* We can get here with a decl that was synthesized by language-
+ independent machinery (e.g. coverage.c) in which case it won't
+ have a lang_specific structure attached and DECL_CONSTRUCTOR_P
+ will crash. In this case it is safe just to print out the
+ literal name. */
+ if (!DECL_LANG_SPECIFIC (t))
+ {
+ pp_cxx_tree_identifier (cxx_pp, name);
+ return;
+ }
+
+ if (TREE_CODE (t) == TEMPLATE_DECL)
+ t = DECL_TEMPLATE_RESULT (t);
+
+ /* Don't let the user see __comp_ctor et al. */
+ if (DECL_CONSTRUCTOR_P (t)
+ || DECL_DESTRUCTOR_P (t))
+ name = constructor_name (DECL_CONTEXT (t));
+
if (DECL_DESTRUCTOR_P (t))
{
- OB_PUTC ('~');
- dump_decl (name, TS_PLAIN);
+ pp_cxx_complement (cxx_pp);
+ dump_decl (name, TFF_PLAIN_IDENTIFIER);
}
else if (DECL_CONV_FN_P (t))
{
declarations, both will have the same name, yet
the types will be different, hence the TREE_TYPE field
of the first name will be clobbered by the second. */
- OB_PUTS ("operator ");
+ pp_cxx_identifier (cxx_pp, "operator");
dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
}
else if (IDENTIFIER_OPNAME_P (name))
- OB_PUTID (name);
+ pp_cxx_tree_identifier (cxx_pp, name);
else
dump_decl (name, flags);
- if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
+ if (DECL_TEMPLATE_INFO (t)
&& !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
&& (DECL_TEMPLATE_SPECIALIZATION (t)
|| TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
decoration. */
static void
-dump_template_parms (info, primary, flags)
- tree info;
- int primary;
- enum tree_string_flags flags;
+dump_template_parms (tree info, int primary, int flags)
{
tree args = info ? TI_ARGS (info) : NULL_TREE;
- if (primary && flags & TS_TEMPLATE_PLAIN)
+ if (primary && flags & TFF_TEMPLATE_NAME)
return;
- flags &= ~(TS_AGGR_TAGS | TS_TEMPLATE_PLAIN);
- OB_PUTC ('<');
+ flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
+ pp_cxx_begin_template_argument_list (cxx_pp);
/* Be careful only to print things when we have them, so as not
to crash producing error messages. */
if (args && !primary)
{
- int len = 0;
- int ix = 0;
- int need_comma = 0;
+ int len, ix;
- if (TREE_CODE (args) == TREE_VEC)
- {
- if (TREE_VEC_LENGTH (args) > 0
- && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
- args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
+ if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
+ args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
+
+ len = TREE_VEC_LENGTH (args);
- len = TREE_VEC_LENGTH (args);
- }
- else if (TREE_CODE (args) == TREE_LIST)
- len = -1;
- while (ix != len && args)
+ for (ix = 0; ix != len; ix++)
{
- tree arg;
- if (len >= 0)
- {
- arg = TREE_VEC_ELT (args, ix);
- ix++;
- }
- else
- {
- arg = TREE_VALUE (args);
- args = TREE_CHAIN (args);
- }
- if (need_comma)
- OB_PUTS (", ");
+ tree arg = TREE_VEC_ELT (args, ix);
+ if (ix)
+ pp_separate_with_comma (cxx_pp);
+
if (!arg)
- OB_PUTS ("{template parameter error}");
+ pp_identifier (cxx_pp, "<template parameter error>");
else
dump_template_argument (arg, flags);
- need_comma = 1;
}
}
else if (primary)
tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
if (ix)
- OB_PUTS (", ");
+ pp_separate_with_comma (cxx_pp);
- dump_decl (parm, flags & ~TS_DECL_TYPE);
+ dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
}
}
- OB_END_TEMPLATE_ID ();
-}
-
-static void
-dump_char (c)
- int c;
-{
- switch (c)
- {
- case TARGET_NEWLINE:
- OB_PUTS ("\\n");
- break;
- case TARGET_TAB:
- OB_PUTS ("\\t");
- break;
- case TARGET_VT:
- OB_PUTS ("\\v");
- break;
- case TARGET_BS:
- OB_PUTS ("\\b");
- break;
- case TARGET_CR:
- OB_PUTS ("\\r");
- break;
- case TARGET_FF:
- OB_PUTS ("\\f");
- break;
- case TARGET_BELL:
- OB_PUTS ("\\a");
- break;
- case '\\':
- OB_PUTS ("\\\\");
- break;
- case '\'':
- OB_PUTS ("\\'");
- break;
- case '\"':
- OB_PUTS ("\\\"");
- break;
- default:
- if (ISPRINT (c))
- OB_PUTC (c);
- else
- {
- sprintf (digit_buffer, "\\%03o", (int) c);
- OB_PUTCP (digit_buffer);
- }
- }
+ pp_cxx_end_template_argument_list (cxx_pp);
}
-/* Print out a list of initializers (subr of dump_expr) */
+/* Print out a list of initializers (subr of dump_expr). */
static void
-dump_expr_list (l, flags)
- tree l;
- enum tree_string_flags flags;
+dump_expr_list (tree l, int flags)
{
while (l)
{
- dump_expr (TREE_VALUE (l), flags | TS_EXPR_PARENS);
+ dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
l = TREE_CHAIN (l);
if (l)
- OB_PUTS (", ");
+ pp_separate_with_comma (cxx_pp);
}
}
-/* Print out an expression E under control of FLAGS. */
+/* Print out an expression E under control of FLAGS. */
static void
-dump_expr (t, flags)
- tree t;
- enum tree_string_flags flags;
+dump_expr (tree t, int flags)
{
+ if (t == 0)
+ return;
+
switch (TREE_CODE (t))
{
case VAR_DECL:
case TEMPLATE_DECL:
case NAMESPACE_DECL:
case OVERLOAD:
- dump_decl (t, flags & ~TS_DECL_TYPE);
+ case IDENTIFIER_NODE:
+ dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
break;
+ case STRING_CST:
+ if (PAREN_STRING_LITERAL_P (t))
+ pp_cxx_left_paren (cxx_pp);
+ pp_c_constant (pp_c_base (cxx_pp), t);
+ if (PAREN_STRING_LITERAL_P (t))
+ pp_cxx_right_paren (cxx_pp);
+ break;
+
case INTEGER_CST:
- {
- tree type = TREE_TYPE (t);
- my_friendly_assert (type != 0, 81);
-
- /* If it's an enum, output its tag, rather than its value. */
- if (TREE_CODE (type) == ENUMERAL_TYPE)
- {
- tree values = TYPE_VALUES (type);
-
- for (; values;
- values = TREE_CHAIN (values))
- if (tree_int_cst_equal (TREE_VALUE (values), t))
- break;
-
- if (values)
- OB_PUTID (TREE_PURPOSE (values));
- else
- {
- /* Value must have been cast. */
- OB_PUTC ('(');
- dump_type (type, flags);
- OB_PUTC (')');
- goto do_int;
- }
- }
- else if (type == boolean_type_node)
- {
- if (t == boolean_false_node || integer_zerop (t))
- OB_PUTS ("false");
- else if (t == boolean_true_node)
- OB_PUTS ("true");
- }
- else if (type == char_type_node)
- {
- OB_PUTC ('\'');
- dump_char (tree_low_cst (t, 0));
- OB_PUTC ('\'');
- }
- else
- {
- do_int:
- if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (t)
- != (TREE_INT_CST_LOW (t) >> (HOST_BITS_PER_WIDE_INT - 1)))
- {
- tree val = t;
-
- if (tree_int_cst_sgn (val) < 0)
- {
- OB_PUTC ('-');
- val = build_int_2 (-TREE_INT_CST_LOW (val),
- ~TREE_INT_CST_HIGH (val)
- + !TREE_INT_CST_LOW (val));
- }
- /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
- systems? */
- {
- static char format[10]; /* "%x%09999x\0" */
- if (!format[0])
- sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
- sprintf (digit_buffer, format, TREE_INT_CST_HIGH (val),
- TREE_INT_CST_LOW (val));
- OB_PUTCP (digit_buffer);
- }
- }
- else
- OB_PUTI (TREE_INT_CST_LOW (t));
- }
- }
+ case REAL_CST:
+ pp_c_constant (pp_c_base (cxx_pp), t);
break;
- case REAL_CST:
-#ifndef REAL_IS_NOT_DOUBLE
- sprintf (digit_buffer, "%g", TREE_REAL_CST (t));
-#else
- {
- const unsigned char *p = (const unsigned char *) &TREE_REAL_CST (t);
- size_t i;
- strcpy (digit_buffer, "0x");
- for (i = 0; i < sizeof TREE_REAL_CST (t); i++)
- sprintf (digit_buffer + 2 + 2*i, "%02x", *p++);
- }
-#endif
- OB_PUTCP (digit_buffer);
+ case THROW_EXPR:
+ pp_cxx_identifier (cxx_pp, "throw");
+ dump_expr (TREE_OPERAND (t, 0), flags);
break;
case PTRMEM_CST:
- OB_PUTC ('&');
+ pp_ampersand (cxx_pp);
dump_type (PTRMEM_CST_CLASS (t), flags);
- OB_PUTS ("::");
- OB_PUTID (DECL_NAME (PTRMEM_CST_MEMBER (t)));
- break;
-
- case STRING_CST:
- {
- const char *p = TREE_STRING_POINTER (t);
- int len = TREE_STRING_LENGTH (t) - 1;
- int i;
-
- OB_PUTC ('\"');
- for (i = 0; i < len; i++)
- dump_char (p[i]);
- OB_PUTC ('\"');
- }
+ pp_cxx_colon_colon (cxx_pp);
+ pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
break;
case COMPOUND_EXPR:
- OB_PUTC ('(');
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
- OB_PUTS (", ");
- dump_expr (TREE_OPERAND (t, 1), flags | TS_EXPR_PARENS);
- OB_PUTC (')');
+ pp_cxx_left_paren (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
+ pp_separate_with_comma (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_right_paren (cxx_pp);
break;
case COND_EXPR:
- OB_PUTC ('(');
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
- OB_PUTS (" ? ");
- dump_expr (TREE_OPERAND (t, 1), flags | TS_EXPR_PARENS);
- OB_PUTS (" : ");
- dump_expr (TREE_OPERAND (t, 2), flags | TS_EXPR_PARENS);
- OB_PUTC (')');
+ pp_cxx_left_paren (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
+ pp_string (cxx_pp, " ? ");
+ dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
+ pp_string (cxx_pp, " : ");
+ dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_right_paren (cxx_pp);
break;
case SAVE_EXPR:
if (TREE_HAS_CONSTRUCTOR (t))
{
- OB_PUTS ("new ");
+ pp_cxx_identifier (cxx_pp, "new");
+ pp_cxx_whitespace (cxx_pp);
dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
}
else
- {
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
- }
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
break;
case AGGR_INIT_EXPR:
if (fn && TREE_CODE (fn) == FUNCTION_DECL)
{
if (DECL_CONSTRUCTOR_P (fn))
- OB_PUTID (TYPE_IDENTIFIER (TREE_TYPE (t)));
+ dump_type (DECL_CONTEXT (fn), flags);
else
dump_decl (fn, 0);
}
else
dump_expr (TREE_OPERAND (t, 0), 0);
}
- OB_PUTC ('(');
+ pp_cxx_left_paren (cxx_pp);
if (TREE_OPERAND (t, 1))
dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
break;
case CALL_EXPR:
tree ob = TREE_VALUE (args);
if (TREE_CODE (ob) == ADDR_EXPR)
{
- dump_expr (TREE_OPERAND (ob, 0), flags | TS_EXPR_PARENS);
- OB_PUTC ('.');
+ dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
+ pp_dot (cxx_pp);
}
else if (TREE_CODE (ob) != PARM_DECL
|| strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
{
- dump_expr (ob, flags | TS_EXPR_PARENS);
- OB_PUTS ("->");
+ dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
+ pp_arrow (cxx_pp);
}
args = TREE_CHAIN (args);
}
- dump_expr (fn, flags | TS_EXPR_PARENS);
- OB_PUTC ('(');
+ dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_left_paren (cxx_pp);
dump_expr_list (args, flags);
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
}
break;
case NEW_EXPR:
{
tree type = TREE_OPERAND (t, 1);
+ tree init = TREE_OPERAND (t, 2);
if (NEW_EXPR_USE_GLOBAL (t))
- OB_PUTS ("::");
- OB_PUTS ("new ");
+ pp_cxx_colon_colon (cxx_pp);
+ pp_cxx_identifier (cxx_pp, "new");
if (TREE_OPERAND (t, 0))
{
- OB_PUTC ('(');
+ pp_cxx_left_paren (cxx_pp);
dump_expr_list (TREE_OPERAND (t, 0), flags);
- OB_PUTS (") ");
+ pp_cxx_right_paren (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
}
if (TREE_CODE (type) == ARRAY_REF)
type = build_cplus_array_type
(TREE_OPERAND (type, 0),
- build_index_type (fold (build (MINUS_EXPR, integer_type_node,
- TREE_OPERAND (type, 1),
- integer_one_node))));
+ build_index_type (fold (build2 (MINUS_EXPR, integer_type_node,
+ TREE_OPERAND (type, 1),
+ integer_one_node))));
dump_type (type, flags);
- if (TREE_OPERAND (t, 2))
+ if (init)
{
- OB_PUTC ('(');
- dump_expr_list (TREE_OPERAND (t, 2), flags);
- OB_PUTC (')');
+ pp_cxx_left_paren (cxx_pp);
+ if (TREE_CODE (init) == TREE_LIST)
+ dump_expr_list (init, flags);
+ else if (init == void_zero_node)
+ /* This representation indicates an empty initializer,
+ e.g.: "new int()". */
+ ;
+ else
+ dump_expr (init, flags);
+ pp_cxx_right_paren (cxx_pp);
}
}
break;
default argument. Note we may have cleared out the first
operand in expand_expr, so don't go killing ourselves. */
if (TREE_OPERAND (t, 1))
- dump_expr (TREE_OPERAND (t, 1), flags | TS_EXPR_PARENS);
+ dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
break;
case INIT_EXPR:
case BIT_IOR_EXPR:
case BIT_XOR_EXPR:
case BIT_AND_EXPR:
- case BIT_ANDTC_EXPR:
case TRUTH_ANDIF_EXPR:
case TRUTH_ORIF_EXPR:
case LT_EXPR:
case CEIL_DIV_EXPR:
case FLOOR_DIV_EXPR:
case ROUND_DIV_EXPR:
+ case RDIV_EXPR:
dump_binary_op ("/", t, flags);
break;
if (TREE_CODE (ob) != PARM_DECL
|| strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
{
- dump_expr (ob, flags | TS_EXPR_PARENS);
- OB_PUTS ("->");
+ dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_arrow (cxx_pp);
}
}
else
{
- dump_expr (ob, flags | TS_EXPR_PARENS);
- OB_PUTC ('.');
+ dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_dot (cxx_pp);
}
- dump_expr (TREE_OPERAND (t, 1), flags & ~TS_EXPR_PARENS);
+ dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
}
break;
case ARRAY_REF:
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
- OB_PUTC ('[');
- dump_expr (TREE_OPERAND (t, 1), flags | TS_EXPR_PARENS);
- OB_PUTC (']');
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_left_bracket (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_right_bracket (cxx_pp);
break;
case CONVERT_EXPR:
- if (VOID_TYPE_P (TREE_TYPE (t)))
+ if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
{
- OB_PUTC ('(');
+ pp_cxx_left_paren (cxx_pp);
dump_type (TREE_TYPE (t), flags);
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
dump_expr (TREE_OPERAND (t, 0), flags);
}
else
that the expression has pointer type. */
|| (TREE_TYPE (t)
&& TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
else
dump_unary_op ("&", t, flags);
break;
if (TREE_HAS_CONSTRUCTOR (t))
{
t = TREE_OPERAND (t, 0);
- my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
- OB_PUTC ('(');
+ gcc_assert (TREE_CODE (t) == CALL_EXPR);
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_left_paren (cxx_pp);
dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
}
else
{
case POSTDECREMENT_EXPR:
case POSTINCREMENT_EXPR:
- OB_PUTC ('(');
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
- OB_PUTCP (operator_name_info[(int)TREE_CODE (t)].name);
- OB_PUTC (')');
+ pp_cxx_left_paren (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
+ pp_cxx_right_paren (cxx_pp);
break;
case NON_LVALUE_EXPR:
if (TREE_CODE (next) == FUNCTION_TYPE)
{
- if (flags & TS_EXPR_PARENS)
- OB_PUTC ('(');
- OB_PUTC ('*');
- dump_expr (TREE_OPERAND (t, 0), flags & ~TS_EXPR_PARENS);
- if (flags & TS_EXPR_PARENS)
- OB_PUTC (')');
+ if (flags & TFF_EXPR_IN_PARENS)
+ pp_cxx_left_paren (cxx_pp);
+ pp_cxx_star (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
+ if (flags & TFF_EXPR_IN_PARENS)
+ pp_cxx_right_paren (cxx_pp);
break;
}
- /* else FALLTHRU */
+ /* Else fall through. */
}
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
break;
case NOP_EXPR:
- dump_expr (TREE_OPERAND (t, 0), flags);
- break;
-
- case EXPR_WITH_FILE_LOCATION:
- dump_expr (EXPR_WFL_NODE (t), flags);
- break;
-
+ {
+ tree op = TREE_OPERAND (t, 0);
+
+ if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
+ {
+ /* It is a cast, but we cannot tell whether it is a
+ reinterpret or static cast. Use the C style notation. */
+ if (flags & TFF_EXPR_IN_PARENS)
+ pp_cxx_left_paren (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
+ dump_type (TREE_TYPE (t), flags);
+ pp_cxx_right_paren (cxx_pp);
+ dump_expr (op, flags | TFF_EXPR_IN_PARENS);
+ if (flags & TFF_EXPR_IN_PARENS)
+ pp_cxx_right_paren (cxx_pp);
+ }
+ else
+ dump_expr (op, flags);
+ break;
+ }
+
case CONSTRUCTOR:
if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
{
- tree idx = build_component_ref (t, index_identifier, NULL_TREE, 0);
+ tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
- if (integer_all_onesp (idx))
- {
- tree pfn = PFN_FROM_PTRMEMFUNC (t);
- dump_unary_op ("&", pfn, flags | TS_EXPR_PARENS);
- break;
- }
- else if (TREE_CODE (idx) == INTEGER_CST
- && tree_int_cst_equal (idx, integer_zero_node))
+ if (integer_zerop (idx))
{
/* A NULL pointer-to-member constant. */
- OB_PUTS ("((");
+ pp_cxx_left_paren (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
dump_type (TREE_TYPE (t), flags);
- OB_PUTS (") 0)");
+ pp_cxx_right_paren (cxx_pp);
+ pp_character (cxx_pp, '0');
+ pp_cxx_right_paren (cxx_pp);
break;
}
else if (host_integerp (idx, 0))
t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
t = TYPE_METHOD_BASETYPE (t);
- virtuals = TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t));
+ virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
- n = tree_low_cst (idx, 0) - first_vfun_index (t);
+ n = tree_low_cst (idx, 0);
/* Map vtable index back one, to allow for the null pointer to
member. */
if (virtuals)
{
dump_expr (BV_FN (virtuals),
- flags | TS_EXPR_PARENS);
+ flags | TFF_EXPR_IN_PARENS);
break;
}
}
}
- OB_PUTC ('{');
- dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
- OB_PUTC ('}');
+ if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
+ {
+ dump_type (TREE_TYPE (t), 0);
+ pp_cxx_left_paren (cxx_pp);
+ pp_cxx_right_paren (cxx_pp);
+ }
+ else
+ {
+ pp_cxx_left_brace (cxx_pp);
+ dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
+ pp_cxx_right_brace (cxx_pp);
+ }
+
break;
case OFFSET_REF:
t = TREE_OPERAND (t, 1);
if (TREE_CODE (t) == FUNCTION_DECL)
/* A::f */
- dump_expr (t, flags | TS_EXPR_PARENS);
+ dump_expr (t, flags | TFF_EXPR_IN_PARENS);
else if (BASELINK_P (t))
- dump_expr (OVL_CURRENT (TREE_VALUE (t)), flags | TS_EXPR_PARENS);
+ dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
+ flags | TFF_EXPR_IN_PARENS);
else
dump_decl (t, flags);
}
{
if (TREE_CODE (ob) == INDIRECT_REF)
{
- dump_expr (TREE_OPERAND (ob, 0), flags | TS_EXPR_PARENS);
- OB_PUTS (" ->* ");
+ dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_arrow (cxx_pp);
+ pp_cxx_star (cxx_pp);
}
else
{
- dump_expr (ob, flags | TS_EXPR_PARENS);
- OB_PUTS (" .* ");
+ dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_dot (cxx_pp);
+ pp_cxx_star (cxx_pp);
}
- dump_expr (TREE_OPERAND (t, 1), flags | TS_EXPR_PARENS);
+ dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
}
break;
}
case TEMPLATE_PARM_INDEX:
- dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TS_DECL_TYPE);
- break;
-
- case IDENTIFIER_NODE:
- OB_PUTID (t);
+ dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
break;
case SCOPE_REF:
- dump_type (TREE_OPERAND (t, 0), flags);
- OB_PUTS ("::");
- dump_expr (TREE_OPERAND (t, 1), flags | TS_EXPR_PARENS);
+ pp_expression (cxx_pp, t);
break;
case CAST_EXPR:
|| TREE_CHAIN (TREE_OPERAND (t, 0)))
{
dump_type (TREE_TYPE (t), flags);
- OB_PUTC ('(');
+ pp_cxx_left_paren (cxx_pp);
dump_expr_list (TREE_OPERAND (t, 0), flags);
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
}
else
{
- OB_PUTC ('(');
+ pp_cxx_left_paren (cxx_pp);
dump_type (TREE_TYPE (t), flags);
- OB_PUTC (')');
- OB_PUTC ('(');
+ pp_cxx_right_paren (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
dump_expr_list (TREE_OPERAND (t, 0), flags);
- OB_PUTC (')');
+ pp_cxx_right_paren (cxx_pp);
}
break;
- case LOOKUP_EXPR:
- OB_PUTID (TREE_OPERAND (t, 0));
+ case STATIC_CAST_EXPR:
+ pp_cxx_identifier (cxx_pp, "static_cast");
+ goto cast;
+ case REINTERPRET_CAST_EXPR:
+ pp_cxx_identifier (cxx_pp, "reinterpret_cast");
+ goto cast;
+ case CONST_CAST_EXPR:
+ pp_cxx_identifier (cxx_pp, "const_cast");
+ goto cast;
+ case DYNAMIC_CAST_EXPR:
+ pp_cxx_identifier (cxx_pp, "dynamic_cast");
+ cast:
+ pp_cxx_begin_template_argument_list (cxx_pp);
+ dump_type (TREE_TYPE (t), flags);
+ pp_cxx_end_template_argument_list (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 0), flags);
+ pp_cxx_right_paren (cxx_pp);
break;
case ARROW_EXPR:
dump_expr (TREE_OPERAND (t, 0), flags);
- OB_PUTS ("->");
+ pp_cxx_arrow (cxx_pp);
break;
case SIZEOF_EXPR:
case ALIGNOF_EXPR:
if (TREE_CODE (t) == SIZEOF_EXPR)
- OB_PUTS ("sizeof (");
+ pp_cxx_identifier (cxx_pp, "sizeof");
else
{
- my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
- OB_PUTS ("__alignof__ (");
+ gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
+ pp_cxx_identifier (cxx_pp, "__alignof__");
}
+ pp_cxx_whitespace (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
if (TYPE_P (TREE_OPERAND (t, 0)))
dump_type (TREE_OPERAND (t, 0), flags);
else
- dump_unary_op ("*", t, flags | TS_EXPR_PARENS);
- OB_PUTC (')');
+ dump_expr (TREE_OPERAND (t, 0), flags);
+ pp_cxx_right_paren (cxx_pp);
+ break;
+
+ case REALPART_EXPR:
+ case IMAGPART_EXPR:
+ pp_cxx_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
+ pp_cxx_whitespace (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 0), flags);
break;
case DEFAULT_ARG:
- OB_PUTS ("{unparsed}");
+ pp_identifier (cxx_pp, "<unparsed>");
break;
case TRY_CATCH_EXPR:
case PSEUDO_DTOR_EXPR:
dump_expr (TREE_OPERAND (t, 2), flags);
- OB_PUTS (".");
+ pp_cxx_dot (cxx_pp);
dump_type (TREE_OPERAND (t, 0), flags);
- OB_PUTS ("::~");
+ pp_cxx_colon_colon (cxx_pp);
+ pp_cxx_complement (cxx_pp);
dump_type (TREE_OPERAND (t, 1), flags);
break;
dump_decl (t, flags);
break;
+ case BIND_EXPR:
case STMT_EXPR:
+ case STATEMENT_LIST:
/* We don't yet have a way of dumping statements in a
human-readable format. */
- OB_PUTS ("{ ... }");
- break;
-
- case BIND_EXPR:
- OB_PUTS ("{ ");
- dump_expr (TREE_OPERAND (t, 1), flags & ~TS_EXPR_PARENS);
- OB_PUTS ("} ");
+ pp_string (cxx_pp, "({...})");
break;
case LOOP_EXPR:
- OB_PUTS ("while (1) { ");
- dump_expr (TREE_OPERAND (t, 0), flags & ~TS_EXPR_PARENS);
- OB_PUTS ("} ");
+ pp_string (cxx_pp, "while (1) { ");
+ dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
+ pp_cxx_right_brace (cxx_pp);
break;
case EXIT_EXPR:
- OB_PUTS ("if (");
- dump_expr (TREE_OPERAND (t, 0), flags & ~TS_EXPR_PARENS);
- OB_PUTS (") break; ");
+ pp_string (cxx_pp, "if (");
+ dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
+ pp_string (cxx_pp, ") break; ");
break;
- case TREE_LIST:
- if (TREE_VALUE (t) && TREE_CODE (TREE_VALUE (t)) == FUNCTION_DECL)
- {
- OB_PUTID (DECL_NAME (TREE_VALUE (t)));
- break;
- }
- /* else fall through */
+ case BASELINK:
+ dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
+ break;
+
+ case EMPTY_CLASS_EXPR:
+ dump_type (TREE_TYPE (t), flags);
+ pp_cxx_left_paren (cxx_pp);
+ pp_cxx_right_paren (cxx_pp);
+ break;
+
+ case NON_DEPENDENT_EXPR:
+ dump_expr (TREE_OPERAND (t, 0), flags);
+ break;
/* This list is incomplete, but should suffice for now.
It is very important that `sorry' does not call
`report_error_function'. That could cause an infinite loop. */
default:
- sorry ("`%s' not supported by dump_expr",
- tree_code_name[(int) TREE_CODE (t)]);
-
+ pp_unsupported_tree (cxx_pp, t);
/* fall through to ERROR_MARK... */
case ERROR_MARK:
- OB_PUTCP ("{expression error}");
+ pp_identifier (cxx_pp, "<expression error>");
break;
}
}
static void
-dump_binary_op (opstring, t, flags)
- const char *opstring;
- tree t;
- enum tree_string_flags flags;
+dump_binary_op (const char *opstring, tree t, int flags)
{
- OB_PUTC ('(');
- dump_expr (TREE_OPERAND (t, 0), flags | TS_EXPR_PARENS);
- OB_PUTC (' ');
+ pp_cxx_left_paren (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_whitespace (cxx_pp);
if (opstring)
- OB_PUTCP (opstring);
+ pp_cxx_identifier (cxx_pp, opstring);
else
- OB_PUTS ("<unknown operator>");
- OB_PUTC (' ');
- dump_expr (TREE_OPERAND (t, 1), flags | TS_EXPR_PARENS);
- OB_PUTC (')');
+ pp_identifier (cxx_pp, "<unknown operator>");
+ pp_cxx_whitespace (cxx_pp);
+ dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
+ pp_cxx_right_paren (cxx_pp);
}
static void
-dump_unary_op (opstring, t, flags)
- const char *opstring;
- tree t;
- enum tree_string_flags flags;
+dump_unary_op (const char *opstring, tree t, int flags)
{
- if (flags & TS_EXPR_PARENS)
- OB_PUTC ('(');
- OB_PUTCP (opstring);
- dump_expr (TREE_OPERAND (t, 0), flags & ~TS_EXPR_PARENS);
- if (flags & TS_EXPR_PARENS)
- OB_PUTC (')');
+ if (flags & TFF_EXPR_IN_PARENS)
+ pp_cxx_left_paren (cxx_pp);
+ pp_cxx_identifier (cxx_pp, opstring);
+ dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
+ if (flags & TFF_EXPR_IN_PARENS)
+ pp_cxx_right_paren (cxx_pp);
}
-/* Exported interface to stringifying types, exprs and decls under TS_*
- control. */
-
-const char *
-type_as_string (typ, flags)
- tree typ;
- enum tree_string_flags flags;
+static void
+reinit_cxx_pp (void)
{
- OB_INIT ();
-
- dump_type (typ, flags);
+ pp_clear_output_area (cxx_pp);
+ pp_base (cxx_pp)->padding = pp_none;
+ pp_indentation (cxx_pp) = 0;
+ pp_needs_newline (cxx_pp) = false;
+ cxx_pp->enclosing_scope = 0;
+}
- OB_FINISH ();
- return (char *)obstack_base (&scratch_obstack);
-}
+/* Exported interface to stringifying types, exprs and decls under TFF_*
+ control. */
const char *
-expr_as_string (decl, flags)
- tree decl;
- enum tree_string_flags flags;
+type_as_string (tree typ, int flags)
{
- OB_INIT ();
-
- dump_expr (decl, flags);
-
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ reinit_cxx_pp ();
+ dump_type (typ, flags);
+ return pp_formatted_text (cxx_pp);
}
const char *
-decl_as_string (decl, flags)
- tree decl;
- enum tree_string_flags flags;
+expr_as_string (tree decl, int flags)
{
- OB_INIT ();
-
- dump_decl (decl, flags);
-
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ reinit_cxx_pp ();
+ dump_expr (decl, flags);
+ return pp_formatted_text (cxx_pp);
}
const char *
-context_as_string (context, flags)
- tree context;
- enum tree_string_flags flags;
+decl_as_string (tree decl, int flags)
{
- OB_INIT ();
-
- dump_scope (context, flags);
-
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ reinit_cxx_pp ();
+ dump_decl (decl, flags);
+ return pp_formatted_text (cxx_pp);
}
-/* Generate the three forms of printable names for lang_printable_name. */
+/* Generate the three forms of printable names for cxx_printable_name. */
const char *
-lang_decl_name (decl, v)
- tree decl;
- int v;
+lang_decl_name (tree decl, int v)
{
if (v >= 2)
- return decl_as_string (decl, TS_DECL_TYPE);
-
- OB_INIT ();
+ return decl_as_string (decl, TFF_DECL_SPECIFIERS);
+ reinit_cxx_pp ();
if (v == 1 && DECL_CLASS_SCOPE_P (decl))
{
- dump_type (CP_DECL_CONTEXT (decl), TS_PLAIN);
- OB_PUTS ("::");
+ dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
+ pp_cxx_colon_colon (cxx_pp);
}
if (TREE_CODE (decl) == FUNCTION_DECL)
- dump_function_name (decl, TS_PLAIN);
+ dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
else
- dump_decl (DECL_NAME (decl), TS_PLAIN);
+ dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ return pp_formatted_text (cxx_pp);
}
-const char *
-cp_file_of (t)
- tree t;
+static location_t
+location_of (tree t)
{
if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
- return DECL_SOURCE_FILE (DECL_CONTEXT (t));
+ t = DECL_CONTEXT (t);
else if (TYPE_P (t))
- return DECL_SOURCE_FILE (TYPE_MAIN_DECL (t));
+ t = TYPE_MAIN_DECL (t);
else if (TREE_CODE (t) == OVERLOAD)
- return DECL_SOURCE_FILE (OVL_FUNCTION (t));
- else
- return DECL_SOURCE_FILE (t);
-}
-
-int
-cp_line_of (t)
- tree t;
-{
- int line = 0;
- if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
- line = DECL_SOURCE_LINE (DECL_CONTEXT (t));
- if (TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t)
- && TYPE_MAIN_DECL (TREE_TYPE (t)))
- t = TREE_TYPE (t);
-
- if (TYPE_P (t))
- line = DECL_SOURCE_LINE (TYPE_MAIN_DECL (t));
- else if (TREE_CODE (t) == OVERLOAD)
- line = DECL_SOURCE_LINE (OVL_FUNCTION (t));
- else
- line = DECL_SOURCE_LINE (t);
-
- if (line == 0)
- return lineno;
-
- return line;
+ t = OVL_FUNCTION (t);
+
+ return DECL_SOURCE_LOCATION (t);
}
-/* Now the interfaces from cp_error et al to dump_type et al. Each takes an
- on/off VERBOSE flag and supply the appropriate TS_ flags to a dump_
+/* Now the interfaces from error et al to dump_type et al. Each takes an
+ on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
function. */
static const char *
-decl_to_string (decl, verbose)
- tree decl;
- int verbose;
+decl_to_string (tree decl, int verbose)
{
- enum tree_string_flags flags = 0;
+ int flags = 0;
if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
|| TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
- flags = TS_AGGR_TAGS;
+ flags = TFF_CLASS_KEY_OR_ENUM;
if (verbose)
- flags |= TS_DECL_TYPE | TS_DECORATE | TS_PARM_DEFAULTS;
+ flags |= TFF_DECL_SPECIFIERS;
else if (TREE_CODE (decl) == FUNCTION_DECL)
- flags |= TS_DECL_TYPE | TS_FUNC_NORETURN;
- flags |= TS_TEMPLATE_PREFIX;
-
- OB_INIT ();
+ flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
+ flags |= TFF_TEMPLATE_HEADER;
+ reinit_cxx_pp ();
dump_decl (decl, flags);
-
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ return pp_formatted_text (cxx_pp);
}
static const char *
-expr_to_string (decl, verbose)
- tree decl;
- int verbose ATTRIBUTE_UNUSED;
+expr_to_string (tree decl)
{
- OB_INIT ();
-
+ reinit_cxx_pp ();
dump_expr (decl, 0);
-
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ return pp_formatted_text (cxx_pp);
}
static const char *
-fndecl_to_string (fndecl, verbose)
- tree fndecl;
- int verbose;
+fndecl_to_string (tree fndecl, int verbose)
{
- enum tree_string_flags flags;
+ int flags;
- flags = TS_FUNC_THROW | TS_DECL_TYPE;
+ flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
if (verbose)
- flags |= TS_PARM_DEFAULTS;
- OB_INIT ();
-
+ flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
+ reinit_cxx_pp ();
dump_decl (fndecl, flags);
-
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ return pp_formatted_text (cxx_pp);
}
static const char *
-code_to_string (c, v)
- enum tree_code c;
- int v ATTRIBUTE_UNUSED;
+code_to_string (enum tree_code c)
{
return tree_code_name [c];
}
const char *
-language_to_string (c, v)
- enum languages c;
- int v ATTRIBUTE_UNUSED;
+language_to_string (enum languages c)
{
switch (c)
{
return "Java";
default:
- my_friendly_abort (355);
- return 0;
+ gcc_unreachable ();
}
+ return 0;
}
/* Return the proper printed version of a parameter to a C++ function. */
static const char *
-parm_to_string (p, v)
- int p;
- int v ATTRIBUTE_UNUSED;
+parm_to_string (int p)
{
+ reinit_cxx_pp ();
if (p < 0)
- return "`this'";
-
- sprintf (digit_buffer, "%d", p+1);
- return digit_buffer;
+ pp_string (cxx_pp, "'this'");
+ else
+ pp_decimal_int (cxx_pp, p + 1);
+ return pp_formatted_text (cxx_pp);
}
static const char *
-op_to_string (p, v)
- enum tree_code p;
- int v ATTRIBUTE_UNUSED;
+op_to_string (enum tree_code p)
{
- tree id;
-
- id = operator_name_info[(int) p].identifier;
- return id ? IDENTIFIER_POINTER (id) : "{unknown}";
+ tree id = operator_name_info[(int) p].identifier;
+ return id ? IDENTIFIER_POINTER (id) : "<unknown>";
}
static const char *
-type_to_string (typ, verbose)
- tree typ;
- int verbose;
+type_to_string (tree typ, int verbose)
{
- enum tree_string_flags flags;
-
- flags = 0;
+ int flags = 0;
if (verbose)
- flags |= TS_AGGR_TAGS;
- flags |= TS_TEMPLATE_PREFIX;
-
- OB_INIT ();
+ flags |= TFF_CLASS_KEY_OR_ENUM;
+ flags |= TFF_TEMPLATE_HEADER;
+ reinit_cxx_pp ();
dump_type (typ, flags);
-
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ return pp_formatted_text (cxx_pp);
}
static const char *
-assop_to_string (p, v)
- enum tree_code p;
- int v ATTRIBUTE_UNUSED;
+assop_to_string (enum tree_code p)
{
- tree id;
-
- id = assignment_operator_name_info[(int) p].identifier;
+ tree id = assignment_operator_name_info[(int) p].identifier;
return id ? IDENTIFIER_POINTER (id) : "{unknown}";
}
static const char *
-args_to_string (p, verbose)
- tree p;
- int verbose;
+args_to_string (tree p, int verbose)
{
- enum tree_string_flags flags = 0;
+ int flags = 0;
if (verbose)
- flags |= TS_AGGR_TAGS;
+ flags |= TFF_CLASS_KEY_OR_ENUM;
if (p == NULL_TREE)
return "";
if (TYPE_P (TREE_VALUE (p)))
return type_as_string (p, flags);
- OB_INIT ();
+ reinit_cxx_pp ();
for (; p; p = TREE_CHAIN (p))
{
if (TREE_VALUE (p) == null_node)
- OB_PUTS ("NULL");
+ pp_cxx_identifier (cxx_pp, "NULL");
else
dump_type (error_type (TREE_VALUE (p)), flags);
if (TREE_CHAIN (p))
- OB_PUTS (", ");
+ pp_separate_with_comma (cxx_pp);
}
- OB_FINISH ();
- return (char *)obstack_base (&scratch_obstack);
+ return pp_formatted_text (cxx_pp);
}
static const char *
-cv_to_string (p, v)
- tree p;
- int v ATTRIBUTE_UNUSED;
+cv_to_string (tree p, int v)
{
- OB_INIT ();
-
- dump_qualifiers (p, before);
-
- OB_FINISH ();
-
- return (char *)obstack_base (&scratch_obstack);
+ reinit_cxx_pp ();
+ pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
+ pp_cxx_cv_qualifier_seq (cxx_pp, p);
+ return pp_formatted_text (cxx_pp);
}
-static void
-lang_print_error_function (file)
- const char *file;
+/* Langhook for print_error_function. */
+void
+cxx_print_error_function (diagnostic_context *context, const char *file)
{
- output_state os;
-
- default_print_error_function (file);
- os = output_buffer_state (diagnostic_buffer);
- output_set_prefix (diagnostic_buffer, file);
- maybe_print_instantiation_context (diagnostic_buffer);
- output_buffer_state (diagnostic_buffer) = os;
+ lhd_print_error_function (context, file);
+ pp_base_set_prefix (context->printer, file);
+ maybe_print_instantiation_context (context);
}
static void
-cp_diagnostic_starter (buffer, dc)
- output_buffer *buffer;
- diagnostic_context *dc;
+cp_diagnostic_starter (diagnostic_context *context,
+ diagnostic_info *diagnostic)
{
- report_problematic_module (buffer);
- cp_print_error_function (buffer, dc);
- maybe_print_instantiation_context (buffer);
- output_set_prefix (buffer,
- context_as_prefix (diagnostic_file_location (dc),
- diagnostic_line_location (dc),
- diagnostic_is_warning (dc)));
+ diagnostic_report_current_module (context);
+ cp_print_error_function (context, diagnostic);
+ maybe_print_instantiation_context (context);
+ pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
}
static void
-cp_diagnostic_finalizer (buffer, dc)
- output_buffer *buffer;
- diagnostic_context *dc __attribute__ ((__unused__));
+cp_diagnostic_finalizer (diagnostic_context *context,
+ diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
{
- output_destroy_prefix (buffer);
+ pp_base_destroy_prefix (context->printer);
}
/* Print current function onto BUFFER, in the process of reporting
a diagnostic message. Called from cp_diagnostic_starter. */
static void
-cp_print_error_function (buffer, dc)
- output_buffer *buffer;
- diagnostic_context *dc;
+cp_print_error_function (diagnostic_context *context,
+ diagnostic_info *diagnostic)
{
- if (error_function_changed ())
+ if (diagnostic_last_function_changed (context))
{
- char *prefix = diagnostic_file_location (dc)
- ? file_name_as_prefix (diagnostic_file_location (dc))
- : NULL;
- output_state os;
+ const char *old_prefix = context->printer->prefix;
+ const char *file = LOCATION_FILE (diagnostic->location);
+ char *new_prefix = file ? file_name_as_prefix (file) : NULL;
- os = output_buffer_state (buffer);
- output_set_prefix (buffer, prefix);
+ pp_base_set_prefix (context->printer, new_prefix);
if (current_function_decl == NULL)
- output_add_string (buffer, "At global scope:");
+ pp_base_string (context->printer, "At global scope:");
else
- output_printf
- (buffer, "In %s `%s':", function_category (current_function_decl),
- (*decl_printable_name) (current_function_decl, 2));
- output_add_newline (buffer);
-
- record_last_error_function ();
- output_destroy_prefix (buffer);
- output_buffer_state (buffer) = os;
+ pp_printf (context->printer, "In %s %qs:",
+ function_category (current_function_decl),
+ cxx_printable_name (current_function_decl, 2));
+ pp_base_newline (context->printer);
+
+ diagnostic_set_last_function (context);
+ pp_base_destroy_prefix (context->printer);
+ context->printer->prefix = old_prefix;
}
}
/* Returns a description of FUNCTION using standard terminology. */
static const char *
-function_category (fn)
- tree fn;
+function_category (tree fn)
{
if (DECL_FUNCTION_MEMBER_P (fn))
{
/* Report the full context of a current template instantiation,
onto BUFFER. */
static void
-print_instantiation_full_context (buffer)
- output_buffer *buffer;
+print_instantiation_full_context (diagnostic_context *context)
{
tree p = current_instantiation ();
- int line = lineno;
- const char *file = input_filename;
-
+ location_t location = input_location;
+
if (p)
{
if (current_function_decl != TINST_DECL (p)
if (current_function_decl == TINST_DECL (p))
/* Avoid redundancy with the the "In function" line. */;
else
- output_verbatim (buffer, "%s: In instantiation of `%s':\n", file,
- decl_as_string (TINST_DECL (p),
- TS_DECL_TYPE | TS_FUNC_NORETURN));
+ pp_verbatim (context->printer,
+ "%s: In instantiation of %qs:\n",
+ LOCATION_FILE (location),
+ decl_as_string (TINST_DECL (p),
+ TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
- line = TINST_LINE (p);
- file = TINST_FILE (p);
+ location = TINST_LOCATION (p);
p = TREE_CHAIN (p);
}
}
- print_instantiation_partial_context (buffer, p, file, line);
+ print_instantiation_partial_context (context, p, location);
}
/* Same as above but less verbose. */
static void
-print_instantiation_partial_context (buffer, t, file, line)
- output_buffer *buffer;
- tree t;
- const char *file;
- int line;
+print_instantiation_partial_context (diagnostic_context *context,
+ tree t, location_t loc)
{
- for (; t; t = TREE_CHAIN (t))
+ expanded_location xloc;
+ for (; ; t = TREE_CHAIN (t))
{
- output_verbatim
- (buffer, "%s:%d: instantiated from `%s'\n", file, line,
- decl_as_string (TINST_DECL (t), TS_DECL_TYPE | TS_FUNC_NORETURN));
- line = TINST_LINE (t);
- file = TINST_FILE (t);
+ xloc = expand_location (loc);
+ if (t == NULL_TREE)
+ break;
+ pp_verbatim (context->printer, "%s:%d: instantiated from %qs\n",
+ xloc.file, xloc.line,
+ decl_as_string (TINST_DECL (t),
+ TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
+ loc = TINST_LOCATION (t);
}
- output_verbatim (buffer, "%s:%d: instantiated from here\n", file, line);
+ pp_verbatim (context->printer, "%s:%d: instantiated from here\n",
+ xloc.file, xloc.line);
}
/* Called from cp_thing to print the template context for an error. */
static void
-maybe_print_instantiation_context (buffer)
- output_buffer *buffer;
+maybe_print_instantiation_context (diagnostic_context *context)
{
if (!problematic_instantiation_changed () || current_instantiation () == 0)
return;
record_last_problematic_instantiation ();
- print_instantiation_full_context (buffer);
+ print_instantiation_full_context (context);
}
/* Report the bare minimum context of a template instantiation. */
void
-print_instantiation_context ()
+print_instantiation_context (void)
{
print_instantiation_partial_context
- (diagnostic_buffer, current_instantiation (), input_filename, lineno);
- flush_diagnostic_buffer ();
+ (global_dc, current_instantiation (), input_location);
+ diagnostic_flush_buffer (global_dc);
}
\f
/* Called from output_format -- during diagnostic message processing --
to handle C++ specific format specifier with the following meanings:
%A function argument-list.
+ %C tree code.
%D declaration.
%E expression.
%F function declaration.
+ %L language as used in extern "lang".
+ %O binary operator.
%P function parameter whose position is indicated by an integer.
+ %Q assignment operator.
%T type.
%V cv-qualifier. */
-static int
-cp_tree_printer (buffer)
- output_buffer *buffer;
-{
- int be_verbose = 0;
- tree_formatting_info tfi;
-
- bzero (&tfi, sizeof (tree_formatting_info));
-
- if (*output_buffer_text_cursor (buffer) == '+')
- ++output_buffer_text_cursor (buffer);
- if (*output_buffer_text_cursor (buffer) == '#')
+static bool
+cp_printer (pretty_printer *pp, text_info *text)
+{
+ int verbose = 0;
+ const char *result;
+#define next_tree va_arg (*text->args_ptr, tree)
+#define next_tcode va_arg (*text->args_ptr, enum tree_code)
+#define next_lang va_arg (*text->args_ptr, enum languages)
+#define next_int va_arg (*text->args_ptr, int)
+
+ if (*text->format_spec == '+')
+ ++text->format_spec;
+ if (*text->format_spec == '#')
{
- be_verbose = 1;
- ++output_buffer_text_cursor (buffer);
+ verbose = 1;
+ ++text->format_spec;
}
- switch (*output_buffer_text_cursor (buffer))
+ switch (*text->format_spec)
{
- case 'A':
- tree_being_formatted (&tfi) =
- va_arg (output_buffer_format_args (buffer), tree);
- if (be_verbose)
- tree_formatting_flags (&tfi) = TFF_SCOPE
- | TFF_FUNCTION_DEFAULT_ARGUMENTS;
- print_function_argument_list (buffer, &tfi);
- break;
-
- case 'D':
- tree_being_formatted (&tfi) =
- va_arg (output_buffer_format_args (buffer), tree);
- if (be_verbose)
- tree_formatting_flags (&tfi) = TFF_SCOPE | TFF_DECL_SPECIFIERS
- | TFF_CLASS_KEY_OR_ENUM | TFF_RETURN_TYPE
- | TFF_FUNCTION_DEFAULT_ARGUMENTS | TFF_TEMPLATE_DEFAULT_ARGUMENTS
- | TFF_EXCEPTION_SPECIFICATION | TFF_CHASE_NAMESPACE_ALIAS;
- print_declaration (buffer, &tfi);
- break;
-
- case 'E':
- tree_being_formatted (&tfi) =
- va_arg (output_buffer_format_args (buffer), tree);
- if (be_verbose)
- tree_formatting_flags (&tfi) = TFF_SCOPE;
- print_expression (buffer, &tfi);
- break;
-
- case 'F':
- tree_being_formatted (&tfi) =
- va_arg (output_buffer_format_args (buffer), tree);
- if (be_verbose)
- tree_formatting_flags (&tfi) = TFF_SCOPE | TFF_DECL_SPECIFIERS
- | TFF_RETURN_TYPE | TFF_FUNCTION_DEFAULT_ARGUMENTS
- | TFF_EXCEPTION_SPECIFICATION;
- print_function_declaration (buffer, &tfi);
- break;
-
- case 'P':
- print_function_parameter
- (buffer, va_arg (output_buffer_format_args (buffer), int));
- break;
-
- case 'T':
- tree_being_formatted (&tfi) =
- va_arg (output_buffer_format_args (buffer), tree);
- if (be_verbose)
- tree_formatting_flags (&tfi) = TFF_SCOPE | TFF_CLASS_KEY_OR_ENUM
- | TFF_RETURN_TYPE | TFF_EXCEPTION_SPECIFICATION;
- print_type_id (buffer, &tfi);
- break;
-
- case 'V':
- tree_being_formatted (&tfi) =
- va_arg (output_buffer_format_args (buffer), tree);
- print_cv_qualifier_seq (buffer, &tfi);
- break;
-
+ case 'A': result = args_to_string (next_tree, verbose); break;
+ case 'C': result = code_to_string (next_tcode); break;
+ case 'D': result = decl_to_string (next_tree, verbose); break;
+ case 'E': result = expr_to_string (next_tree); break;
+ case 'F': result = fndecl_to_string (next_tree, verbose); break;
+ case 'L': result = language_to_string (next_lang); break;
+ case 'O': result = op_to_string (next_tcode); break;
+ case 'P': result = parm_to_string (next_int); break;
+ case 'Q': result = assop_to_string (next_tcode); break;
+ case 'T': result = type_to_string (next_tree, verbose); break;
+ case 'V': result = cv_to_string (next_tree, verbose); break;
+
default:
- return 0;
+ return false;
}
- return 1;
-}
-
-/* Print a function argument-list represented by tree_being_formatted (TFI)
- onto BUFFER. */
-static void
-print_function_argument_list (buffer, tfi)
- output_buffer *buffer __attribute__ ((__unused__));
- tfi_t tfi __attribute__ ((__unused__));
-{
-}
-
-/* Print a declaration represented by tree_being_formatted (TFI)
- onto buffer. */
-static void
-print_declaration (buffer, tfi)
- output_buffer *buffer __attribute__ ((__unused__));
- tfi_t tfi __attribute__ ((__unused__));
-{
-}
-
-/* Print an expression represented by tree_being_formatted (TFI)
- onto BUFFER. */
-static void
-print_expression (buffer, tfi)
- output_buffer *buffer __attribute__ ((__unused__));
- tfi_t tfi __attribute__ ((__unused__));
-{
+ pp_base_string (pp, result);
+ return true;
+#undef next_tree
+#undef next_tcode
+#undef next_lang
+#undef next_int
}
-/* Print a function declaration represented by tree_being_formatted (TFI)
- onto BUFFER. */
-static void
-print_function_declaration (buffer, tfi)
- output_buffer *buffer __attribute__ ((__unused__));
- tfi_t tfi __attribute__ ((__unused__));
-{
-}
-
-/* Print the N'th function parameter onto BUFFER. A negative value of N
- means the implicit "this" parameter of a member function. */
-static void
-print_function_parameter (buffer, n)
- output_buffer *buffer;
- int n;
-{
- if (n < 0)
- print_identifier (buffer, "this");
- else
- output_decimal (buffer, n + 1);
-}
-\f
-/* Print a type represented by tree_being_formatted (TFI) onto BUFFER. */
-static void
-print_type_id (buffer, tfi)
- output_buffer *buffer;
- tfi_t tfi;
-{
- tree t = tree_being_formatted (tfi);
- int flags = tree_formatting_flags (tfi);
- if (t == NULL_TREE)
- return;
-
- if (flags & TFF_CHASE_TYPEDEF)
- tree_being_formatted (tfi) =
- typedef_original_name (tree_being_formatted (tfi));
-
- /* A type-id is of the form:
- type-id:
- type-specifier-seq abstract-declarator(opt) */
- print_type_specifier_seq (buffer, tfi);
-
- if (TYPE_PTRMEMFUNC_P (t))
- goto ptr_mem_fun;
-
- /* For types with abstract-declarator, print_type_specifier_seq prints
- the start of the abstract-declarator. Fiinish the job. */
- switch (TREE_CODE (t))
- {
- case ARRAY_TYPE:
- case POINTER_TYPE:
- case REFERENCE_TYPE:
- case OFFSET_TYPE:
- case METHOD_TYPE:
- case FUNCTION_TYPE:
- ptr_mem_fun:
- print_rest_of_abstract_declarator (buffer, tfi);
-
- default:
- break;
- }
-
- tree_being_formatted (tfi) = t;
-}
-
-/* Print the type-specifier-seq part of a type-id. If appropriate, print
- also the prefix of the abstract-declarator. */
-static void
-print_type_specifier_seq (buffer, tfi)
- output_buffer *buffer;
- tfi_t tfi;
-{
- int flags = tree_formatting_flags (tfi);
- tree t = tree_being_formatted (tfi);
- enum tree_code code = TREE_CODE (t);
-
- /* A type-speficier-seq is:
- type-specifier type-specifier-seq(opt)
- where
- type-specifier:
- simple-type-specifier
- class-specifier
- enum-specifier
- elaborated-type-specifier
- cv-qualifier
-
- We do not, however, pretty-print class-specifier nor enum-specifier. */
-
- switch (code)
- {
- case UNKNOWN_TYPE:
- case IDENTIFIER_NODE:
- case VOID_TYPE:
- case INTEGER_TYPE:
- case REAL_TYPE:
- case COMPLEX_TYPE:
- case ENUMERAL_TYPE:
- case BOOLEAN_TYPE:
- case UNION_TYPE:
- case TYPE_DECL:
- case TEMPLATE_DECL:
- case TEMPLATE_TYPE_PARM:
- case TYPEOF_TYPE:
- case TEMPLATE_TEMPLATE_PARM:
- case TYPENAME_TYPE:
- class_type:
- print_cv_qualifier_seq (buffer, tfi);
- if ((flags & TFF_DECL_SPECIFIERS)
- && (code == TYPENAME_TYPE || IS_AGGR_TYPE (t)))
- print_elaborated_type_specifier (buffer, tfi);
- else
- print_simple_type_specifier (buffer, tfi);
- break;
-
- /* Because the abstract-declarator can modify the type-specifier-seq
- in a highly non linear manner, we pretty-print its prefix here.
- The suffix part is handled by print_rest_of_abstract_declarator. */
-
- /* A RECORD_TYPE is also used to represent a pointer to member
- function. */
- case RECORD_TYPE:
- if (TYPE_PTRMEMFUNC_P (t))
- {
- /* Print the return type. */
- tree_being_formatted (tfi) =
- TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (t));
- print_type_id (buffer, tfi);
- print_whitespace (buffer, tfi);
-
- /* Then the beginning of the abstract-declarator part. */
- tree_being_formatted (tfi) =
- TYPE_METHOD_BASETYPE (TYPE_PTRMEMFUNC_FN_TYPE (t));
- print_left_paren (buffer);
- print_nested_name_specifier (buffer, tfi);
- }
- else
- goto class_type;
- break;
-
- case POINTER_TYPE:
- if (TYPE_PTRMEM_P (t))
- goto ptr_data_member;
- else
- goto non_ptr_data_member;
- break;
-
- case ARRAY_TYPE:
- case REFERENCE_TYPE:
- case FUNCTION_TYPE:
- case METHOD_TYPE:
- non_ptr_data_member:
- tree_being_formatted (tfi) = TREE_TYPE (t);
- print_type_specifier_seq (buffer, tfi);
- if (code == POINTER_TYPE || code == REFERENCE_TYPE)
- {
- if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
- print_left_paren (buffer);
- }
- else if (code == FUNCTION_TYPE || code == METHOD_TYPE)
- {
- print_whitespace (buffer, tfi);
- print_left_paren (buffer);
- if (code == METHOD_TYPE)
- {
- tree_being_formatted (tfi) = TYPE_METHOD_BASETYPE (t);
- print_nested_name_specifier (buffer, tfi);
- tree_being_formatted (tfi) = t;
- }
- }
- tree_being_formatted (tfi) = t;
- break;
-
- ptr_data_member:
- case OFFSET_TYPE:
- /* Firstly, the type of the member. */
- tree_being_formatted (tfi) = TREE_TYPE (t);
- print_type_id (buffer, tfi);
- print_whitespace (buffer, tfi);
-
- /* Then, the containing class. */
- tree_being_formatted (tfi) = TYPE_OFFSET_BASETYPE (t);
- print_nested_name_specifier (buffer, tfi);
- tree_being_formatted (tfi) = t;
- break;
-
- default:
- sorry_for_unsupported_tree (t);
- /* fall throught */
-
- case ERROR_MARK:
- print_identifier (buffer, "{type-specifier-seq error}");
- break;
- }
-
- tree_being_formatted (tfi) = t;
-}
+/* These are temporary wrapper functions which handle the historic
+ behavior of cp_*_at. */
-/* Print the simpe-type-specifier component of a type-specifier. */
-static void
-print_simple_type_specifier (buffer, tfi)
- output_buffer *buffer;
- tfi_t tfi;
+static tree
+locate_error (const char *msgid, va_list ap)
{
- int flags = tree_formatting_flags (tfi);
- tree t = tree_being_formatted (tfi);
- enum tree_code code = TREE_CODE (t);
+ tree here = 0, t;
+ int plus = 0;
+ const char *f;
- switch (code)
+ for (f = msgid; *f; f++)
{
- case UNKNOWN_TYPE:
- print_identifier (buffer, "{unknown type}");
- break;
-
- case IDENTIFIER_NODE:
- print_tree_identifier (buffer, t);
- break;
-
- case COMPLEX_TYPE:
- print_identifier (buffer, "__complex__ ");
- tree_being_formatted (tfi) = TREE_TYPE (t);
- print_type_id (buffer, tfi);
- break;
-
- case TYPENAME_TYPE:
- tree_being_formatted (tfi) = TYPE_CONTEXT (t);
- print_nested_name_specifier (buffer, tfi);
- tree_being_formatted (tfi) = TYPENAME_TYPE_FULLNAME (t);
- tree_formatting_flags (tfi) |= ~TFF_CHASE_TYPEDEF;
- print_type_id (buffer, tfi);
- break;
-
- case TYPEOF_TYPE:
- print_identifier (buffer, "__typeof__");
- tree_being_formatted (tfi) = TYPE_FIELDS (t);
- print_left_paren (buffer);
- print_expression (buffer, tfi);
- print_right_paren (buffer);
- break;
+ plus = 0;
+ if (*f == '%')
+ {
+ if (*++f == 'q')
+ ++f; /* ignore quoting flag. */
- case INTEGER_TYPE:
- if (TREE_UNSIGNED (t))
- {
- if (TYPE_MAIN_VARIANT (t) == integer_type_node)
- /* We don't want pedantry like `unsigned int'. */;
- else if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)))
+ if (*f == '+')
{
- print_identifier (buffer, "unsigned");
- print_whitespace (buffer, tfi);
+ ++f;
+ plus = 1;
}
- }
- else if (TYPE_MAIN_VARIANT (t) == char_type_node)
- {
- print_identifier (buffer, "signed");
- print_whitespace (buffer, tfi);
- }
- case REAL_TYPE:
- case BOOLEAN_TYPE:
- case VOID_TYPE:
- {
- tree s = (flags & TFF_CHASE_TYPEDEF) ? TYPE_MAIN_VARIANT (t) : t;
-
- if (TYPE_NAME (s) && TYPE_IDENTIFIER (s))
- print_tree_identifier (buffer, TYPE_IDENTIFIER (s));
- else
- /* Types like intQI_type_node and friends have no names.
- These don't come up in user error messages, but it's nice
- to be able to print them from the debugger. */
- print_identifier (buffer, "{anonymous}");
- }
- break;
+ if (*f == '#')
+ f++;
- case TEMPLATE_TEMPLATE_PARM:
- if (TYPE_IDENTIFIER (t))
- print_tree_identifier (buffer, TYPE_IDENTIFIER (t));
- else
- print_identifier (buffer, "{anonymous template template parameter}");
- break;
-
- case TYPE_DECL:
- if (flags & TFF_CHASE_TYPEDEF)
- print_type_id (buffer, tfi);
- else
- print_tree_identifier (buffer, DECL_NAME (t));
- break;
-
- case BOUND_TEMPLATE_TEMPLATE_PARM:
- case TEMPLATE_DECL:
- print_template_id (buffer, tfi);
- break;
-
- case TEMPLATE_TYPE_PARM:
- if (TYPE_IDENTIFIER (t))
- print_tree_identifier (buffer, TYPE_IDENTIFIER (t));
- else
- print_identifier (buffer, "{anonymous template type parameter}");
- break;
+ switch (*f)
+ {
+ /* Just ignore these possibilities. */
+ case '%': break;
+ case 'P':
+ case 'd': (void) va_arg (ap, int); break;
+ case 's': (void) va_arg (ap, char *); break;
+ case 'L': (void) va_arg (ap, enum languages); break;
+ case 'C':
+ case 'O':
+ case 'Q': (void) va_arg (ap, enum tree_code); break;
+
+ /* These take a tree, which may be where the error is
+ located. */
+ case 'A':
+ case 'D':
+ case 'E':
+ case 'F':
+ case 'T':
+ case 'V':
+ t = va_arg (ap, tree);
+ if (!here || plus)
+ here = t;
+ break;
- default:
- break;
+ default:
+ errorcount = 0; /* damn ICE suppression */
+ internal_error ("unexpected letter %qc in locate_error\n", *f);
+ }
+ }
}
- tree_being_formatted (tfi) = t;
- tree_formatting_flags (tfi) = flags;
-}
-
-/* Print the elaborated-type-specifier form of a type-specifier. */
-static void
-print_elaborated_type_specifier (buffer, tfi)
- output_buffer *buffer;
- tfi_t tfi;
-{
- int flags = tree_formatting_flags (tfi);
- tree t = tree_being_formatted (tfi);
-
- switch (TREE_CODE (t))
- {
- case TYPENAME_TYPE:
- print_identifier (buffer, "typename");
- print_whitespace (buffer, tfi);
- tree_formatting_flags (tfi) |= ~TFF_DECL_SPECIFIERS;
- print_simple_type_specifier (buffer, tfi);
- break;
-
- case UNION_TYPE:
- case RECORD_TYPE:
- {
- tree name = NULL_TREE;
-
- if (flags & TFF_CHASE_TYPEDEF)
- tree_being_formatted (tfi) = typedef_original_name (t);
+ if (here == 0)
+ here = va_arg (ap, tree);
- print_identifier
- (buffer, class_key_or_enum (tree_being_formatted (tfi)));
- print_whitespace (buffer, tfi);
-
- name = TYPE_NAME (tree_being_formatted (tfi));
- if (name)
- {
- if (flags & TFF_SCOPE)
- {
- tree_being_formatted (tfi) = CP_DECL_CONTEXT (name);
- print_nested_name_specifier (buffer, tfi);
- }
- print_tree_identifier (buffer, DECL_NAME (name));
- }
- else
- print_identifier (buffer, "{anonymous}");
- }
- break;
-
- default:
- sorry_for_unsupported_tree (t);
- break;
- }
-
- tree_being_formatted (tfi) = t;
- tree_formatting_flags (tfi) = flags;
+ return here;
}
-/* Finish the job of printing the abstract-declarator part of a
- type-id. */
-static void
-print_rest_of_abstract_declarator (buffer, tfi)
- output_buffer *buffer;
- tfi_t tfi;
-{
- tree t = tree_being_formatted (tfi);
- enum tree_code code = TREE_CODE (t);
-
- /* An abstract-declarator has the form:
- abstract-declarator:
- ptr-operator abstract-declarator(opt)
- direct-abstract-declarator
-
- direct-abstract-declarator:
- direct-abstract-declarator(opt)
- ( parameter-declaration-clause ) cv-qualifier-seq(opt)
- exception-specification(opt)
- direct-abstract-declarator(opt) [ constant-expression(opt) ]
- ( direct-abstract-declarator ) */
-
- switch (code)
- {
- case ARRAY_TYPE:
- print_left_bracket (buffer);
- if (TYPE_DOMAIN (t))
- {
- tree s = TYPE_DOMAIN (t);
-
- if (host_integerp (TYPE_MAX_VALUE (s), 0))
- output_decimal (buffer, tree_low_cst (TYPE_MAX_VALUE (s), 0) + 1);
- else if (TREE_CODE (TYPE_MAX_VALUE (s)) == MINUS_EXPR)
- {
- tree_being_formatted (tfi) =
- TREE_OPERAND (TYPE_MAX_VALUE (s), 0);
- print_expression (buffer, tfi);
- tree_being_formatted (tfi) = t;
- }
- else
- {
- tree_being_formatted (tfi) = fold
- (cp_build_binary_op (PLUS_EXPR, TYPE_MAX_VALUE (s),
- integer_one_node));
- print_expression (buffer, tfi);
- tree_being_formatted (tfi) = t;
- }
- }
- print_right_bracket (buffer);
- put_whitespace (tfi) = none;
- tree_being_formatted (tfi) = TREE_TYPE (t);
- print_rest_of_abstract_declarator (buffer, tfi);
- tree_being_formatted (tfi) = t;
- break;
-
- case POINTER_TYPE:
- case REFERENCE_TYPE:
- case OFFSET_TYPE:
- if (code == POINTER_TYPE || code == REFERENCE_TYPE)
- {
- output_add_character (buffer, "&*"[code == POINTER_TYPE]);
- if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
- print_right_paren (buffer);
- }
- put_whitespace (tfi) = before;
- print_cv_qualifier_seq (buffer, tfi);
- tree_being_formatted (tfi) = TREE_TYPE (t);
- print_rest_of_abstract_declarator (buffer, tfi);
- tree_being_formatted (tfi) = t;
- break;
-
- case FUNCTION_TYPE:
- case METHOD_TYPE:
- print_right_paren (buffer);
- print_whitespace (buffer, tfi);
-
- /* Skip the `this' implicit parameter if present. */
- tree_being_formatted (tfi) = TYPE_ARG_TYPES (t);
- if (code == METHOD_TYPE)
- tree_being_formatted (tfi) = TREE_CHAIN (tree_being_formatted (tfi));
-
- /* Print the parameter-list. */
- print_left_paren (buffer);
- print_parameter_declaration_clause (buffer, tfi);
- print_right_paren (buffer);
-
- print_whitespace (buffer, tfi);
-
- if (code == METHOD_TYPE)
- {
- tree_being_formatted (tfi) =
- TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t)));
- print_cv_qualifier_seq (buffer, tfi);
- }
-
- /* Finish the abstract-declarator. */
- tree_being_formatted (tfi) = TREE_TYPE (t);
- print_rest_of_abstract_declarator (buffer, tfi);
-
- /* Print the exception-specification for documentaion purpose. */
- tree_being_formatted (tfi) = TYPE_RAISES_EXCEPTIONS (t);
- print_exception_specification (buffer, tfi);
- tree_being_formatted (tfi) = t;
- break;
-
- /* These types don't have abstract-declarator. */
- case UNKNOWN_TYPE:
- case IDENTIFIER_NODE:
- case VOID_TYPE:
- case INTEGER_TYPE:
- case REAL_TYPE:
- case COMPLEX_TYPE:
- case ENUMERAL_TYPE:
- case BOOLEAN_TYPE:
- case UNION_TYPE:
- case TYPE_DECL:
- case TEMPLATE_DECL:
- case TEMPLATE_TYPE_PARM:
- case TYPEOF_TYPE:
- case TEMPLATE_TEMPLATE_PARM:
- case TYPENAME_TYPE:
- break;
-
- default:
- sorry_for_unsupported_tree (t);
- /* fall throught. */
- case ERROR_MARK:
- break;
- }
-}
-
-/* Print the cv-quafilers of tree_being_formatted (TFI) onto BUFFER. */
-static void
-print_cv_qualifier_seq (buffer, tfi)
- output_buffer *buffer;
- tree_formatting_info *tfi;
+void
+cp_error_at (const char *msgid, ...)
{
- int cv = TYPE_QUALS (tree_being_formatted (tfi));
- int pad_after = after == put_whitespace (tfi);
- static const int mask[]
- = {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT};
- static const char *const qualifier[]
- = { "const", "volatile", "__restrict__" };
-
- if (cv != 0)
- {
- int i;
- for (i = 0; i != 3; ++i)
- if (mask[i] & cv)
- {
- if (put_whitespace (tfi) == before)
- output_add_space (buffer);
- print_identifier (buffer, qualifier[i]);
- put_whitespace (tfi) = before;
- }
+ tree here;
+ diagnostic_info diagnostic;
+ va_list ap;
- if (pad_after)
- {
- output_add_space (buffer);
- put_whitespace (tfi) = none;
- }
- }
-}
+ va_start (ap, msgid);
+ here = locate_error (msgid, ap);
+ va_end (ap);
-static void
-print_parameter_declaration_clause (buffer, tfi)
- output_buffer *buffer __attribute__ ((__unused__));
- tfi_t tfi __attribute__ ((__unused__));
-{
+ va_start (ap, msgid);
+ diagnostic_set_info (&diagnostic, msgid, &ap,
+ input_location, DK_ERROR);
+ cp_diagnostic_starter (global_dc, &diagnostic);
+ diagnostic_set_info (&diagnostic, msgid, &ap,
+ location_of (here), DK_ERROR);
+ report_diagnostic (&diagnostic);
+ va_end (ap);
}
-static void
-print_exception_specification (buffer, tfi)
- output_buffer *buffer __attribute__ ((__unused__));
- tfi_t tfi __attribute__ ((__unused__));
+void
+cp_warning_at (const char *msgid, ...)
{
-}
+ tree here;
+ diagnostic_info diagnostic;
+ va_list ap;
-static void
-print_nested_name_specifier (buffer, tfi)
- output_buffer *buffer;
- tfi_t tfi;
-{
- int flags = tree_formatting_flags (tfi);
- tree t = tree_being_formatted (tfi);
- /* A nested-name-specifier is:
- class-or-namespace-name :: nested-name-specifier(opt)
- class-or-namespace-name :: template nested-name-specifier
-
- The latter form being the correct syntax for a name designating
- a template member, where the preceding class-or-namespace-name part
- is name-dependent. For the time being, we do not do such a
- sophisticated pretty-printing.
-
- class-or-namespace-name:
- class-name
- namespace-name */
-
- if (t == NULL_TREE || t == global_namespace)
- return;
+ va_start (ap, msgid);
+ here = locate_error (msgid, ap);
+ va_end (ap);
- if (CLASS_TYPE_P (t) && !(flags & TFF_CLASS_SCOPE))
- return;
-
- if (TREE_CODE (t) == NAMESPACE_DECL && !(flags & TFF_NAMESPACE_SCOPE))
- return;
-
- tree_being_formatted (tfi) = DECL_CONTEXT (t);
- print_nested_name_specifier (buffer, tfi);
- print_scope_operator (buffer);
- if (TREE_CODE (t) == NAMESPACE_DECL)
- print_tree_identifier (buffer, DECL_NAME (t));
- else if (CLASS_TYPE_P (t))
- {
- if (!DECL_USE_TEMPLATE (t))
- print_tree_identifier (buffer, TYPE_IDENTIFIER (t));
- else
- {
- tree_being_formatted (tfi) = t;
- print_template_id (buffer, tfi);
- }
- }
-
- tree_being_formatted (tfi) = t;
-}
-
-static void
-print_template_id (buffer, tfi)
- output_buffer *buffer;
- tfi_t tfi __attribute__ ((__unused__));
-{
- print_template_argument_list_start (buffer);
- /* ... */
- print_template_argument_list_end (buffer);
+ va_start (ap, msgid);
+ diagnostic_set_info (&diagnostic, msgid, &ap,
+ location_of (here), DK_WARNING);
+ report_diagnostic (&diagnostic);
+ va_end (ap);
}
-static tree
-typedef_original_name (t)
- tree t;
+void
+cp_pedwarn_at (const char *msgid, ...)
{
- return DECL_ORIGINAL_TYPE (t) ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t);
-}
+ tree here;
+ diagnostic_info diagnostic;
+ va_list ap;
-static void
-print_template_argument_list_start (buffer)
- output_buffer *buffer __attribute__ ((__unused__));
-{
-}
+ va_start (ap, msgid);
+ here = locate_error (msgid, ap);
+ va_end (ap);
-static void
-print_template_argument_list_end (buffer)
- output_buffer *buffer __attribute__ ((__unused__));
-{
+ va_start (ap, msgid);
+ diagnostic_set_info (&diagnostic, msgid, &ap,
+ location_of (here), pedantic_error_kind());
+ report_diagnostic (&diagnostic);
+ va_end (ap);
}