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, int);
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, int flags)
168 tree inner_args = INNERMOST_TEMPLATE_ARGS (args);
169 int n = TREE_VEC_LENGTH (inner_args);
172 if (params == NULL_TREE
173 /* We use this flag when generating debug information. We don't
174 want to expand templates at this point, for this may generate
175 new decls, which gets decl counts out of sync, which may in
176 turn cause codegen differences between compilations with and
178 || (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0
179 || !flag_pretty_templates)
182 for (last = n - 1; last >= 0; --last)
184 tree param = TREE_VEC_ELT (params, last);
185 tree def = TREE_PURPOSE (param);
189 if (uses_template_parms (def))
191 ++processing_template_decl;
192 /* This speculative substitution must not cause any classes to be
193 instantiated that otherwise wouldn't be. */
194 def = tsubst_copy_and_build (def, args, tf_no_class_instantiations,
195 NULL_TREE, false, true);
196 --processing_template_decl;
198 if (!cp_tree_equal (TREE_VEC_ELT (inner_args, last), def))
205 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
209 dump_template_argument_list (tree args, tree parms, int flags)
211 int n = count_non_default_template_args (args, parms, flags);
215 for (i = 0; i < n; ++i)
217 tree arg = TREE_VEC_ELT (args, i);
219 /* Only print a comma if we know there is an argument coming. In
220 the case of an empty template argument pack, no actual
221 argument will be printed. */
223 && (!ARGUMENT_PACK_P (arg)
224 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
225 pp_separate_with_comma (cxx_pp);
227 dump_template_argument (arg, flags);
232 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
235 dump_template_parameter (tree parm, int flags)
240 if (parm == error_mark_node)
243 p = TREE_VALUE (parm);
244 a = TREE_PURPOSE (parm);
246 if (TREE_CODE (p) == TYPE_DECL)
248 if (flags & TFF_DECL_SPECIFIERS)
250 pp_cxx_ws_string (cxx_pp, "class");
251 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
252 pp_cxx_ws_string (cxx_pp, "...");
254 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
256 else if (DECL_NAME (p))
257 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
259 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
262 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
264 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
266 pp_cxx_whitespace (cxx_pp);
268 pp_cxx_whitespace (cxx_pp);
269 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
270 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
272 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
276 /* Dump, under control of FLAGS, a template-parameter-list binding.
277 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
281 dump_template_bindings (tree parms, tree args, VEC(tree,gc)* typenames)
289 tree p = TREE_VALUE (parms);
290 int lvl = TMPL_PARMS_DEPTH (parms);
293 tree lvl_args = NULL_TREE;
295 /* Don't crash if we had an invalid argument list. */
296 if (TMPL_ARGS_DEPTH (args) >= lvl)
297 lvl_args = TMPL_ARGS_LEVEL (args, lvl);
299 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
301 tree arg = NULL_TREE;
303 /* Don't crash if we had an invalid argument list. */
304 if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx)
305 arg = TREE_VEC_ELT (lvl_args, arg_idx);
308 pp_separate_with_comma (cxx_pp);
309 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
310 pp_cxx_whitespace (cxx_pp);
312 pp_cxx_whitespace (cxx_pp);
315 if (ARGUMENT_PACK_P (arg))
316 pp_cxx_left_brace (cxx_pp);
317 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
318 if (ARGUMENT_PACK_P (arg))
319 pp_cxx_right_brace (cxx_pp);
322 pp_string (cxx_pp, M_("<missing>"));
328 parms = TREE_CHAIN (parms);
331 for (i = 0; VEC_iterate (tree, typenames, i, t); ++i)
334 pp_separate_with_comma (cxx_pp);
335 dump_type (t, TFF_PLAIN_IDENTIFIER);
336 pp_cxx_whitespace (cxx_pp);
338 pp_cxx_whitespace (cxx_pp);
339 t = tsubst (t, args, tf_none, NULL_TREE);
340 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
341 pp_simple_type_specifier doesn't know about it. */
342 t = strip_typedefs (t);
343 dump_type (t, TFF_PLAIN_IDENTIFIER);
347 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
351 dump_type (tree t, int flags)
356 if (TYPE_PTRMEMFUNC_P (t))
359 switch (TREE_CODE (t))
362 if (t == init_list_type_node)
363 pp_string (cxx_pp, M_("<brace-enclosed initializer list>"));
365 pp_string (cxx_pp, M_("<unresolved overloaded function type>"));
369 /* A list of function parms. */
370 dump_parameters (t, flags);
373 case IDENTIFIER_NODE:
374 pp_cxx_tree_identifier (cxx_pp, t);
378 dump_type (BINFO_TYPE (t), flags);
384 dump_aggr_type (t, flags);
388 if (flags & TFF_CHASE_TYPEDEF)
390 dump_type (DECL_ORIGINAL_TYPE (t)
391 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
394 /* Else fall through. */
398 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
407 case FIXED_POINT_TYPE:
408 pp_type_specifier_seq (cxx_pp, t);
411 case TEMPLATE_TEMPLATE_PARM:
412 /* For parameters inside template signature. */
413 if (TYPE_IDENTIFIER (t))
414 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
416 pp_cxx_canonical_template_parameter (cxx_pp, t);
419 case BOUND_TEMPLATE_TEMPLATE_PARM:
421 tree args = TYPE_TI_ARGS (t);
422 pp_cxx_cv_qualifier_seq (cxx_pp, t);
423 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
424 pp_cxx_begin_template_argument_list (cxx_pp);
425 dump_template_argument_list (args, NULL_TREE, flags);
426 pp_cxx_end_template_argument_list (cxx_pp);
430 case TEMPLATE_TYPE_PARM:
431 pp_cxx_cv_qualifier_seq (cxx_pp, t);
432 if (TYPE_IDENTIFIER (t))
433 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
435 pp_cxx_canonical_template_parameter
436 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
439 /* This is not always necessary for pointers and such, but doing this
440 reduces code size. */
449 dump_type_prefix (t, flags);
450 dump_type_suffix (t, flags);
454 if (! (flags & TFF_CHASE_TYPEDEF)
455 && DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
457 dump_decl (TYPE_NAME (t), TFF_PLAIN_IDENTIFIER);
460 pp_cxx_cv_qualifier_seq (cxx_pp, t);
461 pp_cxx_ws_string (cxx_pp,
462 TYPENAME_IS_ENUM_P (t) ? "enum"
463 : TYPENAME_IS_CLASS_P (t) ? "class"
465 dump_typename (t, flags);
468 case UNBOUND_CLASS_TEMPLATE:
469 if (! (flags & TFF_UNQUALIFIED_NAME))
471 dump_type (TYPE_CONTEXT (t), flags);
472 pp_cxx_colon_colon (cxx_pp);
474 pp_cxx_ws_string (cxx_pp, "template");
475 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
479 pp_cxx_ws_string (cxx_pp, "__typeof__");
480 pp_cxx_whitespace (cxx_pp);
481 pp_cxx_left_paren (cxx_pp);
482 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
483 pp_cxx_right_paren (cxx_pp);
486 case TYPE_PACK_EXPANSION:
487 dump_type (PACK_EXPANSION_PATTERN (t), flags);
488 pp_cxx_ws_string (cxx_pp, "...");
491 case TYPE_ARGUMENT_PACK:
492 dump_template_argument (t, flags);
496 pp_cxx_ws_string (cxx_pp, "decltype");
497 pp_cxx_whitespace (cxx_pp);
498 pp_cxx_left_paren (cxx_pp);
499 dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
500 pp_cxx_right_paren (cxx_pp);
504 pp_unsupported_tree (cxx_pp, t);
505 /* Fall through to error. */
508 pp_string (cxx_pp, M_("<type error>"));
513 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
517 dump_typename (tree t, int flags)
519 tree ctx = TYPE_CONTEXT (t);
521 if (TREE_CODE (ctx) == TYPENAME_TYPE)
522 dump_typename (ctx, flags);
524 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
525 pp_cxx_colon_colon (cxx_pp);
526 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
529 /* Return the name of the supplied aggregate, or enumeral type. */
532 class_key_or_enum_as_string (tree t)
534 if (TREE_CODE (t) == ENUMERAL_TYPE)
536 if (SCOPED_ENUM_P (t))
541 else if (TREE_CODE (t) == UNION_TYPE)
543 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
549 /* Print out a class declaration T under the control of FLAGS,
550 in the form `class foo'. */
553 dump_aggr_type (tree t, int flags)
556 const char *variety = class_key_or_enum_as_string (t);
560 pp_cxx_cv_qualifier_seq (cxx_pp, t);
562 if (flags & TFF_CLASS_KEY_OR_ENUM)
563 pp_cxx_ws_string (cxx_pp, variety);
565 name = TYPE_NAME (t);
569 typdef = !DECL_ARTIFICIAL (name);
572 && ((flags & TFF_CHASE_TYPEDEF)
573 || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name)
574 && DECL_TEMPLATE_INFO (name))))
576 t = TYPE_MAIN_VARIANT (t);
577 name = TYPE_NAME (t);
581 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
582 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
583 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
584 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
586 if (! (flags & TFF_UNQUALIFIED_NAME))
587 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
588 flags &= ~TFF_UNQUALIFIED_NAME;
591 /* Because the template names are mangled, we have to locate
592 the most general template, and use that name. */
593 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
595 while (DECL_TEMPLATE_INFO (tpl))
596 tpl = DECL_TI_TEMPLATE (tpl);
599 name = DECL_NAME (name);
602 if (name == 0 || ANON_AGGRNAME_P (name))
604 if (flags & TFF_CLASS_KEY_OR_ENUM)
605 pp_string (cxx_pp, M_("<anonymous>"));
607 pp_printf (pp_base (cxx_pp), M_("<anonymous %s>"), variety);
609 else if (LAMBDANAME_P (name))
611 /* A lambda's "type" is essentially its signature. */
612 pp_string (cxx_pp, M_("<lambda"));
613 if (lambda_function (t))
614 dump_parameters (FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t)),
616 pp_character(cxx_pp, '>');
619 pp_cxx_tree_identifier (cxx_pp, name);
621 dump_template_parms (TYPE_TEMPLATE_INFO (t),
622 !CLASSTYPE_USE_TEMPLATE (t),
623 flags & ~TFF_TEMPLATE_HEADER);
626 /* Dump into the obstack the initial part of the output for a given type.
627 This is necessary when dealing with things like functions returning
630 return type of `int (* fee ())()': pointer -> function -> int. Both
631 pointer (and reference and offset) and function (and member) types must
632 deal with prefix and suffix.
634 Arrays must also do this for DECL nodes, like int a[], and for things like
638 dump_type_prefix (tree t, int flags)
640 if (TYPE_PTRMEMFUNC_P (t))
642 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
646 switch (TREE_CODE (t))
651 tree sub = TREE_TYPE (t);
653 dump_type_prefix (sub, flags);
654 if (TREE_CODE (sub) == ARRAY_TYPE
655 || TREE_CODE (sub) == FUNCTION_TYPE)
657 pp_cxx_whitespace (cxx_pp);
658 pp_cxx_left_paren (cxx_pp);
660 if (TREE_CODE (t) == POINTER_TYPE)
661 pp_character(cxx_pp, '*');
662 else if (TREE_CODE (t) == REFERENCE_TYPE)
664 if (TYPE_REF_IS_RVALUE (t))
665 pp_string (cxx_pp, "&&");
667 pp_character (cxx_pp, '&');
669 pp_base (cxx_pp)->padding = pp_before;
670 pp_cxx_cv_qualifier_seq (cxx_pp, t);
676 dump_type_prefix (TREE_TYPE (t), flags);
677 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
679 pp_maybe_space (cxx_pp);
680 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
681 pp_cxx_left_paren (cxx_pp);
682 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
683 pp_cxx_colon_colon (cxx_pp);
685 pp_cxx_star (cxx_pp);
686 pp_cxx_cv_qualifier_seq (cxx_pp, t);
687 pp_base (cxx_pp)->padding = pp_before;
690 /* This can be reached without a pointer when dealing with
691 templates, e.g. std::is_function. */
693 dump_type_prefix (TREE_TYPE (t), flags);
697 dump_type_prefix (TREE_TYPE (t), flags);
698 pp_maybe_space (cxx_pp);
699 pp_cxx_left_paren (cxx_pp);
700 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
701 pp_cxx_colon_colon (cxx_pp);
705 dump_type_prefix (TREE_TYPE (t), flags);
709 case IDENTIFIER_NODE:
714 case TEMPLATE_TYPE_PARM:
715 case TEMPLATE_TEMPLATE_PARM:
716 case BOUND_TEMPLATE_TEMPLATE_PARM:
728 case TYPE_PACK_EXPANSION:
729 case FIXED_POINT_TYPE:
730 dump_type (t, flags);
731 pp_base (cxx_pp)->padding = pp_before;
735 pp_unsupported_tree (cxx_pp, t);
738 pp_string (cxx_pp, M_("<typeprefixerror>"));
743 /* Dump the suffix of type T, under control of FLAGS. This is the part
744 which appears after the identifier (or function parms). */
747 dump_type_suffix (tree t, int flags)
749 if (TYPE_PTRMEMFUNC_P (t))
750 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
752 switch (TREE_CODE (t))
757 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
758 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
759 pp_cxx_right_paren (cxx_pp);
760 dump_type_suffix (TREE_TYPE (t), flags);
767 if (TREE_CODE (t) == METHOD_TYPE)
768 /* Can only be reached through a pointer. */
769 pp_cxx_right_paren (cxx_pp);
770 arg = TYPE_ARG_TYPES (t);
771 if (TREE_CODE (t) == METHOD_TYPE)
772 arg = TREE_CHAIN (arg);
774 /* Function pointers don't have default args. Not in standard C++,
775 anyway; they may in g++, but we'll just pretend otherwise. */
776 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
778 if (TREE_CODE (t) == METHOD_TYPE)
779 pp_cxx_cv_qualifier_seq
780 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
782 pp_cxx_cv_qualifier_seq (cxx_pp, t);
783 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
784 dump_type_suffix (TREE_TYPE (t), flags);
789 pp_maybe_space (cxx_pp);
790 pp_cxx_left_bracket (cxx_pp);
793 tree dtype = TYPE_DOMAIN (t);
794 tree max = TYPE_MAX_VALUE (dtype);
795 if (host_integerp (max, 0))
796 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
797 else if (TREE_CODE (max) == MINUS_EXPR)
798 dump_expr (TREE_OPERAND (max, 0),
799 flags & ~TFF_EXPR_IN_PARENS);
801 dump_expr (fold_build2_loc (input_location,
802 PLUS_EXPR, dtype, max,
803 build_int_cst (dtype, 1)),
804 flags & ~TFF_EXPR_IN_PARENS);
806 pp_cxx_right_bracket (cxx_pp);
807 dump_type_suffix (TREE_TYPE (t), flags);
811 case IDENTIFIER_NODE:
816 case TEMPLATE_TYPE_PARM:
817 case TEMPLATE_TEMPLATE_PARM:
818 case BOUND_TEMPLATE_TEMPLATE_PARM:
830 case TYPE_PACK_EXPANSION:
831 case FIXED_POINT_TYPE:
835 pp_unsupported_tree (cxx_pp, t);
837 /* Don't mark it here, we should have already done in
844 dump_global_iord (tree t)
846 const char *p = NULL;
848 if (DECL_GLOBAL_CTOR_P (t))
849 p = M_("(static initializers for %s)");
850 else if (DECL_GLOBAL_DTOR_P (t))
851 p = M_("(static destructors for %s)");
855 pp_printf (pp_base (cxx_pp), p, input_filename);
859 dump_simple_decl (tree t, tree type, int flags)
861 if (flags & TFF_DECL_SPECIFIERS)
863 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
864 pp_maybe_space (cxx_pp);
866 if (! (flags & TFF_UNQUALIFIED_NAME)
867 && (!DECL_INITIAL (t)
868 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
869 dump_scope (CP_DECL_CONTEXT (t), flags);
870 flags &= ~TFF_UNQUALIFIED_NAME;
871 if ((flags & TFF_DECL_SPECIFIERS)
872 && DECL_TEMPLATE_PARM_P (t)
873 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
874 pp_string (cxx_pp, "...");
876 dump_decl (DECL_NAME (t), flags);
878 pp_string (cxx_pp, M_("<anonymous>"));
879 if (flags & TFF_DECL_SPECIFIERS)
880 dump_type_suffix (type, flags);
883 /* Dump a human readable string for the decl T under control of FLAGS. */
886 dump_decl (tree t, int flags)
891 switch (TREE_CODE (t))
894 /* Don't say 'typedef class A' */
895 if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t))
897 if ((flags & TFF_DECL_SPECIFIERS)
898 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
900 /* Say `class T' not just `T'. */
901 pp_cxx_ws_string (cxx_pp, "class");
903 /* Emit the `...' for a parameter pack. */
904 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
905 pp_cxx_ws_string (cxx_pp, "...");
908 dump_type (TREE_TYPE (t), flags);
911 if (flags & TFF_DECL_SPECIFIERS)
912 pp_cxx_ws_string (cxx_pp, "typedef");
913 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
914 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
919 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
921 pp_string (cxx_pp, M_("vtable for "));
922 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
923 dump_type (DECL_CONTEXT (t), flags);
926 /* Else fall through. */
929 dump_simple_decl (t, TREE_TYPE (t), flags);
933 pp_string (cxx_pp, M_("<return value> "));
934 dump_simple_decl (t, TREE_TYPE (t), flags);
938 if (flags & TFF_DECL_SPECIFIERS)
939 pp_cxx_declaration (cxx_pp, t);
942 if (! (flags & TFF_UNQUALIFIED_NAME))
943 dump_scope (CP_DECL_CONTEXT (t), flags);
944 flags &= ~TFF_UNQUALIFIED_NAME;
945 if (DECL_NAME (t) == NULL_TREE)
946 pp_string (cxx_pp, M_("<unnamed>"));
948 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
953 dump_type (TREE_OPERAND (t, 0), flags);
954 pp_string (cxx_pp, "::");
955 dump_decl (TREE_OPERAND (t, 1), flags|TFF_UNQUALIFIED_NAME);
959 dump_decl (TREE_OPERAND (t, 0), flags);
960 pp_cxx_left_bracket (cxx_pp);
961 dump_decl (TREE_OPERAND (t, 1), flags);
962 pp_cxx_right_bracket (cxx_pp);
965 /* So that we can do dump_decl on an aggr type. */
969 dump_type (t, flags);
973 /* This is a pseudo destructor call which has not been folded into
974 a PSEUDO_DTOR_EXPR yet. */
975 pp_cxx_complement (cxx_pp);
976 dump_type (TREE_OPERAND (t, 0), flags);
983 /* These special cases are duplicated here so that other functions
984 can feed identifiers to error and get them demangled properly. */
985 case IDENTIFIER_NODE:
986 if (IDENTIFIER_TYPENAME_P (t))
988 pp_cxx_ws_string (cxx_pp, "operator");
989 /* Not exactly IDENTIFIER_TYPE_VALUE. */
990 dump_type (TREE_TYPE (t), flags);
994 pp_cxx_tree_identifier (cxx_pp, t);
1000 t = OVL_CURRENT (t);
1001 if (DECL_CLASS_SCOPE_P (t))
1003 dump_type (DECL_CONTEXT (t), flags);
1004 pp_cxx_colon_colon (cxx_pp);
1006 else if (DECL_CONTEXT (t))
1008 dump_decl (DECL_CONTEXT (t), flags);
1009 pp_cxx_colon_colon (cxx_pp);
1011 dump_decl (DECL_NAME (t), flags);
1015 /* If there's only one function, just treat it like an ordinary
1017 t = OVL_CURRENT (t);
1021 if (! DECL_LANG_SPECIFIC (t))
1022 pp_string (cxx_pp, M_("<built-in>"));
1023 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
1024 dump_global_iord (t);
1026 dump_function_decl (t, flags);
1030 dump_template_decl (t, flags);
1033 case TEMPLATE_ID_EXPR:
1035 tree name = TREE_OPERAND (t, 0);
1037 if (is_overloaded_fn (name))
1038 name = DECL_NAME (get_first_fn (name));
1039 dump_decl (name, flags);
1040 pp_cxx_begin_template_argument_list (cxx_pp);
1041 if (TREE_OPERAND (t, 1))
1042 dump_template_argument_list (TREE_OPERAND (t, 1), NULL_TREE, flags);
1043 pp_cxx_end_template_argument_list (cxx_pp);
1048 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
1052 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
1053 || (DECL_INITIAL (t) &&
1054 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
1055 dump_simple_decl (t, TREE_TYPE (t), flags);
1056 else if (DECL_NAME (t))
1057 dump_decl (DECL_NAME (t), flags);
1058 else if (DECL_INITIAL (t))
1059 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
1061 pp_string (cxx_pp, M_("<enumerator>"));
1065 pp_cxx_ws_string (cxx_pp, "using");
1066 dump_type (USING_DECL_SCOPE (t), flags);
1067 pp_cxx_colon_colon (cxx_pp);
1068 dump_decl (DECL_NAME (t), flags);
1072 pp_cxx_declaration (cxx_pp, t);
1076 dump_decl (BASELINK_FUNCTIONS (t), flags);
1079 case NON_DEPENDENT_EXPR:
1080 dump_expr (t, flags);
1083 case TEMPLATE_TYPE_PARM:
1084 if (flags & TFF_DECL_SPECIFIERS)
1085 pp_cxx_declaration (cxx_pp, t);
1087 pp_type_id (cxx_pp, t);
1090 case UNBOUND_CLASS_TEMPLATE:
1091 case TYPE_PACK_EXPANSION:
1093 dump_type (t, flags);
1097 pp_unsupported_tree (cxx_pp, t);
1098 /* Fall through to error. */
1101 pp_string (cxx_pp, M_("<declaration error>"));
1106 /* Dump a template declaration T under control of FLAGS. This means the
1107 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1110 dump_template_decl (tree t, int flags)
1112 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1116 if (flags & TFF_TEMPLATE_HEADER)
1118 for (parms = orig_parms = nreverse (orig_parms);
1120 parms = TREE_CHAIN (parms))
1122 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1123 int len = TREE_VEC_LENGTH (inner_parms);
1125 pp_cxx_ws_string (cxx_pp, "template");
1126 pp_cxx_begin_template_argument_list (cxx_pp);
1128 /* If we've shown the template prefix, we'd better show the
1129 parameters' and decl's type too. */
1130 flags |= TFF_DECL_SPECIFIERS;
1132 for (i = 0; i < len; i++)
1135 pp_separate_with_comma (cxx_pp);
1136 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1138 pp_cxx_end_template_argument_list (cxx_pp);
1139 pp_cxx_whitespace (cxx_pp);
1141 nreverse(orig_parms);
1143 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1145 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1146 pp_cxx_ws_string (cxx_pp, "class");
1148 /* If this is a parameter pack, print the ellipsis. */
1149 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1150 pp_cxx_ws_string (cxx_pp, "...");
1154 if (DECL_TEMPLATE_RESULT (t)
1155 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1156 dump_type (TREE_TYPE (t),
1157 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1158 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1159 else if (DECL_TEMPLATE_RESULT (t)
1160 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1161 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1164 gcc_assert (TREE_TYPE (t));
1165 switch (NEXT_CODE (t))
1169 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1172 /* This case can occur with some invalid code. */
1173 dump_type (TREE_TYPE (t),
1174 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1175 | (flags & TFF_DECL_SPECIFIERS
1176 ? TFF_CLASS_KEY_OR_ENUM : 0));
1181 /* find_typenames looks through the type of the function template T
1182 and returns a VEC containing any typedefs, decltypes or TYPENAME_TYPEs
1185 struct find_typenames_t
1187 struct pointer_set_t *p_set;
1188 VEC (tree,gc) *typenames;
1192 find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
1194 struct find_typenames_t *d = (struct find_typenames_t *)data;
1195 tree mv = NULL_TREE;
1197 if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp)))
1198 /* Add the type of the typedef without any additional cv-quals. */
1199 mv = TREE_TYPE (TYPE_NAME (*tp));
1200 else if (TREE_CODE (*tp) == TYPENAME_TYPE
1201 || TREE_CODE (*tp) == DECLTYPE_TYPE)
1202 /* Add the typename without any cv-qualifiers. */
1203 mv = TYPE_MAIN_VARIANT (*tp);
1205 if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv)))
1206 VEC_safe_push (tree, gc, d->typenames, mv);
1208 /* Search into class template arguments, which cp_walk_subtrees
1210 if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp))
1211 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r,
1217 static VEC(tree,gc) *
1218 find_typenames (tree t)
1220 struct find_typenames_t ft;
1221 ft.p_set = pointer_set_create ();
1222 ft.typenames = NULL;
1223 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
1224 find_typenames_r, &ft, ft.p_set);
1225 pointer_set_destroy (ft.p_set);
1226 return ft.typenames;
1229 /* Pretty print a function decl. There are several ways we want to print a
1230 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1231 As error can only apply the '#' flag once to give 0 and 1 for V, there
1232 is %D which doesn't print the throw specs, and %F which does. */
1235 dump_function_decl (tree t, int flags)
1239 tree cname = NULL_TREE;
1240 tree template_args = NULL_TREE;
1241 tree template_parms = NULL_TREE;
1242 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1243 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1245 VEC(tree,gc) *typenames = NULL;
1247 if (LAMBDA_FUNCTION_P (t))
1249 /* A lambda's signature is essentially its "type", so defer. */
1250 gcc_assert (LAMBDA_TYPE_P (DECL_CONTEXT (t)));
1251 dump_type (DECL_CONTEXT (t), flags);
1255 flags &= ~TFF_UNQUALIFIED_NAME;
1256 if (TREE_CODE (t) == TEMPLATE_DECL)
1257 t = DECL_TEMPLATE_RESULT (t);
1259 /* Save the exceptions, in case t is a specialization and we are
1260 emitting an error about incompatible specifications. */
1261 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1263 /* Pretty print template instantiations only. */
1264 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
1265 && flag_pretty_templates)
1269 template_args = DECL_TI_ARGS (t);
1270 tmpl = most_general_template (t);
1271 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1273 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1275 typenames = find_typenames (t);
1279 fntype = TREE_TYPE (t);
1280 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1282 if (DECL_CLASS_SCOPE_P (t))
1283 cname = DECL_CONTEXT (t);
1284 /* This is for partially instantiated template methods. */
1285 else if (TREE_CODE (fntype) == METHOD_TYPE)
1286 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1288 if (!(flags & TFF_DECL_SPECIFIERS))
1290 else if (DECL_STATIC_FUNCTION_P (t))
1291 pp_cxx_ws_string (cxx_pp, "static");
1292 else if (DECL_VIRTUAL_P (t))
1293 pp_cxx_ws_string (cxx_pp, "virtual");
1295 /* Print the return type? */
1297 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1298 && !DECL_DESTRUCTOR_P (t);
1300 dump_type_prefix (TREE_TYPE (fntype), flags);
1302 /* Print the function name. */
1303 if (!do_outer_scope)
1307 dump_type (cname, flags);
1308 pp_cxx_colon_colon (cxx_pp);
1311 dump_scope (CP_DECL_CONTEXT (t), flags);
1313 dump_function_name (t, flags);
1315 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1317 dump_parameters (parmtypes, flags);
1319 if (TREE_CODE (fntype) == METHOD_TYPE)
1321 pp_base (cxx_pp)->padding = pp_before;
1322 pp_cxx_cv_qualifier_seq
1323 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1326 if (flags & TFF_EXCEPTION_SPECIFICATION)
1328 pp_base (cxx_pp)->padding = pp_before;
1329 dump_exception_spec (exceptions, flags);
1333 dump_type_suffix (TREE_TYPE (fntype), flags);
1336 /* If T is a template instantiation, dump the parameter binding. */
1337 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1339 pp_cxx_whitespace (cxx_pp);
1340 pp_cxx_left_bracket (cxx_pp);
1341 pp_cxx_ws_string (cxx_pp, M_("with"));
1342 pp_cxx_whitespace (cxx_pp);
1343 dump_template_bindings (template_parms, template_args, typenames);
1344 pp_cxx_right_bracket (cxx_pp);
1348 /* Print a parameter list. If this is for a member function, the
1349 member object ptr (and any other hidden args) should have
1350 already been removed. */
1353 dump_parameters (tree parmtypes, int flags)
1356 pp_cxx_left_paren (cxx_pp);
1358 for (first = 1; parmtypes != void_list_node;
1359 parmtypes = TREE_CHAIN (parmtypes))
1362 pp_separate_with_comma (cxx_pp);
1366 pp_cxx_ws_string (cxx_pp, "...");
1370 dump_type (TREE_VALUE (parmtypes), flags);
1372 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1374 pp_cxx_whitespace (cxx_pp);
1376 pp_cxx_whitespace (cxx_pp);
1377 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1381 pp_cxx_right_paren (cxx_pp);
1384 /* Print an exception specification. T is the exception specification. */
1387 dump_exception_spec (tree t, int flags)
1391 pp_cxx_ws_string (cxx_pp, "throw");
1392 pp_cxx_whitespace (cxx_pp);
1393 pp_cxx_left_paren (cxx_pp);
1394 if (TREE_VALUE (t) != NULL_TREE)
1397 dump_type (TREE_VALUE (t), flags);
1401 pp_separate_with_comma (cxx_pp);
1403 pp_cxx_right_paren (cxx_pp);
1407 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1408 and destructors properly. */
1411 dump_function_name (tree t, int flags)
1413 tree name = DECL_NAME (t);
1415 /* We can get here with a decl that was synthesized by language-
1416 independent machinery (e.g. coverage.c) in which case it won't
1417 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1418 will crash. In this case it is safe just to print out the
1420 if (!DECL_LANG_SPECIFIC (t))
1422 pp_cxx_tree_identifier (cxx_pp, name);
1426 if (TREE_CODE (t) == TEMPLATE_DECL)
1427 t = DECL_TEMPLATE_RESULT (t);
1429 /* Don't let the user see __comp_ctor et al. */
1430 if (DECL_CONSTRUCTOR_P (t)
1431 || DECL_DESTRUCTOR_P (t))
1433 if (LAMBDA_TYPE_P (DECL_CONTEXT (t)))
1434 name = get_identifier ("<lambda>");
1436 name = constructor_name (DECL_CONTEXT (t));
1439 if (DECL_DESTRUCTOR_P (t))
1441 pp_cxx_complement (cxx_pp);
1442 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1444 else if (DECL_CONV_FN_P (t))
1446 /* This cannot use the hack that the operator's return
1447 type is stashed off of its name because it may be
1448 used for error reporting. In the case of conflicting
1449 declarations, both will have the same name, yet
1450 the types will be different, hence the TREE_TYPE field
1451 of the first name will be clobbered by the second. */
1452 pp_cxx_ws_string (cxx_pp, "operator");
1453 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1455 else if (name && IDENTIFIER_OPNAME_P (name))
1456 pp_cxx_tree_identifier (cxx_pp, name);
1458 dump_decl (name, flags);
1460 if (DECL_TEMPLATE_INFO (t)
1461 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1462 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1463 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1464 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1467 /* Dump the template parameters from the template info INFO under control of
1468 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1469 specialization (partial or complete). For partial specializations we show
1470 the specialized parameter values. For a primary template we show no
1474 dump_template_parms (tree info, int primary, int flags)
1476 tree args = info ? TI_ARGS (info) : NULL_TREE;
1478 if (primary && flags & TFF_TEMPLATE_NAME)
1480 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1481 pp_cxx_begin_template_argument_list (cxx_pp);
1483 /* Be careful only to print things when we have them, so as not
1484 to crash producing error messages. */
1485 if (args && !primary)
1488 /* We don't know the parms for a friend template specialization. */
1489 tree params = (TREE_CODE (TI_TEMPLATE (info)) == TEMPLATE_DECL
1490 ? DECL_INNERMOST_TEMPLATE_PARMS (TI_TEMPLATE (info))
1493 len = count_non_default_template_args (args, params, flags);
1495 args = INNERMOST_TEMPLATE_ARGS (args);
1496 for (ix = 0; ix != len; ix++)
1498 tree arg = TREE_VEC_ELT (args, ix);
1500 /* Only print a comma if we know there is an argument coming. In
1501 the case of an empty template argument pack, no actual
1502 argument will be printed. */
1504 && (!ARGUMENT_PACK_P (arg)
1505 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1506 pp_separate_with_comma (cxx_pp);
1509 pp_string (cxx_pp, M_("<template parameter error>"));
1511 dump_template_argument (arg, flags);
1516 tree tpl = TI_TEMPLATE (info);
1517 tree parms = DECL_TEMPLATE_PARMS (tpl);
1520 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1521 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1523 for (ix = 0; ix != len; ix++)
1527 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1529 pp_string (cxx_pp, M_("<template parameter error>"));
1533 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1536 pp_separate_with_comma (cxx_pp);
1538 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1541 pp_cxx_end_template_argument_list (cxx_pp);
1544 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1545 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1548 dump_call_expr_args (tree t, int flags, bool skipfirst)
1551 call_expr_arg_iterator iter;
1553 pp_cxx_left_paren (cxx_pp);
1554 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1560 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1561 if (more_call_expr_args_p (&iter))
1562 pp_separate_with_comma (cxx_pp);
1565 pp_cxx_right_paren (cxx_pp);
1568 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1569 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1573 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1576 aggr_init_expr_arg_iterator iter;
1578 pp_cxx_left_paren (cxx_pp);
1579 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1585 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1586 if (more_aggr_init_expr_args_p (&iter))
1587 pp_separate_with_comma (cxx_pp);
1590 pp_cxx_right_paren (cxx_pp);
1593 /* Print out a list of initializers (subr of dump_expr). */
1596 dump_expr_list (tree l, int flags)
1600 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1603 pp_separate_with_comma (cxx_pp);
1607 /* Print out a vector of initializers (subr of dump_expr). */
1610 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1612 unsigned HOST_WIDE_INT idx;
1615 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1617 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1618 if (idx != VEC_length (constructor_elt, v) - 1)
1619 pp_separate_with_comma (cxx_pp);
1624 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1625 function. Resolve it to a close relative -- in the sense of static
1626 type -- variant being overridden. That is close to what was written in
1627 the source code. Subroutine of dump_expr. */
1630 resolve_virtual_fun_from_obj_type_ref (tree ref)
1632 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1633 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1634 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1637 fun = TREE_CHAIN (fun);
1638 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1639 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1645 /* Print out an expression E under control of FLAGS. */
1648 dump_expr (tree t, int flags)
1653 if (STATEMENT_CLASS_P (t))
1655 pp_cxx_ws_string (cxx_pp, M_("<statement>"));
1659 switch (TREE_CODE (t))
1667 case NAMESPACE_DECL:
1670 case IDENTIFIER_NODE:
1671 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1678 pp_constant (cxx_pp, t);
1682 /* While waiting for caret diagnostics, avoid printing
1683 __cxa_allocate_exception, __cxa_throw, and the like. */
1684 pp_cxx_ws_string (cxx_pp, M_("<throw-expression>"));
1688 pp_ampersand (cxx_pp);
1689 dump_type (PTRMEM_CST_CLASS (t), flags);
1690 pp_cxx_colon_colon (cxx_pp);
1691 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1695 pp_cxx_left_paren (cxx_pp);
1696 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1697 pp_separate_with_comma (cxx_pp);
1698 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1699 pp_cxx_right_paren (cxx_pp);
1703 pp_cxx_left_paren (cxx_pp);
1704 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1705 pp_string (cxx_pp, " ? ");
1706 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1707 pp_string (cxx_pp, " : ");
1708 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1709 pp_cxx_right_paren (cxx_pp);
1713 if (TREE_HAS_CONSTRUCTOR (t))
1715 pp_cxx_ws_string (cxx_pp, "new");
1716 pp_cxx_whitespace (cxx_pp);
1717 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1720 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1723 case AGGR_INIT_EXPR:
1725 tree fn = NULL_TREE;
1727 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1728 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1730 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1732 if (DECL_CONSTRUCTOR_P (fn))
1733 dump_type (DECL_CONTEXT (fn), flags);
1738 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1740 dump_aggr_init_expr_args (t, flags, true);
1745 tree fn = CALL_EXPR_FN (t);
1746 bool skipfirst = false;
1748 if (TREE_CODE (fn) == ADDR_EXPR)
1749 fn = TREE_OPERAND (fn, 0);
1751 /* Nobody is interested in seeing the guts of vcalls. */
1752 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1753 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1755 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1757 tree ob = CALL_EXPR_ARG (t, 0);
1758 if (TREE_CODE (ob) == ADDR_EXPR)
1760 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1761 pp_cxx_dot (cxx_pp);
1763 else if (TREE_CODE (ob) != PARM_DECL
1764 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1766 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1767 pp_cxx_arrow (cxx_pp);
1771 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1772 dump_call_expr_args (t, flags, skipfirst);
1777 /* Note that this only works for G++ target exprs. If somebody
1778 builds a general TARGET_EXPR, there's no way to represent that
1779 it initializes anything other that the parameter slot for the
1780 default argument. Note we may have cleared out the first
1781 operand in expand_expr, so don't go killing ourselves. */
1782 if (TREE_OPERAND (t, 1))
1783 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1786 case POINTER_PLUS_EXPR:
1787 dump_binary_op ("+", t, flags);
1795 case TRUNC_DIV_EXPR:
1796 case TRUNC_MOD_EXPR:
1804 case TRUTH_ANDIF_EXPR:
1805 case TRUTH_ORIF_EXPR:
1812 case EXACT_DIV_EXPR:
1813 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1817 case FLOOR_DIV_EXPR:
1818 case ROUND_DIV_EXPR:
1820 dump_binary_op ("/", t, flags);
1824 case FLOOR_MOD_EXPR:
1825 case ROUND_MOD_EXPR:
1826 dump_binary_op ("%", t, flags);
1831 tree ob = TREE_OPERAND (t, 0);
1832 if (TREE_CODE (ob) == INDIRECT_REF)
1834 ob = TREE_OPERAND (ob, 0);
1835 if (TREE_CODE (ob) != PARM_DECL
1837 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1839 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1840 pp_cxx_arrow (cxx_pp);
1845 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1846 pp_cxx_dot (cxx_pp);
1848 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1853 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1854 pp_cxx_left_bracket (cxx_pp);
1855 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1856 pp_cxx_right_bracket (cxx_pp);
1859 case UNARY_PLUS_EXPR:
1860 dump_unary_op ("+", t, flags);
1864 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1865 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1866 /* An ADDR_EXPR can have reference type. In that case, we
1867 shouldn't print the `&' doing so indicates to the user
1868 that the expression has pointer type. */
1870 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1871 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1872 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1873 dump_unary_op ("&&", t, flags);
1875 dump_unary_op ("&", t, flags);
1879 if (TREE_HAS_CONSTRUCTOR (t))
1881 t = TREE_OPERAND (t, 0);
1882 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1883 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1884 dump_call_expr_args (t, flags, true);
1888 if (TREE_OPERAND (t,0) != NULL_TREE
1889 && TREE_TYPE (TREE_OPERAND (t, 0))
1890 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1891 dump_expr (TREE_OPERAND (t, 0), flags);
1893 dump_unary_op ("*", t, flags);
1899 case TRUTH_NOT_EXPR:
1900 case PREDECREMENT_EXPR:
1901 case PREINCREMENT_EXPR:
1902 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1905 case POSTDECREMENT_EXPR:
1906 case POSTINCREMENT_EXPR:
1907 pp_cxx_left_paren (cxx_pp);
1908 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1909 pp_cxx_ws_string (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1910 pp_cxx_right_paren (cxx_pp);
1913 case NON_LVALUE_EXPR:
1914 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1915 should be another level of INDIRECT_REF so that I don't have to do
1917 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1919 tree next = TREE_TYPE (TREE_TYPE (t));
1921 while (TREE_CODE (next) == POINTER_TYPE)
1922 next = TREE_TYPE (next);
1924 if (TREE_CODE (next) == FUNCTION_TYPE)
1926 if (flags & TFF_EXPR_IN_PARENS)
1927 pp_cxx_left_paren (cxx_pp);
1928 pp_cxx_star (cxx_pp);
1929 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1930 if (flags & TFF_EXPR_IN_PARENS)
1931 pp_cxx_right_paren (cxx_pp);
1934 /* Else fall through. */
1936 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1940 case VIEW_CONVERT_EXPR:
1942 tree op = TREE_OPERAND (t, 0);
1944 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1946 /* It is a cast, but we cannot tell whether it is a
1947 reinterpret or static cast. Use the C style notation. */
1948 if (flags & TFF_EXPR_IN_PARENS)
1949 pp_cxx_left_paren (cxx_pp);
1950 pp_cxx_left_paren (cxx_pp);
1951 dump_type (TREE_TYPE (t), flags);
1952 pp_cxx_right_paren (cxx_pp);
1953 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1954 if (flags & TFF_EXPR_IN_PARENS)
1955 pp_cxx_right_paren (cxx_pp);
1958 dump_expr (op, flags);
1963 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1965 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1967 if (integer_zerop (idx))
1969 /* A NULL pointer-to-member constant. */
1970 pp_cxx_left_paren (cxx_pp);
1971 pp_cxx_left_paren (cxx_pp);
1972 dump_type (TREE_TYPE (t), flags);
1973 pp_cxx_right_paren (cxx_pp);
1974 pp_character (cxx_pp, '0');
1975 pp_cxx_right_paren (cxx_pp);
1978 else if (host_integerp (idx, 0))
1981 unsigned HOST_WIDE_INT n;
1983 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1984 t = TYPE_METHOD_BASETYPE (t);
1985 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1987 n = tree_low_cst (idx, 0);
1989 /* Map vtable index back one, to allow for the null pointer to
1993 while (n > 0 && virtuals)
1996 virtuals = TREE_CHAIN (virtuals);
2000 dump_expr (BV_FN (virtuals),
2001 flags | TFF_EXPR_IN_PARENS);
2006 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
2008 dump_type (TREE_TYPE (t), 0);
2009 pp_cxx_left_paren (cxx_pp);
2010 pp_cxx_right_paren (cxx_pp);
2014 pp_cxx_left_brace (cxx_pp);
2015 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
2016 pp_cxx_right_brace (cxx_pp);
2023 tree ob = TREE_OPERAND (t, 0);
2024 if (is_dummy_object (ob))
2026 t = TREE_OPERAND (t, 1);
2027 if (TREE_CODE (t) == FUNCTION_DECL)
2029 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
2030 else if (BASELINK_P (t))
2031 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
2032 flags | TFF_EXPR_IN_PARENS);
2034 dump_decl (t, flags);
2038 if (TREE_CODE (ob) == INDIRECT_REF)
2040 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
2041 pp_cxx_arrow (cxx_pp);
2042 pp_cxx_star (cxx_pp);
2046 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
2047 pp_cxx_dot (cxx_pp);
2048 pp_cxx_star (cxx_pp);
2050 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2055 case TEMPLATE_PARM_INDEX:
2056 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
2060 if (TREE_OPERAND (t, 0) == NULL_TREE
2061 || TREE_CHAIN (TREE_OPERAND (t, 0)))
2063 dump_type (TREE_TYPE (t), flags);
2064 pp_cxx_left_paren (cxx_pp);
2065 dump_expr_list (TREE_OPERAND (t, 0), flags);
2066 pp_cxx_right_paren (cxx_pp);
2070 pp_cxx_left_paren (cxx_pp);
2071 dump_type (TREE_TYPE (t), flags);
2072 pp_cxx_right_paren (cxx_pp);
2073 pp_cxx_left_paren (cxx_pp);
2074 dump_expr_list (TREE_OPERAND (t, 0), flags);
2075 pp_cxx_right_paren (cxx_pp);
2079 case STATIC_CAST_EXPR:
2080 pp_cxx_ws_string (cxx_pp, "static_cast");
2082 case REINTERPRET_CAST_EXPR:
2083 pp_cxx_ws_string (cxx_pp, "reinterpret_cast");
2085 case CONST_CAST_EXPR:
2086 pp_cxx_ws_string (cxx_pp, "const_cast");
2088 case DYNAMIC_CAST_EXPR:
2089 pp_cxx_ws_string (cxx_pp, "dynamic_cast");
2091 pp_cxx_begin_template_argument_list (cxx_pp);
2092 dump_type (TREE_TYPE (t), flags);
2093 pp_cxx_end_template_argument_list (cxx_pp);
2094 pp_cxx_left_paren (cxx_pp);
2095 dump_expr (TREE_OPERAND (t, 0), flags);
2096 pp_cxx_right_paren (cxx_pp);
2100 dump_expr (TREE_OPERAND (t, 0), flags);
2101 pp_cxx_arrow (cxx_pp);
2106 if (TREE_CODE (t) == SIZEOF_EXPR)
2107 pp_cxx_ws_string (cxx_pp, "sizeof");
2110 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
2111 pp_cxx_ws_string (cxx_pp, "__alignof__");
2113 pp_cxx_whitespace (cxx_pp);
2114 pp_cxx_left_paren (cxx_pp);
2115 if (TYPE_P (TREE_OPERAND (t, 0)))
2116 dump_type (TREE_OPERAND (t, 0), flags);
2118 dump_expr (TREE_OPERAND (t, 0), flags);
2119 pp_cxx_right_paren (cxx_pp);
2124 pp_cxx_ws_string (cxx_pp, operator_name_info[TREE_CODE (t)].name);
2125 pp_cxx_whitespace (cxx_pp);
2126 dump_expr (TREE_OPERAND (t, 0), flags);
2130 pp_string (cxx_pp, M_("<unparsed>"));
2133 case TRY_CATCH_EXPR:
2134 case WITH_CLEANUP_EXPR:
2135 case CLEANUP_POINT_EXPR:
2136 dump_expr (TREE_OPERAND (t, 0), flags);
2139 case PSEUDO_DTOR_EXPR:
2140 dump_expr (TREE_OPERAND (t, 2), flags);
2141 pp_cxx_dot (cxx_pp);
2142 dump_type (TREE_OPERAND (t, 0), flags);
2143 pp_cxx_colon_colon (cxx_pp);
2144 pp_cxx_complement (cxx_pp);
2145 dump_type (TREE_OPERAND (t, 1), flags);
2148 case TEMPLATE_ID_EXPR:
2149 dump_decl (t, flags);
2155 case STATEMENT_LIST:
2156 /* We don't yet have a way of dumping statements in a
2157 human-readable format. */
2158 pp_string (cxx_pp, "({...})");
2162 pp_string (cxx_pp, "while (1) { ");
2163 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2164 pp_cxx_right_brace (cxx_pp);
2168 pp_string (cxx_pp, "if (");
2169 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2170 pp_string (cxx_pp, ") break; ");
2174 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2177 case EMPTY_CLASS_EXPR:
2178 dump_type (TREE_TYPE (t), flags);
2179 pp_cxx_left_paren (cxx_pp);
2180 pp_cxx_right_paren (cxx_pp);
2183 case NON_DEPENDENT_EXPR:
2184 dump_expr (TREE_OPERAND (t, 0), flags);
2187 case ARGUMENT_PACK_SELECT:
2188 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2200 pp_type_specifier_seq (cxx_pp, t);
2204 /* We get here when we want to print a dependent type as an
2205 id-expression, without any disambiguator decoration. */
2206 pp_id_expression (cxx_pp, t);
2209 case TEMPLATE_TYPE_PARM:
2210 case BOUND_TEMPLATE_TEMPLATE_PARM:
2211 dump_type (t, flags);
2215 pp_cxx_trait_expression (cxx_pp, t);
2219 pp_cxx_va_arg_expression (cxx_pp, t);
2223 pp_cxx_offsetof_expression (cxx_pp, t);
2227 dump_decl (t, flags);
2230 case EXPR_PACK_EXPANSION:
2237 case VEC_DELETE_EXPR:
2243 case UNORDERED_EXPR:
2253 case FIX_TRUNC_EXPR:
2255 pp_expression (cxx_pp, t);
2258 case TRUTH_AND_EXPR:
2260 case TRUTH_XOR_EXPR:
2261 if (flags & TFF_EXPR_IN_PARENS)
2262 pp_cxx_left_paren (cxx_pp);
2263 pp_expression (cxx_pp, t);
2264 if (flags & TFF_EXPR_IN_PARENS)
2265 pp_cxx_right_paren (cxx_pp);
2269 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2272 /* This list is incomplete, but should suffice for now.
2273 It is very important that `sorry' does not call
2274 `report_error_function'. That could cause an infinite loop. */
2276 pp_unsupported_tree (cxx_pp, t);
2277 /* fall through to ERROR_MARK... */
2279 pp_string (cxx_pp, M_("<expression error>"));
2285 dump_binary_op (const char *opstring, tree t, int flags)
2287 pp_cxx_left_paren (cxx_pp);
2288 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2289 pp_cxx_whitespace (cxx_pp);
2291 pp_cxx_ws_string (cxx_pp, opstring);
2293 pp_string (cxx_pp, M_("<unknown operator>"));
2294 pp_cxx_whitespace (cxx_pp);
2295 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2296 pp_cxx_right_paren (cxx_pp);
2300 dump_unary_op (const char *opstring, tree t, int flags)
2302 if (flags & TFF_EXPR_IN_PARENS)
2303 pp_cxx_left_paren (cxx_pp);
2304 pp_cxx_ws_string (cxx_pp, opstring);
2305 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2306 if (flags & TFF_EXPR_IN_PARENS)
2307 pp_cxx_right_paren (cxx_pp);
2311 reinit_cxx_pp (void)
2313 pp_clear_output_area (cxx_pp);
2314 pp_base (cxx_pp)->padding = pp_none;
2315 pp_indentation (cxx_pp) = 0;
2316 pp_needs_newline (cxx_pp) = false;
2317 cxx_pp->enclosing_scope = current_function_decl;
2321 /* Exported interface to stringifying types, exprs and decls under TFF_*
2325 type_as_string (tree typ, int flags)
2328 pp_translate_identifiers (cxx_pp) = false;
2329 dump_type (typ, flags);
2330 return pp_formatted_text (cxx_pp);
2334 type_as_string_translate (tree typ, int flags)
2337 dump_type (typ, flags);
2338 return pp_formatted_text (cxx_pp);
2342 expr_as_string (tree decl, int flags)
2345 pp_translate_identifiers (cxx_pp) = false;
2346 dump_expr (decl, flags);
2347 return pp_formatted_text (cxx_pp);
2351 decl_as_string (tree decl, int flags)
2354 pp_translate_identifiers (cxx_pp) = false;
2355 dump_decl (decl, flags);
2356 return pp_formatted_text (cxx_pp);
2360 decl_as_string_translate (tree decl, int flags)
2363 dump_decl (decl, flags);
2364 return pp_formatted_text (cxx_pp);
2367 /* Generate the three forms of printable names for cxx_printable_name. */
2370 lang_decl_name (tree decl, int v, bool translate)
2374 ? decl_as_string_translate (decl, TFF_DECL_SPECIFIERS)
2375 : decl_as_string (decl, TFF_DECL_SPECIFIERS));
2378 pp_translate_identifiers (cxx_pp) = translate;
2380 && (DECL_CLASS_SCOPE_P (decl)
2381 || (DECL_NAMESPACE_SCOPE_P (decl)
2382 && CP_DECL_CONTEXT (decl) != global_namespace)))
2384 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2385 pp_cxx_colon_colon (cxx_pp);
2388 if (TREE_CODE (decl) == FUNCTION_DECL)
2389 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2391 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2393 return pp_formatted_text (cxx_pp);
2396 /* Return the location of a tree passed to %+ formats. */
2399 location_of (tree t)
2401 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2402 t = DECL_CONTEXT (t);
2403 else if (TYPE_P (t))
2404 t = TYPE_MAIN_DECL (t);
2405 else if (TREE_CODE (t) == OVERLOAD)
2406 t = OVL_FUNCTION (t);
2408 return DECL_SOURCE_LOCATION (t);
2411 /* Now the interfaces from error et al to dump_type et al. Each takes an
2412 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2416 decl_to_string (tree decl, int verbose)
2420 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2421 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2422 flags = TFF_CLASS_KEY_OR_ENUM;
2424 flags |= TFF_DECL_SPECIFIERS;
2425 else if (TREE_CODE (decl) == FUNCTION_DECL)
2426 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2427 flags |= TFF_TEMPLATE_HEADER;
2430 dump_decl (decl, flags);
2431 return pp_formatted_text (cxx_pp);
2435 expr_to_string (tree decl)
2438 dump_expr (decl, 0);
2439 return pp_formatted_text (cxx_pp);
2443 fndecl_to_string (tree fndecl, int verbose)
2447 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2448 | TFF_TEMPLATE_HEADER;
2450 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2452 dump_decl (fndecl, flags);
2453 return pp_formatted_text (cxx_pp);
2458 code_to_string (enum tree_code c)
2460 return tree_code_name [c];
2464 language_to_string (enum languages c)
2471 case lang_cplusplus:
2483 /* Return the proper printed version of a parameter to a C++ function. */
2486 parm_to_string (int p)
2490 pp_string (cxx_pp, "'this'");
2492 pp_decimal_int (cxx_pp, p + 1);
2493 return pp_formatted_text (cxx_pp);
2497 op_to_string (enum tree_code p)
2499 tree id = operator_name_info[(int) p].identifier;
2500 return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
2504 type_to_string (tree typ, int verbose)
2508 flags |= TFF_CLASS_KEY_OR_ENUM;
2509 flags |= TFF_TEMPLATE_HEADER;
2512 dump_type (typ, flags);
2513 return pp_formatted_text (cxx_pp);
2517 assop_to_string (enum tree_code p)
2519 tree id = assignment_operator_name_info[(int) p].identifier;
2520 return id ? IDENTIFIER_POINTER (id) : M_("{unknown}");
2524 args_to_string (tree p, int verbose)
2528 flags |= TFF_CLASS_KEY_OR_ENUM;
2533 if (TYPE_P (TREE_VALUE (p)))
2534 return type_as_string_translate (p, flags);
2537 for (; p; p = TREE_CHAIN (p))
2539 if (TREE_VALUE (p) == null_node)
2540 pp_cxx_ws_string (cxx_pp, "NULL");
2542 dump_type (error_type (TREE_VALUE (p)), flags);
2544 pp_separate_with_comma (cxx_pp);
2546 return pp_formatted_text (cxx_pp);
2550 cv_to_string (tree p, int v)
2553 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2554 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2555 return pp_formatted_text (cxx_pp);
2558 /* Langhook for print_error_function. */
2560 cxx_print_error_function (diagnostic_context *context, const char *file,
2561 diagnostic_info *diagnostic)
2563 lhd_print_error_function (context, file, diagnostic);
2564 pp_base_set_prefix (context->printer, file);
2565 maybe_print_instantiation_context (context);
2569 cp_diagnostic_starter (diagnostic_context *context,
2570 diagnostic_info *diagnostic)
2572 diagnostic_report_current_module (context);
2573 cp_print_error_function (context, diagnostic);
2574 maybe_print_instantiation_context (context);
2575 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2579 cp_diagnostic_finalizer (diagnostic_context *context,
2580 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2582 pp_base_destroy_prefix (context->printer);
2585 /* Print current function onto BUFFER, in the process of reporting
2586 a diagnostic message. Called from cp_diagnostic_starter. */
2588 cp_print_error_function (diagnostic_context *context,
2589 diagnostic_info *diagnostic)
2591 if (diagnostic_last_function_changed (context, diagnostic))
2593 const char *old_prefix = context->printer->prefix;
2594 const char *file = LOCATION_FILE (diagnostic->location);
2595 tree abstract_origin = diagnostic->abstract_origin;
2596 char *new_prefix = (file && abstract_origin == NULL)
2597 ? file_name_as_prefix (file) : NULL;
2599 pp_base_set_prefix (context->printer, new_prefix);
2601 if (current_function_decl == NULL)
2602 pp_base_string (context->printer, _("At global scope:"));
2607 if (abstract_origin)
2609 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2610 while (TREE_CODE (ao) == BLOCK
2611 && BLOCK_ABSTRACT_ORIGIN (ao)
2612 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2613 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2614 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2618 fndecl = current_function_decl;
2620 pp_printf (context->printer, function_category (fndecl),
2621 cxx_printable_name_translate (fndecl, 2));
2623 while (abstract_origin)
2626 tree block = abstract_origin;
2628 locus = &BLOCK_SOURCE_LOCATION (block);
2630 block = BLOCK_SUPERCONTEXT (block);
2631 while (block && TREE_CODE (block) == BLOCK
2632 && BLOCK_ABSTRACT_ORIGIN (block))
2634 ao = BLOCK_ABSTRACT_ORIGIN (block);
2636 while (TREE_CODE (ao) == BLOCK
2637 && BLOCK_ABSTRACT_ORIGIN (ao)
2638 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2639 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2641 if (TREE_CODE (ao) == FUNCTION_DECL)
2646 else if (TREE_CODE (ao) != BLOCK)
2649 block = BLOCK_SUPERCONTEXT (block);
2652 abstract_origin = block;
2655 while (block && TREE_CODE (block) == BLOCK)
2656 block = BLOCK_SUPERCONTEXT (block);
2658 if (block && TREE_CODE (block) == FUNCTION_DECL)
2660 abstract_origin = NULL;
2664 expanded_location s = expand_location (*locus);
2665 pp_base_character (context->printer, ',');
2666 pp_base_newline (context->printer);
2669 if (flag_show_column && s.column != 0)
2670 pp_printf (context->printer,
2671 _(" inlined from %qs at %s:%d:%d"),
2672 cxx_printable_name_translate (fndecl, 2),
2673 s.file, s.line, s.column);
2675 pp_printf (context->printer,
2676 _(" inlined from %qs at %s:%d"),
2677 cxx_printable_name_translate (fndecl, 2),
2682 pp_printf (context->printer, _(" inlined from %qs"),
2683 cxx_printable_name_translate (fndecl, 2));
2686 pp_base_character (context->printer, ':');
2688 pp_base_newline (context->printer);
2690 diagnostic_set_last_function (context, diagnostic);
2691 pp_base_destroy_prefix (context->printer);
2692 context->printer->prefix = old_prefix;
2696 /* Returns a description of FUNCTION using standard terminology. The
2697 result is a format string of the form "In CATEGORY %qs". */
2699 function_category (tree fn)
2701 /* We can get called from the middle-end for diagnostics of function
2702 clones. Make sure we have language specific information before
2703 dereferencing it. */
2704 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn))
2705 && DECL_FUNCTION_MEMBER_P (fn))
2707 if (DECL_STATIC_FUNCTION_P (fn))
2708 return _("In static member function %qs");
2709 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2710 return _("In copy constructor %qs");
2711 else if (DECL_CONSTRUCTOR_P (fn))
2712 return _("In constructor %qs");
2713 else if (DECL_DESTRUCTOR_P (fn))
2714 return _("In destructor %qs");
2715 else if (LAMBDA_FUNCTION_P (fn))
2716 return _("In lambda function");
2718 return _("In member function %qs");
2721 return _("In function %qs");
2724 /* Report the full context of a current template instantiation,
2727 print_instantiation_full_context (diagnostic_context *context)
2729 struct tinst_level *p = current_instantiation ();
2730 location_t location = input_location;
2734 if (current_function_decl != p->decl
2735 && current_function_decl != NULL_TREE)
2736 /* We can get here during the processing of some synthesized
2737 method. Then, P->DECL will be the function that's causing
2742 if (current_function_decl == p->decl)
2743 /* Avoid redundancy with the "In function" line. */;
2745 pp_verbatim (context->printer,
2746 _("%s: In instantiation of %qs:\n"),
2747 LOCATION_FILE (location),
2748 decl_as_string_translate (p->decl,
2749 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2751 location = p->locus;
2756 print_instantiation_partial_context (context, p, location);
2759 /* Same as above but less verbose. */
2761 print_instantiation_partial_context (diagnostic_context *context,
2762 struct tinst_level *t, location_t loc)
2764 expanded_location xloc;
2766 for (; ; t = t->next)
2768 xloc = expand_location (loc);
2771 str = decl_as_string_translate (t->decl,
2772 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE);
2773 if (flag_show_column)
2774 pp_verbatim (context->printer,
2775 _("%s:%d:%d: instantiated from %qs\n"),
2776 xloc.file, xloc.line, xloc.column, str);
2778 pp_verbatim (context->printer,
2779 _("%s:%d: instantiated from %qs\n"),
2780 xloc.file, xloc.line, str);
2783 if (flag_show_column)
2784 pp_verbatim (context->printer, _("%s:%d:%d: instantiated from here"),
2785 xloc.file, xloc.line, xloc.column);
2787 pp_verbatim (context->printer, _("%s:%d: instantiated from here"),
2788 xloc.file, xloc.line);
2789 pp_base_newline (context->printer);
2792 /* Called from cp_thing to print the template context for an error. */
2794 maybe_print_instantiation_context (diagnostic_context *context)
2796 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2799 record_last_problematic_instantiation ();
2800 print_instantiation_full_context (context);
2803 /* Report the bare minimum context of a template instantiation. */
2805 print_instantiation_context (void)
2807 print_instantiation_partial_context
2808 (global_dc, current_instantiation (), input_location);
2809 diagnostic_flush_buffer (global_dc);
2812 /* Called from output_format -- during diagnostic message processing --
2813 to handle C++ specific format specifier with the following meanings:
2814 %A function argument-list.
2818 %F function declaration.
2819 %L language as used in extern "lang".
2821 %P function parameter whose position is indicated by an integer.
2822 %Q assignment operator.
2826 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2827 int precision, bool wide, bool set_locus, bool verbose)
2831 #define next_tree (t = va_arg (*text->args_ptr, tree))
2832 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
2833 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
2834 #define next_int va_arg (*text->args_ptr, int)
2836 if (precision != 0 || wide)
2839 if (text->locus == NULL)
2844 case 'A': result = args_to_string (next_tree, verbose); break;
2845 case 'C': result = code_to_string (next_tcode); break;
2848 tree temp = next_tree;
2850 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
2852 temp = DECL_DEBUG_EXPR (temp);
2855 result = expr_to_string (temp);
2859 result = decl_to_string (temp, verbose);
2862 case 'E': result = expr_to_string (next_tree); break;
2863 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2864 case 'L': result = language_to_string (next_lang); break;
2865 case 'O': result = op_to_string (next_tcode); break;
2866 case 'P': result = parm_to_string (next_int); break;
2867 case 'Q': result = assop_to_string (next_tcode); break;
2868 case 'T': result = type_to_string (next_tree, verbose); break;
2869 case 'V': result = cv_to_string (next_tree, verbose); break;
2875 pp_base_string (pp, result);
2876 if (set_locus && t != NULL)
2877 *text->locus = location_of (t);
2885 /* Warn about the use of C++0x features when appropriate. */
2887 maybe_warn_cpp0x (const char* str)
2889 if ((cxx_dialect == cxx98) && !in_system_header)
2890 /* We really want to suppress this warning in system headers,
2891 because libstdc++ uses variadic templates even when we aren't
2893 pedwarn (input_location, 0, "%s only available with -std=c++0x or -std=gnu++0x", str);
2896 /* Warn about the use of variadic templates when appropriate. */
2898 maybe_warn_variadic_templates (void)
2900 maybe_warn_cpp0x ("variadic templates");
2904 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
2905 option OPT with text GMSGID. Use this function to report
2906 diagnostics for constructs that are invalid C++98, but valid
2909 pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...)
2911 diagnostic_info diagnostic;
2914 va_start (ap, gmsgid);
2915 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
2916 (cxx_dialect == cxx98) ? DK_PEDWARN : DK_WARNING);
2917 diagnostic.option_index = opt;
2919 return report_diagnostic (&diagnostic);