1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
25 #include "stringpool.h"
28 #include "diagnostic.h"
29 #include "tree-diagnostic.h"
30 #include "langhooks-def.h"
32 #include "cxx-pretty-print.h"
33 #include "tree-pretty-print.h"
34 #include "c-family/c-objc.h"
36 #include "internal-fn.h"
38 #include <new> // For placement-new.
40 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
41 #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';')
43 /* cxx_pp is a C++ front-end-specific pretty printer: this is where we
44 dump C++ ASTs as strings. It is mostly used only by the various
45 tree -> string functions that are occasionally called from the
46 debugger or by the front-end for things like
47 __PRETTY_FUNCTION__. */
48 static cxx_pretty_printer scratch_pretty_printer
;
49 static cxx_pretty_printer
* cxx_pp
= &scratch_pretty_printer
;
51 /* Translate if being used for diagnostics, but not for dump files or
53 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
55 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
57 static const char *args_to_string (tree
, int);
58 static const char *assop_to_string (enum tree_code
);
59 static const char *code_to_string (enum tree_code
);
60 static const char *cv_to_string (tree
, int);
61 static const char *decl_to_string (tree
, int);
62 static const char *expr_to_string (tree
);
63 static const char *fndecl_to_string (tree
, int);
64 static const char *op_to_string (enum tree_code
);
65 static const char *parm_to_string (int);
66 static const char *type_to_string (tree
, int);
68 static void dump_alias_template_specialization (cxx_pretty_printer
*, tree
, int);
69 static void dump_type (cxx_pretty_printer
*, tree
, int);
70 static void dump_typename (cxx_pretty_printer
*, tree
, int);
71 static void dump_simple_decl (cxx_pretty_printer
*, tree
, tree
, int);
72 static void dump_decl (cxx_pretty_printer
*, tree
, int);
73 static void dump_template_decl (cxx_pretty_printer
*, tree
, int);
74 static void dump_function_decl (cxx_pretty_printer
*, tree
, int);
75 static void dump_expr (cxx_pretty_printer
*, tree
, int);
76 static void dump_unary_op (cxx_pretty_printer
*, const char *, tree
, int);
77 static void dump_binary_op (cxx_pretty_printer
*, const char *, tree
, int);
78 static void dump_aggr_type (cxx_pretty_printer
*, tree
, int);
79 static void dump_type_prefix (cxx_pretty_printer
*, tree
, int);
80 static void dump_type_suffix (cxx_pretty_printer
*, tree
, int);
81 static void dump_function_name (cxx_pretty_printer
*, tree
, int);
82 static void dump_call_expr_args (cxx_pretty_printer
*, tree
, int, bool);
83 static void dump_aggr_init_expr_args (cxx_pretty_printer
*, tree
, int, bool);
84 static void dump_expr_list (cxx_pretty_printer
*, tree
, int);
85 static void dump_global_iord (cxx_pretty_printer
*, tree
);
86 static void dump_parameters (cxx_pretty_printer
*, tree
, int);
87 static void dump_ref_qualifier (cxx_pretty_printer
*, tree
, int);
88 static void dump_exception_spec (cxx_pretty_printer
*, tree
, int);
89 static void dump_template_argument (cxx_pretty_printer
*, tree
, int);
90 static void dump_template_argument_list (cxx_pretty_printer
*, tree
, int);
91 static void dump_template_parameter (cxx_pretty_printer
*, tree
, int);
92 static void dump_template_bindings (cxx_pretty_printer
*, tree
, tree
,
94 static void dump_scope (cxx_pretty_printer
*, tree
, int);
95 static void dump_template_parms (cxx_pretty_printer
*, tree
, int, int);
96 static int get_non_default_template_args_count (tree
, int);
97 static const char *function_category (tree
);
98 static void maybe_print_constexpr_context (diagnostic_context
*);
99 static void maybe_print_instantiation_context (diagnostic_context
*);
100 static void print_instantiation_full_context (diagnostic_context
*);
101 static void print_instantiation_partial_context (diagnostic_context
*,
102 struct tinst_level
*,
104 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
105 static void cp_print_error_function (diagnostic_context
*, diagnostic_info
*);
107 static bool cp_printer (pretty_printer
*, text_info
*, const char *,
108 int, bool, bool, bool);
110 /* CONTEXT->printer is a basic pretty printer that was constructed
111 presumably by diagnostic_initialize(), called early in the
112 compiler's initialization process (in general_init) Before the FE
113 is initialized. This (C++) FE-specific diagnostic initializer is
114 thus replacing the basic pretty printer with one that has C++-aware
118 cxx_initialize_diagnostics (diagnostic_context
*context
)
120 pretty_printer
*base
= context
->printer
;
121 cxx_pretty_printer
*pp
= XNEW (cxx_pretty_printer
);
122 context
->printer
= new (pp
) cxx_pretty_printer ();
124 /* It is safe to free this object because it was previously XNEW()'d. */
125 base
->~pretty_printer ();
128 c_common_diagnostics_set_defaults (context
);
129 diagnostic_starter (context
) = cp_diagnostic_starter
;
130 /* diagnostic_finalizer is already c_diagnostic_finalizer. */
131 diagnostic_format_decoder (context
) = cp_printer
;
134 /* Initialize the global cxx_pp that is used as the memory store for
135 the string representation of C++ AST. See the description of
141 new (cxx_pp
) cxx_pretty_printer ();
144 /* Dump a scope, if deemed necessary. */
147 dump_scope (cxx_pretty_printer
*pp
, tree scope
, int flags
)
149 int f
= flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
);
151 if (scope
== NULL_TREE
)
154 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
156 if (scope
!= global_namespace
)
158 dump_decl (pp
, scope
, f
);
159 pp_cxx_colon_colon (pp
);
162 else if (AGGREGATE_TYPE_P (scope
))
164 dump_type (pp
, scope
, f
);
165 pp_cxx_colon_colon (pp
);
167 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
169 dump_function_decl (pp
, scope
, f
);
170 pp_cxx_colon_colon (pp
);
174 /* Dump the template ARGument under control of FLAGS. */
177 dump_template_argument (cxx_pretty_printer
*pp
, tree arg
, int flags
)
179 if (ARGUMENT_PACK_P (arg
))
180 dump_template_argument_list (pp
, ARGUMENT_PACK_ARGS (arg
),
181 /* No default args in argument packs. */
182 flags
|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
);
183 else if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
184 dump_type (pp
, arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
187 if (TREE_CODE (arg
) == TREE_LIST
)
188 arg
= TREE_VALUE (arg
);
190 dump_expr (pp
, arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
194 /* Count the number of template arguments ARGS whose value does not
195 match the (optional) default template parameter in PARAMS */
198 get_non_default_template_args_count (tree args
, int flags
)
200 int n
= TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args
));
202 if (/* We use this flag when generating debug information. We don't
203 want to expand templates at this point, for this may generate
204 new decls, which gets decl counts out of sync, which may in
205 turn cause codegen differences between compilations with and
207 (flags
& TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS
) != 0
208 || !flag_pretty_templates
)
211 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args
));
214 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
218 dump_template_argument_list (cxx_pretty_printer
*pp
, tree args
, int flags
)
220 int n
= get_non_default_template_args_count (args
, flags
);
224 for (i
= 0; i
< n
; ++i
)
226 tree arg
= TREE_VEC_ELT (args
, i
);
228 /* Only print a comma if we know there is an argument coming. In
229 the case of an empty template argument pack, no actual
230 argument will be printed. */
232 && (!ARGUMENT_PACK_P (arg
)
233 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
234 pp_separate_with_comma (pp
);
236 dump_template_argument (pp
, arg
, flags
);
241 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
244 dump_template_parameter (cxx_pretty_printer
*pp
, tree parm
, int flags
)
249 if (parm
== error_mark_node
)
252 p
= TREE_VALUE (parm
);
253 a
= TREE_PURPOSE (parm
);
255 if (TREE_CODE (p
) == TYPE_DECL
)
257 if (flags
& TFF_DECL_SPECIFIERS
)
259 pp_cxx_ws_string (pp
, "class");
260 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p
)))
261 pp_cxx_ws_string (pp
, "...");
263 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
265 else if (DECL_NAME (p
))
266 pp_cxx_tree_identifier (pp
, DECL_NAME (p
));
268 pp_cxx_canonical_template_parameter (pp
, TREE_TYPE (p
));
271 dump_decl (pp
, p
, flags
| TFF_DECL_SPECIFIERS
);
273 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
275 pp_cxx_whitespace (pp
);
277 pp_cxx_whitespace (pp
);
278 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
279 dump_type (pp
, a
, flags
& ~TFF_CHASE_TYPEDEF
);
281 dump_expr (pp
, a
, flags
| TFF_EXPR_IN_PARENS
);
285 /* Dump, under control of FLAGS, a template-parameter-list binding.
286 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
290 dump_template_bindings (cxx_pretty_printer
*pp
, tree parms
, tree args
,
291 vec
<tree
, va_gc
> *typenames
)
293 bool need_semicolon
= false;
299 tree p
= TREE_VALUE (parms
);
300 int lvl
= TMPL_PARMS_DEPTH (parms
);
303 tree lvl_args
= NULL_TREE
;
305 /* Don't crash if we had an invalid argument list. */
306 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
307 lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
309 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
311 tree arg
= NULL_TREE
;
313 /* Don't crash if we had an invalid argument list. */
314 if (lvl_args
&& NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
315 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
318 pp_separate_with_semicolon (pp
);
319 dump_template_parameter (pp
, TREE_VEC_ELT (p
, i
),
320 TFF_PLAIN_IDENTIFIER
);
321 pp_cxx_whitespace (pp
);
323 pp_cxx_whitespace (pp
);
326 if (ARGUMENT_PACK_P (arg
))
327 pp_cxx_left_brace (pp
);
328 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
329 if (ARGUMENT_PACK_P (arg
))
330 pp_cxx_right_brace (pp
);
333 pp_string (pp
, M_("<missing>"));
336 need_semicolon
= true;
339 parms
= TREE_CHAIN (parms
);
342 /* Don't bother with typenames for a partial instantiation. */
343 if (vec_safe_is_empty (typenames
) || uses_template_parms (args
))
346 /* Don't try to print typenames when we're processing a clone. */
347 if (current_function_decl
348 && !DECL_LANG_SPECIFIC (current_function_decl
))
351 FOR_EACH_VEC_SAFE_ELT (typenames
, i
, t
)
354 pp_separate_with_semicolon (pp
);
355 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
356 pp_cxx_whitespace (pp
);
358 pp_cxx_whitespace (pp
);
359 push_deferring_access_checks (dk_no_check
);
360 t
= tsubst (t
, args
, tf_none
, NULL_TREE
);
361 pop_deferring_access_checks ();
362 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
363 pp_simple_type_specifier doesn't know about it. */
364 t
= strip_typedefs (t
);
365 dump_type (pp
, t
, TFF_PLAIN_IDENTIFIER
);
369 /* Dump a human-readable equivalent of the alias template
370 specialization of T. */
373 dump_alias_template_specialization (cxx_pretty_printer
*pp
, tree t
, int flags
)
377 gcc_assert (alias_template_specialization_p (t
));
379 if (!(flags
& TFF_UNQUALIFIED_NAME
))
380 dump_scope (pp
, CP_DECL_CONTEXT (TYPE_NAME (t
)), flags
);
381 name
= TYPE_IDENTIFIER (t
);
382 pp_cxx_tree_identifier (pp
, name
);
383 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
385 flags
& ~TFF_TEMPLATE_HEADER
);
388 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
392 dump_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
397 /* Don't print e.g. "struct mytypedef". */
398 if (TYPE_P (t
) && typedef_variant_p (t
))
400 tree decl
= TYPE_NAME (t
);
401 if ((flags
& TFF_CHASE_TYPEDEF
)
402 || DECL_SELF_REFERENCE_P (decl
)
403 || (!flag_pretty_templates
404 && DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)))
405 t
= strip_typedefs (t
);
406 else if (alias_template_specialization_p (t
))
408 dump_alias_template_specialization (pp
, t
, flags
);
411 else if (same_type_p (t
, TREE_TYPE (decl
)))
415 pp_cxx_cv_qualifier_seq (pp
, t
);
416 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
421 if (TYPE_PTRMEMFUNC_P (t
))
424 switch (TREE_CODE (t
))
427 if (t
== init_list_type_node
)
428 pp_string (pp
, M_("<brace-enclosed initializer list>"));
429 else if (t
== unknown_type_node
)
430 pp_string (pp
, M_("<unresolved overloaded function type>"));
433 pp_cxx_cv_qualifier_seq (pp
, t
);
434 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
439 /* A list of function parms. */
440 dump_parameters (pp
, t
, flags
);
443 case IDENTIFIER_NODE
:
444 pp_cxx_tree_identifier (pp
, t
);
448 dump_type (pp
, BINFO_TYPE (t
), flags
);
454 dump_aggr_type (pp
, t
, flags
);
458 if (flags
& TFF_CHASE_TYPEDEF
)
460 dump_type (pp
, DECL_ORIGINAL_TYPE (t
)
461 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
464 /* Else fall through. */
468 dump_decl (pp
, t
, flags
& ~TFF_DECL_SPECIFIERS
);
477 case FIXED_POINT_TYPE
:
478 pp_type_specifier_seq (pp
, t
);
481 case TEMPLATE_TEMPLATE_PARM
:
482 /* For parameters inside template signature. */
483 if (TYPE_IDENTIFIER (t
))
484 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
486 pp_cxx_canonical_template_parameter (pp
, t
);
489 case BOUND_TEMPLATE_TEMPLATE_PARM
:
491 tree args
= TYPE_TI_ARGS (t
);
492 pp_cxx_cv_qualifier_seq (pp
, t
);
493 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
494 pp_cxx_begin_template_argument_list (pp
);
495 dump_template_argument_list (pp
, args
, flags
);
496 pp_cxx_end_template_argument_list (pp
);
500 case TEMPLATE_TYPE_PARM
:
501 pp_cxx_cv_qualifier_seq (pp
, t
);
502 if (TYPE_IDENTIFIER (t
))
503 pp_cxx_tree_identifier (pp
, TYPE_IDENTIFIER (t
));
505 pp_cxx_canonical_template_parameter
506 (pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
509 /* This is not always necessary for pointers and such, but doing this
510 reduces code size. */
519 dump_type_prefix (pp
, t
, flags
);
520 dump_type_suffix (pp
, t
, flags
);
524 if (! (flags
& TFF_CHASE_TYPEDEF
)
525 && DECL_ORIGINAL_TYPE (TYPE_NAME (t
)))
527 dump_decl (pp
, TYPE_NAME (t
), TFF_PLAIN_IDENTIFIER
);
530 pp_cxx_cv_qualifier_seq (pp
, t
);
531 pp_cxx_ws_string (pp
,
532 TYPENAME_IS_ENUM_P (t
) ? "enum"
533 : TYPENAME_IS_CLASS_P (t
) ? "class"
535 dump_typename (pp
, t
, flags
);
538 case UNBOUND_CLASS_TEMPLATE
:
539 if (! (flags
& TFF_UNQUALIFIED_NAME
))
541 dump_type (pp
, TYPE_CONTEXT (t
), flags
);
542 pp_cxx_colon_colon (pp
);
544 pp_cxx_ws_string (pp
, "template");
545 dump_type (pp
, TYPE_IDENTIFIER (t
), flags
);
549 pp_cxx_ws_string (pp
, "__typeof__");
550 pp_cxx_whitespace (pp
);
551 pp_cxx_left_paren (pp
);
552 dump_expr (pp
, TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
553 pp_cxx_right_paren (pp
);
556 case UNDERLYING_TYPE
:
557 pp_cxx_ws_string (pp
, "__underlying_type");
558 pp_cxx_whitespace (pp
);
559 pp_cxx_left_paren (pp
);
560 dump_expr (pp
, UNDERLYING_TYPE_TYPE (t
), flags
& ~TFF_EXPR_IN_PARENS
);
561 pp_cxx_right_paren (pp
);
564 case TYPE_PACK_EXPANSION
:
565 dump_type (pp
, PACK_EXPANSION_PATTERN (t
), flags
);
566 pp_cxx_ws_string (pp
, "...");
569 case TYPE_ARGUMENT_PACK
:
570 dump_template_argument (pp
, t
, flags
);
574 pp_cxx_ws_string (pp
, "decltype");
575 pp_cxx_whitespace (pp
);
576 pp_cxx_left_paren (pp
);
577 dump_expr (pp
, DECLTYPE_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
578 pp_cxx_right_paren (pp
);
582 pp_string (pp
, "std::nullptr_t");
586 pp_unsupported_tree (pp
, t
);
587 /* Fall through to error. */
590 pp_string (pp
, M_("<type error>"));
595 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
599 dump_typename (cxx_pretty_printer
*pp
, tree t
, int flags
)
601 tree ctx
= TYPE_CONTEXT (t
);
603 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
604 dump_typename (pp
, ctx
, flags
);
606 dump_type (pp
, ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
607 pp_cxx_colon_colon (pp
);
608 dump_decl (pp
, TYPENAME_TYPE_FULLNAME (t
), flags
);
611 /* Return the name of the supplied aggregate, or enumeral type. */
614 class_key_or_enum_as_string (tree t
)
616 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
618 if (SCOPED_ENUM_P (t
))
623 else if (TREE_CODE (t
) == UNION_TYPE
)
625 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
631 /* Print out a class declaration T under the control of FLAGS,
632 in the form `class foo'. */
635 dump_aggr_type (cxx_pretty_printer
*pp
, tree t
, int flags
)
638 const char *variety
= class_key_or_enum_as_string (t
);
642 pp_cxx_cv_qualifier_seq (pp
, t
);
644 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
645 pp_cxx_ws_string (pp
, variety
);
647 name
= TYPE_NAME (t
);
651 typdef
= (!DECL_ARTIFICIAL (name
)
652 /* An alias specialization is not considered to be a
654 && !alias_template_specialization_p (t
));
657 && ((flags
& TFF_CHASE_TYPEDEF
)
658 || (!flag_pretty_templates
&& DECL_LANG_SPECIFIC (name
)
659 && DECL_TEMPLATE_INFO (name
))))
660 || DECL_SELF_REFERENCE_P (name
))
662 t
= TYPE_MAIN_VARIANT (t
);
663 name
= TYPE_NAME (t
);
667 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
668 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
669 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
670 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
672 if (! (flags
& TFF_UNQUALIFIED_NAME
))
673 dump_scope (pp
, CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
674 flags
&= ~TFF_UNQUALIFIED_NAME
;
677 /* Because the template names are mangled, we have to locate
678 the most general template, and use that name. */
679 tree tpl
= TYPE_TI_TEMPLATE (t
);
681 while (DECL_TEMPLATE_INFO (tpl
))
682 tpl
= DECL_TI_TEMPLATE (tpl
);
685 name
= DECL_NAME (name
);
688 if (name
== 0 || ANON_AGGRNAME_P (name
))
690 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
691 pp_string (pp
, M_("<anonymous>"));
693 pp_printf (pp
, M_("<anonymous %s>"), variety
);
695 else if (LAMBDA_TYPE_P (t
))
697 /* A lambda's "type" is essentially its signature. */
698 pp_string (pp
, M_("<lambda"));
699 if (lambda_function (t
))
701 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t
)),
706 pp_cxx_tree_identifier (pp
, name
);
708 dump_template_parms (pp
, TYPE_TEMPLATE_INFO (t
),
709 !CLASSTYPE_USE_TEMPLATE (t
),
710 flags
& ~TFF_TEMPLATE_HEADER
);
713 /* Dump into the obstack the initial part of the output for a given type.
714 This is necessary when dealing with things like functions returning
717 return type of `int (* fee ())()': pointer -> function -> int. Both
718 pointer (and reference and offset) and function (and member) types must
719 deal with prefix and suffix.
721 Arrays must also do this for DECL nodes, like int a[], and for things like
725 dump_type_prefix (cxx_pretty_printer
*pp
, tree t
, int flags
)
727 if (TYPE_PTRMEMFUNC_P (t
))
729 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
733 switch (TREE_CODE (t
))
738 tree sub
= TREE_TYPE (t
);
740 dump_type_prefix (pp
, sub
, flags
);
741 if (TREE_CODE (sub
) == ARRAY_TYPE
742 || TREE_CODE (sub
) == FUNCTION_TYPE
)
744 pp_cxx_whitespace (pp
);
745 pp_cxx_left_paren (pp
);
746 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (sub
));
750 else if (TREE_CODE (t
) == REFERENCE_TYPE
)
752 if (TYPE_REF_IS_RVALUE (t
))
753 pp_ampersand_ampersand (pp
);
757 pp
->padding
= pp_before
;
758 pp_cxx_cv_qualifier_seq (pp
, t
);
764 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
765 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
768 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
769 pp_cxx_left_paren (pp
);
770 dump_type (pp
, TYPE_OFFSET_BASETYPE (t
), flags
);
771 pp_cxx_colon_colon (pp
);
774 pp_cxx_cv_qualifier_seq (pp
, t
);
775 pp
->padding
= pp_before
;
778 /* This can be reached without a pointer when dealing with
779 templates, e.g. std::is_function. */
781 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
785 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
787 pp_cxx_left_paren (pp
);
788 dump_aggr_type (pp
, TYPE_METHOD_BASETYPE (t
), flags
);
789 pp_cxx_colon_colon (pp
);
793 dump_type_prefix (pp
, TREE_TYPE (t
), flags
);
797 case IDENTIFIER_NODE
:
802 case TEMPLATE_TYPE_PARM
:
803 case TEMPLATE_TEMPLATE_PARM
:
804 case BOUND_TEMPLATE_TEMPLATE_PARM
:
815 case UNDERLYING_TYPE
:
817 case TYPE_PACK_EXPANSION
:
818 case FIXED_POINT_TYPE
:
820 dump_type (pp
, t
, flags
);
821 pp
->padding
= pp_before
;
825 pp_unsupported_tree (pp
, t
);
828 pp_string (pp
, M_("<typeprefixerror>"));
833 /* Dump the suffix of type T, under control of FLAGS. This is the part
834 which appears after the identifier (or function parms). */
837 dump_type_suffix (cxx_pretty_printer
*pp
, tree t
, int flags
)
839 if (TYPE_PTRMEMFUNC_P (t
))
840 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
842 switch (TREE_CODE (t
))
847 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
848 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
849 pp_cxx_right_paren (pp
);
850 if (TREE_CODE (t
) == POINTER_TYPE
)
851 flags
|= TFF_POINTER
;
852 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
859 if (TREE_CODE (t
) == METHOD_TYPE
)
860 /* Can only be reached through a pointer. */
861 pp_cxx_right_paren (pp
);
862 arg
= TYPE_ARG_TYPES (t
);
863 if (TREE_CODE (t
) == METHOD_TYPE
)
864 arg
= TREE_CHAIN (arg
);
866 /* Function pointers don't have default args. Not in standard C++,
867 anyway; they may in g++, but we'll just pretend otherwise. */
868 dump_parameters (pp
, arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
870 pp
->padding
= pp_before
;
871 pp_cxx_cv_qualifiers (pp
, type_memfn_quals (t
),
872 TREE_CODE (t
) == FUNCTION_TYPE
873 && (flags
& TFF_POINTER
));
874 dump_ref_qualifier (pp
, t
, flags
);
875 dump_exception_spec (pp
, TYPE_RAISES_EXCEPTIONS (t
), flags
);
876 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
882 pp_cxx_left_bracket (pp
);
885 tree dtype
= TYPE_DOMAIN (t
);
886 tree max
= TYPE_MAX_VALUE (dtype
);
887 if (integer_all_onesp (max
))
888 pp_character (pp
, '0');
889 else if (tree_fits_shwi_p (max
))
890 pp_wide_integer (pp
, tree_to_shwi (max
) + 1);
894 if (TREE_CODE (max
) == SAVE_EXPR
)
895 max
= TREE_OPERAND (max
, 0);
896 if (TREE_CODE (max
) == MINUS_EXPR
897 || TREE_CODE (max
) == PLUS_EXPR
)
899 max
= TREE_OPERAND (max
, 0);
900 while (CONVERT_EXPR_P (max
))
901 max
= TREE_OPERAND (max
, 0);
904 max
= fold_build2_loc (input_location
,
905 PLUS_EXPR
, dtype
, max
,
906 build_int_cst (dtype
, 1));
907 dump_expr (pp
, max
, flags
& ~TFF_EXPR_IN_PARENS
);
910 pp_cxx_right_bracket (pp
);
911 dump_type_suffix (pp
, TREE_TYPE (t
), flags
);
915 case IDENTIFIER_NODE
:
920 case TEMPLATE_TYPE_PARM
:
921 case TEMPLATE_TEMPLATE_PARM
:
922 case BOUND_TEMPLATE_TEMPLATE_PARM
:
933 case UNDERLYING_TYPE
:
935 case TYPE_PACK_EXPANSION
:
936 case FIXED_POINT_TYPE
:
941 pp_unsupported_tree (pp
, t
);
943 /* Don't mark it here, we should have already done in
950 dump_global_iord (cxx_pretty_printer
*pp
, tree t
)
952 const char *p
= NULL
;
954 if (DECL_GLOBAL_CTOR_P (t
))
955 p
= M_("(static initializers for %s)");
956 else if (DECL_GLOBAL_DTOR_P (t
))
957 p
= M_("(static destructors for %s)");
961 pp_printf (pp
, p
, LOCATION_FILE (input_location
));
965 dump_simple_decl (cxx_pretty_printer
*pp
, tree t
, tree type
, int flags
)
967 if (flags
& TFF_DECL_SPECIFIERS
)
970 && DECL_DECLARED_CONSTEXPR_P (t
))
971 pp_cxx_ws_string (pp
, "constexpr");
972 dump_type_prefix (pp
, type
, flags
& ~TFF_UNQUALIFIED_NAME
);
975 if (! (flags
& TFF_UNQUALIFIED_NAME
)
976 && TREE_CODE (t
) != PARM_DECL
977 && (!DECL_INITIAL (t
)
978 || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
))
979 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
980 flags
&= ~TFF_UNQUALIFIED_NAME
;
981 if ((flags
& TFF_DECL_SPECIFIERS
)
982 && DECL_TEMPLATE_PARM_P (t
)
983 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t
)))
984 pp_string (pp
, "...");
987 if (TREE_CODE (t
) == FIELD_DECL
&& DECL_NORMAL_CAPTURE_P (t
))
990 pp_string (pp
, IDENTIFIER_POINTER (DECL_NAME (t
)) + 2);
991 pp_string (pp
, " capture>");
994 dump_decl (pp
, DECL_NAME (t
), flags
);
997 pp_string (pp
, M_("<anonymous>"));
998 if (flags
& TFF_DECL_SPECIFIERS
)
999 dump_type_suffix (pp
, type
, flags
);
1002 /* Dump a human readable string for the decl T under control of FLAGS. */
1005 dump_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1010 /* If doing Objective-C++, give Objective-C a chance to demangle
1011 Objective-C method names. */
1012 if (c_dialect_objc ())
1014 const char *demangled
= objc_maybe_printable_name (t
, flags
);
1017 pp_string (pp
, demangled
);
1022 switch (TREE_CODE (t
))
1025 /* Don't say 'typedef class A' */
1026 if (DECL_ARTIFICIAL (t
) && !DECL_SELF_REFERENCE_P (t
))
1028 if ((flags
& TFF_DECL_SPECIFIERS
)
1029 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
1031 /* Say `class T' not just `T'. */
1032 pp_cxx_ws_string (pp
, "class");
1034 /* Emit the `...' for a parameter pack. */
1035 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1036 pp_cxx_ws_string (pp
, "...");
1039 dump_type (pp
, TREE_TYPE (t
), flags
);
1042 if (TYPE_DECL_ALIAS_P (t
)
1043 && (flags
& TFF_DECL_SPECIFIERS
1044 || flags
& TFF_CLASS_KEY_OR_ENUM
))
1046 pp_cxx_ws_string (pp
, "using");
1047 dump_decl (pp
, DECL_NAME (t
), flags
);
1048 pp_cxx_whitespace (pp
);
1049 pp_cxx_ws_string (pp
, "=");
1050 pp_cxx_whitespace (pp
);
1051 dump_type (pp
, DECL_ORIGINAL_TYPE (t
), flags
);
1054 if ((flags
& TFF_DECL_SPECIFIERS
)
1055 && !DECL_SELF_REFERENCE_P (t
))
1056 pp_cxx_ws_string (pp
, "typedef");
1057 dump_simple_decl (pp
, t
, DECL_ORIGINAL_TYPE (t
)
1058 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
1063 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
1065 pp_string (pp
, M_("vtable for "));
1066 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
1067 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1070 /* Else fall through. */
1073 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1075 /* Handle variable template specializations. */
1076 if (TREE_CODE (t
) == VAR_DECL
1077 && DECL_LANG_SPECIFIC (t
)
1078 && DECL_TEMPLATE_INFO (t
)
1079 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
)))
1081 pp_cxx_begin_template_argument_list (pp
);
1082 tree args
= INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (t
));
1083 dump_template_argument_list (pp
, args
, flags
);
1084 pp_cxx_end_template_argument_list (pp
);
1089 pp_string (pp
, M_("<return value> "));
1090 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1093 case NAMESPACE_DECL
:
1094 if (flags
& TFF_DECL_SPECIFIERS
)
1095 pp
->declaration (t
);
1098 if (! (flags
& TFF_UNQUALIFIED_NAME
))
1099 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1100 flags
&= ~TFF_UNQUALIFIED_NAME
;
1101 if (DECL_NAME (t
) == NULL_TREE
)
1103 if (!(pp
->flags
& pp_c_flag_gnu_v3
))
1104 pp_cxx_ws_string (pp
, M_("{anonymous}"));
1106 pp_cxx_ws_string (pp
, M_("(anonymous namespace)"));
1109 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1114 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1115 pp_colon_colon (pp
);
1116 dump_decl (pp
, TREE_OPERAND (t
, 1), TFF_UNQUALIFIED_NAME
);
1120 dump_decl (pp
, TREE_OPERAND (t
, 0), flags
);
1121 pp_cxx_left_bracket (pp
);
1122 dump_decl (pp
, TREE_OPERAND (t
, 1), flags
);
1123 pp_cxx_right_bracket (pp
);
1126 case ARRAY_NOTATION_REF
:
1127 dump_decl (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
1128 pp_cxx_left_bracket (pp
);
1129 dump_decl (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
1131 dump_decl (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
1133 dump_decl (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
1134 pp_cxx_right_bracket (pp
);
1137 /* So that we can do dump_decl on an aggr type. */
1141 dump_type (pp
, t
, flags
);
1145 /* This is a pseudo destructor call which has not been folded into
1146 a PSEUDO_DTOR_EXPR yet. */
1147 pp_cxx_complement (pp
);
1148 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
1155 /* These special cases are duplicated here so that other functions
1156 can feed identifiers to error and get them demangled properly. */
1157 case IDENTIFIER_NODE
:
1158 if (IDENTIFIER_TYPENAME_P (t
))
1160 pp_cxx_ws_string (pp
, "operator");
1161 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1162 dump_type (pp
, TREE_TYPE (t
), flags
);
1166 pp_cxx_tree_identifier (pp
, t
);
1172 t
= OVL_CURRENT (t
);
1173 if (DECL_CLASS_SCOPE_P (t
))
1175 dump_type (pp
, DECL_CONTEXT (t
), flags
);
1176 pp_cxx_colon_colon (pp
);
1178 else if (!DECL_FILE_SCOPE_P (t
))
1180 dump_decl (pp
, DECL_CONTEXT (t
), flags
);
1181 pp_cxx_colon_colon (pp
);
1183 dump_decl (pp
, DECL_NAME (t
), flags
);
1187 /* If there's only one function, just treat it like an ordinary
1189 t
= OVL_CURRENT (t
);
1193 if (! DECL_LANG_SPECIFIC (t
))
1195 if (DECL_ABSTRACT_ORIGIN (t
))
1196 dump_decl (pp
, DECL_ABSTRACT_ORIGIN (t
), flags
);
1198 pp_string (pp
, M_("<built-in>"));
1200 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
1201 dump_global_iord (pp
, t
);
1203 dump_function_decl (pp
, t
, flags
);
1207 dump_template_decl (pp
, t
, flags
);
1210 case TEMPLATE_ID_EXPR
:
1212 tree name
= TREE_OPERAND (t
, 0);
1213 tree args
= TREE_OPERAND (t
, 1);
1215 if (is_overloaded_fn (name
))
1216 name
= get_first_fn (name
);
1218 name
= DECL_NAME (name
);
1219 dump_decl (pp
, name
, flags
);
1220 pp_cxx_begin_template_argument_list (pp
);
1221 if (args
== error_mark_node
)
1222 pp_string (pp
, M_("<template arguments error>"));
1224 dump_template_argument_list (pp
, args
, flags
);
1225 pp_cxx_end_template_argument_list (pp
);
1230 pp_cxx_tree_identifier (pp
, DECL_NAME (t
));
1234 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
1235 || (DECL_INITIAL (t
) &&
1236 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
1237 dump_simple_decl (pp
, t
, TREE_TYPE (t
), flags
);
1238 else if (DECL_NAME (t
))
1239 dump_decl (pp
, DECL_NAME (t
), flags
);
1240 else if (DECL_INITIAL (t
))
1241 dump_expr (pp
, DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
1243 pp_string (pp
, M_("<enumerator>"));
1247 pp_cxx_ws_string (pp
, "using");
1248 dump_type (pp
, USING_DECL_SCOPE (t
), flags
);
1249 pp_cxx_colon_colon (pp
);
1250 dump_decl (pp
, DECL_NAME (t
), flags
);
1254 pp
->declaration (t
);
1258 dump_decl (pp
, BASELINK_FUNCTIONS (t
), flags
);
1261 case NON_DEPENDENT_EXPR
:
1262 dump_expr (pp
, t
, flags
);
1265 case TEMPLATE_TYPE_PARM
:
1266 if (flags
& TFF_DECL_SPECIFIERS
)
1267 pp
->declaration (t
);
1272 case UNBOUND_CLASS_TEMPLATE
:
1273 case TYPE_PACK_EXPANSION
:
1275 dump_type (pp
, t
, flags
);
1279 pp_unsupported_tree (pp
, t
);
1280 /* Fall through to error. */
1283 pp_string (pp
, M_("<declaration error>"));
1288 /* Dump a template declaration T under control of FLAGS. This means the
1289 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1292 dump_template_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1294 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1298 if (flags
& TFF_TEMPLATE_HEADER
)
1300 for (parms
= orig_parms
= nreverse (orig_parms
);
1302 parms
= TREE_CHAIN (parms
))
1304 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1305 int len
= TREE_VEC_LENGTH (inner_parms
);
1307 pp_cxx_ws_string (pp
, "template");
1308 pp_cxx_begin_template_argument_list (pp
);
1310 /* If we've shown the template prefix, we'd better show the
1311 parameters' and decl's type too. */
1312 flags
|= TFF_DECL_SPECIFIERS
;
1314 for (i
= 0; i
< len
; i
++)
1317 pp_separate_with_comma (pp
);
1318 dump_template_parameter (pp
, TREE_VEC_ELT (inner_parms
, i
),
1321 pp_cxx_end_template_argument_list (pp
);
1322 pp_cxx_whitespace (pp
);
1324 nreverse(orig_parms
);
1326 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1328 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1329 pp_cxx_ws_string (pp
, "class");
1331 /* If this is a parameter pack, print the ellipsis. */
1332 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1333 pp_cxx_ws_string (pp
, "...");
1337 if (DECL_CLASS_TEMPLATE_P (t
))
1338 dump_type (pp
, TREE_TYPE (t
),
1339 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1340 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1341 else if (DECL_TEMPLATE_RESULT (t
)
1342 && (VAR_P (DECL_TEMPLATE_RESULT (t
))
1343 /* Alias template. */
1344 || DECL_TYPE_TEMPLATE_P (t
)))
1345 dump_decl (pp
, DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1348 gcc_assert (TREE_TYPE (t
));
1349 switch (NEXT_CODE (t
))
1353 dump_function_decl (pp
, t
, flags
| TFF_TEMPLATE_NAME
);
1356 /* This case can occur with some invalid code. */
1357 dump_type (pp
, TREE_TYPE (t
),
1358 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1359 | (flags
& TFF_DECL_SPECIFIERS
1360 ? TFF_CLASS_KEY_OR_ENUM
: 0));
1365 /* find_typenames looks through the type of the function template T
1366 and returns a vec containing any typedefs, decltypes or TYPENAME_TYPEs
1369 struct find_typenames_t
1371 hash_set
<tree
> *p_set
;
1372 vec
<tree
, va_gc
> *typenames
;
1376 find_typenames_r (tree
*tp
, int *walk_subtrees
, void *data
)
1378 struct find_typenames_t
*d
= (struct find_typenames_t
*)data
;
1379 tree mv
= NULL_TREE
;
1381 if (TYPE_P (*tp
) && is_typedef_decl (TYPE_NAME (*tp
)))
1382 /* Add the type of the typedef without any additional cv-quals. */
1383 mv
= TREE_TYPE (TYPE_NAME (*tp
));
1384 else if (TREE_CODE (*tp
) == TYPENAME_TYPE
1385 || TREE_CODE (*tp
) == DECLTYPE_TYPE
)
1386 /* Add the typename without any cv-qualifiers. */
1387 mv
= TYPE_MAIN_VARIANT (*tp
);
1389 if (TREE_CODE (*tp
) == TYPE_PACK_EXPANSION
)
1391 /* Don't mess with parameter packs since we don't remember
1392 the pack expansion context for a particular typename. */
1393 *walk_subtrees
= false;
1397 if (mv
&& (mv
== *tp
|| !d
->p_set
->add (mv
)))
1398 vec_safe_push (d
->typenames
, mv
);
1400 /* Search into class template arguments, which cp_walk_subtrees
1402 if (CLASS_TYPE_P (*tp
) && CLASSTYPE_TEMPLATE_INFO (*tp
))
1403 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp
), find_typenames_r
,
1409 static vec
<tree
, va_gc
> *
1410 find_typenames (tree t
)
1412 struct find_typenames_t ft
;
1413 ft
.p_set
= new hash_set
<tree
>;
1414 ft
.typenames
= NULL
;
1415 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t
)),
1416 find_typenames_r
, &ft
, ft
.p_set
);
1418 return ft
.typenames
;
1421 /* Output the "[with ...]" clause for a template instantiation T iff
1422 TEMPLATE_PARMS, TEMPLATE_ARGS and FLAGS are suitable. T may be NULL if
1423 formatting a deduction/substitution diagnostic rather than an
1427 dump_substitution (cxx_pretty_printer
*pp
,
1428 tree t
, tree template_parms
, tree template_args
,
1431 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
1432 && !(flags
& TFF_NO_TEMPLATE_BINDINGS
))
1434 vec
<tree
, va_gc
> *typenames
= t
? find_typenames (t
) : NULL
;
1435 pp_cxx_whitespace (pp
);
1436 pp_cxx_left_bracket (pp
);
1437 pp
->translate_string ("with");
1438 pp_cxx_whitespace (pp
);
1439 dump_template_bindings (pp
, template_parms
, template_args
, typenames
);
1440 pp_cxx_right_bracket (pp
);
1444 /* Dump the lambda function FN including its 'mutable' qualifier and any
1445 template bindings. */
1448 dump_lambda_function (cxx_pretty_printer
*pp
,
1449 tree fn
, tree template_parms
, tree template_args
,
1452 /* A lambda's signature is essentially its "type". */
1453 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
1454 if (!(TYPE_QUALS (class_of_this_parm (TREE_TYPE (fn
))) & TYPE_QUAL_CONST
))
1456 pp
->padding
= pp_before
;
1457 pp_c_ws_string (pp
, "mutable");
1459 dump_substitution (pp
, fn
, template_parms
, template_args
, flags
);
1462 /* Pretty print a function decl. There are several ways we want to print a
1463 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1464 As error can only apply the '#' flag once to give 0 and 1 for V, there
1465 is %D which doesn't print the throw specs, and %F which does. */
1468 dump_function_decl (cxx_pretty_printer
*pp
, tree t
, int flags
)
1472 tree cname
= NULL_TREE
;
1473 tree template_args
= NULL_TREE
;
1474 tree template_parms
= NULL_TREE
;
1475 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1476 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1479 flags
&= ~(TFF_UNQUALIFIED_NAME
| TFF_TEMPLATE_NAME
);
1480 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1481 t
= DECL_TEMPLATE_RESULT (t
);
1483 /* Save the exceptions, in case t is a specialization and we are
1484 emitting an error about incompatible specifications. */
1485 exceptions
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t
));
1487 /* Pretty print template instantiations only. */
1488 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
)
1489 && flag_pretty_templates
)
1493 template_args
= DECL_TI_ARGS (t
);
1494 tmpl
= most_general_template (t
);
1495 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1497 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1502 if (DECL_NAME (t
) && LAMBDA_FUNCTION_P (t
))
1503 return dump_lambda_function (pp
, t
, template_parms
, template_args
, flags
);
1505 fntype
= TREE_TYPE (t
);
1506 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1508 if (DECL_CLASS_SCOPE_P (t
))
1509 cname
= DECL_CONTEXT (t
);
1510 /* This is for partially instantiated template methods. */
1511 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1512 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1514 if (flags
& TFF_DECL_SPECIFIERS
)
1516 if (DECL_STATIC_FUNCTION_P (t
))
1517 pp_cxx_ws_string (pp
, "static");
1518 else if (DECL_VIRTUAL_P (t
))
1519 pp_cxx_ws_string (pp
, "virtual");
1521 if (DECL_DECLARED_CONSTEXPR_P (t
))
1522 pp_cxx_ws_string (pp
, "constexpr");
1525 /* Print the return type? */
1527 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1528 && !DECL_DESTRUCTOR_P (t
);
1531 tree ret
= fndecl_declared_return_type (t
);
1532 dump_type_prefix (pp
, ret
, flags
);
1535 /* Print the function name. */
1536 if (!do_outer_scope
)
1540 dump_type (pp
, cname
, flags
);
1541 pp_cxx_colon_colon (pp
);
1544 dump_scope (pp
, CP_DECL_CONTEXT (t
), flags
);
1546 dump_function_name (pp
, t
, flags
);
1548 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1550 dump_parameters (pp
, parmtypes
, flags
);
1552 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1554 pp
->padding
= pp_before
;
1555 pp_cxx_cv_qualifier_seq (pp
, class_of_this_parm (fntype
));
1556 dump_ref_qualifier (pp
, fntype
, flags
);
1559 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1561 pp
->padding
= pp_before
;
1562 dump_exception_spec (pp
, exceptions
, flags
);
1566 dump_type_suffix (pp
, TREE_TYPE (fntype
), flags
);
1568 dump_substitution (pp
, t
, template_parms
, template_args
, flags
);
1570 else if (template_args
)
1572 bool need_comma
= false;
1574 pp_cxx_begin_template_argument_list (pp
);
1575 template_args
= INNERMOST_TEMPLATE_ARGS (template_args
);
1576 for (i
= 0; i
< TREE_VEC_LENGTH (template_args
); ++i
)
1578 tree arg
= TREE_VEC_ELT (template_args
, i
);
1580 pp_separate_with_comma (pp
);
1581 if (ARGUMENT_PACK_P (arg
))
1582 pp_cxx_left_brace (pp
);
1583 dump_template_argument (pp
, arg
, TFF_PLAIN_IDENTIFIER
);
1584 if (ARGUMENT_PACK_P (arg
))
1585 pp_cxx_right_brace (pp
);
1588 pp_cxx_end_template_argument_list (pp
);
1592 /* Print a parameter list. If this is for a member function, the
1593 member object ptr (and any other hidden args) should have
1594 already been removed. */
1597 dump_parameters (cxx_pretty_printer
*pp
, tree parmtypes
, int flags
)
1600 flags
&= ~TFF_SCOPE
;
1601 pp_cxx_left_paren (pp
);
1603 for (first
= 1; parmtypes
!= void_list_node
;
1604 parmtypes
= TREE_CHAIN (parmtypes
))
1607 pp_separate_with_comma (pp
);
1611 pp_cxx_ws_string (pp
, "...");
1615 dump_type (pp
, TREE_VALUE (parmtypes
), flags
);
1617 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1619 pp_cxx_whitespace (pp
);
1621 pp_cxx_whitespace (pp
);
1622 dump_expr (pp
, TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1626 pp_cxx_right_paren (pp
);
1629 /* Print ref-qualifier of a FUNCTION_TYPE or METHOD_TYPE. FLAGS are ignored. */
1632 dump_ref_qualifier (cxx_pretty_printer
*pp
, tree t
, int flags ATTRIBUTE_UNUSED
)
1634 if (FUNCTION_REF_QUALIFIED (t
))
1636 pp
->padding
= pp_before
;
1637 if (FUNCTION_RVALUE_QUALIFIED (t
))
1638 pp_cxx_ws_string (pp
, "&&");
1640 pp_cxx_ws_string (pp
, "&");
1644 /* Print an exception specification. T is the exception specification. */
1647 dump_exception_spec (cxx_pretty_printer
*pp
, tree t
, int flags
)
1649 if (t
&& TREE_PURPOSE (t
))
1651 pp_cxx_ws_string (pp
, "noexcept");
1652 if (!integer_onep (TREE_PURPOSE (t
)))
1654 pp_cxx_whitespace (pp
);
1655 pp_cxx_left_paren (pp
);
1656 if (DEFERRED_NOEXCEPT_SPEC_P (t
))
1657 pp_cxx_ws_string (pp
, "<uninstantiated>");
1659 dump_expr (pp
, TREE_PURPOSE (t
), flags
);
1660 pp_cxx_right_paren (pp
);
1665 pp_cxx_ws_string (pp
, "throw");
1666 pp_cxx_whitespace (pp
);
1667 pp_cxx_left_paren (pp
);
1668 if (TREE_VALUE (t
) != NULL_TREE
)
1671 dump_type (pp
, TREE_VALUE (t
), flags
);
1675 pp_separate_with_comma (pp
);
1677 pp_cxx_right_paren (pp
);
1681 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1682 and destructors properly. */
1685 dump_function_name (cxx_pretty_printer
*pp
, tree t
, int flags
)
1687 tree name
= DECL_NAME (t
);
1689 /* We can get here with a decl that was synthesized by language-
1690 independent machinery (e.g. coverage.c) in which case it won't
1691 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1692 will crash. In this case it is safe just to print out the
1694 if (!DECL_LANG_SPECIFIC (t
))
1696 pp_cxx_tree_identifier (pp
, name
);
1700 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1701 t
= DECL_TEMPLATE_RESULT (t
);
1703 /* Don't let the user see __comp_ctor et al. */
1704 if (DECL_CONSTRUCTOR_P (t
)
1705 || DECL_DESTRUCTOR_P (t
))
1707 if (LAMBDA_TYPE_P (DECL_CONTEXT (t
)))
1708 name
= get_identifier ("<lambda>");
1709 else if (TYPE_ANONYMOUS_P (DECL_CONTEXT (t
)))
1710 name
= get_identifier ("<constructor>");
1712 name
= constructor_name (DECL_CONTEXT (t
));
1715 if (DECL_DESTRUCTOR_P (t
))
1717 pp_cxx_complement (pp
);
1718 dump_decl (pp
, name
, TFF_PLAIN_IDENTIFIER
);
1720 else if (DECL_CONV_FN_P (t
))
1722 /* This cannot use the hack that the operator's return
1723 type is stashed off of its name because it may be
1724 used for error reporting. In the case of conflicting
1725 declarations, both will have the same name, yet
1726 the types will be different, hence the TREE_TYPE field
1727 of the first name will be clobbered by the second. */
1728 pp_cxx_ws_string (pp
, "operator");
1729 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
1731 else if (name
&& IDENTIFIER_OPNAME_P (name
))
1732 pp_cxx_tree_identifier (pp
, name
);
1733 else if (name
&& UDLIT_OPER_P (name
))
1734 pp_cxx_tree_identifier (pp
, name
);
1736 dump_decl (pp
, name
, flags
);
1738 if (DECL_TEMPLATE_INFO (t
)
1739 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1740 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1741 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1742 dump_template_parms (pp
, DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
),
1746 /* Dump the template parameters from the template info INFO under control of
1747 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1748 specialization (partial or complete). For partial specializations we show
1749 the specialized parameter values. For a primary template we show no
1753 dump_template_parms (cxx_pretty_printer
*pp
, tree info
,
1754 int primary
, int flags
)
1756 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1758 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1760 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1761 pp_cxx_begin_template_argument_list (pp
);
1763 /* Be careful only to print things when we have them, so as not
1764 to crash producing error messages. */
1765 if (args
&& !primary
)
1768 len
= get_non_default_template_args_count (args
, flags
);
1770 args
= INNERMOST_TEMPLATE_ARGS (args
);
1771 for (ix
= 0; ix
!= len
; ix
++)
1773 tree arg
= TREE_VEC_ELT (args
, ix
);
1775 /* Only print a comma if we know there is an argument coming. In
1776 the case of an empty template argument pack, no actual
1777 argument will be printed. */
1779 && (!ARGUMENT_PACK_P (arg
)
1780 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
1781 pp_separate_with_comma (pp
);
1784 pp_string (pp
, M_("<template parameter error>"));
1786 dump_template_argument (pp
, arg
, flags
);
1791 tree tpl
= TI_TEMPLATE (info
);
1792 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1795 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1796 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1798 for (ix
= 0; ix
!= len
; ix
++)
1802 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1804 pp_string (pp
, M_("<template parameter error>"));
1808 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1811 pp_separate_with_comma (pp
);
1813 dump_decl (pp
, parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1816 pp_cxx_end_template_argument_list (pp
);
1819 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1820 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1823 dump_call_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
, bool skipfirst
)
1826 call_expr_arg_iterator iter
;
1828 pp_cxx_left_paren (pp
);
1829 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1835 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1836 if (more_call_expr_args_p (&iter
))
1837 pp_separate_with_comma (pp
);
1840 pp_cxx_right_paren (pp
);
1843 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1844 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1848 dump_aggr_init_expr_args (cxx_pretty_printer
*pp
, tree t
, int flags
,
1852 aggr_init_expr_arg_iterator iter
;
1854 pp_cxx_left_paren (pp
);
1855 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1861 dump_expr (pp
, arg
, flags
| TFF_EXPR_IN_PARENS
);
1862 if (more_aggr_init_expr_args_p (&iter
))
1863 pp_separate_with_comma (pp
);
1866 pp_cxx_right_paren (pp
);
1869 /* Print out a list of initializers (subr of dump_expr). */
1872 dump_expr_list (cxx_pretty_printer
*pp
, tree l
, int flags
)
1876 dump_expr (pp
, TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1879 pp_separate_with_comma (pp
);
1883 /* Print out a vector of initializers (subr of dump_expr). */
1886 dump_expr_init_vec (cxx_pretty_printer
*pp
, vec
<constructor_elt
, va_gc
> *v
,
1889 unsigned HOST_WIDE_INT idx
;
1892 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1894 dump_expr (pp
, value
, flags
| TFF_EXPR_IN_PARENS
);
1895 if (idx
!= v
->length () - 1)
1896 pp_separate_with_comma (pp
);
1901 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1902 function. Resolve it to a close relative -- in the sense of static
1903 type -- variant being overridden. That is close to what was written in
1904 the source code. Subroutine of dump_expr. */
1907 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1909 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1910 HOST_WIDE_INT index
= tree_to_uhwi (OBJ_TYPE_REF_TOKEN (ref
));
1911 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1914 fun
= TREE_CHAIN (fun
);
1915 index
-= (TARGET_VTABLE_USES_DESCRIPTORS
1916 ? TARGET_VTABLE_USES_DESCRIPTORS
: 1);
1922 /* Print out an expression E under control of FLAGS. */
1925 dump_expr (cxx_pretty_printer
*pp
, tree t
, int flags
)
1932 if (STATEMENT_CLASS_P (t
))
1934 pp_cxx_ws_string (pp
, M_("<statement>"));
1938 switch (TREE_CODE (t
))
1946 case NAMESPACE_DECL
:
1950 case IDENTIFIER_NODE
:
1951 dump_decl (pp
, t
, ((flags
& ~(TFF_DECL_SPECIFIERS
|TFF_RETURN_TYPE
1952 |TFF_TEMPLATE_HEADER
))
1953 | TFF_NO_FUNCTION_ARGUMENTS
));
1957 if (SSA_NAME_VAR (t
)
1958 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t
)))
1959 dump_expr (pp
, SSA_NAME_VAR (t
), flags
);
1961 pp_cxx_ws_string (pp
, M_("<unknown>"));
1972 case USERDEF_LITERAL
:
1973 pp_cxx_userdef_literal (pp
, t
);
1977 /* While waiting for caret diagnostics, avoid printing
1978 __cxa_allocate_exception, __cxa_throw, and the like. */
1979 pp_cxx_ws_string (pp
, M_("<throw-expression>"));
1984 dump_type (pp
, PTRMEM_CST_CLASS (t
), flags
);
1985 pp_cxx_colon_colon (pp
);
1986 pp_cxx_tree_identifier (pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1990 pp_cxx_left_paren (pp
);
1991 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1992 pp_separate_with_comma (pp
);
1993 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1994 pp_cxx_right_paren (pp
);
1998 pp_cxx_left_paren (pp
);
1999 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2000 pp_string (pp
, " ? ");
2001 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2002 pp_string (pp
, " : ");
2003 dump_expr (pp
, TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
2004 pp_cxx_right_paren (pp
);
2008 if (TREE_HAS_CONSTRUCTOR (t
))
2010 pp_cxx_ws_string (pp
, "new");
2011 pp_cxx_whitespace (pp
);
2012 dump_type (pp
, TREE_TYPE (TREE_TYPE (t
)), flags
);
2015 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2018 case AGGR_INIT_EXPR
:
2020 tree fn
= NULL_TREE
;
2022 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
2023 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
2025 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
2027 if (DECL_CONSTRUCTOR_P (fn
))
2028 dump_type (pp
, DECL_CONTEXT (fn
), flags
);
2030 dump_decl (pp
, fn
, 0);
2033 dump_expr (pp
, AGGR_INIT_EXPR_FN (t
), 0);
2035 dump_aggr_init_expr_args (pp
, t
, flags
, true);
2040 tree fn
= CALL_EXPR_FN (t
);
2041 bool skipfirst
= false;
2043 /* Deal with internal functions. */
2044 if (fn
== NULL_TREE
)
2046 pp_string (pp
, internal_fn_name (CALL_EXPR_IFN (t
)));
2047 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2051 if (TREE_CODE (fn
) == ADDR_EXPR
)
2052 fn
= TREE_OPERAND (fn
, 0);
2054 /* Nobody is interested in seeing the guts of vcalls. */
2055 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
2056 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
2058 if (TREE_TYPE (fn
) != NULL_TREE
2059 && NEXT_CODE (fn
) == METHOD_TYPE
2060 && call_expr_nargs (t
))
2062 tree ob
= CALL_EXPR_ARG (t
, 0);
2063 if (TREE_CODE (ob
) == ADDR_EXPR
)
2065 dump_expr (pp
, TREE_OPERAND (ob
, 0),
2066 flags
| TFF_EXPR_IN_PARENS
);
2069 else if (TREE_CODE (ob
) != PARM_DECL
2070 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
2072 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2077 if (flag_sanitize
& SANITIZE_UNDEFINED
2078 && is_ubsan_builtin_p (fn
))
2080 pp_string (cxx_pp
, M_("<ubsan routine call>"));
2083 dump_expr (pp
, fn
, flags
| TFF_EXPR_IN_PARENS
);
2084 dump_call_expr_args (pp
, t
, flags
, skipfirst
);
2089 /* Note that this only works for G++ target exprs. If somebody
2090 builds a general TARGET_EXPR, there's no way to represent that
2091 it initializes anything other that the parameter slot for the
2092 default argument. Note we may have cleared out the first
2093 operand in expand_expr, so don't go killing ourselves. */
2094 if (TREE_OPERAND (t
, 1))
2095 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2098 case POINTER_PLUS_EXPR
:
2099 dump_binary_op (pp
, "+", t
, flags
);
2104 dump_binary_op (pp
, assignment_operator_name_info
[NOP_EXPR
].name
,
2111 case TRUNC_DIV_EXPR
:
2112 case TRUNC_MOD_EXPR
:
2120 case TRUTH_ANDIF_EXPR
:
2121 case TRUTH_ORIF_EXPR
:
2128 case EXACT_DIV_EXPR
:
2129 dump_binary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2133 case FLOOR_DIV_EXPR
:
2134 case ROUND_DIV_EXPR
:
2136 dump_binary_op (pp
, "/", t
, flags
);
2140 case FLOOR_MOD_EXPR
:
2141 case ROUND_MOD_EXPR
:
2142 dump_binary_op (pp
, "%", t
, flags
);
2147 tree ob
= TREE_OPERAND (t
, 0);
2148 if (INDIRECT_REF_P (ob
))
2150 ob
= TREE_OPERAND (ob
, 0);
2151 if (TREE_CODE (ob
) != PARM_DECL
2153 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
2155 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2156 if (TREE_CODE (TREE_TYPE (ob
)) == REFERENCE_TYPE
)
2164 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2167 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
2172 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2173 pp_cxx_left_bracket (pp
);
2174 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2175 pp_cxx_right_bracket (pp
);
2178 case ARRAY_NOTATION_REF
:
2179 dump_expr (pp
, ARRAY_NOTATION_ARRAY (t
), flags
| TFF_EXPR_IN_PARENS
);
2180 pp_cxx_left_bracket (pp
);
2181 dump_expr (pp
, ARRAY_NOTATION_START (t
), flags
| TFF_EXPR_IN_PARENS
);
2183 dump_expr (pp
, ARRAY_NOTATION_LENGTH (t
), flags
| TFF_EXPR_IN_PARENS
);
2185 dump_expr (pp
, ARRAY_NOTATION_STRIDE (t
), flags
| TFF_EXPR_IN_PARENS
);
2186 pp_cxx_right_bracket (pp
);
2189 case UNARY_PLUS_EXPR
:
2190 dump_unary_op (pp
, "+", t
, flags
);
2194 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
2195 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
2196 /* An ADDR_EXPR can have reference type. In that case, we
2197 shouldn't print the `&' doing so indicates to the user
2198 that the expression has pointer type. */
2200 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
2201 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2202 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
2203 dump_unary_op (pp
, "&&", t
, flags
);
2205 dump_unary_op (pp
, "&", t
, flags
);
2209 if (TREE_HAS_CONSTRUCTOR (t
))
2211 t
= TREE_OPERAND (t
, 0);
2212 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
2213 dump_expr (pp
, CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
2214 dump_call_expr_args (pp
, t
, flags
, true);
2218 if (TREE_OPERAND (t
,0) != NULL_TREE
2219 && TREE_TYPE (TREE_OPERAND (t
, 0))
2220 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
2221 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2223 dump_unary_op (pp
, "*", t
, flags
);
2228 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
2229 && integer_zerop (TREE_OPERAND (t
, 1)))
2230 dump_expr (pp
, TREE_OPERAND (TREE_OPERAND (t
, 0), 0), flags
);
2234 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2236 pp_cxx_left_paren (pp
);
2237 if (!integer_onep (TYPE_SIZE_UNIT
2238 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t
, 0))))))
2240 pp_cxx_left_paren (pp
);
2241 dump_type (pp
, ptr_type_node
, flags
);
2242 pp_cxx_right_paren (pp
);
2245 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2246 if (!integer_zerop (TREE_OPERAND (t
, 1)))
2248 pp_cxx_ws_string (pp
, "+");
2249 dump_expr (pp
, fold_convert (ssizetype
, TREE_OPERAND (t
, 1)),
2251 pp_cxx_right_paren (pp
);
2258 case TRUTH_NOT_EXPR
:
2259 case PREDECREMENT_EXPR
:
2260 case PREINCREMENT_EXPR
:
2261 dump_unary_op (pp
, operator_name_info
[TREE_CODE (t
)].name
, t
, flags
);
2264 case POSTDECREMENT_EXPR
:
2265 case POSTINCREMENT_EXPR
:
2266 pp_cxx_left_paren (pp
);
2267 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2268 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2269 pp_cxx_right_paren (pp
);
2272 case NON_LVALUE_EXPR
:
2273 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2274 should be another level of INDIRECT_REF so that I don't have to do
2276 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
2278 tree next
= TREE_TYPE (TREE_TYPE (t
));
2280 while (TYPE_PTR_P (next
))
2281 next
= TREE_TYPE (next
);
2283 if (TREE_CODE (next
) == FUNCTION_TYPE
)
2285 if (flags
& TFF_EXPR_IN_PARENS
)
2286 pp_cxx_left_paren (pp
);
2288 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2289 if (flags
& TFF_EXPR_IN_PARENS
)
2290 pp_cxx_right_paren (pp
);
2293 /* Else fall through. */
2295 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2299 case IMPLICIT_CONV_EXPR
:
2300 case VIEW_CONVERT_EXPR
:
2302 tree op
= TREE_OPERAND (t
, 0);
2303 tree ttype
= TREE_TYPE (t
);
2304 tree optype
= TREE_TYPE (op
);
2306 if (TREE_CODE (ttype
) != TREE_CODE (optype
)
2307 && POINTER_TYPE_P (ttype
)
2308 && POINTER_TYPE_P (optype
)
2309 && same_type_p (TREE_TYPE (optype
),
2312 if (TREE_CODE (ttype
) == REFERENCE_TYPE
)
2315 if (TREE_CODE (op
) == ADDR_EXPR
)
2316 dump_expr (pp
, TREE_OPERAND (op
, 0), flags
);
2318 dump_unary_op (pp
, "*", t
, flags
);
2321 dump_unary_op (pp
, "&", t
, flags
);
2323 else if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
2325 /* It is a cast, but we cannot tell whether it is a
2326 reinterpret or static cast. Use the C style notation. */
2327 if (flags
& TFF_EXPR_IN_PARENS
)
2328 pp_cxx_left_paren (pp
);
2329 pp_cxx_left_paren (pp
);
2330 dump_type (pp
, TREE_TYPE (t
), flags
);
2331 pp_cxx_right_paren (pp
);
2332 dump_expr (pp
, op
, flags
| TFF_EXPR_IN_PARENS
);
2333 if (flags
& TFF_EXPR_IN_PARENS
)
2334 pp_cxx_right_paren (pp
);
2337 dump_expr (pp
, op
, flags
);
2342 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
2344 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
2346 if (integer_zerop (idx
))
2348 /* A NULL pointer-to-member constant. */
2349 pp_cxx_left_paren (pp
);
2350 pp_cxx_left_paren (pp
);
2351 dump_type (pp
, TREE_TYPE (t
), flags
);
2352 pp_cxx_right_paren (pp
);
2353 pp_character (pp
, '0');
2354 pp_cxx_right_paren (pp
);
2357 else if (tree_fits_shwi_p (idx
))
2360 unsigned HOST_WIDE_INT n
;
2362 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
2363 t
= TYPE_METHOD_BASETYPE (t
);
2364 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
2366 n
= tree_to_shwi (idx
);
2368 /* Map vtable index back one, to allow for the null pointer to
2372 while (n
> 0 && virtuals
)
2375 virtuals
= TREE_CHAIN (virtuals
);
2379 dump_expr (pp
, BV_FN (virtuals
),
2380 flags
| TFF_EXPR_IN_PARENS
);
2385 if (TREE_TYPE (t
) && LAMBDA_TYPE_P (TREE_TYPE (t
)))
2386 pp_string (pp
, "<lambda closure object>");
2387 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
2389 dump_type (pp
, TREE_TYPE (t
), 0);
2390 pp_cxx_left_paren (pp
);
2391 pp_cxx_right_paren (pp
);
2395 if (!BRACE_ENCLOSED_INITIALIZER_P (t
))
2396 dump_type (pp
, TREE_TYPE (t
), 0);
2397 pp_cxx_left_brace (pp
);
2398 dump_expr_init_vec (pp
, CONSTRUCTOR_ELTS (t
), flags
);
2399 pp_cxx_right_brace (pp
);
2406 tree ob
= TREE_OPERAND (t
, 0);
2407 if (is_dummy_object (ob
))
2409 t
= TREE_OPERAND (t
, 1);
2410 if (TREE_CODE (t
) == FUNCTION_DECL
)
2412 dump_expr (pp
, t
, flags
| TFF_EXPR_IN_PARENS
);
2413 else if (BASELINK_P (t
))
2414 dump_expr (pp
, OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
2415 flags
| TFF_EXPR_IN_PARENS
);
2417 dump_decl (pp
, t
, flags
);
2421 if (INDIRECT_REF_P (ob
))
2423 dump_expr (pp
, TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
2429 dump_expr (pp
, ob
, flags
| TFF_EXPR_IN_PARENS
);
2433 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2438 case TEMPLATE_PARM_INDEX
:
2439 dump_decl (pp
, TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
2443 if (TREE_OPERAND (t
, 0) == NULL_TREE
2444 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
2446 dump_type (pp
, TREE_TYPE (t
), flags
);
2447 pp_cxx_left_paren (pp
);
2448 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2449 pp_cxx_right_paren (pp
);
2453 pp_cxx_left_paren (pp
);
2454 dump_type (pp
, TREE_TYPE (t
), flags
);
2455 pp_cxx_right_paren (pp
);
2456 pp_cxx_left_paren (pp
);
2457 dump_expr_list (pp
, TREE_OPERAND (t
, 0), flags
);
2458 pp_cxx_right_paren (pp
);
2462 case STATIC_CAST_EXPR
:
2463 pp_cxx_ws_string (pp
, "static_cast");
2465 case REINTERPRET_CAST_EXPR
:
2466 pp_cxx_ws_string (pp
, "reinterpret_cast");
2468 case CONST_CAST_EXPR
:
2469 pp_cxx_ws_string (pp
, "const_cast");
2471 case DYNAMIC_CAST_EXPR
:
2472 pp_cxx_ws_string (pp
, "dynamic_cast");
2474 pp_cxx_begin_template_argument_list (pp
);
2475 dump_type (pp
, TREE_TYPE (t
), flags
);
2476 pp_cxx_end_template_argument_list (pp
);
2477 pp_cxx_left_paren (pp
);
2478 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2479 pp_cxx_right_paren (pp
);
2483 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2489 if (TREE_CODE (t
) == SIZEOF_EXPR
)
2490 pp_cxx_ws_string (pp
, "sizeof");
2493 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
2494 pp_cxx_ws_string (pp
, "__alignof__");
2496 op
= TREE_OPERAND (t
, 0);
2497 if (PACK_EXPANSION_P (op
))
2499 pp_string (pp
, "...");
2500 op
= PACK_EXPANSION_PATTERN (op
);
2502 pp_cxx_whitespace (pp
);
2503 pp_cxx_left_paren (pp
);
2504 if (TREE_CODE (t
) == SIZEOF_EXPR
&& SIZEOF_EXPR_TYPE_P (t
))
2505 dump_type (pp
, TREE_TYPE (op
), flags
);
2506 else if (TYPE_P (TREE_OPERAND (t
, 0)))
2507 dump_type (pp
, op
, flags
);
2509 dump_expr (pp
, op
, flags
);
2510 pp_cxx_right_paren (pp
);
2513 case AT_ENCODE_EXPR
:
2514 pp_cxx_ws_string (pp
, "@encode");
2515 pp_cxx_whitespace (pp
);
2516 pp_cxx_left_paren (pp
);
2517 dump_type (pp
, TREE_OPERAND (t
, 0), flags
);
2518 pp_cxx_right_paren (pp
);
2522 pp_cxx_ws_string (pp
, "noexcept");
2523 pp_cxx_whitespace (pp
);
2524 pp_cxx_left_paren (pp
);
2525 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2526 pp_cxx_right_paren (pp
);
2531 pp_cxx_ws_string (pp
, operator_name_info
[TREE_CODE (t
)].name
);
2532 pp_cxx_whitespace (pp
);
2533 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2537 pp_string (pp
, M_("<unparsed>"));
2540 case TRY_CATCH_EXPR
:
2541 case WITH_CLEANUP_EXPR
:
2542 case CLEANUP_POINT_EXPR
:
2543 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2546 case PSEUDO_DTOR_EXPR
:
2547 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2549 if (TREE_OPERAND (t
, 1))
2551 dump_type (pp
, TREE_OPERAND (t
, 1), flags
);
2552 pp_cxx_colon_colon (pp
);
2554 pp_cxx_complement (pp
);
2555 dump_type (pp
, TREE_OPERAND (t
, 2), flags
);
2558 case TEMPLATE_ID_EXPR
:
2559 dump_decl (pp
, t
, flags
);
2565 case STATEMENT_LIST
:
2566 /* We don't yet have a way of dumping statements in a
2567 human-readable format. */
2568 pp_string (pp
, "({...})");
2572 pp_string (pp
, "while (1) { ");
2573 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2574 pp_cxx_right_brace (pp
);
2578 pp_string (pp
, "if (");
2579 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2580 pp_string (pp
, ") break; ");
2584 dump_expr (pp
, BASELINK_FUNCTIONS (t
), flags
& ~TFF_EXPR_IN_PARENS
);
2587 case EMPTY_CLASS_EXPR
:
2588 dump_type (pp
, TREE_TYPE (t
), flags
);
2589 pp_cxx_left_paren (pp
);
2590 pp_cxx_right_paren (pp
);
2593 case NON_DEPENDENT_EXPR
:
2594 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
);
2597 case ARGUMENT_PACK_SELECT
:
2598 dump_template_argument (pp
, ARGUMENT_PACK_SELECT_FROM_PACK (t
), flags
);
2610 pp_type_specifier_seq (pp
, t
);
2614 /* We get here when we want to print a dependent type as an
2615 id-expression, without any disambiguator decoration. */
2616 pp
->id_expression (t
);
2619 case TEMPLATE_TYPE_PARM
:
2620 case TEMPLATE_TEMPLATE_PARM
:
2621 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2622 dump_type (pp
, t
, flags
);
2626 pp_cxx_trait_expression (pp
, t
);
2630 pp_cxx_va_arg_expression (pp
, t
);
2634 pp_cxx_offsetof_expression (pp
, t
);
2638 dump_decl (pp
, t
, flags
);
2641 case EXPR_PACK_EXPANSION
:
2648 case VEC_DELETE_EXPR
:
2654 case UNORDERED_EXPR
:
2664 case FIX_TRUNC_EXPR
:
2669 case TRUTH_AND_EXPR
:
2671 case TRUTH_XOR_EXPR
:
2672 if (flags
& TFF_EXPR_IN_PARENS
)
2673 pp_cxx_left_paren (pp
);
2675 if (flags
& TFF_EXPR_IN_PARENS
)
2676 pp_cxx_right_paren (pp
);
2680 dump_expr (pp
, resolve_virtual_fun_from_obj_type_ref (t
), flags
);
2684 pp_string (pp
, M_("<lambda>"));
2688 pp_cxx_left_paren (pp
);
2689 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2690 pp_cxx_right_paren (pp
);
2693 case PLACEHOLDER_EXPR
:
2694 pp_string (pp
, M_("*this"));
2697 /* This list is incomplete, but should suffice for now.
2698 It is very important that `sorry' does not call
2699 `report_error_function'. That could cause an infinite loop. */
2701 pp_unsupported_tree (pp
, t
);
2702 /* fall through to ERROR_MARK... */
2704 pp_string (pp
, M_("<expression error>"));
2710 dump_binary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
,
2713 pp_cxx_left_paren (pp
);
2714 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2715 pp_cxx_whitespace (pp
);
2717 pp_cxx_ws_string (pp
, opstring
);
2719 pp_string (pp
, M_("<unknown operator>"));
2720 pp_cxx_whitespace (pp
);
2721 dump_expr (pp
, TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2722 pp_cxx_right_paren (pp
);
2726 dump_unary_op (cxx_pretty_printer
*pp
, const char *opstring
, tree t
, int flags
)
2728 if (flags
& TFF_EXPR_IN_PARENS
)
2729 pp_cxx_left_paren (pp
);
2730 pp_cxx_ws_string (pp
, opstring
);
2731 dump_expr (pp
, TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2732 if (flags
& TFF_EXPR_IN_PARENS
)
2733 pp_cxx_right_paren (pp
);
2737 reinit_cxx_pp (void)
2739 pp_clear_output_area (cxx_pp
);
2740 cxx_pp
->padding
= pp_none
;
2741 pp_indentation (cxx_pp
) = 0;
2742 pp_needs_newline (cxx_pp
) = false;
2743 cxx_pp
->enclosing_scope
= current_function_decl
;
2746 /* Same as pp_formatted_text, except the return string is a separate
2747 copy and has a GGC storage duration, e.g. an indefinite lifetime. */
2750 pp_ggc_formatted_text (pretty_printer
*pp
)
2752 return ggc_strdup (pp_formatted_text (pp
));
2755 /* Exported interface to stringifying types, exprs and decls under TFF_*
2759 type_as_string (tree typ
, int flags
)
2762 pp_translate_identifiers (cxx_pp
) = false;
2763 dump_type (cxx_pp
, typ
, flags
);
2764 return pp_ggc_formatted_text (cxx_pp
);
2768 type_as_string_translate (tree typ
, int flags
)
2771 dump_type (cxx_pp
, typ
, flags
);
2772 return pp_ggc_formatted_text (cxx_pp
);
2776 expr_as_string (tree decl
, int flags
)
2779 pp_translate_identifiers (cxx_pp
) = false;
2780 dump_expr (cxx_pp
, decl
, flags
);
2781 return pp_ggc_formatted_text (cxx_pp
);
2784 /* Wrap decl_as_string with options appropriate for dwarf. */
2787 decl_as_dwarf_string (tree decl
, int flags
)
2790 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2791 here will be adequate to get the desired behaviour. */
2792 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2793 name
= decl_as_string (decl
, flags
);
2794 /* Subsequent calls to the pretty printer shouldn't use this style. */
2795 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2800 decl_as_string (tree decl
, int flags
)
2803 pp_translate_identifiers (cxx_pp
) = false;
2804 dump_decl (cxx_pp
, decl
, flags
);
2805 return pp_ggc_formatted_text (cxx_pp
);
2809 decl_as_string_translate (tree decl
, int flags
)
2812 dump_decl (cxx_pp
, decl
, flags
);
2813 return pp_ggc_formatted_text (cxx_pp
);
2816 /* Wrap lang_decl_name with options appropriate for dwarf. */
2819 lang_decl_dwarf_name (tree decl
, int v
, bool translate
)
2822 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2823 here will be adequate to get the desired behaviour. */
2824 cxx_pp
->flags
|= pp_c_flag_gnu_v3
;
2825 name
= lang_decl_name (decl
, v
, translate
);
2826 /* Subsequent calls to the pretty printer shouldn't use this style. */
2827 cxx_pp
->flags
&= ~pp_c_flag_gnu_v3
;
2831 /* Generate the three forms of printable names for cxx_printable_name. */
2834 lang_decl_name (tree decl
, int v
, bool translate
)
2838 ? decl_as_string_translate (decl
, TFF_DECL_SPECIFIERS
)
2839 : decl_as_string (decl
, TFF_DECL_SPECIFIERS
));
2842 pp_translate_identifiers (cxx_pp
) = translate
;
2844 && (DECL_CLASS_SCOPE_P (decl
)
2845 || (DECL_NAMESPACE_SCOPE_P (decl
)
2846 && CP_DECL_CONTEXT (decl
) != global_namespace
)))
2848 dump_type (cxx_pp
, CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2849 pp_cxx_colon_colon (cxx_pp
);
2852 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2853 dump_function_name (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
);
2854 else if ((DECL_NAME (decl
) == NULL_TREE
)
2855 && TREE_CODE (decl
) == NAMESPACE_DECL
)
2856 dump_decl (cxx_pp
, decl
, TFF_PLAIN_IDENTIFIER
| TFF_UNQUALIFIED_NAME
);
2858 dump_decl (cxx_pp
, DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2860 return pp_ggc_formatted_text (cxx_pp
);
2863 /* Return the location of a tree passed to %+ formats. */
2866 location_of (tree t
)
2870 t
= TYPE_MAIN_DECL (t
);
2872 return input_location
;
2874 else if (TREE_CODE (t
) == OVERLOAD
)
2875 t
= OVL_FUNCTION (t
);
2878 return DECL_SOURCE_LOCATION (t
);
2879 return EXPR_LOC_OR_LOC (t
, input_location
);
2882 /* Now the interfaces from error et al to dump_type et al. Each takes an
2883 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2887 decl_to_string (tree decl
, int verbose
)
2891 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2892 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2893 flags
= TFF_CLASS_KEY_OR_ENUM
;
2895 flags
|= TFF_DECL_SPECIFIERS
;
2896 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2897 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2898 flags
|= TFF_TEMPLATE_HEADER
;
2901 dump_decl (cxx_pp
, decl
, flags
);
2902 return pp_ggc_formatted_text (cxx_pp
);
2906 expr_to_string (tree decl
)
2909 dump_expr (cxx_pp
, decl
, 0);
2910 return pp_ggc_formatted_text (cxx_pp
);
2914 fndecl_to_string (tree fndecl
, int verbose
)
2918 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2919 | TFF_TEMPLATE_HEADER
;
2921 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2923 dump_decl (cxx_pp
, fndecl
, flags
);
2924 return pp_ggc_formatted_text (cxx_pp
);
2929 code_to_string (enum tree_code c
)
2931 return get_tree_code_name (c
);
2935 language_to_string (enum languages c
)
2942 case lang_cplusplus
:
2954 /* Return the proper printed version of a parameter to a C++ function. */
2957 parm_to_string (int p
)
2961 pp_string (cxx_pp
, "'this'");
2963 pp_decimal_int (cxx_pp
, p
+ 1);
2964 return pp_ggc_formatted_text (cxx_pp
);
2968 op_to_string (enum tree_code p
)
2970 tree id
= operator_name_info
[p
].identifier
;
2971 return id
? IDENTIFIER_POINTER (id
) : M_("<unknown>");
2975 type_to_string (tree typ
, int verbose
)
2979 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2980 flags
|= TFF_TEMPLATE_HEADER
;
2983 dump_type (cxx_pp
, typ
, flags
);
2984 /* If we're printing a type that involves typedefs, also print the
2985 stripped version. But sometimes the stripped version looks
2986 exactly the same, so we don't want it after all. To avoid printing
2987 it in that case, we play ugly obstack games. */
2988 if (typ
&& TYPE_P (typ
) && typ
!= TYPE_CANONICAL (typ
)
2989 && !uses_template_parms (typ
))
2991 int aka_start
, aka_len
; char *p
;
2992 struct obstack
*ob
= pp_buffer (cxx_pp
)->obstack
;
2993 /* Remember the end of the initial dump. */
2994 int len
= obstack_object_size (ob
);
2995 tree aka
= strip_typedefs (typ
);
2996 pp_string (cxx_pp
, " {aka");
2997 pp_cxx_whitespace (cxx_pp
);
2998 /* And remember the start of the aka dump. */
2999 aka_start
= obstack_object_size (ob
);
3000 dump_type (cxx_pp
, aka
, flags
);
3001 aka_len
= obstack_object_size (ob
) - aka_start
;
3002 pp_right_brace (cxx_pp
);
3003 p
= (char*)obstack_base (ob
);
3004 /* If they are identical, cut off the aka with a NUL. */
3005 if (len
== aka_len
&& memcmp (p
, p
+aka_start
, len
) == 0)
3008 return pp_ggc_formatted_text (cxx_pp
);
3012 assop_to_string (enum tree_code p
)
3014 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
3015 return id
? IDENTIFIER_POINTER (id
) : M_("{unknown}");
3019 args_to_string (tree p
, int verbose
)
3023 flags
|= TFF_CLASS_KEY_OR_ENUM
;
3028 if (TYPE_P (TREE_VALUE (p
)))
3029 return type_as_string_translate (p
, flags
);
3032 for (; p
; p
= TREE_CHAIN (p
))
3034 if (TREE_VALUE (p
) == null_node
)
3035 pp_cxx_ws_string (cxx_pp
, "NULL");
3037 dump_type (cxx_pp
, error_type (TREE_VALUE (p
)), flags
);
3039 pp_separate_with_comma (cxx_pp
);
3041 return pp_ggc_formatted_text (cxx_pp
);
3044 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
3045 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
3049 subst_to_string (tree p
)
3051 tree decl
= TREE_PURPOSE (p
);
3052 tree targs
= TREE_VALUE (p
);
3053 tree tparms
= DECL_TEMPLATE_PARMS (decl
);
3054 int flags
= (TFF_DECL_SPECIFIERS
|TFF_TEMPLATE_HEADER
3055 |TFF_NO_TEMPLATE_BINDINGS
);
3061 dump_template_decl (cxx_pp
, TREE_PURPOSE (p
), flags
);
3062 dump_substitution (cxx_pp
, NULL
, tparms
, targs
, /*flags=*/0);
3063 return pp_ggc_formatted_text (cxx_pp
);
3067 cv_to_string (tree p
, int v
)
3070 cxx_pp
->padding
= v
? pp_before
: pp_none
;
3071 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
3072 return pp_ggc_formatted_text (cxx_pp
);
3076 eh_spec_to_string (tree p
, int /*v*/)
3080 dump_exception_spec (cxx_pp
, p
, flags
);
3081 return pp_ggc_formatted_text (cxx_pp
);
3084 /* Langhook for print_error_function. */
3086 cxx_print_error_function (diagnostic_context
*context
, const char *file
,
3087 diagnostic_info
*diagnostic
)
3089 lhd_print_error_function (context
, file
, diagnostic
);
3090 pp_set_prefix (context
->printer
, file
);
3091 maybe_print_instantiation_context (context
);
3095 cp_diagnostic_starter (diagnostic_context
*context
,
3096 diagnostic_info
*diagnostic
)
3098 diagnostic_report_current_module (context
, diagnostic
->location
);
3099 cp_print_error_function (context
, diagnostic
);
3100 maybe_print_instantiation_context (context
);
3101 maybe_print_constexpr_context (context
);
3102 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
3106 /* Print current function onto BUFFER, in the process of reporting
3107 a diagnostic message. Called from cp_diagnostic_starter. */
3109 cp_print_error_function (diagnostic_context
*context
,
3110 diagnostic_info
*diagnostic
)
3112 /* If we are in an instantiation context, current_function_decl is likely
3113 to be wrong, so just rely on print_instantiation_full_context. */
3114 if (current_instantiation ())
3116 if (diagnostic_last_function_changed (context
, diagnostic
))
3118 const char *old_prefix
= context
->printer
->prefix
;
3119 const char *file
= LOCATION_FILE (diagnostic
->location
);
3120 tree abstract_origin
= diagnostic_abstract_origin (diagnostic
);
3121 char *new_prefix
= (file
&& abstract_origin
== NULL
)
3122 ? file_name_as_prefix (context
, file
) : NULL
;
3124 pp_set_prefix (context
->printer
, new_prefix
);
3126 if (current_function_decl
== NULL
)
3127 pp_string (context
->printer
, _("At global scope:"));
3132 if (abstract_origin
)
3134 ao
= BLOCK_ABSTRACT_ORIGIN (abstract_origin
);
3135 while (TREE_CODE (ao
) == BLOCK
3136 && BLOCK_ABSTRACT_ORIGIN (ao
)
3137 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3138 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3139 gcc_assert (TREE_CODE (ao
) == FUNCTION_DECL
);
3143 fndecl
= current_function_decl
;
3145 pp_printf (context
->printer
, function_category (fndecl
),
3146 cxx_printable_name_translate (fndecl
, 2));
3148 while (abstract_origin
)
3151 tree block
= abstract_origin
;
3153 locus
= &BLOCK_SOURCE_LOCATION (block
);
3155 block
= BLOCK_SUPERCONTEXT (block
);
3156 while (block
&& TREE_CODE (block
) == BLOCK
3157 && BLOCK_ABSTRACT_ORIGIN (block
))
3159 ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3161 while (TREE_CODE (ao
) == BLOCK
3162 && BLOCK_ABSTRACT_ORIGIN (ao
)
3163 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3164 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3166 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3171 else if (TREE_CODE (ao
) != BLOCK
)
3174 block
= BLOCK_SUPERCONTEXT (block
);
3177 abstract_origin
= block
;
3180 while (block
&& TREE_CODE (block
) == BLOCK
)
3181 block
= BLOCK_SUPERCONTEXT (block
);
3183 if (block
&& TREE_CODE (block
) == FUNCTION_DECL
)
3185 abstract_origin
= NULL
;
3189 expanded_location s
= expand_location (*locus
);
3190 pp_character (context
->printer
, ',');
3191 pp_newline (context
->printer
);
3194 if (context
->show_column
&& s
.column
!= 0)
3195 pp_printf (context
->printer
,
3196 _(" inlined from %qs at %r%s:%d:%d%R"),
3197 cxx_printable_name_translate (fndecl
, 2),
3198 "locus", s
.file
, s
.line
, s
.column
);
3200 pp_printf (context
->printer
,
3201 _(" inlined from %qs at %r%s:%d%R"),
3202 cxx_printable_name_translate (fndecl
, 2),
3203 "locus", s
.file
, s
.line
);
3207 pp_printf (context
->printer
, _(" inlined from %qs"),
3208 cxx_printable_name_translate (fndecl
, 2));
3211 pp_character (context
->printer
, ':');
3213 pp_newline (context
->printer
);
3215 diagnostic_set_last_function (context
, diagnostic
);
3216 pp_destroy_prefix (context
->printer
);
3217 context
->printer
->prefix
= old_prefix
;
3221 /* Returns a description of FUNCTION using standard terminology. The
3222 result is a format string of the form "In CATEGORY %qs". */
3224 function_category (tree fn
)
3226 /* We can get called from the middle-end for diagnostics of function
3227 clones. Make sure we have language specific information before
3228 dereferencing it. */
3229 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn
))
3230 && DECL_FUNCTION_MEMBER_P (fn
))
3232 if (DECL_STATIC_FUNCTION_P (fn
))
3233 return _("In static member function %qs");
3234 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
3235 return _("In copy constructor %qs");
3236 else if (DECL_CONSTRUCTOR_P (fn
))
3237 return _("In constructor %qs");
3238 else if (DECL_DESTRUCTOR_P (fn
))
3239 return _("In destructor %qs");
3240 else if (LAMBDA_FUNCTION_P (fn
))
3241 return _("In lambda function");
3243 return _("In member function %qs");
3246 return _("In function %qs");
3249 /* Report the full context of a current template instantiation,
3252 print_instantiation_full_context (diagnostic_context
*context
)
3254 struct tinst_level
*p
= current_instantiation ();
3255 location_t location
= input_location
;
3259 pp_verbatim (context
->printer
,
3260 TREE_CODE (p
->decl
) == TREE_LIST
3261 ? _("%s: In substitution of %qS:\n")
3262 : _("%s: In instantiation of %q#D:\n"),
3263 LOCATION_FILE (location
),
3266 location
= p
->locus
;
3270 print_instantiation_partial_context (context
, p
, location
);
3273 /* Helper function of print_instantiation_partial_context() that
3274 prints a single line of instantiation context. */
3277 print_instantiation_partial_context_line (diagnostic_context
*context
,
3278 const struct tinst_level
*t
,
3279 location_t loc
, bool recursive_p
)
3281 if (loc
== UNKNOWN_LOCATION
)
3284 expanded_location xloc
= expand_location (loc
);
3286 if (context
->show_column
)
3287 pp_verbatim (context
->printer
, _("%r%s:%d:%d:%R "),
3288 "locus", xloc
.file
, xloc
.line
, xloc
.column
);
3290 pp_verbatim (context
->printer
, _("%r%s:%d:%R "),
3291 "locus", xloc
.file
, xloc
.line
);
3295 if (TREE_CODE (t
->decl
) == TREE_LIST
)
3296 pp_verbatim (context
->printer
,
3298 ? _("recursively required by substitution of %qS\n")
3299 : _("required by substitution of %qS\n"),
3302 pp_verbatim (context
->printer
,
3304 ? _("recursively required from %q#D\n")
3305 : _("required from %q#D\n"),
3310 pp_verbatim (context
->printer
,
3312 ? _("recursively required from here")
3313 : _("required from here"));
3317 /* Same as print_instantiation_full_context but less verbose. */
3320 print_instantiation_partial_context (diagnostic_context
*context
,
3321 struct tinst_level
*t0
, location_t loc
)
3323 struct tinst_level
*t
;
3326 location_t prev_loc
= loc
;
3328 for (t
= t0
; t
!= NULL
; t
= t
->next
)
3329 if (prev_loc
!= t
->locus
)
3331 prev_loc
= t
->locus
;
3337 if (template_backtrace_limit
3338 && n_total
> template_backtrace_limit
)
3340 int skip
= n_total
- template_backtrace_limit
;
3341 int head
= template_backtrace_limit
/ 2;
3343 /* Avoid skipping just 1. If so, skip 2. */
3347 head
= (template_backtrace_limit
- 1) / 2;
3350 for (n
= 0; n
< head
; n
++)
3352 gcc_assert (t
!= NULL
);
3353 if (loc
!= t
->locus
)
3354 print_instantiation_partial_context_line (context
, t
, loc
,
3355 /*recursive_p=*/false);
3359 if (t
!= NULL
&& skip
> 0)
3361 expanded_location xloc
;
3362 xloc
= expand_location (loc
);
3363 if (context
->show_column
)
3364 pp_verbatim (context
->printer
,
3365 _("%r%s:%d:%d:%R [ skipping %d instantiation "
3366 "contexts, use -ftemplate-backtrace-limit=0 to "
3368 "locus", xloc
.file
, xloc
.line
, xloc
.column
, skip
);
3370 pp_verbatim (context
->printer
,
3371 _("%r%s:%d:%R [ skipping %d instantiation "
3372 "contexts, use -ftemplate-backtrace-limit=0 to "
3374 "locus", xloc
.file
, xloc
.line
, skip
);
3379 } while (t
!= NULL
&& --skip
> 0);
3385 while (t
->next
!= NULL
&& t
->locus
== t
->next
->locus
)
3390 print_instantiation_partial_context_line (context
, t
, loc
,
3395 print_instantiation_partial_context_line (context
, NULL
, loc
,
3396 /*recursive_p=*/false);
3397 pp_newline (context
->printer
);
3400 /* Called from cp_thing to print the template context for an error. */
3402 maybe_print_instantiation_context (diagnostic_context
*context
)
3404 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3407 record_last_problematic_instantiation ();
3408 print_instantiation_full_context (context
);
3411 /* Report what constexpr call(s) we're trying to expand, if any. */
3414 maybe_print_constexpr_context (diagnostic_context
*context
)
3416 vec
<tree
> call_stack
= cx_error_context ();
3420 FOR_EACH_VEC_ELT (call_stack
, ix
, t
)
3422 expanded_location xloc
= expand_location (EXPR_LOCATION (t
));
3423 const char *s
= expr_as_string (t
, 0);
3424 if (context
->show_column
)
3425 pp_verbatim (context
->printer
,
3426 _("%r%s:%d:%d:%R in constexpr expansion of %qs"),
3427 "locus", xloc
.file
, xloc
.line
, xloc
.column
, s
);
3429 pp_verbatim (context
->printer
,
3430 _("%r%s:%d:%R in constexpr expansion of %qs"),
3431 "locus", xloc
.file
, xloc
.line
, s
);
3432 pp_newline (context
->printer
);
3436 /* Called from output_format -- during diagnostic message processing --
3437 to handle C++ specific format specifier with the following meanings:
3438 %A function argument-list.
3442 %F function declaration.
3443 %L language as used in extern "lang".
3445 %P function parameter whose position is indicated by an integer.
3446 %Q assignment operator.
3447 %S substitution (template + args)
3450 %X exception-specification. */
3452 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
3453 int precision
, bool wide
, bool set_locus
, bool verbose
)
3457 #define next_tree (t = va_arg (*text->args_ptr, tree))
3458 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3459 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3460 #define next_int va_arg (*text->args_ptr, int)
3462 if (precision
!= 0 || wide
)
3465 if (text
->locus
== NULL
)
3470 case 'A': result
= args_to_string (next_tree
, verbose
); break;
3471 case 'C': result
= code_to_string (next_tcode
); break;
3474 tree temp
= next_tree
;
3476 && DECL_HAS_DEBUG_EXPR_P (temp
))
3478 temp
= DECL_DEBUG_EXPR (temp
);
3481 result
= expr_to_string (temp
);
3485 result
= decl_to_string (temp
, verbose
);
3488 case 'E': result
= expr_to_string (next_tree
); break;
3489 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
3490 case 'L': result
= language_to_string (next_lang
); break;
3491 case 'O': result
= op_to_string (next_tcode
); break;
3492 case 'P': result
= parm_to_string (next_int
); break;
3493 case 'Q': result
= assop_to_string (next_tcode
); break;
3494 case 'S': result
= subst_to_string (next_tree
); break;
3495 case 'T': result
= type_to_string (next_tree
, verbose
); break;
3496 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
3497 case 'X': result
= eh_spec_to_string (next_tree
, verbose
); break;
3500 percent_K_format (text
);
3507 pp_string (pp
, result
);
3508 if (set_locus
&& t
!= NULL
)
3509 *text
->locus
= location_of (t
);
3517 /* Warn about the use of C++0x features when appropriate. */
3519 maybe_warn_cpp0x (cpp0x_warn_str str
)
3521 if ((cxx_dialect
== cxx98
) && !in_system_header_at (input_location
))
3522 /* We really want to suppress this warning in system headers,
3523 because libstdc++ uses variadic templates even when we aren't
3527 case CPP0X_INITIALIZER_LISTS
:
3528 pedwarn (input_location
, 0,
3529 "extended initializer lists "
3530 "only available with -std=c++11 or -std=gnu++11");
3532 case CPP0X_EXPLICIT_CONVERSION
:
3533 pedwarn (input_location
, 0,
3534 "explicit conversion operators "
3535 "only available with -std=c++11 or -std=gnu++11");
3537 case CPP0X_VARIADIC_TEMPLATES
:
3538 pedwarn (input_location
, 0,
3539 "variadic templates "
3540 "only available with -std=c++11 or -std=gnu++11");
3542 case CPP0X_LAMBDA_EXPR
:
3543 pedwarn (input_location
, 0,
3544 "lambda expressions "
3545 "only available with -std=c++11 or -std=gnu++11");
3548 pedwarn (input_location
, 0,
3549 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3551 case CPP0X_SCOPED_ENUMS
:
3552 pedwarn (input_location
, 0,
3553 "scoped enums only available with -std=c++11 or -std=gnu++11");
3555 case CPP0X_DEFAULTED_DELETED
:
3556 pedwarn (input_location
, 0,
3557 "defaulted and deleted functions "
3558 "only available with -std=c++11 or -std=gnu++11");
3560 case CPP0X_INLINE_NAMESPACES
:
3561 pedwarn (input_location
, OPT_Wpedantic
,
3562 "inline namespaces "
3563 "only available with -std=c++11 or -std=gnu++11");
3565 case CPP0X_OVERRIDE_CONTROLS
:
3566 pedwarn (input_location
, 0,
3567 "override controls (override/final) "
3568 "only available with -std=c++11 or -std=gnu++11");
3571 pedwarn (input_location
, 0,
3572 "non-static data member initializers "
3573 "only available with -std=c++11 or -std=gnu++11");
3575 case CPP0X_USER_DEFINED_LITERALS
:
3576 pedwarn (input_location
, 0,
3577 "user-defined literals "
3578 "only available with -std=c++11 or -std=gnu++11");
3580 case CPP0X_DELEGATING_CTORS
:
3581 pedwarn (input_location
, 0,
3582 "delegating constructors "
3583 "only available with -std=c++11 or -std=gnu++11");
3585 case CPP0X_INHERITING_CTORS
:
3586 pedwarn (input_location
, 0,
3587 "inheriting constructors "
3588 "only available with -std=c++11 or -std=gnu++11");
3590 case CPP0X_ATTRIBUTES
:
3591 pedwarn (input_location
, 0,
3593 "only available with -std=c++11 or -std=gnu++11");
3595 case CPP0X_REF_QUALIFIER
:
3596 pedwarn (input_location
, 0,
3598 "only available with -std=c++11 or -std=gnu++11");
3605 /* Warn about the use of variadic templates when appropriate. */
3607 maybe_warn_variadic_templates (void)
3609 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES
);
3613 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3614 option OPT with text GMSGID. Use this function to report
3615 diagnostics for constructs that are invalid C++98, but valid
3618 pedwarn_cxx98 (location_t location
, int opt
, const char *gmsgid
, ...)
3620 diagnostic_info diagnostic
;
3624 va_start (ap
, gmsgid
);
3625 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
3626 (cxx_dialect
== cxx98
) ? DK_PEDWARN
: DK_WARNING
);
3627 diagnostic
.option_index
= opt
;
3628 ret
= report_diagnostic (&diagnostic
);
3633 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3634 we found when we tried to do the lookup. LOCATION is the location of
3635 the NAME identifier. */
3638 qualified_name_lookup_error (tree scope
, tree name
,
3639 tree decl
, location_t location
)
3641 if (scope
== error_mark_node
)
3642 ; /* We already complained. */
3643 else if (TYPE_P (scope
))
3645 if (!COMPLETE_TYPE_P (scope
))
3646 error_at (location
, "incomplete type %qT used in nested name specifier",
3648 else if (TREE_CODE (decl
) == TREE_LIST
)
3650 error_at (location
, "reference to %<%T::%D%> is ambiguous",
3652 print_candidates (decl
);
3655 error_at (location
, "%qD is not a member of %qT", name
, scope
);
3657 else if (scope
!= global_namespace
)
3659 error_at (location
, "%qD is not a member of %qD", name
, scope
);
3660 suggest_alternatives_for (location
, name
);
3664 error_at (location
, "%<::%D%> has not been declared", name
);
3665 suggest_alternatives_for (location
, name
);