1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
25 #include "stringpool.h"
28 #include "diagnostic.h"
29 #include "tree-diagnostic.h"
30 #include "langhooks-def.h"
32 #include "cxx-pretty-print.h"
33 #include "tree-pretty-print.h"
34 #include "c-family/c-objc.h"
37 #include <new> // For placement-new.
39 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
40 #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';')
42 /* cxx_pp is a C++ front-end-specific pretty printer: this is where we
43 dump C++ ASTs as strings. It is mostly used only by the various
44 tree -> string functions that are occasionally called from the
45 debugger or by the front-end for things like
46 __PRETTY_FUNCTION__. */
47 static cxx_pretty_printer scratch_pretty_printer
;
48 static cxx_pretty_printer
* cxx_pp
= &scratch_pretty_printer
;
50 /* Translate if being used for diagnostics, but not for dump files or
52 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
54 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
56 static const char *args_to_string (tree
, int);
57 static const char *assop_to_string (enum tree_code
);
58 static const char *code_to_string (enum tree_code
);
59 static const char *cv_to_string (tree
, int);
60 static const char *decl_to_string (tree
, int);
61 static const char *expr_to_string (tree
);
62 static const char *fndecl_to_string (tree
, int);
63 static const char *op_to_string (enum tree_code
);
64 static const char *parm_to_string (int);
65 static const char *type_to_string (tree
, int);
67 static void dump_alias_template_specialization (cxx_pretty_printer
*, tree
, int);
68 static void dump_type (cxx_pretty_printer
*, tree
, int);
69 static void dump_typename (cxx_pretty_printer
*, tree
, int);
70 static void dump_simple_decl (cxx_pretty_printer
*, tree
, tree
, int);
71 static void dump_decl (cxx_pretty_printer
*, tree
, int);
72 static void dump_template_decl (cxx_pretty_printer
*, tree
, int);
73 static void dump_function_decl (cxx_pretty_printer
*, tree
, int);
74 static void dump_expr (cxx_pretty_printer
*, tree
, int);
75 static void dump_unary_op (cxx_pretty_printer
*, const char *, tree
, int);
76 static void dump_binary_op (cxx_pretty_printer
*, const char *, tree
, int);
77 static void dump_aggr_type (cxx_pretty_printer
*, tree
, int);
78 static void dump_type_prefix (cxx_pretty_printer
*, tree
, int);
79 static void dump_type_suffix (cxx_pretty_printer
*, tree
, int);
80 static void dump_function_name (cxx_pretty_printer
*, tree
, int);
81 static void dump_call_expr_args (cxx_pretty_printer
*, tree
, int, bool);
82 static void dump_aggr_init_expr_args (cxx_pretty_printer
*, tree
, int, bool);
83 static void dump_expr_list (cxx_pretty_printer
*, tree
, int);
84 static void dump_global_iord (cxx_pretty_printer
*, tree
);
85 static void dump_parameters (cxx_pretty_printer
*, tree
, int);
86 static void dump_ref_qualifier (cxx_pretty_printer
*, tree
, int);
87 static void dump_exception_spec (cxx_pretty_printer
*, tree
, int);
88 static void dump_template_argument (cxx_pretty_printer
*, tree
, int);
89 static void dump_template_argument_list (cxx_pretty_printer
*, tree
, int);
90 static void dump_template_parameter (cxx_pretty_printer
*, tree
, int);
91 static void dump_template_bindings (cxx_pretty_printer
*, tree
, tree
,
93 static void dump_scope (cxx_pretty_printer
*, tree
, int);
94 static void dump_template_parms (cxx_pretty_printer
*, tree
, int, int);
95 static int get_non_default_template_args_count (tree
, int);
96 static const char *function_category (tree
);
97 static void maybe_print_constexpr_context (diagnostic_context
*);
98 static void maybe_print_instantiation_context (diagnostic_context
*);
99 static void print_instantiation_full_context (diagnostic_context
*);
100 static void print_instantiation_partial_context (diagnostic_context
*,
101 struct tinst_level
*,
103 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
104 static void cp_print_error_function (diagnostic_context
*, diagnostic_info
*);
106 static bool cp_printer (pretty_printer
*, text_info
*, const char *,
107 int, bool, bool, bool);
109 /* CONTEXT->printer is a basic pretty printer that was constructed
110 presumably by diagnostic_initialize(), called early in the
111 compiler's initialization process (in general_init) Before the FE
112 is initialized. This (C++) FE-specific diagnostic initializer is
113 thus replacing the basic pretty printer with one that has C++-aware
117 cxx_initialize_diagnostics (diagnostic_context
*context
)
119 pretty_printer
*base
= context
->printer
;
120 cxx_pretty_printer
*pp
= XNEW (cxx_pretty_printer
);
121 context
->printer
= new (pp
) cxx_pretty_printer ();
123 /* It is safe to free this object because it was previously XNEW()'d. */
124 base
->~pretty_printer ();
127 c_common_diagnostics_set_defaults (context
);
128 diagnostic_starter (context
) = cp_diagnostic_starter
;
129 /* diagnostic_finalizer is already c_diagnostic_finalizer. */
130 diagnostic_format_decoder (context
) = cp_printer
;
133 /* Initialize the global cxx_pp that is used as the memory store for
134 the string representation of C++ AST. See the description of
140 new (cxx_pp
) cxx_pretty_printer ();
143 /* Dump a scope, if deemed necessary. */
146 dump_scope (cxx_pretty_printer
*pp
, tree scope
, int flags
)
148 int f
= flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
);
150 if (scope
== NULL_TREE
)
153 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
155 if (scope
!= global_namespace
)
157 dump_decl (pp
, scope
, f
);
158 pp_cxx_colon_colon (pp
);
161 else if (AGGREGATE_TYPE_P (scope
))
163 dump_type (pp
, scope
, f
);
164 pp_cxx_colon_colon (pp
);
166 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
168 dump_function_decl (pp
, scope
, f
);
169 pp_cxx_colon_colon (pp
);
173 /* Dump the template ARGument under control of FLAGS. */
176 dump_template_argument (cxx_pretty_printer
*pp
, tree arg
, int flags
)
178 if (ARGUMENT_PACK_P (arg
))
179 dump_template_argument_list (pp
, ARGUMENT_PACK_ARGS (arg
),
180 /* No default args in argument packs. */
181 flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
182 else if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
183 dump_type (pp
, arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
186 if (TREE_CODE (arg
) == TREE_LIST
)
187 arg
= TREE_VALUE (arg
);
189 dump_expr (pp
, arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
193 /* Count the number of template arguments ARGS whose value does not
194 match the (optional) default template parameter in PARAMS */
197 get_non_default_template_args_count (tree args
, int flags
)
199 int n
= TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args
));
201 if (/* We use this flag when generating debug information. We don't
202 want to expand templates at this point, for this may generate
203 new decls, which gets decl counts out of sync, which may in
204 turn cause codegen differences between compilations with and
206 (flags
& TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
) != 0
207 || !flag_pretty_templates
)
210 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args
));
213 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
217 dump_template_argument_list (cxx_pretty_printer
*pp
, tree args
, int flags
)
219 int n
= get_non_default_template_args_count (args
, flags
);
223 for (i
= 0; i
< n
; ++i
)
225 tree arg
= TREE_VEC_ELT (args
, i
);
227 /* Only print a comma if we know there is an argument coming. In
228 the case of an empty template argument pack, no actual
229 argument will be printed. */
231 && (!ARGUMENT_PACK_P (arg
)
232 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
233 pp_separate_with_comma (pp
);
235 dump_template_argument (pp
, arg
, flags
);
240 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
243 dump_template_parameter (cxx_pretty_printer
*pp
, tree parm
, int flags
)
248 if (parm
== error_mark_node
)
251 p
= TREE_VALUE (parm
);
252 a
= TREE_PURPOSE (parm
);
254 if (TREE_CODE (p
) == TYPE_DECL
)
256 if (flags
& TFF_DECL_SPECIFIERS
)
258 pp_cxx_ws_string (pp
, "class");
259 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p
)))
260 pp_cxx_ws_string (pp
, "...");
262 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
264 else if (DECL_NAME (p
))
265 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
267 pp_cxx_canonical_template_parameter (pp
, TREE_TYPE (p
));
270 dump_decl (pp
, p
, flags
| TFF_DECL_SPECIFIERS
);
272 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
274 pp_cxx_whitespace (pp
);
276 pp_cxx_whitespace (pp
);
277 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
278 dump_type (pp
, a
, flags
& ~TFF_CHASE_TYPEDEF
);
280 dump_expr (pp
, a
, flags
| TFF_EXPR_IN_PARENS
);
284 /* Dump, under control of FLAGS, a template-parameter-list binding.
285 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
289 dump_template_bindings (cxx_pretty_printer
*pp
, tree parms
, tree args
,
290 vec
<tree
, va_gc
> *typenames
)
292 bool need_semicolon
= false;
298 tree p
= TREE_VALUE (parms
);
299 int lvl
= TMPL_PARMS_DEPTH (parms
);
302 tree lvl_args
= NULL_TREE
;
304 /* Don't crash if we had an invalid argument list. */
305 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
306 lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
308 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
310 tree arg
= NULL_TREE
;
312 /* Don't crash if we had an invalid argument list. */
313 if (lvl_args
&& NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
314 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
317 pp_separate_with_semicolon (pp
);
318 dump_template_parameter (pp
, TREE_VEC_ELT (p
, i
),
319 TFF_PLAIN_IDENTIFIER
);
320 pp_cxx_whitespace (pp
);
322 pp_cxx_whitespace (pp
);
325 if (ARGUMENT_PACK_P (arg
))
326 pp_cxx_left_brace (pp
);
327 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
328 if (ARGUMENT_PACK_P (arg
))
329 pp_cxx_right_brace (pp
);
332 pp_string (pp
, M_("<missing>"));
335 need_semicolon
= true;
338 parms
= TREE_CHAIN (parms
);
341 /* Don't bother with typenames for a partial instantiation. */
342 if (vec_safe_is_empty (typenames
) || uses_template_parms (args
))
345 /* Don't try to print typenames when we're processing a clone. */
346 if (current_function_decl
347 && !DECL_LANG_SPECIFIC (current_function_decl
))
350 FOR_EACH_VEC_SAFE_ELT (typenames
, i
, t
)
353 pp_separate_with_semicolon (pp
);
354 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
355 pp_cxx_whitespace (pp
);
357 pp_cxx_whitespace (pp
);
358 push_deferring_access_checks (dk_no_check
);
359 t
= tsubst (t
, args
, tf_none
, NULL_TREE
);
360 pop_deferring_access_checks ();
361 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
362 pp_simple_type_specifier doesn't know about it. */
363 t
= strip_typedefs (t
);
364 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
368 /* Dump a human-readable equivalent of the alias template
369 specialization of T. */
372 dump_alias_template_specialization (cxx_pretty_printer
*pp
, tree t
, int flags
)
376 gcc_assert (alias_template_specialization_p (t
));
378 if (!(flags
& TFF_UNQUALIFIED_NAME
))
379 dump_scope (pp
, CP_DECL_CONTEXT (TYPE_NAME (t
)), flags
);
380 name
= TYPE_IDENTIFIER (t
);
381 pp_cxx_tree_identifier (pp
, name
);
382 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
384 flags
& ~TFF_TEMPLATE_HEADER
);
387 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
391 dump_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
396 /* Don't print e.g. "struct mytypedef". */
397 if (TYPE_P (t
) && typedef_variant_p (t
))
399 tree decl
= TYPE_NAME (t
);
400 if ((flags
& TFF_CHASE_TYPEDEF
)
401 || DECL_SELF_REFERENCE_P (decl
)
402 || (!flag_pretty_templates
403 && DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)))
404 t
= strip_typedefs (t
);
405 else if (alias_template_specialization_p (t
))
407 dump_alias_template_specialization (pp
, t
, flags
);
410 else if (same_type_p (t
, TREE_TYPE (decl
)))
414 pp_cxx_cv_qualifier_seq (pp
, t
);
415 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
420 if (TYPE_PTRMEMFUNC_P (t
))
423 switch (TREE_CODE (t
))
426 if (t
== init_list_type_node
)
427 pp_string (pp
, M_("<brace-enclosed initializer list>"));
428 else if (t
== unknown_type_node
)
429 pp_string (pp
, M_("<unresolved overloaded function type>"));
432 pp_cxx_cv_qualifier_seq (pp
, t
);
433 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
438 /* A list of function parms. */
439 dump_parameters (pp
, t
, flags
);
442 case IDENTIFIER_NODE
:
443 pp_cxx_tree_identifier (pp
, t
);
447 dump_type (pp
, BINFO_TYPE (t
), flags
);
453 dump_aggr_type (pp
, t
, flags
);
457 if (flags
& TFF_CHASE_TYPEDEF
)
459 dump_type (pp
, DECL_ORIGINAL_TYPE (t
)
460 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
463 /* Else fall through. */
467 dump_decl (pp
, t
, flags
& ~TFF_DECL_SPECIFIERS
);
476 case FIXED_POINT_TYPE
:
477 pp_type_specifier_seq (pp
, t
);
480 case TEMPLATE_TEMPLATE_PARM
:
481 /* For parameters inside template signature. */
482 if (TYPE_IDENTIFIER (t
))
483 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
485 pp_cxx_canonical_template_parameter (pp
, t
);
488 case BOUND_TEMPLATE_TEMPLATE_PARM
:
490 tree args
= TYPE_TI_ARGS (t
);
491 pp_cxx_cv_qualifier_seq (pp
, t
);
492 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
493 pp_cxx_begin_template_argument_list (pp
);
494 dump_template_argument_list (pp
, args
, flags
);
495 pp_cxx_end_template_argument_list (pp
);
499 case TEMPLATE_TYPE_PARM
:
500 pp_cxx_cv_qualifier_seq (pp
, t
);
501 if (TYPE_IDENTIFIER (t
))
502 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
504 pp_cxx_canonical_template_parameter
505 (pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
508 /* This is not always necessary for pointers and such, but doing this
509 reduces code size. */
518 dump_type_prefix (pp
, t
, flags
);
519 dump_type_suffix (pp
, t
, flags
);
523 if (! (flags
& TFF_CHASE_TYPEDEF
)
524 && DECL_ORIGINAL_TYPE (TYPE_NAME (t
)))
526 dump_decl (pp
, TYPE_NAME (t
), TFF_PLAIN_IDENTIFIER
);
529 pp_cxx_cv_qualifier_seq (pp
, t
);
530 pp_cxx_ws_string (pp
,
531 TYPENAME_IS_ENUM_P (t
) ? "enum"
532 : TYPENAME_IS_CLASS_P (t
) ? "class"
534 dump_typename (pp
, t
, flags
);
537 case UNBOUND_CLASS_TEMPLATE
:
538 if (! (flags
& TFF_UNQUALIFIED_NAME
))
540 dump_type (pp
, TYPE_CONTEXT (t
), flags
);
541 pp_cxx_colon_colon (pp
);
543 pp_cxx_ws_string (pp
, "template");
544 dump_type (pp
, TYPE_IDENTIFIER (t
), flags
);
548 pp_cxx_ws_string (pp
, "__typeof__");
549 pp_cxx_whitespace (pp
);
550 pp_cxx_left_paren (pp
);
551 dump_expr (pp
, TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
552 pp_cxx_right_paren (pp
);
555 case UNDERLYING_TYPE
:
556 pp_cxx_ws_string (pp
, "__underlying_type");
557 pp_cxx_whitespace (pp
);
558 pp_cxx_left_paren (pp
);
559 dump_expr (pp
, UNDERLYING_TYPE_TYPE (t
), flags
& ~TFF_EXPR_IN_PARENS
);
560 pp_cxx_right_paren (pp
);
563 case TYPE_PACK_EXPANSION
:
564 dump_type (pp
, PACK_EXPANSION_PATTERN (t
), flags
);
565 pp_cxx_ws_string (pp
, "...");
568 case TYPE_ARGUMENT_PACK
:
569 dump_template_argument (pp
, t
, flags
);
573 pp_cxx_ws_string (pp
, "decltype");
574 pp_cxx_whitespace (pp
);
575 pp_cxx_left_paren (pp
);
576 dump_expr (pp
, DECLTYPE_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
577 pp_cxx_right_paren (pp
);
581 pp_string (pp
, "std::nullptr_t");
585 pp_unsupported_tree (pp
, t
);
586 /* Fall through to error. */
589 pp_string (pp
, M_("<type error>"));
594 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
598 dump_typename (cxx_pretty_printer
*pp
, tree t
, int flags
)
600 tree ctx
= TYPE_CONTEXT (t
);
602 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
603 dump_typename (pp
, ctx
, flags
);
605 dump_type (pp
, ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
606 pp_cxx_colon_colon (pp
);
607 dump_decl (pp
, TYPENAME_TYPE_FULLNAME (t
), flags
);
610 /* Return the name of the supplied aggregate, or enumeral type. */
613 class_key_or_enum_as_string (tree t
)
615 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
617 if (SCOPED_ENUM_P (t
))
622 else if (TREE_CODE (t
) == UNION_TYPE
)
624 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
630 /* Print out a class declaration T under the control of FLAGS,
631 in the form `class foo'. */
634 dump_aggr_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
637 const char *variety
= class_key_or_enum_as_string (t
);
641 pp_cxx_cv_qualifier_seq (pp
, t
);
643 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
644 pp_cxx_ws_string (pp
, variety
);
646 name
= TYPE_NAME (t
);
650 typdef
= (!DECL_ARTIFICIAL (name
)
651 /* An alias specialization is not considered to be a
653 && !alias_template_specialization_p (t
));
656 && ((flags
& TFF_CHASE_TYPEDEF
)
657 || (!flag_pretty_templates
&& DECL_LANG_SPECIFIC (name
)
658 && DECL_TEMPLATE_INFO (name
))))
659 || DECL_SELF_REFERENCE_P (name
))
661 t
= TYPE_MAIN_VARIANT (t
);
662 name
= TYPE_NAME (t
);
666 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
667 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
668 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
669 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
671 if (! (flags
& TFF_UNQUALIFIED_NAME
))
672 dump_scope (pp
, CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
673 flags
&= ~TFF_UNQUALIFIED_NAME
;
676 /* Because the template names are mangled, we have to locate
677 the most general template, and use that name. */
678 tree tpl
= TYPE_TI_TEMPLATE (t
);
680 while (DECL_TEMPLATE_INFO (tpl
))
681 tpl
= DECL_TI_TEMPLATE (tpl
);
684 name
= DECL_NAME (name
);
687 if (name
== 0 || ANON_AGGRNAME_P (name
))
689 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
690 pp_string (pp
, M_("<anonymous>"));
692 pp_printf (pp
, M_("<anonymous %s>"), variety
);
694 else if (LAMBDA_TYPE_P (t
))
696 /* A lambda's "type" is essentially its signature. */
697 pp_string (pp
, M_("<lambda"));
698 if (lambda_function (t
))
700 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t
)),
705 pp_cxx_tree_identifier (pp
, name
);
707 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
708 !CLASSTYPE_USE_TEMPLATE (t
),
709 flags
& ~TFF_TEMPLATE_HEADER
);
712 /* Dump into the obstack the initial part of the output for a given type.
713 This is necessary when dealing with things like functions returning
716 return type of `int (* fee ())()': pointer -> function -> int. Both
717 pointer (and reference and offset) and function (and member) types must
718 deal with prefix and suffix.
720 Arrays must also do this for DECL nodes, like int a[], and for things like
724 dump_type_prefix (cxx_pretty_printer
*pp
, tree t
, int flags
)
726 if (TYPE_PTRMEMFUNC_P (t
))
728 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
732 switch (TREE_CODE (t
))
737 tree sub
= TREE_TYPE (t
);
739 dump_type_prefix (pp
, sub
, flags
);
740 if (TREE_CODE (sub
) == ARRAY_TYPE
741 || TREE_CODE (sub
) == FUNCTION_TYPE
)
743 pp_cxx_whitespace (pp
);
744 pp_cxx_left_paren (pp
);
745 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (sub
));
749 else if (TREE_CODE (t
) == REFERENCE_TYPE
)
751 if (TYPE_REF_IS_RVALUE (t
))
752 pp_ampersand_ampersand (pp
);
756 pp
->padding
= pp_before
;
757 pp_cxx_cv_qualifier_seq (pp
, t
);
763 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
764 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
767 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
768 pp_cxx_left_paren (pp
);
769 dump_type (pp
, TYPE_OFFSET_BASETYPE (t
), flags
);
770 pp_cxx_colon_colon (pp
);
773 pp_cxx_cv_qualifier_seq (pp
, t
);
774 pp
->padding
= pp_before
;
777 /* This can be reached without a pointer when dealing with
778 templates, e.g. std::is_function. */
780 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
784 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
786 pp_cxx_left_paren (pp
);
787 dump_aggr_type (pp
, TYPE_METHOD_BASETYPE (t
), flags
);
788 pp_cxx_colon_colon (pp
);
792 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
796 case IDENTIFIER_NODE
:
801 case TEMPLATE_TYPE_PARM
:
802 case TEMPLATE_TEMPLATE_PARM
:
803 case BOUND_TEMPLATE_TEMPLATE_PARM
:
814 case UNDERLYING_TYPE
:
816 case TYPE_PACK_EXPANSION
:
817 case FIXED_POINT_TYPE
:
819 dump_type (pp
, t
, flags
);
820 pp
->padding
= pp_before
;
824 pp_unsupported_tree (pp
, t
);
827 pp_string (pp
, M_("<typeprefixerror>"));
832 /* Dump the suffix of type T, under control of FLAGS. This is the part
833 which appears after the identifier (or function parms). */
836 dump_type_suffix (cxx_pretty_printer
*pp
, tree t
, int flags
)
838 if (TYPE_PTRMEMFUNC_P (t
))
839 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
841 switch (TREE_CODE (t
))
846 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
847 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
848 pp_cxx_right_paren (pp
);
849 if (TREE_CODE (t
) == POINTER_TYPE
)
850 flags
|= TFF_POINTER
;
851 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
858 if (TREE_CODE (t
) == METHOD_TYPE
)
859 /* Can only be reached through a pointer. */
860 pp_cxx_right_paren (pp
);
861 arg
= TYPE_ARG_TYPES (t
);
862 if (TREE_CODE (t
) == METHOD_TYPE
)
863 arg
= TREE_CHAIN (arg
);
865 /* Function pointers don't have default args. Not in standard C++,
866 anyway; they may in g++, but we'll just pretend otherwise. */
867 dump_parameters (pp
, arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
869 pp
->padding
= pp_before
;
870 pp_cxx_cv_qualifiers (pp
, type_memfn_quals (t
),
871 TREE_CODE (t
) == FUNCTION_TYPE
872 && (flags
& TFF_POINTER
));
873 dump_ref_qualifier (pp
, t
, flags
);
874 dump_exception_spec (pp
, TYPE_RAISES_EXCEPTIONS (t
), flags
);
875 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
881 pp_cxx_left_bracket (pp
);
884 tree dtype
= TYPE_DOMAIN (t
);
885 tree max
= TYPE_MAX_VALUE (dtype
);
886 if (integer_all_onesp (max
))
887 pp_character (pp
, '0');
888 else if (tree_fits_shwi_p (max
))
889 pp_wide_integer (pp
, tree_to_shwi (max
) + 1);
893 if (TREE_CODE (max
) == SAVE_EXPR
)
894 max
= TREE_OPERAND (max
, 0);
895 if (TREE_CODE (max
) == MINUS_EXPR
896 || TREE_CODE (max
) == PLUS_EXPR
)
898 max
= TREE_OPERAND (max
, 0);
899 while (CONVERT_EXPR_P (max
))
900 max
= TREE_OPERAND (max
, 0);
903 max
= fold_build2_loc (input_location
,
904 PLUS_EXPR
, dtype
, max
,
905 build_int_cst (dtype
, 1));
906 dump_expr (pp
, max
, flags
& ~TFF_EXPR_IN_PARENS
);
909 pp_cxx_right_bracket (pp
);
910 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
914 case IDENTIFIER_NODE
:
919 case TEMPLATE_TYPE_PARM
:
920 case TEMPLATE_TEMPLATE_PARM
:
921 case BOUND_TEMPLATE_TEMPLATE_PARM
:
932 case UNDERLYING_TYPE
:
934 case TYPE_PACK_EXPANSION
:
935 case FIXED_POINT_TYPE
:
940 pp_unsupported_tree (pp
, t
);
942 /* Don't mark it here, we should have already done in
949 dump_global_iord (cxx_pretty_printer
*pp
, tree t
)
951 const char *p
= NULL
;
953 if (DECL_GLOBAL_CTOR_P (t
))
954 p
= M_("(static initializers for %s)");
955 else if (DECL_GLOBAL_DTOR_P (t
))
956 p
= M_("(static destructors for %s)");
960 pp_printf (pp
, p
, LOCATION_FILE (input_location
));
964 dump_simple_decl (cxx_pretty_printer
*pp
, tree t
, tree type
, int flags
)
966 if (flags
& TFF_DECL_SPECIFIERS
)
969 && DECL_DECLARED_CONSTEXPR_P (t
))
970 pp_cxx_ws_string (pp
, "constexpr");
971 dump_type_prefix (pp
, type
, flags
& ~TFF_UNQUALIFIED_NAME
);
974 if (! (flags
& TFF_UNQUALIFIED_NAME
)
975 && TREE_CODE (t
) != PARM_DECL
976 && (!DECL_INITIAL (t
)
977 || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
))
978 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
979 flags
&= ~TFF_UNQUALIFIED_NAME
;
980 if ((flags
& TFF_DECL_SPECIFIERS
)
981 && DECL_TEMPLATE_PARM_P (t
)
982 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t
)))
983 pp_string (pp
, "...");
986 if (TREE_CODE (t
) == FIELD_DECL
&& DECL_NORMAL_CAPTURE_P (t
))
989 pp_string (pp
, IDENTIFIER_POINTER (DECL_NAME (t
)) + 2);
990 pp_string (pp
, " capture>");
993 dump_decl (pp
, DECL_NAME (t
), flags
);
996 pp_string (pp
, M_("<anonymous>"));
997 if (flags
& TFF_DECL_SPECIFIERS
)
998 dump_type_suffix (pp
, type
, flags
);
1001 /* Dump a human readable string for the decl T under control of FLAGS. */
1004 dump_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1009 /* If doing Objective-C++, give Objective-C a chance to demangle
1010 Objective-C method names. */
1011 if (c_dialect_objc ())
1013 const char *demangled
= objc_maybe_printable_name (t
, flags
);
1016 pp_string (pp
, demangled
);
1021 switch (TREE_CODE (t
))
1024 /* Don't say 'typedef class A' */
1025 if (DECL_ARTIFICIAL (t
) && !DECL_SELF_REFERENCE_P (t
))
1027 if ((flags
& TFF_DECL_SPECIFIERS
)
1028 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
1030 /* Say `class T' not just `T'. */
1031 pp_cxx_ws_string (pp
, "class");
1033 /* Emit the `...' for a parameter pack. */
1034 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1035 pp_cxx_ws_string (pp
, "...");
1038 dump_type (pp
, TREE_TYPE (t
), flags
);
1041 if (TYPE_DECL_ALIAS_P (t
)
1042 && (flags
& TFF_DECL_SPECIFIERS
1043 || flags
& TFF_CLASS_KEY_OR_ENUM
))
1045 pp_cxx_ws_string (pp
, "using");
1046 dump_decl (pp
, DECL_NAME (t
), flags
);
1047 pp_cxx_whitespace (pp
);
1048 pp_cxx_ws_string (pp
, "=");
1049 pp_cxx_whitespace (pp
);
1050 dump_type (pp
, DECL_ORIGINAL_TYPE (t
), flags
);
1053 if ((flags
& TFF_DECL_SPECIFIERS
)
1054 && !DECL_SELF_REFERENCE_P (t
))
1055 pp_cxx_ws_string (pp
, "typedef");
1056 dump_simple_decl (pp
, t
, DECL_ORIGINAL_TYPE (t
)
1057 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
1062 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
1064 pp_string (pp
, M_("vtable for "));
1065 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
1066 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1069 /* Else fall through. */
1072 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1074 /* Handle variable template specializations. */
1075 if (TREE_CODE (t
) == VAR_DECL
1076 && DECL_LANG_SPECIFIC (t
)
1077 && DECL_TEMPLATE_INFO (t
)
1078 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
)))
1080 pp_cxx_begin_template_argument_list (pp
);
1081 tree args
= INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (t
));
1082 dump_template_argument_list (pp
, args
, flags
);
1083 pp_cxx_end_template_argument_list (pp
);
1088 pp_string (pp
, M_("<return value> "));
1089 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1092 case NAMESPACE_DECL
:
1093 if (flags
& TFF_DECL_SPECIFIERS
)
1094 pp
->declaration (t
);
1097 if (! (flags
& TFF_UNQUALIFIED_NAME
))
1098 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1099 flags
&= ~TFF_UNQUALIFIED_NAME
;
1100 if (DECL_NAME (t
) == NULL_TREE
)
1102 if (!(pp
->flags
& pp_c_flag_gnu_v3
))
1103 pp_cxx_ws_string (pp
, M_("{anonymous}"));
1105 pp_cxx_ws_string (pp
, M_("(anonymous namespace)"));
1108 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1113 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1114 pp_colon_colon (pp
);
1115 dump_decl (pp
, TREE_OPERAND (t
, 1), TFF_UNQUALIFIED_NAME
);
1119 dump_decl (pp
, TREE_OPERAND (t
, 0), flags
);
1120 pp_cxx_left_bracket (pp
);
1121 dump_decl (pp
, TREE_OPERAND (t
, 1), flags
);
1122 pp_cxx_right_bracket (pp
);
1125 case ARRAY_NOTATION_REF
:
1126 dump_decl (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
1127 pp_cxx_left_bracket (pp
);
1128 dump_decl (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
1130 dump_decl (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
1132 dump_decl (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
1133 pp_cxx_right_bracket (pp
);
1136 /* So that we can do dump_decl on an aggr type. */
1140 dump_type (pp
, t
, flags
);
1144 /* This is a pseudo destructor call which has not been folded into
1145 a PSEUDO_DTOR_EXPR yet. */
1146 pp_cxx_complement (pp
);
1147 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1154 /* These special cases are duplicated here so that other functions
1155 can feed identifiers to error and get them demangled properly. */
1156 case IDENTIFIER_NODE
:
1157 if (IDENTIFIER_TYPENAME_P (t
))
1159 pp_cxx_ws_string (pp
, "operator");
1160 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1161 dump_type (pp
, TREE_TYPE (t
), flags
);
1165 pp_cxx_tree_identifier (pp
, t
);
1171 t
= OVL_CURRENT (t
);
1172 if (DECL_CLASS_SCOPE_P (t
))
1174 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1175 pp_cxx_colon_colon (pp
);
1177 else if (!DECL_FILE_SCOPE_P (t
))
1179 dump_decl (pp
, DECL_CONTEXT (t
), flags
);
1180 pp_cxx_colon_colon (pp
);
1182 dump_decl (pp
, DECL_NAME (t
), flags
);
1186 /* If there's only one function, just treat it like an ordinary
1188 t
= OVL_CURRENT (t
);
1192 if (! DECL_LANG_SPECIFIC (t
))
1194 if (DECL_ABSTRACT_ORIGIN (t
))
1195 dump_decl (pp
, DECL_ABSTRACT_ORIGIN (t
), flags
);
1197 pp_string (pp
, M_("<built-in>"));
1199 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
1200 dump_global_iord (pp
, t
);
1202 dump_function_decl (pp
, t
, flags
);
1206 dump_template_decl (pp
, t
, flags
);
1209 case TEMPLATE_ID_EXPR
:
1211 tree name
= TREE_OPERAND (t
, 0);
1212 tree args
= TREE_OPERAND (t
, 1);
1214 if (is_overloaded_fn (name
))
1215 name
= DECL_NAME (get_first_fn (name
));
1216 dump_decl (pp
, name
, flags
);
1217 pp_cxx_begin_template_argument_list (pp
);
1218 if (args
== error_mark_node
)
1219 pp_string (pp
, M_("<template arguments error>"));
1221 dump_template_argument_list (pp
, args
, flags
);
1222 pp_cxx_end_template_argument_list (pp
);
1227 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1231 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
1232 || (DECL_INITIAL (t
) &&
1233 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
1234 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1235 else if (DECL_NAME (t
))
1236 dump_decl (pp
, DECL_NAME (t
), flags
);
1237 else if (DECL_INITIAL (t
))
1238 dump_expr (pp
, DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
1240 pp_string (pp
, M_("<enumerator>"));
1244 pp_cxx_ws_string (pp
, "using");
1245 dump_type (pp
, USING_DECL_SCOPE (t
), flags
);
1246 pp_cxx_colon_colon (pp
);
1247 dump_decl (pp
, DECL_NAME (t
), flags
);
1251 pp
->declaration (t
);
1255 dump_decl (pp
, BASELINK_FUNCTIONS (t
), flags
);
1258 case NON_DEPENDENT_EXPR
:
1259 dump_expr (pp
, t
, flags
);
1262 case TEMPLATE_TYPE_PARM
:
1263 if (flags
& TFF_DECL_SPECIFIERS
)
1264 pp
->declaration (t
);
1269 case UNBOUND_CLASS_TEMPLATE
:
1270 case TYPE_PACK_EXPANSION
:
1272 dump_type (pp
, t
, flags
);
1276 pp_unsupported_tree (pp
, t
);
1277 /* Fall through to error. */
1280 pp_string (pp
, M_("<declaration error>"));
1285 /* Dump a template declaration T under control of FLAGS. This means the
1286 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1289 dump_template_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1291 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1295 if (flags
& TFF_TEMPLATE_HEADER
)
1297 for (parms
= orig_parms
= nreverse (orig_parms
);
1299 parms
= TREE_CHAIN (parms
))
1301 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1302 int len
= TREE_VEC_LENGTH (inner_parms
);
1304 pp_cxx_ws_string (pp
, "template");
1305 pp_cxx_begin_template_argument_list (pp
);
1307 /* If we've shown the template prefix, we'd better show the
1308 parameters' and decl's type too. */
1309 flags
|= TFF_DECL_SPECIFIERS
;
1311 for (i
= 0; i
< len
; i
++)
1314 pp_separate_with_comma (pp
);
1315 dump_template_parameter (pp
, TREE_VEC_ELT (inner_parms
, i
),
1318 pp_cxx_end_template_argument_list (pp
);
1319 pp_cxx_whitespace (pp
);
1321 nreverse(orig_parms
);
1323 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1325 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1326 pp_cxx_ws_string (pp
, "class");
1328 /* If this is a parameter pack, print the ellipsis. */
1329 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1330 pp_cxx_ws_string (pp
, "...");
1334 if (DECL_CLASS_TEMPLATE_P (t
))
1335 dump_type (pp
, TREE_TYPE (t
),
1336 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1337 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1338 else if (DECL_TEMPLATE_RESULT (t
)
1339 && (VAR_P (DECL_TEMPLATE_RESULT (t
))
1340 /* Alias template. */
1341 || DECL_TYPE_TEMPLATE_P (t
)))
1342 dump_decl (pp
, DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1345 gcc_assert (TREE_TYPE (t
));
1346 switch (NEXT_CODE (t
))
1350 dump_function_decl (pp
, t
, flags
| TFF_TEMPLATE_NAME
);
1353 /* This case can occur with some invalid code. */
1354 dump_type (pp
, TREE_TYPE (t
),
1355 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1356 | (flags
& TFF_DECL_SPECIFIERS
1357 ? TFF_CLASS_KEY_OR_ENUM
: 0));
1362 /* find_typenames looks through the type of the function template T
1363 and returns a vec containing any typedefs, decltypes or TYPENAME_TYPEs
1366 struct find_typenames_t
1368 hash_set
<tree
> *p_set
;
1369 vec
<tree
, va_gc
> *typenames
;
1373 find_typenames_r (tree
*tp
, int *walk_subtrees
, void *data
)
1375 struct find_typenames_t
*d
= (struct find_typenames_t
*)data
;
1376 tree mv
= NULL_TREE
;
1378 if (TYPE_P (*tp
) && is_typedef_decl (TYPE_NAME (*tp
)))
1379 /* Add the type of the typedef without any additional cv-quals. */
1380 mv
= TREE_TYPE (TYPE_NAME (*tp
));
1381 else if (TREE_CODE (*tp
) == TYPENAME_TYPE
1382 || TREE_CODE (*tp
) == DECLTYPE_TYPE
)
1383 /* Add the typename without any cv-qualifiers. */
1384 mv
= TYPE_MAIN_VARIANT (*tp
);
1386 if (TREE_CODE (*tp
) == TYPE_PACK_EXPANSION
)
1388 /* Don't mess with parameter packs since we don't remember
1389 the pack expansion context for a particular typename. */
1390 *walk_subtrees
= false;
1394 if (mv
&& (mv
== *tp
|| !d
->p_set
->add (mv
)))
1395 vec_safe_push (d
->typenames
, mv
);
1397 /* Search into class template arguments, which cp_walk_subtrees
1399 if (CLASS_TYPE_P (*tp
) && CLASSTYPE_TEMPLATE_INFO (*tp
))
1400 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp
), find_typenames_r
,
1406 static vec
<tree
, va_gc
> *
1407 find_typenames (tree t
)
1409 struct find_typenames_t ft
;
1410 ft
.p_set
= new hash_set
<tree
>;
1411 ft
.typenames
= NULL
;
1412 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t
)),
1413 find_typenames_r
, &ft
, ft
.p_set
);
1415 return ft
.typenames
;
1418 /* Output the "[with ...]" clause for a template instantiation T iff
1419 TEMPLATE_PARMS, TEMPLATE_ARGS and FLAGS are suitable. T may be NULL if
1420 formatting a deduction/substitution diagnostic rather than an
1424 dump_substitution (cxx_pretty_printer
*pp
,
1425 tree t
, tree template_parms
, tree template_args
,
1428 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
1429 && !(flags
& TFF_NO_TEMPLATE_BINDINGS
))
1431 vec
<tree
, va_gc
> *typenames
= t
? find_typenames (t
) : NULL
;
1432 pp_cxx_whitespace (pp
);
1433 pp_cxx_left_bracket (pp
);
1434 pp
->translate_string ("with");
1435 pp_cxx_whitespace (pp
);
1436 dump_template_bindings (pp
, template_parms
, template_args
, typenames
);
1437 pp_cxx_right_bracket (pp
);
1441 /* Dump the lambda function FN including its 'mutable' qualifier and any
1442 template bindings. */
1445 dump_lambda_function (cxx_pretty_printer
*pp
,
1446 tree fn
, tree template_parms
, tree template_args
,
1449 /* A lambda's signature is essentially its "type". */
1450 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1451 if (!(TYPE_QUALS (class_of_this_parm (TREE_TYPE (fn
))) & TYPE_QUAL_CONST
))
1453 pp
->padding
= pp_before
;
1454 pp_c_ws_string (pp
, "mutable");
1456 dump_substitution (pp
, fn
, template_parms
, template_args
, flags
);
1459 /* Pretty print a function decl. There are several ways we want to print a
1460 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1461 As error can only apply the '#' flag once to give 0 and 1 for V, there
1462 is %D which doesn't print the throw specs, and %F which does. */
1465 dump_function_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1469 tree cname
= NULL_TREE
;
1470 tree template_args
= NULL_TREE
;
1471 tree template_parms
= NULL_TREE
;
1472 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1473 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1476 flags
&= ~(TFF_UNQUALIFIED_NAME
| TFF_TEMPLATE_NAME
);
1477 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1478 t
= DECL_TEMPLATE_RESULT (t
);
1480 /* Save the exceptions, in case t is a specialization and we are
1481 emitting an error about incompatible specifications. */
1482 exceptions
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t
));
1484 /* Pretty print template instantiations only. */
1485 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
)
1486 && flag_pretty_templates
)
1490 template_args
= DECL_TI_ARGS (t
);
1491 tmpl
= most_general_template (t
);
1492 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1494 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1499 if (DECL_NAME (t
) && LAMBDA_FUNCTION_P (t
))
1500 return dump_lambda_function (pp
, t
, template_parms
, template_args
, flags
);
1502 fntype
= TREE_TYPE (t
);
1503 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1505 if (DECL_CLASS_SCOPE_P (t
))
1506 cname
= DECL_CONTEXT (t
);
1507 /* This is for partially instantiated template methods. */
1508 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1509 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1511 if (flags
& TFF_DECL_SPECIFIERS
)
1513 if (DECL_STATIC_FUNCTION_P (t
))
1514 pp_cxx_ws_string (pp
, "static");
1515 else if (DECL_VIRTUAL_P (t
))
1516 pp_cxx_ws_string (pp
, "virtual");
1518 if (DECL_DECLARED_CONSTEXPR_P (t
))
1519 pp_cxx_ws_string (pp
, "constexpr");
1522 /* Print the return type? */
1524 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1525 && !DECL_DESTRUCTOR_P (t
);
1528 tree ret
= fndecl_declared_return_type (t
);
1529 dump_type_prefix (pp
, ret
, flags
);
1532 /* Print the function name. */
1533 if (!do_outer_scope
)
1537 dump_type (pp
, cname
, flags
);
1538 pp_cxx_colon_colon (pp
);
1541 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1543 dump_function_name (pp
, t
, flags
);
1545 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1547 dump_parameters (pp
, parmtypes
, flags
);
1549 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1551 pp
->padding
= pp_before
;
1552 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (fntype
));
1553 dump_ref_qualifier (pp
, fntype
, flags
);
1556 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1558 pp
->padding
= pp_before
;
1559 dump_exception_spec (pp
, exceptions
, flags
);
1563 dump_type_suffix (pp
, TREE_TYPE (fntype
), flags
);
1565 dump_substitution (pp
, t
, template_parms
, template_args
, flags
);
1567 else if (template_args
)
1569 bool need_comma
= false;
1571 pp_cxx_begin_template_argument_list (pp
);
1572 template_args
= INNERMOST_TEMPLATE_ARGS (template_args
);
1573 for (i
= 0; i
< TREE_VEC_LENGTH (template_args
); ++i
)
1575 tree arg
= TREE_VEC_ELT (template_args
, i
);
1577 pp_separate_with_comma (pp
);
1578 if (ARGUMENT_PACK_P (arg
))
1579 pp_cxx_left_brace (pp
);
1580 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
1581 if (ARGUMENT_PACK_P (arg
))
1582 pp_cxx_right_brace (pp
);
1585 pp_cxx_end_template_argument_list (pp
);
1589 /* Print a parameter list. If this is for a member function, the
1590 member object ptr (and any other hidden args) should have
1591 already been removed. */
1594 dump_parameters (cxx_pretty_printer
*pp
, tree parmtypes
, int flags
)
1597 flags
&= ~TFF_SCOPE
;
1598 pp_cxx_left_paren (pp
);
1600 for (first
= 1; parmtypes
!= void_list_node
;
1601 parmtypes
= TREE_CHAIN (parmtypes
))
1604 pp_separate_with_comma (pp
);
1608 pp_cxx_ws_string (pp
, "...");
1612 dump_type (pp
, TREE_VALUE (parmtypes
), flags
);
1614 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1616 pp_cxx_whitespace (pp
);
1618 pp_cxx_whitespace (pp
);
1619 dump_expr (pp
, TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1623 pp_cxx_right_paren (pp
);
1626 /* Print ref-qualifier of a FUNCTION_TYPE or METHOD_TYPE. FLAGS are ignored. */
1629 dump_ref_qualifier (cxx_pretty_printer
*pp
, tree t
, int flags ATTRIBUTE_UNUSED
)
1631 if (FUNCTION_REF_QUALIFIED (t
))
1633 pp
->padding
= pp_before
;
1634 if (FUNCTION_RVALUE_QUALIFIED (t
))
1635 pp_cxx_ws_string (pp
, "&&");
1637 pp_cxx_ws_string (pp
, "&");
1641 /* Print an exception specification. T is the exception specification. */
1644 dump_exception_spec (cxx_pretty_printer
*pp
, tree t
, int flags
)
1646 if (t
&& TREE_PURPOSE (t
))
1648 pp_cxx_ws_string (pp
, "noexcept");
1649 if (!integer_onep (TREE_PURPOSE (t
)))
1651 pp_cxx_whitespace (pp
);
1652 pp_cxx_left_paren (pp
);
1653 if (DEFERRED_NOEXCEPT_SPEC_P (t
))
1654 pp_cxx_ws_string (pp
, "<uninstantiated>");
1656 dump_expr (pp
, TREE_PURPOSE (t
), flags
);
1657 pp_cxx_right_paren (pp
);
1662 pp_cxx_ws_string (pp
, "throw");
1663 pp_cxx_whitespace (pp
);
1664 pp_cxx_left_paren (pp
);
1665 if (TREE_VALUE (t
) != NULL_TREE
)
1668 dump_type (pp
, TREE_VALUE (t
), flags
);
1672 pp_separate_with_comma (pp
);
1674 pp_cxx_right_paren (pp
);
1678 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1679 and destructors properly. */
1682 dump_function_name (cxx_pretty_printer
*pp
, tree t
, int flags
)
1684 tree name
= DECL_NAME (t
);
1686 /* We can get here with a decl that was synthesized by language-
1687 independent machinery (e.g. coverage.c) in which case it won't
1688 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1689 will crash. In this case it is safe just to print out the
1691 if (!DECL_LANG_SPECIFIC (t
))
1693 pp_cxx_tree_identifier (pp
, name
);
1697 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1698 t
= DECL_TEMPLATE_RESULT (t
);
1700 /* Don't let the user see __comp_ctor et al. */
1701 if (DECL_CONSTRUCTOR_P (t
)
1702 || DECL_DESTRUCTOR_P (t
))
1704 if (LAMBDA_TYPE_P (DECL_CONTEXT (t
)))
1705 name
= get_identifier ("<lambda>");
1706 else if (TYPE_ANONYMOUS_P (DECL_CONTEXT (t
)))
1707 name
= get_identifier ("<constructor>");
1709 name
= constructor_name (DECL_CONTEXT (t
));
1712 if (DECL_DESTRUCTOR_P (t
))
1714 pp_cxx_complement (pp
);
1715 dump_decl (pp
, name
, TFF_PLAIN_IDENTIFIER
);
1717 else if (DECL_CONV_FN_P (t
))
1719 /* This cannot use the hack that the operator's return
1720 type is stashed off of its name because it may be
1721 used for error reporting. In the case of conflicting
1722 declarations, both will have the same name, yet
1723 the types will be different, hence the TREE_TYPE field
1724 of the first name will be clobbered by the second. */
1725 pp_cxx_ws_string (pp
, "operator");
1726 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1728 else if (name
&& IDENTIFIER_OPNAME_P (name
))
1729 pp_cxx_tree_identifier (pp
, name
);
1730 else if (name
&& UDLIT_OPER_P (name
))
1731 pp_cxx_tree_identifier (pp
, name
);
1733 dump_decl (pp
, name
, flags
);
1735 if (DECL_TEMPLATE_INFO (t
)
1736 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1737 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1738 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1739 dump_template_parms (pp
, DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
),
1743 /* Dump the template parameters from the template info INFO under control of
1744 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1745 specialization (partial or complete). For partial specializations we show
1746 the specialized parameter values. For a primary template we show no
1750 dump_template_parms (cxx_pretty_printer
*pp
, tree info
,
1751 int primary
, int flags
)
1753 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1755 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1757 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1758 pp_cxx_begin_template_argument_list (pp
);
1760 /* Be careful only to print things when we have them, so as not
1761 to crash producing error messages. */
1762 if (args
&& !primary
)
1765 len
= get_non_default_template_args_count (args
, flags
);
1767 args
= INNERMOST_TEMPLATE_ARGS (args
);
1768 for (ix
= 0; ix
!= len
; ix
++)
1770 tree arg
= TREE_VEC_ELT (args
, ix
);
1772 /* Only print a comma if we know there is an argument coming. In
1773 the case of an empty template argument pack, no actual
1774 argument will be printed. */
1776 && (!ARGUMENT_PACK_P (arg
)
1777 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
1778 pp_separate_with_comma (pp
);
1781 pp_string (pp
, M_("<template parameter error>"));
1783 dump_template_argument (pp
, arg
, flags
);
1788 tree tpl
= TI_TEMPLATE (info
);
1789 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1792 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1793 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1795 for (ix
= 0; ix
!= len
; ix
++)
1799 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1801 pp_string (pp
, M_("<template parameter error>"));
1805 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1808 pp_separate_with_comma (pp
);
1810 dump_decl (pp
, parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1813 pp_cxx_end_template_argument_list (pp
);
1816 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1817 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1820 dump_call_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
, bool skipfirst
)
1823 call_expr_arg_iterator iter
;
1825 pp_cxx_left_paren (pp
);
1826 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1832 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1833 if (more_call_expr_args_p (&iter
))
1834 pp_separate_with_comma (pp
);
1837 pp_cxx_right_paren (pp
);
1840 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1841 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1845 dump_aggr_init_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
,
1849 aggr_init_expr_arg_iterator iter
;
1851 pp_cxx_left_paren (pp
);
1852 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1858 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1859 if (more_aggr_init_expr_args_p (&iter
))
1860 pp_separate_with_comma (pp
);
1863 pp_cxx_right_paren (pp
);
1866 /* Print out a list of initializers (subr of dump_expr). */
1869 dump_expr_list (cxx_pretty_printer
*pp
, tree l
, int flags
)
1873 dump_expr (pp
, TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1876 pp_separate_with_comma (pp
);
1880 /* Print out a vector of initializers (subr of dump_expr). */
1883 dump_expr_init_vec (cxx_pretty_printer
*pp
, vec
<constructor_elt
, va_gc
> *v
,
1886 unsigned HOST_WIDE_INT idx
;
1889 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1891 dump_expr (pp
, value
, flags
| TFF_EXPR_IN_PARENS
);
1892 if (idx
!= v
->length () - 1)
1893 pp_separate_with_comma (pp
);
1898 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1899 function. Resolve it to a close relative -- in the sense of static
1900 type -- variant being overridden. That is close to what was written in
1901 the source code. Subroutine of dump_expr. */
1904 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1906 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1907 HOST_WIDE_INT index
= tree_to_uhwi (OBJ_TYPE_REF_TOKEN (ref
));
1908 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1911 fun
= TREE_CHAIN (fun
);
1912 index
-= (TARGET_VTABLE_USES_DESCRIPTORS
1913 ? TARGET_VTABLE_USES_DESCRIPTORS
: 1);
1919 /* Print out an expression E under control of FLAGS. */
1922 dump_expr (cxx_pretty_printer
*pp
, tree t
, int flags
)
1929 if (STATEMENT_CLASS_P (t
))
1931 pp_cxx_ws_string (pp
, M_("<statement>"));
1935 switch (TREE_CODE (t
))
1943 case NAMESPACE_DECL
:
1947 case IDENTIFIER_NODE
:
1948 dump_decl (pp
, t
, ((flags
& ~(TFF_DECL_SPECIFIERS
|TFF_RETURN_TYPE
1949 |TFF_TEMPLATE_HEADER
))
1950 | TFF_NO_FUNCTION_ARGUMENTS
));
1954 if (SSA_NAME_VAR (t
)
1955 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t
)))
1956 dump_expr (pp
, SSA_NAME_VAR (t
), flags
);
1958 pp_cxx_ws_string (pp
, M_("<unknown>"));
1969 case USERDEF_LITERAL
:
1970 pp_cxx_userdef_literal (pp
, t
);
1974 /* While waiting for caret diagnostics, avoid printing
1975 __cxa_allocate_exception, __cxa_throw, and the like. */
1976 pp_cxx_ws_string (pp
, M_("<throw-expression>"));
1981 dump_type (pp
, PTRMEM_CST_CLASS (t
), flags
);
1982 pp_cxx_colon_colon (pp
);
1983 pp_cxx_tree_identifier (pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1987 pp_cxx_left_paren (pp
);
1988 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1989 pp_separate_with_comma (pp
);
1990 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1991 pp_cxx_right_paren (pp
);
1995 pp_cxx_left_paren (pp
);
1996 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1997 pp_string (pp
, " ? ");
1998 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1999 pp_string (pp
, " : ");
2000 dump_expr (pp
, TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
2001 pp_cxx_right_paren (pp
);
2005 if (TREE_HAS_CONSTRUCTOR (t
))
2007 pp_cxx_ws_string (pp
, "new");
2008 pp_cxx_whitespace (pp
);
2009 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
2012 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2015 case AGGR_INIT_EXPR
:
2017 tree fn
= NULL_TREE
;
2019 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
2020 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
2022 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
2024 if (DECL_CONSTRUCTOR_P (fn
))
2025 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
2027 dump_decl (pp
, fn
, 0);
2030 dump_expr (pp
, AGGR_INIT_EXPR_FN (t
), 0);
2032 dump_aggr_init_expr_args (pp
, t
, flags
, true);
2037 tree fn
= CALL_EXPR_FN (t
);
2038 bool skipfirst
= false;
2040 if (TREE_CODE (fn
) == ADDR_EXPR
)
2041 fn
= TREE_OPERAND (fn
, 0);
2043 /* Nobody is interested in seeing the guts of vcalls. */
2044 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
2045 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
2047 if (TREE_TYPE (fn
) != NULL_TREE
2048 && NEXT_CODE (fn
) == METHOD_TYPE
2049 && call_expr_nargs (t
))
2051 tree ob
= CALL_EXPR_ARG (t
, 0);
2052 if (TREE_CODE (ob
) == ADDR_EXPR
)
2054 dump_expr (pp
, TREE_OPERAND (ob
, 0),
2055 flags
| TFF_EXPR_IN_PARENS
);
2058 else if (TREE_CODE (ob
) != PARM_DECL
2059 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
2061 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2066 if (flag_sanitize
& SANITIZE_UNDEFINED
2067 && is_ubsan_builtin_p (fn
))
2069 pp_string (cxx_pp
, M_("<ubsan routine call>"));
2072 dump_expr (pp
, fn
, flags
| TFF_EXPR_IN_PARENS
);
2073 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2078 /* Note that this only works for G++ target exprs. If somebody
2079 builds a general TARGET_EXPR, there's no way to represent that
2080 it initializes anything other that the parameter slot for the
2081 default argument. Note we may have cleared out the first
2082 operand in expand_expr, so don't go killing ourselves. */
2083 if (TREE_OPERAND (t
, 1))
2084 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2087 case POINTER_PLUS_EXPR
:
2088 dump_binary_op (pp
, "+", t
, flags
);
2093 dump_binary_op (pp
, assignment_operator_name_info
[NOP_EXPR
].name
,
2100 case TRUNC_DIV_EXPR
:
2101 case TRUNC_MOD_EXPR
:
2109 case TRUTH_ANDIF_EXPR
:
2110 case TRUTH_ORIF_EXPR
:
2117 case EXACT_DIV_EXPR
:
2118 dump_binary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2122 case FLOOR_DIV_EXPR
:
2123 case ROUND_DIV_EXPR
:
2125 dump_binary_op (pp
, "/", t
, flags
);
2129 case FLOOR_MOD_EXPR
:
2130 case ROUND_MOD_EXPR
:
2131 dump_binary_op (pp
, "%", t
, flags
);
2136 tree ob
= TREE_OPERAND (t
, 0);
2137 if (INDIRECT_REF_P (ob
))
2139 ob
= TREE_OPERAND (ob
, 0);
2140 if (TREE_CODE (ob
) != PARM_DECL
2142 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
2144 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2145 if (TREE_CODE (TREE_TYPE (ob
)) == REFERENCE_TYPE
)
2153 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2156 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
2161 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2162 pp_cxx_left_bracket (pp
);
2163 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2164 pp_cxx_right_bracket (pp
);
2167 case ARRAY_NOTATION_REF
:
2168 dump_expr (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
2169 pp_cxx_left_bracket (pp
);
2170 dump_expr (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
2172 dump_expr (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
2174 dump_expr (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
2175 pp_cxx_right_bracket (pp
);
2178 case UNARY_PLUS_EXPR
:
2179 dump_unary_op (pp
, "+", t
, flags
);
2183 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
2184 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
2185 /* An ADDR_EXPR can have reference type. In that case, we
2186 shouldn't print the `&' doing so indicates to the user
2187 that the expression has pointer type. */
2189 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
2190 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2191 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
2192 dump_unary_op (pp
, "&&", t
, flags
);
2194 dump_unary_op (pp
, "&", t
, flags
);
2198 if (TREE_HAS_CONSTRUCTOR (t
))
2200 t
= TREE_OPERAND (t
, 0);
2201 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
2202 dump_expr (pp
, CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
2203 dump_call_expr_args (pp
, t
, flags
, true);
2207 if (TREE_OPERAND (t
,0) != NULL_TREE
2208 && TREE_TYPE (TREE_OPERAND (t
, 0))
2209 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
2210 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2212 dump_unary_op (pp
, "*", t
, flags
);
2217 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
2218 && integer_zerop (TREE_OPERAND (t
, 1)))
2219 dump_expr (pp
, TREE_OPERAND (TREE_OPERAND (t
, 0), 0), flags
);
2223 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2225 pp_cxx_left_paren (pp
);
2226 if (!integer_onep (TYPE_SIZE_UNIT
2227 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))))))
2229 pp_cxx_left_paren (pp
);
2230 dump_type (pp
, ptr_type_node
, flags
);
2231 pp_cxx_right_paren (pp
);
2234 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2235 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2237 pp_cxx_ws_string (pp
, "+");
2238 dump_expr (pp
, fold_convert (ssizetype
, TREE_OPERAND (t
, 1)),
2240 pp_cxx_right_paren (pp
);
2247 case TRUTH_NOT_EXPR
:
2248 case PREDECREMENT_EXPR
:
2249 case PREINCREMENT_EXPR
:
2250 dump_unary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2253 case POSTDECREMENT_EXPR
:
2254 case POSTINCREMENT_EXPR
:
2255 pp_cxx_left_paren (pp
);
2256 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2257 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2258 pp_cxx_right_paren (pp
);
2261 case NON_LVALUE_EXPR
:
2262 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2263 should be another level of INDIRECT_REF so that I don't have to do
2265 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
2267 tree next
= TREE_TYPE (TREE_TYPE (t
));
2269 while (TYPE_PTR_P (next
))
2270 next
= TREE_TYPE (next
);
2272 if (TREE_CODE (next
) == FUNCTION_TYPE
)
2274 if (flags
& TFF_EXPR_IN_PARENS
)
2275 pp_cxx_left_paren (pp
);
2277 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2278 if (flags
& TFF_EXPR_IN_PARENS
)
2279 pp_cxx_right_paren (pp
);
2282 /* Else fall through. */
2284 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2288 case IMPLICIT_CONV_EXPR
:
2289 case VIEW_CONVERT_EXPR
:
2291 tree op
= TREE_OPERAND (t
, 0);
2292 tree ttype
= TREE_TYPE (t
);
2293 tree optype
= TREE_TYPE (op
);
2295 if (TREE_CODE (ttype
) != TREE_CODE (optype
)
2296 && POINTER_TYPE_P (ttype
)
2297 && POINTER_TYPE_P (optype
)
2298 && same_type_p (TREE_TYPE (optype
),
2301 if (TREE_CODE (ttype
) == REFERENCE_TYPE
)
2302 dump_unary_op (pp
, "*", t
, flags
);
2304 dump_unary_op (pp
, "&", t
, flags
);
2306 else if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
2308 /* It is a cast, but we cannot tell whether it is a
2309 reinterpret or static cast. Use the C style notation. */
2310 if (flags
& TFF_EXPR_IN_PARENS
)
2311 pp_cxx_left_paren (pp
);
2312 pp_cxx_left_paren (pp
);
2313 dump_type (pp
, TREE_TYPE (t
), flags
);
2314 pp_cxx_right_paren (pp
);
2315 dump_expr (pp
, op
, flags
| TFF_EXPR_IN_PARENS
);
2316 if (flags
& TFF_EXPR_IN_PARENS
)
2317 pp_cxx_right_paren (pp
);
2320 dump_expr (pp
, op
, flags
);
2325 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
2327 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
2329 if (integer_zerop (idx
))
2331 /* A NULL pointer-to-member constant. */
2332 pp_cxx_left_paren (pp
);
2333 pp_cxx_left_paren (pp
);
2334 dump_type (pp
, TREE_TYPE (t
), flags
);
2335 pp_cxx_right_paren (pp
);
2336 pp_character (pp
, '0');
2337 pp_cxx_right_paren (pp
);
2340 else if (tree_fits_shwi_p (idx
))
2343 unsigned HOST_WIDE_INT n
;
2345 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
2346 t
= TYPE_METHOD_BASETYPE (t
);
2347 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
2349 n
= tree_to_shwi (idx
);
2351 /* Map vtable index back one, to allow for the null pointer to
2355 while (n
> 0 && virtuals
)
2358 virtuals
= TREE_CHAIN (virtuals
);
2362 dump_expr (pp
, BV_FN (virtuals
),
2363 flags
| TFF_EXPR_IN_PARENS
);
2368 if (TREE_TYPE (t
) && LAMBDA_TYPE_P (TREE_TYPE (t
)))
2369 pp_string (pp
, "<lambda closure object>");
2370 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
2372 dump_type (pp
, TREE_TYPE (t
), 0);
2373 pp_cxx_left_paren (pp
);
2374 pp_cxx_right_paren (pp
);
2378 if (!BRACE_ENCLOSED_INITIALIZER_P (t
))
2379 dump_type (pp
, TREE_TYPE (t
), 0);
2380 pp_cxx_left_brace (pp
);
2381 dump_expr_init_vec (pp
, CONSTRUCTOR_ELTS (t
), flags
);
2382 pp_cxx_right_brace (pp
);
2389 tree ob
= TREE_OPERAND (t
, 0);
2390 if (is_dummy_object (ob
))
2392 t
= TREE_OPERAND (t
, 1);
2393 if (TREE_CODE (t
) == FUNCTION_DECL
)
2395 dump_expr (pp
, t
, flags
| TFF_EXPR_IN_PARENS
);
2396 else if (BASELINK_P (t
))
2397 dump_expr (pp
, OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
2398 flags
| TFF_EXPR_IN_PARENS
);
2400 dump_decl (pp
, t
, flags
);
2404 if (INDIRECT_REF_P (ob
))
2406 dump_expr (pp
, TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
2412 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2416 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2421 case TEMPLATE_PARM_INDEX
:
2422 dump_decl (pp
, TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
2426 if (TREE_OPERAND (t
, 0) == NULL_TREE
2427 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
2429 dump_type (pp
, TREE_TYPE (t
), flags
);
2430 pp_cxx_left_paren (pp
);
2431 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2432 pp_cxx_right_paren (pp
);
2436 pp_cxx_left_paren (pp
);
2437 dump_type (pp
, TREE_TYPE (t
), flags
);
2438 pp_cxx_right_paren (pp
);
2439 pp_cxx_left_paren (pp
);
2440 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2441 pp_cxx_right_paren (pp
);
2445 case STATIC_CAST_EXPR
:
2446 pp_cxx_ws_string (pp
, "static_cast");
2448 case REINTERPRET_CAST_EXPR
:
2449 pp_cxx_ws_string (pp
, "reinterpret_cast");
2451 case CONST_CAST_EXPR
:
2452 pp_cxx_ws_string (pp
, "const_cast");
2454 case DYNAMIC_CAST_EXPR
:
2455 pp_cxx_ws_string (pp
, "dynamic_cast");
2457 pp_cxx_begin_template_argument_list (pp
);
2458 dump_type (pp
, TREE_TYPE (t
), flags
);
2459 pp_cxx_end_template_argument_list (pp
);
2460 pp_cxx_left_paren (pp
);
2461 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2462 pp_cxx_right_paren (pp
);
2466 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2472 if (TREE_CODE (t
) == SIZEOF_EXPR
)
2473 pp_cxx_ws_string (pp
, "sizeof");
2476 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
2477 pp_cxx_ws_string (pp
, "__alignof__");
2479 op
= TREE_OPERAND (t
, 0);
2480 if (PACK_EXPANSION_P (op
))
2482 pp_string (pp
, "...");
2483 op
= PACK_EXPANSION_PATTERN (op
);
2485 pp_cxx_whitespace (pp
);
2486 pp_cxx_left_paren (pp
);
2487 if (TREE_CODE (t
) == SIZEOF_EXPR
&& SIZEOF_EXPR_TYPE_P (t
))
2488 dump_type (pp
, TREE_TYPE (op
), flags
);
2489 else if (TYPE_P (TREE_OPERAND (t
, 0)))
2490 dump_type (pp
, op
, flags
);
2492 dump_expr (pp
, op
, flags
);
2493 pp_cxx_right_paren (pp
);
2496 case AT_ENCODE_EXPR
:
2497 pp_cxx_ws_string (pp
, "@encode");
2498 pp_cxx_whitespace (pp
);
2499 pp_cxx_left_paren (pp
);
2500 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
2501 pp_cxx_right_paren (pp
);
2505 pp_cxx_ws_string (pp
, "noexcept");
2506 pp_cxx_whitespace (pp
);
2507 pp_cxx_left_paren (pp
);
2508 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2509 pp_cxx_right_paren (pp
);
2514 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2515 pp_cxx_whitespace (pp
);
2516 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2520 pp_string (pp
, M_("<unparsed>"));
2523 case TRY_CATCH_EXPR
:
2524 case WITH_CLEANUP_EXPR
:
2525 case CLEANUP_POINT_EXPR
:
2526 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2529 case PSEUDO_DTOR_EXPR
:
2530 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2532 if (TREE_OPERAND (t
, 1))
2534 dump_type (pp
, TREE_OPERAND (t
, 1), flags
);
2535 pp_cxx_colon_colon (pp
);
2537 pp_cxx_complement (pp
);
2538 dump_type (pp
, TREE_OPERAND (t
, 2), flags
);
2541 case TEMPLATE_ID_EXPR
:
2542 dump_decl (pp
, t
, flags
);
2548 case STATEMENT_LIST
:
2549 /* We don't yet have a way of dumping statements in a
2550 human-readable format. */
2551 pp_string (pp
, "({...})");
2555 pp_string (pp
, "while (1) { ");
2556 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2557 pp_cxx_right_brace (pp
);
2561 pp_string (pp
, "if (");
2562 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2563 pp_string (pp
, ") break; ");
2567 dump_expr (pp
, BASELINK_FUNCTIONS (t
), flags
& ~TFF_EXPR_IN_PARENS
);
2570 case EMPTY_CLASS_EXPR
:
2571 dump_type (pp
, TREE_TYPE (t
), flags
);
2572 pp_cxx_left_paren (pp
);
2573 pp_cxx_right_paren (pp
);
2576 case NON_DEPENDENT_EXPR
:
2577 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2580 case ARGUMENT_PACK_SELECT
:
2581 dump_template_argument (pp
, ARGUMENT_PACK_SELECT_FROM_PACK (t
), flags
);
2593 pp_type_specifier_seq (pp
, t
);
2597 /* We get here when we want to print a dependent type as an
2598 id-expression, without any disambiguator decoration. */
2599 pp
->id_expression (t
);
2602 case TEMPLATE_TYPE_PARM
:
2603 case TEMPLATE_TEMPLATE_PARM
:
2604 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2605 dump_type (pp
, t
, flags
);
2609 pp_cxx_trait_expression (pp
, t
);
2613 pp_cxx_va_arg_expression (pp
, t
);
2617 pp_cxx_offsetof_expression (pp
, t
);
2621 dump_decl (pp
, t
, flags
);
2624 case EXPR_PACK_EXPANSION
:
2631 case VEC_DELETE_EXPR
:
2637 case UNORDERED_EXPR
:
2647 case FIX_TRUNC_EXPR
:
2652 case TRUTH_AND_EXPR
:
2654 case TRUTH_XOR_EXPR
:
2655 if (flags
& TFF_EXPR_IN_PARENS
)
2656 pp_cxx_left_paren (pp
);
2658 if (flags
& TFF_EXPR_IN_PARENS
)
2659 pp_cxx_right_paren (pp
);
2663 dump_expr (pp
, resolve_virtual_fun_from_obj_type_ref (t
), flags
);
2667 pp_string (pp
, M_("<lambda>"));
2671 pp_cxx_left_paren (pp
);
2672 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2673 pp_cxx_right_paren (pp
);
2676 /* This list is incomplete, but should suffice for now.
2677 It is very important that `sorry' does not call
2678 `report_error_function'. That could cause an infinite loop. */
2680 pp_unsupported_tree (pp
, t
);
2681 /* fall through to ERROR_MARK... */
2683 pp_string (pp
, M_("<expression error>"));
2689 dump_binary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
,
2692 pp_cxx_left_paren (pp
);
2693 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2694 pp_cxx_whitespace (pp
);
2696 pp_cxx_ws_string (pp
, opstring
);
2698 pp_string (pp
, M_("<unknown operator>"));
2699 pp_cxx_whitespace (pp
);
2700 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2701 pp_cxx_right_paren (pp
);
2705 dump_unary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
, int flags
)
2707 if (flags
& TFF_EXPR_IN_PARENS
)
2708 pp_cxx_left_paren (pp
);
2709 pp_cxx_ws_string (pp
, opstring
);
2710 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2711 if (flags
& TFF_EXPR_IN_PARENS
)
2712 pp_cxx_right_paren (pp
);
2716 reinit_cxx_pp (void)
2718 pp_clear_output_area (cxx_pp
);
2719 cxx_pp
->padding
= pp_none
;
2720 pp_indentation (cxx_pp
) = 0;
2721 pp_needs_newline (cxx_pp
) = false;
2722 cxx_pp
->enclosing_scope
= current_function_decl
;
2725 /* Same as pp_formatted_text, except the return string is a separate
2726 copy and has a GGC storage duration, e.g. an indefinite lifetime. */
2729 pp_ggc_formatted_text (pretty_printer
*pp
)
2731 return ggc_strdup (pp_formatted_text (pp
));
2734 /* Exported interface to stringifying types, exprs and decls under TFF_*
2738 type_as_string (tree typ
, int flags
)
2741 pp_translate_identifiers (cxx_pp
) = false;
2742 dump_type (cxx_pp
, typ
, flags
);
2743 return pp_ggc_formatted_text (cxx_pp
);
2747 type_as_string_translate (tree typ
, int flags
)
2750 dump_type (cxx_pp
, typ
, flags
);
2751 return pp_ggc_formatted_text (cxx_pp
);
2755 expr_as_string (tree decl
, int flags
)
2758 pp_translate_identifiers (cxx_pp
) = false;
2759 dump_expr (cxx_pp
, decl
, flags
);
2760 return pp_ggc_formatted_text (cxx_pp
);
2763 /* Wrap decl_as_string with options appropriate for dwarf. */
2766 decl_as_dwarf_string (tree decl
, int flags
)
2769 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2770 here will be adequate to get the desired behaviour. */
2771 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2772 name
= decl_as_string (decl
, flags
);
2773 /* Subsequent calls to the pretty printer shouldn't use this style. */
2774 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2779 decl_as_string (tree decl
, int flags
)
2782 pp_translate_identifiers (cxx_pp
) = false;
2783 dump_decl (cxx_pp
, decl
, flags
);
2784 return pp_ggc_formatted_text (cxx_pp
);
2788 decl_as_string_translate (tree decl
, int flags
)
2791 dump_decl (cxx_pp
, decl
, flags
);
2792 return pp_ggc_formatted_text (cxx_pp
);
2795 /* Wrap lang_decl_name with options appropriate for dwarf. */
2798 lang_decl_dwarf_name (tree decl
, int v
, bool translate
)
2801 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2802 here will be adequate to get the desired behaviour. */
2803 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2804 name
= lang_decl_name (decl
, v
, translate
);
2805 /* Subsequent calls to the pretty printer shouldn't use this style. */
2806 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2810 /* Generate the three forms of printable names for cxx_printable_name. */
2813 lang_decl_name (tree decl
, int v
, bool translate
)
2817 ? decl_as_string_translate (decl
, TFF_DECL_SPECIFIERS
)
2818 : decl_as_string (decl
, TFF_DECL_SPECIFIERS
));
2821 pp_translate_identifiers (cxx_pp
) = translate
;
2823 && (DECL_CLASS_SCOPE_P (decl
)
2824 || (DECL_NAMESPACE_SCOPE_P (decl
)
2825 && CP_DECL_CONTEXT (decl
) != global_namespace
)))
2827 dump_type (cxx_pp
, CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2828 pp_cxx_colon_colon (cxx_pp
);
2831 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2832 dump_function_name (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
);
2833 else if ((DECL_NAME (decl
) == NULL_TREE
)
2834 && TREE_CODE (decl
) == NAMESPACE_DECL
)
2835 dump_decl (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
| TFF_UNQUALIFIED_NAME
);
2837 dump_decl (cxx_pp
, DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2839 return pp_ggc_formatted_text (cxx_pp
);
2842 /* Return the location of a tree passed to %+ formats. */
2845 location_of (tree t
)
2849 t
= TYPE_MAIN_DECL (t
);
2851 return input_location
;
2853 else if (TREE_CODE (t
) == OVERLOAD
)
2854 t
= OVL_FUNCTION (t
);
2857 return DECL_SOURCE_LOCATION (t
);
2858 return EXPR_LOC_OR_LOC (t
, input_location
);
2861 /* Now the interfaces from error et al to dump_type et al. Each takes an
2862 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2866 decl_to_string (tree decl
, int verbose
)
2870 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2871 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2872 flags
= TFF_CLASS_KEY_OR_ENUM
;
2874 flags
|= TFF_DECL_SPECIFIERS
;
2875 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2876 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2877 flags
|= TFF_TEMPLATE_HEADER
;
2880 dump_decl (cxx_pp
, decl
, flags
);
2881 return pp_ggc_formatted_text (cxx_pp
);
2885 expr_to_string (tree decl
)
2888 dump_expr (cxx_pp
, decl
, 0);
2889 return pp_ggc_formatted_text (cxx_pp
);
2893 fndecl_to_string (tree fndecl
, int verbose
)
2897 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2898 | TFF_TEMPLATE_HEADER
;
2900 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2902 dump_decl (cxx_pp
, fndecl
, flags
);
2903 return pp_ggc_formatted_text (cxx_pp
);
2908 code_to_string (enum tree_code c
)
2910 return get_tree_code_name (c
);
2914 language_to_string (enum languages c
)
2921 case lang_cplusplus
:
2933 /* Return the proper printed version of a parameter to a C++ function. */
2936 parm_to_string (int p
)
2940 pp_string (cxx_pp
, "'this'");
2942 pp_decimal_int (cxx_pp
, p
+ 1);
2943 return pp_ggc_formatted_text (cxx_pp
);
2947 op_to_string (enum tree_code p
)
2949 tree id
= operator_name_info
[p
].identifier
;
2950 return id
? IDENTIFIER_POINTER (id
) : M_("<unknown>");
2954 type_to_string (tree typ
, int verbose
)
2958 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2959 flags
|= TFF_TEMPLATE_HEADER
;
2962 dump_type (cxx_pp
, typ
, flags
);
2963 /* If we're printing a type that involves typedefs, also print the
2964 stripped version. But sometimes the stripped version looks
2965 exactly the same, so we don't want it after all. To avoid printing
2966 it in that case, we play ugly obstack games. */
2967 if (typ
&& TYPE_P (typ
) && typ
!= TYPE_CANONICAL (typ
)
2968 && !uses_template_parms (typ
))
2970 int aka_start
, aka_len
; char *p
;
2971 struct obstack
*ob
= pp_buffer (cxx_pp
)->obstack
;
2972 /* Remember the end of the initial dump. */
2973 int len
= obstack_object_size (ob
);
2974 tree aka
= strip_typedefs (typ
);
2975 pp_string (cxx_pp
, " {aka");
2976 pp_cxx_whitespace (cxx_pp
);
2977 /* And remember the start of the aka dump. */
2978 aka_start
= obstack_object_size (ob
);
2979 dump_type (cxx_pp
, aka
, flags
);
2980 aka_len
= obstack_object_size (ob
) - aka_start
;
2981 pp_right_brace (cxx_pp
);
2982 p
= (char*)obstack_base (ob
);
2983 /* If they are identical, cut off the aka with a NUL. */
2984 if (len
== aka_len
&& memcmp (p
, p
+aka_start
, len
) == 0)
2987 return pp_ggc_formatted_text (cxx_pp
);
2991 assop_to_string (enum tree_code p
)
2993 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
2994 return id
? IDENTIFIER_POINTER (id
) : M_("{unknown}");
2998 args_to_string (tree p
, int verbose
)
3002 flags
|= TFF_CLASS_KEY_OR_ENUM
;
3007 if (TYPE_P (TREE_VALUE (p
)))
3008 return type_as_string_translate (p
, flags
);
3011 for (; p
; p
= TREE_CHAIN (p
))
3013 if (TREE_VALUE (p
) == null_node
)
3014 pp_cxx_ws_string (cxx_pp
, "NULL");
3016 dump_type (cxx_pp
, error_type (TREE_VALUE (p
)), flags
);
3018 pp_separate_with_comma (cxx_pp
);
3020 return pp_ggc_formatted_text (cxx_pp
);
3023 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
3024 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
3028 subst_to_string (tree p
)
3030 tree decl
= TREE_PURPOSE (p
);
3031 tree targs
= TREE_VALUE (p
);
3032 tree tparms
= DECL_TEMPLATE_PARMS (decl
);
3033 int flags
= (TFF_DECL_SPECIFIERS
|TFF_TEMPLATE_HEADER
3034 |TFF_NO_TEMPLATE_BINDINGS
);
3040 dump_template_decl (cxx_pp
, TREE_PURPOSE (p
), flags
);
3041 dump_substitution (cxx_pp
, NULL
, tparms
, targs
, /*flags=*/0);
3042 return pp_ggc_formatted_text (cxx_pp
);
3046 cv_to_string (tree p
, int v
)
3049 cxx_pp
->padding
= v
? pp_before
: pp_none
;
3050 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
3051 return pp_ggc_formatted_text (cxx_pp
);
3055 eh_spec_to_string (tree p
, int /*v*/)
3059 dump_exception_spec (cxx_pp
, p
, flags
);
3060 return pp_ggc_formatted_text (cxx_pp
);
3063 /* Langhook for print_error_function. */
3065 cxx_print_error_function (diagnostic_context
*context
, const char *file
,
3066 diagnostic_info
*diagnostic
)
3068 lhd_print_error_function (context
, file
, diagnostic
);
3069 pp_set_prefix (context
->printer
, file
);
3070 maybe_print_instantiation_context (context
);
3074 cp_diagnostic_starter (diagnostic_context
*context
,
3075 diagnostic_info
*diagnostic
)
3077 diagnostic_report_current_module (context
, diagnostic
->location
);
3078 cp_print_error_function (context
, diagnostic
);
3079 maybe_print_instantiation_context (context
);
3080 maybe_print_constexpr_context (context
);
3081 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
3085 /* Print current function onto BUFFER, in the process of reporting
3086 a diagnostic message. Called from cp_diagnostic_starter. */
3088 cp_print_error_function (diagnostic_context
*context
,
3089 diagnostic_info
*diagnostic
)
3091 /* If we are in an instantiation context, current_function_decl is likely
3092 to be wrong, so just rely on print_instantiation_full_context. */
3093 if (current_instantiation ())
3095 if (diagnostic_last_function_changed (context
, diagnostic
))
3097 const char *old_prefix
= context
->printer
->prefix
;
3098 const char *file
= LOCATION_FILE (diagnostic
->location
);
3099 tree abstract_origin
= diagnostic_abstract_origin (diagnostic
);
3100 char *new_prefix
= (file
&& abstract_origin
== NULL
)
3101 ? file_name_as_prefix (context
, file
) : NULL
;
3103 pp_set_prefix (context
->printer
, new_prefix
);
3105 if (current_function_decl
== NULL
)
3106 pp_string (context
->printer
, _("At global scope:"));
3111 if (abstract_origin
)
3113 ao
= BLOCK_ABSTRACT_ORIGIN (abstract_origin
);
3114 while (TREE_CODE (ao
) == BLOCK
3115 && BLOCK_ABSTRACT_ORIGIN (ao
)
3116 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3117 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3118 gcc_assert (TREE_CODE (ao
) == FUNCTION_DECL
);
3122 fndecl
= current_function_decl
;
3124 pp_printf (context
->printer
, function_category (fndecl
),
3125 cxx_printable_name_translate (fndecl
, 2));
3127 while (abstract_origin
)
3130 tree block
= abstract_origin
;
3132 locus
= &BLOCK_SOURCE_LOCATION (block
);
3134 block
= BLOCK_SUPERCONTEXT (block
);
3135 while (block
&& TREE_CODE (block
) == BLOCK
3136 && BLOCK_ABSTRACT_ORIGIN (block
))
3138 ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3140 while (TREE_CODE (ao
) == BLOCK
3141 && BLOCK_ABSTRACT_ORIGIN (ao
)
3142 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3143 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3145 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3150 else if (TREE_CODE (ao
) != BLOCK
)
3153 block
= BLOCK_SUPERCONTEXT (block
);
3156 abstract_origin
= block
;
3159 while (block
&& TREE_CODE (block
) == BLOCK
)
3160 block
= BLOCK_SUPERCONTEXT (block
);
3162 if (block
&& TREE_CODE (block
) == FUNCTION_DECL
)
3164 abstract_origin
= NULL
;
3168 expanded_location s
= expand_location (*locus
);
3169 pp_character (context
->printer
, ',');
3170 pp_newline (context
->printer
);
3173 if (context
->show_column
&& s
.column
!= 0)
3174 pp_printf (context
->printer
,
3175 _(" inlined from %qs at %r%s:%d:%d%R"),
3176 cxx_printable_name_translate (fndecl
, 2),
3177 "locus", s
.file
, s
.line
, s
.column
);
3179 pp_printf (context
->printer
,
3180 _(" inlined from %qs at %r%s:%d%R"),
3181 cxx_printable_name_translate (fndecl
, 2),
3182 "locus", s
.file
, s
.line
);
3186 pp_printf (context
->printer
, _(" inlined from %qs"),
3187 cxx_printable_name_translate (fndecl
, 2));
3190 pp_character (context
->printer
, ':');
3192 pp_newline (context
->printer
);
3194 diagnostic_set_last_function (context
, diagnostic
);
3195 pp_destroy_prefix (context
->printer
);
3196 context
->printer
->prefix
= old_prefix
;
3200 /* Returns a description of FUNCTION using standard terminology. The
3201 result is a format string of the form "In CATEGORY %qs". */
3203 function_category (tree fn
)
3205 /* We can get called from the middle-end for diagnostics of function
3206 clones. Make sure we have language specific information before
3207 dereferencing it. */
3208 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn
))
3209 && DECL_FUNCTION_MEMBER_P (fn
))
3211 if (DECL_STATIC_FUNCTION_P (fn
))
3212 return _("In static member function %qs");
3213 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
3214 return _("In copy constructor %qs");
3215 else if (DECL_CONSTRUCTOR_P (fn
))
3216 return _("In constructor %qs");
3217 else if (DECL_DESTRUCTOR_P (fn
))
3218 return _("In destructor %qs");
3219 else if (LAMBDA_FUNCTION_P (fn
))
3220 return _("In lambda function");
3222 return _("In member function %qs");
3225 return _("In function %qs");
3228 /* Report the full context of a current template instantiation,
3231 print_instantiation_full_context (diagnostic_context
*context
)
3233 struct tinst_level
*p
= current_instantiation ();
3234 location_t location
= input_location
;
3238 pp_verbatim (context
->printer
,
3239 TREE_CODE (p
->decl
) == TREE_LIST
3240 ? _("%s: In substitution of %qS:\n")
3241 : _("%s: In instantiation of %q#D:\n"),
3242 LOCATION_FILE (location
),
3245 location
= p
->locus
;
3249 print_instantiation_partial_context (context
, p
, location
);
3252 /* Helper function of print_instantiation_partial_context() that
3253 prints a single line of instantiation context. */
3256 print_instantiation_partial_context_line (diagnostic_context
*context
,
3257 const struct tinst_level
*t
,
3258 location_t loc
, bool recursive_p
)
3260 if (loc
== UNKNOWN_LOCATION
)
3263 expanded_location xloc
= expand_location (loc
);
3265 if (context
->show_column
)
3266 pp_verbatim (context
->printer
, _("%r%s:%d:%d:%R "),
3267 "locus", xloc
.file
, xloc
.line
, xloc
.column
);
3269 pp_verbatim (context
->printer
, _("%r%s:%d:%R "),
3270 "locus", xloc
.file
, xloc
.line
);
3274 if (TREE_CODE (t
->decl
) == TREE_LIST
)
3275 pp_verbatim (context
->printer
,
3277 ? _("recursively required by substitution of %qS\n")
3278 : _("required by substitution of %qS\n"),
3281 pp_verbatim (context
->printer
,
3283 ? _("recursively required from %q#D\n")
3284 : _("required from %q#D\n"),
3289 pp_verbatim (context
->printer
,
3291 ? _("recursively required from here")
3292 : _("required from here"));
3296 /* Same as print_instantiation_full_context but less verbose. */
3299 print_instantiation_partial_context (diagnostic_context
*context
,
3300 struct tinst_level
*t0
, location_t loc
)
3302 struct tinst_level
*t
;
3305 location_t prev_loc
= loc
;
3307 for (t
= t0
; t
!= NULL
; t
= t
->next
)
3308 if (prev_loc
!= t
->locus
)
3310 prev_loc
= t
->locus
;
3316 if (template_backtrace_limit
3317 && n_total
> template_backtrace_limit
)
3319 int skip
= n_total
- template_backtrace_limit
;
3320 int head
= template_backtrace_limit
/ 2;
3322 /* Avoid skipping just 1. If so, skip 2. */
3326 head
= (template_backtrace_limit
- 1) / 2;
3329 for (n
= 0; n
< head
; n
++)
3331 gcc_assert (t
!= NULL
);
3332 if (loc
!= t
->locus
)
3333 print_instantiation_partial_context_line (context
, t
, loc
,
3334 /*recursive_p=*/false);
3338 if (t
!= NULL
&& skip
> 0)
3340 expanded_location xloc
;
3341 xloc
= expand_location (loc
);
3342 if (context
->show_column
)
3343 pp_verbatim (context
->printer
,
3344 _("%r%s:%d:%d:%R [ skipping %d instantiation "
3345 "contexts, use -ftemplate-backtrace-limit=0 to "
3347 "locus", xloc
.file
, xloc
.line
, xloc
.column
, skip
);
3349 pp_verbatim (context
->printer
,
3350 _("%r%s:%d:%R [ skipping %d instantiation "
3351 "contexts, use -ftemplate-backtrace-limit=0 to "
3353 "locus", xloc
.file
, xloc
.line
, skip
);
3358 } while (t
!= NULL
&& --skip
> 0);
3364 while (t
->next
!= NULL
&& t
->locus
== t
->next
->locus
)
3369 print_instantiation_partial_context_line (context
, t
, loc
,
3374 print_instantiation_partial_context_line (context
, NULL
, loc
,
3375 /*recursive_p=*/false);
3376 pp_newline (context
->printer
);
3379 /* Called from cp_thing to print the template context for an error. */
3381 maybe_print_instantiation_context (diagnostic_context
*context
)
3383 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3386 record_last_problematic_instantiation ();
3387 print_instantiation_full_context (context
);
3390 /* Report what constexpr call(s) we're trying to expand, if any. */
3393 maybe_print_constexpr_context (diagnostic_context
*context
)
3395 vec
<tree
> call_stack
= cx_error_context ();
3399 FOR_EACH_VEC_ELT (call_stack
, ix
, t
)
3401 expanded_location xloc
= expand_location (EXPR_LOCATION (t
));
3402 const char *s
= expr_as_string (t
, 0);
3403 if (context
->show_column
)
3404 pp_verbatim (context
->printer
,
3405 _("%r%s:%d:%d:%R in constexpr expansion of %qs"),
3406 "locus", xloc
.file
, xloc
.line
, xloc
.column
, s
);
3408 pp_verbatim (context
->printer
,
3409 _("%r%s:%d:%R in constexpr expansion of %qs"),
3410 "locus", xloc
.file
, xloc
.line
, s
);
3411 pp_newline (context
->printer
);
3415 /* Called from output_format -- during diagnostic message processing --
3416 to handle C++ specific format specifier with the following meanings:
3417 %A function argument-list.
3421 %F function declaration.
3422 %L language as used in extern "lang".
3424 %P function parameter whose position is indicated by an integer.
3425 %Q assignment operator.
3426 %S substitution (template + args)
3429 %X exception-specification. */
3431 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
3432 int precision
, bool wide
, bool set_locus
, bool verbose
)
3436 #define next_tree (t = va_arg (*text->args_ptr, tree))
3437 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3438 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3439 #define next_int va_arg (*text->args_ptr, int)
3441 if (precision
!= 0 || wide
)
3444 if (text
->locus
== NULL
)
3449 case 'A': result
= args_to_string (next_tree
, verbose
); break;
3450 case 'C': result
= code_to_string (next_tcode
); break;
3453 tree temp
= next_tree
;
3455 && DECL_HAS_DEBUG_EXPR_P (temp
))
3457 temp
= DECL_DEBUG_EXPR (temp
);
3460 result
= expr_to_string (temp
);
3464 result
= decl_to_string (temp
, verbose
);
3467 case 'E': result
= expr_to_string (next_tree
); break;
3468 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
3469 case 'L': result
= language_to_string (next_lang
); break;
3470 case 'O': result
= op_to_string (next_tcode
); break;
3471 case 'P': result
= parm_to_string (next_int
); break;
3472 case 'Q': result
= assop_to_string (next_tcode
); break;
3473 case 'S': result
= subst_to_string (next_tree
); break;
3474 case 'T': result
= type_to_string (next_tree
, verbose
); break;
3475 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
3476 case 'X': result
= eh_spec_to_string (next_tree
, verbose
); break;
3479 percent_K_format (text
);
3486 pp_string (pp
, result
);
3487 if (set_locus
&& t
!= NULL
)
3488 *text
->locus
= location_of (t
);
3496 /* Warn about the use of C++0x features when appropriate. */
3498 maybe_warn_cpp0x (cpp0x_warn_str str
)
3500 if ((cxx_dialect
== cxx98
) && !in_system_header_at (input_location
))
3501 /* We really want to suppress this warning in system headers,
3502 because libstdc++ uses variadic templates even when we aren't
3506 case CPP0X_INITIALIZER_LISTS
:
3507 pedwarn (input_location
, 0,
3508 "extended initializer lists "
3509 "only available with -std=c++11 or -std=gnu++11");
3511 case CPP0X_EXPLICIT_CONVERSION
:
3512 pedwarn (input_location
, 0,
3513 "explicit conversion operators "
3514 "only available with -std=c++11 or -std=gnu++11");
3516 case CPP0X_VARIADIC_TEMPLATES
:
3517 pedwarn (input_location
, 0,
3518 "variadic templates "
3519 "only available with -std=c++11 or -std=gnu++11");
3521 case CPP0X_LAMBDA_EXPR
:
3522 pedwarn (input_location
, 0,
3523 "lambda expressions "
3524 "only available with -std=c++11 or -std=gnu++11");
3527 pedwarn (input_location
, 0,
3528 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3530 case CPP0X_SCOPED_ENUMS
:
3531 pedwarn (input_location
, 0,
3532 "scoped enums only available with -std=c++11 or -std=gnu++11");
3534 case CPP0X_DEFAULTED_DELETED
:
3535 pedwarn (input_location
, 0,
3536 "defaulted and deleted functions "
3537 "only available with -std=c++11 or -std=gnu++11");
3539 case CPP0X_INLINE_NAMESPACES
:
3540 pedwarn (input_location
, OPT_Wpedantic
,
3541 "inline namespaces "
3542 "only available with -std=c++11 or -std=gnu++11");
3544 case CPP0X_OVERRIDE_CONTROLS
:
3545 pedwarn (input_location
, 0,
3546 "override controls (override/final) "
3547 "only available with -std=c++11 or -std=gnu++11");
3550 pedwarn (input_location
, 0,
3551 "non-static data member initializers "
3552 "only available with -std=c++11 or -std=gnu++11");
3554 case CPP0X_USER_DEFINED_LITERALS
:
3555 pedwarn (input_location
, 0,
3556 "user-defined literals "
3557 "only available with -std=c++11 or -std=gnu++11");
3559 case CPP0X_DELEGATING_CTORS
:
3560 pedwarn (input_location
, 0,
3561 "delegating constructors "
3562 "only available with -std=c++11 or -std=gnu++11");
3564 case CPP0X_INHERITING_CTORS
:
3565 pedwarn (input_location
, 0,
3566 "inheriting constructors "
3567 "only available with -std=c++11 or -std=gnu++11");
3569 case CPP0X_ATTRIBUTES
:
3570 pedwarn (input_location
, 0,
3572 "only available with -std=c++11 or -std=gnu++11");
3574 case CPP0X_REF_QUALIFIER
:
3575 pedwarn (input_location
, 0,
3577 "only available with -std=c++11 or -std=gnu++11");
3584 /* Warn about the use of variadic templates when appropriate. */
3586 maybe_warn_variadic_templates (void)
3588 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES
);
3592 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3593 option OPT with text GMSGID. Use this function to report
3594 diagnostics for constructs that are invalid C++98, but valid
3597 pedwarn_cxx98 (location_t location
, int opt
, const char *gmsgid
, ...)
3599 diagnostic_info diagnostic
;
3603 va_start (ap
, gmsgid
);
3604 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
3605 (cxx_dialect
== cxx98
) ? DK_PEDWARN
: DK_WARNING
);
3606 diagnostic
.option_index
= opt
;
3607 ret
= report_diagnostic (&diagnostic
);
3612 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3613 we found when we tried to do the lookup. LOCATION is the location of
3614 the NAME identifier. */
3617 qualified_name_lookup_error (tree scope
, tree name
,
3618 tree decl
, location_t location
)
3620 if (scope
== error_mark_node
)
3621 ; /* We already complained. */
3622 else if (TYPE_P (scope
))
3624 if (!COMPLETE_TYPE_P (scope
))
3625 error_at (location
, "incomplete type %qT used in nested name specifier",
3627 else if (TREE_CODE (decl
) == TREE_LIST
)
3629 error_at (location
, "reference to %<%T::%D%> is ambiguous",
3631 print_candidates (decl
);
3634 error_at (location
, "%qD is not a member of %qT", name
, scope
);
3636 else if (scope
!= global_namespace
)
3638 error_at (location
, "%qD is not a member of %qD", name
, scope
);
3639 suggest_alternatives_for (location
, name
);
3643 error_at (location
, "%<::%D%> has not been declared", name
);
3644 suggest_alternatives_for (location
, name
);