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"
33 #include "cxx-pretty-print.h"
35 enum pad
{ none
, before
, after
};
37 #define pp_template_argument_list_start(PP) \
38 pp_non_consecutive_character (PP, '<')
39 #define pp_template_argument_list_end(PP) \
40 pp_non_consecutive_character (PP, '>')
41 #define pp_separate_with_comma(PP) pp_string (PP, ", ")
43 /* The global buffer where we dump everything. It is there only for
44 transitional purpose. It is expected, in the near future, to be
45 completely removed. */
46 static cxx_pretty_printer scratch_pretty_printer
;
47 #define cxx_pp (&scratch_pretty_printer)
49 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
51 #define reinit_global_formatting_buffer() \
52 output_clear_message_text (scratch_buffer)
54 static const char *args_to_string (tree
, int);
55 static const char *assop_to_string (enum tree_code
);
56 static const char *code_to_string (enum tree_code
);
57 static const char *cv_to_string (tree
, int);
58 static const char *decl_to_string (tree
, int);
59 static const char *expr_to_string (tree
);
60 static const char *fndecl_to_string (tree
, int);
61 static const char *op_to_string (enum tree_code
);
62 static const char *parm_to_string (int);
63 static const char *type_to_string (tree
, int);
65 static void dump_type (tree
, int);
66 static void dump_typename (tree
, int);
67 static void dump_simple_decl (tree
, tree
, int);
68 static void dump_decl (tree
, int);
69 static void dump_template_decl (tree
, int);
70 static void dump_function_decl (tree
, int);
71 static void dump_expr (tree
, int);
72 static void dump_unary_op (const char *, tree
, int);
73 static void dump_binary_op (const char *, tree
, int);
74 static void dump_aggr_type (tree
, int);
75 static enum pad
dump_type_prefix (tree
, int);
76 static void dump_type_suffix (tree
, int);
77 static void dump_function_name (tree
, int);
78 static void dump_expr_list (tree
, int);
79 static void dump_global_iord (tree
);
80 static enum pad
dump_qualifiers (tree
, enum pad
);
81 static void dump_parameters (tree
, int);
82 static void dump_exception_spec (tree
, int);
83 static const char *class_key_or_enum (tree
);
84 static void dump_template_argument (tree
, int);
85 static void dump_template_argument_list (tree
, int);
86 static void dump_template_parameter (tree
, int);
87 static void dump_template_bindings (tree
, tree
);
88 static void dump_scope (tree
, int);
89 static void dump_template_parms (tree
, int, int);
91 static const char *function_category (tree
);
92 static void maybe_print_instantiation_context (diagnostic_context
*);
93 static void print_instantiation_full_context (diagnostic_context
*);
94 static void print_instantiation_partial_context (diagnostic_context
*,
96 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
97 static void cp_diagnostic_finalizer (diagnostic_context
*, diagnostic_info
*);
98 static void cp_print_error_function (diagnostic_context
*, diagnostic_info
*);
100 static bool cp_printer (pretty_printer
*, text_info
*);
101 static void pp_non_consecutive_character (cxx_pretty_printer
*, int);
102 static tree
locate_error (const char *, va_list);
103 static location_t
location_of (tree
);
108 diagnostic_starter (global_dc
) = cp_diagnostic_starter
;
109 diagnostic_finalizer (global_dc
) = cp_diagnostic_finalizer
;
110 diagnostic_format_decoder (global_dc
) = cp_printer
;
112 pp_construct (pp_base (cxx_pp
), NULL
, 0);
113 pp_cxx_pretty_printer_init (cxx_pp
);
116 /* Dump a scope, if deemed necessary. */
119 dump_scope (tree scope
, int flags
)
121 int f
= ~TFF_RETURN_TYPE
& (flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
));
123 if (scope
== NULL_TREE
)
126 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
128 if (scope
!= global_namespace
)
130 dump_decl (scope
, f
);
131 pp_colon_colon (cxx_pp
);
134 else if (AGGREGATE_TYPE_P (scope
))
136 dump_type (scope
, f
);
137 pp_colon_colon (cxx_pp
);
139 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
141 dump_function_decl (scope
, f
);
142 pp_colon_colon (cxx_pp
);
146 /* Dump type qualifiers, providing padding as requested. Return an
147 indication of whether we dumped something. */
150 dump_qualifiers (tree t
, enum pad p
)
152 static const int masks
[] =
153 {TYPE_QUAL_CONST
, TYPE_QUAL_VOLATILE
, TYPE_QUAL_RESTRICT
};
154 static const char *const names
[] =
155 {"const", "volatile", "__restrict"};
157 int quals
= TYPE_QUALS (t
);
158 int do_after
= p
== after
;
162 for (ix
= 0; ix
!= 3; ix
++)
163 if (masks
[ix
] & quals
)
168 pp_identifier (cxx_pp
, names
[ix
]);
178 /* Dump the template ARGument under control of FLAGS. */
181 dump_template_argument (tree arg
, int flags
)
183 if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
184 dump_type (arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
186 dump_expr (arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
189 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
193 dump_template_argument_list (tree args
, int flags
)
195 int n
= TREE_VEC_LENGTH (args
);
199 for (i
= 0; i
< n
; ++i
)
202 pp_separate_with_comma (cxx_pp
);
203 dump_template_argument (TREE_VEC_ELT (args
, i
), flags
);
208 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
211 dump_template_parameter (tree parm
, int flags
)
213 tree p
= TREE_VALUE (parm
);
214 tree a
= TREE_PURPOSE (parm
);
216 if (TREE_CODE (p
) == TYPE_DECL
)
218 if (flags
& TFF_DECL_SPECIFIERS
)
220 pp_identifier (cxx_pp
, "class");
224 pp_tree_identifier (cxx_pp
, DECL_NAME (p
));
227 else if (DECL_NAME (p
))
228 pp_tree_identifier (cxx_pp
, DECL_NAME (p
));
230 pp_identifier (cxx_pp
, "<template default argument error>");
233 dump_decl (p
, flags
| TFF_DECL_SPECIFIERS
);
235 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
237 pp_string (cxx_pp
, " = ");
238 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
239 dump_type (a
, flags
& ~TFF_CHASE_TYPEDEF
);
241 dump_expr (a
, flags
| TFF_EXPR_IN_PARENS
);
245 /* Dump, under control of FLAGS, a template-parameter-list binding.
246 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
250 dump_template_bindings (tree parms
, tree args
)
256 tree p
= TREE_VALUE (parms
);
257 int lvl
= TMPL_PARMS_DEPTH (parms
);
261 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
263 tree arg
= NULL_TREE
;
265 /* Don't crash if we had an invalid argument list. */
266 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
268 tree lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
269 if (NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
270 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
274 pp_separate_with_comma (cxx_pp
);
275 dump_template_parameter (TREE_VEC_ELT (p
, i
), TFF_PLAIN_IDENTIFIER
);
276 pp_string (cxx_pp
, " = ");
278 dump_template_argument (arg
, TFF_PLAIN_IDENTIFIER
);
280 pp_identifier (cxx_pp
, "<missing>");
286 parms
= TREE_CHAIN (parms
);
290 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
294 dump_type (tree t
, int flags
)
299 if (TYPE_PTRMEMFUNC_P (t
))
302 switch (TREE_CODE (t
))
305 pp_identifier (cxx_pp
, "<unknown type>");
309 /* A list of function parms. */
310 dump_parameters (t
, flags
);
313 case IDENTIFIER_NODE
:
314 pp_tree_identifier (cxx_pp
, t
);
318 dump_type (BINFO_TYPE (t
), flags
);
324 dump_aggr_type (t
, flags
);
328 if (flags
& TFF_CHASE_TYPEDEF
)
330 dump_type (DECL_ORIGINAL_TYPE (t
)
331 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
334 /* else fallthrough */
338 dump_decl (t
, flags
& ~TFF_DECL_SPECIFIERS
);
342 pp_string (cxx_pp
, "__complex__ ");
343 dump_type (TREE_TYPE (t
), flags
);
347 pp_string (cxx_pp
, "__vector__ ");
349 /* The subtype of a VECTOR_TYPE is something like intQI_type_node,
350 which has no name and is not very useful for diagnostics. So
351 look up the equivalent C type and print its name. */
352 tree elt
= TREE_TYPE (t
);
353 elt
= c_common_type_for_mode (TYPE_MODE (elt
), TREE_UNSIGNED (elt
));
354 dump_type (elt
, flags
);
359 if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t
)) && TREE_UNSIGNED (t
))
360 pp_string (cxx_pp
, "unsigned ");
361 else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t
)) && !TREE_UNSIGNED (t
))
362 pp_string (cxx_pp
, "signed ");
370 dump_qualifiers (t
, after
);
371 type
= flags
& TFF_CHASE_TYPEDEF
? TYPE_MAIN_VARIANT (t
) : t
;
372 if (TYPE_NAME (type
) && TYPE_IDENTIFIER (type
))
373 pp_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (type
));
375 /* Types like intQI_type_node and friends have no names.
376 These don't come up in user error messages, but it's nice
377 to be able to print them from the debugger. */
378 pp_identifier (cxx_pp
, "<anonymous>");
382 case TEMPLATE_TEMPLATE_PARM
:
383 /* For parameters inside template signature. */
384 if (TYPE_IDENTIFIER (t
))
385 pp_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
387 pp_identifier (cxx_pp
, "<anonymous template template parameter>");
390 case BOUND_TEMPLATE_TEMPLATE_PARM
:
392 tree args
= TYPE_TI_ARGS (t
);
393 pp_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
394 pp_template_argument_list_start (cxx_pp
);
395 dump_template_argument_list (args
, flags
);
396 pp_template_argument_list_end (cxx_pp
);
400 case TEMPLATE_TYPE_PARM
:
401 dump_qualifiers (t
, after
);
402 if (TYPE_IDENTIFIER (t
))
403 pp_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
405 pp_identifier (cxx_pp
, "<anonymous template type parameter>");
408 /* This is not always necessary for pointers and such, but doing this
409 reduces code size. */
418 dump_type_prefix (t
, flags
);
419 dump_type_suffix (t
, flags
);
423 dump_qualifiers (t
, after
);
424 pp_string (cxx_pp
, "typename ");
425 dump_typename (t
, flags
);
428 case UNBOUND_CLASS_TEMPLATE
:
429 dump_type (TYPE_CONTEXT (t
), flags
);
430 pp_colon_colon (cxx_pp
);
431 pp_identifier (cxx_pp
, "template ");
432 dump_type (DECL_NAME (TYPE_NAME (t
)), flags
);
436 pp_string (cxx_pp
, "__typeof (");
437 dump_expr (TYPE_FIELDS (t
), flags
& ~TFF_EXPR_IN_PARENS
);
438 pp_right_paren (cxx_pp
);
442 pp_unsupported_tree (cxx_pp
, t
);
443 /* Fall through to error. */
446 pp_identifier (cxx_pp
, "<type error>");
451 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
455 dump_typename (tree t
, int flags
)
457 tree ctx
= TYPE_CONTEXT (t
);
459 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
460 dump_typename (ctx
, flags
);
462 dump_type (ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
463 pp_colon_colon (cxx_pp
);
464 dump_decl (TYPENAME_TYPE_FULLNAME (t
), flags
);
467 /* Return the name of the supplied aggregate, or enumeral type. */
470 class_key_or_enum (tree t
)
472 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
474 else if (TREE_CODE (t
) == UNION_TYPE
)
476 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
482 /* Print out a class declaration T under the control of FLAGS,
483 in the form `class foo'. */
486 dump_aggr_type (tree t
, int flags
)
489 const char *variety
= class_key_or_enum (t
);
493 dump_qualifiers (t
, after
);
495 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
497 pp_identifier (cxx_pp
, variety
);
501 if (flags
& TFF_CHASE_TYPEDEF
)
502 t
= TYPE_MAIN_VARIANT (t
);
504 name
= TYPE_NAME (t
);
508 typdef
= !DECL_ARTIFICIAL (name
);
509 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
510 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
511 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t
)
512 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
513 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t
))
514 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
515 dump_scope (CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
518 /* Because the template names are mangled, we have to locate
519 the most general template, and use that name. */
520 tree tpl
= CLASSTYPE_TI_TEMPLATE (t
);
522 while (DECL_TEMPLATE_INFO (tpl
))
523 tpl
= DECL_TI_TEMPLATE (tpl
);
526 name
= DECL_NAME (name
);
529 if (name
== 0 || ANON_AGGRNAME_P (name
))
531 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
532 pp_identifier (cxx_pp
, "<anonymous>");
534 pp_printf (pp_base (cxx_pp
), "<anonymous %s>", variety
);
537 pp_tree_identifier (cxx_pp
, name
);
539 dump_template_parms (TYPE_TEMPLATE_INFO (t
),
540 !CLASSTYPE_USE_TEMPLATE (t
),
541 flags
& ~TFF_TEMPLATE_HEADER
);
544 /* Dump into the obstack the initial part of the output for a given type.
545 This is necessary when dealing with things like functions returning
548 return type of `int (* fee ())()': pointer -> function -> int. Both
549 pointer (and reference and offset) and function (and member) types must
550 deal with prefix and suffix.
552 Arrays must also do this for DECL nodes, like int a[], and for things like
555 Return indicates how you should pad an object name after this. I.e. you
556 want to pad non-*, non-& cores, but not pad * or & types. */
559 dump_type_prefix (tree t
, int flags
)
561 enum pad padding
= before
;
563 if (TYPE_PTRMEMFUNC_P (t
))
565 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
569 switch (TREE_CODE (t
))
574 tree sub
= TREE_TYPE (t
);
576 padding
= dump_type_prefix (sub
, flags
);
577 if (TREE_CODE (sub
) == ARRAY_TYPE
)
580 pp_left_paren (cxx_pp
);
582 pp_character (cxx_pp
, "&*"[TREE_CODE (t
) == POINTER_TYPE
]);
583 padding
= dump_qualifiers (t
, before
);
589 padding
= dump_type_prefix (TREE_TYPE (t
), flags
);
590 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
594 dump_type (TYPE_OFFSET_BASETYPE (t
), flags
);
595 pp_colon_colon (cxx_pp
);
598 padding
= dump_qualifiers (t
, none
);
601 /* Can only be reached through function pointer -- this would not be
602 correct if FUNCTION_DECLs used it. */
604 padding
= dump_type_prefix (TREE_TYPE (t
), flags
);
607 pp_left_paren (cxx_pp
);
612 padding
= dump_type_prefix (TREE_TYPE (t
), flags
);
615 pp_left_paren (cxx_pp
);
617 dump_aggr_type (TYPE_METHOD_BASETYPE (t
), flags
);
618 pp_colon_colon (cxx_pp
);
622 padding
= dump_type_prefix (TREE_TYPE (t
), flags
);
626 case IDENTIFIER_NODE
:
631 case TEMPLATE_TYPE_PARM
:
632 case TEMPLATE_TEMPLATE_PARM
:
633 case BOUND_TEMPLATE_TEMPLATE_PARM
:
644 dump_type (t
, flags
);
649 pp_unsupported_tree (cxx_pp
, t
);
652 pp_identifier (cxx_pp
, "<typeprefixerror>");
658 /* Dump the suffix of type T, under control of FLAGS. This is the part
659 which appears after the identifier (or function parms). */
662 dump_type_suffix (tree t
, int flags
)
664 if (TYPE_PTRMEMFUNC_P (t
))
665 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
667 switch (TREE_CODE (t
))
672 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
673 pp_right_paren (cxx_pp
);
674 dump_type_suffix (TREE_TYPE (t
), flags
);
677 /* Can only be reached through function pointer */
682 pp_right_paren (cxx_pp
);
683 arg
= TYPE_ARG_TYPES (t
);
684 if (TREE_CODE (t
) == METHOD_TYPE
)
685 arg
= TREE_CHAIN (arg
);
687 /* Function pointers don't have default args. Not in standard C++,
688 anyway; they may in g++, but we'll just pretend otherwise. */
689 dump_parameters (arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
691 if (TREE_CODE (t
) == METHOD_TYPE
)
693 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t
))), before
);
694 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t
), flags
);
695 dump_type_suffix (TREE_TYPE (t
), flags
);
700 pp_left_bracket (cxx_pp
);
703 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t
)), 0))
705 (cxx_pp
, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t
)), 0) + 1);
706 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t
))) == MINUS_EXPR
)
707 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t
)), 0),
708 flags
& ~TFF_EXPR_IN_PARENS
);
710 dump_expr (fold (cp_build_binary_op
711 (PLUS_EXPR
, TYPE_MAX_VALUE (TYPE_DOMAIN (t
)),
713 flags
& ~TFF_EXPR_IN_PARENS
);
715 pp_right_bracket (cxx_pp
);
716 dump_type_suffix (TREE_TYPE (t
), flags
);
720 case IDENTIFIER_NODE
:
725 case TEMPLATE_TYPE_PARM
:
726 case TEMPLATE_TEMPLATE_PARM
:
727 case BOUND_TEMPLATE_TEMPLATE_PARM
:
741 pp_unsupported_tree (cxx_pp
, t
);
743 /* Don't mark it here, we should have already done in
750 dump_global_iord (tree t
)
752 const char *p
= NULL
;
754 if (DECL_GLOBAL_CTOR_P (t
))
756 else if (DECL_GLOBAL_DTOR_P (t
))
761 pp_printf (pp_base (cxx_pp
), "(static %s for %s)", p
, input_filename
);
765 dump_simple_decl (tree t
, tree type
, int flags
)
767 if (flags
& TFF_DECL_SPECIFIERS
)
769 if (dump_type_prefix (type
, flags
) != none
)
772 if (!DECL_INITIAL (t
) || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
)
773 dump_scope (CP_DECL_CONTEXT (t
), flags
);
775 dump_decl (DECL_NAME (t
), flags
);
777 pp_identifier (cxx_pp
, "<anonymous>");
778 if (flags
& TFF_DECL_SPECIFIERS
)
779 dump_type_suffix (type
, flags
);
782 /* Dump a human readable string for the decl T under control of FLAGS. */
785 dump_decl (tree t
, int flags
)
790 switch (TREE_CODE (t
))
794 /* Don't say 'typedef class A' */
795 if (DECL_ARTIFICIAL (t
))
797 if ((flags
& TFF_DECL_SPECIFIERS
)
798 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
799 /* Say `class T' not just `T'. */
800 pp_string (cxx_pp
, "class ");
802 dump_type (TREE_TYPE (t
), flags
);
806 if (flags
& TFF_DECL_SPECIFIERS
)
807 pp_string (cxx_pp
, "typedef ");
808 dump_simple_decl (t
, DECL_ORIGINAL_TYPE (t
)
809 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
814 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
816 pp_string (cxx_pp
, "vtable for ");
817 my_friendly_assert (TYPE_P (DECL_CONTEXT (t
)), 20010720);
818 dump_type (DECL_CONTEXT (t
), flags
);
821 /* else fall through */
824 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
828 pp_string (cxx_pp
, "<return value> ");
829 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
833 dump_scope (CP_DECL_CONTEXT (t
), flags
);
834 if (DECL_NAME (t
) == anonymous_namespace_name
)
835 pp_identifier (cxx_pp
, "<unnamed>");
837 pp_tree_identifier (cxx_pp
, DECL_NAME (t
));
841 dump_decl (TREE_OPERAND (t
, 0), flags
& ~TFF_DECL_SPECIFIERS
);
842 pp_colon_colon (cxx_pp
);
843 dump_decl (TREE_OPERAND (t
, 1), flags
);
847 dump_decl (TREE_OPERAND (t
, 0), flags
);
848 pp_left_bracket (cxx_pp
);
849 dump_decl (TREE_OPERAND (t
, 1), flags
);
850 pp_right_bracket (cxx_pp
);
853 /* So that we can do dump_decl on an aggr type. */
857 dump_type (t
, flags
);
861 /* This is a pseudo destructor call which has not been folded into
862 a PSEUDO_DTOR_EXPR yet. */
863 pp_complement (cxx_pp
);
864 dump_type (TREE_OPERAND (t
, 0), flags
);
871 /* These special cases are duplicated here so that other functions
872 can feed identifiers to error and get them demangled properly. */
873 case IDENTIFIER_NODE
:
874 if (IDENTIFIER_TYPENAME_P (t
))
876 pp_string (cxx_pp
, "operator ");
877 /* Not exactly IDENTIFIER_TYPE_VALUE. */
878 dump_type (TREE_TYPE (t
), flags
);
882 pp_tree_identifier (cxx_pp
, t
);
889 if (DECL_CLASS_SCOPE_P (t
))
891 dump_type (DECL_CONTEXT (t
), flags
);
892 pp_colon_colon (cxx_pp
);
894 else if (DECL_CONTEXT (t
))
896 dump_decl (DECL_CONTEXT (t
), flags
);
897 pp_colon_colon (cxx_pp
);
899 dump_decl (DECL_NAME (t
), flags
);
903 /* If there's only one function, just treat it like an ordinary
909 if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
910 dump_global_iord (t
);
911 else if (! DECL_LANG_SPECIFIC (t
))
912 pp_identifier (cxx_pp
, "<internal>");
914 dump_function_decl (t
, flags
);
918 dump_template_decl (t
, flags
);
921 case TEMPLATE_ID_EXPR
:
923 tree name
= TREE_OPERAND (t
, 0);
925 if (is_overloaded_fn (name
))
926 name
= DECL_NAME (get_first_fn (name
));
927 dump_decl (name
, flags
);
928 pp_template_argument_list_start (cxx_pp
);
929 if (TREE_OPERAND (t
, 1))
930 dump_template_argument_list (TREE_OPERAND (t
, 1), flags
);
931 pp_template_argument_list_end (cxx_pp
);
936 pp_tree_identifier (cxx_pp
, DECL_NAME (t
));
940 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
941 || (DECL_INITIAL (t
) &&
942 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
943 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
944 else if (DECL_NAME (t
))
945 dump_decl (DECL_NAME (t
), flags
);
946 else if (DECL_INITIAL (t
))
947 dump_expr (DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
949 pp_identifier (cxx_pp
, "<enumerator>");
953 pp_string (cxx_pp
, "using ");
954 dump_type (DECL_INITIAL (t
), flags
);
955 pp_colon_colon (cxx_pp
);
956 dump_decl (DECL_NAME (t
), flags
);
960 dump_decl (BASELINK_FUNCTIONS (t
), flags
);
963 case NON_DEPENDENT_EXPR
:
964 dump_expr (t
, flags
);
968 pp_unsupported_tree (cxx_pp
, t
);
969 /* Fallthrough to error. */
972 pp_identifier (cxx_pp
, "<declaration error>");
977 /* Dump a template declaration T under control of FLAGS. This means the
978 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
981 dump_template_decl (tree t
, int flags
)
983 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
987 if (flags
& TFF_TEMPLATE_HEADER
)
989 for (parms
= orig_parms
= nreverse (orig_parms
);
991 parms
= TREE_CHAIN (parms
))
993 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
994 int len
= TREE_VEC_LENGTH (inner_parms
);
996 pp_string (cxx_pp
, "template<");
998 /* If we've shown the template prefix, we'd better show the
999 parameters' and decl's type too. */
1000 flags
|= TFF_DECL_SPECIFIERS
;
1002 for (i
= 0; i
< len
; i
++)
1005 pp_separate_with_comma (cxx_pp
);
1006 dump_template_parameter (TREE_VEC_ELT (inner_parms
, i
), flags
);
1008 pp_template_argument_list_end (cxx_pp
);
1011 nreverse(orig_parms
);
1013 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1014 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1015 pp_string (cxx_pp
, "class ");
1018 if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == TYPE_DECL
)
1019 dump_type (TREE_TYPE (t
),
1020 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1021 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1022 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == VAR_DECL
)
1023 dump_decl (DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1024 else if (TREE_TYPE (t
) == NULL_TREE
)
1027 switch (NEXT_CODE (t
))
1031 dump_function_decl (t
, flags
| TFF_TEMPLATE_NAME
);
1034 /* This case can occur with some invalid code. */
1035 dump_type (TREE_TYPE (t
),
1036 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1037 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0));
1041 /* Pretty print a function decl. There are several ways we want to print a
1042 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1043 As error can only apply the '#' flag once to give 0 and 1 for V, there
1044 is %D which doesn't print the throw specs, and %F which does. */
1047 dump_function_decl (tree t
, int flags
)
1051 tree cname
= NULL_TREE
;
1052 tree template_args
= NULL_TREE
;
1053 tree template_parms
= NULL_TREE
;
1054 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1056 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1057 t
= DECL_TEMPLATE_RESULT (t
);
1059 /* Pretty print template instantiations only. */
1060 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
))
1064 template_args
= DECL_TI_ARGS (t
);
1065 tmpl
= most_general_template (t
);
1066 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1068 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1073 fntype
= TREE_TYPE (t
);
1074 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1076 if (DECL_CLASS_SCOPE_P (t
))
1077 cname
= DECL_CONTEXT (t
);
1078 /* this is for partially instantiated template methods */
1079 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1080 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1082 if (!(flags
& TFF_DECL_SPECIFIERS
))
1084 else if (DECL_STATIC_FUNCTION_P (t
))
1085 pp_identifier (cxx_pp
, "static ");
1086 else if (DECL_VIRTUAL_P (t
))
1087 pp_identifier (cxx_pp
, "virtual ");
1089 /* Print the return type? */
1091 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1092 && !DECL_DESTRUCTOR_P (t
);
1095 dump_type_prefix (TREE_TYPE (fntype
), flags
);
1099 /* Print the function name. */
1102 dump_type (cname
, flags
);
1103 pp_colon_colon (cxx_pp
);
1106 dump_scope (CP_DECL_CONTEXT (t
), flags
);
1108 dump_function_name (t
, flags
);
1112 dump_parameters (parmtypes
, flags
);
1114 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1115 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype
))),
1118 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1119 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype
), flags
);
1122 dump_type_suffix (TREE_TYPE (fntype
), flags
);
1125 /* If T is a template instantiation, dump the parameter binding. */
1126 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
)
1128 pp_string (cxx_pp
, " [with ");
1129 dump_template_bindings (template_parms
, template_args
);
1130 pp_right_bracket (cxx_pp
);
1134 /* Print a parameter list. If this is for a member function, the
1135 member object ptr (and any other hidden args) should have
1136 already been removed. */
1139 dump_parameters (tree parmtypes
, int flags
)
1143 pp_left_paren (cxx_pp
);
1145 for (first
= 1; parmtypes
!= void_list_node
;
1146 parmtypes
= TREE_CHAIN (parmtypes
))
1149 pp_separate_with_comma (cxx_pp
);
1153 pp_identifier (cxx_pp
, "...");
1156 dump_type (TREE_VALUE (parmtypes
), flags
);
1158 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1160 pp_string (cxx_pp
, " = ");
1161 dump_expr (TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1165 pp_right_paren (cxx_pp
);
1168 /* Print an exception specification. T is the exception specification. */
1171 dump_exception_spec (tree t
, int flags
)
1175 pp_string (cxx_pp
, " throw (");
1176 if (TREE_VALUE (t
) != NULL_TREE
)
1179 dump_type (TREE_VALUE (t
), flags
);
1183 pp_separate_with_comma (cxx_pp
);
1185 pp_right_paren (cxx_pp
);
1189 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1190 and destructors properly. */
1193 dump_function_name (tree t
, int flags
)
1195 tree name
= DECL_NAME (t
);
1197 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1198 t
= DECL_TEMPLATE_RESULT (t
);
1200 /* Don't let the user see __comp_ctor et al. */
1201 if (DECL_CONSTRUCTOR_P (t
)
1202 || DECL_DESTRUCTOR_P (t
))
1203 name
= constructor_name (DECL_CONTEXT (t
));
1205 if (DECL_DESTRUCTOR_P (t
))
1207 pp_complement (cxx_pp
);
1208 dump_decl (name
, TFF_PLAIN_IDENTIFIER
);
1210 else if (DECL_CONV_FN_P (t
))
1212 /* This cannot use the hack that the operator's return
1213 type is stashed off of its name because it may be
1214 used for error reporting. In the case of conflicting
1215 declarations, both will have the same name, yet
1216 the types will be different, hence the TREE_TYPE field
1217 of the first name will be clobbered by the second. */
1218 pp_string (cxx_pp
, "operator ");
1219 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1221 else if (IDENTIFIER_OPNAME_P (name
))
1222 pp_tree_identifier (cxx_pp
, name
);
1224 dump_decl (name
, flags
);
1226 if (DECL_LANG_SPECIFIC (t
) && DECL_TEMPLATE_INFO (t
)
1227 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1228 && (DECL_TEMPLATE_SPECIALIZATION (t
)
1229 || TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1230 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t
))
1231 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1232 dump_template_parms (DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
), flags
);
1235 /* Dump the template parameters from the template info INFO under control of
1236 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1237 specialization (partial or complete). For partial specializations we show
1238 the specialized parameter values. For a primary template we show no
1242 dump_template_parms (tree info
, int primary
, int flags
)
1244 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1246 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1248 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1249 pp_template_argument_list_start (cxx_pp
);
1251 /* Be careful only to print things when we have them, so as not
1252 to crash producing error messages. */
1253 if (args
&& !primary
)
1257 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args
))
1258 args
= TREE_VEC_ELT (args
, TREE_VEC_LENGTH (args
) - 1);
1260 len
= TREE_VEC_LENGTH (args
);
1262 for (ix
= 0; ix
!= len
; ix
++)
1264 tree arg
= TREE_VEC_ELT (args
, ix
);
1267 pp_separate_with_comma (cxx_pp
);
1270 pp_identifier (cxx_pp
, "<template parameter error>");
1272 dump_template_argument (arg
, flags
);
1277 tree tpl
= TI_TEMPLATE (info
);
1278 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1281 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1282 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1284 for (ix
= 0; ix
!= len
; ix
++)
1286 tree parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1289 pp_separate_with_comma (cxx_pp
);
1291 dump_decl (parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1294 pp_template_argument_list_end (cxx_pp
);
1297 /* Print out a list of initializers (subr of dump_expr) */
1300 dump_expr_list (tree l
, int flags
)
1304 dump_expr (TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1307 pp_separate_with_comma (cxx_pp
);
1311 /* Print out an expression E under control of FLAGS. */
1314 dump_expr (tree t
, int flags
)
1319 switch (TREE_CODE (t
))
1327 case NAMESPACE_DECL
:
1329 case IDENTIFIER_NODE
:
1330 dump_decl (t
, flags
& ~TFF_DECL_SPECIFIERS
);
1336 pp_c_constant (pp_c_base (cxx_pp
), t
);
1340 pp_ampersand (cxx_pp
);
1341 dump_type (PTRMEM_CST_CLASS (t
), flags
);
1342 pp_colon_colon (cxx_pp
);
1343 pp_tree_identifier (cxx_pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1347 pp_left_paren (cxx_pp
);
1348 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1349 pp_separate_with_comma (cxx_pp
);
1350 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1351 pp_right_paren (cxx_pp
);
1355 pp_left_paren (cxx_pp
);
1356 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1357 pp_string (cxx_pp
, " ? ");
1358 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1359 pp_string (cxx_pp
, " : ");
1360 dump_expr (TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
1361 pp_right_paren (cxx_pp
);
1365 if (TREE_HAS_CONSTRUCTOR (t
))
1367 pp_string (cxx_pp
, "new ");
1368 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1371 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1374 case AGGR_INIT_EXPR
:
1376 tree fn
= NULL_TREE
;
1378 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
)
1379 fn
= TREE_OPERAND (TREE_OPERAND (t
, 0), 0);
1381 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
1383 if (DECL_CONSTRUCTOR_P (fn
))
1384 pp_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (TREE_TYPE (t
)));
1389 dump_expr (TREE_OPERAND (t
, 0), 0);
1391 pp_left_paren (cxx_pp
);
1392 if (TREE_OPERAND (t
, 1))
1393 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t
, 1)), flags
);
1394 pp_right_paren (cxx_pp
);
1399 tree fn
= TREE_OPERAND (t
, 0);
1400 tree args
= TREE_OPERAND (t
, 1);
1402 if (TREE_CODE (fn
) == ADDR_EXPR
)
1403 fn
= TREE_OPERAND (fn
, 0);
1405 if (TREE_TYPE (fn
) != NULL_TREE
&& NEXT_CODE (fn
) == METHOD_TYPE
)
1407 tree ob
= TREE_VALUE (args
);
1408 if (TREE_CODE (ob
) == ADDR_EXPR
)
1410 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1413 else if (TREE_CODE (ob
) != PARM_DECL
1414 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1416 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1419 args
= TREE_CHAIN (args
);
1421 dump_expr (fn
, flags
| TFF_EXPR_IN_PARENS
);
1422 pp_left_paren (cxx_pp
);
1423 dump_expr_list (args
, flags
);
1424 pp_right_paren (cxx_pp
);
1430 tree type
= TREE_OPERAND (t
, 1);
1431 tree init
= TREE_OPERAND (t
, 2);
1432 if (NEW_EXPR_USE_GLOBAL (t
))
1433 pp_colon_colon (cxx_pp
);
1434 pp_string (cxx_pp
, "new ");
1435 if (TREE_OPERAND (t
, 0))
1437 pp_left_paren (cxx_pp
);
1438 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1439 pp_string (cxx_pp
, ") ");
1441 if (TREE_CODE (type
) == ARRAY_REF
)
1442 type
= build_cplus_array_type
1443 (TREE_OPERAND (type
, 0),
1444 build_index_type (fold (build (MINUS_EXPR
, integer_type_node
,
1445 TREE_OPERAND (type
, 1),
1446 integer_one_node
))));
1447 dump_type (type
, flags
);
1450 pp_left_paren (cxx_pp
);
1451 if (TREE_CODE (init
) == TREE_LIST
)
1452 dump_expr_list (init
, flags
);
1453 else if (init
== void_zero_node
)
1454 /* This representation indicates an empty initializer,
1455 e.g.: "new int()". */
1458 dump_expr (init
, flags
);
1459 pp_right_paren (cxx_pp
);
1465 /* Note that this only works for G++ target exprs. If somebody
1466 builds a general TARGET_EXPR, there's no way to represent that
1467 it initializes anything other that the parameter slot for the
1468 default argument. Note we may have cleared out the first
1469 operand in expand_expr, so don't go killing ourselves. */
1470 if (TREE_OPERAND (t
, 1))
1471 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1479 case TRUNC_DIV_EXPR
:
1480 case TRUNC_MOD_EXPR
:
1488 case BIT_ANDTC_EXPR
:
1489 case TRUTH_ANDIF_EXPR
:
1490 case TRUTH_ORIF_EXPR
:
1497 case EXACT_DIV_EXPR
:
1498 dump_binary_op (operator_name_info
[(int) TREE_CODE (t
)].name
, t
, flags
);
1502 case FLOOR_DIV_EXPR
:
1503 case ROUND_DIV_EXPR
:
1504 dump_binary_op ("/", t
, flags
);
1508 case FLOOR_MOD_EXPR
:
1509 case ROUND_MOD_EXPR
:
1510 dump_binary_op ("%", t
, flags
);
1515 tree ob
= TREE_OPERAND (t
, 0);
1516 if (TREE_CODE (ob
) == INDIRECT_REF
)
1518 ob
= TREE_OPERAND (ob
, 0);
1519 if (TREE_CODE (ob
) != PARM_DECL
1520 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1522 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1528 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1531 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
1536 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1537 pp_left_bracket (cxx_pp
);
1538 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1539 pp_right_bracket (cxx_pp
);
1543 if (TREE_TYPE (t
) && VOID_TYPE_P (TREE_TYPE (t
)))
1545 pp_left_paren (cxx_pp
);
1546 dump_type (TREE_TYPE (t
), flags
);
1547 pp_right_paren (cxx_pp
);
1548 dump_expr (TREE_OPERAND (t
, 0), flags
);
1551 dump_unary_op ("+", t
, flags
);
1555 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
1556 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
1557 /* An ADDR_EXPR can have reference type. In that case, we
1558 shouldn't print the `&' doing so indicates to the user
1559 that the expression has pointer type. */
1561 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
1562 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1564 dump_unary_op ("&", t
, flags
);
1568 if (TREE_HAS_CONSTRUCTOR (t
))
1570 t
= TREE_OPERAND (t
, 0);
1571 my_friendly_assert (TREE_CODE (t
) == CALL_EXPR
, 237);
1572 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1573 pp_left_paren (cxx_pp
);
1574 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t
, 1)), flags
);
1575 pp_right_paren (cxx_pp
);
1579 if (TREE_OPERAND (t
,0) != NULL_TREE
1580 && TREE_TYPE (TREE_OPERAND (t
, 0))
1581 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
1582 dump_expr (TREE_OPERAND (t
, 0), flags
);
1584 dump_unary_op ("*", t
, flags
);
1590 case TRUTH_NOT_EXPR
:
1591 case PREDECREMENT_EXPR
:
1592 case PREINCREMENT_EXPR
:
1593 dump_unary_op (operator_name_info
[(int)TREE_CODE (t
)].name
, t
, flags
);
1596 case POSTDECREMENT_EXPR
:
1597 case POSTINCREMENT_EXPR
:
1598 pp_left_paren (cxx_pp
);
1599 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1600 pp_identifier (cxx_pp
, operator_name_info
[(int)TREE_CODE (t
)].name
);
1601 pp_right_paren (cxx_pp
);
1604 case NON_LVALUE_EXPR
:
1605 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1606 should be another level of INDIRECT_REF so that I don't have to do
1608 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
1610 tree next
= TREE_TYPE (TREE_TYPE (t
));
1612 while (TREE_CODE (next
) == POINTER_TYPE
)
1613 next
= TREE_TYPE (next
);
1615 if (TREE_CODE (next
) == FUNCTION_TYPE
)
1617 if (flags
& TFF_EXPR_IN_PARENS
)
1618 pp_left_paren (cxx_pp
);
1620 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1621 if (flags
& TFF_EXPR_IN_PARENS
)
1622 pp_right_paren (cxx_pp
);
1627 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1632 tree op
= TREE_OPERAND (t
, 0);
1634 if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
1636 /* It is a cast, but we cannot tell whether it is a
1637 reinterpret or static cast. Use the C style notation. */
1638 if (flags
& TFF_EXPR_IN_PARENS
)
1639 pp_left_paren (cxx_pp
);
1640 pp_left_paren (cxx_pp
);
1641 dump_type (TREE_TYPE (t
), flags
);
1642 pp_right_paren (cxx_pp
);
1643 dump_expr (op
, flags
| TFF_EXPR_IN_PARENS
);
1644 if (flags
& TFF_EXPR_IN_PARENS
)
1645 pp_right_paren (cxx_pp
);
1648 dump_expr (op
, flags
);
1652 case EXPR_WITH_FILE_LOCATION
:
1653 dump_expr (EXPR_WFL_NODE (t
), flags
);
1657 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
1659 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
1661 if (integer_zerop (idx
))
1663 /* A NULL pointer-to-member constant. */
1664 pp_left_paren (cxx_pp
);
1665 pp_left_paren (cxx_pp
);
1666 dump_type (TREE_TYPE (t
), flags
);
1667 pp_right_paren (cxx_pp
);
1668 pp_string (cxx_pp
, ")0)");
1671 else if (host_integerp (idx
, 0))
1674 unsigned HOST_WIDE_INT n
;
1676 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
1677 t
= TYPE_METHOD_BASETYPE (t
);
1678 virtuals
= TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t
));
1680 n
= tree_low_cst (idx
, 0);
1682 /* Map vtable index back one, to allow for the null pointer to
1686 while (n
> 0 && virtuals
)
1689 virtuals
= TREE_CHAIN (virtuals
);
1693 dump_expr (BV_FN (virtuals
),
1694 flags
| TFF_EXPR_IN_PARENS
);
1699 if (TREE_TYPE (t
) && !CONSTRUCTOR_ELTS (t
))
1701 dump_type (TREE_TYPE (t
), 0);
1702 pp_left_paren (cxx_pp
);
1703 pp_right_paren (cxx_pp
);
1707 pp_left_brace (cxx_pp
);
1708 dump_expr_list (CONSTRUCTOR_ELTS (t
), flags
);
1709 pp_right_brace (cxx_pp
);
1716 tree ob
= TREE_OPERAND (t
, 0);
1717 if (is_dummy_object (ob
))
1719 t
= TREE_OPERAND (t
, 1);
1720 if (TREE_CODE (t
) == FUNCTION_DECL
)
1722 dump_expr (t
, flags
| TFF_EXPR_IN_PARENS
);
1723 else if (BASELINK_P (t
))
1724 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
1725 flags
| TFF_EXPR_IN_PARENS
);
1727 dump_decl (t
, flags
);
1731 if (TREE_CODE (ob
) == INDIRECT_REF
)
1733 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1734 pp_string (cxx_pp
, "->*");
1738 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1739 pp_string (cxx_pp
, ".*");
1741 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1746 case TEMPLATE_PARM_INDEX
:
1747 dump_decl (TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
1751 dump_type (TREE_OPERAND (t
, 0), flags
);
1752 pp_colon_colon (cxx_pp
);
1753 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1757 if (TREE_OPERAND (t
, 0) == NULL_TREE
1758 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
1760 dump_type (TREE_TYPE (t
), flags
);
1761 pp_left_paren (cxx_pp
);
1762 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1763 pp_right_paren (cxx_pp
);
1767 pp_left_paren (cxx_pp
);
1768 dump_type (TREE_TYPE (t
), flags
);
1769 pp_string (cxx_pp
, ")(");
1770 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1771 pp_right_paren (cxx_pp
);
1775 case STATIC_CAST_EXPR
:
1776 pp_string (cxx_pp
, "static_cast<");
1778 case REINTERPRET_CAST_EXPR
:
1779 pp_string (cxx_pp
, "reinterpret_cast<");
1781 case CONST_CAST_EXPR
:
1782 pp_string (cxx_pp
, "const_cast<");
1784 case DYNAMIC_CAST_EXPR
:
1785 pp_string (cxx_pp
, "dynamic_cast<");
1787 dump_type (TREE_TYPE (t
), flags
);
1788 pp_string (cxx_pp
, ">(");
1789 dump_expr (TREE_OPERAND (t
, 0), flags
);
1790 pp_right_paren (cxx_pp
);
1794 dump_expr (TREE_OPERAND (t
, 0), flags
);
1800 if (TREE_CODE (t
) == SIZEOF_EXPR
)
1801 pp_string (cxx_pp
, "sizeof (");
1804 my_friendly_assert (TREE_CODE (t
) == ALIGNOF_EXPR
, 0);
1805 pp_string (cxx_pp
, "__alignof__ (");
1807 if (TYPE_P (TREE_OPERAND (t
, 0)))
1808 dump_type (TREE_OPERAND (t
, 0), flags
);
1810 dump_expr (TREE_OPERAND (t
, 0), flags
);
1811 pp_right_paren (cxx_pp
);
1816 pp_identifier (cxx_pp
, operator_name_info
[TREE_CODE (t
)].name
);
1818 dump_expr (TREE_OPERAND (t
, 0), flags
);
1822 pp_identifier (cxx_pp
, "<unparsed>");
1825 case TRY_CATCH_EXPR
:
1826 case WITH_CLEANUP_EXPR
:
1827 case CLEANUP_POINT_EXPR
:
1828 dump_expr (TREE_OPERAND (t
, 0), flags
);
1831 case PSEUDO_DTOR_EXPR
:
1832 dump_expr (TREE_OPERAND (t
, 2), flags
);
1834 dump_type (TREE_OPERAND (t
, 0), flags
);
1835 pp_colon_colon (cxx_pp
);
1836 pp_complement (cxx_pp
);
1837 dump_type (TREE_OPERAND (t
, 1), flags
);
1840 case TEMPLATE_ID_EXPR
:
1841 dump_decl (t
, flags
);
1845 /* We don't yet have a way of dumping statements in a
1846 human-readable format. */
1847 pp_string (cxx_pp
, "({...})");
1851 pp_left_brace (cxx_pp
);
1852 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
1853 pp_right_brace (cxx_pp
);
1857 pp_string (cxx_pp
, "while (1) { ");
1858 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1859 pp_right_brace (cxx_pp
);
1863 pp_string (cxx_pp
, "if (");
1864 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1865 pp_string (cxx_pp
, ") break; ");
1869 dump_expr (get_first_fn (t
), flags
& ~TFF_EXPR_IN_PARENS
);
1872 case EMPTY_CLASS_EXPR
:
1873 dump_type (TREE_TYPE (t
), flags
);
1874 pp_left_paren (cxx_pp
);
1875 pp_right_paren (cxx_pp
);
1878 case NON_DEPENDENT_EXPR
:
1879 dump_expr (TREE_OPERAND (t
, 0), flags
);
1882 /* This list is incomplete, but should suffice for now.
1883 It is very important that `sorry' does not call
1884 `report_error_function'. That could cause an infinite loop. */
1886 pp_unsupported_tree (cxx_pp
, t
);
1887 /* fall through to ERROR_MARK... */
1889 pp_identifier (cxx_pp
, "<expression error>");
1895 dump_binary_op (const char *opstring
, tree t
, int flags
)
1897 pp_left_paren (cxx_pp
);
1898 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1901 pp_identifier (cxx_pp
, opstring
);
1903 pp_identifier (cxx_pp
, "<unknown operator>");
1905 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1906 pp_right_paren (cxx_pp
);
1910 dump_unary_op (const char *opstring
, tree t
, int flags
)
1912 if (flags
& TFF_EXPR_IN_PARENS
)
1913 pp_left_paren (cxx_pp
);
1914 pp_identifier (cxx_pp
, opstring
);
1915 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1916 if (flags
& TFF_EXPR_IN_PARENS
)
1917 pp_right_paren (cxx_pp
);
1920 /* Exported interface to stringifying types, exprs and decls under TFF_*
1924 type_as_string (tree typ
, int flags
)
1926 pp_clear_output_area (cxx_pp
);
1927 dump_type (typ
, flags
);
1928 return pp_formatted_text (cxx_pp
);
1932 expr_as_string (tree decl
, int flags
)
1934 pp_clear_output_area (cxx_pp
);
1935 dump_expr (decl
, flags
);
1936 return pp_formatted_text (cxx_pp
);
1940 decl_as_string (tree decl
, int flags
)
1942 pp_clear_output_area (cxx_pp
);
1943 dump_decl (decl
, flags
);
1944 return pp_formatted_text (cxx_pp
);
1948 context_as_string (tree context
, int flags
)
1950 pp_clear_output_area (cxx_pp
);
1951 dump_scope (context
, flags
);
1952 return pp_formatted_text (cxx_pp
);
1955 /* Generate the three forms of printable names for cxx_printable_name. */
1958 lang_decl_name (tree decl
, int v
)
1961 return decl_as_string (decl
, TFF_DECL_SPECIFIERS
);
1963 pp_clear_output_area (cxx_pp
);
1964 if (v
== 1 && DECL_CLASS_SCOPE_P (decl
))
1966 dump_type (CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
1967 pp_colon_colon (cxx_pp
);
1970 if (TREE_CODE (decl
) == FUNCTION_DECL
)
1971 dump_function_name (decl
, TFF_PLAIN_IDENTIFIER
);
1973 dump_decl (DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
1975 return pp_formatted_text (cxx_pp
);
1979 location_of (tree t
)
1981 if (TREE_CODE (t
) == PARM_DECL
&& DECL_CONTEXT (t
))
1982 t
= DECL_CONTEXT (t
);
1983 else if (TYPE_P (t
))
1984 t
= TYPE_MAIN_DECL (t
);
1985 else if (TREE_CODE (t
) == OVERLOAD
)
1986 t
= OVL_FUNCTION (t
);
1988 return DECL_SOURCE_LOCATION (t
);
1991 /* Now the interfaces from error et al to dump_type et al. Each takes an
1992 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
1996 decl_to_string (tree decl
, int verbose
)
2000 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2001 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2002 flags
= TFF_CLASS_KEY_OR_ENUM
;
2004 flags
|= TFF_DECL_SPECIFIERS
;
2005 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2006 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2007 flags
|= TFF_TEMPLATE_HEADER
;
2009 pp_clear_output_area (cxx_pp
);
2010 dump_decl (decl
, flags
);
2011 return pp_formatted_text (cxx_pp
);
2015 expr_to_string (tree decl
)
2017 pp_clear_output_area (cxx_pp
);
2018 dump_expr (decl
, 0);
2019 return pp_formatted_text (cxx_pp
);
2023 fndecl_to_string (tree fndecl
, int verbose
)
2027 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
;
2029 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2030 pp_clear_output_area (cxx_pp
);
2031 dump_decl (fndecl
, flags
);
2032 return pp_formatted_text (cxx_pp
);
2037 code_to_string (enum tree_code c
)
2039 return tree_code_name
[c
];
2043 language_to_string (enum languages c
)
2050 case lang_cplusplus
:
2062 /* Return the proper printed version of a parameter to a C++ function. */
2065 parm_to_string (int p
)
2067 pp_clear_output_area (cxx_pp
);
2069 pp_string (cxx_pp
, "'this'");
2071 pp_decimal_int (cxx_pp
, p
+ 1);
2072 return pp_formatted_text (cxx_pp
);
2076 op_to_string (enum tree_code p
)
2078 tree id
= operator_name_info
[(int) p
].identifier
;
2079 return id
? IDENTIFIER_POINTER (id
) : "<unknown>";
2083 type_to_string (tree typ
, int verbose
)
2087 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2088 flags
|= TFF_TEMPLATE_HEADER
;
2090 pp_clear_output_area (cxx_pp
);
2091 dump_type (typ
, flags
);
2092 return pp_formatted_text (cxx_pp
);
2096 assop_to_string (enum tree_code p
)
2098 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
2099 return id
? IDENTIFIER_POINTER (id
) : "{unknown}";
2103 args_to_string (tree p
, int verbose
)
2107 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2112 if (TYPE_P (TREE_VALUE (p
)))
2113 return type_as_string (p
, flags
);
2115 pp_clear_output_area (cxx_pp
);
2116 for (; p
; p
= TREE_CHAIN (p
))
2118 if (TREE_VALUE (p
) == null_node
)
2119 pp_identifier (cxx_pp
, "NULL");
2121 dump_type (error_type (TREE_VALUE (p
)), flags
);
2123 pp_separate_with_comma (cxx_pp
);
2125 return pp_formatted_text (cxx_pp
);
2129 cv_to_string (tree p
, int v
)
2131 pp_clear_output_area (cxx_pp
);
2132 dump_qualifiers (p
, v
? before
: none
);
2133 return pp_formatted_text (cxx_pp
);
2136 /* Langhook for print_error_function. */
2138 cxx_print_error_function (diagnostic_context
*context
, const char *file
)
2140 lhd_print_error_function (context
, file
);
2141 pp_base_set_prefix (context
->printer
, file
);
2142 maybe_print_instantiation_context (context
);
2146 cp_diagnostic_starter (diagnostic_context
*context
,
2147 diagnostic_info
*diagnostic
)
2149 diagnostic_report_current_module (context
);
2150 cp_print_error_function (context
, diagnostic
);
2151 maybe_print_instantiation_context (context
);
2152 pp_base_set_prefix (context
->printer
, diagnostic_build_prefix (diagnostic
));
2156 cp_diagnostic_finalizer (diagnostic_context
*context
,
2157 diagnostic_info
*diagnostic ATTRIBUTE_UNUSED
)
2159 pp_base_destroy_prefix (context
->printer
);
2162 /* Print current function onto BUFFER, in the process of reporting
2163 a diagnostic message. Called from cp_diagnostic_starter. */
2165 cp_print_error_function (diagnostic_context
*context
,
2166 diagnostic_info
*diagnostic
)
2168 if (diagnostic_last_function_changed (context
))
2170 const char *old_prefix
= context
->printer
->prefix
;
2171 char *new_prefix
= diagnostic
->location
.file
2172 ? file_name_as_prefix (diagnostic
->location
.file
)
2175 pp_base_set_prefix (context
->printer
, new_prefix
);
2177 if (current_function_decl
== NULL
)
2178 pp_base_string (context
->printer
, "At global scope:");
2180 pp_printf (context
->printer
, "In %s `%s':",
2181 function_category (current_function_decl
),
2182 cxx_printable_name (current_function_decl
, 2));
2183 pp_base_newline (context
->printer
);
2185 diagnostic_set_last_function (context
);
2186 pp_base_destroy_prefix (context
->printer
);
2187 context
->printer
->prefix
= old_prefix
;
2191 /* Returns a description of FUNCTION using standard terminology. */
2193 function_category (tree fn
)
2195 if (DECL_FUNCTION_MEMBER_P (fn
))
2197 if (DECL_STATIC_FUNCTION_P (fn
))
2198 return "static member function";
2199 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
2200 return "copy constructor";
2201 else if (DECL_CONSTRUCTOR_P (fn
))
2202 return "constructor";
2203 else if (DECL_DESTRUCTOR_P (fn
))
2204 return "destructor";
2206 return "member function";
2212 /* Report the full context of a current template instantiation,
2215 print_instantiation_full_context (diagnostic_context
*context
)
2217 tree p
= current_instantiation ();
2218 location_t location
= input_location
;
2222 if (current_function_decl
!= TINST_DECL (p
)
2223 && current_function_decl
!= NULL_TREE
)
2224 /* We can get here during the processing of some synthesized
2225 method. Then, TINST_DECL (p) will be the function that's causing
2230 if (current_function_decl
== TINST_DECL (p
))
2231 /* Avoid redundancy with the the "In function" line. */;
2233 pp_verbatim (context
->printer
,
2234 "%s: In instantiation of `%s':\n", location
.file
,
2235 decl_as_string (TINST_DECL (p
),
2236 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2238 location
.line
= TINST_LINE (p
);
2239 location
.file
= TINST_FILE (p
);
2244 print_instantiation_partial_context (context
, p
, location
);
2247 /* Same as above but less verbose. */
2249 print_instantiation_partial_context (diagnostic_context
*context
,
2250 tree t
, location_t loc
)
2252 for (; t
; t
= TREE_CHAIN (t
))
2254 pp_verbatim (context
->printer
, "%s:%d: instantiated from `%s'\n",
2256 decl_as_string (TINST_DECL (t
),
2257 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2258 loc
.line
= TINST_LINE (t
);
2259 loc
.file
= TINST_FILE (t
);
2261 pp_verbatim (context
->printer
, "%s:%d: instantiated from here\n",
2262 loc
.file
, loc
.line
);
2265 /* Called from cp_thing to print the template context for an error. */
2267 maybe_print_instantiation_context (diagnostic_context
*context
)
2269 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2272 record_last_problematic_instantiation ();
2273 print_instantiation_full_context (context
);
2276 /* Report the bare minimum context of a template instantiation. */
2278 print_instantiation_context (void)
2280 print_instantiation_partial_context
2281 (global_dc
, current_instantiation (), input_location
);
2282 diagnostic_flush_buffer (global_dc
);
2285 /* Called from output_format -- during diagnostic message processing --
2286 to handle C++ specific format specifier with the following meanings:
2287 %A function argument-list.
2291 %F function declaration.
2292 %L language as used in extern "lang".
2294 %P function parameter whose position is indicated by an integer.
2295 %Q assignment operator.
2299 cp_printer (pretty_printer
*pp
, text_info
*text
)
2303 #define next_tree va_arg (*text->args_ptr, tree)
2304 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2305 #define next_lang va_arg (*text->args_ptr, enum languages)
2306 #define next_int va_arg (*text->args_ptr, int)
2308 if (*text
->format_spec
== '+')
2309 ++text
->format_spec
;
2310 if (*text
->format_spec
== '#')
2313 ++text
->format_spec
;
2316 switch (*text
->format_spec
)
2318 case 'A': result
= args_to_string (next_tree
, verbose
); break;
2319 case 'C': result
= code_to_string (next_tcode
); break;
2320 case 'D': result
= decl_to_string (next_tree
, verbose
); break;
2321 case 'E': result
= expr_to_string (next_tree
); break;
2322 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
2323 case 'L': result
= language_to_string (next_lang
); break;
2324 case 'O': result
= op_to_string (next_tcode
); break;
2325 case 'P': result
= parm_to_string (next_int
); break;
2326 case 'Q': result
= assop_to_string (next_tcode
); break;
2327 case 'T': result
= type_to_string (next_tree
, verbose
); break;
2328 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
2334 pp_base_string (pp
, result
);
2343 pp_non_consecutive_character (cxx_pretty_printer
*pp
, int c
)
2345 const char *p
= pp_last_position_in_text (pp
);
2347 if (p
!= NULL
&& *p
== c
)
2349 pp_character (pp
, c
);
2352 /* These are temporary wrapper functions which handle the historic
2353 behavior of cp_*_at. */
2356 locate_error (const char *msgid
, va_list ap
)
2362 for (f
= msgid
; *f
; f
++)
2375 /* Just ignore these possibilities. */
2378 case 'd': (void) va_arg (ap
, int); break;
2379 case 's': (void) va_arg (ap
, char *); break;
2380 case 'L': (void) va_arg (ap
, enum languages
); break;
2383 case 'Q': (void) va_arg (ap
, enum tree_code
); break;
2385 /* These take a tree, which may be where the error is
2393 t
= va_arg (ap
, tree
);
2399 errorcount
= 0; /* damn ICE suppression */
2400 internal_error ("unexpected letter `%c' in locate_error\n", *f
);
2406 here
= va_arg (ap
, tree
);
2413 cp_error_at (const char *msgid
, ...)
2416 diagnostic_info diagnostic
;
2419 va_start (ap
, msgid
);
2420 here
= locate_error (msgid
, ap
);
2423 va_start (ap
, msgid
);
2424 diagnostic_set_info (&diagnostic
, msgid
, &ap
,
2425 location_of (here
), DK_ERROR
);
2426 report_diagnostic (&diagnostic
);
2431 cp_warning_at (const char *msgid
, ...)
2434 diagnostic_info diagnostic
;
2437 va_start (ap
, msgid
);
2438 here
= locate_error (msgid
, ap
);
2441 va_start (ap
, msgid
);
2442 diagnostic_set_info (&diagnostic
, msgid
, &ap
,
2443 location_of (here
), DK_WARNING
);
2444 report_diagnostic (&diagnostic
);
2449 cp_pedwarn_at (const char *msgid
, ...)
2452 diagnostic_info diagnostic
;
2455 va_start (ap
, msgid
);
2456 here
= locate_error (msgid
, ap
);
2459 va_start (ap
, msgid
);
2460 diagnostic_set_info (&diagnostic
, msgid
, &ap
,
2461 location_of (here
), pedantic_error_kind());
2462 report_diagnostic (&diagnostic
);