real.h (HONOR_SNANS, [...]): Replace macros with 3 overloaded declarations.
[official-gcc.git] / gcc / cp / error.c
blobff26fb91f73b29e8ecdb73544ec98247eec0c4b4
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)
9 any later version.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "tree.h"
25 #include "stringpool.h"
26 #include "cp-tree.h"
27 #include "flags.h"
28 #include "diagnostic.h"
29 #include "tree-diagnostic.h"
30 #include "langhooks-def.h"
31 #include "intl.h"
32 #include "cxx-pretty-print.h"
33 #include "tree-pretty-print.h"
34 #include "c-family/c-objc.h"
35 #include "ubsan.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
52 __PRETTY_FUNCTION. */
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,
93 vec<tree, va_gc> *);
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 *,
103 location_t);
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
115 capacities. */
117 void
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 ();
126 XDELETE (base);
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
136 cxx_pp above. */
138 void
139 init_error (void)
141 new (cxx_pp) cxx_pretty_printer ();
144 /* Dump a scope, if deemed necessary. */
146 static void
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)
152 return;
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. */
176 static void
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);
185 else
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 */
197 static int
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
206 without -g. */
207 (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0
208 || !flag_pretty_templates)
209 return n;
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
215 of FLAGS. */
217 static void
218 dump_template_argument_list (cxx_pretty_printer *pp, tree args, int flags)
220 int n = get_non_default_template_args_count (args, flags);
221 int need_comma = 0;
222 int i;
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. */
231 if (need_comma
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);
237 need_comma = 1;
241 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
243 static void
244 dump_template_parameter (cxx_pretty_printer *pp, tree parm, int flags)
246 tree p;
247 tree a;
249 if (parm == error_mark_node)
250 return;
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, "...");
262 if (DECL_NAME (p))
263 pp_cxx_tree_identifier (pp, DECL_NAME (p));
265 else if (DECL_NAME (p))
266 pp_cxx_tree_identifier (pp, DECL_NAME (p));
267 else
268 pp_cxx_canonical_template_parameter (pp, TREE_TYPE (p));
270 else
271 dump_decl (pp, p, flags | TFF_DECL_SPECIFIERS);
273 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
275 pp_cxx_whitespace (pp);
276 pp_equal (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);
280 else
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
287 TREE_VEC. */
289 static void
290 dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args,
291 vec<tree, va_gc> *typenames)
293 bool need_semicolon = false;
294 int i;
295 tree t;
297 while (parms)
299 tree p = TREE_VALUE (parms);
300 int lvl = TMPL_PARMS_DEPTH (parms);
301 int arg_idx = 0;
302 int i;
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);
317 if (need_semicolon)
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);
322 pp_equal (pp);
323 pp_cxx_whitespace (pp);
324 if (arg)
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);
332 else
333 pp_string (pp, M_("<missing>"));
335 ++arg_idx;
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))
344 return;
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))
349 return;
351 FOR_EACH_VEC_SAFE_ELT (typenames, i, t)
353 if (need_semicolon)
354 pp_separate_with_semicolon (pp);
355 dump_type (pp, t, TFF_PLAIN_IDENTIFIER);
356 pp_cxx_whitespace (pp);
357 pp_equal (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. */
372 static void
373 dump_alias_template_specialization (cxx_pretty_printer *pp, tree t, int flags)
375 tree name;
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),
384 /*primary=*/false,
385 flags & ~TFF_TEMPLATE_HEADER);
388 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
389 format. */
391 static void
392 dump_type (cxx_pretty_printer *pp, tree t, int flags)
394 if (t == NULL_TREE)
395 return;
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);
409 return;
411 else if (same_type_p (t, TREE_TYPE (decl)))
412 t = decl;
413 else
415 pp_cxx_cv_qualifier_seq (pp, t);
416 pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
417 return;
421 if (TYPE_PTRMEMFUNC_P (t))
422 goto offset_type;
424 switch (TREE_CODE (t))
426 case LANG_TYPE:
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>"));
431 else
433 pp_cxx_cv_qualifier_seq (pp, t);
434 pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
436 break;
438 case TREE_LIST:
439 /* A list of function parms. */
440 dump_parameters (pp, t, flags);
441 break;
443 case IDENTIFIER_NODE:
444 pp_cxx_tree_identifier (pp, t);
445 break;
447 case TREE_BINFO:
448 dump_type (pp, BINFO_TYPE (t), flags);
449 break;
451 case RECORD_TYPE:
452 case UNION_TYPE:
453 case ENUMERAL_TYPE:
454 dump_aggr_type (pp, t, flags);
455 break;
457 case TYPE_DECL:
458 if (flags & TFF_CHASE_TYPEDEF)
460 dump_type (pp, DECL_ORIGINAL_TYPE (t)
461 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
462 break;
464 /* Else fall through. */
466 case TEMPLATE_DECL:
467 case NAMESPACE_DECL:
468 dump_decl (pp, t, flags & ~TFF_DECL_SPECIFIERS);
469 break;
471 case INTEGER_TYPE:
472 case REAL_TYPE:
473 case VOID_TYPE:
474 case BOOLEAN_TYPE:
475 case COMPLEX_TYPE:
476 case VECTOR_TYPE:
477 case FIXED_POINT_TYPE:
478 pp_type_specifier_seq (pp, t);
479 break;
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));
485 else
486 pp_cxx_canonical_template_parameter (pp, t);
487 break;
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);
498 break;
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));
504 else
505 pp_cxx_canonical_template_parameter
506 (pp, TEMPLATE_TYPE_PARM_INDEX (t));
507 break;
509 /* This is not always necessary for pointers and such, but doing this
510 reduces code size. */
511 case ARRAY_TYPE:
512 case POINTER_TYPE:
513 case REFERENCE_TYPE:
514 case OFFSET_TYPE:
515 offset_type:
516 case FUNCTION_TYPE:
517 case METHOD_TYPE:
519 dump_type_prefix (pp, t, flags);
520 dump_type_suffix (pp, t, flags);
521 break;
523 case TYPENAME_TYPE:
524 if (! (flags & TFF_CHASE_TYPEDEF)
525 && DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
527 dump_decl (pp, TYPE_NAME (t), TFF_PLAIN_IDENTIFIER);
528 break;
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"
534 : "typename");
535 dump_typename (pp, t, flags);
536 break;
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);
546 break;
548 case TYPEOF_TYPE:
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);
554 break;
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);
562 break;
564 case TYPE_PACK_EXPANSION:
565 dump_type (pp, PACK_EXPANSION_PATTERN (t), flags);
566 pp_cxx_ws_string (pp, "...");
567 break;
569 case TYPE_ARGUMENT_PACK:
570 dump_template_argument (pp, t, flags);
571 break;
573 case DECLTYPE_TYPE:
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);
579 break;
581 case NULLPTR_TYPE:
582 pp_string (pp, "std::nullptr_t");
583 break;
585 default:
586 pp_unsupported_tree (pp, t);
587 /* Fall through to error. */
589 case ERROR_MARK:
590 pp_string (pp, M_("<type error>"));
591 break;
595 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
596 a TYPENAME_TYPE. */
598 static void
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);
605 else
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. */
613 const char *
614 class_key_or_enum_as_string (tree t)
616 if (TREE_CODE (t) == ENUMERAL_TYPE)
618 if (SCOPED_ENUM_P (t))
619 return "enum class";
620 else
621 return "enum";
623 else if (TREE_CODE (t) == UNION_TYPE)
624 return "union";
625 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
626 return "class";
627 else
628 return "struct";
631 /* Print out a class declaration T under the control of FLAGS,
632 in the form `class foo'. */
634 static void
635 dump_aggr_type (cxx_pretty_printer *pp, tree t, int flags)
637 tree name;
638 const char *variety = class_key_or_enum_as_string (t);
639 int typdef = 0;
640 int tmplate = 0;
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);
649 if (name)
651 typdef = (!DECL_ARTIFICIAL (name)
652 /* An alias specialization is not considered to be a
653 typedef. */
654 && !alias_template_specialization_p (t));
656 if ((typdef
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);
664 typdef = 0;
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;
675 if (tmplate)
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);
683 name = 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>"));
692 else
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))
700 dump_parameters (pp,
701 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t)),
702 flags);
703 pp_greater (pp);
705 else
706 pp_cxx_tree_identifier (pp, name);
707 if (tmplate)
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
715 functions. Examples:
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
722 int *[]&. */
724 static void
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);
730 goto offset_type;
733 switch (TREE_CODE (t))
735 case POINTER_TYPE:
736 case REFERENCE_TYPE:
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));
748 if (TYPE_PTR_P (t))
749 pp_star (pp);
750 else if (TREE_CODE (t) == REFERENCE_TYPE)
752 if (TYPE_REF_IS_RVALUE (t))
753 pp_ampersand_ampersand (pp);
754 else
755 pp_ampersand (pp);
757 pp->padding = pp_before;
758 pp_cxx_cv_qualifier_seq (pp, t);
760 break;
762 case OFFSET_TYPE:
763 offset_type:
764 dump_type_prefix (pp, TREE_TYPE (t), flags);
765 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
767 pp_maybe_space (pp);
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);
773 pp_cxx_star (pp);
774 pp_cxx_cv_qualifier_seq (pp, t);
775 pp->padding = pp_before;
776 break;
778 /* This can be reached without a pointer when dealing with
779 templates, e.g. std::is_function. */
780 case FUNCTION_TYPE:
781 dump_type_prefix (pp, TREE_TYPE (t), flags);
782 break;
784 case METHOD_TYPE:
785 dump_type_prefix (pp, TREE_TYPE (t), flags);
786 pp_maybe_space (pp);
787 pp_cxx_left_paren (pp);
788 dump_aggr_type (pp, TYPE_METHOD_BASETYPE (t), flags);
789 pp_cxx_colon_colon (pp);
790 break;
792 case ARRAY_TYPE:
793 dump_type_prefix (pp, TREE_TYPE (t), flags);
794 break;
796 case ENUMERAL_TYPE:
797 case IDENTIFIER_NODE:
798 case INTEGER_TYPE:
799 case BOOLEAN_TYPE:
800 case REAL_TYPE:
801 case RECORD_TYPE:
802 case TEMPLATE_TYPE_PARM:
803 case TEMPLATE_TEMPLATE_PARM:
804 case BOUND_TEMPLATE_TEMPLATE_PARM:
805 case TREE_LIST:
806 case TYPE_DECL:
807 case TREE_VEC:
808 case UNION_TYPE:
809 case LANG_TYPE:
810 case VOID_TYPE:
811 case TYPENAME_TYPE:
812 case COMPLEX_TYPE:
813 case VECTOR_TYPE:
814 case TYPEOF_TYPE:
815 case UNDERLYING_TYPE:
816 case DECLTYPE_TYPE:
817 case TYPE_PACK_EXPANSION:
818 case FIXED_POINT_TYPE:
819 case NULLPTR_TYPE:
820 dump_type (pp, t, flags);
821 pp->padding = pp_before;
822 break;
824 default:
825 pp_unsupported_tree (pp, t);
826 /* fall through. */
827 case ERROR_MARK:
828 pp_string (pp, M_("<typeprefixerror>"));
829 break;
833 /* Dump the suffix of type T, under control of FLAGS. This is the part
834 which appears after the identifier (or function parms). */
836 static void
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))
844 case POINTER_TYPE:
845 case REFERENCE_TYPE:
846 case OFFSET_TYPE:
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);
853 break;
855 case FUNCTION_TYPE:
856 case METHOD_TYPE:
858 tree arg;
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);
877 break;
880 case ARRAY_TYPE:
881 pp_maybe_space (pp);
882 pp_cxx_left_bracket (pp);
883 if (TYPE_DOMAIN (t))
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);
891 else
893 STRIP_NOPS (max);
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);
903 else
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);
912 break;
914 case ENUMERAL_TYPE:
915 case IDENTIFIER_NODE:
916 case INTEGER_TYPE:
917 case BOOLEAN_TYPE:
918 case REAL_TYPE:
919 case RECORD_TYPE:
920 case TEMPLATE_TYPE_PARM:
921 case TEMPLATE_TEMPLATE_PARM:
922 case BOUND_TEMPLATE_TEMPLATE_PARM:
923 case TREE_LIST:
924 case TYPE_DECL:
925 case TREE_VEC:
926 case UNION_TYPE:
927 case LANG_TYPE:
928 case VOID_TYPE:
929 case TYPENAME_TYPE:
930 case COMPLEX_TYPE:
931 case VECTOR_TYPE:
932 case TYPEOF_TYPE:
933 case UNDERLYING_TYPE:
934 case DECLTYPE_TYPE:
935 case TYPE_PACK_EXPANSION:
936 case FIXED_POINT_TYPE:
937 case NULLPTR_TYPE:
938 break;
940 default:
941 pp_unsupported_tree (pp, t);
942 case ERROR_MARK:
943 /* Don't mark it here, we should have already done in
944 dump_type_prefix. */
945 break;
949 static void
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)");
958 else
959 gcc_unreachable ();
961 pp_printf (pp, p, LOCATION_FILE (input_location));
964 static void
965 dump_simple_decl (cxx_pretty_printer *pp, tree t, tree type, int flags)
967 if (flags & TFF_DECL_SPECIFIERS)
969 if (VAR_P (t)
970 && DECL_DECLARED_CONSTEXPR_P (t))
971 pp_cxx_ws_string (pp, "constexpr");
972 dump_type_prefix (pp, type, flags & ~TFF_UNQUALIFIED_NAME);
973 pp_maybe_space (pp);
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, "...");
985 if (DECL_NAME (t))
987 if (TREE_CODE (t) == FIELD_DECL && DECL_NORMAL_CAPTURE_P (t))
989 pp_less (pp);
990 pp_string (pp, IDENTIFIER_POINTER (DECL_NAME (t)) + 2);
991 pp_string (pp, " capture>");
993 else
994 dump_decl (pp, DECL_NAME (t), flags);
996 else
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. */
1004 static void
1005 dump_decl (cxx_pretty_printer *pp, tree t, int flags)
1007 if (t == NULL_TREE)
1008 return;
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);
1015 if (demangled)
1017 pp_string (pp, demangled);
1018 return;
1022 switch (TREE_CODE (t))
1024 case TYPE_DECL:
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);
1040 break;
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);
1052 break;
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),
1059 flags);
1060 break;
1062 case VAR_DECL:
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);
1068 break;
1070 /* Else fall through. */
1071 case FIELD_DECL:
1072 case PARM_DECL:
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);
1086 break;
1088 case RESULT_DECL:
1089 pp_string (pp, M_("<return value> "));
1090 dump_simple_decl (pp, t, TREE_TYPE (t), flags);
1091 break;
1093 case NAMESPACE_DECL:
1094 if (flags & TFF_DECL_SPECIFIERS)
1095 pp->declaration (t);
1096 else
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}"));
1105 else
1106 pp_cxx_ws_string (pp, M_("(anonymous namespace)"));
1108 else
1109 pp_cxx_tree_identifier (pp, DECL_NAME (t));
1111 break;
1113 case SCOPE_REF:
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);
1117 break;
1119 case ARRAY_REF:
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);
1124 break;
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);
1130 pp_colon (pp);
1131 dump_decl (pp, ARRAY_NOTATION_LENGTH (t), flags | TFF_EXPR_IN_PARENS);
1132 pp_colon (pp);
1133 dump_decl (pp, ARRAY_NOTATION_STRIDE (t), flags | TFF_EXPR_IN_PARENS);
1134 pp_cxx_right_bracket (pp);
1135 break;
1137 /* So that we can do dump_decl on an aggr type. */
1138 case RECORD_TYPE:
1139 case UNION_TYPE:
1140 case ENUMERAL_TYPE:
1141 dump_type (pp, t, flags);
1142 break;
1144 case BIT_NOT_EXPR:
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);
1149 break;
1151 case TYPE_EXPR:
1152 gcc_unreachable ();
1153 break;
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);
1163 break;
1165 else
1166 pp_cxx_tree_identifier (pp, t);
1167 break;
1169 case OVERLOAD:
1170 if (OVL_CHAIN (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);
1184 break;
1187 /* If there's only one function, just treat it like an ordinary
1188 FUNCTION_DECL. */
1189 t = OVL_CURRENT (t);
1190 /* Fall through. */
1192 case FUNCTION_DECL:
1193 if (! DECL_LANG_SPECIFIC (t))
1195 if (DECL_ABSTRACT_ORIGIN (t))
1196 dump_decl (pp, DECL_ABSTRACT_ORIGIN (t), flags);
1197 else
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);
1202 else
1203 dump_function_decl (pp, t, flags);
1204 break;
1206 case TEMPLATE_DECL:
1207 dump_template_decl (pp, t, flags);
1208 break;
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);
1217 if (DECL_P (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>"));
1223 else if (args)
1224 dump_template_argument_list (pp, args, flags);
1225 pp_cxx_end_template_argument_list (pp);
1227 break;
1229 case LABEL_DECL:
1230 pp_cxx_tree_identifier (pp, DECL_NAME (t));
1231 break;
1233 case CONST_DECL:
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);
1242 else
1243 pp_string (pp, M_("<enumerator>"));
1244 break;
1246 case USING_DECL:
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);
1251 break;
1253 case STATIC_ASSERT:
1254 pp->declaration (t);
1255 break;
1257 case BASELINK:
1258 dump_decl (pp, BASELINK_FUNCTIONS (t), flags);
1259 break;
1261 case NON_DEPENDENT_EXPR:
1262 dump_expr (pp, t, flags);
1263 break;
1265 case TEMPLATE_TYPE_PARM:
1266 if (flags & TFF_DECL_SPECIFIERS)
1267 pp->declaration (t);
1268 else
1269 pp->type_id (t);
1270 break;
1272 case UNBOUND_CLASS_TEMPLATE:
1273 case TYPE_PACK_EXPANSION:
1274 case TREE_BINFO:
1275 dump_type (pp, t, flags);
1276 break;
1278 default:
1279 pp_unsupported_tree (pp, t);
1280 /* Fall through to error. */
1282 case ERROR_MARK:
1283 pp_string (pp, M_("<declaration error>"));
1284 break;
1288 /* Dump a template declaration T under control of FLAGS. This means the
1289 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1291 static void
1292 dump_template_decl (cxx_pretty_printer *pp, tree t, int flags)
1294 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1295 tree parms;
1296 int i;
1298 if (flags & TFF_TEMPLATE_HEADER)
1300 for (parms = orig_parms = nreverse (orig_parms);
1301 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++)
1316 if (i)
1317 pp_separate_with_comma (pp);
1318 dump_template_parameter (pp, TREE_VEC_ELT (inner_parms, i),
1319 flags);
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);
1346 else
1348 gcc_assert (TREE_TYPE (t));
1349 switch (NEXT_CODE (t))
1351 case METHOD_TYPE:
1352 case FUNCTION_TYPE:
1353 dump_function_decl (pp, t, flags | TFF_TEMPLATE_NAME);
1354 break;
1355 default:
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
1367 it finds. */
1369 struct find_typenames_t
1371 hash_set<tree> *p_set;
1372 vec<tree, va_gc> *typenames;
1375 static tree
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;
1394 return NULL_TREE;
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
1401 doesn't do. */
1402 if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp))
1403 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r,
1404 data, d->p_set);
1406 return NULL_TREE;
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);
1417 delete 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
1424 instantiation. */
1426 static void
1427 dump_substitution (cxx_pretty_printer *pp,
1428 tree t, tree template_parms, tree template_args,
1429 int flags)
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. */
1447 static void
1448 dump_lambda_function (cxx_pretty_printer *pp,
1449 tree fn, tree template_parms, tree template_args,
1450 int flags)
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. */
1467 static void
1468 dump_function_decl (cxx_pretty_printer *pp, tree t, int flags)
1470 tree fntype;
1471 tree parmtypes;
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);
1477 tree exceptions;
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)
1491 tree tmpl;
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);
1498 t = 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? */
1526 if (show_return)
1527 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1528 && !DECL_DESTRUCTOR_P (t);
1529 if (show_return)
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)
1537 /* Nothing. */;
1538 else if (cname)
1540 dump_type (pp, cname, flags);
1541 pp_cxx_colon_colon (pp);
1543 else
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);
1565 if (show_return)
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;
1573 int i;
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);
1579 if (need_comma)
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);
1586 need_comma = true;
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. */
1596 static void
1597 dump_parameters (cxx_pretty_printer *pp, tree parmtypes, int flags)
1599 int first = 1;
1600 flags &= ~TFF_SCOPE;
1601 pp_cxx_left_paren (pp);
1603 for (first = 1; parmtypes != void_list_node;
1604 parmtypes = TREE_CHAIN (parmtypes))
1606 if (!first)
1607 pp_separate_with_comma (pp);
1608 first = 0;
1609 if (!parmtypes)
1611 pp_cxx_ws_string (pp, "...");
1612 break;
1615 dump_type (pp, TREE_VALUE (parmtypes), flags);
1617 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1619 pp_cxx_whitespace (pp);
1620 pp_equal (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. */
1631 static void
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, "&&");
1639 else
1640 pp_cxx_ws_string (pp, "&");
1644 /* Print an exception specification. T is the exception specification. */
1646 static void
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>");
1658 else
1659 dump_expr (pp, TREE_PURPOSE (t), flags);
1660 pp_cxx_right_paren (pp);
1663 else if (t)
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)
1669 while (1)
1671 dump_type (pp, TREE_VALUE (t), flags);
1672 t = TREE_CHAIN (t);
1673 if (!t)
1674 break;
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. */
1684 static void
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
1693 literal name. */
1694 if (!DECL_LANG_SPECIFIC (t))
1696 pp_cxx_tree_identifier (pp, name);
1697 return;
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>");
1711 else
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);
1735 else
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),
1743 flags);
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
1750 decoration. */
1752 static void
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)
1759 return;
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)
1767 int len, ix;
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. */
1778 if (ix
1779 && (!ARGUMENT_PACK_P (arg)
1780 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1781 pp_separate_with_comma (pp);
1783 if (!arg)
1784 pp_string (pp, M_("<template parameter error>"));
1785 else
1786 dump_template_argument (pp, arg, flags);
1789 else if (primary)
1791 tree tpl = TI_TEMPLATE (info);
1792 tree parms = DECL_TEMPLATE_PARMS (tpl);
1793 int len, ix;
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++)
1800 tree parm;
1802 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1804 pp_string (pp, M_("<template parameter error>"));
1805 continue;
1808 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1810 if (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. */
1822 static void
1823 dump_call_expr_args (cxx_pretty_printer *pp, tree t, int flags, bool skipfirst)
1825 tree arg;
1826 call_expr_arg_iterator iter;
1828 pp_cxx_left_paren (pp);
1829 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1831 if (skipfirst)
1832 skipfirst = false;
1833 else
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
1845 true. */
1847 static void
1848 dump_aggr_init_expr_args (cxx_pretty_printer *pp, tree t, int flags,
1849 bool skipfirst)
1851 tree arg;
1852 aggr_init_expr_arg_iterator iter;
1854 pp_cxx_left_paren (pp);
1855 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1857 if (skipfirst)
1858 skipfirst = false;
1859 else
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). */
1871 static void
1872 dump_expr_list (cxx_pretty_printer *pp, tree l, int flags)
1874 while (l)
1876 dump_expr (pp, TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1877 l = TREE_CHAIN (l);
1878 if (l)
1879 pp_separate_with_comma (pp);
1883 /* Print out a vector of initializers (subr of dump_expr). */
1885 static void
1886 dump_expr_init_vec (cxx_pretty_printer *pp, vec<constructor_elt, va_gc> *v,
1887 int flags)
1889 unsigned HOST_WIDE_INT idx;
1890 tree value;
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. */
1906 static tree
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)));
1912 while (index)
1914 fun = TREE_CHAIN (fun);
1915 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1916 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1919 return BV_FN (fun);
1922 /* Print out an expression E under control of FLAGS. */
1924 static void
1925 dump_expr (cxx_pretty_printer *pp, tree t, int flags)
1927 tree op;
1929 if (t == 0)
1930 return;
1932 if (STATEMENT_CLASS_P (t))
1934 pp_cxx_ws_string (pp, M_("<statement>"));
1935 return;
1938 switch (TREE_CODE (t))
1940 case VAR_DECL:
1941 case PARM_DECL:
1942 case FIELD_DECL:
1943 case CONST_DECL:
1944 case FUNCTION_DECL:
1945 case TEMPLATE_DECL:
1946 case NAMESPACE_DECL:
1947 case LABEL_DECL:
1948 case OVERLOAD:
1949 case TYPE_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));
1954 break;
1956 case SSA_NAME:
1957 if (SSA_NAME_VAR (t)
1958 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t)))
1959 dump_expr (pp, SSA_NAME_VAR (t), flags);
1960 else
1961 pp_cxx_ws_string (pp, M_("<unknown>"));
1962 break;
1964 case VOID_CST:
1965 case INTEGER_CST:
1966 case REAL_CST:
1967 case STRING_CST:
1968 case COMPLEX_CST:
1969 pp->constant (t);
1970 break;
1972 case USERDEF_LITERAL:
1973 pp_cxx_userdef_literal (pp, t);
1974 break;
1976 case THROW_EXPR:
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>"));
1980 break;
1982 case PTRMEM_CST:
1983 pp_ampersand (pp);
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)));
1987 break;
1989 case COMPOUND_EXPR:
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);
1995 break;
1997 case COND_EXPR:
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);
2005 break;
2007 case SAVE_EXPR:
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);
2014 else
2015 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2016 break;
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);
2029 else
2030 dump_decl (pp, fn, 0);
2032 else
2033 dump_expr (pp, AGGR_INIT_EXPR_FN (t), 0);
2035 dump_aggr_init_expr_args (pp, t, flags, true);
2036 break;
2038 case CALL_EXPR:
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);
2048 break;
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);
2067 pp_cxx_dot (pp);
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);
2073 pp_cxx_arrow (pp);
2075 skipfirst = true;
2077 if (flag_sanitize & SANITIZE_UNDEFINED
2078 && is_ubsan_builtin_p (fn))
2080 pp_string (cxx_pp, M_("<ubsan routine call>"));
2081 break;
2083 dump_expr (pp, fn, flags | TFF_EXPR_IN_PARENS);
2084 dump_call_expr_args (pp, t, flags, skipfirst);
2086 break;
2088 case TARGET_EXPR:
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);
2096 break;
2098 case POINTER_PLUS_EXPR:
2099 dump_binary_op (pp, "+", t, flags);
2100 break;
2102 case INIT_EXPR:
2103 case MODIFY_EXPR:
2104 dump_binary_op (pp, assignment_operator_name_info[NOP_EXPR].name,
2105 t, flags);
2106 break;
2108 case PLUS_EXPR:
2109 case MINUS_EXPR:
2110 case MULT_EXPR:
2111 case TRUNC_DIV_EXPR:
2112 case TRUNC_MOD_EXPR:
2113 case MIN_EXPR:
2114 case MAX_EXPR:
2115 case LSHIFT_EXPR:
2116 case RSHIFT_EXPR:
2117 case BIT_IOR_EXPR:
2118 case BIT_XOR_EXPR:
2119 case BIT_AND_EXPR:
2120 case TRUTH_ANDIF_EXPR:
2121 case TRUTH_ORIF_EXPR:
2122 case LT_EXPR:
2123 case LE_EXPR:
2124 case GT_EXPR:
2125 case GE_EXPR:
2126 case EQ_EXPR:
2127 case NE_EXPR:
2128 case EXACT_DIV_EXPR:
2129 dump_binary_op (pp, operator_name_info[TREE_CODE (t)].name, t, flags);
2130 break;
2132 case CEIL_DIV_EXPR:
2133 case FLOOR_DIV_EXPR:
2134 case ROUND_DIV_EXPR:
2135 case RDIV_EXPR:
2136 dump_binary_op (pp, "/", t, flags);
2137 break;
2139 case CEIL_MOD_EXPR:
2140 case FLOOR_MOD_EXPR:
2141 case ROUND_MOD_EXPR:
2142 dump_binary_op (pp, "%", t, flags);
2143 break;
2145 case COMPONENT_REF:
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
2152 || (DECL_NAME (ob)
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)
2157 pp_cxx_dot (pp);
2158 else
2159 pp_cxx_arrow (pp);
2162 else
2164 dump_expr (pp, ob, flags | TFF_EXPR_IN_PARENS);
2165 pp_cxx_dot (pp);
2167 dump_expr (pp, TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
2169 break;
2171 case ARRAY_REF:
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);
2176 break;
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);
2182 pp_colon (pp);
2183 dump_expr (pp, ARRAY_NOTATION_LENGTH (t), flags | TFF_EXPR_IN_PARENS);
2184 pp_colon (pp);
2185 dump_expr (pp, ARRAY_NOTATION_STRIDE (t), flags | TFF_EXPR_IN_PARENS);
2186 pp_cxx_right_bracket (pp);
2187 break;
2189 case UNARY_PLUS_EXPR:
2190 dump_unary_op (pp, "+", t, flags);
2191 break;
2193 case ADDR_EXPR:
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. */
2199 || (TREE_TYPE (t)
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);
2204 else
2205 dump_unary_op (pp, "&", t, flags);
2206 break;
2208 case INDIRECT_REF:
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);
2216 else
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);
2222 else
2223 dump_unary_op (pp, "*", t, flags);
2225 break;
2227 case MEM_REF:
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);
2231 else
2233 pp_cxx_star (pp);
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)),
2250 flags);
2251 pp_cxx_right_paren (pp);
2254 break;
2256 case NEGATE_EXPR:
2257 case BIT_NOT_EXPR:
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);
2262 break;
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);
2270 break;
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
2275 this. */
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);
2287 pp_cxx_star (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);
2291 break;
2293 /* Else fall through. */
2295 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2296 break;
2298 CASE_CONVERT:
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),
2310 TREE_TYPE (ttype)))
2312 if (TREE_CODE (ttype) == REFERENCE_TYPE)
2314 STRIP_NOPS (op);
2315 if (TREE_CODE (op) == ADDR_EXPR)
2316 dump_expr (pp, TREE_OPERAND (op, 0), flags);
2317 else
2318 dump_unary_op (pp, "*", t, flags);
2320 else
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);
2336 else
2337 dump_expr (pp, op, flags);
2338 break;
2341 case CONSTRUCTOR:
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);
2355 break;
2357 else if (tree_fits_shwi_p (idx))
2359 tree virtuals;
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
2369 member. */
2370 --n;
2372 while (n > 0 && virtuals)
2374 --n;
2375 virtuals = TREE_CHAIN (virtuals);
2377 if (virtuals)
2379 dump_expr (pp, BV_FN (virtuals),
2380 flags | TFF_EXPR_IN_PARENS);
2381 break;
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);
2393 else
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);
2402 break;
2404 case OFFSET_REF:
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)
2411 /* A::f */
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);
2416 else
2417 dump_decl (pp, t, flags);
2419 else
2421 if (INDIRECT_REF_P (ob))
2423 dump_expr (pp, TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
2424 pp_cxx_arrow (pp);
2425 pp_cxx_star (pp);
2427 else
2429 dump_expr (pp, ob, flags | TFF_EXPR_IN_PARENS);
2430 pp_cxx_dot (pp);
2431 pp_cxx_star (pp);
2433 dump_expr (pp, TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2435 break;
2438 case TEMPLATE_PARM_INDEX:
2439 dump_decl (pp, TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
2440 break;
2442 case CAST_EXPR:
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);
2451 else
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);
2460 break;
2462 case STATIC_CAST_EXPR:
2463 pp_cxx_ws_string (pp, "static_cast");
2464 goto cast;
2465 case REINTERPRET_CAST_EXPR:
2466 pp_cxx_ws_string (pp, "reinterpret_cast");
2467 goto cast;
2468 case CONST_CAST_EXPR:
2469 pp_cxx_ws_string (pp, "const_cast");
2470 goto cast;
2471 case DYNAMIC_CAST_EXPR:
2472 pp_cxx_ws_string (pp, "dynamic_cast");
2473 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);
2480 break;
2482 case ARROW_EXPR:
2483 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2484 pp_cxx_arrow (pp);
2485 break;
2487 case SIZEOF_EXPR:
2488 case ALIGNOF_EXPR:
2489 if (TREE_CODE (t) == SIZEOF_EXPR)
2490 pp_cxx_ws_string (pp, "sizeof");
2491 else
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);
2508 else
2509 dump_expr (pp, op, flags);
2510 pp_cxx_right_paren (pp);
2511 break;
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);
2519 break;
2521 case NOEXCEPT_EXPR:
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);
2527 break;
2529 case REALPART_EXPR:
2530 case IMAGPART_EXPR:
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);
2534 break;
2536 case DEFAULT_ARG:
2537 pp_string (pp, M_("<unparsed>"));
2538 break;
2540 case TRY_CATCH_EXPR:
2541 case WITH_CLEANUP_EXPR:
2542 case CLEANUP_POINT_EXPR:
2543 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2544 break;
2546 case PSEUDO_DTOR_EXPR:
2547 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2548 pp_cxx_dot (pp);
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);
2556 break;
2558 case TEMPLATE_ID_EXPR:
2559 dump_decl (pp, t, flags);
2560 break;
2562 case BIND_EXPR:
2563 case STMT_EXPR:
2564 case EXPR_STMT:
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, "({...})");
2569 break;
2571 case LOOP_EXPR:
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);
2575 break;
2577 case EXIT_EXPR:
2578 pp_string (pp, "if (");
2579 dump_expr (pp, TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2580 pp_string (pp, ") break; ");
2581 break;
2583 case BASELINK:
2584 dump_expr (pp, BASELINK_FUNCTIONS (t), flags & ~TFF_EXPR_IN_PARENS);
2585 break;
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);
2591 break;
2593 case NON_DEPENDENT_EXPR:
2594 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2595 break;
2597 case ARGUMENT_PACK_SELECT:
2598 dump_template_argument (pp, ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2599 break;
2601 case RECORD_TYPE:
2602 case UNION_TYPE:
2603 case ENUMERAL_TYPE:
2604 case REAL_TYPE:
2605 case VOID_TYPE:
2606 case BOOLEAN_TYPE:
2607 case INTEGER_TYPE:
2608 case COMPLEX_TYPE:
2609 case VECTOR_TYPE:
2610 pp_type_specifier_seq (pp, t);
2611 break;
2613 case TYPENAME_TYPE:
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);
2617 break;
2619 case TEMPLATE_TYPE_PARM:
2620 case TEMPLATE_TEMPLATE_PARM:
2621 case BOUND_TEMPLATE_TEMPLATE_PARM:
2622 dump_type (pp, t, flags);
2623 break;
2625 case TRAIT_EXPR:
2626 pp_cxx_trait_expression (pp, t);
2627 break;
2629 case VA_ARG_EXPR:
2630 pp_cxx_va_arg_expression (pp, t);
2631 break;
2633 case OFFSETOF_EXPR:
2634 pp_cxx_offsetof_expression (pp, t);
2635 break;
2637 case SCOPE_REF:
2638 dump_decl (pp, t, flags);
2639 break;
2641 case EXPR_PACK_EXPANSION:
2642 case TYPEID_EXPR:
2643 case MEMBER_REF:
2644 case DOTSTAR_EXPR:
2645 case NEW_EXPR:
2646 case VEC_NEW_EXPR:
2647 case DELETE_EXPR:
2648 case VEC_DELETE_EXPR:
2649 case MODOP_EXPR:
2650 case ABS_EXPR:
2651 case CONJ_EXPR:
2652 case VECTOR_CST:
2653 case FIXED_CST:
2654 case UNORDERED_EXPR:
2655 case ORDERED_EXPR:
2656 case UNLT_EXPR:
2657 case UNLE_EXPR:
2658 case UNGT_EXPR:
2659 case UNGE_EXPR:
2660 case UNEQ_EXPR:
2661 case LTGT_EXPR:
2662 case COMPLEX_EXPR:
2663 case BIT_FIELD_REF:
2664 case FIX_TRUNC_EXPR:
2665 case FLOAT_EXPR:
2666 pp->expression (t);
2667 break;
2669 case TRUTH_AND_EXPR:
2670 case TRUTH_OR_EXPR:
2671 case TRUTH_XOR_EXPR:
2672 if (flags & TFF_EXPR_IN_PARENS)
2673 pp_cxx_left_paren (pp);
2674 pp->expression (t);
2675 if (flags & TFF_EXPR_IN_PARENS)
2676 pp_cxx_right_paren (pp);
2677 break;
2679 case OBJ_TYPE_REF:
2680 dump_expr (pp, resolve_virtual_fun_from_obj_type_ref (t), flags);
2681 break;
2683 case LAMBDA_EXPR:
2684 pp_string (pp, M_("<lambda>"));
2685 break;
2687 case PAREN_EXPR:
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);
2691 break;
2693 case PLACEHOLDER_EXPR:
2694 pp_string (pp, M_("*this"));
2695 break;
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. */
2700 default:
2701 pp_unsupported_tree (pp, t);
2702 /* fall through to ERROR_MARK... */
2703 case ERROR_MARK:
2704 pp_string (pp, M_("<expression error>"));
2705 break;
2709 static void
2710 dump_binary_op (cxx_pretty_printer *pp, const char *opstring, tree t,
2711 int flags)
2713 pp_cxx_left_paren (pp);
2714 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2715 pp_cxx_whitespace (pp);
2716 if (opstring)
2717 pp_cxx_ws_string (pp, opstring);
2718 else
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);
2725 static void
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);
2736 static void
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. */
2749 inline const char *
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_*
2756 control. */
2758 const char *
2759 type_as_string (tree typ, int flags)
2761 reinit_cxx_pp ();
2762 pp_translate_identifiers (cxx_pp) = false;
2763 dump_type (cxx_pp, typ, flags);
2764 return pp_ggc_formatted_text (cxx_pp);
2767 const char *
2768 type_as_string_translate (tree typ, int flags)
2770 reinit_cxx_pp ();
2771 dump_type (cxx_pp, typ, flags);
2772 return pp_ggc_formatted_text (cxx_pp);
2775 const char *
2776 expr_as_string (tree decl, int flags)
2778 reinit_cxx_pp ();
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. */
2786 const char *
2787 decl_as_dwarf_string (tree decl, int flags)
2789 const char *name;
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;
2796 return name;
2799 const char *
2800 decl_as_string (tree decl, int flags)
2802 reinit_cxx_pp ();
2803 pp_translate_identifiers (cxx_pp) = false;
2804 dump_decl (cxx_pp, decl, flags);
2805 return pp_ggc_formatted_text (cxx_pp);
2808 const char *
2809 decl_as_string_translate (tree decl, int flags)
2811 reinit_cxx_pp ();
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. */
2818 const char *
2819 lang_decl_dwarf_name (tree decl, int v, bool translate)
2821 const char *name;
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;
2828 return name;
2831 /* Generate the three forms of printable names for cxx_printable_name. */
2833 const char *
2834 lang_decl_name (tree decl, int v, bool translate)
2836 if (v >= 2)
2837 return (translate
2838 ? decl_as_string_translate (decl, TFF_DECL_SPECIFIERS)
2839 : decl_as_string (decl, TFF_DECL_SPECIFIERS));
2841 reinit_cxx_pp ();
2842 pp_translate_identifiers (cxx_pp) = translate;
2843 if (v == 1
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);
2857 else
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. */
2865 location_t
2866 location_of (tree t)
2868 if (TYPE_P (t))
2870 t = TYPE_MAIN_DECL (t);
2871 if (t == NULL_TREE)
2872 return input_location;
2874 else if (TREE_CODE (t) == OVERLOAD)
2875 t = OVL_FUNCTION (t);
2877 if (DECL_P (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_
2884 function. */
2886 static const char *
2887 decl_to_string (tree decl, int verbose)
2889 int flags = 0;
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;
2894 if (verbose)
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;
2900 reinit_cxx_pp ();
2901 dump_decl (cxx_pp, decl, flags);
2902 return pp_ggc_formatted_text (cxx_pp);
2905 static const char *
2906 expr_to_string (tree decl)
2908 reinit_cxx_pp ();
2909 dump_expr (cxx_pp, decl, 0);
2910 return pp_ggc_formatted_text (cxx_pp);
2913 static const char *
2914 fndecl_to_string (tree fndecl, int verbose)
2916 int flags;
2918 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2919 | TFF_TEMPLATE_HEADER;
2920 if (verbose)
2921 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2922 reinit_cxx_pp ();
2923 dump_decl (cxx_pp, fndecl, flags);
2924 return pp_ggc_formatted_text (cxx_pp);
2928 static const char *
2929 code_to_string (enum tree_code c)
2931 return get_tree_code_name (c);
2934 const char *
2935 language_to_string (enum languages c)
2937 switch (c)
2939 case lang_c:
2940 return "C";
2942 case lang_cplusplus:
2943 return "C++";
2945 case lang_java:
2946 return "Java";
2948 default:
2949 gcc_unreachable ();
2951 return NULL;
2954 /* Return the proper printed version of a parameter to a C++ function. */
2956 static const char *
2957 parm_to_string (int p)
2959 reinit_cxx_pp ();
2960 if (p < 0)
2961 pp_string (cxx_pp, "'this'");
2962 else
2963 pp_decimal_int (cxx_pp, p + 1);
2964 return pp_ggc_formatted_text (cxx_pp);
2967 static const char *
2968 op_to_string (enum tree_code p)
2970 tree id = operator_name_info[p].identifier;
2971 return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
2974 static const char *
2975 type_to_string (tree typ, int verbose)
2977 int flags = 0;
2978 if (verbose)
2979 flags |= TFF_CLASS_KEY_OR_ENUM;
2980 flags |= TFF_TEMPLATE_HEADER;
2982 reinit_cxx_pp ();
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)
3006 p[len] = '\0';
3008 return pp_ggc_formatted_text (cxx_pp);
3011 static const char *
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}");
3018 static const char *
3019 args_to_string (tree p, int verbose)
3021 int flags = 0;
3022 if (verbose)
3023 flags |= TFF_CLASS_KEY_OR_ENUM;
3025 if (p == NULL_TREE)
3026 return "";
3028 if (TYPE_P (TREE_VALUE (p)))
3029 return type_as_string_translate (p, flags);
3031 reinit_cxx_pp ();
3032 for (; p; p = TREE_CHAIN (p))
3034 if (TREE_VALUE (p) == null_node)
3035 pp_cxx_ws_string (cxx_pp, "NULL");
3036 else
3037 dump_type (cxx_pp, error_type (TREE_VALUE (p)), flags);
3038 if (TREE_CHAIN (p))
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
3046 arguments. */
3048 static const char *
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);
3057 if (p == NULL_TREE)
3058 return "";
3060 reinit_cxx_pp ();
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);
3066 static const char *
3067 cv_to_string (tree p, int v)
3069 reinit_cxx_pp ();
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);
3075 static const char *
3076 eh_spec_to_string (tree p, int /*v*/)
3078 int flags = 0;
3079 reinit_cxx_pp ();
3080 dump_exception_spec (cxx_pp, p, flags);
3081 return pp_ggc_formatted_text (cxx_pp);
3084 /* Langhook for print_error_function. */
3085 void
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);
3094 static void
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,
3103 diagnostic));
3106 /* Print current function onto BUFFER, in the process of reporting
3107 a diagnostic message. Called from cp_diagnostic_starter. */
3108 static void
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 ())
3115 return;
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:"));
3128 else
3130 tree fndecl, ao;
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);
3140 fndecl = ao;
3142 else
3143 fndecl = current_function_decl;
3145 pp_printf (context->printer, function_category (fndecl),
3146 cxx_printable_name_translate (fndecl, 2));
3148 while (abstract_origin)
3150 location_t *locus;
3151 tree block = abstract_origin;
3153 locus = &BLOCK_SOURCE_LOCATION (block);
3154 fndecl = NULL;
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)
3168 fndecl = ao;
3169 break;
3171 else if (TREE_CODE (ao) != BLOCK)
3172 break;
3174 block = BLOCK_SUPERCONTEXT (block);
3176 if (fndecl)
3177 abstract_origin = block;
3178 else
3180 while (block && TREE_CODE (block) == BLOCK)
3181 block = BLOCK_SUPERCONTEXT (block);
3183 if (block && TREE_CODE (block) == FUNCTION_DECL)
3184 fndecl = block;
3185 abstract_origin = NULL;
3187 if (fndecl)
3189 expanded_location s = expand_location (*locus);
3190 pp_character (context->printer, ',');
3191 pp_newline (context->printer);
3192 if (s.file != NULL)
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);
3199 else
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);
3206 else
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". */
3223 static const char *
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");
3242 else
3243 return _("In member function %qs");
3245 else
3246 return _("In function %qs");
3249 /* Report the full context of a current template instantiation,
3250 onto BUFFER. */
3251 static void
3252 print_instantiation_full_context (diagnostic_context *context)
3254 struct tinst_level *p = current_instantiation ();
3255 location_t location = input_location;
3257 if (p)
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),
3264 p->decl);
3266 location = p->locus;
3267 p = p->next;
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. */
3276 static void
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)
3282 return;
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);
3289 else
3290 pp_verbatim (context->printer, _("%r%s:%d:%R "),
3291 "locus", xloc.file, xloc.line);
3293 if (t != NULL)
3295 if (TREE_CODE (t->decl) == TREE_LIST)
3296 pp_verbatim (context->printer,
3297 recursive_p
3298 ? _("recursively required by substitution of %qS\n")
3299 : _("required by substitution of %qS\n"),
3300 t->decl);
3301 else
3302 pp_verbatim (context->printer,
3303 recursive_p
3304 ? _("recursively required from %q#D\n")
3305 : _("required from %q#D\n"),
3306 t->decl);
3308 else
3310 pp_verbatim (context->printer,
3311 recursive_p
3312 ? _("recursively required from here")
3313 : _("required from here"));
3317 /* Same as print_instantiation_full_context but less verbose. */
3319 static void
3320 print_instantiation_partial_context (diagnostic_context *context,
3321 struct tinst_level *t0, location_t loc)
3323 struct tinst_level *t;
3324 int n_total = 0;
3325 int n;
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;
3332 n_total++;
3335 t = t0;
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. */
3344 if (skip == 1)
3346 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);
3356 loc = t->locus;
3357 t = t->next;
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 "
3367 "disable ]\n"),
3368 "locus", xloc.file, xloc.line, xloc.column, skip);
3369 else
3370 pp_verbatim (context->printer,
3371 _("%r%s:%d:%R [ skipping %d instantiation "
3372 "contexts, use -ftemplate-backtrace-limit=0 to "
3373 "disable ]\n"),
3374 "locus", xloc.file, xloc.line, skip);
3376 do {
3377 loc = t->locus;
3378 t = t->next;
3379 } while (t != NULL && --skip > 0);
3383 while (t != NULL)
3385 while (t->next != NULL && t->locus == t->next->locus)
3387 loc = t->locus;
3388 t = t->next;
3390 print_instantiation_partial_context_line (context, t, loc,
3391 t->locus == loc);
3392 loc = t->locus;
3393 t = t->next;
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. */
3401 static void
3402 maybe_print_instantiation_context (diagnostic_context *context)
3404 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3405 return;
3407 record_last_problematic_instantiation ();
3408 print_instantiation_full_context (context);
3411 /* Report what constexpr call(s) we're trying to expand, if any. */
3413 void
3414 maybe_print_constexpr_context (diagnostic_context *context)
3416 vec<tree> call_stack = cx_error_context ();
3417 unsigned ix;
3418 tree t;
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);
3428 else
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.
3439 %C tree code.
3440 %D declaration.
3441 %E expression.
3442 %F function declaration.
3443 %L language as used in extern "lang".
3444 %O binary operator.
3445 %P function parameter whose position is indicated by an integer.
3446 %Q assignment operator.
3447 %S substitution (template + args)
3448 %T type.
3449 %V cv-qualifier.
3450 %X exception-specification. */
3451 static bool
3452 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
3453 int precision, bool wide, bool set_locus, bool verbose)
3455 const char *result;
3456 tree t = NULL;
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)
3463 return false;
3465 if (text->locus == NULL)
3466 set_locus = false;
3468 switch (*spec)
3470 case 'A': result = args_to_string (next_tree, verbose); break;
3471 case 'C': result = code_to_string (next_tcode); break;
3472 case 'D':
3474 tree temp = next_tree;
3475 if (VAR_P (temp)
3476 && DECL_HAS_DEBUG_EXPR_P (temp))
3478 temp = DECL_DEBUG_EXPR (temp);
3479 if (!DECL_P (temp))
3481 result = expr_to_string (temp);
3482 break;
3485 result = decl_to_string (temp, verbose);
3487 break;
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;
3499 case 'K':
3500 percent_K_format (text);
3501 return true;
3503 default:
3504 return false;
3507 pp_string (pp, result);
3508 if (set_locus && t != NULL)
3509 *text->locus = location_of (t);
3510 return true;
3511 #undef next_tree
3512 #undef next_tcode
3513 #undef next_lang
3514 #undef next_int
3517 /* Warn about the use of C++0x features when appropriate. */
3518 void
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
3524 in C++0x mode. */
3525 switch (str)
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");
3531 break;
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");
3536 break;
3537 case CPP0X_VARIADIC_TEMPLATES:
3538 pedwarn (input_location, 0,
3539 "variadic templates "
3540 "only available with -std=c++11 or -std=gnu++11");
3541 break;
3542 case CPP0X_LAMBDA_EXPR:
3543 pedwarn (input_location, 0,
3544 "lambda expressions "
3545 "only available with -std=c++11 or -std=gnu++11");
3546 break;
3547 case CPP0X_AUTO:
3548 pedwarn (input_location, 0,
3549 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3550 break;
3551 case CPP0X_SCOPED_ENUMS:
3552 pedwarn (input_location, 0,
3553 "scoped enums only available with -std=c++11 or -std=gnu++11");
3554 break;
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");
3559 break;
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");
3564 break;
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");
3569 break;
3570 case CPP0X_NSDMI:
3571 pedwarn (input_location, 0,
3572 "non-static data member initializers "
3573 "only available with -std=c++11 or -std=gnu++11");
3574 break;
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");
3579 break;
3580 case CPP0X_DELEGATING_CTORS:
3581 pedwarn (input_location, 0,
3582 "delegating constructors "
3583 "only available with -std=c++11 or -std=gnu++11");
3584 break;
3585 case CPP0X_INHERITING_CTORS:
3586 pedwarn (input_location, 0,
3587 "inheriting constructors "
3588 "only available with -std=c++11 or -std=gnu++11");
3589 break;
3590 case CPP0X_ATTRIBUTES:
3591 pedwarn (input_location, 0,
3592 "c++11 attributes "
3593 "only available with -std=c++11 or -std=gnu++11");
3594 break;
3595 case CPP0X_REF_QUALIFIER:
3596 pedwarn (input_location, 0,
3597 "ref-qualifiers "
3598 "only available with -std=c++11 or -std=gnu++11");
3599 break;
3600 default:
3601 gcc_unreachable ();
3605 /* Warn about the use of variadic templates when appropriate. */
3606 void
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
3616 C++0x. */
3617 bool
3618 pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...)
3620 diagnostic_info diagnostic;
3621 va_list ap;
3622 bool ret;
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);
3629 va_end (ap);
3630 return ret;
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. */
3637 void
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",
3647 scope);
3648 else if (TREE_CODE (decl) == TREE_LIST)
3650 error_at (location, "reference to %<%T::%D%> is ambiguous",
3651 scope, name);
3652 print_candidates (decl);
3654 else
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);
3662 else
3664 error_at (location, "%<::%D%> has not been declared", name);
3665 suggest_alternatives_for (location, name);