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, 2009 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"
33 #include "cxx-pretty-print.h"
34 #include "pointer-set.h"
36 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
38 /* The global buffer where we dump everything. It is there only for
39 transitional purpose. It is expected, in the near future, to be
40 completely removed. */
41 static cxx_pretty_printer scratch_pretty_printer;
42 #define cxx_pp (&scratch_pretty_printer)
44 /* Translate if being used for diagnostics, but not for dump files or
46 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
48 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
50 static const char *args_to_string (tree, int);
51 static const char *assop_to_string (enum tree_code);
52 static const char *code_to_string (enum tree_code);
53 static const char *cv_to_string (tree, int);
54 static const char *decl_to_string (tree, int);
55 static const char *expr_to_string (tree);
56 static const char *fndecl_to_string (tree, int);
57 static const char *op_to_string (enum tree_code);
58 static const char *parm_to_string (int);
59 static const char *type_to_string (tree, int);
61 static void dump_type (tree, int);
62 static void dump_typename (tree, int);
63 static void dump_simple_decl (tree, tree, int);
64 static void dump_decl (tree, int);
65 static void dump_template_decl (tree, int);
66 static void dump_function_decl (tree, int);
67 static void dump_expr (tree, int);
68 static void dump_unary_op (const char *, tree, int);
69 static void dump_binary_op (const char *, tree, int);
70 static void dump_aggr_type (tree, int);
71 static void dump_type_prefix (tree, int);
72 static void dump_type_suffix (tree, int);
73 static void dump_function_name (tree, int);
74 static void dump_call_expr_args (tree, int, bool);
75 static void dump_aggr_init_expr_args (tree, int, bool);
76 static void dump_expr_list (tree, int);
77 static void dump_global_iord (tree);
78 static void dump_parameters (tree, int);
79 static void dump_exception_spec (tree, int);
80 static void dump_template_argument (tree, int);
81 static void dump_template_argument_list (tree, tree, int);
82 static void dump_template_parameter (tree, int);
83 static void dump_template_bindings (tree, tree, VEC(tree,gc) *);
84 static void dump_scope (tree, int);
85 static void dump_template_parms (tree, int, int);
87 static int count_non_default_template_args (tree, tree);
89 static const char *function_category (tree);
90 static void maybe_print_instantiation_context (diagnostic_context *);
91 static void print_instantiation_full_context (diagnostic_context *);
92 static void print_instantiation_partial_context (diagnostic_context *,
95 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
96 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
97 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
99 static bool cp_printer (pretty_printer *, text_info *, const char *,
100 int, bool, bool, bool);
101 static location_t location_of (tree);
106 diagnostic_starter (global_dc) = cp_diagnostic_starter;
107 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
108 diagnostic_format_decoder (global_dc) = cp_printer;
110 pp_construct (pp_base (cxx_pp), NULL, 0);
111 pp_cxx_pretty_printer_init (cxx_pp);
114 /* Dump a scope, if deemed necessary. */
117 dump_scope (tree scope, int flags)
119 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
121 if (scope == NULL_TREE)
124 if (TREE_CODE (scope) == NAMESPACE_DECL)
126 if (scope != global_namespace)
128 dump_decl (scope, f);
129 pp_cxx_colon_colon (cxx_pp);
132 else if (AGGREGATE_TYPE_P (scope))
134 dump_type (scope, f);
135 pp_cxx_colon_colon (cxx_pp);
137 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
139 dump_function_decl (scope, f);
140 pp_cxx_colon_colon (cxx_pp);
144 /* Dump the template ARGument under control of FLAGS. */
147 dump_template_argument (tree arg, int flags)
149 if (ARGUMENT_PACK_P (arg))
150 dump_template_argument_list (ARGUMENT_PACK_ARGS (arg), NULL_TREE, flags);
151 else if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
152 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
155 if (TREE_CODE (arg) == TREE_LIST)
156 arg = TREE_VALUE (arg);
158 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
162 /* Count the number of template arguments ARGS whose value does not
163 match the (optional) default template parameter in PARAMS */
166 count_non_default_template_args (tree args, tree params)
168 tree inner_args = INNERMOST_TEMPLATE_ARGS (args);
169 int n = TREE_VEC_LENGTH (inner_args);
172 if (params == NULL_TREE || !flag_pretty_templates)
175 for (last = n - 1; last >= 0; --last)
177 tree param = TREE_VEC_ELT (params, last);
178 tree def = TREE_PURPOSE (param);
182 if (uses_template_parms (def))
184 ++processing_template_decl;
185 /* This speculative substitution must not cause any classes to be
186 instantiated that otherwise wouldn't be. */
187 def = tsubst_copy_and_build (def, args, tf_no_class_instantiations,
188 NULL_TREE, false, true);
189 --processing_template_decl;
191 if (!cp_tree_equal (TREE_VEC_ELT (inner_args, last), def))
198 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
202 dump_template_argument_list (tree args, tree parms, int flags)
204 int n = count_non_default_template_args (args, parms);
208 for (i = 0; i < n; ++i)
210 tree arg = TREE_VEC_ELT (args, i);
212 /* Only print a comma if we know there is an argument coming. In
213 the case of an empty template argument pack, no actual
214 argument will be printed. */
216 && (!ARGUMENT_PACK_P (arg)
217 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
218 pp_separate_with_comma (cxx_pp);
220 dump_template_argument (arg, flags);
225 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
228 dump_template_parameter (tree parm, int flags)
233 if (parm == error_mark_node)
236 p = TREE_VALUE (parm);
237 a = TREE_PURPOSE (parm);
239 if (TREE_CODE (p) == TYPE_DECL)
241 if (flags & TFF_DECL_SPECIFIERS)
243 pp_cxx_ws_string (cxx_pp, "class");
244 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
245 pp_cxx_ws_string (cxx_pp, "...");
247 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
249 else if (DECL_NAME (p))
250 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
252 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
255 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
257 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
259 pp_cxx_whitespace (cxx_pp);
261 pp_cxx_whitespace (cxx_pp);
262 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
263 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
265 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
269 /* Dump, under control of FLAGS, a template-parameter-list binding.
270 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
274 dump_template_bindings (tree parms, tree args, VEC(tree,gc)* typenames)
282 tree p = TREE_VALUE (parms);
283 int lvl = TMPL_PARMS_DEPTH (parms);
286 tree lvl_args = NULL_TREE;
288 /* Don't crash if we had an invalid argument list. */
289 if (TMPL_ARGS_DEPTH (args) >= lvl)
290 lvl_args = TMPL_ARGS_LEVEL (args, lvl);
292 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
294 tree arg = NULL_TREE;
296 /* Don't crash if we had an invalid argument list. */
297 if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx)
298 arg = TREE_VEC_ELT (lvl_args, arg_idx);
301 pp_separate_with_comma (cxx_pp);
302 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
303 pp_cxx_whitespace (cxx_pp);
305 pp_cxx_whitespace (cxx_pp);
307 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
309 pp_string (cxx_pp, M_("<missing>"));
315 parms = TREE_CHAIN (parms);
318 for (i = 0; VEC_iterate (tree, typenames, i, t); ++i)
321 pp_separate_with_comma (cxx_pp);
322 dump_type (t, TFF_PLAIN_IDENTIFIER);
323 pp_cxx_whitespace (cxx_pp);
325 pp_cxx_whitespace (cxx_pp);
326 t = tsubst (t, args, tf_none, NULL_TREE);
327 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
328 pp_simple_type_specifier doesn't know about it. */
329 t = strip_typedefs (t);
330 dump_type (t, TFF_PLAIN_IDENTIFIER);
334 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
338 dump_type (tree t, int flags)
343 if (TYPE_PTRMEMFUNC_P (t))
346 switch (TREE_CODE (t))
349 if (t == init_list_type_node)
350 pp_string (cxx_pp, M_("<brace-enclosed initializer list>"));
352 pp_string (cxx_pp, M_("<unresolved overloaded function type>"));
356 /* A list of function parms. */
357 dump_parameters (t, flags);
360 case IDENTIFIER_NODE:
361 pp_cxx_tree_identifier (cxx_pp, t);
365 dump_type (BINFO_TYPE (t), flags);
371 dump_aggr_type (t, flags);
375 if (flags & TFF_CHASE_TYPEDEF)
377 dump_type (DECL_ORIGINAL_TYPE (t)
378 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
381 /* Else fall through. */
385 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
394 case FIXED_POINT_TYPE:
395 pp_type_specifier_seq (cxx_pp, t);
398 case TEMPLATE_TEMPLATE_PARM:
399 /* For parameters inside template signature. */
400 if (TYPE_IDENTIFIER (t))
401 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
403 pp_cxx_canonical_template_parameter (cxx_pp, t);
406 case BOUND_TEMPLATE_TEMPLATE_PARM:
408 tree args = TYPE_TI_ARGS (t);
409 pp_cxx_cv_qualifier_seq (cxx_pp, t);
410 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
411 pp_cxx_begin_template_argument_list (cxx_pp);
412 dump_template_argument_list (args, NULL_TREE, flags);
413 pp_cxx_end_template_argument_list (cxx_pp);
417 case TEMPLATE_TYPE_PARM:
418 pp_cxx_cv_qualifier_seq (cxx_pp, t);
419 if (TYPE_IDENTIFIER (t))
420 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
422 pp_cxx_canonical_template_parameter
423 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
426 /* This is not always necessary for pointers and such, but doing this
427 reduces code size. */
436 dump_type_prefix (t, flags);
437 dump_type_suffix (t, flags);
441 if (! (flags & TFF_CHASE_TYPEDEF)
442 && DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
444 dump_decl (TYPE_NAME (t), TFF_PLAIN_IDENTIFIER);
447 pp_cxx_cv_qualifier_seq (cxx_pp, t);
448 pp_cxx_ws_string (cxx_pp,
449 TYPENAME_IS_ENUM_P (t) ? "enum"
450 : TYPENAME_IS_CLASS_P (t) ? "class"
452 dump_typename (t, flags);
455 case UNBOUND_CLASS_TEMPLATE:
456 dump_type (TYPE_CONTEXT (t), flags);
457 pp_cxx_colon_colon (cxx_pp);
458 pp_cxx_ws_string (cxx_pp, "template");
459 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
463 pp_cxx_ws_string (cxx_pp, "__typeof__");
464 pp_cxx_whitespace (cxx_pp);
465 pp_cxx_left_paren (cxx_pp);
466 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
467 pp_cxx_right_paren (cxx_pp);
470 case TYPE_PACK_EXPANSION:
471 dump_type (PACK_EXPANSION_PATTERN (t), flags);
472 pp_cxx_ws_string (cxx_pp, "...");
475 case TYPE_ARGUMENT_PACK:
476 dump_template_argument (t, flags);
480 pp_cxx_ws_string (cxx_pp, "decltype");
481 pp_cxx_whitespace (cxx_pp);
482 pp_cxx_left_paren (cxx_pp);
483 dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
484 pp_cxx_right_paren (cxx_pp);
488 pp_unsupported_tree (cxx_pp, t);
489 /* Fall through to error. */
492 pp_string (cxx_pp, M_("<type error>"));
497 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
501 dump_typename (tree t, int flags)
503 tree ctx = TYPE_CONTEXT (t);
505 if (TREE_CODE (ctx) == TYPENAME_TYPE)
506 dump_typename (ctx, flags);
508 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
509 pp_cxx_colon_colon (cxx_pp);
510 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
513 /* Return the name of the supplied aggregate, or enumeral type. */
516 class_key_or_enum_as_string (tree t)
518 if (TREE_CODE (t) == ENUMERAL_TYPE)
520 if (SCOPED_ENUM_P (t))
525 else if (TREE_CODE (t) == UNION_TYPE)
527 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
533 /* Print out a class declaration T under the control of FLAGS,
534 in the form `class foo'. */
537 dump_aggr_type (tree t, int flags)
540 const char *variety = class_key_or_enum_as_string (t);
544 pp_cxx_cv_qualifier_seq (cxx_pp, t);
546 if (flags & TFF_CLASS_KEY_OR_ENUM)
547 pp_cxx_ws_string (cxx_pp, variety);
549 name = TYPE_NAME (t);
553 typdef = !DECL_ARTIFICIAL (name);
556 && ((flags & TFF_CHASE_TYPEDEF)
557 || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name)
558 && DECL_TEMPLATE_INFO (name))))
560 t = TYPE_MAIN_VARIANT (t);
561 name = TYPE_NAME (t);
565 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
566 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
567 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
568 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
570 if (! (flags & TFF_UNQUALIFIED_NAME))
571 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
572 flags &= ~TFF_UNQUALIFIED_NAME;
575 /* Because the template names are mangled, we have to locate
576 the most general template, and use that name. */
577 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
579 while (DECL_TEMPLATE_INFO (tpl))
580 tpl = DECL_TI_TEMPLATE (tpl);
583 name = DECL_NAME (name);
586 if (name == 0 || ANON_AGGRNAME_P (name))
588 if (flags & TFF_CLASS_KEY_OR_ENUM)
589 pp_string (cxx_pp, M_("<anonymous>"));
591 pp_printf (pp_base (cxx_pp), M_("<anonymous %s>"), variety);
594 pp_cxx_tree_identifier (cxx_pp, name);
596 dump_template_parms (TYPE_TEMPLATE_INFO (t),
597 !CLASSTYPE_USE_TEMPLATE (t),
598 flags & ~TFF_TEMPLATE_HEADER);
601 /* Dump into the obstack the initial part of the output for a given type.
602 This is necessary when dealing with things like functions returning
605 return type of `int (* fee ())()': pointer -> function -> int. Both
606 pointer (and reference and offset) and function (and member) types must
607 deal with prefix and suffix.
609 Arrays must also do this for DECL nodes, like int a[], and for things like
613 dump_type_prefix (tree t, int flags)
615 if (TYPE_PTRMEMFUNC_P (t))
617 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
621 switch (TREE_CODE (t))
626 tree sub = TREE_TYPE (t);
628 dump_type_prefix (sub, flags);
629 if (TREE_CODE (sub) == ARRAY_TYPE
630 || TREE_CODE (sub) == FUNCTION_TYPE)
632 pp_cxx_whitespace (cxx_pp);
633 pp_cxx_left_paren (cxx_pp);
635 if (TREE_CODE (t) == POINTER_TYPE)
636 pp_character(cxx_pp, '*');
637 else if (TREE_CODE (t) == REFERENCE_TYPE)
639 if (TYPE_REF_IS_RVALUE (t))
640 pp_string (cxx_pp, "&&");
642 pp_character (cxx_pp, '&');
644 pp_base (cxx_pp)->padding = pp_before;
645 pp_cxx_cv_qualifier_seq (cxx_pp, t);
651 dump_type_prefix (TREE_TYPE (t), flags);
652 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
654 pp_maybe_space (cxx_pp);
655 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
656 pp_cxx_left_paren (cxx_pp);
657 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
658 pp_cxx_colon_colon (cxx_pp);
660 pp_cxx_star (cxx_pp);
661 pp_cxx_cv_qualifier_seq (cxx_pp, t);
662 pp_base (cxx_pp)->padding = pp_before;
665 /* This can be reached without a pointer when dealing with
666 templates, e.g. std::is_function. */
668 dump_type_prefix (TREE_TYPE (t), flags);
672 dump_type_prefix (TREE_TYPE (t), flags);
673 pp_maybe_space (cxx_pp);
674 pp_cxx_left_paren (cxx_pp);
675 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
676 pp_cxx_colon_colon (cxx_pp);
680 dump_type_prefix (TREE_TYPE (t), flags);
684 case IDENTIFIER_NODE:
689 case TEMPLATE_TYPE_PARM:
690 case TEMPLATE_TEMPLATE_PARM:
691 case BOUND_TEMPLATE_TEMPLATE_PARM:
703 case TYPE_PACK_EXPANSION:
704 case FIXED_POINT_TYPE:
705 dump_type (t, flags);
706 pp_base (cxx_pp)->padding = pp_before;
710 pp_unsupported_tree (cxx_pp, t);
713 pp_string (cxx_pp, M_("<typeprefixerror>"));
718 /* Dump the suffix of type T, under control of FLAGS. This is the part
719 which appears after the identifier (or function parms). */
722 dump_type_suffix (tree t, int flags)
724 if (TYPE_PTRMEMFUNC_P (t))
725 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
727 switch (TREE_CODE (t))
732 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
733 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
734 pp_cxx_right_paren (cxx_pp);
735 dump_type_suffix (TREE_TYPE (t), flags);
742 if (TREE_CODE (t) == METHOD_TYPE)
743 /* Can only be reached through a pointer. */
744 pp_cxx_right_paren (cxx_pp);
745 arg = TYPE_ARG_TYPES (t);
746 if (TREE_CODE (t) == METHOD_TYPE)
747 arg = TREE_CHAIN (arg);
749 /* Function pointers don't have default args. Not in standard C++,
750 anyway; they may in g++, but we'll just pretend otherwise. */
751 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
753 if (TREE_CODE (t) == METHOD_TYPE)
754 pp_cxx_cv_qualifier_seq
755 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
757 pp_cxx_cv_qualifier_seq (cxx_pp, t);
758 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
759 dump_type_suffix (TREE_TYPE (t), flags);
764 pp_maybe_space (cxx_pp);
765 pp_cxx_left_bracket (cxx_pp);
768 tree dtype = TYPE_DOMAIN (t);
769 tree max = TYPE_MAX_VALUE (dtype);
770 if (host_integerp (max, 0))
771 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
772 else if (TREE_CODE (max) == MINUS_EXPR)
773 dump_expr (TREE_OPERAND (max, 0),
774 flags & ~TFF_EXPR_IN_PARENS);
776 dump_expr (fold_build2_loc (input_location,
777 PLUS_EXPR, dtype, max,
778 build_int_cst (dtype, 1)),
779 flags & ~TFF_EXPR_IN_PARENS);
781 pp_cxx_right_bracket (cxx_pp);
782 dump_type_suffix (TREE_TYPE (t), flags);
786 case IDENTIFIER_NODE:
791 case TEMPLATE_TYPE_PARM:
792 case TEMPLATE_TEMPLATE_PARM:
793 case BOUND_TEMPLATE_TEMPLATE_PARM:
805 case TYPE_PACK_EXPANSION:
806 case FIXED_POINT_TYPE:
810 pp_unsupported_tree (cxx_pp, t);
812 /* Don't mark it here, we should have already done in
819 dump_global_iord (tree t)
821 const char *p = NULL;
823 if (DECL_GLOBAL_CTOR_P (t))
824 p = M_("(static initializers for %s)");
825 else if (DECL_GLOBAL_DTOR_P (t))
826 p = M_("(static destructors for %s)");
830 pp_printf (pp_base (cxx_pp), p, input_filename);
834 dump_simple_decl (tree t, tree type, int flags)
836 if (flags & TFF_DECL_SPECIFIERS)
838 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
839 pp_maybe_space (cxx_pp);
841 if (! (flags & TFF_UNQUALIFIED_NAME)
842 && (!DECL_INITIAL (t)
843 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
844 dump_scope (CP_DECL_CONTEXT (t), flags);
845 flags &= ~TFF_UNQUALIFIED_NAME;
846 if ((flags & TFF_DECL_SPECIFIERS)
847 && DECL_TEMPLATE_PARM_P (t)
848 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
849 pp_string (cxx_pp, "...");
851 dump_decl (DECL_NAME (t), flags);
853 pp_string (cxx_pp, M_("<anonymous>"));
854 if (flags & TFF_DECL_SPECIFIERS)
855 dump_type_suffix (type, flags);
858 /* Dump a human readable string for the decl T under control of FLAGS. */
861 dump_decl (tree t, int flags)
866 switch (TREE_CODE (t))
869 /* Don't say 'typedef class A' */
870 if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t))
872 if ((flags & TFF_DECL_SPECIFIERS)
873 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
875 /* Say `class T' not just `T'. */
876 pp_cxx_ws_string (cxx_pp, "class");
878 /* Emit the `...' for a parameter pack. */
879 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
880 pp_cxx_ws_string (cxx_pp, "...");
883 dump_type (TREE_TYPE (t), flags);
886 if (flags & TFF_DECL_SPECIFIERS)
887 pp_cxx_ws_string (cxx_pp, "typedef");
888 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
889 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
894 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
896 pp_string (cxx_pp, M_("vtable for "));
897 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
898 dump_type (DECL_CONTEXT (t), flags);
901 /* Else fall through. */
904 dump_simple_decl (t, TREE_TYPE (t), flags);
908 pp_string (cxx_pp, M_("<return value> "));
909 dump_simple_decl (t, TREE_TYPE (t), flags);
913 if (flags & TFF_DECL_SPECIFIERS)
914 pp_cxx_declaration (cxx_pp, t);
917 if (! (flags & TFF_UNQUALIFIED_NAME))
918 dump_scope (CP_DECL_CONTEXT (t), flags);
919 flags &= ~TFF_UNQUALIFIED_NAME;
920 if (DECL_NAME (t) == NULL_TREE)
921 pp_string (cxx_pp, M_("<unnamed>"));
923 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
928 pp_expression (cxx_pp, t);
932 dump_decl (TREE_OPERAND (t, 0), flags);
933 pp_cxx_left_bracket (cxx_pp);
934 dump_decl (TREE_OPERAND (t, 1), flags);
935 pp_cxx_right_bracket (cxx_pp);
938 /* So that we can do dump_decl on an aggr type. */
942 dump_type (t, flags);
946 /* This is a pseudo destructor call which has not been folded into
947 a PSEUDO_DTOR_EXPR yet. */
948 pp_cxx_complement (cxx_pp);
949 dump_type (TREE_OPERAND (t, 0), flags);
956 /* These special cases are duplicated here so that other functions
957 can feed identifiers to error and get them demangled properly. */
958 case IDENTIFIER_NODE:
959 if (IDENTIFIER_TYPENAME_P (t))
961 pp_cxx_ws_string (cxx_pp, "operator");
962 /* Not exactly IDENTIFIER_TYPE_VALUE. */
963 dump_type (TREE_TYPE (t), flags);
967 pp_cxx_tree_identifier (cxx_pp, t);
974 if (DECL_CLASS_SCOPE_P (t))
976 dump_type (DECL_CONTEXT (t), flags);
977 pp_cxx_colon_colon (cxx_pp);
979 else if (DECL_CONTEXT (t))
981 dump_decl (DECL_CONTEXT (t), flags);
982 pp_cxx_colon_colon (cxx_pp);
984 dump_decl (DECL_NAME (t), flags);
988 /* If there's only one function, just treat it like an ordinary
994 if (! DECL_LANG_SPECIFIC (t))
995 pp_string (cxx_pp, M_("<built-in>"));
996 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
997 dump_global_iord (t);
999 dump_function_decl (t, flags);
1003 dump_template_decl (t, flags);
1006 case TEMPLATE_ID_EXPR:
1008 tree name = TREE_OPERAND (t, 0);
1010 if (is_overloaded_fn (name))
1011 name = DECL_NAME (get_first_fn (name));
1012 dump_decl (name, flags);
1013 pp_cxx_begin_template_argument_list (cxx_pp);
1014 if (TREE_OPERAND (t, 1))
1015 dump_template_argument_list (TREE_OPERAND (t, 1), NULL_TREE, flags);
1016 pp_cxx_end_template_argument_list (cxx_pp);
1021 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
1025 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
1026 || (DECL_INITIAL (t) &&
1027 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
1028 dump_simple_decl (t, TREE_TYPE (t), flags);
1029 else if (DECL_NAME (t))
1030 dump_decl (DECL_NAME (t), flags);
1031 else if (DECL_INITIAL (t))
1032 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
1034 pp_string (cxx_pp, M_("<enumerator>"));
1038 pp_cxx_ws_string (cxx_pp, "using");
1039 dump_type (USING_DECL_SCOPE (t), flags);
1040 pp_cxx_colon_colon (cxx_pp);
1041 dump_decl (DECL_NAME (t), flags);
1045 pp_cxx_declaration (cxx_pp, t);
1049 dump_decl (BASELINK_FUNCTIONS (t), flags);
1052 case NON_DEPENDENT_EXPR:
1053 dump_expr (t, flags);
1056 case TEMPLATE_TYPE_PARM:
1057 if (flags & TFF_DECL_SPECIFIERS)
1058 pp_cxx_declaration (cxx_pp, t);
1060 pp_type_id (cxx_pp, t);
1063 case UNBOUND_CLASS_TEMPLATE:
1064 case TYPE_PACK_EXPANSION:
1066 dump_type (t, flags);
1070 pp_unsupported_tree (cxx_pp, t);
1071 /* Fall through to error. */
1074 pp_string (cxx_pp, M_("<declaration error>"));
1079 /* Dump a template declaration T under control of FLAGS. This means the
1080 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1083 dump_template_decl (tree t, int flags)
1085 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1089 if (flags & TFF_TEMPLATE_HEADER)
1091 for (parms = orig_parms = nreverse (orig_parms);
1093 parms = TREE_CHAIN (parms))
1095 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1096 int len = TREE_VEC_LENGTH (inner_parms);
1098 pp_cxx_ws_string (cxx_pp, "template");
1099 pp_cxx_begin_template_argument_list (cxx_pp);
1101 /* If we've shown the template prefix, we'd better show the
1102 parameters' and decl's type too. */
1103 flags |= TFF_DECL_SPECIFIERS;
1105 for (i = 0; i < len; i++)
1108 pp_separate_with_comma (cxx_pp);
1109 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1111 pp_cxx_end_template_argument_list (cxx_pp);
1112 pp_cxx_whitespace (cxx_pp);
1114 nreverse(orig_parms);
1116 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1118 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1119 pp_cxx_ws_string (cxx_pp, "class");
1121 /* If this is a parameter pack, print the ellipsis. */
1122 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1123 pp_cxx_ws_string (cxx_pp, "...");
1127 if (DECL_TEMPLATE_RESULT (t)
1128 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1129 dump_type (TREE_TYPE (t),
1130 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1131 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1132 else if (DECL_TEMPLATE_RESULT (t)
1133 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1134 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1137 gcc_assert (TREE_TYPE (t));
1138 switch (NEXT_CODE (t))
1142 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1145 /* This case can occur with some invalid code. */
1146 dump_type (TREE_TYPE (t),
1147 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1148 | (flags & TFF_DECL_SPECIFIERS
1149 ? TFF_CLASS_KEY_OR_ENUM : 0));
1154 /* find_typenames looks through the type of the function template T
1155 and returns a VEC containing any typedefs or TYPENAME_TYPEs it finds. */
1157 struct find_typenames_t
1159 struct pointer_set_t *p_set;
1160 VEC (tree,gc) *typenames;
1164 find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
1166 struct find_typenames_t *d = (struct find_typenames_t *)data;
1167 tree mv = NULL_TREE;
1169 if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp)))
1170 /* Add the type of the typedef without any additional cv-quals. */
1171 mv = TREE_TYPE (TYPE_NAME (*tp));
1172 else if (TREE_CODE (*tp) == TYPENAME_TYPE)
1173 /* Add the typename without any cv-qualifiers. */
1174 mv = TYPE_MAIN_VARIANT (*tp);
1176 if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv)))
1177 VEC_safe_push (tree, gc, d->typenames, mv);
1179 /* Search into class template arguments, which cp_walk_subtrees
1181 if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp))
1182 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r,
1188 static VEC(tree,gc) *
1189 find_typenames (tree t)
1191 struct find_typenames_t ft;
1192 ft.p_set = pointer_set_create ();
1193 ft.typenames = NULL;
1194 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
1195 find_typenames_r, &ft, ft.p_set);
1196 pointer_set_destroy (ft.p_set);
1197 return ft.typenames;
1200 /* Pretty print a function decl. There are several ways we want to print a
1201 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1202 As error can only apply the '#' flag once to give 0 and 1 for V, there
1203 is %D which doesn't print the throw specs, and %F which does. */
1206 dump_function_decl (tree t, int flags)
1210 tree cname = NULL_TREE;
1211 tree template_args = NULL_TREE;
1212 tree template_parms = NULL_TREE;
1213 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1214 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1216 VEC(tree,gc) *typenames = NULL;
1218 flags &= ~TFF_UNQUALIFIED_NAME;
1219 if (TREE_CODE (t) == TEMPLATE_DECL)
1220 t = DECL_TEMPLATE_RESULT (t);
1222 /* Save the exceptions, in case t is a specialization and we are
1223 emitting an error about incompatible specifications. */
1224 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1226 /* Pretty print template instantiations only. */
1227 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
1228 && flag_pretty_templates)
1232 template_args = DECL_TI_ARGS (t);
1233 tmpl = most_general_template (t);
1234 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1236 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1238 typenames = find_typenames (t);
1242 fntype = TREE_TYPE (t);
1243 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1245 if (DECL_CLASS_SCOPE_P (t))
1246 cname = DECL_CONTEXT (t);
1247 /* This is for partially instantiated template methods. */
1248 else if (TREE_CODE (fntype) == METHOD_TYPE)
1249 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1251 if (!(flags & TFF_DECL_SPECIFIERS))
1253 else if (DECL_STATIC_FUNCTION_P (t))
1254 pp_cxx_ws_string (cxx_pp, "static");
1255 else if (DECL_VIRTUAL_P (t))
1256 pp_cxx_ws_string (cxx_pp, "virtual");
1258 /* Print the return type? */
1260 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1261 && !DECL_DESTRUCTOR_P (t);
1263 dump_type_prefix (TREE_TYPE (fntype), flags);
1265 /* Print the function name. */
1266 if (!do_outer_scope)
1270 dump_type (cname, flags);
1271 pp_cxx_colon_colon (cxx_pp);
1274 dump_scope (CP_DECL_CONTEXT (t), flags);
1276 dump_function_name (t, flags);
1278 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1280 dump_parameters (parmtypes, flags);
1282 if (TREE_CODE (fntype) == METHOD_TYPE)
1284 pp_base (cxx_pp)->padding = pp_before;
1285 pp_cxx_cv_qualifier_seq
1286 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1289 if (flags & TFF_EXCEPTION_SPECIFICATION)
1291 pp_base (cxx_pp)->padding = pp_before;
1292 dump_exception_spec (exceptions, flags);
1296 dump_type_suffix (TREE_TYPE (fntype), flags);
1299 /* If T is a template instantiation, dump the parameter binding. */
1300 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1302 pp_cxx_whitespace (cxx_pp);
1303 pp_cxx_left_bracket (cxx_pp);
1304 pp_cxx_ws_string (cxx_pp, M_("with"));
1305 pp_cxx_whitespace (cxx_pp);
1306 dump_template_bindings (template_parms, template_args, typenames);
1307 pp_cxx_right_bracket (cxx_pp);
1311 /* Print a parameter list. If this is for a member function, the
1312 member object ptr (and any other hidden args) should have
1313 already been removed. */
1316 dump_parameters (tree parmtypes, int flags)
1319 pp_cxx_left_paren (cxx_pp);
1321 for (first = 1; parmtypes != void_list_node;
1322 parmtypes = TREE_CHAIN (parmtypes))
1325 pp_separate_with_comma (cxx_pp);
1329 pp_cxx_ws_string (cxx_pp, "...");
1333 dump_type (TREE_VALUE (parmtypes), flags);
1335 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1337 pp_cxx_whitespace (cxx_pp);
1339 pp_cxx_whitespace (cxx_pp);
1340 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1344 pp_cxx_right_paren (cxx_pp);
1347 /* Print an exception specification. T is the exception specification. */
1350 dump_exception_spec (tree t, int flags)
1354 pp_cxx_ws_string (cxx_pp, "throw");
1355 pp_cxx_whitespace (cxx_pp);
1356 pp_cxx_left_paren (cxx_pp);
1357 if (TREE_VALUE (t) != NULL_TREE)
1360 dump_type (TREE_VALUE (t), flags);
1364 pp_separate_with_comma (cxx_pp);
1366 pp_cxx_right_paren (cxx_pp);
1370 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1371 and destructors properly. */
1374 dump_function_name (tree t, int flags)
1376 tree name = DECL_NAME (t);
1378 /* We can get here with a decl that was synthesized by language-
1379 independent machinery (e.g. coverage.c) in which case it won't
1380 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1381 will crash. In this case it is safe just to print out the
1383 if (!DECL_LANG_SPECIFIC (t))
1385 pp_cxx_tree_identifier (cxx_pp, name);
1389 if (TREE_CODE (t) == TEMPLATE_DECL)
1390 t = DECL_TEMPLATE_RESULT (t);
1392 /* Don't let the user see __comp_ctor et al. */
1393 if (DECL_CONSTRUCTOR_P (t)
1394 || DECL_DESTRUCTOR_P (t))
1395 name = constructor_name (DECL_CONTEXT (t));
1397 if (DECL_DESTRUCTOR_P (t))
1399 pp_cxx_complement (cxx_pp);
1400 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1402 else if (DECL_CONV_FN_P (t))
1404 /* This cannot use the hack that the operator's return
1405 type is stashed off of its name because it may be
1406 used for error reporting. In the case of conflicting
1407 declarations, both will have the same name, yet
1408 the types will be different, hence the TREE_TYPE field
1409 of the first name will be clobbered by the second. */
1410 pp_cxx_ws_string (cxx_pp, "operator");
1411 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1413 else if (name && IDENTIFIER_OPNAME_P (name))
1414 pp_cxx_tree_identifier (cxx_pp, name);
1416 dump_decl (name, flags);
1418 if (DECL_TEMPLATE_INFO (t)
1419 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1420 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1421 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1422 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1425 /* Dump the template parameters from the template info INFO under control of
1426 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1427 specialization (partial or complete). For partial specializations we show
1428 the specialized parameter values. For a primary template we show no
1432 dump_template_parms (tree info, int primary, int flags)
1434 tree args = info ? TI_ARGS (info) : NULL_TREE;
1436 if (primary && flags & TFF_TEMPLATE_NAME)
1438 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1439 pp_cxx_begin_template_argument_list (cxx_pp);
1441 /* Be careful only to print things when we have them, so as not
1442 to crash producing error messages. */
1443 if (args && !primary)
1446 /* We don't know the parms for a friend template specialization. */
1447 tree params = (TREE_CODE (TI_TEMPLATE (info)) == TEMPLATE_DECL
1448 ? DECL_INNERMOST_TEMPLATE_PARMS (TI_TEMPLATE (info))
1451 len = count_non_default_template_args (args, params);
1453 args = INNERMOST_TEMPLATE_ARGS (args);
1454 for (ix = 0; ix != len; ix++)
1456 tree arg = TREE_VEC_ELT (args, ix);
1458 /* Only print a comma if we know there is an argument coming. In
1459 the case of an empty template argument pack, no actual
1460 argument will be printed. */
1462 && (!ARGUMENT_PACK_P (arg)
1463 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1464 pp_separate_with_comma (cxx_pp);
1467 pp_string (cxx_pp, M_("<template parameter error>"));
1469 dump_template_argument (arg, flags);
1474 tree tpl = TI_TEMPLATE (info);
1475 tree parms = DECL_TEMPLATE_PARMS (tpl);
1478 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1479 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1481 for (ix = 0; ix != len; ix++)
1485 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1487 pp_string (cxx_pp, M_("<template parameter error>"));
1491 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1494 pp_separate_with_comma (cxx_pp);
1496 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1499 pp_cxx_end_template_argument_list (cxx_pp);
1502 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1503 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1506 dump_call_expr_args (tree t, int flags, bool skipfirst)
1509 call_expr_arg_iterator iter;
1511 pp_cxx_left_paren (cxx_pp);
1512 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1518 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1519 if (more_call_expr_args_p (&iter))
1520 pp_separate_with_comma (cxx_pp);
1523 pp_cxx_right_paren (cxx_pp);
1526 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1527 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1531 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1534 aggr_init_expr_arg_iterator iter;
1536 pp_cxx_left_paren (cxx_pp);
1537 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1543 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1544 if (more_aggr_init_expr_args_p (&iter))
1545 pp_separate_with_comma (cxx_pp);
1548 pp_cxx_right_paren (cxx_pp);
1551 /* Print out a list of initializers (subr of dump_expr). */
1554 dump_expr_list (tree l, int flags)
1558 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1561 pp_separate_with_comma (cxx_pp);
1565 /* Print out a vector of initializers (subr of dump_expr). */
1568 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1570 unsigned HOST_WIDE_INT idx;
1573 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1575 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1576 if (idx != VEC_length (constructor_elt, v) - 1)
1577 pp_separate_with_comma (cxx_pp);
1582 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1583 function. Resolve it to a close relative -- in the sense of static
1584 type -- variant being overridden. That is close to what was written in
1585 the source code. Subroutine of dump_expr. */
1588 resolve_virtual_fun_from_obj_type_ref (tree ref)
1590 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1591 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1592 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1595 fun = TREE_CHAIN (fun);
1596 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1597 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1603 /* Print out an expression E under control of FLAGS. */
1606 dump_expr (tree t, int flags)
1611 if (STATEMENT_CLASS_P (t))
1613 pp_cxx_ws_string (cxx_pp, M_("<statement>"));
1617 switch (TREE_CODE (t))
1625 case NAMESPACE_DECL:
1628 case IDENTIFIER_NODE:
1629 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1636 pp_constant (cxx_pp, t);
1640 /* While waiting for caret diagnostics, avoid printing
1641 __cxa_allocate_exception, __cxa_throw, and the like. */
1642 pp_cxx_ws_string (cxx_pp, M_("<throw-expression>"));
1646 pp_ampersand (cxx_pp);
1647 dump_type (PTRMEM_CST_CLASS (t), flags);
1648 pp_cxx_colon_colon (cxx_pp);
1649 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1653 pp_cxx_left_paren (cxx_pp);
1654 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1655 pp_separate_with_comma (cxx_pp);
1656 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1657 pp_cxx_right_paren (cxx_pp);
1661 pp_cxx_left_paren (cxx_pp);
1662 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1663 pp_string (cxx_pp, " ? ");
1664 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1665 pp_string (cxx_pp, " : ");
1666 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1667 pp_cxx_right_paren (cxx_pp);
1671 if (TREE_HAS_CONSTRUCTOR (t))
1673 pp_cxx_ws_string (cxx_pp, "new");
1674 pp_cxx_whitespace (cxx_pp);
1675 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1678 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1681 case AGGR_INIT_EXPR:
1683 tree fn = NULL_TREE;
1685 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1686 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1688 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1690 if (DECL_CONSTRUCTOR_P (fn))
1691 dump_type (DECL_CONTEXT (fn), flags);
1696 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1698 dump_aggr_init_expr_args (t, flags, true);
1703 tree fn = CALL_EXPR_FN (t);
1704 bool skipfirst = false;
1706 if (TREE_CODE (fn) == ADDR_EXPR)
1707 fn = TREE_OPERAND (fn, 0);
1709 /* Nobody is interested in seeing the guts of vcalls. */
1710 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1711 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1713 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1715 tree ob = CALL_EXPR_ARG (t, 0);
1716 if (TREE_CODE (ob) == ADDR_EXPR)
1718 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1719 pp_cxx_dot (cxx_pp);
1721 else if (TREE_CODE (ob) != PARM_DECL
1722 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1724 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1725 pp_cxx_arrow (cxx_pp);
1729 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1730 dump_call_expr_args (t, flags, skipfirst);
1735 /* Note that this only works for G++ target exprs. If somebody
1736 builds a general TARGET_EXPR, there's no way to represent that
1737 it initializes anything other that the parameter slot for the
1738 default argument. Note we may have cleared out the first
1739 operand in expand_expr, so don't go killing ourselves. */
1740 if (TREE_OPERAND (t, 1))
1741 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1744 case POINTER_PLUS_EXPR:
1745 dump_binary_op ("+", t, flags);
1753 case TRUNC_DIV_EXPR:
1754 case TRUNC_MOD_EXPR:
1762 case TRUTH_ANDIF_EXPR:
1763 case TRUTH_ORIF_EXPR:
1770 case EXACT_DIV_EXPR:
1771 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1775 case FLOOR_DIV_EXPR:
1776 case ROUND_DIV_EXPR:
1778 dump_binary_op ("/", t, flags);
1782 case FLOOR_MOD_EXPR:
1783 case ROUND_MOD_EXPR:
1784 dump_binary_op ("%", t, flags);
1789 tree ob = TREE_OPERAND (t, 0);
1790 if (TREE_CODE (ob) == INDIRECT_REF)
1792 ob = TREE_OPERAND (ob, 0);
1793 if (TREE_CODE (ob) != PARM_DECL
1795 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1797 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1798 pp_cxx_arrow (cxx_pp);
1803 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1804 pp_cxx_dot (cxx_pp);
1806 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1811 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1812 pp_cxx_left_bracket (cxx_pp);
1813 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1814 pp_cxx_right_bracket (cxx_pp);
1817 case UNARY_PLUS_EXPR:
1818 dump_unary_op ("+", t, flags);
1822 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1823 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1824 /* An ADDR_EXPR can have reference type. In that case, we
1825 shouldn't print the `&' doing so indicates to the user
1826 that the expression has pointer type. */
1828 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1829 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1830 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1831 dump_unary_op ("&&", t, flags);
1833 dump_unary_op ("&", t, flags);
1837 if (TREE_HAS_CONSTRUCTOR (t))
1839 t = TREE_OPERAND (t, 0);
1840 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1841 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1842 dump_call_expr_args (t, flags, true);
1846 if (TREE_OPERAND (t,0) != NULL_TREE
1847 && TREE_TYPE (TREE_OPERAND (t, 0))
1848 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1849 dump_expr (TREE_OPERAND (t, 0), flags);
1851 dump_unary_op ("*", t, flags);
1857 case TRUTH_NOT_EXPR:
1858 case PREDECREMENT_EXPR:
1859 case PREINCREMENT_EXPR:
1860 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1863 case POSTDECREMENT_EXPR:
1864 case POSTINCREMENT_EXPR:
1865 pp_cxx_left_paren (cxx_pp);
1866 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1867 pp_cxx_ws_string (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1868 pp_cxx_right_paren (cxx_pp);
1871 case NON_LVALUE_EXPR:
1872 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1873 should be another level of INDIRECT_REF so that I don't have to do
1875 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1877 tree next = TREE_TYPE (TREE_TYPE (t));
1879 while (TREE_CODE (next) == POINTER_TYPE)
1880 next = TREE_TYPE (next);
1882 if (TREE_CODE (next) == FUNCTION_TYPE)
1884 if (flags & TFF_EXPR_IN_PARENS)
1885 pp_cxx_left_paren (cxx_pp);
1886 pp_cxx_star (cxx_pp);
1887 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1888 if (flags & TFF_EXPR_IN_PARENS)
1889 pp_cxx_right_paren (cxx_pp);
1892 /* Else fall through. */
1894 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1898 case VIEW_CONVERT_EXPR:
1900 tree op = TREE_OPERAND (t, 0);
1902 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1904 /* It is a cast, but we cannot tell whether it is a
1905 reinterpret or static cast. Use the C style notation. */
1906 if (flags & TFF_EXPR_IN_PARENS)
1907 pp_cxx_left_paren (cxx_pp);
1908 pp_cxx_left_paren (cxx_pp);
1909 dump_type (TREE_TYPE (t), flags);
1910 pp_cxx_right_paren (cxx_pp);
1911 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1912 if (flags & TFF_EXPR_IN_PARENS)
1913 pp_cxx_right_paren (cxx_pp);
1916 dump_expr (op, flags);
1921 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1923 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1925 if (integer_zerop (idx))
1927 /* A NULL pointer-to-member constant. */
1928 pp_cxx_left_paren (cxx_pp);
1929 pp_cxx_left_paren (cxx_pp);
1930 dump_type (TREE_TYPE (t), flags);
1931 pp_cxx_right_paren (cxx_pp);
1932 pp_character (cxx_pp, '0');
1933 pp_cxx_right_paren (cxx_pp);
1936 else if (host_integerp (idx, 0))
1939 unsigned HOST_WIDE_INT n;
1941 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1942 t = TYPE_METHOD_BASETYPE (t);
1943 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1945 n = tree_low_cst (idx, 0);
1947 /* Map vtable index back one, to allow for the null pointer to
1951 while (n > 0 && virtuals)
1954 virtuals = TREE_CHAIN (virtuals);
1958 dump_expr (BV_FN (virtuals),
1959 flags | TFF_EXPR_IN_PARENS);
1964 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
1966 dump_type (TREE_TYPE (t), 0);
1967 pp_cxx_left_paren (cxx_pp);
1968 pp_cxx_right_paren (cxx_pp);
1972 pp_cxx_left_brace (cxx_pp);
1973 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
1974 pp_cxx_right_brace (cxx_pp);
1981 tree ob = TREE_OPERAND (t, 0);
1982 if (is_dummy_object (ob))
1984 t = TREE_OPERAND (t, 1);
1985 if (TREE_CODE (t) == FUNCTION_DECL)
1987 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1988 else if (BASELINK_P (t))
1989 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1990 flags | TFF_EXPR_IN_PARENS);
1992 dump_decl (t, flags);
1996 if (TREE_CODE (ob) == INDIRECT_REF)
1998 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1999 pp_cxx_arrow (cxx_pp);
2000 pp_cxx_star (cxx_pp);
2004 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
2005 pp_cxx_dot (cxx_pp);
2006 pp_cxx_star (cxx_pp);
2008 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2013 case TEMPLATE_PARM_INDEX:
2014 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
2018 if (TREE_OPERAND (t, 0) == NULL_TREE
2019 || TREE_CHAIN (TREE_OPERAND (t, 0)))
2021 dump_type (TREE_TYPE (t), flags);
2022 pp_cxx_left_paren (cxx_pp);
2023 dump_expr_list (TREE_OPERAND (t, 0), flags);
2024 pp_cxx_right_paren (cxx_pp);
2028 pp_cxx_left_paren (cxx_pp);
2029 dump_type (TREE_TYPE (t), flags);
2030 pp_cxx_right_paren (cxx_pp);
2031 pp_cxx_left_paren (cxx_pp);
2032 dump_expr_list (TREE_OPERAND (t, 0), flags);
2033 pp_cxx_right_paren (cxx_pp);
2037 case STATIC_CAST_EXPR:
2038 pp_cxx_ws_string (cxx_pp, "static_cast");
2040 case REINTERPRET_CAST_EXPR:
2041 pp_cxx_ws_string (cxx_pp, "reinterpret_cast");
2043 case CONST_CAST_EXPR:
2044 pp_cxx_ws_string (cxx_pp, "const_cast");
2046 case DYNAMIC_CAST_EXPR:
2047 pp_cxx_ws_string (cxx_pp, "dynamic_cast");
2049 pp_cxx_begin_template_argument_list (cxx_pp);
2050 dump_type (TREE_TYPE (t), flags);
2051 pp_cxx_end_template_argument_list (cxx_pp);
2052 pp_cxx_left_paren (cxx_pp);
2053 dump_expr (TREE_OPERAND (t, 0), flags);
2054 pp_cxx_right_paren (cxx_pp);
2058 dump_expr (TREE_OPERAND (t, 0), flags);
2059 pp_cxx_arrow (cxx_pp);
2064 if (TREE_CODE (t) == SIZEOF_EXPR)
2065 pp_cxx_ws_string (cxx_pp, "sizeof");
2068 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
2069 pp_cxx_ws_string (cxx_pp, "__alignof__");
2071 pp_cxx_whitespace (cxx_pp);
2072 pp_cxx_left_paren (cxx_pp);
2073 if (TYPE_P (TREE_OPERAND (t, 0)))
2074 dump_type (TREE_OPERAND (t, 0), flags);
2076 dump_expr (TREE_OPERAND (t, 0), flags);
2077 pp_cxx_right_paren (cxx_pp);
2082 pp_cxx_ws_string (cxx_pp, operator_name_info[TREE_CODE (t)].name);
2083 pp_cxx_whitespace (cxx_pp);
2084 dump_expr (TREE_OPERAND (t, 0), flags);
2088 pp_string (cxx_pp, M_("<unparsed>"));
2091 case TRY_CATCH_EXPR:
2092 case WITH_CLEANUP_EXPR:
2093 case CLEANUP_POINT_EXPR:
2094 dump_expr (TREE_OPERAND (t, 0), flags);
2097 case PSEUDO_DTOR_EXPR:
2098 dump_expr (TREE_OPERAND (t, 2), flags);
2099 pp_cxx_dot (cxx_pp);
2100 dump_type (TREE_OPERAND (t, 0), flags);
2101 pp_cxx_colon_colon (cxx_pp);
2102 pp_cxx_complement (cxx_pp);
2103 dump_type (TREE_OPERAND (t, 1), flags);
2106 case TEMPLATE_ID_EXPR:
2107 dump_decl (t, flags);
2113 case STATEMENT_LIST:
2114 /* We don't yet have a way of dumping statements in a
2115 human-readable format. */
2116 pp_string (cxx_pp, "({...})");
2120 pp_string (cxx_pp, "while (1) { ");
2121 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2122 pp_cxx_right_brace (cxx_pp);
2126 pp_string (cxx_pp, "if (");
2127 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2128 pp_string (cxx_pp, ") break; ");
2132 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2135 case EMPTY_CLASS_EXPR:
2136 dump_type (TREE_TYPE (t), flags);
2137 pp_cxx_left_paren (cxx_pp);
2138 pp_cxx_right_paren (cxx_pp);
2141 case NON_DEPENDENT_EXPR:
2142 dump_expr (TREE_OPERAND (t, 0), flags);
2145 case ARGUMENT_PACK_SELECT:
2146 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2158 pp_type_specifier_seq (cxx_pp, t);
2162 /* We get here when we want to print a dependent type as an
2163 id-expression, without any disambiguator decoration. */
2164 pp_id_expression (cxx_pp, t);
2167 case TEMPLATE_TYPE_PARM:
2168 case BOUND_TEMPLATE_TEMPLATE_PARM:
2169 dump_type (t, flags);
2173 pp_cxx_trait_expression (cxx_pp, t);
2177 pp_cxx_va_arg_expression (cxx_pp, t);
2181 pp_cxx_offsetof_expression (cxx_pp, t);
2185 case EXPR_PACK_EXPANSION:
2192 case VEC_DELETE_EXPR:
2198 case UNORDERED_EXPR:
2208 case FIX_TRUNC_EXPR:
2210 pp_expression (cxx_pp, t);
2213 case TRUTH_AND_EXPR:
2215 case TRUTH_XOR_EXPR:
2216 if (flags & TFF_EXPR_IN_PARENS)
2217 pp_cxx_left_paren (cxx_pp);
2218 pp_expression (cxx_pp, t);
2219 if (flags & TFF_EXPR_IN_PARENS)
2220 pp_cxx_right_paren (cxx_pp);
2224 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2227 /* This list is incomplete, but should suffice for now.
2228 It is very important that `sorry' does not call
2229 `report_error_function'. That could cause an infinite loop. */
2231 pp_unsupported_tree (cxx_pp, t);
2232 /* fall through to ERROR_MARK... */
2234 pp_string (cxx_pp, M_("<expression error>"));
2240 dump_binary_op (const char *opstring, tree t, int flags)
2242 pp_cxx_left_paren (cxx_pp);
2243 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2244 pp_cxx_whitespace (cxx_pp);
2246 pp_cxx_ws_string (cxx_pp, opstring);
2248 pp_string (cxx_pp, M_("<unknown operator>"));
2249 pp_cxx_whitespace (cxx_pp);
2250 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2251 pp_cxx_right_paren (cxx_pp);
2255 dump_unary_op (const char *opstring, tree t, int flags)
2257 if (flags & TFF_EXPR_IN_PARENS)
2258 pp_cxx_left_paren (cxx_pp);
2259 pp_cxx_ws_string (cxx_pp, opstring);
2260 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2261 if (flags & TFF_EXPR_IN_PARENS)
2262 pp_cxx_right_paren (cxx_pp);
2266 reinit_cxx_pp (void)
2268 pp_clear_output_area (cxx_pp);
2269 pp_base (cxx_pp)->padding = pp_none;
2270 pp_indentation (cxx_pp) = 0;
2271 pp_needs_newline (cxx_pp) = false;
2272 cxx_pp->enclosing_scope = current_function_decl;
2276 /* Exported interface to stringifying types, exprs and decls under TFF_*
2280 type_as_string (tree typ, int flags)
2283 pp_translate_identifiers (cxx_pp) = false;
2284 dump_type (typ, flags);
2285 return pp_formatted_text (cxx_pp);
2289 type_as_string_translate (tree typ, int flags)
2292 dump_type (typ, flags);
2293 return pp_formatted_text (cxx_pp);
2297 expr_as_string (tree decl, int flags)
2300 pp_translate_identifiers (cxx_pp) = false;
2301 dump_expr (decl, flags);
2302 return pp_formatted_text (cxx_pp);
2306 decl_as_string (tree decl, int flags)
2309 pp_translate_identifiers (cxx_pp) = false;
2310 dump_decl (decl, flags);
2311 return pp_formatted_text (cxx_pp);
2315 decl_as_string_translate (tree decl, int flags)
2318 dump_decl (decl, flags);
2319 return pp_formatted_text (cxx_pp);
2322 /* Generate the three forms of printable names for cxx_printable_name. */
2325 lang_decl_name (tree decl, int v, bool translate)
2329 ? decl_as_string_translate (decl, TFF_DECL_SPECIFIERS)
2330 : decl_as_string (decl, TFF_DECL_SPECIFIERS));
2333 pp_translate_identifiers (cxx_pp) = translate;
2335 && (DECL_CLASS_SCOPE_P (decl)
2336 || (DECL_NAMESPACE_SCOPE_P (decl)
2337 && CP_DECL_CONTEXT (decl) != global_namespace)))
2339 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2340 pp_cxx_colon_colon (cxx_pp);
2343 if (TREE_CODE (decl) == FUNCTION_DECL)
2344 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2346 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2348 return pp_formatted_text (cxx_pp);
2351 /* Return the location of a tree passed to %+ formats. */
2354 location_of (tree t)
2356 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2357 t = DECL_CONTEXT (t);
2358 else if (TYPE_P (t))
2359 t = TYPE_MAIN_DECL (t);
2360 else if (TREE_CODE (t) == OVERLOAD)
2361 t = OVL_FUNCTION (t);
2363 return DECL_SOURCE_LOCATION (t);
2366 /* Now the interfaces from error et al to dump_type et al. Each takes an
2367 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2371 decl_to_string (tree decl, int verbose)
2375 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2376 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2377 flags = TFF_CLASS_KEY_OR_ENUM;
2379 flags |= TFF_DECL_SPECIFIERS;
2380 else if (TREE_CODE (decl) == FUNCTION_DECL)
2381 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2382 flags |= TFF_TEMPLATE_HEADER;
2385 dump_decl (decl, flags);
2386 return pp_formatted_text (cxx_pp);
2390 expr_to_string (tree decl)
2393 dump_expr (decl, 0);
2394 return pp_formatted_text (cxx_pp);
2398 fndecl_to_string (tree fndecl, int verbose)
2402 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2403 | TFF_TEMPLATE_HEADER;
2405 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2407 dump_decl (fndecl, flags);
2408 return pp_formatted_text (cxx_pp);
2413 code_to_string (enum tree_code c)
2415 return tree_code_name [c];
2419 language_to_string (enum languages c)
2426 case lang_cplusplus:
2438 /* Return the proper printed version of a parameter to a C++ function. */
2441 parm_to_string (int p)
2445 pp_string (cxx_pp, "'this'");
2447 pp_decimal_int (cxx_pp, p + 1);
2448 return pp_formatted_text (cxx_pp);
2452 op_to_string (enum tree_code p)
2454 tree id = operator_name_info[(int) p].identifier;
2455 return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
2459 type_to_string (tree typ, int verbose)
2463 flags |= TFF_CLASS_KEY_OR_ENUM;
2464 flags |= TFF_TEMPLATE_HEADER;
2467 dump_type (typ, flags);
2468 return pp_formatted_text (cxx_pp);
2472 assop_to_string (enum tree_code p)
2474 tree id = assignment_operator_name_info[(int) p].identifier;
2475 return id ? IDENTIFIER_POINTER (id) : M_("{unknown}");
2479 args_to_string (tree p, int verbose)
2483 flags |= TFF_CLASS_KEY_OR_ENUM;
2488 if (TYPE_P (TREE_VALUE (p)))
2489 return type_as_string_translate (p, flags);
2492 for (; p; p = TREE_CHAIN (p))
2494 if (TREE_VALUE (p) == null_node)
2495 pp_cxx_ws_string (cxx_pp, "NULL");
2497 dump_type (error_type (TREE_VALUE (p)), flags);
2499 pp_separate_with_comma (cxx_pp);
2501 return pp_formatted_text (cxx_pp);
2505 cv_to_string (tree p, int v)
2508 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2509 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2510 return pp_formatted_text (cxx_pp);
2513 /* Langhook for print_error_function. */
2515 cxx_print_error_function (diagnostic_context *context, const char *file,
2516 diagnostic_info *diagnostic)
2518 lhd_print_error_function (context, file, diagnostic);
2519 pp_base_set_prefix (context->printer, file);
2520 maybe_print_instantiation_context (context);
2524 cp_diagnostic_starter (diagnostic_context *context,
2525 diagnostic_info *diagnostic)
2527 diagnostic_report_current_module (context);
2528 cp_print_error_function (context, diagnostic);
2529 maybe_print_instantiation_context (context);
2530 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2534 cp_diagnostic_finalizer (diagnostic_context *context,
2535 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2537 pp_base_destroy_prefix (context->printer);
2540 /* Print current function onto BUFFER, in the process of reporting
2541 a diagnostic message. Called from cp_diagnostic_starter. */
2543 cp_print_error_function (diagnostic_context *context,
2544 diagnostic_info *diagnostic)
2546 if (diagnostic_last_function_changed (context, diagnostic))
2548 const char *old_prefix = context->printer->prefix;
2549 const char *file = LOCATION_FILE (diagnostic->location);
2550 tree abstract_origin = diagnostic->abstract_origin;
2551 char *new_prefix = (file && abstract_origin == NULL)
2552 ? file_name_as_prefix (file) : NULL;
2554 pp_base_set_prefix (context->printer, new_prefix);
2556 if (current_function_decl == NULL)
2557 pp_base_string (context->printer, _("At global scope:"));
2562 if (abstract_origin)
2564 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2565 while (TREE_CODE (ao) == BLOCK
2566 && BLOCK_ABSTRACT_ORIGIN (ao)
2567 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2568 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2569 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2573 fndecl = current_function_decl;
2575 pp_printf (context->printer, function_category (fndecl),
2576 cxx_printable_name_translate (fndecl, 2));
2578 while (abstract_origin)
2581 tree block = abstract_origin;
2583 locus = &BLOCK_SOURCE_LOCATION (block);
2585 block = BLOCK_SUPERCONTEXT (block);
2586 while (block && TREE_CODE (block) == BLOCK
2587 && BLOCK_ABSTRACT_ORIGIN (block))
2589 ao = BLOCK_ABSTRACT_ORIGIN (block);
2591 while (TREE_CODE (ao) == BLOCK
2592 && BLOCK_ABSTRACT_ORIGIN (ao)
2593 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2594 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2596 if (TREE_CODE (ao) == FUNCTION_DECL)
2601 else if (TREE_CODE (ao) != BLOCK)
2604 block = BLOCK_SUPERCONTEXT (block);
2607 abstract_origin = block;
2610 while (block && TREE_CODE (block) == BLOCK)
2611 block = BLOCK_SUPERCONTEXT (block);
2613 if (block && TREE_CODE (block) == FUNCTION_DECL)
2615 abstract_origin = NULL;
2619 expanded_location s = expand_location (*locus);
2620 pp_base_character (context->printer, ',');
2621 pp_base_newline (context->printer);
2624 if (flag_show_column && s.column != 0)
2625 pp_printf (context->printer,
2626 _(" inlined from %qs at %s:%d:%d"),
2627 cxx_printable_name_translate (fndecl, 2),
2628 s.file, s.line, s.column);
2630 pp_printf (context->printer,
2631 _(" inlined from %qs at %s:%d"),
2632 cxx_printable_name_translate (fndecl, 2),
2637 pp_printf (context->printer, _(" inlined from %qs"),
2638 cxx_printable_name_translate (fndecl, 2));
2641 pp_base_character (context->printer, ':');
2643 pp_base_newline (context->printer);
2645 diagnostic_set_last_function (context, diagnostic);
2646 pp_base_destroy_prefix (context->printer);
2647 context->printer->prefix = old_prefix;
2651 /* Returns a description of FUNCTION using standard terminology. The
2652 result is a format string of the form "In CATEGORY %qs". */
2654 function_category (tree fn)
2656 /* We can get called from the middle-end for diagnostics of function
2657 clones. Make sure we have language specific information before
2658 dereferencing it. */
2659 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn))
2660 && DECL_FUNCTION_MEMBER_P (fn))
2662 if (DECL_STATIC_FUNCTION_P (fn))
2663 return _("In static member function %qs");
2664 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2665 return _("In copy constructor %qs");
2666 else if (DECL_CONSTRUCTOR_P (fn))
2667 return _("In constructor %qs");
2668 else if (DECL_DESTRUCTOR_P (fn))
2669 return _("In destructor %qs");
2671 return _("In member function %qs");
2674 return _("In function %qs");
2677 /* Report the full context of a current template instantiation,
2680 print_instantiation_full_context (diagnostic_context *context)
2682 struct tinst_level *p = current_instantiation ();
2683 location_t location = input_location;
2687 if (current_function_decl != p->decl
2688 && current_function_decl != NULL_TREE)
2689 /* We can get here during the processing of some synthesized
2690 method. Then, P->DECL will be the function that's causing
2695 if (current_function_decl == p->decl)
2696 /* Avoid redundancy with the "In function" line. */;
2698 pp_verbatim (context->printer,
2699 _("%s: In instantiation of %qs:\n"),
2700 LOCATION_FILE (location),
2701 decl_as_string_translate (p->decl,
2702 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2704 location = p->locus;
2709 print_instantiation_partial_context (context, p, location);
2712 /* Same as above but less verbose. */
2714 print_instantiation_partial_context (diagnostic_context *context,
2715 struct tinst_level *t, location_t loc)
2717 expanded_location xloc;
2719 for (; ; t = t->next)
2721 xloc = expand_location (loc);
2724 str = decl_as_string_translate (t->decl,
2725 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE);
2726 if (flag_show_column)
2727 pp_verbatim (context->printer,
2728 _("%s:%d:%d: instantiated from %qs\n"),
2729 xloc.file, xloc.line, xloc.column, str);
2731 pp_verbatim (context->printer,
2732 _("%s:%d: instantiated from %qs\n"),
2733 xloc.file, xloc.line, str);
2736 if (flag_show_column)
2737 pp_verbatim (context->printer, _("%s:%d:%d: instantiated from here"),
2738 xloc.file, xloc.line, xloc.column);
2740 pp_verbatim (context->printer, _("%s:%d: instantiated from here"),
2741 xloc.file, xloc.line);
2742 pp_base_newline (context->printer);
2745 /* Called from cp_thing to print the template context for an error. */
2747 maybe_print_instantiation_context (diagnostic_context *context)
2749 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2752 record_last_problematic_instantiation ();
2753 print_instantiation_full_context (context);
2756 /* Report the bare minimum context of a template instantiation. */
2758 print_instantiation_context (void)
2760 print_instantiation_partial_context
2761 (global_dc, current_instantiation (), input_location);
2762 diagnostic_flush_buffer (global_dc);
2765 /* Called from output_format -- during diagnostic message processing --
2766 to handle C++ specific format specifier with the following meanings:
2767 %A function argument-list.
2771 %F function declaration.
2772 %L language as used in extern "lang".
2774 %P function parameter whose position is indicated by an integer.
2775 %Q assignment operator.
2779 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2780 int precision, bool wide, bool set_locus, bool verbose)
2784 #define next_tree (t = va_arg (*text->args_ptr, tree))
2785 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
2786 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
2787 #define next_int va_arg (*text->args_ptr, int)
2789 if (precision != 0 || wide)
2792 if (text->locus == NULL)
2797 case 'A': result = args_to_string (next_tree, verbose); break;
2798 case 'C': result = code_to_string (next_tcode); break;
2801 tree temp = next_tree;
2803 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
2805 temp = DECL_DEBUG_EXPR (temp);
2808 result = expr_to_string (temp);
2812 result = decl_to_string (temp, verbose);
2815 case 'E': result = expr_to_string (next_tree); break;
2816 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2817 case 'L': result = language_to_string (next_lang); break;
2818 case 'O': result = op_to_string (next_tcode); break;
2819 case 'P': result = parm_to_string (next_int); break;
2820 case 'Q': result = assop_to_string (next_tcode); break;
2821 case 'T': result = type_to_string (next_tree, verbose); break;
2822 case 'V': result = cv_to_string (next_tree, verbose); break;
2828 pp_base_string (pp, result);
2829 if (set_locus && t != NULL)
2830 *text->locus = location_of (t);
2838 /* Warn about the use of C++0x features when appropriate. */
2840 maybe_warn_cpp0x (const char* str)
2842 if ((cxx_dialect == cxx98) && !in_system_header)
2843 /* We really want to suppress this warning in system headers,
2844 because libstdc++ uses variadic templates even when we aren't
2846 pedwarn (input_location, 0, "%s only available with -std=c++0x or -std=gnu++0x", str);
2849 /* Warn about the use of variadic templates when appropriate. */
2851 maybe_warn_variadic_templates (void)
2853 maybe_warn_cpp0x ("variadic templates");
2857 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
2858 option OPT with text GMSGID. Use this function to report
2859 diagnostics for constructs that are invalid C++98, but valid
2862 pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...)
2864 diagnostic_info diagnostic;
2867 va_start (ap, gmsgid);
2868 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
2869 (cxx_dialect == cxx98) ? DK_PEDWARN : DK_WARNING);
2870 diagnostic.option_index = opt;
2872 return report_diagnostic (&diagnostic);