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 2003 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 (tree, int);
66 static const char *assop_to_string (enum tree_code);
67 static const char *code_to_string (enum tree_code);
68 static const char *cv_to_string (tree, int);
69 static const char *decl_to_string (tree, int);
70 static const char *expr_to_string (tree);
71 static const char *fndecl_to_string (tree, int);
72 static const char *op_to_string (enum tree_code);
73 static const char *parm_to_string (int);
74 static const char *type_to_string (tree, int);
76 static void dump_type (tree, int);
77 static void dump_typename (tree, int);
78 static void dump_simple_decl (tree, tree, int);
79 static void dump_decl (tree, int);
80 static void dump_template_decl (tree, int);
81 static void dump_function_decl (tree, int);
82 static void dump_expr (tree, int);
83 static void dump_unary_op (const char *, tree, int);
84 static void dump_binary_op (const char *, tree, int);
85 static void dump_aggr_type (tree, int);
86 static enum pad dump_type_prefix (tree, int);
87 static void dump_type_suffix (tree, int);
88 static void dump_function_name (tree, int);
89 static void dump_expr_list (tree, int);
90 static void dump_global_iord (tree);
91 static enum pad dump_qualifiers (tree, enum pad);
92 static void dump_char (int);
93 static void dump_parameters (tree, int);
94 static void dump_exception_spec (tree, int);
95 static const char *class_key_or_enum (tree);
96 static void dump_template_argument (tree, int);
97 static void dump_template_argument_list (tree, int);
98 static void dump_template_parameter (tree, int);
99 static void dump_template_bindings (tree, tree);
100 static void dump_scope (tree, int);
101 static void dump_template_parms (tree, int, int);
103 static const char *function_category (tree);
104 static void maybe_print_instantiation_context (diagnostic_context *);
105 static void print_instantiation_full_context (diagnostic_context *);
106 static void print_instantiation_partial_context (diagnostic_context *,
108 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
109 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
110 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
112 static bool cp_printer (output_buffer *, text_info *);
113 static void print_non_consecutive_character (output_buffer *, int);
114 static tree locate_error (const char *, va_list);
115 static location_t location_of (tree);
120 diagnostic_starter (global_dc) = cp_diagnostic_starter;
121 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
122 diagnostic_format_decoder (global_dc) = cp_printer;
124 init_output_buffer (scratch_buffer, /* prefix */NULL, /* line-width */0);
127 /* Dump a scope, if deemed necessary. */
130 dump_scope (tree scope, int flags)
132 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
134 if (scope == NULL_TREE)
137 if (TREE_CODE (scope) == NAMESPACE_DECL)
139 if (scope != global_namespace)
141 dump_decl (scope, f);
142 print_scope_operator (scratch_buffer);
145 else if (AGGREGATE_TYPE_P (scope))
147 dump_type (scope, f);
148 print_scope_operator (scratch_buffer);
150 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
152 dump_function_decl (scope, f);
153 print_scope_operator (scratch_buffer);
157 /* Dump type qualifiers, providing padding as requested. Return an
158 indication of whether we dumped something. */
161 dump_qualifiers (tree t, enum pad p)
163 static const int masks[] =
164 {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT};
165 static const char *const names[] =
166 {"const", "volatile", "__restrict"};
168 int quals = TYPE_QUALS (t);
169 int do_after = p == after;
173 for (ix = 0; ix != 3; ix++)
174 if (masks[ix] & quals)
177 output_add_space (scratch_buffer);
179 print_identifier (scratch_buffer, names[ix]);
182 output_add_space (scratch_buffer);
189 /* Dump the template ARGument under control of FLAGS. */
192 dump_template_argument (tree arg, int flags)
194 if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
195 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
197 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
200 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
204 dump_template_argument_list (tree args, int flags)
206 int n = TREE_VEC_LENGTH (args);
210 for (i = 0; i< n; ++i)
213 separate_with_comma (scratch_buffer);
214 dump_template_argument (TREE_VEC_ELT (args, i), flags);
219 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
222 dump_template_parameter (tree parm, int flags)
224 tree p = TREE_VALUE (parm);
225 tree a = TREE_PURPOSE (parm);
227 if (TREE_CODE (p) == TYPE_DECL)
229 if (flags & TFF_DECL_SPECIFIERS)
231 print_identifier (scratch_buffer, "class");
234 output_add_space (scratch_buffer);
235 print_tree_identifier (scratch_buffer, DECL_NAME (p));
238 else if (DECL_NAME (p))
239 print_tree_identifier (scratch_buffer, DECL_NAME (p));
241 print_identifier (scratch_buffer, "{template default argument error}");
244 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
246 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
248 output_add_string (scratch_buffer, " = ");
249 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
250 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
252 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
256 /* Dump, under control of FLAGS, a template-parameter-list binding.
257 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
261 dump_template_bindings (tree parms, tree args)
267 tree p = TREE_VALUE (parms);
268 int lvl = TMPL_PARMS_DEPTH (parms);
272 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
274 tree arg = NULL_TREE;
276 /* Don't crash if we had an invalid argument list. */
277 if (TMPL_ARGS_DEPTH (args) >= lvl)
279 tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
280 if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
281 arg = TREE_VEC_ELT (lvl_args, arg_idx);
285 separate_with_comma (scratch_buffer);
286 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
287 output_add_string (scratch_buffer, " = ");
289 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
291 print_identifier (scratch_buffer, "<missing>");
297 parms = TREE_CHAIN (parms);
301 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
305 dump_type (tree t, int flags)
310 if (TYPE_PTRMEMFUNC_P (t))
313 switch (TREE_CODE (t))
316 print_identifier (scratch_buffer, "<unknown type>");
320 /* A list of function parms. */
321 dump_parameters (t, flags);
324 case IDENTIFIER_NODE:
325 print_tree_identifier (scratch_buffer, t);
329 dump_type (BINFO_TYPE (t), flags);
335 dump_aggr_type (t, flags);
339 if (flags & TFF_CHASE_TYPEDEF)
341 dump_type (DECL_ORIGINAL_TYPE (t)
342 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
345 /* else fallthrough */
349 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
353 output_add_string (scratch_buffer, "__complex__ ");
354 dump_type (TREE_TYPE (t), flags);
358 output_add_string (scratch_buffer, "__vector__ ");
360 /* The subtype of a VECTOR_TYPE is something like intQI_type_node,
361 which has no name and is not very useful for diagnostics. So
362 look up the equivalent C type and print its name. */
363 tree elt = TREE_TYPE (t);
364 elt = c_common_type_for_mode (TYPE_MODE (elt), TREE_UNSIGNED (elt));
365 dump_type (elt, flags);
370 if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && TREE_UNSIGNED (t))
371 output_add_string (scratch_buffer, "unsigned ");
372 else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && !TREE_UNSIGNED (t))
373 output_add_string (scratch_buffer, "signed ");
381 dump_qualifiers (t, after);
382 type = flags & TFF_CHASE_TYPEDEF ? TYPE_MAIN_VARIANT (t) : t;
383 if (TYPE_NAME (type) && TYPE_IDENTIFIER (type))
384 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (type));
386 /* Types like intQI_type_node and friends have no names.
387 These don't come up in user error messages, but it's nice
388 to be able to print them from the debugger. */
389 print_identifier (scratch_buffer, "<anonymous>");
393 case TEMPLATE_TEMPLATE_PARM:
394 /* For parameters inside template signature. */
395 if (TYPE_IDENTIFIER (t))
396 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
399 (scratch_buffer, "<anonymous template template parameter>");
402 case BOUND_TEMPLATE_TEMPLATE_PARM:
404 tree args = TYPE_TI_ARGS (t);
405 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
406 print_template_argument_list_start (scratch_buffer);
407 dump_template_argument_list (args, flags);
408 print_template_argument_list_end (scratch_buffer);
412 case TEMPLATE_TYPE_PARM:
413 dump_qualifiers (t, after);
414 if (TYPE_IDENTIFIER (t))
415 print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
418 (scratch_buffer, "<anonymous template type parameter>");
421 /* This is not always necessary for pointers and such, but doing this
422 reduces code size. */
431 dump_type_prefix (t, flags);
432 dump_type_suffix (t, flags);
436 dump_qualifiers (t, after);
437 output_add_string (scratch_buffer, "typename ");
438 dump_typename (t, flags);
441 case UNBOUND_CLASS_TEMPLATE:
442 dump_type (TYPE_CONTEXT (t), flags);
443 print_scope_operator (scratch_buffer);
444 print_identifier (scratch_buffer, "template ");
445 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
449 output_add_string (scratch_buffer, "__typeof (");
450 dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS);
451 print_right_paren (scratch_buffer);
455 sorry_for_unsupported_tree (t);
456 /* Fall through to error. */
459 print_identifier (scratch_buffer, "<type error>");
464 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
468 dump_typename (tree t, int flags)
470 tree ctx = TYPE_CONTEXT (t);
472 if (TREE_CODE (ctx) == TYPENAME_TYPE)
473 dump_typename (ctx, flags);
475 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
476 print_scope_operator (scratch_buffer);
477 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
480 /* Return the name of the supplied aggregate, or enumeral type. */
483 class_key_or_enum (tree t)
485 if (TREE_CODE (t) == ENUMERAL_TYPE)
487 else if (TREE_CODE (t) == UNION_TYPE)
489 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
495 /* Print out a class declaration T under the control of FLAGS,
496 in the form `class foo'. */
499 dump_aggr_type (tree t, int flags)
502 const char *variety = class_key_or_enum (t);
506 dump_qualifiers (t, after);
508 if (flags & TFF_CLASS_KEY_OR_ENUM)
510 print_identifier (scratch_buffer, variety);
511 output_add_space (scratch_buffer);
514 if (flags & TFF_CHASE_TYPEDEF)
515 t = TYPE_MAIN_VARIANT (t);
517 name = TYPE_NAME (t);
521 typdef = !DECL_ARTIFICIAL (name);
522 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
523 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
524 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
525 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
526 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
527 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
528 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
531 /* Because the template names are mangled, we have to locate
532 the most general template, and use that name. */
533 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
535 while (DECL_TEMPLATE_INFO (tpl))
536 tpl = DECL_TI_TEMPLATE (tpl);
539 name = DECL_NAME (name);
542 if (name == 0 || ANON_AGGRNAME_P (name))
544 if (flags & TFF_CLASS_KEY_OR_ENUM)
545 print_identifier (scratch_buffer, "<anonymous>");
547 output_printf (scratch_buffer, "<anonymous %s>", variety);
550 print_tree_identifier (scratch_buffer, name);
552 dump_template_parms (TYPE_TEMPLATE_INFO (t),
553 !CLASSTYPE_USE_TEMPLATE (t),
554 flags & ~TFF_TEMPLATE_HEADER);
557 /* Dump into the obstack the initial part of the output for a given type.
558 This is necessary when dealing with things like functions returning
561 return type of `int (* fee ())()': pointer -> function -> int. Both
562 pointer (and reference and offset) and function (and member) types must
563 deal with prefix and suffix.
565 Arrays must also do this for DECL nodes, like int a[], and for things like
568 Return indicates how you should pad an object name after this. I.e. you
569 want to pad non-*, non-& cores, but not pad * or & types. */
572 dump_type_prefix (tree t, int flags)
574 enum pad padding = before;
576 if (TYPE_PTRMEMFUNC_P (t))
578 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
582 switch (TREE_CODE (t))
587 tree sub = TREE_TYPE (t);
589 padding = dump_type_prefix (sub, flags);
590 /* A tree for a member pointer looks like pointer to offset,
591 so let the OFFSET_TYPE case handle it. */
592 if (!TYPE_PTRMEM_P (t))
594 if (TREE_CODE (sub) == ARRAY_TYPE)
596 output_add_space (scratch_buffer);
597 print_left_paren (scratch_buffer);
600 (scratch_buffer, "&*"[TREE_CODE (t) == POINTER_TYPE]);
601 padding = dump_qualifiers (t, before);
608 padding = dump_type_prefix (TREE_TYPE (t), flags);
609 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
612 output_add_space (scratch_buffer);
613 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
614 print_scope_operator (scratch_buffer);
616 output_add_character (scratch_buffer, '*');
617 padding = dump_qualifiers (t, none);
620 /* Can only be reached through function pointer -- this would not be
621 correct if FUNCTION_DECLs used it. */
623 padding = dump_type_prefix (TREE_TYPE (t), flags);
625 output_add_space (scratch_buffer);
626 print_left_paren (scratch_buffer);
631 padding = dump_type_prefix (TREE_TYPE (t), flags);
633 output_add_space (scratch_buffer);
634 print_left_paren (scratch_buffer);
636 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
637 print_scope_operator (scratch_buffer);
641 padding = dump_type_prefix (TREE_TYPE (t), flags);
645 case IDENTIFIER_NODE:
650 case TEMPLATE_TYPE_PARM:
651 case TEMPLATE_TEMPLATE_PARM:
652 case BOUND_TEMPLATE_TEMPLATE_PARM:
663 dump_type (t, flags);
668 sorry_for_unsupported_tree (t);
671 print_identifier (scratch_buffer, "<typeprefixerror>");
677 /* Dump the suffix of type T, under control of FLAGS. This is the part
678 which appears after the identifier (or function parms). */
681 dump_type_suffix (tree t, int flags)
683 if (TYPE_PTRMEMFUNC_P (t))
684 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
686 switch (TREE_CODE (t))
691 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
692 print_right_paren (scratch_buffer);
693 dump_type_suffix (TREE_TYPE (t), flags);
696 /* Can only be reached through function pointer */
701 print_right_paren (scratch_buffer);
702 arg = TYPE_ARG_TYPES (t);
703 if (TREE_CODE (t) == METHOD_TYPE)
704 arg = TREE_CHAIN (arg);
706 /* Function pointers don't have default args. Not in standard C++,
707 anyway; they may in g++, but we'll just pretend otherwise. */
708 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
710 if (TREE_CODE (t) == METHOD_TYPE)
712 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before);
713 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
714 dump_type_suffix (TREE_TYPE (t), flags);
719 print_left_bracket (scratch_buffer);
722 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
723 output_host_wide_integer
725 tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
726 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
727 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
728 flags & ~TFF_EXPR_IN_PARENS);
730 dump_expr (fold (cp_build_binary_op
731 (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
733 flags & ~TFF_EXPR_IN_PARENS);
735 print_right_bracket (scratch_buffer);
736 dump_type_suffix (TREE_TYPE (t), flags);
740 case IDENTIFIER_NODE:
745 case TEMPLATE_TYPE_PARM:
746 case TEMPLATE_TEMPLATE_PARM:
747 case BOUND_TEMPLATE_TEMPLATE_PARM:
761 sorry_for_unsupported_tree (t);
763 /* Don't mark it here, we should have already done in
770 dump_global_iord (tree t)
772 const char *p = NULL;
774 if (DECL_GLOBAL_CTOR_P (t))
776 else if (DECL_GLOBAL_DTOR_P (t))
781 output_printf (scratch_buffer, "(static %s for %s)", p, input_filename);
785 dump_simple_decl (tree t, tree type, int flags)
787 if (flags & TFF_DECL_SPECIFIERS)
789 if (dump_type_prefix (type, flags) != none)
790 output_add_space (scratch_buffer);
792 if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
793 dump_scope (CP_DECL_CONTEXT (t), flags);
795 dump_decl (DECL_NAME (t), flags);
797 print_identifier (scratch_buffer, "<anonymous>");
798 if (flags & TFF_DECL_SPECIFIERS)
799 dump_type_suffix (type, flags);
802 /* Dump a human readable string for the decl T under control of FLAGS. */
805 dump_decl (tree t, int flags)
810 switch (TREE_CODE (t))
814 /* Don't say 'typedef class A' */
815 if (DECL_ARTIFICIAL (t))
817 if ((flags & TFF_DECL_SPECIFIERS)
818 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
819 /* Say `class T' not just `T'. */
820 output_add_string (scratch_buffer, "class ");
822 dump_type (TREE_TYPE (t), flags);
826 if (flags & TFF_DECL_SPECIFIERS)
827 output_add_string (scratch_buffer, "typedef ");
828 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
829 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
834 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
836 output_add_string (scratch_buffer, "vtable for ");
837 my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720);
838 dump_type (DECL_CONTEXT (t), flags);
841 /* else fall through */
844 dump_simple_decl (t, TREE_TYPE (t), flags);
848 output_add_string (scratch_buffer, "<return value> ");
849 dump_simple_decl (t, TREE_TYPE (t), flags);
853 dump_scope (CP_DECL_CONTEXT (t), flags);
854 if (DECL_NAME (t) == anonymous_namespace_name)
855 print_identifier (scratch_buffer, "<unnamed>");
857 print_tree_identifier (scratch_buffer, DECL_NAME (t));
861 dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
862 print_scope_operator (scratch_buffer);
863 dump_decl (TREE_OPERAND (t, 1), flags);
867 dump_decl (TREE_OPERAND (t, 0), flags);
868 print_left_bracket (scratch_buffer);
869 dump_decl (TREE_OPERAND (t, 1), flags);
870 print_right_bracket (scratch_buffer);
873 /* So that we can do dump_decl on an aggr type. */
877 dump_type (t, flags);
881 /* This is a pseudo destructor call which has not been folded into
882 a PSEUDO_DTOR_EXPR yet. */
883 output_add_character (scratch_buffer, '~');
884 dump_type (TREE_OPERAND (t, 0), flags);
891 /* These special cases are duplicated here so that other functions
892 can feed identifiers to error and get them demangled properly. */
893 case IDENTIFIER_NODE:
894 if (IDENTIFIER_TYPENAME_P (t))
896 output_add_string (scratch_buffer, "operator ");
897 /* Not exactly IDENTIFIER_TYPE_VALUE. */
898 dump_type (TREE_TYPE (t), flags);
902 print_tree_identifier (scratch_buffer, t);
909 if (DECL_CLASS_SCOPE_P (t))
911 dump_type (DECL_CONTEXT (t), flags);
912 output_add_string (scratch_buffer, "::");
914 else if (DECL_CONTEXT (t))
916 dump_decl (DECL_CONTEXT (t), flags);
917 output_add_string (scratch_buffer, "::");
919 dump_decl (DECL_NAME (t), flags);
923 /* If there's only one function, just treat it like an ordinary
929 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
930 dump_global_iord (t);
931 else if (! DECL_LANG_SPECIFIC (t))
932 print_identifier (scratch_buffer, "<internal>");
934 dump_function_decl (t, flags);
938 dump_template_decl (t, flags);
941 case TEMPLATE_ID_EXPR:
944 tree name = TREE_OPERAND (t, 0);
945 if (is_overloaded_fn (name))
946 name = DECL_NAME (get_first_fn (name));
947 dump_decl (name, flags);
948 print_template_argument_list_start (scratch_buffer);
949 for (args = TREE_OPERAND (t, 1); args; args = TREE_CHAIN (args))
951 dump_template_argument (TREE_VALUE (args), flags);
952 if (TREE_CHAIN (args))
953 separate_with_comma (scratch_buffer);
955 print_template_argument_list_end (scratch_buffer);
960 dump_decl (TREE_OPERAND (t, 0), flags);
964 print_tree_identifier (scratch_buffer, DECL_NAME (t));
968 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
969 || (DECL_INITIAL (t) &&
970 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
971 dump_simple_decl (t, TREE_TYPE (t), flags);
972 else if (DECL_NAME (t))
973 dump_decl (DECL_NAME (t), flags);
974 else if (DECL_INITIAL (t))
975 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
977 print_identifier (scratch_buffer, "<enumerator>");
981 output_add_string (scratch_buffer, "using ");
982 dump_type (DECL_INITIAL (t), flags);
983 print_scope_operator (scratch_buffer);
984 dump_decl (DECL_NAME (t), flags);
988 dump_decl (BASELINK_FUNCTIONS (t), flags);
991 case NON_DEPENDENT_EXPR:
992 dump_expr (t, flags);
996 sorry_for_unsupported_tree (t);
997 /* Fallthrough to error. */
1000 print_identifier (scratch_buffer, "<declaration error>");
1005 /* Dump a template declaration T under control of FLAGS. This means the
1006 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1009 dump_template_decl (tree t, int flags)
1011 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1015 if (flags & TFF_TEMPLATE_HEADER)
1017 for (parms = orig_parms = nreverse (orig_parms);
1019 parms = TREE_CHAIN (parms))
1021 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1022 int len = TREE_VEC_LENGTH (inner_parms);
1024 output_add_string (scratch_buffer, "template<");
1026 /* If we've shown the template prefix, we'd better show the
1027 parameters' and decl's type too. */
1028 flags |= TFF_DECL_SPECIFIERS;
1030 for (i = 0; i < len; i++)
1033 separate_with_comma (scratch_buffer);
1034 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1036 print_template_argument_list_end (scratch_buffer);
1037 output_add_space (scratch_buffer);
1039 nreverse(orig_parms);
1041 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1042 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1043 output_add_string (scratch_buffer, "class ");
1046 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1047 dump_type (TREE_TYPE (t),
1048 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1049 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1050 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1051 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1052 else if (TREE_TYPE (t) == NULL_TREE)
1055 switch (NEXT_CODE (t))
1059 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1062 /* This case can occur with some invalid code. */
1063 dump_type (TREE_TYPE (t),
1064 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1065 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0));
1069 /* Pretty print a function decl. There are several ways we want to print a
1070 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1071 As error can only apply the '#' flag once to give 0 and 1 for V, there
1072 is %D which doesn't print the throw specs, and %F which does. */
1075 dump_function_decl (tree t, int flags)
1079 tree cname = NULL_TREE;
1080 tree template_args = NULL_TREE;
1081 tree template_parms = NULL_TREE;
1082 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1084 if (TREE_CODE (t) == TEMPLATE_DECL)
1085 t = DECL_TEMPLATE_RESULT (t);
1087 /* Pretty print template instantiations only. */
1088 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1092 template_args = DECL_TI_ARGS (t);
1093 tmpl = most_general_template (t);
1094 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1096 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1101 fntype = TREE_TYPE (t);
1102 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1104 if (DECL_CLASS_SCOPE_P (t))
1105 cname = DECL_CONTEXT (t);
1106 /* this is for partially instantiated template methods */
1107 else if (TREE_CODE (fntype) == METHOD_TYPE)
1108 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1110 if (!(flags & TFF_DECL_SPECIFIERS))
1112 else if (DECL_STATIC_FUNCTION_P (t))
1113 print_identifier (scratch_buffer, "static ");
1114 else if (DECL_VIRTUAL_P (t))
1115 print_identifier (scratch_buffer, "virtual ");
1117 /* Print the return type? */
1119 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1120 && !DECL_DESTRUCTOR_P (t);
1123 dump_type_prefix (TREE_TYPE (fntype), flags);
1124 output_add_space (scratch_buffer);
1127 /* Print the function name. */
1130 dump_type (cname, flags);
1131 print_scope_operator (scratch_buffer);
1134 dump_scope (CP_DECL_CONTEXT (t), flags);
1136 dump_function_name (t, flags);
1140 dump_parameters (parmtypes, flags);
1142 if (TREE_CODE (fntype) == METHOD_TYPE)
1143 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
1146 if (flags & TFF_EXCEPTION_SPECIFICATION)
1147 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1150 dump_type_suffix (TREE_TYPE (fntype), flags);
1153 /* If T is a template instantiation, dump the parameter binding. */
1154 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1156 output_add_string (scratch_buffer, " [with ");
1157 dump_template_bindings (template_parms, template_args);
1158 print_right_bracket (scratch_buffer);
1162 /* Print a parameter list. If this is for a member function, the
1163 member object ptr (and any other hidden args) should have
1164 already been removed. */
1167 dump_parameters (tree parmtypes, int flags)
1171 print_left_paren (scratch_buffer);
1173 for (first = 1; parmtypes != void_list_node;
1174 parmtypes = TREE_CHAIN (parmtypes))
1177 separate_with_comma (scratch_buffer);
1181 print_identifier (scratch_buffer, "...");
1184 dump_type (TREE_VALUE (parmtypes), flags);
1186 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1188 output_add_string (scratch_buffer, " = ");
1189 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1193 print_right_paren (scratch_buffer);
1196 /* Print an exception specification. T is the exception specification. */
1199 dump_exception_spec (tree t, int flags)
1203 output_add_string (scratch_buffer, " throw (");
1204 if (TREE_VALUE (t) != NULL_TREE)
1207 dump_type (TREE_VALUE (t), flags);
1211 separate_with_comma (scratch_buffer);
1213 print_right_paren (scratch_buffer);
1217 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1218 and destructors properly. */
1221 dump_function_name (tree t, int flags)
1223 tree name = DECL_NAME (t);
1225 if (TREE_CODE (t) == TEMPLATE_DECL)
1226 t = DECL_TEMPLATE_RESULT (t);
1228 /* Don't let the user see __comp_ctor et al. */
1229 if (DECL_CONSTRUCTOR_P (t)
1230 || DECL_DESTRUCTOR_P (t))
1231 name = constructor_name (DECL_CONTEXT (t));
1233 if (DECL_DESTRUCTOR_P (t))
1235 output_add_character (scratch_buffer, '~');
1236 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1238 else if (DECL_CONV_FN_P (t))
1240 /* This cannot use the hack that the operator's return
1241 type is stashed off of its name because it may be
1242 used for error reporting. In the case of conflicting
1243 declarations, both will have the same name, yet
1244 the types will be different, hence the TREE_TYPE field
1245 of the first name will be clobbered by the second. */
1246 output_add_string (scratch_buffer, "operator ");
1247 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1249 else if (IDENTIFIER_OPNAME_P (name))
1250 print_tree_identifier (scratch_buffer, name);
1252 dump_decl (name, flags);
1254 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
1255 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1256 && (DECL_TEMPLATE_SPECIALIZATION (t)
1257 || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1258 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t))
1259 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1260 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1263 /* Dump the template parameters from the template info INFO under control of
1264 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1265 specialization (partial or complete). For partial specializations we show
1266 the specialized parameter values. For a primary template we show no
1270 dump_template_parms (tree info, int primary, int flags)
1272 tree args = info ? TI_ARGS (info) : NULL_TREE;
1274 if (primary && flags & TFF_TEMPLATE_NAME)
1276 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1277 print_template_argument_list_start (scratch_buffer);
1279 /* Be careful only to print things when we have them, so as not
1280 to crash producing error messages. */
1281 if (args && !primary)
1287 if (TREE_CODE (args) == TREE_VEC)
1289 if (TREE_VEC_LENGTH (args) > 0
1290 && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
1291 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1293 len = TREE_VEC_LENGTH (args);
1295 else if (TREE_CODE (args) == TREE_LIST)
1297 while (ix != len && args)
1302 arg = TREE_VEC_ELT (args, ix);
1307 arg = TREE_VALUE (args);
1308 args = TREE_CHAIN (args);
1311 separate_with_comma (scratch_buffer);
1314 print_identifier (scratch_buffer, "<template parameter error>");
1316 dump_template_argument (arg, flags);
1322 tree tpl = TI_TEMPLATE (info);
1323 tree parms = DECL_TEMPLATE_PARMS (tpl);
1326 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1327 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1329 for (ix = 0; ix != len; ix++)
1331 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1334 separate_with_comma (scratch_buffer);
1336 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1339 print_template_argument_list_end (scratch_buffer);
1347 case TARGET_NEWLINE:
1348 output_add_string (scratch_buffer, "\\n");
1351 output_add_string (scratch_buffer, "\\t");
1354 output_add_string (scratch_buffer, "\\v");
1357 output_add_string (scratch_buffer, "\\b");
1360 output_add_string (scratch_buffer, "\\r");
1363 output_add_string (scratch_buffer, "\\f");
1366 output_add_string (scratch_buffer, "\\a");
1369 output_add_string (scratch_buffer, "\\\\");
1372 output_add_string (scratch_buffer, "\\'");
1375 output_add_string (scratch_buffer, "\\\"");
1379 output_add_character (scratch_buffer, c);
1381 output_formatted_scalar (scratch_buffer, "\\%03o", (unsigned) c);
1386 /* Print out a list of initializers (subr of dump_expr) */
1389 dump_expr_list (tree l, int flags)
1393 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1396 separate_with_comma (scratch_buffer);
1400 /* Print out an expression E under control of FLAGS. */
1403 dump_expr (tree t, int flags)
1408 switch (TREE_CODE (t))
1416 case NAMESPACE_DECL:
1418 case IDENTIFIER_NODE:
1419 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
1424 tree type = TREE_TYPE (t);
1425 my_friendly_assert (type != 0, 81);
1427 /* If it's an enum, output its tag, rather than its value. */
1428 if (TREE_CODE (type) == ENUMERAL_TYPE)
1430 tree values = TYPE_VALUES (type);
1433 values = TREE_CHAIN (values))
1434 if (tree_int_cst_equal (TREE_VALUE (values), t))
1438 print_tree_identifier (scratch_buffer, TREE_PURPOSE (values));
1441 /* Value must have been cast. */
1442 print_left_paren (scratch_buffer);
1443 dump_type (type, flags);
1444 print_right_paren (scratch_buffer);
1448 else if (type == boolean_type_node)
1450 if (t == boolean_false_node || integer_zerop (t))
1451 print_identifier (scratch_buffer, "false");
1452 else if (t == boolean_true_node)
1453 print_identifier (scratch_buffer, "true");
1455 else if (type == char_type_node)
1457 output_add_character (scratch_buffer, '\'');
1458 if (host_integerp (t, TREE_UNSIGNED (type)))
1459 dump_char (tree_low_cst (t, TREE_UNSIGNED (type)));
1461 output_printf (scratch_buffer, "\\x%x",
1462 (unsigned int) TREE_INT_CST_LOW (t));
1463 output_add_character (scratch_buffer, '\'');
1468 if (! host_integerp (t, 0))
1472 if (tree_int_cst_sgn (val) < 0)
1474 output_add_character (scratch_buffer, '-');
1475 val = build_int_2 (-TREE_INT_CST_LOW (val),
1476 ~TREE_INT_CST_HIGH (val)
1477 + !TREE_INT_CST_LOW (val));
1479 sprintf (scratch_buffer->digit_buffer,
1480 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
1481 TREE_INT_CST_HIGH (val), TREE_INT_CST_LOW (val));
1483 (scratch_buffer, scratch_buffer->digit_buffer);
1486 output_host_wide_integer (scratch_buffer, TREE_INT_CST_LOW (t));
1492 real_to_decimal (scratch_buffer->digit_buffer, &TREE_REAL_CST (t),
1493 sizeof (scratch_buffer->digit_buffer), 0, 1);
1494 output_add_string (scratch_buffer, scratch_buffer->digit_buffer);
1498 output_add_character (scratch_buffer, '&');
1499 dump_type (PTRMEM_CST_CLASS (t), flags);
1500 print_scope_operator (scratch_buffer);
1501 print_tree_identifier
1502 (scratch_buffer, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1507 const char *p = TREE_STRING_POINTER (t);
1508 int len = TREE_STRING_LENGTH (t) - 1;
1511 output_add_character (scratch_buffer, '\"');
1512 for (i = 0; i < len; i++)
1514 output_add_character (scratch_buffer, '\"');
1519 print_left_paren (scratch_buffer);
1520 /* Within templates, a COMPOUND_EXPR has only one operand,
1521 containing a TREE_LIST of the two operands. */
1522 if (TREE_CODE (TREE_OPERAND (t, 0)) == TREE_LIST)
1524 if (TREE_OPERAND (t, 1))
1526 dump_expr_list (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1530 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1531 separate_with_comma (scratch_buffer);
1532 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1534 print_right_paren (scratch_buffer);
1538 print_left_paren (scratch_buffer);
1539 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1540 output_add_string (scratch_buffer, " ? ");
1541 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1542 output_add_string (scratch_buffer, " : ");
1543 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1544 print_right_paren (scratch_buffer);
1548 if (TREE_HAS_CONSTRUCTOR (t))
1550 output_add_string (scratch_buffer, "new ");
1551 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1555 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1559 case AGGR_INIT_EXPR:
1561 tree fn = NULL_TREE;
1563 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1564 fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1566 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1568 if (DECL_CONSTRUCTOR_P (fn))
1569 print_tree_identifier
1570 (scratch_buffer, TYPE_IDENTIFIER (TREE_TYPE (t)));
1575 dump_expr (TREE_OPERAND (t, 0), 0);
1577 print_left_paren (scratch_buffer);
1578 if (TREE_OPERAND (t, 1))
1579 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1580 print_right_paren (scratch_buffer);
1585 tree fn = TREE_OPERAND (t, 0);
1586 tree args = TREE_OPERAND (t, 1);
1588 if (TREE_CODE (fn) == ADDR_EXPR)
1589 fn = TREE_OPERAND (fn, 0);
1591 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1593 tree ob = TREE_VALUE (args);
1594 if (TREE_CODE (ob) == ADDR_EXPR)
1596 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1597 output_add_character (scratch_buffer, '.');
1599 else if (TREE_CODE (ob) != PARM_DECL
1600 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1602 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1603 output_add_string (scratch_buffer, "->");
1605 args = TREE_CHAIN (args);
1607 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1608 print_left_paren (scratch_buffer);
1609 dump_expr_list (args, flags);
1610 print_right_paren (scratch_buffer);
1616 tree type = TREE_OPERAND (t, 1);
1617 tree init = TREE_OPERAND (t, 2);
1618 if (NEW_EXPR_USE_GLOBAL (t))
1619 print_scope_operator (scratch_buffer);
1620 output_add_string (scratch_buffer, "new ");
1621 if (TREE_OPERAND (t, 0))
1623 print_left_paren (scratch_buffer);
1624 dump_expr_list (TREE_OPERAND (t, 0), flags);
1625 output_add_string (scratch_buffer, ") ");
1627 if (TREE_CODE (type) == ARRAY_REF)
1628 type = build_cplus_array_type
1629 (TREE_OPERAND (type, 0),
1630 build_index_type (fold (build (MINUS_EXPR, integer_type_node,
1631 TREE_OPERAND (type, 1),
1632 integer_one_node))));
1633 dump_type (type, flags);
1636 print_left_paren (scratch_buffer);
1637 if (TREE_CODE (init) == TREE_LIST)
1638 dump_expr_list (init, flags);
1639 else if (init == void_zero_node)
1640 /* This representation indicates an empty initializer,
1641 e.g.: "new int()". */
1644 dump_expr (init, flags);
1645 print_right_paren (scratch_buffer);
1651 /* Note that this only works for G++ target exprs. If somebody
1652 builds a general TARGET_EXPR, there's no way to represent that
1653 it initializes anything other that the parameter slot for the
1654 default argument. Note we may have cleared out the first
1655 operand in expand_expr, so don't go killing ourselves. */
1656 if (TREE_OPERAND (t, 1))
1657 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1665 case TRUNC_DIV_EXPR:
1666 case TRUNC_MOD_EXPR:
1674 case BIT_ANDTC_EXPR:
1675 case TRUTH_ANDIF_EXPR:
1676 case TRUTH_ORIF_EXPR:
1683 case EXACT_DIV_EXPR:
1684 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1688 case FLOOR_DIV_EXPR:
1689 case ROUND_DIV_EXPR:
1690 dump_binary_op ("/", t, flags);
1694 case FLOOR_MOD_EXPR:
1695 case ROUND_MOD_EXPR:
1696 dump_binary_op ("%", t, flags);
1701 tree ob = TREE_OPERAND (t, 0);
1702 if (TREE_CODE (ob) == INDIRECT_REF)
1704 ob = TREE_OPERAND (ob, 0);
1705 if (TREE_CODE (ob) != PARM_DECL
1706 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1708 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1709 output_add_string (scratch_buffer, "->");
1714 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1715 output_add_character (scratch_buffer, '.');
1717 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1722 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1723 print_left_bracket (scratch_buffer);
1724 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1725 print_right_bracket (scratch_buffer);
1729 if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
1731 print_left_paren (scratch_buffer);
1732 dump_type (TREE_TYPE (t), flags);
1733 print_right_paren (scratch_buffer);
1734 dump_expr (TREE_OPERAND (t, 0), flags);
1737 dump_unary_op ("+", t, flags);
1741 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1742 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1743 /* An ADDR_EXPR can have reference type. In that case, we
1744 shouldn't print the `&' doing so indicates to the user
1745 that the expression has pointer type. */
1747 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1748 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1750 dump_unary_op ("&", t, flags);
1754 if (TREE_HAS_CONSTRUCTOR (t))
1756 t = TREE_OPERAND (t, 0);
1757 my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);
1758 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1759 print_left_paren (scratch_buffer);
1760 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1761 print_right_paren (scratch_buffer);
1765 if (TREE_OPERAND (t,0) != NULL_TREE
1766 && TREE_TYPE (TREE_OPERAND (t, 0))
1767 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1768 dump_expr (TREE_OPERAND (t, 0), flags);
1770 dump_unary_op ("*", t, flags);
1776 case TRUTH_NOT_EXPR:
1777 case PREDECREMENT_EXPR:
1778 case PREINCREMENT_EXPR:
1779 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1782 case POSTDECREMENT_EXPR:
1783 case POSTINCREMENT_EXPR:
1784 print_left_paren (scratch_buffer);
1785 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1787 (scratch_buffer, operator_name_info[(int)TREE_CODE (t)].name);
1788 print_right_paren (scratch_buffer);
1791 case NON_LVALUE_EXPR:
1792 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1793 should be another level of INDIRECT_REF so that I don't have to do
1795 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1797 tree next = TREE_TYPE (TREE_TYPE (t));
1799 while (TREE_CODE (next) == POINTER_TYPE)
1800 next = TREE_TYPE (next);
1802 if (TREE_CODE (next) == FUNCTION_TYPE)
1804 if (flags & TFF_EXPR_IN_PARENS)
1805 print_left_paren (scratch_buffer);
1806 output_add_character (scratch_buffer, '*');
1807 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1808 if (flags & TFF_EXPR_IN_PARENS)
1809 print_right_paren (scratch_buffer);
1814 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1818 dump_expr (TREE_OPERAND (t, 0), flags);
1821 case EXPR_WITH_FILE_LOCATION:
1822 dump_expr (EXPR_WFL_NODE (t), flags);
1826 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1828 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1830 if (integer_zerop (idx))
1832 /* A NULL pointer-to-member constant. */
1833 output_add_string (scratch_buffer, "((");
1834 dump_type (TREE_TYPE (t), flags);
1835 output_add_string (scratch_buffer, ") 0)");
1838 else if (host_integerp (idx, 0))
1841 unsigned HOST_WIDE_INT n;
1843 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1844 t = TYPE_METHOD_BASETYPE (t);
1845 virtuals = TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t));
1847 n = tree_low_cst (idx, 0);
1849 /* Map vtable index back one, to allow for the null pointer to
1853 while (n > 0 && virtuals)
1856 virtuals = TREE_CHAIN (virtuals);
1860 dump_expr (BV_FN (virtuals),
1861 flags | TFF_EXPR_IN_PARENS);
1866 if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
1868 dump_type (TREE_TYPE (t), 0);
1869 output_add_character (scratch_buffer, '(');
1870 output_add_character (scratch_buffer, ')');
1874 output_add_character (scratch_buffer, '{');
1875 dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
1876 output_add_character (scratch_buffer, '}');
1883 tree ob = TREE_OPERAND (t, 0);
1884 if (is_dummy_object (ob))
1886 t = TREE_OPERAND (t, 1);
1887 if (TREE_CODE (t) == FUNCTION_DECL)
1889 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1890 else if (BASELINK_P (t))
1891 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1892 flags | TFF_EXPR_IN_PARENS);
1894 dump_decl (t, flags);
1898 if (TREE_CODE (ob) == INDIRECT_REF)
1900 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1901 output_add_string (scratch_buffer, "->*");
1905 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1906 output_add_string (scratch_buffer, ".*");
1908 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1913 case TEMPLATE_PARM_INDEX:
1914 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1918 dump_type (TREE_OPERAND (t, 0), flags);
1919 print_scope_operator (scratch_buffer);
1920 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1924 if (TREE_OPERAND (t, 0) == NULL_TREE
1925 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1927 dump_type (TREE_TYPE (t), flags);
1928 print_left_paren (scratch_buffer);
1929 dump_expr_list (TREE_OPERAND (t, 0), flags);
1930 print_right_paren (scratch_buffer);
1934 print_left_paren (scratch_buffer);
1935 dump_type (TREE_TYPE (t), flags);
1936 output_add_string (scratch_buffer, ")(");
1937 dump_expr_list (TREE_OPERAND (t, 0), flags);
1938 print_right_paren (scratch_buffer);
1942 case STATIC_CAST_EXPR:
1943 output_add_string (scratch_buffer, "static_cast<");
1945 case REINTERPRET_CAST_EXPR:
1946 output_add_string (scratch_buffer, "reinterpret_cast<");
1948 case CONST_CAST_EXPR:
1949 output_add_string (scratch_buffer, "const_cast<");
1951 case DYNAMIC_CAST_EXPR:
1952 output_add_string (scratch_buffer, "dynamic_cast<");
1954 dump_type (TREE_TYPE (t), flags);
1955 output_add_string (scratch_buffer, ">(");
1956 dump_expr (TREE_OPERAND (t, 0), flags);
1957 print_right_paren (scratch_buffer);
1961 print_tree_identifier (scratch_buffer, TREE_OPERAND (t, 0));
1965 dump_expr (TREE_OPERAND (t, 0), flags);
1966 output_add_string (scratch_buffer, "->");
1971 if (TREE_CODE (t) == SIZEOF_EXPR)
1972 output_add_string (scratch_buffer, "sizeof (");
1975 my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
1976 output_add_string (scratch_buffer, "__alignof__ (");
1978 if (TYPE_P (TREE_OPERAND (t, 0)))
1979 dump_type (TREE_OPERAND (t, 0), flags);
1981 dump_expr (TREE_OPERAND (t, 0), flags);
1982 print_right_paren (scratch_buffer);
1986 print_identifier (scratch_buffer, "<unparsed>");
1989 case TRY_CATCH_EXPR:
1990 case WITH_CLEANUP_EXPR:
1991 case CLEANUP_POINT_EXPR:
1992 dump_expr (TREE_OPERAND (t, 0), flags);
1995 case PSEUDO_DTOR_EXPR:
1996 dump_expr (TREE_OPERAND (t, 2), flags);
1997 output_add_character (scratch_buffer, '.');
1998 dump_type (TREE_OPERAND (t, 0), flags);
1999 output_add_string (scratch_buffer, "::~");
2000 dump_type (TREE_OPERAND (t, 1), flags);
2003 case TEMPLATE_ID_EXPR:
2004 dump_decl (t, flags);
2008 /* We don't yet have a way of dumping statements in a
2009 human-readable format. */
2010 output_add_string (scratch_buffer, "({...})");
2014 output_add_character (scratch_buffer, '{');
2015 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
2016 output_add_character (scratch_buffer, '}');
2020 output_add_string (scratch_buffer, "while (1) { ");
2021 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2022 output_add_character (scratch_buffer, '}');
2026 output_add_string (scratch_buffer, "if (");
2027 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2028 output_add_string (scratch_buffer, ") break; ");
2032 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2035 case NON_DEPENDENT_EXPR:
2036 output_add_string (scratch_buffer, "<expression of type ");
2037 dump_type (TREE_TYPE (t), flags);
2038 output_add_character (scratch_buffer, '>');
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 (const char *opstring, tree t, int flags)
2056 print_left_paren (scratch_buffer);
2057 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2058 output_add_space (scratch_buffer);
2060 print_identifier (scratch_buffer, opstring);
2062 print_identifier (scratch_buffer, "<unknown operator>");
2063 output_add_space (scratch_buffer);
2064 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2065 print_right_paren (scratch_buffer);
2069 dump_unary_op (const char *opstring, tree t, int flags)
2071 if (flags & TFF_EXPR_IN_PARENS)
2072 print_left_paren (scratch_buffer);
2073 print_identifier (scratch_buffer, opstring);
2074 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2075 if (flags & TFF_EXPR_IN_PARENS)
2076 print_right_paren (scratch_buffer);
2079 /* Exported interface to stringifying types, exprs and decls under TFF_*
2083 type_as_string (tree typ, int flags)
2085 reinit_global_formatting_buffer ();
2087 dump_type (typ, flags);
2089 return output_finalize_message (scratch_buffer);
2093 expr_as_string (tree decl, int flags)
2095 reinit_global_formatting_buffer ();
2097 dump_expr (decl, flags);
2099 return output_finalize_message (scratch_buffer);
2103 decl_as_string (tree decl, int flags)
2105 reinit_global_formatting_buffer ();
2107 dump_decl (decl, flags);
2109 return output_finalize_message (scratch_buffer);
2113 context_as_string (tree context, int flags)
2115 reinit_global_formatting_buffer ();
2117 dump_scope (context, flags);
2119 return output_finalize_message (scratch_buffer);
2122 /* Generate the three forms of printable names for cxx_printable_name. */
2125 lang_decl_name (tree decl, int v)
2128 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2130 reinit_global_formatting_buffer ();
2132 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
2134 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2135 print_scope_operator (scratch_buffer);
2138 if (TREE_CODE (decl) == FUNCTION_DECL)
2139 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2141 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2143 return output_finalize_message (scratch_buffer);
2147 location_of (tree t)
2149 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2150 t = DECL_CONTEXT (t);
2151 else if (TYPE_P (t))
2152 t = TYPE_MAIN_DECL (t);
2153 else if (TREE_CODE (t) == OVERLOAD)
2154 t = OVL_FUNCTION (t);
2156 return DECL_SOURCE_LOCATION (t);
2159 /* Now the interfaces from error et al to dump_type et al. Each takes an
2160 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2164 decl_to_string (tree decl, int verbose)
2168 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2169 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2170 flags = TFF_CLASS_KEY_OR_ENUM;
2172 flags |= TFF_DECL_SPECIFIERS | TFF_FUNCTION_DEFAULT_ARGUMENTS;
2173 else if (TREE_CODE (decl) == FUNCTION_DECL)
2174 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2175 flags |= TFF_TEMPLATE_HEADER;
2177 reinit_global_formatting_buffer ();
2179 dump_decl (decl, flags);
2181 return output_finalize_message (scratch_buffer);
2185 expr_to_string (tree decl)
2187 reinit_global_formatting_buffer ();
2189 dump_expr (decl, 0);
2191 return output_finalize_message (scratch_buffer);
2195 fndecl_to_string (tree fndecl, int verbose)
2199 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
2201 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2202 reinit_global_formatting_buffer ();
2204 dump_decl (fndecl, flags);
2206 return output_finalize_message (scratch_buffer);
2211 code_to_string (enum tree_code c)
2213 return tree_code_name [c];
2217 language_to_string (enum languages c)
2224 case lang_cplusplus:
2236 /* Return the proper printed version of a parameter to a C++ function. */
2239 parm_to_string (int p)
2241 reinit_global_formatting_buffer ();
2244 output_add_string (scratch_buffer, "'this'");
2246 output_decimal (scratch_buffer, p + 1);
2248 return output_finalize_message (scratch_buffer);
2252 op_to_string (enum tree_code p)
2256 id = operator_name_info[(int) p].identifier;
2257 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2261 type_to_string (tree typ, int verbose)
2267 flags |= TFF_CLASS_KEY_OR_ENUM;
2268 flags |= TFF_TEMPLATE_HEADER;
2270 reinit_global_formatting_buffer ();
2272 dump_type (typ, flags);
2274 return output_finalize_message (scratch_buffer);
2278 assop_to_string (enum tree_code p)
2282 id = assignment_operator_name_info[(int) p].identifier;
2283 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2287 args_to_string (tree p, int verbose)
2291 flags |= TFF_CLASS_KEY_OR_ENUM;
2296 if (TYPE_P (TREE_VALUE (p)))
2297 return type_as_string (p, flags);
2299 reinit_global_formatting_buffer ();
2300 for (; p; p = TREE_CHAIN (p))
2302 if (TREE_VALUE (p) == null_node)
2303 print_identifier (scratch_buffer, "NULL");
2305 dump_type (error_type (TREE_VALUE (p)), flags);
2307 separate_with_comma (scratch_buffer);
2309 return output_finalize_message (scratch_buffer);
2313 cv_to_string (tree p, int v)
2315 reinit_global_formatting_buffer ();
2317 dump_qualifiers (p, v ? before : none);
2319 return output_finalize_message (scratch_buffer);
2322 /* Langhook for print_error_function. */
2324 cxx_print_error_function (diagnostic_context *context, const char *file)
2326 lhd_print_error_function (context, file);
2327 output_set_prefix (&context->buffer, file);
2328 maybe_print_instantiation_context (context);
2332 cp_diagnostic_starter (diagnostic_context *context,
2333 diagnostic_info *diagnostic)
2335 diagnostic_report_current_module (context);
2336 cp_print_error_function (context, diagnostic);
2337 maybe_print_instantiation_context (context);
2338 output_set_prefix (&context->buffer, diagnostic_build_prefix (diagnostic));
2342 cp_diagnostic_finalizer (diagnostic_context *context,
2343 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2345 output_destroy_prefix (&context->buffer);
2348 /* Print current function onto BUFFER, in the process of reporting
2349 a diagnostic message. Called from cp_diagnostic_starter. */
2351 cp_print_error_function (diagnostic_context *context,
2352 diagnostic_info *diagnostic)
2354 if (diagnostic_last_function_changed (context))
2356 const char *old_prefix = output_prefix (&context->buffer);
2357 char *new_prefix = diagnostic->location.file
2358 ? file_name_as_prefix (diagnostic->location.file)
2361 output_set_prefix (&context->buffer, new_prefix);
2363 if (current_function_decl == NULL)
2364 output_add_string (&context->buffer, "At global scope:");
2366 output_printf (&context->buffer, "In %s `%s':",
2367 function_category (current_function_decl),
2368 cxx_printable_name (current_function_decl, 2));
2369 output_add_newline (&context->buffer);
2371 diagnostic_set_last_function (context);
2372 output_destroy_prefix (&context->buffer);
2373 context->buffer.state.prefix = old_prefix;
2377 /* Returns a description of FUNCTION using standard terminology. */
2379 function_category (tree fn)
2381 if (DECL_FUNCTION_MEMBER_P (fn))
2383 if (DECL_STATIC_FUNCTION_P (fn))
2384 return "static member function";
2385 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2386 return "copy constructor";
2387 else if (DECL_CONSTRUCTOR_P (fn))
2388 return "constructor";
2389 else if (DECL_DESTRUCTOR_P (fn))
2390 return "destructor";
2392 return "member function";
2398 /* Report the full context of a current template instantiation,
2401 print_instantiation_full_context (diagnostic_context *context)
2403 tree p = current_instantiation ();
2404 location_t location = input_location;
2408 if (current_function_decl != TINST_DECL (p)
2409 && current_function_decl != NULL_TREE)
2410 /* We can get here during the processing of some synthesized
2411 method. Then, TINST_DECL (p) will be the function that's causing
2416 if (current_function_decl == TINST_DECL (p))
2417 /* Avoid redundancy with the the "In function" line. */;
2419 output_verbatim (&context->buffer,
2420 "%s: In instantiation of `%s':\n", location.file,
2421 decl_as_string (TINST_DECL (p),
2422 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2424 location.line = TINST_LINE (p);
2425 location.file = TINST_FILE (p);
2430 print_instantiation_partial_context (context, p, location);
2433 /* Same as above but less verbose. */
2435 print_instantiation_partial_context (diagnostic_context *context,
2436 tree t, location_t loc)
2438 for (; t; t = TREE_CHAIN (t))
2441 (&context->buffer, "%s:%d: instantiated from `%s'\n",
2443 decl_as_string (TINST_DECL (t),
2444 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2445 loc.line = TINST_LINE (t);
2446 loc.file = TINST_FILE (t);
2448 output_verbatim (&context->buffer, "%s:%d: instantiated from here\n",
2449 loc.file, loc.line);
2452 /* Called from cp_thing to print the template context for an error. */
2454 maybe_print_instantiation_context (diagnostic_context *context)
2456 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2459 record_last_problematic_instantiation ();
2460 print_instantiation_full_context (context);
2463 /* Report the bare minimum context of a template instantiation. */
2465 print_instantiation_context (void)
2467 print_instantiation_partial_context
2468 (global_dc, current_instantiation (), input_location);
2469 diagnostic_flush_buffer (global_dc);
2472 /* Called from output_format -- during diagnostic message processing --
2473 to handle C++ specific format specifier with the following meanings:
2474 %A function argument-list.
2478 %F function declaration.
2479 %L language as used in extern "lang".
2481 %P function parameter whose position is indicated by an integer.
2482 %Q assignment operator.
2486 cp_printer (output_buffer *buffer, text_info *text)
2490 #define next_tree va_arg (*text->args_ptr, tree)
2491 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2492 #define next_lang va_arg (*text->args_ptr, enum languages)
2493 #define next_int va_arg (*text->args_ptr, int)
2495 if (*text->format_spec == '+')
2496 ++text->format_spec;
2497 if (*text->format_spec == '#')
2500 ++text->format_spec;
2503 switch (*text->format_spec)
2505 case 'A': result = args_to_string (next_tree, verbose); break;
2506 case 'C': result = code_to_string (next_tcode); break;
2507 case 'D': result = decl_to_string (next_tree, verbose); break;
2508 case 'E': result = expr_to_string (next_tree); break;
2509 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2510 case 'L': result = language_to_string (next_lang); break;
2511 case 'O': result = op_to_string (next_tcode); break;
2512 case 'P': result = parm_to_string (next_int); break;
2513 case 'Q': result = assop_to_string (next_tcode); break;
2514 case 'T': result = type_to_string (next_tree, verbose); break;
2515 case 'V': result = cv_to_string (next_tree, verbose); break;
2521 output_add_string (buffer, result);
2530 print_non_consecutive_character (output_buffer *buffer, int c)
2532 const char *p = output_last_position (buffer);
2534 if (p != NULL && *p == c)
2535 output_add_space (buffer);
2536 output_add_character (buffer, c);
2539 /* These are temporary wrapper functions which handle the historic
2540 behavior of cp_*_at. */
2543 locate_error (const char *msgid, va_list ap)
2549 for (f = msgid; *f; f++)
2562 /* Just ignore these possibilities. */
2565 case 'd': (void) va_arg (ap, int); break;
2566 case 's': (void) va_arg (ap, char *); break;
2567 case 'L': (void) va_arg (ap, enum languages); break;
2570 case 'Q': (void) va_arg (ap, enum tree_code); break;
2572 /* These take a tree, which may be where the error is
2580 t = va_arg (ap, tree);
2586 errorcount = 0; /* damn ICE suppression */
2587 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2593 here = va_arg (ap, tree);
2600 cp_error_at (const char *msgid, ...)
2603 diagnostic_info diagnostic;
2606 va_start (ap, msgid);
2607 here = locate_error (msgid, ap);
2610 va_start (ap, msgid);
2611 diagnostic_set_info (&diagnostic, msgid, &ap,
2612 location_of (here), DK_ERROR);
2613 report_diagnostic (&diagnostic);
2618 cp_warning_at (const char *msgid, ...)
2621 diagnostic_info diagnostic;
2624 va_start (ap, msgid);
2625 here = locate_error (msgid, ap);
2628 va_start (ap, msgid);
2629 diagnostic_set_info (&diagnostic, msgid, &ap,
2630 location_of (here), DK_WARNING);
2631 report_diagnostic (&diagnostic);
2636 cp_pedwarn_at (const char *msgid, ...)
2639 diagnostic_info diagnostic;
2642 va_start (ap, msgid);
2643 here = locate_error (msgid, ap);
2646 va_start (ap, msgid);
2647 diagnostic_set_info (&diagnostic, msgid, &ap,
2648 location_of (here), pedantic_error_kind());
2649 report_diagnostic (&diagnostic);