1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993-2016 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"
24 #include "stringpool.h"
25 #include "tree-diagnostic.h"
26 #include "langhooks-def.h"
28 #include "cxx-pretty-print.h"
29 #include "tree-pretty-print.h"
30 #include "c-family/c-objc.h"
32 #include "internal-fn.h"
34 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
35 #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';')
37 /* cxx_pp is a C++ front-end-specific pretty printer: this is where we
38 dump C++ ASTs as strings. It is mostly used only by the various
39 tree -> string functions that are occasionally called from the
40 debugger or by the front-end for things like
41 __PRETTY_FUNCTION__. */
42 static cxx_pretty_printer actual_pretty_printer
;
43 static cxx_pretty_printer
* const cxx_pp
= &actual_pretty_printer
;
45 /* Translate if being used for diagnostics, but not for dump files or
47 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
49 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
51 static const char *args_to_string (tree
, int);
52 static const char *assop_to_string (enum tree_code
);
53 static const char *code_to_string (enum tree_code
);
54 static const char *cv_to_string (tree
, int);
55 static const char *decl_to_string (tree
, int);
56 static const char *expr_to_string (tree
);
57 static const char *fndecl_to_string (tree
, int);
58 static const char *op_to_string (enum tree_code
);
59 static const char *parm_to_string (int);
60 static const char *type_to_string (tree
, int);
62 static void dump_alias_template_specialization (cxx_pretty_printer
*, tree
, int);
63 static void dump_type (cxx_pretty_printer
*, tree
, int);
64 static void dump_typename (cxx_pretty_printer
*, tree
, int);
65 static void dump_simple_decl (cxx_pretty_printer
*, tree
, tree
, int);
66 static void dump_decl (cxx_pretty_printer
*, tree
, int);
67 static void dump_template_decl (cxx_pretty_printer
*, tree
, int);
68 static void dump_function_decl (cxx_pretty_printer
*, tree
, int);
69 static void dump_expr (cxx_pretty_printer
*, tree
, int);
70 static void dump_unary_op (cxx_pretty_printer
*, const char *, tree
, int);
71 static void dump_binary_op (cxx_pretty_printer
*, const char *, tree
, int);
72 static void dump_aggr_type (cxx_pretty_printer
*, tree
, int);
73 static void dump_type_prefix (cxx_pretty_printer
*, tree
, int);
74 static void dump_type_suffix (cxx_pretty_printer
*, tree
, int);
75 static void dump_function_name (cxx_pretty_printer
*, tree
, int);
76 static void dump_call_expr_args (cxx_pretty_printer
*, tree
, int, bool);
77 static void dump_aggr_init_expr_args (cxx_pretty_printer
*, tree
, int, bool);
78 static void dump_expr_list (cxx_pretty_printer
*, tree
, int);
79 static void dump_global_iord (cxx_pretty_printer
*, tree
);
80 static void dump_parameters (cxx_pretty_printer
*, tree
, int);
81 static void dump_ref_qualifier (cxx_pretty_printer
*, tree
, int);
82 static void dump_exception_spec (cxx_pretty_printer
*, tree
, int);
83 static void dump_template_argument (cxx_pretty_printer
*, tree
, int);
84 static void dump_template_argument_list (cxx_pretty_printer
*, tree
, int);
85 static void dump_template_parameter (cxx_pretty_printer
*, tree
, int);
86 static void dump_template_bindings (cxx_pretty_printer
*, tree
, tree
,
88 static void dump_scope (cxx_pretty_printer
*, tree
, int);
89 static void dump_template_parms (cxx_pretty_printer
*, tree
, int, int);
90 static int get_non_default_template_args_count (tree
, int);
91 static const char *function_category (tree
);
92 static void maybe_print_constexpr_context (diagnostic_context
*);
93 static void maybe_print_instantiation_context (diagnostic_context
*);
94 static void print_instantiation_full_context (diagnostic_context
*);
95 static void print_instantiation_partial_context (diagnostic_context
*,
98 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
99 static void cp_print_error_function (diagnostic_context
*, diagnostic_info
*);
101 static bool cp_printer (pretty_printer
*, text_info
*, const char *,
102 int, bool, bool, bool);
104 /* CONTEXT->printer is a basic pretty printer that was constructed
105 presumably by diagnostic_initialize(), called early in the
106 compiler's initialization process (in general_init) Before the FE
107 is initialized. This (C++) FE-specific diagnostic initializer is
108 thus replacing the basic pretty printer with one that has C++-aware
112 cxx_initialize_diagnostics (diagnostic_context
*context
)
114 pretty_printer
*base
= context
->printer
;
115 cxx_pretty_printer
*pp
= XNEW (cxx_pretty_printer
);
116 context
->printer
= new (pp
) cxx_pretty_printer ();
118 /* It is safe to free this object because it was previously XNEW()'d. */
119 base
->~pretty_printer ();
122 c_common_diagnostics_set_defaults (context
);
123 diagnostic_starter (context
) = cp_diagnostic_starter
;
124 /* diagnostic_finalizer is already c_diagnostic_finalizer. */
125 diagnostic_format_decoder (context
) = cp_printer
;
128 /* Dump a scope, if deemed necessary. */
131 dump_scope (cxx_pretty_printer
*pp
, tree scope
, int flags
)
133 int f
= flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
);
135 if (scope
== NULL_TREE
)
138 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
140 if (scope
!= global_namespace
)
142 dump_decl (pp
, scope
, f
);
143 pp_cxx_colon_colon (pp
);
146 else if (AGGREGATE_TYPE_P (scope
))
148 dump_type (pp
, scope
, f
);
149 pp_cxx_colon_colon (pp
);
151 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
153 dump_function_decl (pp
, scope
, f
);
154 pp_cxx_colon_colon (pp
);
158 /* Dump the template ARGument under control of FLAGS. */
161 dump_template_argument (cxx_pretty_printer
*pp
, tree arg
, int flags
)
163 if (ARGUMENT_PACK_P (arg
))
164 dump_template_argument_list (pp
, ARGUMENT_PACK_ARGS (arg
),
165 /* No default args in argument packs. */
166 flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
167 else if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
168 dump_type (pp
, arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
171 if (TREE_CODE (arg
) == TREE_LIST
)
172 arg
= TREE_VALUE (arg
);
174 dump_expr (pp
, arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
178 /* Count the number of template arguments ARGS whose value does not
179 match the (optional) default template parameter in PARAMS */
182 get_non_default_template_args_count (tree args
, int flags
)
184 int n
= TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args
));
186 if (/* We use this flag when generating debug information. We don't
187 want to expand templates at this point, for this may generate
188 new decls, which gets decl counts out of sync, which may in
189 turn cause codegen differences between compilations with and
191 (flags
& TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
) != 0
192 || !flag_pretty_templates
)
195 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args
));
198 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
202 dump_template_argument_list (cxx_pretty_printer
*pp
, tree args
, int flags
)
204 int n
= get_non_default_template_args_count (args
, flags
);
208 for (i
= 0; i
< n
; ++i
)
210 tree arg
= TREE_VEC_ELT (args
, i
);
212 /* Only print a comma if we know there is an argument coming. In
213 the case of an empty template argument pack, no actual
214 argument will be printed. */
216 && (!ARGUMENT_PACK_P (arg
)
217 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
218 pp_separate_with_comma (pp
);
220 dump_template_argument (pp
, arg
, flags
);
225 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
228 dump_template_parameter (cxx_pretty_printer
*pp
, tree parm
, int flags
)
233 if (parm
== error_mark_node
)
236 p
= TREE_VALUE (parm
);
237 a
= TREE_PURPOSE (parm
);
239 if (TREE_CODE (p
) == TYPE_DECL
)
241 if (flags
& TFF_DECL_SPECIFIERS
)
243 pp_cxx_ws_string (pp
, "class");
244 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p
)))
245 pp_cxx_ws_string (pp
, "...");
247 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
249 else if (DECL_NAME (p
))
250 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
252 pp_cxx_canonical_template_parameter (pp
, TREE_TYPE (p
));
255 dump_decl (pp
, p
, flags
| TFF_DECL_SPECIFIERS
);
257 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
259 pp_cxx_whitespace (pp
);
261 pp_cxx_whitespace (pp
);
262 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
263 dump_type (pp
, a
, flags
& ~TFF_CHASE_TYPEDEF
);
265 dump_expr (pp
, a
, flags
| TFF_EXPR_IN_PARENS
);
269 /* Dump, under control of FLAGS, a template-parameter-list binding.
270 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
274 dump_template_bindings (cxx_pretty_printer
*pp
, tree parms
, tree args
,
275 vec
<tree
, va_gc
> *typenames
)
277 bool need_semicolon
= false;
283 tree p
= TREE_VALUE (parms
);
284 int lvl
= TMPL_PARMS_DEPTH (parms
);
287 tree lvl_args
= NULL_TREE
;
289 /* Don't crash if we had an invalid argument list. */
290 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
291 lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
293 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
295 tree arg
= NULL_TREE
;
297 /* Don't crash if we had an invalid argument list. */
298 if (lvl_args
&& NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
299 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
302 pp_separate_with_semicolon (pp
);
303 dump_template_parameter (pp
, TREE_VEC_ELT (p
, i
),
304 TFF_PLAIN_IDENTIFIER
);
305 pp_cxx_whitespace (pp
);
307 pp_cxx_whitespace (pp
);
310 if (ARGUMENT_PACK_P (arg
))
311 pp_cxx_left_brace (pp
);
312 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
313 if (ARGUMENT_PACK_P (arg
))
314 pp_cxx_right_brace (pp
);
317 pp_string (pp
, M_("<missing>"));
320 need_semicolon
= true;
323 parms
= TREE_CHAIN (parms
);
326 /* Don't bother with typenames for a partial instantiation. */
327 if (vec_safe_is_empty (typenames
) || uses_template_parms (args
))
330 /* Don't try to print typenames when we're processing a clone. */
331 if (current_function_decl
332 && !DECL_LANG_SPECIFIC (current_function_decl
))
335 /* Don't try to do this once cgraph starts throwing away front-end
340 FOR_EACH_VEC_SAFE_ELT (typenames
, i
, t
)
343 pp_separate_with_semicolon (pp
);
344 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
345 pp_cxx_whitespace (pp
);
347 pp_cxx_whitespace (pp
);
348 push_deferring_access_checks (dk_no_check
);
349 t
= tsubst (t
, args
, tf_none
, NULL_TREE
);
350 pop_deferring_access_checks ();
351 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
352 pp_simple_type_specifier doesn't know about it. */
353 t
= strip_typedefs (t
);
354 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
358 /* Dump a human-readable equivalent of the alias template
359 specialization of T. */
362 dump_alias_template_specialization (cxx_pretty_printer
*pp
, tree t
, int flags
)
366 gcc_assert (alias_template_specialization_p (t
));
368 if (!(flags
& TFF_UNQUALIFIED_NAME
))
369 dump_scope (pp
, CP_DECL_CONTEXT (TYPE_NAME (t
)), flags
);
370 name
= TYPE_IDENTIFIER (t
);
371 pp_cxx_tree_identifier (pp
, name
);
372 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
374 flags
& ~TFF_TEMPLATE_HEADER
);
377 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
381 dump_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
386 /* Don't print e.g. "struct mytypedef". */
387 if (TYPE_P (t
) && typedef_variant_p (t
))
389 tree decl
= TYPE_NAME (t
);
390 if ((flags
& TFF_CHASE_TYPEDEF
)
391 || DECL_SELF_REFERENCE_P (decl
)
392 || (!flag_pretty_templates
393 && DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)))
394 t
= strip_typedefs (t
);
395 else if (alias_template_specialization_p (t
))
397 dump_alias_template_specialization (pp
, t
, flags
);
400 else if (same_type_p (t
, TREE_TYPE (decl
)))
404 pp_cxx_cv_qualifier_seq (pp
, t
);
405 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
410 if (TYPE_PTRMEMFUNC_P (t
))
413 switch (TREE_CODE (t
))
416 if (t
== init_list_type_node
)
417 pp_string (pp
, M_("<brace-enclosed initializer list>"));
418 else if (t
== unknown_type_node
)
419 pp_string (pp
, M_("<unresolved overloaded function type>"));
422 pp_cxx_cv_qualifier_seq (pp
, t
);
423 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
428 /* A list of function parms. */
429 dump_parameters (pp
, t
, flags
);
432 case IDENTIFIER_NODE
:
433 pp_cxx_tree_identifier (pp
, t
);
437 dump_type (pp
, BINFO_TYPE (t
), flags
);
443 dump_aggr_type (pp
, t
, flags
);
447 if (flags
& TFF_CHASE_TYPEDEF
)
449 dump_type (pp
, DECL_ORIGINAL_TYPE (t
)
450 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
453 /* Else fall through. */
457 dump_decl (pp
, t
, flags
& ~TFF_DECL_SPECIFIERS
);
466 case FIXED_POINT_TYPE
:
467 pp_type_specifier_seq (pp
, t
);
470 case TEMPLATE_TEMPLATE_PARM
:
471 /* For parameters inside template signature. */
472 if (TYPE_IDENTIFIER (t
))
473 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
475 pp_cxx_canonical_template_parameter (pp
, t
);
478 case BOUND_TEMPLATE_TEMPLATE_PARM
:
480 tree args
= TYPE_TI_ARGS (t
);
481 pp_cxx_cv_qualifier_seq (pp
, t
);
482 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
483 pp_cxx_begin_template_argument_list (pp
);
484 dump_template_argument_list (pp
, args
, flags
);
485 pp_cxx_end_template_argument_list (pp
);
489 case TEMPLATE_TYPE_PARM
:
490 pp_cxx_cv_qualifier_seq (pp
, t
);
491 if (tree c
= PLACEHOLDER_TYPE_CONSTRAINTS (t
))
492 pp_cxx_constrained_type_spec (pp
, c
);
493 else if (TYPE_IDENTIFIER (t
))
494 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
496 pp_cxx_canonical_template_parameter
497 (pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
500 /* This is not always necessary for pointers and such, but doing this
501 reduces code size. */
510 dump_type_prefix (pp
, t
, flags
);
511 dump_type_suffix (pp
, t
, flags
);
515 if (! (flags
& TFF_CHASE_TYPEDEF
)
516 && DECL_ORIGINAL_TYPE (TYPE_NAME (t
)))
518 dump_decl (pp
, TYPE_NAME (t
), TFF_PLAIN_IDENTIFIER
);
521 pp_cxx_cv_qualifier_seq (pp
, t
);
522 pp_cxx_ws_string (pp
,
523 TYPENAME_IS_ENUM_P (t
) ? "enum"
524 : TYPENAME_IS_CLASS_P (t
) ? "class"
526 dump_typename (pp
, t
, flags
);
529 case UNBOUND_CLASS_TEMPLATE
:
530 if (! (flags
& TFF_UNQUALIFIED_NAME
))
532 dump_type (pp
, TYPE_CONTEXT (t
), flags
);
533 pp_cxx_colon_colon (pp
);
535 pp_cxx_ws_string (pp
, "template");
536 dump_type (pp
, TYPE_IDENTIFIER (t
), flags
);
540 pp_cxx_ws_string (pp
, "__typeof__");
541 pp_cxx_whitespace (pp
);
542 pp_cxx_left_paren (pp
);
543 dump_expr (pp
, TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
544 pp_cxx_right_paren (pp
);
547 case UNDERLYING_TYPE
:
548 pp_cxx_ws_string (pp
, "__underlying_type");
549 pp_cxx_whitespace (pp
);
550 pp_cxx_left_paren (pp
);
551 dump_expr (pp
, UNDERLYING_TYPE_TYPE (t
), flags
& ~TFF_EXPR_IN_PARENS
);
552 pp_cxx_right_paren (pp
);
555 case TYPE_PACK_EXPANSION
:
556 dump_type (pp
, PACK_EXPANSION_PATTERN (t
), flags
);
557 pp_cxx_ws_string (pp
, "...");
560 case TYPE_ARGUMENT_PACK
:
561 dump_template_argument (pp
, t
, flags
);
565 pp_cxx_ws_string (pp
, "decltype");
566 pp_cxx_whitespace (pp
);
567 pp_cxx_left_paren (pp
);
568 dump_expr (pp
, DECLTYPE_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
569 pp_cxx_right_paren (pp
);
573 pp_string (pp
, "std::nullptr_t");
577 pp_unsupported_tree (pp
, t
);
578 /* Fall through to error. */
581 pp_string (pp
, M_("<type error>"));
586 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
590 dump_typename (cxx_pretty_printer
*pp
, tree t
, int flags
)
592 tree ctx
= TYPE_CONTEXT (t
);
594 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
595 dump_typename (pp
, ctx
, flags
);
597 dump_type (pp
, ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
598 pp_cxx_colon_colon (pp
);
599 dump_decl (pp
, TYPENAME_TYPE_FULLNAME (t
), flags
);
602 /* Return the name of the supplied aggregate, or enumeral type. */
605 class_key_or_enum_as_string (tree t
)
607 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
609 if (SCOPED_ENUM_P (t
))
614 else if (TREE_CODE (t
) == UNION_TYPE
)
616 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
622 /* Print out a class declaration T under the control of FLAGS,
623 in the form `class foo'. */
626 dump_aggr_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
629 const char *variety
= class_key_or_enum_as_string (t
);
633 pp_cxx_cv_qualifier_seq (pp
, t
);
635 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
636 pp_cxx_ws_string (pp
, variety
);
638 name
= TYPE_NAME (t
);
642 typdef
= (!DECL_ARTIFICIAL (name
)
643 /* An alias specialization is not considered to be a
645 && !alias_template_specialization_p (t
));
648 && ((flags
& TFF_CHASE_TYPEDEF
)
649 || (!flag_pretty_templates
&& DECL_LANG_SPECIFIC (name
)
650 && DECL_TEMPLATE_INFO (name
))))
651 || DECL_SELF_REFERENCE_P (name
))
653 t
= TYPE_MAIN_VARIANT (t
);
654 name
= TYPE_NAME (t
);
658 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
659 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
660 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
661 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
663 if (! (flags
& TFF_UNQUALIFIED_NAME
))
664 dump_scope (pp
, CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
665 flags
&= ~TFF_UNQUALIFIED_NAME
;
668 /* Because the template names are mangled, we have to locate
669 the most general template, and use that name. */
670 tree tpl
= TYPE_TI_TEMPLATE (t
);
672 while (DECL_TEMPLATE_INFO (tpl
))
673 tpl
= DECL_TI_TEMPLATE (tpl
);
676 name
= DECL_NAME (name
);
679 if (name
== 0 || anon_aggrname_p (name
))
681 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
682 pp_string (pp
, M_("<anonymous>"));
684 pp_printf (pp
, M_("<anonymous %s>"), variety
);
686 else if (LAMBDA_TYPE_P (t
))
688 /* A lambda's "type" is essentially its signature. */
689 pp_string (pp
, M_("<lambda"));
690 if (lambda_function (t
))
692 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t
)),
697 pp_cxx_tree_identifier (pp
, name
);
699 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
700 !CLASSTYPE_USE_TEMPLATE (t
),
701 flags
& ~TFF_TEMPLATE_HEADER
);
704 /* Dump into the obstack the initial part of the output for a given type.
705 This is necessary when dealing with things like functions returning
708 return type of `int (* fee ())()': pointer -> function -> int. Both
709 pointer (and reference and offset) and function (and member) types must
710 deal with prefix and suffix.
712 Arrays must also do this for DECL nodes, like int a[], and for things like
716 dump_type_prefix (cxx_pretty_printer
*pp
, tree t
, int flags
)
718 if (TYPE_PTRMEMFUNC_P (t
))
720 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
724 switch (TREE_CODE (t
))
729 tree sub
= TREE_TYPE (t
);
731 dump_type_prefix (pp
, sub
, flags
);
732 if (TREE_CODE (sub
) == ARRAY_TYPE
733 || TREE_CODE (sub
) == FUNCTION_TYPE
)
735 pp_cxx_whitespace (pp
);
736 pp_cxx_left_paren (pp
);
737 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (sub
));
741 else if (TREE_CODE (t
) == REFERENCE_TYPE
)
743 if (TYPE_REF_IS_RVALUE (t
))
744 pp_ampersand_ampersand (pp
);
748 pp
->padding
= pp_before
;
749 pp_cxx_cv_qualifier_seq (pp
, t
);
755 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
756 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
759 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
760 pp_cxx_left_paren (pp
);
761 dump_type (pp
, TYPE_OFFSET_BASETYPE (t
), flags
);
762 pp_cxx_colon_colon (pp
);
765 pp_cxx_cv_qualifier_seq (pp
, t
);
766 pp
->padding
= pp_before
;
769 /* This can be reached without a pointer when dealing with
770 templates, e.g. std::is_function. */
772 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
776 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
778 pp_cxx_left_paren (pp
);
779 dump_aggr_type (pp
, TYPE_METHOD_BASETYPE (t
), flags
);
780 pp_cxx_colon_colon (pp
);
784 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
788 case IDENTIFIER_NODE
:
793 case TEMPLATE_TYPE_PARM
:
794 case TEMPLATE_TEMPLATE_PARM
:
795 case BOUND_TEMPLATE_TEMPLATE_PARM
:
806 case UNDERLYING_TYPE
:
808 case TYPE_PACK_EXPANSION
:
809 case FIXED_POINT_TYPE
:
811 dump_type (pp
, t
, flags
);
812 pp
->padding
= pp_before
;
816 pp_unsupported_tree (pp
, t
);
819 pp_string (pp
, M_("<typeprefixerror>"));
824 /* Dump the suffix of type T, under control of FLAGS. This is the part
825 which appears after the identifier (or function parms). */
828 dump_type_suffix (cxx_pretty_printer
*pp
, tree t
, int flags
)
830 if (TYPE_PTRMEMFUNC_P (t
))
831 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
833 switch (TREE_CODE (t
))
838 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
839 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
840 pp_cxx_right_paren (pp
);
841 if (TREE_CODE (t
) == POINTER_TYPE
)
842 flags
|= TFF_POINTER
;
843 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
850 if (TREE_CODE (t
) == METHOD_TYPE
)
851 /* Can only be reached through a pointer. */
852 pp_cxx_right_paren (pp
);
853 arg
= TYPE_ARG_TYPES (t
);
854 if (TREE_CODE (t
) == METHOD_TYPE
)
855 arg
= TREE_CHAIN (arg
);
857 /* Function pointers don't have default args. Not in standard C++,
858 anyway; they may in g++, but we'll just pretend otherwise. */
859 dump_parameters (pp
, arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
861 pp
->padding
= pp_before
;
862 pp_cxx_cv_qualifiers (pp
, type_memfn_quals (t
),
863 TREE_CODE (t
) == FUNCTION_TYPE
864 && (flags
& TFF_POINTER
));
865 dump_ref_qualifier (pp
, t
, flags
);
866 if (tx_safe_fn_type_p (t
))
867 pp_cxx_ws_string (pp
, "transaction_safe");
868 dump_exception_spec (pp
, TYPE_RAISES_EXCEPTIONS (t
), flags
);
869 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
875 pp_cxx_left_bracket (pp
);
876 if (tree dtype
= TYPE_DOMAIN (t
))
878 tree max
= TYPE_MAX_VALUE (dtype
);
879 /* Zero-length arrays have an upper bound of SIZE_MAX. */
880 if (integer_all_onesp (max
))
881 pp_character (pp
, '0');
882 else if (tree_fits_shwi_p (max
))
883 pp_wide_integer (pp
, tree_to_shwi (max
) + 1);
887 if (TREE_CODE (max
) == SAVE_EXPR
)
888 max
= TREE_OPERAND (max
, 0);
889 if (TREE_CODE (max
) == MINUS_EXPR
890 || TREE_CODE (max
) == PLUS_EXPR
)
892 max
= TREE_OPERAND (max
, 0);
893 while (CONVERT_EXPR_P (max
))
894 max
= TREE_OPERAND (max
, 0);
897 max
= fold_build2_loc (input_location
,
898 PLUS_EXPR
, dtype
, max
,
899 build_int_cst (dtype
, 1));
900 dump_expr (pp
, max
, flags
& ~TFF_EXPR_IN_PARENS
);
903 pp_cxx_right_bracket (pp
);
904 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
908 case IDENTIFIER_NODE
:
913 case TEMPLATE_TYPE_PARM
:
914 case TEMPLATE_TEMPLATE_PARM
:
915 case BOUND_TEMPLATE_TEMPLATE_PARM
:
926 case UNDERLYING_TYPE
:
928 case TYPE_PACK_EXPANSION
:
929 case FIXED_POINT_TYPE
:
934 pp_unsupported_tree (pp
, t
);
936 /* Don't mark it here, we should have already done in
943 dump_global_iord (cxx_pretty_printer
*pp
, tree t
)
945 const char *p
= NULL
;
947 if (DECL_GLOBAL_CTOR_P (t
))
948 p
= M_("(static initializers for %s)");
949 else if (DECL_GLOBAL_DTOR_P (t
))
950 p
= M_("(static destructors for %s)");
954 pp_printf (pp
, p
, DECL_SOURCE_FILE (t
));
958 dump_simple_decl (cxx_pretty_printer
*pp
, tree t
, tree type
, int flags
)
960 if (flags
& TFF_DECL_SPECIFIERS
)
963 && DECL_DECLARED_CONSTEXPR_P (t
))
964 pp_cxx_ws_string (pp
, "constexpr");
965 dump_type_prefix (pp
, type
, flags
& ~TFF_UNQUALIFIED_NAME
);
968 if (! (flags
& TFF_UNQUALIFIED_NAME
)
969 && TREE_CODE (t
) != PARM_DECL
970 && (!DECL_INITIAL (t
)
971 || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
))
972 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
973 flags
&= ~TFF_UNQUALIFIED_NAME
;
974 if ((flags
& TFF_DECL_SPECIFIERS
)
975 && DECL_TEMPLATE_PARM_P (t
)
976 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t
)))
977 pp_string (pp
, "...");
980 if (TREE_CODE (t
) == FIELD_DECL
&& DECL_NORMAL_CAPTURE_P (t
))
983 pp_string (pp
, IDENTIFIER_POINTER (DECL_NAME (t
)) + 2);
984 pp_string (pp
, " capture>");
987 dump_decl (pp
, DECL_NAME (t
), flags
);
990 pp_string (pp
, M_("<anonymous>"));
991 if (flags
& TFF_DECL_SPECIFIERS
)
992 dump_type_suffix (pp
, type
, flags
);
995 /* Dump a human readable string for the decl T under control of FLAGS. */
998 dump_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1003 /* If doing Objective-C++, give Objective-C a chance to demangle
1004 Objective-C method names. */
1005 if (c_dialect_objc ())
1007 const char *demangled
= objc_maybe_printable_name (t
, flags
);
1010 pp_string (pp
, demangled
);
1015 switch (TREE_CODE (t
))
1018 /* Don't say 'typedef class A' */
1019 if (DECL_ARTIFICIAL (t
) && !DECL_SELF_REFERENCE_P (t
))
1021 if ((flags
& TFF_DECL_SPECIFIERS
)
1022 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
1024 /* Say `class T' not just `T'. */
1025 pp_cxx_ws_string (pp
, "class");
1027 /* Emit the `...' for a parameter pack. */
1028 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1029 pp_cxx_ws_string (pp
, "...");
1032 dump_type (pp
, TREE_TYPE (t
), flags
);
1035 if (TYPE_DECL_ALIAS_P (t
)
1036 && (flags
& TFF_DECL_SPECIFIERS
1037 || flags
& TFF_CLASS_KEY_OR_ENUM
))
1039 pp_cxx_ws_string (pp
, "using");
1040 dump_decl (pp
, DECL_NAME (t
), flags
);
1041 pp_cxx_whitespace (pp
);
1042 pp_cxx_ws_string (pp
, "=");
1043 pp_cxx_whitespace (pp
);
1044 dump_type (pp
, DECL_ORIGINAL_TYPE (t
), flags
);
1047 if ((flags
& TFF_DECL_SPECIFIERS
)
1048 && !DECL_SELF_REFERENCE_P (t
))
1049 pp_cxx_ws_string (pp
, "typedef");
1050 dump_simple_decl (pp
, t
, DECL_ORIGINAL_TYPE (t
)
1051 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
1056 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
1058 pp_string (pp
, M_("vtable for "));
1059 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
1060 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1063 /* Else fall through. */
1066 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1068 /* Handle variable template specializations. */
1070 && DECL_LANG_SPECIFIC (t
)
1071 && DECL_TEMPLATE_INFO (t
)
1072 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
)))
1074 pp_cxx_begin_template_argument_list (pp
);
1075 tree args
= INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (t
));
1076 dump_template_argument_list (pp
, args
, flags
);
1077 pp_cxx_end_template_argument_list (pp
);
1082 pp_string (pp
, M_("<return value> "));
1083 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1086 case NAMESPACE_DECL
:
1087 if (flags
& TFF_DECL_SPECIFIERS
)
1088 pp
->declaration (t
);
1091 if (! (flags
& TFF_UNQUALIFIED_NAME
))
1092 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1093 flags
&= ~TFF_UNQUALIFIED_NAME
;
1094 if (DECL_NAME (t
) == NULL_TREE
)
1096 if (!(pp
->flags
& pp_c_flag_gnu_v3
))
1097 pp_cxx_ws_string (pp
, M_("{anonymous}"));
1099 pp_cxx_ws_string (pp
, M_("(anonymous namespace)"));
1102 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1107 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1108 pp_colon_colon (pp
);
1109 dump_decl (pp
, TREE_OPERAND (t
, 1), TFF_UNQUALIFIED_NAME
);
1113 dump_decl (pp
, TREE_OPERAND (t
, 0), flags
);
1114 pp_cxx_left_bracket (pp
);
1115 dump_decl (pp
, TREE_OPERAND (t
, 1), flags
);
1116 pp_cxx_right_bracket (pp
);
1119 case ARRAY_NOTATION_REF
:
1120 dump_decl (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
1121 pp_cxx_left_bracket (pp
);
1122 dump_decl (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
1124 dump_decl (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
1126 dump_decl (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
1127 pp_cxx_right_bracket (pp
);
1130 /* So that we can do dump_decl on an aggr type. */
1134 dump_type (pp
, t
, flags
);
1138 /* This is a pseudo destructor call which has not been folded into
1139 a PSEUDO_DTOR_EXPR yet. */
1140 pp_cxx_complement (pp
);
1141 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1148 /* These special cases are duplicated here so that other functions
1149 can feed identifiers to error and get them demangled properly. */
1150 case IDENTIFIER_NODE
:
1151 if (IDENTIFIER_TYPENAME_P (t
))
1153 pp_cxx_ws_string (pp
, "operator");
1154 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1155 dump_type (pp
, TREE_TYPE (t
), flags
);
1159 pp_cxx_tree_identifier (pp
, t
);
1165 t
= OVL_CURRENT (t
);
1166 if (DECL_CLASS_SCOPE_P (t
))
1168 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1169 pp_cxx_colon_colon (pp
);
1171 else if (!DECL_FILE_SCOPE_P (t
))
1173 dump_decl (pp
, DECL_CONTEXT (t
), flags
);
1174 pp_cxx_colon_colon (pp
);
1176 dump_decl (pp
, DECL_NAME (t
), flags
);
1180 /* If there's only one function, just treat it like an ordinary
1182 t
= OVL_CURRENT (t
);
1186 if (! DECL_LANG_SPECIFIC (t
))
1188 if (DECL_ABSTRACT_ORIGIN (t
))
1189 dump_decl (pp
, DECL_ABSTRACT_ORIGIN (t
), flags
);
1191 pp_string (pp
, M_("<built-in>"));
1193 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
1194 dump_global_iord (pp
, t
);
1196 dump_function_decl (pp
, t
, flags
);
1200 dump_template_decl (pp
, t
, flags
);
1203 case TEMPLATE_ID_EXPR
:
1205 tree name
= TREE_OPERAND (t
, 0);
1206 tree args
= TREE_OPERAND (t
, 1);
1208 if (is_overloaded_fn (name
))
1209 name
= get_first_fn (name
);
1211 name
= DECL_NAME (name
);
1212 dump_decl (pp
, name
, flags
);
1213 pp_cxx_begin_template_argument_list (pp
);
1214 if (args
== error_mark_node
)
1215 pp_string (pp
, M_("<template arguments error>"));
1217 dump_template_argument_list
1218 (pp
, args
, flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
1219 pp_cxx_end_template_argument_list (pp
);
1224 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1228 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
1229 || (DECL_INITIAL (t
) &&
1230 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
1231 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1232 else if (DECL_NAME (t
))
1233 dump_decl (pp
, DECL_NAME (t
), flags
);
1234 else if (DECL_INITIAL (t
))
1235 dump_expr (pp
, DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
1237 pp_string (pp
, M_("<enumerator>"));
1241 pp_cxx_ws_string (pp
, "using");
1242 dump_type (pp
, USING_DECL_SCOPE (t
), flags
);
1243 pp_cxx_colon_colon (pp
);
1244 dump_decl (pp
, DECL_NAME (t
), flags
);
1248 pp
->declaration (t
);
1252 dump_decl (pp
, BASELINK_FUNCTIONS (t
), flags
);
1255 case NON_DEPENDENT_EXPR
:
1256 dump_expr (pp
, t
, flags
);
1259 case TEMPLATE_TYPE_PARM
:
1260 if (flags
& TFF_DECL_SPECIFIERS
)
1261 pp
->declaration (t
);
1266 case UNBOUND_CLASS_TEMPLATE
:
1267 case TYPE_PACK_EXPANSION
:
1269 dump_type (pp
, t
, flags
);
1273 pp_unsupported_tree (pp
, t
);
1274 /* Fall through to error. */
1277 pp_string (pp
, M_("<declaration error>"));
1282 /* Dump a template declaration T under control of FLAGS. This means the
1283 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1286 dump_template_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1288 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1292 if (flags
& TFF_TEMPLATE_HEADER
)
1294 for (parms
= orig_parms
= nreverse (orig_parms
);
1296 parms
= TREE_CHAIN (parms
))
1298 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1299 int len
= TREE_VEC_LENGTH (inner_parms
);
1303 /* Skip over the dummy template levels of a template template
1305 gcc_assert (TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TEMPLATE_PARM
);
1309 pp_cxx_ws_string (pp
, "template");
1310 pp_cxx_begin_template_argument_list (pp
);
1312 /* If we've shown the template prefix, we'd better show the
1313 parameters' and decl's type too. */
1314 flags
|= TFF_DECL_SPECIFIERS
;
1316 for (i
= 0; i
< len
; i
++)
1319 pp_separate_with_comma (pp
);
1320 dump_template_parameter (pp
, TREE_VEC_ELT (inner_parms
, i
),
1323 pp_cxx_end_template_argument_list (pp
);
1324 pp_cxx_whitespace (pp
);
1326 nreverse(orig_parms
);
1328 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1330 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1331 pp_cxx_ws_string (pp
, "class");
1333 /* If this is a parameter pack, print the ellipsis. */
1334 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1335 pp_cxx_ws_string (pp
, "...");
1340 if (tree ci
= get_constraints (t
))
1341 if (check_constraint_info (ci
))
1342 if (tree reqs
= CI_TEMPLATE_REQS (ci
))
1344 pp_cxx_requires_clause (pp
, reqs
);
1345 pp_cxx_whitespace (pp
);
1348 if (DECL_CLASS_TEMPLATE_P (t
))
1349 dump_type (pp
, TREE_TYPE (t
),
1350 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1351 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1352 else if (DECL_TEMPLATE_RESULT (t
)
1353 && (VAR_P (DECL_TEMPLATE_RESULT (t
))
1354 /* Alias template. */
1355 || DECL_TYPE_TEMPLATE_P (t
)))
1356 dump_decl (pp
, DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1359 gcc_assert (TREE_TYPE (t
));
1360 switch (NEXT_CODE (t
))
1364 dump_function_decl (pp
, t
, flags
| TFF_TEMPLATE_NAME
);
1367 /* This case can occur with some invalid code. */
1368 dump_type (pp
, TREE_TYPE (t
),
1369 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1370 | (flags
& TFF_DECL_SPECIFIERS
1371 ? TFF_CLASS_KEY_OR_ENUM
: 0));
1376 /* find_typenames looks through the type of the function template T
1377 and returns a vec containing any typedefs, decltypes or TYPENAME_TYPEs
1380 struct find_typenames_t
1382 hash_set
<tree
> *p_set
;
1383 vec
<tree
, va_gc
> *typenames
;
1387 find_typenames_r (tree
*tp
, int *walk_subtrees
, void *data
)
1389 struct find_typenames_t
*d
= (struct find_typenames_t
*)data
;
1390 tree mv
= NULL_TREE
;
1392 if (TYPE_P (*tp
) && is_typedef_decl (TYPE_NAME (*tp
)))
1393 /* Add the type of the typedef without any additional cv-quals. */
1394 mv
= TREE_TYPE (TYPE_NAME (*tp
));
1395 else if (TREE_CODE (*tp
) == TYPENAME_TYPE
1396 || TREE_CODE (*tp
) == DECLTYPE_TYPE
)
1397 /* Add the typename without any cv-qualifiers. */
1398 mv
= TYPE_MAIN_VARIANT (*tp
);
1400 if (TREE_CODE (*tp
) == TYPE_PACK_EXPANSION
)
1402 /* Don't mess with parameter packs since we don't remember
1403 the pack expansion context for a particular typename. */
1404 *walk_subtrees
= false;
1408 if (mv
&& (mv
== *tp
|| !d
->p_set
->add (mv
)))
1409 vec_safe_push (d
->typenames
, mv
);
1411 /* Search into class template arguments, which cp_walk_subtrees
1413 if (CLASS_TYPE_P (*tp
) && CLASSTYPE_TEMPLATE_INFO (*tp
))
1414 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp
), find_typenames_r
,
1420 static vec
<tree
, va_gc
> *
1421 find_typenames (tree t
)
1423 struct find_typenames_t ft
;
1424 ft
.p_set
= new hash_set
<tree
>;
1425 ft
.typenames
= NULL
;
1426 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t
)),
1427 find_typenames_r
, &ft
, ft
.p_set
);
1429 return ft
.typenames
;
1432 /* Output the "[with ...]" clause for a template instantiation T iff
1433 TEMPLATE_PARMS, TEMPLATE_ARGS and FLAGS are suitable. T may be NULL if
1434 formatting a deduction/substitution diagnostic rather than an
1438 dump_substitution (cxx_pretty_printer
*pp
,
1439 tree t
, tree template_parms
, tree template_args
,
1442 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
1443 && !(flags
& TFF_NO_TEMPLATE_BINDINGS
))
1445 vec
<tree
, va_gc
> *typenames
= t
? find_typenames (t
) : NULL
;
1446 pp_cxx_whitespace (pp
);
1447 pp_cxx_left_bracket (pp
);
1448 pp
->translate_string ("with");
1449 pp_cxx_whitespace (pp
);
1450 dump_template_bindings (pp
, template_parms
, template_args
, typenames
);
1451 pp_cxx_right_bracket (pp
);
1455 /* Dump the lambda function FN including its 'mutable' qualifier and any
1456 template bindings. */
1459 dump_lambda_function (cxx_pretty_printer
*pp
,
1460 tree fn
, tree template_parms
, tree template_args
,
1463 /* A lambda's signature is essentially its "type". */
1464 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1465 if (!(TYPE_QUALS (class_of_this_parm (TREE_TYPE (fn
))) & TYPE_QUAL_CONST
))
1467 pp
->padding
= pp_before
;
1468 pp_c_ws_string (pp
, "mutable");
1470 dump_substitution (pp
, fn
, template_parms
, template_args
, flags
);
1473 /* Pretty print a function decl. There are several ways we want to print a
1474 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1475 As error can only apply the '#' flag once to give 0 and 1 for V, there
1476 is %D which doesn't print the throw specs, and %F which does. */
1479 dump_function_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1483 tree cname
= NULL_TREE
;
1484 tree template_args
= NULL_TREE
;
1485 tree template_parms
= NULL_TREE
;
1486 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1487 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1491 flags
&= ~(TFF_UNQUALIFIED_NAME
| TFF_TEMPLATE_NAME
);
1492 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1493 t
= DECL_TEMPLATE_RESULT (t
);
1495 /* Save the exceptions, in case t is a specialization and we are
1496 emitting an error about incompatible specifications. */
1497 exceptions
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t
));
1499 /* Likewise for the constexpr specifier, in case t is a specialization. */
1500 constexpr_p
= DECL_DECLARED_CONSTEXPR_P (t
);
1502 /* Pretty print template instantiations only. */
1503 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
)
1504 && flag_pretty_templates
)
1508 template_args
= DECL_TI_ARGS (t
);
1509 tmpl
= most_general_template (t
);
1510 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1512 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1517 if (DECL_NAME (t
) && LAMBDA_FUNCTION_P (t
))
1518 return dump_lambda_function (pp
, t
, template_parms
, template_args
, flags
);
1520 fntype
= TREE_TYPE (t
);
1521 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1523 if (DECL_CLASS_SCOPE_P (t
))
1524 cname
= DECL_CONTEXT (t
);
1525 /* This is for partially instantiated template methods. */
1526 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1527 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1529 if (flags
& TFF_DECL_SPECIFIERS
)
1531 if (DECL_STATIC_FUNCTION_P (t
))
1532 pp_cxx_ws_string (pp
, "static");
1533 else if (DECL_VIRTUAL_P (t
))
1534 pp_cxx_ws_string (pp
, "virtual");
1537 pp_cxx_ws_string (pp
, "constexpr");
1540 /* Print the return type? */
1542 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1543 && !DECL_DESTRUCTOR_P (t
);
1546 tree ret
= fndecl_declared_return_type (t
);
1547 dump_type_prefix (pp
, ret
, flags
);
1550 /* Print the function name. */
1551 if (!do_outer_scope
)
1555 dump_type (pp
, cname
, flags
);
1556 pp_cxx_colon_colon (pp
);
1559 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1561 dump_function_name (pp
, t
, flags
);
1563 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1565 dump_parameters (pp
, parmtypes
, flags
);
1567 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1569 pp
->padding
= pp_before
;
1570 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (fntype
));
1571 dump_ref_qualifier (pp
, fntype
, flags
);
1574 if (tx_safe_fn_type_p (fntype
))
1576 pp
->padding
= pp_before
;
1577 pp_cxx_ws_string (pp
, "transaction_safe");
1580 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1582 pp
->padding
= pp_before
;
1583 dump_exception_spec (pp
, exceptions
, flags
);
1587 dump_type_suffix (pp
, TREE_TYPE (fntype
), flags
);
1590 if (tree ci
= get_constraints (t
))
1591 if (tree reqs
= CI_DECLARATOR_REQS (ci
))
1592 pp_cxx_requires_clause (pp
, reqs
);
1594 dump_substitution (pp
, t
, template_parms
, template_args
, flags
);
1596 else if (template_args
)
1598 bool need_comma
= false;
1600 pp_cxx_begin_template_argument_list (pp
);
1601 template_args
= INNERMOST_TEMPLATE_ARGS (template_args
);
1602 for (i
= 0; i
< TREE_VEC_LENGTH (template_args
); ++i
)
1604 tree arg
= TREE_VEC_ELT (template_args
, i
);
1606 pp_separate_with_comma (pp
);
1607 if (ARGUMENT_PACK_P (arg
))
1608 pp_cxx_left_brace (pp
);
1609 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
1610 if (ARGUMENT_PACK_P (arg
))
1611 pp_cxx_right_brace (pp
);
1614 pp_cxx_end_template_argument_list (pp
);
1618 /* Print a parameter list. If this is for a member function, the
1619 member object ptr (and any other hidden args) should have
1620 already been removed. */
1623 dump_parameters (cxx_pretty_printer
*pp
, tree parmtypes
, int flags
)
1626 flags
&= ~TFF_SCOPE
;
1627 pp_cxx_left_paren (pp
);
1629 for (first
= 1; parmtypes
!= void_list_node
;
1630 parmtypes
= TREE_CHAIN (parmtypes
))
1633 pp_separate_with_comma (pp
);
1637 pp_cxx_ws_string (pp
, "...");
1641 dump_type (pp
, TREE_VALUE (parmtypes
), flags
);
1643 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1645 pp_cxx_whitespace (pp
);
1647 pp_cxx_whitespace (pp
);
1648 dump_expr (pp
, TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1652 pp_cxx_right_paren (pp
);
1655 /* Print ref-qualifier of a FUNCTION_TYPE or METHOD_TYPE. FLAGS are ignored. */
1658 dump_ref_qualifier (cxx_pretty_printer
*pp
, tree t
, int flags ATTRIBUTE_UNUSED
)
1660 if (FUNCTION_REF_QUALIFIED (t
))
1662 pp
->padding
= pp_before
;
1663 if (FUNCTION_RVALUE_QUALIFIED (t
))
1664 pp_cxx_ws_string (pp
, "&&");
1666 pp_cxx_ws_string (pp
, "&");
1670 /* Print an exception specification. T is the exception specification. */
1673 dump_exception_spec (cxx_pretty_printer
*pp
, tree t
, int flags
)
1675 if (t
&& TREE_PURPOSE (t
))
1677 pp_cxx_ws_string (pp
, "noexcept");
1678 if (!integer_onep (TREE_PURPOSE (t
)))
1680 pp_cxx_whitespace (pp
);
1681 pp_cxx_left_paren (pp
);
1682 if (DEFERRED_NOEXCEPT_SPEC_P (t
))
1683 pp_cxx_ws_string (pp
, "<uninstantiated>");
1685 dump_expr (pp
, TREE_PURPOSE (t
), flags
);
1686 pp_cxx_right_paren (pp
);
1691 pp_cxx_ws_string (pp
, "throw");
1692 pp_cxx_whitespace (pp
);
1693 pp_cxx_left_paren (pp
);
1694 if (TREE_VALUE (t
) != NULL_TREE
)
1697 dump_type (pp
, TREE_VALUE (t
), flags
);
1701 pp_separate_with_comma (pp
);
1703 pp_cxx_right_paren (pp
);
1707 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1708 and destructors properly. */
1711 dump_function_name (cxx_pretty_printer
*pp
, tree t
, int flags
)
1713 tree name
= DECL_NAME (t
);
1715 /* We can get here with a decl that was synthesized by language-
1716 independent machinery (e.g. coverage.c) in which case it won't
1717 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1718 will crash. In this case it is safe just to print out the
1720 if (!DECL_LANG_SPECIFIC (t
))
1722 pp_cxx_tree_identifier (pp
, name
);
1726 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1727 t
= DECL_TEMPLATE_RESULT (t
);
1729 /* Don't let the user see __comp_ctor et al. */
1730 if (DECL_CONSTRUCTOR_P (t
)
1731 || DECL_DESTRUCTOR_P (t
))
1733 if (LAMBDA_TYPE_P (DECL_CONTEXT (t
)))
1734 name
= get_identifier ("<lambda>");
1735 else if (TYPE_ANONYMOUS_P (DECL_CONTEXT (t
)))
1736 name
= get_identifier ("<constructor>");
1738 name
= constructor_name (DECL_CONTEXT (t
));
1741 if (DECL_DESTRUCTOR_P (t
))
1743 pp_cxx_complement (pp
);
1744 dump_decl (pp
, name
, TFF_PLAIN_IDENTIFIER
);
1746 else if (DECL_CONV_FN_P (t
))
1748 /* This cannot use the hack that the operator's return
1749 type is stashed off of its name because it may be
1750 used for error reporting. In the case of conflicting
1751 declarations, both will have the same name, yet
1752 the types will be different, hence the TREE_TYPE field
1753 of the first name will be clobbered by the second. */
1754 pp_cxx_ws_string (pp
, "operator");
1755 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1757 else if (name
&& IDENTIFIER_OPNAME_P (name
))
1758 pp_cxx_tree_identifier (pp
, name
);
1759 else if (name
&& UDLIT_OPER_P (name
))
1760 pp_cxx_tree_identifier (pp
, name
);
1762 dump_decl (pp
, name
, flags
);
1764 if (DECL_TEMPLATE_INFO (t
)
1765 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1766 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1767 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1768 dump_template_parms (pp
, DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
),
1772 /* Dump the template parameters from the template info INFO under control of
1773 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1774 specialization (partial or complete). For partial specializations we show
1775 the specialized parameter values. For a primary template we show no
1779 dump_template_parms (cxx_pretty_printer
*pp
, tree info
,
1780 int primary
, int flags
)
1782 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1784 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1786 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1787 pp_cxx_begin_template_argument_list (pp
);
1789 /* Be careful only to print things when we have them, so as not
1790 to crash producing error messages. */
1791 if (args
&& !primary
)
1794 len
= get_non_default_template_args_count (args
, flags
);
1796 args
= INNERMOST_TEMPLATE_ARGS (args
);
1797 for (ix
= 0; ix
!= len
; ix
++)
1799 tree arg
= TREE_VEC_ELT (args
, ix
);
1801 /* Only print a comma if we know there is an argument coming. In
1802 the case of an empty template argument pack, no actual
1803 argument will be printed. */
1805 && (!ARGUMENT_PACK_P (arg
)
1806 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
1807 pp_separate_with_comma (pp
);
1810 pp_string (pp
, M_("<template parameter error>"));
1812 dump_template_argument (pp
, arg
, flags
);
1817 tree tpl
= TI_TEMPLATE (info
);
1818 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1821 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1822 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1824 for (ix
= 0; ix
!= len
; ix
++)
1828 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1830 pp_string (pp
, M_("<template parameter error>"));
1834 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1837 pp_separate_with_comma (pp
);
1839 dump_decl (pp
, parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1842 pp_cxx_end_template_argument_list (pp
);
1845 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1846 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1849 dump_call_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
, bool skipfirst
)
1852 call_expr_arg_iterator iter
;
1854 pp_cxx_left_paren (pp
);
1855 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1861 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1862 if (more_call_expr_args_p (&iter
))
1863 pp_separate_with_comma (pp
);
1866 pp_cxx_right_paren (pp
);
1869 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1870 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1874 dump_aggr_init_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
,
1878 aggr_init_expr_arg_iterator iter
;
1880 pp_cxx_left_paren (pp
);
1881 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1887 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1888 if (more_aggr_init_expr_args_p (&iter
))
1889 pp_separate_with_comma (pp
);
1892 pp_cxx_right_paren (pp
);
1895 /* Print out a list of initializers (subr of dump_expr). */
1898 dump_expr_list (cxx_pretty_printer
*pp
, tree l
, int flags
)
1902 dump_expr (pp
, TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1905 pp_separate_with_comma (pp
);
1909 /* Print out a vector of initializers (subr of dump_expr). */
1912 dump_expr_init_vec (cxx_pretty_printer
*pp
, vec
<constructor_elt
, va_gc
> *v
,
1915 unsigned HOST_WIDE_INT idx
;
1918 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1920 dump_expr (pp
, value
, flags
| TFF_EXPR_IN_PARENS
);
1921 if (idx
!= v
->length () - 1)
1922 pp_separate_with_comma (pp
);
1927 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1928 function. Resolve it to a close relative -- in the sense of static
1929 type -- variant being overridden. That is close to what was written in
1930 the source code. Subroutine of dump_expr. */
1933 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1935 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1936 HOST_WIDE_INT index
= tree_to_uhwi (OBJ_TYPE_REF_TOKEN (ref
));
1937 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1940 fun
= TREE_CHAIN (fun
);
1941 index
-= (TARGET_VTABLE_USES_DESCRIPTORS
1942 ? TARGET_VTABLE_USES_DESCRIPTORS
: 1);
1948 /* Print out an expression E under control of FLAGS. */
1951 dump_expr (cxx_pretty_printer
*pp
, tree t
, int flags
)
1958 if (STATEMENT_CLASS_P (t
))
1960 pp_cxx_ws_string (pp
, M_("<statement>"));
1964 switch (TREE_CODE (t
))
1972 case NAMESPACE_DECL
:
1976 case IDENTIFIER_NODE
:
1977 dump_decl (pp
, t
, ((flags
& ~(TFF_DECL_SPECIFIERS
|TFF_RETURN_TYPE
1978 |TFF_TEMPLATE_HEADER
))
1979 | TFF_NO_FUNCTION_ARGUMENTS
));
1983 if (SSA_NAME_VAR (t
)
1984 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t
)))
1985 dump_expr (pp
, SSA_NAME_VAR (t
), flags
);
1987 pp_cxx_ws_string (pp
, M_("<unknown>"));
1998 case USERDEF_LITERAL
:
1999 pp_cxx_userdef_literal (pp
, t
);
2003 /* While waiting for caret diagnostics, avoid printing
2004 __cxa_allocate_exception, __cxa_throw, and the like. */
2005 pp_cxx_ws_string (pp
, M_("<throw-expression>"));
2010 dump_type (pp
, PTRMEM_CST_CLASS (t
), flags
);
2011 pp_cxx_colon_colon (pp
);
2012 pp_cxx_tree_identifier (pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
2016 pp_cxx_left_paren (pp
);
2017 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2018 pp_separate_with_comma (pp
);
2019 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2020 pp_cxx_right_paren (pp
);
2024 pp_cxx_left_paren (pp
);
2025 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2026 pp_string (pp
, " ? ");
2027 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2028 pp_string (pp
, " : ");
2029 dump_expr (pp
, TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
2030 pp_cxx_right_paren (pp
);
2034 if (TREE_HAS_CONSTRUCTOR (t
))
2036 pp_cxx_ws_string (pp
, "new");
2037 pp_cxx_whitespace (pp
);
2038 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
2041 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2044 case AGGR_INIT_EXPR
:
2046 tree fn
= NULL_TREE
;
2048 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
2049 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
2051 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
2053 if (DECL_CONSTRUCTOR_P (fn
))
2054 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
2056 dump_decl (pp
, fn
, 0);
2059 dump_expr (pp
, AGGR_INIT_EXPR_FN (t
), 0);
2061 dump_aggr_init_expr_args (pp
, t
, flags
, true);
2066 tree fn
= CALL_EXPR_FN (t
);
2067 bool skipfirst
= false;
2069 /* Deal with internal functions. */
2070 if (fn
== NULL_TREE
)
2072 pp_string (pp
, internal_fn_name (CALL_EXPR_IFN (t
)));
2073 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2077 if (TREE_CODE (fn
) == ADDR_EXPR
)
2078 fn
= TREE_OPERAND (fn
, 0);
2080 /* Nobody is interested in seeing the guts of vcalls. */
2081 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
2082 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
2084 if (TREE_TYPE (fn
) != NULL_TREE
2085 && NEXT_CODE (fn
) == METHOD_TYPE
2086 && call_expr_nargs (t
))
2088 tree ob
= CALL_EXPR_ARG (t
, 0);
2089 if (TREE_CODE (ob
) == ADDR_EXPR
)
2091 dump_expr (pp
, TREE_OPERAND (ob
, 0),
2092 flags
| TFF_EXPR_IN_PARENS
);
2095 else if (TREE_CODE (ob
) != PARM_DECL
2096 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
2098 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2103 if (flag_sanitize
& SANITIZE_UNDEFINED
2104 && is_ubsan_builtin_p (fn
))
2106 pp_string (cxx_pp
, M_("<ubsan routine call>"));
2109 dump_expr (pp
, fn
, flags
| TFF_EXPR_IN_PARENS
);
2110 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2115 /* Note that this only works for G++ target exprs. If somebody
2116 builds a general TARGET_EXPR, there's no way to represent that
2117 it initializes anything other that the parameter slot for the
2118 default argument. Note we may have cleared out the first
2119 operand in expand_expr, so don't go killing ourselves. */
2120 if (TREE_OPERAND (t
, 1))
2121 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2124 case POINTER_PLUS_EXPR
:
2125 dump_binary_op (pp
, "+", t
, flags
);
2130 dump_binary_op (pp
, assignment_operator_name_info
[NOP_EXPR
].name
,
2137 case TRUNC_DIV_EXPR
:
2138 case TRUNC_MOD_EXPR
:
2146 case TRUTH_ANDIF_EXPR
:
2147 case TRUTH_ORIF_EXPR
:
2154 case EXACT_DIV_EXPR
:
2155 dump_binary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2159 case FLOOR_DIV_EXPR
:
2160 case ROUND_DIV_EXPR
:
2162 dump_binary_op (pp
, "/", t
, flags
);
2166 case FLOOR_MOD_EXPR
:
2167 case ROUND_MOD_EXPR
:
2168 dump_binary_op (pp
, "%", t
, flags
);
2173 tree ob
= TREE_OPERAND (t
, 0);
2174 if (INDIRECT_REF_P (ob
))
2176 ob
= TREE_OPERAND (ob
, 0);
2177 if (TREE_CODE (ob
) != PARM_DECL
2179 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
2181 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2182 if (TREE_CODE (TREE_TYPE (ob
)) == REFERENCE_TYPE
)
2190 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2193 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
2198 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2199 pp_cxx_left_bracket (pp
);
2200 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2201 pp_cxx_right_bracket (pp
);
2204 case ARRAY_NOTATION_REF
:
2205 dump_expr (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
2206 pp_cxx_left_bracket (pp
);
2207 dump_expr (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
2209 dump_expr (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
2211 dump_expr (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
2212 pp_cxx_right_bracket (pp
);
2215 case UNARY_PLUS_EXPR
:
2216 dump_unary_op (pp
, "+", t
, flags
);
2220 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
2221 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
2222 /* An ADDR_EXPR can have reference type. In that case, we
2223 shouldn't print the `&' doing so indicates to the user
2224 that the expression has pointer type. */
2226 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
2227 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2228 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
2229 dump_unary_op (pp
, "&&", t
, flags
);
2231 dump_unary_op (pp
, "&", t
, flags
);
2235 if (TREE_HAS_CONSTRUCTOR (t
))
2237 t
= TREE_OPERAND (t
, 0);
2238 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
2239 dump_expr (pp
, CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
2240 dump_call_expr_args (pp
, t
, flags
, true);
2244 if (TREE_OPERAND (t
,0) != NULL_TREE
2245 && TREE_TYPE (TREE_OPERAND (t
, 0))
2246 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
2247 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2249 dump_unary_op (pp
, "*", t
, flags
);
2254 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
2255 && integer_zerop (TREE_OPERAND (t
, 1)))
2256 dump_expr (pp
, TREE_OPERAND (TREE_OPERAND (t
, 0), 0), flags
);
2260 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2262 pp_cxx_left_paren (pp
);
2263 if (!integer_onep (TYPE_SIZE_UNIT
2264 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))))))
2266 pp_cxx_left_paren (pp
);
2267 dump_type (pp
, ptr_type_node
, flags
);
2268 pp_cxx_right_paren (pp
);
2271 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2272 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2274 pp_cxx_ws_string (pp
, "+");
2275 dump_expr (pp
, fold_convert (ssizetype
, TREE_OPERAND (t
, 1)),
2277 pp_cxx_right_paren (pp
);
2284 case TRUTH_NOT_EXPR
:
2285 case PREDECREMENT_EXPR
:
2286 case PREINCREMENT_EXPR
:
2287 dump_unary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2290 case POSTDECREMENT_EXPR
:
2291 case POSTINCREMENT_EXPR
:
2292 pp_cxx_left_paren (pp
);
2293 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2294 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2295 pp_cxx_right_paren (pp
);
2298 case NON_LVALUE_EXPR
:
2299 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2300 should be another level of INDIRECT_REF so that I don't have to do
2302 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
2304 tree next
= TREE_TYPE (TREE_TYPE (t
));
2306 while (TYPE_PTR_P (next
))
2307 next
= TREE_TYPE (next
);
2309 if (TREE_CODE (next
) == FUNCTION_TYPE
)
2311 if (flags
& TFF_EXPR_IN_PARENS
)
2312 pp_cxx_left_paren (pp
);
2314 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2315 if (flags
& TFF_EXPR_IN_PARENS
)
2316 pp_cxx_right_paren (pp
);
2319 /* Else fall through. */
2321 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2325 case IMPLICIT_CONV_EXPR
:
2326 case VIEW_CONVERT_EXPR
:
2328 tree op
= TREE_OPERAND (t
, 0);
2329 tree ttype
= TREE_TYPE (t
);
2330 tree optype
= TREE_TYPE (op
);
2332 if (TREE_CODE (ttype
) != TREE_CODE (optype
)
2333 && POINTER_TYPE_P (ttype
)
2334 && POINTER_TYPE_P (optype
)
2335 && same_type_p (TREE_TYPE (optype
),
2338 if (TREE_CODE (ttype
) == REFERENCE_TYPE
)
2341 if (TREE_CODE (op
) == ADDR_EXPR
)
2342 dump_expr (pp
, TREE_OPERAND (op
, 0), flags
);
2344 dump_unary_op (pp
, "*", t
, flags
);
2347 dump_unary_op (pp
, "&", t
, flags
);
2349 else if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
2351 /* It is a cast, but we cannot tell whether it is a
2352 reinterpret or static cast. Use the C style notation. */
2353 if (flags
& TFF_EXPR_IN_PARENS
)
2354 pp_cxx_left_paren (pp
);
2355 pp_cxx_left_paren (pp
);
2356 dump_type (pp
, TREE_TYPE (t
), flags
);
2357 pp_cxx_right_paren (pp
);
2358 dump_expr (pp
, op
, flags
| TFF_EXPR_IN_PARENS
);
2359 if (flags
& TFF_EXPR_IN_PARENS
)
2360 pp_cxx_right_paren (pp
);
2363 dump_expr (pp
, op
, flags
);
2368 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
2370 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
2372 if (integer_zerop (idx
))
2374 /* A NULL pointer-to-member constant. */
2375 pp_cxx_left_paren (pp
);
2376 pp_cxx_left_paren (pp
);
2377 dump_type (pp
, TREE_TYPE (t
), flags
);
2378 pp_cxx_right_paren (pp
);
2379 pp_character (pp
, '0');
2380 pp_cxx_right_paren (pp
);
2383 else if (tree_fits_shwi_p (idx
))
2386 unsigned HOST_WIDE_INT n
;
2388 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
2389 t
= TYPE_METHOD_BASETYPE (t
);
2390 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
2392 n
= tree_to_shwi (idx
);
2394 /* Map vtable index back one, to allow for the null pointer to
2398 while (n
> 0 && virtuals
)
2401 virtuals
= TREE_CHAIN (virtuals
);
2405 dump_expr (pp
, BV_FN (virtuals
),
2406 flags
| TFF_EXPR_IN_PARENS
);
2411 if (TREE_TYPE (t
) && LAMBDA_TYPE_P (TREE_TYPE (t
)))
2412 pp_string (pp
, "<lambda closure object>");
2413 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
2415 dump_type (pp
, TREE_TYPE (t
), 0);
2416 pp_cxx_left_paren (pp
);
2417 pp_cxx_right_paren (pp
);
2421 if (!BRACE_ENCLOSED_INITIALIZER_P (t
))
2422 dump_type (pp
, TREE_TYPE (t
), 0);
2423 pp_cxx_left_brace (pp
);
2424 dump_expr_init_vec (pp
, CONSTRUCTOR_ELTS (t
), flags
);
2425 pp_cxx_right_brace (pp
);
2432 tree ob
= TREE_OPERAND (t
, 0);
2433 if (is_dummy_object (ob
))
2435 t
= TREE_OPERAND (t
, 1);
2436 if (TREE_CODE (t
) == FUNCTION_DECL
)
2438 dump_expr (pp
, t
, flags
| TFF_EXPR_IN_PARENS
);
2439 else if (BASELINK_P (t
))
2440 dump_expr (pp
, OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
2441 flags
| TFF_EXPR_IN_PARENS
);
2443 dump_decl (pp
, t
, flags
);
2447 if (INDIRECT_REF_P (ob
))
2449 dump_expr (pp
, TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
2455 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2459 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2464 case TEMPLATE_PARM_INDEX
:
2465 dump_decl (pp
, TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
2469 if (TREE_OPERAND (t
, 0) == NULL_TREE
2470 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
2472 dump_type (pp
, TREE_TYPE (t
), flags
);
2473 pp_cxx_left_paren (pp
);
2474 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2475 pp_cxx_right_paren (pp
);
2479 pp_cxx_left_paren (pp
);
2480 dump_type (pp
, TREE_TYPE (t
), flags
);
2481 pp_cxx_right_paren (pp
);
2482 pp_cxx_left_paren (pp
);
2483 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2484 pp_cxx_right_paren (pp
);
2488 case STATIC_CAST_EXPR
:
2489 pp_cxx_ws_string (pp
, "static_cast");
2491 case REINTERPRET_CAST_EXPR
:
2492 pp_cxx_ws_string (pp
, "reinterpret_cast");
2494 case CONST_CAST_EXPR
:
2495 pp_cxx_ws_string (pp
, "const_cast");
2497 case DYNAMIC_CAST_EXPR
:
2498 pp_cxx_ws_string (pp
, "dynamic_cast");
2500 pp_cxx_begin_template_argument_list (pp
);
2501 dump_type (pp
, TREE_TYPE (t
), flags
);
2502 pp_cxx_end_template_argument_list (pp
);
2503 pp_cxx_left_paren (pp
);
2504 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2505 pp_cxx_right_paren (pp
);
2509 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2515 if (TREE_CODE (t
) == SIZEOF_EXPR
)
2516 pp_cxx_ws_string (pp
, "sizeof");
2519 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
2520 pp_cxx_ws_string (pp
, "__alignof__");
2522 op
= TREE_OPERAND (t
, 0);
2523 if (PACK_EXPANSION_P (op
))
2525 pp_string (pp
, "...");
2526 op
= PACK_EXPANSION_PATTERN (op
);
2528 pp_cxx_whitespace (pp
);
2529 pp_cxx_left_paren (pp
);
2530 if (TREE_CODE (t
) == SIZEOF_EXPR
&& SIZEOF_EXPR_TYPE_P (t
))
2531 dump_type (pp
, TREE_TYPE (op
), flags
);
2532 else if (TYPE_P (TREE_OPERAND (t
, 0)))
2533 dump_type (pp
, op
, flags
);
2535 dump_expr (pp
, op
, flags
);
2536 pp_cxx_right_paren (pp
);
2539 case AT_ENCODE_EXPR
:
2540 pp_cxx_ws_string (pp
, "@encode");
2541 pp_cxx_whitespace (pp
);
2542 pp_cxx_left_paren (pp
);
2543 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
2544 pp_cxx_right_paren (pp
);
2548 pp_cxx_ws_string (pp
, "noexcept");
2549 pp_cxx_whitespace (pp
);
2550 pp_cxx_left_paren (pp
);
2551 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2552 pp_cxx_right_paren (pp
);
2557 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2558 pp_cxx_whitespace (pp
);
2559 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2563 pp_string (pp
, M_("<unparsed>"));
2566 case TRY_CATCH_EXPR
:
2567 case WITH_CLEANUP_EXPR
:
2568 case CLEANUP_POINT_EXPR
:
2569 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2572 case PSEUDO_DTOR_EXPR
:
2573 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2575 if (TREE_OPERAND (t
, 1))
2577 dump_type (pp
, TREE_OPERAND (t
, 1), flags
);
2578 pp_cxx_colon_colon (pp
);
2580 pp_cxx_complement (pp
);
2581 dump_type (pp
, TREE_OPERAND (t
, 2), flags
);
2584 case TEMPLATE_ID_EXPR
:
2585 dump_decl (pp
, t
, flags
);
2591 case STATEMENT_LIST
:
2592 /* We don't yet have a way of dumping statements in a
2593 human-readable format. */
2594 pp_string (pp
, "({...})");
2598 pp_string (pp
, "while (1) { ");
2599 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2600 pp_cxx_right_brace (pp
);
2604 pp_string (pp
, "if (");
2605 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2606 pp_string (pp
, ") break; ");
2610 dump_expr (pp
, BASELINK_FUNCTIONS (t
), flags
& ~TFF_EXPR_IN_PARENS
);
2613 case EMPTY_CLASS_EXPR
:
2614 dump_type (pp
, TREE_TYPE (t
), flags
);
2615 pp_cxx_left_paren (pp
);
2616 pp_cxx_right_paren (pp
);
2619 case NON_DEPENDENT_EXPR
:
2620 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2623 case ARGUMENT_PACK_SELECT
:
2624 dump_template_argument (pp
, ARGUMENT_PACK_SELECT_FROM_PACK (t
), flags
);
2636 pp_type_specifier_seq (pp
, t
);
2640 /* We get here when we want to print a dependent type as an
2641 id-expression, without any disambiguator decoration. */
2642 pp
->id_expression (t
);
2645 case TEMPLATE_TYPE_PARM
:
2646 case TEMPLATE_TEMPLATE_PARM
:
2647 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2648 dump_type (pp
, t
, flags
);
2652 pp_cxx_trait_expression (pp
, t
);
2656 pp_cxx_va_arg_expression (pp
, t
);
2660 pp_cxx_offsetof_expression (pp
, t
);
2664 dump_decl (pp
, t
, flags
);
2667 case EXPR_PACK_EXPANSION
:
2674 case VEC_DELETE_EXPR
:
2680 case UNORDERED_EXPR
:
2690 case FIX_TRUNC_EXPR
:
2695 case TRUTH_AND_EXPR
:
2697 case TRUTH_XOR_EXPR
:
2698 if (flags
& TFF_EXPR_IN_PARENS
)
2699 pp_cxx_left_paren (pp
);
2701 if (flags
& TFF_EXPR_IN_PARENS
)
2702 pp_cxx_right_paren (pp
);
2706 dump_expr (pp
, resolve_virtual_fun_from_obj_type_ref (t
), flags
);
2710 pp_string (pp
, M_("<lambda>"));
2714 pp_cxx_left_paren (pp
);
2715 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2716 pp_cxx_right_paren (pp
);
2720 pp_cxx_requires_expr (cxx_pp
, t
);
2724 pp_cxx_simple_requirement (cxx_pp
, t
);
2728 pp_cxx_type_requirement (cxx_pp
, t
);
2732 pp_cxx_compound_requirement (cxx_pp
, t
);
2736 pp_cxx_nested_requirement (cxx_pp
, t
);
2748 pp_cxx_constraint (cxx_pp
, t
);
2751 case PLACEHOLDER_EXPR
:
2752 pp_string (pp
, M_("*this"));
2755 /* This list is incomplete, but should suffice for now.
2756 It is very important that `sorry' does not call
2757 `report_error_function'. That could cause an infinite loop. */
2759 pp_unsupported_tree (pp
, t
);
2760 /* fall through to ERROR_MARK... */
2762 pp_string (pp
, M_("<expression error>"));
2768 dump_binary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
,
2771 pp_cxx_left_paren (pp
);
2772 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2773 pp_cxx_whitespace (pp
);
2775 pp_cxx_ws_string (pp
, opstring
);
2777 pp_string (pp
, M_("<unknown operator>"));
2778 pp_cxx_whitespace (pp
);
2779 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2780 pp_cxx_right_paren (pp
);
2784 dump_unary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
, int flags
)
2786 if (flags
& TFF_EXPR_IN_PARENS
)
2787 pp_cxx_left_paren (pp
);
2788 pp_cxx_ws_string (pp
, opstring
);
2789 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2790 if (flags
& TFF_EXPR_IN_PARENS
)
2791 pp_cxx_right_paren (pp
);
2795 reinit_cxx_pp (void)
2797 pp_clear_output_area (cxx_pp
);
2798 cxx_pp
->padding
= pp_none
;
2799 pp_indentation (cxx_pp
) = 0;
2800 pp_needs_newline (cxx_pp
) = false;
2801 cxx_pp
->enclosing_scope
= current_function_decl
;
2804 /* Same as pp_formatted_text, except the return string is a separate
2805 copy and has a GGC storage duration, e.g. an indefinite lifetime. */
2808 pp_ggc_formatted_text (pretty_printer
*pp
)
2810 return ggc_strdup (pp_formatted_text (pp
));
2813 /* Exported interface to stringifying types, exprs and decls under TFF_*
2817 type_as_string (tree typ
, int flags
)
2820 pp_translate_identifiers (cxx_pp
) = false;
2821 dump_type (cxx_pp
, typ
, flags
);
2822 return pp_ggc_formatted_text (cxx_pp
);
2826 type_as_string_translate (tree typ
, int flags
)
2829 dump_type (cxx_pp
, typ
, flags
);
2830 return pp_ggc_formatted_text (cxx_pp
);
2834 expr_as_string (tree decl
, int flags
)
2837 pp_translate_identifiers (cxx_pp
) = false;
2838 dump_expr (cxx_pp
, decl
, flags
);
2839 return pp_ggc_formatted_text (cxx_pp
);
2842 /* Wrap decl_as_string with options appropriate for dwarf. */
2845 decl_as_dwarf_string (tree decl
, int flags
)
2848 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2849 here will be adequate to get the desired behavior. */
2850 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2851 name
= decl_as_string (decl
, flags
);
2852 /* Subsequent calls to the pretty printer shouldn't use this style. */
2853 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2858 decl_as_string (tree decl
, int flags
)
2861 pp_translate_identifiers (cxx_pp
) = false;
2862 dump_decl (cxx_pp
, decl
, flags
);
2863 return pp_ggc_formatted_text (cxx_pp
);
2867 decl_as_string_translate (tree decl
, int flags
)
2870 dump_decl (cxx_pp
, decl
, flags
);
2871 return pp_ggc_formatted_text (cxx_pp
);
2874 /* Wrap lang_decl_name with options appropriate for dwarf. */
2877 lang_decl_dwarf_name (tree decl
, int v
, bool translate
)
2880 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2881 here will be adequate to get the desired behavior. */
2882 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2883 name
= lang_decl_name (decl
, v
, translate
);
2884 /* Subsequent calls to the pretty printer shouldn't use this style. */
2885 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2889 /* Generate the three forms of printable names for cxx_printable_name. */
2892 lang_decl_name (tree decl
, int v
, bool translate
)
2896 ? decl_as_string_translate (decl
, TFF_DECL_SPECIFIERS
)
2897 : decl_as_string (decl
, TFF_DECL_SPECIFIERS
));
2900 pp_translate_identifiers (cxx_pp
) = translate
;
2902 && (DECL_CLASS_SCOPE_P (decl
)
2903 || (DECL_NAMESPACE_SCOPE_P (decl
)
2904 && CP_DECL_CONTEXT (decl
) != global_namespace
)))
2906 dump_type (cxx_pp
, CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2907 pp_cxx_colon_colon (cxx_pp
);
2910 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2911 dump_function_name (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
);
2912 else if ((DECL_NAME (decl
) == NULL_TREE
)
2913 && TREE_CODE (decl
) == NAMESPACE_DECL
)
2914 dump_decl (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
| TFF_UNQUALIFIED_NAME
);
2916 dump_decl (cxx_pp
, DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2918 return pp_ggc_formatted_text (cxx_pp
);
2921 /* Return the location of a tree passed to %+ formats. */
2924 location_of (tree t
)
2928 t
= TYPE_MAIN_DECL (t
);
2930 return input_location
;
2932 else if (TREE_CODE (t
) == OVERLOAD
)
2933 t
= OVL_FUNCTION (t
);
2936 return DECL_SOURCE_LOCATION (t
);
2937 return EXPR_LOC_OR_LOC (t
, input_location
);
2940 /* Now the interfaces from error et al to dump_type et al. Each takes an
2941 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2945 decl_to_string (tree decl
, int verbose
)
2949 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2950 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2951 flags
= TFF_CLASS_KEY_OR_ENUM
;
2953 flags
|= TFF_DECL_SPECIFIERS
;
2954 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2955 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2956 flags
|= TFF_TEMPLATE_HEADER
;
2959 dump_decl (cxx_pp
, decl
, flags
);
2960 return pp_ggc_formatted_text (cxx_pp
);
2964 expr_to_string (tree decl
)
2967 dump_expr (cxx_pp
, decl
, 0);
2968 return pp_ggc_formatted_text (cxx_pp
);
2972 fndecl_to_string (tree fndecl
, int verbose
)
2976 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2977 | TFF_TEMPLATE_HEADER
;
2979 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2981 dump_decl (cxx_pp
, fndecl
, flags
);
2982 return pp_ggc_formatted_text (cxx_pp
);
2987 code_to_string (enum tree_code c
)
2989 return get_tree_code_name (c
);
2993 language_to_string (enum languages c
)
3000 case lang_cplusplus
:
3012 /* Return the proper printed version of a parameter to a C++ function. */
3015 parm_to_string (int p
)
3019 pp_string (cxx_pp
, "'this'");
3021 pp_decimal_int (cxx_pp
, p
+ 1);
3022 return pp_ggc_formatted_text (cxx_pp
);
3026 op_to_string (enum tree_code p
)
3028 tree id
= operator_name_info
[p
].identifier
;
3029 return id
? IDENTIFIER_POINTER (id
) : M_("<unknown>");
3033 type_to_string (tree typ
, int verbose
)
3037 flags
|= TFF_CLASS_KEY_OR_ENUM
;
3038 flags
|= TFF_TEMPLATE_HEADER
;
3041 dump_type (cxx_pp
, typ
, flags
);
3042 /* If we're printing a type that involves typedefs, also print the
3043 stripped version. But sometimes the stripped version looks
3044 exactly the same, so we don't want it after all. To avoid printing
3045 it in that case, we play ugly obstack games. */
3046 if (typ
&& TYPE_P (typ
) && typ
!= TYPE_CANONICAL (typ
)
3047 && !uses_template_parms (typ
))
3049 int aka_start
, aka_len
; char *p
;
3050 struct obstack
*ob
= pp_buffer (cxx_pp
)->obstack
;
3051 /* Remember the end of the initial dump. */
3052 int len
= obstack_object_size (ob
);
3053 tree aka
= strip_typedefs (typ
);
3054 pp_string (cxx_pp
, " {aka");
3055 pp_cxx_whitespace (cxx_pp
);
3056 /* And remember the start of the aka dump. */
3057 aka_start
= obstack_object_size (ob
);
3058 dump_type (cxx_pp
, aka
, flags
);
3059 aka_len
= obstack_object_size (ob
) - aka_start
;
3060 pp_right_brace (cxx_pp
);
3061 p
= (char*)obstack_base (ob
);
3062 /* If they are identical, cut off the aka with a NUL. */
3063 if (len
== aka_len
&& memcmp (p
, p
+aka_start
, len
) == 0)
3066 return pp_ggc_formatted_text (cxx_pp
);
3070 assop_to_string (enum tree_code p
)
3072 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
3073 return id
? IDENTIFIER_POINTER (id
) : M_("{unknown}");
3077 args_to_string (tree p
, int verbose
)
3081 flags
|= TFF_CLASS_KEY_OR_ENUM
;
3086 if (TYPE_P (TREE_VALUE (p
)))
3087 return type_as_string_translate (p
, flags
);
3090 for (; p
; p
= TREE_CHAIN (p
))
3092 if (TREE_VALUE (p
) == null_node
)
3093 pp_cxx_ws_string (cxx_pp
, "NULL");
3095 dump_type (cxx_pp
, error_type (TREE_VALUE (p
)), flags
);
3097 pp_separate_with_comma (cxx_pp
);
3099 return pp_ggc_formatted_text (cxx_pp
);
3102 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
3103 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
3107 subst_to_string (tree p
)
3109 tree decl
= TREE_PURPOSE (p
);
3110 tree targs
= TREE_VALUE (p
);
3111 tree tparms
= DECL_TEMPLATE_PARMS (decl
);
3112 int flags
= (TFF_DECL_SPECIFIERS
|TFF_TEMPLATE_HEADER
3113 |TFF_NO_TEMPLATE_BINDINGS
);
3119 dump_template_decl (cxx_pp
, TREE_PURPOSE (p
), flags
);
3120 dump_substitution (cxx_pp
, NULL
, tparms
, targs
, /*flags=*/0);
3121 return pp_ggc_formatted_text (cxx_pp
);
3125 cv_to_string (tree p
, int v
)
3128 cxx_pp
->padding
= v
? pp_before
: pp_none
;
3129 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
3130 return pp_ggc_formatted_text (cxx_pp
);
3134 eh_spec_to_string (tree p
, int /*v*/)
3138 dump_exception_spec (cxx_pp
, p
, flags
);
3139 return pp_ggc_formatted_text (cxx_pp
);
3142 /* Langhook for print_error_function. */
3144 cxx_print_error_function (diagnostic_context
*context
, const char *file
,
3145 diagnostic_info
*diagnostic
)
3147 lhd_print_error_function (context
, file
, diagnostic
);
3148 pp_set_prefix (context
->printer
, file
);
3149 maybe_print_instantiation_context (context
);
3153 cp_diagnostic_starter (diagnostic_context
*context
,
3154 diagnostic_info
*diagnostic
)
3156 diagnostic_report_current_module (context
, diagnostic_location (diagnostic
));
3157 cp_print_error_function (context
, diagnostic
);
3158 maybe_print_instantiation_context (context
);
3159 maybe_print_constexpr_context (context
);
3160 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
3164 /* Print current function onto BUFFER, in the process of reporting
3165 a diagnostic message. Called from cp_diagnostic_starter. */
3167 cp_print_error_function (diagnostic_context
*context
,
3168 diagnostic_info
*diagnostic
)
3170 /* If we are in an instantiation context, current_function_decl is likely
3171 to be wrong, so just rely on print_instantiation_full_context. */
3172 if (current_instantiation ())
3174 if (diagnostic_last_function_changed (context
, diagnostic
))
3176 const char *old_prefix
= context
->printer
->prefix
;
3177 const char *file
= LOCATION_FILE (diagnostic_location (diagnostic
));
3178 tree abstract_origin
= diagnostic_abstract_origin (diagnostic
);
3179 char *new_prefix
= (file
&& abstract_origin
== NULL
)
3180 ? file_name_as_prefix (context
, file
) : NULL
;
3182 pp_set_prefix (context
->printer
, new_prefix
);
3184 if (current_function_decl
== NULL
)
3185 pp_string (context
->printer
, _("At global scope:"));
3190 if (abstract_origin
)
3192 ao
= BLOCK_ABSTRACT_ORIGIN (abstract_origin
);
3193 while (TREE_CODE (ao
) == BLOCK
3194 && BLOCK_ABSTRACT_ORIGIN (ao
)
3195 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3196 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3197 gcc_assert (TREE_CODE (ao
) == FUNCTION_DECL
);
3201 fndecl
= current_function_decl
;
3203 pp_printf (context
->printer
, function_category (fndecl
),
3204 cxx_printable_name_translate (fndecl
, 2));
3206 while (abstract_origin
)
3209 tree block
= abstract_origin
;
3211 locus
= &BLOCK_SOURCE_LOCATION (block
);
3213 block
= BLOCK_SUPERCONTEXT (block
);
3214 while (block
&& TREE_CODE (block
) == BLOCK
3215 && BLOCK_ABSTRACT_ORIGIN (block
))
3217 ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3219 while (TREE_CODE (ao
) == BLOCK
3220 && BLOCK_ABSTRACT_ORIGIN (ao
)
3221 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3222 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3224 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3229 else if (TREE_CODE (ao
) != BLOCK
)
3232 block
= BLOCK_SUPERCONTEXT (block
);
3235 abstract_origin
= block
;
3238 while (block
&& TREE_CODE (block
) == BLOCK
)
3239 block
= BLOCK_SUPERCONTEXT (block
);
3241 if (block
&& TREE_CODE (block
) == FUNCTION_DECL
)
3243 abstract_origin
= NULL
;
3247 expanded_location s
= expand_location (*locus
);
3248 pp_character (context
->printer
, ',');
3249 pp_newline (context
->printer
);
3252 if (context
->show_column
&& s
.column
!= 0)
3253 pp_printf (context
->printer
,
3254 _(" inlined from %qs at %r%s:%d:%d%R"),
3255 cxx_printable_name_translate (fndecl
, 2),
3256 "locus", s
.file
, s
.line
, s
.column
);
3258 pp_printf (context
->printer
,
3259 _(" inlined from %qs at %r%s:%d%R"),
3260 cxx_printable_name_translate (fndecl
, 2),
3261 "locus", s
.file
, s
.line
);
3265 pp_printf (context
->printer
, _(" inlined from %qs"),
3266 cxx_printable_name_translate (fndecl
, 2));
3269 pp_character (context
->printer
, ':');
3271 pp_newline (context
->printer
);
3273 diagnostic_set_last_function (context
, diagnostic
);
3274 pp_destroy_prefix (context
->printer
);
3275 context
->printer
->prefix
= old_prefix
;
3279 /* Returns a description of FUNCTION using standard terminology. The
3280 result is a format string of the form "In CATEGORY %qs". */
3282 function_category (tree fn
)
3284 /* We can get called from the middle-end for diagnostics of function
3285 clones. Make sure we have language specific information before
3286 dereferencing it. */
3287 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn
))
3288 && DECL_FUNCTION_MEMBER_P (fn
))
3290 if (DECL_STATIC_FUNCTION_P (fn
))
3291 return _("In static member function %qs");
3292 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
3293 return _("In copy constructor %qs");
3294 else if (DECL_CONSTRUCTOR_P (fn
))
3295 return _("In constructor %qs");
3296 else if (DECL_DESTRUCTOR_P (fn
))
3297 return _("In destructor %qs");
3298 else if (LAMBDA_FUNCTION_P (fn
))
3299 return _("In lambda function");
3301 return _("In member function %qs");
3304 return _("In function %qs");
3307 /* Report the full context of a current template instantiation,
3310 print_instantiation_full_context (diagnostic_context
*context
)
3312 struct tinst_level
*p
= current_instantiation ();
3313 location_t location
= input_location
;
3317 pp_verbatim (context
->printer
,
3318 TREE_CODE (p
->decl
) == TREE_LIST
3319 ? _("%s: In substitution of %qS:\n")
3320 : _("%s: In instantiation of %q#D:\n"),
3321 LOCATION_FILE (location
),
3324 location
= p
->locus
;
3328 print_instantiation_partial_context (context
, p
, location
);
3331 /* Helper function of print_instantiation_partial_context() that
3332 prints a single line of instantiation context. */
3335 print_instantiation_partial_context_line (diagnostic_context
*context
,
3336 const struct tinst_level
*t
,
3337 location_t loc
, bool recursive_p
)
3339 if (loc
== UNKNOWN_LOCATION
)
3342 expanded_location xloc
= expand_location (loc
);
3344 if (context
->show_column
)
3345 pp_verbatim (context
->printer
, _("%r%s:%d:%d:%R "),
3346 "locus", xloc
.file
, xloc
.line
, xloc
.column
);
3348 pp_verbatim (context
->printer
, _("%r%s:%d:%R "),
3349 "locus", xloc
.file
, xloc
.line
);
3353 if (TREE_CODE (t
->decl
) == TREE_LIST
)
3354 pp_verbatim (context
->printer
,
3356 ? _("recursively required by substitution of %qS\n")
3357 : _("required by substitution of %qS\n"),
3360 pp_verbatim (context
->printer
,
3362 ? _("recursively required from %q#D\n")
3363 : _("required from %q#D\n"),
3368 pp_verbatim (context
->printer
,
3370 ? _("recursively required from here\n")
3371 : _("required from here\n"));
3375 /* Same as print_instantiation_full_context but less verbose. */
3378 print_instantiation_partial_context (diagnostic_context
*context
,
3379 struct tinst_level
*t0
, location_t loc
)
3381 struct tinst_level
*t
;
3384 location_t prev_loc
= loc
;
3386 for (t
= t0
; t
!= NULL
; t
= t
->next
)
3387 if (prev_loc
!= t
->locus
)
3389 prev_loc
= t
->locus
;
3395 if (template_backtrace_limit
3396 && n_total
> template_backtrace_limit
)
3398 int skip
= n_total
- template_backtrace_limit
;
3399 int head
= template_backtrace_limit
/ 2;
3401 /* Avoid skipping just 1. If so, skip 2. */
3405 head
= (template_backtrace_limit
- 1) / 2;
3408 for (n
= 0; n
< head
; n
++)
3410 gcc_assert (t
!= NULL
);
3411 if (loc
!= t
->locus
)
3412 print_instantiation_partial_context_line (context
, t
, loc
,
3413 /*recursive_p=*/false);
3417 if (t
!= NULL
&& skip
> 0)
3419 expanded_location xloc
;
3420 xloc
= expand_location (loc
);
3421 if (context
->show_column
)
3422 pp_verbatim (context
->printer
,
3423 _("%r%s:%d:%d:%R [ skipping %d instantiation "
3424 "contexts, use -ftemplate-backtrace-limit=0 to "
3426 "locus", xloc
.file
, xloc
.line
, xloc
.column
, skip
);
3428 pp_verbatim (context
->printer
,
3429 _("%r%s:%d:%R [ skipping %d instantiation "
3430 "contexts, use -ftemplate-backtrace-limit=0 to "
3432 "locus", xloc
.file
, xloc
.line
, skip
);
3437 } while (t
!= NULL
&& --skip
> 0);
3443 while (t
->next
!= NULL
&& t
->locus
== t
->next
->locus
)
3448 print_instantiation_partial_context_line (context
, t
, loc
,
3453 print_instantiation_partial_context_line (context
, NULL
, loc
,
3454 /*recursive_p=*/false);
3457 /* Called from cp_thing to print the template context for an error. */
3459 maybe_print_instantiation_context (diagnostic_context
*context
)
3461 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3464 record_last_problematic_instantiation ();
3465 print_instantiation_full_context (context
);
3468 /* Report what constexpr call(s) we're trying to expand, if any. */
3471 maybe_print_constexpr_context (diagnostic_context
*context
)
3473 vec
<tree
> call_stack
= cx_error_context ();
3477 FOR_EACH_VEC_ELT (call_stack
, ix
, t
)
3479 expanded_location xloc
= expand_location (EXPR_LOCATION (t
));
3480 const char *s
= expr_as_string (t
, 0);
3481 if (context
->show_column
)
3482 pp_verbatim (context
->printer
,
3483 _("%r%s:%d:%d:%R in constexpr expansion of %qs"),
3484 "locus", xloc
.file
, xloc
.line
, xloc
.column
, s
);
3486 pp_verbatim (context
->printer
,
3487 _("%r%s:%d:%R in constexpr expansion of %qs"),
3488 "locus", xloc
.file
, xloc
.line
, s
);
3489 pp_newline (context
->printer
);
3493 /* Called from output_format -- during diagnostic message processing --
3494 to handle C++ specific format specifier with the following meanings:
3495 %A function argument-list.
3499 %F function declaration.
3500 %L language as used in extern "lang".
3502 %P function parameter whose position is indicated by an integer.
3503 %Q assignment operator.
3504 %S substitution (template + args)
3507 %X exception-specification. */
3509 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
3510 int precision
, bool wide
, bool set_locus
, bool verbose
)
3514 #define next_tree (t = va_arg (*text->args_ptr, tree))
3515 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3516 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3517 #define next_int va_arg (*text->args_ptr, int)
3519 if (precision
!= 0 || wide
)
3524 case 'A': result
= args_to_string (next_tree
, verbose
); break;
3525 case 'C': result
= code_to_string (next_tcode
); break;
3528 tree temp
= next_tree
;
3530 && DECL_HAS_DEBUG_EXPR_P (temp
))
3532 temp
= DECL_DEBUG_EXPR (temp
);
3535 result
= expr_to_string (temp
);
3539 result
= decl_to_string (temp
, verbose
);
3542 case 'E': result
= expr_to_string (next_tree
); break;
3543 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
3544 case 'L': result
= language_to_string (next_lang
); break;
3545 case 'O': result
= op_to_string (next_tcode
); break;
3546 case 'P': result
= parm_to_string (next_int
); break;
3547 case 'Q': result
= assop_to_string (next_tcode
); break;
3548 case 'S': result
= subst_to_string (next_tree
); break;
3549 case 'T': result
= type_to_string (next_tree
, verbose
); break;
3550 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
3551 case 'X': result
= eh_spec_to_string (next_tree
, verbose
); break;
3554 percent_K_format (text
);
3561 pp_string (pp
, result
);
3562 if (set_locus
&& t
!= NULL
)
3563 text
->set_location (0, location_of (t
), true);
3571 /* Warn about the use of C++0x features when appropriate. */
3573 maybe_warn_cpp0x (cpp0x_warn_str str
)
3575 if ((cxx_dialect
== cxx98
) && !in_system_header_at (input_location
))
3576 /* We really want to suppress this warning in system headers,
3577 because libstdc++ uses variadic templates even when we aren't
3581 case CPP0X_INITIALIZER_LISTS
:
3582 pedwarn (input_location
, 0,
3583 "extended initializer lists "
3584 "only available with -std=c++11 or -std=gnu++11");
3586 case CPP0X_EXPLICIT_CONVERSION
:
3587 pedwarn (input_location
, 0,
3588 "explicit conversion operators "
3589 "only available with -std=c++11 or -std=gnu++11");
3591 case CPP0X_VARIADIC_TEMPLATES
:
3592 pedwarn (input_location
, 0,
3593 "variadic templates "
3594 "only available with -std=c++11 or -std=gnu++11");
3596 case CPP0X_LAMBDA_EXPR
:
3597 pedwarn (input_location
, 0,
3598 "lambda expressions "
3599 "only available with -std=c++11 or -std=gnu++11");
3602 pedwarn (input_location
, 0,
3603 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3605 case CPP0X_SCOPED_ENUMS
:
3606 pedwarn (input_location
, 0,
3607 "scoped enums only available with -std=c++11 or -std=gnu++11");
3609 case CPP0X_DEFAULTED_DELETED
:
3610 pedwarn (input_location
, 0,
3611 "defaulted and deleted functions "
3612 "only available with -std=c++11 or -std=gnu++11");
3614 case CPP0X_INLINE_NAMESPACES
:
3615 pedwarn (input_location
, OPT_Wpedantic
,
3616 "inline namespaces "
3617 "only available with -std=c++11 or -std=gnu++11");
3619 case CPP0X_OVERRIDE_CONTROLS
:
3620 pedwarn (input_location
, 0,
3621 "override controls (override/final) "
3622 "only available with -std=c++11 or -std=gnu++11");
3625 pedwarn (input_location
, 0,
3626 "non-static data member initializers "
3627 "only available with -std=c++11 or -std=gnu++11");
3629 case CPP0X_USER_DEFINED_LITERALS
:
3630 pedwarn (input_location
, 0,
3631 "user-defined literals "
3632 "only available with -std=c++11 or -std=gnu++11");
3634 case CPP0X_DELEGATING_CTORS
:
3635 pedwarn (input_location
, 0,
3636 "delegating constructors "
3637 "only available with -std=c++11 or -std=gnu++11");
3639 case CPP0X_INHERITING_CTORS
:
3640 pedwarn (input_location
, 0,
3641 "inheriting constructors "
3642 "only available with -std=c++11 or -std=gnu++11");
3644 case CPP0X_ATTRIBUTES
:
3645 pedwarn (input_location
, 0,
3647 "only available with -std=c++11 or -std=gnu++11");
3649 case CPP0X_REF_QUALIFIER
:
3650 pedwarn (input_location
, 0,
3652 "only available with -std=c++11 or -std=gnu++11");
3659 /* Warn about the use of variadic templates when appropriate. */
3661 maybe_warn_variadic_templates (void)
3663 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES
);
3667 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3668 option OPT with text GMSGID. Use this function to report
3669 diagnostics for constructs that are invalid C++98, but valid
3672 pedwarn_cxx98 (location_t location
, int opt
, const char *gmsgid
, ...)
3674 diagnostic_info diagnostic
;
3677 rich_location
richloc (line_table
, location
);
3679 va_start (ap
, gmsgid
);
3680 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, &richloc
,
3681 (cxx_dialect
== cxx98
) ? DK_PEDWARN
: DK_WARNING
);
3682 diagnostic
.option_index
= opt
;
3683 ret
= report_diagnostic (&diagnostic
);
3688 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3689 we found when we tried to do the lookup. LOCATION is the location of
3690 the NAME identifier. */
3693 qualified_name_lookup_error (tree scope
, tree name
,
3694 tree decl
, location_t location
)
3696 if (scope
== error_mark_node
)
3697 ; /* We already complained. */
3698 else if (TYPE_P (scope
))
3700 if (!COMPLETE_TYPE_P (scope
))
3701 error_at (location
, "incomplete type %qT used in nested name specifier",
3703 else if (TREE_CODE (decl
) == TREE_LIST
)
3705 error_at (location
, "reference to %<%T::%D%> is ambiguous",
3707 print_candidates (decl
);
3710 error_at (location
, "%qD is not a member of %qT", name
, scope
);
3712 else if (scope
!= global_namespace
)
3714 error_at (location
, "%qD is not a member of %qD", name
, scope
);
3715 suggest_alternatives_for (location
, name
);
3719 error_at (location
, "%<::%D%> has not been declared", name
);
3720 suggest_alternatives_for (location
, name
);