1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993-2015 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"
26 #include "stringpool.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"
36 #include "internal-fn.h"
38 #include <new> // For placement-new.
40 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
41 #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';')
43 /* cxx_pp is a C++ front-end-specific pretty printer: this is where we
44 dump C++ ASTs as strings. It is mostly used only by the various
45 tree -> string functions that are occasionally called from the
46 debugger or by the front-end for things like
47 __PRETTY_FUNCTION__. */
48 static cxx_pretty_printer actual_pretty_printer
;
49 static cxx_pretty_printer
* const cxx_pp
= &actual_pretty_printer
;
51 /* Translate if being used for diagnostics, but not for dump files or
53 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
55 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
57 static const char *args_to_string (tree
, int);
58 static const char *assop_to_string (enum tree_code
);
59 static const char *code_to_string (enum tree_code
);
60 static const char *cv_to_string (tree
, int);
61 static const char *decl_to_string (tree
, int);
62 static const char *expr_to_string (tree
);
63 static const char *fndecl_to_string (tree
, int);
64 static const char *op_to_string (enum tree_code
);
65 static const char *parm_to_string (int);
66 static const char *type_to_string (tree
, int);
68 static void dump_alias_template_specialization (cxx_pretty_printer
*, tree
, int);
69 static void dump_type (cxx_pretty_printer
*, tree
, int);
70 static void dump_typename (cxx_pretty_printer
*, tree
, int);
71 static void dump_simple_decl (cxx_pretty_printer
*, tree
, tree
, int);
72 static void dump_decl (cxx_pretty_printer
*, tree
, int);
73 static void dump_template_decl (cxx_pretty_printer
*, tree
, int);
74 static void dump_function_decl (cxx_pretty_printer
*, tree
, int);
75 static void dump_expr (cxx_pretty_printer
*, tree
, int);
76 static void dump_unary_op (cxx_pretty_printer
*, const char *, tree
, int);
77 static void dump_binary_op (cxx_pretty_printer
*, const char *, tree
, int);
78 static void dump_aggr_type (cxx_pretty_printer
*, tree
, int);
79 static void dump_type_prefix (cxx_pretty_printer
*, tree
, int);
80 static void dump_type_suffix (cxx_pretty_printer
*, tree
, int);
81 static void dump_function_name (cxx_pretty_printer
*, tree
, int);
82 static void dump_call_expr_args (cxx_pretty_printer
*, tree
, int, bool);
83 static void dump_aggr_init_expr_args (cxx_pretty_printer
*, tree
, int, bool);
84 static void dump_expr_list (cxx_pretty_printer
*, tree
, int);
85 static void dump_global_iord (cxx_pretty_printer
*, tree
);
86 static void dump_parameters (cxx_pretty_printer
*, tree
, int);
87 static void dump_ref_qualifier (cxx_pretty_printer
*, tree
, int);
88 static void dump_exception_spec (cxx_pretty_printer
*, tree
, int);
89 static void dump_template_argument (cxx_pretty_printer
*, tree
, int);
90 static void dump_template_argument_list (cxx_pretty_printer
*, tree
, int);
91 static void dump_template_parameter (cxx_pretty_printer
*, tree
, int);
92 static void dump_template_bindings (cxx_pretty_printer
*, tree
, tree
,
94 static void dump_scope (cxx_pretty_printer
*, tree
, int);
95 static void dump_template_parms (cxx_pretty_printer
*, tree
, int, int);
96 static int get_non_default_template_args_count (tree
, int);
97 static const char *function_category (tree
);
98 static void maybe_print_constexpr_context (diagnostic_context
*);
99 static void maybe_print_instantiation_context (diagnostic_context
*);
100 static void print_instantiation_full_context (diagnostic_context
*);
101 static void print_instantiation_partial_context (diagnostic_context
*,
102 struct tinst_level
*,
104 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
105 static void cp_print_error_function (diagnostic_context
*, diagnostic_info
*);
107 static bool cp_printer (pretty_printer
*, text_info
*, const char *,
108 int, bool, bool, bool);
110 /* CONTEXT->printer is a basic pretty printer that was constructed
111 presumably by diagnostic_initialize(), called early in the
112 compiler's initialization process (in general_init) Before the FE
113 is initialized. This (C++) FE-specific diagnostic initializer is
114 thus replacing the basic pretty printer with one that has C++-aware
118 cxx_initialize_diagnostics (diagnostic_context
*context
)
120 pretty_printer
*base
= context
->printer
;
121 cxx_pretty_printer
*pp
= XNEW (cxx_pretty_printer
);
122 context
->printer
= new (pp
) cxx_pretty_printer ();
124 /* It is safe to free this object because it was previously XNEW()'d. */
125 base
->~pretty_printer ();
128 c_common_diagnostics_set_defaults (context
);
129 diagnostic_starter (context
) = cp_diagnostic_starter
;
130 /* diagnostic_finalizer is already c_diagnostic_finalizer. */
131 diagnostic_format_decoder (context
) = cp_printer
;
134 /* Dump a scope, if deemed necessary. */
137 dump_scope (cxx_pretty_printer
*pp
, tree scope
, int flags
)
139 int f
= flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
);
141 if (scope
== NULL_TREE
)
144 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
146 if (scope
!= global_namespace
)
148 dump_decl (pp
, scope
, f
);
149 pp_cxx_colon_colon (pp
);
152 else if (AGGREGATE_TYPE_P (scope
))
154 dump_type (pp
, scope
, f
);
155 pp_cxx_colon_colon (pp
);
157 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
159 dump_function_decl (pp
, scope
, f
);
160 pp_cxx_colon_colon (pp
);
164 /* Dump the template ARGument under control of FLAGS. */
167 dump_template_argument (cxx_pretty_printer
*pp
, tree arg
, int flags
)
169 if (ARGUMENT_PACK_P (arg
))
170 dump_template_argument_list (pp
, ARGUMENT_PACK_ARGS (arg
),
171 /* No default args in argument packs. */
172 flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
173 else if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
174 dump_type (pp
, arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
177 if (TREE_CODE (arg
) == TREE_LIST
)
178 arg
= TREE_VALUE (arg
);
180 dump_expr (pp
, arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
184 /* Count the number of template arguments ARGS whose value does not
185 match the (optional) default template parameter in PARAMS */
188 get_non_default_template_args_count (tree args
, int flags
)
190 int n
= TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args
));
192 if (/* We use this flag when generating debug information. We don't
193 want to expand templates at this point, for this may generate
194 new decls, which gets decl counts out of sync, which may in
195 turn cause codegen differences between compilations with and
197 (flags
& TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
) != 0
198 || !flag_pretty_templates
)
201 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args
));
204 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
208 dump_template_argument_list (cxx_pretty_printer
*pp
, tree args
, int flags
)
210 int n
= get_non_default_template_args_count (args
, flags
);
214 for (i
= 0; i
< n
; ++i
)
216 tree arg
= TREE_VEC_ELT (args
, i
);
218 /* Only print a comma if we know there is an argument coming. In
219 the case of an empty template argument pack, no actual
220 argument will be printed. */
222 && (!ARGUMENT_PACK_P (arg
)
223 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
224 pp_separate_with_comma (pp
);
226 dump_template_argument (pp
, arg
, flags
);
231 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
234 dump_template_parameter (cxx_pretty_printer
*pp
, tree parm
, int flags
)
239 if (parm
== error_mark_node
)
242 p
= TREE_VALUE (parm
);
243 a
= TREE_PURPOSE (parm
);
245 if (TREE_CODE (p
) == TYPE_DECL
)
247 if (flags
& TFF_DECL_SPECIFIERS
)
249 pp_cxx_ws_string (pp
, "class");
250 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p
)))
251 pp_cxx_ws_string (pp
, "...");
253 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
255 else if (DECL_NAME (p
))
256 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
258 pp_cxx_canonical_template_parameter (pp
, TREE_TYPE (p
));
261 dump_decl (pp
, p
, flags
| TFF_DECL_SPECIFIERS
);
263 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
265 pp_cxx_whitespace (pp
);
267 pp_cxx_whitespace (pp
);
268 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
269 dump_type (pp
, a
, flags
& ~TFF_CHASE_TYPEDEF
);
271 dump_expr (pp
, a
, flags
| TFF_EXPR_IN_PARENS
);
275 /* Dump, under control of FLAGS, a template-parameter-list binding.
276 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
280 dump_template_bindings (cxx_pretty_printer
*pp
, tree parms
, tree args
,
281 vec
<tree
, va_gc
> *typenames
)
283 bool need_semicolon
= false;
289 tree p
= TREE_VALUE (parms
);
290 int lvl
= TMPL_PARMS_DEPTH (parms
);
293 tree lvl_args
= NULL_TREE
;
295 /* Don't crash if we had an invalid argument list. */
296 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
297 lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
299 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
301 tree arg
= NULL_TREE
;
303 /* Don't crash if we had an invalid argument list. */
304 if (lvl_args
&& NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
305 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
308 pp_separate_with_semicolon (pp
);
309 dump_template_parameter (pp
, TREE_VEC_ELT (p
, i
),
310 TFF_PLAIN_IDENTIFIER
);
311 pp_cxx_whitespace (pp
);
313 pp_cxx_whitespace (pp
);
316 if (ARGUMENT_PACK_P (arg
))
317 pp_cxx_left_brace (pp
);
318 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
319 if (ARGUMENT_PACK_P (arg
))
320 pp_cxx_right_brace (pp
);
323 pp_string (pp
, M_("<missing>"));
326 need_semicolon
= true;
329 parms
= TREE_CHAIN (parms
);
332 /* Don't bother with typenames for a partial instantiation. */
333 if (vec_safe_is_empty (typenames
) || uses_template_parms (args
))
336 /* Don't try to print typenames when we're processing a clone. */
337 if (current_function_decl
338 && !DECL_LANG_SPECIFIC (current_function_decl
))
341 /* Don't try to do this once cgraph starts throwing away front-end
346 FOR_EACH_VEC_SAFE_ELT (typenames
, i
, t
)
349 pp_separate_with_semicolon (pp
);
350 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
351 pp_cxx_whitespace (pp
);
353 pp_cxx_whitespace (pp
);
354 push_deferring_access_checks (dk_no_check
);
355 t
= tsubst (t
, args
, tf_none
, NULL_TREE
);
356 pop_deferring_access_checks ();
357 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
358 pp_simple_type_specifier doesn't know about it. */
359 t
= strip_typedefs (t
);
360 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
364 /* Dump a human-readable equivalent of the alias template
365 specialization of T. */
368 dump_alias_template_specialization (cxx_pretty_printer
*pp
, tree t
, int flags
)
372 gcc_assert (alias_template_specialization_p (t
));
374 if (!(flags
& TFF_UNQUALIFIED_NAME
))
375 dump_scope (pp
, CP_DECL_CONTEXT (TYPE_NAME (t
)), flags
);
376 name
= TYPE_IDENTIFIER (t
);
377 pp_cxx_tree_identifier (pp
, name
);
378 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
380 flags
& ~TFF_TEMPLATE_HEADER
);
383 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
387 dump_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
392 /* Don't print e.g. "struct mytypedef". */
393 if (TYPE_P (t
) && typedef_variant_p (t
))
395 tree decl
= TYPE_NAME (t
);
396 if ((flags
& TFF_CHASE_TYPEDEF
)
397 || DECL_SELF_REFERENCE_P (decl
)
398 || (!flag_pretty_templates
399 && DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)))
400 t
= strip_typedefs (t
);
401 else if (alias_template_specialization_p (t
))
403 dump_alias_template_specialization (pp
, t
, flags
);
406 else if (same_type_p (t
, TREE_TYPE (decl
)))
410 pp_cxx_cv_qualifier_seq (pp
, t
);
411 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
416 if (TYPE_PTRMEMFUNC_P (t
))
419 switch (TREE_CODE (t
))
422 if (t
== init_list_type_node
)
423 pp_string (pp
, M_("<brace-enclosed initializer list>"));
424 else if (t
== unknown_type_node
)
425 pp_string (pp
, M_("<unresolved overloaded function type>"));
428 pp_cxx_cv_qualifier_seq (pp
, t
);
429 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
434 /* A list of function parms. */
435 dump_parameters (pp
, t
, flags
);
438 case IDENTIFIER_NODE
:
439 pp_cxx_tree_identifier (pp
, t
);
443 dump_type (pp
, BINFO_TYPE (t
), flags
);
449 dump_aggr_type (pp
, t
, flags
);
453 if (flags
& TFF_CHASE_TYPEDEF
)
455 dump_type (pp
, DECL_ORIGINAL_TYPE (t
)
456 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
459 /* Else fall through. */
463 dump_decl (pp
, t
, flags
& ~TFF_DECL_SPECIFIERS
);
472 case FIXED_POINT_TYPE
:
473 pp_type_specifier_seq (pp
, t
);
476 case TEMPLATE_TEMPLATE_PARM
:
477 /* For parameters inside template signature. */
478 if (TYPE_IDENTIFIER (t
))
479 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
481 pp_cxx_canonical_template_parameter (pp
, t
);
484 case BOUND_TEMPLATE_TEMPLATE_PARM
:
486 tree args
= TYPE_TI_ARGS (t
);
487 pp_cxx_cv_qualifier_seq (pp
, t
);
488 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
489 pp_cxx_begin_template_argument_list (pp
);
490 dump_template_argument_list (pp
, args
, flags
);
491 pp_cxx_end_template_argument_list (pp
);
495 case TEMPLATE_TYPE_PARM
:
496 pp_cxx_cv_qualifier_seq (pp
, t
);
497 if (tree c
= PLACEHOLDER_TYPE_CONSTRAINTS (t
))
498 pp_cxx_constrained_type_spec (pp
, c
);
499 else if (TYPE_IDENTIFIER (t
))
500 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
502 pp_cxx_canonical_template_parameter
503 (pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
506 /* This is not always necessary for pointers and such, but doing this
507 reduces code size. */
516 dump_type_prefix (pp
, t
, flags
);
517 dump_type_suffix (pp
, t
, flags
);
521 if (! (flags
& TFF_CHASE_TYPEDEF
)
522 && DECL_ORIGINAL_TYPE (TYPE_NAME (t
)))
524 dump_decl (pp
, TYPE_NAME (t
), TFF_PLAIN_IDENTIFIER
);
527 pp_cxx_cv_qualifier_seq (pp
, t
);
528 pp_cxx_ws_string (pp
,
529 TYPENAME_IS_ENUM_P (t
) ? "enum"
530 : TYPENAME_IS_CLASS_P (t
) ? "class"
532 dump_typename (pp
, t
, flags
);
535 case UNBOUND_CLASS_TEMPLATE
:
536 if (! (flags
& TFF_UNQUALIFIED_NAME
))
538 dump_type (pp
, TYPE_CONTEXT (t
), flags
);
539 pp_cxx_colon_colon (pp
);
541 pp_cxx_ws_string (pp
, "template");
542 dump_type (pp
, TYPE_IDENTIFIER (t
), flags
);
546 pp_cxx_ws_string (pp
, "__typeof__");
547 pp_cxx_whitespace (pp
);
548 pp_cxx_left_paren (pp
);
549 dump_expr (pp
, TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
550 pp_cxx_right_paren (pp
);
553 case UNDERLYING_TYPE
:
554 pp_cxx_ws_string (pp
, "__underlying_type");
555 pp_cxx_whitespace (pp
);
556 pp_cxx_left_paren (pp
);
557 dump_expr (pp
, UNDERLYING_TYPE_TYPE (t
), flags
& ~TFF_EXPR_IN_PARENS
);
558 pp_cxx_right_paren (pp
);
561 case TYPE_PACK_EXPANSION
:
562 dump_type (pp
, PACK_EXPANSION_PATTERN (t
), flags
);
563 pp_cxx_ws_string (pp
, "...");
566 case TYPE_ARGUMENT_PACK
:
567 dump_template_argument (pp
, t
, flags
);
571 pp_cxx_ws_string (pp
, "decltype");
572 pp_cxx_whitespace (pp
);
573 pp_cxx_left_paren (pp
);
574 dump_expr (pp
, DECLTYPE_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
575 pp_cxx_right_paren (pp
);
579 pp_string (pp
, "std::nullptr_t");
583 pp_unsupported_tree (pp
, t
);
584 /* Fall through to error. */
587 pp_string (pp
, M_("<type error>"));
592 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
596 dump_typename (cxx_pretty_printer
*pp
, tree t
, int flags
)
598 tree ctx
= TYPE_CONTEXT (t
);
600 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
601 dump_typename (pp
, ctx
, flags
);
603 dump_type (pp
, ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
604 pp_cxx_colon_colon (pp
);
605 dump_decl (pp
, TYPENAME_TYPE_FULLNAME (t
), flags
);
608 /* Return the name of the supplied aggregate, or enumeral type. */
611 class_key_or_enum_as_string (tree t
)
613 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
615 if (SCOPED_ENUM_P (t
))
620 else if (TREE_CODE (t
) == UNION_TYPE
)
622 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
628 /* Print out a class declaration T under the control of FLAGS,
629 in the form `class foo'. */
632 dump_aggr_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
635 const char *variety
= class_key_or_enum_as_string (t
);
639 pp_cxx_cv_qualifier_seq (pp
, t
);
641 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
642 pp_cxx_ws_string (pp
, variety
);
644 name
= TYPE_NAME (t
);
648 typdef
= (!DECL_ARTIFICIAL (name
)
649 /* An alias specialization is not considered to be a
651 && !alias_template_specialization_p (t
));
654 && ((flags
& TFF_CHASE_TYPEDEF
)
655 || (!flag_pretty_templates
&& DECL_LANG_SPECIFIC (name
)
656 && DECL_TEMPLATE_INFO (name
))))
657 || DECL_SELF_REFERENCE_P (name
))
659 t
= TYPE_MAIN_VARIANT (t
);
660 name
= TYPE_NAME (t
);
664 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
665 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
666 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
667 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
669 if (! (flags
& TFF_UNQUALIFIED_NAME
))
670 dump_scope (pp
, CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
671 flags
&= ~TFF_UNQUALIFIED_NAME
;
674 /* Because the template names are mangled, we have to locate
675 the most general template, and use that name. */
676 tree tpl
= TYPE_TI_TEMPLATE (t
);
678 while (DECL_TEMPLATE_INFO (tpl
))
679 tpl
= DECL_TI_TEMPLATE (tpl
);
682 name
= DECL_NAME (name
);
685 if (name
== 0 || anon_aggrname_p (name
))
687 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
688 pp_string (pp
, M_("<anonymous>"));
690 pp_printf (pp
, M_("<anonymous %s>"), variety
);
692 else if (LAMBDA_TYPE_P (t
))
694 /* A lambda's "type" is essentially its signature. */
695 pp_string (pp
, M_("<lambda"));
696 if (lambda_function (t
))
698 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t
)),
703 pp_cxx_tree_identifier (pp
, name
);
705 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
706 !CLASSTYPE_USE_TEMPLATE (t
),
707 flags
& ~TFF_TEMPLATE_HEADER
);
710 /* Dump into the obstack the initial part of the output for a given type.
711 This is necessary when dealing with things like functions returning
714 return type of `int (* fee ())()': pointer -> function -> int. Both
715 pointer (and reference and offset) and function (and member) types must
716 deal with prefix and suffix.
718 Arrays must also do this for DECL nodes, like int a[], and for things like
722 dump_type_prefix (cxx_pretty_printer
*pp
, tree t
, int flags
)
724 if (TYPE_PTRMEMFUNC_P (t
))
726 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
730 switch (TREE_CODE (t
))
735 tree sub
= TREE_TYPE (t
);
737 dump_type_prefix (pp
, sub
, flags
);
738 if (TREE_CODE (sub
) == ARRAY_TYPE
739 || TREE_CODE (sub
) == FUNCTION_TYPE
)
741 pp_cxx_whitespace (pp
);
742 pp_cxx_left_paren (pp
);
743 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (sub
));
747 else if (TREE_CODE (t
) == REFERENCE_TYPE
)
749 if (TYPE_REF_IS_RVALUE (t
))
750 pp_ampersand_ampersand (pp
);
754 pp
->padding
= pp_before
;
755 pp_cxx_cv_qualifier_seq (pp
, t
);
761 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
762 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
765 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
766 pp_cxx_left_paren (pp
);
767 dump_type (pp
, TYPE_OFFSET_BASETYPE (t
), flags
);
768 pp_cxx_colon_colon (pp
);
771 pp_cxx_cv_qualifier_seq (pp
, t
);
772 pp
->padding
= pp_before
;
775 /* This can be reached without a pointer when dealing with
776 templates, e.g. std::is_function. */
778 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
782 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
784 pp_cxx_left_paren (pp
);
785 dump_aggr_type (pp
, TYPE_METHOD_BASETYPE (t
), flags
);
786 pp_cxx_colon_colon (pp
);
790 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
794 case IDENTIFIER_NODE
:
799 case TEMPLATE_TYPE_PARM
:
800 case TEMPLATE_TEMPLATE_PARM
:
801 case BOUND_TEMPLATE_TEMPLATE_PARM
:
812 case UNDERLYING_TYPE
:
814 case TYPE_PACK_EXPANSION
:
815 case FIXED_POINT_TYPE
:
817 dump_type (pp
, t
, flags
);
818 pp
->padding
= pp_before
;
822 pp_unsupported_tree (pp
, t
);
825 pp_string (pp
, M_("<typeprefixerror>"));
830 /* Dump the suffix of type T, under control of FLAGS. This is the part
831 which appears after the identifier (or function parms). */
834 dump_type_suffix (cxx_pretty_printer
*pp
, tree t
, int flags
)
836 if (TYPE_PTRMEMFUNC_P (t
))
837 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
839 switch (TREE_CODE (t
))
844 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
845 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
846 pp_cxx_right_paren (pp
);
847 if (TREE_CODE (t
) == POINTER_TYPE
)
848 flags
|= TFF_POINTER
;
849 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
856 if (TREE_CODE (t
) == METHOD_TYPE
)
857 /* Can only be reached through a pointer. */
858 pp_cxx_right_paren (pp
);
859 arg
= TYPE_ARG_TYPES (t
);
860 if (TREE_CODE (t
) == METHOD_TYPE
)
861 arg
= TREE_CHAIN (arg
);
863 /* Function pointers don't have default args. Not in standard C++,
864 anyway; they may in g++, but we'll just pretend otherwise. */
865 dump_parameters (pp
, arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
867 pp
->padding
= pp_before
;
868 pp_cxx_cv_qualifiers (pp
, type_memfn_quals (t
),
869 TREE_CODE (t
) == FUNCTION_TYPE
870 && (flags
& TFF_POINTER
));
871 dump_ref_qualifier (pp
, t
, flags
);
872 if (tx_safe_fn_type_p (t
))
873 pp_cxx_ws_string (pp
, "transaction_safe");
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. */
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
= get_first_fn (name
);
1217 name
= DECL_NAME (name
);
1218 dump_decl (pp
, name
, flags
);
1219 pp_cxx_begin_template_argument_list (pp
);
1220 if (args
== error_mark_node
)
1221 pp_string (pp
, M_("<template arguments error>"));
1223 dump_template_argument_list
1224 (pp
, args
, flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
1225 pp_cxx_end_template_argument_list (pp
);
1230 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1234 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
1235 || (DECL_INITIAL (t
) &&
1236 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
1237 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1238 else if (DECL_NAME (t
))
1239 dump_decl (pp
, DECL_NAME (t
), flags
);
1240 else if (DECL_INITIAL (t
))
1241 dump_expr (pp
, DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
1243 pp_string (pp
, M_("<enumerator>"));
1247 pp_cxx_ws_string (pp
, "using");
1248 dump_type (pp
, USING_DECL_SCOPE (t
), flags
);
1249 pp_cxx_colon_colon (pp
);
1250 dump_decl (pp
, DECL_NAME (t
), flags
);
1254 pp
->declaration (t
);
1258 dump_decl (pp
, BASELINK_FUNCTIONS (t
), flags
);
1261 case NON_DEPENDENT_EXPR
:
1262 dump_expr (pp
, t
, flags
);
1265 case TEMPLATE_TYPE_PARM
:
1266 if (flags
& TFF_DECL_SPECIFIERS
)
1267 pp
->declaration (t
);
1272 case UNBOUND_CLASS_TEMPLATE
:
1273 case TYPE_PACK_EXPANSION
:
1275 dump_type (pp
, t
, flags
);
1279 pp_unsupported_tree (pp
, t
);
1280 /* Fall through to error. */
1283 pp_string (pp
, M_("<declaration error>"));
1288 /* Dump a template declaration T under control of FLAGS. This means the
1289 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1292 dump_template_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1294 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1298 if (flags
& TFF_TEMPLATE_HEADER
)
1300 for (parms
= orig_parms
= nreverse (orig_parms
);
1302 parms
= TREE_CHAIN (parms
))
1304 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1305 int len
= TREE_VEC_LENGTH (inner_parms
);
1309 /* Skip over the dummy template levels of a template template
1311 gcc_assert (TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TEMPLATE_PARM
);
1315 pp_cxx_ws_string (pp
, "template");
1316 pp_cxx_begin_template_argument_list (pp
);
1318 /* If we've shown the template prefix, we'd better show the
1319 parameters' and decl's type too. */
1320 flags
|= TFF_DECL_SPECIFIERS
;
1322 for (i
= 0; i
< len
; i
++)
1325 pp_separate_with_comma (pp
);
1326 dump_template_parameter (pp
, TREE_VEC_ELT (inner_parms
, i
),
1329 pp_cxx_end_template_argument_list (pp
);
1330 pp_cxx_whitespace (pp
);
1332 nreverse(orig_parms
);
1334 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1336 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1337 pp_cxx_ws_string (pp
, "class");
1339 /* If this is a parameter pack, print the ellipsis. */
1340 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1341 pp_cxx_ws_string (pp
, "...");
1346 if (tree ci
= get_constraints (t
))
1347 if (check_constraint_info (ci
))
1348 if (tree reqs
= CI_TEMPLATE_REQS (ci
))
1350 pp_cxx_requires_clause (pp
, reqs
);
1351 pp_cxx_whitespace (pp
);
1354 if (DECL_CLASS_TEMPLATE_P (t
))
1355 dump_type (pp
, TREE_TYPE (t
),
1356 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1357 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1358 else if (DECL_TEMPLATE_RESULT (t
)
1359 && (VAR_P (DECL_TEMPLATE_RESULT (t
))
1360 /* Alias template. */
1361 || DECL_TYPE_TEMPLATE_P (t
)))
1362 dump_decl (pp
, DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1365 gcc_assert (TREE_TYPE (t
));
1366 switch (NEXT_CODE (t
))
1370 dump_function_decl (pp
, t
, flags
| TFF_TEMPLATE_NAME
);
1373 /* This case can occur with some invalid code. */
1374 dump_type (pp
, TREE_TYPE (t
),
1375 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1376 | (flags
& TFF_DECL_SPECIFIERS
1377 ? TFF_CLASS_KEY_OR_ENUM
: 0));
1382 /* find_typenames looks through the type of the function template T
1383 and returns a vec containing any typedefs, decltypes or TYPENAME_TYPEs
1386 struct find_typenames_t
1388 hash_set
<tree
> *p_set
;
1389 vec
<tree
, va_gc
> *typenames
;
1393 find_typenames_r (tree
*tp
, int *walk_subtrees
, void *data
)
1395 struct find_typenames_t
*d
= (struct find_typenames_t
*)data
;
1396 tree mv
= NULL_TREE
;
1398 if (TYPE_P (*tp
) && is_typedef_decl (TYPE_NAME (*tp
)))
1399 /* Add the type of the typedef without any additional cv-quals. */
1400 mv
= TREE_TYPE (TYPE_NAME (*tp
));
1401 else if (TREE_CODE (*tp
) == TYPENAME_TYPE
1402 || TREE_CODE (*tp
) == DECLTYPE_TYPE
)
1403 /* Add the typename without any cv-qualifiers. */
1404 mv
= TYPE_MAIN_VARIANT (*tp
);
1406 if (TREE_CODE (*tp
) == TYPE_PACK_EXPANSION
)
1408 /* Don't mess with parameter packs since we don't remember
1409 the pack expansion context for a particular typename. */
1410 *walk_subtrees
= false;
1414 if (mv
&& (mv
== *tp
|| !d
->p_set
->add (mv
)))
1415 vec_safe_push (d
->typenames
, mv
);
1417 /* Search into class template arguments, which cp_walk_subtrees
1419 if (CLASS_TYPE_P (*tp
) && CLASSTYPE_TEMPLATE_INFO (*tp
))
1420 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp
), find_typenames_r
,
1426 static vec
<tree
, va_gc
> *
1427 find_typenames (tree t
)
1429 struct find_typenames_t ft
;
1430 ft
.p_set
= new hash_set
<tree
>;
1431 ft
.typenames
= NULL
;
1432 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t
)),
1433 find_typenames_r
, &ft
, ft
.p_set
);
1435 return ft
.typenames
;
1438 /* Output the "[with ...]" clause for a template instantiation T iff
1439 TEMPLATE_PARMS, TEMPLATE_ARGS and FLAGS are suitable. T may be NULL if
1440 formatting a deduction/substitution diagnostic rather than an
1444 dump_substitution (cxx_pretty_printer
*pp
,
1445 tree t
, tree template_parms
, tree template_args
,
1448 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
1449 && !(flags
& TFF_NO_TEMPLATE_BINDINGS
))
1451 vec
<tree
, va_gc
> *typenames
= t
? find_typenames (t
) : NULL
;
1452 pp_cxx_whitespace (pp
);
1453 pp_cxx_left_bracket (pp
);
1454 pp
->translate_string ("with");
1455 pp_cxx_whitespace (pp
);
1456 dump_template_bindings (pp
, template_parms
, template_args
, typenames
);
1457 pp_cxx_right_bracket (pp
);
1461 /* Dump the lambda function FN including its 'mutable' qualifier and any
1462 template bindings. */
1465 dump_lambda_function (cxx_pretty_printer
*pp
,
1466 tree fn
, tree template_parms
, tree template_args
,
1469 /* A lambda's signature is essentially its "type". */
1470 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1471 if (!(TYPE_QUALS (class_of_this_parm (TREE_TYPE (fn
))) & TYPE_QUAL_CONST
))
1473 pp
->padding
= pp_before
;
1474 pp_c_ws_string (pp
, "mutable");
1476 dump_substitution (pp
, fn
, template_parms
, template_args
, flags
);
1479 /* Pretty print a function decl. There are several ways we want to print a
1480 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1481 As error can only apply the '#' flag once to give 0 and 1 for V, there
1482 is %D which doesn't print the throw specs, and %F which does. */
1485 dump_function_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1489 tree cname
= NULL_TREE
;
1490 tree template_args
= NULL_TREE
;
1491 tree template_parms
= NULL_TREE
;
1492 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1493 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1496 flags
&= ~(TFF_UNQUALIFIED_NAME
| TFF_TEMPLATE_NAME
);
1497 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1498 t
= DECL_TEMPLATE_RESULT (t
);
1500 /* Save the exceptions, in case t is a specialization and we are
1501 emitting an error about incompatible specifications. */
1502 exceptions
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t
));
1504 /* Pretty print template instantiations only. */
1505 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
)
1506 && flag_pretty_templates
)
1510 template_args
= DECL_TI_ARGS (t
);
1511 tmpl
= most_general_template (t
);
1512 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1514 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1519 if (DECL_NAME (t
) && LAMBDA_FUNCTION_P (t
))
1520 return dump_lambda_function (pp
, t
, template_parms
, template_args
, flags
);
1522 fntype
= TREE_TYPE (t
);
1523 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1525 if (DECL_CLASS_SCOPE_P (t
))
1526 cname
= DECL_CONTEXT (t
);
1527 /* This is for partially instantiated template methods. */
1528 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1529 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1531 if (flags
& TFF_DECL_SPECIFIERS
)
1533 if (DECL_STATIC_FUNCTION_P (t
))
1534 pp_cxx_ws_string (pp
, "static");
1535 else if (DECL_VIRTUAL_P (t
))
1536 pp_cxx_ws_string (pp
, "virtual");
1538 if (DECL_DECLARED_CONSTEXPR_P (t
))
1539 pp_cxx_ws_string (pp
, "constexpr");
1542 /* Print the return type? */
1544 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1545 && !DECL_DESTRUCTOR_P (t
);
1548 tree ret
= fndecl_declared_return_type (t
);
1549 dump_type_prefix (pp
, ret
, flags
);
1552 /* Print the function name. */
1553 if (!do_outer_scope
)
1557 dump_type (pp
, cname
, flags
);
1558 pp_cxx_colon_colon (pp
);
1561 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1563 dump_function_name (pp
, t
, flags
);
1565 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1567 dump_parameters (pp
, parmtypes
, flags
);
1569 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1571 pp
->padding
= pp_before
;
1572 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (fntype
));
1573 dump_ref_qualifier (pp
, fntype
, flags
);
1576 if (tx_safe_fn_type_p (fntype
))
1578 pp
->padding
= pp_before
;
1579 pp_cxx_ws_string (pp
, "transaction_safe");
1582 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1584 pp
->padding
= pp_before
;
1585 dump_exception_spec (pp
, exceptions
, flags
);
1589 dump_type_suffix (pp
, TREE_TYPE (fntype
), flags
);
1592 if (tree ci
= get_constraints (t
))
1593 if (tree reqs
= CI_DECLARATOR_REQS (ci
))
1594 pp_cxx_requires_clause (pp
, reqs
);
1596 dump_substitution (pp
, t
, template_parms
, template_args
, flags
);
1598 else if (template_args
)
1600 bool need_comma
= false;
1602 pp_cxx_begin_template_argument_list (pp
);
1603 template_args
= INNERMOST_TEMPLATE_ARGS (template_args
);
1604 for (i
= 0; i
< TREE_VEC_LENGTH (template_args
); ++i
)
1606 tree arg
= TREE_VEC_ELT (template_args
, i
);
1608 pp_separate_with_comma (pp
);
1609 if (ARGUMENT_PACK_P (arg
))
1610 pp_cxx_left_brace (pp
);
1611 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
1612 if (ARGUMENT_PACK_P (arg
))
1613 pp_cxx_right_brace (pp
);
1616 pp_cxx_end_template_argument_list (pp
);
1620 /* Print a parameter list. If this is for a member function, the
1621 member object ptr (and any other hidden args) should have
1622 already been removed. */
1625 dump_parameters (cxx_pretty_printer
*pp
, tree parmtypes
, int flags
)
1628 flags
&= ~TFF_SCOPE
;
1629 pp_cxx_left_paren (pp
);
1631 for (first
= 1; parmtypes
!= void_list_node
;
1632 parmtypes
= TREE_CHAIN (parmtypes
))
1635 pp_separate_with_comma (pp
);
1639 pp_cxx_ws_string (pp
, "...");
1643 dump_type (pp
, TREE_VALUE (parmtypes
), flags
);
1645 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1647 pp_cxx_whitespace (pp
);
1649 pp_cxx_whitespace (pp
);
1650 dump_expr (pp
, TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1654 pp_cxx_right_paren (pp
);
1657 /* Print ref-qualifier of a FUNCTION_TYPE or METHOD_TYPE. FLAGS are ignored. */
1660 dump_ref_qualifier (cxx_pretty_printer
*pp
, tree t
, int flags ATTRIBUTE_UNUSED
)
1662 if (FUNCTION_REF_QUALIFIED (t
))
1664 pp
->padding
= pp_before
;
1665 if (FUNCTION_RVALUE_QUALIFIED (t
))
1666 pp_cxx_ws_string (pp
, "&&");
1668 pp_cxx_ws_string (pp
, "&");
1672 /* Print an exception specification. T is the exception specification. */
1675 dump_exception_spec (cxx_pretty_printer
*pp
, tree t
, int flags
)
1677 if (t
&& TREE_PURPOSE (t
))
1679 pp_cxx_ws_string (pp
, "noexcept");
1680 if (!integer_onep (TREE_PURPOSE (t
)))
1682 pp_cxx_whitespace (pp
);
1683 pp_cxx_left_paren (pp
);
1684 if (DEFERRED_NOEXCEPT_SPEC_P (t
))
1685 pp_cxx_ws_string (pp
, "<uninstantiated>");
1687 dump_expr (pp
, TREE_PURPOSE (t
), flags
);
1688 pp_cxx_right_paren (pp
);
1693 pp_cxx_ws_string (pp
, "throw");
1694 pp_cxx_whitespace (pp
);
1695 pp_cxx_left_paren (pp
);
1696 if (TREE_VALUE (t
) != NULL_TREE
)
1699 dump_type (pp
, TREE_VALUE (t
), flags
);
1703 pp_separate_with_comma (pp
);
1705 pp_cxx_right_paren (pp
);
1709 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1710 and destructors properly. */
1713 dump_function_name (cxx_pretty_printer
*pp
, tree t
, int flags
)
1715 tree name
= DECL_NAME (t
);
1717 /* We can get here with a decl that was synthesized by language-
1718 independent machinery (e.g. coverage.c) in which case it won't
1719 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1720 will crash. In this case it is safe just to print out the
1722 if (!DECL_LANG_SPECIFIC (t
))
1724 pp_cxx_tree_identifier (pp
, name
);
1728 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1729 t
= DECL_TEMPLATE_RESULT (t
);
1731 /* Don't let the user see __comp_ctor et al. */
1732 if (DECL_CONSTRUCTOR_P (t
)
1733 || DECL_DESTRUCTOR_P (t
))
1735 if (LAMBDA_TYPE_P (DECL_CONTEXT (t
)))
1736 name
= get_identifier ("<lambda>");
1737 else if (TYPE_ANONYMOUS_P (DECL_CONTEXT (t
)))
1738 name
= get_identifier ("<constructor>");
1740 name
= constructor_name (DECL_CONTEXT (t
));
1743 if (DECL_DESTRUCTOR_P (t
))
1745 pp_cxx_complement (pp
);
1746 dump_decl (pp
, name
, TFF_PLAIN_IDENTIFIER
);
1748 else if (DECL_CONV_FN_P (t
))
1750 /* This cannot use the hack that the operator's return
1751 type is stashed off of its name because it may be
1752 used for error reporting. In the case of conflicting
1753 declarations, both will have the same name, yet
1754 the types will be different, hence the TREE_TYPE field
1755 of the first name will be clobbered by the second. */
1756 pp_cxx_ws_string (pp
, "operator");
1757 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1759 else if (name
&& IDENTIFIER_OPNAME_P (name
))
1760 pp_cxx_tree_identifier (pp
, name
);
1761 else if (name
&& UDLIT_OPER_P (name
))
1762 pp_cxx_tree_identifier (pp
, name
);
1764 dump_decl (pp
, name
, flags
);
1766 if (DECL_TEMPLATE_INFO (t
)
1767 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1768 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1769 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1770 dump_template_parms (pp
, DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
),
1774 /* Dump the template parameters from the template info INFO under control of
1775 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1776 specialization (partial or complete). For partial specializations we show
1777 the specialized parameter values. For a primary template we show no
1781 dump_template_parms (cxx_pretty_printer
*pp
, tree info
,
1782 int primary
, int flags
)
1784 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1786 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1788 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1789 pp_cxx_begin_template_argument_list (pp
);
1791 /* Be careful only to print things when we have them, so as not
1792 to crash producing error messages. */
1793 if (args
&& !primary
)
1796 len
= get_non_default_template_args_count (args
, flags
);
1798 args
= INNERMOST_TEMPLATE_ARGS (args
);
1799 for (ix
= 0; ix
!= len
; ix
++)
1801 tree arg
= TREE_VEC_ELT (args
, ix
);
1803 /* Only print a comma if we know there is an argument coming. In
1804 the case of an empty template argument pack, no actual
1805 argument will be printed. */
1807 && (!ARGUMENT_PACK_P (arg
)
1808 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
1809 pp_separate_with_comma (pp
);
1812 pp_string (pp
, M_("<template parameter error>"));
1814 dump_template_argument (pp
, arg
, flags
);
1819 tree tpl
= TI_TEMPLATE (info
);
1820 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1823 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1824 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1826 for (ix
= 0; ix
!= len
; ix
++)
1830 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1832 pp_string (pp
, M_("<template parameter error>"));
1836 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1839 pp_separate_with_comma (pp
);
1841 dump_decl (pp
, parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1844 pp_cxx_end_template_argument_list (pp
);
1847 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1848 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1851 dump_call_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
, bool skipfirst
)
1854 call_expr_arg_iterator iter
;
1856 pp_cxx_left_paren (pp
);
1857 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1863 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1864 if (more_call_expr_args_p (&iter
))
1865 pp_separate_with_comma (pp
);
1868 pp_cxx_right_paren (pp
);
1871 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1872 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1876 dump_aggr_init_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
,
1880 aggr_init_expr_arg_iterator iter
;
1882 pp_cxx_left_paren (pp
);
1883 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1889 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1890 if (more_aggr_init_expr_args_p (&iter
))
1891 pp_separate_with_comma (pp
);
1894 pp_cxx_right_paren (pp
);
1897 /* Print out a list of initializers (subr of dump_expr). */
1900 dump_expr_list (cxx_pretty_printer
*pp
, tree l
, int flags
)
1904 dump_expr (pp
, TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1907 pp_separate_with_comma (pp
);
1911 /* Print out a vector of initializers (subr of dump_expr). */
1914 dump_expr_init_vec (cxx_pretty_printer
*pp
, vec
<constructor_elt
, va_gc
> *v
,
1917 unsigned HOST_WIDE_INT idx
;
1920 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1922 dump_expr (pp
, value
, flags
| TFF_EXPR_IN_PARENS
);
1923 if (idx
!= v
->length () - 1)
1924 pp_separate_with_comma (pp
);
1929 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1930 function. Resolve it to a close relative -- in the sense of static
1931 type -- variant being overridden. That is close to what was written in
1932 the source code. Subroutine of dump_expr. */
1935 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1937 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1938 HOST_WIDE_INT index
= tree_to_uhwi (OBJ_TYPE_REF_TOKEN (ref
));
1939 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1942 fun
= TREE_CHAIN (fun
);
1943 index
-= (TARGET_VTABLE_USES_DESCRIPTORS
1944 ? TARGET_VTABLE_USES_DESCRIPTORS
: 1);
1950 /* Print out an expression E under control of FLAGS. */
1953 dump_expr (cxx_pretty_printer
*pp
, tree t
, int flags
)
1960 if (STATEMENT_CLASS_P (t
))
1962 pp_cxx_ws_string (pp
, M_("<statement>"));
1966 switch (TREE_CODE (t
))
1974 case NAMESPACE_DECL
:
1978 case IDENTIFIER_NODE
:
1979 dump_decl (pp
, t
, ((flags
& ~(TFF_DECL_SPECIFIERS
|TFF_RETURN_TYPE
1980 |TFF_TEMPLATE_HEADER
))
1981 | TFF_NO_FUNCTION_ARGUMENTS
));
1985 if (SSA_NAME_VAR (t
)
1986 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t
)))
1987 dump_expr (pp
, SSA_NAME_VAR (t
), flags
);
1989 pp_cxx_ws_string (pp
, M_("<unknown>"));
2000 case USERDEF_LITERAL
:
2001 pp_cxx_userdef_literal (pp
, t
);
2005 /* While waiting for caret diagnostics, avoid printing
2006 __cxa_allocate_exception, __cxa_throw, and the like. */
2007 pp_cxx_ws_string (pp
, M_("<throw-expression>"));
2012 dump_type (pp
, PTRMEM_CST_CLASS (t
), flags
);
2013 pp_cxx_colon_colon (pp
);
2014 pp_cxx_tree_identifier (pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
2018 pp_cxx_left_paren (pp
);
2019 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2020 pp_separate_with_comma (pp
);
2021 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2022 pp_cxx_right_paren (pp
);
2026 pp_cxx_left_paren (pp
);
2027 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2028 pp_string (pp
, " ? ");
2029 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2030 pp_string (pp
, " : ");
2031 dump_expr (pp
, TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
2032 pp_cxx_right_paren (pp
);
2036 if (TREE_HAS_CONSTRUCTOR (t
))
2038 pp_cxx_ws_string (pp
, "new");
2039 pp_cxx_whitespace (pp
);
2040 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
2043 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2046 case AGGR_INIT_EXPR
:
2048 tree fn
= NULL_TREE
;
2050 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
2051 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
2053 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
2055 if (DECL_CONSTRUCTOR_P (fn
))
2056 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
2058 dump_decl (pp
, fn
, 0);
2061 dump_expr (pp
, AGGR_INIT_EXPR_FN (t
), 0);
2063 dump_aggr_init_expr_args (pp
, t
, flags
, true);
2068 tree fn
= CALL_EXPR_FN (t
);
2069 bool skipfirst
= false;
2071 /* Deal with internal functions. */
2072 if (fn
== NULL_TREE
)
2074 pp_string (pp
, internal_fn_name (CALL_EXPR_IFN (t
)));
2075 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2079 if (TREE_CODE (fn
) == ADDR_EXPR
)
2080 fn
= TREE_OPERAND (fn
, 0);
2082 /* Nobody is interested in seeing the guts of vcalls. */
2083 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
2084 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
2086 if (TREE_TYPE (fn
) != NULL_TREE
2087 && NEXT_CODE (fn
) == METHOD_TYPE
2088 && call_expr_nargs (t
))
2090 tree ob
= CALL_EXPR_ARG (t
, 0);
2091 if (TREE_CODE (ob
) == ADDR_EXPR
)
2093 dump_expr (pp
, TREE_OPERAND (ob
, 0),
2094 flags
| TFF_EXPR_IN_PARENS
);
2097 else if (TREE_CODE (ob
) != PARM_DECL
2098 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
2100 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2105 if (flag_sanitize
& SANITIZE_UNDEFINED
2106 && is_ubsan_builtin_p (fn
))
2108 pp_string (cxx_pp
, M_("<ubsan routine call>"));
2111 dump_expr (pp
, fn
, flags
| TFF_EXPR_IN_PARENS
);
2112 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2117 /* Note that this only works for G++ target exprs. If somebody
2118 builds a general TARGET_EXPR, there's no way to represent that
2119 it initializes anything other that the parameter slot for the
2120 default argument. Note we may have cleared out the first
2121 operand in expand_expr, so don't go killing ourselves. */
2122 if (TREE_OPERAND (t
, 1))
2123 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2126 case POINTER_PLUS_EXPR
:
2127 dump_binary_op (pp
, "+", t
, flags
);
2132 dump_binary_op (pp
, assignment_operator_name_info
[NOP_EXPR
].name
,
2139 case TRUNC_DIV_EXPR
:
2140 case TRUNC_MOD_EXPR
:
2148 case TRUTH_ANDIF_EXPR
:
2149 case TRUTH_ORIF_EXPR
:
2156 case EXACT_DIV_EXPR
:
2157 dump_binary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2161 case FLOOR_DIV_EXPR
:
2162 case ROUND_DIV_EXPR
:
2164 dump_binary_op (pp
, "/", t
, flags
);
2168 case FLOOR_MOD_EXPR
:
2169 case ROUND_MOD_EXPR
:
2170 dump_binary_op (pp
, "%", t
, flags
);
2175 tree ob
= TREE_OPERAND (t
, 0);
2176 if (INDIRECT_REF_P (ob
))
2178 ob
= TREE_OPERAND (ob
, 0);
2179 if (TREE_CODE (ob
) != PARM_DECL
2181 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
2183 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2184 if (TREE_CODE (TREE_TYPE (ob
)) == REFERENCE_TYPE
)
2192 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2195 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
2200 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2201 pp_cxx_left_bracket (pp
);
2202 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2203 pp_cxx_right_bracket (pp
);
2206 case ARRAY_NOTATION_REF
:
2207 dump_expr (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
2208 pp_cxx_left_bracket (pp
);
2209 dump_expr (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
2211 dump_expr (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
2213 dump_expr (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
2214 pp_cxx_right_bracket (pp
);
2217 case UNARY_PLUS_EXPR
:
2218 dump_unary_op (pp
, "+", t
, flags
);
2222 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
2223 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
2224 /* An ADDR_EXPR can have reference type. In that case, we
2225 shouldn't print the `&' doing so indicates to the user
2226 that the expression has pointer type. */
2228 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
2229 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2230 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
2231 dump_unary_op (pp
, "&&", t
, flags
);
2233 dump_unary_op (pp
, "&", t
, flags
);
2237 if (TREE_HAS_CONSTRUCTOR (t
))
2239 t
= TREE_OPERAND (t
, 0);
2240 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
2241 dump_expr (pp
, CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
2242 dump_call_expr_args (pp
, t
, flags
, true);
2246 if (TREE_OPERAND (t
,0) != NULL_TREE
2247 && TREE_TYPE (TREE_OPERAND (t
, 0))
2248 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
2249 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2251 dump_unary_op (pp
, "*", t
, flags
);
2256 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
2257 && integer_zerop (TREE_OPERAND (t
, 1)))
2258 dump_expr (pp
, TREE_OPERAND (TREE_OPERAND (t
, 0), 0), flags
);
2262 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2264 pp_cxx_left_paren (pp
);
2265 if (!integer_onep (TYPE_SIZE_UNIT
2266 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))))))
2268 pp_cxx_left_paren (pp
);
2269 dump_type (pp
, ptr_type_node
, flags
);
2270 pp_cxx_right_paren (pp
);
2273 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2274 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2276 pp_cxx_ws_string (pp
, "+");
2277 dump_expr (pp
, fold_convert (ssizetype
, TREE_OPERAND (t
, 1)),
2279 pp_cxx_right_paren (pp
);
2286 case TRUTH_NOT_EXPR
:
2287 case PREDECREMENT_EXPR
:
2288 case PREINCREMENT_EXPR
:
2289 dump_unary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2292 case POSTDECREMENT_EXPR
:
2293 case POSTINCREMENT_EXPR
:
2294 pp_cxx_left_paren (pp
);
2295 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2296 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2297 pp_cxx_right_paren (pp
);
2300 case NON_LVALUE_EXPR
:
2301 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2302 should be another level of INDIRECT_REF so that I don't have to do
2304 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
2306 tree next
= TREE_TYPE (TREE_TYPE (t
));
2308 while (TYPE_PTR_P (next
))
2309 next
= TREE_TYPE (next
);
2311 if (TREE_CODE (next
) == FUNCTION_TYPE
)
2313 if (flags
& TFF_EXPR_IN_PARENS
)
2314 pp_cxx_left_paren (pp
);
2316 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2317 if (flags
& TFF_EXPR_IN_PARENS
)
2318 pp_cxx_right_paren (pp
);
2321 /* Else fall through. */
2323 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2327 case IMPLICIT_CONV_EXPR
:
2328 case VIEW_CONVERT_EXPR
:
2330 tree op
= TREE_OPERAND (t
, 0);
2331 tree ttype
= TREE_TYPE (t
);
2332 tree optype
= TREE_TYPE (op
);
2334 if (TREE_CODE (ttype
) != TREE_CODE (optype
)
2335 && POINTER_TYPE_P (ttype
)
2336 && POINTER_TYPE_P (optype
)
2337 && same_type_p (TREE_TYPE (optype
),
2340 if (TREE_CODE (ttype
) == REFERENCE_TYPE
)
2343 if (TREE_CODE (op
) == ADDR_EXPR
)
2344 dump_expr (pp
, TREE_OPERAND (op
, 0), flags
);
2346 dump_unary_op (pp
, "*", t
, flags
);
2349 dump_unary_op (pp
, "&", t
, flags
);
2351 else if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
2353 /* It is a cast, but we cannot tell whether it is a
2354 reinterpret or static cast. Use the C style notation. */
2355 if (flags
& TFF_EXPR_IN_PARENS
)
2356 pp_cxx_left_paren (pp
);
2357 pp_cxx_left_paren (pp
);
2358 dump_type (pp
, TREE_TYPE (t
), flags
);
2359 pp_cxx_right_paren (pp
);
2360 dump_expr (pp
, op
, flags
| TFF_EXPR_IN_PARENS
);
2361 if (flags
& TFF_EXPR_IN_PARENS
)
2362 pp_cxx_right_paren (pp
);
2365 dump_expr (pp
, op
, flags
);
2370 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
2372 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
2374 if (integer_zerop (idx
))
2376 /* A NULL pointer-to-member constant. */
2377 pp_cxx_left_paren (pp
);
2378 pp_cxx_left_paren (pp
);
2379 dump_type (pp
, TREE_TYPE (t
), flags
);
2380 pp_cxx_right_paren (pp
);
2381 pp_character (pp
, '0');
2382 pp_cxx_right_paren (pp
);
2385 else if (tree_fits_shwi_p (idx
))
2388 unsigned HOST_WIDE_INT n
;
2390 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
2391 t
= TYPE_METHOD_BASETYPE (t
);
2392 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
2394 n
= tree_to_shwi (idx
);
2396 /* Map vtable index back one, to allow for the null pointer to
2400 while (n
> 0 && virtuals
)
2403 virtuals
= TREE_CHAIN (virtuals
);
2407 dump_expr (pp
, BV_FN (virtuals
),
2408 flags
| TFF_EXPR_IN_PARENS
);
2413 if (TREE_TYPE (t
) && LAMBDA_TYPE_P (TREE_TYPE (t
)))
2414 pp_string (pp
, "<lambda closure object>");
2415 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
2417 dump_type (pp
, TREE_TYPE (t
), 0);
2418 pp_cxx_left_paren (pp
);
2419 pp_cxx_right_paren (pp
);
2423 if (!BRACE_ENCLOSED_INITIALIZER_P (t
))
2424 dump_type (pp
, TREE_TYPE (t
), 0);
2425 pp_cxx_left_brace (pp
);
2426 dump_expr_init_vec (pp
, CONSTRUCTOR_ELTS (t
), flags
);
2427 pp_cxx_right_brace (pp
);
2434 tree ob
= TREE_OPERAND (t
, 0);
2435 if (is_dummy_object (ob
))
2437 t
= TREE_OPERAND (t
, 1);
2438 if (TREE_CODE (t
) == FUNCTION_DECL
)
2440 dump_expr (pp
, t
, flags
| TFF_EXPR_IN_PARENS
);
2441 else if (BASELINK_P (t
))
2442 dump_expr (pp
, OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
2443 flags
| TFF_EXPR_IN_PARENS
);
2445 dump_decl (pp
, t
, flags
);
2449 if (INDIRECT_REF_P (ob
))
2451 dump_expr (pp
, TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
2457 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2461 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2466 case TEMPLATE_PARM_INDEX
:
2467 dump_decl (pp
, TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
2471 if (TREE_OPERAND (t
, 0) == NULL_TREE
2472 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
2474 dump_type (pp
, TREE_TYPE (t
), flags
);
2475 pp_cxx_left_paren (pp
);
2476 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2477 pp_cxx_right_paren (pp
);
2481 pp_cxx_left_paren (pp
);
2482 dump_type (pp
, TREE_TYPE (t
), flags
);
2483 pp_cxx_right_paren (pp
);
2484 pp_cxx_left_paren (pp
);
2485 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2486 pp_cxx_right_paren (pp
);
2490 case STATIC_CAST_EXPR
:
2491 pp_cxx_ws_string (pp
, "static_cast");
2493 case REINTERPRET_CAST_EXPR
:
2494 pp_cxx_ws_string (pp
, "reinterpret_cast");
2496 case CONST_CAST_EXPR
:
2497 pp_cxx_ws_string (pp
, "const_cast");
2499 case DYNAMIC_CAST_EXPR
:
2500 pp_cxx_ws_string (pp
, "dynamic_cast");
2502 pp_cxx_begin_template_argument_list (pp
);
2503 dump_type (pp
, TREE_TYPE (t
), flags
);
2504 pp_cxx_end_template_argument_list (pp
);
2505 pp_cxx_left_paren (pp
);
2506 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2507 pp_cxx_right_paren (pp
);
2511 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2517 if (TREE_CODE (t
) == SIZEOF_EXPR
)
2518 pp_cxx_ws_string (pp
, "sizeof");
2521 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
2522 pp_cxx_ws_string (pp
, "__alignof__");
2524 op
= TREE_OPERAND (t
, 0);
2525 if (PACK_EXPANSION_P (op
))
2527 pp_string (pp
, "...");
2528 op
= PACK_EXPANSION_PATTERN (op
);
2530 pp_cxx_whitespace (pp
);
2531 pp_cxx_left_paren (pp
);
2532 if (TREE_CODE (t
) == SIZEOF_EXPR
&& SIZEOF_EXPR_TYPE_P (t
))
2533 dump_type (pp
, TREE_TYPE (op
), flags
);
2534 else if (TYPE_P (TREE_OPERAND (t
, 0)))
2535 dump_type (pp
, op
, flags
);
2537 dump_expr (pp
, op
, flags
);
2538 pp_cxx_right_paren (pp
);
2541 case AT_ENCODE_EXPR
:
2542 pp_cxx_ws_string (pp
, "@encode");
2543 pp_cxx_whitespace (pp
);
2544 pp_cxx_left_paren (pp
);
2545 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
2546 pp_cxx_right_paren (pp
);
2550 pp_cxx_ws_string (pp
, "noexcept");
2551 pp_cxx_whitespace (pp
);
2552 pp_cxx_left_paren (pp
);
2553 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2554 pp_cxx_right_paren (pp
);
2559 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2560 pp_cxx_whitespace (pp
);
2561 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2565 pp_string (pp
, M_("<unparsed>"));
2568 case TRY_CATCH_EXPR
:
2569 case WITH_CLEANUP_EXPR
:
2570 case CLEANUP_POINT_EXPR
:
2571 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2574 case PSEUDO_DTOR_EXPR
:
2575 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2577 if (TREE_OPERAND (t
, 1))
2579 dump_type (pp
, TREE_OPERAND (t
, 1), flags
);
2580 pp_cxx_colon_colon (pp
);
2582 pp_cxx_complement (pp
);
2583 dump_type (pp
, TREE_OPERAND (t
, 2), flags
);
2586 case TEMPLATE_ID_EXPR
:
2587 dump_decl (pp
, t
, flags
);
2593 case STATEMENT_LIST
:
2594 /* We don't yet have a way of dumping statements in a
2595 human-readable format. */
2596 pp_string (pp
, "({...})");
2600 pp_string (pp
, "while (1) { ");
2601 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2602 pp_cxx_right_brace (pp
);
2606 pp_string (pp
, "if (");
2607 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2608 pp_string (pp
, ") break; ");
2612 dump_expr (pp
, BASELINK_FUNCTIONS (t
), flags
& ~TFF_EXPR_IN_PARENS
);
2615 case EMPTY_CLASS_EXPR
:
2616 dump_type (pp
, TREE_TYPE (t
), flags
);
2617 pp_cxx_left_paren (pp
);
2618 pp_cxx_right_paren (pp
);
2621 case NON_DEPENDENT_EXPR
:
2622 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2625 case ARGUMENT_PACK_SELECT
:
2626 dump_template_argument (pp
, ARGUMENT_PACK_SELECT_FROM_PACK (t
), flags
);
2638 pp_type_specifier_seq (pp
, t
);
2642 /* We get here when we want to print a dependent type as an
2643 id-expression, without any disambiguator decoration. */
2644 pp
->id_expression (t
);
2647 case TEMPLATE_TYPE_PARM
:
2648 case TEMPLATE_TEMPLATE_PARM
:
2649 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2650 dump_type (pp
, t
, flags
);
2654 pp_cxx_trait_expression (pp
, t
);
2658 pp_cxx_va_arg_expression (pp
, t
);
2662 pp_cxx_offsetof_expression (pp
, t
);
2666 dump_decl (pp
, t
, flags
);
2669 case EXPR_PACK_EXPANSION
:
2676 case VEC_DELETE_EXPR
:
2682 case UNORDERED_EXPR
:
2692 case FIX_TRUNC_EXPR
:
2697 case TRUTH_AND_EXPR
:
2699 case TRUTH_XOR_EXPR
:
2700 if (flags
& TFF_EXPR_IN_PARENS
)
2701 pp_cxx_left_paren (pp
);
2703 if (flags
& TFF_EXPR_IN_PARENS
)
2704 pp_cxx_right_paren (pp
);
2708 dump_expr (pp
, resolve_virtual_fun_from_obj_type_ref (t
), flags
);
2712 pp_string (pp
, M_("<lambda>"));
2716 pp_cxx_left_paren (pp
);
2717 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2718 pp_cxx_right_paren (pp
);
2722 pp_cxx_requires_expr (cxx_pp
, t
);
2726 pp_cxx_simple_requirement (cxx_pp
, t
);
2730 pp_cxx_type_requirement (cxx_pp
, t
);
2734 pp_cxx_compound_requirement (cxx_pp
, t
);
2738 pp_cxx_nested_requirement (cxx_pp
, t
);
2750 pp_cxx_constraint (cxx_pp
, t
);
2753 case PLACEHOLDER_EXPR
:
2754 pp_string (pp
, M_("*this"));
2757 /* This list is incomplete, but should suffice for now.
2758 It is very important that `sorry' does not call
2759 `report_error_function'. That could cause an infinite loop. */
2761 pp_unsupported_tree (pp
, t
);
2762 /* fall through to ERROR_MARK... */
2764 pp_string (pp
, M_("<expression error>"));
2770 dump_binary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
,
2773 pp_cxx_left_paren (pp
);
2774 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2775 pp_cxx_whitespace (pp
);
2777 pp_cxx_ws_string (pp
, opstring
);
2779 pp_string (pp
, M_("<unknown operator>"));
2780 pp_cxx_whitespace (pp
);
2781 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2782 pp_cxx_right_paren (pp
);
2786 dump_unary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
, int flags
)
2788 if (flags
& TFF_EXPR_IN_PARENS
)
2789 pp_cxx_left_paren (pp
);
2790 pp_cxx_ws_string (pp
, opstring
);
2791 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2792 if (flags
& TFF_EXPR_IN_PARENS
)
2793 pp_cxx_right_paren (pp
);
2797 reinit_cxx_pp (void)
2799 pp_clear_output_area (cxx_pp
);
2800 cxx_pp
->padding
= pp_none
;
2801 pp_indentation (cxx_pp
) = 0;
2802 pp_needs_newline (cxx_pp
) = false;
2803 cxx_pp
->enclosing_scope
= current_function_decl
;
2806 /* Same as pp_formatted_text, except the return string is a separate
2807 copy and has a GGC storage duration, e.g. an indefinite lifetime. */
2810 pp_ggc_formatted_text (pretty_printer
*pp
)
2812 return ggc_strdup (pp_formatted_text (pp
));
2815 /* Exported interface to stringifying types, exprs and decls under TFF_*
2819 type_as_string (tree typ
, int flags
)
2822 pp_translate_identifiers (cxx_pp
) = false;
2823 dump_type (cxx_pp
, typ
, flags
);
2824 return pp_ggc_formatted_text (cxx_pp
);
2828 type_as_string_translate (tree typ
, int flags
)
2831 dump_type (cxx_pp
, typ
, flags
);
2832 return pp_ggc_formatted_text (cxx_pp
);
2836 expr_as_string (tree decl
, int flags
)
2839 pp_translate_identifiers (cxx_pp
) = false;
2840 dump_expr (cxx_pp
, decl
, flags
);
2841 return pp_ggc_formatted_text (cxx_pp
);
2844 /* Wrap decl_as_string with options appropriate for dwarf. */
2847 decl_as_dwarf_string (tree decl
, int flags
)
2850 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2851 here will be adequate to get the desired behaviour. */
2852 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2853 name
= decl_as_string (decl
, flags
);
2854 /* Subsequent calls to the pretty printer shouldn't use this style. */
2855 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2860 decl_as_string (tree decl
, int flags
)
2863 pp_translate_identifiers (cxx_pp
) = false;
2864 dump_decl (cxx_pp
, decl
, flags
);
2865 return pp_ggc_formatted_text (cxx_pp
);
2869 decl_as_string_translate (tree decl
, int flags
)
2872 dump_decl (cxx_pp
, decl
, flags
);
2873 return pp_ggc_formatted_text (cxx_pp
);
2876 /* Wrap lang_decl_name with options appropriate for dwarf. */
2879 lang_decl_dwarf_name (tree decl
, int v
, bool translate
)
2882 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2883 here will be adequate to get the desired behaviour. */
2884 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2885 name
= lang_decl_name (decl
, v
, translate
);
2886 /* Subsequent calls to the pretty printer shouldn't use this style. */
2887 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2891 /* Generate the three forms of printable names for cxx_printable_name. */
2894 lang_decl_name (tree decl
, int v
, bool translate
)
2898 ? decl_as_string_translate (decl
, TFF_DECL_SPECIFIERS
)
2899 : decl_as_string (decl
, TFF_DECL_SPECIFIERS
));
2902 pp_translate_identifiers (cxx_pp
) = translate
;
2904 && (DECL_CLASS_SCOPE_P (decl
)
2905 || (DECL_NAMESPACE_SCOPE_P (decl
)
2906 && CP_DECL_CONTEXT (decl
) != global_namespace
)))
2908 dump_type (cxx_pp
, CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2909 pp_cxx_colon_colon (cxx_pp
);
2912 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2913 dump_function_name (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
);
2914 else if ((DECL_NAME (decl
) == NULL_TREE
)
2915 && TREE_CODE (decl
) == NAMESPACE_DECL
)
2916 dump_decl (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
| TFF_UNQUALIFIED_NAME
);
2918 dump_decl (cxx_pp
, DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2920 return pp_ggc_formatted_text (cxx_pp
);
2923 /* Return the location of a tree passed to %+ formats. */
2926 location_of (tree t
)
2930 t
= TYPE_MAIN_DECL (t
);
2932 return input_location
;
2934 else if (TREE_CODE (t
) == OVERLOAD
)
2935 t
= OVL_FUNCTION (t
);
2938 return DECL_SOURCE_LOCATION (t
);
2939 return EXPR_LOC_OR_LOC (t
, input_location
);
2942 /* Now the interfaces from error et al to dump_type et al. Each takes an
2943 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2947 decl_to_string (tree decl
, int verbose
)
2951 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2952 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2953 flags
= TFF_CLASS_KEY_OR_ENUM
;
2955 flags
|= TFF_DECL_SPECIFIERS
;
2956 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2957 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2958 flags
|= TFF_TEMPLATE_HEADER
;
2961 dump_decl (cxx_pp
, decl
, flags
);
2962 return pp_ggc_formatted_text (cxx_pp
);
2966 expr_to_string (tree decl
)
2969 dump_expr (cxx_pp
, decl
, 0);
2970 return pp_ggc_formatted_text (cxx_pp
);
2974 fndecl_to_string (tree fndecl
, int verbose
)
2978 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2979 | TFF_TEMPLATE_HEADER
;
2981 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2983 dump_decl (cxx_pp
, fndecl
, flags
);
2984 return pp_ggc_formatted_text (cxx_pp
);
2989 code_to_string (enum tree_code c
)
2991 return get_tree_code_name (c
);
2995 language_to_string (enum languages c
)
3002 case lang_cplusplus
:
3014 /* Return the proper printed version of a parameter to a C++ function. */
3017 parm_to_string (int p
)
3021 pp_string (cxx_pp
, "'this'");
3023 pp_decimal_int (cxx_pp
, p
+ 1);
3024 return pp_ggc_formatted_text (cxx_pp
);
3028 op_to_string (enum tree_code p
)
3030 tree id
= operator_name_info
[p
].identifier
;
3031 return id
? IDENTIFIER_POINTER (id
) : M_("<unknown>");
3035 type_to_string (tree typ
, int verbose
)
3039 flags
|= TFF_CLASS_KEY_OR_ENUM
;
3040 flags
|= TFF_TEMPLATE_HEADER
;
3043 dump_type (cxx_pp
, typ
, flags
);
3044 /* If we're printing a type that involves typedefs, also print the
3045 stripped version. But sometimes the stripped version looks
3046 exactly the same, so we don't want it after all. To avoid printing
3047 it in that case, we play ugly obstack games. */
3048 if (typ
&& TYPE_P (typ
) && typ
!= TYPE_CANONICAL (typ
)
3049 && !uses_template_parms (typ
))
3051 int aka_start
, aka_len
; char *p
;
3052 struct obstack
*ob
= pp_buffer (cxx_pp
)->obstack
;
3053 /* Remember the end of the initial dump. */
3054 int len
= obstack_object_size (ob
);
3055 tree aka
= strip_typedefs (typ
);
3056 pp_string (cxx_pp
, " {aka");
3057 pp_cxx_whitespace (cxx_pp
);
3058 /* And remember the start of the aka dump. */
3059 aka_start
= obstack_object_size (ob
);
3060 dump_type (cxx_pp
, aka
, flags
);
3061 aka_len
= obstack_object_size (ob
) - aka_start
;
3062 pp_right_brace (cxx_pp
);
3063 p
= (char*)obstack_base (ob
);
3064 /* If they are identical, cut off the aka with a NUL. */
3065 if (len
== aka_len
&& memcmp (p
, p
+aka_start
, len
) == 0)
3068 return pp_ggc_formatted_text (cxx_pp
);
3072 assop_to_string (enum tree_code p
)
3074 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
3075 return id
? IDENTIFIER_POINTER (id
) : M_("{unknown}");
3079 args_to_string (tree p
, int verbose
)
3083 flags
|= TFF_CLASS_KEY_OR_ENUM
;
3088 if (TYPE_P (TREE_VALUE (p
)))
3089 return type_as_string_translate (p
, flags
);
3092 for (; p
; p
= TREE_CHAIN (p
))
3094 if (TREE_VALUE (p
) == null_node
)
3095 pp_cxx_ws_string (cxx_pp
, "NULL");
3097 dump_type (cxx_pp
, error_type (TREE_VALUE (p
)), flags
);
3099 pp_separate_with_comma (cxx_pp
);
3101 return pp_ggc_formatted_text (cxx_pp
);
3104 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
3105 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
3109 subst_to_string (tree p
)
3111 tree decl
= TREE_PURPOSE (p
);
3112 tree targs
= TREE_VALUE (p
);
3113 tree tparms
= DECL_TEMPLATE_PARMS (decl
);
3114 int flags
= (TFF_DECL_SPECIFIERS
|TFF_TEMPLATE_HEADER
3115 |TFF_NO_TEMPLATE_BINDINGS
);
3121 dump_template_decl (cxx_pp
, TREE_PURPOSE (p
), flags
);
3122 dump_substitution (cxx_pp
, NULL
, tparms
, targs
, /*flags=*/0);
3123 return pp_ggc_formatted_text (cxx_pp
);
3127 cv_to_string (tree p
, int v
)
3130 cxx_pp
->padding
= v
? pp_before
: pp_none
;
3131 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
3132 return pp_ggc_formatted_text (cxx_pp
);
3136 eh_spec_to_string (tree p
, int /*v*/)
3140 dump_exception_spec (cxx_pp
, p
, flags
);
3141 return pp_ggc_formatted_text (cxx_pp
);
3144 /* Langhook for print_error_function. */
3146 cxx_print_error_function (diagnostic_context
*context
, const char *file
,
3147 diagnostic_info
*diagnostic
)
3149 lhd_print_error_function (context
, file
, diagnostic
);
3150 pp_set_prefix (context
->printer
, file
);
3151 maybe_print_instantiation_context (context
);
3155 cp_diagnostic_starter (diagnostic_context
*context
,
3156 diagnostic_info
*diagnostic
)
3158 diagnostic_report_current_module (context
, diagnostic_location (diagnostic
));
3159 cp_print_error_function (context
, diagnostic
);
3160 maybe_print_instantiation_context (context
);
3161 maybe_print_constexpr_context (context
);
3162 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
3166 /* Print current function onto BUFFER, in the process of reporting
3167 a diagnostic message. Called from cp_diagnostic_starter. */
3169 cp_print_error_function (diagnostic_context
*context
,
3170 diagnostic_info
*diagnostic
)
3172 /* If we are in an instantiation context, current_function_decl is likely
3173 to be wrong, so just rely on print_instantiation_full_context. */
3174 if (current_instantiation ())
3176 if (diagnostic_last_function_changed (context
, diagnostic
))
3178 const char *old_prefix
= context
->printer
->prefix
;
3179 const char *file
= LOCATION_FILE (diagnostic_location (diagnostic
));
3180 tree abstract_origin
= diagnostic_abstract_origin (diagnostic
);
3181 char *new_prefix
= (file
&& abstract_origin
== NULL
)
3182 ? file_name_as_prefix (context
, file
) : NULL
;
3184 pp_set_prefix (context
->printer
, new_prefix
);
3186 if (current_function_decl
== NULL
)
3187 pp_string (context
->printer
, _("At global scope:"));
3192 if (abstract_origin
)
3194 ao
= BLOCK_ABSTRACT_ORIGIN (abstract_origin
);
3195 while (TREE_CODE (ao
) == BLOCK
3196 && BLOCK_ABSTRACT_ORIGIN (ao
)
3197 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3198 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3199 gcc_assert (TREE_CODE (ao
) == FUNCTION_DECL
);
3203 fndecl
= current_function_decl
;
3205 pp_printf (context
->printer
, function_category (fndecl
),
3206 cxx_printable_name_translate (fndecl
, 2));
3208 while (abstract_origin
)
3211 tree block
= abstract_origin
;
3213 locus
= &BLOCK_SOURCE_LOCATION (block
);
3215 block
= BLOCK_SUPERCONTEXT (block
);
3216 while (block
&& TREE_CODE (block
) == BLOCK
3217 && BLOCK_ABSTRACT_ORIGIN (block
))
3219 ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3221 while (TREE_CODE (ao
) == BLOCK
3222 && BLOCK_ABSTRACT_ORIGIN (ao
)
3223 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3224 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3226 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3231 else if (TREE_CODE (ao
) != BLOCK
)
3234 block
= BLOCK_SUPERCONTEXT (block
);
3237 abstract_origin
= block
;
3240 while (block
&& TREE_CODE (block
) == BLOCK
)
3241 block
= BLOCK_SUPERCONTEXT (block
);
3243 if (block
&& TREE_CODE (block
) == FUNCTION_DECL
)
3245 abstract_origin
= NULL
;
3249 expanded_location s
= expand_location (*locus
);
3250 pp_character (context
->printer
, ',');
3251 pp_newline (context
->printer
);
3254 if (context
->show_column
&& s
.column
!= 0)
3255 pp_printf (context
->printer
,
3256 _(" inlined from %qs at %r%s:%d:%d%R"),
3257 cxx_printable_name_translate (fndecl
, 2),
3258 "locus", s
.file
, s
.line
, s
.column
);
3260 pp_printf (context
->printer
,
3261 _(" inlined from %qs at %r%s:%d%R"),
3262 cxx_printable_name_translate (fndecl
, 2),
3263 "locus", s
.file
, s
.line
);
3267 pp_printf (context
->printer
, _(" inlined from %qs"),
3268 cxx_printable_name_translate (fndecl
, 2));
3271 pp_character (context
->printer
, ':');
3273 pp_newline (context
->printer
);
3275 diagnostic_set_last_function (context
, diagnostic
);
3276 pp_destroy_prefix (context
->printer
);
3277 context
->printer
->prefix
= old_prefix
;
3281 /* Returns a description of FUNCTION using standard terminology. The
3282 result is a format string of the form "In CATEGORY %qs". */
3284 function_category (tree fn
)
3286 /* We can get called from the middle-end for diagnostics of function
3287 clones. Make sure we have language specific information before
3288 dereferencing it. */
3289 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn
))
3290 && DECL_FUNCTION_MEMBER_P (fn
))
3292 if (DECL_STATIC_FUNCTION_P (fn
))
3293 return _("In static member function %qs");
3294 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
3295 return _("In copy constructor %qs");
3296 else if (DECL_CONSTRUCTOR_P (fn
))
3297 return _("In constructor %qs");
3298 else if (DECL_DESTRUCTOR_P (fn
))
3299 return _("In destructor %qs");
3300 else if (LAMBDA_FUNCTION_P (fn
))
3301 return _("In lambda function");
3303 return _("In member function %qs");
3306 return _("In function %qs");
3309 /* Report the full context of a current template instantiation,
3312 print_instantiation_full_context (diagnostic_context
*context
)
3314 struct tinst_level
*p
= current_instantiation ();
3315 location_t location
= input_location
;
3319 pp_verbatim (context
->printer
,
3320 TREE_CODE (p
->decl
) == TREE_LIST
3321 ? _("%s: In substitution of %qS:\n")
3322 : _("%s: In instantiation of %q#D:\n"),
3323 LOCATION_FILE (location
),
3326 location
= p
->locus
;
3330 print_instantiation_partial_context (context
, p
, location
);
3333 /* Helper function of print_instantiation_partial_context() that
3334 prints a single line of instantiation context. */
3337 print_instantiation_partial_context_line (diagnostic_context
*context
,
3338 const struct tinst_level
*t
,
3339 location_t loc
, bool recursive_p
)
3341 if (loc
== UNKNOWN_LOCATION
)
3344 expanded_location xloc
= expand_location (loc
);
3346 if (context
->show_column
)
3347 pp_verbatim (context
->printer
, _("%r%s:%d:%d:%R "),
3348 "locus", xloc
.file
, xloc
.line
, xloc
.column
);
3350 pp_verbatim (context
->printer
, _("%r%s:%d:%R "),
3351 "locus", xloc
.file
, xloc
.line
);
3355 if (TREE_CODE (t
->decl
) == TREE_LIST
)
3356 pp_verbatim (context
->printer
,
3358 ? _("recursively required by substitution of %qS\n")
3359 : _("required by substitution of %qS\n"),
3362 pp_verbatim (context
->printer
,
3364 ? _("recursively required from %q#D\n")
3365 : _("required from %q#D\n"),
3370 pp_verbatim (context
->printer
,
3372 ? _("recursively required from here")
3373 : _("required from here"));
3377 /* Same as print_instantiation_full_context but less verbose. */
3380 print_instantiation_partial_context (diagnostic_context
*context
,
3381 struct tinst_level
*t0
, location_t loc
)
3383 struct tinst_level
*t
;
3386 location_t prev_loc
= loc
;
3388 for (t
= t0
; t
!= NULL
; t
= t
->next
)
3389 if (prev_loc
!= t
->locus
)
3391 prev_loc
= t
->locus
;
3397 if (template_backtrace_limit
3398 && n_total
> template_backtrace_limit
)
3400 int skip
= n_total
- template_backtrace_limit
;
3401 int head
= template_backtrace_limit
/ 2;
3403 /* Avoid skipping just 1. If so, skip 2. */
3407 head
= (template_backtrace_limit
- 1) / 2;
3410 for (n
= 0; n
< head
; n
++)
3412 gcc_assert (t
!= NULL
);
3413 if (loc
!= t
->locus
)
3414 print_instantiation_partial_context_line (context
, t
, loc
,
3415 /*recursive_p=*/false);
3419 if (t
!= NULL
&& skip
> 0)
3421 expanded_location xloc
;
3422 xloc
= expand_location (loc
);
3423 if (context
->show_column
)
3424 pp_verbatim (context
->printer
,
3425 _("%r%s:%d:%d:%R [ skipping %d instantiation "
3426 "contexts, use -ftemplate-backtrace-limit=0 to "
3428 "locus", xloc
.file
, xloc
.line
, xloc
.column
, skip
);
3430 pp_verbatim (context
->printer
,
3431 _("%r%s:%d:%R [ skipping %d instantiation "
3432 "contexts, use -ftemplate-backtrace-limit=0 to "
3434 "locus", xloc
.file
, xloc
.line
, skip
);
3439 } while (t
!= NULL
&& --skip
> 0);
3445 while (t
->next
!= NULL
&& t
->locus
== t
->next
->locus
)
3450 print_instantiation_partial_context_line (context
, t
, loc
,
3455 print_instantiation_partial_context_line (context
, NULL
, loc
,
3456 /*recursive_p=*/false);
3457 pp_newline (context
->printer
);
3460 /* Called from cp_thing to print the template context for an error. */
3462 maybe_print_instantiation_context (diagnostic_context
*context
)
3464 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3467 record_last_problematic_instantiation ();
3468 print_instantiation_full_context (context
);
3471 /* Report what constexpr call(s) we're trying to expand, if any. */
3474 maybe_print_constexpr_context (diagnostic_context
*context
)
3476 vec
<tree
> call_stack
= cx_error_context ();
3480 FOR_EACH_VEC_ELT (call_stack
, ix
, t
)
3482 expanded_location xloc
= expand_location (EXPR_LOCATION (t
));
3483 const char *s
= expr_as_string (t
, 0);
3484 if (context
->show_column
)
3485 pp_verbatim (context
->printer
,
3486 _("%r%s:%d:%d:%R in constexpr expansion of %qs"),
3487 "locus", xloc
.file
, xloc
.line
, xloc
.column
, s
);
3489 pp_verbatim (context
->printer
,
3490 _("%r%s:%d:%R in constexpr expansion of %qs"),
3491 "locus", xloc
.file
, xloc
.line
, s
);
3492 pp_newline (context
->printer
);
3496 /* Called from output_format -- during diagnostic message processing --
3497 to handle C++ specific format specifier with the following meanings:
3498 %A function argument-list.
3502 %F function declaration.
3503 %L language as used in extern "lang".
3505 %P function parameter whose position is indicated by an integer.
3506 %Q assignment operator.
3507 %S substitution (template + args)
3510 %X exception-specification. */
3512 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
3513 int precision
, bool wide
, bool set_locus
, bool verbose
)
3517 #define next_tree (t = va_arg (*text->args_ptr, tree))
3518 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3519 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3520 #define next_int va_arg (*text->args_ptr, int)
3522 if (precision
!= 0 || wide
)
3527 case 'A': result
= args_to_string (next_tree
, verbose
); break;
3528 case 'C': result
= code_to_string (next_tcode
); break;
3531 tree temp
= next_tree
;
3533 && DECL_HAS_DEBUG_EXPR_P (temp
))
3535 temp
= DECL_DEBUG_EXPR (temp
);
3538 result
= expr_to_string (temp
);
3542 result
= decl_to_string (temp
, verbose
);
3545 case 'E': result
= expr_to_string (next_tree
); break;
3546 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
3547 case 'L': result
= language_to_string (next_lang
); break;
3548 case 'O': result
= op_to_string (next_tcode
); break;
3549 case 'P': result
= parm_to_string (next_int
); break;
3550 case 'Q': result
= assop_to_string (next_tcode
); break;
3551 case 'S': result
= subst_to_string (next_tree
); break;
3552 case 'T': result
= type_to_string (next_tree
, verbose
); break;
3553 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
3554 case 'X': result
= eh_spec_to_string (next_tree
, verbose
); break;
3557 percent_K_format (text
);
3564 pp_string (pp
, result
);
3565 if (set_locus
&& t
!= NULL
)
3566 text
->set_location (0, location_of (t
));
3574 /* Warn about the use of C++0x features when appropriate. */
3576 maybe_warn_cpp0x (cpp0x_warn_str str
)
3578 if ((cxx_dialect
== cxx98
) && !in_system_header_at (input_location
))
3579 /* We really want to suppress this warning in system headers,
3580 because libstdc++ uses variadic templates even when we aren't
3584 case CPP0X_INITIALIZER_LISTS
:
3585 pedwarn (input_location
, 0,
3586 "extended initializer lists "
3587 "only available with -std=c++11 or -std=gnu++11");
3589 case CPP0X_EXPLICIT_CONVERSION
:
3590 pedwarn (input_location
, 0,
3591 "explicit conversion operators "
3592 "only available with -std=c++11 or -std=gnu++11");
3594 case CPP0X_VARIADIC_TEMPLATES
:
3595 pedwarn (input_location
, 0,
3596 "variadic templates "
3597 "only available with -std=c++11 or -std=gnu++11");
3599 case CPP0X_LAMBDA_EXPR
:
3600 pedwarn (input_location
, 0,
3601 "lambda expressions "
3602 "only available with -std=c++11 or -std=gnu++11");
3605 pedwarn (input_location
, 0,
3606 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3608 case CPP0X_SCOPED_ENUMS
:
3609 pedwarn (input_location
, 0,
3610 "scoped enums only available with -std=c++11 or -std=gnu++11");
3612 case CPP0X_DEFAULTED_DELETED
:
3613 pedwarn (input_location
, 0,
3614 "defaulted and deleted functions "
3615 "only available with -std=c++11 or -std=gnu++11");
3617 case CPP0X_INLINE_NAMESPACES
:
3618 pedwarn (input_location
, OPT_Wpedantic
,
3619 "inline namespaces "
3620 "only available with -std=c++11 or -std=gnu++11");
3622 case CPP0X_OVERRIDE_CONTROLS
:
3623 pedwarn (input_location
, 0,
3624 "override controls (override/final) "
3625 "only available with -std=c++11 or -std=gnu++11");
3628 pedwarn (input_location
, 0,
3629 "non-static data member initializers "
3630 "only available with -std=c++11 or -std=gnu++11");
3632 case CPP0X_USER_DEFINED_LITERALS
:
3633 pedwarn (input_location
, 0,
3634 "user-defined literals "
3635 "only available with -std=c++11 or -std=gnu++11");
3637 case CPP0X_DELEGATING_CTORS
:
3638 pedwarn (input_location
, 0,
3639 "delegating constructors "
3640 "only available with -std=c++11 or -std=gnu++11");
3642 case CPP0X_INHERITING_CTORS
:
3643 pedwarn (input_location
, 0,
3644 "inheriting constructors "
3645 "only available with -std=c++11 or -std=gnu++11");
3647 case CPP0X_ATTRIBUTES
:
3648 pedwarn (input_location
, 0,
3650 "only available with -std=c++11 or -std=gnu++11");
3652 case CPP0X_REF_QUALIFIER
:
3653 pedwarn (input_location
, 0,
3655 "only available with -std=c++11 or -std=gnu++11");
3662 /* Warn about the use of variadic templates when appropriate. */
3664 maybe_warn_variadic_templates (void)
3666 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES
);
3670 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3671 option OPT with text GMSGID. Use this function to report
3672 diagnostics for constructs that are invalid C++98, but valid
3675 pedwarn_cxx98 (location_t location
, int opt
, const char *gmsgid
, ...)
3677 diagnostic_info diagnostic
;
3681 va_start (ap
, gmsgid
);
3682 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
3683 (cxx_dialect
== cxx98
) ? DK_PEDWARN
: DK_WARNING
);
3684 diagnostic
.option_index
= opt
;
3685 ret
= report_diagnostic (&diagnostic
);
3690 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3691 we found when we tried to do the lookup. LOCATION is the location of
3692 the NAME identifier. */
3695 qualified_name_lookup_error (tree scope
, tree name
,
3696 tree decl
, location_t location
)
3698 if (scope
== error_mark_node
)
3699 ; /* We already complained. */
3700 else if (TYPE_P (scope
))
3702 if (!COMPLETE_TYPE_P (scope
))
3703 error_at (location
, "incomplete type %qT used in nested name specifier",
3705 else if (TREE_CODE (decl
) == TREE_LIST
)
3707 error_at (location
, "reference to %<%T::%D%> is ambiguous",
3709 print_candidates (decl
);
3712 error_at (location
, "%qD is not a member of %qT", name
, scope
);
3714 else if (scope
!= global_namespace
)
3716 error_at (location
, "%qD is not a member of %qD", name
, scope
);
3717 suggest_alternatives_for (location
, name
);
3721 error_at (location
, "%<::%D%> has not been declared", name
);
3722 suggest_alternatives_for (location
, name
);