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);
884 /* These special cases are duplicated here so that other functions
885 can feed identifiers to error and get them demangled properly. */
886 case IDENTIFIER_NODE:
887 if (IDENTIFIER_TYPENAME_P (t))
889 output_add_string (scratch_buffer, "operator ");
890 /* Not exactly IDENTIFIER_TYPE_VALUE. */
891 dump_type (TREE_TYPE (t), flags);
895 print_tree_identifier (scratch_buffer, t);
902 if (DECL_CLASS_SCOPE_P (t))
904 dump_type (DECL_CONTEXT (t), flags);
905 output_add_string (scratch_buffer, "::");
907 else if (DECL_CONTEXT (t))
909 dump_decl (DECL_CONTEXT (t), flags);
910 output_add_string (scratch_buffer, "::");
912 dump_decl (DECL_NAME (t), flags);
916 /* If there's only one function, just treat it like an ordinary
922 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
923 dump_global_iord (t);
924 else if (! DECL_LANG_SPECIFIC (t))
925 print_identifier (scratch_buffer, "<internal>");
927 dump_function_decl (t, flags);
931 dump_template_decl (t, flags);
934 case TEMPLATE_ID_EXPR:
937 tree name = TREE_OPERAND (t, 0);
938 if (is_overloaded_fn (name))
939 name = DECL_NAME (get_first_fn (name));
940 dump_decl (name, flags);
941 print_template_argument_list_start (scratch_buffer);
942 for (args = TREE_OPERAND (t, 1); args; args = TREE_CHAIN (args))
944 dump_template_argument (TREE_VALUE (args), flags);
945 if (TREE_CHAIN (args))
946 separate_with_comma (scratch_buffer);
948 print_template_argument_list_end (scratch_buffer);
953 dump_decl (TREE_OPERAND (t, 0), flags);
957 print_tree_identifier (scratch_buffer, DECL_NAME (t));
961 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
962 || (DECL_INITIAL (t) &&
963 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
964 dump_simple_decl (t, TREE_TYPE (t), flags);
965 else if (DECL_NAME (t))
966 dump_decl (DECL_NAME (t), flags);
967 else if (DECL_INITIAL (t))
968 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
970 print_identifier (scratch_buffer, "<enumerator>");
974 output_add_string (scratch_buffer, "using ");
975 dump_type (DECL_INITIAL (t), flags);
976 print_scope_operator (scratch_buffer);
977 print_tree_identifier (scratch_buffer, DECL_NAME (t));
981 dump_decl (BASELINK_FUNCTIONS (t), flags);
985 sorry_for_unsupported_tree (t);
986 /* Fallthrough to error. */
989 print_identifier (scratch_buffer, "<declaration error>");
994 /* Dump a template declaration T under control of FLAGS. This means the
995 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
998 dump_template_decl (tree t, int flags)
1000 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1004 if (flags & TFF_TEMPLATE_HEADER)
1006 for (parms = orig_parms = nreverse (orig_parms);
1008 parms = TREE_CHAIN (parms))
1010 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1011 int len = TREE_VEC_LENGTH (inner_parms);
1013 output_add_string (scratch_buffer, "template<");
1015 /* If we've shown the template prefix, we'd better show the
1016 parameters' and decl's type too. */
1017 flags |= TFF_DECL_SPECIFIERS;
1019 for (i = 0; i < len; i++)
1022 separate_with_comma (scratch_buffer);
1023 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1025 print_template_argument_list_end (scratch_buffer);
1026 output_add_space (scratch_buffer);
1028 nreverse(orig_parms);
1030 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1031 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1032 output_add_string (scratch_buffer, "class ");
1035 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1036 dump_type (TREE_TYPE (t),
1037 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1038 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1039 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1040 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1041 else if (TREE_TYPE (t) == NULL_TREE)
1044 switch (NEXT_CODE (t))
1048 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1051 /* This case can occur with some invalid code. */
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));
1058 /* Pretty print a function decl. There are several ways we want to print a
1059 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1060 As error can only apply the '#' flag once to give 0 and 1 for V, there
1061 is %D which doesn't print the throw specs, and %F which does. */
1064 dump_function_decl (tree t, int flags)
1068 tree cname = NULL_TREE;
1069 tree template_args = NULL_TREE;
1070 tree template_parms = NULL_TREE;
1071 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1073 if (TREE_CODE (t) == TEMPLATE_DECL)
1074 t = DECL_TEMPLATE_RESULT (t);
1076 /* Pretty print template instantiations only. */
1077 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1081 template_args = DECL_TI_ARGS (t);
1082 tmpl = most_general_template (t);
1083 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1085 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1090 fntype = TREE_TYPE (t);
1091 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1093 if (DECL_CLASS_SCOPE_P (t))
1094 cname = DECL_CONTEXT (t);
1095 /* this is for partially instantiated template methods */
1096 else if (TREE_CODE (fntype) == METHOD_TYPE)
1097 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1099 if (!(flags & TFF_DECL_SPECIFIERS))
1101 else if (DECL_STATIC_FUNCTION_P (t))
1102 print_identifier (scratch_buffer, "static ");
1103 else if (DECL_VIRTUAL_P (t))
1104 print_identifier (scratch_buffer, "virtual ");
1106 /* Print the return type? */
1108 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1109 && !DECL_DESTRUCTOR_P (t);
1112 dump_type_prefix (TREE_TYPE (fntype), flags);
1113 output_add_space (scratch_buffer);
1116 /* Print the function name. */
1119 dump_type (cname, flags);
1120 print_scope_operator (scratch_buffer);
1123 dump_scope (CP_DECL_CONTEXT (t), flags);
1125 dump_function_name (t, flags);
1129 dump_parameters (parmtypes, flags);
1131 if (TREE_CODE (fntype) == METHOD_TYPE)
1132 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
1135 if (flags & TFF_EXCEPTION_SPECIFICATION)
1136 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1139 dump_type_suffix (TREE_TYPE (fntype), flags);
1142 /* If T is a template instantiation, dump the parameter binding. */
1143 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1145 output_add_string (scratch_buffer, " [with ");
1146 dump_template_bindings (template_parms, template_args);
1147 print_right_bracket (scratch_buffer);
1151 /* Print a parameter list. If this is for a member function, the
1152 member object ptr (and any other hidden args) should have
1153 already been removed. */
1156 dump_parameters (tree parmtypes, int flags)
1160 print_left_paren (scratch_buffer);
1162 for (first = 1; parmtypes != void_list_node;
1163 parmtypes = TREE_CHAIN (parmtypes))
1166 separate_with_comma (scratch_buffer);
1170 print_identifier (scratch_buffer, "...");
1173 dump_type (TREE_VALUE (parmtypes), flags);
1175 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1177 output_add_string (scratch_buffer, " = ");
1178 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1182 print_right_paren (scratch_buffer);
1185 /* Print an exception specification. T is the exception specification. */
1188 dump_exception_spec (tree t, int flags)
1192 output_add_string (scratch_buffer, " throw (");
1193 if (TREE_VALUE (t) != NULL_TREE)
1196 dump_type (TREE_VALUE (t), flags);
1200 separate_with_comma (scratch_buffer);
1202 print_right_paren (scratch_buffer);
1206 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1207 and destructors properly. */
1210 dump_function_name (tree t, int flags)
1212 tree name = DECL_NAME (t);
1214 if (TREE_CODE (t) == TEMPLATE_DECL)
1215 t = DECL_TEMPLATE_RESULT (t);
1217 /* Don't let the user see __comp_ctor et al. */
1218 if (DECL_CONSTRUCTOR_P (t)
1219 || DECL_DESTRUCTOR_P (t))
1220 name = constructor_name (DECL_CONTEXT (t));
1222 if (DECL_DESTRUCTOR_P (t))
1224 output_add_character (scratch_buffer, '~');
1225 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1227 else if (DECL_CONV_FN_P (t))
1229 /* This cannot use the hack that the operator's return
1230 type is stashed off of its name because it may be
1231 used for error reporting. In the case of conflicting
1232 declarations, both will have the same name, yet
1233 the types will be different, hence the TREE_TYPE field
1234 of the first name will be clobbered by the second. */
1235 output_add_string (scratch_buffer, "operator ");
1236 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1238 else if (IDENTIFIER_OPNAME_P (name))
1239 print_tree_identifier (scratch_buffer, name);
1241 dump_decl (name, flags);
1243 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
1244 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1245 && (DECL_TEMPLATE_SPECIALIZATION (t)
1246 || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1247 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t))
1248 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1249 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1252 /* Dump the template parameters from the template info INFO under control of
1253 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1254 specialization (partial or complete). For partial specializations we show
1255 the specialized parameter values. For a primary template we show no
1259 dump_template_parms (tree info, int primary, int flags)
1261 tree args = info ? TI_ARGS (info) : NULL_TREE;
1263 if (primary && flags & TFF_TEMPLATE_NAME)
1265 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1266 print_template_argument_list_start (scratch_buffer);
1268 /* Be careful only to print things when we have them, so as not
1269 to crash producing error messages. */
1270 if (args && !primary)
1276 if (TREE_CODE (args) == TREE_VEC)
1278 if (TREE_VEC_LENGTH (args) > 0
1279 && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
1280 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1282 len = TREE_VEC_LENGTH (args);
1284 else if (TREE_CODE (args) == TREE_LIST)
1286 while (ix != len && args)
1291 arg = TREE_VEC_ELT (args, ix);
1296 arg = TREE_VALUE (args);
1297 args = TREE_CHAIN (args);
1300 separate_with_comma (scratch_buffer);
1303 print_identifier (scratch_buffer, "<template parameter error>");
1305 dump_template_argument (arg, flags);
1311 tree tpl = TI_TEMPLATE (info);
1312 tree parms = DECL_TEMPLATE_PARMS (tpl);
1315 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1316 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1318 for (ix = 0; ix != len; ix++)
1320 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1323 separate_with_comma (scratch_buffer);
1325 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1328 print_template_argument_list_end (scratch_buffer);
1336 case TARGET_NEWLINE:
1337 output_add_string (scratch_buffer, "\\n");
1340 output_add_string (scratch_buffer, "\\t");
1343 output_add_string (scratch_buffer, "\\v");
1346 output_add_string (scratch_buffer, "\\b");
1349 output_add_string (scratch_buffer, "\\r");
1352 output_add_string (scratch_buffer, "\\f");
1355 output_add_string (scratch_buffer, "\\a");
1358 output_add_string (scratch_buffer, "\\\\");
1361 output_add_string (scratch_buffer, "\\'");
1364 output_add_string (scratch_buffer, "\\\"");
1368 output_add_character (scratch_buffer, c);
1370 output_formatted_scalar (scratch_buffer, "\\%03o", (unsigned) c);
1375 /* Print out a list of initializers (subr of dump_expr) */
1378 dump_expr_list (tree l, int flags)
1382 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1385 separate_with_comma (scratch_buffer);
1389 /* Print out an expression E under control of FLAGS. */
1392 dump_expr (tree t, int flags)
1397 switch (TREE_CODE (t))
1405 case NAMESPACE_DECL:
1407 case IDENTIFIER_NODE:
1408 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
1413 tree type = TREE_TYPE (t);
1414 my_friendly_assert (type != 0, 81);
1416 /* If it's an enum, output its tag, rather than its value. */
1417 if (TREE_CODE (type) == ENUMERAL_TYPE)
1419 tree values = TYPE_VALUES (type);
1422 values = TREE_CHAIN (values))
1423 if (tree_int_cst_equal (TREE_VALUE (values), t))
1427 print_tree_identifier (scratch_buffer, TREE_PURPOSE (values));
1430 /* Value must have been cast. */
1431 print_left_paren (scratch_buffer);
1432 dump_type (type, flags);
1433 print_right_paren (scratch_buffer);
1437 else if (type == boolean_type_node)
1439 if (t == boolean_false_node || integer_zerop (t))
1440 print_identifier (scratch_buffer, "false");
1441 else if (t == boolean_true_node)
1442 print_identifier (scratch_buffer, "true");
1444 else if (type == char_type_node)
1446 output_add_character (scratch_buffer, '\'');
1447 if (host_integerp (t, TREE_UNSIGNED (type)))
1448 dump_char (tree_low_cst (t, TREE_UNSIGNED (type)));
1450 output_printf (scratch_buffer, "\\x%x",
1451 (unsigned int) TREE_INT_CST_LOW (t));
1452 output_add_character (scratch_buffer, '\'');
1457 if (! host_integerp (t, 0))
1461 if (tree_int_cst_sgn (val) < 0)
1463 output_add_character (scratch_buffer, '-');
1464 val = build_int_2 (-TREE_INT_CST_LOW (val),
1465 ~TREE_INT_CST_HIGH (val)
1466 + !TREE_INT_CST_LOW (val));
1468 sprintf (scratch_buffer->digit_buffer,
1469 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
1470 TREE_INT_CST_HIGH (val), TREE_INT_CST_LOW (val));
1472 (scratch_buffer, scratch_buffer->digit_buffer);
1475 output_host_wide_integer (scratch_buffer, TREE_INT_CST_LOW (t));
1481 real_to_decimal (scratch_buffer->digit_buffer, &TREE_REAL_CST (t),
1482 sizeof (scratch_buffer->digit_buffer), 0, 1);
1483 output_add_string (scratch_buffer, scratch_buffer->digit_buffer);
1487 output_add_character (scratch_buffer, '&');
1488 dump_type (PTRMEM_CST_CLASS (t), flags);
1489 print_scope_operator (scratch_buffer);
1490 print_tree_identifier
1491 (scratch_buffer, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1496 const char *p = TREE_STRING_POINTER (t);
1497 int len = TREE_STRING_LENGTH (t) - 1;
1500 output_add_character (scratch_buffer, '\"');
1501 for (i = 0; i < len; i++)
1503 output_add_character (scratch_buffer, '\"');
1508 print_left_paren (scratch_buffer);
1509 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1510 separate_with_comma (scratch_buffer);
1511 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1512 print_right_paren (scratch_buffer);
1516 print_left_paren (scratch_buffer);
1517 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1518 output_add_string (scratch_buffer, " ? ");
1519 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1520 output_add_string (scratch_buffer, " : ");
1521 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1522 print_right_paren (scratch_buffer);
1526 if (TREE_HAS_CONSTRUCTOR (t))
1528 output_add_string (scratch_buffer, "new ");
1529 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1533 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1537 case AGGR_INIT_EXPR:
1539 tree fn = NULL_TREE;
1541 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1542 fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1544 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1546 if (DECL_CONSTRUCTOR_P (fn))
1547 print_tree_identifier
1548 (scratch_buffer, TYPE_IDENTIFIER (TREE_TYPE (t)));
1553 dump_expr (TREE_OPERAND (t, 0), 0);
1555 print_left_paren (scratch_buffer);
1556 if (TREE_OPERAND (t, 1))
1557 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1558 print_right_paren (scratch_buffer);
1563 tree fn = TREE_OPERAND (t, 0);
1564 tree args = TREE_OPERAND (t, 1);
1566 if (TREE_CODE (fn) == ADDR_EXPR)
1567 fn = TREE_OPERAND (fn, 0);
1569 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1571 tree ob = TREE_VALUE (args);
1572 if (TREE_CODE (ob) == ADDR_EXPR)
1574 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1575 output_add_character (scratch_buffer, '.');
1577 else if (TREE_CODE (ob) != PARM_DECL
1578 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1580 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1581 output_add_string (scratch_buffer, "->");
1583 args = TREE_CHAIN (args);
1585 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1586 print_left_paren (scratch_buffer);
1587 dump_expr_list (args, flags);
1588 print_right_paren (scratch_buffer);
1594 tree type = TREE_OPERAND (t, 1);
1595 tree init = TREE_OPERAND (t, 2);
1596 if (NEW_EXPR_USE_GLOBAL (t))
1597 print_scope_operator (scratch_buffer);
1598 output_add_string (scratch_buffer, "new ");
1599 if (TREE_OPERAND (t, 0))
1601 print_left_paren (scratch_buffer);
1602 dump_expr_list (TREE_OPERAND (t, 0), flags);
1603 output_add_string (scratch_buffer, ") ");
1605 if (TREE_CODE (type) == ARRAY_REF)
1606 type = build_cplus_array_type
1607 (TREE_OPERAND (type, 0),
1608 build_index_type (fold (build (MINUS_EXPR, integer_type_node,
1609 TREE_OPERAND (type, 1),
1610 integer_one_node))));
1611 dump_type (type, flags);
1614 print_left_paren (scratch_buffer);
1615 if (TREE_CODE (init) == TREE_LIST)
1616 dump_expr_list (init, flags);
1617 else if (init == void_zero_node)
1618 /* This representation indicates an empty initializer,
1619 e.g.: "new int()". */
1622 dump_expr (init, flags);
1623 print_right_paren (scratch_buffer);
1629 /* Note that this only works for G++ target exprs. If somebody
1630 builds a general TARGET_EXPR, there's no way to represent that
1631 it initializes anything other that the parameter slot for the
1632 default argument. Note we may have cleared out the first
1633 operand in expand_expr, so don't go killing ourselves. */
1634 if (TREE_OPERAND (t, 1))
1635 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1643 case TRUNC_DIV_EXPR:
1644 case TRUNC_MOD_EXPR:
1652 case BIT_ANDTC_EXPR:
1653 case TRUTH_ANDIF_EXPR:
1654 case TRUTH_ORIF_EXPR:
1661 case EXACT_DIV_EXPR:
1662 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1666 case FLOOR_DIV_EXPR:
1667 case ROUND_DIV_EXPR:
1668 dump_binary_op ("/", t, flags);
1672 case FLOOR_MOD_EXPR:
1673 case ROUND_MOD_EXPR:
1674 dump_binary_op ("%", t, flags);
1679 tree ob = TREE_OPERAND (t, 0);
1680 if (TREE_CODE (ob) == INDIRECT_REF)
1682 ob = TREE_OPERAND (ob, 0);
1683 if (TREE_CODE (ob) != PARM_DECL
1684 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1686 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1687 output_add_string (scratch_buffer, "->");
1692 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1693 output_add_character (scratch_buffer, '.');
1695 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1700 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1701 print_left_bracket (scratch_buffer);
1702 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1703 print_right_bracket (scratch_buffer);
1707 if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
1709 print_left_paren (scratch_buffer);
1710 dump_type (TREE_TYPE (t), flags);
1711 print_right_paren (scratch_buffer);
1712 dump_expr (TREE_OPERAND (t, 0), flags);
1715 dump_unary_op ("+", t, flags);
1719 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1720 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1721 /* An ADDR_EXPR can have reference type. In that case, we
1722 shouldn't print the `&' doing so indicates to the user
1723 that the expression has pointer type. */
1725 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1726 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1728 dump_unary_op ("&", t, flags);
1732 if (TREE_HAS_CONSTRUCTOR (t))
1734 t = TREE_OPERAND (t, 0);
1735 my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);
1736 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1737 print_left_paren (scratch_buffer);
1738 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1739 print_right_paren (scratch_buffer);
1743 if (TREE_OPERAND (t,0) != NULL_TREE
1744 && TREE_TYPE (TREE_OPERAND (t, 0))
1745 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1746 dump_expr (TREE_OPERAND (t, 0), flags);
1748 dump_unary_op ("*", t, flags);
1754 case TRUTH_NOT_EXPR:
1755 case PREDECREMENT_EXPR:
1756 case PREINCREMENT_EXPR:
1757 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1760 case POSTDECREMENT_EXPR:
1761 case POSTINCREMENT_EXPR:
1762 print_left_paren (scratch_buffer);
1763 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1765 (scratch_buffer, operator_name_info[(int)TREE_CODE (t)].name);
1766 print_right_paren (scratch_buffer);
1769 case NON_LVALUE_EXPR:
1770 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1771 should be another level of INDIRECT_REF so that I don't have to do
1773 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1775 tree next = TREE_TYPE (TREE_TYPE (t));
1777 while (TREE_CODE (next) == POINTER_TYPE)
1778 next = TREE_TYPE (next);
1780 if (TREE_CODE (next) == FUNCTION_TYPE)
1782 if (flags & TFF_EXPR_IN_PARENS)
1783 print_left_paren (scratch_buffer);
1784 output_add_character (scratch_buffer, '*');
1785 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1786 if (flags & TFF_EXPR_IN_PARENS)
1787 print_right_paren (scratch_buffer);
1792 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1796 dump_expr (TREE_OPERAND (t, 0), flags);
1799 case EXPR_WITH_FILE_LOCATION:
1800 dump_expr (EXPR_WFL_NODE (t), flags);
1804 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1806 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1808 if (integer_zerop (idx))
1810 /* A NULL pointer-to-member constant. */
1811 output_add_string (scratch_buffer, "((");
1812 dump_type (TREE_TYPE (t), flags);
1813 output_add_string (scratch_buffer, ") 0)");
1816 else if (host_integerp (idx, 0))
1819 unsigned HOST_WIDE_INT n;
1821 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1822 t = TYPE_METHOD_BASETYPE (t);
1823 virtuals = TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t));
1825 n = tree_low_cst (idx, 0);
1827 /* Map vtable index back one, to allow for the null pointer to
1831 while (n > 0 && virtuals)
1834 virtuals = TREE_CHAIN (virtuals);
1838 dump_expr (BV_FN (virtuals),
1839 flags | TFF_EXPR_IN_PARENS);
1844 if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
1846 dump_type (TREE_TYPE (t), 0);
1847 output_add_character (scratch_buffer, '(');
1848 output_add_character (scratch_buffer, ')');
1852 output_add_character (scratch_buffer, '{');
1853 dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
1854 output_add_character (scratch_buffer, '}');
1861 tree ob = TREE_OPERAND (t, 0);
1862 if (is_dummy_object (ob))
1864 t = TREE_OPERAND (t, 1);
1865 if (TREE_CODE (t) == FUNCTION_DECL)
1867 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1868 else if (BASELINK_P (t))
1869 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1870 flags | TFF_EXPR_IN_PARENS);
1872 dump_decl (t, flags);
1876 if (TREE_CODE (ob) == INDIRECT_REF)
1878 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1879 output_add_string (scratch_buffer, "->*");
1883 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1884 output_add_string (scratch_buffer, ".*");
1886 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1891 case TEMPLATE_PARM_INDEX:
1892 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1896 dump_type (TREE_OPERAND (t, 0), flags);
1897 print_scope_operator (scratch_buffer);
1898 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1902 if (TREE_OPERAND (t, 0) == NULL_TREE
1903 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1905 dump_type (TREE_TYPE (t), flags);
1906 print_left_paren (scratch_buffer);
1907 dump_expr_list (TREE_OPERAND (t, 0), flags);
1908 print_right_paren (scratch_buffer);
1912 print_left_paren (scratch_buffer);
1913 dump_type (TREE_TYPE (t), flags);
1914 output_add_string (scratch_buffer, ")(");
1915 dump_expr_list (TREE_OPERAND (t, 0), flags);
1916 print_right_paren (scratch_buffer);
1920 case STATIC_CAST_EXPR:
1921 output_add_string (scratch_buffer, "static_cast<");
1923 case REINTERPRET_CAST_EXPR:
1924 output_add_string (scratch_buffer, "reinterpret_cast<");
1926 case CONST_CAST_EXPR:
1927 output_add_string (scratch_buffer, "const_cast<");
1929 case DYNAMIC_CAST_EXPR:
1930 output_add_string (scratch_buffer, "dynamic_cast<");
1932 dump_type (TREE_TYPE (t), flags);
1933 output_add_string (scratch_buffer, ">(");
1934 dump_expr (TREE_OPERAND (t, 0), flags);
1935 print_right_paren (scratch_buffer);
1939 print_tree_identifier (scratch_buffer, TREE_OPERAND (t, 0));
1943 dump_expr (TREE_OPERAND (t, 0), flags);
1944 output_add_string (scratch_buffer, "->");
1949 if (TREE_CODE (t) == SIZEOF_EXPR)
1950 output_add_string (scratch_buffer, "sizeof (");
1953 my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
1954 output_add_string (scratch_buffer, "__alignof__ (");
1956 if (TYPE_P (TREE_OPERAND (t, 0)))
1957 dump_type (TREE_OPERAND (t, 0), flags);
1959 dump_unary_op ("*", t, flags | TFF_EXPR_IN_PARENS);
1960 print_right_paren (scratch_buffer);
1964 print_identifier (scratch_buffer, "<unparsed>");
1967 case TRY_CATCH_EXPR:
1968 case WITH_CLEANUP_EXPR:
1969 case CLEANUP_POINT_EXPR:
1970 dump_expr (TREE_OPERAND (t, 0), flags);
1973 case PSEUDO_DTOR_EXPR:
1974 dump_expr (TREE_OPERAND (t, 2), flags);
1975 output_add_character (scratch_buffer, '.');
1976 dump_type (TREE_OPERAND (t, 0), flags);
1977 output_add_string (scratch_buffer, "::~");
1978 dump_type (TREE_OPERAND (t, 1), flags);
1981 case TEMPLATE_ID_EXPR:
1982 dump_decl (t, flags);
1986 /* We don't yet have a way of dumping statements in a
1987 human-readable format. */
1988 output_add_string (scratch_buffer, "({...})");
1992 output_add_character (scratch_buffer, '{');
1993 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1994 output_add_character (scratch_buffer, '}');
1998 output_add_string (scratch_buffer, "while (1) { ");
1999 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2000 output_add_character (scratch_buffer, '}');
2004 output_add_string (scratch_buffer, "if (");
2005 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2006 output_add_string (scratch_buffer, ") break; ");
2010 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2013 /* else fall through */
2015 /* This list is incomplete, but should suffice for now.
2016 It is very important that `sorry' does not call
2017 `report_error_function'. That could cause an infinite loop. */
2019 sorry_for_unsupported_tree (t);
2020 /* fall through to ERROR_MARK... */
2022 print_identifier (scratch_buffer, "<expression error>");
2028 dump_binary_op (const char *opstring, tree t, int flags)
2030 print_left_paren (scratch_buffer);
2031 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2032 output_add_space (scratch_buffer);
2034 print_identifier (scratch_buffer, opstring);
2036 print_identifier (scratch_buffer, "<unknown operator>");
2037 output_add_space (scratch_buffer);
2038 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2039 print_right_paren (scratch_buffer);
2043 dump_unary_op (const char *opstring, tree t, int flags)
2045 if (flags & TFF_EXPR_IN_PARENS)
2046 print_left_paren (scratch_buffer);
2047 print_identifier (scratch_buffer, opstring);
2048 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2049 if (flags & TFF_EXPR_IN_PARENS)
2050 print_right_paren (scratch_buffer);
2053 /* Exported interface to stringifying types, exprs and decls under TFF_*
2057 type_as_string (tree typ, int flags)
2059 reinit_global_formatting_buffer ();
2061 dump_type (typ, flags);
2063 return output_finalize_message (scratch_buffer);
2067 expr_as_string (tree decl, int flags)
2069 reinit_global_formatting_buffer ();
2071 dump_expr (decl, flags);
2073 return output_finalize_message (scratch_buffer);
2077 decl_as_string (tree decl, int flags)
2079 reinit_global_formatting_buffer ();
2081 dump_decl (decl, flags);
2083 return output_finalize_message (scratch_buffer);
2087 context_as_string (tree context, int flags)
2089 reinit_global_formatting_buffer ();
2091 dump_scope (context, flags);
2093 return output_finalize_message (scratch_buffer);
2096 /* Generate the three forms of printable names for cxx_printable_name. */
2099 lang_decl_name (tree decl, int v)
2102 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2104 reinit_global_formatting_buffer ();
2106 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
2108 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2109 print_scope_operator (scratch_buffer);
2112 if (TREE_CODE (decl) == FUNCTION_DECL)
2113 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2115 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2117 return output_finalize_message (scratch_buffer);
2121 location_of (tree t)
2123 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2124 t = DECL_CONTEXT (t);
2125 else if (TYPE_P (t))
2126 t = TYPE_MAIN_DECL (t);
2127 else if (TREE_CODE (t) == OVERLOAD)
2128 t = OVL_FUNCTION (t);
2130 return DECL_SOURCE_LOCATION (t);
2133 /* Now the interfaces from error et al to dump_type et al. Each takes an
2134 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2138 decl_to_string (tree decl, int verbose)
2142 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2143 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2144 flags = TFF_CLASS_KEY_OR_ENUM;
2146 flags |= TFF_DECL_SPECIFIERS | TFF_FUNCTION_DEFAULT_ARGUMENTS;
2147 else if (TREE_CODE (decl) == FUNCTION_DECL)
2148 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2149 flags |= TFF_TEMPLATE_HEADER;
2151 reinit_global_formatting_buffer ();
2153 dump_decl (decl, flags);
2155 return output_finalize_message (scratch_buffer);
2159 expr_to_string (tree decl)
2161 reinit_global_formatting_buffer ();
2163 dump_expr (decl, 0);
2165 return output_finalize_message (scratch_buffer);
2169 fndecl_to_string (tree fndecl, int verbose)
2173 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
2175 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2176 reinit_global_formatting_buffer ();
2178 dump_decl (fndecl, flags);
2180 return output_finalize_message (scratch_buffer);
2185 code_to_string (enum tree_code c)
2187 return tree_code_name [c];
2191 language_to_string (enum languages c)
2198 case lang_cplusplus:
2210 /* Return the proper printed version of a parameter to a C++ function. */
2213 parm_to_string (int p)
2216 output_add_string (scratch_buffer, "'this'");
2218 output_decimal (scratch_buffer, p + 1);
2220 return output_finalize_message (scratch_buffer);
2224 op_to_string (enum tree_code p)
2228 id = operator_name_info[(int) p].identifier;
2229 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2233 type_to_string (tree typ, int verbose)
2239 flags |= TFF_CLASS_KEY_OR_ENUM;
2240 flags |= TFF_TEMPLATE_HEADER;
2242 reinit_global_formatting_buffer ();
2244 dump_type (typ, flags);
2246 return output_finalize_message (scratch_buffer);
2250 assop_to_string (enum tree_code p)
2254 id = assignment_operator_name_info[(int) p].identifier;
2255 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2259 args_to_string (tree p, int verbose)
2263 flags |= TFF_CLASS_KEY_OR_ENUM;
2268 if (TYPE_P (TREE_VALUE (p)))
2269 return type_as_string (p, flags);
2271 reinit_global_formatting_buffer ();
2272 for (; p; p = TREE_CHAIN (p))
2274 if (TREE_VALUE (p) == null_node)
2275 print_identifier (scratch_buffer, "NULL");
2277 dump_type (error_type (TREE_VALUE (p)), flags);
2279 separate_with_comma (scratch_buffer);
2281 return output_finalize_message (scratch_buffer);
2285 cv_to_string (tree p, int v)
2287 reinit_global_formatting_buffer ();
2289 dump_qualifiers (p, v ? before : none);
2291 return output_finalize_message (scratch_buffer);
2294 /* Langhook for print_error_function. */
2296 cxx_print_error_function (diagnostic_context *context, const char *file)
2298 lhd_print_error_function (context, file);
2299 output_set_prefix (&context->buffer, file);
2300 maybe_print_instantiation_context (context);
2304 cp_diagnostic_starter (diagnostic_context *context,
2305 diagnostic_info *diagnostic)
2307 diagnostic_report_current_module (context);
2308 cp_print_error_function (context, diagnostic);
2309 maybe_print_instantiation_context (context);
2310 output_set_prefix (&context->buffer, diagnostic_build_prefix (diagnostic));
2314 cp_diagnostic_finalizer (diagnostic_context *context,
2315 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2317 output_destroy_prefix (&context->buffer);
2320 /* Print current function onto BUFFER, in the process of reporting
2321 a diagnostic message. Called from cp_diagnostic_starter. */
2323 cp_print_error_function (diagnostic_context *context,
2324 diagnostic_info *diagnostic)
2326 if (diagnostic_last_function_changed (context))
2328 const char *old_prefix = output_prefix (&context->buffer);
2329 char *new_prefix = diagnostic->location.file
2330 ? file_name_as_prefix (diagnostic->location.file)
2333 output_set_prefix (&context->buffer, new_prefix);
2335 if (current_function_decl == NULL)
2336 output_add_string (&context->buffer, "At global scope:");
2338 output_printf (&context->buffer, "In %s `%s':",
2339 function_category (current_function_decl),
2340 cxx_printable_name (current_function_decl, 2));
2341 output_add_newline (&context->buffer);
2343 diagnostic_set_last_function (context);
2344 output_destroy_prefix (&context->buffer);
2345 context->buffer.state.prefix = old_prefix;
2349 /* Returns a description of FUNCTION using standard terminology. */
2351 function_category (tree fn)
2353 if (DECL_FUNCTION_MEMBER_P (fn))
2355 if (DECL_STATIC_FUNCTION_P (fn))
2356 return "static member function";
2357 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2358 return "copy constructor";
2359 else if (DECL_CONSTRUCTOR_P (fn))
2360 return "constructor";
2361 else if (DECL_DESTRUCTOR_P (fn))
2362 return "destructor";
2364 return "member function";
2370 /* Report the full context of a current template instantiation,
2373 print_instantiation_full_context (diagnostic_context *context)
2375 tree p = current_instantiation ();
2376 location_t location = input_location;
2380 if (current_function_decl != TINST_DECL (p)
2381 && current_function_decl != NULL_TREE)
2382 /* We can get here during the processing of some synthesized
2383 method. Then, TINST_DECL (p) will be the function that's causing
2388 if (current_function_decl == TINST_DECL (p))
2389 /* Avoid redundancy with the the "In function" line. */;
2391 output_verbatim (&context->buffer,
2392 "%s: In instantiation of `%s':\n", location.file,
2393 decl_as_string (TINST_DECL (p),
2394 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2396 location.line = TINST_LINE (p);
2397 location.file = TINST_FILE (p);
2402 print_instantiation_partial_context (context, p, location);
2405 /* Same as above but less verbose. */
2407 print_instantiation_partial_context (diagnostic_context *context,
2408 tree t, location_t loc)
2410 for (; t; t = TREE_CHAIN (t))
2413 (&context->buffer, "%s:%d: instantiated from `%s'\n",
2415 decl_as_string (TINST_DECL (t),
2416 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2417 loc.line = TINST_LINE (t);
2418 loc.file = TINST_FILE (t);
2420 output_verbatim (&context->buffer, "%s:%d: instantiated from here\n",
2421 loc.file, loc.line);
2424 /* Called from cp_thing to print the template context for an error. */
2426 maybe_print_instantiation_context (diagnostic_context *context)
2428 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2431 record_last_problematic_instantiation ();
2432 print_instantiation_full_context (context);
2435 /* Report the bare minimum context of a template instantiation. */
2437 print_instantiation_context (void)
2439 print_instantiation_partial_context
2440 (global_dc, current_instantiation (), input_location);
2441 diagnostic_flush_buffer (global_dc);
2444 /* Called from output_format -- during diagnostic message processing --
2445 to handle C++ specific format specifier with the following meanings:
2446 %A function argument-list.
2450 %F function declaration.
2451 %L language as used in extern "lang".
2453 %P function parameter whose position is indicated by an integer.
2454 %Q assignment operator.
2458 cp_printer (output_buffer *buffer, text_info *text)
2462 #define next_tree va_arg (*text->args_ptr, tree)
2463 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2464 #define next_lang va_arg (*text->args_ptr, enum languages)
2465 #define next_int va_arg (*text->args_ptr, int)
2467 if (*text->format_spec == '+')
2468 ++text->format_spec;
2469 if (*text->format_spec == '#')
2472 ++text->format_spec;
2475 switch (*text->format_spec)
2477 case 'A': result = args_to_string (next_tree, verbose); break;
2478 case 'C': result = code_to_string (next_tcode); break;
2479 case 'D': result = decl_to_string (next_tree, verbose); break;
2480 case 'E': result = expr_to_string (next_tree); break;
2481 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2482 case 'L': result = language_to_string (next_lang); break;
2483 case 'O': result = op_to_string (next_tcode); break;
2484 case 'P': result = parm_to_string (next_int); break;
2485 case 'Q': result = assop_to_string (next_tcode); break;
2486 case 'T': result = type_to_string (next_tree, verbose); break;
2487 case 'V': result = cv_to_string (next_tree, verbose); break;
2493 output_add_string (buffer, result);
2502 print_non_consecutive_character (output_buffer *buffer, int c)
2504 const char *p = output_last_position (buffer);
2506 if (p != NULL && *p == c)
2507 output_add_space (buffer);
2508 output_add_character (buffer, c);
2511 /* These are temporary wrapper functions which handle the historic
2512 behavior of cp_*_at. */
2515 locate_error (const char *msgid, va_list ap)
2521 for (f = msgid; *f; f++)
2534 /* Just ignore these possibilities. */
2536 case 'd': (void) va_arg (ap, int); break;
2537 case 's': (void) va_arg (ap, char *); break;
2538 case 'L': (void) va_arg (ap, enum languages); break;
2541 case 'Q': (void) va_arg (ap, enum tree_code); break;
2543 /* These take a tree, which may be where the error is
2552 t = va_arg (ap, tree);
2558 errorcount = 0; /* damn ICE suppression */
2559 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2565 here = va_arg (ap, tree);
2572 cp_error_at (const char *msgid, ...)
2575 diagnostic_info diagnostic;
2578 va_start (ap, msgid);
2579 here = locate_error (msgid, ap);
2582 va_start (ap, msgid);
2583 diagnostic_set_info (&diagnostic, msgid, &ap,
2584 location_of (here), DK_ERROR);
2585 report_diagnostic (&diagnostic);
2590 cp_warning_at (const char *msgid, ...)
2593 diagnostic_info diagnostic;
2596 va_start (ap, msgid);
2597 here = locate_error (msgid, ap);
2600 va_start (ap, msgid);
2601 diagnostic_set_info (&diagnostic, msgid, &ap,
2602 location_of (here), DK_WARNING);
2603 report_diagnostic (&diagnostic);
2608 cp_pedwarn_at (const char *msgid, ...)
2611 diagnostic_info diagnostic;
2614 va_start (ap, msgid);
2615 here = locate_error (msgid, ap);
2618 va_start (ap, msgid);
2619 diagnostic_set_info (&diagnostic, msgid, &ap,
2620 location_of (here), pedantic_error_kind());
2621 report_diagnostic (&diagnostic);