1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993-2013 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"
27 #include "diagnostic.h"
28 #include "tree-diagnostic.h"
29 #include "langhooks-def.h"
31 #include "cxx-pretty-print.h"
32 #include "tree-pretty-print.h"
33 #include "pointer-set.h"
34 #include "c-family/c-objc.h"
37 #include <new> // For placement-new.
39 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
40 #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';')
42 /* The global buffer where we dump everything. It is there only for
43 transitional purpose. It is expected, in the near future, to be
44 completely removed. */
45 static cxx_pretty_printer scratch_pretty_printer
;
46 #define cxx_pp (&scratch_pretty_printer)
48 /* Translate if being used for diagnostics, but not for dump files or
50 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
52 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
54 static const char *args_to_string (tree
, int);
55 static const char *assop_to_string (enum tree_code
);
56 static const char *code_to_string (enum tree_code
);
57 static const char *cv_to_string (tree
, int);
58 static const char *decl_to_string (tree
, int);
59 static const char *expr_to_string (tree
);
60 static const char *fndecl_to_string (tree
, int);
61 static const char *op_to_string (enum tree_code
);
62 static const char *parm_to_string (int);
63 static const char *type_to_string (tree
, int);
65 static void dump_alias_template_specialization (cxx_pretty_printer
*, tree
, int);
66 static void dump_type (cxx_pretty_printer
*, tree
, int);
67 static void dump_typename (cxx_pretty_printer
*, tree
, int);
68 static void dump_simple_decl (cxx_pretty_printer
*, tree
, tree
, int);
69 static void dump_decl (cxx_pretty_printer
*, tree
, int);
70 static void dump_template_decl (cxx_pretty_printer
*, tree
, int);
71 static void dump_function_decl (cxx_pretty_printer
*, tree
, int);
72 static void dump_expr (cxx_pretty_printer
*, tree
, int);
73 static void dump_unary_op (cxx_pretty_printer
*, const char *, tree
, int);
74 static void dump_binary_op (cxx_pretty_printer
*, const char *, tree
, int);
75 static void dump_aggr_type (cxx_pretty_printer
*, tree
, int);
76 static void dump_type_prefix (cxx_pretty_printer
*, tree
, int);
77 static void dump_type_suffix (cxx_pretty_printer
*, tree
, int);
78 static void dump_function_name (cxx_pretty_printer
*, tree
, int);
79 static void dump_call_expr_args (cxx_pretty_printer
*, tree
, int, bool);
80 static void dump_aggr_init_expr_args (cxx_pretty_printer
*, tree
, int, bool);
81 static void dump_expr_list (cxx_pretty_printer
*, tree
, int);
82 static void dump_global_iord (cxx_pretty_printer
*, tree
);
83 static void dump_parameters (cxx_pretty_printer
*, tree
, int);
84 static void dump_ref_qualifier (cxx_pretty_printer
*, tree
, int);
85 static void dump_exception_spec (cxx_pretty_printer
*, tree
, int);
86 static void dump_template_argument (cxx_pretty_printer
*, tree
, int);
87 static void dump_template_argument_list (cxx_pretty_printer
*, tree
, int);
88 static void dump_template_parameter (cxx_pretty_printer
*, tree
, int);
89 static void dump_template_bindings (cxx_pretty_printer
*, tree
, tree
,
91 static void dump_scope (cxx_pretty_printer
*, tree
, int);
92 static void dump_template_parms (cxx_pretty_printer
*, tree
, int, int);
93 static int get_non_default_template_args_count (tree
, int);
94 static const char *function_category (tree
);
95 static void maybe_print_constexpr_context (diagnostic_context
*);
96 static void maybe_print_instantiation_context (diagnostic_context
*);
97 static void print_instantiation_full_context (diagnostic_context
*);
98 static void print_instantiation_partial_context (diagnostic_context
*,
101 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
102 static void cp_diagnostic_finalizer (diagnostic_context
*, diagnostic_info
*);
103 static void cp_print_error_function (diagnostic_context
*, diagnostic_info
*);
105 static bool cp_printer (pretty_printer
*, text_info
*, const char *,
106 int, bool, bool, bool);
111 diagnostic_starter (global_dc
) = cp_diagnostic_starter
;
112 diagnostic_finalizer (global_dc
) = cp_diagnostic_finalizer
;
113 diagnostic_format_decoder (global_dc
) = cp_printer
;
115 new (cxx_pp
) cxx_pretty_printer ();
118 /* Dump a scope, if deemed necessary. */
121 dump_scope (cxx_pretty_printer
*pp
, tree scope
, int flags
)
123 int f
= flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
);
125 if (scope
== NULL_TREE
)
128 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
130 if (scope
!= global_namespace
)
132 dump_decl (pp
, scope
, f
);
133 pp_cxx_colon_colon (pp
);
136 else if (AGGREGATE_TYPE_P (scope
))
138 dump_type (pp
, scope
, f
);
139 pp_cxx_colon_colon (pp
);
141 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
143 dump_function_decl (pp
, scope
, f
);
144 pp_cxx_colon_colon (pp
);
148 /* Dump the template ARGument under control of FLAGS. */
151 dump_template_argument (cxx_pretty_printer
*pp
, tree arg
, int flags
)
153 if (ARGUMENT_PACK_P (arg
))
154 dump_template_argument_list (pp
, ARGUMENT_PACK_ARGS (arg
),
155 /* No default args in argument packs. */
156 flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
157 else if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
158 dump_type (pp
, arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
161 if (TREE_CODE (arg
) == TREE_LIST
)
162 arg
= TREE_VALUE (arg
);
164 dump_expr (pp
, arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
168 /* Count the number of template arguments ARGS whose value does not
169 match the (optional) default template parameter in PARAMS */
172 get_non_default_template_args_count (tree args
, int flags
)
174 int n
= TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args
));
176 if (/* We use this flag when generating debug information. We don't
177 want to expand templates at this point, for this may generate
178 new decls, which gets decl counts out of sync, which may in
179 turn cause codegen differences between compilations with and
181 (flags
& TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
) != 0
182 || !flag_pretty_templates
)
185 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args
));
188 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
192 dump_template_argument_list (cxx_pretty_printer
*pp
, tree args
, int flags
)
194 int n
= get_non_default_template_args_count (args
, flags
);
198 for (i
= 0; i
< n
; ++i
)
200 tree arg
= TREE_VEC_ELT (args
, i
);
202 /* Only print a comma if we know there is an argument coming. In
203 the case of an empty template argument pack, no actual
204 argument will be printed. */
206 && (!ARGUMENT_PACK_P (arg
)
207 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
208 pp_separate_with_comma (pp
);
210 dump_template_argument (pp
, arg
, flags
);
215 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
218 dump_template_parameter (cxx_pretty_printer
*pp
, tree parm
, int flags
)
223 if (parm
== error_mark_node
)
226 p
= TREE_VALUE (parm
);
227 a
= TREE_PURPOSE (parm
);
229 if (TREE_CODE (p
) == TYPE_DECL
)
231 if (flags
& TFF_DECL_SPECIFIERS
)
233 pp_cxx_ws_string (pp
, "class");
234 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p
)))
235 pp_cxx_ws_string (pp
, "...");
237 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
239 else if (DECL_NAME (p
))
240 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
242 pp_cxx_canonical_template_parameter (pp
, TREE_TYPE (p
));
245 dump_decl (pp
, p
, flags
| TFF_DECL_SPECIFIERS
);
247 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
249 pp_cxx_whitespace (pp
);
251 pp_cxx_whitespace (pp
);
252 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
253 dump_type (pp
, a
, flags
& ~TFF_CHASE_TYPEDEF
);
255 dump_expr (pp
, a
, flags
| TFF_EXPR_IN_PARENS
);
259 /* Dump, under control of FLAGS, a template-parameter-list binding.
260 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
264 dump_template_bindings (cxx_pretty_printer
*pp
, tree parms
, tree args
,
265 vec
<tree
, va_gc
> *typenames
)
267 bool need_semicolon
= false;
273 tree p
= TREE_VALUE (parms
);
274 int lvl
= TMPL_PARMS_DEPTH (parms
);
277 tree lvl_args
= NULL_TREE
;
279 /* Don't crash if we had an invalid argument list. */
280 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
281 lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
283 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
285 tree arg
= NULL_TREE
;
287 /* Don't crash if we had an invalid argument list. */
288 if (lvl_args
&& NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
289 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
292 pp_separate_with_semicolon (pp
);
293 dump_template_parameter (pp
, TREE_VEC_ELT (p
, i
),
294 TFF_PLAIN_IDENTIFIER
);
295 pp_cxx_whitespace (pp
);
297 pp_cxx_whitespace (pp
);
300 if (ARGUMENT_PACK_P (arg
))
301 pp_cxx_left_brace (pp
);
302 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
303 if (ARGUMENT_PACK_P (arg
))
304 pp_cxx_right_brace (pp
);
307 pp_string (pp
, M_("<missing>"));
310 need_semicolon
= true;
313 parms
= TREE_CHAIN (parms
);
316 /* Don't bother with typenames for a partial instantiation. */
317 if (vec_safe_is_empty (typenames
) || uses_template_parms (args
))
320 FOR_EACH_VEC_SAFE_ELT (typenames
, i
, t
)
323 pp_separate_with_semicolon (pp
);
324 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
325 pp_cxx_whitespace (pp
);
327 pp_cxx_whitespace (pp
);
328 push_deferring_access_checks (dk_no_check
);
329 t
= tsubst (t
, args
, tf_none
, NULL_TREE
);
330 pop_deferring_access_checks ();
331 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
332 pp_simple_type_specifier doesn't know about it. */
333 t
= strip_typedefs (t
);
334 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
338 /* Dump a human-readable equivalent of the alias template
339 specialization of T. */
342 dump_alias_template_specialization (cxx_pretty_printer
*pp
, tree t
, int flags
)
346 gcc_assert (alias_template_specialization_p (t
));
348 if (!(flags
& TFF_UNQUALIFIED_NAME
))
349 dump_scope (pp
, CP_DECL_CONTEXT (TYPE_NAME (t
)), flags
);
350 name
= TYPE_IDENTIFIER (t
);
351 pp_cxx_tree_identifier (pp
, name
);
352 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
354 flags
& ~TFF_TEMPLATE_HEADER
);
357 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
361 dump_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
366 /* Don't print e.g. "struct mytypedef". */
367 if (TYPE_P (t
) && typedef_variant_p (t
))
369 tree decl
= TYPE_NAME (t
);
370 if ((flags
& TFF_CHASE_TYPEDEF
)
371 || DECL_SELF_REFERENCE_P (decl
)
372 || (!flag_pretty_templates
373 && DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)))
374 t
= strip_typedefs (t
);
375 else if (alias_template_specialization_p (t
))
377 dump_alias_template_specialization (pp
, t
, flags
);
380 else if (same_type_p (t
, TREE_TYPE (decl
)))
384 pp_cxx_cv_qualifier_seq (pp
, t
);
385 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
390 if (TYPE_PTRMEMFUNC_P (t
))
393 switch (TREE_CODE (t
))
396 if (t
== init_list_type_node
)
397 pp_string (pp
, M_("<brace-enclosed initializer list>"));
398 else if (t
== unknown_type_node
)
399 pp_string (pp
, M_("<unresolved overloaded function type>"));
402 pp_cxx_cv_qualifier_seq (pp
, t
);
403 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
408 /* A list of function parms. */
409 dump_parameters (pp
, t
, flags
);
412 case IDENTIFIER_NODE
:
413 pp_cxx_tree_identifier (pp
, t
);
417 dump_type (pp
, BINFO_TYPE (t
), flags
);
423 dump_aggr_type (pp
, t
, flags
);
427 if (flags
& TFF_CHASE_TYPEDEF
)
429 dump_type (pp
, DECL_ORIGINAL_TYPE (t
)
430 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
433 /* Else fall through. */
437 dump_decl (pp
, t
, flags
& ~TFF_DECL_SPECIFIERS
);
446 case FIXED_POINT_TYPE
:
447 pp_type_specifier_seq (pp
, t
);
450 case TEMPLATE_TEMPLATE_PARM
:
451 /* For parameters inside template signature. */
452 if (TYPE_IDENTIFIER (t
))
453 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
455 pp_cxx_canonical_template_parameter (pp
, t
);
458 case BOUND_TEMPLATE_TEMPLATE_PARM
:
460 tree args
= TYPE_TI_ARGS (t
);
461 pp_cxx_cv_qualifier_seq (pp
, t
);
462 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
463 pp_cxx_begin_template_argument_list (pp
);
464 dump_template_argument_list (pp
, args
, flags
);
465 pp_cxx_end_template_argument_list (pp
);
469 case TEMPLATE_TYPE_PARM
:
470 pp_cxx_cv_qualifier_seq (pp
, t
);
471 if (TYPE_IDENTIFIER (t
))
472 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
474 pp_cxx_canonical_template_parameter
475 (pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
478 /* This is not always necessary for pointers and such, but doing this
479 reduces code size. */
488 dump_type_prefix (pp
, t
, flags
);
489 dump_type_suffix (pp
, t
, flags
);
493 if (! (flags
& TFF_CHASE_TYPEDEF
)
494 && DECL_ORIGINAL_TYPE (TYPE_NAME (t
)))
496 dump_decl (pp
, TYPE_NAME (t
), TFF_PLAIN_IDENTIFIER
);
499 pp_cxx_cv_qualifier_seq (pp
, t
);
500 pp_cxx_ws_string (pp
,
501 TYPENAME_IS_ENUM_P (t
) ? "enum"
502 : TYPENAME_IS_CLASS_P (t
) ? "class"
504 dump_typename (pp
, t
, flags
);
507 case UNBOUND_CLASS_TEMPLATE
:
508 if (! (flags
& TFF_UNQUALIFIED_NAME
))
510 dump_type (pp
, TYPE_CONTEXT (t
), flags
);
511 pp_cxx_colon_colon (pp
);
513 pp_cxx_ws_string (pp
, "template");
514 dump_type (pp
, DECL_NAME (TYPE_NAME (t
)), flags
);
518 pp_cxx_ws_string (pp
, "__typeof__");
519 pp_cxx_whitespace (pp
);
520 pp_cxx_left_paren (pp
);
521 dump_expr (pp
, TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
522 pp_cxx_right_paren (pp
);
525 case UNDERLYING_TYPE
:
526 pp_cxx_ws_string (pp
, "__underlying_type");
527 pp_cxx_whitespace (pp
);
528 pp_cxx_left_paren (pp
);
529 dump_expr (pp
, UNDERLYING_TYPE_TYPE (t
), flags
& ~TFF_EXPR_IN_PARENS
);
530 pp_cxx_right_paren (pp
);
533 case TYPE_PACK_EXPANSION
:
534 dump_type (pp
, PACK_EXPANSION_PATTERN (t
), flags
);
535 pp_cxx_ws_string (pp
, "...");
538 case TYPE_ARGUMENT_PACK
:
539 dump_template_argument (pp
, t
, flags
);
543 pp_cxx_ws_string (pp
, "decltype");
544 pp_cxx_whitespace (pp
);
545 pp_cxx_left_paren (pp
);
546 dump_expr (pp
, DECLTYPE_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
547 pp_cxx_right_paren (pp
);
551 pp_string (pp
, "std::nullptr_t");
555 pp_unsupported_tree (pp
, t
);
556 /* Fall through to error. */
559 pp_string (pp
, M_("<type error>"));
564 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
568 dump_typename (cxx_pretty_printer
*pp
, tree t
, int flags
)
570 tree ctx
= TYPE_CONTEXT (t
);
572 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
573 dump_typename (pp
, ctx
, flags
);
575 dump_type (pp
, ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
576 pp_cxx_colon_colon (pp
);
577 dump_decl (pp
, TYPENAME_TYPE_FULLNAME (t
), flags
);
580 /* Return the name of the supplied aggregate, or enumeral type. */
583 class_key_or_enum_as_string (tree t
)
585 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
587 if (SCOPED_ENUM_P (t
))
592 else if (TREE_CODE (t
) == UNION_TYPE
)
594 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
600 /* Print out a class declaration T under the control of FLAGS,
601 in the form `class foo'. */
604 dump_aggr_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
607 const char *variety
= class_key_or_enum_as_string (t
);
611 pp_cxx_cv_qualifier_seq (pp
, t
);
613 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
614 pp_cxx_ws_string (pp
, variety
);
616 name
= TYPE_NAME (t
);
620 typdef
= (!DECL_ARTIFICIAL (name
)
621 /* An alias specialization is not considered to be a
623 && !alias_template_specialization_p (t
));
626 && ((flags
& TFF_CHASE_TYPEDEF
)
627 || (!flag_pretty_templates
&& DECL_LANG_SPECIFIC (name
)
628 && DECL_TEMPLATE_INFO (name
))))
629 || DECL_SELF_REFERENCE_P (name
))
631 t
= TYPE_MAIN_VARIANT (t
);
632 name
= TYPE_NAME (t
);
636 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
637 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
638 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
639 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
641 if (! (flags
& TFF_UNQUALIFIED_NAME
))
642 dump_scope (pp
, CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
643 flags
&= ~TFF_UNQUALIFIED_NAME
;
646 /* Because the template names are mangled, we have to locate
647 the most general template, and use that name. */
648 tree tpl
= TYPE_TI_TEMPLATE (t
);
650 while (DECL_TEMPLATE_INFO (tpl
))
651 tpl
= DECL_TI_TEMPLATE (tpl
);
654 name
= DECL_NAME (name
);
657 if (name
== 0 || ANON_AGGRNAME_P (name
))
659 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
660 pp_string (pp
, M_("<anonymous>"));
662 pp_printf (pp
, M_("<anonymous %s>"), variety
);
664 else if (LAMBDA_TYPE_P (t
))
666 /* A lambda's "type" is essentially its signature. */
667 pp_string (pp
, M_("<lambda"));
668 if (lambda_function (t
))
670 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t
)),
675 pp_cxx_tree_identifier (pp
, name
);
677 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
678 !CLASSTYPE_USE_TEMPLATE (t
),
679 flags
& ~TFF_TEMPLATE_HEADER
);
682 /* Dump into the obstack the initial part of the output for a given type.
683 This is necessary when dealing with things like functions returning
686 return type of `int (* fee ())()': pointer -> function -> int. Both
687 pointer (and reference and offset) and function (and member) types must
688 deal with prefix and suffix.
690 Arrays must also do this for DECL nodes, like int a[], and for things like
694 dump_type_prefix (cxx_pretty_printer
*pp
, tree t
, int flags
)
696 if (TYPE_PTRMEMFUNC_P (t
))
698 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
702 switch (TREE_CODE (t
))
707 tree sub
= TREE_TYPE (t
);
709 dump_type_prefix (pp
, sub
, flags
);
710 if (TREE_CODE (sub
) == ARRAY_TYPE
711 || TREE_CODE (sub
) == FUNCTION_TYPE
)
713 pp_cxx_whitespace (pp
);
714 pp_cxx_left_paren (pp
);
715 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (sub
));
719 else if (TREE_CODE (t
) == REFERENCE_TYPE
)
721 if (TYPE_REF_IS_RVALUE (t
))
722 pp_ampersand_ampersand (pp
);
726 pp
->padding
= pp_before
;
727 pp_cxx_cv_qualifier_seq (pp
, t
);
733 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
734 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
737 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
738 pp_cxx_left_paren (pp
);
739 dump_type (pp
, TYPE_OFFSET_BASETYPE (t
), flags
);
740 pp_cxx_colon_colon (pp
);
743 pp_cxx_cv_qualifier_seq (pp
, t
);
744 pp
->padding
= pp_before
;
747 /* This can be reached without a pointer when dealing with
748 templates, e.g. std::is_function. */
750 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
754 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
756 pp_cxx_left_paren (pp
);
757 dump_aggr_type (pp
, TYPE_METHOD_BASETYPE (t
), flags
);
758 pp_cxx_colon_colon (pp
);
762 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
766 case IDENTIFIER_NODE
:
771 case TEMPLATE_TYPE_PARM
:
772 case TEMPLATE_TEMPLATE_PARM
:
773 case BOUND_TEMPLATE_TEMPLATE_PARM
:
784 case UNDERLYING_TYPE
:
786 case TYPE_PACK_EXPANSION
:
787 case FIXED_POINT_TYPE
:
789 dump_type (pp
, t
, flags
);
790 pp
->padding
= pp_before
;
794 pp_unsupported_tree (pp
, t
);
797 pp_string (pp
, M_("<typeprefixerror>"));
802 /* Dump the suffix of type T, under control of FLAGS. This is the part
803 which appears after the identifier (or function parms). */
806 dump_type_suffix (cxx_pretty_printer
*pp
, tree t
, int flags
)
808 if (TYPE_PTRMEMFUNC_P (t
))
809 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
811 switch (TREE_CODE (t
))
816 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
817 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
818 pp_cxx_right_paren (pp
);
819 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
826 if (TREE_CODE (t
) == METHOD_TYPE
)
827 /* Can only be reached through a pointer. */
828 pp_cxx_right_paren (pp
);
829 arg
= TYPE_ARG_TYPES (t
);
830 if (TREE_CODE (t
) == METHOD_TYPE
)
831 arg
= TREE_CHAIN (arg
);
833 /* Function pointers don't have default args. Not in standard C++,
834 anyway; they may in g++, but we'll just pretend otherwise. */
835 dump_parameters (pp
, arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
837 pp
->padding
= pp_before
;
838 pp_cxx_cv_qualifiers (pp
, type_memfn_quals (t
));
839 dump_ref_qualifier (pp
, t
, flags
);
840 dump_exception_spec (pp
, TYPE_RAISES_EXCEPTIONS (t
), flags
);
841 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
847 pp_cxx_left_bracket (pp
);
850 tree dtype
= TYPE_DOMAIN (t
);
851 tree max
= TYPE_MAX_VALUE (dtype
);
852 if (integer_all_onesp (max
))
853 pp_character (pp
, '0');
854 else if (host_integerp (max
, 0))
855 pp_wide_integer (pp
, tree_low_cst (max
, 0) + 1);
859 if (TREE_CODE (max
) == SAVE_EXPR
)
860 max
= TREE_OPERAND (max
, 0);
861 if (TREE_CODE (max
) == MINUS_EXPR
862 || TREE_CODE (max
) == PLUS_EXPR
)
864 max
= TREE_OPERAND (max
, 0);
865 while (CONVERT_EXPR_P (max
))
866 max
= TREE_OPERAND (max
, 0);
869 max
= fold_build2_loc (input_location
,
870 PLUS_EXPR
, dtype
, max
,
871 build_int_cst (dtype
, 1));
872 dump_expr (pp
, max
, flags
& ~TFF_EXPR_IN_PARENS
);
875 pp_cxx_right_bracket (pp
);
876 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
880 case IDENTIFIER_NODE
:
885 case TEMPLATE_TYPE_PARM
:
886 case TEMPLATE_TEMPLATE_PARM
:
887 case BOUND_TEMPLATE_TEMPLATE_PARM
:
898 case UNDERLYING_TYPE
:
900 case TYPE_PACK_EXPANSION
:
901 case FIXED_POINT_TYPE
:
906 pp_unsupported_tree (pp
, t
);
908 /* Don't mark it here, we should have already done in
915 dump_global_iord (cxx_pretty_printer
*pp
, tree t
)
917 const char *p
= NULL
;
919 if (DECL_GLOBAL_CTOR_P (t
))
920 p
= M_("(static initializers for %s)");
921 else if (DECL_GLOBAL_DTOR_P (t
))
922 p
= M_("(static destructors for %s)");
926 pp_printf (pp
, p
, input_filename
);
930 dump_simple_decl (cxx_pretty_printer
*pp
, tree t
, tree type
, int flags
)
932 if (flags
& TFF_DECL_SPECIFIERS
)
935 && DECL_DECLARED_CONSTEXPR_P (t
))
936 pp_cxx_ws_string (pp
, "constexpr");
937 dump_type_prefix (pp
, type
, flags
& ~TFF_UNQUALIFIED_NAME
);
940 if (! (flags
& TFF_UNQUALIFIED_NAME
)
941 && TREE_CODE (t
) != PARM_DECL
942 && (!DECL_INITIAL (t
)
943 || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
))
944 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
945 flags
&= ~TFF_UNQUALIFIED_NAME
;
946 if ((flags
& TFF_DECL_SPECIFIERS
)
947 && DECL_TEMPLATE_PARM_P (t
)
948 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t
)))
949 pp_string (pp
, "...");
952 if (TREE_CODE (t
) == FIELD_DECL
&& DECL_NORMAL_CAPTURE_P (t
))
955 pp_string (pp
, IDENTIFIER_POINTER (DECL_NAME (t
)) + 2);
956 pp_string (pp
, " capture>");
959 dump_decl (pp
, DECL_NAME (t
), flags
);
962 pp_string (pp
, M_("<anonymous>"));
963 if (flags
& TFF_DECL_SPECIFIERS
)
964 dump_type_suffix (pp
, type
, flags
);
967 /* Dump a human readable string for the decl T under control of FLAGS. */
970 dump_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
975 /* If doing Objective-C++, give Objective-C a chance to demangle
976 Objective-C method names. */
977 if (c_dialect_objc ())
979 const char *demangled
= objc_maybe_printable_name (t
, flags
);
982 pp_string (pp
, demangled
);
987 switch (TREE_CODE (t
))
990 /* Don't say 'typedef class A' */
991 if (DECL_ARTIFICIAL (t
) && !DECL_SELF_REFERENCE_P (t
))
993 if ((flags
& TFF_DECL_SPECIFIERS
)
994 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
996 /* Say `class T' not just `T'. */
997 pp_cxx_ws_string (pp
, "class");
999 /* Emit the `...' for a parameter pack. */
1000 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1001 pp_cxx_ws_string (pp
, "...");
1004 dump_type (pp
, TREE_TYPE (t
), flags
);
1007 if (TYPE_DECL_ALIAS_P (t
)
1008 && (flags
& TFF_DECL_SPECIFIERS
1009 || flags
& TFF_CLASS_KEY_OR_ENUM
))
1011 pp_cxx_ws_string (pp
, "using");
1012 dump_decl (pp
, DECL_NAME (t
), flags
);
1013 pp_cxx_whitespace (pp
);
1014 pp_cxx_ws_string (pp
, "=");
1015 pp_cxx_whitespace (pp
);
1016 dump_type (pp
, DECL_ORIGINAL_TYPE (t
), flags
);
1019 if ((flags
& TFF_DECL_SPECIFIERS
)
1020 && !DECL_SELF_REFERENCE_P (t
))
1021 pp_cxx_ws_string (pp
, "typedef");
1022 dump_simple_decl (pp
, t
, DECL_ORIGINAL_TYPE (t
)
1023 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
1028 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
1030 pp_string (pp
, M_("vtable for "));
1031 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
1032 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1035 /* Else fall through. */
1038 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1042 pp_string (pp
, M_("<return value> "));
1043 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1046 case NAMESPACE_DECL
:
1047 if (flags
& TFF_DECL_SPECIFIERS
)
1048 pp
->declaration (t
);
1051 if (! (flags
& TFF_UNQUALIFIED_NAME
))
1052 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1053 flags
&= ~TFF_UNQUALIFIED_NAME
;
1054 if (DECL_NAME (t
) == NULL_TREE
)
1056 if (!(pp
->flags
& pp_c_flag_gnu_v3
))
1057 pp_cxx_ws_string (pp
, M_("{anonymous}"));
1059 pp_cxx_ws_string (pp
, M_("(anonymous namespace)"));
1062 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1067 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1068 pp_colon_colon (pp
);
1069 dump_decl (pp
, TREE_OPERAND (t
, 1), TFF_UNQUALIFIED_NAME
);
1073 dump_decl (pp
, TREE_OPERAND (t
, 0), flags
);
1074 pp_cxx_left_bracket (pp
);
1075 dump_decl (pp
, TREE_OPERAND (t
, 1), flags
);
1076 pp_cxx_right_bracket (pp
);
1079 case ARRAY_NOTATION_REF
:
1080 dump_decl (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
1081 pp_cxx_left_bracket (pp
);
1082 dump_decl (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
1084 dump_decl (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
1086 dump_decl (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
1087 pp_cxx_right_bracket (pp
);
1090 /* So that we can do dump_decl on an aggr type. */
1094 dump_type (pp
, t
, flags
);
1098 /* This is a pseudo destructor call which has not been folded into
1099 a PSEUDO_DTOR_EXPR yet. */
1100 pp_cxx_complement (pp
);
1101 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1108 /* These special cases are duplicated here so that other functions
1109 can feed identifiers to error and get them demangled properly. */
1110 case IDENTIFIER_NODE
:
1111 if (IDENTIFIER_TYPENAME_P (t
))
1113 pp_cxx_ws_string (pp
, "operator");
1114 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1115 dump_type (pp
, TREE_TYPE (t
), flags
);
1119 pp_cxx_tree_identifier (pp
, t
);
1125 t
= OVL_CURRENT (t
);
1126 if (DECL_CLASS_SCOPE_P (t
))
1128 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1129 pp_cxx_colon_colon (pp
);
1131 else if (!DECL_FILE_SCOPE_P (t
))
1133 dump_decl (pp
, DECL_CONTEXT (t
), flags
);
1134 pp_cxx_colon_colon (pp
);
1136 dump_decl (pp
, DECL_NAME (t
), flags
);
1140 /* If there's only one function, just treat it like an ordinary
1142 t
= OVL_CURRENT (t
);
1146 if (! DECL_LANG_SPECIFIC (t
))
1147 pp_string (pp
, M_("<built-in>"));
1148 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
1149 dump_global_iord (pp
, t
);
1151 dump_function_decl (pp
, t
, flags
);
1155 dump_template_decl (pp
, t
, flags
);
1158 case TEMPLATE_ID_EXPR
:
1160 tree name
= TREE_OPERAND (t
, 0);
1161 tree args
= TREE_OPERAND (t
, 1);
1163 if (is_overloaded_fn (name
))
1164 name
= DECL_NAME (get_first_fn (name
));
1165 dump_decl (pp
, name
, flags
);
1166 pp_cxx_begin_template_argument_list (pp
);
1167 if (args
== error_mark_node
)
1168 pp_string (pp
, M_("<template arguments error>"));
1170 dump_template_argument_list (pp
, args
, flags
);
1171 pp_cxx_end_template_argument_list (pp
);
1176 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1180 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
1181 || (DECL_INITIAL (t
) &&
1182 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
1183 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1184 else if (DECL_NAME (t
))
1185 dump_decl (pp
, DECL_NAME (t
), flags
);
1186 else if (DECL_INITIAL (t
))
1187 dump_expr (pp
, DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
1189 pp_string (pp
, M_("<enumerator>"));
1193 pp_cxx_ws_string (pp
, "using");
1194 dump_type (pp
, USING_DECL_SCOPE (t
), flags
);
1195 pp_cxx_colon_colon (pp
);
1196 dump_decl (pp
, DECL_NAME (t
), flags
);
1200 pp
->declaration (t
);
1204 dump_decl (pp
, BASELINK_FUNCTIONS (t
), flags
);
1207 case NON_DEPENDENT_EXPR
:
1208 dump_expr (pp
, t
, flags
);
1211 case TEMPLATE_TYPE_PARM
:
1212 if (flags
& TFF_DECL_SPECIFIERS
)
1213 pp
->declaration (t
);
1218 case UNBOUND_CLASS_TEMPLATE
:
1219 case TYPE_PACK_EXPANSION
:
1221 dump_type (pp
, t
, flags
);
1225 pp_unsupported_tree (pp
, t
);
1226 /* Fall through to error. */
1229 pp_string (pp
, M_("<declaration error>"));
1234 /* Dump a template declaration T under control of FLAGS. This means the
1235 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1238 dump_template_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1240 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1244 if (flags
& TFF_TEMPLATE_HEADER
)
1246 for (parms
= orig_parms
= nreverse (orig_parms
);
1248 parms
= TREE_CHAIN (parms
))
1250 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1251 int len
= TREE_VEC_LENGTH (inner_parms
);
1253 pp_cxx_ws_string (pp
, "template");
1254 pp_cxx_begin_template_argument_list (pp
);
1256 /* If we've shown the template prefix, we'd better show the
1257 parameters' and decl's type too. */
1258 flags
|= TFF_DECL_SPECIFIERS
;
1260 for (i
= 0; i
< len
; i
++)
1263 pp_separate_with_comma (pp
);
1264 dump_template_parameter (pp
, TREE_VEC_ELT (inner_parms
, i
),
1267 pp_cxx_end_template_argument_list (pp
);
1268 pp_cxx_whitespace (pp
);
1270 nreverse(orig_parms
);
1272 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1274 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1275 pp_cxx_ws_string (pp
, "class");
1277 /* If this is a parameter pack, print the ellipsis. */
1278 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1279 pp_cxx_ws_string (pp
, "...");
1283 if (DECL_CLASS_TEMPLATE_P (t
))
1284 dump_type (pp
, TREE_TYPE (t
),
1285 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1286 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1287 else if (DECL_TEMPLATE_RESULT (t
)
1288 && (VAR_P (DECL_TEMPLATE_RESULT (t
))
1289 /* Alias template. */
1290 || DECL_TYPE_TEMPLATE_P (t
)))
1291 dump_decl (pp
, DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1294 gcc_assert (TREE_TYPE (t
));
1295 switch (NEXT_CODE (t
))
1299 dump_function_decl (pp
, t
, flags
| TFF_TEMPLATE_NAME
);
1302 /* This case can occur with some invalid code. */
1303 dump_type (pp
, TREE_TYPE (t
),
1304 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1305 | (flags
& TFF_DECL_SPECIFIERS
1306 ? TFF_CLASS_KEY_OR_ENUM
: 0));
1311 /* find_typenames looks through the type of the function template T
1312 and returns a vec containing any typedefs, decltypes or TYPENAME_TYPEs
1315 struct find_typenames_t
1317 struct pointer_set_t
*p_set
;
1318 vec
<tree
, va_gc
> *typenames
;
1322 find_typenames_r (tree
*tp
, int *walk_subtrees
, void *data
)
1324 struct find_typenames_t
*d
= (struct find_typenames_t
*)data
;
1325 tree mv
= NULL_TREE
;
1327 if (TYPE_P (*tp
) && is_typedef_decl (TYPE_NAME (*tp
)))
1328 /* Add the type of the typedef without any additional cv-quals. */
1329 mv
= TREE_TYPE (TYPE_NAME (*tp
));
1330 else if (TREE_CODE (*tp
) == TYPENAME_TYPE
1331 || TREE_CODE (*tp
) == DECLTYPE_TYPE
)
1332 /* Add the typename without any cv-qualifiers. */
1333 mv
= TYPE_MAIN_VARIANT (*tp
);
1335 if (TREE_CODE (*tp
) == TYPE_PACK_EXPANSION
)
1337 /* Don't mess with parameter packs since we don't remember
1338 the pack expansion context for a particular typename. */
1339 *walk_subtrees
= false;
1343 if (mv
&& (mv
== *tp
|| !pointer_set_insert (d
->p_set
, mv
)))
1344 vec_safe_push (d
->typenames
, mv
);
1346 /* Search into class template arguments, which cp_walk_subtrees
1348 if (CLASS_TYPE_P (*tp
) && CLASSTYPE_TEMPLATE_INFO (*tp
))
1349 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp
), find_typenames_r
,
1355 static vec
<tree
, va_gc
> *
1356 find_typenames (tree t
)
1358 struct find_typenames_t ft
;
1359 ft
.p_set
= pointer_set_create ();
1360 ft
.typenames
= NULL
;
1361 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t
)),
1362 find_typenames_r
, &ft
, ft
.p_set
);
1363 pointer_set_destroy (ft
.p_set
);
1364 return ft
.typenames
;
1367 /* Output the "[with ...]" clause for a template instantiation T iff
1368 TEMPLATE_PARMS, TEMPLATE_ARGS and FLAGS are suitable. T may be NULL if
1369 formatting a deduction/substitution diagnostic rather than an
1373 dump_substitution (cxx_pretty_printer
*pp
,
1374 tree t
, tree template_parms
, tree template_args
,
1377 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
1378 && !(flags
& TFF_NO_TEMPLATE_BINDINGS
))
1380 vec
<tree
, va_gc
> *typenames
= t
? find_typenames (t
) : NULL
;
1381 pp_cxx_whitespace (pp
);
1382 pp_cxx_left_bracket (pp
);
1383 pp
->translate_string ("with");
1384 pp_cxx_whitespace (pp
);
1385 dump_template_bindings (pp
, template_parms
, template_args
, typenames
);
1386 pp_cxx_right_bracket (pp
);
1390 /* Dump the lambda function FN including its 'mutable' qualifier and any
1391 template bindings. */
1394 dump_lambda_function (cxx_pretty_printer
*pp
,
1395 tree fn
, tree template_parms
, tree template_args
,
1398 /* A lambda's signature is essentially its "type". */
1399 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1400 if (!(TYPE_QUALS (class_of_this_parm (TREE_TYPE (fn
))) & TYPE_QUAL_CONST
))
1402 pp
->padding
= pp_before
;
1403 pp_c_ws_string (pp
, "mutable");
1405 dump_substitution (pp
, fn
, template_parms
, template_args
, flags
);
1408 /* Pretty print a function decl. There are several ways we want to print a
1409 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1410 As error can only apply the '#' flag once to give 0 and 1 for V, there
1411 is %D which doesn't print the throw specs, and %F which does. */
1414 dump_function_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1418 tree cname
= NULL_TREE
;
1419 tree template_args
= NULL_TREE
;
1420 tree template_parms
= NULL_TREE
;
1421 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1422 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1425 flags
&= ~(TFF_UNQUALIFIED_NAME
| TFF_TEMPLATE_NAME
);
1426 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1427 t
= DECL_TEMPLATE_RESULT (t
);
1429 /* Save the exceptions, in case t is a specialization and we are
1430 emitting an error about incompatible specifications. */
1431 exceptions
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t
));
1433 /* Pretty print template instantiations only. */
1434 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
)
1435 && flag_pretty_templates
)
1439 template_args
= DECL_TI_ARGS (t
);
1440 tmpl
= most_general_template (t
);
1441 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1443 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1448 if (DECL_NAME (t
) && LAMBDA_FUNCTION_P (t
))
1449 return dump_lambda_function (pp
, t
, template_parms
, template_args
, flags
);
1451 fntype
= TREE_TYPE (t
);
1452 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1454 if (DECL_CLASS_SCOPE_P (t
))
1455 cname
= DECL_CONTEXT (t
);
1456 /* This is for partially instantiated template methods. */
1457 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1458 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1460 if (flags
& TFF_DECL_SPECIFIERS
)
1462 if (DECL_STATIC_FUNCTION_P (t
))
1463 pp_cxx_ws_string (pp
, "static");
1464 else if (DECL_VIRTUAL_P (t
))
1465 pp_cxx_ws_string (pp
, "virtual");
1467 if (DECL_DECLARED_CONSTEXPR_P (STRIP_TEMPLATE (t
)))
1468 pp_cxx_ws_string (pp
, "constexpr");
1471 /* Print the return type? */
1473 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1474 && !DECL_DESTRUCTOR_P (t
);
1477 tree ret
= fndecl_declared_return_type (t
);
1478 dump_type_prefix (pp
, ret
, flags
);
1481 /* Print the function name. */
1482 if (!do_outer_scope
)
1486 dump_type (pp
, cname
, flags
);
1487 pp_cxx_colon_colon (pp
);
1490 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1492 dump_function_name (pp
, t
, flags
);
1494 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1496 dump_parameters (pp
, parmtypes
, flags
);
1498 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1500 pp
->padding
= pp_before
;
1501 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (fntype
));
1502 dump_ref_qualifier (pp
, fntype
, flags
);
1505 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1507 pp
->padding
= pp_before
;
1508 dump_exception_spec (pp
, exceptions
, flags
);
1512 dump_type_suffix (pp
, TREE_TYPE (fntype
), flags
);
1514 dump_substitution (pp
, t
, template_parms
, template_args
, flags
);
1516 else if (template_args
)
1518 bool need_comma
= false;
1520 pp_cxx_begin_template_argument_list (pp
);
1521 template_args
= INNERMOST_TEMPLATE_ARGS (template_args
);
1522 for (i
= 0; i
< TREE_VEC_LENGTH (template_args
); ++i
)
1524 tree arg
= TREE_VEC_ELT (template_args
, i
);
1526 pp_separate_with_comma (pp
);
1527 if (ARGUMENT_PACK_P (arg
))
1528 pp_cxx_left_brace (pp
);
1529 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
1530 if (ARGUMENT_PACK_P (arg
))
1531 pp_cxx_right_brace (pp
);
1534 pp_cxx_end_template_argument_list (pp
);
1538 /* Print a parameter list. If this is for a member function, the
1539 member object ptr (and any other hidden args) should have
1540 already been removed. */
1543 dump_parameters (cxx_pretty_printer
*pp
, tree parmtypes
, int flags
)
1546 flags
&= ~TFF_SCOPE
;
1547 pp_cxx_left_paren (pp
);
1549 for (first
= 1; parmtypes
!= void_list_node
;
1550 parmtypes
= TREE_CHAIN (parmtypes
))
1553 pp_separate_with_comma (pp
);
1557 pp_cxx_ws_string (pp
, "...");
1561 dump_type (pp
, TREE_VALUE (parmtypes
), flags
);
1563 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1565 pp_cxx_whitespace (pp
);
1567 pp_cxx_whitespace (pp
);
1568 dump_expr (pp
, TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1572 pp_cxx_right_paren (pp
);
1575 /* Print ref-qualifier of a FUNCTION_TYPE or METHOD_TYPE. FLAGS are ignored. */
1578 dump_ref_qualifier (cxx_pretty_printer
*pp
, tree t
, int flags ATTRIBUTE_UNUSED
)
1580 if (FUNCTION_REF_QUALIFIED (t
))
1582 pp
->padding
= pp_before
;
1583 if (FUNCTION_RVALUE_QUALIFIED (t
))
1584 pp_cxx_ws_string (pp
, "&&");
1586 pp_cxx_ws_string (pp
, "&");
1590 /* Print an exception specification. T is the exception specification. */
1593 dump_exception_spec (cxx_pretty_printer
*pp
, tree t
, int flags
)
1595 if (t
&& TREE_PURPOSE (t
))
1597 pp_cxx_ws_string (pp
, "noexcept");
1598 if (!integer_onep (TREE_PURPOSE (t
)))
1600 pp_cxx_whitespace (pp
);
1601 pp_cxx_left_paren (pp
);
1602 if (DEFERRED_NOEXCEPT_SPEC_P (t
))
1603 pp_cxx_ws_string (pp
, "<uninstantiated>");
1605 dump_expr (pp
, TREE_PURPOSE (t
), flags
);
1606 pp_cxx_right_paren (pp
);
1611 pp_cxx_ws_string (pp
, "throw");
1612 pp_cxx_whitespace (pp
);
1613 pp_cxx_left_paren (pp
);
1614 if (TREE_VALUE (t
) != NULL_TREE
)
1617 dump_type (pp
, TREE_VALUE (t
), flags
);
1621 pp_separate_with_comma (pp
);
1623 pp_cxx_right_paren (pp
);
1627 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1628 and destructors properly. */
1631 dump_function_name (cxx_pretty_printer
*pp
, tree t
, int flags
)
1633 tree name
= DECL_NAME (t
);
1635 /* We can get here with a decl that was synthesized by language-
1636 independent machinery (e.g. coverage.c) in which case it won't
1637 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1638 will crash. In this case it is safe just to print out the
1640 if (!DECL_LANG_SPECIFIC (t
))
1642 pp_cxx_tree_identifier (pp
, name
);
1646 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1647 t
= DECL_TEMPLATE_RESULT (t
);
1649 /* Don't let the user see __comp_ctor et al. */
1650 if (DECL_CONSTRUCTOR_P (t
)
1651 || DECL_DESTRUCTOR_P (t
))
1653 if (LAMBDA_TYPE_P (DECL_CONTEXT (t
)))
1654 name
= get_identifier ("<lambda>");
1655 else if (TYPE_ANONYMOUS_P (DECL_CONTEXT (t
)))
1656 name
= get_identifier ("<constructor>");
1658 name
= constructor_name (DECL_CONTEXT (t
));
1661 if (DECL_DESTRUCTOR_P (t
))
1663 pp_cxx_complement (pp
);
1664 dump_decl (pp
, name
, TFF_PLAIN_IDENTIFIER
);
1666 else if (DECL_CONV_FN_P (t
))
1668 /* This cannot use the hack that the operator's return
1669 type is stashed off of its name because it may be
1670 used for error reporting. In the case of conflicting
1671 declarations, both will have the same name, yet
1672 the types will be different, hence the TREE_TYPE field
1673 of the first name will be clobbered by the second. */
1674 pp_cxx_ws_string (pp
, "operator");
1675 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1677 else if (name
&& IDENTIFIER_OPNAME_P (name
))
1678 pp_cxx_tree_identifier (pp
, name
);
1679 else if (name
&& UDLIT_OPER_P (name
))
1680 pp_cxx_tree_identifier (pp
, name
);
1682 dump_decl (pp
, name
, flags
);
1684 if (DECL_TEMPLATE_INFO (t
)
1685 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1686 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1687 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1688 dump_template_parms (pp
, DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
),
1692 /* Dump the template parameters from the template info INFO under control of
1693 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1694 specialization (partial or complete). For partial specializations we show
1695 the specialized parameter values. For a primary template we show no
1699 dump_template_parms (cxx_pretty_printer
*pp
, tree info
,
1700 int primary
, int flags
)
1702 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1704 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1706 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1707 pp_cxx_begin_template_argument_list (pp
);
1709 /* Be careful only to print things when we have them, so as not
1710 to crash producing error messages. */
1711 if (args
&& !primary
)
1714 len
= get_non_default_template_args_count (args
, flags
);
1716 args
= INNERMOST_TEMPLATE_ARGS (args
);
1717 for (ix
= 0; ix
!= len
; ix
++)
1719 tree arg
= TREE_VEC_ELT (args
, ix
);
1721 /* Only print a comma if we know there is an argument coming. In
1722 the case of an empty template argument pack, no actual
1723 argument will be printed. */
1725 && (!ARGUMENT_PACK_P (arg
)
1726 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
1727 pp_separate_with_comma (pp
);
1730 pp_string (pp
, M_("<template parameter error>"));
1732 dump_template_argument (pp
, arg
, flags
);
1737 tree tpl
= TI_TEMPLATE (info
);
1738 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1741 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1742 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1744 for (ix
= 0; ix
!= len
; ix
++)
1748 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1750 pp_string (pp
, M_("<template parameter error>"));
1754 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1757 pp_separate_with_comma (pp
);
1759 dump_decl (pp
, parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1762 pp_cxx_end_template_argument_list (pp
);
1765 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1766 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1769 dump_call_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
, bool skipfirst
)
1772 call_expr_arg_iterator iter
;
1774 pp_cxx_left_paren (pp
);
1775 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1781 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1782 if (more_call_expr_args_p (&iter
))
1783 pp_separate_with_comma (pp
);
1786 pp_cxx_right_paren (pp
);
1789 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1790 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1794 dump_aggr_init_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
,
1798 aggr_init_expr_arg_iterator iter
;
1800 pp_cxx_left_paren (pp
);
1801 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1807 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1808 if (more_aggr_init_expr_args_p (&iter
))
1809 pp_separate_with_comma (pp
);
1812 pp_cxx_right_paren (pp
);
1815 /* Print out a list of initializers (subr of dump_expr). */
1818 dump_expr_list (cxx_pretty_printer
*pp
, tree l
, int flags
)
1822 dump_expr (pp
, TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1825 pp_separate_with_comma (pp
);
1829 /* Print out a vector of initializers (subr of dump_expr). */
1832 dump_expr_init_vec (cxx_pretty_printer
*pp
, vec
<constructor_elt
, va_gc
> *v
,
1835 unsigned HOST_WIDE_INT idx
;
1838 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1840 dump_expr (pp
, value
, flags
| TFF_EXPR_IN_PARENS
);
1841 if (idx
!= v
->length () - 1)
1842 pp_separate_with_comma (pp
);
1847 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1848 function. Resolve it to a close relative -- in the sense of static
1849 type -- variant being overridden. That is close to what was written in
1850 the source code. Subroutine of dump_expr. */
1853 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1855 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1856 HOST_WIDE_INT index
= tree_low_cst (OBJ_TYPE_REF_TOKEN (ref
), 1);
1857 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1860 fun
= TREE_CHAIN (fun
);
1861 index
-= (TARGET_VTABLE_USES_DESCRIPTORS
1862 ? TARGET_VTABLE_USES_DESCRIPTORS
: 1);
1868 /* Print out an expression E under control of FLAGS. */
1871 dump_expr (cxx_pretty_printer
*pp
, tree t
, int flags
)
1878 if (STATEMENT_CLASS_P (t
))
1880 pp_cxx_ws_string (pp
, M_("<statement>"));
1884 switch (TREE_CODE (t
))
1892 case NAMESPACE_DECL
:
1896 case IDENTIFIER_NODE
:
1897 dump_decl (pp
, t
, ((flags
& ~(TFF_DECL_SPECIFIERS
|TFF_RETURN_TYPE
1898 |TFF_TEMPLATE_HEADER
))
1899 | TFF_NO_FUNCTION_ARGUMENTS
));
1903 if (SSA_NAME_VAR (t
)
1904 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t
)))
1905 dump_expr (pp
, SSA_NAME_VAR (t
), flags
);
1907 pp_cxx_ws_string (pp
, M_("<unknown>"));
1917 case USERDEF_LITERAL
:
1918 pp_cxx_userdef_literal (pp
, t
);
1922 /* While waiting for caret diagnostics, avoid printing
1923 __cxa_allocate_exception, __cxa_throw, and the like. */
1924 pp_cxx_ws_string (pp
, M_("<throw-expression>"));
1929 dump_type (pp
, PTRMEM_CST_CLASS (t
), flags
);
1930 pp_cxx_colon_colon (pp
);
1931 pp_cxx_tree_identifier (pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1935 pp_cxx_left_paren (pp
);
1936 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1937 pp_separate_with_comma (pp
);
1938 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1939 pp_cxx_right_paren (pp
);
1943 pp_cxx_left_paren (pp
);
1944 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1945 pp_string (pp
, " ? ");
1946 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1947 pp_string (pp
, " : ");
1948 dump_expr (pp
, TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
1949 pp_cxx_right_paren (pp
);
1953 if (TREE_HAS_CONSTRUCTOR (t
))
1955 pp_cxx_ws_string (pp
, "new");
1956 pp_cxx_whitespace (pp
);
1957 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1960 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1963 case AGGR_INIT_EXPR
:
1965 tree fn
= NULL_TREE
;
1967 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
1968 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
1970 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
1972 if (DECL_CONSTRUCTOR_P (fn
))
1973 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1975 dump_decl (pp
, fn
, 0);
1978 dump_expr (pp
, AGGR_INIT_EXPR_FN (t
), 0);
1980 dump_aggr_init_expr_args (pp
, t
, flags
, true);
1985 tree fn
= CALL_EXPR_FN (t
);
1986 bool skipfirst
= false;
1988 if (TREE_CODE (fn
) == ADDR_EXPR
)
1989 fn
= TREE_OPERAND (fn
, 0);
1991 /* Nobody is interested in seeing the guts of vcalls. */
1992 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
1993 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
1995 if (TREE_TYPE (fn
) != NULL_TREE
1996 && NEXT_CODE (fn
) == METHOD_TYPE
1997 && call_expr_nargs (t
))
1999 tree ob
= CALL_EXPR_ARG (t
, 0);
2000 if (TREE_CODE (ob
) == ADDR_EXPR
)
2002 dump_expr (pp
, TREE_OPERAND (ob
, 0),
2003 flags
| TFF_EXPR_IN_PARENS
);
2006 else if (TREE_CODE (ob
) != PARM_DECL
2007 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
2009 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2014 if (flag_sanitize
& SANITIZE_UNDEFINED
2015 && is_ubsan_builtin_p (fn
))
2017 pp_string (cxx_pp
, M_("<ubsan routine call>"));
2020 dump_expr (pp
, fn
, flags
| TFF_EXPR_IN_PARENS
);
2021 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2026 /* Note that this only works for G++ target exprs. If somebody
2027 builds a general TARGET_EXPR, there's no way to represent that
2028 it initializes anything other that the parameter slot for the
2029 default argument. Note we may have cleared out the first
2030 operand in expand_expr, so don't go killing ourselves. */
2031 if (TREE_OPERAND (t
, 1))
2032 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2035 case POINTER_PLUS_EXPR
:
2036 dump_binary_op (pp
, "+", t
, flags
);
2041 dump_binary_op (pp
, assignment_operator_name_info
[NOP_EXPR
].name
,
2048 case TRUNC_DIV_EXPR
:
2049 case TRUNC_MOD_EXPR
:
2057 case TRUTH_ANDIF_EXPR
:
2058 case TRUTH_ORIF_EXPR
:
2065 case EXACT_DIV_EXPR
:
2066 dump_binary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2070 case FLOOR_DIV_EXPR
:
2071 case ROUND_DIV_EXPR
:
2073 dump_binary_op (pp
, "/", t
, flags
);
2077 case FLOOR_MOD_EXPR
:
2078 case ROUND_MOD_EXPR
:
2079 dump_binary_op (pp
, "%", t
, flags
);
2084 tree ob
= TREE_OPERAND (t
, 0);
2085 if (INDIRECT_REF_P (ob
))
2087 ob
= TREE_OPERAND (ob
, 0);
2088 if (TREE_CODE (ob
) != PARM_DECL
2090 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
2092 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2093 if (TREE_CODE (TREE_TYPE (ob
)) == REFERENCE_TYPE
)
2101 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2104 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
2109 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2110 pp_cxx_left_bracket (pp
);
2111 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2112 pp_cxx_right_bracket (pp
);
2115 case ARRAY_NOTATION_REF
:
2116 dump_expr (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
2117 pp_cxx_left_bracket (pp
);
2118 dump_expr (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
2120 dump_expr (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
2122 dump_expr (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
2123 pp_cxx_right_bracket (pp
);
2126 case UNARY_PLUS_EXPR
:
2127 dump_unary_op (pp
, "+", t
, flags
);
2131 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
2132 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
2133 /* An ADDR_EXPR can have reference type. In that case, we
2134 shouldn't print the `&' doing so indicates to the user
2135 that the expression has pointer type. */
2137 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
2138 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2139 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
2140 dump_unary_op (pp
, "&&", t
, flags
);
2142 dump_unary_op (pp
, "&", t
, flags
);
2146 if (TREE_HAS_CONSTRUCTOR (t
))
2148 t
= TREE_OPERAND (t
, 0);
2149 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
2150 dump_expr (pp
, CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
2151 dump_call_expr_args (pp
, t
, flags
, true);
2155 if (TREE_OPERAND (t
,0) != NULL_TREE
2156 && TREE_TYPE (TREE_OPERAND (t
, 0))
2157 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
2158 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2160 dump_unary_op (pp
, "*", t
, flags
);
2165 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
2166 && integer_zerop (TREE_OPERAND (t
, 1)))
2167 dump_expr (pp
, TREE_OPERAND (TREE_OPERAND (t
, 0), 0), flags
);
2171 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2173 pp_cxx_left_paren (pp
);
2174 if (!integer_onep (TYPE_SIZE_UNIT
2175 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))))))
2177 pp_cxx_left_paren (pp
);
2178 dump_type (pp
, ptr_type_node
, flags
);
2179 pp_cxx_right_paren (pp
);
2182 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2183 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2185 pp_cxx_ws_string (pp
, "+");
2186 dump_expr (pp
, fold_convert (ssizetype
, TREE_OPERAND (t
, 1)),
2188 pp_cxx_right_paren (pp
);
2195 case TRUTH_NOT_EXPR
:
2196 case PREDECREMENT_EXPR
:
2197 case PREINCREMENT_EXPR
:
2198 dump_unary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2201 case POSTDECREMENT_EXPR
:
2202 case POSTINCREMENT_EXPR
:
2203 pp_cxx_left_paren (pp
);
2204 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2205 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2206 pp_cxx_right_paren (pp
);
2209 case NON_LVALUE_EXPR
:
2210 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2211 should be another level of INDIRECT_REF so that I don't have to do
2213 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
2215 tree next
= TREE_TYPE (TREE_TYPE (t
));
2217 while (TYPE_PTR_P (next
))
2218 next
= TREE_TYPE (next
);
2220 if (TREE_CODE (next
) == FUNCTION_TYPE
)
2222 if (flags
& TFF_EXPR_IN_PARENS
)
2223 pp_cxx_left_paren (pp
);
2225 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2226 if (flags
& TFF_EXPR_IN_PARENS
)
2227 pp_cxx_right_paren (pp
);
2230 /* Else fall through. */
2232 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2236 case IMPLICIT_CONV_EXPR
:
2237 case VIEW_CONVERT_EXPR
:
2239 tree op
= TREE_OPERAND (t
, 0);
2240 tree ttype
= TREE_TYPE (t
);
2241 tree optype
= TREE_TYPE (op
);
2243 if (TREE_CODE (ttype
) != TREE_CODE (optype
)
2244 && POINTER_TYPE_P (ttype
)
2245 && POINTER_TYPE_P (optype
)
2246 && same_type_p (TREE_TYPE (optype
),
2249 if (TREE_CODE (ttype
) == REFERENCE_TYPE
)
2250 dump_unary_op (pp
, "*", t
, flags
);
2252 dump_unary_op (pp
, "&", t
, flags
);
2254 else if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
2256 /* It is a cast, but we cannot tell whether it is a
2257 reinterpret or static cast. Use the C style notation. */
2258 if (flags
& TFF_EXPR_IN_PARENS
)
2259 pp_cxx_left_paren (pp
);
2260 pp_cxx_left_paren (pp
);
2261 dump_type (pp
, TREE_TYPE (t
), flags
);
2262 pp_cxx_right_paren (pp
);
2263 dump_expr (pp
, op
, flags
| TFF_EXPR_IN_PARENS
);
2264 if (flags
& TFF_EXPR_IN_PARENS
)
2265 pp_cxx_right_paren (pp
);
2268 dump_expr (pp
, op
, flags
);
2273 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
2275 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
2277 if (integer_zerop (idx
))
2279 /* A NULL pointer-to-member constant. */
2280 pp_cxx_left_paren (pp
);
2281 pp_cxx_left_paren (pp
);
2282 dump_type (pp
, TREE_TYPE (t
), flags
);
2283 pp_cxx_right_paren (pp
);
2284 pp_character (pp
, '0');
2285 pp_cxx_right_paren (pp
);
2288 else if (host_integerp (idx
, 0))
2291 unsigned HOST_WIDE_INT n
;
2293 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
2294 t
= TYPE_METHOD_BASETYPE (t
);
2295 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
2297 n
= tree_low_cst (idx
, 0);
2299 /* Map vtable index back one, to allow for the null pointer to
2303 while (n
> 0 && virtuals
)
2306 virtuals
= TREE_CHAIN (virtuals
);
2310 dump_expr (pp
, BV_FN (virtuals
),
2311 flags
| TFF_EXPR_IN_PARENS
);
2316 if (TREE_TYPE (t
) && LAMBDA_TYPE_P (TREE_TYPE (t
)))
2317 pp_string (pp
, "<lambda closure object>");
2318 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
2320 dump_type (pp
, TREE_TYPE (t
), 0);
2321 pp_cxx_left_paren (pp
);
2322 pp_cxx_right_paren (pp
);
2326 if (!BRACE_ENCLOSED_INITIALIZER_P (t
))
2327 dump_type (pp
, TREE_TYPE (t
), 0);
2328 pp_cxx_left_brace (pp
);
2329 dump_expr_init_vec (pp
, CONSTRUCTOR_ELTS (t
), flags
);
2330 pp_cxx_right_brace (pp
);
2337 tree ob
= TREE_OPERAND (t
, 0);
2338 if (is_dummy_object (ob
))
2340 t
= TREE_OPERAND (t
, 1);
2341 if (TREE_CODE (t
) == FUNCTION_DECL
)
2343 dump_expr (pp
, t
, flags
| TFF_EXPR_IN_PARENS
);
2344 else if (BASELINK_P (t
))
2345 dump_expr (pp
, OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
2346 flags
| TFF_EXPR_IN_PARENS
);
2348 dump_decl (pp
, t
, flags
);
2352 if (INDIRECT_REF_P (ob
))
2354 dump_expr (pp
, TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
2360 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2364 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2369 case TEMPLATE_PARM_INDEX
:
2370 dump_decl (pp
, TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
2374 if (TREE_OPERAND (t
, 0) == NULL_TREE
2375 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
2377 dump_type (pp
, TREE_TYPE (t
), flags
);
2378 pp_cxx_left_paren (pp
);
2379 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2380 pp_cxx_right_paren (pp
);
2384 pp_cxx_left_paren (pp
);
2385 dump_type (pp
, TREE_TYPE (t
), flags
);
2386 pp_cxx_right_paren (pp
);
2387 pp_cxx_left_paren (pp
);
2388 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2389 pp_cxx_right_paren (pp
);
2393 case STATIC_CAST_EXPR
:
2394 pp_cxx_ws_string (pp
, "static_cast");
2396 case REINTERPRET_CAST_EXPR
:
2397 pp_cxx_ws_string (pp
, "reinterpret_cast");
2399 case CONST_CAST_EXPR
:
2400 pp_cxx_ws_string (pp
, "const_cast");
2402 case DYNAMIC_CAST_EXPR
:
2403 pp_cxx_ws_string (pp
, "dynamic_cast");
2405 pp_cxx_begin_template_argument_list (pp
);
2406 dump_type (pp
, TREE_TYPE (t
), flags
);
2407 pp_cxx_end_template_argument_list (pp
);
2408 pp_cxx_left_paren (pp
);
2409 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2410 pp_cxx_right_paren (pp
);
2414 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2420 if (TREE_CODE (t
) == SIZEOF_EXPR
)
2421 pp_cxx_ws_string (pp
, "sizeof");
2424 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
2425 pp_cxx_ws_string (pp
, "__alignof__");
2427 op
= TREE_OPERAND (t
, 0);
2428 if (PACK_EXPANSION_P (op
))
2430 pp_string (pp
, "...");
2431 op
= PACK_EXPANSION_PATTERN (op
);
2433 pp_cxx_whitespace (pp
);
2434 pp_cxx_left_paren (pp
);
2435 if (TREE_CODE (t
) == SIZEOF_EXPR
&& SIZEOF_EXPR_TYPE_P (t
))
2436 dump_type (pp
, TREE_TYPE (op
), flags
);
2437 else if (TYPE_P (TREE_OPERAND (t
, 0)))
2438 dump_type (pp
, op
, flags
);
2440 dump_expr (pp
, op
, flags
);
2441 pp_cxx_right_paren (pp
);
2444 case AT_ENCODE_EXPR
:
2445 pp_cxx_ws_string (pp
, "@encode");
2446 pp_cxx_whitespace (pp
);
2447 pp_cxx_left_paren (pp
);
2448 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
2449 pp_cxx_right_paren (pp
);
2453 pp_cxx_ws_string (pp
, "noexcept");
2454 pp_cxx_whitespace (pp
);
2455 pp_cxx_left_paren (pp
);
2456 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2457 pp_cxx_right_paren (pp
);
2462 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2463 pp_cxx_whitespace (pp
);
2464 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2468 pp_string (pp
, M_("<unparsed>"));
2471 case TRY_CATCH_EXPR
:
2472 case WITH_CLEANUP_EXPR
:
2473 case CLEANUP_POINT_EXPR
:
2474 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2477 case PSEUDO_DTOR_EXPR
:
2478 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2480 if (TREE_OPERAND (t
, 1))
2482 dump_type (pp
, TREE_OPERAND (t
, 1), flags
);
2483 pp_cxx_colon_colon (pp
);
2485 pp_cxx_complement (pp
);
2486 dump_type (pp
, TREE_OPERAND (t
, 2), flags
);
2489 case TEMPLATE_ID_EXPR
:
2490 dump_decl (pp
, t
, flags
);
2496 case STATEMENT_LIST
:
2497 /* We don't yet have a way of dumping statements in a
2498 human-readable format. */
2499 pp_string (pp
, "({...})");
2503 pp_string (pp
, "while (1) { ");
2504 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2505 pp_cxx_right_brace (pp
);
2509 pp_string (pp
, "if (");
2510 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2511 pp_string (pp
, ") break; ");
2515 dump_expr (pp
, BASELINK_FUNCTIONS (t
), flags
& ~TFF_EXPR_IN_PARENS
);
2518 case EMPTY_CLASS_EXPR
:
2519 dump_type (pp
, TREE_TYPE (t
), flags
);
2520 pp_cxx_left_paren (pp
);
2521 pp_cxx_right_paren (pp
);
2524 case NON_DEPENDENT_EXPR
:
2525 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2528 case ARGUMENT_PACK_SELECT
:
2529 dump_template_argument (pp
, ARGUMENT_PACK_SELECT_FROM_PACK (t
), flags
);
2541 pp_type_specifier_seq (pp
, t
);
2545 /* We get here when we want to print a dependent type as an
2546 id-expression, without any disambiguator decoration. */
2547 pp
->id_expression (t
);
2550 case TEMPLATE_TYPE_PARM
:
2551 case TEMPLATE_TEMPLATE_PARM
:
2552 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2553 dump_type (pp
, t
, flags
);
2557 pp_cxx_trait_expression (pp
, t
);
2561 pp_cxx_va_arg_expression (pp
, t
);
2565 pp_cxx_offsetof_expression (pp
, t
);
2569 dump_decl (pp
, t
, flags
);
2572 case EXPR_PACK_EXPANSION
:
2579 case VEC_DELETE_EXPR
:
2585 case UNORDERED_EXPR
:
2595 case FIX_TRUNC_EXPR
:
2600 case TRUTH_AND_EXPR
:
2602 case TRUTH_XOR_EXPR
:
2603 if (flags
& TFF_EXPR_IN_PARENS
)
2604 pp_cxx_left_paren (pp
);
2606 if (flags
& TFF_EXPR_IN_PARENS
)
2607 pp_cxx_right_paren (pp
);
2611 dump_expr (pp
, resolve_virtual_fun_from_obj_type_ref (t
), flags
);
2615 pp_string (pp
, M_("<lambda>"));
2619 pp_cxx_left_paren (pp
);
2620 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2621 pp_cxx_right_paren (pp
);
2624 /* This list is incomplete, but should suffice for now.
2625 It is very important that `sorry' does not call
2626 `report_error_function'. That could cause an infinite loop. */
2628 pp_unsupported_tree (pp
, t
);
2629 /* fall through to ERROR_MARK... */
2631 pp_string (pp
, M_("<expression error>"));
2637 dump_binary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
,
2640 pp_cxx_left_paren (pp
);
2641 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2642 pp_cxx_whitespace (pp
);
2644 pp_cxx_ws_string (pp
, opstring
);
2646 pp_string (pp
, M_("<unknown operator>"));
2647 pp_cxx_whitespace (pp
);
2648 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2649 pp_cxx_right_paren (pp
);
2653 dump_unary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
, int flags
)
2655 if (flags
& TFF_EXPR_IN_PARENS
)
2656 pp_cxx_left_paren (pp
);
2657 pp_cxx_ws_string (pp
, opstring
);
2658 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2659 if (flags
& TFF_EXPR_IN_PARENS
)
2660 pp_cxx_right_paren (pp
);
2664 reinit_cxx_pp (void)
2666 pp_clear_output_area (cxx_pp
);
2667 cxx_pp
->padding
= pp_none
;
2668 pp_indentation (cxx_pp
) = 0;
2669 pp_needs_newline (cxx_pp
) = false;
2670 cxx_pp
->enclosing_scope
= current_function_decl
;
2673 /* Same as pp_formatted_text, except the return string is a separate
2674 copy and has a GGC storage duration, e.g. an indefinite lifetime. */
2677 pp_ggc_formatted_text (pretty_printer
*pp
)
2679 return ggc_strdup (pp_formatted_text (pp
));
2682 /* Exported interface to stringifying types, exprs and decls under TFF_*
2686 type_as_string (tree typ
, int flags
)
2689 pp_translate_identifiers (cxx_pp
) = false;
2690 dump_type (cxx_pp
, typ
, flags
);
2691 return pp_ggc_formatted_text (cxx_pp
);
2695 type_as_string_translate (tree typ
, int flags
)
2698 dump_type (cxx_pp
, typ
, flags
);
2699 return pp_ggc_formatted_text (cxx_pp
);
2703 expr_as_string (tree decl
, int flags
)
2706 pp_translate_identifiers (cxx_pp
) = false;
2707 dump_expr (cxx_pp
, decl
, flags
);
2708 return pp_ggc_formatted_text (cxx_pp
);
2711 /* Wrap decl_as_string with options appropriate for dwarf. */
2714 decl_as_dwarf_string (tree decl
, int flags
)
2717 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2718 here will be adequate to get the desired behaviour. */
2719 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2720 name
= decl_as_string (decl
, flags
);
2721 /* Subsequent calls to the pretty printer shouldn't use this style. */
2722 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2727 decl_as_string (tree decl
, int flags
)
2730 pp_translate_identifiers (cxx_pp
) = false;
2731 dump_decl (cxx_pp
, decl
, flags
);
2732 return pp_ggc_formatted_text (cxx_pp
);
2736 decl_as_string_translate (tree decl
, int flags
)
2739 dump_decl (cxx_pp
, decl
, flags
);
2740 return pp_ggc_formatted_text (cxx_pp
);
2743 /* Wrap lang_decl_name with options appropriate for dwarf. */
2746 lang_decl_dwarf_name (tree decl
, int v
, bool translate
)
2749 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2750 here will be adequate to get the desired behaviour. */
2751 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2752 name
= lang_decl_name (decl
, v
, translate
);
2753 /* Subsequent calls to the pretty printer shouldn't use this style. */
2754 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2758 /* Generate the three forms of printable names for cxx_printable_name. */
2761 lang_decl_name (tree decl
, int v
, bool translate
)
2765 ? decl_as_string_translate (decl
, TFF_DECL_SPECIFIERS
)
2766 : decl_as_string (decl
, TFF_DECL_SPECIFIERS
));
2769 pp_translate_identifiers (cxx_pp
) = translate
;
2771 && (DECL_CLASS_SCOPE_P (decl
)
2772 || (DECL_NAMESPACE_SCOPE_P (decl
)
2773 && CP_DECL_CONTEXT (decl
) != global_namespace
)))
2775 dump_type (cxx_pp
, CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2776 pp_cxx_colon_colon (cxx_pp
);
2779 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2780 dump_function_name (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
);
2781 else if ((DECL_NAME (decl
) == NULL_TREE
)
2782 && TREE_CODE (decl
) == NAMESPACE_DECL
)
2783 dump_decl (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
| TFF_UNQUALIFIED_NAME
);
2785 dump_decl (cxx_pp
, DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2787 return pp_ggc_formatted_text (cxx_pp
);
2790 /* Return the location of a tree passed to %+ formats. */
2793 location_of (tree t
)
2797 t
= TYPE_MAIN_DECL (t
);
2799 return input_location
;
2801 else if (TREE_CODE (t
) == OVERLOAD
)
2802 t
= OVL_FUNCTION (t
);
2805 return DECL_SOURCE_LOCATION (t
);
2806 return EXPR_LOC_OR_HERE (t
);
2809 /* Now the interfaces from error et al to dump_type et al. Each takes an
2810 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2814 decl_to_string (tree decl
, int verbose
)
2818 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2819 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2820 flags
= TFF_CLASS_KEY_OR_ENUM
;
2822 flags
|= TFF_DECL_SPECIFIERS
;
2823 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2824 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2825 flags
|= TFF_TEMPLATE_HEADER
;
2828 dump_decl (cxx_pp
, decl
, flags
);
2829 return pp_ggc_formatted_text (cxx_pp
);
2833 expr_to_string (tree decl
)
2836 dump_expr (cxx_pp
, decl
, 0);
2837 return pp_ggc_formatted_text (cxx_pp
);
2841 fndecl_to_string (tree fndecl
, int verbose
)
2845 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2846 | TFF_TEMPLATE_HEADER
;
2848 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2850 dump_decl (cxx_pp
, fndecl
, flags
);
2851 return pp_ggc_formatted_text (cxx_pp
);
2856 code_to_string (enum tree_code c
)
2858 return get_tree_code_name (c
);
2862 language_to_string (enum languages c
)
2869 case lang_cplusplus
:
2881 /* Return the proper printed version of a parameter to a C++ function. */
2884 parm_to_string (int p
)
2888 pp_string (cxx_pp
, "'this'");
2890 pp_decimal_int (cxx_pp
, p
+ 1);
2891 return pp_ggc_formatted_text (cxx_pp
);
2895 op_to_string (enum tree_code p
)
2897 tree id
= operator_name_info
[p
].identifier
;
2898 return id
? IDENTIFIER_POINTER (id
) : M_("<unknown>");
2902 type_to_string (tree typ
, int verbose
)
2906 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2907 flags
|= TFF_TEMPLATE_HEADER
;
2910 dump_type (cxx_pp
, typ
, flags
);
2911 /* If we're printing a type that involves typedefs, also print the
2912 stripped version. But sometimes the stripped version looks
2913 exactly the same, so we don't want it after all. To avoid printing
2914 it in that case, we play ugly obstack games. */
2915 if (typ
&& TYPE_P (typ
) && typ
!= TYPE_CANONICAL (typ
)
2916 && !uses_template_parms (typ
))
2918 int aka_start
; char *p
;
2919 struct obstack
*ob
= pp_buffer (cxx_pp
)->obstack
;
2920 /* Remember the end of the initial dump. */
2921 int len
= obstack_object_size (ob
);
2922 tree aka
= strip_typedefs (typ
);
2923 pp_string (cxx_pp
, " {aka");
2924 pp_cxx_whitespace (cxx_pp
);
2925 /* And remember the start of the aka dump. */
2926 aka_start
= obstack_object_size (ob
);
2927 dump_type (cxx_pp
, aka
, flags
);
2928 pp_right_brace (cxx_pp
);
2929 p
= (char*)obstack_base (ob
);
2930 /* If they are identical, cut off the aka with a NUL. */
2931 if (memcmp (p
, p
+aka_start
, len
) == 0)
2934 return pp_ggc_formatted_text (cxx_pp
);
2938 assop_to_string (enum tree_code p
)
2940 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
2941 return id
? IDENTIFIER_POINTER (id
) : M_("{unknown}");
2945 args_to_string (tree p
, int verbose
)
2949 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2954 if (TYPE_P (TREE_VALUE (p
)))
2955 return type_as_string_translate (p
, flags
);
2958 for (; p
; p
= TREE_CHAIN (p
))
2960 if (TREE_VALUE (p
) == null_node
)
2961 pp_cxx_ws_string (cxx_pp
, "NULL");
2963 dump_type (cxx_pp
, error_type (TREE_VALUE (p
)), flags
);
2965 pp_separate_with_comma (cxx_pp
);
2967 return pp_ggc_formatted_text (cxx_pp
);
2970 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
2971 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
2975 subst_to_string (tree p
)
2977 tree decl
= TREE_PURPOSE (p
);
2978 tree targs
= TREE_VALUE (p
);
2979 tree tparms
= DECL_TEMPLATE_PARMS (decl
);
2980 int flags
= (TFF_DECL_SPECIFIERS
|TFF_TEMPLATE_HEADER
2981 |TFF_NO_TEMPLATE_BINDINGS
);
2987 dump_template_decl (cxx_pp
, TREE_PURPOSE (p
), flags
);
2988 dump_substitution (cxx_pp
, NULL
, tparms
, targs
, /*flags=*/0);
2989 return pp_ggc_formatted_text (cxx_pp
);
2993 cv_to_string (tree p
, int v
)
2996 cxx_pp
->padding
= v
? pp_before
: pp_none
;
2997 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
2998 return pp_ggc_formatted_text (cxx_pp
);
3002 eh_spec_to_string (tree p
, int /*v*/)
3006 dump_exception_spec (cxx_pp
, p
, flags
);
3007 return pp_ggc_formatted_text (cxx_pp
);
3010 /* Langhook for print_error_function. */
3012 cxx_print_error_function (diagnostic_context
*context
, const char *file
,
3013 diagnostic_info
*diagnostic
)
3015 lhd_print_error_function (context
, file
, diagnostic
);
3016 pp_set_prefix (context
->printer
, file
);
3017 maybe_print_instantiation_context (context
);
3021 cp_diagnostic_starter (diagnostic_context
*context
,
3022 diagnostic_info
*diagnostic
)
3024 diagnostic_report_current_module (context
, diagnostic
->location
);
3025 cp_print_error_function (context
, diagnostic
);
3026 maybe_print_instantiation_context (context
);
3027 maybe_print_constexpr_context (context
);
3028 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
3033 cp_diagnostic_finalizer (diagnostic_context
*context
,
3034 diagnostic_info
*diagnostic
)
3036 virt_loc_aware_diagnostic_finalizer (context
, diagnostic
);
3037 pp_destroy_prefix (context
->printer
);
3040 /* Print current function onto BUFFER, in the process of reporting
3041 a diagnostic message. Called from cp_diagnostic_starter. */
3043 cp_print_error_function (diagnostic_context
*context
,
3044 diagnostic_info
*diagnostic
)
3046 /* If we are in an instantiation context, current_function_decl is likely
3047 to be wrong, so just rely on print_instantiation_full_context. */
3048 if (current_instantiation ())
3050 if (diagnostic_last_function_changed (context
, diagnostic
))
3052 const char *old_prefix
= context
->printer
->prefix
;
3053 const char *file
= LOCATION_FILE (diagnostic
->location
);
3054 tree abstract_origin
= diagnostic_abstract_origin (diagnostic
);
3055 char *new_prefix
= (file
&& abstract_origin
== NULL
)
3056 ? file_name_as_prefix (context
, file
) : NULL
;
3058 pp_set_prefix (context
->printer
, new_prefix
);
3060 if (current_function_decl
== NULL
)
3061 pp_string (context
->printer
, _("At global scope:"));
3066 if (abstract_origin
)
3068 ao
= BLOCK_ABSTRACT_ORIGIN (abstract_origin
);
3069 while (TREE_CODE (ao
) == BLOCK
3070 && BLOCK_ABSTRACT_ORIGIN (ao
)
3071 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3072 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3073 gcc_assert (TREE_CODE (ao
) == FUNCTION_DECL
);
3077 fndecl
= current_function_decl
;
3079 pp_printf (context
->printer
, function_category (fndecl
),
3080 cxx_printable_name_translate (fndecl
, 2));
3082 while (abstract_origin
)
3085 tree block
= abstract_origin
;
3087 locus
= &BLOCK_SOURCE_LOCATION (block
);
3089 block
= BLOCK_SUPERCONTEXT (block
);
3090 while (block
&& TREE_CODE (block
) == BLOCK
3091 && BLOCK_ABSTRACT_ORIGIN (block
))
3093 ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3095 while (TREE_CODE (ao
) == BLOCK
3096 && BLOCK_ABSTRACT_ORIGIN (ao
)
3097 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3098 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3100 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3105 else if (TREE_CODE (ao
) != BLOCK
)
3108 block
= BLOCK_SUPERCONTEXT (block
);
3111 abstract_origin
= block
;
3114 while (block
&& TREE_CODE (block
) == BLOCK
)
3115 block
= BLOCK_SUPERCONTEXT (block
);
3117 if (block
&& TREE_CODE (block
) == FUNCTION_DECL
)
3119 abstract_origin
= NULL
;
3123 expanded_location s
= expand_location (*locus
);
3124 pp_character (context
->printer
, ',');
3125 pp_newline (context
->printer
);
3128 if (context
->show_column
&& s
.column
!= 0)
3129 pp_printf (context
->printer
,
3130 _(" inlined from %qs at %r%s:%d:%d%R"),
3131 cxx_printable_name_translate (fndecl
, 2),
3132 "locus", s
.file
, s
.line
, s
.column
);
3134 pp_printf (context
->printer
,
3135 _(" inlined from %qs at %r%s:%d%R"),
3136 cxx_printable_name_translate (fndecl
, 2),
3137 "locus", s
.file
, s
.line
);
3141 pp_printf (context
->printer
, _(" inlined from %qs"),
3142 cxx_printable_name_translate (fndecl
, 2));
3145 pp_character (context
->printer
, ':');
3147 pp_newline (context
->printer
);
3149 diagnostic_set_last_function (context
, diagnostic
);
3150 pp_destroy_prefix (context
->printer
);
3151 context
->printer
->prefix
= old_prefix
;
3155 /* Returns a description of FUNCTION using standard terminology. The
3156 result is a format string of the form "In CATEGORY %qs". */
3158 function_category (tree fn
)
3160 /* We can get called from the middle-end for diagnostics of function
3161 clones. Make sure we have language specific information before
3162 dereferencing it. */
3163 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn
))
3164 && DECL_FUNCTION_MEMBER_P (fn
))
3166 if (DECL_STATIC_FUNCTION_P (fn
))
3167 return _("In static member function %qs");
3168 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
3169 return _("In copy constructor %qs");
3170 else if (DECL_CONSTRUCTOR_P (fn
))
3171 return _("In constructor %qs");
3172 else if (DECL_DESTRUCTOR_P (fn
))
3173 return _("In destructor %qs");
3174 else if (LAMBDA_FUNCTION_P (fn
))
3175 return _("In lambda function");
3177 return _("In member function %qs");
3180 return _("In function %qs");
3183 /* Report the full context of a current template instantiation,
3186 print_instantiation_full_context (diagnostic_context
*context
)
3188 struct tinst_level
*p
= current_instantiation ();
3189 location_t location
= input_location
;
3193 pp_verbatim (context
->printer
,
3194 TREE_CODE (p
->decl
) == TREE_LIST
3195 ? _("%s: In substitution of %qS:\n")
3196 : _("%s: In instantiation of %q#D:\n"),
3197 LOCATION_FILE (location
),
3200 location
= p
->locus
;
3204 print_instantiation_partial_context (context
, p
, location
);
3207 /* Helper function of print_instantiation_partial_context() that
3208 prints a single line of instantiation context. */
3211 print_instantiation_partial_context_line (diagnostic_context
*context
,
3212 const struct tinst_level
*t
,
3213 location_t loc
, bool recursive_p
)
3215 if (loc
== UNKNOWN_LOCATION
)
3218 expanded_location xloc
= expand_location (loc
);
3220 if (context
->show_column
)
3221 pp_verbatim (context
->printer
, _("%r%s:%d:%d:%R "),
3222 "locus", xloc
.file
, xloc
.line
, xloc
.column
);
3224 pp_verbatim (context
->printer
, _("%r%s:%d:%R "),
3225 "locus", xloc
.file
, xloc
.line
);
3229 if (TREE_CODE (t
->decl
) == TREE_LIST
)
3230 pp_verbatim (context
->printer
,
3232 ? _("recursively required by substitution of %qS\n")
3233 : _("required by substitution of %qS\n"),
3236 pp_verbatim (context
->printer
,
3238 ? _("recursively required from %q#D\n")
3239 : _("required from %q#D\n"),
3244 pp_verbatim (context
->printer
,
3246 ? _("recursively required from here")
3247 : _("required from here"));
3251 /* Same as print_instantiation_full_context but less verbose. */
3254 print_instantiation_partial_context (diagnostic_context
*context
,
3255 struct tinst_level
*t0
, location_t loc
)
3257 struct tinst_level
*t
;
3260 location_t prev_loc
= loc
;
3262 for (t
= t0
; t
!= NULL
; t
= t
->next
)
3263 if (prev_loc
!= t
->locus
)
3265 prev_loc
= t
->locus
;
3271 if (template_backtrace_limit
3272 && n_total
> template_backtrace_limit
)
3274 int skip
= n_total
- template_backtrace_limit
;
3275 int head
= template_backtrace_limit
/ 2;
3277 /* Avoid skipping just 1. If so, skip 2. */
3281 head
= (template_backtrace_limit
- 1) / 2;
3284 for (n
= 0; n
< head
; n
++)
3286 gcc_assert (t
!= NULL
);
3287 if (loc
!= t
->locus
)
3288 print_instantiation_partial_context_line (context
, t
, loc
,
3289 /*recursive_p=*/false);
3293 if (t
!= NULL
&& skip
> 0)
3295 expanded_location xloc
;
3296 xloc
= expand_location (loc
);
3297 if (context
->show_column
)
3298 pp_verbatim (context
->printer
,
3299 _("%r%s:%d:%d:%R [ skipping %d instantiation "
3300 "contexts, use -ftemplate-backtrace-limit=0 to "
3302 "locus", xloc
.file
, xloc
.line
, xloc
.column
, skip
);
3304 pp_verbatim (context
->printer
,
3305 _("%r%s:%d:%R [ skipping %d instantiation "
3306 "contexts, use -ftemplate-backtrace-limit=0 to "
3308 "locus", xloc
.file
, xloc
.line
, skip
);
3313 } while (t
!= NULL
&& --skip
> 0);
3319 while (t
->next
!= NULL
&& t
->locus
== t
->next
->locus
)
3324 print_instantiation_partial_context_line (context
, t
, loc
,
3329 print_instantiation_partial_context_line (context
, NULL
, loc
,
3330 /*recursive_p=*/false);
3331 pp_newline (context
->printer
);
3334 /* Called from cp_thing to print the template context for an error. */
3336 maybe_print_instantiation_context (diagnostic_context
*context
)
3338 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3341 record_last_problematic_instantiation ();
3342 print_instantiation_full_context (context
);
3345 /* Report the bare minimum context of a template instantiation. */
3347 print_instantiation_context (void)
3349 print_instantiation_partial_context
3350 (global_dc
, current_instantiation (), input_location
);
3351 pp_newline (global_dc
->printer
);
3352 diagnostic_flush_buffer (global_dc
);
3355 /* Report what constexpr call(s) we're trying to expand, if any. */
3358 maybe_print_constexpr_context (diagnostic_context
*context
)
3360 vec
<tree
> call_stack
= cx_error_context ();
3364 FOR_EACH_VEC_ELT (call_stack
, ix
, t
)
3366 expanded_location xloc
= expand_location (EXPR_LOCATION (t
));
3367 const char *s
= expr_as_string (t
, 0);
3368 if (context
->show_column
)
3369 pp_verbatim (context
->printer
,
3370 _("%r%s:%d:%d:%R in constexpr expansion of %qs"),
3371 "locus", xloc
.file
, xloc
.line
, xloc
.column
, s
);
3373 pp_verbatim (context
->printer
,
3374 _("%r%s:%d:%R in constexpr expansion of %qs"),
3375 "locus", xloc
.file
, xloc
.line
, s
);
3376 pp_newline (context
->printer
);
3380 /* Called from output_format -- during diagnostic message processing --
3381 to handle C++ specific format specifier with the following meanings:
3382 %A function argument-list.
3386 %F function declaration.
3387 %L language as used in extern "lang".
3389 %P function parameter whose position is indicated by an integer.
3390 %Q assignment operator.
3391 %S substitution (template + args)
3394 %X exception-specification. */
3396 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
3397 int precision
, bool wide
, bool set_locus
, bool verbose
)
3401 #define next_tree (t = va_arg (*text->args_ptr, tree))
3402 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3403 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3404 #define next_int va_arg (*text->args_ptr, int)
3406 if (precision
!= 0 || wide
)
3409 if (text
->locus
== NULL
)
3414 case 'A': result
= args_to_string (next_tree
, verbose
); break;
3415 case 'C': result
= code_to_string (next_tcode
); break;
3418 tree temp
= next_tree
;
3420 && DECL_HAS_DEBUG_EXPR_P (temp
))
3422 temp
= DECL_DEBUG_EXPR (temp
);
3425 result
= expr_to_string (temp
);
3429 result
= decl_to_string (temp
, verbose
);
3432 case 'E': result
= expr_to_string (next_tree
); break;
3433 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
3434 case 'L': result
= language_to_string (next_lang
); break;
3435 case 'O': result
= op_to_string (next_tcode
); break;
3436 case 'P': result
= parm_to_string (next_int
); break;
3437 case 'Q': result
= assop_to_string (next_tcode
); break;
3438 case 'S': result
= subst_to_string (next_tree
); break;
3439 case 'T': result
= type_to_string (next_tree
, verbose
); break;
3440 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
3441 case 'X': result
= eh_spec_to_string (next_tree
, verbose
); break;
3444 percent_K_format (text
);
3451 pp_string (pp
, result
);
3452 if (set_locus
&& t
!= NULL
)
3453 *text
->locus
= location_of (t
);
3461 /* Warn about the use of C++0x features when appropriate. */
3463 maybe_warn_cpp0x (cpp0x_warn_str str
)
3465 if ((cxx_dialect
== cxx98
) && !in_system_header
)
3466 /* We really want to suppress this warning in system headers,
3467 because libstdc++ uses variadic templates even when we aren't
3471 case CPP0X_INITIALIZER_LISTS
:
3472 pedwarn (input_location
, 0,
3473 "extended initializer lists "
3474 "only available with -std=c++11 or -std=gnu++11");
3476 case CPP0X_EXPLICIT_CONVERSION
:
3477 pedwarn (input_location
, 0,
3478 "explicit conversion operators "
3479 "only available with -std=c++11 or -std=gnu++11");
3481 case CPP0X_VARIADIC_TEMPLATES
:
3482 pedwarn (input_location
, 0,
3483 "variadic templates "
3484 "only available with -std=c++11 or -std=gnu++11");
3486 case CPP0X_LAMBDA_EXPR
:
3487 pedwarn (input_location
, 0,
3488 "lambda expressions "
3489 "only available with -std=c++11 or -std=gnu++11");
3492 pedwarn (input_location
, 0,
3493 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3495 case CPP0X_SCOPED_ENUMS
:
3496 pedwarn (input_location
, 0,
3497 "scoped enums only available with -std=c++11 or -std=gnu++11");
3499 case CPP0X_DEFAULTED_DELETED
:
3500 pedwarn (input_location
, 0,
3501 "defaulted and deleted functions "
3502 "only available with -std=c++11 or -std=gnu++11");
3504 case CPP0X_INLINE_NAMESPACES
:
3505 pedwarn (input_location
, OPT_Wpedantic
,
3506 "inline namespaces "
3507 "only available with -std=c++11 or -std=gnu++11");
3509 case CPP0X_OVERRIDE_CONTROLS
:
3510 pedwarn (input_location
, 0,
3511 "override controls (override/final) "
3512 "only available with -std=c++11 or -std=gnu++11");
3515 pedwarn (input_location
, 0,
3516 "non-static data member initializers "
3517 "only available with -std=c++11 or -std=gnu++11");
3519 case CPP0X_USER_DEFINED_LITERALS
:
3520 pedwarn (input_location
, 0,
3521 "user-defined literals "
3522 "only available with -std=c++11 or -std=gnu++11");
3524 case CPP0X_DELEGATING_CTORS
:
3525 pedwarn (input_location
, 0,
3526 "delegating constructors "
3527 "only available with -std=c++11 or -std=gnu++11");
3529 case CPP0X_INHERITING_CTORS
:
3530 pedwarn (input_location
, 0,
3531 "inheriting constructors "
3532 "only available with -std=c++11 or -std=gnu++11");
3534 case CPP0X_ATTRIBUTES
:
3535 pedwarn (input_location
, 0,
3537 "only available with -std=c++11 or -std=gnu++11");
3539 case CPP0X_REF_QUALIFIER
:
3540 pedwarn (input_location
, 0,
3542 "only available with -std=c++11 or -std=gnu++11");
3549 /* Warn about the use of variadic templates when appropriate. */
3551 maybe_warn_variadic_templates (void)
3553 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES
);
3557 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3558 option OPT with text GMSGID. Use this function to report
3559 diagnostics for constructs that are invalid C++98, but valid
3562 pedwarn_cxx98 (location_t location
, int opt
, const char *gmsgid
, ...)
3564 diagnostic_info diagnostic
;
3568 va_start (ap
, gmsgid
);
3569 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
3570 (cxx_dialect
== cxx98
) ? DK_PEDWARN
: DK_WARNING
);
3571 diagnostic
.option_index
= opt
;
3572 ret
= report_diagnostic (&diagnostic
);
3577 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3578 we found when we tried to do the lookup. LOCATION is the location of
3579 the NAME identifier. */
3582 qualified_name_lookup_error (tree scope
, tree name
,
3583 tree decl
, location_t location
)
3585 if (scope
== error_mark_node
)
3586 ; /* We already complained. */
3587 else if (TYPE_P (scope
))
3589 if (!COMPLETE_TYPE_P (scope
))
3590 error_at (location
, "incomplete type %qT used in nested name specifier",
3592 else if (TREE_CODE (decl
) == TREE_LIST
)
3594 error_at (location
, "reference to %<%T::%D%> is ambiguous",
3596 print_candidates (decl
);
3599 error_at (location
, "%qD is not a member of %qT", name
, scope
);
3601 else if (scope
!= global_namespace
)
3603 error_at (location
, "%qD is not a member of %qD", name
, scope
);
3604 suggest_alternatives_for (location
, name
);
3608 error_at (location
, "%<::%D%> has not been declared", name
);
3609 suggest_alternatives_for (location
, name
);