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),
151 /* No default args in argument packs. */
152 flags|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS);
153 else if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
154 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
157 if (TREE_CODE (arg) == TREE_LIST)
158 arg = TREE_VALUE (arg);
160 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
164 /* Count the number of template arguments ARGS whose value does not
165 match the (optional) default template parameter in PARAMS */
168 get_non_default_template_args_count (tree args, int flags)
170 int n = TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args));
172 if (/* We use this flag when generating debug information. We don't
173 want to expand templates at this point, for this may generate
174 new decls, which gets decl counts out of sync, which may in
175 turn cause codegen differences between compilations with and
177 (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0
178 || !flag_pretty_templates)
181 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args));
184 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
188 dump_template_argument_list (tree args, int flags)
190 int n = get_non_default_template_args_count (args, flags);
194 for (i = 0; i < n; ++i)
196 tree arg = TREE_VEC_ELT (args, i);
198 /* Only print a comma if we know there is an argument coming. In
199 the case of an empty template argument pack, no actual
200 argument will be printed. */
202 && (!ARGUMENT_PACK_P (arg)
203 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
204 pp_separate_with_comma (cxx_pp);
206 dump_template_argument (arg, flags);
211 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
214 dump_template_parameter (tree parm, int flags)
219 if (parm == error_mark_node)
222 p = TREE_VALUE (parm);
223 a = TREE_PURPOSE (parm);
225 if (TREE_CODE (p) == TYPE_DECL)
227 if (flags & TFF_DECL_SPECIFIERS)
229 pp_cxx_ws_string (cxx_pp, "class");
230 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
231 pp_cxx_ws_string (cxx_pp, "...");
233 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
235 else if (DECL_NAME (p))
236 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
238 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
241 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
243 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
245 pp_cxx_whitespace (cxx_pp);
247 pp_cxx_whitespace (cxx_pp);
248 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
249 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
251 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
255 /* Dump, under control of FLAGS, a template-parameter-list binding.
256 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
260 dump_template_bindings (tree parms, tree args, VEC(tree,gc)* typenames)
268 tree p = TREE_VALUE (parms);
269 int lvl = TMPL_PARMS_DEPTH (parms);
272 tree lvl_args = NULL_TREE;
274 /* Don't crash if we had an invalid argument list. */
275 if (TMPL_ARGS_DEPTH (args) >= lvl)
276 lvl_args = TMPL_ARGS_LEVEL (args, lvl);
278 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
280 tree arg = NULL_TREE;
282 /* Don't crash if we had an invalid argument list. */
283 if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx)
284 arg = TREE_VEC_ELT (lvl_args, arg_idx);
287 pp_separate_with_comma (cxx_pp);
288 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
289 pp_cxx_whitespace (cxx_pp);
291 pp_cxx_whitespace (cxx_pp);
294 if (ARGUMENT_PACK_P (arg))
295 pp_cxx_left_brace (cxx_pp);
296 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
297 if (ARGUMENT_PACK_P (arg))
298 pp_cxx_right_brace (cxx_pp);
301 pp_string (cxx_pp, M_("<missing>"));
307 parms = TREE_CHAIN (parms);
310 /* Don't bother with typenames for a partial instantiation. */
311 if (VEC_empty (tree, typenames) || uses_template_parms (args))
314 FOR_EACH_VEC_ELT (tree, typenames, i, t)
317 pp_separate_with_comma (cxx_pp);
318 dump_type (t, TFF_PLAIN_IDENTIFIER);
319 pp_cxx_whitespace (cxx_pp);
321 pp_cxx_whitespace (cxx_pp);
322 push_deferring_access_checks (dk_no_check);
323 t = tsubst (t, args, tf_none, NULL_TREE);
324 pop_deferring_access_checks ();
325 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
326 pp_simple_type_specifier doesn't know about it. */
327 t = strip_typedefs (t);
328 dump_type (t, TFF_PLAIN_IDENTIFIER);
332 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
336 dump_type (tree t, int flags)
341 /* Don't print e.g. "struct mytypedef". */
342 if (TYPE_P (t) && typedef_variant_p (t))
344 tree decl = TYPE_NAME (t);
345 if ((flags & TFF_CHASE_TYPEDEF)
346 || DECL_SELF_REFERENCE_P (decl)
347 || (!flag_pretty_templates
348 && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)))
349 t = strip_typedefs (t);
350 else if (same_type_p (t, TREE_TYPE (decl)))
354 pp_cxx_cv_qualifier_seq (cxx_pp, t);
355 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
360 if (TYPE_PTRMEMFUNC_P (t))
363 switch (TREE_CODE (t))
366 if (t == init_list_type_node)
367 pp_string (cxx_pp, M_("<brace-enclosed initializer list>"));
368 else if (t == unknown_type_node)
369 pp_string (cxx_pp, M_("<unresolved overloaded function type>"));
372 pp_cxx_cv_qualifier_seq (cxx_pp, t);
373 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
378 /* A list of function parms. */
379 dump_parameters (t, flags);
382 case IDENTIFIER_NODE:
383 pp_cxx_tree_identifier (cxx_pp, t);
387 dump_type (BINFO_TYPE (t), flags);
393 dump_aggr_type (t, flags);
397 if (flags & TFF_CHASE_TYPEDEF)
399 dump_type (DECL_ORIGINAL_TYPE (t)
400 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
403 /* Else fall through. */
407 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
416 case FIXED_POINT_TYPE:
417 pp_type_specifier_seq (cxx_pp, t);
420 case TEMPLATE_TEMPLATE_PARM:
421 /* For parameters inside template signature. */
422 if (TYPE_IDENTIFIER (t))
423 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
425 pp_cxx_canonical_template_parameter (cxx_pp, t);
428 case BOUND_TEMPLATE_TEMPLATE_PARM:
430 tree args = TYPE_TI_ARGS (t);
431 pp_cxx_cv_qualifier_seq (cxx_pp, t);
432 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
433 pp_cxx_begin_template_argument_list (cxx_pp);
434 dump_template_argument_list (args, flags);
435 pp_cxx_end_template_argument_list (cxx_pp);
439 case TEMPLATE_TYPE_PARM:
440 pp_cxx_cv_qualifier_seq (cxx_pp, t);
441 if (TYPE_IDENTIFIER (t))
442 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
444 pp_cxx_canonical_template_parameter
445 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
448 /* This is not always necessary for pointers and such, but doing this
449 reduces code size. */
458 dump_type_prefix (t, flags);
459 dump_type_suffix (t, flags);
463 if (! (flags & TFF_CHASE_TYPEDEF)
464 && DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
466 dump_decl (TYPE_NAME (t), TFF_PLAIN_IDENTIFIER);
469 pp_cxx_cv_qualifier_seq (cxx_pp, t);
470 pp_cxx_ws_string (cxx_pp,
471 TYPENAME_IS_ENUM_P (t) ? "enum"
472 : TYPENAME_IS_CLASS_P (t) ? "class"
474 dump_typename (t, flags);
477 case UNBOUND_CLASS_TEMPLATE:
478 if (! (flags & TFF_UNQUALIFIED_NAME))
480 dump_type (TYPE_CONTEXT (t), flags);
481 pp_cxx_colon_colon (cxx_pp);
483 pp_cxx_ws_string (cxx_pp, "template");
484 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
488 pp_cxx_ws_string (cxx_pp, "__typeof__");
489 pp_cxx_whitespace (cxx_pp);
490 pp_cxx_left_paren (cxx_pp);
491 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
492 pp_cxx_right_paren (cxx_pp);
495 case UNDERLYING_TYPE:
496 pp_cxx_ws_string (cxx_pp, "__underlying_type");
497 pp_cxx_whitespace (cxx_pp);
498 pp_cxx_left_paren (cxx_pp);
499 dump_expr (UNDERLYING_TYPE_TYPE (t), flags & ~TFF_EXPR_IN_PARENS);
500 pp_cxx_right_paren (cxx_pp);
503 case TYPE_PACK_EXPANSION:
504 dump_type (PACK_EXPANSION_PATTERN (t), flags);
505 pp_cxx_ws_string (cxx_pp, "...");
508 case TYPE_ARGUMENT_PACK:
509 dump_template_argument (t, flags);
513 pp_cxx_ws_string (cxx_pp, "decltype");
514 pp_cxx_whitespace (cxx_pp);
515 pp_cxx_left_paren (cxx_pp);
516 dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
517 pp_cxx_right_paren (cxx_pp);
521 pp_string (cxx_pp, "std::nullptr_t");
525 pp_unsupported_tree (cxx_pp, t);
526 /* Fall through to error. */
529 pp_string (cxx_pp, M_("<type error>"));
534 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
538 dump_typename (tree t, int flags)
540 tree ctx = TYPE_CONTEXT (t);
542 if (TREE_CODE (ctx) == TYPENAME_TYPE)
543 dump_typename (ctx, flags);
545 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
546 pp_cxx_colon_colon (cxx_pp);
547 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
550 /* Return the name of the supplied aggregate, or enumeral type. */
553 class_key_or_enum_as_string (tree t)
555 if (TREE_CODE (t) == ENUMERAL_TYPE)
557 if (SCOPED_ENUM_P (t))
562 else if (TREE_CODE (t) == UNION_TYPE)
564 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
570 /* Print out a class declaration T under the control of FLAGS,
571 in the form `class foo'. */
574 dump_aggr_type (tree t, int flags)
577 const char *variety = class_key_or_enum_as_string (t);
581 pp_cxx_cv_qualifier_seq (cxx_pp, t);
583 if (flags & TFF_CLASS_KEY_OR_ENUM)
584 pp_cxx_ws_string (cxx_pp, variety);
586 name = TYPE_NAME (t);
590 typdef = !DECL_ARTIFICIAL (name);
593 && ((flags & TFF_CHASE_TYPEDEF)
594 || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name)
595 && DECL_TEMPLATE_INFO (name))))
596 || DECL_SELF_REFERENCE_P (name))
598 t = TYPE_MAIN_VARIANT (t);
599 name = TYPE_NAME (t);
603 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
604 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
605 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
606 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
608 if (! (flags & TFF_UNQUALIFIED_NAME))
609 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
610 flags &= ~TFF_UNQUALIFIED_NAME;
613 /* Because the template names are mangled, we have to locate
614 the most general template, and use that name. */
615 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
617 while (DECL_TEMPLATE_INFO (tpl))
618 tpl = DECL_TI_TEMPLATE (tpl);
621 name = DECL_NAME (name);
624 if (name == 0 || ANON_AGGRNAME_P (name))
626 if (flags & TFF_CLASS_KEY_OR_ENUM)
627 pp_string (cxx_pp, M_("<anonymous>"));
629 pp_printf (pp_base (cxx_pp), M_("<anonymous %s>"), variety);
631 else if (LAMBDANAME_P (name))
633 /* A lambda's "type" is essentially its signature. */
634 pp_string (cxx_pp, M_("<lambda"));
635 if (lambda_function (t))
636 dump_parameters (FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t)),
638 pp_character(cxx_pp, '>');
641 pp_cxx_tree_identifier (cxx_pp, name);
643 dump_template_parms (TYPE_TEMPLATE_INFO (t),
644 !CLASSTYPE_USE_TEMPLATE (t),
645 flags & ~TFF_TEMPLATE_HEADER);
648 /* Dump into the obstack the initial part of the output for a given type.
649 This is necessary when dealing with things like functions returning
652 return type of `int (* fee ())()': pointer -> function -> int. Both
653 pointer (and reference and offset) and function (and member) types must
654 deal with prefix and suffix.
656 Arrays must also do this for DECL nodes, like int a[], and for things like
660 dump_type_prefix (tree t, int flags)
662 if (TYPE_PTRMEMFUNC_P (t))
664 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
668 switch (TREE_CODE (t))
673 tree sub = TREE_TYPE (t);
675 dump_type_prefix (sub, flags);
676 if (TREE_CODE (sub) == ARRAY_TYPE
677 || TREE_CODE (sub) == FUNCTION_TYPE)
679 pp_cxx_whitespace (cxx_pp);
680 pp_cxx_left_paren (cxx_pp);
681 pp_c_attributes_display (pp_c_base (cxx_pp),
682 TYPE_ATTRIBUTES (sub));
684 if (TREE_CODE (t) == POINTER_TYPE)
685 pp_character(cxx_pp, '*');
686 else if (TREE_CODE (t) == REFERENCE_TYPE)
688 if (TYPE_REF_IS_RVALUE (t))
689 pp_string (cxx_pp, "&&");
691 pp_character (cxx_pp, '&');
693 pp_base (cxx_pp)->padding = pp_before;
694 pp_cxx_cv_qualifier_seq (cxx_pp, t);
700 dump_type_prefix (TREE_TYPE (t), flags);
701 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
703 pp_maybe_space (cxx_pp);
704 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
705 pp_cxx_left_paren (cxx_pp);
706 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
707 pp_cxx_colon_colon (cxx_pp);
709 pp_cxx_star (cxx_pp);
710 pp_cxx_cv_qualifier_seq (cxx_pp, t);
711 pp_base (cxx_pp)->padding = pp_before;
714 /* This can be reached without a pointer when dealing with
715 templates, e.g. std::is_function. */
717 dump_type_prefix (TREE_TYPE (t), flags);
721 dump_type_prefix (TREE_TYPE (t), flags);
722 pp_maybe_space (cxx_pp);
723 pp_cxx_left_paren (cxx_pp);
724 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
725 pp_cxx_colon_colon (cxx_pp);
729 dump_type_prefix (TREE_TYPE (t), flags);
733 case IDENTIFIER_NODE:
738 case TEMPLATE_TYPE_PARM:
739 case TEMPLATE_TEMPLATE_PARM:
740 case BOUND_TEMPLATE_TEMPLATE_PARM:
751 case UNDERLYING_TYPE:
753 case TYPE_PACK_EXPANSION:
754 case FIXED_POINT_TYPE:
756 dump_type (t, flags);
757 pp_base (cxx_pp)->padding = pp_before;
761 pp_unsupported_tree (cxx_pp, t);
764 pp_string (cxx_pp, M_("<typeprefixerror>"));
769 /* Dump the suffix of type T, under control of FLAGS. This is the part
770 which appears after the identifier (or function parms). */
773 dump_type_suffix (tree t, int flags)
775 if (TYPE_PTRMEMFUNC_P (t))
776 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
778 switch (TREE_CODE (t))
783 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
784 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
785 pp_cxx_right_paren (cxx_pp);
786 dump_type_suffix (TREE_TYPE (t), flags);
793 if (TREE_CODE (t) == METHOD_TYPE)
794 /* Can only be reached through a pointer. */
795 pp_cxx_right_paren (cxx_pp);
796 arg = TYPE_ARG_TYPES (t);
797 if (TREE_CODE (t) == METHOD_TYPE)
798 arg = TREE_CHAIN (arg);
800 /* Function pointers don't have default args. Not in standard C++,
801 anyway; they may in g++, but we'll just pretend otherwise. */
802 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
804 if (TREE_CODE (t) == METHOD_TYPE)
805 pp_cxx_cv_qualifier_seq (cxx_pp, class_of_this_parm (t));
807 pp_cxx_cv_qualifier_seq (cxx_pp, t);
808 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
809 dump_type_suffix (TREE_TYPE (t), flags);
814 pp_maybe_space (cxx_pp);
815 pp_cxx_left_bracket (cxx_pp);
818 tree dtype = TYPE_DOMAIN (t);
819 tree max = TYPE_MAX_VALUE (dtype);
820 if (host_integerp (max, 0))
821 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
822 else if (TREE_CODE (max) == MINUS_EXPR)
823 dump_expr (TREE_OPERAND (max, 0),
824 flags & ~TFF_EXPR_IN_PARENS);
826 dump_expr (fold_build2_loc (input_location,
827 PLUS_EXPR, dtype, max,
828 build_int_cst (dtype, 1)),
829 flags & ~TFF_EXPR_IN_PARENS);
831 pp_cxx_right_bracket (cxx_pp);
832 dump_type_suffix (TREE_TYPE (t), flags);
836 case IDENTIFIER_NODE:
841 case TEMPLATE_TYPE_PARM:
842 case TEMPLATE_TEMPLATE_PARM:
843 case BOUND_TEMPLATE_TEMPLATE_PARM:
854 case UNDERLYING_TYPE:
856 case TYPE_PACK_EXPANSION:
857 case FIXED_POINT_TYPE:
862 pp_unsupported_tree (cxx_pp, t);
864 /* Don't mark it here, we should have already done in
871 dump_global_iord (tree t)
873 const char *p = NULL;
875 if (DECL_GLOBAL_CTOR_P (t))
876 p = M_("(static initializers for %s)");
877 else if (DECL_GLOBAL_DTOR_P (t))
878 p = M_("(static destructors for %s)");
882 pp_printf (pp_base (cxx_pp), p, input_filename);
886 dump_simple_decl (tree t, tree type, int flags)
888 if (flags & TFF_DECL_SPECIFIERS)
890 if (TREE_CODE (t) == VAR_DECL
891 && DECL_DECLARED_CONSTEXPR_P (t))
892 pp_cxx_ws_string (cxx_pp, "constexpr");
893 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
894 pp_maybe_space (cxx_pp);
896 if (! (flags & TFF_UNQUALIFIED_NAME)
897 && TREE_CODE (t) != PARM_DECL
898 && (!DECL_INITIAL (t)
899 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
900 dump_scope (CP_DECL_CONTEXT (t), flags);
901 flags &= ~TFF_UNQUALIFIED_NAME;
902 if ((flags & TFF_DECL_SPECIFIERS)
903 && DECL_TEMPLATE_PARM_P (t)
904 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
905 pp_string (cxx_pp, "...");
907 dump_decl (DECL_NAME (t), flags);
909 pp_string (cxx_pp, M_("<anonymous>"));
910 if (flags & TFF_DECL_SPECIFIERS)
911 dump_type_suffix (type, flags);
914 /* Dump a human readable string for the decl T under control of FLAGS. */
917 dump_decl (tree t, int flags)
922 /* If doing Objective-C++, give Objective-C a chance to demangle
923 Objective-C method names. */
924 if (c_dialect_objc ())
926 const char *demangled = objc_maybe_printable_name (t, flags);
929 pp_string (cxx_pp, demangled);
934 switch (TREE_CODE (t))
937 /* Don't say 'typedef class A' */
938 if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t))
940 if ((flags & TFF_DECL_SPECIFIERS)
941 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
943 /* Say `class T' not just `T'. */
944 pp_cxx_ws_string (cxx_pp, "class");
946 /* Emit the `...' for a parameter pack. */
947 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
948 pp_cxx_ws_string (cxx_pp, "...");
951 dump_type (TREE_TYPE (t), flags);
954 if ((flags & TFF_DECL_SPECIFIERS)
955 && !DECL_SELF_REFERENCE_P (t))
956 pp_cxx_ws_string (cxx_pp, "typedef");
957 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
958 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
963 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
965 pp_string (cxx_pp, M_("vtable for "));
966 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
967 dump_type (DECL_CONTEXT (t), flags);
970 /* Else fall through. */
973 dump_simple_decl (t, TREE_TYPE (t), flags);
977 pp_string (cxx_pp, M_("<return value> "));
978 dump_simple_decl (t, TREE_TYPE (t), flags);
982 if (flags & TFF_DECL_SPECIFIERS)
983 pp_cxx_declaration (cxx_pp, t);
986 if (! (flags & TFF_UNQUALIFIED_NAME))
987 dump_scope (CP_DECL_CONTEXT (t), flags);
988 flags &= ~TFF_UNQUALIFIED_NAME;
989 if (DECL_NAME (t) == NULL_TREE)
990 pp_cxx_ws_string (cxx_pp, M_("{anonymous}"));
992 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
997 dump_type (TREE_OPERAND (t, 0), flags);
998 pp_string (cxx_pp, "::");
999 dump_decl (TREE_OPERAND (t, 1), flags|TFF_UNQUALIFIED_NAME);
1003 dump_decl (TREE_OPERAND (t, 0), flags);
1004 pp_cxx_left_bracket (cxx_pp);
1005 dump_decl (TREE_OPERAND (t, 1), flags);
1006 pp_cxx_right_bracket (cxx_pp);
1009 /* So that we can do dump_decl on an aggr type. */
1013 dump_type (t, flags);
1017 /* This is a pseudo destructor call which has not been folded into
1018 a PSEUDO_DTOR_EXPR yet. */
1019 pp_cxx_complement (cxx_pp);
1020 dump_type (TREE_OPERAND (t, 0), flags);
1027 /* These special cases are duplicated here so that other functions
1028 can feed identifiers to error and get them demangled properly. */
1029 case IDENTIFIER_NODE:
1030 if (IDENTIFIER_TYPENAME_P (t))
1032 pp_cxx_ws_string (cxx_pp, "operator");
1033 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1034 dump_type (TREE_TYPE (t), flags);
1038 pp_cxx_tree_identifier (cxx_pp, t);
1044 t = OVL_CURRENT (t);
1045 if (DECL_CLASS_SCOPE_P (t))
1047 dump_type (DECL_CONTEXT (t), flags);
1048 pp_cxx_colon_colon (cxx_pp);
1050 else if (!DECL_FILE_SCOPE_P (t))
1052 dump_decl (DECL_CONTEXT (t), flags);
1053 pp_cxx_colon_colon (cxx_pp);
1055 dump_decl (DECL_NAME (t), flags);
1059 /* If there's only one function, just treat it like an ordinary
1061 t = OVL_CURRENT (t);
1065 if (! DECL_LANG_SPECIFIC (t))
1066 pp_string (cxx_pp, M_("<built-in>"));
1067 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
1068 dump_global_iord (t);
1070 dump_function_decl (t, flags);
1074 dump_template_decl (t, flags);
1077 case TEMPLATE_ID_EXPR:
1079 tree name = TREE_OPERAND (t, 0);
1081 if (is_overloaded_fn (name))
1082 name = DECL_NAME (get_first_fn (name));
1083 dump_decl (name, flags);
1084 pp_cxx_begin_template_argument_list (cxx_pp);
1085 if (TREE_OPERAND (t, 1))
1086 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
1087 pp_cxx_end_template_argument_list (cxx_pp);
1092 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
1096 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
1097 || (DECL_INITIAL (t) &&
1098 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
1099 dump_simple_decl (t, TREE_TYPE (t), flags);
1100 else if (DECL_NAME (t))
1101 dump_decl (DECL_NAME (t), flags);
1102 else if (DECL_INITIAL (t))
1103 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
1105 pp_string (cxx_pp, M_("<enumerator>"));
1109 pp_cxx_ws_string (cxx_pp, "using");
1110 dump_type (USING_DECL_SCOPE (t), flags);
1111 pp_cxx_colon_colon (cxx_pp);
1112 dump_decl (DECL_NAME (t), flags);
1116 pp_cxx_declaration (cxx_pp, t);
1120 dump_decl (BASELINK_FUNCTIONS (t), flags);
1123 case NON_DEPENDENT_EXPR:
1124 dump_expr (t, flags);
1127 case TEMPLATE_TYPE_PARM:
1128 if (flags & TFF_DECL_SPECIFIERS)
1129 pp_cxx_declaration (cxx_pp, t);
1131 pp_type_id (cxx_pp, t);
1134 case UNBOUND_CLASS_TEMPLATE:
1135 case TYPE_PACK_EXPANSION:
1137 dump_type (t, flags);
1141 pp_unsupported_tree (cxx_pp, t);
1142 /* Fall through to error. */
1145 pp_string (cxx_pp, M_("<declaration error>"));
1150 /* Dump a template declaration T under control of FLAGS. This means the
1151 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1154 dump_template_decl (tree t, int flags)
1156 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1160 if (flags & TFF_TEMPLATE_HEADER)
1162 for (parms = orig_parms = nreverse (orig_parms);
1164 parms = TREE_CHAIN (parms))
1166 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1167 int len = TREE_VEC_LENGTH (inner_parms);
1169 pp_cxx_ws_string (cxx_pp, "template");
1170 pp_cxx_begin_template_argument_list (cxx_pp);
1172 /* If we've shown the template prefix, we'd better show the
1173 parameters' and decl's type too. */
1174 flags |= TFF_DECL_SPECIFIERS;
1176 for (i = 0; i < len; i++)
1179 pp_separate_with_comma (cxx_pp);
1180 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1182 pp_cxx_end_template_argument_list (cxx_pp);
1183 pp_cxx_whitespace (cxx_pp);
1185 nreverse(orig_parms);
1187 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1189 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1190 pp_cxx_ws_string (cxx_pp, "class");
1192 /* If this is a parameter pack, print the ellipsis. */
1193 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1194 pp_cxx_ws_string (cxx_pp, "...");
1198 if (DECL_TEMPLATE_RESULT (t)
1199 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1200 dump_type (TREE_TYPE (t),
1201 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1202 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1203 else if (DECL_TEMPLATE_RESULT (t)
1204 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1205 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1208 gcc_assert (TREE_TYPE (t));
1209 switch (NEXT_CODE (t))
1213 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1216 /* This case can occur with some invalid code. */
1217 dump_type (TREE_TYPE (t),
1218 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1219 | (flags & TFF_DECL_SPECIFIERS
1220 ? TFF_CLASS_KEY_OR_ENUM : 0));
1225 /* find_typenames looks through the type of the function template T
1226 and returns a VEC containing any typedefs, decltypes or TYPENAME_TYPEs
1229 struct find_typenames_t
1231 struct pointer_set_t *p_set;
1232 VEC (tree,gc) *typenames;
1236 find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
1238 struct find_typenames_t *d = (struct find_typenames_t *)data;
1239 tree mv = NULL_TREE;
1241 if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp)))
1242 /* Add the type of the typedef without any additional cv-quals. */
1243 mv = TREE_TYPE (TYPE_NAME (*tp));
1244 else if (TREE_CODE (*tp) == TYPENAME_TYPE
1245 || TREE_CODE (*tp) == DECLTYPE_TYPE)
1246 /* Add the typename without any cv-qualifiers. */
1247 mv = TYPE_MAIN_VARIANT (*tp);
1249 if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv)))
1250 VEC_safe_push (tree, gc, d->typenames, mv);
1252 /* Search into class template arguments, which cp_walk_subtrees
1254 if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp))
1255 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r,
1261 static VEC(tree,gc) *
1262 find_typenames (tree t)
1264 struct find_typenames_t ft;
1265 ft.p_set = pointer_set_create ();
1266 ft.typenames = NULL;
1267 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
1268 find_typenames_r, &ft, ft.p_set);
1269 pointer_set_destroy (ft.p_set);
1270 return ft.typenames;
1273 /* Pretty print a function decl. There are several ways we want to print a
1274 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1275 As error can only apply the '#' flag once to give 0 and 1 for V, there
1276 is %D which doesn't print the throw specs, and %F which does. */
1279 dump_function_decl (tree t, int flags)
1283 tree cname = NULL_TREE;
1284 tree template_args = NULL_TREE;
1285 tree template_parms = NULL_TREE;
1286 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1287 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1289 VEC(tree,gc) *typenames = NULL;
1291 if (DECL_NAME (t) && LAMBDA_FUNCTION_P (t))
1293 /* A lambda's signature is essentially its "type", so defer. */
1294 gcc_assert (LAMBDA_TYPE_P (DECL_CONTEXT (t)));
1295 dump_type (DECL_CONTEXT (t), flags);
1299 flags &= ~TFF_UNQUALIFIED_NAME;
1300 if (TREE_CODE (t) == TEMPLATE_DECL)
1301 t = DECL_TEMPLATE_RESULT (t);
1303 /* Save the exceptions, in case t is a specialization and we are
1304 emitting an error about incompatible specifications. */
1305 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1307 /* Pretty print template instantiations only. */
1308 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
1309 && flag_pretty_templates)
1313 template_args = DECL_TI_ARGS (t);
1314 tmpl = most_general_template (t);
1315 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1317 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1319 typenames = find_typenames (t);
1323 fntype = TREE_TYPE (t);
1324 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1326 if (DECL_CLASS_SCOPE_P (t))
1327 cname = DECL_CONTEXT (t);
1328 /* This is for partially instantiated template methods. */
1329 else if (TREE_CODE (fntype) == METHOD_TYPE)
1330 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1332 if (flags & TFF_DECL_SPECIFIERS)
1334 if (DECL_STATIC_FUNCTION_P (t))
1335 pp_cxx_ws_string (cxx_pp, "static");
1336 else if (DECL_VIRTUAL_P (t))
1337 pp_cxx_ws_string (cxx_pp, "virtual");
1339 if (DECL_DECLARED_CONSTEXPR_P (STRIP_TEMPLATE (t)))
1340 pp_cxx_ws_string (cxx_pp, "constexpr");
1343 /* Print the return type? */
1345 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1346 && !DECL_DESTRUCTOR_P (t);
1348 dump_type_prefix (TREE_TYPE (fntype), flags);
1350 /* Print the function name. */
1351 if (!do_outer_scope)
1355 dump_type (cname, flags);
1356 pp_cxx_colon_colon (cxx_pp);
1359 dump_scope (CP_DECL_CONTEXT (t), flags);
1361 dump_function_name (t, flags);
1363 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1365 dump_parameters (parmtypes, flags);
1367 if (TREE_CODE (fntype) == METHOD_TYPE)
1369 pp_base (cxx_pp)->padding = pp_before;
1370 pp_cxx_cv_qualifier_seq (cxx_pp, class_of_this_parm (fntype));
1373 if (flags & TFF_EXCEPTION_SPECIFICATION)
1375 pp_base (cxx_pp)->padding = pp_before;
1376 dump_exception_spec (exceptions, flags);
1380 dump_type_suffix (TREE_TYPE (fntype), flags);
1382 /* If T is a template instantiation, dump the parameter binding. */
1383 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1385 pp_cxx_whitespace (cxx_pp);
1386 pp_cxx_left_bracket (cxx_pp);
1387 pp_cxx_ws_string (cxx_pp, M_("with"));
1388 pp_cxx_whitespace (cxx_pp);
1389 dump_template_bindings (template_parms, template_args, typenames);
1390 pp_cxx_right_bracket (cxx_pp);
1393 else if (template_args)
1395 bool need_comma = false;
1397 pp_cxx_begin_template_argument_list (cxx_pp);
1398 template_args = INNERMOST_TEMPLATE_ARGS (template_args);
1399 for (i = 0; i < TREE_VEC_LENGTH (template_args); ++i)
1401 tree arg = TREE_VEC_ELT (template_args, i);
1403 pp_separate_with_comma (cxx_pp);
1404 if (ARGUMENT_PACK_P (arg))
1405 pp_cxx_left_brace (cxx_pp);
1406 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
1407 if (ARGUMENT_PACK_P (arg))
1408 pp_cxx_right_brace (cxx_pp);
1411 pp_cxx_end_template_argument_list (cxx_pp);
1415 /* Print a parameter list. If this is for a member function, the
1416 member object ptr (and any other hidden args) should have
1417 already been removed. */
1420 dump_parameters (tree parmtypes, int flags)
1423 flags &= ~TFF_SCOPE;
1424 pp_cxx_left_paren (cxx_pp);
1426 for (first = 1; parmtypes != void_list_node;
1427 parmtypes = TREE_CHAIN (parmtypes))
1430 pp_separate_with_comma (cxx_pp);
1434 pp_cxx_ws_string (cxx_pp, "...");
1438 dump_type (TREE_VALUE (parmtypes), flags);
1440 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1442 pp_cxx_whitespace (cxx_pp);
1444 pp_cxx_whitespace (cxx_pp);
1445 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1449 pp_cxx_right_paren (cxx_pp);
1452 /* Print an exception specification. T is the exception specification. */
1455 dump_exception_spec (tree t, int flags)
1457 if (t && TREE_PURPOSE (t))
1459 pp_cxx_ws_string (cxx_pp, "noexcept");
1460 pp_cxx_whitespace (cxx_pp);
1461 pp_cxx_left_paren (cxx_pp);
1462 if (DEFERRED_NOEXCEPT_SPEC_P (t))
1463 pp_cxx_ws_string (cxx_pp, "<uninstantiated>");
1465 dump_expr (TREE_PURPOSE (t), flags);
1466 pp_cxx_right_paren (cxx_pp);
1470 pp_cxx_ws_string (cxx_pp, "throw");
1471 pp_cxx_whitespace (cxx_pp);
1472 pp_cxx_left_paren (cxx_pp);
1473 if (TREE_VALUE (t) != NULL_TREE)
1476 dump_type (TREE_VALUE (t), flags);
1480 pp_separate_with_comma (cxx_pp);
1482 pp_cxx_right_paren (cxx_pp);
1486 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1487 and destructors properly. */
1490 dump_function_name (tree t, int flags)
1492 tree name = DECL_NAME (t);
1494 /* We can get here with a decl that was synthesized by language-
1495 independent machinery (e.g. coverage.c) in which case it won't
1496 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1497 will crash. In this case it is safe just to print out the
1499 if (!DECL_LANG_SPECIFIC (t))
1501 pp_cxx_tree_identifier (cxx_pp, name);
1505 if (TREE_CODE (t) == TEMPLATE_DECL)
1506 t = DECL_TEMPLATE_RESULT (t);
1508 /* Don't let the user see __comp_ctor et al. */
1509 if (DECL_CONSTRUCTOR_P (t)
1510 || DECL_DESTRUCTOR_P (t))
1512 if (LAMBDA_TYPE_P (DECL_CONTEXT (t)))
1513 name = get_identifier ("<lambda>");
1515 name = constructor_name (DECL_CONTEXT (t));
1518 if (DECL_DESTRUCTOR_P (t))
1520 pp_cxx_complement (cxx_pp);
1521 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1523 else if (DECL_CONV_FN_P (t))
1525 /* This cannot use the hack that the operator's return
1526 type is stashed off of its name because it may be
1527 used for error reporting. In the case of conflicting
1528 declarations, both will have the same name, yet
1529 the types will be different, hence the TREE_TYPE field
1530 of the first name will be clobbered by the second. */
1531 pp_cxx_ws_string (cxx_pp, "operator");
1532 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1534 else if (name && IDENTIFIER_OPNAME_P (name))
1535 pp_cxx_tree_identifier (cxx_pp, name);
1537 dump_decl (name, flags);
1539 if (DECL_TEMPLATE_INFO (t)
1540 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1541 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1542 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1543 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1546 /* Dump the template parameters from the template info INFO under control of
1547 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1548 specialization (partial or complete). For partial specializations we show
1549 the specialized parameter values. For a primary template we show no
1553 dump_template_parms (tree info, int primary, int flags)
1555 tree args = info ? TI_ARGS (info) : NULL_TREE;
1557 if (primary && flags & TFF_TEMPLATE_NAME)
1559 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1560 pp_cxx_begin_template_argument_list (cxx_pp);
1562 /* Be careful only to print things when we have them, so as not
1563 to crash producing error messages. */
1564 if (args && !primary)
1567 len = get_non_default_template_args_count (args, flags);
1569 args = INNERMOST_TEMPLATE_ARGS (args);
1570 for (ix = 0; ix != len; ix++)
1572 tree arg = TREE_VEC_ELT (args, ix);
1574 /* Only print a comma if we know there is an argument coming. In
1575 the case of an empty template argument pack, no actual
1576 argument will be printed. */
1578 && (!ARGUMENT_PACK_P (arg)
1579 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1580 pp_separate_with_comma (cxx_pp);
1583 pp_string (cxx_pp, M_("<template parameter error>"));
1585 dump_template_argument (arg, flags);
1590 tree tpl = TI_TEMPLATE (info);
1591 tree parms = DECL_TEMPLATE_PARMS (tpl);
1594 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1595 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1597 for (ix = 0; ix != len; ix++)
1601 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1603 pp_string (cxx_pp, M_("<template parameter error>"));
1607 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1610 pp_separate_with_comma (cxx_pp);
1612 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1615 pp_cxx_end_template_argument_list (cxx_pp);
1618 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1619 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1622 dump_call_expr_args (tree t, int flags, bool skipfirst)
1625 call_expr_arg_iterator iter;
1627 pp_cxx_left_paren (cxx_pp);
1628 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1634 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1635 if (more_call_expr_args_p (&iter))
1636 pp_separate_with_comma (cxx_pp);
1639 pp_cxx_right_paren (cxx_pp);
1642 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1643 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1647 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1650 aggr_init_expr_arg_iterator iter;
1652 pp_cxx_left_paren (cxx_pp);
1653 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1659 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1660 if (more_aggr_init_expr_args_p (&iter))
1661 pp_separate_with_comma (cxx_pp);
1664 pp_cxx_right_paren (cxx_pp);
1667 /* Print out a list of initializers (subr of dump_expr). */
1670 dump_expr_list (tree l, int flags)
1674 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1677 pp_separate_with_comma (cxx_pp);
1681 /* Print out a vector of initializers (subr of dump_expr). */
1684 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1686 unsigned HOST_WIDE_INT idx;
1689 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1691 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1692 if (idx != VEC_length (constructor_elt, v) - 1)
1693 pp_separate_with_comma (cxx_pp);
1698 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1699 function. Resolve it to a close relative -- in the sense of static
1700 type -- variant being overridden. That is close to what was written in
1701 the source code. Subroutine of dump_expr. */
1704 resolve_virtual_fun_from_obj_type_ref (tree ref)
1706 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1707 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1708 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1711 fun = TREE_CHAIN (fun);
1712 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1713 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1719 /* Print out an expression E under control of FLAGS. */
1722 dump_expr (tree t, int flags)
1727 if (STATEMENT_CLASS_P (t))
1729 pp_cxx_ws_string (cxx_pp, M_("<statement>"));
1733 switch (TREE_CODE (t))
1741 case NAMESPACE_DECL:
1745 case IDENTIFIER_NODE:
1746 dump_decl (t, ((flags & ~(TFF_DECL_SPECIFIERS|TFF_RETURN_TYPE
1747 |TFF_TEMPLATE_HEADER))
1748 | TFF_NO_FUNCTION_ARGUMENTS));
1755 pp_constant (cxx_pp, t);
1759 /* While waiting for caret diagnostics, avoid printing
1760 __cxa_allocate_exception, __cxa_throw, and the like. */
1761 pp_cxx_ws_string (cxx_pp, M_("<throw-expression>"));
1765 pp_ampersand (cxx_pp);
1766 dump_type (PTRMEM_CST_CLASS (t), flags);
1767 pp_cxx_colon_colon (cxx_pp);
1768 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1772 pp_cxx_left_paren (cxx_pp);
1773 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1774 pp_separate_with_comma (cxx_pp);
1775 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1776 pp_cxx_right_paren (cxx_pp);
1780 pp_cxx_left_paren (cxx_pp);
1781 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1782 pp_string (cxx_pp, " ? ");
1783 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1784 pp_string (cxx_pp, " : ");
1785 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1786 pp_cxx_right_paren (cxx_pp);
1790 if (TREE_HAS_CONSTRUCTOR (t))
1792 pp_cxx_ws_string (cxx_pp, "new");
1793 pp_cxx_whitespace (cxx_pp);
1794 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1797 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1800 case AGGR_INIT_EXPR:
1802 tree fn = NULL_TREE;
1804 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1805 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1807 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1809 if (DECL_CONSTRUCTOR_P (fn))
1810 dump_type (DECL_CONTEXT (fn), flags);
1815 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1817 dump_aggr_init_expr_args (t, flags, true);
1822 tree fn = CALL_EXPR_FN (t);
1823 bool skipfirst = false;
1825 if (TREE_CODE (fn) == ADDR_EXPR)
1826 fn = TREE_OPERAND (fn, 0);
1828 /* Nobody is interested in seeing the guts of vcalls. */
1829 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1830 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1832 if (TREE_TYPE (fn) != NULL_TREE
1833 && NEXT_CODE (fn) == METHOD_TYPE
1834 && call_expr_nargs (t))
1836 tree ob = CALL_EXPR_ARG (t, 0);
1837 if (TREE_CODE (ob) == ADDR_EXPR)
1839 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1840 pp_cxx_dot (cxx_pp);
1842 else if (TREE_CODE (ob) != PARM_DECL
1843 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1845 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1846 pp_cxx_arrow (cxx_pp);
1850 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1851 dump_call_expr_args (t, flags, skipfirst);
1856 /* Note that this only works for G++ target exprs. If somebody
1857 builds a general TARGET_EXPR, there's no way to represent that
1858 it initializes anything other that the parameter slot for the
1859 default argument. Note we may have cleared out the first
1860 operand in expand_expr, so don't go killing ourselves. */
1861 if (TREE_OPERAND (t, 1))
1862 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1865 case POINTER_PLUS_EXPR:
1866 dump_binary_op ("+", t, flags);
1871 dump_binary_op (assignment_operator_name_info[(int)NOP_EXPR].name,
1878 case TRUNC_DIV_EXPR:
1879 case TRUNC_MOD_EXPR:
1887 case TRUTH_ANDIF_EXPR:
1888 case TRUTH_ORIF_EXPR:
1895 case EXACT_DIV_EXPR:
1896 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1900 case FLOOR_DIV_EXPR:
1901 case ROUND_DIV_EXPR:
1903 dump_binary_op ("/", t, flags);
1907 case FLOOR_MOD_EXPR:
1908 case ROUND_MOD_EXPR:
1909 dump_binary_op ("%", t, flags);
1914 tree ob = TREE_OPERAND (t, 0);
1915 if (TREE_CODE (ob) == INDIRECT_REF)
1917 ob = TREE_OPERAND (ob, 0);
1918 if (TREE_CODE (ob) != PARM_DECL
1920 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1922 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1923 if (TREE_CODE (TREE_TYPE (ob)) == REFERENCE_TYPE)
1924 pp_cxx_dot (cxx_pp);
1926 pp_cxx_arrow (cxx_pp);
1931 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1932 pp_cxx_dot (cxx_pp);
1934 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1939 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1940 pp_cxx_left_bracket (cxx_pp);
1941 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1942 pp_cxx_right_bracket (cxx_pp);
1945 case UNARY_PLUS_EXPR:
1946 dump_unary_op ("+", t, flags);
1950 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1951 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1952 /* An ADDR_EXPR can have reference type. In that case, we
1953 shouldn't print the `&' doing so indicates to the user
1954 that the expression has pointer type. */
1956 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1957 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1958 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1959 dump_unary_op ("&&", t, flags);
1961 dump_unary_op ("&", t, flags);
1965 if (TREE_HAS_CONSTRUCTOR (t))
1967 t = TREE_OPERAND (t, 0);
1968 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1969 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1970 dump_call_expr_args (t, flags, true);
1974 if (TREE_OPERAND (t,0) != NULL_TREE
1975 && TREE_TYPE (TREE_OPERAND (t, 0))
1976 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1977 dump_expr (TREE_OPERAND (t, 0), flags);
1979 dump_unary_op ("*", t, flags);
1984 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR
1985 && integer_zerop (TREE_OPERAND (t, 1)))
1986 dump_expr (TREE_OPERAND (TREE_OPERAND (t, 0), 0), flags);
1989 pp_cxx_star (cxx_pp);
1990 if (!integer_zerop (TREE_OPERAND (t, 1)))
1992 pp_cxx_left_paren (cxx_pp);
1993 if (!integer_onep (TYPE_SIZE_UNIT
1994 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))))))
1996 pp_cxx_left_paren (cxx_pp);
1997 dump_type (ptr_type_node, flags);
1998 pp_cxx_right_paren (cxx_pp);
2001 dump_expr (TREE_OPERAND (t, 0), flags);
2002 if (!integer_zerop (TREE_OPERAND (t, 1)))
2004 pp_cxx_ws_string (cxx_pp, "+");
2005 dump_expr (fold_convert (ssizetype, TREE_OPERAND (t, 1)), flags);
2006 pp_cxx_right_paren (cxx_pp);
2013 case TRUTH_NOT_EXPR:
2014 case PREDECREMENT_EXPR:
2015 case PREINCREMENT_EXPR:
2016 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
2019 case POSTDECREMENT_EXPR:
2020 case POSTINCREMENT_EXPR:
2021 pp_cxx_left_paren (cxx_pp);
2022 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2023 pp_cxx_ws_string (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
2024 pp_cxx_right_paren (cxx_pp);
2027 case NON_LVALUE_EXPR:
2028 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2029 should be another level of INDIRECT_REF so that I don't have to do
2031 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
2033 tree next = TREE_TYPE (TREE_TYPE (t));
2035 while (TREE_CODE (next) == POINTER_TYPE)
2036 next = TREE_TYPE (next);
2038 if (TREE_CODE (next) == FUNCTION_TYPE)
2040 if (flags & TFF_EXPR_IN_PARENS)
2041 pp_cxx_left_paren (cxx_pp);
2042 pp_cxx_star (cxx_pp);
2043 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2044 if (flags & TFF_EXPR_IN_PARENS)
2045 pp_cxx_right_paren (cxx_pp);
2048 /* Else fall through. */
2050 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2054 case VIEW_CONVERT_EXPR:
2056 tree op = TREE_OPERAND (t, 0);
2057 tree ttype = TREE_TYPE (t);
2058 tree optype = TREE_TYPE (op);
2060 if (TREE_CODE (ttype) != TREE_CODE (optype)
2061 && POINTER_TYPE_P (ttype)
2062 && POINTER_TYPE_P (optype)
2063 && same_type_p (TREE_TYPE (optype),
2066 if (TREE_CODE (ttype) == REFERENCE_TYPE)
2067 dump_unary_op ("*", t, flags);
2069 dump_unary_op ("&", t, flags);
2071 else if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
2073 /* It is a cast, but we cannot tell whether it is a
2074 reinterpret or static cast. Use the C style notation. */
2075 if (flags & TFF_EXPR_IN_PARENS)
2076 pp_cxx_left_paren (cxx_pp);
2077 pp_cxx_left_paren (cxx_pp);
2078 dump_type (TREE_TYPE (t), flags);
2079 pp_cxx_right_paren (cxx_pp);
2080 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
2081 if (flags & TFF_EXPR_IN_PARENS)
2082 pp_cxx_right_paren (cxx_pp);
2085 dump_expr (op, flags);
2090 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
2092 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
2094 if (integer_zerop (idx))
2096 /* A NULL pointer-to-member constant. */
2097 pp_cxx_left_paren (cxx_pp);
2098 pp_cxx_left_paren (cxx_pp);
2099 dump_type (TREE_TYPE (t), flags);
2100 pp_cxx_right_paren (cxx_pp);
2101 pp_character (cxx_pp, '0');
2102 pp_cxx_right_paren (cxx_pp);
2105 else if (host_integerp (idx, 0))
2108 unsigned HOST_WIDE_INT n;
2110 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
2111 t = TYPE_METHOD_BASETYPE (t);
2112 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
2114 n = tree_low_cst (idx, 0);
2116 /* Map vtable index back one, to allow for the null pointer to
2120 while (n > 0 && virtuals)
2123 virtuals = TREE_CHAIN (virtuals);
2127 dump_expr (BV_FN (virtuals),
2128 flags | TFF_EXPR_IN_PARENS);
2133 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
2135 dump_type (TREE_TYPE (t), 0);
2136 pp_cxx_left_paren (cxx_pp);
2137 pp_cxx_right_paren (cxx_pp);
2141 pp_cxx_left_brace (cxx_pp);
2142 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
2143 pp_cxx_right_brace (cxx_pp);
2150 tree ob = TREE_OPERAND (t, 0);
2151 if (is_dummy_object (ob))
2153 t = TREE_OPERAND (t, 1);
2154 if (TREE_CODE (t) == FUNCTION_DECL)
2156 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
2157 else if (BASELINK_P (t))
2158 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
2159 flags | TFF_EXPR_IN_PARENS);
2161 dump_decl (t, flags);
2165 if (TREE_CODE (ob) == INDIRECT_REF)
2167 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
2168 pp_cxx_arrow (cxx_pp);
2169 pp_cxx_star (cxx_pp);
2173 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
2174 pp_cxx_dot (cxx_pp);
2175 pp_cxx_star (cxx_pp);
2177 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2182 case TEMPLATE_PARM_INDEX:
2183 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
2187 if (TREE_OPERAND (t, 0) == NULL_TREE
2188 || TREE_CHAIN (TREE_OPERAND (t, 0)))
2190 dump_type (TREE_TYPE (t), flags);
2191 pp_cxx_left_paren (cxx_pp);
2192 dump_expr_list (TREE_OPERAND (t, 0), flags);
2193 pp_cxx_right_paren (cxx_pp);
2197 pp_cxx_left_paren (cxx_pp);
2198 dump_type (TREE_TYPE (t), flags);
2199 pp_cxx_right_paren (cxx_pp);
2200 pp_cxx_left_paren (cxx_pp);
2201 dump_expr_list (TREE_OPERAND (t, 0), flags);
2202 pp_cxx_right_paren (cxx_pp);
2206 case STATIC_CAST_EXPR:
2207 pp_cxx_ws_string (cxx_pp, "static_cast");
2209 case REINTERPRET_CAST_EXPR:
2210 pp_cxx_ws_string (cxx_pp, "reinterpret_cast");
2212 case CONST_CAST_EXPR:
2213 pp_cxx_ws_string (cxx_pp, "const_cast");
2215 case DYNAMIC_CAST_EXPR:
2216 pp_cxx_ws_string (cxx_pp, "dynamic_cast");
2218 pp_cxx_begin_template_argument_list (cxx_pp);
2219 dump_type (TREE_TYPE (t), flags);
2220 pp_cxx_end_template_argument_list (cxx_pp);
2221 pp_cxx_left_paren (cxx_pp);
2222 dump_expr (TREE_OPERAND (t, 0), flags);
2223 pp_cxx_right_paren (cxx_pp);
2227 dump_expr (TREE_OPERAND (t, 0), flags);
2228 pp_cxx_arrow (cxx_pp);
2233 if (TREE_CODE (t) == SIZEOF_EXPR)
2234 pp_cxx_ws_string (cxx_pp, "sizeof");
2237 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
2238 pp_cxx_ws_string (cxx_pp, "__alignof__");
2240 pp_cxx_whitespace (cxx_pp);
2241 pp_cxx_left_paren (cxx_pp);
2242 if (TYPE_P (TREE_OPERAND (t, 0)))
2243 dump_type (TREE_OPERAND (t, 0), flags);
2245 dump_expr (TREE_OPERAND (t, 0), flags);
2246 pp_cxx_right_paren (cxx_pp);
2249 case AT_ENCODE_EXPR:
2250 pp_cxx_ws_string (cxx_pp, "@encode");
2251 pp_cxx_whitespace (cxx_pp);
2252 pp_cxx_left_paren (cxx_pp);
2253 dump_type (TREE_OPERAND (t, 0), flags);
2254 pp_cxx_right_paren (cxx_pp);
2258 pp_cxx_ws_string (cxx_pp, "noexcept");
2259 pp_cxx_whitespace (cxx_pp);
2260 pp_cxx_left_paren (cxx_pp);
2261 dump_expr (TREE_OPERAND (t, 0), flags);
2262 pp_cxx_right_paren (cxx_pp);
2267 pp_cxx_ws_string (cxx_pp, operator_name_info[TREE_CODE (t)].name);
2268 pp_cxx_whitespace (cxx_pp);
2269 dump_expr (TREE_OPERAND (t, 0), flags);
2273 pp_string (cxx_pp, M_("<unparsed>"));
2276 case TRY_CATCH_EXPR:
2277 case WITH_CLEANUP_EXPR:
2278 case CLEANUP_POINT_EXPR:
2279 dump_expr (TREE_OPERAND (t, 0), flags);
2282 case PSEUDO_DTOR_EXPR:
2283 dump_expr (TREE_OPERAND (t, 2), flags);
2284 pp_cxx_dot (cxx_pp);
2285 dump_type (TREE_OPERAND (t, 0), flags);
2286 pp_cxx_colon_colon (cxx_pp);
2287 pp_cxx_complement (cxx_pp);
2288 dump_type (TREE_OPERAND (t, 1), flags);
2291 case TEMPLATE_ID_EXPR:
2292 dump_decl (t, flags);
2298 case STATEMENT_LIST:
2299 /* We don't yet have a way of dumping statements in a
2300 human-readable format. */
2301 pp_string (cxx_pp, "({...})");
2305 pp_string (cxx_pp, "while (1) { ");
2306 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2307 pp_cxx_right_brace (cxx_pp);
2311 pp_string (cxx_pp, "if (");
2312 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2313 pp_string (cxx_pp, ") break; ");
2317 dump_expr (BASELINK_FUNCTIONS (t), flags & ~TFF_EXPR_IN_PARENS);
2320 case EMPTY_CLASS_EXPR:
2321 dump_type (TREE_TYPE (t), flags);
2322 pp_cxx_left_paren (cxx_pp);
2323 pp_cxx_right_paren (cxx_pp);
2326 case NON_DEPENDENT_EXPR:
2327 dump_expr (TREE_OPERAND (t, 0), flags);
2330 case ARGUMENT_PACK_SELECT:
2331 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2343 pp_type_specifier_seq (cxx_pp, t);
2347 /* We get here when we want to print a dependent type as an
2348 id-expression, without any disambiguator decoration. */
2349 pp_id_expression (cxx_pp, t);
2352 case TEMPLATE_TYPE_PARM:
2353 case BOUND_TEMPLATE_TEMPLATE_PARM:
2354 dump_type (t, flags);
2358 pp_cxx_trait_expression (cxx_pp, t);
2362 pp_cxx_va_arg_expression (cxx_pp, t);
2366 pp_cxx_offsetof_expression (cxx_pp, t);
2370 dump_decl (t, flags);
2373 case EXPR_PACK_EXPANSION:
2380 case VEC_DELETE_EXPR:
2386 case UNORDERED_EXPR:
2396 case FIX_TRUNC_EXPR:
2398 pp_expression (cxx_pp, t);
2401 case TRUTH_AND_EXPR:
2403 case TRUTH_XOR_EXPR:
2404 if (flags & TFF_EXPR_IN_PARENS)
2405 pp_cxx_left_paren (cxx_pp);
2406 pp_expression (cxx_pp, t);
2407 if (flags & TFF_EXPR_IN_PARENS)
2408 pp_cxx_right_paren (cxx_pp);
2412 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2415 /* This list is incomplete, but should suffice for now.
2416 It is very important that `sorry' does not call
2417 `report_error_function'. That could cause an infinite loop. */
2419 pp_unsupported_tree (cxx_pp, t);
2420 /* fall through to ERROR_MARK... */
2422 pp_string (cxx_pp, M_("<expression error>"));
2428 dump_binary_op (const char *opstring, tree t, int flags)
2430 pp_cxx_left_paren (cxx_pp);
2431 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2432 pp_cxx_whitespace (cxx_pp);
2434 pp_cxx_ws_string (cxx_pp, opstring);
2436 pp_string (cxx_pp, M_("<unknown operator>"));
2437 pp_cxx_whitespace (cxx_pp);
2438 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2439 pp_cxx_right_paren (cxx_pp);
2443 dump_unary_op (const char *opstring, tree t, int flags)
2445 if (flags & TFF_EXPR_IN_PARENS)
2446 pp_cxx_left_paren (cxx_pp);
2447 pp_cxx_ws_string (cxx_pp, opstring);
2448 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2449 if (flags & TFF_EXPR_IN_PARENS)
2450 pp_cxx_right_paren (cxx_pp);
2454 reinit_cxx_pp (void)
2456 pp_clear_output_area (cxx_pp);
2457 pp_base (cxx_pp)->padding = pp_none;
2458 pp_indentation (cxx_pp) = 0;
2459 pp_needs_newline (cxx_pp) = false;
2460 cxx_pp->enclosing_scope = current_function_decl;
2464 /* Exported interface to stringifying types, exprs and decls under TFF_*
2468 type_as_string (tree typ, int flags)
2471 pp_translate_identifiers (cxx_pp) = false;
2472 dump_type (typ, flags);
2473 return pp_formatted_text (cxx_pp);
2477 type_as_string_translate (tree typ, int flags)
2480 dump_type (typ, flags);
2481 return pp_formatted_text (cxx_pp);
2485 expr_as_string (tree decl, int flags)
2488 pp_translate_identifiers (cxx_pp) = false;
2489 dump_expr (decl, flags);
2490 return pp_formatted_text (cxx_pp);
2494 decl_as_string (tree decl, int flags)
2497 pp_translate_identifiers (cxx_pp) = false;
2498 dump_decl (decl, flags);
2499 return pp_formatted_text (cxx_pp);
2503 decl_as_string_translate (tree decl, int flags)
2506 dump_decl (decl, flags);
2507 return pp_formatted_text (cxx_pp);
2510 /* Generate the three forms of printable names for cxx_printable_name. */
2513 lang_decl_name (tree decl, int v, bool translate)
2517 ? decl_as_string_translate (decl, TFF_DECL_SPECIFIERS)
2518 : decl_as_string (decl, TFF_DECL_SPECIFIERS));
2521 pp_translate_identifiers (cxx_pp) = translate;
2523 && (DECL_CLASS_SCOPE_P (decl)
2524 || (DECL_NAMESPACE_SCOPE_P (decl)
2525 && CP_DECL_CONTEXT (decl) != global_namespace)))
2527 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2528 pp_cxx_colon_colon (cxx_pp);
2531 if (TREE_CODE (decl) == FUNCTION_DECL)
2532 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2534 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2536 return pp_formatted_text (cxx_pp);
2539 /* Return the location of a tree passed to %+ formats. */
2542 location_of (tree t)
2544 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2545 t = DECL_CONTEXT (t);
2546 else if (TYPE_P (t))
2548 t = TYPE_MAIN_DECL (t);
2550 return input_location;
2552 else if (TREE_CODE (t) == OVERLOAD)
2553 t = OVL_FUNCTION (t);
2556 return DECL_SOURCE_LOCATION (t);
2557 return EXPR_LOC_OR_HERE (t);
2560 /* Now the interfaces from error et al to dump_type et al. Each takes an
2561 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2565 decl_to_string (tree decl, int verbose)
2569 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2570 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2571 flags = TFF_CLASS_KEY_OR_ENUM;
2573 flags |= TFF_DECL_SPECIFIERS;
2574 else if (TREE_CODE (decl) == FUNCTION_DECL)
2575 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2576 flags |= TFF_TEMPLATE_HEADER;
2579 dump_decl (decl, flags);
2580 return pp_formatted_text (cxx_pp);
2584 expr_to_string (tree decl)
2587 dump_expr (decl, 0);
2588 return pp_formatted_text (cxx_pp);
2592 fndecl_to_string (tree fndecl, int verbose)
2596 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2597 | TFF_TEMPLATE_HEADER;
2599 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2601 dump_decl (fndecl, flags);
2602 return pp_formatted_text (cxx_pp);
2607 code_to_string (enum tree_code c)
2609 return tree_code_name [c];
2613 language_to_string (enum languages c)
2620 case lang_cplusplus:
2632 /* Return the proper printed version of a parameter to a C++ function. */
2635 parm_to_string (int p)
2639 pp_string (cxx_pp, "'this'");
2641 pp_decimal_int (cxx_pp, p + 1);
2642 return pp_formatted_text (cxx_pp);
2646 op_to_string (enum tree_code p)
2648 tree id = operator_name_info[(int) p].identifier;
2649 return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
2653 type_to_string (tree typ, int verbose)
2657 flags |= TFF_CLASS_KEY_OR_ENUM;
2658 flags |= TFF_TEMPLATE_HEADER;
2661 dump_type (typ, flags);
2662 /* If we're printing a type that involves typedefs, also print the
2663 stripped version. But sometimes the stripped version looks
2664 exactly the same, so we don't want it after all. To avoid printing
2665 it in that case, we play ugly obstack games. */
2666 if (typ && TYPE_P (typ) && typ != TYPE_CANONICAL (typ)
2667 && !uses_template_parms (typ))
2669 int aka_start; char *p;
2670 struct obstack *ob = pp_base (cxx_pp)->buffer->obstack;
2671 /* Remember the end of the initial dump. */
2672 int len = obstack_object_size (ob);
2673 tree aka = strip_typedefs (typ);
2674 pp_string (cxx_pp, " {aka");
2675 pp_cxx_whitespace (cxx_pp);
2676 /* And remember the start of the aka dump. */
2677 aka_start = obstack_object_size (ob);
2678 dump_type (aka, flags);
2679 pp_character (cxx_pp, '}');
2680 p = (char*)obstack_base (ob);
2681 /* If they are identical, cut off the aka with a NUL. */
2682 if (memcmp (p, p+aka_start, len) == 0)
2685 return pp_formatted_text (cxx_pp);
2689 assop_to_string (enum tree_code p)
2691 tree id = assignment_operator_name_info[(int) p].identifier;
2692 return id ? IDENTIFIER_POINTER (id) : M_("{unknown}");
2696 args_to_string (tree p, int verbose)
2700 flags |= TFF_CLASS_KEY_OR_ENUM;
2705 if (TYPE_P (TREE_VALUE (p)))
2706 return type_as_string_translate (p, flags);
2709 for (; p; p = TREE_CHAIN (p))
2711 if (TREE_VALUE (p) == null_node)
2712 pp_cxx_ws_string (cxx_pp, "NULL");
2714 dump_type (error_type (TREE_VALUE (p)), flags);
2716 pp_separate_with_comma (cxx_pp);
2718 return pp_formatted_text (cxx_pp);
2721 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
2722 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
2726 subst_to_string (tree p)
2728 tree decl = TREE_PURPOSE (p);
2729 tree targs = TREE_VALUE (p);
2730 tree tparms = DECL_TEMPLATE_PARMS (decl);
2731 int flags = TFF_DECL_SPECIFIERS|TFF_TEMPLATE_HEADER;
2737 dump_template_decl (TREE_PURPOSE (p), flags);
2738 pp_cxx_whitespace (cxx_pp);
2739 pp_cxx_left_bracket (cxx_pp);
2740 pp_cxx_ws_string (cxx_pp, M_("with"));
2741 pp_cxx_whitespace (cxx_pp);
2742 dump_template_bindings (tparms, targs, NULL);
2743 pp_cxx_right_bracket (cxx_pp);
2744 return pp_formatted_text (cxx_pp);
2748 cv_to_string (tree p, int v)
2751 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2752 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2753 return pp_formatted_text (cxx_pp);
2756 /* Langhook for print_error_function. */
2758 cxx_print_error_function (diagnostic_context *context, const char *file,
2759 diagnostic_info *diagnostic)
2761 lhd_print_error_function (context, file, diagnostic);
2762 pp_base_set_prefix (context->printer, file);
2763 maybe_print_instantiation_context (context);
2767 cp_diagnostic_starter (diagnostic_context *context,
2768 diagnostic_info *diagnostic)
2770 diagnostic_report_current_module (context);
2771 cp_print_error_function (context, diagnostic);
2772 maybe_print_instantiation_context (context);
2773 maybe_print_constexpr_context (context);
2774 pp_base_set_prefix (context->printer, diagnostic_build_prefix (context,
2779 cp_diagnostic_finalizer (diagnostic_context *context,
2780 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2782 pp_base_destroy_prefix (context->printer);
2785 /* Print current function onto BUFFER, in the process of reporting
2786 a diagnostic message. Called from cp_diagnostic_starter. */
2788 cp_print_error_function (diagnostic_context *context,
2789 diagnostic_info *diagnostic)
2791 /* If we are in an instantiation context, current_function_decl is likely
2792 to be wrong, so just rely on print_instantiation_full_context. */
2793 if (current_instantiation ())
2795 if (diagnostic_last_function_changed (context, diagnostic))
2797 const char *old_prefix = context->printer->prefix;
2798 const char *file = LOCATION_FILE (diagnostic->location);
2799 tree abstract_origin = diagnostic_abstract_origin (diagnostic);
2800 char *new_prefix = (file && abstract_origin == NULL)
2801 ? file_name_as_prefix (file) : NULL;
2803 pp_base_set_prefix (context->printer, new_prefix);
2805 if (current_function_decl == NULL)
2806 pp_base_string (context->printer, _("At global scope:"));
2811 if (abstract_origin)
2813 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2814 while (TREE_CODE (ao) == BLOCK
2815 && BLOCK_ABSTRACT_ORIGIN (ao)
2816 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2817 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2818 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2822 fndecl = current_function_decl;
2824 pp_printf (context->printer, function_category (fndecl),
2825 cxx_printable_name_translate (fndecl, 2));
2827 while (abstract_origin)
2830 tree block = abstract_origin;
2832 locus = &BLOCK_SOURCE_LOCATION (block);
2834 block = BLOCK_SUPERCONTEXT (block);
2835 while (block && TREE_CODE (block) == BLOCK
2836 && BLOCK_ABSTRACT_ORIGIN (block))
2838 ao = BLOCK_ABSTRACT_ORIGIN (block);
2840 while (TREE_CODE (ao) == BLOCK
2841 && BLOCK_ABSTRACT_ORIGIN (ao)
2842 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2843 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2845 if (TREE_CODE (ao) == FUNCTION_DECL)
2850 else if (TREE_CODE (ao) != BLOCK)
2853 block = BLOCK_SUPERCONTEXT (block);
2856 abstract_origin = block;
2859 while (block && TREE_CODE (block) == BLOCK)
2860 block = BLOCK_SUPERCONTEXT (block);
2862 if (block && TREE_CODE (block) == FUNCTION_DECL)
2864 abstract_origin = NULL;
2868 expanded_location s = expand_location (*locus);
2869 pp_base_character (context->printer, ',');
2870 pp_base_newline (context->printer);
2873 if (context->show_column && s.column != 0)
2874 pp_printf (context->printer,
2875 _(" inlined from %qs at %s:%d:%d"),
2876 cxx_printable_name_translate (fndecl, 2),
2877 s.file, s.line, s.column);
2879 pp_printf (context->printer,
2880 _(" inlined from %qs at %s:%d"),
2881 cxx_printable_name_translate (fndecl, 2),
2886 pp_printf (context->printer, _(" inlined from %qs"),
2887 cxx_printable_name_translate (fndecl, 2));
2890 pp_base_character (context->printer, ':');
2892 pp_base_newline (context->printer);
2894 diagnostic_set_last_function (context, diagnostic);
2895 pp_base_destroy_prefix (context->printer);
2896 context->printer->prefix = old_prefix;
2900 /* Returns a description of FUNCTION using standard terminology. The
2901 result is a format string of the form "In CATEGORY %qs". */
2903 function_category (tree fn)
2905 /* We can get called from the middle-end for diagnostics of function
2906 clones. Make sure we have language specific information before
2907 dereferencing it. */
2908 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn))
2909 && DECL_FUNCTION_MEMBER_P (fn))
2911 if (DECL_STATIC_FUNCTION_P (fn))
2912 return _("In static member function %qs");
2913 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2914 return _("In copy constructor %qs");
2915 else if (DECL_CONSTRUCTOR_P (fn))
2916 return _("In constructor %qs");
2917 else if (DECL_DESTRUCTOR_P (fn))
2918 return _("In destructor %qs");
2919 else if (LAMBDA_FUNCTION_P (fn))
2920 return _("In lambda function");
2922 return _("In member function %qs");
2925 return _("In function %qs");
2928 /* Report the full context of a current template instantiation,
2931 print_instantiation_full_context (diagnostic_context *context)
2933 struct tinst_level *p = current_instantiation ();
2934 location_t location = input_location;
2938 pp_verbatim (context->printer,
2939 TREE_CODE (p->decl) == TREE_LIST
2940 ? _("%s: In substitution of %qS:\n")
2941 : _("%s: In instantiation of %q#D:\n"),
2942 LOCATION_FILE (location),
2945 location = p->locus;
2949 print_instantiation_partial_context (context, p, location);
2952 /* Helper function of print_instantiation_partial_context() that
2953 prints a single line of instantiation context. */
2956 print_instantiation_partial_context_line (diagnostic_context *context,
2957 const struct tinst_level *t,
2958 location_t loc, bool recursive_p)
2960 expanded_location xloc;
2961 xloc = expand_location (loc);
2963 if (context->show_column)
2964 pp_verbatim (context->printer, _("%s:%d:%d: "),
2965 xloc.file, xloc.line, xloc.column);
2967 pp_verbatim (context->printer, _("%s:%d: "),
2968 xloc.file, xloc.line);
2972 if (TREE_CODE (t->decl) == TREE_LIST)
2973 pp_verbatim (context->printer,
2975 ? _("recursively required by substitution of %qS\n")
2976 : _("required by substitution of %qS\n"),
2979 pp_verbatim (context->printer,
2981 ? _("recursively required from %q#D\n")
2982 : _("required from %q#D\n"),
2987 pp_verbatim (context->printer,
2989 ? _("recursively required from here")
2990 : _("required from here"));
2994 /* Same as print_instantiation_full_context but less verbose. */
2997 print_instantiation_partial_context (diagnostic_context *context,
2998 struct tinst_level *t0, location_t loc)
3000 struct tinst_level *t;
3003 location_t prev_loc = loc;
3005 for (t = t0; t != NULL; t = t->next)
3006 if (prev_loc != t->locus)
3008 prev_loc = t->locus;
3016 int skip = n_total - 10;
3017 for (n = 0; n < 5; n++)
3019 gcc_assert (t != NULL);
3020 if (loc != t->locus)
3021 print_instantiation_partial_context_line (context, t, loc,
3022 /*recursive_p=*/false);
3026 if (t != NULL && skip > 1)
3028 expanded_location xloc;
3029 xloc = expand_location (loc);
3030 if (context->show_column)
3031 pp_verbatim (context->printer,
3032 _("%s:%d:%d: [ skipping %d instantiation contexts ]\n"),
3033 xloc.file, xloc.line, xloc.column, skip);
3035 pp_verbatim (context->printer,
3036 _("%s:%d: [ skipping %d instantiation contexts ]\n"),
3037 xloc.file, xloc.line, skip);
3042 } while (t != NULL && --skip > 0);
3048 while (t->next != NULL && t->locus == t->next->locus)
3053 print_instantiation_partial_context_line (context, t, loc,
3058 print_instantiation_partial_context_line (context, NULL, loc,
3059 /*recursive_p=*/false);
3060 pp_base_newline (context->printer);
3063 /* Called from cp_thing to print the template context for an error. */
3065 maybe_print_instantiation_context (diagnostic_context *context)
3067 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3070 record_last_problematic_instantiation ();
3071 print_instantiation_full_context (context);
3074 /* Report the bare minimum context of a template instantiation. */
3076 print_instantiation_context (void)
3078 print_instantiation_partial_context
3079 (global_dc, current_instantiation (), input_location);
3080 diagnostic_flush_buffer (global_dc);
3083 /* Report what constexpr call(s) we're trying to expand, if any. */
3086 maybe_print_constexpr_context (diagnostic_context *context)
3088 VEC(tree,heap) *call_stack = cx_error_context ();
3092 FOR_EACH_VEC_ELT (tree, call_stack, ix, t)
3094 expanded_location xloc = expand_location (EXPR_LOCATION (t));
3095 const char *s = expr_as_string (t, 0);
3096 if (context->show_column)
3097 pp_verbatim (context->printer,
3098 _("%s:%d:%d: in constexpr expansion of %qs"),
3099 xloc.file, xloc.line, xloc.column, s);
3101 pp_verbatim (context->printer,
3102 _("%s:%d: in constexpr expansion of %qs"),
3103 xloc.file, xloc.line, s);
3104 pp_base_newline (context->printer);
3108 /* Called from output_format -- during diagnostic message processing --
3109 to handle C++ specific format specifier with the following meanings:
3110 %A function argument-list.
3114 %F function declaration.
3115 %L language as used in extern "lang".
3117 %P function parameter whose position is indicated by an integer.
3118 %Q assignment operator.
3122 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
3123 int precision, bool wide, bool set_locus, bool verbose)
3127 #define next_tree (t = va_arg (*text->args_ptr, tree))
3128 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3129 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3130 #define next_int va_arg (*text->args_ptr, int)
3132 if (precision != 0 || wide)
3135 if (text->locus == NULL)
3140 case 'A': result = args_to_string (next_tree, verbose); break;
3141 case 'C': result = code_to_string (next_tcode); break;
3144 tree temp = next_tree;
3146 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
3148 temp = DECL_DEBUG_EXPR (temp);
3151 result = expr_to_string (temp);
3155 result = decl_to_string (temp, verbose);
3158 case 'E': result = expr_to_string (next_tree); break;
3159 case 'F': result = fndecl_to_string (next_tree, verbose); break;
3160 case 'L': result = language_to_string (next_lang); break;
3161 case 'O': result = op_to_string (next_tcode); break;
3162 case 'P': result = parm_to_string (next_int); break;
3163 case 'Q': result = assop_to_string (next_tcode); break;
3164 case 'S': result = subst_to_string (next_tree); break;
3165 case 'T': result = type_to_string (next_tree, verbose); break;
3166 case 'V': result = cv_to_string (next_tree, verbose); break;
3169 percent_K_format (text);
3176 pp_base_string (pp, result);
3177 if (set_locus && t != NULL)
3178 *text->locus = location_of (t);
3186 /* Warn about the use of C++0x features when appropriate. */
3188 maybe_warn_cpp0x (cpp0x_warn_str str)
3190 if ((cxx_dialect == cxx98) && !in_system_header)
3191 /* We really want to suppress this warning in system headers,
3192 because libstdc++ uses variadic templates even when we aren't
3196 case CPP0X_INITIALIZER_LISTS:
3197 pedwarn (input_location, 0,
3198 "extended initializer lists "
3199 "only available with -std=c++0x or -std=gnu++0x");
3201 case CPP0X_EXPLICIT_CONVERSION:
3202 pedwarn (input_location, 0,
3203 "explicit conversion operators "
3204 "only available with -std=c++0x or -std=gnu++0x");
3206 case CPP0X_VARIADIC_TEMPLATES:
3207 pedwarn (input_location, 0,
3208 "variadic templates "
3209 "only available with -std=c++0x or -std=gnu++0x");
3211 case CPP0X_LAMBDA_EXPR:
3212 pedwarn (input_location, 0,
3213 "lambda expressions "
3214 "only available with -std=c++0x or -std=gnu++0x");
3217 pedwarn (input_location, 0,
3218 "C++0x auto only available with -std=c++0x or -std=gnu++0x");
3220 case CPP0X_SCOPED_ENUMS:
3221 pedwarn (input_location, 0,
3222 "scoped enums only available with -std=c++0x or -std=gnu++0x");
3224 case CPP0X_DEFAULTED_DELETED:
3225 pedwarn (input_location, 0,
3226 "defaulted and deleted functions "
3227 "only available with -std=c++0x or -std=gnu++0x");
3229 case CPP0X_INLINE_NAMESPACES:
3230 pedwarn (input_location, OPT_pedantic,
3231 "inline namespaces "
3232 "only available with -std=c++0x or -std=gnu++0x");
3234 case CPP0X_OVERRIDE_CONTROLS:
3235 pedwarn (input_location, 0,
3236 "override controls (override/final) "
3237 "only available with -std=c++0x or -std=gnu++0x");
3240 pedwarn (input_location, 0,
3241 "non-static data member initializers "
3242 "only available with -std=c++0x or -std=gnu++0x");
3249 /* Warn about the use of variadic templates when appropriate. */
3251 maybe_warn_variadic_templates (void)
3253 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES);
3257 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3258 option OPT with text GMSGID. Use this function to report
3259 diagnostics for constructs that are invalid C++98, but valid
3262 pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...)
3264 diagnostic_info diagnostic;
3267 va_start (ap, gmsgid);
3268 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
3269 (cxx_dialect == cxx98) ? DK_PEDWARN : DK_WARNING);
3270 diagnostic.option_index = opt;
3272 return report_diagnostic (&diagnostic);
3275 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3276 we found when we tried to do the lookup. LOCATION is the location of
3277 the NAME identifier. */
3280 qualified_name_lookup_error (tree scope, tree name,
3281 tree decl, location_t location)
3283 if (scope == error_mark_node)
3284 ; /* We already complained. */
3285 else if (TYPE_P (scope))
3287 if (!COMPLETE_TYPE_P (scope))
3288 error_at (location, "incomplete type %qT used in nested name specifier",
3290 else if (TREE_CODE (decl) == TREE_LIST)
3292 error_at (location, "reference to %<%T::%D%> is ambiguous",
3294 print_candidates (decl);
3297 error_at (location, "%qD is not a member of %qT", name, scope);
3299 else if (scope != global_namespace)
3301 error_at (location, "%qD is not a member of %qD", name, scope);
3302 suggest_alternatives_for (location, name);
3306 error_at (location, "%<::%D%> has not been declared", name);
3307 suggest_alternatives_for (location, name);