1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
26 #include "stringpool.h"
29 #include "diagnostic.h"
30 #include "tree-diagnostic.h"
31 #include "langhooks-def.h"
33 #include "cxx-pretty-print.h"
34 #include "tree-pretty-print.h"
35 #include "c-family/c-objc.h"
37 #include "internal-fn.h"
39 #include <new> // For placement-new.
41 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
42 #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';')
44 /* cxx_pp is a C++ front-end-specific pretty printer: this is where we
45 dump C++ ASTs as strings. It is mostly used only by the various
46 tree -> string functions that are occasionally called from the
47 debugger or by the front-end for things like
48 __PRETTY_FUNCTION__. */
49 static cxx_pretty_printer actual_pretty_printer
;
50 static cxx_pretty_printer
* const cxx_pp
= &actual_pretty_printer
;
52 /* Translate if being used for diagnostics, but not for dump files or
54 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
56 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
58 static const char *args_to_string (tree
, int);
59 static const char *assop_to_string (enum tree_code
);
60 static const char *code_to_string (enum tree_code
);
61 static const char *cv_to_string (tree
, int);
62 static const char *decl_to_string (tree
, int);
63 static const char *expr_to_string (tree
);
64 static const char *fndecl_to_string (tree
, int);
65 static const char *op_to_string (enum tree_code
);
66 static const char *parm_to_string (int);
67 static const char *type_to_string (tree
, int);
69 static void dump_alias_template_specialization (cxx_pretty_printer
*, tree
, int);
70 static void dump_type (cxx_pretty_printer
*, tree
, int);
71 static void dump_typename (cxx_pretty_printer
*, tree
, int);
72 static void dump_simple_decl (cxx_pretty_printer
*, tree
, tree
, int);
73 static void dump_decl (cxx_pretty_printer
*, tree
, int);
74 static void dump_template_decl (cxx_pretty_printer
*, tree
, int);
75 static void dump_function_decl (cxx_pretty_printer
*, tree
, int);
76 static void dump_expr (cxx_pretty_printer
*, tree
, int);
77 static void dump_unary_op (cxx_pretty_printer
*, const char *, tree
, int);
78 static void dump_binary_op (cxx_pretty_printer
*, const char *, tree
, int);
79 static void dump_aggr_type (cxx_pretty_printer
*, tree
, int);
80 static void dump_type_prefix (cxx_pretty_printer
*, tree
, int);
81 static void dump_type_suffix (cxx_pretty_printer
*, tree
, int);
82 static void dump_function_name (cxx_pretty_printer
*, tree
, int);
83 static void dump_call_expr_args (cxx_pretty_printer
*, tree
, int, bool);
84 static void dump_aggr_init_expr_args (cxx_pretty_printer
*, tree
, int, bool);
85 static void dump_expr_list (cxx_pretty_printer
*, tree
, int);
86 static void dump_global_iord (cxx_pretty_printer
*, tree
);
87 static void dump_parameters (cxx_pretty_printer
*, tree
, int);
88 static void dump_ref_qualifier (cxx_pretty_printer
*, tree
, int);
89 static void dump_exception_spec (cxx_pretty_printer
*, tree
, int);
90 static void dump_template_argument (cxx_pretty_printer
*, tree
, int);
91 static void dump_template_argument_list (cxx_pretty_printer
*, tree
, int);
92 static void dump_template_parameter (cxx_pretty_printer
*, tree
, int);
93 static void dump_template_bindings (cxx_pretty_printer
*, tree
, tree
,
95 static void dump_scope (cxx_pretty_printer
*, tree
, int);
96 static void dump_template_parms (cxx_pretty_printer
*, tree
, int, int);
97 static int get_non_default_template_args_count (tree
, int);
98 static const char *function_category (tree
);
99 static void maybe_print_constexpr_context (diagnostic_context
*);
100 static void maybe_print_instantiation_context (diagnostic_context
*);
101 static void print_instantiation_full_context (diagnostic_context
*);
102 static void print_instantiation_partial_context (diagnostic_context
*,
103 struct tinst_level
*,
105 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
106 static void cp_print_error_function (diagnostic_context
*, diagnostic_info
*);
108 static bool cp_printer (pretty_printer
*, text_info
*, const char *,
109 int, bool, bool, bool);
111 /* CONTEXT->printer is a basic pretty printer that was constructed
112 presumably by diagnostic_initialize(), called early in the
113 compiler's initialization process (in general_init) Before the FE
114 is initialized. This (C++) FE-specific diagnostic initializer is
115 thus replacing the basic pretty printer with one that has C++-aware
119 cxx_initialize_diagnostics (diagnostic_context
*context
)
121 pretty_printer
*base
= context
->printer
;
122 cxx_pretty_printer
*pp
= XNEW (cxx_pretty_printer
);
123 context
->printer
= new (pp
) cxx_pretty_printer ();
125 /* It is safe to free this object because it was previously XNEW()'d. */
126 base
->~pretty_printer ();
129 c_common_diagnostics_set_defaults (context
);
130 diagnostic_starter (context
) = cp_diagnostic_starter
;
131 /* diagnostic_finalizer is already c_diagnostic_finalizer. */
132 diagnostic_format_decoder (context
) = cp_printer
;
135 /* Dump a scope, if deemed necessary. */
138 dump_scope (cxx_pretty_printer
*pp
, tree scope
, int flags
)
140 int f
= flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
);
142 if (scope
== NULL_TREE
)
145 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
147 if (scope
!= global_namespace
)
149 dump_decl (pp
, scope
, f
);
150 pp_cxx_colon_colon (pp
);
153 else if (AGGREGATE_TYPE_P (scope
))
155 dump_type (pp
, scope
, f
);
156 pp_cxx_colon_colon (pp
);
158 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
160 dump_function_decl (pp
, scope
, f
);
161 pp_cxx_colon_colon (pp
);
165 /* Dump the template ARGument under control of FLAGS. */
168 dump_template_argument (cxx_pretty_printer
*pp
, tree arg
, int flags
)
170 if (ARGUMENT_PACK_P (arg
))
171 dump_template_argument_list (pp
, ARGUMENT_PACK_ARGS (arg
),
172 /* No default args in argument packs. */
173 flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
174 else if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
175 dump_type (pp
, arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
178 if (TREE_CODE (arg
) == TREE_LIST
)
179 arg
= TREE_VALUE (arg
);
181 dump_expr (pp
, arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
185 /* Count the number of template arguments ARGS whose value does not
186 match the (optional) default template parameter in PARAMS */
189 get_non_default_template_args_count (tree args
, int flags
)
191 int n
= TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args
));
193 if (/* We use this flag when generating debug information. We don't
194 want to expand templates at this point, for this may generate
195 new decls, which gets decl counts out of sync, which may in
196 turn cause codegen differences between compilations with and
198 (flags
& TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
) != 0
199 || !flag_pretty_templates
)
202 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args
));
205 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
209 dump_template_argument_list (cxx_pretty_printer
*pp
, tree args
, int flags
)
211 int n
= get_non_default_template_args_count (args
, flags
);
215 for (i
= 0; i
< n
; ++i
)
217 tree arg
= TREE_VEC_ELT (args
, i
);
219 /* Only print a comma if we know there is an argument coming. In
220 the case of an empty template argument pack, no actual
221 argument will be printed. */
223 && (!ARGUMENT_PACK_P (arg
)
224 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
225 pp_separate_with_comma (pp
);
227 dump_template_argument (pp
, arg
, flags
);
232 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
235 dump_template_parameter (cxx_pretty_printer
*pp
, tree parm
, int flags
)
240 if (parm
== error_mark_node
)
243 p
= TREE_VALUE (parm
);
244 a
= TREE_PURPOSE (parm
);
246 if (TREE_CODE (p
) == TYPE_DECL
)
248 if (flags
& TFF_DECL_SPECIFIERS
)
250 pp_cxx_ws_string (pp
, "class");
251 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p
)))
252 pp_cxx_ws_string (pp
, "...");
254 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
256 else if (DECL_NAME (p
))
257 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
259 pp_cxx_canonical_template_parameter (pp
, TREE_TYPE (p
));
262 dump_decl (pp
, p
, flags
| TFF_DECL_SPECIFIERS
);
264 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
266 pp_cxx_whitespace (pp
);
268 pp_cxx_whitespace (pp
);
269 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
270 dump_type (pp
, a
, flags
& ~TFF_CHASE_TYPEDEF
);
272 dump_expr (pp
, a
, flags
| TFF_EXPR_IN_PARENS
);
276 /* Dump, under control of FLAGS, a template-parameter-list binding.
277 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
281 dump_template_bindings (cxx_pretty_printer
*pp
, tree parms
, tree args
,
282 vec
<tree
, va_gc
> *typenames
)
284 bool need_semicolon
= false;
290 tree p
= TREE_VALUE (parms
);
291 int lvl
= TMPL_PARMS_DEPTH (parms
);
294 tree lvl_args
= NULL_TREE
;
296 /* Don't crash if we had an invalid argument list. */
297 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
298 lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
300 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
302 tree arg
= NULL_TREE
;
304 /* Don't crash if we had an invalid argument list. */
305 if (lvl_args
&& NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
306 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
309 pp_separate_with_semicolon (pp
);
310 dump_template_parameter (pp
, TREE_VEC_ELT (p
, i
),
311 TFF_PLAIN_IDENTIFIER
);
312 pp_cxx_whitespace (pp
);
314 pp_cxx_whitespace (pp
);
317 if (ARGUMENT_PACK_P (arg
))
318 pp_cxx_left_brace (pp
);
319 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
320 if (ARGUMENT_PACK_P (arg
))
321 pp_cxx_right_brace (pp
);
324 pp_string (pp
, M_("<missing>"));
327 need_semicolon
= true;
330 parms
= TREE_CHAIN (parms
);
333 /* Don't bother with typenames for a partial instantiation. */
334 if (vec_safe_is_empty (typenames
) || uses_template_parms (args
))
337 /* Don't try to print typenames when we're processing a clone. */
338 if (current_function_decl
339 && !DECL_LANG_SPECIFIC (current_function_decl
))
342 /* Don't try to do this once cgraph starts throwing away front-end
347 FOR_EACH_VEC_SAFE_ELT (typenames
, i
, t
)
350 pp_separate_with_semicolon (pp
);
351 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
352 pp_cxx_whitespace (pp
);
354 pp_cxx_whitespace (pp
);
355 push_deferring_access_checks (dk_no_check
);
356 t
= tsubst (t
, args
, tf_none
, NULL_TREE
);
357 pop_deferring_access_checks ();
358 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
359 pp_simple_type_specifier doesn't know about it. */
360 t
= strip_typedefs (t
);
361 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
365 /* Dump a human-readable equivalent of the alias template
366 specialization of T. */
369 dump_alias_template_specialization (cxx_pretty_printer
*pp
, tree t
, int flags
)
373 gcc_assert (alias_template_specialization_p (t
));
375 if (!(flags
& TFF_UNQUALIFIED_NAME
))
376 dump_scope (pp
, CP_DECL_CONTEXT (TYPE_NAME (t
)), flags
);
377 name
= TYPE_IDENTIFIER (t
);
378 pp_cxx_tree_identifier (pp
, name
);
379 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
381 flags
& ~TFF_TEMPLATE_HEADER
);
384 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
388 dump_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
393 /* Don't print e.g. "struct mytypedef". */
394 if (TYPE_P (t
) && typedef_variant_p (t
))
396 tree decl
= TYPE_NAME (t
);
397 if ((flags
& TFF_CHASE_TYPEDEF
)
398 || DECL_SELF_REFERENCE_P (decl
)
399 || (!flag_pretty_templates
400 && DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)))
401 t
= strip_typedefs (t
);
402 else if (alias_template_specialization_p (t
))
404 dump_alias_template_specialization (pp
, t
, flags
);
407 else if (same_type_p (t
, TREE_TYPE (decl
)))
411 pp_cxx_cv_qualifier_seq (pp
, t
);
412 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
417 if (TYPE_PTRMEMFUNC_P (t
))
420 switch (TREE_CODE (t
))
423 if (t
== init_list_type_node
)
424 pp_string (pp
, M_("<brace-enclosed initializer list>"));
425 else if (t
== unknown_type_node
)
426 pp_string (pp
, M_("<unresolved overloaded function type>"));
429 pp_cxx_cv_qualifier_seq (pp
, t
);
430 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
435 /* A list of function parms. */
436 dump_parameters (pp
, t
, flags
);
439 case IDENTIFIER_NODE
:
440 pp_cxx_tree_identifier (pp
, t
);
444 dump_type (pp
, BINFO_TYPE (t
), flags
);
450 dump_aggr_type (pp
, t
, flags
);
454 if (flags
& TFF_CHASE_TYPEDEF
)
456 dump_type (pp
, DECL_ORIGINAL_TYPE (t
)
457 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
460 /* Else fall through. */
464 dump_decl (pp
, t
, flags
& ~TFF_DECL_SPECIFIERS
);
473 case FIXED_POINT_TYPE
:
474 pp_type_specifier_seq (pp
, t
);
477 case TEMPLATE_TEMPLATE_PARM
:
478 /* For parameters inside template signature. */
479 if (TYPE_IDENTIFIER (t
))
480 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
482 pp_cxx_canonical_template_parameter (pp
, t
);
485 case BOUND_TEMPLATE_TEMPLATE_PARM
:
487 tree args
= TYPE_TI_ARGS (t
);
488 pp_cxx_cv_qualifier_seq (pp
, t
);
489 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
490 pp_cxx_begin_template_argument_list (pp
);
491 dump_template_argument_list (pp
, args
, flags
);
492 pp_cxx_end_template_argument_list (pp
);
496 case TEMPLATE_TYPE_PARM
:
497 pp_cxx_cv_qualifier_seq (pp
, t
);
498 if (TYPE_IDENTIFIER (t
))
499 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
501 pp_cxx_canonical_template_parameter
502 (pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
505 /* This is not always necessary for pointers and such, but doing this
506 reduces code size. */
515 dump_type_prefix (pp
, t
, flags
);
516 dump_type_suffix (pp
, t
, flags
);
520 if (! (flags
& TFF_CHASE_TYPEDEF
)
521 && DECL_ORIGINAL_TYPE (TYPE_NAME (t
)))
523 dump_decl (pp
, TYPE_NAME (t
), TFF_PLAIN_IDENTIFIER
);
526 pp_cxx_cv_qualifier_seq (pp
, t
);
527 pp_cxx_ws_string (pp
,
528 TYPENAME_IS_ENUM_P (t
) ? "enum"
529 : TYPENAME_IS_CLASS_P (t
) ? "class"
531 dump_typename (pp
, t
, flags
);
534 case UNBOUND_CLASS_TEMPLATE
:
535 if (! (flags
& TFF_UNQUALIFIED_NAME
))
537 dump_type (pp
, TYPE_CONTEXT (t
), flags
);
538 pp_cxx_colon_colon (pp
);
540 pp_cxx_ws_string (pp
, "template");
541 dump_type (pp
, TYPE_IDENTIFIER (t
), flags
);
545 pp_cxx_ws_string (pp
, "__typeof__");
546 pp_cxx_whitespace (pp
);
547 pp_cxx_left_paren (pp
);
548 dump_expr (pp
, TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
549 pp_cxx_right_paren (pp
);
552 case UNDERLYING_TYPE
:
553 pp_cxx_ws_string (pp
, "__underlying_type");
554 pp_cxx_whitespace (pp
);
555 pp_cxx_left_paren (pp
);
556 dump_expr (pp
, UNDERLYING_TYPE_TYPE (t
), flags
& ~TFF_EXPR_IN_PARENS
);
557 pp_cxx_right_paren (pp
);
560 case TYPE_PACK_EXPANSION
:
561 dump_type (pp
, PACK_EXPANSION_PATTERN (t
), flags
);
562 pp_cxx_ws_string (pp
, "...");
565 case TYPE_ARGUMENT_PACK
:
566 dump_template_argument (pp
, t
, flags
);
570 pp_cxx_ws_string (pp
, "decltype");
571 pp_cxx_whitespace (pp
);
572 pp_cxx_left_paren (pp
);
573 dump_expr (pp
, DECLTYPE_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
574 pp_cxx_right_paren (pp
);
578 pp_string (pp
, "std::nullptr_t");
582 pp_unsupported_tree (pp
, t
);
583 /* Fall through to error. */
586 pp_string (pp
, M_("<type error>"));
591 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
595 dump_typename (cxx_pretty_printer
*pp
, tree t
, int flags
)
597 tree ctx
= TYPE_CONTEXT (t
);
599 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
600 dump_typename (pp
, ctx
, flags
);
602 dump_type (pp
, ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
603 pp_cxx_colon_colon (pp
);
604 dump_decl (pp
, TYPENAME_TYPE_FULLNAME (t
), flags
);
607 /* Return the name of the supplied aggregate, or enumeral type. */
610 class_key_or_enum_as_string (tree t
)
612 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
614 if (SCOPED_ENUM_P (t
))
619 else if (TREE_CODE (t
) == UNION_TYPE
)
621 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
627 /* Print out a class declaration T under the control of FLAGS,
628 in the form `class foo'. */
631 dump_aggr_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
634 const char *variety
= class_key_or_enum_as_string (t
);
638 pp_cxx_cv_qualifier_seq (pp
, t
);
640 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
641 pp_cxx_ws_string (pp
, variety
);
643 name
= TYPE_NAME (t
);
647 typdef
= (!DECL_ARTIFICIAL (name
)
648 /* An alias specialization is not considered to be a
650 && !alias_template_specialization_p (t
));
653 && ((flags
& TFF_CHASE_TYPEDEF
)
654 || (!flag_pretty_templates
&& DECL_LANG_SPECIFIC (name
)
655 && DECL_TEMPLATE_INFO (name
))))
656 || DECL_SELF_REFERENCE_P (name
))
658 t
= TYPE_MAIN_VARIANT (t
);
659 name
= TYPE_NAME (t
);
663 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
664 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
665 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
666 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
668 if (! (flags
& TFF_UNQUALIFIED_NAME
))
669 dump_scope (pp
, CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
670 flags
&= ~TFF_UNQUALIFIED_NAME
;
673 /* Because the template names are mangled, we have to locate
674 the most general template, and use that name. */
675 tree tpl
= TYPE_TI_TEMPLATE (t
);
677 while (DECL_TEMPLATE_INFO (tpl
))
678 tpl
= DECL_TI_TEMPLATE (tpl
);
681 name
= DECL_NAME (name
);
684 if (name
== 0 || anon_aggrname_p (name
))
686 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
687 pp_string (pp
, M_("<anonymous>"));
689 pp_printf (pp
, M_("<anonymous %s>"), variety
);
691 else if (LAMBDA_TYPE_P (t
))
693 /* A lambda's "type" is essentially its signature. */
694 pp_string (pp
, M_("<lambda"));
695 if (lambda_function (t
))
697 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t
)),
702 pp_cxx_tree_identifier (pp
, name
);
704 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
705 !CLASSTYPE_USE_TEMPLATE (t
),
706 flags
& ~TFF_TEMPLATE_HEADER
);
709 /* Dump into the obstack the initial part of the output for a given type.
710 This is necessary when dealing with things like functions returning
713 return type of `int (* fee ())()': pointer -> function -> int. Both
714 pointer (and reference and offset) and function (and member) types must
715 deal with prefix and suffix.
717 Arrays must also do this for DECL nodes, like int a[], and for things like
721 dump_type_prefix (cxx_pretty_printer
*pp
, tree t
, int flags
)
723 if (TYPE_PTRMEMFUNC_P (t
))
725 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
729 switch (TREE_CODE (t
))
734 tree sub
= TREE_TYPE (t
);
736 dump_type_prefix (pp
, sub
, flags
);
737 if (TREE_CODE (sub
) == ARRAY_TYPE
738 || TREE_CODE (sub
) == FUNCTION_TYPE
)
740 pp_cxx_whitespace (pp
);
741 pp_cxx_left_paren (pp
);
742 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (sub
));
746 else if (TREE_CODE (t
) == REFERENCE_TYPE
)
748 if (TYPE_REF_IS_RVALUE (t
))
749 pp_ampersand_ampersand (pp
);
753 pp
->padding
= pp_before
;
754 pp_cxx_cv_qualifier_seq (pp
, t
);
760 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
761 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
764 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
765 pp_cxx_left_paren (pp
);
766 dump_type (pp
, TYPE_OFFSET_BASETYPE (t
), flags
);
767 pp_cxx_colon_colon (pp
);
770 pp_cxx_cv_qualifier_seq (pp
, t
);
771 pp
->padding
= pp_before
;
774 /* This can be reached without a pointer when dealing with
775 templates, e.g. std::is_function. */
777 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
781 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
783 pp_cxx_left_paren (pp
);
784 dump_aggr_type (pp
, TYPE_METHOD_BASETYPE (t
), flags
);
785 pp_cxx_colon_colon (pp
);
789 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
793 case IDENTIFIER_NODE
:
798 case TEMPLATE_TYPE_PARM
:
799 case TEMPLATE_TEMPLATE_PARM
:
800 case BOUND_TEMPLATE_TEMPLATE_PARM
:
811 case UNDERLYING_TYPE
:
813 case TYPE_PACK_EXPANSION
:
814 case FIXED_POINT_TYPE
:
816 dump_type (pp
, t
, flags
);
817 pp
->padding
= pp_before
;
821 pp_unsupported_tree (pp
, t
);
824 pp_string (pp
, M_("<typeprefixerror>"));
829 /* Dump the suffix of type T, under control of FLAGS. This is the part
830 which appears after the identifier (or function parms). */
833 dump_type_suffix (cxx_pretty_printer
*pp
, tree t
, int flags
)
835 if (TYPE_PTRMEMFUNC_P (t
))
836 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
838 switch (TREE_CODE (t
))
843 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
844 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
845 pp_cxx_right_paren (pp
);
846 if (TREE_CODE (t
) == POINTER_TYPE
)
847 flags
|= TFF_POINTER
;
848 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
855 if (TREE_CODE (t
) == METHOD_TYPE
)
856 /* Can only be reached through a pointer. */
857 pp_cxx_right_paren (pp
);
858 arg
= TYPE_ARG_TYPES (t
);
859 if (TREE_CODE (t
) == METHOD_TYPE
)
860 arg
= TREE_CHAIN (arg
);
862 /* Function pointers don't have default args. Not in standard C++,
863 anyway; they may in g++, but we'll just pretend otherwise. */
864 dump_parameters (pp
, arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
866 pp
->padding
= pp_before
;
867 pp_cxx_cv_qualifiers (pp
, type_memfn_quals (t
),
868 TREE_CODE (t
) == FUNCTION_TYPE
869 && (flags
& TFF_POINTER
));
870 dump_ref_qualifier (pp
, t
, flags
);
871 dump_exception_spec (pp
, TYPE_RAISES_EXCEPTIONS (t
), flags
);
872 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
878 pp_cxx_left_bracket (pp
);
881 tree dtype
= TYPE_DOMAIN (t
);
882 tree max
= TYPE_MAX_VALUE (dtype
);
883 if (integer_all_onesp (max
))
884 pp_character (pp
, '0');
885 else if (tree_fits_shwi_p (max
))
886 pp_wide_integer (pp
, tree_to_shwi (max
) + 1);
890 if (TREE_CODE (max
) == SAVE_EXPR
)
891 max
= TREE_OPERAND (max
, 0);
892 if (TREE_CODE (max
) == MINUS_EXPR
893 || TREE_CODE (max
) == PLUS_EXPR
)
895 max
= TREE_OPERAND (max
, 0);
896 while (CONVERT_EXPR_P (max
))
897 max
= TREE_OPERAND (max
, 0);
900 max
= fold_build2_loc (input_location
,
901 PLUS_EXPR
, dtype
, max
,
902 build_int_cst (dtype
, 1));
903 dump_expr (pp
, max
, flags
& ~TFF_EXPR_IN_PARENS
);
906 pp_cxx_right_bracket (pp
);
907 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
911 case IDENTIFIER_NODE
:
916 case TEMPLATE_TYPE_PARM
:
917 case TEMPLATE_TEMPLATE_PARM
:
918 case BOUND_TEMPLATE_TEMPLATE_PARM
:
929 case UNDERLYING_TYPE
:
931 case TYPE_PACK_EXPANSION
:
932 case FIXED_POINT_TYPE
:
937 pp_unsupported_tree (pp
, t
);
939 /* Don't mark it here, we should have already done in
946 dump_global_iord (cxx_pretty_printer
*pp
, tree t
)
948 const char *p
= NULL
;
950 if (DECL_GLOBAL_CTOR_P (t
))
951 p
= M_("(static initializers for %s)");
952 else if (DECL_GLOBAL_DTOR_P (t
))
953 p
= M_("(static destructors for %s)");
957 pp_printf (pp
, p
, LOCATION_FILE (input_location
));
961 dump_simple_decl (cxx_pretty_printer
*pp
, tree t
, tree type
, int flags
)
963 if (flags
& TFF_DECL_SPECIFIERS
)
966 && DECL_DECLARED_CONSTEXPR_P (t
))
967 pp_cxx_ws_string (pp
, "constexpr");
968 dump_type_prefix (pp
, type
, flags
& ~TFF_UNQUALIFIED_NAME
);
971 if (! (flags
& TFF_UNQUALIFIED_NAME
)
972 && TREE_CODE (t
) != PARM_DECL
973 && (!DECL_INITIAL (t
)
974 || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
))
975 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
976 flags
&= ~TFF_UNQUALIFIED_NAME
;
977 if ((flags
& TFF_DECL_SPECIFIERS
)
978 && DECL_TEMPLATE_PARM_P (t
)
979 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t
)))
980 pp_string (pp
, "...");
983 if (TREE_CODE (t
) == FIELD_DECL
&& DECL_NORMAL_CAPTURE_P (t
))
986 pp_string (pp
, IDENTIFIER_POINTER (DECL_NAME (t
)) + 2);
987 pp_string (pp
, " capture>");
990 dump_decl (pp
, DECL_NAME (t
), flags
);
993 pp_string (pp
, M_("<anonymous>"));
994 if (flags
& TFF_DECL_SPECIFIERS
)
995 dump_type_suffix (pp
, type
, flags
);
998 /* Dump a human readable string for the decl T under control of FLAGS. */
1001 dump_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1006 /* If doing Objective-C++, give Objective-C a chance to demangle
1007 Objective-C method names. */
1008 if (c_dialect_objc ())
1010 const char *demangled
= objc_maybe_printable_name (t
, flags
);
1013 pp_string (pp
, demangled
);
1018 switch (TREE_CODE (t
))
1021 /* Don't say 'typedef class A' */
1022 if (DECL_ARTIFICIAL (t
) && !DECL_SELF_REFERENCE_P (t
))
1024 if ((flags
& TFF_DECL_SPECIFIERS
)
1025 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
1027 /* Say `class T' not just `T'. */
1028 pp_cxx_ws_string (pp
, "class");
1030 /* Emit the `...' for a parameter pack. */
1031 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1032 pp_cxx_ws_string (pp
, "...");
1035 dump_type (pp
, TREE_TYPE (t
), flags
);
1038 if (TYPE_DECL_ALIAS_P (t
)
1039 && (flags
& TFF_DECL_SPECIFIERS
1040 || flags
& TFF_CLASS_KEY_OR_ENUM
))
1042 pp_cxx_ws_string (pp
, "using");
1043 dump_decl (pp
, DECL_NAME (t
), flags
);
1044 pp_cxx_whitespace (pp
);
1045 pp_cxx_ws_string (pp
, "=");
1046 pp_cxx_whitespace (pp
);
1047 dump_type (pp
, DECL_ORIGINAL_TYPE (t
), flags
);
1050 if ((flags
& TFF_DECL_SPECIFIERS
)
1051 && !DECL_SELF_REFERENCE_P (t
))
1052 pp_cxx_ws_string (pp
, "typedef");
1053 dump_simple_decl (pp
, t
, DECL_ORIGINAL_TYPE (t
)
1054 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
1059 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
1061 pp_string (pp
, M_("vtable for "));
1062 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
1063 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1066 /* Else fall through. */
1069 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1071 /* Handle variable template specializations. */
1073 && DECL_LANG_SPECIFIC (t
)
1074 && DECL_TEMPLATE_INFO (t
)
1075 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
)))
1077 pp_cxx_begin_template_argument_list (pp
);
1078 tree args
= INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (t
));
1079 dump_template_argument_list (pp
, args
, flags
);
1080 pp_cxx_end_template_argument_list (pp
);
1085 pp_string (pp
, M_("<return value> "));
1086 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1089 case NAMESPACE_DECL
:
1090 if (flags
& TFF_DECL_SPECIFIERS
)
1091 pp
->declaration (t
);
1094 if (! (flags
& TFF_UNQUALIFIED_NAME
))
1095 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1096 flags
&= ~TFF_UNQUALIFIED_NAME
;
1097 if (DECL_NAME (t
) == NULL_TREE
)
1099 if (!(pp
->flags
& pp_c_flag_gnu_v3
))
1100 pp_cxx_ws_string (pp
, M_("{anonymous}"));
1102 pp_cxx_ws_string (pp
, M_("(anonymous namespace)"));
1105 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1110 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1111 pp_colon_colon (pp
);
1112 dump_decl (pp
, TREE_OPERAND (t
, 1), TFF_UNQUALIFIED_NAME
);
1116 dump_decl (pp
, TREE_OPERAND (t
, 0), flags
);
1117 pp_cxx_left_bracket (pp
);
1118 dump_decl (pp
, TREE_OPERAND (t
, 1), flags
);
1119 pp_cxx_right_bracket (pp
);
1122 case ARRAY_NOTATION_REF
:
1123 dump_decl (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
1124 pp_cxx_left_bracket (pp
);
1125 dump_decl (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
1127 dump_decl (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
1129 dump_decl (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
1130 pp_cxx_right_bracket (pp
);
1133 /* So that we can do dump_decl on an aggr type. */
1137 dump_type (pp
, t
, flags
);
1141 /* This is a pseudo destructor call which has not been folded into
1142 a PSEUDO_DTOR_EXPR yet. */
1143 pp_cxx_complement (pp
);
1144 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1151 /* These special cases are duplicated here so that other functions
1152 can feed identifiers to error and get them demangled properly. */
1153 case IDENTIFIER_NODE
:
1154 if (IDENTIFIER_TYPENAME_P (t
))
1156 pp_cxx_ws_string (pp
, "operator");
1157 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1158 dump_type (pp
, TREE_TYPE (t
), flags
);
1162 pp_cxx_tree_identifier (pp
, t
);
1168 t
= OVL_CURRENT (t
);
1169 if (DECL_CLASS_SCOPE_P (t
))
1171 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1172 pp_cxx_colon_colon (pp
);
1174 else if (!DECL_FILE_SCOPE_P (t
))
1176 dump_decl (pp
, DECL_CONTEXT (t
), flags
);
1177 pp_cxx_colon_colon (pp
);
1179 dump_decl (pp
, DECL_NAME (t
), flags
);
1183 /* If there's only one function, just treat it like an ordinary
1185 t
= OVL_CURRENT (t
);
1189 if (! DECL_LANG_SPECIFIC (t
))
1191 if (DECL_ABSTRACT_ORIGIN (t
))
1192 dump_decl (pp
, DECL_ABSTRACT_ORIGIN (t
), flags
);
1194 pp_string (pp
, M_("<built-in>"));
1196 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
1197 dump_global_iord (pp
, t
);
1199 dump_function_decl (pp
, t
, flags
);
1203 dump_template_decl (pp
, t
, flags
);
1206 case TEMPLATE_ID_EXPR
:
1208 tree name
= TREE_OPERAND (t
, 0);
1209 tree args
= TREE_OPERAND (t
, 1);
1211 if (is_overloaded_fn (name
))
1212 name
= get_first_fn (name
);
1214 name
= DECL_NAME (name
);
1215 dump_decl (pp
, name
, flags
);
1216 pp_cxx_begin_template_argument_list (pp
);
1217 if (args
== error_mark_node
)
1218 pp_string (pp
, M_("<template arguments error>"));
1220 dump_template_argument_list
1221 (pp
, args
, flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
1222 pp_cxx_end_template_argument_list (pp
);
1227 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1231 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
1232 || (DECL_INITIAL (t
) &&
1233 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
1234 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1235 else if (DECL_NAME (t
))
1236 dump_decl (pp
, DECL_NAME (t
), flags
);
1237 else if (DECL_INITIAL (t
))
1238 dump_expr (pp
, DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
1240 pp_string (pp
, M_("<enumerator>"));
1244 pp_cxx_ws_string (pp
, "using");
1245 dump_type (pp
, USING_DECL_SCOPE (t
), flags
);
1246 pp_cxx_colon_colon (pp
);
1247 dump_decl (pp
, DECL_NAME (t
), flags
);
1251 pp
->declaration (t
);
1255 dump_decl (pp
, BASELINK_FUNCTIONS (t
), flags
);
1258 case NON_DEPENDENT_EXPR
:
1259 dump_expr (pp
, t
, flags
);
1262 case TEMPLATE_TYPE_PARM
:
1263 if (flags
& TFF_DECL_SPECIFIERS
)
1264 pp
->declaration (t
);
1269 case UNBOUND_CLASS_TEMPLATE
:
1270 case TYPE_PACK_EXPANSION
:
1272 dump_type (pp
, t
, flags
);
1276 pp_unsupported_tree (pp
, t
);
1277 /* Fall through to error. */
1280 pp_string (pp
, M_("<declaration error>"));
1285 /* Dump a template declaration T under control of FLAGS. This means the
1286 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1289 dump_template_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1291 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1295 if (flags
& TFF_TEMPLATE_HEADER
)
1297 for (parms
= orig_parms
= nreverse (orig_parms
);
1299 parms
= TREE_CHAIN (parms
))
1301 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1302 int len
= TREE_VEC_LENGTH (inner_parms
);
1306 /* Skip over the dummy template levels of a template template
1308 gcc_assert (TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TEMPLATE_PARM
);
1312 pp_cxx_ws_string (pp
, "template");
1313 pp_cxx_begin_template_argument_list (pp
);
1315 /* If we've shown the template prefix, we'd better show the
1316 parameters' and decl's type too. */
1317 flags
|= TFF_DECL_SPECIFIERS
;
1319 for (i
= 0; i
< len
; i
++)
1322 pp_separate_with_comma (pp
);
1323 dump_template_parameter (pp
, TREE_VEC_ELT (inner_parms
, i
),
1326 pp_cxx_end_template_argument_list (pp
);
1327 pp_cxx_whitespace (pp
);
1329 nreverse(orig_parms
);
1331 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1333 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1334 pp_cxx_ws_string (pp
, "class");
1336 /* If this is a parameter pack, print the ellipsis. */
1337 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1338 pp_cxx_ws_string (pp
, "...");
1343 if (tree ci
= get_constraints (t
))
1344 if (check_constraint_info (ci
))
1345 if (tree reqs
= CI_TEMPLATE_REQS (ci
))
1347 pp_cxx_requires_clause (pp
, reqs
);
1348 pp_cxx_whitespace (pp
);
1351 if (DECL_CLASS_TEMPLATE_P (t
))
1352 dump_type (pp
, TREE_TYPE (t
),
1353 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1354 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1355 else if (DECL_TEMPLATE_RESULT (t
)
1356 && (VAR_P (DECL_TEMPLATE_RESULT (t
))
1357 /* Alias template. */
1358 || DECL_TYPE_TEMPLATE_P (t
)))
1359 dump_decl (pp
, DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1362 gcc_assert (TREE_TYPE (t
));
1363 switch (NEXT_CODE (t
))
1367 dump_function_decl (pp
, t
, flags
| TFF_TEMPLATE_NAME
);
1370 /* This case can occur with some invalid code. */
1371 dump_type (pp
, TREE_TYPE (t
),
1372 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1373 | (flags
& TFF_DECL_SPECIFIERS
1374 ? TFF_CLASS_KEY_OR_ENUM
: 0));
1379 /* find_typenames looks through the type of the function template T
1380 and returns a vec containing any typedefs, decltypes or TYPENAME_TYPEs
1383 struct find_typenames_t
1385 hash_set
<tree
> *p_set
;
1386 vec
<tree
, va_gc
> *typenames
;
1390 find_typenames_r (tree
*tp
, int *walk_subtrees
, void *data
)
1392 struct find_typenames_t
*d
= (struct find_typenames_t
*)data
;
1393 tree mv
= NULL_TREE
;
1395 if (TYPE_P (*tp
) && is_typedef_decl (TYPE_NAME (*tp
)))
1396 /* Add the type of the typedef without any additional cv-quals. */
1397 mv
= TREE_TYPE (TYPE_NAME (*tp
));
1398 else if (TREE_CODE (*tp
) == TYPENAME_TYPE
1399 || TREE_CODE (*tp
) == DECLTYPE_TYPE
)
1400 /* Add the typename without any cv-qualifiers. */
1401 mv
= TYPE_MAIN_VARIANT (*tp
);
1403 if (TREE_CODE (*tp
) == TYPE_PACK_EXPANSION
)
1405 /* Don't mess with parameter packs since we don't remember
1406 the pack expansion context for a particular typename. */
1407 *walk_subtrees
= false;
1411 if (mv
&& (mv
== *tp
|| !d
->p_set
->add (mv
)))
1412 vec_safe_push (d
->typenames
, mv
);
1414 /* Search into class template arguments, which cp_walk_subtrees
1416 if (CLASS_TYPE_P (*tp
) && CLASSTYPE_TEMPLATE_INFO (*tp
))
1417 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp
), find_typenames_r
,
1423 static vec
<tree
, va_gc
> *
1424 find_typenames (tree t
)
1426 struct find_typenames_t ft
;
1427 ft
.p_set
= new hash_set
<tree
>;
1428 ft
.typenames
= NULL
;
1429 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t
)),
1430 find_typenames_r
, &ft
, ft
.p_set
);
1432 return ft
.typenames
;
1435 /* Output the "[with ...]" clause for a template instantiation T iff
1436 TEMPLATE_PARMS, TEMPLATE_ARGS and FLAGS are suitable. T may be NULL if
1437 formatting a deduction/substitution diagnostic rather than an
1441 dump_substitution (cxx_pretty_printer
*pp
,
1442 tree t
, tree template_parms
, tree template_args
,
1445 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
1446 && !(flags
& TFF_NO_TEMPLATE_BINDINGS
))
1448 vec
<tree
, va_gc
> *typenames
= t
? find_typenames (t
) : NULL
;
1449 pp_cxx_whitespace (pp
);
1450 pp_cxx_left_bracket (pp
);
1451 pp
->translate_string ("with");
1452 pp_cxx_whitespace (pp
);
1453 dump_template_bindings (pp
, template_parms
, template_args
, typenames
);
1454 pp_cxx_right_bracket (pp
);
1458 /* Dump the lambda function FN including its 'mutable' qualifier and any
1459 template bindings. */
1462 dump_lambda_function (cxx_pretty_printer
*pp
,
1463 tree fn
, tree template_parms
, tree template_args
,
1466 /* A lambda's signature is essentially its "type". */
1467 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1468 if (!(TYPE_QUALS (class_of_this_parm (TREE_TYPE (fn
))) & TYPE_QUAL_CONST
))
1470 pp
->padding
= pp_before
;
1471 pp_c_ws_string (pp
, "mutable");
1473 dump_substitution (pp
, fn
, template_parms
, template_args
, flags
);
1476 /* Pretty print a function decl. There are several ways we want to print a
1477 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1478 As error can only apply the '#' flag once to give 0 and 1 for V, there
1479 is %D which doesn't print the throw specs, and %F which does. */
1482 dump_function_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1486 tree cname
= NULL_TREE
;
1487 tree template_args
= NULL_TREE
;
1488 tree template_parms
= NULL_TREE
;
1489 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1490 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1493 flags
&= ~(TFF_UNQUALIFIED_NAME
| TFF_TEMPLATE_NAME
);
1494 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1495 t
= DECL_TEMPLATE_RESULT (t
);
1497 /* Save the exceptions, in case t is a specialization and we are
1498 emitting an error about incompatible specifications. */
1499 exceptions
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t
));
1501 /* Pretty print template instantiations only. */
1502 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
)
1503 && flag_pretty_templates
)
1507 template_args
= DECL_TI_ARGS (t
);
1508 tmpl
= most_general_template (t
);
1509 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1511 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1516 if (DECL_NAME (t
) && LAMBDA_FUNCTION_P (t
))
1517 return dump_lambda_function (pp
, t
, template_parms
, template_args
, flags
);
1519 fntype
= TREE_TYPE (t
);
1520 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1522 if (DECL_CLASS_SCOPE_P (t
))
1523 cname
= DECL_CONTEXT (t
);
1524 /* This is for partially instantiated template methods. */
1525 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1526 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1528 if (flags
& TFF_DECL_SPECIFIERS
)
1530 if (DECL_STATIC_FUNCTION_P (t
))
1531 pp_cxx_ws_string (pp
, "static");
1532 else if (DECL_VIRTUAL_P (t
))
1533 pp_cxx_ws_string (pp
, "virtual");
1535 if (DECL_DECLARED_CONSTEXPR_P (t
))
1536 pp_cxx_ws_string (pp
, "constexpr");
1539 /* Print the return type? */
1541 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1542 && !DECL_DESTRUCTOR_P (t
);
1545 tree ret
= fndecl_declared_return_type (t
);
1546 dump_type_prefix (pp
, ret
, flags
);
1549 /* Print the function name. */
1550 if (!do_outer_scope
)
1554 dump_type (pp
, cname
, flags
);
1555 pp_cxx_colon_colon (pp
);
1558 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1560 dump_function_name (pp
, t
, flags
);
1562 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1564 dump_parameters (pp
, parmtypes
, flags
);
1566 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1568 pp
->padding
= pp_before
;
1569 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (fntype
));
1570 dump_ref_qualifier (pp
, fntype
, flags
);
1573 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1575 pp
->padding
= pp_before
;
1576 dump_exception_spec (pp
, exceptions
, flags
);
1580 dump_type_suffix (pp
, TREE_TYPE (fntype
), flags
);
1583 if (tree ci
= get_constraints (t
))
1584 if (tree reqs
= CI_DECLARATOR_REQS (ci
))
1585 pp_cxx_requires_clause (pp
, reqs
);
1587 dump_substitution (pp
, t
, template_parms
, template_args
, flags
);
1589 else if (template_args
)
1591 bool need_comma
= false;
1593 pp_cxx_begin_template_argument_list (pp
);
1594 template_args
= INNERMOST_TEMPLATE_ARGS (template_args
);
1595 for (i
= 0; i
< TREE_VEC_LENGTH (template_args
); ++i
)
1597 tree arg
= TREE_VEC_ELT (template_args
, i
);
1599 pp_separate_with_comma (pp
);
1600 if (ARGUMENT_PACK_P (arg
))
1601 pp_cxx_left_brace (pp
);
1602 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
1603 if (ARGUMENT_PACK_P (arg
))
1604 pp_cxx_right_brace (pp
);
1607 pp_cxx_end_template_argument_list (pp
);
1611 /* Print a parameter list. If this is for a member function, the
1612 member object ptr (and any other hidden args) should have
1613 already been removed. */
1616 dump_parameters (cxx_pretty_printer
*pp
, tree parmtypes
, int flags
)
1619 flags
&= ~TFF_SCOPE
;
1620 pp_cxx_left_paren (pp
);
1622 for (first
= 1; parmtypes
!= void_list_node
;
1623 parmtypes
= TREE_CHAIN (parmtypes
))
1626 pp_separate_with_comma (pp
);
1630 pp_cxx_ws_string (pp
, "...");
1634 dump_type (pp
, TREE_VALUE (parmtypes
), flags
);
1636 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1638 pp_cxx_whitespace (pp
);
1640 pp_cxx_whitespace (pp
);
1641 dump_expr (pp
, TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1645 pp_cxx_right_paren (pp
);
1648 /* Print ref-qualifier of a FUNCTION_TYPE or METHOD_TYPE. FLAGS are ignored. */
1651 dump_ref_qualifier (cxx_pretty_printer
*pp
, tree t
, int flags ATTRIBUTE_UNUSED
)
1653 if (FUNCTION_REF_QUALIFIED (t
))
1655 pp
->padding
= pp_before
;
1656 if (FUNCTION_RVALUE_QUALIFIED (t
))
1657 pp_cxx_ws_string (pp
, "&&");
1659 pp_cxx_ws_string (pp
, "&");
1663 /* Print an exception specification. T is the exception specification. */
1666 dump_exception_spec (cxx_pretty_printer
*pp
, tree t
, int flags
)
1668 if (t
&& TREE_PURPOSE (t
))
1670 pp_cxx_ws_string (pp
, "noexcept");
1671 if (!integer_onep (TREE_PURPOSE (t
)))
1673 pp_cxx_whitespace (pp
);
1674 pp_cxx_left_paren (pp
);
1675 if (DEFERRED_NOEXCEPT_SPEC_P (t
))
1676 pp_cxx_ws_string (pp
, "<uninstantiated>");
1678 dump_expr (pp
, TREE_PURPOSE (t
), flags
);
1679 pp_cxx_right_paren (pp
);
1684 pp_cxx_ws_string (pp
, "throw");
1685 pp_cxx_whitespace (pp
);
1686 pp_cxx_left_paren (pp
);
1687 if (TREE_VALUE (t
) != NULL_TREE
)
1690 dump_type (pp
, TREE_VALUE (t
), flags
);
1694 pp_separate_with_comma (pp
);
1696 pp_cxx_right_paren (pp
);
1700 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1701 and destructors properly. */
1704 dump_function_name (cxx_pretty_printer
*pp
, tree t
, int flags
)
1706 tree name
= DECL_NAME (t
);
1708 /* We can get here with a decl that was synthesized by language-
1709 independent machinery (e.g. coverage.c) in which case it won't
1710 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1711 will crash. In this case it is safe just to print out the
1713 if (!DECL_LANG_SPECIFIC (t
))
1715 pp_cxx_tree_identifier (pp
, name
);
1719 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1720 t
= DECL_TEMPLATE_RESULT (t
);
1722 /* Don't let the user see __comp_ctor et al. */
1723 if (DECL_CONSTRUCTOR_P (t
)
1724 || DECL_DESTRUCTOR_P (t
))
1726 if (LAMBDA_TYPE_P (DECL_CONTEXT (t
)))
1727 name
= get_identifier ("<lambda>");
1728 else if (TYPE_ANONYMOUS_P (DECL_CONTEXT (t
)))
1729 name
= get_identifier ("<constructor>");
1731 name
= constructor_name (DECL_CONTEXT (t
));
1734 if (DECL_DESTRUCTOR_P (t
))
1736 pp_cxx_complement (pp
);
1737 dump_decl (pp
, name
, TFF_PLAIN_IDENTIFIER
);
1739 else if (DECL_CONV_FN_P (t
))
1741 /* This cannot use the hack that the operator's return
1742 type is stashed off of its name because it may be
1743 used for error reporting. In the case of conflicting
1744 declarations, both will have the same name, yet
1745 the types will be different, hence the TREE_TYPE field
1746 of the first name will be clobbered by the second. */
1747 pp_cxx_ws_string (pp
, "operator");
1748 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1750 else if (name
&& IDENTIFIER_OPNAME_P (name
))
1751 pp_cxx_tree_identifier (pp
, name
);
1752 else if (name
&& UDLIT_OPER_P (name
))
1753 pp_cxx_tree_identifier (pp
, name
);
1755 dump_decl (pp
, name
, flags
);
1757 if (DECL_TEMPLATE_INFO (t
)
1758 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1759 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1760 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1761 dump_template_parms (pp
, DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
),
1765 /* Dump the template parameters from the template info INFO under control of
1766 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1767 specialization (partial or complete). For partial specializations we show
1768 the specialized parameter values. For a primary template we show no
1772 dump_template_parms (cxx_pretty_printer
*pp
, tree info
,
1773 int primary
, int flags
)
1775 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1777 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1779 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1780 pp_cxx_begin_template_argument_list (pp
);
1782 /* Be careful only to print things when we have them, so as not
1783 to crash producing error messages. */
1784 if (args
&& !primary
)
1787 len
= get_non_default_template_args_count (args
, flags
);
1789 args
= INNERMOST_TEMPLATE_ARGS (args
);
1790 for (ix
= 0; ix
!= len
; ix
++)
1792 tree arg
= TREE_VEC_ELT (args
, ix
);
1794 /* Only print a comma if we know there is an argument coming. In
1795 the case of an empty template argument pack, no actual
1796 argument will be printed. */
1798 && (!ARGUMENT_PACK_P (arg
)
1799 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
1800 pp_separate_with_comma (pp
);
1803 pp_string (pp
, M_("<template parameter error>"));
1805 dump_template_argument (pp
, arg
, flags
);
1810 tree tpl
= TI_TEMPLATE (info
);
1811 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1814 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1815 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1817 for (ix
= 0; ix
!= len
; ix
++)
1821 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1823 pp_string (pp
, M_("<template parameter error>"));
1827 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1830 pp_separate_with_comma (pp
);
1832 dump_decl (pp
, parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1835 pp_cxx_end_template_argument_list (pp
);
1838 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1839 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1842 dump_call_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
, bool skipfirst
)
1845 call_expr_arg_iterator iter
;
1847 pp_cxx_left_paren (pp
);
1848 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1854 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1855 if (more_call_expr_args_p (&iter
))
1856 pp_separate_with_comma (pp
);
1859 pp_cxx_right_paren (pp
);
1862 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1863 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1867 dump_aggr_init_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
,
1871 aggr_init_expr_arg_iterator iter
;
1873 pp_cxx_left_paren (pp
);
1874 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1880 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1881 if (more_aggr_init_expr_args_p (&iter
))
1882 pp_separate_with_comma (pp
);
1885 pp_cxx_right_paren (pp
);
1888 /* Print out a list of initializers (subr of dump_expr). */
1891 dump_expr_list (cxx_pretty_printer
*pp
, tree l
, int flags
)
1895 dump_expr (pp
, TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1898 pp_separate_with_comma (pp
);
1902 /* Print out a vector of initializers (subr of dump_expr). */
1905 dump_expr_init_vec (cxx_pretty_printer
*pp
, vec
<constructor_elt
, va_gc
> *v
,
1908 unsigned HOST_WIDE_INT idx
;
1911 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1913 dump_expr (pp
, value
, flags
| TFF_EXPR_IN_PARENS
);
1914 if (idx
!= v
->length () - 1)
1915 pp_separate_with_comma (pp
);
1920 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1921 function. Resolve it to a close relative -- in the sense of static
1922 type -- variant being overridden. That is close to what was written in
1923 the source code. Subroutine of dump_expr. */
1926 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1928 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1929 HOST_WIDE_INT index
= tree_to_uhwi (OBJ_TYPE_REF_TOKEN (ref
));
1930 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1933 fun
= TREE_CHAIN (fun
);
1934 index
-= (TARGET_VTABLE_USES_DESCRIPTORS
1935 ? TARGET_VTABLE_USES_DESCRIPTORS
: 1);
1941 /* Print out an expression E under control of FLAGS. */
1944 dump_expr (cxx_pretty_printer
*pp
, tree t
, int flags
)
1951 if (STATEMENT_CLASS_P (t
))
1953 pp_cxx_ws_string (pp
, M_("<statement>"));
1957 switch (TREE_CODE (t
))
1965 case NAMESPACE_DECL
:
1969 case IDENTIFIER_NODE
:
1970 dump_decl (pp
, t
, ((flags
& ~(TFF_DECL_SPECIFIERS
|TFF_RETURN_TYPE
1971 |TFF_TEMPLATE_HEADER
))
1972 | TFF_NO_FUNCTION_ARGUMENTS
));
1976 if (SSA_NAME_VAR (t
)
1977 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t
)))
1978 dump_expr (pp
, SSA_NAME_VAR (t
), flags
);
1980 pp_cxx_ws_string (pp
, M_("<unknown>"));
1991 case USERDEF_LITERAL
:
1992 pp_cxx_userdef_literal (pp
, t
);
1996 /* While waiting for caret diagnostics, avoid printing
1997 __cxa_allocate_exception, __cxa_throw, and the like. */
1998 pp_cxx_ws_string (pp
, M_("<throw-expression>"));
2003 dump_type (pp
, PTRMEM_CST_CLASS (t
), flags
);
2004 pp_cxx_colon_colon (pp
);
2005 pp_cxx_tree_identifier (pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
2009 pp_cxx_left_paren (pp
);
2010 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2011 pp_separate_with_comma (pp
);
2012 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2013 pp_cxx_right_paren (pp
);
2017 pp_cxx_left_paren (pp
);
2018 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2019 pp_string (pp
, " ? ");
2020 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2021 pp_string (pp
, " : ");
2022 dump_expr (pp
, TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
2023 pp_cxx_right_paren (pp
);
2027 if (TREE_HAS_CONSTRUCTOR (t
))
2029 pp_cxx_ws_string (pp
, "new");
2030 pp_cxx_whitespace (pp
);
2031 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
2034 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2037 case AGGR_INIT_EXPR
:
2039 tree fn
= NULL_TREE
;
2041 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
2042 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
2044 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
2046 if (DECL_CONSTRUCTOR_P (fn
))
2047 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
2049 dump_decl (pp
, fn
, 0);
2052 dump_expr (pp
, AGGR_INIT_EXPR_FN (t
), 0);
2054 dump_aggr_init_expr_args (pp
, t
, flags
, true);
2059 tree fn
= CALL_EXPR_FN (t
);
2060 bool skipfirst
= false;
2062 /* Deal with internal functions. */
2063 if (fn
== NULL_TREE
)
2065 pp_string (pp
, internal_fn_name (CALL_EXPR_IFN (t
)));
2066 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2070 if (TREE_CODE (fn
) == ADDR_EXPR
)
2071 fn
= TREE_OPERAND (fn
, 0);
2073 /* Nobody is interested in seeing the guts of vcalls. */
2074 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
2075 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
2077 if (TREE_TYPE (fn
) != NULL_TREE
2078 && NEXT_CODE (fn
) == METHOD_TYPE
2079 && call_expr_nargs (t
))
2081 tree ob
= CALL_EXPR_ARG (t
, 0);
2082 if (TREE_CODE (ob
) == ADDR_EXPR
)
2084 dump_expr (pp
, TREE_OPERAND (ob
, 0),
2085 flags
| TFF_EXPR_IN_PARENS
);
2088 else if (TREE_CODE (ob
) != PARM_DECL
2089 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
2091 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2096 if (flag_sanitize
& SANITIZE_UNDEFINED
2097 && is_ubsan_builtin_p (fn
))
2099 pp_string (cxx_pp
, M_("<ubsan routine call>"));
2102 dump_expr (pp
, fn
, flags
| TFF_EXPR_IN_PARENS
);
2103 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2108 /* Note that this only works for G++ target exprs. If somebody
2109 builds a general TARGET_EXPR, there's no way to represent that
2110 it initializes anything other that the parameter slot for the
2111 default argument. Note we may have cleared out the first
2112 operand in expand_expr, so don't go killing ourselves. */
2113 if (TREE_OPERAND (t
, 1))
2114 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2117 case POINTER_PLUS_EXPR
:
2118 dump_binary_op (pp
, "+", t
, flags
);
2123 dump_binary_op (pp
, assignment_operator_name_info
[NOP_EXPR
].name
,
2130 case TRUNC_DIV_EXPR
:
2131 case TRUNC_MOD_EXPR
:
2139 case TRUTH_ANDIF_EXPR
:
2140 case TRUTH_ORIF_EXPR
:
2147 case EXACT_DIV_EXPR
:
2148 dump_binary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2152 case FLOOR_DIV_EXPR
:
2153 case ROUND_DIV_EXPR
:
2155 dump_binary_op (pp
, "/", t
, flags
);
2159 case FLOOR_MOD_EXPR
:
2160 case ROUND_MOD_EXPR
:
2161 dump_binary_op (pp
, "%", t
, flags
);
2166 tree ob
= TREE_OPERAND (t
, 0);
2167 if (INDIRECT_REF_P (ob
))
2169 ob
= TREE_OPERAND (ob
, 0);
2170 if (TREE_CODE (ob
) != PARM_DECL
2172 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
2174 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2175 if (TREE_CODE (TREE_TYPE (ob
)) == REFERENCE_TYPE
)
2183 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2186 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
2191 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2192 pp_cxx_left_bracket (pp
);
2193 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2194 pp_cxx_right_bracket (pp
);
2197 case ARRAY_NOTATION_REF
:
2198 dump_expr (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
2199 pp_cxx_left_bracket (pp
);
2200 dump_expr (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
2202 dump_expr (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
2204 dump_expr (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
2205 pp_cxx_right_bracket (pp
);
2208 case UNARY_PLUS_EXPR
:
2209 dump_unary_op (pp
, "+", t
, flags
);
2213 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
2214 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
2215 /* An ADDR_EXPR can have reference type. In that case, we
2216 shouldn't print the `&' doing so indicates to the user
2217 that the expression has pointer type. */
2219 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
2220 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2221 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
2222 dump_unary_op (pp
, "&&", t
, flags
);
2224 dump_unary_op (pp
, "&", t
, flags
);
2228 if (TREE_HAS_CONSTRUCTOR (t
))
2230 t
= TREE_OPERAND (t
, 0);
2231 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
2232 dump_expr (pp
, CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
2233 dump_call_expr_args (pp
, t
, flags
, true);
2237 if (TREE_OPERAND (t
,0) != NULL_TREE
2238 && TREE_TYPE (TREE_OPERAND (t
, 0))
2239 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
2240 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2242 dump_unary_op (pp
, "*", t
, flags
);
2247 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
2248 && integer_zerop (TREE_OPERAND (t
, 1)))
2249 dump_expr (pp
, TREE_OPERAND (TREE_OPERAND (t
, 0), 0), flags
);
2253 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2255 pp_cxx_left_paren (pp
);
2256 if (!integer_onep (TYPE_SIZE_UNIT
2257 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))))))
2259 pp_cxx_left_paren (pp
);
2260 dump_type (pp
, ptr_type_node
, flags
);
2261 pp_cxx_right_paren (pp
);
2264 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2265 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2267 pp_cxx_ws_string (pp
, "+");
2268 dump_expr (pp
, fold_convert (ssizetype
, TREE_OPERAND (t
, 1)),
2270 pp_cxx_right_paren (pp
);
2277 case TRUTH_NOT_EXPR
:
2278 case PREDECREMENT_EXPR
:
2279 case PREINCREMENT_EXPR
:
2280 dump_unary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2283 case POSTDECREMENT_EXPR
:
2284 case POSTINCREMENT_EXPR
:
2285 pp_cxx_left_paren (pp
);
2286 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2287 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2288 pp_cxx_right_paren (pp
);
2291 case NON_LVALUE_EXPR
:
2292 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2293 should be another level of INDIRECT_REF so that I don't have to do
2295 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
2297 tree next
= TREE_TYPE (TREE_TYPE (t
));
2299 while (TYPE_PTR_P (next
))
2300 next
= TREE_TYPE (next
);
2302 if (TREE_CODE (next
) == FUNCTION_TYPE
)
2304 if (flags
& TFF_EXPR_IN_PARENS
)
2305 pp_cxx_left_paren (pp
);
2307 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2308 if (flags
& TFF_EXPR_IN_PARENS
)
2309 pp_cxx_right_paren (pp
);
2312 /* Else fall through. */
2314 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2318 case IMPLICIT_CONV_EXPR
:
2319 case VIEW_CONVERT_EXPR
:
2321 tree op
= TREE_OPERAND (t
, 0);
2322 tree ttype
= TREE_TYPE (t
);
2323 tree optype
= TREE_TYPE (op
);
2325 if (TREE_CODE (ttype
) != TREE_CODE (optype
)
2326 && POINTER_TYPE_P (ttype
)
2327 && POINTER_TYPE_P (optype
)
2328 && same_type_p (TREE_TYPE (optype
),
2331 if (TREE_CODE (ttype
) == REFERENCE_TYPE
)
2334 if (TREE_CODE (op
) == ADDR_EXPR
)
2335 dump_expr (pp
, TREE_OPERAND (op
, 0), flags
);
2337 dump_unary_op (pp
, "*", t
, flags
);
2340 dump_unary_op (pp
, "&", t
, flags
);
2342 else if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
2344 /* It is a cast, but we cannot tell whether it is a
2345 reinterpret or static cast. Use the C style notation. */
2346 if (flags
& TFF_EXPR_IN_PARENS
)
2347 pp_cxx_left_paren (pp
);
2348 pp_cxx_left_paren (pp
);
2349 dump_type (pp
, TREE_TYPE (t
), flags
);
2350 pp_cxx_right_paren (pp
);
2351 dump_expr (pp
, op
, flags
| TFF_EXPR_IN_PARENS
);
2352 if (flags
& TFF_EXPR_IN_PARENS
)
2353 pp_cxx_right_paren (pp
);
2356 dump_expr (pp
, op
, flags
);
2361 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
2363 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
2365 if (integer_zerop (idx
))
2367 /* A NULL pointer-to-member constant. */
2368 pp_cxx_left_paren (pp
);
2369 pp_cxx_left_paren (pp
);
2370 dump_type (pp
, TREE_TYPE (t
), flags
);
2371 pp_cxx_right_paren (pp
);
2372 pp_character (pp
, '0');
2373 pp_cxx_right_paren (pp
);
2376 else if (tree_fits_shwi_p (idx
))
2379 unsigned HOST_WIDE_INT n
;
2381 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
2382 t
= TYPE_METHOD_BASETYPE (t
);
2383 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
2385 n
= tree_to_shwi (idx
);
2387 /* Map vtable index back one, to allow for the null pointer to
2391 while (n
> 0 && virtuals
)
2394 virtuals
= TREE_CHAIN (virtuals
);
2398 dump_expr (pp
, BV_FN (virtuals
),
2399 flags
| TFF_EXPR_IN_PARENS
);
2404 if (TREE_TYPE (t
) && LAMBDA_TYPE_P (TREE_TYPE (t
)))
2405 pp_string (pp
, "<lambda closure object>");
2406 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
2408 dump_type (pp
, TREE_TYPE (t
), 0);
2409 pp_cxx_left_paren (pp
);
2410 pp_cxx_right_paren (pp
);
2414 if (!BRACE_ENCLOSED_INITIALIZER_P (t
))
2415 dump_type (pp
, TREE_TYPE (t
), 0);
2416 pp_cxx_left_brace (pp
);
2417 dump_expr_init_vec (pp
, CONSTRUCTOR_ELTS (t
), flags
);
2418 pp_cxx_right_brace (pp
);
2425 tree ob
= TREE_OPERAND (t
, 0);
2426 if (is_dummy_object (ob
))
2428 t
= TREE_OPERAND (t
, 1);
2429 if (TREE_CODE (t
) == FUNCTION_DECL
)
2431 dump_expr (pp
, t
, flags
| TFF_EXPR_IN_PARENS
);
2432 else if (BASELINK_P (t
))
2433 dump_expr (pp
, OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
2434 flags
| TFF_EXPR_IN_PARENS
);
2436 dump_decl (pp
, t
, flags
);
2440 if (INDIRECT_REF_P (ob
))
2442 dump_expr (pp
, TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
2448 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2452 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2457 case TEMPLATE_PARM_INDEX
:
2458 dump_decl (pp
, TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
2462 if (TREE_OPERAND (t
, 0) == NULL_TREE
2463 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
2465 dump_type (pp
, TREE_TYPE (t
), flags
);
2466 pp_cxx_left_paren (pp
);
2467 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2468 pp_cxx_right_paren (pp
);
2472 pp_cxx_left_paren (pp
);
2473 dump_type (pp
, TREE_TYPE (t
), flags
);
2474 pp_cxx_right_paren (pp
);
2475 pp_cxx_left_paren (pp
);
2476 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2477 pp_cxx_right_paren (pp
);
2481 case STATIC_CAST_EXPR
:
2482 pp_cxx_ws_string (pp
, "static_cast");
2484 case REINTERPRET_CAST_EXPR
:
2485 pp_cxx_ws_string (pp
, "reinterpret_cast");
2487 case CONST_CAST_EXPR
:
2488 pp_cxx_ws_string (pp
, "const_cast");
2490 case DYNAMIC_CAST_EXPR
:
2491 pp_cxx_ws_string (pp
, "dynamic_cast");
2493 pp_cxx_begin_template_argument_list (pp
);
2494 dump_type (pp
, TREE_TYPE (t
), flags
);
2495 pp_cxx_end_template_argument_list (pp
);
2496 pp_cxx_left_paren (pp
);
2497 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2498 pp_cxx_right_paren (pp
);
2502 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2508 if (TREE_CODE (t
) == SIZEOF_EXPR
)
2509 pp_cxx_ws_string (pp
, "sizeof");
2512 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
2513 pp_cxx_ws_string (pp
, "__alignof__");
2515 op
= TREE_OPERAND (t
, 0);
2516 if (PACK_EXPANSION_P (op
))
2518 pp_string (pp
, "...");
2519 op
= PACK_EXPANSION_PATTERN (op
);
2521 pp_cxx_whitespace (pp
);
2522 pp_cxx_left_paren (pp
);
2523 if (TREE_CODE (t
) == SIZEOF_EXPR
&& SIZEOF_EXPR_TYPE_P (t
))
2524 dump_type (pp
, TREE_TYPE (op
), flags
);
2525 else if (TYPE_P (TREE_OPERAND (t
, 0)))
2526 dump_type (pp
, op
, flags
);
2528 dump_expr (pp
, op
, flags
);
2529 pp_cxx_right_paren (pp
);
2532 case AT_ENCODE_EXPR
:
2533 pp_cxx_ws_string (pp
, "@encode");
2534 pp_cxx_whitespace (pp
);
2535 pp_cxx_left_paren (pp
);
2536 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
2537 pp_cxx_right_paren (pp
);
2541 pp_cxx_ws_string (pp
, "noexcept");
2542 pp_cxx_whitespace (pp
);
2543 pp_cxx_left_paren (pp
);
2544 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2545 pp_cxx_right_paren (pp
);
2550 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2551 pp_cxx_whitespace (pp
);
2552 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2556 pp_string (pp
, M_("<unparsed>"));
2559 case TRY_CATCH_EXPR
:
2560 case WITH_CLEANUP_EXPR
:
2561 case CLEANUP_POINT_EXPR
:
2562 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2565 case PSEUDO_DTOR_EXPR
:
2566 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2568 if (TREE_OPERAND (t
, 1))
2570 dump_type (pp
, TREE_OPERAND (t
, 1), flags
);
2571 pp_cxx_colon_colon (pp
);
2573 pp_cxx_complement (pp
);
2574 dump_type (pp
, TREE_OPERAND (t
, 2), flags
);
2577 case TEMPLATE_ID_EXPR
:
2578 dump_decl (pp
, t
, flags
);
2584 case STATEMENT_LIST
:
2585 /* We don't yet have a way of dumping statements in a
2586 human-readable format. */
2587 pp_string (pp
, "({...})");
2591 pp_string (pp
, "while (1) { ");
2592 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2593 pp_cxx_right_brace (pp
);
2597 pp_string (pp
, "if (");
2598 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2599 pp_string (pp
, ") break; ");
2603 dump_expr (pp
, BASELINK_FUNCTIONS (t
), flags
& ~TFF_EXPR_IN_PARENS
);
2606 case EMPTY_CLASS_EXPR
:
2607 dump_type (pp
, TREE_TYPE (t
), flags
);
2608 pp_cxx_left_paren (pp
);
2609 pp_cxx_right_paren (pp
);
2612 case NON_DEPENDENT_EXPR
:
2613 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2616 case ARGUMENT_PACK_SELECT
:
2617 dump_template_argument (pp
, ARGUMENT_PACK_SELECT_FROM_PACK (t
), flags
);
2629 pp_type_specifier_seq (pp
, t
);
2633 /* We get here when we want to print a dependent type as an
2634 id-expression, without any disambiguator decoration. */
2635 pp
->id_expression (t
);
2638 case TEMPLATE_TYPE_PARM
:
2639 case TEMPLATE_TEMPLATE_PARM
:
2640 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2641 dump_type (pp
, t
, flags
);
2645 pp_cxx_trait_expression (pp
, t
);
2649 pp_cxx_va_arg_expression (pp
, t
);
2653 pp_cxx_offsetof_expression (pp
, t
);
2657 dump_decl (pp
, t
, flags
);
2660 case EXPR_PACK_EXPANSION
:
2667 case VEC_DELETE_EXPR
:
2673 case UNORDERED_EXPR
:
2683 case FIX_TRUNC_EXPR
:
2688 case TRUTH_AND_EXPR
:
2690 case TRUTH_XOR_EXPR
:
2691 if (flags
& TFF_EXPR_IN_PARENS
)
2692 pp_cxx_left_paren (pp
);
2694 if (flags
& TFF_EXPR_IN_PARENS
)
2695 pp_cxx_right_paren (pp
);
2699 dump_expr (pp
, resolve_virtual_fun_from_obj_type_ref (t
), flags
);
2703 pp_string (pp
, M_("<lambda>"));
2707 pp_cxx_left_paren (pp
);
2708 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2709 pp_cxx_right_paren (pp
);
2713 pp_cxx_requires_expr (cxx_pp
, t
);
2717 pp_cxx_simple_requirement (cxx_pp
, t
);
2721 pp_cxx_type_requirement (cxx_pp
, t
);
2725 pp_cxx_compound_requirement (cxx_pp
, t
);
2729 pp_cxx_nested_requirement (cxx_pp
, t
);
2741 pp_cxx_constraint (cxx_pp
, t
);
2744 case PLACEHOLDER_EXPR
:
2745 pp_string (pp
, M_("*this"));
2748 /* This list is incomplete, but should suffice for now.
2749 It is very important that `sorry' does not call
2750 `report_error_function'. That could cause an infinite loop. */
2752 pp_unsupported_tree (pp
, t
);
2753 /* fall through to ERROR_MARK... */
2755 pp_string (pp
, M_("<expression error>"));
2761 dump_binary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
,
2764 pp_cxx_left_paren (pp
);
2765 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2766 pp_cxx_whitespace (pp
);
2768 pp_cxx_ws_string (pp
, opstring
);
2770 pp_string (pp
, M_("<unknown operator>"));
2771 pp_cxx_whitespace (pp
);
2772 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2773 pp_cxx_right_paren (pp
);
2777 dump_unary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
, int flags
)
2779 if (flags
& TFF_EXPR_IN_PARENS
)
2780 pp_cxx_left_paren (pp
);
2781 pp_cxx_ws_string (pp
, opstring
);
2782 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2783 if (flags
& TFF_EXPR_IN_PARENS
)
2784 pp_cxx_right_paren (pp
);
2788 reinit_cxx_pp (void)
2790 pp_clear_output_area (cxx_pp
);
2791 cxx_pp
->padding
= pp_none
;
2792 pp_indentation (cxx_pp
) = 0;
2793 pp_needs_newline (cxx_pp
) = false;
2794 cxx_pp
->enclosing_scope
= current_function_decl
;
2797 /* Same as pp_formatted_text, except the return string is a separate
2798 copy and has a GGC storage duration, e.g. an indefinite lifetime. */
2801 pp_ggc_formatted_text (pretty_printer
*pp
)
2803 return ggc_strdup (pp_formatted_text (pp
));
2806 /* Exported interface to stringifying types, exprs and decls under TFF_*
2810 type_as_string (tree typ
, int flags
)
2813 pp_translate_identifiers (cxx_pp
) = false;
2814 dump_type (cxx_pp
, typ
, flags
);
2815 return pp_ggc_formatted_text (cxx_pp
);
2819 type_as_string_translate (tree typ
, int flags
)
2822 dump_type (cxx_pp
, typ
, flags
);
2823 return pp_ggc_formatted_text (cxx_pp
);
2827 expr_as_string (tree decl
, int flags
)
2830 pp_translate_identifiers (cxx_pp
) = false;
2831 dump_expr (cxx_pp
, decl
, flags
);
2832 return pp_ggc_formatted_text (cxx_pp
);
2835 /* Wrap decl_as_string with options appropriate for dwarf. */
2838 decl_as_dwarf_string (tree decl
, int flags
)
2841 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2842 here will be adequate to get the desired behaviour. */
2843 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2844 name
= decl_as_string (decl
, flags
);
2845 /* Subsequent calls to the pretty printer shouldn't use this style. */
2846 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2851 decl_as_string (tree decl
, int flags
)
2854 pp_translate_identifiers (cxx_pp
) = false;
2855 dump_decl (cxx_pp
, decl
, flags
);
2856 return pp_ggc_formatted_text (cxx_pp
);
2860 decl_as_string_translate (tree decl
, int flags
)
2863 dump_decl (cxx_pp
, decl
, flags
);
2864 return pp_ggc_formatted_text (cxx_pp
);
2867 /* Wrap lang_decl_name with options appropriate for dwarf. */
2870 lang_decl_dwarf_name (tree decl
, int v
, bool translate
)
2873 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2874 here will be adequate to get the desired behaviour. */
2875 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2876 name
= lang_decl_name (decl
, v
, translate
);
2877 /* Subsequent calls to the pretty printer shouldn't use this style. */
2878 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2882 /* Generate the three forms of printable names for cxx_printable_name. */
2885 lang_decl_name (tree decl
, int v
, bool translate
)
2889 ? decl_as_string_translate (decl
, TFF_DECL_SPECIFIERS
)
2890 : decl_as_string (decl
, TFF_DECL_SPECIFIERS
));
2893 pp_translate_identifiers (cxx_pp
) = translate
;
2895 && (DECL_CLASS_SCOPE_P (decl
)
2896 || (DECL_NAMESPACE_SCOPE_P (decl
)
2897 && CP_DECL_CONTEXT (decl
) != global_namespace
)))
2899 dump_type (cxx_pp
, CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2900 pp_cxx_colon_colon (cxx_pp
);
2903 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2904 dump_function_name (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
);
2905 else if ((DECL_NAME (decl
) == NULL_TREE
)
2906 && TREE_CODE (decl
) == NAMESPACE_DECL
)
2907 dump_decl (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
| TFF_UNQUALIFIED_NAME
);
2909 dump_decl (cxx_pp
, DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2911 return pp_ggc_formatted_text (cxx_pp
);
2914 /* Return the location of a tree passed to %+ formats. */
2917 location_of (tree t
)
2921 t
= TYPE_MAIN_DECL (t
);
2923 return input_location
;
2925 else if (TREE_CODE (t
) == OVERLOAD
)
2926 t
= OVL_FUNCTION (t
);
2929 return DECL_SOURCE_LOCATION (t
);
2930 return EXPR_LOC_OR_LOC (t
, input_location
);
2933 /* Now the interfaces from error et al to dump_type et al. Each takes an
2934 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2938 decl_to_string (tree decl
, int verbose
)
2942 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2943 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2944 flags
= TFF_CLASS_KEY_OR_ENUM
;
2946 flags
|= TFF_DECL_SPECIFIERS
;
2947 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2948 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2949 flags
|= TFF_TEMPLATE_HEADER
;
2952 dump_decl (cxx_pp
, decl
, flags
);
2953 return pp_ggc_formatted_text (cxx_pp
);
2957 expr_to_string (tree decl
)
2960 dump_expr (cxx_pp
, decl
, 0);
2961 return pp_ggc_formatted_text (cxx_pp
);
2965 fndecl_to_string (tree fndecl
, int verbose
)
2969 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2970 | TFF_TEMPLATE_HEADER
;
2972 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2974 dump_decl (cxx_pp
, fndecl
, flags
);
2975 return pp_ggc_formatted_text (cxx_pp
);
2980 code_to_string (enum tree_code c
)
2982 return get_tree_code_name (c
);
2986 language_to_string (enum languages c
)
2993 case lang_cplusplus
:
3005 /* Return the proper printed version of a parameter to a C++ function. */
3008 parm_to_string (int p
)
3012 pp_string (cxx_pp
, "'this'");
3014 pp_decimal_int (cxx_pp
, p
+ 1);
3015 return pp_ggc_formatted_text (cxx_pp
);
3019 op_to_string (enum tree_code p
)
3021 tree id
= operator_name_info
[p
].identifier
;
3022 return id
? IDENTIFIER_POINTER (id
) : M_("<unknown>");
3026 type_to_string (tree typ
, int verbose
)
3030 flags
|= TFF_CLASS_KEY_OR_ENUM
;
3031 flags
|= TFF_TEMPLATE_HEADER
;
3034 dump_type (cxx_pp
, typ
, flags
);
3035 /* If we're printing a type that involves typedefs, also print the
3036 stripped version. But sometimes the stripped version looks
3037 exactly the same, so we don't want it after all. To avoid printing
3038 it in that case, we play ugly obstack games. */
3039 if (typ
&& TYPE_P (typ
) && typ
!= TYPE_CANONICAL (typ
)
3040 && !uses_template_parms (typ
))
3042 int aka_start
, aka_len
; char *p
;
3043 struct obstack
*ob
= pp_buffer (cxx_pp
)->obstack
;
3044 /* Remember the end of the initial dump. */
3045 int len
= obstack_object_size (ob
);
3046 tree aka
= strip_typedefs (typ
);
3047 pp_string (cxx_pp
, " {aka");
3048 pp_cxx_whitespace (cxx_pp
);
3049 /* And remember the start of the aka dump. */
3050 aka_start
= obstack_object_size (ob
);
3051 dump_type (cxx_pp
, aka
, flags
);
3052 aka_len
= obstack_object_size (ob
) - aka_start
;
3053 pp_right_brace (cxx_pp
);
3054 p
= (char*)obstack_base (ob
);
3055 /* If they are identical, cut off the aka with a NUL. */
3056 if (len
== aka_len
&& memcmp (p
, p
+aka_start
, len
) == 0)
3059 return pp_ggc_formatted_text (cxx_pp
);
3063 assop_to_string (enum tree_code p
)
3065 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
3066 return id
? IDENTIFIER_POINTER (id
) : M_("{unknown}");
3070 args_to_string (tree p
, int verbose
)
3074 flags
|= TFF_CLASS_KEY_OR_ENUM
;
3079 if (TYPE_P (TREE_VALUE (p
)))
3080 return type_as_string_translate (p
, flags
);
3083 for (; p
; p
= TREE_CHAIN (p
))
3085 if (TREE_VALUE (p
) == null_node
)
3086 pp_cxx_ws_string (cxx_pp
, "NULL");
3088 dump_type (cxx_pp
, error_type (TREE_VALUE (p
)), flags
);
3090 pp_separate_with_comma (cxx_pp
);
3092 return pp_ggc_formatted_text (cxx_pp
);
3095 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
3096 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
3100 subst_to_string (tree p
)
3102 tree decl
= TREE_PURPOSE (p
);
3103 tree targs
= TREE_VALUE (p
);
3104 tree tparms
= DECL_TEMPLATE_PARMS (decl
);
3105 int flags
= (TFF_DECL_SPECIFIERS
|TFF_TEMPLATE_HEADER
3106 |TFF_NO_TEMPLATE_BINDINGS
);
3112 dump_template_decl (cxx_pp
, TREE_PURPOSE (p
), flags
);
3113 dump_substitution (cxx_pp
, NULL
, tparms
, targs
, /*flags=*/0);
3114 return pp_ggc_formatted_text (cxx_pp
);
3118 cv_to_string (tree p
, int v
)
3121 cxx_pp
->padding
= v
? pp_before
: pp_none
;
3122 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
3123 return pp_ggc_formatted_text (cxx_pp
);
3127 eh_spec_to_string (tree p
, int /*v*/)
3131 dump_exception_spec (cxx_pp
, p
, flags
);
3132 return pp_ggc_formatted_text (cxx_pp
);
3135 /* Langhook for print_error_function. */
3137 cxx_print_error_function (diagnostic_context
*context
, const char *file
,
3138 diagnostic_info
*diagnostic
)
3140 lhd_print_error_function (context
, file
, diagnostic
);
3141 pp_set_prefix (context
->printer
, file
);
3142 maybe_print_instantiation_context (context
);
3146 cp_diagnostic_starter (diagnostic_context
*context
,
3147 diagnostic_info
*diagnostic
)
3149 diagnostic_report_current_module (context
, diagnostic_location (diagnostic
));
3150 cp_print_error_function (context
, diagnostic
);
3151 maybe_print_instantiation_context (context
);
3152 maybe_print_constexpr_context (context
);
3153 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
3157 /* Print current function onto BUFFER, in the process of reporting
3158 a diagnostic message. Called from cp_diagnostic_starter. */
3160 cp_print_error_function (diagnostic_context
*context
,
3161 diagnostic_info
*diagnostic
)
3163 /* If we are in an instantiation context, current_function_decl is likely
3164 to be wrong, so just rely on print_instantiation_full_context. */
3165 if (current_instantiation ())
3167 if (diagnostic_last_function_changed (context
, diagnostic
))
3169 const char *old_prefix
= context
->printer
->prefix
;
3170 const char *file
= LOCATION_FILE (diagnostic_location (diagnostic
));
3171 tree abstract_origin
= diagnostic_abstract_origin (diagnostic
);
3172 char *new_prefix
= (file
&& abstract_origin
== NULL
)
3173 ? file_name_as_prefix (context
, file
) : NULL
;
3175 pp_set_prefix (context
->printer
, new_prefix
);
3177 if (current_function_decl
== NULL
)
3178 pp_string (context
->printer
, _("At global scope:"));
3183 if (abstract_origin
)
3185 ao
= BLOCK_ABSTRACT_ORIGIN (abstract_origin
);
3186 while (TREE_CODE (ao
) == BLOCK
3187 && BLOCK_ABSTRACT_ORIGIN (ao
)
3188 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3189 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3190 gcc_assert (TREE_CODE (ao
) == FUNCTION_DECL
);
3194 fndecl
= current_function_decl
;
3196 pp_printf (context
->printer
, function_category (fndecl
),
3197 cxx_printable_name_translate (fndecl
, 2));
3199 while (abstract_origin
)
3202 tree block
= abstract_origin
;
3204 locus
= &BLOCK_SOURCE_LOCATION (block
);
3206 block
= BLOCK_SUPERCONTEXT (block
);
3207 while (block
&& TREE_CODE (block
) == BLOCK
3208 && BLOCK_ABSTRACT_ORIGIN (block
))
3210 ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3212 while (TREE_CODE (ao
) == BLOCK
3213 && BLOCK_ABSTRACT_ORIGIN (ao
)
3214 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3215 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3217 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3222 else if (TREE_CODE (ao
) != BLOCK
)
3225 block
= BLOCK_SUPERCONTEXT (block
);
3228 abstract_origin
= block
;
3231 while (block
&& TREE_CODE (block
) == BLOCK
)
3232 block
= BLOCK_SUPERCONTEXT (block
);
3234 if (block
&& TREE_CODE (block
) == FUNCTION_DECL
)
3236 abstract_origin
= NULL
;
3240 expanded_location s
= expand_location (*locus
);
3241 pp_character (context
->printer
, ',');
3242 pp_newline (context
->printer
);
3245 if (context
->show_column
&& s
.column
!= 0)
3246 pp_printf (context
->printer
,
3247 _(" inlined from %qs at %r%s:%d:%d%R"),
3248 cxx_printable_name_translate (fndecl
, 2),
3249 "locus", s
.file
, s
.line
, s
.column
);
3251 pp_printf (context
->printer
,
3252 _(" inlined from %qs at %r%s:%d%R"),
3253 cxx_printable_name_translate (fndecl
, 2),
3254 "locus", s
.file
, s
.line
);
3258 pp_printf (context
->printer
, _(" inlined from %qs"),
3259 cxx_printable_name_translate (fndecl
, 2));
3262 pp_character (context
->printer
, ':');
3264 pp_newline (context
->printer
);
3266 diagnostic_set_last_function (context
, diagnostic
);
3267 pp_destroy_prefix (context
->printer
);
3268 context
->printer
->prefix
= old_prefix
;
3272 /* Returns a description of FUNCTION using standard terminology. The
3273 result is a format string of the form "In CATEGORY %qs". */
3275 function_category (tree fn
)
3277 /* We can get called from the middle-end for diagnostics of function
3278 clones. Make sure we have language specific information before
3279 dereferencing it. */
3280 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn
))
3281 && DECL_FUNCTION_MEMBER_P (fn
))
3283 if (DECL_STATIC_FUNCTION_P (fn
))
3284 return _("In static member function %qs");
3285 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
3286 return _("In copy constructor %qs");
3287 else if (DECL_CONSTRUCTOR_P (fn
))
3288 return _("In constructor %qs");
3289 else if (DECL_DESTRUCTOR_P (fn
))
3290 return _("In destructor %qs");
3291 else if (LAMBDA_FUNCTION_P (fn
))
3292 return _("In lambda function");
3294 return _("In member function %qs");
3297 return _("In function %qs");
3300 /* Report the full context of a current template instantiation,
3303 print_instantiation_full_context (diagnostic_context
*context
)
3305 struct tinst_level
*p
= current_instantiation ();
3306 location_t location
= input_location
;
3310 pp_verbatim (context
->printer
,
3311 TREE_CODE (p
->decl
) == TREE_LIST
3312 ? _("%s: In substitution of %qS:\n")
3313 : _("%s: In instantiation of %q#D:\n"),
3314 LOCATION_FILE (location
),
3317 location
= p
->locus
;
3321 print_instantiation_partial_context (context
, p
, location
);
3324 /* Helper function of print_instantiation_partial_context() that
3325 prints a single line of instantiation context. */
3328 print_instantiation_partial_context_line (diagnostic_context
*context
,
3329 const struct tinst_level
*t
,
3330 location_t loc
, bool recursive_p
)
3332 if (loc
== UNKNOWN_LOCATION
)
3335 expanded_location xloc
= expand_location (loc
);
3337 if (context
->show_column
)
3338 pp_verbatim (context
->printer
, _("%r%s:%d:%d:%R "),
3339 "locus", xloc
.file
, xloc
.line
, xloc
.column
);
3341 pp_verbatim (context
->printer
, _("%r%s:%d:%R "),
3342 "locus", xloc
.file
, xloc
.line
);
3346 if (TREE_CODE (t
->decl
) == TREE_LIST
)
3347 pp_verbatim (context
->printer
,
3349 ? _("recursively required by substitution of %qS\n")
3350 : _("required by substitution of %qS\n"),
3353 pp_verbatim (context
->printer
,
3355 ? _("recursively required from %q#D\n")
3356 : _("required from %q#D\n"),
3361 pp_verbatim (context
->printer
,
3363 ? _("recursively required from here")
3364 : _("required from here"));
3368 /* Same as print_instantiation_full_context but less verbose. */
3371 print_instantiation_partial_context (diagnostic_context
*context
,
3372 struct tinst_level
*t0
, location_t loc
)
3374 struct tinst_level
*t
;
3377 location_t prev_loc
= loc
;
3379 for (t
= t0
; t
!= NULL
; t
= t
->next
)
3380 if (prev_loc
!= t
->locus
)
3382 prev_loc
= t
->locus
;
3388 if (template_backtrace_limit
3389 && n_total
> template_backtrace_limit
)
3391 int skip
= n_total
- template_backtrace_limit
;
3392 int head
= template_backtrace_limit
/ 2;
3394 /* Avoid skipping just 1. If so, skip 2. */
3398 head
= (template_backtrace_limit
- 1) / 2;
3401 for (n
= 0; n
< head
; n
++)
3403 gcc_assert (t
!= NULL
);
3404 if (loc
!= t
->locus
)
3405 print_instantiation_partial_context_line (context
, t
, loc
,
3406 /*recursive_p=*/false);
3410 if (t
!= NULL
&& skip
> 0)
3412 expanded_location xloc
;
3413 xloc
= expand_location (loc
);
3414 if (context
->show_column
)
3415 pp_verbatim (context
->printer
,
3416 _("%r%s:%d:%d:%R [ skipping %d instantiation "
3417 "contexts, use -ftemplate-backtrace-limit=0 to "
3419 "locus", xloc
.file
, xloc
.line
, xloc
.column
, skip
);
3421 pp_verbatim (context
->printer
,
3422 _("%r%s:%d:%R [ skipping %d instantiation "
3423 "contexts, use -ftemplate-backtrace-limit=0 to "
3425 "locus", xloc
.file
, xloc
.line
, skip
);
3430 } while (t
!= NULL
&& --skip
> 0);
3436 while (t
->next
!= NULL
&& t
->locus
== t
->next
->locus
)
3441 print_instantiation_partial_context_line (context
, t
, loc
,
3446 print_instantiation_partial_context_line (context
, NULL
, loc
,
3447 /*recursive_p=*/false);
3448 pp_newline (context
->printer
);
3451 /* Called from cp_thing to print the template context for an error. */
3453 maybe_print_instantiation_context (diagnostic_context
*context
)
3455 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3458 record_last_problematic_instantiation ();
3459 print_instantiation_full_context (context
);
3462 /* Report what constexpr call(s) we're trying to expand, if any. */
3465 maybe_print_constexpr_context (diagnostic_context
*context
)
3467 vec
<tree
> call_stack
= cx_error_context ();
3471 FOR_EACH_VEC_ELT (call_stack
, ix
, t
)
3473 expanded_location xloc
= expand_location (EXPR_LOCATION (t
));
3474 const char *s
= expr_as_string (t
, 0);
3475 if (context
->show_column
)
3476 pp_verbatim (context
->printer
,
3477 _("%r%s:%d:%d:%R in constexpr expansion of %qs"),
3478 "locus", xloc
.file
, xloc
.line
, xloc
.column
, s
);
3480 pp_verbatim (context
->printer
,
3481 _("%r%s:%d:%R in constexpr expansion of %qs"),
3482 "locus", xloc
.file
, xloc
.line
, s
);
3483 pp_newline (context
->printer
);
3487 /* Called from output_format -- during diagnostic message processing --
3488 to handle C++ specific format specifier with the following meanings:
3489 %A function argument-list.
3493 %F function declaration.
3494 %L language as used in extern "lang".
3496 %P function parameter whose position is indicated by an integer.
3497 %Q assignment operator.
3498 %S substitution (template + args)
3501 %X exception-specification. */
3503 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
3504 int precision
, bool wide
, bool set_locus
, bool verbose
)
3508 #define next_tree (t = va_arg (*text->args_ptr, tree))
3509 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3510 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3511 #define next_int va_arg (*text->args_ptr, int)
3513 if (precision
!= 0 || wide
)
3518 case 'A': result
= args_to_string (next_tree
, verbose
); break;
3519 case 'C': result
= code_to_string (next_tcode
); break;
3522 tree temp
= next_tree
;
3524 && DECL_HAS_DEBUG_EXPR_P (temp
))
3526 temp
= DECL_DEBUG_EXPR (temp
);
3529 result
= expr_to_string (temp
);
3533 result
= decl_to_string (temp
, verbose
);
3536 case 'E': result
= expr_to_string (next_tree
); break;
3537 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
3538 case 'L': result
= language_to_string (next_lang
); break;
3539 case 'O': result
= op_to_string (next_tcode
); break;
3540 case 'P': result
= parm_to_string (next_int
); break;
3541 case 'Q': result
= assop_to_string (next_tcode
); break;
3542 case 'S': result
= subst_to_string (next_tree
); break;
3543 case 'T': result
= type_to_string (next_tree
, verbose
); break;
3544 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
3545 case 'X': result
= eh_spec_to_string (next_tree
, verbose
); break;
3548 percent_K_format (text
);
3555 pp_string (pp
, result
);
3556 if (set_locus
&& t
!= NULL
)
3557 text
->set_location (0, location_of (t
));
3565 /* Warn about the use of C++0x features when appropriate. */
3567 maybe_warn_cpp0x (cpp0x_warn_str str
)
3569 if ((cxx_dialect
== cxx98
) && !in_system_header_at (input_location
))
3570 /* We really want to suppress this warning in system headers,
3571 because libstdc++ uses variadic templates even when we aren't
3575 case CPP0X_INITIALIZER_LISTS
:
3576 pedwarn (input_location
, 0,
3577 "extended initializer lists "
3578 "only available with -std=c++11 or -std=gnu++11");
3580 case CPP0X_EXPLICIT_CONVERSION
:
3581 pedwarn (input_location
, 0,
3582 "explicit conversion operators "
3583 "only available with -std=c++11 or -std=gnu++11");
3585 case CPP0X_VARIADIC_TEMPLATES
:
3586 pedwarn (input_location
, 0,
3587 "variadic templates "
3588 "only available with -std=c++11 or -std=gnu++11");
3590 case CPP0X_LAMBDA_EXPR
:
3591 pedwarn (input_location
, 0,
3592 "lambda expressions "
3593 "only available with -std=c++11 or -std=gnu++11");
3596 pedwarn (input_location
, 0,
3597 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3599 case CPP0X_SCOPED_ENUMS
:
3600 pedwarn (input_location
, 0,
3601 "scoped enums only available with -std=c++11 or -std=gnu++11");
3603 case CPP0X_DEFAULTED_DELETED
:
3604 pedwarn (input_location
, 0,
3605 "defaulted and deleted functions "
3606 "only available with -std=c++11 or -std=gnu++11");
3608 case CPP0X_INLINE_NAMESPACES
:
3609 pedwarn (input_location
, OPT_Wpedantic
,
3610 "inline namespaces "
3611 "only available with -std=c++11 or -std=gnu++11");
3613 case CPP0X_OVERRIDE_CONTROLS
:
3614 pedwarn (input_location
, 0,
3615 "override controls (override/final) "
3616 "only available with -std=c++11 or -std=gnu++11");
3619 pedwarn (input_location
, 0,
3620 "non-static data member initializers "
3621 "only available with -std=c++11 or -std=gnu++11");
3623 case CPP0X_USER_DEFINED_LITERALS
:
3624 pedwarn (input_location
, 0,
3625 "user-defined literals "
3626 "only available with -std=c++11 or -std=gnu++11");
3628 case CPP0X_DELEGATING_CTORS
:
3629 pedwarn (input_location
, 0,
3630 "delegating constructors "
3631 "only available with -std=c++11 or -std=gnu++11");
3633 case CPP0X_INHERITING_CTORS
:
3634 pedwarn (input_location
, 0,
3635 "inheriting constructors "
3636 "only available with -std=c++11 or -std=gnu++11");
3638 case CPP0X_ATTRIBUTES
:
3639 pedwarn (input_location
, 0,
3641 "only available with -std=c++11 or -std=gnu++11");
3643 case CPP0X_REF_QUALIFIER
:
3644 pedwarn (input_location
, 0,
3646 "only available with -std=c++11 or -std=gnu++11");
3653 /* Warn about the use of variadic templates when appropriate. */
3655 maybe_warn_variadic_templates (void)
3657 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES
);
3661 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3662 option OPT with text GMSGID. Use this function to report
3663 diagnostics for constructs that are invalid C++98, but valid
3666 pedwarn_cxx98 (location_t location
, int opt
, const char *gmsgid
, ...)
3668 diagnostic_info diagnostic
;
3672 va_start (ap
, gmsgid
);
3673 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
3674 (cxx_dialect
== cxx98
) ? DK_PEDWARN
: DK_WARNING
);
3675 diagnostic
.option_index
= opt
;
3676 ret
= report_diagnostic (&diagnostic
);
3681 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3682 we found when we tried to do the lookup. LOCATION is the location of
3683 the NAME identifier. */
3686 qualified_name_lookup_error (tree scope
, tree name
,
3687 tree decl
, location_t location
)
3689 if (scope
== error_mark_node
)
3690 ; /* We already complained. */
3691 else if (TYPE_P (scope
))
3693 if (!COMPLETE_TYPE_P (scope
))
3694 error_at (location
, "incomplete type %qT used in nested name specifier",
3696 else if (TREE_CODE (decl
) == TREE_LIST
)
3698 error_at (location
, "reference to %<%T::%D%> is ambiguous",
3700 print_candidates (decl
);
3703 error_at (location
, "%qD is not a member of %qT", name
, scope
);
3705 else if (scope
!= global_namespace
)
3707 error_at (location
, "%qD is not a member of %qD", name
, scope
);
3708 suggest_alternatives_for (location
, name
);
3712 error_at (location
, "%<::%D%> has not been declared", name
);
3713 suggest_alternatives_for (location
, name
);