1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
25 #include "stringpool.h"
28 #include "diagnostic.h"
29 #include "tree-diagnostic.h"
30 #include "langhooks-def.h"
32 #include "cxx-pretty-print.h"
33 #include "tree-pretty-print.h"
34 #include "pointer-set.h"
35 #include "c-family/c-objc.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 /* The global buffer where we dump everything. It is there only for
44 transitional purpose. It is expected, in the near future, to be
45 completely removed. */
46 static cxx_pretty_printer scratch_pretty_printer
;
47 #define cxx_pp (&scratch_pretty_printer)
49 /* Translate if being used for diagnostics, but not for dump files or
51 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
53 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
55 static const char *args_to_string (tree
, int);
56 static const char *assop_to_string (enum tree_code
);
57 static const char *code_to_string (enum tree_code
);
58 static const char *cv_to_string (tree
, int);
59 static const char *decl_to_string (tree
, int);
60 static const char *expr_to_string (tree
);
61 static const char *fndecl_to_string (tree
, int);
62 static const char *op_to_string (enum tree_code
);
63 static const char *parm_to_string (int);
64 static const char *parms_to_string (tree
);
65 static const char *type_to_string (tree
, int);
67 static void dump_alias_template_specialization (cxx_pretty_printer
*, tree
, int);
68 static void dump_type (cxx_pretty_printer
*, tree
, int);
69 static void dump_typename (cxx_pretty_printer
*, tree
, int);
70 static void dump_simple_decl (cxx_pretty_printer
*, tree
, tree
, int);
71 static void dump_decl (cxx_pretty_printer
*, tree
, int);
72 static void dump_template_decl (cxx_pretty_printer
*, tree
, int);
73 static void dump_function_decl (cxx_pretty_printer
*, tree
, int);
74 static void dump_expr (cxx_pretty_printer
*, tree
, int);
75 static void dump_unary_op (cxx_pretty_printer
*, const char *, tree
, int);
76 static void dump_binary_op (cxx_pretty_printer
*, const char *, tree
, int);
77 static void dump_aggr_type (cxx_pretty_printer
*, tree
, int);
78 static void dump_type_prefix (cxx_pretty_printer
*, tree
, int);
79 static void dump_type_suffix (cxx_pretty_printer
*, tree
, int);
80 static void dump_function_name (cxx_pretty_printer
*, tree
, int);
81 static void dump_call_expr_args (cxx_pretty_printer
*, tree
, int, bool);
82 static void dump_aggr_init_expr_args (cxx_pretty_printer
*, tree
, int, bool);
83 static void dump_expr_list (cxx_pretty_printer
*, tree
, int);
84 static void dump_global_iord (cxx_pretty_printer
*, tree
);
85 static void dump_parameters (cxx_pretty_printer
*, tree
, int);
86 static void dump_ref_qualifier (cxx_pretty_printer
*, tree
, int);
87 static void dump_exception_spec (cxx_pretty_printer
*, tree
, int);
88 static void dump_template_argument (cxx_pretty_printer
*, tree
, int);
89 static void dump_template_argument_list (cxx_pretty_printer
*, tree
, int);
90 static void dump_template_parameter (cxx_pretty_printer
*, tree
, int);
91 static void dump_template_bindings (cxx_pretty_printer
*, tree
, tree
,
93 static void dump_scope (cxx_pretty_printer
*, tree
, int);
94 static void dump_template_parms (cxx_pretty_printer
*, tree
, int, int);
95 static int get_non_default_template_args_count (tree
, int);
96 static const char *function_category (tree
);
97 static void maybe_print_constexpr_context (diagnostic_context
*);
98 static void maybe_print_instantiation_context (diagnostic_context
*);
99 static void print_instantiation_full_context (diagnostic_context
*);
100 static void print_instantiation_partial_context (diagnostic_context
*,
101 struct tinst_level
*,
103 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
104 static void cp_diagnostic_finalizer (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);
113 diagnostic_starter (global_dc
) = cp_diagnostic_starter
;
114 diagnostic_finalizer (global_dc
) = cp_diagnostic_finalizer
;
115 diagnostic_format_decoder (global_dc
) = cp_printer
;
117 new (cxx_pp
) cxx_pretty_printer ();
120 /* Dump a scope, if deemed necessary. */
123 dump_scope (cxx_pretty_printer
*pp
, tree scope
, int flags
)
125 int f
= flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
);
127 if (scope
== NULL_TREE
)
130 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
132 if (scope
!= global_namespace
)
134 dump_decl (pp
, scope
, f
);
135 pp_cxx_colon_colon (pp
);
138 else if (AGGREGATE_TYPE_P (scope
))
140 dump_type (pp
, scope
, f
);
141 pp_cxx_colon_colon (pp
);
143 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
145 dump_function_decl (pp
, scope
, f
);
146 pp_cxx_colon_colon (pp
);
150 /* Dump the template ARGument under control of FLAGS. */
153 dump_template_argument (cxx_pretty_printer
*pp
, tree arg
, int flags
)
155 if (ARGUMENT_PACK_P (arg
))
156 dump_template_argument_list (pp
, ARGUMENT_PACK_ARGS (arg
),
157 /* No default args in argument packs. */
158 flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
159 else if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
160 dump_type (pp
, arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
163 if (TREE_CODE (arg
) == TREE_LIST
)
164 arg
= TREE_VALUE (arg
);
166 dump_expr (pp
, arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
170 /* Count the number of template arguments ARGS whose value does not
171 match the (optional) default template parameter in PARAMS */
174 get_non_default_template_args_count (tree args
, int flags
)
176 int n
= TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args
));
178 if (/* We use this flag when generating debug information. We don't
179 want to expand templates at this point, for this may generate
180 new decls, which gets decl counts out of sync, which may in
181 turn cause codegen differences between compilations with and
183 (flags
& TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
) != 0
184 || !flag_pretty_templates
)
187 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args
));
190 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
194 dump_template_argument_list (cxx_pretty_printer
*pp
, tree args
, int flags
)
196 int n
= get_non_default_template_args_count (args
, flags
);
200 for (i
= 0; i
< n
; ++i
)
202 tree arg
= TREE_VEC_ELT (args
, i
);
204 /* Only print a comma if we know there is an argument coming. In
205 the case of an empty template argument pack, no actual
206 argument will be printed. */
208 && (!ARGUMENT_PACK_P (arg
)
209 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
210 pp_separate_with_comma (pp
);
212 dump_template_argument (pp
, arg
, flags
);
217 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
220 dump_template_parameter (cxx_pretty_printer
*pp
, tree parm
, int flags
)
225 if (parm
== error_mark_node
)
228 p
= TREE_VALUE (parm
);
229 a
= TREE_PURPOSE (parm
);
231 if (TREE_CODE (p
) == TYPE_DECL
)
233 if (flags
& TFF_DECL_SPECIFIERS
)
235 pp_cxx_ws_string (pp
, "class");
236 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p
)))
237 pp_cxx_ws_string (pp
, "...");
239 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
241 else if (DECL_NAME (p
))
242 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
244 pp_cxx_canonical_template_parameter (pp
, TREE_TYPE (p
));
247 dump_decl (pp
, p
, flags
| TFF_DECL_SPECIFIERS
);
249 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
251 pp_cxx_whitespace (pp
);
253 pp_cxx_whitespace (pp
);
254 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
255 dump_type (pp
, a
, flags
& ~TFF_CHASE_TYPEDEF
);
257 dump_expr (pp
, a
, flags
| TFF_EXPR_IN_PARENS
);
261 /* Dump, under control of FLAGS, a template-parameter-list binding.
262 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
266 dump_template_bindings (cxx_pretty_printer
*pp
, tree parms
, tree args
,
267 vec
<tree
, va_gc
> *typenames
)
269 bool need_semicolon
= false;
275 tree p
= TREE_VALUE (parms
);
276 int lvl
= TMPL_PARMS_DEPTH (parms
);
279 tree lvl_args
= NULL_TREE
;
281 /* Don't crash if we had an invalid argument list. */
282 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
283 lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
285 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
287 tree arg
= NULL_TREE
;
289 /* Don't crash if we had an invalid argument list. */
290 if (lvl_args
&& NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
291 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
294 pp_separate_with_semicolon (pp
);
295 dump_template_parameter (pp
, TREE_VEC_ELT (p
, i
),
296 TFF_PLAIN_IDENTIFIER
);
297 pp_cxx_whitespace (pp
);
299 pp_cxx_whitespace (pp
);
302 if (ARGUMENT_PACK_P (arg
))
303 pp_cxx_left_brace (pp
);
304 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
305 if (ARGUMENT_PACK_P (arg
))
306 pp_cxx_right_brace (pp
);
309 pp_string (pp
, M_("<missing>"));
312 need_semicolon
= true;
315 parms
= TREE_CHAIN (parms
);
318 /* Don't bother with typenames for a partial instantiation. */
319 if (vec_safe_is_empty (typenames
) || uses_template_parms (args
))
322 FOR_EACH_VEC_SAFE_ELT (typenames
, i
, t
)
325 pp_separate_with_semicolon (pp
);
326 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
327 pp_cxx_whitespace (pp
);
329 pp_cxx_whitespace (pp
);
330 push_deferring_access_checks (dk_no_check
);
331 t
= tsubst (t
, args
, tf_none
, NULL_TREE
);
332 pop_deferring_access_checks ();
333 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
334 pp_simple_type_specifier doesn't know about it. */
335 t
= strip_typedefs (t
);
336 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
340 /* Dump a human-readable equivalent of the alias template
341 specialization of T. */
344 dump_alias_template_specialization (cxx_pretty_printer
*pp
, tree t
, int flags
)
348 gcc_assert (alias_template_specialization_p (t
));
350 if (!(flags
& TFF_UNQUALIFIED_NAME
))
351 dump_scope (pp
, CP_DECL_CONTEXT (TYPE_NAME (t
)), flags
);
352 name
= TYPE_IDENTIFIER (t
);
353 pp_cxx_tree_identifier (pp
, name
);
354 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
356 flags
& ~TFF_TEMPLATE_HEADER
);
359 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
363 dump_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
368 /* Don't print e.g. "struct mytypedef". */
369 if (TYPE_P (t
) && typedef_variant_p (t
))
371 tree decl
= TYPE_NAME (t
);
372 if ((flags
& TFF_CHASE_TYPEDEF
)
373 || DECL_SELF_REFERENCE_P (decl
)
374 || (!flag_pretty_templates
375 && DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)))
376 t
= strip_typedefs (t
);
377 else if (alias_template_specialization_p (t
))
379 dump_alias_template_specialization (pp
, t
, flags
);
382 else if (same_type_p (t
, TREE_TYPE (decl
)))
386 pp_cxx_cv_qualifier_seq (pp
, t
);
387 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
392 if (TYPE_PTRMEMFUNC_P (t
))
395 switch (TREE_CODE (t
))
398 if (t
== init_list_type_node
)
399 pp_string (pp
, M_("<brace-enclosed initializer list>"));
400 else if (t
== unknown_type_node
)
401 pp_string (pp
, M_("<unresolved overloaded function type>"));
404 pp_cxx_cv_qualifier_seq (pp
, t
);
405 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
410 /* A list of function parms. */
411 dump_parameters (pp
, t
, flags
);
414 case IDENTIFIER_NODE
:
415 pp_cxx_tree_identifier (pp
, t
);
419 dump_type (pp
, BINFO_TYPE (t
), flags
);
425 dump_aggr_type (pp
, t
, flags
);
429 if (flags
& TFF_CHASE_TYPEDEF
)
431 dump_type (pp
, DECL_ORIGINAL_TYPE (t
)
432 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
435 /* Else fall through. */
439 dump_decl (pp
, t
, flags
& ~TFF_DECL_SPECIFIERS
);
448 case FIXED_POINT_TYPE
:
449 pp_type_specifier_seq (pp
, t
);
452 case TEMPLATE_TEMPLATE_PARM
:
453 /* For parameters inside template signature. */
454 if (TYPE_IDENTIFIER (t
))
455 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
457 pp_cxx_canonical_template_parameter (pp
, t
);
460 case BOUND_TEMPLATE_TEMPLATE_PARM
:
462 tree args
= TYPE_TI_ARGS (t
);
463 pp_cxx_cv_qualifier_seq (pp
, t
);
464 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
465 pp_cxx_begin_template_argument_list (pp
);
466 dump_template_argument_list (pp
, args
, flags
);
467 pp_cxx_end_template_argument_list (pp
);
471 case TEMPLATE_TYPE_PARM
:
472 pp_cxx_cv_qualifier_seq (pp
, t
);
473 if (TYPE_IDENTIFIER (t
))
474 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
476 pp_cxx_canonical_template_parameter
477 (pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
480 /* This is not always necessary for pointers and such, but doing this
481 reduces code size. */
490 dump_type_prefix (pp
, t
, flags
);
491 dump_type_suffix (pp
, t
, flags
);
495 if (! (flags
& TFF_CHASE_TYPEDEF
)
496 && DECL_ORIGINAL_TYPE (TYPE_NAME (t
)))
498 dump_decl (pp
, TYPE_NAME (t
), TFF_PLAIN_IDENTIFIER
);
501 pp_cxx_cv_qualifier_seq (pp
, t
);
502 pp_cxx_ws_string (pp
,
503 TYPENAME_IS_ENUM_P (t
) ? "enum"
504 : TYPENAME_IS_CLASS_P (t
) ? "class"
506 dump_typename (pp
, t
, flags
);
509 case UNBOUND_CLASS_TEMPLATE
:
510 if (! (flags
& TFF_UNQUALIFIED_NAME
))
512 dump_type (pp
, TYPE_CONTEXT (t
), flags
);
513 pp_cxx_colon_colon (pp
);
515 pp_cxx_ws_string (pp
, "template");
516 dump_type (pp
, TYPE_IDENTIFIER (t
), flags
);
520 pp_cxx_ws_string (pp
, "__typeof__");
521 pp_cxx_whitespace (pp
);
522 pp_cxx_left_paren (pp
);
523 dump_expr (pp
, TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
524 pp_cxx_right_paren (pp
);
527 case UNDERLYING_TYPE
:
528 pp_cxx_ws_string (pp
, "__underlying_type");
529 pp_cxx_whitespace (pp
);
530 pp_cxx_left_paren (pp
);
531 dump_expr (pp
, UNDERLYING_TYPE_TYPE (t
), flags
& ~TFF_EXPR_IN_PARENS
);
532 pp_cxx_right_paren (pp
);
535 case TYPE_PACK_EXPANSION
:
536 dump_type (pp
, PACK_EXPANSION_PATTERN (t
), flags
);
537 pp_cxx_ws_string (pp
, "...");
540 case TYPE_ARGUMENT_PACK
:
541 dump_template_argument (pp
, t
, flags
);
545 pp_cxx_ws_string (pp
, "decltype");
546 pp_cxx_whitespace (pp
);
547 pp_cxx_left_paren (pp
);
548 dump_expr (pp
, DECLTYPE_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
549 pp_cxx_right_paren (pp
);
553 pp_string (pp
, "std::nullptr_t");
557 pp_unsupported_tree (pp
, t
);
558 /* Fall through to error. */
561 pp_string (pp
, M_("<type error>"));
566 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
570 dump_typename (cxx_pretty_printer
*pp
, tree t
, int flags
)
572 tree ctx
= TYPE_CONTEXT (t
);
574 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
575 dump_typename (pp
, ctx
, flags
);
577 dump_type (pp
, ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
578 pp_cxx_colon_colon (pp
);
579 dump_decl (pp
, TYPENAME_TYPE_FULLNAME (t
), flags
);
582 /* Return the name of the supplied aggregate, or enumeral type. */
585 class_key_or_enum_as_string (tree t
)
587 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
589 if (SCOPED_ENUM_P (t
))
594 else if (TREE_CODE (t
) == UNION_TYPE
)
596 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
602 /* Print out a class declaration T under the control of FLAGS,
603 in the form `class foo'. */
606 dump_aggr_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
609 const char *variety
= class_key_or_enum_as_string (t
);
613 pp_cxx_cv_qualifier_seq (pp
, t
);
615 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
616 pp_cxx_ws_string (pp
, variety
);
618 name
= TYPE_NAME (t
);
622 typdef
= (!DECL_ARTIFICIAL (name
)
623 /* An alias specialization is not considered to be a
625 && !alias_template_specialization_p (t
));
628 && ((flags
& TFF_CHASE_TYPEDEF
)
629 || (!flag_pretty_templates
&& DECL_LANG_SPECIFIC (name
)
630 && DECL_TEMPLATE_INFO (name
))))
631 || DECL_SELF_REFERENCE_P (name
))
633 t
= TYPE_MAIN_VARIANT (t
);
634 name
= TYPE_NAME (t
);
638 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
639 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
640 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
641 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
643 if (! (flags
& TFF_UNQUALIFIED_NAME
))
644 dump_scope (pp
, CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
645 flags
&= ~TFF_UNQUALIFIED_NAME
;
648 /* Because the template names are mangled, we have to locate
649 the most general template, and use that name. */
650 tree tpl
= TYPE_TI_TEMPLATE (t
);
652 while (DECL_TEMPLATE_INFO (tpl
))
653 tpl
= DECL_TI_TEMPLATE (tpl
);
656 name
= DECL_NAME (name
);
659 if (name
== 0 || ANON_AGGRNAME_P (name
))
661 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
662 pp_string (pp
, M_("<anonymous>"));
664 pp_printf (pp
, M_("<anonymous %s>"), variety
);
666 else if (LAMBDA_TYPE_P (t
))
668 /* A lambda's "type" is essentially its signature. */
669 pp_string (pp
, M_("<lambda"));
670 if (lambda_function (t
))
672 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t
)),
677 pp_cxx_tree_identifier (pp
, name
);
679 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
680 !CLASSTYPE_USE_TEMPLATE (t
),
681 flags
& ~TFF_TEMPLATE_HEADER
);
684 /* Dump into the obstack the initial part of the output for a given type.
685 This is necessary when dealing with things like functions returning
688 return type of `int (* fee ())()': pointer -> function -> int. Both
689 pointer (and reference and offset) and function (and member) types must
690 deal with prefix and suffix.
692 Arrays must also do this for DECL nodes, like int a[], and for things like
696 dump_type_prefix (cxx_pretty_printer
*pp
, tree t
, int flags
)
698 if (TYPE_PTRMEMFUNC_P (t
))
700 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
704 switch (TREE_CODE (t
))
709 tree sub
= TREE_TYPE (t
);
711 dump_type_prefix (pp
, sub
, flags
);
712 if (TREE_CODE (sub
) == ARRAY_TYPE
713 || TREE_CODE (sub
) == FUNCTION_TYPE
)
715 pp_cxx_whitespace (pp
);
716 pp_cxx_left_paren (pp
);
717 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (sub
));
721 else if (TREE_CODE (t
) == REFERENCE_TYPE
)
723 if (TYPE_REF_IS_RVALUE (t
))
724 pp_ampersand_ampersand (pp
);
728 pp
->padding
= pp_before
;
729 pp_cxx_cv_qualifier_seq (pp
, t
);
735 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
736 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
739 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
740 pp_cxx_left_paren (pp
);
741 dump_type (pp
, TYPE_OFFSET_BASETYPE (t
), flags
);
742 pp_cxx_colon_colon (pp
);
745 pp_cxx_cv_qualifier_seq (pp
, t
);
746 pp
->padding
= pp_before
;
749 /* This can be reached without a pointer when dealing with
750 templates, e.g. std::is_function. */
752 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
756 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
758 pp_cxx_left_paren (pp
);
759 dump_aggr_type (pp
, TYPE_METHOD_BASETYPE (t
), flags
);
760 pp_cxx_colon_colon (pp
);
764 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
768 case IDENTIFIER_NODE
:
773 case TEMPLATE_TYPE_PARM
:
774 case TEMPLATE_TEMPLATE_PARM
:
775 case BOUND_TEMPLATE_TEMPLATE_PARM
:
786 case UNDERLYING_TYPE
:
788 case TYPE_PACK_EXPANSION
:
789 case FIXED_POINT_TYPE
:
791 dump_type (pp
, t
, flags
);
792 pp
->padding
= pp_before
;
796 pp_unsupported_tree (pp
, t
);
799 pp_string (pp
, M_("<typeprefixerror>"));
804 /* Dump the suffix of type T, under control of FLAGS. This is the part
805 which appears after the identifier (or function parms). */
808 dump_type_suffix (cxx_pretty_printer
*pp
, tree t
, int flags
)
810 if (TYPE_PTRMEMFUNC_P (t
))
811 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
813 switch (TREE_CODE (t
))
818 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
819 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
820 pp_cxx_right_paren (pp
);
821 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
828 if (TREE_CODE (t
) == METHOD_TYPE
)
829 /* Can only be reached through a pointer. */
830 pp_cxx_right_paren (pp
);
831 arg
= TYPE_ARG_TYPES (t
);
832 if (TREE_CODE (t
) == METHOD_TYPE
)
833 arg
= TREE_CHAIN (arg
);
835 /* Function pointers don't have default args. Not in standard C++,
836 anyway; they may in g++, but we'll just pretend otherwise. */
837 dump_parameters (pp
, arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
839 pp
->padding
= pp_before
;
840 pp_cxx_cv_qualifiers (pp
, type_memfn_quals (t
));
841 dump_ref_qualifier (pp
, t
, flags
);
842 dump_exception_spec (pp
, TYPE_RAISES_EXCEPTIONS (t
), flags
);
843 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
849 pp_cxx_left_bracket (pp
);
852 tree dtype
= TYPE_DOMAIN (t
);
853 tree max
= TYPE_MAX_VALUE (dtype
);
854 if (integer_all_onesp (max
))
855 pp_character (pp
, '0');
856 else if (tree_fits_shwi_p (max
))
857 pp_wide_integer (pp
, tree_to_shwi (max
) + 1);
861 if (TREE_CODE (max
) == SAVE_EXPR
)
862 max
= TREE_OPERAND (max
, 0);
863 if (TREE_CODE (max
) == MINUS_EXPR
864 || TREE_CODE (max
) == PLUS_EXPR
)
866 max
= TREE_OPERAND (max
, 0);
867 while (CONVERT_EXPR_P (max
))
868 max
= TREE_OPERAND (max
, 0);
871 max
= fold_build2_loc (input_location
,
872 PLUS_EXPR
, dtype
, max
,
873 build_int_cst (dtype
, 1));
874 dump_expr (pp
, max
, flags
& ~TFF_EXPR_IN_PARENS
);
877 pp_cxx_right_bracket (pp
);
878 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
882 case IDENTIFIER_NODE
:
887 case TEMPLATE_TYPE_PARM
:
888 case TEMPLATE_TEMPLATE_PARM
:
889 case BOUND_TEMPLATE_TEMPLATE_PARM
:
900 case UNDERLYING_TYPE
:
902 case TYPE_PACK_EXPANSION
:
903 case FIXED_POINT_TYPE
:
908 pp_unsupported_tree (pp
, t
);
910 /* Don't mark it here, we should have already done in
917 dump_global_iord (cxx_pretty_printer
*pp
, tree t
)
919 const char *p
= NULL
;
921 if (DECL_GLOBAL_CTOR_P (t
))
922 p
= M_("(static initializers for %s)");
923 else if (DECL_GLOBAL_DTOR_P (t
))
924 p
= M_("(static destructors for %s)");
928 pp_printf (pp
, p
, LOCATION_FILE (input_location
));
932 dump_simple_decl (cxx_pretty_printer
*pp
, tree t
, tree type
, int flags
)
934 if (flags
& TFF_DECL_SPECIFIERS
)
937 && DECL_DECLARED_CONSTEXPR_P (t
))
938 pp_cxx_ws_string (pp
, "constexpr");
939 dump_type_prefix (pp
, type
, flags
& ~TFF_UNQUALIFIED_NAME
);
942 if (! (flags
& TFF_UNQUALIFIED_NAME
)
943 && TREE_CODE (t
) != PARM_DECL
944 && (!DECL_INITIAL (t
)
945 || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
))
946 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
947 flags
&= ~TFF_UNQUALIFIED_NAME
;
948 if ((flags
& TFF_DECL_SPECIFIERS
)
949 && DECL_TEMPLATE_PARM_P (t
)
950 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t
)))
951 pp_string (pp
, "...");
954 if (TREE_CODE (t
) == FIELD_DECL
&& DECL_NORMAL_CAPTURE_P (t
))
957 pp_string (pp
, IDENTIFIER_POINTER (DECL_NAME (t
)) + 2);
958 pp_string (pp
, " capture>");
961 dump_decl (pp
, DECL_NAME (t
), flags
);
964 pp_string (pp
, M_("<anonymous>"));
965 if (flags
& TFF_DECL_SPECIFIERS
)
966 dump_type_suffix (pp
, type
, flags
);
969 /* Dump a human readable string for the decl T under control of FLAGS. */
972 dump_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
977 /* If doing Objective-C++, give Objective-C a chance to demangle
978 Objective-C method names. */
979 if (c_dialect_objc ())
981 const char *demangled
= objc_maybe_printable_name (t
, flags
);
984 pp_string (pp
, demangled
);
989 switch (TREE_CODE (t
))
992 /* Don't say 'typedef class A' */
993 if (DECL_ARTIFICIAL (t
) && !DECL_SELF_REFERENCE_P (t
))
995 if ((flags
& TFF_DECL_SPECIFIERS
)
996 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
998 /* Say `class T' not just `T'. */
999 pp_cxx_ws_string (pp
, "class");
1001 /* Emit the `...' for a parameter pack. */
1002 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1003 pp_cxx_ws_string (pp
, "...");
1006 dump_type (pp
, TREE_TYPE (t
), flags
);
1009 if (TYPE_DECL_ALIAS_P (t
)
1010 && (flags
& TFF_DECL_SPECIFIERS
1011 || flags
& TFF_CLASS_KEY_OR_ENUM
))
1013 pp_cxx_ws_string (pp
, "using");
1014 dump_decl (pp
, DECL_NAME (t
), flags
);
1015 pp_cxx_whitespace (pp
);
1016 pp_cxx_ws_string (pp
, "=");
1017 pp_cxx_whitespace (pp
);
1018 dump_type (pp
, DECL_ORIGINAL_TYPE (t
), flags
);
1021 if ((flags
& TFF_DECL_SPECIFIERS
)
1022 && !DECL_SELF_REFERENCE_P (t
))
1023 pp_cxx_ws_string (pp
, "typedef");
1024 dump_simple_decl (pp
, t
, DECL_ORIGINAL_TYPE (t
)
1025 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
1030 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
1032 pp_string (pp
, M_("vtable for "));
1033 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
1034 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1037 /* Else fall through. */
1040 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1044 pp_string (pp
, M_("<return value> "));
1045 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1048 case NAMESPACE_DECL
:
1049 if (flags
& TFF_DECL_SPECIFIERS
)
1050 pp
->declaration (t
);
1053 if (! (flags
& TFF_UNQUALIFIED_NAME
))
1054 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1055 flags
&= ~TFF_UNQUALIFIED_NAME
;
1056 if (DECL_NAME (t
) == NULL_TREE
)
1058 if (!(pp
->flags
& pp_c_flag_gnu_v3
))
1059 pp_cxx_ws_string (pp
, M_("{anonymous}"));
1061 pp_cxx_ws_string (pp
, M_("(anonymous namespace)"));
1064 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1069 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1070 pp_colon_colon (pp
);
1071 dump_decl (pp
, TREE_OPERAND (t
, 1), TFF_UNQUALIFIED_NAME
);
1075 dump_decl (pp
, TREE_OPERAND (t
, 0), flags
);
1076 pp_cxx_left_bracket (pp
);
1077 dump_decl (pp
, TREE_OPERAND (t
, 1), flags
);
1078 pp_cxx_right_bracket (pp
);
1081 case ARRAY_NOTATION_REF
:
1082 dump_decl (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
1083 pp_cxx_left_bracket (pp
);
1084 dump_decl (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
1086 dump_decl (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
1088 dump_decl (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
1089 pp_cxx_right_bracket (pp
);
1092 /* So that we can do dump_decl on an aggr type. */
1096 dump_type (pp
, t
, flags
);
1100 /* This is a pseudo destructor call which has not been folded into
1101 a PSEUDO_DTOR_EXPR yet. */
1102 pp_cxx_complement (pp
);
1103 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1110 /* These special cases are duplicated here so that other functions
1111 can feed identifiers to error and get them demangled properly. */
1112 case IDENTIFIER_NODE
:
1113 if (IDENTIFIER_TYPENAME_P (t
))
1115 pp_cxx_ws_string (pp
, "operator");
1116 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1117 dump_type (pp
, TREE_TYPE (t
), flags
);
1121 pp_cxx_tree_identifier (pp
, t
);
1127 t
= OVL_CURRENT (t
);
1128 if (DECL_CLASS_SCOPE_P (t
))
1130 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1131 pp_cxx_colon_colon (pp
);
1133 else if (!DECL_FILE_SCOPE_P (t
))
1135 dump_decl (pp
, DECL_CONTEXT (t
), flags
);
1136 pp_cxx_colon_colon (pp
);
1138 dump_decl (pp
, DECL_NAME (t
), flags
);
1142 /* If there's only one function, just treat it like an ordinary
1144 t
= OVL_CURRENT (t
);
1148 if (! DECL_LANG_SPECIFIC (t
))
1150 if (DECL_ABSTRACT_ORIGIN (t
))
1151 dump_decl (pp
, DECL_ABSTRACT_ORIGIN (t
), flags
);
1153 pp_string (pp
, M_("<built-in>"));
1155 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
1156 dump_global_iord (pp
, t
);
1158 dump_function_decl (pp
, t
, flags
);
1162 dump_template_decl (pp
, t
, flags
);
1165 case TEMPLATE_ID_EXPR
:
1167 tree name
= TREE_OPERAND (t
, 0);
1168 tree args
= TREE_OPERAND (t
, 1);
1170 if (is_overloaded_fn (name
))
1171 name
= DECL_NAME (get_first_fn (name
));
1172 dump_decl (pp
, name
, flags
);
1173 pp_cxx_begin_template_argument_list (pp
);
1174 if (args
== error_mark_node
)
1175 pp_string (pp
, M_("<template arguments error>"));
1177 dump_template_argument_list (pp
, args
, flags
);
1178 pp_cxx_end_template_argument_list (pp
);
1183 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1187 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
1188 || (DECL_INITIAL (t
) &&
1189 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
1190 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1191 else if (DECL_NAME (t
))
1192 dump_decl (pp
, DECL_NAME (t
), flags
);
1193 else if (DECL_INITIAL (t
))
1194 dump_expr (pp
, DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
1196 pp_string (pp
, M_("<enumerator>"));
1200 pp_cxx_ws_string (pp
, "using");
1201 dump_type (pp
, USING_DECL_SCOPE (t
), flags
);
1202 pp_cxx_colon_colon (pp
);
1203 dump_decl (pp
, DECL_NAME (t
), flags
);
1207 pp
->declaration (t
);
1211 dump_decl (pp
, BASELINK_FUNCTIONS (t
), flags
);
1214 case NON_DEPENDENT_EXPR
:
1215 dump_expr (pp
, t
, flags
);
1218 case TEMPLATE_TYPE_PARM
:
1219 if (flags
& TFF_DECL_SPECIFIERS
)
1220 pp
->declaration (t
);
1225 case UNBOUND_CLASS_TEMPLATE
:
1226 case TYPE_PACK_EXPANSION
:
1228 dump_type (pp
, t
, flags
);
1232 pp_unsupported_tree (pp
, t
);
1233 /* Fall through to error. */
1236 pp_string (pp
, M_("<declaration error>"));
1241 /* Dump a template declaration T under control of FLAGS. This means the
1242 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1245 dump_template_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1247 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1251 if (flags
& TFF_TEMPLATE_HEADER
)
1253 for (parms
= orig_parms
= nreverse (orig_parms
);
1255 parms
= TREE_CHAIN (parms
))
1257 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1258 int len
= TREE_VEC_LENGTH (inner_parms
);
1260 pp_cxx_ws_string (pp
, "template");
1261 pp_cxx_begin_template_argument_list (pp
);
1263 /* If we've shown the template prefix, we'd better show the
1264 parameters' and decl's type too. */
1265 flags
|= TFF_DECL_SPECIFIERS
;
1267 for (i
= 0; i
< len
; i
++)
1270 pp_separate_with_comma (pp
);
1271 dump_template_parameter (pp
, TREE_VEC_ELT (inner_parms
, i
),
1274 pp_cxx_end_template_argument_list (pp
);
1275 pp_cxx_whitespace (pp
);
1277 nreverse(orig_parms
);
1279 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1281 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1282 pp_cxx_ws_string (pp
, "class");
1284 /* If this is a parameter pack, print the ellipsis. */
1285 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1286 pp_cxx_ws_string (pp
, "...");
1290 if (DECL_CLASS_TEMPLATE_P (t
))
1291 dump_type (pp
, TREE_TYPE (t
),
1292 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1293 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1294 else if (DECL_TEMPLATE_RESULT (t
)
1295 && (VAR_P (DECL_TEMPLATE_RESULT (t
))
1296 /* Alias template. */
1297 || DECL_TYPE_TEMPLATE_P (t
)))
1298 dump_decl (pp
, DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1301 gcc_assert (TREE_TYPE (t
));
1302 switch (NEXT_CODE (t
))
1306 dump_function_decl (pp
, t
, flags
| TFF_TEMPLATE_NAME
);
1309 /* This case can occur with some invalid code. */
1310 dump_type (pp
, TREE_TYPE (t
),
1311 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1312 | (flags
& TFF_DECL_SPECIFIERS
1313 ? TFF_CLASS_KEY_OR_ENUM
: 0));
1318 /* find_typenames looks through the type of the function template T
1319 and returns a vec containing any typedefs, decltypes or TYPENAME_TYPEs
1322 struct find_typenames_t
1324 struct pointer_set_t
*p_set
;
1325 vec
<tree
, va_gc
> *typenames
;
1329 find_typenames_r (tree
*tp
, int *walk_subtrees
, void *data
)
1331 struct find_typenames_t
*d
= (struct find_typenames_t
*)data
;
1332 tree mv
= NULL_TREE
;
1334 if (TYPE_P (*tp
) && is_typedef_decl (TYPE_NAME (*tp
)))
1335 /* Add the type of the typedef without any additional cv-quals. */
1336 mv
= TREE_TYPE (TYPE_NAME (*tp
));
1337 else if (TREE_CODE (*tp
) == TYPENAME_TYPE
1338 || TREE_CODE (*tp
) == DECLTYPE_TYPE
)
1339 /* Add the typename without any cv-qualifiers. */
1340 mv
= TYPE_MAIN_VARIANT (*tp
);
1342 if (TREE_CODE (*tp
) == TYPE_PACK_EXPANSION
)
1344 /* Don't mess with parameter packs since we don't remember
1345 the pack expansion context for a particular typename. */
1346 *walk_subtrees
= false;
1350 if (mv
&& (mv
== *tp
|| !pointer_set_insert (d
->p_set
, mv
)))
1351 vec_safe_push (d
->typenames
, mv
);
1353 /* Search into class template arguments, which cp_walk_subtrees
1355 if (CLASS_TYPE_P (*tp
) && CLASSTYPE_TEMPLATE_INFO (*tp
))
1356 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp
), find_typenames_r
,
1362 static vec
<tree
, va_gc
> *
1363 find_typenames (tree t
)
1365 struct find_typenames_t ft
;
1366 ft
.p_set
= pointer_set_create ();
1367 ft
.typenames
= NULL
;
1368 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t
)),
1369 find_typenames_r
, &ft
, ft
.p_set
);
1370 pointer_set_destroy (ft
.p_set
);
1371 return ft
.typenames
;
1374 /* Output the "[with ...]" clause for a template instantiation T iff
1375 TEMPLATE_PARMS, TEMPLATE_ARGS and FLAGS are suitable. T may be NULL if
1376 formatting a deduction/substitution diagnostic rather than an
1380 dump_substitution (cxx_pretty_printer
*pp
,
1381 tree t
, tree template_parms
, tree template_args
,
1384 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
1385 && !(flags
& TFF_NO_TEMPLATE_BINDINGS
))
1387 vec
<tree
, va_gc
> *typenames
= t
? find_typenames (t
) : NULL
;
1388 pp_cxx_whitespace (pp
);
1389 pp_cxx_left_bracket (pp
);
1390 pp
->translate_string ("with");
1391 pp_cxx_whitespace (pp
);
1392 dump_template_bindings (pp
, template_parms
, template_args
, typenames
);
1393 pp_cxx_right_bracket (pp
);
1397 /* Dump the lambda function FN including its 'mutable' qualifier and any
1398 template bindings. */
1401 dump_lambda_function (cxx_pretty_printer
*pp
,
1402 tree fn
, tree template_parms
, tree template_args
,
1405 /* A lambda's signature is essentially its "type". */
1406 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1407 if (!(TYPE_QUALS (class_of_this_parm (TREE_TYPE (fn
))) & TYPE_QUAL_CONST
))
1409 pp
->padding
= pp_before
;
1410 pp_c_ws_string (pp
, "mutable");
1412 dump_substitution (pp
, fn
, template_parms
, template_args
, flags
);
1415 /* Pretty print a function decl. There are several ways we want to print a
1416 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1417 As error can only apply the '#' flag once to give 0 and 1 for V, there
1418 is %D which doesn't print the throw specs, and %F which does. */
1421 dump_function_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1425 tree cname
= NULL_TREE
;
1426 tree template_args
= NULL_TREE
;
1427 tree template_parms
= NULL_TREE
;
1428 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1429 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1432 flags
&= ~(TFF_UNQUALIFIED_NAME
| TFF_TEMPLATE_NAME
);
1433 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1434 t
= DECL_TEMPLATE_RESULT (t
);
1436 /* Save the exceptions, in case t is a specialization and we are
1437 emitting an error about incompatible specifications. */
1438 exceptions
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t
));
1440 /* Pretty print template instantiations only. */
1441 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
)
1442 && flag_pretty_templates
)
1446 template_args
= DECL_TI_ARGS (t
);
1447 tmpl
= most_general_template (t
);
1448 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1450 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1455 if (DECL_NAME (t
) && LAMBDA_FUNCTION_P (t
))
1456 return dump_lambda_function (pp
, t
, template_parms
, template_args
, flags
);
1458 fntype
= TREE_TYPE (t
);
1459 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1461 if (DECL_CLASS_SCOPE_P (t
))
1462 cname
= DECL_CONTEXT (t
);
1463 /* This is for partially instantiated template methods. */
1464 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1465 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1467 if (flags
& TFF_DECL_SPECIFIERS
)
1469 if (DECL_STATIC_FUNCTION_P (t
))
1470 pp_cxx_ws_string (pp
, "static");
1471 else if (DECL_VIRTUAL_P (t
))
1472 pp_cxx_ws_string (pp
, "virtual");
1474 if (DECL_DECLARED_CONSTEXPR_P (t
))
1475 pp_cxx_ws_string (pp
, "constexpr");
1478 /* Print the return type? */
1480 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1481 && !DECL_DESTRUCTOR_P (t
);
1484 tree ret
= fndecl_declared_return_type (t
);
1485 dump_type_prefix (pp
, ret
, flags
);
1488 /* Print the function name. */
1489 if (!do_outer_scope
)
1493 dump_type (pp
, cname
, flags
);
1494 pp_cxx_colon_colon (pp
);
1497 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1499 dump_function_name (pp
, t
, flags
);
1501 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1503 dump_parameters (pp
, parmtypes
, flags
);
1505 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1507 pp
->padding
= pp_before
;
1508 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (fntype
));
1509 dump_ref_qualifier (pp
, fntype
, flags
);
1512 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1514 pp
->padding
= pp_before
;
1515 dump_exception_spec (pp
, exceptions
, flags
);
1519 dump_type_suffix (pp
, TREE_TYPE (fntype
), flags
);
1521 dump_substitution (pp
, t
, template_parms
, template_args
, flags
);
1523 else if (template_args
)
1525 bool need_comma
= false;
1527 pp_cxx_begin_template_argument_list (pp
);
1528 template_args
= INNERMOST_TEMPLATE_ARGS (template_args
);
1529 for (i
= 0; i
< TREE_VEC_LENGTH (template_args
); ++i
)
1531 tree arg
= TREE_VEC_ELT (template_args
, i
);
1533 pp_separate_with_comma (pp
);
1534 if (ARGUMENT_PACK_P (arg
))
1535 pp_cxx_left_brace (pp
);
1536 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
1537 if (ARGUMENT_PACK_P (arg
))
1538 pp_cxx_right_brace (pp
);
1541 pp_cxx_end_template_argument_list (pp
);
1545 /* Print a parameter list. If this is for a member function, the
1546 member object ptr (and any other hidden args) should have
1547 already been removed. */
1550 dump_parameters (cxx_pretty_printer
*pp
, tree parmtypes
, int flags
)
1553 flags
&= ~TFF_SCOPE
;
1554 pp_cxx_left_paren (pp
);
1556 for (first
= 1; parmtypes
!= void_list_node
;
1557 parmtypes
= TREE_CHAIN (parmtypes
))
1560 pp_separate_with_comma (pp
);
1564 pp_cxx_ws_string (pp
, "...");
1568 dump_type (pp
, TREE_VALUE (parmtypes
), flags
);
1570 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1572 pp_cxx_whitespace (pp
);
1574 pp_cxx_whitespace (pp
);
1575 dump_expr (pp
, TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1579 pp_cxx_right_paren (pp
);
1582 /* Print ref-qualifier of a FUNCTION_TYPE or METHOD_TYPE. FLAGS are ignored. */
1585 dump_ref_qualifier (cxx_pretty_printer
*pp
, tree t
, int flags ATTRIBUTE_UNUSED
)
1587 if (FUNCTION_REF_QUALIFIED (t
))
1589 pp
->padding
= pp_before
;
1590 if (FUNCTION_RVALUE_QUALIFIED (t
))
1591 pp_cxx_ws_string (pp
, "&&");
1593 pp_cxx_ws_string (pp
, "&");
1597 /* Print an exception specification. T is the exception specification. */
1600 dump_exception_spec (cxx_pretty_printer
*pp
, tree t
, int flags
)
1602 if (t
&& TREE_PURPOSE (t
))
1604 pp_cxx_ws_string (pp
, "noexcept");
1605 if (!integer_onep (TREE_PURPOSE (t
)))
1607 pp_cxx_whitespace (pp
);
1608 pp_cxx_left_paren (pp
);
1609 if (DEFERRED_NOEXCEPT_SPEC_P (t
))
1610 pp_cxx_ws_string (pp
, "<uninstantiated>");
1612 dump_expr (pp
, TREE_PURPOSE (t
), flags
);
1613 pp_cxx_right_paren (pp
);
1618 pp_cxx_ws_string (pp
, "throw");
1619 pp_cxx_whitespace (pp
);
1620 pp_cxx_left_paren (pp
);
1621 if (TREE_VALUE (t
) != NULL_TREE
)
1624 dump_type (pp
, TREE_VALUE (t
), flags
);
1628 pp_separate_with_comma (pp
);
1630 pp_cxx_right_paren (pp
);
1634 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1635 and destructors properly. */
1638 dump_function_name (cxx_pretty_printer
*pp
, tree t
, int flags
)
1640 tree name
= DECL_NAME (t
);
1642 /* We can get here with a decl that was synthesized by language-
1643 independent machinery (e.g. coverage.c) in which case it won't
1644 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1645 will crash. In this case it is safe just to print out the
1647 if (!DECL_LANG_SPECIFIC (t
))
1649 pp_cxx_tree_identifier (pp
, name
);
1653 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1654 t
= DECL_TEMPLATE_RESULT (t
);
1656 /* Don't let the user see __comp_ctor et al. */
1657 if (DECL_CONSTRUCTOR_P (t
)
1658 || DECL_DESTRUCTOR_P (t
))
1660 if (LAMBDA_TYPE_P (DECL_CONTEXT (t
)))
1661 name
= get_identifier ("<lambda>");
1662 else if (TYPE_ANONYMOUS_P (DECL_CONTEXT (t
)))
1663 name
= get_identifier ("<constructor>");
1665 name
= constructor_name (DECL_CONTEXT (t
));
1668 if (DECL_DESTRUCTOR_P (t
))
1670 pp_cxx_complement (pp
);
1671 dump_decl (pp
, name
, TFF_PLAIN_IDENTIFIER
);
1673 else if (DECL_CONV_FN_P (t
))
1675 /* This cannot use the hack that the operator's return
1676 type is stashed off of its name because it may be
1677 used for error reporting. In the case of conflicting
1678 declarations, both will have the same name, yet
1679 the types will be different, hence the TREE_TYPE field
1680 of the first name will be clobbered by the second. */
1681 pp_cxx_ws_string (pp
, "operator");
1682 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1684 else if (name
&& IDENTIFIER_OPNAME_P (name
))
1685 pp_cxx_tree_identifier (pp
, name
);
1686 else if (name
&& UDLIT_OPER_P (name
))
1687 pp_cxx_tree_identifier (pp
, name
);
1689 dump_decl (pp
, name
, flags
);
1691 if (DECL_TEMPLATE_INFO (t
)
1692 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1693 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1694 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1695 dump_template_parms (pp
, DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
),
1699 /* Dump the template parameters from the template info INFO under control of
1700 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1701 specialization (partial or complete). For partial specializations we show
1702 the specialized parameter values. For a primary template we show no
1706 dump_template_parms (cxx_pretty_printer
*pp
, tree info
,
1707 int primary
, int flags
)
1709 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1711 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1713 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1714 pp_cxx_begin_template_argument_list (pp
);
1716 /* Be careful only to print things when we have them, so as not
1717 to crash producing error messages. */
1718 if (args
&& !primary
)
1721 len
= get_non_default_template_args_count (args
, flags
);
1723 args
= INNERMOST_TEMPLATE_ARGS (args
);
1724 for (ix
= 0; ix
!= len
; ix
++)
1726 tree arg
= TREE_VEC_ELT (args
, ix
);
1728 /* Only print a comma if we know there is an argument coming. In
1729 the case of an empty template argument pack, no actual
1730 argument will be printed. */
1732 && (!ARGUMENT_PACK_P (arg
)
1733 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
1734 pp_separate_with_comma (pp
);
1737 pp_string (pp
, M_("<template parameter error>"));
1739 dump_template_argument (pp
, arg
, flags
);
1744 tree tpl
= TI_TEMPLATE (info
);
1745 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1748 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1749 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1751 for (ix
= 0; ix
!= len
; ix
++)
1755 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1757 pp_string (pp
, M_("<template parameter error>"));
1761 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1764 pp_separate_with_comma (pp
);
1766 dump_decl (pp
, parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1769 pp_cxx_end_template_argument_list (pp
);
1772 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1773 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1776 dump_call_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
, bool skipfirst
)
1779 call_expr_arg_iterator iter
;
1781 pp_cxx_left_paren (pp
);
1782 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1788 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1789 if (more_call_expr_args_p (&iter
))
1790 pp_separate_with_comma (pp
);
1793 pp_cxx_right_paren (pp
);
1796 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1797 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1801 dump_aggr_init_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
,
1805 aggr_init_expr_arg_iterator iter
;
1807 pp_cxx_left_paren (pp
);
1808 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1814 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1815 if (more_aggr_init_expr_args_p (&iter
))
1816 pp_separate_with_comma (pp
);
1819 pp_cxx_right_paren (pp
);
1822 /* Print out a list of initializers (subr of dump_expr). */
1825 dump_expr_list (cxx_pretty_printer
*pp
, tree l
, int flags
)
1829 dump_expr (pp
, TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1832 pp_separate_with_comma (pp
);
1836 /* Print out a vector of initializers (subr of dump_expr). */
1839 dump_expr_init_vec (cxx_pretty_printer
*pp
, vec
<constructor_elt
, va_gc
> *v
,
1842 unsigned HOST_WIDE_INT idx
;
1845 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1847 dump_expr (pp
, value
, flags
| TFF_EXPR_IN_PARENS
);
1848 if (idx
!= v
->length () - 1)
1849 pp_separate_with_comma (pp
);
1854 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1855 function. Resolve it to a close relative -- in the sense of static
1856 type -- variant being overridden. That is close to what was written in
1857 the source code. Subroutine of dump_expr. */
1860 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1862 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1863 HOST_WIDE_INT index
= tree_to_uhwi (OBJ_TYPE_REF_TOKEN (ref
));
1864 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1867 fun
= TREE_CHAIN (fun
);
1868 index
-= (TARGET_VTABLE_USES_DESCRIPTORS
1869 ? TARGET_VTABLE_USES_DESCRIPTORS
: 1);
1875 /* Print out an expression E under control of FLAGS. */
1878 dump_expr (cxx_pretty_printer
*pp
, tree t
, int flags
)
1885 if (STATEMENT_CLASS_P (t
))
1887 pp_cxx_ws_string (pp
, M_("<statement>"));
1891 switch (TREE_CODE (t
))
1899 case NAMESPACE_DECL
:
1903 case IDENTIFIER_NODE
:
1904 dump_decl (pp
, t
, ((flags
& ~(TFF_DECL_SPECIFIERS
|TFF_RETURN_TYPE
1905 |TFF_TEMPLATE_HEADER
))
1906 | TFF_NO_FUNCTION_ARGUMENTS
));
1910 if (SSA_NAME_VAR (t
)
1911 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t
)))
1912 dump_expr (pp
, SSA_NAME_VAR (t
), flags
);
1914 pp_cxx_ws_string (pp
, M_("<unknown>"));
1925 case USERDEF_LITERAL
:
1926 pp_cxx_userdef_literal (pp
, t
);
1930 /* While waiting for caret diagnostics, avoid printing
1931 __cxa_allocate_exception, __cxa_throw, and the like. */
1932 pp_cxx_ws_string (pp
, M_("<throw-expression>"));
1937 dump_type (pp
, PTRMEM_CST_CLASS (t
), flags
);
1938 pp_cxx_colon_colon (pp
);
1939 pp_cxx_tree_identifier (pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1943 pp_cxx_left_paren (pp
);
1944 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1945 pp_separate_with_comma (pp
);
1946 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1947 pp_cxx_right_paren (pp
);
1951 pp_cxx_left_paren (pp
);
1952 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1953 pp_string (pp
, " ? ");
1954 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1955 pp_string (pp
, " : ");
1956 dump_expr (pp
, TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
1957 pp_cxx_right_paren (pp
);
1961 if (TREE_HAS_CONSTRUCTOR (t
))
1963 pp_cxx_ws_string (pp
, "new");
1964 pp_cxx_whitespace (pp
);
1965 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1968 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1971 case AGGR_INIT_EXPR
:
1973 tree fn
= NULL_TREE
;
1975 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
1976 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
1978 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
1980 if (DECL_CONSTRUCTOR_P (fn
))
1981 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1983 dump_decl (pp
, fn
, 0);
1986 dump_expr (pp
, AGGR_INIT_EXPR_FN (t
), 0);
1988 dump_aggr_init_expr_args (pp
, t
, flags
, true);
1993 tree fn
= CALL_EXPR_FN (t
);
1994 bool skipfirst
= false;
1996 if (TREE_CODE (fn
) == ADDR_EXPR
)
1997 fn
= TREE_OPERAND (fn
, 0);
1999 /* Nobody is interested in seeing the guts of vcalls. */
2000 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
2001 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
2003 if (TREE_TYPE (fn
) != NULL_TREE
2004 && NEXT_CODE (fn
) == METHOD_TYPE
2005 && call_expr_nargs (t
))
2007 tree ob
= CALL_EXPR_ARG (t
, 0);
2008 if (TREE_CODE (ob
) == ADDR_EXPR
)
2010 dump_expr (pp
, TREE_OPERAND (ob
, 0),
2011 flags
| TFF_EXPR_IN_PARENS
);
2014 else if (TREE_CODE (ob
) != PARM_DECL
2015 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
2017 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2022 if (flag_sanitize
& SANITIZE_UNDEFINED
2023 && is_ubsan_builtin_p (fn
))
2025 pp_string (cxx_pp
, M_("<ubsan routine call>"));
2028 dump_expr (pp
, fn
, flags
| TFF_EXPR_IN_PARENS
);
2029 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2034 /* Note that this only works for G++ target exprs. If somebody
2035 builds a general TARGET_EXPR, there's no way to represent that
2036 it initializes anything other that the parameter slot for the
2037 default argument. Note we may have cleared out the first
2038 operand in expand_expr, so don't go killing ourselves. */
2039 if (TREE_OPERAND (t
, 1))
2040 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2043 case POINTER_PLUS_EXPR
:
2044 dump_binary_op (pp
, "+", t
, flags
);
2049 dump_binary_op (pp
, assignment_operator_name_info
[NOP_EXPR
].name
,
2056 case TRUNC_DIV_EXPR
:
2057 case TRUNC_MOD_EXPR
:
2065 case TRUTH_ANDIF_EXPR
:
2066 case TRUTH_ORIF_EXPR
:
2073 case EXACT_DIV_EXPR
:
2074 dump_binary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2078 case FLOOR_DIV_EXPR
:
2079 case ROUND_DIV_EXPR
:
2081 dump_binary_op (pp
, "/", t
, flags
);
2085 case FLOOR_MOD_EXPR
:
2086 case ROUND_MOD_EXPR
:
2087 dump_binary_op (pp
, "%", t
, flags
);
2092 tree ob
= TREE_OPERAND (t
, 0);
2093 if (INDIRECT_REF_P (ob
))
2095 ob
= TREE_OPERAND (ob
, 0);
2096 if (TREE_CODE (ob
) != PARM_DECL
2098 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
2100 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2101 if (TREE_CODE (TREE_TYPE (ob
)) == REFERENCE_TYPE
)
2109 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2112 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
2117 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2118 pp_cxx_left_bracket (pp
);
2119 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2120 pp_cxx_right_bracket (pp
);
2123 case ARRAY_NOTATION_REF
:
2124 dump_expr (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
2125 pp_cxx_left_bracket (pp
);
2126 dump_expr (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
2128 dump_expr (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
2130 dump_expr (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
2131 pp_cxx_right_bracket (pp
);
2134 case UNARY_PLUS_EXPR
:
2135 dump_unary_op (pp
, "+", t
, flags
);
2139 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
2140 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
2141 /* An ADDR_EXPR can have reference type. In that case, we
2142 shouldn't print the `&' doing so indicates to the user
2143 that the expression has pointer type. */
2145 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
2146 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2147 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
2148 dump_unary_op (pp
, "&&", t
, flags
);
2150 dump_unary_op (pp
, "&", t
, flags
);
2154 if (TREE_HAS_CONSTRUCTOR (t
))
2156 t
= TREE_OPERAND (t
, 0);
2157 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
2158 dump_expr (pp
, CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
2159 dump_call_expr_args (pp
, t
, flags
, true);
2163 if (TREE_OPERAND (t
,0) != NULL_TREE
2164 && TREE_TYPE (TREE_OPERAND (t
, 0))
2165 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
2166 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2168 dump_unary_op (pp
, "*", t
, flags
);
2173 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
2174 && integer_zerop (TREE_OPERAND (t
, 1)))
2175 dump_expr (pp
, TREE_OPERAND (TREE_OPERAND (t
, 0), 0), flags
);
2179 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2181 pp_cxx_left_paren (pp
);
2182 if (!integer_onep (TYPE_SIZE_UNIT
2183 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))))))
2185 pp_cxx_left_paren (pp
);
2186 dump_type (pp
, ptr_type_node
, flags
);
2187 pp_cxx_right_paren (pp
);
2190 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2191 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2193 pp_cxx_ws_string (pp
, "+");
2194 dump_expr (pp
, fold_convert (ssizetype
, TREE_OPERAND (t
, 1)),
2196 pp_cxx_right_paren (pp
);
2203 case TRUTH_NOT_EXPR
:
2204 case PREDECREMENT_EXPR
:
2205 case PREINCREMENT_EXPR
:
2206 dump_unary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2209 case POSTDECREMENT_EXPR
:
2210 case POSTINCREMENT_EXPR
:
2211 pp_cxx_left_paren (pp
);
2212 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2213 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2214 pp_cxx_right_paren (pp
);
2217 case NON_LVALUE_EXPR
:
2218 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2219 should be another level of INDIRECT_REF so that I don't have to do
2221 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
2223 tree next
= TREE_TYPE (TREE_TYPE (t
));
2225 while (TYPE_PTR_P (next
))
2226 next
= TREE_TYPE (next
);
2228 if (TREE_CODE (next
) == FUNCTION_TYPE
)
2230 if (flags
& TFF_EXPR_IN_PARENS
)
2231 pp_cxx_left_paren (pp
);
2233 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2234 if (flags
& TFF_EXPR_IN_PARENS
)
2235 pp_cxx_right_paren (pp
);
2238 /* Else fall through. */
2240 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2244 case IMPLICIT_CONV_EXPR
:
2245 case VIEW_CONVERT_EXPR
:
2247 tree op
= TREE_OPERAND (t
, 0);
2248 tree ttype
= TREE_TYPE (t
);
2249 tree optype
= TREE_TYPE (op
);
2251 if (TREE_CODE (ttype
) != TREE_CODE (optype
)
2252 && POINTER_TYPE_P (ttype
)
2253 && POINTER_TYPE_P (optype
)
2254 && same_type_p (TREE_TYPE (optype
),
2257 if (TREE_CODE (ttype
) == REFERENCE_TYPE
)
2258 dump_unary_op (pp
, "*", t
, flags
);
2260 dump_unary_op (pp
, "&", t
, flags
);
2262 else if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
2264 /* It is a cast, but we cannot tell whether it is a
2265 reinterpret or static cast. Use the C style notation. */
2266 if (flags
& TFF_EXPR_IN_PARENS
)
2267 pp_cxx_left_paren (pp
);
2268 pp_cxx_left_paren (pp
);
2269 dump_type (pp
, TREE_TYPE (t
), flags
);
2270 pp_cxx_right_paren (pp
);
2271 dump_expr (pp
, op
, flags
| TFF_EXPR_IN_PARENS
);
2272 if (flags
& TFF_EXPR_IN_PARENS
)
2273 pp_cxx_right_paren (pp
);
2276 dump_expr (pp
, op
, flags
);
2281 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
2283 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
2285 if (integer_zerop (idx
))
2287 /* A NULL pointer-to-member constant. */
2288 pp_cxx_left_paren (pp
);
2289 pp_cxx_left_paren (pp
);
2290 dump_type (pp
, TREE_TYPE (t
), flags
);
2291 pp_cxx_right_paren (pp
);
2292 pp_character (pp
, '0');
2293 pp_cxx_right_paren (pp
);
2296 else if (tree_fits_shwi_p (idx
))
2299 unsigned HOST_WIDE_INT n
;
2301 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
2302 t
= TYPE_METHOD_BASETYPE (t
);
2303 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
2305 n
= tree_to_shwi (idx
);
2307 /* Map vtable index back one, to allow for the null pointer to
2311 while (n
> 0 && virtuals
)
2314 virtuals
= TREE_CHAIN (virtuals
);
2318 dump_expr (pp
, BV_FN (virtuals
),
2319 flags
| TFF_EXPR_IN_PARENS
);
2324 if (TREE_TYPE (t
) && LAMBDA_TYPE_P (TREE_TYPE (t
)))
2325 pp_string (pp
, "<lambda closure object>");
2326 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
2328 dump_type (pp
, TREE_TYPE (t
), 0);
2329 pp_cxx_left_paren (pp
);
2330 pp_cxx_right_paren (pp
);
2334 if (!BRACE_ENCLOSED_INITIALIZER_P (t
))
2335 dump_type (pp
, TREE_TYPE (t
), 0);
2336 pp_cxx_left_brace (pp
);
2337 dump_expr_init_vec (pp
, CONSTRUCTOR_ELTS (t
), flags
);
2338 pp_cxx_right_brace (pp
);
2345 tree ob
= TREE_OPERAND (t
, 0);
2346 if (is_dummy_object (ob
))
2348 t
= TREE_OPERAND (t
, 1);
2349 if (TREE_CODE (t
) == FUNCTION_DECL
)
2351 dump_expr (pp
, t
, flags
| TFF_EXPR_IN_PARENS
);
2352 else if (BASELINK_P (t
))
2353 dump_expr (pp
, OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
2354 flags
| TFF_EXPR_IN_PARENS
);
2356 dump_decl (pp
, t
, flags
);
2360 if (INDIRECT_REF_P (ob
))
2362 dump_expr (pp
, TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
2368 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2372 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2377 case TEMPLATE_PARM_INDEX
:
2378 dump_decl (pp
, TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
2382 if (TREE_OPERAND (t
, 0) == NULL_TREE
2383 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
2385 dump_type (pp
, TREE_TYPE (t
), flags
);
2386 pp_cxx_left_paren (pp
);
2387 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2388 pp_cxx_right_paren (pp
);
2392 pp_cxx_left_paren (pp
);
2393 dump_type (pp
, TREE_TYPE (t
), flags
);
2394 pp_cxx_right_paren (pp
);
2395 pp_cxx_left_paren (pp
);
2396 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2397 pp_cxx_right_paren (pp
);
2401 case STATIC_CAST_EXPR
:
2402 pp_cxx_ws_string (pp
, "static_cast");
2404 case REINTERPRET_CAST_EXPR
:
2405 pp_cxx_ws_string (pp
, "reinterpret_cast");
2407 case CONST_CAST_EXPR
:
2408 pp_cxx_ws_string (pp
, "const_cast");
2410 case DYNAMIC_CAST_EXPR
:
2411 pp_cxx_ws_string (pp
, "dynamic_cast");
2413 pp_cxx_begin_template_argument_list (pp
);
2414 dump_type (pp
, TREE_TYPE (t
), flags
);
2415 pp_cxx_end_template_argument_list (pp
);
2416 pp_cxx_left_paren (pp
);
2417 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2418 pp_cxx_right_paren (pp
);
2422 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2428 if (TREE_CODE (t
) == SIZEOF_EXPR
)
2429 pp_cxx_ws_string (pp
, "sizeof");
2432 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
2433 pp_cxx_ws_string (pp
, "__alignof__");
2435 op
= TREE_OPERAND (t
, 0);
2436 if (PACK_EXPANSION_P (op
))
2438 pp_string (pp
, "...");
2439 op
= PACK_EXPANSION_PATTERN (op
);
2441 pp_cxx_whitespace (pp
);
2442 pp_cxx_left_paren (pp
);
2443 if (TREE_CODE (t
) == SIZEOF_EXPR
&& SIZEOF_EXPR_TYPE_P (t
))
2444 dump_type (pp
, TREE_TYPE (op
), flags
);
2445 else if (TYPE_P (TREE_OPERAND (t
, 0)))
2446 dump_type (pp
, op
, flags
);
2448 dump_expr (pp
, op
, flags
);
2449 pp_cxx_right_paren (pp
);
2452 case AT_ENCODE_EXPR
:
2453 pp_cxx_ws_string (pp
, "@encode");
2454 pp_cxx_whitespace (pp
);
2455 pp_cxx_left_paren (pp
);
2456 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
2457 pp_cxx_right_paren (pp
);
2461 pp_cxx_ws_string (pp
, "noexcept");
2462 pp_cxx_whitespace (pp
);
2463 pp_cxx_left_paren (pp
);
2464 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2465 pp_cxx_right_paren (pp
);
2470 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2471 pp_cxx_whitespace (pp
);
2472 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2476 pp_string (pp
, M_("<unparsed>"));
2479 case TRY_CATCH_EXPR
:
2480 case WITH_CLEANUP_EXPR
:
2481 case CLEANUP_POINT_EXPR
:
2482 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2485 case PSEUDO_DTOR_EXPR
:
2486 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2488 if (TREE_OPERAND (t
, 1))
2490 dump_type (pp
, TREE_OPERAND (t
, 1), flags
);
2491 pp_cxx_colon_colon (pp
);
2493 pp_cxx_complement (pp
);
2494 dump_type (pp
, TREE_OPERAND (t
, 2), flags
);
2497 case TEMPLATE_ID_EXPR
:
2498 dump_decl (pp
, t
, flags
);
2504 case STATEMENT_LIST
:
2505 /* We don't yet have a way of dumping statements in a
2506 human-readable format. */
2507 pp_string (pp
, "({...})");
2511 pp_string (pp
, "while (1) { ");
2512 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2513 pp_cxx_right_brace (pp
);
2517 pp_string (pp
, "if (");
2518 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2519 pp_string (pp
, ") break; ");
2523 dump_expr (pp
, BASELINK_FUNCTIONS (t
), flags
& ~TFF_EXPR_IN_PARENS
);
2526 case EMPTY_CLASS_EXPR
:
2527 dump_type (pp
, TREE_TYPE (t
), flags
);
2528 pp_cxx_left_paren (pp
);
2529 pp_cxx_right_paren (pp
);
2532 case NON_DEPENDENT_EXPR
:
2533 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2536 case ARGUMENT_PACK_SELECT
:
2537 dump_template_argument (pp
, ARGUMENT_PACK_SELECT_FROM_PACK (t
), flags
);
2549 pp_type_specifier_seq (pp
, t
);
2553 /* We get here when we want to print a dependent type as an
2554 id-expression, without any disambiguator decoration. */
2555 pp
->id_expression (t
);
2558 case TEMPLATE_TYPE_PARM
:
2559 case TEMPLATE_TEMPLATE_PARM
:
2560 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2561 dump_type (pp
, t
, flags
);
2565 pp_cxx_trait_expression (pp
, t
);
2569 pp_cxx_va_arg_expression (pp
, t
);
2573 pp_cxx_offsetof_expression (pp
, t
);
2577 dump_decl (pp
, t
, flags
);
2580 case EXPR_PACK_EXPANSION
:
2587 case VEC_DELETE_EXPR
:
2593 case UNORDERED_EXPR
:
2603 case FIX_TRUNC_EXPR
:
2608 case TRUTH_AND_EXPR
:
2610 case TRUTH_XOR_EXPR
:
2611 if (flags
& TFF_EXPR_IN_PARENS
)
2612 pp_cxx_left_paren (pp
);
2614 if (flags
& TFF_EXPR_IN_PARENS
)
2615 pp_cxx_right_paren (pp
);
2619 dump_expr (pp
, resolve_virtual_fun_from_obj_type_ref (t
), flags
);
2623 pp_string (pp
, M_("<lambda>"));
2627 pp_cxx_left_paren (pp
);
2628 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2629 pp_cxx_right_paren (pp
);
2633 pp_cxx_requires_expr (cxx_pp
, t
);
2637 pp_cxx_expr_requirement (cxx_pp
, t
);
2641 pp_cxx_type_requirement (cxx_pp
, t
);
2645 pp_cxx_nested_requirement (cxx_pp
, t
);
2648 case VALIDEXPR_EXPR
:
2649 pp_cxx_validexpr_expr (cxx_pp
, t
);
2652 case VALIDTYPE_EXPR
:
2653 pp_cxx_validtype_expr (cxx_pp
, t
);
2656 case CONSTEXPR_EXPR
:
2657 pp_cxx_constexpr_expr (cxx_pp
, t
);
2659 /* This list is incomplete, but should suffice for now.
2660 It is very important that `sorry' does not call
2661 `report_error_function'. That could cause an infinite loop. */
2663 pp_unsupported_tree (pp
, t
);
2664 /* fall through to ERROR_MARK... */
2666 pp_string (pp
, M_("<expression error>"));
2672 dump_binary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
,
2675 pp_cxx_left_paren (pp
);
2676 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2677 pp_cxx_whitespace (pp
);
2679 pp_cxx_ws_string (pp
, opstring
);
2681 pp_string (pp
, M_("<unknown operator>"));
2682 pp_cxx_whitespace (pp
);
2683 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2684 pp_cxx_right_paren (pp
);
2688 dump_unary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
, int flags
)
2690 if (flags
& TFF_EXPR_IN_PARENS
)
2691 pp_cxx_left_paren (pp
);
2692 pp_cxx_ws_string (pp
, opstring
);
2693 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2694 if (flags
& TFF_EXPR_IN_PARENS
)
2695 pp_cxx_right_paren (pp
);
2699 reinit_cxx_pp (void)
2701 pp_clear_output_area (cxx_pp
);
2702 cxx_pp
->padding
= pp_none
;
2703 pp_indentation (cxx_pp
) = 0;
2704 pp_needs_newline (cxx_pp
) = false;
2705 cxx_pp
->enclosing_scope
= current_function_decl
;
2708 /* Same as pp_formatted_text, except the return string is a separate
2709 copy and has a GGC storage duration, e.g. an indefinite lifetime. */
2712 pp_ggc_formatted_text (pretty_printer
*pp
)
2714 return ggc_strdup (pp_formatted_text (pp
));
2717 /* Exported interface to stringifying types, exprs and decls under TFF_*
2721 type_as_string (tree typ
, int flags
)
2724 pp_translate_identifiers (cxx_pp
) = false;
2725 dump_type (cxx_pp
, typ
, flags
);
2726 return pp_ggc_formatted_text (cxx_pp
);
2730 type_as_string_translate (tree typ
, int flags
)
2733 dump_type (cxx_pp
, typ
, flags
);
2734 return pp_ggc_formatted_text (cxx_pp
);
2738 expr_as_string (tree decl
, int flags
)
2741 pp_translate_identifiers (cxx_pp
) = false;
2742 dump_expr (cxx_pp
, decl
, flags
);
2743 return pp_ggc_formatted_text (cxx_pp
);
2746 /* Wrap decl_as_string with options appropriate for dwarf. */
2749 decl_as_dwarf_string (tree decl
, int flags
)
2752 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2753 here will be adequate to get the desired behaviour. */
2754 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2755 name
= decl_as_string (decl
, flags
);
2756 /* Subsequent calls to the pretty printer shouldn't use this style. */
2757 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2762 decl_as_string (tree decl
, int flags
)
2765 pp_translate_identifiers (cxx_pp
) = false;
2766 dump_decl (cxx_pp
, decl
, flags
);
2767 return pp_ggc_formatted_text (cxx_pp
);
2771 decl_as_string_translate (tree decl
, int flags
)
2774 dump_decl (cxx_pp
, decl
, flags
);
2775 return pp_ggc_formatted_text (cxx_pp
);
2778 /* Wrap lang_decl_name with options appropriate for dwarf. */
2781 lang_decl_dwarf_name (tree decl
, int v
, bool translate
)
2784 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2785 here will be adequate to get the desired behaviour. */
2786 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2787 name
= lang_decl_name (decl
, v
, translate
);
2788 /* Subsequent calls to the pretty printer shouldn't use this style. */
2789 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2793 /* Generate the three forms of printable names for cxx_printable_name. */
2796 lang_decl_name (tree decl
, int v
, bool translate
)
2800 ? decl_as_string_translate (decl
, TFF_DECL_SPECIFIERS
)
2801 : decl_as_string (decl
, TFF_DECL_SPECIFIERS
));
2804 pp_translate_identifiers (cxx_pp
) = translate
;
2806 && (DECL_CLASS_SCOPE_P (decl
)
2807 || (DECL_NAMESPACE_SCOPE_P (decl
)
2808 && CP_DECL_CONTEXT (decl
) != global_namespace
)))
2810 dump_type (cxx_pp
, CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2811 pp_cxx_colon_colon (cxx_pp
);
2814 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2815 dump_function_name (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
);
2816 else if ((DECL_NAME (decl
) == NULL_TREE
)
2817 && TREE_CODE (decl
) == NAMESPACE_DECL
)
2818 dump_decl (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
| TFF_UNQUALIFIED_NAME
);
2820 dump_decl (cxx_pp
, DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2822 return pp_ggc_formatted_text (cxx_pp
);
2825 /* Return the location of a tree passed to %+ formats. */
2828 location_of (tree t
)
2832 t
= TYPE_MAIN_DECL (t
);
2834 return input_location
;
2836 else if (TREE_CODE (t
) == OVERLOAD
)
2837 t
= OVL_FUNCTION (t
);
2840 return DECL_SOURCE_LOCATION (t
);
2841 return EXPR_LOC_OR_LOC (t
, input_location
);
2844 /* Now the interfaces from error et al to dump_type et al. Each takes an
2845 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2849 decl_to_string (tree decl
, int verbose
)
2853 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2854 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2855 flags
= TFF_CLASS_KEY_OR_ENUM
;
2857 flags
|= TFF_DECL_SPECIFIERS
;
2858 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2859 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2860 flags
|= TFF_TEMPLATE_HEADER
;
2863 dump_decl (cxx_pp
, decl
, flags
);
2864 return pp_ggc_formatted_text (cxx_pp
);
2868 expr_to_string (tree decl
)
2871 dump_expr (cxx_pp
, decl
, 0);
2872 return pp_ggc_formatted_text (cxx_pp
);
2876 fndecl_to_string (tree fndecl
, int verbose
)
2880 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2881 | TFF_TEMPLATE_HEADER
;
2883 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2885 dump_decl (cxx_pp
, fndecl
, flags
);
2886 return pp_ggc_formatted_text (cxx_pp
);
2891 code_to_string (enum tree_code c
)
2893 return get_tree_code_name (c
);
2897 language_to_string (enum languages c
)
2904 case lang_cplusplus
:
2916 /* Return the proper printed version of a parameter to a C++ function. */
2919 parm_to_string (int p
)
2923 pp_string (cxx_pp
, "'this'");
2925 pp_decimal_int (cxx_pp
, p
+ 1);
2926 return pp_ggc_formatted_text (cxx_pp
);
2930 op_to_string (enum tree_code p
)
2932 tree id
= operator_name_info
[p
].identifier
;
2933 return id
? IDENTIFIER_POINTER (id
) : M_("<unknown>");
2937 type_to_string (tree typ
, int verbose
)
2941 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2942 flags
|= TFF_TEMPLATE_HEADER
;
2945 dump_type (cxx_pp
, typ
, flags
);
2946 /* If we're printing a type that involves typedefs, also print the
2947 stripped version. But sometimes the stripped version looks
2948 exactly the same, so we don't want it after all. To avoid printing
2949 it in that case, we play ugly obstack games. */
2950 if (typ
&& TYPE_P (typ
) && typ
!= TYPE_CANONICAL (typ
)
2951 && !uses_template_parms (typ
))
2953 int aka_start
; char *p
;
2954 struct obstack
*ob
= pp_buffer (cxx_pp
)->obstack
;
2955 /* Remember the end of the initial dump. */
2956 int len
= obstack_object_size (ob
);
2957 tree aka
= strip_typedefs (typ
);
2958 pp_string (cxx_pp
, " {aka");
2959 pp_cxx_whitespace (cxx_pp
);
2960 /* And remember the start of the aka dump. */
2961 aka_start
= obstack_object_size (ob
);
2962 dump_type (cxx_pp
, aka
, flags
);
2963 pp_right_brace (cxx_pp
);
2964 p
= (char*)obstack_base (ob
);
2965 /* If they are identical, cut off the aka with a NUL. */
2966 if (memcmp (p
, p
+aka_start
, len
) == 0)
2969 return pp_ggc_formatted_text (cxx_pp
);
2973 assop_to_string (enum tree_code p
)
2975 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
2976 return id
? IDENTIFIER_POINTER (id
) : M_("{unknown}");
2980 args_to_string (tree p
, int verbose
)
2984 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2989 if (TYPE_P (TREE_VALUE (p
)))
2990 return type_as_string_translate (p
, flags
);
2993 for (; p
; p
= TREE_CHAIN (p
))
2995 if (TREE_VALUE (p
) == null_node
)
2996 pp_cxx_ws_string (cxx_pp
, "NULL");
2998 dump_type (cxx_pp
, error_type (TREE_VALUE (p
)), flags
);
3000 pp_separate_with_comma (cxx_pp
);
3002 return pp_ggc_formatted_text (cxx_pp
);
3005 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
3006 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
3007 arguments. Alternatively, the purpose of P may be null and the template
3008 parameters passed directly in the type field. */
3011 subst_to_string (tree p
)
3013 tree decl
= TREE_PURPOSE (p
);
3014 tree targs
= TREE_VALUE (p
);
3015 tree tparms
= decl
? DECL_TEMPLATE_PARMS (decl
) : TREE_TYPE (p
);
3016 int flags
= (TFF_DECL_SPECIFIERS
|TFF_TEMPLATE_HEADER
3017 |TFF_NO_TEMPLATE_BINDINGS
);
3025 dump_template_decl (cxx_pp
, decl
, flags
);
3026 pp_cxx_whitespace (cxx_pp
);
3028 dump_substitution (cxx_pp
, NULL
, tparms
, targs
, /*flags=*/0);
3029 return pp_ggc_formatted_text (cxx_pp
);
3033 cv_to_string (tree p
, int v
)
3036 cxx_pp
->padding
= v
? pp_before
: pp_none
;
3037 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
3038 return pp_ggc_formatted_text (cxx_pp
);
3042 parms_to_string (tree p
)
3045 pp_cxx_parameter_declaration_clause (cxx_pp
, p
);
3046 return pp_formatted_text (cxx_pp
);
3051 eh_spec_to_string (tree p
, int /*v*/)
3055 dump_exception_spec (cxx_pp
, p
, flags
);
3056 return pp_ggc_formatted_text (cxx_pp
);
3059 /* Langhook for print_error_function. */
3061 cxx_print_error_function (diagnostic_context
*context
, const char *file
,
3062 diagnostic_info
*diagnostic
)
3064 lhd_print_error_function (context
, file
, diagnostic
);
3065 pp_set_prefix (context
->printer
, file
);
3066 maybe_print_instantiation_context (context
);
3070 cp_diagnostic_starter (diagnostic_context
*context
,
3071 diagnostic_info
*diagnostic
)
3073 diagnostic_report_current_module (context
, diagnostic
->location
);
3074 cp_print_error_function (context
, diagnostic
);
3075 maybe_print_instantiation_context (context
);
3076 maybe_print_constexpr_context (context
);
3077 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
3082 cp_diagnostic_finalizer (diagnostic_context
*context
,
3083 diagnostic_info
*diagnostic
)
3085 virt_loc_aware_diagnostic_finalizer (context
, diagnostic
);
3086 pp_destroy_prefix (context
->printer
);
3089 /* Print current function onto BUFFER, in the process of reporting
3090 a diagnostic message. Called from cp_diagnostic_starter. */
3092 cp_print_error_function (diagnostic_context
*context
,
3093 diagnostic_info
*diagnostic
)
3095 /* If we are in an instantiation context, current_function_decl is likely
3096 to be wrong, so just rely on print_instantiation_full_context. */
3097 if (current_instantiation ())
3099 if (diagnostic_last_function_changed (context
, diagnostic
))
3101 const char *old_prefix
= context
->printer
->prefix
;
3102 const char *file
= LOCATION_FILE (diagnostic
->location
);
3103 tree abstract_origin
= diagnostic_abstract_origin (diagnostic
);
3104 char *new_prefix
= (file
&& abstract_origin
== NULL
)
3105 ? file_name_as_prefix (context
, file
) : NULL
;
3107 pp_set_prefix (context
->printer
, new_prefix
);
3109 if (current_function_decl
== NULL
)
3110 pp_string (context
->printer
, _("At global scope:"));
3115 if (abstract_origin
)
3117 ao
= BLOCK_ABSTRACT_ORIGIN (abstract_origin
);
3118 while (TREE_CODE (ao
) == BLOCK
3119 && BLOCK_ABSTRACT_ORIGIN (ao
)
3120 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3121 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3122 gcc_assert (TREE_CODE (ao
) == FUNCTION_DECL
);
3126 fndecl
= current_function_decl
;
3128 pp_printf (context
->printer
, function_category (fndecl
),
3129 cxx_printable_name_translate (fndecl
, 2));
3131 while (abstract_origin
)
3134 tree block
= abstract_origin
;
3136 locus
= &BLOCK_SOURCE_LOCATION (block
);
3138 block
= BLOCK_SUPERCONTEXT (block
);
3139 while (block
&& TREE_CODE (block
) == BLOCK
3140 && BLOCK_ABSTRACT_ORIGIN (block
))
3142 ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3144 while (TREE_CODE (ao
) == BLOCK
3145 && BLOCK_ABSTRACT_ORIGIN (ao
)
3146 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3147 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3149 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3154 else if (TREE_CODE (ao
) != BLOCK
)
3157 block
= BLOCK_SUPERCONTEXT (block
);
3160 abstract_origin
= block
;
3163 while (block
&& TREE_CODE (block
) == BLOCK
)
3164 block
= BLOCK_SUPERCONTEXT (block
);
3166 if (block
&& TREE_CODE (block
) == FUNCTION_DECL
)
3168 abstract_origin
= NULL
;
3172 expanded_location s
= expand_location (*locus
);
3173 pp_character (context
->printer
, ',');
3174 pp_newline (context
->printer
);
3177 if (context
->show_column
&& s
.column
!= 0)
3178 pp_printf (context
->printer
,
3179 _(" inlined from %qs at %r%s:%d:%d%R"),
3180 cxx_printable_name_translate (fndecl
, 2),
3181 "locus", s
.file
, s
.line
, s
.column
);
3183 pp_printf (context
->printer
,
3184 _(" inlined from %qs at %r%s:%d%R"),
3185 cxx_printable_name_translate (fndecl
, 2),
3186 "locus", s
.file
, s
.line
);
3190 pp_printf (context
->printer
, _(" inlined from %qs"),
3191 cxx_printable_name_translate (fndecl
, 2));
3194 pp_character (context
->printer
, ':');
3196 pp_newline (context
->printer
);
3198 diagnostic_set_last_function (context
, diagnostic
);
3199 pp_destroy_prefix (context
->printer
);
3200 context
->printer
->prefix
= old_prefix
;
3204 /* Returns a description of FUNCTION using standard terminology. The
3205 result is a format string of the form "In CATEGORY %qs". */
3207 function_category (tree fn
)
3209 /* We can get called from the middle-end for diagnostics of function
3210 clones. Make sure we have language specific information before
3211 dereferencing it. */
3212 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn
))
3213 && DECL_FUNCTION_MEMBER_P (fn
))
3215 if (DECL_STATIC_FUNCTION_P (fn
))
3216 return _("In static member function %qs");
3217 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
3218 return _("In copy constructor %qs");
3219 else if (DECL_CONSTRUCTOR_P (fn
))
3220 return _("In constructor %qs");
3221 else if (DECL_DESTRUCTOR_P (fn
))
3222 return _("In destructor %qs");
3223 else if (LAMBDA_FUNCTION_P (fn
))
3224 return _("In lambda function");
3226 return _("In member function %qs");
3229 return _("In function %qs");
3232 /* Report the full context of a current template instantiation,
3235 print_instantiation_full_context (diagnostic_context
*context
)
3237 struct tinst_level
*p
= current_instantiation ();
3238 location_t location
= input_location
;
3242 pp_verbatim (context
->printer
,
3243 TREE_CODE (p
->decl
) == TREE_LIST
3244 ? _("%s: In substitution of %qS:\n")
3245 : _("%s: In instantiation of %q#D:\n"),
3246 LOCATION_FILE (location
),
3249 location
= p
->locus
;
3253 print_instantiation_partial_context (context
, p
, location
);
3256 /* Helper function of print_instantiation_partial_context() that
3257 prints a single line of instantiation context. */
3260 print_instantiation_partial_context_line (diagnostic_context
*context
,
3261 const struct tinst_level
*t
,
3262 location_t loc
, bool recursive_p
)
3264 if (loc
== UNKNOWN_LOCATION
)
3267 expanded_location xloc
= expand_location (loc
);
3269 if (context
->show_column
)
3270 pp_verbatim (context
->printer
, _("%r%s:%d:%d:%R "),
3271 "locus", xloc
.file
, xloc
.line
, xloc
.column
);
3273 pp_verbatim (context
->printer
, _("%r%s:%d:%R "),
3274 "locus", xloc
.file
, xloc
.line
);
3278 if (TREE_CODE (t
->decl
) == TREE_LIST
)
3279 pp_verbatim (context
->printer
,
3281 ? _("recursively required by substitution of %qS\n")
3282 : _("required by substitution of %qS\n"),
3285 pp_verbatim (context
->printer
,
3287 ? _("recursively required from %q#D\n")
3288 : _("required from %q#D\n"),
3293 pp_verbatim (context
->printer
,
3295 ? _("recursively required from here")
3296 : _("required from here"));
3300 /* Same as print_instantiation_full_context but less verbose. */
3303 print_instantiation_partial_context (diagnostic_context
*context
,
3304 struct tinst_level
*t0
, location_t loc
)
3306 struct tinst_level
*t
;
3309 location_t prev_loc
= loc
;
3311 for (t
= t0
; t
!= NULL
; t
= t
->next
)
3312 if (prev_loc
!= t
->locus
)
3314 prev_loc
= t
->locus
;
3320 if (template_backtrace_limit
3321 && n_total
> template_backtrace_limit
)
3323 int skip
= n_total
- template_backtrace_limit
;
3324 int head
= template_backtrace_limit
/ 2;
3326 /* Avoid skipping just 1. If so, skip 2. */
3330 head
= (template_backtrace_limit
- 1) / 2;
3333 for (n
= 0; n
< head
; n
++)
3335 gcc_assert (t
!= NULL
);
3336 if (loc
!= t
->locus
)
3337 print_instantiation_partial_context_line (context
, t
, loc
,
3338 /*recursive_p=*/false);
3342 if (t
!= NULL
&& skip
> 0)
3344 expanded_location xloc
;
3345 xloc
= expand_location (loc
);
3346 if (context
->show_column
)
3347 pp_verbatim (context
->printer
,
3348 _("%r%s:%d:%d:%R [ skipping %d instantiation "
3349 "contexts, use -ftemplate-backtrace-limit=0 to "
3351 "locus", xloc
.file
, xloc
.line
, xloc
.column
, skip
);
3353 pp_verbatim (context
->printer
,
3354 _("%r%s:%d:%R [ skipping %d instantiation "
3355 "contexts, use -ftemplate-backtrace-limit=0 to "
3357 "locus", xloc
.file
, xloc
.line
, skip
);
3362 } while (t
!= NULL
&& --skip
> 0);
3368 while (t
->next
!= NULL
&& t
->locus
== t
->next
->locus
)
3373 print_instantiation_partial_context_line (context
, t
, loc
,
3378 print_instantiation_partial_context_line (context
, NULL
, loc
,
3379 /*recursive_p=*/false);
3380 pp_newline (context
->printer
);
3383 /* Called from cp_thing to print the template context for an error. */
3385 maybe_print_instantiation_context (diagnostic_context
*context
)
3387 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3390 record_last_problematic_instantiation ();
3391 print_instantiation_full_context (context
);
3394 /* Report the bare minimum context of a template instantiation. */
3396 print_instantiation_context (void)
3398 print_instantiation_partial_context
3399 (global_dc
, current_instantiation (), input_location
);
3400 pp_newline (global_dc
->printer
);
3401 diagnostic_flush_buffer (global_dc
);
3404 /* Report what constexpr call(s) we're trying to expand, if any. */
3407 maybe_print_constexpr_context (diagnostic_context
*context
)
3409 vec
<tree
> call_stack
= cx_error_context ();
3413 FOR_EACH_VEC_ELT (call_stack
, ix
, t
)
3415 expanded_location xloc
= expand_location (EXPR_LOCATION (t
));
3416 const char *s
= expr_as_string (t
, 0);
3417 if (context
->show_column
)
3418 pp_verbatim (context
->printer
,
3419 _("%r%s:%d:%d:%R in constexpr expansion of %qs"),
3420 "locus", xloc
.file
, xloc
.line
, xloc
.column
, s
);
3422 pp_verbatim (context
->printer
,
3423 _("%r%s:%d:%R in constexpr expansion of %qs"),
3424 "locus", xloc
.file
, xloc
.line
, s
);
3425 pp_newline (context
->printer
);
3429 /* Called from output_format -- during diagnostic message processing --
3430 to handle C++ specific format specifier with the following meanings:
3431 %A function argument-list.
3435 %F function declaration.
3436 %L language as used in extern "lang".
3438 %P function parameter whose position is indicated by an integer.
3439 %Q assignment operator.
3440 %S substitution (template + args)
3443 %X exception-specification. */
3445 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
3446 int precision
, bool wide
, bool set_locus
, bool verbose
)
3450 #define next_tree (t = va_arg (*text->args_ptr, tree))
3451 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3452 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3453 #define next_int va_arg (*text->args_ptr, int)
3455 if (precision
!= 0 || wide
)
3458 if (text
->locus
== NULL
)
3463 case 'A': result
= args_to_string (next_tree
, verbose
); break;
3464 case 'C': result
= code_to_string (next_tcode
); break;
3467 tree temp
= next_tree
;
3469 && DECL_HAS_DEBUG_EXPR_P (temp
))
3471 temp
= DECL_DEBUG_EXPR (temp
);
3474 result
= expr_to_string (temp
);
3478 result
= decl_to_string (temp
, verbose
);
3481 case 'E': result
= expr_to_string (next_tree
); break;
3482 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
3483 case 'L': result
= language_to_string (next_lang
); break;
3484 case 'O': result
= op_to_string (next_tcode
); break;
3485 case 'P': result
= parm_to_string (next_int
); break;
3486 case 'Q': result
= assop_to_string (next_tcode
); break;
3487 case 'S': result
= subst_to_string (next_tree
); break;
3488 case 'T': result
= type_to_string (next_tree
, verbose
); break;
3489 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
3490 case 'X': result
= eh_spec_to_string (next_tree
, verbose
); break;
3493 percent_K_format (text
);
3495 case 'Z': result
= parms_to_string (next_tree
); break;
3501 pp_string (pp
, result
);
3502 if (set_locus
&& t
!= NULL
)
3503 *text
->locus
= location_of (t
);
3511 /* Warn about the use of C++0x features when appropriate. */
3513 maybe_warn_cpp0x (cpp0x_warn_str str
)
3515 if ((cxx_dialect
== cxx98
) && !in_system_header_at (input_location
))
3516 /* We really want to suppress this warning in system headers,
3517 because libstdc++ uses variadic templates even when we aren't
3521 case CPP0X_INITIALIZER_LISTS
:
3522 pedwarn (input_location
, 0,
3523 "extended initializer lists "
3524 "only available with -std=c++11 or -std=gnu++11");
3526 case CPP0X_EXPLICIT_CONVERSION
:
3527 pedwarn (input_location
, 0,
3528 "explicit conversion operators "
3529 "only available with -std=c++11 or -std=gnu++11");
3531 case CPP0X_VARIADIC_TEMPLATES
:
3532 pedwarn (input_location
, 0,
3533 "variadic templates "
3534 "only available with -std=c++11 or -std=gnu++11");
3536 case CPP0X_LAMBDA_EXPR
:
3537 pedwarn (input_location
, 0,
3538 "lambda expressions "
3539 "only available with -std=c++11 or -std=gnu++11");
3542 pedwarn (input_location
, 0,
3543 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3545 case CPP0X_SCOPED_ENUMS
:
3546 pedwarn (input_location
, 0,
3547 "scoped enums only available with -std=c++11 or -std=gnu++11");
3549 case CPP0X_DEFAULTED_DELETED
:
3550 pedwarn (input_location
, 0,
3551 "defaulted and deleted functions "
3552 "only available with -std=c++11 or -std=gnu++11");
3554 case CPP0X_INLINE_NAMESPACES
:
3555 pedwarn (input_location
, OPT_Wpedantic
,
3556 "inline namespaces "
3557 "only available with -std=c++11 or -std=gnu++11");
3559 case CPP0X_OVERRIDE_CONTROLS
:
3560 pedwarn (input_location
, 0,
3561 "override controls (override/final) "
3562 "only available with -std=c++11 or -std=gnu++11");
3565 pedwarn (input_location
, 0,
3566 "non-static data member initializers "
3567 "only available with -std=c++11 or -std=gnu++11");
3569 case CPP0X_USER_DEFINED_LITERALS
:
3570 pedwarn (input_location
, 0,
3571 "user-defined literals "
3572 "only available with -std=c++11 or -std=gnu++11");
3574 case CPP0X_DELEGATING_CTORS
:
3575 pedwarn (input_location
, 0,
3576 "delegating constructors "
3577 "only available with -std=c++11 or -std=gnu++11");
3579 case CPP0X_INHERITING_CTORS
:
3580 pedwarn (input_location
, 0,
3581 "inheriting constructors "
3582 "only available with -std=c++11 or -std=gnu++11");
3584 case CPP0X_ATTRIBUTES
:
3585 pedwarn (input_location
, 0,
3587 "only available with -std=c++11 or -std=gnu++11");
3589 case CPP0X_REF_QUALIFIER
:
3590 pedwarn (input_location
, 0,
3592 "only available with -std=c++11 or -std=gnu++11");
3599 /* Warn about the use of variadic templates when appropriate. */
3601 maybe_warn_variadic_templates (void)
3603 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES
);
3607 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3608 option OPT with text GMSGID. Use this function to report
3609 diagnostics for constructs that are invalid C++98, but valid
3612 pedwarn_cxx98 (location_t location
, int opt
, const char *gmsgid
, ...)
3614 diagnostic_info diagnostic
;
3618 va_start (ap
, gmsgid
);
3619 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
3620 (cxx_dialect
== cxx98
) ? DK_PEDWARN
: DK_WARNING
);
3621 diagnostic
.option_index
= opt
;
3622 ret
= report_diagnostic (&diagnostic
);
3627 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3628 we found when we tried to do the lookup. LOCATION is the location of
3629 the NAME identifier. */
3632 qualified_name_lookup_error (tree scope
, tree name
,
3633 tree decl
, location_t location
)
3635 if (scope
== error_mark_node
)
3636 ; /* We already complained. */
3637 else if (TYPE_P (scope
))
3639 if (!COMPLETE_TYPE_P (scope
))
3640 error_at (location
, "incomplete type %qT used in nested name specifier",
3642 else if (TREE_CODE (decl
) == TREE_LIST
)
3644 error_at (location
, "reference to %<%T::%D%> is ambiguous",
3646 print_candidates (decl
);
3649 error_at (location
, "%qD is not a member of %qT", name
, scope
);
3651 else if (scope
!= global_namespace
)
3653 error_at (location
, "%qD is not a member of %qD", name
, scope
);
3654 suggest_alternatives_for (location
, name
);
3658 error_at (location
, "%<::%D%> has not been declared", name
);
3659 suggest_alternatives_for (location
, name
);