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, 2004, 2005, 2006, 2007, 2008 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 3, 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 COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
30 #include "diagnostic.h"
31 #include "langhooks-def.h"
32 #include "cxx-pretty-print.h"
34 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
36 /* The global buffer where we dump everything. It is there only for
37 transitional purpose. It is expected, in the near future, to be
38 completely removed. */
39 static cxx_pretty_printer scratch_pretty_printer;
40 #define cxx_pp (&scratch_pretty_printer)
42 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
44 static const char *args_to_string (tree, int);
45 static const char *assop_to_string (enum tree_code);
46 static const char *code_to_string (enum tree_code);
47 static const char *cv_to_string (tree, int);
48 static const char *decl_to_string (tree, int);
49 static const char *expr_to_string (tree);
50 static const char *fndecl_to_string (tree, int);
51 static const char *op_to_string (enum tree_code);
52 static const char *parm_to_string (int);
53 static const char *type_to_string (tree, int);
55 static void dump_type (tree, int);
56 static void dump_typename (tree, int);
57 static void dump_simple_decl (tree, tree, int);
58 static void dump_decl (tree, int);
59 static void dump_template_decl (tree, int);
60 static void dump_function_decl (tree, int);
61 static void dump_expr (tree, int);
62 static void dump_unary_op (const char *, tree, int);
63 static void dump_binary_op (const char *, tree, int);
64 static void dump_aggr_type (tree, int);
65 static void dump_type_prefix (tree, int);
66 static void dump_type_suffix (tree, int);
67 static void dump_function_name (tree, int);
68 static void dump_call_expr_args (tree, int, bool);
69 static void dump_aggr_init_expr_args (tree, int, bool);
70 static void dump_expr_list (tree, int);
71 static void dump_global_iord (tree);
72 static void dump_parameters (tree, int);
73 static void dump_exception_spec (tree, int);
74 static void dump_template_argument (tree, int);
75 static void dump_template_argument_list (tree, int);
76 static void dump_template_parameter (tree, int);
77 static void dump_template_bindings (tree, tree);
78 static void dump_scope (tree, int);
79 static void dump_template_parms (tree, int, int);
81 static const char *function_category (tree);
82 static void maybe_print_instantiation_context (diagnostic_context *);
83 static void print_instantiation_full_context (diagnostic_context *);
84 static void print_instantiation_partial_context (diagnostic_context *,
87 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
88 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
89 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
91 static bool cp_printer (pretty_printer *, text_info *, const char *,
92 int, bool, bool, bool);
93 static location_t location_of (tree);
98 diagnostic_starter (global_dc) = cp_diagnostic_starter;
99 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
100 diagnostic_format_decoder (global_dc) = cp_printer;
102 pp_construct (pp_base (cxx_pp), NULL, 0);
103 pp_cxx_pretty_printer_init (cxx_pp);
106 /* Dump a scope, if deemed necessary. */
109 dump_scope (tree scope, int flags)
111 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
113 if (scope == NULL_TREE)
116 if (TREE_CODE (scope) == NAMESPACE_DECL)
118 if (scope != global_namespace)
120 dump_decl (scope, f);
121 pp_cxx_colon_colon (cxx_pp);
124 else if (AGGREGATE_TYPE_P (scope))
126 dump_type (scope, f);
127 pp_cxx_colon_colon (cxx_pp);
129 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
131 dump_function_decl (scope, f);
132 pp_cxx_colon_colon (cxx_pp);
136 /* Dump the template ARGument under control of FLAGS. */
139 dump_template_argument (tree arg, int flags)
141 if (ARGUMENT_PACK_P (arg))
142 dump_template_argument_list (ARGUMENT_PACK_ARGS (arg), flags);
143 else if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
144 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
147 if (TREE_CODE (arg) == TREE_LIST)
148 arg = TREE_VALUE (arg);
150 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
154 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
158 dump_template_argument_list (tree args, int flags)
160 int n = TREE_VEC_LENGTH (args);
164 for (i = 0; i< n; ++i)
166 tree arg = TREE_VEC_ELT (args, i);
168 /* Only print a comma if we know there is an argument coming. In
169 the case of an empty template argument pack, no actual
170 argument will be printed. */
172 && (!ARGUMENT_PACK_P (arg)
173 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
174 pp_separate_with_comma (cxx_pp);
176 dump_template_argument (arg, flags);
181 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
184 dump_template_parameter (tree parm, int flags)
189 if (parm == error_mark_node)
192 p = TREE_VALUE (parm);
193 a = TREE_PURPOSE (parm);
195 if (TREE_CODE (p) == TYPE_DECL)
197 if (flags & TFF_DECL_SPECIFIERS)
199 pp_cxx_identifier (cxx_pp, "class");
200 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
201 pp_cxx_identifier (cxx_pp, "...");
203 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
205 else if (DECL_NAME (p))
206 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
208 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
211 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
213 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
215 pp_cxx_whitespace (cxx_pp);
217 pp_cxx_whitespace (cxx_pp);
218 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
219 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
221 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
225 /* Dump, under control of FLAGS, a template-parameter-list binding.
226 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
230 dump_template_bindings (tree parms, tree args)
236 tree p = TREE_VALUE (parms);
237 int lvl = TMPL_PARMS_DEPTH (parms);
241 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
243 tree arg = NULL_TREE;
245 /* Don't crash if we had an invalid argument list. */
246 if (TMPL_ARGS_DEPTH (args) >= lvl)
248 tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
249 if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
250 arg = TREE_VEC_ELT (lvl_args, arg_idx);
254 pp_separate_with_comma (cxx_pp);
255 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
256 pp_cxx_whitespace (cxx_pp);
258 pp_cxx_whitespace (cxx_pp);
260 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
262 pp_identifier (cxx_pp, "<missing>");
268 parms = TREE_CHAIN (parms);
272 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
276 dump_type (tree t, int flags)
281 if (TYPE_PTRMEMFUNC_P (t))
284 switch (TREE_CODE (t))
287 if (t == init_list_type_node)
288 pp_identifier (cxx_pp, "<brace-enclosed initializer list>");
290 pp_identifier (cxx_pp, "<unresolved overloaded function type>");
294 /* A list of function parms. */
295 dump_parameters (t, flags);
298 case IDENTIFIER_NODE:
299 pp_cxx_tree_identifier (cxx_pp, t);
303 dump_type (BINFO_TYPE (t), flags);
309 dump_aggr_type (t, flags);
313 if (flags & TFF_CHASE_TYPEDEF)
315 dump_type (DECL_ORIGINAL_TYPE (t)
316 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
319 /* Else fall through. */
323 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
332 case FIXED_POINT_TYPE:
333 pp_type_specifier_seq (cxx_pp, t);
336 case TEMPLATE_TEMPLATE_PARM:
337 /* For parameters inside template signature. */
338 if (TYPE_IDENTIFIER (t))
339 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
341 pp_cxx_canonical_template_parameter (cxx_pp, t);
344 case BOUND_TEMPLATE_TEMPLATE_PARM:
346 tree args = TYPE_TI_ARGS (t);
347 pp_cxx_cv_qualifier_seq (cxx_pp, t);
348 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
349 pp_cxx_begin_template_argument_list (cxx_pp);
350 dump_template_argument_list (args, flags);
351 pp_cxx_end_template_argument_list (cxx_pp);
355 case TEMPLATE_TYPE_PARM:
356 pp_cxx_cv_qualifier_seq (cxx_pp, t);
357 if (TYPE_IDENTIFIER (t))
358 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
360 pp_cxx_canonical_template_parameter
361 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
364 /* This is not always necessary for pointers and such, but doing this
365 reduces code size. */
374 dump_type_prefix (t, flags);
375 dump_type_suffix (t, flags);
379 pp_cxx_cv_qualifier_seq (cxx_pp, t);
380 pp_cxx_identifier (cxx_pp,
381 TYPENAME_IS_ENUM_P (t) ? "enum"
382 : TYPENAME_IS_CLASS_P (t) ? "class"
384 dump_typename (t, flags);
387 case UNBOUND_CLASS_TEMPLATE:
388 dump_type (TYPE_CONTEXT (t), flags);
389 pp_cxx_colon_colon (cxx_pp);
390 pp_cxx_identifier (cxx_pp, "template");
391 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
395 pp_cxx_identifier (cxx_pp, "__typeof__");
396 pp_cxx_whitespace (cxx_pp);
397 pp_cxx_left_paren (cxx_pp);
398 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
399 pp_cxx_right_paren (cxx_pp);
402 case TYPE_PACK_EXPANSION:
403 dump_type (PACK_EXPANSION_PATTERN (t), flags);
404 pp_cxx_identifier (cxx_pp, "...");
407 case TYPE_ARGUMENT_PACK:
408 dump_template_argument (t, flags);
412 pp_cxx_identifier (cxx_pp, "decltype");
413 pp_cxx_whitespace (cxx_pp);
414 pp_cxx_left_paren (cxx_pp);
415 dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
416 pp_cxx_right_paren (cxx_pp);
420 pp_unsupported_tree (cxx_pp, t);
421 /* Fall through to error. */
424 pp_identifier (cxx_pp, "<type error>");
429 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
433 dump_typename (tree t, int flags)
435 tree ctx = TYPE_CONTEXT (t);
437 if (TREE_CODE (ctx) == TYPENAME_TYPE)
438 dump_typename (ctx, flags);
440 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
441 pp_cxx_colon_colon (cxx_pp);
442 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
445 /* Return the name of the supplied aggregate, or enumeral type. */
448 class_key_or_enum_as_string (tree t)
450 if (TREE_CODE (t) == ENUMERAL_TYPE)
452 else if (TREE_CODE (t) == UNION_TYPE)
454 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
460 /* Print out a class declaration T under the control of FLAGS,
461 in the form `class foo'. */
464 dump_aggr_type (tree t, int flags)
467 const char *variety = class_key_or_enum_as_string (t);
471 pp_cxx_cv_qualifier_seq (cxx_pp, t);
473 if (flags & TFF_CLASS_KEY_OR_ENUM)
474 pp_cxx_identifier (cxx_pp, variety);
476 if (flags & TFF_CHASE_TYPEDEF)
477 t = TYPE_MAIN_VARIANT (t);
479 name = TYPE_NAME (t);
483 typdef = !DECL_ARTIFICIAL (name);
484 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
485 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
486 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
487 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
489 if (! (flags & TFF_UNQUALIFIED_NAME))
490 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
491 flags &= ~TFF_UNQUALIFIED_NAME;
494 /* Because the template names are mangled, we have to locate
495 the most general template, and use that name. */
496 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
498 while (DECL_TEMPLATE_INFO (tpl))
499 tpl = DECL_TI_TEMPLATE (tpl);
502 name = DECL_NAME (name);
505 if (name == 0 || ANON_AGGRNAME_P (name))
507 if (flags & TFF_CLASS_KEY_OR_ENUM)
508 pp_identifier (cxx_pp, "<anonymous>");
510 pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
513 pp_cxx_tree_identifier (cxx_pp, name);
515 dump_template_parms (TYPE_TEMPLATE_INFO (t),
516 !CLASSTYPE_USE_TEMPLATE (t),
517 flags & ~TFF_TEMPLATE_HEADER);
520 /* Dump into the obstack the initial part of the output for a given type.
521 This is necessary when dealing with things like functions returning
524 return type of `int (* fee ())()': pointer -> function -> int. Both
525 pointer (and reference and offset) and function (and member) types must
526 deal with prefix and suffix.
528 Arrays must also do this for DECL nodes, like int a[], and for things like
532 dump_type_prefix (tree t, int flags)
534 if (TYPE_PTRMEMFUNC_P (t))
536 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
540 switch (TREE_CODE (t))
545 tree sub = TREE_TYPE (t);
547 dump_type_prefix (sub, flags);
548 if (TREE_CODE (sub) == ARRAY_TYPE)
550 pp_cxx_whitespace (cxx_pp);
551 pp_cxx_left_paren (cxx_pp);
553 if (TREE_CODE (t) == POINTER_TYPE)
554 pp_character(cxx_pp, '*');
555 else if (TREE_CODE (t) == REFERENCE_TYPE)
557 if (TYPE_REF_IS_RVALUE (t))
558 pp_string (cxx_pp, "&&");
560 pp_character (cxx_pp, '&');
562 pp_base (cxx_pp)->padding = pp_before;
563 pp_cxx_cv_qualifier_seq (cxx_pp, t);
569 dump_type_prefix (TREE_TYPE (t), flags);
570 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
572 pp_maybe_space (cxx_pp);
573 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
574 pp_cxx_left_paren (cxx_pp);
575 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
576 pp_cxx_colon_colon (cxx_pp);
578 pp_cxx_star (cxx_pp);
579 pp_cxx_cv_qualifier_seq (cxx_pp, t);
580 pp_base (cxx_pp)->padding = pp_before;
583 /* Can only be reached through function pointer -- this would not be
584 correct if FUNCTION_DECLs used it. */
586 dump_type_prefix (TREE_TYPE (t), flags);
587 pp_maybe_space (cxx_pp);
588 pp_cxx_left_paren (cxx_pp);
592 dump_type_prefix (TREE_TYPE (t), flags);
593 pp_maybe_space (cxx_pp);
594 pp_cxx_left_paren (cxx_pp);
595 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
596 pp_cxx_colon_colon (cxx_pp);
600 dump_type_prefix (TREE_TYPE (t), flags);
604 case IDENTIFIER_NODE:
609 case TEMPLATE_TYPE_PARM:
610 case TEMPLATE_TEMPLATE_PARM:
611 case BOUND_TEMPLATE_TEMPLATE_PARM:
623 case TYPE_PACK_EXPANSION:
624 dump_type (t, flags);
625 pp_base (cxx_pp)->padding = pp_before;
629 pp_unsupported_tree (cxx_pp, t);
632 pp_identifier (cxx_pp, "<typeprefixerror>");
637 /* Dump the suffix of type T, under control of FLAGS. This is the part
638 which appears after the identifier (or function parms). */
641 dump_type_suffix (tree t, int flags)
643 if (TYPE_PTRMEMFUNC_P (t))
644 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
646 switch (TREE_CODE (t))
651 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
652 pp_cxx_right_paren (cxx_pp);
653 dump_type_suffix (TREE_TYPE (t), flags);
656 /* Can only be reached through function pointer. */
661 pp_cxx_right_paren (cxx_pp);
662 arg = TYPE_ARG_TYPES (t);
663 if (TREE_CODE (t) == METHOD_TYPE)
664 arg = TREE_CHAIN (arg);
666 /* Function pointers don't have default args. Not in standard C++,
667 anyway; they may in g++, but we'll just pretend otherwise. */
668 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
670 if (TREE_CODE (t) == METHOD_TYPE)
671 pp_cxx_cv_qualifier_seq
672 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
674 pp_cxx_cv_qualifier_seq(cxx_pp, t);
675 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
676 dump_type_suffix (TREE_TYPE (t), flags);
681 pp_maybe_space (cxx_pp);
682 pp_cxx_left_bracket (cxx_pp);
685 tree dtype = TYPE_DOMAIN (t);
686 tree max = TYPE_MAX_VALUE (dtype);
687 if (host_integerp (max, 0))
688 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
689 else if (TREE_CODE (max) == MINUS_EXPR)
690 dump_expr (TREE_OPERAND (max, 0),
691 flags & ~TFF_EXPR_IN_PARENS);
693 dump_expr (fold_build2 (PLUS_EXPR, dtype, max,
694 build_int_cst (dtype, 1)),
695 flags & ~TFF_EXPR_IN_PARENS);
697 pp_cxx_right_bracket (cxx_pp);
698 dump_type_suffix (TREE_TYPE (t), flags);
702 case IDENTIFIER_NODE:
707 case TEMPLATE_TYPE_PARM:
708 case TEMPLATE_TEMPLATE_PARM:
709 case BOUND_TEMPLATE_TEMPLATE_PARM:
721 case TYPE_PACK_EXPANSION:
725 pp_unsupported_tree (cxx_pp, t);
727 /* Don't mark it here, we should have already done in
734 dump_global_iord (tree t)
736 const char *p = NULL;
738 if (DECL_GLOBAL_CTOR_P (t))
740 else if (DECL_GLOBAL_DTOR_P (t))
745 pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
749 dump_simple_decl (tree t, tree type, int flags)
751 if (flags & TFF_DECL_SPECIFIERS)
753 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
754 pp_maybe_space (cxx_pp);
756 if (! (flags & TFF_UNQUALIFIED_NAME)
757 && (!DECL_INITIAL (t)
758 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
759 dump_scope (CP_DECL_CONTEXT (t), flags);
760 flags &= ~TFF_UNQUALIFIED_NAME;
761 if ((flags & TFF_DECL_SPECIFIERS)
762 && DECL_TEMPLATE_PARM_P (t)
763 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
764 pp_identifier (cxx_pp, "...");
766 dump_decl (DECL_NAME (t), flags);
768 pp_identifier (cxx_pp, "<anonymous>");
769 if (flags & TFF_DECL_SPECIFIERS)
770 dump_type_suffix (type, flags);
773 /* Dump a human readable string for the decl T under control of FLAGS. */
776 dump_decl (tree t, int flags)
781 switch (TREE_CODE (t))
784 /* Don't say 'typedef class A' */
785 if (DECL_ARTIFICIAL (t))
787 if ((flags & TFF_DECL_SPECIFIERS)
788 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
790 /* Say `class T' not just `T'. */
791 pp_cxx_identifier (cxx_pp, "class");
793 /* Emit the `...' for a parameter pack. */
794 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
795 pp_cxx_identifier (cxx_pp, "...");
798 dump_type (TREE_TYPE (t), flags);
801 if (flags & TFF_DECL_SPECIFIERS)
802 pp_cxx_identifier (cxx_pp, "typedef");
803 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
804 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
809 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
811 pp_string (cxx_pp, "vtable for ");
812 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
813 dump_type (DECL_CONTEXT (t), flags);
816 /* Else fall through. */
819 dump_simple_decl (t, TREE_TYPE (t), flags);
823 pp_string (cxx_pp, "<return value> ");
824 dump_simple_decl (t, TREE_TYPE (t), flags);
828 if (flags & TFF_DECL_SPECIFIERS)
829 pp_cxx_declaration (cxx_pp, t);
832 if (! (flags & TFF_UNQUALIFIED_NAME))
833 dump_scope (CP_DECL_CONTEXT (t), flags);
834 flags &= ~TFF_UNQUALIFIED_NAME;
835 if (DECL_NAME (t) == NULL_TREE)
836 pp_identifier (cxx_pp, "<unnamed>");
838 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
843 pp_expression (cxx_pp, t);
847 dump_decl (TREE_OPERAND (t, 0), flags);
848 pp_cxx_left_bracket (cxx_pp);
849 dump_decl (TREE_OPERAND (t, 1), flags);
850 pp_cxx_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_cxx_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_cxx_identifier (cxx_pp, "operator");
877 /* Not exactly IDENTIFIER_TYPE_VALUE. */
878 dump_type (TREE_TYPE (t), flags);
882 pp_cxx_tree_identifier (cxx_pp, t);
889 if (DECL_CLASS_SCOPE_P (t))
891 dump_type (DECL_CONTEXT (t), flags);
892 pp_cxx_colon_colon (cxx_pp);
894 else if (DECL_CONTEXT (t))
896 dump_decl (DECL_CONTEXT (t), flags);
897 pp_cxx_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_LANG_SPECIFIC (t))
910 pp_identifier (cxx_pp, "<built-in>");
911 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
912 dump_global_iord (t);
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_cxx_begin_template_argument_list (cxx_pp);
929 if (TREE_OPERAND (t, 1))
930 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
931 pp_cxx_end_template_argument_list (cxx_pp);
936 pp_cxx_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_cxx_identifier (cxx_pp, "using");
954 dump_type (USING_DECL_SCOPE (t), flags);
955 pp_cxx_colon_colon (cxx_pp);
956 dump_decl (DECL_NAME (t), flags);
960 pp_cxx_declaration (cxx_pp, t);
964 dump_decl (BASELINK_FUNCTIONS (t), flags);
967 case NON_DEPENDENT_EXPR:
968 dump_expr (t, flags);
971 case TEMPLATE_TYPE_PARM:
972 if (flags & TFF_DECL_SPECIFIERS)
973 pp_cxx_declaration (cxx_pp, t);
975 pp_type_id (cxx_pp, t);
978 case UNBOUND_CLASS_TEMPLATE:
979 case TYPE_PACK_EXPANSION:
981 dump_type (t, flags);
985 pp_unsupported_tree (cxx_pp, t);
986 /* Fall through to error. */
989 pp_identifier (cxx_pp, "<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 pp_cxx_identifier (cxx_pp, "template");
1014 pp_cxx_begin_template_argument_list (cxx_pp);
1016 /* If we've shown the template prefix, we'd better show the
1017 parameters' and decl's type too. */
1018 flags |= TFF_DECL_SPECIFIERS;
1020 for (i = 0; i < len; i++)
1023 pp_separate_with_comma (cxx_pp);
1024 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1026 pp_cxx_end_template_argument_list (cxx_pp);
1027 pp_cxx_whitespace (cxx_pp);
1029 nreverse(orig_parms);
1031 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1033 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1034 pp_cxx_identifier (cxx_pp, "class");
1036 /* If this is a parameter pack, print the ellipsis. */
1037 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1038 pp_cxx_identifier (cxx_pp, "...");
1042 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1043 dump_type (TREE_TYPE (t),
1044 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1045 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1046 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1047 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1050 gcc_assert (TREE_TYPE (t));
1051 switch (NEXT_CODE (t))
1055 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1058 /* This case can occur with some invalid code. */
1059 dump_type (TREE_TYPE (t),
1060 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1061 | (flags & TFF_DECL_SPECIFIERS
1062 ? TFF_CLASS_KEY_OR_ENUM : 0));
1067 /* Pretty print a function decl. There are several ways we want to print a
1068 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1069 As error can only apply the '#' flag once to give 0 and 1 for V, there
1070 is %D which doesn't print the throw specs, and %F which does. */
1073 dump_function_decl (tree t, int flags)
1077 tree cname = NULL_TREE;
1078 tree template_args = NULL_TREE;
1079 tree template_parms = NULL_TREE;
1080 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1081 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1083 flags &= ~TFF_UNQUALIFIED_NAME;
1084 if (TREE_CODE (t) == TEMPLATE_DECL)
1085 t = DECL_TEMPLATE_RESULT (t);
1087 /* Pretty print template instantiations only. */
1088 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1092 template_args = DECL_TI_ARGS (t);
1093 tmpl = most_general_template (t);
1094 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1096 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1101 fntype = TREE_TYPE (t);
1102 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1104 if (DECL_CLASS_SCOPE_P (t))
1105 cname = DECL_CONTEXT (t);
1106 /* This is for partially instantiated template methods. */
1107 else if (TREE_CODE (fntype) == METHOD_TYPE)
1108 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1110 if (!(flags & TFF_DECL_SPECIFIERS))
1112 else if (DECL_STATIC_FUNCTION_P (t))
1113 pp_cxx_identifier (cxx_pp, "static");
1114 else if (DECL_VIRTUAL_P (t))
1115 pp_cxx_identifier (cxx_pp, "virtual");
1117 /* Print the return type? */
1119 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1120 && !DECL_DESTRUCTOR_P (t);
1122 dump_type_prefix (TREE_TYPE (fntype), flags);
1124 /* Print the function name. */
1125 if (!do_outer_scope)
1129 dump_type (cname, flags);
1130 pp_cxx_colon_colon (cxx_pp);
1133 dump_scope (CP_DECL_CONTEXT (t), flags);
1135 dump_function_name (t, flags);
1137 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1139 dump_parameters (parmtypes, flags);
1141 if (TREE_CODE (fntype) == METHOD_TYPE)
1143 pp_base (cxx_pp)->padding = pp_before;
1144 pp_cxx_cv_qualifier_seq
1145 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1148 if (flags & TFF_EXCEPTION_SPECIFICATION)
1150 pp_base (cxx_pp)->padding = pp_before;
1151 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1155 dump_type_suffix (TREE_TYPE (fntype), flags);
1158 /* If T is a template instantiation, dump the parameter binding. */
1159 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1161 pp_cxx_whitespace (cxx_pp);
1162 pp_cxx_left_bracket (cxx_pp);
1163 pp_cxx_identifier (cxx_pp, "with");
1164 pp_cxx_whitespace (cxx_pp);
1165 dump_template_bindings (template_parms, template_args);
1166 pp_cxx_right_bracket (cxx_pp);
1170 /* Print a parameter list. If this is for a member function, the
1171 member object ptr (and any other hidden args) should have
1172 already been removed. */
1175 dump_parameters (tree parmtypes, int flags)
1178 pp_cxx_left_paren (cxx_pp);
1180 for (first = 1; parmtypes != void_list_node;
1181 parmtypes = TREE_CHAIN (parmtypes))
1184 pp_separate_with_comma (cxx_pp);
1188 pp_cxx_identifier (cxx_pp, "...");
1192 dump_type (TREE_VALUE (parmtypes), flags);
1194 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1196 pp_cxx_whitespace (cxx_pp);
1198 pp_cxx_whitespace (cxx_pp);
1199 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1203 pp_cxx_right_paren (cxx_pp);
1206 /* Print an exception specification. T is the exception specification. */
1209 dump_exception_spec (tree t, int flags)
1213 pp_cxx_identifier (cxx_pp, "throw");
1214 pp_cxx_whitespace (cxx_pp);
1215 pp_cxx_left_paren (cxx_pp);
1216 if (TREE_VALUE (t) != NULL_TREE)
1219 dump_type (TREE_VALUE (t), flags);
1223 pp_separate_with_comma (cxx_pp);
1225 pp_cxx_right_paren (cxx_pp);
1229 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1230 and destructors properly. */
1233 dump_function_name (tree t, int flags)
1235 tree name = DECL_NAME (t);
1237 /* We can get here with a decl that was synthesized by language-
1238 independent machinery (e.g. coverage.c) in which case it won't
1239 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1240 will crash. In this case it is safe just to print out the
1242 if (!DECL_LANG_SPECIFIC (t))
1244 pp_cxx_tree_identifier (cxx_pp, name);
1248 if (TREE_CODE (t) == TEMPLATE_DECL)
1249 t = DECL_TEMPLATE_RESULT (t);
1251 /* Don't let the user see __comp_ctor et al. */
1252 if (DECL_CONSTRUCTOR_P (t)
1253 || DECL_DESTRUCTOR_P (t))
1254 name = constructor_name (DECL_CONTEXT (t));
1256 if (DECL_DESTRUCTOR_P (t))
1258 pp_cxx_complement (cxx_pp);
1259 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1261 else if (DECL_CONV_FN_P (t))
1263 /* This cannot use the hack that the operator's return
1264 type is stashed off of its name because it may be
1265 used for error reporting. In the case of conflicting
1266 declarations, both will have the same name, yet
1267 the types will be different, hence the TREE_TYPE field
1268 of the first name will be clobbered by the second. */
1269 pp_cxx_identifier (cxx_pp, "operator");
1270 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1272 else if (IDENTIFIER_OPNAME_P (name))
1273 pp_cxx_tree_identifier (cxx_pp, name);
1275 dump_decl (name, flags);
1277 if (DECL_TEMPLATE_INFO (t)
1278 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1279 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1280 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1281 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1284 /* Dump the template parameters from the template info INFO under control of
1285 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1286 specialization (partial or complete). For partial specializations we show
1287 the specialized parameter values. For a primary template we show no
1291 dump_template_parms (tree info, int primary, int flags)
1293 tree args = info ? TI_ARGS (info) : NULL_TREE;
1295 if (primary && flags & TFF_TEMPLATE_NAME)
1297 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1298 pp_cxx_begin_template_argument_list (cxx_pp);
1300 /* Be careful only to print things when we have them, so as not
1301 to crash producing error messages. */
1302 if (args && !primary)
1306 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
1307 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1309 len = TREE_VEC_LENGTH (args);
1311 for (ix = 0; ix != len; ix++)
1313 tree arg = TREE_VEC_ELT (args, ix);
1315 /* Only print a comma if we know there is an argument coming. In
1316 the case of an empty template argument pack, no actual
1317 argument will be printed. */
1319 && (!ARGUMENT_PACK_P (arg)
1320 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1321 pp_separate_with_comma (cxx_pp);
1324 pp_identifier (cxx_pp, "<template parameter error>");
1326 dump_template_argument (arg, flags);
1331 tree tpl = TI_TEMPLATE (info);
1332 tree parms = DECL_TEMPLATE_PARMS (tpl);
1335 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1336 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1338 for (ix = 0; ix != len; ix++)
1342 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1344 pp_identifier (cxx_pp, "<template parameter error>");
1348 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1351 pp_separate_with_comma (cxx_pp);
1353 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1356 pp_cxx_end_template_argument_list (cxx_pp);
1359 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1360 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1363 dump_call_expr_args (tree t, int flags, bool skipfirst)
1366 call_expr_arg_iterator iter;
1368 pp_cxx_left_paren (cxx_pp);
1369 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1375 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1376 if (more_call_expr_args_p (&iter))
1377 pp_separate_with_comma (cxx_pp);
1380 pp_cxx_right_paren (cxx_pp);
1383 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1384 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1388 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1391 aggr_init_expr_arg_iterator iter;
1393 pp_cxx_left_paren (cxx_pp);
1394 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1400 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1401 if (more_aggr_init_expr_args_p (&iter))
1402 pp_separate_with_comma (cxx_pp);
1405 pp_cxx_right_paren (cxx_pp);
1408 /* Print out a list of initializers (subr of dump_expr). */
1411 dump_expr_list (tree l, int flags)
1415 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1418 pp_separate_with_comma (cxx_pp);
1422 /* Print out a vector of initializers (subr of dump_expr). */
1425 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1427 unsigned HOST_WIDE_INT idx;
1430 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1432 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1433 if (idx != VEC_length (constructor_elt, v) - 1)
1434 pp_separate_with_comma (cxx_pp);
1439 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1440 function. Resolve it to a close relative -- in the sense of static
1441 type -- variant being overridden. That is close to what was written in
1442 the source code. Subroutine of dump_expr. */
1445 resolve_virtual_fun_from_obj_type_ref (tree ref)
1447 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1448 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1449 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1452 fun = TREE_CHAIN (fun);
1453 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1454 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1460 /* Print out an expression E under control of FLAGS. */
1463 dump_expr (tree t, int flags)
1468 if (STATEMENT_CLASS_P (t))
1470 pp_cxx_identifier (cxx_pp, "<statement>");
1474 switch (TREE_CODE (t))
1482 case NAMESPACE_DECL:
1485 case IDENTIFIER_NODE:
1486 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1493 pp_constant (cxx_pp, t);
1497 pp_cxx_identifier (cxx_pp, "throw");
1498 dump_expr (TREE_OPERAND (t, 0), flags);
1502 pp_ampersand (cxx_pp);
1503 dump_type (PTRMEM_CST_CLASS (t), flags);
1504 pp_cxx_colon_colon (cxx_pp);
1505 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1509 pp_cxx_left_paren (cxx_pp);
1510 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1511 pp_separate_with_comma (cxx_pp);
1512 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1513 pp_cxx_right_paren (cxx_pp);
1517 pp_cxx_left_paren (cxx_pp);
1518 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1519 pp_string (cxx_pp, " ? ");
1520 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1521 pp_string (cxx_pp, " : ");
1522 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1523 pp_cxx_right_paren (cxx_pp);
1527 if (TREE_HAS_CONSTRUCTOR (t))
1529 pp_cxx_identifier (cxx_pp, "new");
1530 pp_cxx_whitespace (cxx_pp);
1531 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1534 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 (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1542 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1544 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1546 if (DECL_CONSTRUCTOR_P (fn))
1547 dump_type (DECL_CONTEXT (fn), flags);
1552 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1554 dump_aggr_init_expr_args (t, flags, true);
1559 tree fn = CALL_EXPR_FN (t);
1560 bool skipfirst = false;
1562 if (TREE_CODE (fn) == ADDR_EXPR)
1563 fn = TREE_OPERAND (fn, 0);
1565 /* Nobody is interested in seeing the guts of vcalls. */
1566 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1567 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1569 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1571 tree ob = CALL_EXPR_ARG (t, 0);
1572 if (TREE_CODE (ob) == ADDR_EXPR)
1574 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1575 pp_cxx_dot (cxx_pp);
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 pp_cxx_arrow (cxx_pp);
1585 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1586 dump_call_expr_args (t, flags, skipfirst);
1591 /* Note that this only works for G++ target exprs. If somebody
1592 builds a general TARGET_EXPR, there's no way to represent that
1593 it initializes anything other that the parameter slot for the
1594 default argument. Note we may have cleared out the first
1595 operand in expand_expr, so don't go killing ourselves. */
1596 if (TREE_OPERAND (t, 1))
1597 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1600 case POINTER_PLUS_EXPR:
1601 dump_binary_op ("+", t, flags);
1609 case TRUNC_DIV_EXPR:
1610 case TRUNC_MOD_EXPR:
1618 case TRUTH_ANDIF_EXPR:
1619 case TRUTH_ORIF_EXPR:
1626 case EXACT_DIV_EXPR:
1627 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1631 case FLOOR_DIV_EXPR:
1632 case ROUND_DIV_EXPR:
1634 dump_binary_op ("/", t, flags);
1638 case FLOOR_MOD_EXPR:
1639 case ROUND_MOD_EXPR:
1640 dump_binary_op ("%", t, flags);
1645 tree ob = TREE_OPERAND (t, 0);
1646 if (TREE_CODE (ob) == INDIRECT_REF)
1648 ob = TREE_OPERAND (ob, 0);
1649 if (TREE_CODE (ob) != PARM_DECL
1651 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1653 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1654 pp_cxx_arrow (cxx_pp);
1659 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1660 pp_cxx_dot (cxx_pp);
1662 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1667 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1668 pp_cxx_left_bracket (cxx_pp);
1669 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1670 pp_cxx_right_bracket (cxx_pp);
1673 case UNARY_PLUS_EXPR:
1674 dump_unary_op ("+", t, flags);
1678 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1679 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1680 /* An ADDR_EXPR can have reference type. In that case, we
1681 shouldn't print the `&' doing so indicates to the user
1682 that the expression has pointer type. */
1684 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1685 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1686 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1687 dump_unary_op ("&&", t, flags);
1689 dump_unary_op ("&", t, flags);
1693 if (TREE_HAS_CONSTRUCTOR (t))
1695 t = TREE_OPERAND (t, 0);
1696 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1697 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1698 dump_call_expr_args (t, flags, true);
1702 if (TREE_OPERAND (t,0) != NULL_TREE
1703 && TREE_TYPE (TREE_OPERAND (t, 0))
1704 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1705 dump_expr (TREE_OPERAND (t, 0), flags);
1707 dump_unary_op ("*", t, flags);
1713 case TRUTH_NOT_EXPR:
1714 case PREDECREMENT_EXPR:
1715 case PREINCREMENT_EXPR:
1716 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1719 case POSTDECREMENT_EXPR:
1720 case POSTINCREMENT_EXPR:
1721 pp_cxx_left_paren (cxx_pp);
1722 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1723 pp_cxx_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1724 pp_cxx_right_paren (cxx_pp);
1727 case NON_LVALUE_EXPR:
1728 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1729 should be another level of INDIRECT_REF so that I don't have to do
1731 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1733 tree next = TREE_TYPE (TREE_TYPE (t));
1735 while (TREE_CODE (next) == POINTER_TYPE)
1736 next = TREE_TYPE (next);
1738 if (TREE_CODE (next) == FUNCTION_TYPE)
1740 if (flags & TFF_EXPR_IN_PARENS)
1741 pp_cxx_left_paren (cxx_pp);
1742 pp_cxx_star (cxx_pp);
1743 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1744 if (flags & TFF_EXPR_IN_PARENS)
1745 pp_cxx_right_paren (cxx_pp);
1748 /* Else fall through. */
1750 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1754 case VIEW_CONVERT_EXPR:
1756 tree op = TREE_OPERAND (t, 0);
1758 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1760 /* It is a cast, but we cannot tell whether it is a
1761 reinterpret or static cast. Use the C style notation. */
1762 if (flags & TFF_EXPR_IN_PARENS)
1763 pp_cxx_left_paren (cxx_pp);
1764 pp_cxx_left_paren (cxx_pp);
1765 dump_type (TREE_TYPE (t), flags);
1766 pp_cxx_right_paren (cxx_pp);
1767 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1768 if (flags & TFF_EXPR_IN_PARENS)
1769 pp_cxx_right_paren (cxx_pp);
1772 dump_expr (op, flags);
1777 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1779 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1781 if (integer_zerop (idx))
1783 /* A NULL pointer-to-member constant. */
1784 pp_cxx_left_paren (cxx_pp);
1785 pp_cxx_left_paren (cxx_pp);
1786 dump_type (TREE_TYPE (t), flags);
1787 pp_cxx_right_paren (cxx_pp);
1788 pp_character (cxx_pp, '0');
1789 pp_cxx_right_paren (cxx_pp);
1792 else if (host_integerp (idx, 0))
1795 unsigned HOST_WIDE_INT n;
1797 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1798 t = TYPE_METHOD_BASETYPE (t);
1799 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1801 n = tree_low_cst (idx, 0);
1803 /* Map vtable index back one, to allow for the null pointer to
1807 while (n > 0 && virtuals)
1810 virtuals = TREE_CHAIN (virtuals);
1814 dump_expr (BV_FN (virtuals),
1815 flags | TFF_EXPR_IN_PARENS);
1820 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
1822 dump_type (TREE_TYPE (t), 0);
1823 pp_cxx_left_paren (cxx_pp);
1824 pp_cxx_right_paren (cxx_pp);
1828 pp_cxx_left_brace (cxx_pp);
1829 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
1830 pp_cxx_right_brace (cxx_pp);
1837 tree ob = TREE_OPERAND (t, 0);
1838 if (is_dummy_object (ob))
1840 t = TREE_OPERAND (t, 1);
1841 if (TREE_CODE (t) == FUNCTION_DECL)
1843 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1844 else if (BASELINK_P (t))
1845 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1846 flags | TFF_EXPR_IN_PARENS);
1848 dump_decl (t, flags);
1852 if (TREE_CODE (ob) == INDIRECT_REF)
1854 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1855 pp_cxx_arrow (cxx_pp);
1856 pp_cxx_star (cxx_pp);
1860 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1861 pp_cxx_dot (cxx_pp);
1862 pp_cxx_star (cxx_pp);
1864 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1869 case TEMPLATE_PARM_INDEX:
1870 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1874 if (TREE_OPERAND (t, 0) == NULL_TREE
1875 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1877 dump_type (TREE_TYPE (t), flags);
1878 pp_cxx_left_paren (cxx_pp);
1879 dump_expr_list (TREE_OPERAND (t, 0), flags);
1880 pp_cxx_right_paren (cxx_pp);
1884 pp_cxx_left_paren (cxx_pp);
1885 dump_type (TREE_TYPE (t), flags);
1886 pp_cxx_right_paren (cxx_pp);
1887 pp_cxx_left_paren (cxx_pp);
1888 dump_expr_list (TREE_OPERAND (t, 0), flags);
1889 pp_cxx_right_paren (cxx_pp);
1893 case STATIC_CAST_EXPR:
1894 pp_cxx_identifier (cxx_pp, "static_cast");
1896 case REINTERPRET_CAST_EXPR:
1897 pp_cxx_identifier (cxx_pp, "reinterpret_cast");
1899 case CONST_CAST_EXPR:
1900 pp_cxx_identifier (cxx_pp, "const_cast");
1902 case DYNAMIC_CAST_EXPR:
1903 pp_cxx_identifier (cxx_pp, "dynamic_cast");
1905 pp_cxx_begin_template_argument_list (cxx_pp);
1906 dump_type (TREE_TYPE (t), flags);
1907 pp_cxx_end_template_argument_list (cxx_pp);
1908 pp_cxx_left_paren (cxx_pp);
1909 dump_expr (TREE_OPERAND (t, 0), flags);
1910 pp_cxx_right_paren (cxx_pp);
1914 dump_expr (TREE_OPERAND (t, 0), flags);
1915 pp_cxx_arrow (cxx_pp);
1920 if (TREE_CODE (t) == SIZEOF_EXPR)
1921 pp_cxx_identifier (cxx_pp, "sizeof");
1924 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
1925 pp_cxx_identifier (cxx_pp, "__alignof__");
1927 pp_cxx_whitespace (cxx_pp);
1928 pp_cxx_left_paren (cxx_pp);
1929 if (TYPE_P (TREE_OPERAND (t, 0)))
1930 dump_type (TREE_OPERAND (t, 0), flags);
1932 dump_expr (TREE_OPERAND (t, 0), flags);
1933 pp_cxx_right_paren (cxx_pp);
1938 pp_cxx_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1939 pp_cxx_whitespace (cxx_pp);
1940 dump_expr (TREE_OPERAND (t, 0), flags);
1944 pp_identifier (cxx_pp, "<unparsed>");
1947 case TRY_CATCH_EXPR:
1948 case WITH_CLEANUP_EXPR:
1949 case CLEANUP_POINT_EXPR:
1950 dump_expr (TREE_OPERAND (t, 0), flags);
1953 case PSEUDO_DTOR_EXPR:
1954 dump_expr (TREE_OPERAND (t, 2), flags);
1955 pp_cxx_dot (cxx_pp);
1956 dump_type (TREE_OPERAND (t, 0), flags);
1957 pp_cxx_colon_colon (cxx_pp);
1958 pp_cxx_complement (cxx_pp);
1959 dump_type (TREE_OPERAND (t, 1), flags);
1962 case TEMPLATE_ID_EXPR:
1963 dump_decl (t, flags);
1968 case STATEMENT_LIST:
1969 /* We don't yet have a way of dumping statements in a
1970 human-readable format. */
1971 pp_string (cxx_pp, "({...})");
1975 pp_string (cxx_pp, "while (1) { ");
1976 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1977 pp_cxx_right_brace (cxx_pp);
1981 pp_string (cxx_pp, "if (");
1982 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1983 pp_string (cxx_pp, ") break; ");
1987 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
1990 case EMPTY_CLASS_EXPR:
1991 dump_type (TREE_TYPE (t), flags);
1992 pp_cxx_left_paren (cxx_pp);
1993 pp_cxx_right_paren (cxx_pp);
1996 case NON_DEPENDENT_EXPR:
1997 dump_expr (TREE_OPERAND (t, 0), flags);
2000 case ARGUMENT_PACK_SELECT:
2001 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2013 pp_type_specifier_seq (cxx_pp, t);
2017 /* We get here when we want to print a dependent type as an
2018 id-expression, without any disambiguator decoration. */
2019 pp_id_expression (cxx_pp, t);
2022 case TEMPLATE_TYPE_PARM:
2023 case BOUND_TEMPLATE_TEMPLATE_PARM:
2024 dump_type (t, flags);
2028 pp_cxx_trait_expression (cxx_pp, t);
2032 pp_cxx_va_arg_expression (cxx_pp, t);
2036 pp_cxx_offsetof_expression (cxx_pp, t);
2040 case EXPR_PACK_EXPANSION:
2047 case VEC_DELETE_EXPR:
2053 case UNORDERED_EXPR:
2061 pp_expression (cxx_pp, t);
2064 case TRUTH_AND_EXPR:
2066 case TRUTH_XOR_EXPR:
2067 if (flags & TFF_EXPR_IN_PARENS)
2068 pp_cxx_left_paren (cxx_pp);
2069 pp_expression (cxx_pp, t);
2070 if (flags & TFF_EXPR_IN_PARENS)
2071 pp_cxx_right_paren (cxx_pp);
2075 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2078 /* This list is incomplete, but should suffice for now.
2079 It is very important that `sorry' does not call
2080 `report_error_function'. That could cause an infinite loop. */
2082 pp_unsupported_tree (cxx_pp, t);
2083 /* fall through to ERROR_MARK... */
2085 pp_identifier (cxx_pp, "<expression error>");
2091 dump_binary_op (const char *opstring, tree t, int flags)
2093 pp_cxx_left_paren (cxx_pp);
2094 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2095 pp_cxx_whitespace (cxx_pp);
2097 pp_cxx_identifier (cxx_pp, opstring);
2099 pp_identifier (cxx_pp, "<unknown operator>");
2100 pp_cxx_whitespace (cxx_pp);
2101 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2102 pp_cxx_right_paren (cxx_pp);
2106 dump_unary_op (const char *opstring, tree t, int flags)
2108 if (flags & TFF_EXPR_IN_PARENS)
2109 pp_cxx_left_paren (cxx_pp);
2110 pp_cxx_identifier (cxx_pp, opstring);
2111 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2112 if (flags & TFF_EXPR_IN_PARENS)
2113 pp_cxx_right_paren (cxx_pp);
2117 reinit_cxx_pp (void)
2119 pp_clear_output_area (cxx_pp);
2120 pp_base (cxx_pp)->padding = pp_none;
2121 pp_indentation (cxx_pp) = 0;
2122 pp_needs_newline (cxx_pp) = false;
2123 cxx_pp->enclosing_scope = current_function_decl;
2127 /* Exported interface to stringifying types, exprs and decls under TFF_*
2131 type_as_string (tree typ, int flags)
2134 dump_type (typ, flags);
2135 return pp_formatted_text (cxx_pp);
2139 expr_as_string (tree decl, int flags)
2142 dump_expr (decl, flags);
2143 return pp_formatted_text (cxx_pp);
2147 decl_as_string (tree decl, int flags)
2150 dump_decl (decl, flags);
2151 return pp_formatted_text (cxx_pp);
2154 /* Generate the three forms of printable names for cxx_printable_name. */
2157 lang_decl_name (tree decl, int v)
2160 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2163 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
2165 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2166 pp_cxx_colon_colon (cxx_pp);
2169 if (TREE_CODE (decl) == FUNCTION_DECL)
2170 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2172 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2174 return pp_formatted_text (cxx_pp);
2177 /* Return the location of a tree passed to %+ formats. */
2180 location_of (tree t)
2182 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2183 t = DECL_CONTEXT (t);
2184 else if (TYPE_P (t))
2185 t = TYPE_MAIN_DECL (t);
2186 else if (TREE_CODE (t) == OVERLOAD)
2187 t = OVL_FUNCTION (t);
2189 return DECL_SOURCE_LOCATION (t);
2192 /* Now the interfaces from error et al to dump_type et al. Each takes an
2193 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2197 decl_to_string (tree decl, int verbose)
2201 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2202 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2203 flags = TFF_CLASS_KEY_OR_ENUM;
2205 flags |= TFF_DECL_SPECIFIERS;
2206 else if (TREE_CODE (decl) == FUNCTION_DECL)
2207 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2208 flags |= TFF_TEMPLATE_HEADER;
2211 dump_decl (decl, flags);
2212 return pp_formatted_text (cxx_pp);
2216 expr_to_string (tree decl)
2219 dump_expr (decl, 0);
2220 return pp_formatted_text (cxx_pp);
2224 fndecl_to_string (tree fndecl, int verbose)
2228 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2229 | TFF_TEMPLATE_HEADER;
2231 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2233 dump_decl (fndecl, flags);
2234 return pp_formatted_text (cxx_pp);
2239 code_to_string (enum tree_code c)
2241 return tree_code_name [c];
2245 language_to_string (enum languages c)
2252 case lang_cplusplus:
2264 /* Return the proper printed version of a parameter to a C++ function. */
2267 parm_to_string (int p)
2271 pp_string (cxx_pp, "'this'");
2273 pp_decimal_int (cxx_pp, p + 1);
2274 return pp_formatted_text (cxx_pp);
2278 op_to_string (enum tree_code p)
2280 tree id = operator_name_info[(int) p].identifier;
2281 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2285 type_to_string (tree typ, int verbose)
2289 flags |= TFF_CLASS_KEY_OR_ENUM;
2290 flags |= TFF_TEMPLATE_HEADER;
2293 dump_type (typ, flags);
2294 return pp_formatted_text (cxx_pp);
2298 assop_to_string (enum tree_code p)
2300 tree id = assignment_operator_name_info[(int) p].identifier;
2301 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2305 args_to_string (tree p, int verbose)
2309 flags |= TFF_CLASS_KEY_OR_ENUM;
2314 if (TYPE_P (TREE_VALUE (p)))
2315 return type_as_string (p, flags);
2318 for (; p; p = TREE_CHAIN (p))
2320 if (TREE_VALUE (p) == null_node)
2321 pp_cxx_identifier (cxx_pp, "NULL");
2323 dump_type (error_type (TREE_VALUE (p)), flags);
2325 pp_separate_with_comma (cxx_pp);
2327 return pp_formatted_text (cxx_pp);
2331 cv_to_string (tree p, int v)
2334 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2335 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2336 return pp_formatted_text (cxx_pp);
2339 /* Langhook for print_error_function. */
2341 cxx_print_error_function (diagnostic_context *context, const char *file,
2342 diagnostic_info *diagnostic)
2344 lhd_print_error_function (context, file, diagnostic);
2345 pp_base_set_prefix (context->printer, file);
2346 maybe_print_instantiation_context (context);
2350 cp_diagnostic_starter (diagnostic_context *context,
2351 diagnostic_info *diagnostic)
2353 diagnostic_report_current_module (context);
2354 cp_print_error_function (context, diagnostic);
2355 maybe_print_instantiation_context (context);
2356 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2360 cp_diagnostic_finalizer (diagnostic_context *context,
2361 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2363 pp_base_destroy_prefix (context->printer);
2366 /* Print current function onto BUFFER, in the process of reporting
2367 a diagnostic message. Called from cp_diagnostic_starter. */
2369 cp_print_error_function (diagnostic_context *context,
2370 diagnostic_info *diagnostic)
2372 if (diagnostic_last_function_changed (context, diagnostic))
2374 const char *old_prefix = context->printer->prefix;
2375 const char *file = LOCATION_FILE (diagnostic->location);
2376 tree abstract_origin = diagnostic->abstract_origin;
2377 char *new_prefix = (file && abstract_origin == NULL)
2378 ? file_name_as_prefix (file) : NULL;
2380 pp_base_set_prefix (context->printer, new_prefix);
2382 if (current_function_decl == NULL)
2383 pp_base_string (context->printer, "At global scope:");
2388 if (abstract_origin)
2390 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2391 while (TREE_CODE (ao) == BLOCK
2392 && BLOCK_ABSTRACT_ORIGIN (ao)
2393 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2394 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2395 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2399 fndecl = current_function_decl;
2401 pp_printf (context->printer, "In %s %qs",
2402 function_category (fndecl),
2403 cxx_printable_name (fndecl, 2));
2405 while (abstract_origin)
2408 tree block = abstract_origin;
2410 locus = &BLOCK_SOURCE_LOCATION (block);
2412 block = BLOCK_SUPERCONTEXT (block);
2413 while (block && TREE_CODE (block) == BLOCK
2414 && BLOCK_ABSTRACT_ORIGIN (block))
2416 ao = BLOCK_ABSTRACT_ORIGIN (block);
2418 while (TREE_CODE (ao) == BLOCK
2419 && BLOCK_ABSTRACT_ORIGIN (ao)
2420 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2421 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2423 if (TREE_CODE (ao) == FUNCTION_DECL)
2428 else if (TREE_CODE (ao) != BLOCK)
2431 block = BLOCK_SUPERCONTEXT (block);
2434 abstract_origin = block;
2437 while (block && TREE_CODE (block) == BLOCK)
2438 block = BLOCK_SUPERCONTEXT (block);
2440 if (TREE_CODE (block) == FUNCTION_DECL)
2442 abstract_origin = NULL;
2446 expanded_location s = expand_location (*locus);
2447 pp_base_character (context->printer, ',');
2448 pp_base_newline (context->printer);
2451 if (flag_show_column && s.column != 0)
2452 pp_printf (context->printer,
2453 " inlined from %qs at %s:%d:%d",
2454 cxx_printable_name (fndecl, 2),
2455 s.file, s.line, s.column);
2457 pp_printf (context->printer,
2458 " inlined from %qs at %s:%d",
2459 cxx_printable_name (fndecl, 2),
2464 pp_printf (context->printer, " inlined from %qs",
2465 cxx_printable_name (fndecl, 2));
2468 pp_base_character (context->printer, ':');
2470 pp_base_newline (context->printer);
2472 diagnostic_set_last_function (context, diagnostic);
2473 pp_base_destroy_prefix (context->printer);
2474 context->printer->prefix = old_prefix;
2478 /* Returns a description of FUNCTION using standard terminology. */
2480 function_category (tree fn)
2482 if (DECL_FUNCTION_MEMBER_P (fn))
2484 if (DECL_STATIC_FUNCTION_P (fn))
2485 return "static member function";
2486 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2487 return "copy constructor";
2488 else if (DECL_CONSTRUCTOR_P (fn))
2489 return "constructor";
2490 else if (DECL_DESTRUCTOR_P (fn))
2491 return "destructor";
2493 return "member function";
2499 /* Report the full context of a current template instantiation,
2502 print_instantiation_full_context (diagnostic_context *context)
2504 struct tinst_level *p = current_instantiation ();
2505 location_t location = input_location;
2509 if (current_function_decl != p->decl
2510 && current_function_decl != NULL_TREE)
2511 /* We can get here during the processing of some synthesized
2512 method. Then, P->DECL will be the function that's causing
2517 if (current_function_decl == p->decl)
2518 /* Avoid redundancy with the "In function" line. */;
2520 pp_verbatim (context->printer,
2521 "%s: In instantiation of %qs:\n",
2522 LOCATION_FILE (location),
2523 decl_as_string (p->decl,
2524 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2526 location = p->locus;
2531 print_instantiation_partial_context (context, p, location);
2534 /* Same as above but less verbose. */
2536 print_instantiation_partial_context (diagnostic_context *context,
2537 struct tinst_level *t, location_t loc)
2539 expanded_location xloc;
2540 for (; ; t = t->next)
2542 xloc = expand_location (loc);
2545 pp_verbatim (context->printer, "%s:%d: instantiated from %qs\n",
2546 xloc.file, xloc.line,
2547 decl_as_string (t->decl,
2548 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2551 pp_verbatim (context->printer, "%s:%d: instantiated from here",
2552 xloc.file, xloc.line);
2553 pp_base_newline (context->printer);
2556 /* Called from cp_thing to print the template context for an error. */
2558 maybe_print_instantiation_context (diagnostic_context *context)
2560 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2563 record_last_problematic_instantiation ();
2564 print_instantiation_full_context (context);
2567 /* Report the bare minimum context of a template instantiation. */
2569 print_instantiation_context (void)
2571 print_instantiation_partial_context
2572 (global_dc, current_instantiation (), input_location);
2573 diagnostic_flush_buffer (global_dc);
2576 /* Called from output_format -- during diagnostic message processing --
2577 to handle C++ specific format specifier with the following meanings:
2578 %A function argument-list.
2582 %F function declaration.
2583 %L language as used in extern "lang".
2585 %P function parameter whose position is indicated by an integer.
2586 %Q assignment operator.
2590 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2591 int precision, bool wide, bool set_locus, bool verbose)
2595 #define next_tree (t = va_arg (*text->args_ptr, tree))
2596 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2597 #define next_lang va_arg (*text->args_ptr, enum languages)
2598 #define next_int va_arg (*text->args_ptr, int)
2600 if (precision != 0 || wide)
2603 if (text->locus == NULL)
2608 case 'A': result = args_to_string (next_tree, verbose); break;
2609 case 'C': result = code_to_string (next_tcode); break;
2612 tree temp = next_tree;
2614 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
2616 temp = DECL_DEBUG_EXPR (temp);
2619 result = expr_to_string (temp);
2623 result = decl_to_string (temp, verbose);
2626 case 'E': result = expr_to_string (next_tree); break;
2627 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2628 case 'L': result = language_to_string (next_lang); break;
2629 case 'O': result = op_to_string (next_tcode); break;
2630 case 'P': result = parm_to_string (next_int); break;
2631 case 'Q': result = assop_to_string (next_tcode); break;
2632 case 'T': result = type_to_string (next_tree, verbose); break;
2633 case 'V': result = cv_to_string (next_tree, verbose); break;
2639 pp_base_string (pp, result);
2640 if (set_locus && t != NULL)
2641 *text->locus = location_of (t);
2649 /* Callback from cpp_error for PFILE to print diagnostics arising from
2650 interpreting strings. The diagnostic is of type LEVEL; MSG is the
2651 translated message and AP the arguments. */
2654 cp_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
2655 const char *msg, va_list *ap)
2657 diagnostic_info diagnostic;
2658 diagnostic_t dlevel;
2661 case CPP_DL_WARNING:
2662 case CPP_DL_WARNING_SYSHDR:
2663 dlevel = DK_WARNING;
2665 case CPP_DL_PEDWARN:
2666 dlevel = DK_PEDWARN;
2677 diagnostic_set_info_translated (&diagnostic, msg, ap,
2678 input_location, dlevel);
2679 report_diagnostic (&diagnostic);
2682 /* Warn about the use of C++0x features when appropriate. */
2684 maybe_warn_cpp0x (const char* str)
2686 if ((cxx_dialect == cxx98) && !in_system_header)
2687 /* We really want to suppress this warning in system headers,
2688 because libstdc++ uses variadic templates even when we aren't
2690 pedwarn (input_location, 0, "%s only available with -std=c++0x or -std=gnu++0x", str);
2693 /* Warn about the use of variadic templates when appropriate. */
2695 maybe_warn_variadic_templates (void)
2697 maybe_warn_cpp0x ("variadic templates");