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 GCC.
7 GCC 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 GCC 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 GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "coretypes.h"
31 #include "diagnostic.h"
32 #include "langhooks-def.h"
34 enum pad { none, before, after };
36 #define sorry_for_unsupported_tree(T) \
37 sorry ("`%s' not supported by %s", tree_code_name[(int) TREE_CODE (T)], \
40 #define print_scope_operator(BUFFER) output_add_string ((BUFFER), "::")
41 #define print_left_paren(BUFFER) output_add_character ((BUFFER), '(')
42 #define print_right_paren(BUFFER) output_add_character ((BUFFER), ')')
43 #define print_left_bracket(BUFFER) output_add_character ((BUFFER), '[')
44 #define print_right_bracket(BUFFER) output_add_character ((BUFFER), ']')
45 #define print_template_argument_list_start(BUFFER) \
46 print_non_consecutive_character ((BUFFER), '<')
47 #define print_template_argument_list_end(BUFFER) \
48 print_non_consecutive_character ((BUFFER), '>')
49 #define print_tree_identifier(BUFFER, TID) \
50 output_add_string ((BUFFER), IDENTIFIER_POINTER (TID))
51 #define print_identifier(BUFFER, ID) output_add_string ((BUFFER), (ID))
52 #define separate_with_comma(BUFFER) output_add_string ((BUFFER), ", ")
54 /* The global buffer where we dump everything. It is there only for
55 transitional purpose. It is expected, in the near future, to be
56 completely removed. */
57 static output_buffer scratch_buffer_rec;
58 static output_buffer *scratch_buffer = &scratch_buffer_rec;
60 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
62 #define reinit_global_formatting_buffer() \
63 output_clear_message_text (scratch_buffer)
65 static const char *args_to_string PARAMS ((tree, int));
66 static const char *assop_to_string PARAMS ((enum tree_code, int));
67 static const char *code_to_string PARAMS ((enum tree_code, int));
68 static const char *cv_to_string PARAMS ((tree, int));
69 static const char *decl_to_string PARAMS ((tree, int));
70 static const char *expr_to_string PARAMS ((tree, int));
71 static const char *fndecl_to_string PARAMS ((tree, int));
72 static const char *op_to_string PARAMS ((enum tree_code, int));
73 static const char *parm_to_string PARAMS ((int, int));
74 static const char *type_to_string PARAMS ((tree, int));
76 static void dump_type PARAMS ((tree, int));
77 static void dump_typename PARAMS ((tree, int));
78 static void dump_simple_decl PARAMS ((tree, tree, int));
79 static void dump_decl PARAMS ((tree, int));
80 static void dump_template_decl PARAMS ((tree, int));
81 static void dump_function_decl PARAMS ((tree, int));
82 static void dump_expr PARAMS ((tree, int));
83 static void dump_unary_op PARAMS ((const char *, tree, int));
84 static void dump_binary_op PARAMS ((const char *, tree, int));
85 static void dump_aggr_type PARAMS ((tree, int));
86 static enum pad dump_type_prefix PARAMS ((tree, int));
87 static void dump_type_suffix PARAMS ((tree, int));
88 static void dump_function_name PARAMS ((tree, int));
89 static void dump_expr_list PARAMS ((tree, int));
90 static void dump_global_iord PARAMS ((tree));
91 static enum pad dump_qualifiers PARAMS ((tree, enum pad));
92 static void dump_char PARAMS ((int));
93 static void dump_parameters PARAMS ((tree, int));
94 static void dump_exception_spec PARAMS ((tree, int));
95 static const char *class_key_or_enum PARAMS ((tree));
96 static void dump_template_argument PARAMS ((tree, int));
97 static void dump_template_argument_list PARAMS ((tree, int));
98 static void dump_template_parameter PARAMS ((tree, int));
99 static void dump_template_bindings PARAMS ((tree, tree));
100 static void dump_scope PARAMS ((tree, int));
101 static void dump_template_parms PARAMS ((tree, int, int));
103 static const char *function_category PARAMS ((tree));
104 static void maybe_print_instantiation_context PARAMS ((diagnostic_context *));
105 static void print_instantiation_full_context PARAMS ((diagnostic_context *));
106 static void print_instantiation_partial_context PARAMS ((diagnostic_context *,
109 static void cp_diagnostic_starter PARAMS ((diagnostic_context *,
111 static void cp_diagnostic_finalizer PARAMS ((diagnostic_context *,
113 static void cp_print_error_function PARAMS ((diagnostic_context *,
116 static bool cp_printer PARAMS ((output_buffer *, text_info *));
117 static void print_non_consecutive_character PARAMS ((output_buffer *, int));
118 static void print_integer PARAMS ((output_buffer *, HOST_WIDE_INT));
119 static tree locate_error PARAMS ((const char *, va_list));
124 diagnostic_starter (global_dc) = cp_diagnostic_starter;
125 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
126 diagnostic_format_decoder (global_dc) = cp_printer;
128 init_output_buffer (scratch_buffer, /* prefix */NULL, /* line-width */0);
131 /* Dump a scope, if deemed necessary. */
134 dump_scope (scope, flags)
138 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
140 if (scope == NULL_TREE)
143 if (TREE_CODE (scope) == NAMESPACE_DECL)
145 if (scope != global_namespace)
147 dump_decl (scope, f);
148 print_scope_operator (scratch_buffer);
151 else if (AGGREGATE_TYPE_P (scope))
153 dump_type (scope, f);
154 print_scope_operator (scratch_buffer);
156 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
158 dump_function_decl (scope, f);
159 print_scope_operator (scratch_buffer);
163 /* Dump type qualifiers, providing padding as requested. Return an
164 indication of whether we dumped something. */
167 dump_qualifiers (t, p)
171 static const int masks[] =
172 {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT};
173 static const char *const names[] =
174 {"const", "volatile", "__restrict"};
176 int quals = TYPE_QUALS (t);
177 int do_after = p == after;
181 for (ix = 0; ix != 3; ix++)
182 if (masks[ix] & quals)
185 output_add_space (scratch_buffer);
187 print_identifier (scratch_buffer, names[ix]);
190 output_add_space (scratch_buffer);
197 /* This must be large enough to hold any printed integer or floating-point
199 static char digit_buffer[128];
201 /* Dump the template ARGument under control of FLAGS. */
204 dump_template_argument (arg, flags)
208 if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
209 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
211 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
214 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
218 dump_template_argument_list (args, flags)
222 int n = TREE_VEC_LENGTH (args);
226 for (i = 0; i< n; ++i)
229 separate_with_comma (scratch_buffer);
230 dump_template_argument (TREE_VEC_ELT (args, i), flags);
235 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
238 dump_template_parameter (parm, flags)
242 tree p = TREE_VALUE (parm);
243 tree a = TREE_PURPOSE (parm);
245 if (TREE_CODE (p) == TYPE_DECL)
247 if (flags & TFF_DECL_SPECIFIERS)
249 print_identifier (scratch_buffer, "class");
252 output_add_space (scratch_buffer);
253 print_tree_identifier (scratch_buffer, DECL_NAME (p));
256 else if (DECL_NAME (p))
257 print_tree_identifier (scratch_buffer, DECL_NAME (p));
259 print_identifier (scratch_buffer, "{template default argument error}");
262 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
264 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
266 output_add_string (scratch_buffer, " = ");
267 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
268 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
270 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
274 /* Dump, under control of FLAGS, a template-parameter-list binding.
275 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
279 dump_template_bindings (parms, args)
286 tree p = TREE_VALUE (parms);
287 int lvl = TMPL_PARMS_DEPTH (parms);
291 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
293 tree arg = NULL_TREE;
295 /* Don't crash if we had an invalid argument list. */
296 if (TMPL_ARGS_DEPTH (args) >= lvl)
298 tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
299 if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
300 arg = TREE_VEC_ELT (lvl_args, arg_idx);
304 separate_with_comma (scratch_buffer);
305 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
306 output_add_string (scratch_buffer, " = ");
308 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
310 print_identifier (scratch_buffer, "<missing>");
316 parms = TREE_CHAIN (parms);
320 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
331 if (TYPE_PTRMEMFUNC_P (t))
334 switch (TREE_CODE (t))
337 print_identifier (scratch_buffer, "<unknown type>");
341 /* A list of function parms. */
342 dump_parameters (t, flags);
345 case IDENTIFIER_NODE:
346 print_tree_identifier (scratch_buffer, t);
350 dump_type (BINFO_TYPE (t), flags);
356 dump_aggr_type (t, flags);
360 if (flags & TFF_CHASE_TYPEDEF)
362 dump_type (DECL_ORIGINAL_TYPE (t)
363 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
366 /* else fallthrough */
370 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
374 output_add_string (scratch_buffer, "__complex__ ");
375 dump_type (TREE_TYPE (t), flags);
379 output_add_string (scratch_buffer, "vector ");
381 /* The subtype of a VECTOR_TYPE is something like intQI_type_node,
382 which has no name and is not very useful for diagnostics. So
383 look up the equivalent C type and print its name. */
384 tree elt = TREE_TYPE (t);
385 elt = c_common_type_for_mode (TYPE_MODE (elt), TREE_UNSIGNED (elt));
386 dump_type (elt, flags);
391 if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && TREE_UNSIGNED (t))
392 output_add_string (scratch_buffer, "unsigned ");
393 else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && !TREE_UNSIGNED (t))
394 output_add_string (scratch_buffer, "signed ");
402 dump_qualifiers (t, after);
403 type = flags & TFF_CHASE_TYPEDEF ? TYPE_MAIN_VARIANT (t) : t;
404 if (TYPE_NAME (type) && TYPE_IDENTIFIER (type))
405 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (type));
407 /* Types like intQI_type_node and friends have no names.
408 These don't come up in user error messages, but it's nice
409 to be able to print them from the debugger. */
410 print_identifier (scratch_buffer, "<anonymous>");
414 case TEMPLATE_TEMPLATE_PARM:
415 /* For parameters inside template signature. */
416 if (TYPE_IDENTIFIER (t))
417 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
420 (scratch_buffer, "<anonymous template template parameter>");
423 case BOUND_TEMPLATE_TEMPLATE_PARM:
425 tree args = TYPE_TI_ARGS (t);
426 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
427 print_template_argument_list_start (scratch_buffer);
428 dump_template_argument_list (args, flags);
429 print_template_argument_list_end (scratch_buffer);
433 case TEMPLATE_TYPE_PARM:
434 dump_qualifiers (t, after);
435 if (TYPE_IDENTIFIER (t))
436 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
439 (scratch_buffer, "<anonymous template type parameter>");
442 /* This is not always necessary for pointers and such, but doing this
443 reduces code size. */
452 dump_type_prefix (t, flags);
453 dump_type_suffix (t, flags);
457 output_add_string (scratch_buffer, "typename ");
458 dump_typename (t, flags);
461 case UNBOUND_CLASS_TEMPLATE:
462 dump_type (TYPE_CONTEXT (t), flags);
463 print_scope_operator (scratch_buffer);
464 print_identifier (scratch_buffer, "template ");
465 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
469 output_add_string (scratch_buffer, "__typeof (");
470 dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS);
471 print_right_paren (scratch_buffer);
475 sorry_for_unsupported_tree (t);
476 /* Fall through to error. */
479 print_identifier (scratch_buffer, "<type error>");
484 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
488 dump_typename (t, flags)
492 tree ctx = TYPE_CONTEXT (t);
494 if (TREE_CODE (ctx) == TYPENAME_TYPE)
495 dump_typename (ctx, flags);
497 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
498 print_scope_operator (scratch_buffer);
499 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
502 /* Return the name of the supplied aggregate, or enumeral type. */
505 class_key_or_enum (t)
508 if (TREE_CODE (t) == ENUMERAL_TYPE)
510 else if (TREE_CODE (t) == UNION_TYPE)
512 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
518 /* Print out a class declaration T under the control of FLAGS,
519 in the form `class foo'. */
522 dump_aggr_type (t, flags)
527 const char *variety = class_key_or_enum (t);
531 dump_qualifiers (t, after);
533 if (flags & TFF_CLASS_KEY_OR_ENUM)
535 print_identifier (scratch_buffer, variety);
536 output_add_space (scratch_buffer);
539 if (flags & TFF_CHASE_TYPEDEF)
540 t = TYPE_MAIN_VARIANT (t);
542 name = TYPE_NAME (t);
546 typdef = !DECL_ARTIFICIAL (name);
547 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
548 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
549 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
550 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
551 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
552 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
553 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
556 /* Because the template names are mangled, we have to locate
557 the most general template, and use that name. */
558 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
560 while (DECL_TEMPLATE_INFO (tpl))
561 tpl = DECL_TI_TEMPLATE (tpl);
564 name = DECL_NAME (name);
567 if (name == 0 || ANON_AGGRNAME_P (name))
569 if (flags & TFF_CLASS_KEY_OR_ENUM)
570 print_identifier (scratch_buffer, "<anonymous>");
572 output_printf (scratch_buffer, "<anonymous %s>", variety);
575 print_tree_identifier (scratch_buffer, name);
577 dump_template_parms (TYPE_TEMPLATE_INFO (t),
578 !CLASSTYPE_USE_TEMPLATE (t),
579 flags & ~TFF_TEMPLATE_HEADER);
582 /* Dump into the obstack the initial part of the output for a given type.
583 This is necessary when dealing with things like functions returning
586 return type of `int (* fee ())()': pointer -> function -> int. Both
587 pointer (and reference and offset) and function (and member) types must
588 deal with prefix and suffix.
590 Arrays must also do this for DECL nodes, like int a[], and for things like
593 Return indicates how you should pad an object name after this. I.e. you
594 want to pad non-*, non-& cores, but not pad * or & types. */
597 dump_type_prefix (t, flags)
601 enum pad padding = before;
603 if (TYPE_PTRMEMFUNC_P (t))
605 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
609 switch (TREE_CODE (t))
614 tree sub = TREE_TYPE (t);
616 padding = dump_type_prefix (sub, flags);
617 /* A tree for a member pointer looks like pointer to offset,
618 so let the OFFSET_TYPE case handle it. */
619 if (!TYPE_PTRMEM_P (t))
621 if (TREE_CODE (sub) == ARRAY_TYPE)
623 output_add_space (scratch_buffer);
624 print_left_paren (scratch_buffer);
627 (scratch_buffer, "&*"[TREE_CODE (t) == POINTER_TYPE]);
628 padding = dump_qualifiers (t, before);
635 padding = dump_type_prefix (TREE_TYPE (t), flags);
636 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
639 output_add_space (scratch_buffer);
640 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
641 print_scope_operator (scratch_buffer);
643 output_add_character (scratch_buffer, '*');
644 padding = dump_qualifiers (t, none);
647 /* Can only be reached through function pointer -- this would not be
648 correct if FUNCTION_DECLs used it. */
650 padding = dump_type_prefix (TREE_TYPE (t), flags);
652 output_add_space (scratch_buffer);
653 print_left_paren (scratch_buffer);
658 padding = dump_type_prefix (TREE_TYPE (t), flags);
660 output_add_space (scratch_buffer);
661 print_left_paren (scratch_buffer);
663 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
664 print_scope_operator (scratch_buffer);
668 padding = dump_type_prefix (TREE_TYPE (t), flags);
672 case IDENTIFIER_NODE:
677 case TEMPLATE_TYPE_PARM:
678 case TEMPLATE_TEMPLATE_PARM:
679 case BOUND_TEMPLATE_TEMPLATE_PARM:
689 dump_type (t, flags);
694 sorry_for_unsupported_tree (t);
697 print_identifier (scratch_buffer, "<typeprefixerror>");
703 /* Dump the suffix of type T, under control of FLAGS. This is the part
704 which appears after the identifier (or function parms). */
707 dump_type_suffix (t, flags)
711 if (TYPE_PTRMEMFUNC_P (t))
712 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
714 switch (TREE_CODE (t))
719 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
720 print_right_paren (scratch_buffer);
721 dump_type_suffix (TREE_TYPE (t), flags);
724 /* Can only be reached through function pointer */
729 print_right_paren (scratch_buffer);
730 arg = TYPE_ARG_TYPES (t);
731 if (TREE_CODE (t) == METHOD_TYPE)
732 arg = TREE_CHAIN (arg);
734 /* Function pointers don't have default args. Not in standard C++,
735 anyway; they may in g++, but we'll just pretend otherwise. */
736 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
738 if (TREE_CODE (t) == METHOD_TYPE)
740 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before);
741 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
742 dump_type_suffix (TREE_TYPE (t), flags);
747 print_left_bracket (scratch_buffer);
750 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
753 tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
754 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
755 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
756 flags & ~TFF_EXPR_IN_PARENS);
758 dump_expr (fold (cp_build_binary_op
759 (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
761 flags & ~TFF_EXPR_IN_PARENS);
763 print_right_bracket (scratch_buffer);
764 dump_type_suffix (TREE_TYPE (t), flags);
768 case IDENTIFIER_NODE:
773 case TEMPLATE_TYPE_PARM:
774 case TEMPLATE_TEMPLATE_PARM:
775 case BOUND_TEMPLATE_TEMPLATE_PARM:
788 sorry_for_unsupported_tree (t);
790 /* Don't mark it here, we should have already done in
800 const char *p = NULL;
802 if (DECL_GLOBAL_CTOR_P (t))
804 else if (DECL_GLOBAL_DTOR_P (t))
809 output_printf (scratch_buffer, "(static %s for %s)", p, input_filename);
813 dump_simple_decl (t, type, flags)
818 if (flags & TFF_DECL_SPECIFIERS)
820 if (dump_type_prefix (type, flags) != none)
821 output_add_space (scratch_buffer);
823 if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
824 dump_scope (CP_DECL_CONTEXT (t), flags);
826 dump_decl (DECL_NAME (t), flags);
828 print_identifier (scratch_buffer, "<anonymous>");
829 if (flags & TFF_DECL_SPECIFIERS)
830 dump_type_suffix (type, flags);
833 /* Dump a human readable string for the decl T under control of FLAGS. */
843 switch (TREE_CODE (t))
847 /* Don't say 'typedef class A' */
848 if (DECL_ARTIFICIAL (t))
850 if ((flags & TFF_DECL_SPECIFIERS)
851 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
852 /* Say `class T' not just `T'. */
853 output_add_string (scratch_buffer, "class ");
855 dump_type (TREE_TYPE (t), flags);
859 if (flags & TFF_DECL_SPECIFIERS)
860 output_add_string (scratch_buffer, "typedef ");
861 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
862 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
867 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
869 output_add_string (scratch_buffer, "vtable for ");
870 my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720);
871 dump_type (DECL_CONTEXT (t), flags);
874 /* else fall through */
877 dump_simple_decl (t, TREE_TYPE (t), flags);
881 output_add_string (scratch_buffer, "<return value> ");
882 dump_simple_decl (t, TREE_TYPE (t), flags);
886 dump_scope (CP_DECL_CONTEXT (t), flags);
887 if (DECL_NAME (t) == anonymous_namespace_name)
888 print_identifier (scratch_buffer, "<unnamed>");
890 print_tree_identifier (scratch_buffer, DECL_NAME (t));
894 dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
895 print_scope_operator (scratch_buffer);
896 dump_decl (TREE_OPERAND (t, 1), flags);
900 dump_decl (TREE_OPERAND (t, 0), flags);
901 print_left_bracket (scratch_buffer);
902 dump_decl (TREE_OPERAND (t, 1), flags);
903 print_right_bracket (scratch_buffer);
906 /* So that we can do dump_decl on an aggr type. */
910 dump_type (t, flags);
917 /* These special cases are duplicated here so that other functions
918 can feed identifiers to error and get them demangled properly. */
919 case IDENTIFIER_NODE:
920 if (IDENTIFIER_TYPENAME_P (t))
922 output_add_string (scratch_buffer, "operator ");
923 /* Not exactly IDENTIFIER_TYPE_VALUE. */
924 dump_type (TREE_TYPE (t), flags);
928 print_tree_identifier (scratch_buffer, t);
936 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
937 dump_global_iord (t);
938 else if (! DECL_LANG_SPECIFIC (t))
939 print_identifier (scratch_buffer, "<internal>");
941 dump_function_decl (t, flags);
945 dump_template_decl (t, flags);
948 case TEMPLATE_ID_EXPR:
951 tree name = TREE_OPERAND (t, 0);
952 if (is_overloaded_fn (name))
953 name = DECL_NAME (get_first_fn (name));
954 dump_decl (name, flags);
955 print_template_argument_list_start (scratch_buffer);
956 for (args = TREE_OPERAND (t, 1); args; args = TREE_CHAIN (args))
958 dump_template_argument (TREE_VALUE (args), flags);
959 if (TREE_CHAIN (args))
960 separate_with_comma (scratch_buffer);
962 print_template_argument_list_end (scratch_buffer);
967 dump_decl (TREE_OPERAND (t, 0), flags);
971 print_tree_identifier (scratch_buffer, DECL_NAME (t));
975 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
976 || (DECL_INITIAL (t) &&
977 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
978 dump_simple_decl (t, TREE_TYPE (t), flags);
979 else if (DECL_NAME (t))
980 dump_decl (DECL_NAME (t), flags);
981 else if (DECL_INITIAL (t))
982 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
984 print_identifier (scratch_buffer, "enumerator");
988 output_add_string (scratch_buffer, "using ");
989 dump_type (DECL_INITIAL (t), flags);
990 print_scope_operator (scratch_buffer);
991 print_tree_identifier (scratch_buffer, DECL_NAME (t));
995 dump_decl (BASELINK_FUNCTIONS (t), flags);
999 sorry_for_unsupported_tree (t);
1000 /* Fallthrough to error. */
1003 print_identifier (scratch_buffer, "<declaration error>");
1008 /* Dump a template declaration T under control of FLAGS. This means the
1009 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1012 dump_template_decl (t, flags)
1016 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1020 if (flags & TFF_TEMPLATE_HEADER)
1022 for (parms = orig_parms = nreverse (orig_parms);
1024 parms = TREE_CHAIN (parms))
1026 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1027 int len = TREE_VEC_LENGTH (inner_parms);
1029 output_add_string (scratch_buffer, "template<");
1031 /* If we've shown the template prefix, we'd better show the
1032 parameters' and decl's type too. */
1033 flags |= TFF_DECL_SPECIFIERS;
1035 for (i = 0; i < len; i++)
1038 separate_with_comma (scratch_buffer);
1039 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1041 print_template_argument_list_end (scratch_buffer);
1042 output_add_space (scratch_buffer);
1044 nreverse(orig_parms);
1046 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1047 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1048 output_add_string (scratch_buffer, "class ");
1051 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1052 dump_type (TREE_TYPE (t),
1053 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1054 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1055 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1056 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1057 else if (TREE_TYPE (t) == NULL_TREE)
1060 switch (NEXT_CODE (t))
1064 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1067 /* This case can occur with some invalid code. */
1068 dump_type (TREE_TYPE (t),
1069 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1070 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0));
1074 /* Pretty print a function decl. There are several ways we want to print a
1075 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1076 As error can only apply the '#' flag once to give 0 and 1 for V, there
1077 is %D which doesn't print the throw specs, and %F which does. */
1080 dump_function_decl (t, flags)
1086 tree cname = NULL_TREE;
1087 tree template_args = NULL_TREE;
1088 tree template_parms = NULL_TREE;
1089 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1091 if (TREE_CODE (t) == TEMPLATE_DECL)
1092 t = DECL_TEMPLATE_RESULT (t);
1094 /* Pretty print template instantiations only. */
1095 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1099 template_args = DECL_TI_ARGS (t);
1100 tmpl = most_general_template (t);
1101 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1103 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1108 fntype = TREE_TYPE (t);
1109 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1111 if (DECL_CLASS_SCOPE_P (t))
1112 cname = DECL_CONTEXT (t);
1113 /* this is for partially instantiated template methods */
1114 else if (TREE_CODE (fntype) == METHOD_TYPE)
1115 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1117 if (!(flags & TFF_DECL_SPECIFIERS))
1119 else if (DECL_STATIC_FUNCTION_P (t))
1120 print_identifier (scratch_buffer, "static ");
1121 else if (DECL_VIRTUAL_P (t))
1122 print_identifier (scratch_buffer, "virtual ");
1124 /* Print the return type? */
1126 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1127 && !DECL_DESTRUCTOR_P (t);
1130 dump_type_prefix (TREE_TYPE (fntype), flags);
1131 output_add_space (scratch_buffer);
1134 /* Print the function name. */
1137 dump_type (cname, flags);
1138 print_scope_operator (scratch_buffer);
1141 dump_scope (CP_DECL_CONTEXT (t), flags);
1143 dump_function_name (t, flags);
1147 dump_parameters (parmtypes, flags);
1149 if (TREE_CODE (fntype) == METHOD_TYPE)
1150 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
1153 if (flags & TFF_EXCEPTION_SPECIFICATION)
1154 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1157 dump_type_suffix (TREE_TYPE (fntype), flags);
1160 /* If T is a template instantiation, dump the parameter binding. */
1161 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1163 output_add_string (scratch_buffer, " [with ");
1164 dump_template_bindings (template_parms, template_args);
1165 print_right_bracket (scratch_buffer);
1169 /* Print a parameter list. If this is for a member function, the
1170 member object ptr (and any other hidden args) should have
1171 already been removed. */
1174 dump_parameters (parmtypes, flags)
1180 print_left_paren (scratch_buffer);
1182 for (first = 1; parmtypes != void_list_node;
1183 parmtypes = TREE_CHAIN (parmtypes))
1186 separate_with_comma (scratch_buffer);
1190 print_identifier (scratch_buffer, "...");
1193 dump_type (TREE_VALUE (parmtypes), flags);
1195 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1197 output_add_string (scratch_buffer, " = ");
1198 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1202 print_right_paren (scratch_buffer);
1205 /* Print an exception specification. T is the exception specification. */
1208 dump_exception_spec (t, flags)
1214 output_add_string (scratch_buffer, " throw (");
1215 if (TREE_VALUE (t) != NULL_TREE)
1218 dump_type (TREE_VALUE (t), flags);
1222 separate_with_comma (scratch_buffer);
1224 print_right_paren (scratch_buffer);
1228 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1229 and destructors properly. */
1232 dump_function_name (t, flags)
1236 tree name = DECL_NAME (t);
1238 if (TREE_CODE (t) == TEMPLATE_DECL)
1239 t = DECL_TEMPLATE_RESULT (t);
1241 /* Don't let the user see __comp_ctor et al. */
1242 if (DECL_CONSTRUCTOR_P (t)
1243 || DECL_DESTRUCTOR_P (t))
1244 name = constructor_name (DECL_CONTEXT (t));
1246 if (DECL_DESTRUCTOR_P (t))
1248 output_add_character (scratch_buffer, '~');
1249 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1251 else if (DECL_CONV_FN_P (t))
1253 /* This cannot use the hack that the operator's return
1254 type is stashed off of its name because it may be
1255 used for error reporting. In the case of conflicting
1256 declarations, both will have the same name, yet
1257 the types will be different, hence the TREE_TYPE field
1258 of the first name will be clobbered by the second. */
1259 output_add_string (scratch_buffer, "operator ");
1260 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1262 else if (IDENTIFIER_OPNAME_P (name))
1263 print_tree_identifier (scratch_buffer, name);
1265 dump_decl (name, flags);
1267 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
1268 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1269 && (DECL_TEMPLATE_SPECIALIZATION (t)
1270 || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1271 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t))
1272 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1273 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1276 /* Dump the template parameters from the template info INFO under control of
1277 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1278 specialization (partial or complete). For partial specializations we show
1279 the specialized parameter values. For a primary template we show no
1283 dump_template_parms (info, primary, flags)
1288 tree args = info ? TI_ARGS (info) : NULL_TREE;
1290 if (primary && flags & TFF_TEMPLATE_NAME)
1292 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1293 print_template_argument_list_start (scratch_buffer);
1295 /* Be careful only to print things when we have them, so as not
1296 to crash producing error messages. */
1297 if (args && !primary)
1303 if (TREE_CODE (args) == TREE_VEC)
1305 if (TREE_VEC_LENGTH (args) > 0
1306 && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
1307 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1309 len = TREE_VEC_LENGTH (args);
1311 else if (TREE_CODE (args) == TREE_LIST)
1313 while (ix != len && args)
1318 arg = TREE_VEC_ELT (args, ix);
1323 arg = TREE_VALUE (args);
1324 args = TREE_CHAIN (args);
1327 separate_with_comma (scratch_buffer);
1330 print_identifier (scratch_buffer, "<template parameter error>");
1332 dump_template_argument (arg, flags);
1338 tree tpl = TI_TEMPLATE (info);
1339 tree parms = DECL_TEMPLATE_PARMS (tpl);
1342 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1343 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1345 for (ix = 0; ix != len; ix++)
1347 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1350 separate_with_comma (scratch_buffer);
1352 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1355 print_template_argument_list_end (scratch_buffer);
1364 case TARGET_NEWLINE:
1365 output_add_string (scratch_buffer, "\\n");
1368 output_add_string (scratch_buffer, "\\t");
1371 output_add_string (scratch_buffer, "\\v");
1374 output_add_string (scratch_buffer, "\\b");
1377 output_add_string (scratch_buffer, "\\r");
1380 output_add_string (scratch_buffer, "\\f");
1383 output_add_string (scratch_buffer, "\\a");
1386 output_add_string (scratch_buffer, "\\\\");
1389 output_add_string (scratch_buffer, "\\'");
1392 output_add_string (scratch_buffer, "\\\"");
1396 output_add_character (scratch_buffer, c);
1399 sprintf (digit_buffer, "\\%03o", (int) c);
1400 output_add_string (scratch_buffer, digit_buffer);
1405 /* Print out a list of initializers (subr of dump_expr) */
1408 dump_expr_list (l, flags)
1414 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1417 separate_with_comma (scratch_buffer);
1421 /* Print out an expression E under control of FLAGS. */
1424 dump_expr (t, flags)
1431 switch (TREE_CODE (t))
1439 case NAMESPACE_DECL:
1441 case IDENTIFIER_NODE:
1442 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
1447 tree type = TREE_TYPE (t);
1448 my_friendly_assert (type != 0, 81);
1450 /* If it's an enum, output its tag, rather than its value. */
1451 if (TREE_CODE (type) == ENUMERAL_TYPE)
1453 tree values = TYPE_VALUES (type);
1456 values = TREE_CHAIN (values))
1457 if (tree_int_cst_equal (TREE_VALUE (values), t))
1461 print_tree_identifier (scratch_buffer, TREE_PURPOSE (values));
1464 /* Value must have been cast. */
1465 print_left_paren (scratch_buffer);
1466 dump_type (type, flags);
1467 print_right_paren (scratch_buffer);
1471 else if (type == boolean_type_node)
1473 if (t == boolean_false_node || integer_zerop (t))
1474 print_identifier (scratch_buffer, "false");
1475 else if (t == boolean_true_node)
1476 print_identifier (scratch_buffer, "true");
1478 else if (type == char_type_node)
1480 output_add_character (scratch_buffer, '\'');
1481 if (host_integerp (t, TREE_UNSIGNED (type)))
1482 dump_char (tree_low_cst (t, TREE_UNSIGNED (type)));
1484 output_printf (scratch_buffer, "\\x%x",
1485 (unsigned int) TREE_INT_CST_LOW (t));
1486 output_add_character (scratch_buffer, '\'');
1491 if (! host_integerp (t, 0))
1495 if (tree_int_cst_sgn (val) < 0)
1497 output_add_character (scratch_buffer, '-');
1498 val = build_int_2 (-TREE_INT_CST_LOW (val),
1499 ~TREE_INT_CST_HIGH (val)
1500 + !TREE_INT_CST_LOW (val));
1502 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
1505 static char format[10]; /* "%x%09999x\0" */
1507 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
1508 sprintf (digit_buffer, format, TREE_INT_CST_HIGH (val),
1509 TREE_INT_CST_LOW (val));
1510 output_add_string (scratch_buffer, digit_buffer);
1514 print_integer (scratch_buffer, TREE_INT_CST_LOW (t));
1520 real_to_decimal (digit_buffer, &TREE_REAL_CST (t),
1521 sizeof (digit_buffer), 0, 1);
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_ptrmemfunc_access_expr (t, pfn_identifier);
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 (BASELINK_FUNCTIONS (t)),
1891 flags | TFF_EXPR_IN_PARENS);
1893 dump_decl (t, flags);
1897 if (TREE_CODE (ob) == INDIRECT_REF)
1899 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1900 output_add_string (scratch_buffer, "->*");
1904 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1905 output_add_string (scratch_buffer, ".*");
1907 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1912 case TEMPLATE_PARM_INDEX:
1913 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1917 dump_type (TREE_OPERAND (t, 0), flags);
1918 print_scope_operator (scratch_buffer);
1919 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1923 if (TREE_OPERAND (t, 0) == NULL_TREE
1924 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1926 dump_type (TREE_TYPE (t), flags);
1927 print_left_paren (scratch_buffer);
1928 dump_expr_list (TREE_OPERAND (t, 0), flags);
1929 print_right_paren (scratch_buffer);
1933 print_left_paren (scratch_buffer);
1934 dump_type (TREE_TYPE (t), flags);
1935 output_add_string (scratch_buffer, ")(");
1936 dump_expr_list (TREE_OPERAND (t, 0), flags);
1937 print_right_paren (scratch_buffer);
1941 case STATIC_CAST_EXPR:
1942 output_add_string (scratch_buffer, "static_cast<");
1944 case REINTERPRET_CAST_EXPR:
1945 output_add_string (scratch_buffer, "reinterpret_cast<");
1947 case CONST_CAST_EXPR:
1948 output_add_string (scratch_buffer, "const_cast<");
1950 case DYNAMIC_CAST_EXPR:
1951 output_add_string (scratch_buffer, "dynamic_cast<");
1953 dump_type (TREE_TYPE (t), flags);
1954 output_add_string (scratch_buffer, ">(");
1955 dump_expr (TREE_OPERAND (t, 0), flags);
1956 print_right_paren (scratch_buffer);
1960 print_tree_identifier (scratch_buffer, TREE_OPERAND (t, 0));
1964 dump_expr (TREE_OPERAND (t, 0), flags);
1965 output_add_string (scratch_buffer, "->");
1970 if (TREE_CODE (t) == SIZEOF_EXPR)
1971 output_add_string (scratch_buffer, "sizeof (");
1974 my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
1975 output_add_string (scratch_buffer, "__alignof__ (");
1977 if (TYPE_P (TREE_OPERAND (t, 0)))
1978 dump_type (TREE_OPERAND (t, 0), flags);
1980 dump_unary_op ("*", t, flags | TFF_EXPR_IN_PARENS);
1981 print_right_paren (scratch_buffer);
1985 print_identifier (scratch_buffer, "<unparsed>");
1988 case TRY_CATCH_EXPR:
1989 case WITH_CLEANUP_EXPR:
1990 case CLEANUP_POINT_EXPR:
1991 dump_expr (TREE_OPERAND (t, 0), flags);
1994 case PSEUDO_DTOR_EXPR:
1995 dump_expr (TREE_OPERAND (t, 2), flags);
1996 output_add_character (scratch_buffer, '.');
1997 dump_type (TREE_OPERAND (t, 0), flags);
1998 output_add_string (scratch_buffer, "::~");
1999 dump_type (TREE_OPERAND (t, 1), flags);
2002 case TEMPLATE_ID_EXPR:
2003 dump_decl (t, flags);
2007 /* We don't yet have a way of dumping statements in a
2008 human-readable format. */
2009 output_add_string (scratch_buffer, "({...})");
2013 output_add_character (scratch_buffer, '{');
2014 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
2015 output_add_character (scratch_buffer, '}');
2019 output_add_string (scratch_buffer, "while (1) { ");
2020 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2021 output_add_character (scratch_buffer, '}');
2025 output_add_string (scratch_buffer, "if (");
2026 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2027 output_add_string (scratch_buffer, ") break; ");
2031 print_tree_identifier (scratch_buffer, DECL_NAME (get_first_fn (t)));
2034 /* else fall through */
2036 /* This list is incomplete, but should suffice for now.
2037 It is very important that `sorry' does not call
2038 `report_error_function'. That could cause an infinite loop. */
2040 sorry_for_unsupported_tree (t);
2041 /* fall through to ERROR_MARK... */
2043 print_identifier (scratch_buffer, "<expression error>");
2049 dump_binary_op (opstring, t, flags)
2050 const char *opstring;
2054 print_left_paren (scratch_buffer);
2055 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2056 output_add_space (scratch_buffer);
2058 print_identifier (scratch_buffer, opstring);
2060 print_identifier (scratch_buffer, "<unknown operator>");
2061 output_add_space (scratch_buffer);
2062 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2063 print_right_paren (scratch_buffer);
2067 dump_unary_op (opstring, t, flags)
2068 const char *opstring;
2072 if (flags & TFF_EXPR_IN_PARENS)
2073 print_left_paren (scratch_buffer);
2074 print_identifier (scratch_buffer, opstring);
2075 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2076 if (flags & TFF_EXPR_IN_PARENS)
2077 print_right_paren (scratch_buffer);
2080 /* Exported interface to stringifying types, exprs and decls under TFF_*
2084 type_as_string (typ, flags)
2088 reinit_global_formatting_buffer ();
2090 dump_type (typ, flags);
2092 return output_finalize_message (scratch_buffer);
2096 expr_as_string (decl, flags)
2100 reinit_global_formatting_buffer ();
2102 dump_expr (decl, flags);
2104 return output_finalize_message (scratch_buffer);
2108 decl_as_string (decl, flags)
2112 reinit_global_formatting_buffer ();
2114 dump_decl (decl, flags);
2116 return output_finalize_message (scratch_buffer);
2120 context_as_string (context, flags)
2124 reinit_global_formatting_buffer ();
2126 dump_scope (context, flags);
2128 return output_finalize_message (scratch_buffer);
2131 /* Generate the three forms of printable names for cxx_printable_name. */
2134 lang_decl_name (decl, v)
2139 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2141 reinit_global_formatting_buffer ();
2143 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
2145 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2146 print_scope_operator (scratch_buffer);
2149 if (TREE_CODE (decl) == FUNCTION_DECL)
2150 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2152 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2154 return output_finalize_message (scratch_buffer);
2161 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2162 return DECL_SOURCE_FILE (DECL_CONTEXT (t));
2163 else if (TYPE_P (t))
2164 return DECL_SOURCE_FILE (TYPE_MAIN_DECL (t));
2165 else if (TREE_CODE (t) == OVERLOAD)
2166 return DECL_SOURCE_FILE (OVL_FUNCTION (t));
2168 return DECL_SOURCE_FILE (t);
2176 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2177 line = DECL_SOURCE_LINE (DECL_CONTEXT (t));
2178 if (TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t)
2179 && TYPE_MAIN_DECL (TREE_TYPE (t)))
2183 line = DECL_SOURCE_LINE (TYPE_MAIN_DECL (t));
2184 else if (TREE_CODE (t) == OVERLOAD)
2185 line = DECL_SOURCE_LINE (OVL_FUNCTION (t));
2187 line = DECL_SOURCE_LINE (t);
2195 /* Now the interfaces from error et al to dump_type et al. Each takes an
2196 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2200 decl_to_string (decl, verbose)
2206 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2207 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2208 flags = TFF_CLASS_KEY_OR_ENUM;
2210 flags |= TFF_DECL_SPECIFIERS | TFF_FUNCTION_DEFAULT_ARGUMENTS;
2211 else if (TREE_CODE (decl) == FUNCTION_DECL)
2212 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2213 flags |= TFF_TEMPLATE_HEADER;
2215 reinit_global_formatting_buffer ();
2217 dump_decl (decl, flags);
2219 return output_finalize_message (scratch_buffer);
2223 expr_to_string (decl, verbose)
2225 int verbose ATTRIBUTE_UNUSED;
2227 reinit_global_formatting_buffer ();
2229 dump_expr (decl, 0);
2231 return output_finalize_message (scratch_buffer);
2235 fndecl_to_string (fndecl, verbose)
2241 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
2243 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2244 reinit_global_formatting_buffer ();
2246 dump_decl (fndecl, flags);
2248 return output_finalize_message (scratch_buffer);
2253 code_to_string (c, v)
2255 int v ATTRIBUTE_UNUSED;
2257 return tree_code_name [c];
2261 language_to_string (c, v)
2263 int v ATTRIBUTE_UNUSED;
2270 case lang_cplusplus:
2282 /* Return the proper printed version of a parameter to a C++ function. */
2285 parm_to_string (p, v)
2287 int v ATTRIBUTE_UNUSED;
2292 sprintf (digit_buffer, "%d", p+1);
2293 return digit_buffer;
2299 int v ATTRIBUTE_UNUSED;
2303 id = operator_name_info[(int) p].identifier;
2304 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2308 type_to_string (typ, verbose)
2316 flags |= TFF_CLASS_KEY_OR_ENUM;
2317 flags |= TFF_TEMPLATE_HEADER;
2319 reinit_global_formatting_buffer ();
2321 dump_type (typ, flags);
2323 return output_finalize_message (scratch_buffer);
2327 assop_to_string (p, v)
2329 int v ATTRIBUTE_UNUSED;
2333 id = assignment_operator_name_info[(int) p].identifier;
2334 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2338 args_to_string (p, verbose)
2344 flags |= TFF_CLASS_KEY_OR_ENUM;
2349 if (TYPE_P (TREE_VALUE (p)))
2350 return type_as_string (p, flags);
2352 reinit_global_formatting_buffer ();
2353 for (; p; p = TREE_CHAIN (p))
2355 if (TREE_VALUE (p) == null_node)
2356 print_identifier (scratch_buffer, "NULL");
2358 dump_type (error_type (TREE_VALUE (p)), flags);
2360 separate_with_comma (scratch_buffer);
2362 return output_finalize_message (scratch_buffer);
2370 reinit_global_formatting_buffer ();
2372 dump_qualifiers (p, v ? before : none);
2374 return output_finalize_message (scratch_buffer);
2377 /* Langhook for print_error_function. */
2379 cxx_print_error_function (context, file)
2380 diagnostic_context *context;
2383 lhd_print_error_function (context, file);
2384 output_set_prefix (&context->buffer, file);
2385 maybe_print_instantiation_context (context);
2389 cp_diagnostic_starter (context, diagnostic)
2390 diagnostic_context *context;
2391 diagnostic_info *diagnostic;
2393 diagnostic_report_current_module (context);
2394 cp_print_error_function (context, diagnostic);
2395 maybe_print_instantiation_context (context);
2396 output_set_prefix (&context->buffer, diagnostic_build_prefix (diagnostic));
2400 cp_diagnostic_finalizer (context, diagnostic)
2401 diagnostic_context *context;
2402 diagnostic_info *diagnostic __attribute__((unused));
2404 output_destroy_prefix (&context->buffer);
2407 /* Print current function onto BUFFER, in the process of reporting
2408 a diagnostic message. Called from cp_diagnostic_starter. */
2410 cp_print_error_function (context, diagnostic)
2411 diagnostic_context *context;
2412 diagnostic_info *diagnostic;
2414 if (diagnostic_last_function_changed (context))
2416 const char *old_prefix = output_prefix (&context->buffer);
2417 char *new_prefix = diagnostic->location.file
2418 ? file_name_as_prefix (diagnostic->location.file)
2421 output_set_prefix (&context->buffer, new_prefix);
2423 if (current_function_decl == NULL)
2424 output_add_string (&context->buffer, "At global scope:");
2426 output_printf (&context->buffer, "In %s `%s':",
2427 function_category (current_function_decl),
2428 cxx_printable_name (current_function_decl, 2));
2429 output_add_newline (&context->buffer);
2431 diagnostic_set_last_function (context);
2432 output_destroy_prefix (&context->buffer);
2433 context->buffer.state.prefix = old_prefix;
2437 /* Returns a description of FUNCTION using standard terminology. */
2439 function_category (fn)
2442 if (DECL_FUNCTION_MEMBER_P (fn))
2444 if (DECL_STATIC_FUNCTION_P (fn))
2445 return "static member function";
2446 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2447 return "copy constructor";
2448 else if (DECL_CONSTRUCTOR_P (fn))
2449 return "constructor";
2450 else if (DECL_DESTRUCTOR_P (fn))
2451 return "destructor";
2453 return "member function";
2459 /* Report the full context of a current template instantiation,
2462 print_instantiation_full_context (context)
2463 diagnostic_context *context;
2465 tree p = current_instantiation ();
2467 const char *file = input_filename;
2471 if (current_function_decl != TINST_DECL (p)
2472 && current_function_decl != NULL_TREE)
2473 /* We can get here during the processing of some synthesized
2474 method. Then, TINST_DECL (p) will be the function that's causing
2479 if (current_function_decl == TINST_DECL (p))
2480 /* Avoid redundancy with the the "In function" line. */;
2482 output_verbatim (&context->buffer,
2483 "%s: In instantiation of `%s':\n", file,
2484 decl_as_string (TINST_DECL (p),
2485 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2487 line = TINST_LINE (p);
2488 file = TINST_FILE (p);
2493 print_instantiation_partial_context (context, p, file, line);
2496 /* Same as above but less verbose. */
2498 print_instantiation_partial_context (context, t, file, line)
2499 diagnostic_context *context;
2504 for (; t; t = TREE_CHAIN (t))
2507 (&context->buffer, "%s:%d: instantiated from `%s'\n", file, line,
2508 decl_as_string (TINST_DECL (t), TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2509 line = TINST_LINE (t);
2510 file = TINST_FILE (t);
2512 output_verbatim (&context->buffer, "%s:%d: instantiated from here\n", file, line);
2515 /* Called from cp_thing to print the template context for an error. */
2517 maybe_print_instantiation_context (context)
2518 diagnostic_context *context;
2520 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2523 record_last_problematic_instantiation ();
2524 print_instantiation_full_context (context);
2527 /* Report the bare minimum context of a template instantiation. */
2529 print_instantiation_context ()
2531 print_instantiation_partial_context
2532 (global_dc, current_instantiation (), input_filename, lineno);
2533 diagnostic_flush_buffer (global_dc);
2536 /* Called from output_format -- during diagnostic message processing --
2537 to handle C++ specific format specifier with the following meanings:
2538 %A function argument-list.
2542 %F function declaration.
2543 %L language as used in extern "lang".
2545 %P function parameter whose position is indicated by an integer.
2546 %Q assignment operator.
2550 cp_printer (buffer, text)
2551 output_buffer *buffer;
2556 #define next_tree va_arg (*text->args_ptr, tree)
2557 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2558 #define next_lang va_arg (*text->args_ptr, enum languages)
2559 #define next_int va_arg (*text->args_ptr, int)
2561 if (*text->format_spec == '+')
2562 ++text->format_spec;
2563 if (*text->format_spec == '#')
2566 ++text->format_spec;
2569 switch (*text->format_spec)
2571 case 'A': result = args_to_string (next_tree, verbose); break;
2572 case 'C': result = code_to_string (next_tcode, verbose); break;
2573 case 'D': result = decl_to_string (next_tree, verbose); break;
2574 case 'E': result = expr_to_string (next_tree, verbose); break;
2575 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2576 case 'L': result = language_to_string (next_lang, verbose); break;
2577 case 'O': result = op_to_string (next_tcode, verbose); break;
2578 case 'P': result = parm_to_string (next_int, verbose); break;
2579 case 'Q': result = assop_to_string (next_tcode, verbose); break;
2580 case 'T': result = type_to_string (next_tree, verbose); break;
2581 case 'V': result = cv_to_string (next_tree, verbose); break;
2587 output_add_string (buffer, result);
2596 print_integer (buffer, i)
2597 output_buffer *buffer;
2600 sprintf (digit_buffer, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT) i);
2601 output_add_string (buffer, digit_buffer);
2605 print_non_consecutive_character (buffer, c)
2606 output_buffer *buffer;
2609 const char *p = output_last_position (buffer);
2611 if (p != NULL && *p == c)
2612 output_add_space (buffer);
2613 output_add_character (buffer, c);
2616 /* These are temporary wrapper functions which handle the historic
2617 behavior of cp_*_at. */
2620 locate_error (msgid, ap)
2628 for (f = msgid; *f; f++)
2641 /* Just ignore these possibilities. */
2643 case 'd': (void) va_arg (ap, int); break;
2644 case 's': (void) va_arg (ap, char *); break;
2645 case 'L': (void) va_arg (ap, enum languages); break;
2648 case 'Q': (void) va_arg (ap, enum tree_code); break;
2650 /* These take a tree, which may be where the error is
2659 t = va_arg (ap, tree);
2665 errorcount = 0; /* damn ICE suppression */
2666 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2672 here = va_arg (ap, tree);
2679 cp_error_at VPARAMS ((const char *msgid, ...))
2682 diagnostic_info diagnostic;
2684 VA_OPEN (ap, msgid);
2685 VA_FIXEDARG (ap, const char *, msgid);
2686 here = locate_error (msgid, ap);
2689 VA_OPEN (ap, msgid);
2690 VA_FIXEDARG (ap, const char *, msgid);
2692 diagnostic_set_info (&diagnostic, msgid, &ap,
2693 cp_file_of (here), cp_line_of (here), DK_ERROR);
2694 report_diagnostic (&diagnostic);
2699 cp_warning_at VPARAMS ((const char *msgid, ...))
2702 diagnostic_info diagnostic;
2704 VA_OPEN (ap, msgid);
2705 VA_FIXEDARG (ap, const char *, msgid);
2706 here = locate_error (msgid, ap);
2709 VA_OPEN (ap, msgid);
2710 VA_FIXEDARG (ap, const char *, msgid);
2712 diagnostic_set_info (&diagnostic, msgid, &ap,
2713 cp_file_of (here), cp_line_of (here), DK_WARNING);
2714 report_diagnostic (&diagnostic);
2719 cp_pedwarn_at VPARAMS ((const char *msgid, ...))
2722 diagnostic_info diagnostic;
2724 VA_OPEN (ap, msgid);
2725 VA_FIXEDARG (ap, const char *, msgid);
2726 here = locate_error (msgid, ap);
2729 VA_OPEN (ap, msgid);
2730 VA_FIXEDARG (ap, const char *, msgid);
2732 diagnostic_set_info (&diagnostic, msgid, &ap,
2733 cp_file_of (here), cp_line_of (here),
2734 pedantic_error_kind());
2735 report_diagnostic (&diagnostic);