1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002
4 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
30 #include "diagnostic.h"
32 enum pad { none, before, after };
34 #define sorry_for_unsupported_tree(T) \
35 sorry ("`%s' not supported by %s", tree_code_name[(int) TREE_CODE (T)], \
38 #define print_scope_operator(BUFFER) output_add_string ((BUFFER), "::")
39 #define print_left_paren(BUFFER) output_add_character ((BUFFER), '(')
40 #define print_right_paren(BUFFER) output_add_character ((BUFFER), ')')
41 #define print_left_bracket(BUFFER) output_add_character ((BUFFER), '[')
42 #define print_right_bracket(BUFFER) output_add_character ((BUFFER), ']')
43 #define print_template_argument_list_start(BUFFER) \
44 print_non_consecutive_character ((BUFFER), '<')
45 #define print_template_argument_list_end(BUFFER) \
46 print_non_consecutive_character ((BUFFER), '>')
47 #define print_whitespace(BUFFER, TFI) \
49 output_add_space (BUFFER); \
50 put_whitespace (TFI) = none; \
52 #define print_tree_identifier(BUFFER, TID) \
53 output_add_string ((BUFFER), IDENTIFIER_POINTER (TID))
54 #define print_identifier(BUFFER, ID) output_add_string ((BUFFER), (ID))
55 #define separate_with_comma(BUFFER) output_add_string ((BUFFER), ", ")
57 /* The global buffer where we dump everything. It is there only for
58 transitional purpose. It is expected, in the near future, to be
59 completely removed. */
60 static output_buffer scratch_buffer_rec;
61 static output_buffer *scratch_buffer = &scratch_buffer_rec;
63 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
65 #define reinit_global_formatting_buffer() \
66 output_clear_message_text (scratch_buffer)
68 static const char *args_to_string PARAMS ((tree, int));
69 static const char *assop_to_string PARAMS ((enum tree_code, int));
70 static const char *code_to_string PARAMS ((enum tree_code, int));
71 static const char *cv_to_string PARAMS ((tree, int));
72 static const char *decl_to_string PARAMS ((tree, int));
73 static const char *expr_to_string PARAMS ((tree, int));
74 static const char *fndecl_to_string PARAMS ((tree, int));
75 static const char *op_to_string PARAMS ((enum tree_code, int));
76 static const char *parm_to_string PARAMS ((int, int));
77 static const char *type_to_string PARAMS ((tree, int));
79 static void dump_type PARAMS ((tree, int));
80 static void dump_typename PARAMS ((tree, int));
81 static void dump_simple_decl PARAMS ((tree, tree, int));
82 static void dump_decl PARAMS ((tree, int));
83 static void dump_template_decl PARAMS ((tree, int));
84 static void dump_function_decl PARAMS ((tree, int));
85 static void dump_expr PARAMS ((tree, int));
86 static void dump_unary_op PARAMS ((const char *, tree, int));
87 static void dump_binary_op PARAMS ((const char *, tree, int));
88 static void dump_aggr_type PARAMS ((tree, int));
89 static enum pad dump_type_prefix PARAMS ((tree, int));
90 static void dump_type_suffix PARAMS ((tree, int));
91 static void dump_function_name PARAMS ((tree, int));
92 static void dump_expr_list PARAMS ((tree, int));
93 static void dump_global_iord PARAMS ((tree));
94 static enum pad dump_qualifiers PARAMS ((tree, enum pad));
95 static void dump_char PARAMS ((int));
96 static void dump_parameters PARAMS ((tree, int));
97 static void dump_exception_spec PARAMS ((tree, int));
98 static const char *class_key_or_enum PARAMS ((tree));
99 static void dump_template_argument PARAMS ((tree, int));
100 static void dump_template_argument_list PARAMS ((tree, int));
101 static void dump_template_parameter PARAMS ((tree, int));
102 static void dump_template_bindings PARAMS ((tree, tree));
103 static void dump_scope PARAMS ((tree, int));
104 static void dump_template_parms PARAMS ((tree, int, int));
106 static const char *function_category PARAMS ((tree));
107 static void lang_print_error_function PARAMS ((diagnostic_context *,
109 static void maybe_print_instantiation_context PARAMS ((output_buffer *));
110 static void print_instantiation_full_context PARAMS ((output_buffer *));
111 static void print_instantiation_partial_context PARAMS ((output_buffer *, tree,
113 static void cp_diagnostic_starter PARAMS ((output_buffer *,
114 diagnostic_context *));
115 static void cp_diagnostic_finalizer PARAMS ((output_buffer *,
116 diagnostic_context *));
117 static void cp_print_error_function PARAMS ((output_buffer *,
118 diagnostic_context *));
120 static int cp_printer PARAMS ((output_buffer *));
121 static void print_non_consecutive_character PARAMS ((output_buffer *, int));
122 static void print_integer PARAMS ((output_buffer *, HOST_WIDE_INT));
123 static tree locate_error PARAMS ((const char *, va_list));
128 print_error_function = lang_print_error_function;
129 diagnostic_starter (global_dc) = cp_diagnostic_starter;
130 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
131 diagnostic_format_decoder (global_dc) = cp_printer;
133 init_output_buffer (scratch_buffer, /* prefix */NULL, /* line-width */0);
136 /* Dump a scope, if deemed necessary. */
139 dump_scope (scope, flags)
143 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
145 if (scope == NULL_TREE)
148 if (TREE_CODE (scope) == NAMESPACE_DECL)
150 if (scope != global_namespace)
152 dump_decl (scope, f);
153 print_scope_operator (scratch_buffer);
156 else if (AGGREGATE_TYPE_P (scope))
158 dump_type (scope, f);
159 print_scope_operator (scratch_buffer);
161 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
163 dump_function_decl (scope, f);
164 print_scope_operator (scratch_buffer);
168 /* Dump type qualifiers, providing padding as requested. Return an
169 indication of whether we dumped something. */
172 dump_qualifiers (t, p)
176 static const int masks[] =
177 {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT};
178 static const char *const names[] =
179 {"const", "volatile", "__restrict"};
181 int quals = TYPE_QUALS (t);
182 int do_after = p == after;
186 for (ix = 0; ix != 3; ix++)
187 if (masks[ix] & quals)
190 output_add_space (scratch_buffer);
192 print_identifier (scratch_buffer, names[ix]);
195 output_add_space (scratch_buffer);
202 /* This must be large enough to hold any printed integer or floating-point
204 static char digit_buffer[128];
206 /* Dump the template ARGument under control of FLAGS. */
209 dump_template_argument (arg, flags)
213 if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
214 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
216 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
219 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
223 dump_template_argument_list (args, flags)
227 int n = TREE_VEC_LENGTH (args);
231 for (i = 0; i< n; ++i)
234 separate_with_comma (scratch_buffer);
235 dump_template_argument (TREE_VEC_ELT (args, i), flags);
240 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
243 dump_template_parameter (parm, flags)
247 tree p = TREE_VALUE (parm);
248 tree a = TREE_PURPOSE (parm);
250 if (TREE_CODE (p) == TYPE_DECL)
252 if (flags & TFF_DECL_SPECIFIERS)
254 print_identifier (scratch_buffer, "class");
257 output_add_space (scratch_buffer);
258 print_tree_identifier (scratch_buffer, DECL_NAME (p));
261 else if (DECL_NAME (p))
262 print_tree_identifier (scratch_buffer, DECL_NAME (p));
264 print_identifier (scratch_buffer, "{template default argument error}");
267 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
269 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
271 output_add_string (scratch_buffer, " = ");
272 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
273 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
275 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
279 /* Dump, under control of FLAGS, a template-parameter-list binding.
280 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
284 dump_template_bindings (parms, args)
291 tree p = TREE_VALUE (parms);
292 int lvl = TMPL_PARMS_DEPTH (parms);
296 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
298 tree arg = NULL_TREE;
300 /* Don't crash if we had an invalid argument list. */
301 if (TMPL_ARGS_DEPTH (args) >= lvl)
303 tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
304 if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
305 arg = TREE_VEC_ELT (lvl_args, arg_idx);
309 separate_with_comma (scratch_buffer);
310 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
311 output_add_string (scratch_buffer, " = ");
313 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
315 print_identifier (scratch_buffer, "<missing>");
321 parms = TREE_CHAIN (parms);
325 /* Dump into the obstack a human-readable equivalent of TYPE. FLAGS
326 controls the format. */
336 if (TYPE_PTRMEMFUNC_P (t))
339 switch (TREE_CODE (t))
342 print_identifier (scratch_buffer, "<unknown type>");
346 /* A list of function parms. */
347 dump_parameters (t, flags);
350 case IDENTIFIER_NODE:
351 print_tree_identifier (scratch_buffer, t);
355 dump_type (BINFO_TYPE (t), flags);
361 dump_aggr_type (t, flags);
365 if (flags & TFF_CHASE_TYPEDEF)
367 dump_type (DECL_ORIGINAL_TYPE (t)
368 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
371 /* else fallthrough */
375 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
379 output_add_string (scratch_buffer, "__complex__ ");
380 dump_type (TREE_TYPE (t), flags);
384 output_add_string (scratch_buffer, "vector ");
386 /* The subtype of a VECTOR_TYPE is something like intQI_type_node,
387 which has no name and is not very useful for diagnostics. So
388 look up the equivalent C type and print its name. */
389 tree elt = TREE_TYPE (t);
390 elt = type_for_mode (TYPE_MODE (elt), TREE_UNSIGNED (elt));
391 dump_type (elt, flags);
396 if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && TREE_UNSIGNED (t))
397 output_add_string (scratch_buffer, "unsigned ");
398 else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && !TREE_UNSIGNED (t))
399 output_add_string (scratch_buffer, "signed ");
407 dump_qualifiers (t, after);
408 type = flags & TFF_CHASE_TYPEDEF ? TYPE_MAIN_VARIANT (t) : t;
409 if (TYPE_NAME (type) && TYPE_IDENTIFIER (type))
410 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (type));
412 /* Types like intQI_type_node and friends have no names.
413 These don't come up in user error messages, but it's nice
414 to be able to print them from the debugger. */
415 print_identifier (scratch_buffer, "<anonymous>");
419 case TEMPLATE_TEMPLATE_PARM:
420 /* For parameters inside template signature. */
421 if (TYPE_IDENTIFIER (t))
422 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
425 (scratch_buffer, "<anonymous template template parameter>");
428 case BOUND_TEMPLATE_TEMPLATE_PARM:
430 tree args = TYPE_TI_ARGS (t);
431 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
432 print_template_argument_list_start (scratch_buffer);
433 dump_template_argument_list (args, flags);
434 print_template_argument_list_end (scratch_buffer);
438 case TEMPLATE_TYPE_PARM:
439 dump_qualifiers (t, after);
440 if (TYPE_IDENTIFIER (t))
441 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
444 (scratch_buffer, "<anonymous template type parameter>");
447 /* This is not always necessary for pointers and such, but doing this
448 reduces code size. */
457 dump_type_prefix (t, flags);
458 dump_type_suffix (t, flags);
462 if (IMPLICIT_TYPENAME_P (t))
463 output_add_string (scratch_buffer, "typename ");
464 dump_typename (t, flags);
467 case UNBOUND_CLASS_TEMPLATE:
468 dump_type (TYPE_CONTEXT (t), flags);
469 print_scope_operator (scratch_buffer);
470 print_identifier (scratch_buffer, "template ");
471 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
475 output_add_string (scratch_buffer, "__typeof (");
476 dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS);
477 print_right_paren (scratch_buffer);
481 sorry_for_unsupported_tree (t);
482 /* Fall through to error. */
485 print_identifier (scratch_buffer, "<type error>");
490 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
494 dump_typename (t, flags)
498 tree ctx = TYPE_CONTEXT (t);
500 if (TREE_CODE (ctx) == TYPENAME_TYPE)
501 dump_typename (ctx, flags);
503 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
504 print_scope_operator (scratch_buffer);
505 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
508 /* Return the name of the supplied aggregate, or enumeral type. */
511 class_key_or_enum (t)
514 if (TREE_CODE (t) == ENUMERAL_TYPE)
516 else if (TREE_CODE (t) == UNION_TYPE)
518 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
524 /* Print out a class declaration T under the control of FLAGS,
525 in the form `class foo'. */
528 dump_aggr_type (t, flags)
533 const char *variety = class_key_or_enum (t);
537 dump_qualifiers (t, after);
539 if (flags & TFF_CLASS_KEY_OR_ENUM)
541 print_identifier (scratch_buffer, variety);
542 output_add_space (scratch_buffer);
545 if (flags & TFF_CHASE_TYPEDEF)
546 t = TYPE_MAIN_VARIANT (t);
548 name = TYPE_NAME (t);
552 typdef = !DECL_ARTIFICIAL (name);
553 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
554 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
555 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
556 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
557 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
558 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
559 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
562 /* Because the template names are mangled, we have to locate
563 the most general template, and use that name. */
564 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
566 while (DECL_TEMPLATE_INFO (tpl))
567 tpl = DECL_TI_TEMPLATE (tpl);
570 name = DECL_NAME (name);
573 if (name == 0 || ANON_AGGRNAME_P (name))
575 if (flags & TFF_CLASS_KEY_OR_ENUM)
576 print_identifier (scratch_buffer, "<anonymous>");
578 output_printf (scratch_buffer, "<anonymous %s>", variety);
581 print_tree_identifier (scratch_buffer, name);
583 dump_template_parms (TYPE_TEMPLATE_INFO (t),
584 !CLASSTYPE_USE_TEMPLATE (t),
585 flags & ~TFF_TEMPLATE_HEADER);
588 /* Dump into the obstack the initial part of the output for a given type.
589 This is necessary when dealing with things like functions returning
592 return type of `int (* fee ())()': pointer -> function -> int. Both
593 pointer (and reference and offset) and function (and member) types must
594 deal with prefix and suffix.
596 Arrays must also do this for DECL nodes, like int a[], and for things like
599 Return indicates how you should pad an object name after this. I.e. you
600 want to pad non-*, non-& cores, but not pad * or & types. */
603 dump_type_prefix (t, flags)
607 enum pad padding = before;
609 if (TYPE_PTRMEMFUNC_P (t))
611 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
615 switch (TREE_CODE (t))
620 tree sub = TREE_TYPE (t);
622 padding = dump_type_prefix (sub, flags);
623 /* A tree for a member pointer looks like pointer to offset,
624 so let the OFFSET_TYPE case handle it. */
625 if (!TYPE_PTRMEM_P (t))
627 if (TREE_CODE (sub) == ARRAY_TYPE)
629 output_add_space (scratch_buffer);
630 print_left_paren (scratch_buffer);
633 (scratch_buffer, "&*"[TREE_CODE (t) == POINTER_TYPE]);
634 padding = dump_qualifiers (t, before);
641 padding = dump_type_prefix (TREE_TYPE (t), flags);
642 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
645 output_add_space (scratch_buffer);
646 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
647 print_scope_operator (scratch_buffer);
649 output_add_character (scratch_buffer, '*');
650 padding = dump_qualifiers (t, none);
653 /* Can only be reached through function pointer -- this would not be
654 correct if FUNCTION_DECLs used it. */
656 padding = dump_type_prefix (TREE_TYPE (t), flags);
658 output_add_space (scratch_buffer);
659 print_left_paren (scratch_buffer);
664 padding = dump_type_prefix (TREE_TYPE (t), flags);
666 output_add_space (scratch_buffer);
667 print_left_paren (scratch_buffer);
669 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
670 print_scope_operator (scratch_buffer);
674 padding = dump_type_prefix (TREE_TYPE (t), flags);
678 case IDENTIFIER_NODE:
683 case TEMPLATE_TYPE_PARM:
684 case TEMPLATE_TEMPLATE_PARM:
685 case BOUND_TEMPLATE_TEMPLATE_PARM:
695 dump_type (t, flags);
700 sorry_for_unsupported_tree (t);
703 print_identifier (scratch_buffer, "<typeprefixerror>");
709 /* Dump the suffix of type T, under control of FLAGS. This is the part
710 which appears after the identifier (or function parms). */
713 dump_type_suffix (t, flags)
717 if (TYPE_PTRMEMFUNC_P (t))
718 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
720 switch (TREE_CODE (t))
725 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
726 print_right_paren (scratch_buffer);
727 dump_type_suffix (TREE_TYPE (t), flags);
730 /* Can only be reached through function pointer */
735 print_right_paren (scratch_buffer);
736 arg = TYPE_ARG_TYPES (t);
737 if (TREE_CODE (t) == METHOD_TYPE)
738 arg = TREE_CHAIN (arg);
740 /* Function pointers don't have default args. Not in standard C++,
741 anyway; they may in g++, but we'll just pretend otherwise. */
742 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
744 if (TREE_CODE (t) == METHOD_TYPE)
746 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before);
747 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
748 dump_type_suffix (TREE_TYPE (t), flags);
753 print_left_bracket (scratch_buffer);
756 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
759 tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
760 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
761 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
762 flags & ~TFF_EXPR_IN_PARENS);
764 dump_expr (fold (cp_build_binary_op
765 (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
767 flags & ~TFF_EXPR_IN_PARENS);
769 print_right_bracket (scratch_buffer);
770 dump_type_suffix (TREE_TYPE (t), flags);
774 case IDENTIFIER_NODE:
779 case TEMPLATE_TYPE_PARM:
780 case TEMPLATE_TEMPLATE_PARM:
781 case BOUND_TEMPLATE_TEMPLATE_PARM:
794 sorry_for_unsupported_tree (t);
796 /* Don't mark it here, we should have already done in
806 const char *p = NULL;
808 if (DECL_GLOBAL_CTOR_P (t))
810 else if (DECL_GLOBAL_DTOR_P (t))
815 output_printf (scratch_buffer, "(static %s for %s)", p, input_filename);
819 dump_simple_decl (t, type, flags)
824 if (flags & TFF_DECL_SPECIFIERS)
826 if (dump_type_prefix (type, flags) != none)
827 output_add_space (scratch_buffer);
829 if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
830 dump_scope (CP_DECL_CONTEXT (t), flags);
832 dump_decl (DECL_NAME (t), flags);
834 print_identifier (scratch_buffer, "<anonymous>");
835 if (flags & TFF_DECL_SPECIFIERS)
836 dump_type_suffix (type, flags);
839 /* Dump a human readable string for the decl T under control of FLAGS. */
849 switch (TREE_CODE (t))
853 /* Don't say 'typedef class A' */
854 if (DECL_ARTIFICIAL (t))
856 if ((flags & TFF_DECL_SPECIFIERS)
857 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
858 /* Say `class T' not just `T'. */
859 output_add_string (scratch_buffer, "class ");
861 dump_type (TREE_TYPE (t), flags);
865 if (flags & TFF_DECL_SPECIFIERS)
866 output_add_string (scratch_buffer, "typedef ");
867 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
868 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
873 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
875 output_add_string (scratch_buffer, "vtable for ");
876 my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720);
877 dump_type (DECL_CONTEXT (t), flags);
880 /* else fall through */
883 dump_simple_decl (t, TREE_TYPE (t), flags);
887 output_add_string (scratch_buffer, "<return value> ");
888 dump_simple_decl (t, TREE_TYPE (t), flags);
892 dump_scope (CP_DECL_CONTEXT (t), flags);
893 if (DECL_NAME (t) == anonymous_namespace_name)
894 print_identifier (scratch_buffer, "<unnamed>");
896 print_tree_identifier (scratch_buffer, DECL_NAME (t));
900 dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
901 print_scope_operator (scratch_buffer);
902 dump_decl (TREE_OPERAND (t, 1), flags);
906 dump_decl (TREE_OPERAND (t, 0), flags);
907 print_left_bracket (scratch_buffer);
908 dump_decl (TREE_OPERAND (t, 1), flags);
909 print_right_bracket (scratch_buffer);
912 /* So that we can do dump_decl on an aggr type. */
916 dump_type (t, flags);
923 /* These special cases are duplicated here so that other functions
924 can feed identifiers to error and get them demangled properly. */
925 case IDENTIFIER_NODE:
926 if (IDENTIFIER_TYPENAME_P (t))
928 output_add_string (scratch_buffer, "operator ");
929 /* Not exactly IDENTIFIER_TYPE_VALUE. */
930 dump_type (TREE_TYPE (t), flags);
934 print_tree_identifier (scratch_buffer, t);
942 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
943 dump_global_iord (t);
944 else if (! DECL_LANG_SPECIFIC (t))
945 print_identifier (scratch_buffer, "<internal>");
947 dump_function_decl (t, flags);
951 dump_template_decl (t, flags);
954 case TEMPLATE_ID_EXPR:
957 tree name = TREE_OPERAND (t, 0);
958 if (is_overloaded_fn (name))
959 name = DECL_NAME (get_first_fn (name));
960 dump_decl (name, flags);
961 print_template_argument_list_start (scratch_buffer);
962 for (args = TREE_OPERAND (t, 1); args; args = TREE_CHAIN (args))
964 dump_template_argument (TREE_VALUE (args), flags);
965 if (TREE_CHAIN (args))
966 separate_with_comma (scratch_buffer);
968 print_template_argument_list_end (scratch_buffer);
973 dump_decl (TREE_OPERAND (t, 0), flags);
977 print_tree_identifier (scratch_buffer, DECL_NAME (t));
981 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
982 || (DECL_INITIAL (t) &&
983 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
984 dump_simple_decl (t, TREE_TYPE (t), flags);
985 else if (DECL_NAME (t))
986 dump_decl (DECL_NAME (t), flags);
987 else if (DECL_INITIAL (t))
988 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
990 print_identifier (scratch_buffer, "enumerator");
994 output_add_string (scratch_buffer, "using ");
995 dump_type (DECL_INITIAL (t), flags);
996 print_scope_operator (scratch_buffer);
997 print_tree_identifier (scratch_buffer, DECL_NAME (t));
1001 sorry_for_unsupported_tree (t);
1002 /* Fallthrough to error. */
1005 print_identifier (scratch_buffer, "<declaration error>");
1010 /* Dump a template declaration T under control of FLAGS. This means the
1011 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1014 dump_template_decl (t, flags)
1018 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1022 if (flags & TFF_TEMPLATE_HEADER)
1024 for (parms = orig_parms = nreverse (orig_parms);
1026 parms = TREE_CHAIN (parms))
1028 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1029 int len = TREE_VEC_LENGTH (inner_parms);
1031 output_add_string (scratch_buffer, "template<");
1033 /* If we've shown the template prefix, we'd better show the
1034 parameters' and decl's type too. */
1035 flags |= TFF_DECL_SPECIFIERS;
1037 for (i = 0; i < len; i++)
1040 separate_with_comma (scratch_buffer);
1041 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1043 print_template_argument_list_end (scratch_buffer);
1044 output_add_space (scratch_buffer);
1046 nreverse(orig_parms);
1048 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1049 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1050 output_add_string (scratch_buffer, "class ");
1053 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1054 dump_type (TREE_TYPE (t),
1055 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1056 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1057 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1058 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1059 else if (TREE_TYPE (t) == NULL_TREE)
1062 switch (NEXT_CODE (t))
1066 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1069 /* This case can occur with some illegal code. */
1070 dump_type (TREE_TYPE (t),
1071 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1072 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0));
1076 /* Pretty print a function decl. There are several ways we want to print a
1077 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1078 As error can only apply the '#' flag once to give 0 and 1 for V, there
1079 is %D which doesn't print the throw specs, and %F which does. */
1082 dump_function_decl (t, flags)
1088 tree cname = NULL_TREE;
1089 tree template_args = NULL_TREE;
1090 tree template_parms = NULL_TREE;
1091 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1093 if (TREE_CODE (t) == TEMPLATE_DECL)
1094 t = DECL_TEMPLATE_RESULT (t);
1096 /* Pretty print template instantiations only. */
1097 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1101 template_args = DECL_TI_ARGS (t);
1102 tmpl = most_general_template (t);
1103 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1105 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1110 fntype = TREE_TYPE (t);
1111 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1113 if (DECL_CLASS_SCOPE_P (t))
1114 cname = DECL_CONTEXT (t);
1115 /* this is for partially instantiated template methods */
1116 else if (TREE_CODE (fntype) == METHOD_TYPE)
1117 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1119 if (!(flags & TFF_DECL_SPECIFIERS))
1121 else if (DECL_STATIC_FUNCTION_P (t))
1122 print_identifier (scratch_buffer, "static ");
1123 else if (DECL_VIRTUAL_P (t))
1124 print_identifier (scratch_buffer, "virtual ");
1126 /* Print the return type? */
1128 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1129 && !DECL_DESTRUCTOR_P (t);
1132 dump_type_prefix (TREE_TYPE (fntype), flags);
1133 output_add_space (scratch_buffer);
1136 /* Print the function name. */
1139 dump_type (cname, flags);
1140 print_scope_operator (scratch_buffer);
1143 dump_scope (CP_DECL_CONTEXT (t), flags);
1145 dump_function_name (t, flags);
1149 dump_parameters (parmtypes, flags);
1151 if (TREE_CODE (fntype) == METHOD_TYPE)
1152 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
1155 if (flags & TFF_EXCEPTION_SPECIFICATION)
1156 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1159 dump_type_suffix (TREE_TYPE (fntype), flags);
1162 /* If T is a template instantiation, dump the parameter binding. */
1163 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1165 output_add_string (scratch_buffer, " [with ");
1166 dump_template_bindings (template_parms, template_args);
1167 print_right_bracket (scratch_buffer);
1171 /* Print a parameter list. If this is for a member function, the
1172 member object ptr (and any other hidden args) should have
1173 already been removed. */
1176 dump_parameters (parmtypes, flags)
1182 print_left_paren (scratch_buffer);
1184 for (first = 1; parmtypes != void_list_node;
1185 parmtypes = TREE_CHAIN (parmtypes))
1188 separate_with_comma (scratch_buffer);
1192 print_identifier (scratch_buffer, "...");
1195 dump_type (TREE_VALUE (parmtypes), flags);
1197 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1199 output_add_string (scratch_buffer, " = ");
1200 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1204 print_right_paren (scratch_buffer);
1207 /* Print an exception specification. T is the exception specification. */
1210 dump_exception_spec (t, flags)
1216 output_add_string (scratch_buffer, " throw (");
1217 if (TREE_VALUE (t) != NULL_TREE)
1220 dump_type (TREE_VALUE (t), flags);
1224 separate_with_comma (scratch_buffer);
1226 print_right_paren (scratch_buffer);
1230 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1231 and destructors properly. */
1234 dump_function_name (t, flags)
1238 tree name = DECL_NAME (t);
1240 /* Don't let the user see __comp_ctor et al. */
1241 if (DECL_CONSTRUCTOR_P (t)
1242 || DECL_DESTRUCTOR_P (t))
1243 name = constructor_name (DECL_CONTEXT (t));
1245 if (DECL_DESTRUCTOR_P (t))
1247 output_add_character (scratch_buffer, '~');
1248 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1250 else if (DECL_CONV_FN_P (t))
1252 /* This cannot use the hack that the operator's return
1253 type is stashed off of its name because it may be
1254 used for error reporting. In the case of conflicting
1255 declarations, both will have the same name, yet
1256 the types will be different, hence the TREE_TYPE field
1257 of the first name will be clobbered by the second. */
1258 output_add_string (scratch_buffer, "operator ");
1259 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1261 else if (IDENTIFIER_OPNAME_P (name))
1262 print_tree_identifier (scratch_buffer, name);
1264 dump_decl (name, flags);
1266 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
1267 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1268 && (DECL_TEMPLATE_SPECIALIZATION (t)
1269 || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1270 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t))
1271 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1272 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1275 /* Dump the template parameters from the template info INFO under control of
1276 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1277 specialization (partial or complete). For partial specializations we show
1278 the specialized parameter values. For a primary template we show no
1282 dump_template_parms (info, primary, flags)
1287 tree args = info ? TI_ARGS (info) : NULL_TREE;
1289 if (primary && flags & TFF_TEMPLATE_NAME)
1291 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1292 print_template_argument_list_start (scratch_buffer);
1294 /* Be careful only to print things when we have them, so as not
1295 to crash producing error messages. */
1296 if (args && !primary)
1302 if (TREE_CODE (args) == TREE_VEC)
1304 if (TREE_VEC_LENGTH (args) > 0
1305 && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
1306 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1308 len = TREE_VEC_LENGTH (args);
1310 else if (TREE_CODE (args) == TREE_LIST)
1312 while (ix != len && args)
1317 arg = TREE_VEC_ELT (args, ix);
1322 arg = TREE_VALUE (args);
1323 args = TREE_CHAIN (args);
1326 separate_with_comma (scratch_buffer);
1329 print_identifier (scratch_buffer, "<template parameter error>");
1331 dump_template_argument (arg, flags);
1337 tree tpl = TI_TEMPLATE (info);
1338 tree parms = DECL_TEMPLATE_PARMS (tpl);
1341 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1342 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1344 for (ix = 0; ix != len; ix++)
1346 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1349 separate_with_comma (scratch_buffer);
1351 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1354 print_template_argument_list_end (scratch_buffer);
1363 case TARGET_NEWLINE:
1364 output_add_string (scratch_buffer, "\\n");
1367 output_add_string (scratch_buffer, "\\t");
1370 output_add_string (scratch_buffer, "\\v");
1373 output_add_string (scratch_buffer, "\\b");
1376 output_add_string (scratch_buffer, "\\r");
1379 output_add_string (scratch_buffer, "\\f");
1382 output_add_string (scratch_buffer, "\\a");
1385 output_add_string (scratch_buffer, "\\\\");
1388 output_add_string (scratch_buffer, "\\'");
1391 output_add_string (scratch_buffer, "\\\"");
1395 output_add_character (scratch_buffer, c);
1398 sprintf (digit_buffer, "\\%03o", (int) c);
1399 output_add_string (scratch_buffer, digit_buffer);
1404 /* Print out a list of initializers (subr of dump_expr) */
1407 dump_expr_list (l, flags)
1413 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1416 separate_with_comma (scratch_buffer);
1420 /* Print out an expression E under control of FLAGS. */
1423 dump_expr (t, flags)
1427 switch (TREE_CODE (t))
1435 case NAMESPACE_DECL:
1437 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
1442 tree type = TREE_TYPE (t);
1443 my_friendly_assert (type != 0, 81);
1445 /* If it's an enum, output its tag, rather than its value. */
1446 if (TREE_CODE (type) == ENUMERAL_TYPE)
1448 tree values = TYPE_VALUES (type);
1451 values = TREE_CHAIN (values))
1452 if (tree_int_cst_equal (TREE_VALUE (values), t))
1456 print_tree_identifier (scratch_buffer, TREE_PURPOSE (values));
1459 /* Value must have been cast. */
1460 print_left_paren (scratch_buffer);
1461 dump_type (type, flags);
1462 print_right_paren (scratch_buffer);
1466 else if (type == boolean_type_node)
1468 if (t == boolean_false_node || integer_zerop (t))
1469 print_identifier (scratch_buffer, "false");
1470 else if (t == boolean_true_node)
1471 print_identifier (scratch_buffer, "true");
1473 else if (type == char_type_node)
1475 output_add_character (scratch_buffer, '\'');
1476 dump_char (tree_low_cst (t, 0));
1477 output_add_character (scratch_buffer, '\'');
1482 if (! host_integerp (t, 0))
1486 if (tree_int_cst_sgn (val) < 0)
1488 output_add_character (scratch_buffer, '-');
1489 val = build_int_2 (-TREE_INT_CST_LOW (val),
1490 ~TREE_INT_CST_HIGH (val)
1491 + !TREE_INT_CST_LOW (val));
1493 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
1496 static char format[10]; /* "%x%09999x\0" */
1498 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
1499 sprintf (digit_buffer, format, TREE_INT_CST_HIGH (val),
1500 TREE_INT_CST_LOW (val));
1501 output_add_string (scratch_buffer, digit_buffer);
1505 print_integer (scratch_buffer, TREE_INT_CST_LOW (t));
1511 #ifndef REAL_IS_NOT_DOUBLE
1512 sprintf (digit_buffer, "%g", TREE_REAL_CST (t));
1515 const unsigned char *p = (const unsigned char *) &TREE_REAL_CST (t);
1517 strcpy (digit_buffer, "0x");
1518 for (i = 0; i < sizeof TREE_REAL_CST (t); i++)
1519 sprintf (digit_buffer + 2 + 2*i, "%02x", *p++);
1522 output_add_string (scratch_buffer, digit_buffer);
1526 output_add_character (scratch_buffer, '&');
1527 dump_type (PTRMEM_CST_CLASS (t), flags);
1528 print_scope_operator (scratch_buffer);
1529 print_tree_identifier
1530 (scratch_buffer, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1535 const char *p = TREE_STRING_POINTER (t);
1536 int len = TREE_STRING_LENGTH (t) - 1;
1539 output_add_character (scratch_buffer, '\"');
1540 for (i = 0; i < len; i++)
1542 output_add_character (scratch_buffer, '\"');
1547 print_left_paren (scratch_buffer);
1548 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1549 separate_with_comma (scratch_buffer);
1550 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1551 print_right_paren (scratch_buffer);
1555 print_left_paren (scratch_buffer);
1556 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1557 output_add_string (scratch_buffer, " ? ");
1558 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1559 output_add_string (scratch_buffer, " : ");
1560 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1561 print_right_paren (scratch_buffer);
1565 if (TREE_HAS_CONSTRUCTOR (t))
1567 output_add_string (scratch_buffer, "new ");
1568 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1572 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1576 case AGGR_INIT_EXPR:
1578 tree fn = NULL_TREE;
1580 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1581 fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1583 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1585 if (DECL_CONSTRUCTOR_P (fn))
1586 print_tree_identifier
1587 (scratch_buffer, TYPE_IDENTIFIER (TREE_TYPE (t)));
1592 dump_expr (TREE_OPERAND (t, 0), 0);
1594 print_left_paren (scratch_buffer);
1595 if (TREE_OPERAND (t, 1))
1596 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1597 print_right_paren (scratch_buffer);
1602 tree fn = TREE_OPERAND (t, 0);
1603 tree args = TREE_OPERAND (t, 1);
1605 if (TREE_CODE (fn) == ADDR_EXPR)
1606 fn = TREE_OPERAND (fn, 0);
1608 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1610 tree ob = TREE_VALUE (args);
1611 if (TREE_CODE (ob) == ADDR_EXPR)
1613 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1614 output_add_character (scratch_buffer, '.');
1616 else if (TREE_CODE (ob) != PARM_DECL
1617 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1619 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1620 output_add_string (scratch_buffer, "->");
1622 args = TREE_CHAIN (args);
1624 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1625 print_left_paren (scratch_buffer);
1626 dump_expr_list (args, flags);
1627 print_right_paren (scratch_buffer);
1633 tree type = TREE_OPERAND (t, 1);
1634 if (NEW_EXPR_USE_GLOBAL (t))
1635 print_scope_operator (scratch_buffer);
1636 output_add_string (scratch_buffer, "new ");
1637 if (TREE_OPERAND (t, 0))
1639 print_left_paren (scratch_buffer);
1640 dump_expr_list (TREE_OPERAND (t, 0), flags);
1641 output_add_string (scratch_buffer, ") ");
1643 if (TREE_CODE (type) == ARRAY_REF)
1644 type = build_cplus_array_type
1645 (TREE_OPERAND (type, 0),
1646 build_index_type (fold (build (MINUS_EXPR, integer_type_node,
1647 TREE_OPERAND (type, 1),
1648 integer_one_node))));
1649 dump_type (type, flags);
1650 if (TREE_OPERAND (t, 2))
1652 print_left_paren (scratch_buffer);
1653 dump_expr_list (TREE_OPERAND (t, 2), flags);
1654 print_right_paren (scratch_buffer);
1660 /* Note that this only works for G++ target exprs. If somebody
1661 builds a general TARGET_EXPR, there's no way to represent that
1662 it initializes anything other that the parameter slot for the
1663 default argument. Note we may have cleared out the first
1664 operand in expand_expr, so don't go killing ourselves. */
1665 if (TREE_OPERAND (t, 1))
1666 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1674 case TRUNC_DIV_EXPR:
1675 case TRUNC_MOD_EXPR:
1683 case BIT_ANDTC_EXPR:
1684 case TRUTH_ANDIF_EXPR:
1685 case TRUTH_ORIF_EXPR:
1692 case EXACT_DIV_EXPR:
1693 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1697 case FLOOR_DIV_EXPR:
1698 case ROUND_DIV_EXPR:
1699 dump_binary_op ("/", t, flags);
1703 case FLOOR_MOD_EXPR:
1704 case ROUND_MOD_EXPR:
1705 dump_binary_op ("%", t, flags);
1710 tree ob = TREE_OPERAND (t, 0);
1711 if (TREE_CODE (ob) == INDIRECT_REF)
1713 ob = TREE_OPERAND (ob, 0);
1714 if (TREE_CODE (ob) != PARM_DECL
1715 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1717 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1718 output_add_string (scratch_buffer, "->");
1723 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1724 output_add_character (scratch_buffer, '.');
1726 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1731 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1732 print_left_bracket (scratch_buffer);
1733 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1734 print_right_bracket (scratch_buffer);
1738 if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
1740 print_left_paren (scratch_buffer);
1741 dump_type (TREE_TYPE (t), flags);
1742 print_right_paren (scratch_buffer);
1743 dump_expr (TREE_OPERAND (t, 0), flags);
1746 dump_unary_op ("+", t, flags);
1750 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1751 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1752 /* An ADDR_EXPR can have reference type. In that case, we
1753 shouldn't print the `&' doing so indicates to the user
1754 that the expression has pointer type. */
1756 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1757 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1759 dump_unary_op ("&", t, flags);
1763 if (TREE_HAS_CONSTRUCTOR (t))
1765 t = TREE_OPERAND (t, 0);
1766 my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);
1767 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1768 print_left_paren (scratch_buffer);
1769 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1770 print_right_paren (scratch_buffer);
1774 if (TREE_OPERAND (t,0) != NULL_TREE
1775 && TREE_TYPE (TREE_OPERAND (t, 0))
1776 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1777 dump_expr (TREE_OPERAND (t, 0), flags);
1779 dump_unary_op ("*", t, flags);
1785 case TRUTH_NOT_EXPR:
1786 case PREDECREMENT_EXPR:
1787 case PREINCREMENT_EXPR:
1788 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1791 case POSTDECREMENT_EXPR:
1792 case POSTINCREMENT_EXPR:
1793 print_left_paren (scratch_buffer);
1794 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1796 (scratch_buffer, operator_name_info[(int)TREE_CODE (t)].name);
1797 print_right_paren (scratch_buffer);
1800 case NON_LVALUE_EXPR:
1801 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1802 should be another level of INDIRECT_REF so that I don't have to do
1804 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1806 tree next = TREE_TYPE (TREE_TYPE (t));
1808 while (TREE_CODE (next) == POINTER_TYPE)
1809 next = TREE_TYPE (next);
1811 if (TREE_CODE (next) == FUNCTION_TYPE)
1813 if (flags & TFF_EXPR_IN_PARENS)
1814 print_left_paren (scratch_buffer);
1815 output_add_character (scratch_buffer, '*');
1816 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1817 if (flags & TFF_EXPR_IN_PARENS)
1818 print_right_paren (scratch_buffer);
1823 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1827 dump_expr (TREE_OPERAND (t, 0), flags);
1830 case EXPR_WITH_FILE_LOCATION:
1831 dump_expr (EXPR_WFL_NODE (t), flags);
1835 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1837 tree idx = build_component_ref (t, pfn_identifier, NULL_TREE, 0);
1839 if (integer_zerop (idx))
1841 /* A NULL pointer-to-member constant. */
1842 output_add_string (scratch_buffer, "((");
1843 dump_type (TREE_TYPE (t), flags);
1844 output_add_string (scratch_buffer, ") 0)");
1847 else if (host_integerp (idx, 0))
1850 unsigned HOST_WIDE_INT n;
1852 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1853 t = TYPE_METHOD_BASETYPE (t);
1854 virtuals = TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t));
1856 n = tree_low_cst (idx, 0);
1858 /* Map vtable index back one, to allow for the null pointer to
1862 while (n > 0 && virtuals)
1865 virtuals = TREE_CHAIN (virtuals);
1869 dump_expr (BV_FN (virtuals),
1870 flags | TFF_EXPR_IN_PARENS);
1875 output_add_character (scratch_buffer, '{');
1876 dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
1877 output_add_character (scratch_buffer, '}');
1882 tree ob = TREE_OPERAND (t, 0);
1883 if (is_dummy_object (ob))
1885 t = TREE_OPERAND (t, 1);
1886 if (TREE_CODE (t) == FUNCTION_DECL)
1888 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1889 else if (BASELINK_P (t))
1890 dump_expr (OVL_CURRENT (TREE_VALUE (t)), flags | TFF_EXPR_IN_PARENS);
1892 dump_decl (t, flags);
1896 if (TREE_CODE (ob) == INDIRECT_REF)
1898 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1899 output_add_string (scratch_buffer, "->*");
1903 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1904 output_add_string (scratch_buffer, ".*");
1906 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1911 case TEMPLATE_PARM_INDEX:
1912 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1915 case IDENTIFIER_NODE:
1916 print_tree_identifier (scratch_buffer, t);
1920 dump_type (TREE_OPERAND (t, 0), flags);
1921 print_scope_operator (scratch_buffer);
1922 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1926 if (TREE_OPERAND (t, 0) == NULL_TREE
1927 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1929 dump_type (TREE_TYPE (t), flags);
1930 print_left_paren (scratch_buffer);
1931 dump_expr_list (TREE_OPERAND (t, 0), flags);
1932 print_right_paren (scratch_buffer);
1936 print_left_paren (scratch_buffer);
1937 dump_type (TREE_TYPE (t), flags);
1938 output_add_string (scratch_buffer, ")(");
1939 dump_expr_list (TREE_OPERAND (t, 0), flags);
1940 print_right_paren (scratch_buffer);
1944 case STATIC_CAST_EXPR:
1945 output_add_string (scratch_buffer, "static_cast<");
1947 case REINTERPRET_CAST_EXPR:
1948 output_add_string (scratch_buffer, "reinterpret_cast<");
1950 case CONST_CAST_EXPR:
1951 output_add_string (scratch_buffer, "const_cast<");
1953 case DYNAMIC_CAST_EXPR:
1954 output_add_string (scratch_buffer, "dynamic_cast<");
1956 dump_type (TREE_TYPE (t), flags);
1957 output_add_string (scratch_buffer, ">(");
1958 dump_expr (TREE_OPERAND (t, 0), flags);
1959 print_right_paren (scratch_buffer);
1963 print_tree_identifier (scratch_buffer, TREE_OPERAND (t, 0));
1967 dump_expr (TREE_OPERAND (t, 0), flags);
1968 output_add_string (scratch_buffer, "->");
1973 if (TREE_CODE (t) == SIZEOF_EXPR)
1974 output_add_string (scratch_buffer, "sizeof (");
1977 my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
1978 output_add_string (scratch_buffer, "__alignof__ (");
1980 if (TYPE_P (TREE_OPERAND (t, 0)))
1981 dump_type (TREE_OPERAND (t, 0), flags);
1983 dump_unary_op ("*", t, flags | TFF_EXPR_IN_PARENS);
1984 print_right_paren (scratch_buffer);
1988 print_identifier (scratch_buffer, "<unparsed>");
1991 case TRY_CATCH_EXPR:
1992 case WITH_CLEANUP_EXPR:
1993 case CLEANUP_POINT_EXPR:
1994 dump_expr (TREE_OPERAND (t, 0), flags);
1997 case PSEUDO_DTOR_EXPR:
1998 dump_expr (TREE_OPERAND (t, 2), flags);
1999 output_add_character (scratch_buffer, '.');
2000 dump_type (TREE_OPERAND (t, 0), flags);
2001 output_add_string (scratch_buffer, "::~");
2002 dump_type (TREE_OPERAND (t, 1), flags);
2005 case TEMPLATE_ID_EXPR:
2006 dump_decl (t, flags);
2010 /* We don't yet have a way of dumping statements in a
2011 human-readable format. */
2012 output_add_string (scratch_buffer, "({...})");
2016 output_add_character (scratch_buffer, '{');
2017 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
2018 output_add_character (scratch_buffer, '}');
2022 output_add_string (scratch_buffer, "while (1) { ");
2023 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2024 output_add_character (scratch_buffer, '}');
2028 output_add_string (scratch_buffer, "if (");
2029 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2030 output_add_string (scratch_buffer, ") break; ");
2034 if (TREE_VALUE (t) && TREE_CODE (TREE_VALUE (t)) == FUNCTION_DECL)
2036 print_tree_identifier (scratch_buffer, DECL_NAME (TREE_VALUE (t)));
2039 /* else fall through */
2041 /* This list is incomplete, but should suffice for now.
2042 It is very important that `sorry' does not call
2043 `report_error_function'. That could cause an infinite loop. */
2045 sorry_for_unsupported_tree (t);
2046 /* fall through to ERROR_MARK... */
2048 print_identifier (scratch_buffer, "<expression error>");
2054 dump_binary_op (opstring, t, flags)
2055 const char *opstring;
2059 print_left_paren (scratch_buffer);
2060 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2061 output_add_space (scratch_buffer);
2063 print_identifier (scratch_buffer, opstring);
2065 print_identifier (scratch_buffer, "<unknown operator>");
2066 output_add_space (scratch_buffer);
2067 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2068 print_right_paren (scratch_buffer);
2072 dump_unary_op (opstring, t, flags)
2073 const char *opstring;
2077 if (flags & TFF_EXPR_IN_PARENS)
2078 print_left_paren (scratch_buffer);
2079 print_identifier (scratch_buffer, opstring);
2080 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2081 if (flags & TFF_EXPR_IN_PARENS)
2082 print_right_paren (scratch_buffer);
2085 /* Exported interface to stringifying types, exprs and decls under TFF_*
2089 type_as_string (typ, flags)
2093 reinit_global_formatting_buffer ();
2095 dump_type (typ, flags);
2097 return output_finalize_message (scratch_buffer);
2101 expr_as_string (decl, flags)
2105 reinit_global_formatting_buffer ();
2107 dump_expr (decl, flags);
2109 return output_finalize_message (scratch_buffer);
2113 decl_as_string (decl, flags)
2117 reinit_global_formatting_buffer ();
2119 dump_decl (decl, flags);
2121 return output_finalize_message (scratch_buffer);
2125 context_as_string (context, flags)
2129 reinit_global_formatting_buffer ();
2131 dump_scope (context, flags);
2133 return output_finalize_message (scratch_buffer);
2136 /* Generate the three forms of printable names for lang_printable_name. */
2139 lang_decl_name (decl, v)
2144 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2146 reinit_global_formatting_buffer ();
2148 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
2150 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2151 print_scope_operator (scratch_buffer);
2154 if (TREE_CODE (decl) == FUNCTION_DECL)
2155 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2157 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2159 return output_finalize_message (scratch_buffer);
2166 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2167 return DECL_SOURCE_FILE (DECL_CONTEXT (t));
2168 else if (TYPE_P (t))
2169 return DECL_SOURCE_FILE (TYPE_MAIN_DECL (t));
2170 else if (TREE_CODE (t) == OVERLOAD)
2171 return DECL_SOURCE_FILE (OVL_FUNCTION (t));
2173 return DECL_SOURCE_FILE (t);
2181 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2182 line = DECL_SOURCE_LINE (DECL_CONTEXT (t));
2183 if (TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t)
2184 && TYPE_MAIN_DECL (TREE_TYPE (t)))
2188 line = DECL_SOURCE_LINE (TYPE_MAIN_DECL (t));
2189 else if (TREE_CODE (t) == OVERLOAD)
2190 line = DECL_SOURCE_LINE (OVL_FUNCTION (t));
2192 line = DECL_SOURCE_LINE (t);
2200 /* Now the interfaces from error et al to dump_type et al. Each takes an
2201 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2205 decl_to_string (decl, verbose)
2211 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2212 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2213 flags = TFF_CLASS_KEY_OR_ENUM;
2215 flags |= TFF_DECL_SPECIFIERS | TFF_FUNCTION_DEFAULT_ARGUMENTS;
2216 else if (TREE_CODE (decl) == FUNCTION_DECL)
2217 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2218 flags |= TFF_TEMPLATE_HEADER;
2220 reinit_global_formatting_buffer ();
2222 dump_decl (decl, flags);
2224 return output_finalize_message (scratch_buffer);
2228 expr_to_string (decl, verbose)
2230 int verbose ATTRIBUTE_UNUSED;
2232 reinit_global_formatting_buffer ();
2234 dump_expr (decl, 0);
2236 return output_finalize_message (scratch_buffer);
2240 fndecl_to_string (fndecl, verbose)
2246 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
2248 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2249 reinit_global_formatting_buffer ();
2251 dump_decl (fndecl, flags);
2253 return output_finalize_message (scratch_buffer);
2258 code_to_string (c, v)
2260 int v ATTRIBUTE_UNUSED;
2262 return tree_code_name [c];
2266 language_to_string (c, v)
2268 int v ATTRIBUTE_UNUSED;
2275 case lang_cplusplus:
2287 /* Return the proper printed version of a parameter to a C++ function. */
2290 parm_to_string (p, v)
2292 int v ATTRIBUTE_UNUSED;
2297 sprintf (digit_buffer, "%d", p+1);
2298 return digit_buffer;
2304 int v ATTRIBUTE_UNUSED;
2308 id = operator_name_info[(int) p].identifier;
2309 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2313 type_to_string (typ, verbose)
2321 flags |= TFF_CLASS_KEY_OR_ENUM;
2322 flags |= TFF_TEMPLATE_HEADER;
2324 reinit_global_formatting_buffer ();
2326 dump_type (typ, flags);
2328 return output_finalize_message (scratch_buffer);
2332 assop_to_string (p, v)
2334 int v ATTRIBUTE_UNUSED;
2338 id = assignment_operator_name_info[(int) p].identifier;
2339 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2343 args_to_string (p, verbose)
2349 flags |= TFF_CLASS_KEY_OR_ENUM;
2354 if (TYPE_P (TREE_VALUE (p)))
2355 return type_as_string (p, flags);
2357 reinit_global_formatting_buffer ();
2358 for (; p; p = TREE_CHAIN (p))
2360 if (TREE_VALUE (p) == null_node)
2361 print_identifier (scratch_buffer, "NULL");
2363 dump_type (error_type (TREE_VALUE (p)), flags);
2365 separate_with_comma (scratch_buffer);
2367 return output_finalize_message (scratch_buffer);
2375 reinit_global_formatting_buffer ();
2377 dump_qualifiers (p, v ? before : none);
2379 return output_finalize_message (scratch_buffer);
2383 lang_print_error_function (context, file)
2384 diagnostic_context *context;
2389 default_print_error_function (context, file);
2390 os = output_buffer_state (context);
2391 output_set_prefix ((output_buffer *)context, file);
2392 maybe_print_instantiation_context ((output_buffer *)context);
2393 output_buffer_state (context) = os;
2397 cp_diagnostic_starter (buffer, dc)
2398 output_buffer *buffer;
2399 diagnostic_context *dc;
2401 report_problematic_module (buffer);
2402 cp_print_error_function (buffer, dc);
2403 maybe_print_instantiation_context (buffer);
2404 output_set_prefix (buffer,
2405 context_as_prefix (diagnostic_file_location (dc),
2406 diagnostic_line_location (dc),
2407 diagnostic_is_warning (dc)));
2411 cp_diagnostic_finalizer (buffer, dc)
2412 output_buffer *buffer;
2413 diagnostic_context *dc __attribute__ ((__unused__));
2415 output_destroy_prefix (buffer);
2418 /* Print current function onto BUFFER, in the process of reporting
2419 a diagnostic message. Called from cp_diagnostic_starter. */
2421 cp_print_error_function (buffer, dc)
2422 output_buffer *buffer;
2423 diagnostic_context *dc;
2425 if (error_function_changed ())
2427 char *prefix = diagnostic_file_location (dc)
2428 ? file_name_as_prefix (diagnostic_file_location (dc))
2432 os = output_buffer_state (buffer);
2433 output_set_prefix (buffer, prefix);
2435 if (current_function_decl == NULL)
2436 output_add_string (buffer, "At global scope:");
2439 (buffer, "In %s `%s':", function_category (current_function_decl),
2440 (*decl_printable_name) (current_function_decl, 2));
2441 output_add_newline (buffer);
2443 record_last_error_function ();
2444 output_destroy_prefix (buffer);
2445 output_buffer_state (buffer) = os;
2449 /* Returns a description of FUNCTION using standard terminology. */
2451 function_category (fn)
2454 if (DECL_FUNCTION_MEMBER_P (fn))
2456 if (DECL_STATIC_FUNCTION_P (fn))
2457 return "static member function";
2458 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2459 return "copy constructor";
2460 else if (DECL_CONSTRUCTOR_P (fn))
2461 return "constructor";
2462 else if (DECL_DESTRUCTOR_P (fn))
2463 return "destructor";
2465 return "member function";
2471 /* Report the full context of a current template instantiation,
2474 print_instantiation_full_context (buffer)
2475 output_buffer *buffer;
2477 tree p = current_instantiation ();
2479 const char *file = input_filename;
2483 if (current_function_decl != TINST_DECL (p)
2484 && current_function_decl != NULL_TREE)
2485 /* We can get here during the processing of some synthesized
2486 method. Then, TINST_DECL (p) will be the function that's causing
2491 if (current_function_decl == TINST_DECL (p))
2492 /* Avoid redundancy with the the "In function" line. */;
2494 output_verbatim (buffer, "%s: In instantiation of `%s':\n", file,
2495 decl_as_string (TINST_DECL (p),
2496 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2498 line = TINST_LINE (p);
2499 file = TINST_FILE (p);
2504 print_instantiation_partial_context (buffer, p, file, line);
2507 /* Same as above but less verbose. */
2509 print_instantiation_partial_context (buffer, t, file, line)
2510 output_buffer *buffer;
2515 for (; t; t = TREE_CHAIN (t))
2518 (buffer, "%s:%d: instantiated from `%s'\n", file, line,
2519 decl_as_string (TINST_DECL (t), TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2520 line = TINST_LINE (t);
2521 file = TINST_FILE (t);
2523 output_verbatim (buffer, "%s:%d: instantiated from here\n", file, line);
2526 /* Called from cp_thing to print the template context for an error. */
2528 maybe_print_instantiation_context (buffer)
2529 output_buffer *buffer;
2531 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2534 record_last_problematic_instantiation ();
2535 print_instantiation_full_context (buffer);
2538 /* Report the bare minimum context of a template instantiation. */
2540 print_instantiation_context ()
2542 print_instantiation_partial_context
2543 (diagnostic_buffer, current_instantiation (), input_filename, lineno);
2544 flush_diagnostic_buffer ();
2547 /* Called from output_format -- during diagnostic message processing --
2548 to handle C++ specific format specifier with the following meanings:
2549 %A function argument-list.
2553 %F function declaration.
2554 %L language as used in extern "lang".
2556 %P function parameter whose position is indicated by an integer.
2557 %Q assignment operator.
2562 output_buffer *buffer;
2566 #define next_tree va_arg (output_buffer_format_args (buffer), tree)
2567 #define next_tcode va_arg (output_buffer_format_args (buffer), enum tree_code)
2568 #define next_lang va_arg (output_buffer_format_args (buffer), enum languages)
2569 #define next_int va_arg (output_buffer_format_args (buffer), int)
2571 if (*output_buffer_text_cursor (buffer) == '+')
2572 ++output_buffer_text_cursor (buffer);
2573 if (*output_buffer_text_cursor (buffer) == '#')
2576 ++output_buffer_text_cursor (buffer);
2579 switch (*output_buffer_text_cursor (buffer))
2581 case 'A': result = args_to_string (next_tree, verbose); break;
2582 case 'C': result = code_to_string (next_tcode, verbose); break;
2583 case 'D': result = decl_to_string (next_tree, verbose); break;
2584 case 'E': result = expr_to_string (next_tree, verbose); break;
2585 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2586 case 'L': result = language_to_string (next_lang, verbose); break;
2587 case 'O': result = op_to_string (next_tcode, verbose); break;
2588 case 'P': result = parm_to_string (next_int, verbose); break;
2589 case 'Q': result = assop_to_string (next_tcode, verbose); break;
2590 case 'T': result = type_to_string (next_tree, verbose); break;
2591 case 'V': result = cv_to_string (next_tree, verbose); break;
2597 output_add_string (buffer, result);
2606 print_integer (buffer, i)
2607 output_buffer *buffer;
2610 sprintf (digit_buffer, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT) i);
2611 output_add_string (buffer, digit_buffer);
2615 print_non_consecutive_character (buffer, c)
2616 output_buffer *buffer;
2619 const char *p = output_last_position (buffer);
2621 if (p != NULL && *p == c)
2622 output_add_space (buffer);
2623 output_add_character (buffer, c);
2626 /* These are temporary wrapper functions which handle the historic
2627 behavior of cp_*_at. */
2630 locate_error (msgid, ap)
2638 for (f = msgid; *f; f++)
2651 /* Just ignore these possibilities. */
2653 case 'd': (void) va_arg (ap, int); break;
2654 case 's': (void) va_arg (ap, char *); break;
2655 case 'L': (void) va_arg (ap, enum languages); break;
2658 case 'Q': (void) va_arg (ap, enum tree_code); break;
2660 /* These take a tree, which may be where the error is
2669 t = va_arg (ap, tree);
2675 errorcount = 0; /* damn ICE suppression */
2676 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2682 here = va_arg (ap, tree);
2689 cp_error_at VPARAMS ((const char *msgid, ...))
2692 diagnostic_context dc;
2694 VA_OPEN (ap, msgid);
2695 VA_FIXEDARG (ap, const char *, msgid);
2696 here = locate_error (msgid, ap);
2699 VA_OPEN (ap, msgid);
2700 VA_FIXEDARG (ap, const char *, msgid);
2702 set_diagnostic_context (&dc, msgid, &ap,
2704 cp_line_of (here), /* warning = */ 0);
2705 report_diagnostic (&dc);
2710 cp_warning_at VPARAMS ((const char *msgid, ...))
2713 diagnostic_context dc;
2715 VA_OPEN (ap, msgid);
2716 VA_FIXEDARG (ap, const char *, msgid);
2717 here = locate_error (msgid, ap);
2720 VA_OPEN (ap, msgid);
2721 VA_FIXEDARG (ap, const char *, msgid);
2723 set_diagnostic_context (&dc, msgid, &ap,
2725 cp_line_of (here), /* warning = */ 1);
2726 report_diagnostic (&dc);
2731 cp_pedwarn_at VPARAMS ((const char *msgid, ...))
2734 diagnostic_context dc;
2736 VA_OPEN (ap, msgid);
2737 VA_FIXEDARG (ap, const char *, msgid);
2738 here = locate_error (msgid, ap);
2741 VA_OPEN (ap, msgid);
2742 VA_FIXEDARG (ap, const char *, msgid);
2744 set_diagnostic_context (&dc, msgid, &ap,
2747 /* warning = */ !flag_pedantic_errors);
2748 report_diagnostic (&dc);