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, 2003,
4 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
5 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
29 #include "diagnostic.h"
30 #include "tree-diagnostic.h"
31 #include "langhooks-def.h"
33 #include "cxx-pretty-print.h"
34 #include "tree-pretty-print.h"
35 #include "pointer-set.h"
36 #include "c-family/c-objc.h"
38 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
40 /* The global buffer where we dump everything. It is there only for
41 transitional purpose. It is expected, in the near future, to be
42 completely removed. */
43 static cxx_pretty_printer scratch_pretty_printer;
44 #define cxx_pp (&scratch_pretty_printer)
46 /* Translate if being used for diagnostics, but not for dump files or
48 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
50 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
52 static const char *args_to_string (tree, int);
53 static const char *assop_to_string (enum tree_code);
54 static const char *code_to_string (enum tree_code);
55 static const char *cv_to_string (tree, int);
56 static const char *decl_to_string (tree, int);
57 static const char *expr_to_string (tree);
58 static const char *fndecl_to_string (tree, int);
59 static const char *op_to_string (enum tree_code);
60 static const char *parm_to_string (int);
61 static const char *type_to_string (tree, int);
63 static void dump_type (tree, int);
64 static void dump_typename (tree, int);
65 static void dump_simple_decl (tree, tree, int);
66 static void dump_decl (tree, int);
67 static void dump_template_decl (tree, int);
68 static void dump_function_decl (tree, int);
69 static void dump_expr (tree, int);
70 static void dump_unary_op (const char *, tree, int);
71 static void dump_binary_op (const char *, tree, int);
72 static void dump_aggr_type (tree, int);
73 static void dump_type_prefix (tree, int);
74 static void dump_type_suffix (tree, int);
75 static void dump_function_name (tree, int);
76 static void dump_call_expr_args (tree, int, bool);
77 static void dump_aggr_init_expr_args (tree, int, bool);
78 static void dump_expr_list (tree, int);
79 static void dump_global_iord (tree);
80 static void dump_parameters (tree, int);
81 static void dump_exception_spec (tree, int);
82 static void dump_template_argument (tree, int);
83 static void dump_template_argument_list (tree, int);
84 static void dump_template_parameter (tree, int);
85 static void dump_template_bindings (tree, tree, VEC(tree,gc) *);
86 static void dump_scope (tree, int);
87 static void dump_template_parms (tree, int, int);
88 static int get_non_default_template_args_count (tree, int);
89 static const char *function_category (tree);
90 static void maybe_print_constexpr_context (diagnostic_context *);
91 static void maybe_print_instantiation_context (diagnostic_context *);
92 static void print_instantiation_full_context (diagnostic_context *);
93 static void print_instantiation_partial_context (diagnostic_context *,
96 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
97 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
98 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
100 static bool cp_printer (pretty_printer *, text_info *, const char *,
101 int, bool, bool, bool);
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 = 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), 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 get_non_default_template_args_count (tree args, int flags)
168 int n = TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args));
170 if (/* We use this flag when generating debug information. We don't
171 want to expand templates at this point, for this may generate
172 new decls, which gets decl counts out of sync, which may in
173 turn cause codegen differences between compilations with and
175 (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0
176 || !flag_pretty_templates)
179 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args));
182 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
186 dump_template_argument_list (tree args, int flags)
188 int n = get_non_default_template_args_count (args, flags);
192 for (i = 0; i < n; ++i)
194 tree arg = TREE_VEC_ELT (args, i);
196 /* Only print a comma if we know there is an argument coming. In
197 the case of an empty template argument pack, no actual
198 argument will be printed. */
200 && (!ARGUMENT_PACK_P (arg)
201 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
202 pp_separate_with_comma (cxx_pp);
204 dump_template_argument (arg, flags);
209 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
212 dump_template_parameter (tree parm, int flags)
217 if (parm == error_mark_node)
220 p = TREE_VALUE (parm);
221 a = TREE_PURPOSE (parm);
223 if (TREE_CODE (p) == TYPE_DECL)
225 if (flags & TFF_DECL_SPECIFIERS)
227 pp_cxx_ws_string (cxx_pp, "class");
228 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
229 pp_cxx_ws_string (cxx_pp, "...");
231 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
233 else if (DECL_NAME (p))
234 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
236 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
239 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
241 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
243 pp_cxx_whitespace (cxx_pp);
245 pp_cxx_whitespace (cxx_pp);
246 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
247 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
249 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
253 /* Dump, under control of FLAGS, a template-parameter-list binding.
254 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
258 dump_template_bindings (tree parms, tree args, VEC(tree,gc)* typenames)
266 tree p = TREE_VALUE (parms);
267 int lvl = TMPL_PARMS_DEPTH (parms);
270 tree lvl_args = NULL_TREE;
272 /* Don't crash if we had an invalid argument list. */
273 if (TMPL_ARGS_DEPTH (args) >= lvl)
274 lvl_args = TMPL_ARGS_LEVEL (args, lvl);
276 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
278 tree arg = NULL_TREE;
280 /* Don't crash if we had an invalid argument list. */
281 if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx)
282 arg = TREE_VEC_ELT (lvl_args, arg_idx);
285 pp_separate_with_comma (cxx_pp);
286 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
287 pp_cxx_whitespace (cxx_pp);
289 pp_cxx_whitespace (cxx_pp);
292 if (ARGUMENT_PACK_P (arg))
293 pp_cxx_left_brace (cxx_pp);
294 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
295 if (ARGUMENT_PACK_P (arg))
296 pp_cxx_right_brace (cxx_pp);
299 pp_string (cxx_pp, M_("<missing>"));
305 parms = TREE_CHAIN (parms);
308 FOR_EACH_VEC_ELT (tree, typenames, i, t)
311 pp_separate_with_comma (cxx_pp);
312 dump_type (t, TFF_PLAIN_IDENTIFIER);
313 pp_cxx_whitespace (cxx_pp);
315 pp_cxx_whitespace (cxx_pp);
316 t = tsubst (t, args, tf_none, NULL_TREE);
317 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
318 pp_simple_type_specifier doesn't know about it. */
319 t = strip_typedefs (t);
320 dump_type (t, TFF_PLAIN_IDENTIFIER);
324 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
328 dump_type (tree t, int flags)
333 /* Don't print e.g. "struct mytypedef". */
334 if (TYPE_P (t) && typedef_variant_p (t))
336 tree decl = TYPE_NAME (t);
337 if ((flags & TFF_CHASE_TYPEDEF)
338 || DECL_SELF_REFERENCE_P (decl)
339 || (!flag_pretty_templates
340 && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)))
341 t = strip_typedefs (t);
342 else if (same_type_p (t, TREE_TYPE (decl)))
346 pp_cxx_cv_qualifier_seq (cxx_pp, t);
347 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
352 if (TYPE_PTRMEMFUNC_P (t))
355 switch (TREE_CODE (t))
358 if (t == init_list_type_node)
359 pp_string (cxx_pp, M_("<brace-enclosed initializer list>"));
360 else if (t == unknown_type_node)
361 pp_string (cxx_pp, M_("<unresolved overloaded function type>"));
364 pp_cxx_cv_qualifier_seq (cxx_pp, t);
365 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
370 /* A list of function parms. */
371 dump_parameters (t, flags);
374 case IDENTIFIER_NODE:
375 pp_cxx_tree_identifier (cxx_pp, t);
379 dump_type (BINFO_TYPE (t), flags);
385 dump_aggr_type (t, flags);
389 if (flags & TFF_CHASE_TYPEDEF)
391 dump_type (DECL_ORIGINAL_TYPE (t)
392 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
395 /* Else fall through. */
399 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
408 case FIXED_POINT_TYPE:
409 pp_type_specifier_seq (cxx_pp, t);
412 case TEMPLATE_TEMPLATE_PARM:
413 /* For parameters inside template signature. */
414 if (TYPE_IDENTIFIER (t))
415 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
417 pp_cxx_canonical_template_parameter (cxx_pp, t);
420 case BOUND_TEMPLATE_TEMPLATE_PARM:
422 tree args = TYPE_TI_ARGS (t);
423 pp_cxx_cv_qualifier_seq (cxx_pp, t);
424 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
425 pp_cxx_begin_template_argument_list (cxx_pp);
426 dump_template_argument_list (args, flags);
427 pp_cxx_end_template_argument_list (cxx_pp);
431 case TEMPLATE_TYPE_PARM:
432 pp_cxx_cv_qualifier_seq (cxx_pp, t);
433 if (TYPE_IDENTIFIER (t))
434 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
436 pp_cxx_canonical_template_parameter
437 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
440 /* This is not always necessary for pointers and such, but doing this
441 reduces code size. */
450 dump_type_prefix (t, flags);
451 dump_type_suffix (t, flags);
455 if (! (flags & TFF_CHASE_TYPEDEF)
456 && DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
458 dump_decl (TYPE_NAME (t), TFF_PLAIN_IDENTIFIER);
461 pp_cxx_cv_qualifier_seq (cxx_pp, t);
462 pp_cxx_ws_string (cxx_pp,
463 TYPENAME_IS_ENUM_P (t) ? "enum"
464 : TYPENAME_IS_CLASS_P (t) ? "class"
466 dump_typename (t, flags);
469 case UNBOUND_CLASS_TEMPLATE:
470 if (! (flags & TFF_UNQUALIFIED_NAME))
472 dump_type (TYPE_CONTEXT (t), flags);
473 pp_cxx_colon_colon (cxx_pp);
475 pp_cxx_ws_string (cxx_pp, "template");
476 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
480 pp_cxx_ws_string (cxx_pp, "__typeof__");
481 pp_cxx_whitespace (cxx_pp);
482 pp_cxx_left_paren (cxx_pp);
483 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
484 pp_cxx_right_paren (cxx_pp);
487 case UNDERLYING_TYPE:
488 pp_cxx_ws_string (cxx_pp, "__underlying_type");
489 pp_cxx_whitespace (cxx_pp);
490 pp_cxx_left_paren (cxx_pp);
491 dump_expr (UNDERLYING_TYPE_TYPE (t), flags & ~TFF_EXPR_IN_PARENS);
492 pp_cxx_right_paren (cxx_pp);
495 case TYPE_PACK_EXPANSION:
496 dump_type (PACK_EXPANSION_PATTERN (t), flags);
497 pp_cxx_ws_string (cxx_pp, "...");
500 case TYPE_ARGUMENT_PACK:
501 dump_template_argument (t, flags);
505 pp_cxx_ws_string (cxx_pp, "decltype");
506 pp_cxx_whitespace (cxx_pp);
507 pp_cxx_left_paren (cxx_pp);
508 dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
509 pp_cxx_right_paren (cxx_pp);
513 pp_string (cxx_pp, "std::nullptr_t");
517 pp_unsupported_tree (cxx_pp, t);
518 /* Fall through to error. */
521 pp_string (cxx_pp, M_("<type error>"));
526 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
530 dump_typename (tree t, int flags)
532 tree ctx = TYPE_CONTEXT (t);
534 if (TREE_CODE (ctx) == TYPENAME_TYPE)
535 dump_typename (ctx, flags);
537 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
538 pp_cxx_colon_colon (cxx_pp);
539 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
542 /* Return the name of the supplied aggregate, or enumeral type. */
545 class_key_or_enum_as_string (tree t)
547 if (TREE_CODE (t) == ENUMERAL_TYPE)
549 if (SCOPED_ENUM_P (t))
554 else if (TREE_CODE (t) == UNION_TYPE)
556 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
562 /* Print out a class declaration T under the control of FLAGS,
563 in the form `class foo'. */
566 dump_aggr_type (tree t, int flags)
569 const char *variety = class_key_or_enum_as_string (t);
573 pp_cxx_cv_qualifier_seq (cxx_pp, t);
575 if (flags & TFF_CLASS_KEY_OR_ENUM)
576 pp_cxx_ws_string (cxx_pp, variety);
578 name = TYPE_NAME (t);
582 typdef = !DECL_ARTIFICIAL (name);
585 && ((flags & TFF_CHASE_TYPEDEF)
586 || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name)
587 && DECL_TEMPLATE_INFO (name))))
588 || DECL_SELF_REFERENCE_P (name))
590 t = TYPE_MAIN_VARIANT (t);
591 name = TYPE_NAME (t);
595 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
596 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
597 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
598 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
600 if (! (flags & TFF_UNQUALIFIED_NAME))
601 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
602 flags &= ~TFF_UNQUALIFIED_NAME;
605 /* Because the template names are mangled, we have to locate
606 the most general template, and use that name. */
607 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
609 while (DECL_TEMPLATE_INFO (tpl))
610 tpl = DECL_TI_TEMPLATE (tpl);
613 name = DECL_NAME (name);
616 if (name == 0 || ANON_AGGRNAME_P (name))
618 if (flags & TFF_CLASS_KEY_OR_ENUM)
619 pp_string (cxx_pp, M_("<anonymous>"));
621 pp_printf (pp_base (cxx_pp), M_("<anonymous %s>"), variety);
623 else if (LAMBDANAME_P (name))
625 /* A lambda's "type" is essentially its signature. */
626 pp_string (cxx_pp, M_("<lambda"));
627 if (lambda_function (t))
628 dump_parameters (FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t)),
630 pp_character(cxx_pp, '>');
633 pp_cxx_tree_identifier (cxx_pp, name);
635 dump_template_parms (TYPE_TEMPLATE_INFO (t),
636 !CLASSTYPE_USE_TEMPLATE (t),
637 flags & ~TFF_TEMPLATE_HEADER);
640 /* Dump into the obstack the initial part of the output for a given type.
641 This is necessary when dealing with things like functions returning
644 return type of `int (* fee ())()': pointer -> function -> int. Both
645 pointer (and reference and offset) and function (and member) types must
646 deal with prefix and suffix.
648 Arrays must also do this for DECL nodes, like int a[], and for things like
652 dump_type_prefix (tree t, int flags)
654 if (TYPE_PTRMEMFUNC_P (t))
656 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
660 switch (TREE_CODE (t))
665 tree sub = TREE_TYPE (t);
667 dump_type_prefix (sub, flags);
668 if (TREE_CODE (sub) == ARRAY_TYPE
669 || TREE_CODE (sub) == FUNCTION_TYPE)
671 pp_cxx_whitespace (cxx_pp);
672 pp_cxx_left_paren (cxx_pp);
673 pp_c_attributes_display (pp_c_base (cxx_pp),
674 TYPE_ATTRIBUTES (sub));
676 if (TREE_CODE (t) == POINTER_TYPE)
677 pp_character(cxx_pp, '*');
678 else if (TREE_CODE (t) == REFERENCE_TYPE)
680 if (TYPE_REF_IS_RVALUE (t))
681 pp_string (cxx_pp, "&&");
683 pp_character (cxx_pp, '&');
685 pp_base (cxx_pp)->padding = pp_before;
686 pp_cxx_cv_qualifier_seq (cxx_pp, t);
692 dump_type_prefix (TREE_TYPE (t), flags);
693 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
695 pp_maybe_space (cxx_pp);
696 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
697 pp_cxx_left_paren (cxx_pp);
698 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
699 pp_cxx_colon_colon (cxx_pp);
701 pp_cxx_star (cxx_pp);
702 pp_cxx_cv_qualifier_seq (cxx_pp, t);
703 pp_base (cxx_pp)->padding = pp_before;
706 /* This can be reached without a pointer when dealing with
707 templates, e.g. std::is_function. */
709 dump_type_prefix (TREE_TYPE (t), flags);
713 dump_type_prefix (TREE_TYPE (t), flags);
714 pp_maybe_space (cxx_pp);
715 pp_cxx_left_paren (cxx_pp);
716 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
717 pp_cxx_colon_colon (cxx_pp);
721 dump_type_prefix (TREE_TYPE (t), flags);
725 case IDENTIFIER_NODE:
730 case TEMPLATE_TYPE_PARM:
731 case TEMPLATE_TEMPLATE_PARM:
732 case BOUND_TEMPLATE_TEMPLATE_PARM:
743 case UNDERLYING_TYPE:
745 case TYPE_PACK_EXPANSION:
746 case FIXED_POINT_TYPE:
748 dump_type (t, flags);
749 pp_base (cxx_pp)->padding = pp_before;
753 pp_unsupported_tree (cxx_pp, t);
756 pp_string (cxx_pp, M_("<typeprefixerror>"));
761 /* Dump the suffix of type T, under control of FLAGS. This is the part
762 which appears after the identifier (or function parms). */
765 dump_type_suffix (tree t, int flags)
767 if (TYPE_PTRMEMFUNC_P (t))
768 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
770 switch (TREE_CODE (t))
775 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
776 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
777 pp_cxx_right_paren (cxx_pp);
778 dump_type_suffix (TREE_TYPE (t), flags);
785 if (TREE_CODE (t) == METHOD_TYPE)
786 /* Can only be reached through a pointer. */
787 pp_cxx_right_paren (cxx_pp);
788 arg = TYPE_ARG_TYPES (t);
789 if (TREE_CODE (t) == METHOD_TYPE)
790 arg = TREE_CHAIN (arg);
792 /* Function pointers don't have default args. Not in standard C++,
793 anyway; they may in g++, but we'll just pretend otherwise. */
794 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
796 if (TREE_CODE (t) == METHOD_TYPE)
797 pp_cxx_cv_qualifier_seq (cxx_pp, class_of_this_parm (t));
799 pp_cxx_cv_qualifier_seq (cxx_pp, t);
800 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
801 dump_type_suffix (TREE_TYPE (t), flags);
806 pp_maybe_space (cxx_pp);
807 pp_cxx_left_bracket (cxx_pp);
810 tree dtype = TYPE_DOMAIN (t);
811 tree max = TYPE_MAX_VALUE (dtype);
812 if (host_integerp (max, 0))
813 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
814 else if (TREE_CODE (max) == MINUS_EXPR)
815 dump_expr (TREE_OPERAND (max, 0),
816 flags & ~TFF_EXPR_IN_PARENS);
818 dump_expr (fold_build2_loc (input_location,
819 PLUS_EXPR, dtype, max,
820 build_int_cst (dtype, 1)),
821 flags & ~TFF_EXPR_IN_PARENS);
823 pp_cxx_right_bracket (cxx_pp);
824 dump_type_suffix (TREE_TYPE (t), flags);
828 case IDENTIFIER_NODE:
833 case TEMPLATE_TYPE_PARM:
834 case TEMPLATE_TEMPLATE_PARM:
835 case BOUND_TEMPLATE_TEMPLATE_PARM:
846 case UNDERLYING_TYPE:
848 case TYPE_PACK_EXPANSION:
849 case FIXED_POINT_TYPE:
854 pp_unsupported_tree (cxx_pp, t);
856 /* Don't mark it here, we should have already done in
863 dump_global_iord (tree t)
865 const char *p = NULL;
867 if (DECL_GLOBAL_CTOR_P (t))
868 p = M_("(static initializers for %s)");
869 else if (DECL_GLOBAL_DTOR_P (t))
870 p = M_("(static destructors for %s)");
874 pp_printf (pp_base (cxx_pp), p, input_filename);
878 dump_simple_decl (tree t, tree type, int flags)
880 if (flags & TFF_DECL_SPECIFIERS)
882 if (TREE_CODE (t) == VAR_DECL
883 && DECL_DECLARED_CONSTEXPR_P (t))
884 pp_cxx_ws_string (cxx_pp, "constexpr");
885 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
886 pp_maybe_space (cxx_pp);
888 if (! (flags & TFF_UNQUALIFIED_NAME)
889 && TREE_CODE (t) != PARM_DECL
890 && (!DECL_INITIAL (t)
891 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
892 dump_scope (CP_DECL_CONTEXT (t), flags);
893 flags &= ~TFF_UNQUALIFIED_NAME;
894 if ((flags & TFF_DECL_SPECIFIERS)
895 && DECL_TEMPLATE_PARM_P (t)
896 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
897 pp_string (cxx_pp, "...");
899 dump_decl (DECL_NAME (t), flags);
901 pp_string (cxx_pp, M_("<anonymous>"));
902 if (flags & TFF_DECL_SPECIFIERS)
903 dump_type_suffix (type, flags);
906 /* Dump a human readable string for the decl T under control of FLAGS. */
909 dump_decl (tree t, int flags)
914 /* If doing Objective-C++, give Objective-C a chance to demangle
915 Objective-C method names. */
916 if (c_dialect_objc ())
918 const char *demangled = objc_maybe_printable_name (t, flags);
921 pp_string (cxx_pp, demangled);
926 switch (TREE_CODE (t))
929 /* Don't say 'typedef class A' */
930 if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t))
932 if ((flags & TFF_DECL_SPECIFIERS)
933 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
935 /* Say `class T' not just `T'. */
936 pp_cxx_ws_string (cxx_pp, "class");
938 /* Emit the `...' for a parameter pack. */
939 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
940 pp_cxx_ws_string (cxx_pp, "...");
943 dump_type (TREE_TYPE (t), flags);
946 if ((flags & TFF_DECL_SPECIFIERS)
947 && !DECL_SELF_REFERENCE_P (t))
948 pp_cxx_ws_string (cxx_pp, "typedef");
949 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
950 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
955 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
957 pp_string (cxx_pp, M_("vtable for "));
958 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
959 dump_type (DECL_CONTEXT (t), flags);
962 /* Else fall through. */
965 dump_simple_decl (t, TREE_TYPE (t), flags);
969 pp_string (cxx_pp, M_("<return value> "));
970 dump_simple_decl (t, TREE_TYPE (t), flags);
974 if (flags & TFF_DECL_SPECIFIERS)
975 pp_cxx_declaration (cxx_pp, t);
978 if (! (flags & TFF_UNQUALIFIED_NAME))
979 dump_scope (CP_DECL_CONTEXT (t), flags);
980 flags &= ~TFF_UNQUALIFIED_NAME;
981 if (DECL_NAME (t) == NULL_TREE)
982 pp_cxx_ws_string (cxx_pp, M_("{anonymous}"));
984 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
989 dump_type (TREE_OPERAND (t, 0), flags);
990 pp_string (cxx_pp, "::");
991 dump_decl (TREE_OPERAND (t, 1), flags|TFF_UNQUALIFIED_NAME);
995 dump_decl (TREE_OPERAND (t, 0), flags);
996 pp_cxx_left_bracket (cxx_pp);
997 dump_decl (TREE_OPERAND (t, 1), flags);
998 pp_cxx_right_bracket (cxx_pp);
1001 /* So that we can do dump_decl on an aggr type. */
1005 dump_type (t, flags);
1009 /* This is a pseudo destructor call which has not been folded into
1010 a PSEUDO_DTOR_EXPR yet. */
1011 pp_cxx_complement (cxx_pp);
1012 dump_type (TREE_OPERAND (t, 0), flags);
1019 /* These special cases are duplicated here so that other functions
1020 can feed identifiers to error and get them demangled properly. */
1021 case IDENTIFIER_NODE:
1022 if (IDENTIFIER_TYPENAME_P (t))
1024 pp_cxx_ws_string (cxx_pp, "operator");
1025 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1026 dump_type (TREE_TYPE (t), flags);
1030 pp_cxx_tree_identifier (cxx_pp, t);
1036 t = OVL_CURRENT (t);
1037 if (DECL_CLASS_SCOPE_P (t))
1039 dump_type (DECL_CONTEXT (t), flags);
1040 pp_cxx_colon_colon (cxx_pp);
1042 else if (!DECL_FILE_SCOPE_P (t))
1044 dump_decl (DECL_CONTEXT (t), flags);
1045 pp_cxx_colon_colon (cxx_pp);
1047 dump_decl (DECL_NAME (t), flags);
1051 /* If there's only one function, just treat it like an ordinary
1053 t = OVL_CURRENT (t);
1057 if (! DECL_LANG_SPECIFIC (t))
1058 pp_string (cxx_pp, M_("<built-in>"));
1059 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
1060 dump_global_iord (t);
1062 dump_function_decl (t, flags);
1066 dump_template_decl (t, flags);
1069 case TEMPLATE_ID_EXPR:
1071 tree name = TREE_OPERAND (t, 0);
1073 if (is_overloaded_fn (name))
1074 name = DECL_NAME (get_first_fn (name));
1075 dump_decl (name, flags);
1076 pp_cxx_begin_template_argument_list (cxx_pp);
1077 if (TREE_OPERAND (t, 1))
1078 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
1079 pp_cxx_end_template_argument_list (cxx_pp);
1084 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
1088 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
1089 || (DECL_INITIAL (t) &&
1090 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
1091 dump_simple_decl (t, TREE_TYPE (t), flags);
1092 else if (DECL_NAME (t))
1093 dump_decl (DECL_NAME (t), flags);
1094 else if (DECL_INITIAL (t))
1095 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
1097 pp_string (cxx_pp, M_("<enumerator>"));
1101 pp_cxx_ws_string (cxx_pp, "using");
1102 dump_type (USING_DECL_SCOPE (t), flags);
1103 pp_cxx_colon_colon (cxx_pp);
1104 dump_decl (DECL_NAME (t), flags);
1108 pp_cxx_declaration (cxx_pp, t);
1112 dump_decl (BASELINK_FUNCTIONS (t), flags);
1115 case NON_DEPENDENT_EXPR:
1116 dump_expr (t, flags);
1119 case TEMPLATE_TYPE_PARM:
1120 if (flags & TFF_DECL_SPECIFIERS)
1121 pp_cxx_declaration (cxx_pp, t);
1123 pp_type_id (cxx_pp, t);
1126 case UNBOUND_CLASS_TEMPLATE:
1127 case TYPE_PACK_EXPANSION:
1129 dump_type (t, flags);
1133 pp_unsupported_tree (cxx_pp, t);
1134 /* Fall through to error. */
1137 pp_string (cxx_pp, M_("<declaration error>"));
1142 /* Dump a template declaration T under control of FLAGS. This means the
1143 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1146 dump_template_decl (tree t, int flags)
1148 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1152 if (flags & TFF_TEMPLATE_HEADER)
1154 for (parms = orig_parms = nreverse (orig_parms);
1156 parms = TREE_CHAIN (parms))
1158 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1159 int len = TREE_VEC_LENGTH (inner_parms);
1161 pp_cxx_ws_string (cxx_pp, "template");
1162 pp_cxx_begin_template_argument_list (cxx_pp);
1164 /* If we've shown the template prefix, we'd better show the
1165 parameters' and decl's type too. */
1166 flags |= TFF_DECL_SPECIFIERS;
1168 for (i = 0; i < len; i++)
1171 pp_separate_with_comma (cxx_pp);
1172 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1174 pp_cxx_end_template_argument_list (cxx_pp);
1175 pp_cxx_whitespace (cxx_pp);
1177 nreverse(orig_parms);
1179 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1181 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1182 pp_cxx_ws_string (cxx_pp, "class");
1184 /* If this is a parameter pack, print the ellipsis. */
1185 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1186 pp_cxx_ws_string (cxx_pp, "...");
1190 if (DECL_TEMPLATE_RESULT (t)
1191 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1192 dump_type (TREE_TYPE (t),
1193 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1194 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1195 else if (DECL_TEMPLATE_RESULT (t)
1196 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1197 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1200 gcc_assert (TREE_TYPE (t));
1201 switch (NEXT_CODE (t))
1205 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1208 /* This case can occur with some invalid code. */
1209 dump_type (TREE_TYPE (t),
1210 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1211 | (flags & TFF_DECL_SPECIFIERS
1212 ? TFF_CLASS_KEY_OR_ENUM : 0));
1217 /* find_typenames looks through the type of the function template T
1218 and returns a VEC containing any typedefs, decltypes or TYPENAME_TYPEs
1221 struct find_typenames_t
1223 struct pointer_set_t *p_set;
1224 VEC (tree,gc) *typenames;
1228 find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
1230 struct find_typenames_t *d = (struct find_typenames_t *)data;
1231 tree mv = NULL_TREE;
1233 if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp)))
1234 /* Add the type of the typedef without any additional cv-quals. */
1235 mv = TREE_TYPE (TYPE_NAME (*tp));
1236 else if (TREE_CODE (*tp) == TYPENAME_TYPE
1237 || TREE_CODE (*tp) == DECLTYPE_TYPE)
1238 /* Add the typename without any cv-qualifiers. */
1239 mv = TYPE_MAIN_VARIANT (*tp);
1241 if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv)))
1242 VEC_safe_push (tree, gc, d->typenames, mv);
1244 /* Search into class template arguments, which cp_walk_subtrees
1246 if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp))
1247 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r,
1253 static VEC(tree,gc) *
1254 find_typenames (tree t)
1256 struct find_typenames_t ft;
1257 ft.p_set = pointer_set_create ();
1258 ft.typenames = NULL;
1259 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
1260 find_typenames_r, &ft, ft.p_set);
1261 pointer_set_destroy (ft.p_set);
1262 return ft.typenames;
1265 /* Pretty print a function decl. There are several ways we want to print a
1266 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1267 As error can only apply the '#' flag once to give 0 and 1 for V, there
1268 is %D which doesn't print the throw specs, and %F which does. */
1271 dump_function_decl (tree t, int flags)
1275 tree cname = NULL_TREE;
1276 tree template_args = NULL_TREE;
1277 tree template_parms = NULL_TREE;
1278 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1279 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1281 VEC(tree,gc) *typenames = NULL;
1283 if (DECL_NAME (t) && LAMBDA_FUNCTION_P (t))
1285 /* A lambda's signature is essentially its "type", so defer. */
1286 gcc_assert (LAMBDA_TYPE_P (DECL_CONTEXT (t)));
1287 dump_type (DECL_CONTEXT (t), flags);
1291 flags &= ~TFF_UNQUALIFIED_NAME;
1292 if (TREE_CODE (t) == TEMPLATE_DECL)
1293 t = DECL_TEMPLATE_RESULT (t);
1295 /* Save the exceptions, in case t is a specialization and we are
1296 emitting an error about incompatible specifications. */
1297 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1299 /* Pretty print template instantiations only. */
1300 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
1301 && flag_pretty_templates)
1305 template_args = DECL_TI_ARGS (t);
1306 tmpl = most_general_template (t);
1307 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1309 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1311 typenames = find_typenames (t);
1315 fntype = TREE_TYPE (t);
1316 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1318 if (DECL_CLASS_SCOPE_P (t))
1319 cname = DECL_CONTEXT (t);
1320 /* This is for partially instantiated template methods. */
1321 else if (TREE_CODE (fntype) == METHOD_TYPE)
1322 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1324 if (flags & TFF_DECL_SPECIFIERS)
1326 if (DECL_STATIC_FUNCTION_P (t))
1327 pp_cxx_ws_string (cxx_pp, "static");
1328 else if (DECL_VIRTUAL_P (t))
1329 pp_cxx_ws_string (cxx_pp, "virtual");
1331 if (DECL_DECLARED_CONSTEXPR_P (STRIP_TEMPLATE (t)))
1332 pp_cxx_ws_string (cxx_pp, "constexpr");
1335 /* Print the return type? */
1337 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1338 && !DECL_DESTRUCTOR_P (t);
1340 dump_type_prefix (TREE_TYPE (fntype), flags);
1342 /* Print the function name. */
1343 if (!do_outer_scope)
1347 dump_type (cname, flags);
1348 pp_cxx_colon_colon (cxx_pp);
1351 dump_scope (CP_DECL_CONTEXT (t), flags);
1353 dump_function_name (t, flags);
1355 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1357 dump_parameters (parmtypes, flags);
1359 if (TREE_CODE (fntype) == METHOD_TYPE)
1361 pp_base (cxx_pp)->padding = pp_before;
1362 pp_cxx_cv_qualifier_seq (cxx_pp, class_of_this_parm (fntype));
1365 if (flags & TFF_EXCEPTION_SPECIFICATION)
1367 pp_base (cxx_pp)->padding = pp_before;
1368 dump_exception_spec (exceptions, flags);
1372 dump_type_suffix (TREE_TYPE (fntype), flags);
1375 /* If T is a template instantiation, dump the parameter binding. */
1376 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1378 pp_cxx_whitespace (cxx_pp);
1379 pp_cxx_left_bracket (cxx_pp);
1380 pp_cxx_ws_string (cxx_pp, M_("with"));
1381 pp_cxx_whitespace (cxx_pp);
1382 dump_template_bindings (template_parms, template_args, typenames);
1383 pp_cxx_right_bracket (cxx_pp);
1387 /* Print a parameter list. If this is for a member function, the
1388 member object ptr (and any other hidden args) should have
1389 already been removed. */
1392 dump_parameters (tree parmtypes, int flags)
1395 flags &= ~TFF_SCOPE;
1396 pp_cxx_left_paren (cxx_pp);
1398 for (first = 1; parmtypes != void_list_node;
1399 parmtypes = TREE_CHAIN (parmtypes))
1402 pp_separate_with_comma (cxx_pp);
1406 pp_cxx_ws_string (cxx_pp, "...");
1410 dump_type (TREE_VALUE (parmtypes), flags);
1412 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1414 pp_cxx_whitespace (cxx_pp);
1416 pp_cxx_whitespace (cxx_pp);
1417 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1421 pp_cxx_right_paren (cxx_pp);
1424 /* Print an exception specification. T is the exception specification. */
1427 dump_exception_spec (tree t, int flags)
1429 if (t && TREE_PURPOSE (t))
1431 pp_cxx_ws_string (cxx_pp, "noexcept");
1432 pp_cxx_whitespace (cxx_pp);
1433 pp_cxx_left_paren (cxx_pp);
1434 dump_expr (TREE_PURPOSE (t), flags);
1435 pp_cxx_right_paren (cxx_pp);
1439 pp_cxx_ws_string (cxx_pp, "throw");
1440 pp_cxx_whitespace (cxx_pp);
1441 pp_cxx_left_paren (cxx_pp);
1442 if (TREE_VALUE (t) != NULL_TREE)
1445 dump_type (TREE_VALUE (t), flags);
1449 pp_separate_with_comma (cxx_pp);
1451 pp_cxx_right_paren (cxx_pp);
1455 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1456 and destructors properly. */
1459 dump_function_name (tree t, int flags)
1461 tree name = DECL_NAME (t);
1463 /* We can get here with a decl that was synthesized by language-
1464 independent machinery (e.g. coverage.c) in which case it won't
1465 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1466 will crash. In this case it is safe just to print out the
1468 if (!DECL_LANG_SPECIFIC (t))
1470 pp_cxx_tree_identifier (cxx_pp, name);
1474 if (TREE_CODE (t) == TEMPLATE_DECL)
1475 t = DECL_TEMPLATE_RESULT (t);
1477 /* Don't let the user see __comp_ctor et al. */
1478 if (DECL_CONSTRUCTOR_P (t)
1479 || DECL_DESTRUCTOR_P (t))
1481 if (LAMBDA_TYPE_P (DECL_CONTEXT (t)))
1482 name = get_identifier ("<lambda>");
1484 name = constructor_name (DECL_CONTEXT (t));
1487 if (DECL_DESTRUCTOR_P (t))
1489 pp_cxx_complement (cxx_pp);
1490 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1492 else if (DECL_CONV_FN_P (t))
1494 /* This cannot use the hack that the operator's return
1495 type is stashed off of its name because it may be
1496 used for error reporting. In the case of conflicting
1497 declarations, both will have the same name, yet
1498 the types will be different, hence the TREE_TYPE field
1499 of the first name will be clobbered by the second. */
1500 pp_cxx_ws_string (cxx_pp, "operator");
1501 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1503 else if (name && IDENTIFIER_OPNAME_P (name))
1504 pp_cxx_tree_identifier (cxx_pp, name);
1506 dump_decl (name, flags);
1508 if (DECL_TEMPLATE_INFO (t)
1509 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1510 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1511 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1512 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1515 /* Dump the template parameters from the template info INFO under control of
1516 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1517 specialization (partial or complete). For partial specializations we show
1518 the specialized parameter values. For a primary template we show no
1522 dump_template_parms (tree info, int primary, int flags)
1524 tree args = info ? TI_ARGS (info) : NULL_TREE;
1526 if (primary && flags & TFF_TEMPLATE_NAME)
1528 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1529 pp_cxx_begin_template_argument_list (cxx_pp);
1531 /* Be careful only to print things when we have them, so as not
1532 to crash producing error messages. */
1533 if (args && !primary)
1536 len = get_non_default_template_args_count (args, flags);
1538 args = INNERMOST_TEMPLATE_ARGS (args);
1539 for (ix = 0; ix != len; ix++)
1541 tree arg = TREE_VEC_ELT (args, ix);
1543 /* Only print a comma if we know there is an argument coming. In
1544 the case of an empty template argument pack, no actual
1545 argument will be printed. */
1547 && (!ARGUMENT_PACK_P (arg)
1548 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1549 pp_separate_with_comma (cxx_pp);
1552 pp_string (cxx_pp, M_("<template parameter error>"));
1554 dump_template_argument (arg, flags);
1559 tree tpl = TI_TEMPLATE (info);
1560 tree parms = DECL_TEMPLATE_PARMS (tpl);
1563 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1564 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1566 for (ix = 0; ix != len; ix++)
1570 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1572 pp_string (cxx_pp, M_("<template parameter error>"));
1576 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1579 pp_separate_with_comma (cxx_pp);
1581 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1584 pp_cxx_end_template_argument_list (cxx_pp);
1587 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1588 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1591 dump_call_expr_args (tree t, int flags, bool skipfirst)
1594 call_expr_arg_iterator iter;
1596 pp_cxx_left_paren (cxx_pp);
1597 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1603 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1604 if (more_call_expr_args_p (&iter))
1605 pp_separate_with_comma (cxx_pp);
1608 pp_cxx_right_paren (cxx_pp);
1611 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1612 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1616 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1619 aggr_init_expr_arg_iterator iter;
1621 pp_cxx_left_paren (cxx_pp);
1622 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1628 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1629 if (more_aggr_init_expr_args_p (&iter))
1630 pp_separate_with_comma (cxx_pp);
1633 pp_cxx_right_paren (cxx_pp);
1636 /* Print out a list of initializers (subr of dump_expr). */
1639 dump_expr_list (tree l, int flags)
1643 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1646 pp_separate_with_comma (cxx_pp);
1650 /* Print out a vector of initializers (subr of dump_expr). */
1653 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1655 unsigned HOST_WIDE_INT idx;
1658 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1660 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1661 if (idx != VEC_length (constructor_elt, v) - 1)
1662 pp_separate_with_comma (cxx_pp);
1667 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1668 function. Resolve it to a close relative -- in the sense of static
1669 type -- variant being overridden. That is close to what was written in
1670 the source code. Subroutine of dump_expr. */
1673 resolve_virtual_fun_from_obj_type_ref (tree ref)
1675 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1676 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1677 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1680 fun = TREE_CHAIN (fun);
1681 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1682 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1688 /* Print out an expression E under control of FLAGS. */
1691 dump_expr (tree t, int flags)
1696 if (STATEMENT_CLASS_P (t))
1698 pp_cxx_ws_string (cxx_pp, M_("<statement>"));
1702 switch (TREE_CODE (t))
1710 case NAMESPACE_DECL:
1714 case IDENTIFIER_NODE:
1715 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1722 pp_constant (cxx_pp, t);
1726 /* While waiting for caret diagnostics, avoid printing
1727 __cxa_allocate_exception, __cxa_throw, and the like. */
1728 pp_cxx_ws_string (cxx_pp, M_("<throw-expression>"));
1732 pp_ampersand (cxx_pp);
1733 dump_type (PTRMEM_CST_CLASS (t), flags);
1734 pp_cxx_colon_colon (cxx_pp);
1735 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1739 pp_cxx_left_paren (cxx_pp);
1740 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1741 pp_separate_with_comma (cxx_pp);
1742 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1743 pp_cxx_right_paren (cxx_pp);
1747 pp_cxx_left_paren (cxx_pp);
1748 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1749 pp_string (cxx_pp, " ? ");
1750 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1751 pp_string (cxx_pp, " : ");
1752 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1753 pp_cxx_right_paren (cxx_pp);
1757 if (TREE_HAS_CONSTRUCTOR (t))
1759 pp_cxx_ws_string (cxx_pp, "new");
1760 pp_cxx_whitespace (cxx_pp);
1761 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1764 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1767 case AGGR_INIT_EXPR:
1769 tree fn = NULL_TREE;
1771 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1772 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1774 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1776 if (DECL_CONSTRUCTOR_P (fn))
1777 dump_type (DECL_CONTEXT (fn), flags);
1782 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1784 dump_aggr_init_expr_args (t, flags, true);
1789 tree fn = CALL_EXPR_FN (t);
1790 bool skipfirst = false;
1792 if (TREE_CODE (fn) == ADDR_EXPR)
1793 fn = TREE_OPERAND (fn, 0);
1795 /* Nobody is interested in seeing the guts of vcalls. */
1796 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1797 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1799 if (TREE_TYPE (fn) != NULL_TREE
1800 && NEXT_CODE (fn) == METHOD_TYPE
1801 && call_expr_nargs (t))
1803 tree ob = CALL_EXPR_ARG (t, 0);
1804 if (TREE_CODE (ob) == ADDR_EXPR)
1806 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1807 pp_cxx_dot (cxx_pp);
1809 else if (TREE_CODE (ob) != PARM_DECL
1810 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1812 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1813 pp_cxx_arrow (cxx_pp);
1817 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1818 dump_call_expr_args (t, flags, skipfirst);
1823 /* Note that this only works for G++ target exprs. If somebody
1824 builds a general TARGET_EXPR, there's no way to represent that
1825 it initializes anything other that the parameter slot for the
1826 default argument. Note we may have cleared out the first
1827 operand in expand_expr, so don't go killing ourselves. */
1828 if (TREE_OPERAND (t, 1))
1829 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1832 case POINTER_PLUS_EXPR:
1833 dump_binary_op ("+", t, flags);
1841 case TRUNC_DIV_EXPR:
1842 case TRUNC_MOD_EXPR:
1850 case TRUTH_ANDIF_EXPR:
1851 case TRUTH_ORIF_EXPR:
1858 case EXACT_DIV_EXPR:
1859 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1863 case FLOOR_DIV_EXPR:
1864 case ROUND_DIV_EXPR:
1866 dump_binary_op ("/", t, flags);
1870 case FLOOR_MOD_EXPR:
1871 case ROUND_MOD_EXPR:
1872 dump_binary_op ("%", t, flags);
1877 tree ob = TREE_OPERAND (t, 0);
1878 if (TREE_CODE (ob) == INDIRECT_REF)
1880 ob = TREE_OPERAND (ob, 0);
1881 if (TREE_CODE (ob) != PARM_DECL
1883 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1885 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1886 pp_cxx_arrow (cxx_pp);
1891 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1892 pp_cxx_dot (cxx_pp);
1894 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1899 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1900 pp_cxx_left_bracket (cxx_pp);
1901 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1902 pp_cxx_right_bracket (cxx_pp);
1905 case UNARY_PLUS_EXPR:
1906 dump_unary_op ("+", t, flags);
1910 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1911 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1912 /* An ADDR_EXPR can have reference type. In that case, we
1913 shouldn't print the `&' doing so indicates to the user
1914 that the expression has pointer type. */
1916 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1917 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1918 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1919 dump_unary_op ("&&", t, flags);
1921 dump_unary_op ("&", t, flags);
1925 if (TREE_HAS_CONSTRUCTOR (t))
1927 t = TREE_OPERAND (t, 0);
1928 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1929 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1930 dump_call_expr_args (t, flags, true);
1934 if (TREE_OPERAND (t,0) != NULL_TREE
1935 && TREE_TYPE (TREE_OPERAND (t, 0))
1936 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1937 dump_expr (TREE_OPERAND (t, 0), flags);
1939 dump_unary_op ("*", t, flags);
1944 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR
1945 && integer_zerop (TREE_OPERAND (t, 1)))
1946 dump_expr (TREE_OPERAND (TREE_OPERAND (t, 0), 0), flags);
1949 pp_cxx_star (cxx_pp);
1950 if (!integer_zerop (TREE_OPERAND (t, 1)))
1952 pp_cxx_left_paren (cxx_pp);
1953 if (!integer_onep (TYPE_SIZE_UNIT
1954 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))))))
1956 pp_cxx_left_paren (cxx_pp);
1957 dump_type (ptr_type_node, flags);
1958 pp_cxx_right_paren (cxx_pp);
1961 dump_expr (TREE_OPERAND (t, 0), flags);
1962 if (!integer_zerop (TREE_OPERAND (t, 1)))
1964 pp_cxx_ws_string (cxx_pp, "+");
1965 dump_expr (fold_convert (ssizetype, TREE_OPERAND (t, 1)), flags);
1966 pp_cxx_right_paren (cxx_pp);
1973 case TRUTH_NOT_EXPR:
1974 case PREDECREMENT_EXPR:
1975 case PREINCREMENT_EXPR:
1976 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1979 case POSTDECREMENT_EXPR:
1980 case POSTINCREMENT_EXPR:
1981 pp_cxx_left_paren (cxx_pp);
1982 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1983 pp_cxx_ws_string (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1984 pp_cxx_right_paren (cxx_pp);
1987 case NON_LVALUE_EXPR:
1988 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1989 should be another level of INDIRECT_REF so that I don't have to do
1991 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1993 tree next = TREE_TYPE (TREE_TYPE (t));
1995 while (TREE_CODE (next) == POINTER_TYPE)
1996 next = TREE_TYPE (next);
1998 if (TREE_CODE (next) == FUNCTION_TYPE)
2000 if (flags & TFF_EXPR_IN_PARENS)
2001 pp_cxx_left_paren (cxx_pp);
2002 pp_cxx_star (cxx_pp);
2003 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2004 if (flags & TFF_EXPR_IN_PARENS)
2005 pp_cxx_right_paren (cxx_pp);
2008 /* Else fall through. */
2010 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2014 case VIEW_CONVERT_EXPR:
2016 tree op = TREE_OPERAND (t, 0);
2017 tree ttype = TREE_TYPE (t);
2018 tree optype = TREE_TYPE (op);
2020 if (TREE_CODE (ttype) != TREE_CODE (optype)
2021 && POINTER_TYPE_P (ttype)
2022 && POINTER_TYPE_P (optype)
2023 && same_type_p (TREE_TYPE (optype),
2026 if (TREE_CODE (ttype) == REFERENCE_TYPE)
2027 dump_unary_op ("*", t, flags);
2029 dump_unary_op ("&", t, flags);
2031 else if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
2033 /* It is a cast, but we cannot tell whether it is a
2034 reinterpret or static cast. Use the C style notation. */
2035 if (flags & TFF_EXPR_IN_PARENS)
2036 pp_cxx_left_paren (cxx_pp);
2037 pp_cxx_left_paren (cxx_pp);
2038 dump_type (TREE_TYPE (t), flags);
2039 pp_cxx_right_paren (cxx_pp);
2040 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
2041 if (flags & TFF_EXPR_IN_PARENS)
2042 pp_cxx_right_paren (cxx_pp);
2045 dump_expr (op, flags);
2050 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
2052 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
2054 if (integer_zerop (idx))
2056 /* A NULL pointer-to-member constant. */
2057 pp_cxx_left_paren (cxx_pp);
2058 pp_cxx_left_paren (cxx_pp);
2059 dump_type (TREE_TYPE (t), flags);
2060 pp_cxx_right_paren (cxx_pp);
2061 pp_character (cxx_pp, '0');
2062 pp_cxx_right_paren (cxx_pp);
2065 else if (host_integerp (idx, 0))
2068 unsigned HOST_WIDE_INT n;
2070 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
2071 t = TYPE_METHOD_BASETYPE (t);
2072 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
2074 n = tree_low_cst (idx, 0);
2076 /* Map vtable index back one, to allow for the null pointer to
2080 while (n > 0 && virtuals)
2083 virtuals = TREE_CHAIN (virtuals);
2087 dump_expr (BV_FN (virtuals),
2088 flags | TFF_EXPR_IN_PARENS);
2093 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
2095 dump_type (TREE_TYPE (t), 0);
2096 pp_cxx_left_paren (cxx_pp);
2097 pp_cxx_right_paren (cxx_pp);
2101 pp_cxx_left_brace (cxx_pp);
2102 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
2103 pp_cxx_right_brace (cxx_pp);
2110 tree ob = TREE_OPERAND (t, 0);
2111 if (is_dummy_object (ob))
2113 t = TREE_OPERAND (t, 1);
2114 if (TREE_CODE (t) == FUNCTION_DECL)
2116 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
2117 else if (BASELINK_P (t))
2118 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
2119 flags | TFF_EXPR_IN_PARENS);
2121 dump_decl (t, flags);
2125 if (TREE_CODE (ob) == INDIRECT_REF)
2127 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
2128 pp_cxx_arrow (cxx_pp);
2129 pp_cxx_star (cxx_pp);
2133 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
2134 pp_cxx_dot (cxx_pp);
2135 pp_cxx_star (cxx_pp);
2137 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2142 case TEMPLATE_PARM_INDEX:
2143 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
2147 if (TREE_OPERAND (t, 0) == NULL_TREE
2148 || TREE_CHAIN (TREE_OPERAND (t, 0)))
2150 dump_type (TREE_TYPE (t), flags);
2151 pp_cxx_left_paren (cxx_pp);
2152 dump_expr_list (TREE_OPERAND (t, 0), flags);
2153 pp_cxx_right_paren (cxx_pp);
2157 pp_cxx_left_paren (cxx_pp);
2158 dump_type (TREE_TYPE (t), flags);
2159 pp_cxx_right_paren (cxx_pp);
2160 pp_cxx_left_paren (cxx_pp);
2161 dump_expr_list (TREE_OPERAND (t, 0), flags);
2162 pp_cxx_right_paren (cxx_pp);
2166 case STATIC_CAST_EXPR:
2167 pp_cxx_ws_string (cxx_pp, "static_cast");
2169 case REINTERPRET_CAST_EXPR:
2170 pp_cxx_ws_string (cxx_pp, "reinterpret_cast");
2172 case CONST_CAST_EXPR:
2173 pp_cxx_ws_string (cxx_pp, "const_cast");
2175 case DYNAMIC_CAST_EXPR:
2176 pp_cxx_ws_string (cxx_pp, "dynamic_cast");
2178 pp_cxx_begin_template_argument_list (cxx_pp);
2179 dump_type (TREE_TYPE (t), flags);
2180 pp_cxx_end_template_argument_list (cxx_pp);
2181 pp_cxx_left_paren (cxx_pp);
2182 dump_expr (TREE_OPERAND (t, 0), flags);
2183 pp_cxx_right_paren (cxx_pp);
2187 dump_expr (TREE_OPERAND (t, 0), flags);
2188 pp_cxx_arrow (cxx_pp);
2193 if (TREE_CODE (t) == SIZEOF_EXPR)
2194 pp_cxx_ws_string (cxx_pp, "sizeof");
2197 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
2198 pp_cxx_ws_string (cxx_pp, "__alignof__");
2200 pp_cxx_whitespace (cxx_pp);
2201 pp_cxx_left_paren (cxx_pp);
2202 if (TYPE_P (TREE_OPERAND (t, 0)))
2203 dump_type (TREE_OPERAND (t, 0), flags);
2205 dump_expr (TREE_OPERAND (t, 0), flags);
2206 pp_cxx_right_paren (cxx_pp);
2209 case AT_ENCODE_EXPR:
2210 pp_cxx_ws_string (cxx_pp, "@encode");
2211 pp_cxx_whitespace (cxx_pp);
2212 pp_cxx_left_paren (cxx_pp);
2213 dump_type (TREE_OPERAND (t, 0), flags);
2214 pp_cxx_right_paren (cxx_pp);
2218 pp_cxx_ws_string (cxx_pp, "noexcept");
2219 pp_cxx_whitespace (cxx_pp);
2220 pp_cxx_left_paren (cxx_pp);
2221 dump_expr (TREE_OPERAND (t, 0), flags);
2222 pp_cxx_right_paren (cxx_pp);
2227 pp_cxx_ws_string (cxx_pp, operator_name_info[TREE_CODE (t)].name);
2228 pp_cxx_whitespace (cxx_pp);
2229 dump_expr (TREE_OPERAND (t, 0), flags);
2233 pp_string (cxx_pp, M_("<unparsed>"));
2236 case TRY_CATCH_EXPR:
2237 case WITH_CLEANUP_EXPR:
2238 case CLEANUP_POINT_EXPR:
2239 dump_expr (TREE_OPERAND (t, 0), flags);
2242 case PSEUDO_DTOR_EXPR:
2243 dump_expr (TREE_OPERAND (t, 2), flags);
2244 pp_cxx_dot (cxx_pp);
2245 dump_type (TREE_OPERAND (t, 0), flags);
2246 pp_cxx_colon_colon (cxx_pp);
2247 pp_cxx_complement (cxx_pp);
2248 dump_type (TREE_OPERAND (t, 1), flags);
2251 case TEMPLATE_ID_EXPR:
2252 dump_decl (t, flags);
2258 case STATEMENT_LIST:
2259 /* We don't yet have a way of dumping statements in a
2260 human-readable format. */
2261 pp_string (cxx_pp, "({...})");
2265 pp_string (cxx_pp, "while (1) { ");
2266 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2267 pp_cxx_right_brace (cxx_pp);
2271 pp_string (cxx_pp, "if (");
2272 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2273 pp_string (cxx_pp, ") break; ");
2277 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2280 case EMPTY_CLASS_EXPR:
2281 dump_type (TREE_TYPE (t), flags);
2282 pp_cxx_left_paren (cxx_pp);
2283 pp_cxx_right_paren (cxx_pp);
2286 case NON_DEPENDENT_EXPR:
2287 dump_expr (TREE_OPERAND (t, 0), flags);
2290 case ARGUMENT_PACK_SELECT:
2291 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2303 pp_type_specifier_seq (cxx_pp, t);
2307 /* We get here when we want to print a dependent type as an
2308 id-expression, without any disambiguator decoration. */
2309 pp_id_expression (cxx_pp, t);
2312 case TEMPLATE_TYPE_PARM:
2313 case BOUND_TEMPLATE_TEMPLATE_PARM:
2314 dump_type (t, flags);
2318 pp_cxx_trait_expression (cxx_pp, t);
2322 pp_cxx_va_arg_expression (cxx_pp, t);
2326 pp_cxx_offsetof_expression (cxx_pp, t);
2330 dump_decl (t, flags);
2333 case EXPR_PACK_EXPANSION:
2340 case VEC_DELETE_EXPR:
2346 case UNORDERED_EXPR:
2356 case FIX_TRUNC_EXPR:
2358 pp_expression (cxx_pp, t);
2361 case TRUTH_AND_EXPR:
2363 case TRUTH_XOR_EXPR:
2364 if (flags & TFF_EXPR_IN_PARENS)
2365 pp_cxx_left_paren (cxx_pp);
2366 pp_expression (cxx_pp, t);
2367 if (flags & TFF_EXPR_IN_PARENS)
2368 pp_cxx_right_paren (cxx_pp);
2372 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2375 /* This list is incomplete, but should suffice for now.
2376 It is very important that `sorry' does not call
2377 `report_error_function'. That could cause an infinite loop. */
2379 pp_unsupported_tree (cxx_pp, t);
2380 /* fall through to ERROR_MARK... */
2382 pp_string (cxx_pp, M_("<expression error>"));
2388 dump_binary_op (const char *opstring, tree t, int flags)
2390 pp_cxx_left_paren (cxx_pp);
2391 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2392 pp_cxx_whitespace (cxx_pp);
2394 pp_cxx_ws_string (cxx_pp, opstring);
2396 pp_string (cxx_pp, M_("<unknown operator>"));
2397 pp_cxx_whitespace (cxx_pp);
2398 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2399 pp_cxx_right_paren (cxx_pp);
2403 dump_unary_op (const char *opstring, tree t, int flags)
2405 if (flags & TFF_EXPR_IN_PARENS)
2406 pp_cxx_left_paren (cxx_pp);
2407 pp_cxx_ws_string (cxx_pp, opstring);
2408 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2409 if (flags & TFF_EXPR_IN_PARENS)
2410 pp_cxx_right_paren (cxx_pp);
2414 reinit_cxx_pp (void)
2416 pp_clear_output_area (cxx_pp);
2417 pp_base (cxx_pp)->padding = pp_none;
2418 pp_indentation (cxx_pp) = 0;
2419 pp_needs_newline (cxx_pp) = false;
2420 cxx_pp->enclosing_scope = current_function_decl;
2424 /* Exported interface to stringifying types, exprs and decls under TFF_*
2428 type_as_string (tree typ, int flags)
2431 pp_translate_identifiers (cxx_pp) = false;
2432 dump_type (typ, flags);
2433 return pp_formatted_text (cxx_pp);
2437 type_as_string_translate (tree typ, int flags)
2440 dump_type (typ, flags);
2441 return pp_formatted_text (cxx_pp);
2445 expr_as_string (tree decl, int flags)
2448 pp_translate_identifiers (cxx_pp) = false;
2449 dump_expr (decl, flags);
2450 return pp_formatted_text (cxx_pp);
2454 decl_as_string (tree decl, int flags)
2457 pp_translate_identifiers (cxx_pp) = false;
2458 dump_decl (decl, flags);
2459 return pp_formatted_text (cxx_pp);
2463 decl_as_string_translate (tree decl, int flags)
2466 dump_decl (decl, flags);
2467 return pp_formatted_text (cxx_pp);
2470 /* Generate the three forms of printable names for cxx_printable_name. */
2473 lang_decl_name (tree decl, int v, bool translate)
2477 ? decl_as_string_translate (decl, TFF_DECL_SPECIFIERS)
2478 : decl_as_string (decl, TFF_DECL_SPECIFIERS));
2481 pp_translate_identifiers (cxx_pp) = translate;
2483 && (DECL_CLASS_SCOPE_P (decl)
2484 || (DECL_NAMESPACE_SCOPE_P (decl)
2485 && CP_DECL_CONTEXT (decl) != global_namespace)))
2487 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2488 pp_cxx_colon_colon (cxx_pp);
2491 if (TREE_CODE (decl) == FUNCTION_DECL)
2492 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2494 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2496 return pp_formatted_text (cxx_pp);
2499 /* Return the location of a tree passed to %+ formats. */
2502 location_of (tree t)
2504 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2505 t = DECL_CONTEXT (t);
2506 else if (TYPE_P (t))
2508 t = TYPE_MAIN_DECL (t);
2510 return input_location;
2512 else if (TREE_CODE (t) == OVERLOAD)
2513 t = OVL_FUNCTION (t);
2516 return DECL_SOURCE_LOCATION (t);
2517 return EXPR_LOC_OR_HERE (t);
2520 /* Now the interfaces from error et al to dump_type et al. Each takes an
2521 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2525 decl_to_string (tree decl, int verbose)
2529 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2530 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2531 flags = TFF_CLASS_KEY_OR_ENUM;
2533 flags |= TFF_DECL_SPECIFIERS;
2534 else if (TREE_CODE (decl) == FUNCTION_DECL)
2535 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2536 flags |= TFF_TEMPLATE_HEADER;
2539 dump_decl (decl, flags);
2540 return pp_formatted_text (cxx_pp);
2544 expr_to_string (tree decl)
2547 dump_expr (decl, 0);
2548 return pp_formatted_text (cxx_pp);
2552 fndecl_to_string (tree fndecl, int verbose)
2556 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2557 | TFF_TEMPLATE_HEADER;
2559 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2561 dump_decl (fndecl, flags);
2562 return pp_formatted_text (cxx_pp);
2567 code_to_string (enum tree_code c)
2569 return tree_code_name [c];
2573 language_to_string (enum languages c)
2580 case lang_cplusplus:
2592 /* Return the proper printed version of a parameter to a C++ function. */
2595 parm_to_string (int p)
2599 pp_string (cxx_pp, "'this'");
2601 pp_decimal_int (cxx_pp, p + 1);
2602 return pp_formatted_text (cxx_pp);
2606 op_to_string (enum tree_code p)
2608 tree id = operator_name_info[(int) p].identifier;
2609 return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
2613 type_to_string (tree typ, int verbose)
2617 flags |= TFF_CLASS_KEY_OR_ENUM;
2618 flags |= TFF_TEMPLATE_HEADER;
2621 dump_type (typ, flags);
2622 return pp_formatted_text (cxx_pp);
2626 assop_to_string (enum tree_code p)
2628 tree id = assignment_operator_name_info[(int) p].identifier;
2629 return id ? IDENTIFIER_POINTER (id) : M_("{unknown}");
2633 args_to_string (tree p, int verbose)
2637 flags |= TFF_CLASS_KEY_OR_ENUM;
2642 if (TYPE_P (TREE_VALUE (p)))
2643 return type_as_string_translate (p, flags);
2646 for (; p; p = TREE_CHAIN (p))
2648 if (TREE_VALUE (p) == null_node)
2649 pp_cxx_ws_string (cxx_pp, "NULL");
2651 dump_type (error_type (TREE_VALUE (p)), flags);
2653 pp_separate_with_comma (cxx_pp);
2655 return pp_formatted_text (cxx_pp);
2659 cv_to_string (tree p, int v)
2662 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2663 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2664 return pp_formatted_text (cxx_pp);
2667 /* Langhook for print_error_function. */
2669 cxx_print_error_function (diagnostic_context *context, const char *file,
2670 diagnostic_info *diagnostic)
2672 lhd_print_error_function (context, file, diagnostic);
2673 pp_base_set_prefix (context->printer, file);
2674 maybe_print_instantiation_context (context);
2678 cp_diagnostic_starter (diagnostic_context *context,
2679 diagnostic_info *diagnostic)
2681 diagnostic_report_current_module (context);
2682 cp_print_error_function (context, diagnostic);
2683 maybe_print_instantiation_context (context);
2684 maybe_print_constexpr_context (context);
2685 pp_base_set_prefix (context->printer, diagnostic_build_prefix (context,
2690 cp_diagnostic_finalizer (diagnostic_context *context,
2691 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2693 pp_base_destroy_prefix (context->printer);
2696 /* Print current function onto BUFFER, in the process of reporting
2697 a diagnostic message. Called from cp_diagnostic_starter. */
2699 cp_print_error_function (diagnostic_context *context,
2700 diagnostic_info *diagnostic)
2702 if (diagnostic_last_function_changed (context, diagnostic))
2704 const char *old_prefix = context->printer->prefix;
2705 const char *file = LOCATION_FILE (diagnostic->location);
2706 tree abstract_origin = diagnostic_abstract_origin (diagnostic);
2707 char *new_prefix = (file && abstract_origin == NULL)
2708 ? file_name_as_prefix (file) : NULL;
2710 pp_base_set_prefix (context->printer, new_prefix);
2712 if (current_function_decl == NULL)
2713 pp_base_string (context->printer, _("At global scope:"));
2718 if (abstract_origin)
2720 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2721 while (TREE_CODE (ao) == BLOCK
2722 && BLOCK_ABSTRACT_ORIGIN (ao)
2723 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2724 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2725 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2729 fndecl = current_function_decl;
2731 pp_printf (context->printer, function_category (fndecl),
2732 cxx_printable_name_translate (fndecl, 2));
2734 while (abstract_origin)
2737 tree block = abstract_origin;
2739 locus = &BLOCK_SOURCE_LOCATION (block);
2741 block = BLOCK_SUPERCONTEXT (block);
2742 while (block && TREE_CODE (block) == BLOCK
2743 && BLOCK_ABSTRACT_ORIGIN (block))
2745 ao = BLOCK_ABSTRACT_ORIGIN (block);
2747 while (TREE_CODE (ao) == BLOCK
2748 && BLOCK_ABSTRACT_ORIGIN (ao)
2749 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2750 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2752 if (TREE_CODE (ao) == FUNCTION_DECL)
2757 else if (TREE_CODE (ao) != BLOCK)
2760 block = BLOCK_SUPERCONTEXT (block);
2763 abstract_origin = block;
2766 while (block && TREE_CODE (block) == BLOCK)
2767 block = BLOCK_SUPERCONTEXT (block);
2769 if (block && TREE_CODE (block) == FUNCTION_DECL)
2771 abstract_origin = NULL;
2775 expanded_location s = expand_location (*locus);
2776 pp_base_character (context->printer, ',');
2777 pp_base_newline (context->printer);
2780 if (context->show_column && s.column != 0)
2781 pp_printf (context->printer,
2782 _(" inlined from %qs at %s:%d:%d"),
2783 cxx_printable_name_translate (fndecl, 2),
2784 s.file, s.line, s.column);
2786 pp_printf (context->printer,
2787 _(" inlined from %qs at %s:%d"),
2788 cxx_printable_name_translate (fndecl, 2),
2793 pp_printf (context->printer, _(" inlined from %qs"),
2794 cxx_printable_name_translate (fndecl, 2));
2797 pp_base_character (context->printer, ':');
2799 pp_base_newline (context->printer);
2801 diagnostic_set_last_function (context, diagnostic);
2802 pp_base_destroy_prefix (context->printer);
2803 context->printer->prefix = old_prefix;
2807 /* Returns a description of FUNCTION using standard terminology. The
2808 result is a format string of the form "In CATEGORY %qs". */
2810 function_category (tree fn)
2812 /* We can get called from the middle-end for diagnostics of function
2813 clones. Make sure we have language specific information before
2814 dereferencing it. */
2815 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn))
2816 && DECL_FUNCTION_MEMBER_P (fn))
2818 if (DECL_STATIC_FUNCTION_P (fn))
2819 return _("In static member function %qs");
2820 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2821 return _("In copy constructor %qs");
2822 else if (DECL_CONSTRUCTOR_P (fn))
2823 return _("In constructor %qs");
2824 else if (DECL_DESTRUCTOR_P (fn))
2825 return _("In destructor %qs");
2826 else if (LAMBDA_FUNCTION_P (fn))
2827 return _("In lambda function");
2829 return _("In member function %qs");
2832 return _("In function %qs");
2835 /* Report the full context of a current template instantiation,
2838 print_instantiation_full_context (diagnostic_context *context)
2840 struct tinst_level *p = current_instantiation ();
2841 location_t location = input_location;
2845 if (current_function_decl != p->decl
2846 && current_function_decl != NULL_TREE)
2847 /* We can get here during the processing of some synthesized
2848 method. Then, P->DECL will be the function that's causing
2853 if (current_function_decl == p->decl)
2854 /* Avoid redundancy with the "In function" line. */;
2856 pp_verbatim (context->printer,
2857 _("%s: In instantiation of %qs:\n"),
2858 LOCATION_FILE (location),
2859 decl_as_string_translate (p->decl,
2860 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2862 location = p->locus;
2867 print_instantiation_partial_context (context, p, location);
2870 /* Helper function of print_instantiation_partial_context() that
2871 prints a single line of instantiation context. */
2874 print_instantiation_partial_context_line (diagnostic_context *context,
2875 const struct tinst_level *t,
2876 location_t loc, bool recursive_p)
2878 expanded_location xloc;
2879 xloc = expand_location (loc);
2884 str = decl_as_string_translate (t->decl,
2885 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE);
2886 if (context->show_column)
2887 pp_verbatim (context->printer,
2889 ? _("%s:%d:%d: recursively instantiated from %qs\n")
2890 : _("%s:%d:%d: instantiated from %qs\n"),
2891 xloc.file, xloc.line, xloc.column, str);
2893 pp_verbatim (context->printer,
2895 ? _("%s:%d: recursively instantiated from %qs\n")
2896 : _("%s:%d: recursively instantiated from %qs\n"),
2897 xloc.file, xloc.line, str);
2901 if (context->show_column)
2902 pp_verbatim (context->printer,
2904 ? _("%s:%d:%d: recursively instantiated from here")
2905 : _("%s:%d:%d: instantiated from here"),
2906 xloc.file, xloc.line, xloc.column);
2908 pp_verbatim (context->printer,
2910 ? _("%s:%d: recursively instantiated from here")
2911 : _("%s:%d: instantiated from here"),
2912 xloc.file, xloc.line);
2916 /* Same as print_instantiation_full_context but less verbose. */
2919 print_instantiation_partial_context (diagnostic_context *context,
2920 struct tinst_level *t0, location_t loc)
2922 struct tinst_level *t;
2925 location_t prev_loc = loc;
2927 for (t = t0; t != NULL; t = t->next)
2928 if (prev_loc != t->locus)
2930 prev_loc = t->locus;
2938 int skip = n_total - 10;
2939 for (n = 0; n < 5; n++)
2941 gcc_assert (t != NULL);
2942 if (loc != t->locus)
2943 print_instantiation_partial_context_line (context, t, loc,
2944 /*recursive_p=*/false);
2948 if (t != NULL && skip > 1)
2950 expanded_location xloc;
2951 xloc = expand_location (loc);
2952 if (context->show_column)
2953 pp_verbatim (context->printer,
2954 _("%s:%d:%d: [ skipping %d instantiation contexts ]\n"),
2955 xloc.file, xloc.line, xloc.column, skip);
2957 pp_verbatim (context->printer,
2958 _("%s:%d: [ skipping %d instantiation contexts ]\n"),
2959 xloc.file, xloc.line, skip);
2964 } while (t != NULL && --skip > 0);
2970 while (t->next != NULL && t->locus == t->next->locus)
2975 print_instantiation_partial_context_line (context, t, loc,
2980 print_instantiation_partial_context_line (context, NULL, loc,
2981 /*recursive_p=*/false);
2982 pp_base_newline (context->printer);
2985 /* Called from cp_thing to print the template context for an error. */
2987 maybe_print_instantiation_context (diagnostic_context *context)
2989 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2992 record_last_problematic_instantiation ();
2993 print_instantiation_full_context (context);
2996 /* Report the bare minimum context of a template instantiation. */
2998 print_instantiation_context (void)
3000 print_instantiation_partial_context
3001 (global_dc, current_instantiation (), input_location);
3002 diagnostic_flush_buffer (global_dc);
3005 /* Report what constexpr call(s) we're trying to expand, if any. */
3008 maybe_print_constexpr_context (diagnostic_context *context)
3010 VEC(tree,heap) *call_stack = cx_error_context ();
3014 FOR_EACH_VEC_ELT (tree, call_stack, ix, t)
3016 expanded_location xloc = expand_location (EXPR_LOCATION (t));
3017 const char *s = expr_as_string (t, 0);
3018 if (context->show_column)
3019 pp_verbatim (context->printer,
3020 _("%s:%d:%d: in constexpr expansion of %qs"),
3021 xloc.file, xloc.line, xloc.column, s);
3023 pp_verbatim (context->printer,
3024 _("%s:%d: in constexpr expansion of %qs"),
3025 xloc.file, xloc.line, s);
3026 pp_base_newline (context->printer);
3030 /* Called from output_format -- during diagnostic message processing --
3031 to handle C++ specific format specifier with the following meanings:
3032 %A function argument-list.
3036 %F function declaration.
3037 %L language as used in extern "lang".
3039 %P function parameter whose position is indicated by an integer.
3040 %Q assignment operator.
3044 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
3045 int precision, bool wide, bool set_locus, bool verbose)
3049 #define next_tree (t = va_arg (*text->args_ptr, tree))
3050 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3051 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3052 #define next_int va_arg (*text->args_ptr, int)
3054 if (precision != 0 || wide)
3057 if (text->locus == NULL)
3062 case 'A': result = args_to_string (next_tree, verbose); break;
3063 case 'C': result = code_to_string (next_tcode); break;
3066 tree temp = next_tree;
3068 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
3070 temp = DECL_DEBUG_EXPR (temp);
3073 result = expr_to_string (temp);
3077 result = decl_to_string (temp, verbose);
3080 case 'E': result = expr_to_string (next_tree); break;
3081 case 'F': result = fndecl_to_string (next_tree, verbose); break;
3082 case 'L': result = language_to_string (next_lang); break;
3083 case 'O': result = op_to_string (next_tcode); break;
3084 case 'P': result = parm_to_string (next_int); break;
3085 case 'Q': result = assop_to_string (next_tcode); break;
3086 case 'T': result = type_to_string (next_tree, verbose); break;
3087 case 'V': result = cv_to_string (next_tree, verbose); break;
3090 percent_K_format (text);
3097 pp_base_string (pp, result);
3098 if (set_locus && t != NULL)
3099 *text->locus = location_of (t);
3107 /* Warn about the use of C++0x features when appropriate. */
3109 maybe_warn_cpp0x (cpp0x_warn_str str)
3111 if ((cxx_dialect == cxx98) && !in_system_header)
3112 /* We really want to suppress this warning in system headers,
3113 because libstdc++ uses variadic templates even when we aren't
3117 case CPP0X_INITIALIZER_LISTS:
3118 pedwarn (input_location, 0,
3119 "extended initializer lists "
3120 "only available with -std=c++0x or -std=gnu++0x");
3122 case CPP0X_EXPLICIT_CONVERSION:
3123 pedwarn (input_location, 0,
3124 "explicit conversion operators "
3125 "only available with -std=c++0x or -std=gnu++0x");
3127 case CPP0X_VARIADIC_TEMPLATES:
3128 pedwarn (input_location, 0,
3129 "variadic templates "
3130 "only available with -std=c++0x or -std=gnu++0x");
3132 case CPP0X_LAMBDA_EXPR:
3133 pedwarn (input_location, 0,
3134 "lambda expressions "
3135 "only available with -std=c++0x or -std=gnu++0x");
3138 pedwarn (input_location, 0,
3139 "C++0x auto only available with -std=c++0x or -std=gnu++0x");
3141 case CPP0X_SCOPED_ENUMS:
3142 pedwarn (input_location, 0,
3143 "scoped enums only available with -std=c++0x or -std=gnu++0x");
3145 case CPP0X_DEFAULTED_DELETED:
3146 pedwarn (input_location, 0,
3147 "defaulted and deleted functions "
3148 "only available with -std=c++0x or -std=gnu++0x");
3150 case CPP0X_INLINE_NAMESPACES:
3151 pedwarn (input_location, OPT_pedantic,
3152 "inline namespaces "
3153 "only available with -std=c++0x or -std=gnu++0x");
3160 /* Warn about the use of variadic templates when appropriate. */
3162 maybe_warn_variadic_templates (void)
3164 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES);
3168 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3169 option OPT with text GMSGID. Use this function to report
3170 diagnostics for constructs that are invalid C++98, but valid
3173 pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...)
3175 diagnostic_info diagnostic;
3178 va_start (ap, gmsgid);
3179 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
3180 (cxx_dialect == cxx98) ? DK_PEDWARN : DK_WARNING);
3181 diagnostic.option_index = opt;
3183 return report_diagnostic (&diagnostic);
3186 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3187 we found when we tried to do the lookup. LOCATION is the location of
3188 the NAME identifier. */
3191 qualified_name_lookup_error (tree scope, tree name,
3192 tree decl, location_t location)
3194 if (scope == error_mark_node)
3195 ; /* We already complained. */
3196 else if (TYPE_P (scope))
3198 if (!COMPLETE_TYPE_P (scope))
3199 error_at (location, "incomplete type %qT used in nested name specifier",
3201 else if (TREE_CODE (decl) == TREE_LIST)
3203 error_at (location, "reference to %<%T::%D%> is ambiguous",
3205 print_candidates (decl);
3208 error_at (location, "%qD is not a member of %qT", name, scope);
3210 else if (scope != global_namespace)
3212 error_at (location, "%qD is not a member of %qD", name, scope);
3213 suggest_alternatives_for (location, name);
3217 error_at (location, "%<::%D%> has not been declared", name);
3218 suggest_alternatives_for (location, name);