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, 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);
86 static int get_non_default_template_args_count (tree, int);
87 static const char *function_category (tree);
88 static void maybe_print_instantiation_context (diagnostic_context *);
89 static void print_instantiation_full_context (diagnostic_context *);
90 static void print_instantiation_partial_context (diagnostic_context *,
93 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
94 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
95 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
97 static bool cp_printer (pretty_printer *, text_info *, const char *,
98 int, bool, bool, bool);
99 static location_t location_of (tree);
104 diagnostic_starter (global_dc) = cp_diagnostic_starter;
105 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
106 diagnostic_format_decoder (global_dc) = cp_printer;
108 pp_construct (pp_base (cxx_pp), NULL, 0);
109 pp_cxx_pretty_printer_init (cxx_pp);
112 /* Dump a scope, if deemed necessary. */
115 dump_scope (tree scope, int flags)
117 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
119 if (scope == NULL_TREE)
122 if (TREE_CODE (scope) == NAMESPACE_DECL)
124 if (scope != global_namespace)
126 dump_decl (scope, f);
127 pp_cxx_colon_colon (cxx_pp);
130 else if (AGGREGATE_TYPE_P (scope))
132 dump_type (scope, f);
133 pp_cxx_colon_colon (cxx_pp);
135 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
137 dump_function_decl (scope, f);
138 pp_cxx_colon_colon (cxx_pp);
142 /* Dump the template ARGument under control of FLAGS. */
145 dump_template_argument (tree arg, int flags)
147 if (ARGUMENT_PACK_P (arg))
148 dump_template_argument_list (ARGUMENT_PACK_ARGS (arg), flags);
149 else if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
150 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
153 if (TREE_CODE (arg) == TREE_LIST)
154 arg = TREE_VALUE (arg);
156 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
160 /* Count the number of template arguments ARGS whose value does not
161 match the (optional) default template parameter in PARAMS */
164 get_non_default_template_args_count (tree args, int flags)
166 int n = TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args));
168 if (/* We use this flag when generating debug information. We don't
169 want to expand templates at this point, for this may generate
170 new decls, which gets decl counts out of sync, which may in
171 turn cause codegen differences between compilations with and
173 (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0
174 || !flag_pretty_templates)
177 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args));
180 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
184 dump_template_argument_list (tree args, int flags)
186 int n = get_non_default_template_args_count (args, flags);
190 for (i = 0; i < n; ++i)
192 tree arg = TREE_VEC_ELT (args, i);
194 /* Only print a comma if we know there is an argument coming. In
195 the case of an empty template argument pack, no actual
196 argument will be printed. */
198 && (!ARGUMENT_PACK_P (arg)
199 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
200 pp_separate_with_comma (cxx_pp);
202 dump_template_argument (arg, flags);
207 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
210 dump_template_parameter (tree parm, int flags)
215 if (parm == error_mark_node)
218 p = TREE_VALUE (parm);
219 a = TREE_PURPOSE (parm);
221 if (TREE_CODE (p) == TYPE_DECL)
223 if (flags & TFF_DECL_SPECIFIERS)
225 pp_cxx_ws_string (cxx_pp, "class");
226 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
227 pp_cxx_ws_string (cxx_pp, "...");
229 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
231 else if (DECL_NAME (p))
232 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
234 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
237 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
239 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
241 pp_cxx_whitespace (cxx_pp);
243 pp_cxx_whitespace (cxx_pp);
244 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
245 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
247 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
251 /* Dump, under control of FLAGS, a template-parameter-list binding.
252 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
256 dump_template_bindings (tree parms, tree args, VEC(tree,gc)* typenames)
264 tree p = TREE_VALUE (parms);
265 int lvl = TMPL_PARMS_DEPTH (parms);
268 tree lvl_args = NULL_TREE;
270 /* Don't crash if we had an invalid argument list. */
271 if (TMPL_ARGS_DEPTH (args) >= lvl)
272 lvl_args = TMPL_ARGS_LEVEL (args, lvl);
274 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
276 tree arg = NULL_TREE;
278 /* Don't crash if we had an invalid argument list. */
279 if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx)
280 arg = TREE_VEC_ELT (lvl_args, arg_idx);
283 pp_separate_with_comma (cxx_pp);
284 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
285 pp_cxx_whitespace (cxx_pp);
287 pp_cxx_whitespace (cxx_pp);
290 if (ARGUMENT_PACK_P (arg))
291 pp_cxx_left_brace (cxx_pp);
292 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
293 if (ARGUMENT_PACK_P (arg))
294 pp_cxx_right_brace (cxx_pp);
297 pp_string (cxx_pp, M_("<missing>"));
303 parms = TREE_CHAIN (parms);
306 for (i = 0; VEC_iterate (tree, typenames, i, t); ++i)
309 pp_separate_with_comma (cxx_pp);
310 dump_type (t, TFF_PLAIN_IDENTIFIER);
311 pp_cxx_whitespace (cxx_pp);
313 pp_cxx_whitespace (cxx_pp);
314 t = tsubst (t, args, tf_none, NULL_TREE);
315 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
316 pp_simple_type_specifier doesn't know about it. */
317 t = strip_typedefs (t);
318 dump_type (t, TFF_PLAIN_IDENTIFIER);
322 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
326 dump_type (tree t, int flags)
331 if (TYPE_PTRMEMFUNC_P (t))
334 switch (TREE_CODE (t))
337 if (t == init_list_type_node)
338 pp_string (cxx_pp, M_("<brace-enclosed initializer list>"));
340 pp_string (cxx_pp, M_("<unresolved overloaded function type>"));
344 /* A list of function parms. */
345 dump_parameters (t, flags);
348 case IDENTIFIER_NODE:
349 pp_cxx_tree_identifier (cxx_pp, t);
353 dump_type (BINFO_TYPE (t), flags);
359 dump_aggr_type (t, flags);
363 if (flags & TFF_CHASE_TYPEDEF)
365 dump_type (DECL_ORIGINAL_TYPE (t)
366 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
369 /* Else fall through. */
373 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
382 case FIXED_POINT_TYPE:
383 pp_type_specifier_seq (cxx_pp, t);
386 case TEMPLATE_TEMPLATE_PARM:
387 /* For parameters inside template signature. */
388 if (TYPE_IDENTIFIER (t))
389 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
391 pp_cxx_canonical_template_parameter (cxx_pp, t);
394 case BOUND_TEMPLATE_TEMPLATE_PARM:
396 tree args = TYPE_TI_ARGS (t);
397 pp_cxx_cv_qualifier_seq (cxx_pp, t);
398 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
399 pp_cxx_begin_template_argument_list (cxx_pp);
400 dump_template_argument_list (args, flags);
401 pp_cxx_end_template_argument_list (cxx_pp);
405 case TEMPLATE_TYPE_PARM:
406 pp_cxx_cv_qualifier_seq (cxx_pp, t);
407 if (TYPE_IDENTIFIER (t))
408 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
410 pp_cxx_canonical_template_parameter
411 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
414 /* This is not always necessary for pointers and such, but doing this
415 reduces code size. */
424 dump_type_prefix (t, flags);
425 dump_type_suffix (t, flags);
429 if (! (flags & TFF_CHASE_TYPEDEF)
430 && DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
432 dump_decl (TYPE_NAME (t), TFF_PLAIN_IDENTIFIER);
435 pp_cxx_cv_qualifier_seq (cxx_pp, t);
436 pp_cxx_ws_string (cxx_pp,
437 TYPENAME_IS_ENUM_P (t) ? "enum"
438 : TYPENAME_IS_CLASS_P (t) ? "class"
440 dump_typename (t, flags);
443 case UNBOUND_CLASS_TEMPLATE:
444 if (! (flags & TFF_UNQUALIFIED_NAME))
446 dump_type (TYPE_CONTEXT (t), flags);
447 pp_cxx_colon_colon (cxx_pp);
449 pp_cxx_ws_string (cxx_pp, "template");
450 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
454 pp_cxx_ws_string (cxx_pp, "__typeof__");
455 pp_cxx_whitespace (cxx_pp);
456 pp_cxx_left_paren (cxx_pp);
457 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
458 pp_cxx_right_paren (cxx_pp);
461 case TYPE_PACK_EXPANSION:
462 dump_type (PACK_EXPANSION_PATTERN (t), flags);
463 pp_cxx_ws_string (cxx_pp, "...");
466 case TYPE_ARGUMENT_PACK:
467 dump_template_argument (t, flags);
471 pp_cxx_ws_string (cxx_pp, "decltype");
472 pp_cxx_whitespace (cxx_pp);
473 pp_cxx_left_paren (cxx_pp);
474 dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
475 pp_cxx_right_paren (cxx_pp);
479 pp_unsupported_tree (cxx_pp, t);
480 /* Fall through to error. */
483 pp_string (cxx_pp, M_("<type error>"));
488 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
492 dump_typename (tree t, int flags)
494 tree ctx = TYPE_CONTEXT (t);
496 if (TREE_CODE (ctx) == TYPENAME_TYPE)
497 dump_typename (ctx, flags);
499 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
500 pp_cxx_colon_colon (cxx_pp);
501 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
504 /* Return the name of the supplied aggregate, or enumeral type. */
507 class_key_or_enum_as_string (tree t)
509 if (TREE_CODE (t) == ENUMERAL_TYPE)
511 if (SCOPED_ENUM_P (t))
516 else if (TREE_CODE (t) == UNION_TYPE)
518 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
524 /* Print out a class declaration T under the control of FLAGS,
525 in the form `class foo'. */
528 dump_aggr_type (tree t, int flags)
531 const char *variety = class_key_or_enum_as_string (t);
535 pp_cxx_cv_qualifier_seq (cxx_pp, t);
537 if (flags & TFF_CLASS_KEY_OR_ENUM)
538 pp_cxx_ws_string (cxx_pp, variety);
540 name = TYPE_NAME (t);
544 typdef = !DECL_ARTIFICIAL (name);
547 && ((flags & TFF_CHASE_TYPEDEF)
548 || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name)
549 && DECL_TEMPLATE_INFO (name))))
550 || DECL_SELF_REFERENCE_P (name))
552 t = TYPE_MAIN_VARIANT (t);
553 name = TYPE_NAME (t);
557 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
558 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
559 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
560 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
562 if (! (flags & TFF_UNQUALIFIED_NAME))
563 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
564 flags &= ~TFF_UNQUALIFIED_NAME;
567 /* Because the template names are mangled, we have to locate
568 the most general template, and use that name. */
569 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
571 while (DECL_TEMPLATE_INFO (tpl))
572 tpl = DECL_TI_TEMPLATE (tpl);
575 name = DECL_NAME (name);
578 if (name == 0 || ANON_AGGRNAME_P (name))
580 if (flags & TFF_CLASS_KEY_OR_ENUM)
581 pp_string (cxx_pp, M_("<anonymous>"));
583 pp_printf (pp_base (cxx_pp), M_("<anonymous %s>"), variety);
585 else if (LAMBDANAME_P (name))
587 /* A lambda's "type" is essentially its signature. */
588 pp_string (cxx_pp, M_("<lambda"));
589 if (lambda_function (t))
590 dump_parameters (FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t)),
592 pp_character(cxx_pp, '>');
595 pp_cxx_tree_identifier (cxx_pp, name);
597 dump_template_parms (TYPE_TEMPLATE_INFO (t),
598 !CLASSTYPE_USE_TEMPLATE (t),
599 flags & ~TFF_TEMPLATE_HEADER);
602 /* Dump into the obstack the initial part of the output for a given type.
603 This is necessary when dealing with things like functions returning
606 return type of `int (* fee ())()': pointer -> function -> int. Both
607 pointer (and reference and offset) and function (and member) types must
608 deal with prefix and suffix.
610 Arrays must also do this for DECL nodes, like int a[], and for things like
614 dump_type_prefix (tree t, int flags)
616 if (TYPE_PTRMEMFUNC_P (t))
618 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
622 switch (TREE_CODE (t))
627 tree sub = TREE_TYPE (t);
629 dump_type_prefix (sub, flags);
630 if (TREE_CODE (sub) == ARRAY_TYPE
631 || TREE_CODE (sub) == FUNCTION_TYPE)
633 pp_cxx_whitespace (cxx_pp);
634 pp_cxx_left_paren (cxx_pp);
636 if (TREE_CODE (t) == POINTER_TYPE)
637 pp_character(cxx_pp, '*');
638 else if (TREE_CODE (t) == REFERENCE_TYPE)
640 if (TYPE_REF_IS_RVALUE (t))
641 pp_string (cxx_pp, "&&");
643 pp_character (cxx_pp, '&');
645 pp_base (cxx_pp)->padding = pp_before;
646 pp_cxx_cv_qualifier_seq (cxx_pp, t);
652 dump_type_prefix (TREE_TYPE (t), flags);
653 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
655 pp_maybe_space (cxx_pp);
656 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
657 pp_cxx_left_paren (cxx_pp);
658 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
659 pp_cxx_colon_colon (cxx_pp);
661 pp_cxx_star (cxx_pp);
662 pp_cxx_cv_qualifier_seq (cxx_pp, t);
663 pp_base (cxx_pp)->padding = pp_before;
666 /* This can be reached without a pointer when dealing with
667 templates, e.g. std::is_function. */
669 dump_type_prefix (TREE_TYPE (t), flags);
673 dump_type_prefix (TREE_TYPE (t), flags);
674 pp_maybe_space (cxx_pp);
675 pp_cxx_left_paren (cxx_pp);
676 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
677 pp_cxx_colon_colon (cxx_pp);
681 dump_type_prefix (TREE_TYPE (t), flags);
685 case IDENTIFIER_NODE:
690 case TEMPLATE_TYPE_PARM:
691 case TEMPLATE_TEMPLATE_PARM:
692 case BOUND_TEMPLATE_TEMPLATE_PARM:
704 case TYPE_PACK_EXPANSION:
705 case FIXED_POINT_TYPE:
706 dump_type (t, flags);
707 pp_base (cxx_pp)->padding = pp_before;
711 pp_unsupported_tree (cxx_pp, t);
714 pp_string (cxx_pp, M_("<typeprefixerror>"));
719 /* Dump the suffix of type T, under control of FLAGS. This is the part
720 which appears after the identifier (or function parms). */
723 dump_type_suffix (tree t, int flags)
725 if (TYPE_PTRMEMFUNC_P (t))
726 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
728 switch (TREE_CODE (t))
733 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
734 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
735 pp_cxx_right_paren (cxx_pp);
736 dump_type_suffix (TREE_TYPE (t), flags);
743 if (TREE_CODE (t) == METHOD_TYPE)
744 /* Can only be reached through a pointer. */
745 pp_cxx_right_paren (cxx_pp);
746 arg = TYPE_ARG_TYPES (t);
747 if (TREE_CODE (t) == METHOD_TYPE)
748 arg = TREE_CHAIN (arg);
750 /* Function pointers don't have default args. Not in standard C++,
751 anyway; they may in g++, but we'll just pretend otherwise. */
752 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
754 if (TREE_CODE (t) == METHOD_TYPE)
755 pp_cxx_cv_qualifier_seq
756 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
758 pp_cxx_cv_qualifier_seq (cxx_pp, t);
759 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
760 dump_type_suffix (TREE_TYPE (t), flags);
765 pp_maybe_space (cxx_pp);
766 pp_cxx_left_bracket (cxx_pp);
769 tree dtype = TYPE_DOMAIN (t);
770 tree max = TYPE_MAX_VALUE (dtype);
771 if (host_integerp (max, 0))
772 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
773 else if (TREE_CODE (max) == MINUS_EXPR)
774 dump_expr (TREE_OPERAND (max, 0),
775 flags & ~TFF_EXPR_IN_PARENS);
777 dump_expr (fold_build2_loc (input_location,
778 PLUS_EXPR, dtype, max,
779 build_int_cst (dtype, 1)),
780 flags & ~TFF_EXPR_IN_PARENS);
782 pp_cxx_right_bracket (cxx_pp);
783 dump_type_suffix (TREE_TYPE (t), flags);
787 case IDENTIFIER_NODE:
792 case TEMPLATE_TYPE_PARM:
793 case TEMPLATE_TEMPLATE_PARM:
794 case BOUND_TEMPLATE_TEMPLATE_PARM:
806 case TYPE_PACK_EXPANSION:
807 case FIXED_POINT_TYPE:
811 pp_unsupported_tree (cxx_pp, t);
813 /* Don't mark it here, we should have already done in
820 dump_global_iord (tree t)
822 const char *p = NULL;
824 if (DECL_GLOBAL_CTOR_P (t))
825 p = M_("(static initializers for %s)");
826 else if (DECL_GLOBAL_DTOR_P (t))
827 p = M_("(static destructors for %s)");
831 pp_printf (pp_base (cxx_pp), p, input_filename);
835 dump_simple_decl (tree t, tree type, int flags)
837 if (flags & TFF_DECL_SPECIFIERS)
839 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
840 pp_maybe_space (cxx_pp);
842 if (! (flags & TFF_UNQUALIFIED_NAME)
843 && (!DECL_INITIAL (t)
844 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
845 dump_scope (CP_DECL_CONTEXT (t), flags);
846 flags &= ~TFF_UNQUALIFIED_NAME;
847 if ((flags & TFF_DECL_SPECIFIERS)
848 && DECL_TEMPLATE_PARM_P (t)
849 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
850 pp_string (cxx_pp, "...");
852 dump_decl (DECL_NAME (t), flags);
854 pp_string (cxx_pp, M_("<anonymous>"));
855 if (flags & TFF_DECL_SPECIFIERS)
856 dump_type_suffix (type, flags);
859 /* Dump a human readable string for the decl T under control of FLAGS. */
862 dump_decl (tree t, int flags)
867 switch (TREE_CODE (t))
870 /* Don't say 'typedef class A' */
871 if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t))
873 if ((flags & TFF_DECL_SPECIFIERS)
874 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
876 /* Say `class T' not just `T'. */
877 pp_cxx_ws_string (cxx_pp, "class");
879 /* Emit the `...' for a parameter pack. */
880 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
881 pp_cxx_ws_string (cxx_pp, "...");
884 dump_type (TREE_TYPE (t), flags);
887 if ((flags & TFF_DECL_SPECIFIERS)
888 && !DECL_SELF_REFERENCE_P (t))
889 pp_cxx_ws_string (cxx_pp, "typedef");
890 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
891 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
896 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
898 pp_string (cxx_pp, M_("vtable for "));
899 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
900 dump_type (DECL_CONTEXT (t), flags);
903 /* Else fall through. */
906 dump_simple_decl (t, TREE_TYPE (t), flags);
910 pp_string (cxx_pp, M_("<return value> "));
911 dump_simple_decl (t, TREE_TYPE (t), flags);
915 if (flags & TFF_DECL_SPECIFIERS)
916 pp_cxx_declaration (cxx_pp, t);
919 if (! (flags & TFF_UNQUALIFIED_NAME))
920 dump_scope (CP_DECL_CONTEXT (t), flags);
921 flags &= ~TFF_UNQUALIFIED_NAME;
922 if (DECL_NAME (t) == NULL_TREE)
923 pp_string (cxx_pp, M_("<unnamed>"));
925 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
930 dump_type (TREE_OPERAND (t, 0), flags);
931 pp_string (cxx_pp, "::");
932 dump_decl (TREE_OPERAND (t, 1), flags|TFF_UNQUALIFIED_NAME);
936 dump_decl (TREE_OPERAND (t, 0), flags);
937 pp_cxx_left_bracket (cxx_pp);
938 dump_decl (TREE_OPERAND (t, 1), flags);
939 pp_cxx_right_bracket (cxx_pp);
942 /* So that we can do dump_decl on an aggr type. */
946 dump_type (t, flags);
950 /* This is a pseudo destructor call which has not been folded into
951 a PSEUDO_DTOR_EXPR yet. */
952 pp_cxx_complement (cxx_pp);
953 dump_type (TREE_OPERAND (t, 0), flags);
960 /* These special cases are duplicated here so that other functions
961 can feed identifiers to error and get them demangled properly. */
962 case IDENTIFIER_NODE:
963 if (IDENTIFIER_TYPENAME_P (t))
965 pp_cxx_ws_string (cxx_pp, "operator");
966 /* Not exactly IDENTIFIER_TYPE_VALUE. */
967 dump_type (TREE_TYPE (t), flags);
971 pp_cxx_tree_identifier (cxx_pp, t);
978 if (DECL_CLASS_SCOPE_P (t))
980 dump_type (DECL_CONTEXT (t), flags);
981 pp_cxx_colon_colon (cxx_pp);
983 else if (DECL_CONTEXT (t))
985 dump_decl (DECL_CONTEXT (t), flags);
986 pp_cxx_colon_colon (cxx_pp);
988 dump_decl (DECL_NAME (t), flags);
992 /* If there's only one function, just treat it like an ordinary
998 if (! DECL_LANG_SPECIFIC (t))
999 pp_string (cxx_pp, M_("<built-in>"));
1000 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
1001 dump_global_iord (t);
1003 dump_function_decl (t, flags);
1007 dump_template_decl (t, flags);
1010 case TEMPLATE_ID_EXPR:
1012 tree name = TREE_OPERAND (t, 0);
1014 if (is_overloaded_fn (name))
1015 name = DECL_NAME (get_first_fn (name));
1016 dump_decl (name, flags);
1017 pp_cxx_begin_template_argument_list (cxx_pp);
1018 if (TREE_OPERAND (t, 1))
1019 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
1020 pp_cxx_end_template_argument_list (cxx_pp);
1025 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
1029 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
1030 || (DECL_INITIAL (t) &&
1031 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
1032 dump_simple_decl (t, TREE_TYPE (t), flags);
1033 else if (DECL_NAME (t))
1034 dump_decl (DECL_NAME (t), flags);
1035 else if (DECL_INITIAL (t))
1036 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
1038 pp_string (cxx_pp, M_("<enumerator>"));
1042 pp_cxx_ws_string (cxx_pp, "using");
1043 dump_type (USING_DECL_SCOPE (t), flags);
1044 pp_cxx_colon_colon (cxx_pp);
1045 dump_decl (DECL_NAME (t), flags);
1049 pp_cxx_declaration (cxx_pp, t);
1053 dump_decl (BASELINK_FUNCTIONS (t), flags);
1056 case NON_DEPENDENT_EXPR:
1057 dump_expr (t, flags);
1060 case TEMPLATE_TYPE_PARM:
1061 if (flags & TFF_DECL_SPECIFIERS)
1062 pp_cxx_declaration (cxx_pp, t);
1064 pp_type_id (cxx_pp, t);
1067 case UNBOUND_CLASS_TEMPLATE:
1068 case TYPE_PACK_EXPANSION:
1070 dump_type (t, flags);
1074 pp_unsupported_tree (cxx_pp, t);
1075 /* Fall through to error. */
1078 pp_string (cxx_pp, M_("<declaration error>"));
1083 /* Dump a template declaration T under control of FLAGS. This means the
1084 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1087 dump_template_decl (tree t, int flags)
1089 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1093 if (flags & TFF_TEMPLATE_HEADER)
1095 for (parms = orig_parms = nreverse (orig_parms);
1097 parms = TREE_CHAIN (parms))
1099 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1100 int len = TREE_VEC_LENGTH (inner_parms);
1102 pp_cxx_ws_string (cxx_pp, "template");
1103 pp_cxx_begin_template_argument_list (cxx_pp);
1105 /* If we've shown the template prefix, we'd better show the
1106 parameters' and decl's type too. */
1107 flags |= TFF_DECL_SPECIFIERS;
1109 for (i = 0; i < len; i++)
1112 pp_separate_with_comma (cxx_pp);
1113 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1115 pp_cxx_end_template_argument_list (cxx_pp);
1116 pp_cxx_whitespace (cxx_pp);
1118 nreverse(orig_parms);
1120 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1122 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1123 pp_cxx_ws_string (cxx_pp, "class");
1125 /* If this is a parameter pack, print the ellipsis. */
1126 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1127 pp_cxx_ws_string (cxx_pp, "...");
1131 if (DECL_TEMPLATE_RESULT (t)
1132 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1133 dump_type (TREE_TYPE (t),
1134 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1135 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1136 else if (DECL_TEMPLATE_RESULT (t)
1137 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1138 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1141 gcc_assert (TREE_TYPE (t));
1142 switch (NEXT_CODE (t))
1146 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1149 /* This case can occur with some invalid code. */
1150 dump_type (TREE_TYPE (t),
1151 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1152 | (flags & TFF_DECL_SPECIFIERS
1153 ? TFF_CLASS_KEY_OR_ENUM : 0));
1158 /* find_typenames looks through the type of the function template T
1159 and returns a VEC containing any typedefs, decltypes or TYPENAME_TYPEs
1162 struct find_typenames_t
1164 struct pointer_set_t *p_set;
1165 VEC (tree,gc) *typenames;
1169 find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
1171 struct find_typenames_t *d = (struct find_typenames_t *)data;
1172 tree mv = NULL_TREE;
1174 if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp)))
1175 /* Add the type of the typedef without any additional cv-quals. */
1176 mv = TREE_TYPE (TYPE_NAME (*tp));
1177 else if (TREE_CODE (*tp) == TYPENAME_TYPE
1178 || TREE_CODE (*tp) == DECLTYPE_TYPE)
1179 /* Add the typename without any cv-qualifiers. */
1180 mv = TYPE_MAIN_VARIANT (*tp);
1182 if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv)))
1183 VEC_safe_push (tree, gc, d->typenames, mv);
1185 /* Search into class template arguments, which cp_walk_subtrees
1187 if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp))
1188 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r,
1194 static VEC(tree,gc) *
1195 find_typenames (tree t)
1197 struct find_typenames_t ft;
1198 ft.p_set = pointer_set_create ();
1199 ft.typenames = NULL;
1200 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
1201 find_typenames_r, &ft, ft.p_set);
1202 pointer_set_destroy (ft.p_set);
1203 return ft.typenames;
1206 /* Pretty print a function decl. There are several ways we want to print a
1207 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1208 As error can only apply the '#' flag once to give 0 and 1 for V, there
1209 is %D which doesn't print the throw specs, and %F which does. */
1212 dump_function_decl (tree t, int flags)
1216 tree cname = NULL_TREE;
1217 tree template_args = NULL_TREE;
1218 tree template_parms = NULL_TREE;
1219 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1220 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1222 VEC(tree,gc) *typenames = NULL;
1224 if (LAMBDA_FUNCTION_P (t))
1226 /* A lambda's signature is essentially its "type", so defer. */
1227 gcc_assert (LAMBDA_TYPE_P (DECL_CONTEXT (t)));
1228 dump_type (DECL_CONTEXT (t), flags);
1232 flags &= ~TFF_UNQUALIFIED_NAME;
1233 if (TREE_CODE (t) == TEMPLATE_DECL)
1234 t = DECL_TEMPLATE_RESULT (t);
1236 /* Save the exceptions, in case t is a specialization and we are
1237 emitting an error about incompatible specifications. */
1238 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1240 /* Pretty print template instantiations only. */
1241 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
1242 && flag_pretty_templates)
1246 template_args = DECL_TI_ARGS (t);
1247 tmpl = most_general_template (t);
1248 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1250 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1252 typenames = find_typenames (t);
1256 fntype = TREE_TYPE (t);
1257 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1259 if (DECL_CLASS_SCOPE_P (t))
1260 cname = DECL_CONTEXT (t);
1261 /* This is for partially instantiated template methods. */
1262 else if (TREE_CODE (fntype) == METHOD_TYPE)
1263 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1265 if (!(flags & TFF_DECL_SPECIFIERS))
1267 else if (DECL_STATIC_FUNCTION_P (t))
1268 pp_cxx_ws_string (cxx_pp, "static");
1269 else if (DECL_VIRTUAL_P (t))
1270 pp_cxx_ws_string (cxx_pp, "virtual");
1272 /* Print the return type? */
1274 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1275 && !DECL_DESTRUCTOR_P (t);
1277 dump_type_prefix (TREE_TYPE (fntype), flags);
1279 /* Print the function name. */
1280 if (!do_outer_scope)
1284 dump_type (cname, flags);
1285 pp_cxx_colon_colon (cxx_pp);
1288 dump_scope (CP_DECL_CONTEXT (t), flags);
1290 dump_function_name (t, flags);
1292 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1294 dump_parameters (parmtypes, flags);
1296 if (TREE_CODE (fntype) == METHOD_TYPE)
1298 pp_base (cxx_pp)->padding = pp_before;
1299 pp_cxx_cv_qualifier_seq
1300 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1303 if (flags & TFF_EXCEPTION_SPECIFICATION)
1305 pp_base (cxx_pp)->padding = pp_before;
1306 dump_exception_spec (exceptions, flags);
1310 dump_type_suffix (TREE_TYPE (fntype), flags);
1313 /* If T is a template instantiation, dump the parameter binding. */
1314 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1316 pp_cxx_whitespace (cxx_pp);
1317 pp_cxx_left_bracket (cxx_pp);
1318 pp_cxx_ws_string (cxx_pp, M_("with"));
1319 pp_cxx_whitespace (cxx_pp);
1320 dump_template_bindings (template_parms, template_args, typenames);
1321 pp_cxx_right_bracket (cxx_pp);
1325 /* Print a parameter list. If this is for a member function, the
1326 member object ptr (and any other hidden args) should have
1327 already been removed. */
1330 dump_parameters (tree parmtypes, int flags)
1333 pp_cxx_left_paren (cxx_pp);
1335 for (first = 1; parmtypes != void_list_node;
1336 parmtypes = TREE_CHAIN (parmtypes))
1339 pp_separate_with_comma (cxx_pp);
1343 pp_cxx_ws_string (cxx_pp, "...");
1347 dump_type (TREE_VALUE (parmtypes), flags);
1349 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1351 pp_cxx_whitespace (cxx_pp);
1353 pp_cxx_whitespace (cxx_pp);
1354 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1358 pp_cxx_right_paren (cxx_pp);
1361 /* Print an exception specification. T is the exception specification. */
1364 dump_exception_spec (tree t, int flags)
1368 pp_cxx_ws_string (cxx_pp, "throw");
1369 pp_cxx_whitespace (cxx_pp);
1370 pp_cxx_left_paren (cxx_pp);
1371 if (TREE_VALUE (t) != NULL_TREE)
1374 dump_type (TREE_VALUE (t), flags);
1378 pp_separate_with_comma (cxx_pp);
1380 pp_cxx_right_paren (cxx_pp);
1384 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1385 and destructors properly. */
1388 dump_function_name (tree t, int flags)
1390 tree name = DECL_NAME (t);
1392 /* We can get here with a decl that was synthesized by language-
1393 independent machinery (e.g. coverage.c) in which case it won't
1394 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1395 will crash. In this case it is safe just to print out the
1397 if (!DECL_LANG_SPECIFIC (t))
1399 pp_cxx_tree_identifier (cxx_pp, name);
1403 if (TREE_CODE (t) == TEMPLATE_DECL)
1404 t = DECL_TEMPLATE_RESULT (t);
1406 /* Don't let the user see __comp_ctor et al. */
1407 if (DECL_CONSTRUCTOR_P (t)
1408 || DECL_DESTRUCTOR_P (t))
1410 if (LAMBDA_TYPE_P (DECL_CONTEXT (t)))
1411 name = get_identifier ("<lambda>");
1413 name = constructor_name (DECL_CONTEXT (t));
1416 if (DECL_DESTRUCTOR_P (t))
1418 pp_cxx_complement (cxx_pp);
1419 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1421 else if (DECL_CONV_FN_P (t))
1423 /* This cannot use the hack that the operator's return
1424 type is stashed off of its name because it may be
1425 used for error reporting. In the case of conflicting
1426 declarations, both will have the same name, yet
1427 the types will be different, hence the TREE_TYPE field
1428 of the first name will be clobbered by the second. */
1429 pp_cxx_ws_string (cxx_pp, "operator");
1430 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1432 else if (name && IDENTIFIER_OPNAME_P (name))
1433 pp_cxx_tree_identifier (cxx_pp, name);
1435 dump_decl (name, flags);
1437 if (DECL_TEMPLATE_INFO (t)
1438 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1439 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1440 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1441 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1444 /* Dump the template parameters from the template info INFO under control of
1445 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1446 specialization (partial or complete). For partial specializations we show
1447 the specialized parameter values. For a primary template we show no
1451 dump_template_parms (tree info, int primary, int flags)
1453 tree args = info ? TI_ARGS (info) : NULL_TREE;
1455 if (primary && flags & TFF_TEMPLATE_NAME)
1457 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1458 pp_cxx_begin_template_argument_list (cxx_pp);
1460 /* Be careful only to print things when we have them, so as not
1461 to crash producing error messages. */
1462 if (args && !primary)
1465 len = get_non_default_template_args_count (args, flags);
1467 args = INNERMOST_TEMPLATE_ARGS (args);
1468 for (ix = 0; ix != len; ix++)
1470 tree arg = TREE_VEC_ELT (args, ix);
1472 /* Only print a comma if we know there is an argument coming. In
1473 the case of an empty template argument pack, no actual
1474 argument will be printed. */
1476 && (!ARGUMENT_PACK_P (arg)
1477 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1478 pp_separate_with_comma (cxx_pp);
1481 pp_string (cxx_pp, M_("<template parameter error>"));
1483 dump_template_argument (arg, flags);
1488 tree tpl = TI_TEMPLATE (info);
1489 tree parms = DECL_TEMPLATE_PARMS (tpl);
1492 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1493 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1495 for (ix = 0; ix != len; ix++)
1499 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1501 pp_string (cxx_pp, M_("<template parameter error>"));
1505 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1508 pp_separate_with_comma (cxx_pp);
1510 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1513 pp_cxx_end_template_argument_list (cxx_pp);
1516 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1517 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1520 dump_call_expr_args (tree t, int flags, bool skipfirst)
1523 call_expr_arg_iterator iter;
1525 pp_cxx_left_paren (cxx_pp);
1526 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1532 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1533 if (more_call_expr_args_p (&iter))
1534 pp_separate_with_comma (cxx_pp);
1537 pp_cxx_right_paren (cxx_pp);
1540 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1541 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1545 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1548 aggr_init_expr_arg_iterator iter;
1550 pp_cxx_left_paren (cxx_pp);
1551 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1557 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1558 if (more_aggr_init_expr_args_p (&iter))
1559 pp_separate_with_comma (cxx_pp);
1562 pp_cxx_right_paren (cxx_pp);
1565 /* Print out a list of initializers (subr of dump_expr). */
1568 dump_expr_list (tree l, int flags)
1572 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1575 pp_separate_with_comma (cxx_pp);
1579 /* Print out a vector of initializers (subr of dump_expr). */
1582 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1584 unsigned HOST_WIDE_INT idx;
1587 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1589 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1590 if (idx != VEC_length (constructor_elt, v) - 1)
1591 pp_separate_with_comma (cxx_pp);
1596 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1597 function. Resolve it to a close relative -- in the sense of static
1598 type -- variant being overridden. That is close to what was written in
1599 the source code. Subroutine of dump_expr. */
1602 resolve_virtual_fun_from_obj_type_ref (tree ref)
1604 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1605 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1606 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1609 fun = TREE_CHAIN (fun);
1610 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1611 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1617 /* Print out an expression E under control of FLAGS. */
1620 dump_expr (tree t, int flags)
1625 if (STATEMENT_CLASS_P (t))
1627 pp_cxx_ws_string (cxx_pp, M_("<statement>"));
1631 switch (TREE_CODE (t))
1639 case NAMESPACE_DECL:
1642 case IDENTIFIER_NODE:
1643 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1650 pp_constant (cxx_pp, t);
1654 /* While waiting for caret diagnostics, avoid printing
1655 __cxa_allocate_exception, __cxa_throw, and the like. */
1656 pp_cxx_ws_string (cxx_pp, M_("<throw-expression>"));
1660 pp_ampersand (cxx_pp);
1661 dump_type (PTRMEM_CST_CLASS (t), flags);
1662 pp_cxx_colon_colon (cxx_pp);
1663 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1667 pp_cxx_left_paren (cxx_pp);
1668 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1669 pp_separate_with_comma (cxx_pp);
1670 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1671 pp_cxx_right_paren (cxx_pp);
1675 pp_cxx_left_paren (cxx_pp);
1676 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1677 pp_string (cxx_pp, " ? ");
1678 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1679 pp_string (cxx_pp, " : ");
1680 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1681 pp_cxx_right_paren (cxx_pp);
1685 if (TREE_HAS_CONSTRUCTOR (t))
1687 pp_cxx_ws_string (cxx_pp, "new");
1688 pp_cxx_whitespace (cxx_pp);
1689 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1692 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1695 case AGGR_INIT_EXPR:
1697 tree fn = NULL_TREE;
1699 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1700 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1702 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1704 if (DECL_CONSTRUCTOR_P (fn))
1705 dump_type (DECL_CONTEXT (fn), flags);
1710 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1712 dump_aggr_init_expr_args (t, flags, true);
1717 tree fn = CALL_EXPR_FN (t);
1718 bool skipfirst = false;
1720 if (TREE_CODE (fn) == ADDR_EXPR)
1721 fn = TREE_OPERAND (fn, 0);
1723 /* Nobody is interested in seeing the guts of vcalls. */
1724 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1725 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1727 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1729 tree ob = CALL_EXPR_ARG (t, 0);
1730 if (TREE_CODE (ob) == ADDR_EXPR)
1732 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1733 pp_cxx_dot (cxx_pp);
1735 else if (TREE_CODE (ob) != PARM_DECL
1736 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1738 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1739 pp_cxx_arrow (cxx_pp);
1743 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1744 dump_call_expr_args (t, flags, skipfirst);
1749 /* Note that this only works for G++ target exprs. If somebody
1750 builds a general TARGET_EXPR, there's no way to represent that
1751 it initializes anything other that the parameter slot for the
1752 default argument. Note we may have cleared out the first
1753 operand in expand_expr, so don't go killing ourselves. */
1754 if (TREE_OPERAND (t, 1))
1755 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1758 case POINTER_PLUS_EXPR:
1759 dump_binary_op ("+", t, flags);
1767 case TRUNC_DIV_EXPR:
1768 case TRUNC_MOD_EXPR:
1776 case TRUTH_ANDIF_EXPR:
1777 case TRUTH_ORIF_EXPR:
1784 case EXACT_DIV_EXPR:
1785 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1789 case FLOOR_DIV_EXPR:
1790 case ROUND_DIV_EXPR:
1792 dump_binary_op ("/", t, flags);
1796 case FLOOR_MOD_EXPR:
1797 case ROUND_MOD_EXPR:
1798 dump_binary_op ("%", t, flags);
1803 tree ob = TREE_OPERAND (t, 0);
1804 if (TREE_CODE (ob) == INDIRECT_REF)
1806 ob = TREE_OPERAND (ob, 0);
1807 if (TREE_CODE (ob) != PARM_DECL
1809 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1811 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1812 pp_cxx_arrow (cxx_pp);
1817 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1818 pp_cxx_dot (cxx_pp);
1820 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1825 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1826 pp_cxx_left_bracket (cxx_pp);
1827 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1828 pp_cxx_right_bracket (cxx_pp);
1831 case UNARY_PLUS_EXPR:
1832 dump_unary_op ("+", t, flags);
1836 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1837 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1838 /* An ADDR_EXPR can have reference type. In that case, we
1839 shouldn't print the `&' doing so indicates to the user
1840 that the expression has pointer type. */
1842 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1843 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1844 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1845 dump_unary_op ("&&", t, flags);
1847 dump_unary_op ("&", t, flags);
1851 if (TREE_HAS_CONSTRUCTOR (t))
1853 t = TREE_OPERAND (t, 0);
1854 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1855 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1856 dump_call_expr_args (t, flags, true);
1860 if (TREE_OPERAND (t,0) != NULL_TREE
1861 && TREE_TYPE (TREE_OPERAND (t, 0))
1862 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1863 dump_expr (TREE_OPERAND (t, 0), flags);
1865 dump_unary_op ("*", t, flags);
1871 case TRUTH_NOT_EXPR:
1872 case PREDECREMENT_EXPR:
1873 case PREINCREMENT_EXPR:
1874 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1877 case POSTDECREMENT_EXPR:
1878 case POSTINCREMENT_EXPR:
1879 pp_cxx_left_paren (cxx_pp);
1880 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1881 pp_cxx_ws_string (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1882 pp_cxx_right_paren (cxx_pp);
1885 case NON_LVALUE_EXPR:
1886 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1887 should be another level of INDIRECT_REF so that I don't have to do
1889 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1891 tree next = TREE_TYPE (TREE_TYPE (t));
1893 while (TREE_CODE (next) == POINTER_TYPE)
1894 next = TREE_TYPE (next);
1896 if (TREE_CODE (next) == FUNCTION_TYPE)
1898 if (flags & TFF_EXPR_IN_PARENS)
1899 pp_cxx_left_paren (cxx_pp);
1900 pp_cxx_star (cxx_pp);
1901 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1902 if (flags & TFF_EXPR_IN_PARENS)
1903 pp_cxx_right_paren (cxx_pp);
1906 /* Else fall through. */
1908 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1912 case VIEW_CONVERT_EXPR:
1914 tree op = TREE_OPERAND (t, 0);
1916 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1918 /* It is a cast, but we cannot tell whether it is a
1919 reinterpret or static cast. Use the C style notation. */
1920 if (flags & TFF_EXPR_IN_PARENS)
1921 pp_cxx_left_paren (cxx_pp);
1922 pp_cxx_left_paren (cxx_pp);
1923 dump_type (TREE_TYPE (t), flags);
1924 pp_cxx_right_paren (cxx_pp);
1925 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1926 if (flags & TFF_EXPR_IN_PARENS)
1927 pp_cxx_right_paren (cxx_pp);
1930 dump_expr (op, flags);
1935 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1937 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1939 if (integer_zerop (idx))
1941 /* A NULL pointer-to-member constant. */
1942 pp_cxx_left_paren (cxx_pp);
1943 pp_cxx_left_paren (cxx_pp);
1944 dump_type (TREE_TYPE (t), flags);
1945 pp_cxx_right_paren (cxx_pp);
1946 pp_character (cxx_pp, '0');
1947 pp_cxx_right_paren (cxx_pp);
1950 else if (host_integerp (idx, 0))
1953 unsigned HOST_WIDE_INT n;
1955 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1956 t = TYPE_METHOD_BASETYPE (t);
1957 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1959 n = tree_low_cst (idx, 0);
1961 /* Map vtable index back one, to allow for the null pointer to
1965 while (n > 0 && virtuals)
1968 virtuals = TREE_CHAIN (virtuals);
1972 dump_expr (BV_FN (virtuals),
1973 flags | TFF_EXPR_IN_PARENS);
1978 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
1980 dump_type (TREE_TYPE (t), 0);
1981 pp_cxx_left_paren (cxx_pp);
1982 pp_cxx_right_paren (cxx_pp);
1986 pp_cxx_left_brace (cxx_pp);
1987 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
1988 pp_cxx_right_brace (cxx_pp);
1995 tree ob = TREE_OPERAND (t, 0);
1996 if (is_dummy_object (ob))
1998 t = TREE_OPERAND (t, 1);
1999 if (TREE_CODE (t) == FUNCTION_DECL)
2001 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
2002 else if (BASELINK_P (t))
2003 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
2004 flags | TFF_EXPR_IN_PARENS);
2006 dump_decl (t, flags);
2010 if (TREE_CODE (ob) == INDIRECT_REF)
2012 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
2013 pp_cxx_arrow (cxx_pp);
2014 pp_cxx_star (cxx_pp);
2018 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
2019 pp_cxx_dot (cxx_pp);
2020 pp_cxx_star (cxx_pp);
2022 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2027 case TEMPLATE_PARM_INDEX:
2028 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
2032 if (TREE_OPERAND (t, 0) == NULL_TREE
2033 || TREE_CHAIN (TREE_OPERAND (t, 0)))
2035 dump_type (TREE_TYPE (t), flags);
2036 pp_cxx_left_paren (cxx_pp);
2037 dump_expr_list (TREE_OPERAND (t, 0), flags);
2038 pp_cxx_right_paren (cxx_pp);
2042 pp_cxx_left_paren (cxx_pp);
2043 dump_type (TREE_TYPE (t), flags);
2044 pp_cxx_right_paren (cxx_pp);
2045 pp_cxx_left_paren (cxx_pp);
2046 dump_expr_list (TREE_OPERAND (t, 0), flags);
2047 pp_cxx_right_paren (cxx_pp);
2051 case STATIC_CAST_EXPR:
2052 pp_cxx_ws_string (cxx_pp, "static_cast");
2054 case REINTERPRET_CAST_EXPR:
2055 pp_cxx_ws_string (cxx_pp, "reinterpret_cast");
2057 case CONST_CAST_EXPR:
2058 pp_cxx_ws_string (cxx_pp, "const_cast");
2060 case DYNAMIC_CAST_EXPR:
2061 pp_cxx_ws_string (cxx_pp, "dynamic_cast");
2063 pp_cxx_begin_template_argument_list (cxx_pp);
2064 dump_type (TREE_TYPE (t), flags);
2065 pp_cxx_end_template_argument_list (cxx_pp);
2066 pp_cxx_left_paren (cxx_pp);
2067 dump_expr (TREE_OPERAND (t, 0), flags);
2068 pp_cxx_right_paren (cxx_pp);
2072 dump_expr (TREE_OPERAND (t, 0), flags);
2073 pp_cxx_arrow (cxx_pp);
2078 if (TREE_CODE (t) == SIZEOF_EXPR)
2079 pp_cxx_ws_string (cxx_pp, "sizeof");
2082 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
2083 pp_cxx_ws_string (cxx_pp, "__alignof__");
2085 pp_cxx_whitespace (cxx_pp);
2086 pp_cxx_left_paren (cxx_pp);
2087 if (TYPE_P (TREE_OPERAND (t, 0)))
2088 dump_type (TREE_OPERAND (t, 0), flags);
2090 dump_expr (TREE_OPERAND (t, 0), flags);
2091 pp_cxx_right_paren (cxx_pp);
2096 pp_cxx_ws_string (cxx_pp, operator_name_info[TREE_CODE (t)].name);
2097 pp_cxx_whitespace (cxx_pp);
2098 dump_expr (TREE_OPERAND (t, 0), flags);
2102 pp_string (cxx_pp, M_("<unparsed>"));
2105 case TRY_CATCH_EXPR:
2106 case WITH_CLEANUP_EXPR:
2107 case CLEANUP_POINT_EXPR:
2108 dump_expr (TREE_OPERAND (t, 0), flags);
2111 case PSEUDO_DTOR_EXPR:
2112 dump_expr (TREE_OPERAND (t, 2), flags);
2113 pp_cxx_dot (cxx_pp);
2114 dump_type (TREE_OPERAND (t, 0), flags);
2115 pp_cxx_colon_colon (cxx_pp);
2116 pp_cxx_complement (cxx_pp);
2117 dump_type (TREE_OPERAND (t, 1), flags);
2120 case TEMPLATE_ID_EXPR:
2121 dump_decl (t, flags);
2127 case STATEMENT_LIST:
2128 /* We don't yet have a way of dumping statements in a
2129 human-readable format. */
2130 pp_string (cxx_pp, "({...})");
2134 pp_string (cxx_pp, "while (1) { ");
2135 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2136 pp_cxx_right_brace (cxx_pp);
2140 pp_string (cxx_pp, "if (");
2141 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2142 pp_string (cxx_pp, ") break; ");
2146 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2149 case EMPTY_CLASS_EXPR:
2150 dump_type (TREE_TYPE (t), flags);
2151 pp_cxx_left_paren (cxx_pp);
2152 pp_cxx_right_paren (cxx_pp);
2155 case NON_DEPENDENT_EXPR:
2156 dump_expr (TREE_OPERAND (t, 0), flags);
2159 case ARGUMENT_PACK_SELECT:
2160 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2172 pp_type_specifier_seq (cxx_pp, t);
2176 /* We get here when we want to print a dependent type as an
2177 id-expression, without any disambiguator decoration. */
2178 pp_id_expression (cxx_pp, t);
2181 case TEMPLATE_TYPE_PARM:
2182 case BOUND_TEMPLATE_TEMPLATE_PARM:
2183 dump_type (t, flags);
2187 pp_cxx_trait_expression (cxx_pp, t);
2191 pp_cxx_va_arg_expression (cxx_pp, t);
2195 pp_cxx_offsetof_expression (cxx_pp, t);
2199 dump_decl (t, flags);
2202 case EXPR_PACK_EXPANSION:
2209 case VEC_DELETE_EXPR:
2215 case UNORDERED_EXPR:
2225 case FIX_TRUNC_EXPR:
2227 pp_expression (cxx_pp, t);
2230 case TRUTH_AND_EXPR:
2232 case TRUTH_XOR_EXPR:
2233 if (flags & TFF_EXPR_IN_PARENS)
2234 pp_cxx_left_paren (cxx_pp);
2235 pp_expression (cxx_pp, t);
2236 if (flags & TFF_EXPR_IN_PARENS)
2237 pp_cxx_right_paren (cxx_pp);
2241 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2244 /* This list is incomplete, but should suffice for now.
2245 It is very important that `sorry' does not call
2246 `report_error_function'. That could cause an infinite loop. */
2248 pp_unsupported_tree (cxx_pp, t);
2249 /* fall through to ERROR_MARK... */
2251 pp_string (cxx_pp, M_("<expression error>"));
2257 dump_binary_op (const char *opstring, tree t, int flags)
2259 pp_cxx_left_paren (cxx_pp);
2260 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2261 pp_cxx_whitespace (cxx_pp);
2263 pp_cxx_ws_string (cxx_pp, opstring);
2265 pp_string (cxx_pp, M_("<unknown operator>"));
2266 pp_cxx_whitespace (cxx_pp);
2267 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2268 pp_cxx_right_paren (cxx_pp);
2272 dump_unary_op (const char *opstring, tree t, int flags)
2274 if (flags & TFF_EXPR_IN_PARENS)
2275 pp_cxx_left_paren (cxx_pp);
2276 pp_cxx_ws_string (cxx_pp, opstring);
2277 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2278 if (flags & TFF_EXPR_IN_PARENS)
2279 pp_cxx_right_paren (cxx_pp);
2283 reinit_cxx_pp (void)
2285 pp_clear_output_area (cxx_pp);
2286 pp_base (cxx_pp)->padding = pp_none;
2287 pp_indentation (cxx_pp) = 0;
2288 pp_needs_newline (cxx_pp) = false;
2289 cxx_pp->enclosing_scope = current_function_decl;
2293 /* Exported interface to stringifying types, exprs and decls under TFF_*
2297 type_as_string (tree typ, int flags)
2300 pp_translate_identifiers (cxx_pp) = false;
2301 dump_type (typ, flags);
2302 return pp_formatted_text (cxx_pp);
2306 type_as_string_translate (tree typ, int flags)
2309 dump_type (typ, flags);
2310 return pp_formatted_text (cxx_pp);
2314 expr_as_string (tree decl, int flags)
2317 pp_translate_identifiers (cxx_pp) = false;
2318 dump_expr (decl, flags);
2319 return pp_formatted_text (cxx_pp);
2323 decl_as_string (tree decl, int flags)
2326 pp_translate_identifiers (cxx_pp) = false;
2327 dump_decl (decl, flags);
2328 return pp_formatted_text (cxx_pp);
2332 decl_as_string_translate (tree decl, int flags)
2335 dump_decl (decl, flags);
2336 return pp_formatted_text (cxx_pp);
2339 /* Generate the three forms of printable names for cxx_printable_name. */
2342 lang_decl_name (tree decl, int v, bool translate)
2346 ? decl_as_string_translate (decl, TFF_DECL_SPECIFIERS)
2347 : decl_as_string (decl, TFF_DECL_SPECIFIERS));
2350 pp_translate_identifiers (cxx_pp) = translate;
2352 && (DECL_CLASS_SCOPE_P (decl)
2353 || (DECL_NAMESPACE_SCOPE_P (decl)
2354 && CP_DECL_CONTEXT (decl) != global_namespace)))
2356 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2357 pp_cxx_colon_colon (cxx_pp);
2360 if (TREE_CODE (decl) == FUNCTION_DECL)
2361 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2363 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2365 return pp_formatted_text (cxx_pp);
2368 /* Return the location of a tree passed to %+ formats. */
2371 location_of (tree t)
2373 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2374 t = DECL_CONTEXT (t);
2375 else if (TYPE_P (t))
2376 t = TYPE_MAIN_DECL (t);
2377 else if (TREE_CODE (t) == OVERLOAD)
2378 t = OVL_FUNCTION (t);
2380 return DECL_SOURCE_LOCATION (t);
2383 /* Now the interfaces from error et al to dump_type et al. Each takes an
2384 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2388 decl_to_string (tree decl, int verbose)
2392 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2393 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2394 flags = TFF_CLASS_KEY_OR_ENUM;
2396 flags |= TFF_DECL_SPECIFIERS;
2397 else if (TREE_CODE (decl) == FUNCTION_DECL)
2398 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2399 flags |= TFF_TEMPLATE_HEADER;
2402 dump_decl (decl, flags);
2403 return pp_formatted_text (cxx_pp);
2407 expr_to_string (tree decl)
2410 dump_expr (decl, 0);
2411 return pp_formatted_text (cxx_pp);
2415 fndecl_to_string (tree fndecl, int verbose)
2419 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2420 | TFF_TEMPLATE_HEADER;
2422 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2424 dump_decl (fndecl, flags);
2425 return pp_formatted_text (cxx_pp);
2430 code_to_string (enum tree_code c)
2432 return tree_code_name [c];
2436 language_to_string (enum languages c)
2443 case lang_cplusplus:
2455 /* Return the proper printed version of a parameter to a C++ function. */
2458 parm_to_string (int p)
2462 pp_string (cxx_pp, "'this'");
2464 pp_decimal_int (cxx_pp, p + 1);
2465 return pp_formatted_text (cxx_pp);
2469 op_to_string (enum tree_code p)
2471 tree id = operator_name_info[(int) p].identifier;
2472 return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
2476 type_to_string (tree typ, int verbose)
2480 flags |= TFF_CLASS_KEY_OR_ENUM;
2481 flags |= TFF_TEMPLATE_HEADER;
2484 dump_type (typ, flags);
2485 return pp_formatted_text (cxx_pp);
2489 assop_to_string (enum tree_code p)
2491 tree id = assignment_operator_name_info[(int) p].identifier;
2492 return id ? IDENTIFIER_POINTER (id) : M_("{unknown}");
2496 args_to_string (tree p, int verbose)
2500 flags |= TFF_CLASS_KEY_OR_ENUM;
2505 if (TYPE_P (TREE_VALUE (p)))
2506 return type_as_string_translate (p, flags);
2509 for (; p; p = TREE_CHAIN (p))
2511 if (TREE_VALUE (p) == null_node)
2512 pp_cxx_ws_string (cxx_pp, "NULL");
2514 dump_type (error_type (TREE_VALUE (p)), flags);
2516 pp_separate_with_comma (cxx_pp);
2518 return pp_formatted_text (cxx_pp);
2522 cv_to_string (tree p, int v)
2525 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2526 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2527 return pp_formatted_text (cxx_pp);
2530 /* Langhook for print_error_function. */
2532 cxx_print_error_function (diagnostic_context *context, const char *file,
2533 diagnostic_info *diagnostic)
2535 lhd_print_error_function (context, file, diagnostic);
2536 pp_base_set_prefix (context->printer, file);
2537 maybe_print_instantiation_context (context);
2541 cp_diagnostic_starter (diagnostic_context *context,
2542 diagnostic_info *diagnostic)
2544 diagnostic_report_current_module (context);
2545 cp_print_error_function (context, diagnostic);
2546 maybe_print_instantiation_context (context);
2547 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2551 cp_diagnostic_finalizer (diagnostic_context *context,
2552 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2554 pp_base_destroy_prefix (context->printer);
2557 /* Print current function onto BUFFER, in the process of reporting
2558 a diagnostic message. Called from cp_diagnostic_starter. */
2560 cp_print_error_function (diagnostic_context *context,
2561 diagnostic_info *diagnostic)
2563 if (diagnostic_last_function_changed (context, diagnostic))
2565 const char *old_prefix = context->printer->prefix;
2566 const char *file = LOCATION_FILE (diagnostic->location);
2567 tree abstract_origin = diagnostic->abstract_origin;
2568 char *new_prefix = (file && abstract_origin == NULL)
2569 ? file_name_as_prefix (file) : NULL;
2571 pp_base_set_prefix (context->printer, new_prefix);
2573 if (current_function_decl == NULL)
2574 pp_base_string (context->printer, _("At global scope:"));
2579 if (abstract_origin)
2581 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2582 while (TREE_CODE (ao) == BLOCK
2583 && BLOCK_ABSTRACT_ORIGIN (ao)
2584 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2585 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2586 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2590 fndecl = current_function_decl;
2592 pp_printf (context->printer, function_category (fndecl),
2593 cxx_printable_name_translate (fndecl, 2));
2595 while (abstract_origin)
2598 tree block = abstract_origin;
2600 locus = &BLOCK_SOURCE_LOCATION (block);
2602 block = BLOCK_SUPERCONTEXT (block);
2603 while (block && TREE_CODE (block) == BLOCK
2604 && BLOCK_ABSTRACT_ORIGIN (block))
2606 ao = BLOCK_ABSTRACT_ORIGIN (block);
2608 while (TREE_CODE (ao) == BLOCK
2609 && BLOCK_ABSTRACT_ORIGIN (ao)
2610 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2611 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2613 if (TREE_CODE (ao) == FUNCTION_DECL)
2618 else if (TREE_CODE (ao) != BLOCK)
2621 block = BLOCK_SUPERCONTEXT (block);
2624 abstract_origin = block;
2627 while (block && TREE_CODE (block) == BLOCK)
2628 block = BLOCK_SUPERCONTEXT (block);
2630 if (block && TREE_CODE (block) == FUNCTION_DECL)
2632 abstract_origin = NULL;
2636 expanded_location s = expand_location (*locus);
2637 pp_base_character (context->printer, ',');
2638 pp_base_newline (context->printer);
2641 if (flag_show_column && s.column != 0)
2642 pp_printf (context->printer,
2643 _(" inlined from %qs at %s:%d:%d"),
2644 cxx_printable_name_translate (fndecl, 2),
2645 s.file, s.line, s.column);
2647 pp_printf (context->printer,
2648 _(" inlined from %qs at %s:%d"),
2649 cxx_printable_name_translate (fndecl, 2),
2654 pp_printf (context->printer, _(" inlined from %qs"),
2655 cxx_printable_name_translate (fndecl, 2));
2658 pp_base_character (context->printer, ':');
2660 pp_base_newline (context->printer);
2662 diagnostic_set_last_function (context, diagnostic);
2663 pp_base_destroy_prefix (context->printer);
2664 context->printer->prefix = old_prefix;
2668 /* Returns a description of FUNCTION using standard terminology. The
2669 result is a format string of the form "In CATEGORY %qs". */
2671 function_category (tree fn)
2673 /* We can get called from the middle-end for diagnostics of function
2674 clones. Make sure we have language specific information before
2675 dereferencing it. */
2676 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn))
2677 && DECL_FUNCTION_MEMBER_P (fn))
2679 if (DECL_STATIC_FUNCTION_P (fn))
2680 return _("In static member function %qs");
2681 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2682 return _("In copy constructor %qs");
2683 else if (DECL_CONSTRUCTOR_P (fn))
2684 return _("In constructor %qs");
2685 else if (DECL_DESTRUCTOR_P (fn))
2686 return _("In destructor %qs");
2687 else if (LAMBDA_FUNCTION_P (fn))
2688 return _("In lambda function");
2690 return _("In member function %qs");
2693 return _("In function %qs");
2696 /* Report the full context of a current template instantiation,
2699 print_instantiation_full_context (diagnostic_context *context)
2701 struct tinst_level *p = current_instantiation ();
2702 location_t location = input_location;
2706 if (current_function_decl != p->decl
2707 && current_function_decl != NULL_TREE)
2708 /* We can get here during the processing of some synthesized
2709 method. Then, P->DECL will be the function that's causing
2714 if (current_function_decl == p->decl)
2715 /* Avoid redundancy with the "In function" line. */;
2717 pp_verbatim (context->printer,
2718 _("%s: In instantiation of %qs:\n"),
2719 LOCATION_FILE (location),
2720 decl_as_string_translate (p->decl,
2721 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2723 location = p->locus;
2728 print_instantiation_partial_context (context, p, location);
2731 /* Helper function of print_instantiation_partial_context() that
2732 prints a single line of instantiation context. */
2735 print_instantiation_partial_context_line (diagnostic_context *context,
2736 const struct tinst_level *t, location_t loc)
2738 expanded_location xloc;
2739 xloc = expand_location (loc);
2743 str = decl_as_string_translate (t->decl,
2744 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE);
2745 if (flag_show_column)
2746 pp_verbatim (context->printer,
2747 _("%s:%d:%d: instantiated from %qs\n"),
2748 xloc.file, xloc.line, xloc.column, str);
2750 pp_verbatim (context->printer,
2751 _("%s:%d: instantiated from %qs\n"),
2752 xloc.file, xloc.line, str);
2754 if (flag_show_column)
2755 pp_verbatim (context->printer, _("%s:%d:%d: instantiated from here"),
2756 xloc.file, xloc.line, xloc.column);
2758 pp_verbatim (context->printer, _("%s:%d: instantiated from here"),
2759 xloc.file, xloc.line);
2763 /* Same as print_instantiation_full_context but less verbose. */
2766 print_instantiation_partial_context (diagnostic_context *context,
2767 struct tinst_level *t0, location_t loc)
2769 struct tinst_level *t;
2773 for (t = t0; t != NULL; t = t->next)
2780 int skip = n_total - 10;
2781 for (n = 0; n < 5; n++)
2783 gcc_assert (t != NULL);
2784 print_instantiation_partial_context_line (context, t, loc);
2790 expanded_location xloc;
2791 xloc = expand_location (loc);
2792 if (flag_show_column)
2793 pp_verbatim (context->printer,
2794 _("%s:%d:%d: [ skipping %d instantiation contexts ]\n"),
2795 xloc.file, xloc.line, xloc.column, skip);
2797 pp_verbatim (context->printer,
2798 _("%s:%d: [ skipping %d instantiation contexts ]\n"),
2799 xloc.file, xloc.line, skip);
2804 } while (--skip > 0);
2808 for (; t != NULL; t = t->next)
2810 print_instantiation_partial_context_line (context, t, loc);
2813 print_instantiation_partial_context_line (context, NULL, loc);
2814 pp_base_newline (context->printer);
2817 /* Called from cp_thing to print the template context for an error. */
2819 maybe_print_instantiation_context (diagnostic_context *context)
2821 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2824 record_last_problematic_instantiation ();
2825 print_instantiation_full_context (context);
2828 /* Report the bare minimum context of a template instantiation. */
2830 print_instantiation_context (void)
2832 print_instantiation_partial_context
2833 (global_dc, current_instantiation (), input_location);
2834 diagnostic_flush_buffer (global_dc);
2837 /* Called from output_format -- during diagnostic message processing --
2838 to handle C++ specific format specifier with the following meanings:
2839 %A function argument-list.
2843 %F function declaration.
2844 %L language as used in extern "lang".
2846 %P function parameter whose position is indicated by an integer.
2847 %Q assignment operator.
2851 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2852 int precision, bool wide, bool set_locus, bool verbose)
2856 #define next_tree (t = va_arg (*text->args_ptr, tree))
2857 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
2858 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
2859 #define next_int va_arg (*text->args_ptr, int)
2861 if (precision != 0 || wide)
2864 if (text->locus == NULL)
2869 case 'A': result = args_to_string (next_tree, verbose); break;
2870 case 'C': result = code_to_string (next_tcode); break;
2873 tree temp = next_tree;
2875 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
2877 temp = DECL_DEBUG_EXPR (temp);
2880 result = expr_to_string (temp);
2884 result = decl_to_string (temp, verbose);
2887 case 'E': result = expr_to_string (next_tree); break;
2888 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2889 case 'L': result = language_to_string (next_lang); break;
2890 case 'O': result = op_to_string (next_tcode); break;
2891 case 'P': result = parm_to_string (next_int); break;
2892 case 'Q': result = assop_to_string (next_tcode); break;
2893 case 'T': result = type_to_string (next_tree, verbose); break;
2894 case 'V': result = cv_to_string (next_tree, verbose); break;
2900 pp_base_string (pp, result);
2901 if (set_locus && t != NULL)
2902 *text->locus = location_of (t);
2910 /* Warn about the use of C++0x features when appropriate. */
2912 maybe_warn_cpp0x (cpp0x_warn_str str)
2914 if ((cxx_dialect == cxx98) && !in_system_header)
2915 /* We really want to suppress this warning in system headers,
2916 because libstdc++ uses variadic templates even when we aren't
2920 case CPP0X_INITIALIZER_LISTS:
2921 pedwarn (input_location, 0,
2922 "extended initializer lists "
2923 "only available with -std=c++0x or -std=gnu++0x");
2925 case CPP0X_EXPLICIT_CONVERSION:
2926 pedwarn (input_location, 0,
2927 "explicit conversion operators "
2928 "only available with -std=c++0x or -std=gnu++0x");
2930 case CPP0X_VARIADIC_TEMPLATES:
2931 pedwarn (input_location, 0,
2932 "variadic templates "
2933 "only available with -std=c++0x or -std=gnu++0x");
2935 case CPP0X_LAMBDA_EXPR:
2936 pedwarn (input_location, 0,
2937 "lambda expressions "
2938 "only available with -std=c++0x or -std=gnu++0x");
2941 pedwarn (input_location, 0,
2942 "C++0x auto only available with -std=c++0x or -std=gnu++0x");
2944 case CPP0X_SCOPED_ENUMS:
2945 pedwarn (input_location, 0,
2946 "scoped enums only available with -std=c++0x or -std=gnu++0x");
2948 case CPP0X_DEFAULTED_DELETED:
2949 pedwarn (input_location, 0,
2950 "defaulted and deleted functions "
2951 "only available with -std=c++0x or -std=gnu++0x");
2958 /* Warn about the use of variadic templates when appropriate. */
2960 maybe_warn_variadic_templates (void)
2962 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES);
2966 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
2967 option OPT with text GMSGID. Use this function to report
2968 diagnostics for constructs that are invalid C++98, but valid
2971 pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...)
2973 diagnostic_info diagnostic;
2976 va_start (ap, gmsgid);
2977 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
2978 (cxx_dialect == cxx98) ? DK_PEDWARN : DK_WARNING);
2979 diagnostic.option_index = opt;
2981 return report_diagnostic (&diagnostic);