]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/cp/error.c
decl.c: Reorder #include's and remove duplicates.
[thirdparty/gcc.git] / gcc / cp / error.c
1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
5
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.
10
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.
15
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/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "tree.h"
25 #include "cp-tree.h"
26 #include "stringpool.h"
27 #include "alias.h"
28 #include "flags.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"
37
38 #include <new> // For placement-new.
39
40 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
41 #define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';')
42
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 actual_pretty_printer;
49 static cxx_pretty_printer * const cxx_pp = &actual_pretty_printer;
50
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))
54
55 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
56
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);
67
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 *);
106
107 static bool cp_printer (pretty_printer *, text_info *, const char *,
108 int, bool, bool, bool);
109
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. */
116
117 void
118 cxx_initialize_diagnostics (diagnostic_context *context)
119 {
120 pretty_printer *base = context->printer;
121 cxx_pretty_printer *pp = XNEW (cxx_pretty_printer);
122 context->printer = new (pp) cxx_pretty_printer ();
123
124 /* It is safe to free this object because it was previously XNEW()'d. */
125 base->~pretty_printer ();
126 XDELETE (base);
127
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;
132 }
133
134 /* Dump a scope, if deemed necessary. */
135
136 static void
137 dump_scope (cxx_pretty_printer *pp, tree scope, int flags)
138 {
139 int f = flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF);
140
141 if (scope == NULL_TREE)
142 return;
143
144 if (TREE_CODE (scope) == NAMESPACE_DECL)
145 {
146 if (scope != global_namespace)
147 {
148 dump_decl (pp, scope, f);
149 pp_cxx_colon_colon (pp);
150 }
151 }
152 else if (AGGREGATE_TYPE_P (scope))
153 {
154 dump_type (pp, scope, f);
155 pp_cxx_colon_colon (pp);
156 }
157 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
158 {
159 dump_function_decl (pp, scope, f);
160 pp_cxx_colon_colon (pp);
161 }
162 }
163
164 /* Dump the template ARGument under control of FLAGS. */
165
166 static void
167 dump_template_argument (cxx_pretty_printer *pp, tree arg, int flags)
168 {
169 if (ARGUMENT_PACK_P (arg))
170 dump_template_argument_list (pp, ARGUMENT_PACK_ARGS (arg),
171 /* No default args in argument packs. */
172 flags|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS);
173 else if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
174 dump_type (pp, arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
175 else
176 {
177 if (TREE_CODE (arg) == TREE_LIST)
178 arg = TREE_VALUE (arg);
179
180 dump_expr (pp, arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
181 }
182 }
183
184 /* Count the number of template arguments ARGS whose value does not
185 match the (optional) default template parameter in PARAMS */
186
187 static int
188 get_non_default_template_args_count (tree args, int flags)
189 {
190 int n = TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args));
191
192 if (/* We use this flag when generating debug information. We don't
193 want to expand templates at this point, for this may generate
194 new decls, which gets decl counts out of sync, which may in
195 turn cause codegen differences between compilations with and
196 without -g. */
197 (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0
198 || !flag_pretty_templates)
199 return n;
200
201 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args));
202 }
203
204 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
205 of FLAGS. */
206
207 static void
208 dump_template_argument_list (cxx_pretty_printer *pp, tree args, int flags)
209 {
210 int n = get_non_default_template_args_count (args, flags);
211 int need_comma = 0;
212 int i;
213
214 for (i = 0; i < n; ++i)
215 {
216 tree arg = TREE_VEC_ELT (args, i);
217
218 /* Only print a comma if we know there is an argument coming. In
219 the case of an empty template argument pack, no actual
220 argument will be printed. */
221 if (need_comma
222 && (!ARGUMENT_PACK_P (arg)
223 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
224 pp_separate_with_comma (pp);
225
226 dump_template_argument (pp, arg, flags);
227 need_comma = 1;
228 }
229 }
230
231 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
232
233 static void
234 dump_template_parameter (cxx_pretty_printer *pp, tree parm, int flags)
235 {
236 tree p;
237 tree a;
238
239 if (parm == error_mark_node)
240 return;
241
242 p = TREE_VALUE (parm);
243 a = TREE_PURPOSE (parm);
244
245 if (TREE_CODE (p) == TYPE_DECL)
246 {
247 if (flags & TFF_DECL_SPECIFIERS)
248 {
249 pp_cxx_ws_string (pp, "class");
250 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
251 pp_cxx_ws_string (pp, "...");
252 if (DECL_NAME (p))
253 pp_cxx_tree_identifier (pp, DECL_NAME (p));
254 }
255 else if (DECL_NAME (p))
256 pp_cxx_tree_identifier (pp, DECL_NAME (p));
257 else
258 pp_cxx_canonical_template_parameter (pp, TREE_TYPE (p));
259 }
260 else
261 dump_decl (pp, p, flags | TFF_DECL_SPECIFIERS);
262
263 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
264 {
265 pp_cxx_whitespace (pp);
266 pp_equal (pp);
267 pp_cxx_whitespace (pp);
268 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
269 dump_type (pp, a, flags & ~TFF_CHASE_TYPEDEF);
270 else
271 dump_expr (pp, a, flags | TFF_EXPR_IN_PARENS);
272 }
273 }
274
275 /* Dump, under control of FLAGS, a template-parameter-list binding.
276 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
277 TREE_VEC. */
278
279 static void
280 dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args,
281 vec<tree, va_gc> *typenames)
282 {
283 bool need_semicolon = false;
284 int i;
285 tree t;
286
287 while (parms)
288 {
289 tree p = TREE_VALUE (parms);
290 int lvl = TMPL_PARMS_DEPTH (parms);
291 int arg_idx = 0;
292 int i;
293 tree lvl_args = NULL_TREE;
294
295 /* Don't crash if we had an invalid argument list. */
296 if (TMPL_ARGS_DEPTH (args) >= lvl)
297 lvl_args = TMPL_ARGS_LEVEL (args, lvl);
298
299 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
300 {
301 tree arg = NULL_TREE;
302
303 /* Don't crash if we had an invalid argument list. */
304 if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx)
305 arg = TREE_VEC_ELT (lvl_args, arg_idx);
306
307 if (need_semicolon)
308 pp_separate_with_semicolon (pp);
309 dump_template_parameter (pp, TREE_VEC_ELT (p, i),
310 TFF_PLAIN_IDENTIFIER);
311 pp_cxx_whitespace (pp);
312 pp_equal (pp);
313 pp_cxx_whitespace (pp);
314 if (arg)
315 {
316 if (ARGUMENT_PACK_P (arg))
317 pp_cxx_left_brace (pp);
318 dump_template_argument (pp, arg, TFF_PLAIN_IDENTIFIER);
319 if (ARGUMENT_PACK_P (arg))
320 pp_cxx_right_brace (pp);
321 }
322 else
323 pp_string (pp, M_("<missing>"));
324
325 ++arg_idx;
326 need_semicolon = true;
327 }
328
329 parms = TREE_CHAIN (parms);
330 }
331
332 /* Don't bother with typenames for a partial instantiation. */
333 if (vec_safe_is_empty (typenames) || uses_template_parms (args))
334 return;
335
336 /* Don't try to print typenames when we're processing a clone. */
337 if (current_function_decl
338 && !DECL_LANG_SPECIFIC (current_function_decl))
339 return;
340
341 /* Don't try to do this once cgraph starts throwing away front-end
342 information. */
343 if (at_eof >= 2)
344 return;
345
346 FOR_EACH_VEC_SAFE_ELT (typenames, i, t)
347 {
348 if (need_semicolon)
349 pp_separate_with_semicolon (pp);
350 dump_type (pp, t, TFF_PLAIN_IDENTIFIER);
351 pp_cxx_whitespace (pp);
352 pp_equal (pp);
353 pp_cxx_whitespace (pp);
354 push_deferring_access_checks (dk_no_check);
355 t = tsubst (t, args, tf_none, NULL_TREE);
356 pop_deferring_access_checks ();
357 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
358 pp_simple_type_specifier doesn't know about it. */
359 t = strip_typedefs (t);
360 dump_type (pp, t, TFF_PLAIN_IDENTIFIER);
361 }
362 }
363
364 /* Dump a human-readable equivalent of the alias template
365 specialization of T. */
366
367 static void
368 dump_alias_template_specialization (cxx_pretty_printer *pp, tree t, int flags)
369 {
370 tree name;
371
372 gcc_assert (alias_template_specialization_p (t));
373
374 if (!(flags & TFF_UNQUALIFIED_NAME))
375 dump_scope (pp, CP_DECL_CONTEXT (TYPE_NAME (t)), flags);
376 name = TYPE_IDENTIFIER (t);
377 pp_cxx_tree_identifier (pp, name);
378 dump_template_parms (pp, TYPE_TEMPLATE_INFO (t),
379 /*primary=*/false,
380 flags & ~TFF_TEMPLATE_HEADER);
381 }
382
383 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
384 format. */
385
386 static void
387 dump_type (cxx_pretty_printer *pp, tree t, int flags)
388 {
389 if (t == NULL_TREE)
390 return;
391
392 /* Don't print e.g. "struct mytypedef". */
393 if (TYPE_P (t) && typedef_variant_p (t))
394 {
395 tree decl = TYPE_NAME (t);
396 if ((flags & TFF_CHASE_TYPEDEF)
397 || DECL_SELF_REFERENCE_P (decl)
398 || (!flag_pretty_templates
399 && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)))
400 t = strip_typedefs (t);
401 else if (alias_template_specialization_p (t))
402 {
403 dump_alias_template_specialization (pp, t, flags);
404 return;
405 }
406 else if (same_type_p (t, TREE_TYPE (decl)))
407 t = decl;
408 else
409 {
410 pp_cxx_cv_qualifier_seq (pp, t);
411 pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
412 return;
413 }
414 }
415
416 if (TYPE_PTRMEMFUNC_P (t))
417 goto offset_type;
418
419 switch (TREE_CODE (t))
420 {
421 case LANG_TYPE:
422 if (t == init_list_type_node)
423 pp_string (pp, M_("<brace-enclosed initializer list>"));
424 else if (t == unknown_type_node)
425 pp_string (pp, M_("<unresolved overloaded function type>"));
426 else
427 {
428 pp_cxx_cv_qualifier_seq (pp, t);
429 pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
430 }
431 break;
432
433 case TREE_LIST:
434 /* A list of function parms. */
435 dump_parameters (pp, t, flags);
436 break;
437
438 case IDENTIFIER_NODE:
439 pp_cxx_tree_identifier (pp, t);
440 break;
441
442 case TREE_BINFO:
443 dump_type (pp, BINFO_TYPE (t), flags);
444 break;
445
446 case RECORD_TYPE:
447 case UNION_TYPE:
448 case ENUMERAL_TYPE:
449 dump_aggr_type (pp, t, flags);
450 break;
451
452 case TYPE_DECL:
453 if (flags & TFF_CHASE_TYPEDEF)
454 {
455 dump_type (pp, DECL_ORIGINAL_TYPE (t)
456 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
457 break;
458 }
459 /* Else fall through. */
460
461 case TEMPLATE_DECL:
462 case NAMESPACE_DECL:
463 dump_decl (pp, t, flags & ~TFF_DECL_SPECIFIERS);
464 break;
465
466 case INTEGER_TYPE:
467 case REAL_TYPE:
468 case VOID_TYPE:
469 case BOOLEAN_TYPE:
470 case COMPLEX_TYPE:
471 case VECTOR_TYPE:
472 case FIXED_POINT_TYPE:
473 pp_type_specifier_seq (pp, t);
474 break;
475
476 case TEMPLATE_TEMPLATE_PARM:
477 /* For parameters inside template signature. */
478 if (TYPE_IDENTIFIER (t))
479 pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
480 else
481 pp_cxx_canonical_template_parameter (pp, t);
482 break;
483
484 case BOUND_TEMPLATE_TEMPLATE_PARM:
485 {
486 tree args = TYPE_TI_ARGS (t);
487 pp_cxx_cv_qualifier_seq (pp, t);
488 pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
489 pp_cxx_begin_template_argument_list (pp);
490 dump_template_argument_list (pp, args, flags);
491 pp_cxx_end_template_argument_list (pp);
492 }
493 break;
494
495 case TEMPLATE_TYPE_PARM:
496 pp_cxx_cv_qualifier_seq (pp, t);
497 if (TYPE_IDENTIFIER (t))
498 pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
499 else
500 pp_cxx_canonical_template_parameter
501 (pp, TEMPLATE_TYPE_PARM_INDEX (t));
502 break;
503
504 /* This is not always necessary for pointers and such, but doing this
505 reduces code size. */
506 case ARRAY_TYPE:
507 case POINTER_TYPE:
508 case REFERENCE_TYPE:
509 case OFFSET_TYPE:
510 offset_type:
511 case FUNCTION_TYPE:
512 case METHOD_TYPE:
513 {
514 dump_type_prefix (pp, t, flags);
515 dump_type_suffix (pp, t, flags);
516 break;
517 }
518 case TYPENAME_TYPE:
519 if (! (flags & TFF_CHASE_TYPEDEF)
520 && DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
521 {
522 dump_decl (pp, TYPE_NAME (t), TFF_PLAIN_IDENTIFIER);
523 break;
524 }
525 pp_cxx_cv_qualifier_seq (pp, t);
526 pp_cxx_ws_string (pp,
527 TYPENAME_IS_ENUM_P (t) ? "enum"
528 : TYPENAME_IS_CLASS_P (t) ? "class"
529 : "typename");
530 dump_typename (pp, t, flags);
531 break;
532
533 case UNBOUND_CLASS_TEMPLATE:
534 if (! (flags & TFF_UNQUALIFIED_NAME))
535 {
536 dump_type (pp, TYPE_CONTEXT (t), flags);
537 pp_cxx_colon_colon (pp);
538 }
539 pp_cxx_ws_string (pp, "template");
540 dump_type (pp, TYPE_IDENTIFIER (t), flags);
541 break;
542
543 case TYPEOF_TYPE:
544 pp_cxx_ws_string (pp, "__typeof__");
545 pp_cxx_whitespace (pp);
546 pp_cxx_left_paren (pp);
547 dump_expr (pp, TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
548 pp_cxx_right_paren (pp);
549 break;
550
551 case UNDERLYING_TYPE:
552 pp_cxx_ws_string (pp, "__underlying_type");
553 pp_cxx_whitespace (pp);
554 pp_cxx_left_paren (pp);
555 dump_expr (pp, UNDERLYING_TYPE_TYPE (t), flags & ~TFF_EXPR_IN_PARENS);
556 pp_cxx_right_paren (pp);
557 break;
558
559 case TYPE_PACK_EXPANSION:
560 dump_type (pp, PACK_EXPANSION_PATTERN (t), flags);
561 pp_cxx_ws_string (pp, "...");
562 break;
563
564 case TYPE_ARGUMENT_PACK:
565 dump_template_argument (pp, t, flags);
566 break;
567
568 case DECLTYPE_TYPE:
569 pp_cxx_ws_string (pp, "decltype");
570 pp_cxx_whitespace (pp);
571 pp_cxx_left_paren (pp);
572 dump_expr (pp, DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
573 pp_cxx_right_paren (pp);
574 break;
575
576 case NULLPTR_TYPE:
577 pp_string (pp, "std::nullptr_t");
578 break;
579
580 default:
581 pp_unsupported_tree (pp, t);
582 /* Fall through to error. */
583
584 case ERROR_MARK:
585 pp_string (pp, M_("<type error>"));
586 break;
587 }
588 }
589
590 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
591 a TYPENAME_TYPE. */
592
593 static void
594 dump_typename (cxx_pretty_printer *pp, tree t, int flags)
595 {
596 tree ctx = TYPE_CONTEXT (t);
597
598 if (TREE_CODE (ctx) == TYPENAME_TYPE)
599 dump_typename (pp, ctx, flags);
600 else
601 dump_type (pp, ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
602 pp_cxx_colon_colon (pp);
603 dump_decl (pp, TYPENAME_TYPE_FULLNAME (t), flags);
604 }
605
606 /* Return the name of the supplied aggregate, or enumeral type. */
607
608 const char *
609 class_key_or_enum_as_string (tree t)
610 {
611 if (TREE_CODE (t) == ENUMERAL_TYPE)
612 {
613 if (SCOPED_ENUM_P (t))
614 return "enum class";
615 else
616 return "enum";
617 }
618 else if (TREE_CODE (t) == UNION_TYPE)
619 return "union";
620 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
621 return "class";
622 else
623 return "struct";
624 }
625
626 /* Print out a class declaration T under the control of FLAGS,
627 in the form `class foo'. */
628
629 static void
630 dump_aggr_type (cxx_pretty_printer *pp, tree t, int flags)
631 {
632 tree name;
633 const char *variety = class_key_or_enum_as_string (t);
634 int typdef = 0;
635 int tmplate = 0;
636
637 pp_cxx_cv_qualifier_seq (pp, t);
638
639 if (flags & TFF_CLASS_KEY_OR_ENUM)
640 pp_cxx_ws_string (pp, variety);
641
642 name = TYPE_NAME (t);
643
644 if (name)
645 {
646 typdef = (!DECL_ARTIFICIAL (name)
647 /* An alias specialization is not considered to be a
648 typedef. */
649 && !alias_template_specialization_p (t));
650
651 if ((typdef
652 && ((flags & TFF_CHASE_TYPEDEF)
653 || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name)
654 && DECL_TEMPLATE_INFO (name))))
655 || DECL_SELF_REFERENCE_P (name))
656 {
657 t = TYPE_MAIN_VARIANT (t);
658 name = TYPE_NAME (t);
659 typdef = 0;
660 }
661
662 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
663 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
664 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
665 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
666
667 if (! (flags & TFF_UNQUALIFIED_NAME))
668 dump_scope (pp, CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
669 flags &= ~TFF_UNQUALIFIED_NAME;
670 if (tmplate)
671 {
672 /* Because the template names are mangled, we have to locate
673 the most general template, and use that name. */
674 tree tpl = TYPE_TI_TEMPLATE (t);
675
676 while (DECL_TEMPLATE_INFO (tpl))
677 tpl = DECL_TI_TEMPLATE (tpl);
678 name = tpl;
679 }
680 name = DECL_NAME (name);
681 }
682
683 if (name == 0 || anon_aggrname_p (name))
684 {
685 if (flags & TFF_CLASS_KEY_OR_ENUM)
686 pp_string (pp, M_("<anonymous>"));
687 else
688 pp_printf (pp, M_("<anonymous %s>"), variety);
689 }
690 else if (LAMBDA_TYPE_P (t))
691 {
692 /* A lambda's "type" is essentially its signature. */
693 pp_string (pp, M_("<lambda"));
694 if (lambda_function (t))
695 dump_parameters (pp,
696 FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t)),
697 flags);
698 pp_greater (pp);
699 }
700 else
701 pp_cxx_tree_identifier (pp, name);
702 if (tmplate)
703 dump_template_parms (pp, TYPE_TEMPLATE_INFO (t),
704 !CLASSTYPE_USE_TEMPLATE (t),
705 flags & ~TFF_TEMPLATE_HEADER);
706 }
707
708 /* Dump into the obstack the initial part of the output for a given type.
709 This is necessary when dealing with things like functions returning
710 functions. Examples:
711
712 return type of `int (* fee ())()': pointer -> function -> int. Both
713 pointer (and reference and offset) and function (and member) types must
714 deal with prefix and suffix.
715
716 Arrays must also do this for DECL nodes, like int a[], and for things like
717 int *[]&. */
718
719 static void
720 dump_type_prefix (cxx_pretty_printer *pp, tree t, int flags)
721 {
722 if (TYPE_PTRMEMFUNC_P (t))
723 {
724 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
725 goto offset_type;
726 }
727
728 switch (TREE_CODE (t))
729 {
730 case POINTER_TYPE:
731 case REFERENCE_TYPE:
732 {
733 tree sub = TREE_TYPE (t);
734
735 dump_type_prefix (pp, sub, flags);
736 if (TREE_CODE (sub) == ARRAY_TYPE
737 || TREE_CODE (sub) == FUNCTION_TYPE)
738 {
739 pp_cxx_whitespace (pp);
740 pp_cxx_left_paren (pp);
741 pp_c_attributes_display (pp, TYPE_ATTRIBUTES (sub));
742 }
743 if (TYPE_PTR_P (t))
744 pp_star (pp);
745 else if (TREE_CODE (t) == REFERENCE_TYPE)
746 {
747 if (TYPE_REF_IS_RVALUE (t))
748 pp_ampersand_ampersand (pp);
749 else
750 pp_ampersand (pp);
751 }
752 pp->padding = pp_before;
753 pp_cxx_cv_qualifier_seq (pp, t);
754 }
755 break;
756
757 case OFFSET_TYPE:
758 offset_type:
759 dump_type_prefix (pp, TREE_TYPE (t), flags);
760 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
761 {
762 pp_maybe_space (pp);
763 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
764 pp_cxx_left_paren (pp);
765 dump_type (pp, TYPE_OFFSET_BASETYPE (t), flags);
766 pp_cxx_colon_colon (pp);
767 }
768 pp_cxx_star (pp);
769 pp_cxx_cv_qualifier_seq (pp, t);
770 pp->padding = pp_before;
771 break;
772
773 /* This can be reached without a pointer when dealing with
774 templates, e.g. std::is_function. */
775 case FUNCTION_TYPE:
776 dump_type_prefix (pp, TREE_TYPE (t), flags);
777 break;
778
779 case METHOD_TYPE:
780 dump_type_prefix (pp, TREE_TYPE (t), flags);
781 pp_maybe_space (pp);
782 pp_cxx_left_paren (pp);
783 dump_aggr_type (pp, TYPE_METHOD_BASETYPE (t), flags);
784 pp_cxx_colon_colon (pp);
785 break;
786
787 case ARRAY_TYPE:
788 dump_type_prefix (pp, TREE_TYPE (t), flags);
789 break;
790
791 case ENUMERAL_TYPE:
792 case IDENTIFIER_NODE:
793 case INTEGER_TYPE:
794 case BOOLEAN_TYPE:
795 case REAL_TYPE:
796 case RECORD_TYPE:
797 case TEMPLATE_TYPE_PARM:
798 case TEMPLATE_TEMPLATE_PARM:
799 case BOUND_TEMPLATE_TEMPLATE_PARM:
800 case TREE_LIST:
801 case TYPE_DECL:
802 case TREE_VEC:
803 case UNION_TYPE:
804 case LANG_TYPE:
805 case VOID_TYPE:
806 case TYPENAME_TYPE:
807 case COMPLEX_TYPE:
808 case VECTOR_TYPE:
809 case TYPEOF_TYPE:
810 case UNDERLYING_TYPE:
811 case DECLTYPE_TYPE:
812 case TYPE_PACK_EXPANSION:
813 case FIXED_POINT_TYPE:
814 case NULLPTR_TYPE:
815 dump_type (pp, t, flags);
816 pp->padding = pp_before;
817 break;
818
819 default:
820 pp_unsupported_tree (pp, t);
821 /* fall through. */
822 case ERROR_MARK:
823 pp_string (pp, M_("<typeprefixerror>"));
824 break;
825 }
826 }
827
828 /* Dump the suffix of type T, under control of FLAGS. This is the part
829 which appears after the identifier (or function parms). */
830
831 static void
832 dump_type_suffix (cxx_pretty_printer *pp, tree t, int flags)
833 {
834 if (TYPE_PTRMEMFUNC_P (t))
835 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
836
837 switch (TREE_CODE (t))
838 {
839 case POINTER_TYPE:
840 case REFERENCE_TYPE:
841 case OFFSET_TYPE:
842 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
843 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
844 pp_cxx_right_paren (pp);
845 if (TREE_CODE (t) == POINTER_TYPE)
846 flags |= TFF_POINTER;
847 dump_type_suffix (pp, TREE_TYPE (t), flags);
848 break;
849
850 case FUNCTION_TYPE:
851 case METHOD_TYPE:
852 {
853 tree arg;
854 if (TREE_CODE (t) == METHOD_TYPE)
855 /* Can only be reached through a pointer. */
856 pp_cxx_right_paren (pp);
857 arg = TYPE_ARG_TYPES (t);
858 if (TREE_CODE (t) == METHOD_TYPE)
859 arg = TREE_CHAIN (arg);
860
861 /* Function pointers don't have default args. Not in standard C++,
862 anyway; they may in g++, but we'll just pretend otherwise. */
863 dump_parameters (pp, arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
864
865 pp->padding = pp_before;
866 pp_cxx_cv_qualifiers (pp, type_memfn_quals (t),
867 TREE_CODE (t) == FUNCTION_TYPE
868 && (flags & TFF_POINTER));
869 dump_ref_qualifier (pp, t, flags);
870 if (tx_safe_fn_type_p (t))
871 pp_cxx_ws_string (pp, "transaction_safe");
872 dump_exception_spec (pp, TYPE_RAISES_EXCEPTIONS (t), flags);
873 dump_type_suffix (pp, TREE_TYPE (t), flags);
874 break;
875 }
876
877 case ARRAY_TYPE:
878 pp_maybe_space (pp);
879 pp_cxx_left_bracket (pp);
880 if (TYPE_DOMAIN (t))
881 {
882 tree dtype = TYPE_DOMAIN (t);
883 tree max = TYPE_MAX_VALUE (dtype);
884 if (integer_all_onesp (max))
885 pp_character (pp, '0');
886 else if (tree_fits_shwi_p (max))
887 pp_wide_integer (pp, tree_to_shwi (max) + 1);
888 else
889 {
890 STRIP_NOPS (max);
891 if (TREE_CODE (max) == SAVE_EXPR)
892 max = TREE_OPERAND (max, 0);
893 if (TREE_CODE (max) == MINUS_EXPR
894 || TREE_CODE (max) == PLUS_EXPR)
895 {
896 max = TREE_OPERAND (max, 0);
897 while (CONVERT_EXPR_P (max))
898 max = TREE_OPERAND (max, 0);
899 }
900 else
901 max = fold_build2_loc (input_location,
902 PLUS_EXPR, dtype, max,
903 build_int_cst (dtype, 1));
904 dump_expr (pp, max, flags & ~TFF_EXPR_IN_PARENS);
905 }
906 }
907 pp_cxx_right_bracket (pp);
908 dump_type_suffix (pp, TREE_TYPE (t), flags);
909 break;
910
911 case ENUMERAL_TYPE:
912 case IDENTIFIER_NODE:
913 case INTEGER_TYPE:
914 case BOOLEAN_TYPE:
915 case REAL_TYPE:
916 case RECORD_TYPE:
917 case TEMPLATE_TYPE_PARM:
918 case TEMPLATE_TEMPLATE_PARM:
919 case BOUND_TEMPLATE_TEMPLATE_PARM:
920 case TREE_LIST:
921 case TYPE_DECL:
922 case TREE_VEC:
923 case UNION_TYPE:
924 case LANG_TYPE:
925 case VOID_TYPE:
926 case TYPENAME_TYPE:
927 case COMPLEX_TYPE:
928 case VECTOR_TYPE:
929 case TYPEOF_TYPE:
930 case UNDERLYING_TYPE:
931 case DECLTYPE_TYPE:
932 case TYPE_PACK_EXPANSION:
933 case FIXED_POINT_TYPE:
934 case NULLPTR_TYPE:
935 break;
936
937 default:
938 pp_unsupported_tree (pp, t);
939 case ERROR_MARK:
940 /* Don't mark it here, we should have already done in
941 dump_type_prefix. */
942 break;
943 }
944 }
945
946 static void
947 dump_global_iord (cxx_pretty_printer *pp, tree t)
948 {
949 const char *p = NULL;
950
951 if (DECL_GLOBAL_CTOR_P (t))
952 p = M_("(static initializers for %s)");
953 else if (DECL_GLOBAL_DTOR_P (t))
954 p = M_("(static destructors for %s)");
955 else
956 gcc_unreachable ();
957
958 pp_printf (pp, p, LOCATION_FILE (input_location));
959 }
960
961 static void
962 dump_simple_decl (cxx_pretty_printer *pp, tree t, tree type, int flags)
963 {
964 if (flags & TFF_DECL_SPECIFIERS)
965 {
966 if (VAR_P (t)
967 && DECL_DECLARED_CONSTEXPR_P (t))
968 pp_cxx_ws_string (pp, "constexpr");
969 dump_type_prefix (pp, type, flags & ~TFF_UNQUALIFIED_NAME);
970 pp_maybe_space (pp);
971 }
972 if (! (flags & TFF_UNQUALIFIED_NAME)
973 && TREE_CODE (t) != PARM_DECL
974 && (!DECL_INITIAL (t)
975 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
976 dump_scope (pp, CP_DECL_CONTEXT (t), flags);
977 flags &= ~TFF_UNQUALIFIED_NAME;
978 if ((flags & TFF_DECL_SPECIFIERS)
979 && DECL_TEMPLATE_PARM_P (t)
980 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
981 pp_string (pp, "...");
982 if (DECL_NAME (t))
983 {
984 if (TREE_CODE (t) == FIELD_DECL && DECL_NORMAL_CAPTURE_P (t))
985 {
986 pp_less (pp);
987 pp_string (pp, IDENTIFIER_POINTER (DECL_NAME (t)) + 2);
988 pp_string (pp, " capture>");
989 }
990 else
991 dump_decl (pp, DECL_NAME (t), flags);
992 }
993 else
994 pp_string (pp, M_("<anonymous>"));
995 if (flags & TFF_DECL_SPECIFIERS)
996 dump_type_suffix (pp, type, flags);
997 }
998
999 /* Dump a human readable string for the decl T under control of FLAGS. */
1000
1001 static void
1002 dump_decl (cxx_pretty_printer *pp, tree t, int flags)
1003 {
1004 if (t == NULL_TREE)
1005 return;
1006
1007 /* If doing Objective-C++, give Objective-C a chance to demangle
1008 Objective-C method names. */
1009 if (c_dialect_objc ())
1010 {
1011 const char *demangled = objc_maybe_printable_name (t, flags);
1012 if (demangled)
1013 {
1014 pp_string (pp, demangled);
1015 return;
1016 }
1017 }
1018
1019 switch (TREE_CODE (t))
1020 {
1021 case TYPE_DECL:
1022 /* Don't say 'typedef class A' */
1023 if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t))
1024 {
1025 if ((flags & TFF_DECL_SPECIFIERS)
1026 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
1027 {
1028 /* Say `class T' not just `T'. */
1029 pp_cxx_ws_string (pp, "class");
1030
1031 /* Emit the `...' for a parameter pack. */
1032 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1033 pp_cxx_ws_string (pp, "...");
1034 }
1035
1036 dump_type (pp, TREE_TYPE (t), flags);
1037 break;
1038 }
1039 if (TYPE_DECL_ALIAS_P (t)
1040 && (flags & TFF_DECL_SPECIFIERS
1041 || flags & TFF_CLASS_KEY_OR_ENUM))
1042 {
1043 pp_cxx_ws_string (pp, "using");
1044 dump_decl (pp, DECL_NAME (t), flags);
1045 pp_cxx_whitespace (pp);
1046 pp_cxx_ws_string (pp, "=");
1047 pp_cxx_whitespace (pp);
1048 dump_type (pp, DECL_ORIGINAL_TYPE (t), flags);
1049 break;
1050 }
1051 if ((flags & TFF_DECL_SPECIFIERS)
1052 && !DECL_SELF_REFERENCE_P (t))
1053 pp_cxx_ws_string (pp, "typedef");
1054 dump_simple_decl (pp, t, DECL_ORIGINAL_TYPE (t)
1055 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
1056 flags);
1057 break;
1058
1059 case VAR_DECL:
1060 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
1061 {
1062 pp_string (pp, M_("vtable for "));
1063 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
1064 dump_type (pp, DECL_CONTEXT (t), flags);
1065 break;
1066 }
1067 /* Else fall through. */
1068 case FIELD_DECL:
1069 case PARM_DECL:
1070 dump_simple_decl (pp, t, TREE_TYPE (t), flags);
1071
1072 /* Handle variable template specializations. */
1073 if (VAR_P (t)
1074 && DECL_LANG_SPECIFIC (t)
1075 && DECL_TEMPLATE_INFO (t)
1076 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t)))
1077 {
1078 pp_cxx_begin_template_argument_list (pp);
1079 tree args = INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (t));
1080 dump_template_argument_list (pp, args, flags);
1081 pp_cxx_end_template_argument_list (pp);
1082 }
1083 break;
1084
1085 case RESULT_DECL:
1086 pp_string (pp, M_("<return value> "));
1087 dump_simple_decl (pp, t, TREE_TYPE (t), flags);
1088 break;
1089
1090 case NAMESPACE_DECL:
1091 if (flags & TFF_DECL_SPECIFIERS)
1092 pp->declaration (t);
1093 else
1094 {
1095 if (! (flags & TFF_UNQUALIFIED_NAME))
1096 dump_scope (pp, CP_DECL_CONTEXT (t), flags);
1097 flags &= ~TFF_UNQUALIFIED_NAME;
1098 if (DECL_NAME (t) == NULL_TREE)
1099 {
1100 if (!(pp->flags & pp_c_flag_gnu_v3))
1101 pp_cxx_ws_string (pp, M_("{anonymous}"));
1102 else
1103 pp_cxx_ws_string (pp, M_("(anonymous namespace)"));
1104 }
1105 else
1106 pp_cxx_tree_identifier (pp, DECL_NAME (t));
1107 }
1108 break;
1109
1110 case SCOPE_REF:
1111 dump_type (pp, TREE_OPERAND (t, 0), flags);
1112 pp_colon_colon (pp);
1113 dump_decl (pp, TREE_OPERAND (t, 1), TFF_UNQUALIFIED_NAME);
1114 break;
1115
1116 case ARRAY_REF:
1117 dump_decl (pp, TREE_OPERAND (t, 0), flags);
1118 pp_cxx_left_bracket (pp);
1119 dump_decl (pp, TREE_OPERAND (t, 1), flags);
1120 pp_cxx_right_bracket (pp);
1121 break;
1122
1123 case ARRAY_NOTATION_REF:
1124 dump_decl (pp, ARRAY_NOTATION_ARRAY (t), flags | TFF_EXPR_IN_PARENS);
1125 pp_cxx_left_bracket (pp);
1126 dump_decl (pp, ARRAY_NOTATION_START (t), flags | TFF_EXPR_IN_PARENS);
1127 pp_colon (pp);
1128 dump_decl (pp, ARRAY_NOTATION_LENGTH (t), flags | TFF_EXPR_IN_PARENS);
1129 pp_colon (pp);
1130 dump_decl (pp, ARRAY_NOTATION_STRIDE (t), flags | TFF_EXPR_IN_PARENS);
1131 pp_cxx_right_bracket (pp);
1132 break;
1133
1134 /* So that we can do dump_decl on an aggr type. */
1135 case RECORD_TYPE:
1136 case UNION_TYPE:
1137 case ENUMERAL_TYPE:
1138 dump_type (pp, t, flags);
1139 break;
1140
1141 case BIT_NOT_EXPR:
1142 /* This is a pseudo destructor call which has not been folded into
1143 a PSEUDO_DTOR_EXPR yet. */
1144 pp_cxx_complement (pp);
1145 dump_type (pp, TREE_OPERAND (t, 0), flags);
1146 break;
1147
1148 case TYPE_EXPR:
1149 gcc_unreachable ();
1150 break;
1151
1152 /* These special cases are duplicated here so that other functions
1153 can feed identifiers to error and get them demangled properly. */
1154 case IDENTIFIER_NODE:
1155 if (IDENTIFIER_TYPENAME_P (t))
1156 {
1157 pp_cxx_ws_string (pp, "operator");
1158 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1159 dump_type (pp, TREE_TYPE (t), flags);
1160 break;
1161 }
1162 else
1163 pp_cxx_tree_identifier (pp, t);
1164 break;
1165
1166 case OVERLOAD:
1167 if (OVL_CHAIN (t))
1168 {
1169 t = OVL_CURRENT (t);
1170 if (DECL_CLASS_SCOPE_P (t))
1171 {
1172 dump_type (pp, DECL_CONTEXT (t), flags);
1173 pp_cxx_colon_colon (pp);
1174 }
1175 else if (!DECL_FILE_SCOPE_P (t))
1176 {
1177 dump_decl (pp, DECL_CONTEXT (t), flags);
1178 pp_cxx_colon_colon (pp);
1179 }
1180 dump_decl (pp, DECL_NAME (t), flags);
1181 break;
1182 }
1183
1184 /* If there's only one function, just treat it like an ordinary
1185 FUNCTION_DECL. */
1186 t = OVL_CURRENT (t);
1187 /* Fall through. */
1188
1189 case FUNCTION_DECL:
1190 if (! DECL_LANG_SPECIFIC (t))
1191 {
1192 if (DECL_ABSTRACT_ORIGIN (t))
1193 dump_decl (pp, DECL_ABSTRACT_ORIGIN (t), flags);
1194 else
1195 pp_string (pp, M_("<built-in>"));
1196 }
1197 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
1198 dump_global_iord (pp, t);
1199 else
1200 dump_function_decl (pp, t, flags);
1201 break;
1202
1203 case TEMPLATE_DECL:
1204 dump_template_decl (pp, t, flags);
1205 break;
1206
1207 case TEMPLATE_ID_EXPR:
1208 {
1209 tree name = TREE_OPERAND (t, 0);
1210 tree args = TREE_OPERAND (t, 1);
1211
1212 if (is_overloaded_fn (name))
1213 name = get_first_fn (name);
1214 if (DECL_P (name))
1215 name = DECL_NAME (name);
1216 dump_decl (pp, name, flags);
1217 pp_cxx_begin_template_argument_list (pp);
1218 if (args == error_mark_node)
1219 pp_string (pp, M_("<template arguments error>"));
1220 else if (args)
1221 dump_template_argument_list
1222 (pp, args, flags|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS);
1223 pp_cxx_end_template_argument_list (pp);
1224 }
1225 break;
1226
1227 case LABEL_DECL:
1228 pp_cxx_tree_identifier (pp, DECL_NAME (t));
1229 break;
1230
1231 case CONST_DECL:
1232 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
1233 || (DECL_INITIAL (t) &&
1234 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
1235 dump_simple_decl (pp, t, TREE_TYPE (t), flags);
1236 else if (DECL_NAME (t))
1237 dump_decl (pp, DECL_NAME (t), flags);
1238 else if (DECL_INITIAL (t))
1239 dump_expr (pp, DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
1240 else
1241 pp_string (pp, M_("<enumerator>"));
1242 break;
1243
1244 case USING_DECL:
1245 pp_cxx_ws_string (pp, "using");
1246 dump_type (pp, USING_DECL_SCOPE (t), flags);
1247 pp_cxx_colon_colon (pp);
1248 dump_decl (pp, DECL_NAME (t), flags);
1249 break;
1250
1251 case STATIC_ASSERT:
1252 pp->declaration (t);
1253 break;
1254
1255 case BASELINK:
1256 dump_decl (pp, BASELINK_FUNCTIONS (t), flags);
1257 break;
1258
1259 case NON_DEPENDENT_EXPR:
1260 dump_expr (pp, t, flags);
1261 break;
1262
1263 case TEMPLATE_TYPE_PARM:
1264 if (flags & TFF_DECL_SPECIFIERS)
1265 pp->declaration (t);
1266 else
1267 pp->type_id (t);
1268 break;
1269
1270 case UNBOUND_CLASS_TEMPLATE:
1271 case TYPE_PACK_EXPANSION:
1272 case TREE_BINFO:
1273 dump_type (pp, t, flags);
1274 break;
1275
1276 default:
1277 pp_unsupported_tree (pp, t);
1278 /* Fall through to error. */
1279
1280 case ERROR_MARK:
1281 pp_string (pp, M_("<declaration error>"));
1282 break;
1283 }
1284 }
1285
1286 /* Dump a template declaration T under control of FLAGS. This means the
1287 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1288
1289 static void
1290 dump_template_decl (cxx_pretty_printer *pp, tree t, int flags)
1291 {
1292 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1293 tree parms;
1294 int i;
1295
1296 if (flags & TFF_TEMPLATE_HEADER)
1297 {
1298 for (parms = orig_parms = nreverse (orig_parms);
1299 parms;
1300 parms = TREE_CHAIN (parms))
1301 {
1302 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1303 int len = TREE_VEC_LENGTH (inner_parms);
1304
1305 if (len == 0)
1306 {
1307 /* Skip over the dummy template levels of a template template
1308 parm. */
1309 gcc_assert (TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TEMPLATE_PARM);
1310 continue;
1311 }
1312
1313 pp_cxx_ws_string (pp, "template");
1314 pp_cxx_begin_template_argument_list (pp);
1315
1316 /* If we've shown the template prefix, we'd better show the
1317 parameters' and decl's type too. */
1318 flags |= TFF_DECL_SPECIFIERS;
1319
1320 for (i = 0; i < len; i++)
1321 {
1322 if (i)
1323 pp_separate_with_comma (pp);
1324 dump_template_parameter (pp, TREE_VEC_ELT (inner_parms, i),
1325 flags);
1326 }
1327 pp_cxx_end_template_argument_list (pp);
1328 pp_cxx_whitespace (pp);
1329 }
1330 nreverse(orig_parms);
1331
1332 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1333 {
1334 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1335 pp_cxx_ws_string (pp, "class");
1336
1337 /* If this is a parameter pack, print the ellipsis. */
1338 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1339 pp_cxx_ws_string (pp, "...");
1340 }
1341 }
1342
1343 if (flag_concepts)
1344 if (tree ci = get_constraints (t))
1345 if (check_constraint_info (ci))
1346 if (tree reqs = CI_TEMPLATE_REQS (ci))
1347 {
1348 pp_cxx_requires_clause (pp, reqs);
1349 pp_cxx_whitespace (pp);
1350 }
1351
1352 if (DECL_CLASS_TEMPLATE_P (t))
1353 dump_type (pp, TREE_TYPE (t),
1354 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1355 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1356 else if (DECL_TEMPLATE_RESULT (t)
1357 && (VAR_P (DECL_TEMPLATE_RESULT (t))
1358 /* Alias template. */
1359 || DECL_TYPE_TEMPLATE_P (t)))
1360 dump_decl (pp, DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1361 else
1362 {
1363 gcc_assert (TREE_TYPE (t));
1364 switch (NEXT_CODE (t))
1365 {
1366 case METHOD_TYPE:
1367 case FUNCTION_TYPE:
1368 dump_function_decl (pp, t, flags | TFF_TEMPLATE_NAME);
1369 break;
1370 default:
1371 /* This case can occur with some invalid code. */
1372 dump_type (pp, TREE_TYPE (t),
1373 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1374 | (flags & TFF_DECL_SPECIFIERS
1375 ? TFF_CLASS_KEY_OR_ENUM : 0));
1376 }
1377 }
1378 }
1379
1380 /* find_typenames looks through the type of the function template T
1381 and returns a vec containing any typedefs, decltypes or TYPENAME_TYPEs
1382 it finds. */
1383
1384 struct find_typenames_t
1385 {
1386 hash_set<tree> *p_set;
1387 vec<tree, va_gc> *typenames;
1388 };
1389
1390 static tree
1391 find_typenames_r (tree *tp, int *walk_subtrees, void *data)
1392 {
1393 struct find_typenames_t *d = (struct find_typenames_t *)data;
1394 tree mv = NULL_TREE;
1395
1396 if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp)))
1397 /* Add the type of the typedef without any additional cv-quals. */
1398 mv = TREE_TYPE (TYPE_NAME (*tp));
1399 else if (TREE_CODE (*tp) == TYPENAME_TYPE
1400 || TREE_CODE (*tp) == DECLTYPE_TYPE)
1401 /* Add the typename without any cv-qualifiers. */
1402 mv = TYPE_MAIN_VARIANT (*tp);
1403
1404 if (TREE_CODE (*tp) == TYPE_PACK_EXPANSION)
1405 {
1406 /* Don't mess with parameter packs since we don't remember
1407 the pack expansion context for a particular typename. */
1408 *walk_subtrees = false;
1409 return NULL_TREE;
1410 }
1411
1412 if (mv && (mv == *tp || !d->p_set->add (mv)))
1413 vec_safe_push (d->typenames, mv);
1414
1415 /* Search into class template arguments, which cp_walk_subtrees
1416 doesn't do. */
1417 if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp))
1418 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r,
1419 data, d->p_set);
1420
1421 return NULL_TREE;
1422 }
1423
1424 static vec<tree, va_gc> *
1425 find_typenames (tree t)
1426 {
1427 struct find_typenames_t ft;
1428 ft.p_set = new hash_set<tree>;
1429 ft.typenames = NULL;
1430 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
1431 find_typenames_r, &ft, ft.p_set);
1432 delete ft.p_set;
1433 return ft.typenames;
1434 }
1435
1436 /* Output the "[with ...]" clause for a template instantiation T iff
1437 TEMPLATE_PARMS, TEMPLATE_ARGS and FLAGS are suitable. T may be NULL if
1438 formatting a deduction/substitution diagnostic rather than an
1439 instantiation. */
1440
1441 static void
1442 dump_substitution (cxx_pretty_printer *pp,
1443 tree t, tree template_parms, tree template_args,
1444 int flags)
1445 {
1446 if (template_parms != NULL_TREE && template_args != NULL_TREE
1447 && !(flags & TFF_NO_TEMPLATE_BINDINGS))
1448 {
1449 vec<tree, va_gc> *typenames = t ? find_typenames (t) : NULL;
1450 pp_cxx_whitespace (pp);
1451 pp_cxx_left_bracket (pp);
1452 pp->translate_string ("with");
1453 pp_cxx_whitespace (pp);
1454 dump_template_bindings (pp, template_parms, template_args, typenames);
1455 pp_cxx_right_bracket (pp);
1456 }
1457 }
1458
1459 /* Dump the lambda function FN including its 'mutable' qualifier and any
1460 template bindings. */
1461
1462 static void
1463 dump_lambda_function (cxx_pretty_printer *pp,
1464 tree fn, tree template_parms, tree template_args,
1465 int flags)
1466 {
1467 /* A lambda's signature is essentially its "type". */
1468 dump_type (pp, DECL_CONTEXT (fn), flags);
1469 if (!(TYPE_QUALS (class_of_this_parm (TREE_TYPE (fn))) & TYPE_QUAL_CONST))
1470 {
1471 pp->padding = pp_before;
1472 pp_c_ws_string (pp, "mutable");
1473 }
1474 dump_substitution (pp, fn, template_parms, template_args, flags);
1475 }
1476
1477 /* Pretty print a function decl. There are several ways we want to print a
1478 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1479 As error can only apply the '#' flag once to give 0 and 1 for V, there
1480 is %D which doesn't print the throw specs, and %F which does. */
1481
1482 static void
1483 dump_function_decl (cxx_pretty_printer *pp, tree t, int flags)
1484 {
1485 tree fntype;
1486 tree parmtypes;
1487 tree cname = NULL_TREE;
1488 tree template_args = NULL_TREE;
1489 tree template_parms = NULL_TREE;
1490 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1491 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1492 tree exceptions;
1493
1494 flags &= ~(TFF_UNQUALIFIED_NAME | TFF_TEMPLATE_NAME);
1495 if (TREE_CODE (t) == TEMPLATE_DECL)
1496 t = DECL_TEMPLATE_RESULT (t);
1497
1498 /* Save the exceptions, in case t is a specialization and we are
1499 emitting an error about incompatible specifications. */
1500 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1501
1502 /* Pretty print template instantiations only. */
1503 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
1504 && flag_pretty_templates)
1505 {
1506 tree tmpl;
1507
1508 template_args = DECL_TI_ARGS (t);
1509 tmpl = most_general_template (t);
1510 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1511 {
1512 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1513 t = tmpl;
1514 }
1515 }
1516
1517 if (DECL_NAME (t) && LAMBDA_FUNCTION_P (t))
1518 return dump_lambda_function (pp, t, template_parms, template_args, flags);
1519
1520 fntype = TREE_TYPE (t);
1521 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1522
1523 if (DECL_CLASS_SCOPE_P (t))
1524 cname = DECL_CONTEXT (t);
1525 /* This is for partially instantiated template methods. */
1526 else if (TREE_CODE (fntype) == METHOD_TYPE)
1527 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1528
1529 if (flags & TFF_DECL_SPECIFIERS)
1530 {
1531 if (DECL_STATIC_FUNCTION_P (t))
1532 pp_cxx_ws_string (pp, "static");
1533 else if (DECL_VIRTUAL_P (t))
1534 pp_cxx_ws_string (pp, "virtual");
1535
1536 if (DECL_DECLARED_CONSTEXPR_P (t))
1537 pp_cxx_ws_string (pp, "constexpr");
1538 }
1539
1540 /* Print the return type? */
1541 if (show_return)
1542 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1543 && !DECL_DESTRUCTOR_P (t);
1544 if (show_return)
1545 {
1546 tree ret = fndecl_declared_return_type (t);
1547 dump_type_prefix (pp, ret, flags);
1548 }
1549
1550 /* Print the function name. */
1551 if (!do_outer_scope)
1552 /* Nothing. */;
1553 else if (cname)
1554 {
1555 dump_type (pp, cname, flags);
1556 pp_cxx_colon_colon (pp);
1557 }
1558 else
1559 dump_scope (pp, CP_DECL_CONTEXT (t), flags);
1560
1561 dump_function_name (pp, t, flags);
1562
1563 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1564 {
1565 dump_parameters (pp, parmtypes, flags);
1566
1567 if (TREE_CODE (fntype) == METHOD_TYPE)
1568 {
1569 pp->padding = pp_before;
1570 pp_cxx_cv_qualifier_seq (pp, class_of_this_parm (fntype));
1571 dump_ref_qualifier (pp, fntype, flags);
1572 }
1573
1574 if (tx_safe_fn_type_p (fntype))
1575 {
1576 pp->padding = pp_before;
1577 pp_cxx_ws_string (pp, "transaction_safe");
1578 }
1579
1580 if (flags & TFF_EXCEPTION_SPECIFICATION)
1581 {
1582 pp->padding = pp_before;
1583 dump_exception_spec (pp, exceptions, flags);
1584 }
1585
1586 if (show_return)
1587 dump_type_suffix (pp, TREE_TYPE (fntype), flags);
1588
1589 if (flag_concepts)
1590 if (tree ci = get_constraints (t))
1591 if (tree reqs = CI_DECLARATOR_REQS (ci))
1592 pp_cxx_requires_clause (pp, reqs);
1593
1594 dump_substitution (pp, t, template_parms, template_args, flags);
1595 }
1596 else if (template_args)
1597 {
1598 bool need_comma = false;
1599 int i;
1600 pp_cxx_begin_template_argument_list (pp);
1601 template_args = INNERMOST_TEMPLATE_ARGS (template_args);
1602 for (i = 0; i < TREE_VEC_LENGTH (template_args); ++i)
1603 {
1604 tree arg = TREE_VEC_ELT (template_args, i);
1605 if (need_comma)
1606 pp_separate_with_comma (pp);
1607 if (ARGUMENT_PACK_P (arg))
1608 pp_cxx_left_brace (pp);
1609 dump_template_argument (pp, arg, TFF_PLAIN_IDENTIFIER);
1610 if (ARGUMENT_PACK_P (arg))
1611 pp_cxx_right_brace (pp);
1612 need_comma = true;
1613 }
1614 pp_cxx_end_template_argument_list (pp);
1615 }
1616 }
1617
1618 /* Print a parameter list. If this is for a member function, the
1619 member object ptr (and any other hidden args) should have
1620 already been removed. */
1621
1622 static void
1623 dump_parameters (cxx_pretty_printer *pp, tree parmtypes, int flags)
1624 {
1625 int first = 1;
1626 flags &= ~TFF_SCOPE;
1627 pp_cxx_left_paren (pp);
1628
1629 for (first = 1; parmtypes != void_list_node;
1630 parmtypes = TREE_CHAIN (parmtypes))
1631 {
1632 if (!first)
1633 pp_separate_with_comma (pp);
1634 first = 0;
1635 if (!parmtypes)
1636 {
1637 pp_cxx_ws_string (pp, "...");
1638 break;
1639 }
1640
1641 dump_type (pp, TREE_VALUE (parmtypes), flags);
1642
1643 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1644 {
1645 pp_cxx_whitespace (pp);
1646 pp_equal (pp);
1647 pp_cxx_whitespace (pp);
1648 dump_expr (pp, TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1649 }
1650 }
1651
1652 pp_cxx_right_paren (pp);
1653 }
1654
1655 /* Print ref-qualifier of a FUNCTION_TYPE or METHOD_TYPE. FLAGS are ignored. */
1656
1657 static void
1658 dump_ref_qualifier (cxx_pretty_printer *pp, tree t, int flags ATTRIBUTE_UNUSED)
1659 {
1660 if (FUNCTION_REF_QUALIFIED (t))
1661 {
1662 pp->padding = pp_before;
1663 if (FUNCTION_RVALUE_QUALIFIED (t))
1664 pp_cxx_ws_string (pp, "&&");
1665 else
1666 pp_cxx_ws_string (pp, "&");
1667 }
1668 }
1669
1670 /* Print an exception specification. T is the exception specification. */
1671
1672 static void
1673 dump_exception_spec (cxx_pretty_printer *pp, tree t, int flags)
1674 {
1675 if (t && TREE_PURPOSE (t))
1676 {
1677 pp_cxx_ws_string (pp, "noexcept");
1678 if (!integer_onep (TREE_PURPOSE (t)))
1679 {
1680 pp_cxx_whitespace (pp);
1681 pp_cxx_left_paren (pp);
1682 if (DEFERRED_NOEXCEPT_SPEC_P (t))
1683 pp_cxx_ws_string (pp, "<uninstantiated>");
1684 else
1685 dump_expr (pp, TREE_PURPOSE (t), flags);
1686 pp_cxx_right_paren (pp);
1687 }
1688 }
1689 else if (t)
1690 {
1691 pp_cxx_ws_string (pp, "throw");
1692 pp_cxx_whitespace (pp);
1693 pp_cxx_left_paren (pp);
1694 if (TREE_VALUE (t) != NULL_TREE)
1695 while (1)
1696 {
1697 dump_type (pp, TREE_VALUE (t), flags);
1698 t = TREE_CHAIN (t);
1699 if (!t)
1700 break;
1701 pp_separate_with_comma (pp);
1702 }
1703 pp_cxx_right_paren (pp);
1704 }
1705 }
1706
1707 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1708 and destructors properly. */
1709
1710 static void
1711 dump_function_name (cxx_pretty_printer *pp, tree t, int flags)
1712 {
1713 tree name = DECL_NAME (t);
1714
1715 /* We can get here with a decl that was synthesized by language-
1716 independent machinery (e.g. coverage.c) in which case it won't
1717 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1718 will crash. In this case it is safe just to print out the
1719 literal name. */
1720 if (!DECL_LANG_SPECIFIC (t))
1721 {
1722 pp_cxx_tree_identifier (pp, name);
1723 return;
1724 }
1725
1726 if (TREE_CODE (t) == TEMPLATE_DECL)
1727 t = DECL_TEMPLATE_RESULT (t);
1728
1729 /* Don't let the user see __comp_ctor et al. */
1730 if (DECL_CONSTRUCTOR_P (t)
1731 || DECL_DESTRUCTOR_P (t))
1732 {
1733 if (LAMBDA_TYPE_P (DECL_CONTEXT (t)))
1734 name = get_identifier ("<lambda>");
1735 else if (TYPE_ANONYMOUS_P (DECL_CONTEXT (t)))
1736 name = get_identifier ("<constructor>");
1737 else
1738 name = constructor_name (DECL_CONTEXT (t));
1739 }
1740
1741 if (DECL_DESTRUCTOR_P (t))
1742 {
1743 pp_cxx_complement (pp);
1744 dump_decl (pp, name, TFF_PLAIN_IDENTIFIER);
1745 }
1746 else if (DECL_CONV_FN_P (t))
1747 {
1748 /* This cannot use the hack that the operator's return
1749 type is stashed off of its name because it may be
1750 used for error reporting. In the case of conflicting
1751 declarations, both will have the same name, yet
1752 the types will be different, hence the TREE_TYPE field
1753 of the first name will be clobbered by the second. */
1754 pp_cxx_ws_string (pp, "operator");
1755 dump_type (pp, TREE_TYPE (TREE_TYPE (t)), flags);
1756 }
1757 else if (name && IDENTIFIER_OPNAME_P (name))
1758 pp_cxx_tree_identifier (pp, name);
1759 else if (name && UDLIT_OPER_P (name))
1760 pp_cxx_tree_identifier (pp, name);
1761 else
1762 dump_decl (pp, name, flags);
1763
1764 if (DECL_TEMPLATE_INFO (t)
1765 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1766 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1767 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1768 dump_template_parms (pp, DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t),
1769 flags);
1770 }
1771
1772 /* Dump the template parameters from the template info INFO under control of
1773 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1774 specialization (partial or complete). For partial specializations we show
1775 the specialized parameter values. For a primary template we show no
1776 decoration. */
1777
1778 static void
1779 dump_template_parms (cxx_pretty_printer *pp, tree info,
1780 int primary, int flags)
1781 {
1782 tree args = info ? TI_ARGS (info) : NULL_TREE;
1783
1784 if (primary && flags & TFF_TEMPLATE_NAME)
1785 return;
1786 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1787 pp_cxx_begin_template_argument_list (pp);
1788
1789 /* Be careful only to print things when we have them, so as not
1790 to crash producing error messages. */
1791 if (args && !primary)
1792 {
1793 int len, ix;
1794 len = get_non_default_template_args_count (args, flags);
1795
1796 args = INNERMOST_TEMPLATE_ARGS (args);
1797 for (ix = 0; ix != len; ix++)
1798 {
1799 tree arg = TREE_VEC_ELT (args, ix);
1800
1801 /* Only print a comma if we know there is an argument coming. In
1802 the case of an empty template argument pack, no actual
1803 argument will be printed. */
1804 if (ix
1805 && (!ARGUMENT_PACK_P (arg)
1806 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1807 pp_separate_with_comma (pp);
1808
1809 if (!arg)
1810 pp_string (pp, M_("<template parameter error>"));
1811 else
1812 dump_template_argument (pp, arg, flags);
1813 }
1814 }
1815 else if (primary)
1816 {
1817 tree tpl = TI_TEMPLATE (info);
1818 tree parms = DECL_TEMPLATE_PARMS (tpl);
1819 int len, ix;
1820
1821 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1822 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1823
1824 for (ix = 0; ix != len; ix++)
1825 {
1826 tree parm;
1827
1828 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1829 {
1830 pp_string (pp, M_("<template parameter error>"));
1831 continue;
1832 }
1833
1834 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1835
1836 if (ix)
1837 pp_separate_with_comma (pp);
1838
1839 dump_decl (pp, parm, flags & ~TFF_DECL_SPECIFIERS);
1840 }
1841 }
1842 pp_cxx_end_template_argument_list (pp);
1843 }
1844
1845 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1846 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1847
1848 static void
1849 dump_call_expr_args (cxx_pretty_printer *pp, tree t, int flags, bool skipfirst)
1850 {
1851 tree arg;
1852 call_expr_arg_iterator iter;
1853
1854 pp_cxx_left_paren (pp);
1855 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1856 {
1857 if (skipfirst)
1858 skipfirst = false;
1859 else
1860 {
1861 dump_expr (pp, arg, flags | TFF_EXPR_IN_PARENS);
1862 if (more_call_expr_args_p (&iter))
1863 pp_separate_with_comma (pp);
1864 }
1865 }
1866 pp_cxx_right_paren (pp);
1867 }
1868
1869 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1870 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1871 true. */
1872
1873 static void
1874 dump_aggr_init_expr_args (cxx_pretty_printer *pp, tree t, int flags,
1875 bool skipfirst)
1876 {
1877 tree arg;
1878 aggr_init_expr_arg_iterator iter;
1879
1880 pp_cxx_left_paren (pp);
1881 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1882 {
1883 if (skipfirst)
1884 skipfirst = false;
1885 else
1886 {
1887 dump_expr (pp, arg, flags | TFF_EXPR_IN_PARENS);
1888 if (more_aggr_init_expr_args_p (&iter))
1889 pp_separate_with_comma (pp);
1890 }
1891 }
1892 pp_cxx_right_paren (pp);
1893 }
1894
1895 /* Print out a list of initializers (subr of dump_expr). */
1896
1897 static void
1898 dump_expr_list (cxx_pretty_printer *pp, tree l, int flags)
1899 {
1900 while (l)
1901 {
1902 dump_expr (pp, TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1903 l = TREE_CHAIN (l);
1904 if (l)
1905 pp_separate_with_comma (pp);
1906 }
1907 }
1908
1909 /* Print out a vector of initializers (subr of dump_expr). */
1910
1911 static void
1912 dump_expr_init_vec (cxx_pretty_printer *pp, vec<constructor_elt, va_gc> *v,
1913 int flags)
1914 {
1915 unsigned HOST_WIDE_INT idx;
1916 tree value;
1917
1918 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1919 {
1920 dump_expr (pp, value, flags | TFF_EXPR_IN_PARENS);
1921 if (idx != v->length () - 1)
1922 pp_separate_with_comma (pp);
1923 }
1924 }
1925
1926
1927 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1928 function. Resolve it to a close relative -- in the sense of static
1929 type -- variant being overridden. That is close to what was written in
1930 the source code. Subroutine of dump_expr. */
1931
1932 static tree
1933 resolve_virtual_fun_from_obj_type_ref (tree ref)
1934 {
1935 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1936 HOST_WIDE_INT index = tree_to_uhwi (OBJ_TYPE_REF_TOKEN (ref));
1937 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1938 while (index)
1939 {
1940 fun = TREE_CHAIN (fun);
1941 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1942 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1943 }
1944
1945 return BV_FN (fun);
1946 }
1947
1948 /* Print out an expression E under control of FLAGS. */
1949
1950 static void
1951 dump_expr (cxx_pretty_printer *pp, tree t, int flags)
1952 {
1953 tree op;
1954
1955 if (t == 0)
1956 return;
1957
1958 if (STATEMENT_CLASS_P (t))
1959 {
1960 pp_cxx_ws_string (pp, M_("<statement>"));
1961 return;
1962 }
1963
1964 switch (TREE_CODE (t))
1965 {
1966 case VAR_DECL:
1967 case PARM_DECL:
1968 case FIELD_DECL:
1969 case CONST_DECL:
1970 case FUNCTION_DECL:
1971 case TEMPLATE_DECL:
1972 case NAMESPACE_DECL:
1973 case LABEL_DECL:
1974 case OVERLOAD:
1975 case TYPE_DECL:
1976 case IDENTIFIER_NODE:
1977 dump_decl (pp, t, ((flags & ~(TFF_DECL_SPECIFIERS|TFF_RETURN_TYPE
1978 |TFF_TEMPLATE_HEADER))
1979 | TFF_NO_FUNCTION_ARGUMENTS));
1980 break;
1981
1982 case SSA_NAME:
1983 if (SSA_NAME_VAR (t)
1984 && !DECL_ARTIFICIAL (SSA_NAME_VAR (t)))
1985 dump_expr (pp, SSA_NAME_VAR (t), flags);
1986 else
1987 pp_cxx_ws_string (pp, M_("<unknown>"));
1988 break;
1989
1990 case VOID_CST:
1991 case INTEGER_CST:
1992 case REAL_CST:
1993 case STRING_CST:
1994 case COMPLEX_CST:
1995 pp->constant (t);
1996 break;
1997
1998 case USERDEF_LITERAL:
1999 pp_cxx_userdef_literal (pp, t);
2000 break;
2001
2002 case THROW_EXPR:
2003 /* While waiting for caret diagnostics, avoid printing
2004 __cxa_allocate_exception, __cxa_throw, and the like. */
2005 pp_cxx_ws_string (pp, M_("<throw-expression>"));
2006 break;
2007
2008 case PTRMEM_CST:
2009 pp_ampersand (pp);
2010 dump_type (pp, PTRMEM_CST_CLASS (t), flags);
2011 pp_cxx_colon_colon (pp);
2012 pp_cxx_tree_identifier (pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
2013 break;
2014
2015 case COMPOUND_EXPR:
2016 pp_cxx_left_paren (pp);
2017 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2018 pp_separate_with_comma (pp);
2019 dump_expr (pp, TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2020 pp_cxx_right_paren (pp);
2021 break;
2022
2023 case COND_EXPR:
2024 pp_cxx_left_paren (pp);
2025 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2026 pp_string (pp, " ? ");
2027 dump_expr (pp, TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2028 pp_string (pp, " : ");
2029 dump_expr (pp, TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
2030 pp_cxx_right_paren (pp);
2031 break;
2032
2033 case SAVE_EXPR:
2034 if (TREE_HAS_CONSTRUCTOR (t))
2035 {
2036 pp_cxx_ws_string (pp, "new");
2037 pp_cxx_whitespace (pp);
2038 dump_type (pp, TREE_TYPE (TREE_TYPE (t)), flags);
2039 }
2040 else
2041 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2042 break;
2043
2044 case AGGR_INIT_EXPR:
2045 {
2046 tree fn = NULL_TREE;
2047
2048 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
2049 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
2050
2051 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
2052 {
2053 if (DECL_CONSTRUCTOR_P (fn))
2054 dump_type (pp, DECL_CONTEXT (fn), flags);
2055 else
2056 dump_decl (pp, fn, 0);
2057 }
2058 else
2059 dump_expr (pp, AGGR_INIT_EXPR_FN (t), 0);
2060 }
2061 dump_aggr_init_expr_args (pp, t, flags, true);
2062 break;
2063
2064 case CALL_EXPR:
2065 {
2066 tree fn = CALL_EXPR_FN (t);
2067 bool skipfirst = false;
2068
2069 /* Deal with internal functions. */
2070 if (fn == NULL_TREE)
2071 {
2072 pp_string (pp, internal_fn_name (CALL_EXPR_IFN (t)));
2073 dump_call_expr_args (pp, t, flags, skipfirst);
2074 break;
2075 }
2076
2077 if (TREE_CODE (fn) == ADDR_EXPR)
2078 fn = TREE_OPERAND (fn, 0);
2079
2080 /* Nobody is interested in seeing the guts of vcalls. */
2081 if (TREE_CODE (fn) == OBJ_TYPE_REF)
2082 fn = resolve_virtual_fun_from_obj_type_ref (fn);
2083
2084 if (TREE_TYPE (fn) != NULL_TREE
2085 && NEXT_CODE (fn) == METHOD_TYPE
2086 && call_expr_nargs (t))
2087 {
2088 tree ob = CALL_EXPR_ARG (t, 0);
2089 if (TREE_CODE (ob) == ADDR_EXPR)
2090 {
2091 dump_expr (pp, TREE_OPERAND (ob, 0),
2092 flags | TFF_EXPR_IN_PARENS);
2093 pp_cxx_dot (pp);
2094 }
2095 else if (TREE_CODE (ob) != PARM_DECL
2096 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
2097 {
2098 dump_expr (pp, ob, flags | TFF_EXPR_IN_PARENS);
2099 pp_cxx_arrow (pp);
2100 }
2101 skipfirst = true;
2102 }
2103 if (flag_sanitize & SANITIZE_UNDEFINED
2104 && is_ubsan_builtin_p (fn))
2105 {
2106 pp_string (cxx_pp, M_("<ubsan routine call>"));
2107 break;
2108 }
2109 dump_expr (pp, fn, flags | TFF_EXPR_IN_PARENS);
2110 dump_call_expr_args (pp, t, flags, skipfirst);
2111 }
2112 break;
2113
2114 case TARGET_EXPR:
2115 /* Note that this only works for G++ target exprs. If somebody
2116 builds a general TARGET_EXPR, there's no way to represent that
2117 it initializes anything other that the parameter slot for the
2118 default argument. Note we may have cleared out the first
2119 operand in expand_expr, so don't go killing ourselves. */
2120 if (TREE_OPERAND (t, 1))
2121 dump_expr (pp, TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2122 break;
2123
2124 case POINTER_PLUS_EXPR:
2125 dump_binary_op (pp, "+", t, flags);
2126 break;
2127
2128 case INIT_EXPR:
2129 case MODIFY_EXPR:
2130 dump_binary_op (pp, assignment_operator_name_info[NOP_EXPR].name,
2131 t, flags);
2132 break;
2133
2134 case PLUS_EXPR:
2135 case MINUS_EXPR:
2136 case MULT_EXPR:
2137 case TRUNC_DIV_EXPR:
2138 case TRUNC_MOD_EXPR:
2139 case MIN_EXPR:
2140 case MAX_EXPR:
2141 case LSHIFT_EXPR:
2142 case RSHIFT_EXPR:
2143 case BIT_IOR_EXPR:
2144 case BIT_XOR_EXPR:
2145 case BIT_AND_EXPR:
2146 case TRUTH_ANDIF_EXPR:
2147 case TRUTH_ORIF_EXPR:
2148 case LT_EXPR:
2149 case LE_EXPR:
2150 case GT_EXPR:
2151 case GE_EXPR:
2152 case EQ_EXPR:
2153 case NE_EXPR:
2154 case EXACT_DIV_EXPR:
2155 dump_binary_op (pp, operator_name_info[TREE_CODE (t)].name, t, flags);
2156 break;
2157
2158 case CEIL_DIV_EXPR:
2159 case FLOOR_DIV_EXPR:
2160 case ROUND_DIV_EXPR:
2161 case RDIV_EXPR:
2162 dump_binary_op (pp, "/", t, flags);
2163 break;
2164
2165 case CEIL_MOD_EXPR:
2166 case FLOOR_MOD_EXPR:
2167 case ROUND_MOD_EXPR:
2168 dump_binary_op (pp, "%", t, flags);
2169 break;
2170
2171 case COMPONENT_REF:
2172 {
2173 tree ob = TREE_OPERAND (t, 0);
2174 if (INDIRECT_REF_P (ob))
2175 {
2176 ob = TREE_OPERAND (ob, 0);
2177 if (TREE_CODE (ob) != PARM_DECL
2178 || (DECL_NAME (ob)
2179 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
2180 {
2181 dump_expr (pp, ob, flags | TFF_EXPR_IN_PARENS);
2182 if (TREE_CODE (TREE_TYPE (ob)) == REFERENCE_TYPE)
2183 pp_cxx_dot (pp);
2184 else
2185 pp_cxx_arrow (pp);
2186 }
2187 }
2188 else
2189 {
2190 dump_expr (pp, ob, flags | TFF_EXPR_IN_PARENS);
2191 pp_cxx_dot (pp);
2192 }
2193 dump_expr (pp, TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
2194 }
2195 break;
2196
2197 case ARRAY_REF:
2198 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2199 pp_cxx_left_bracket (pp);
2200 dump_expr (pp, TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2201 pp_cxx_right_bracket (pp);
2202 break;
2203
2204 case ARRAY_NOTATION_REF:
2205 dump_expr (pp, ARRAY_NOTATION_ARRAY (t), flags | TFF_EXPR_IN_PARENS);
2206 pp_cxx_left_bracket (pp);
2207 dump_expr (pp, ARRAY_NOTATION_START (t), flags | TFF_EXPR_IN_PARENS);
2208 pp_colon (pp);
2209 dump_expr (pp, ARRAY_NOTATION_LENGTH (t), flags | TFF_EXPR_IN_PARENS);
2210 pp_colon (pp);
2211 dump_expr (pp, ARRAY_NOTATION_STRIDE (t), flags | TFF_EXPR_IN_PARENS);
2212 pp_cxx_right_bracket (pp);
2213 break;
2214
2215 case UNARY_PLUS_EXPR:
2216 dump_unary_op (pp, "+", t, flags);
2217 break;
2218
2219 case ADDR_EXPR:
2220 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
2221 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
2222 /* An ADDR_EXPR can have reference type. In that case, we
2223 shouldn't print the `&' doing so indicates to the user
2224 that the expression has pointer type. */
2225 || (TREE_TYPE (t)
2226 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
2227 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2228 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
2229 dump_unary_op (pp, "&&", t, flags);
2230 else
2231 dump_unary_op (pp, "&", t, flags);
2232 break;
2233
2234 case INDIRECT_REF:
2235 if (TREE_HAS_CONSTRUCTOR (t))
2236 {
2237 t = TREE_OPERAND (t, 0);
2238 gcc_assert (TREE_CODE (t) == CALL_EXPR);
2239 dump_expr (pp, CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
2240 dump_call_expr_args (pp, t, flags, true);
2241 }
2242 else
2243 {
2244 if (TREE_OPERAND (t,0) != NULL_TREE
2245 && TREE_TYPE (TREE_OPERAND (t, 0))
2246 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
2247 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2248 else
2249 dump_unary_op (pp, "*", t, flags);
2250 }
2251 break;
2252
2253 case MEM_REF:
2254 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR
2255 && integer_zerop (TREE_OPERAND (t, 1)))
2256 dump_expr (pp, TREE_OPERAND (TREE_OPERAND (t, 0), 0), flags);
2257 else
2258 {
2259 pp_cxx_star (pp);
2260 if (!integer_zerop (TREE_OPERAND (t, 1)))
2261 {
2262 pp_cxx_left_paren (pp);
2263 if (!integer_onep (TYPE_SIZE_UNIT
2264 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))))))
2265 {
2266 pp_cxx_left_paren (pp);
2267 dump_type (pp, ptr_type_node, flags);
2268 pp_cxx_right_paren (pp);
2269 }
2270 }
2271 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2272 if (!integer_zerop (TREE_OPERAND (t, 1)))
2273 {
2274 pp_cxx_ws_string (pp, "+");
2275 dump_expr (pp, fold_convert (ssizetype, TREE_OPERAND (t, 1)),
2276 flags);
2277 pp_cxx_right_paren (pp);
2278 }
2279 }
2280 break;
2281
2282 case NEGATE_EXPR:
2283 case BIT_NOT_EXPR:
2284 case TRUTH_NOT_EXPR:
2285 case PREDECREMENT_EXPR:
2286 case PREINCREMENT_EXPR:
2287 dump_unary_op (pp, operator_name_info [TREE_CODE (t)].name, t, flags);
2288 break;
2289
2290 case POSTDECREMENT_EXPR:
2291 case POSTINCREMENT_EXPR:
2292 pp_cxx_left_paren (pp);
2293 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2294 pp_cxx_ws_string (pp, operator_name_info[TREE_CODE (t)].name);
2295 pp_cxx_right_paren (pp);
2296 break;
2297
2298 case NON_LVALUE_EXPR:
2299 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
2300 should be another level of INDIRECT_REF so that I don't have to do
2301 this. */
2302 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
2303 {
2304 tree next = TREE_TYPE (TREE_TYPE (t));
2305
2306 while (TYPE_PTR_P (next))
2307 next = TREE_TYPE (next);
2308
2309 if (TREE_CODE (next) == FUNCTION_TYPE)
2310 {
2311 if (flags & TFF_EXPR_IN_PARENS)
2312 pp_cxx_left_paren (pp);
2313 pp_cxx_star (pp);
2314 dump_expr (pp, TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2315 if (flags & TFF_EXPR_IN_PARENS)
2316 pp_cxx_right_paren (pp);
2317 break;
2318 }
2319 /* Else fall through. */
2320 }
2321 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2322 break;
2323
2324 CASE_CONVERT:
2325 case IMPLICIT_CONV_EXPR:
2326 case VIEW_CONVERT_EXPR:
2327 {
2328 tree op = TREE_OPERAND (t, 0);
2329 tree ttype = TREE_TYPE (t);
2330 tree optype = TREE_TYPE (op);
2331
2332 if (TREE_CODE (ttype) != TREE_CODE (optype)
2333 && POINTER_TYPE_P (ttype)
2334 && POINTER_TYPE_P (optype)
2335 && same_type_p (TREE_TYPE (optype),
2336 TREE_TYPE (ttype)))
2337 {
2338 if (TREE_CODE (ttype) == REFERENCE_TYPE)
2339 {
2340 STRIP_NOPS (op);
2341 if (TREE_CODE (op) == ADDR_EXPR)
2342 dump_expr (pp, TREE_OPERAND (op, 0), flags);
2343 else
2344 dump_unary_op (pp, "*", t, flags);
2345 }
2346 else
2347 dump_unary_op (pp, "&", t, flags);
2348 }
2349 else if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
2350 {
2351 /* It is a cast, but we cannot tell whether it is a
2352 reinterpret or static cast. Use the C style notation. */
2353 if (flags & TFF_EXPR_IN_PARENS)
2354 pp_cxx_left_paren (pp);
2355 pp_cxx_left_paren (pp);
2356 dump_type (pp, TREE_TYPE (t), flags);
2357 pp_cxx_right_paren (pp);
2358 dump_expr (pp, op, flags | TFF_EXPR_IN_PARENS);
2359 if (flags & TFF_EXPR_IN_PARENS)
2360 pp_cxx_right_paren (pp);
2361 }
2362 else
2363 dump_expr (pp, op, flags);
2364 break;
2365 }
2366
2367 case CONSTRUCTOR:
2368 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
2369 {
2370 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
2371
2372 if (integer_zerop (idx))
2373 {
2374 /* A NULL pointer-to-member constant. */
2375 pp_cxx_left_paren (pp);
2376 pp_cxx_left_paren (pp);
2377 dump_type (pp, TREE_TYPE (t), flags);
2378 pp_cxx_right_paren (pp);
2379 pp_character (pp, '0');
2380 pp_cxx_right_paren (pp);
2381 break;
2382 }
2383 else if (tree_fits_shwi_p (idx))
2384 {
2385 tree virtuals;
2386 unsigned HOST_WIDE_INT n;
2387
2388 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
2389 t = TYPE_METHOD_BASETYPE (t);
2390 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
2391
2392 n = tree_to_shwi (idx);
2393
2394 /* Map vtable index back one, to allow for the null pointer to
2395 member. */
2396 --n;
2397
2398 while (n > 0 && virtuals)
2399 {
2400 --n;
2401 virtuals = TREE_CHAIN (virtuals);
2402 }
2403 if (virtuals)
2404 {
2405 dump_expr (pp, BV_FN (virtuals),
2406 flags | TFF_EXPR_IN_PARENS);
2407 break;
2408 }
2409 }
2410 }
2411 if (TREE_TYPE (t) && LAMBDA_TYPE_P (TREE_TYPE (t)))
2412 pp_string (pp, "<lambda closure object>");
2413 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
2414 {
2415 dump_type (pp, TREE_TYPE (t), 0);
2416 pp_cxx_left_paren (pp);
2417 pp_cxx_right_paren (pp);
2418 }
2419 else
2420 {
2421 if (!BRACE_ENCLOSED_INITIALIZER_P (t))
2422 dump_type (pp, TREE_TYPE (t), 0);
2423 pp_cxx_left_brace (pp);
2424 dump_expr_init_vec (pp, CONSTRUCTOR_ELTS (t), flags);
2425 pp_cxx_right_brace (pp);
2426 }
2427
2428 break;
2429
2430 case OFFSET_REF:
2431 {
2432 tree ob = TREE_OPERAND (t, 0);
2433 if (is_dummy_object (ob))
2434 {
2435 t = TREE_OPERAND (t, 1);
2436 if (TREE_CODE (t) == FUNCTION_DECL)
2437 /* A::f */
2438 dump_expr (pp, t, flags | TFF_EXPR_IN_PARENS);
2439 else if (BASELINK_P (t))
2440 dump_expr (pp, OVL_CURRENT (BASELINK_FUNCTIONS (t)),
2441 flags | TFF_EXPR_IN_PARENS);
2442 else
2443 dump_decl (pp, t, flags);
2444 }
2445 else
2446 {
2447 if (INDIRECT_REF_P (ob))
2448 {
2449 dump_expr (pp, TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
2450 pp_cxx_arrow (pp);
2451 pp_cxx_star (pp);
2452 }
2453 else
2454 {
2455 dump_expr (pp, ob, flags | TFF_EXPR_IN_PARENS);
2456 pp_cxx_dot (pp);
2457 pp_cxx_star (pp);
2458 }
2459 dump_expr (pp, TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2460 }
2461 break;
2462 }
2463
2464 case TEMPLATE_PARM_INDEX:
2465 dump_decl (pp, TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
2466 break;
2467
2468 case CAST_EXPR:
2469 if (TREE_OPERAND (t, 0) == NULL_TREE
2470 || TREE_CHAIN (TREE_OPERAND (t, 0)))
2471 {
2472 dump_type (pp, TREE_TYPE (t), flags);
2473 pp_cxx_left_paren (pp);
2474 dump_expr_list (pp, TREE_OPERAND (t, 0), flags);
2475 pp_cxx_right_paren (pp);
2476 }
2477 else
2478 {
2479 pp_cxx_left_paren (pp);
2480 dump_type (pp, TREE_TYPE (t), flags);
2481 pp_cxx_right_paren (pp);
2482 pp_cxx_left_paren (pp);
2483 dump_expr_list (pp, TREE_OPERAND (t, 0), flags);
2484 pp_cxx_right_paren (pp);
2485 }
2486 break;
2487
2488 case STATIC_CAST_EXPR:
2489 pp_cxx_ws_string (pp, "static_cast");
2490 goto cast;
2491 case REINTERPRET_CAST_EXPR:
2492 pp_cxx_ws_string (pp, "reinterpret_cast");
2493 goto cast;
2494 case CONST_CAST_EXPR:
2495 pp_cxx_ws_string (pp, "const_cast");
2496 goto cast;
2497 case DYNAMIC_CAST_EXPR:
2498 pp_cxx_ws_string (pp, "dynamic_cast");
2499 cast:
2500 pp_cxx_begin_template_argument_list (pp);
2501 dump_type (pp, TREE_TYPE (t), flags);
2502 pp_cxx_end_template_argument_list (pp);
2503 pp_cxx_left_paren (pp);
2504 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2505 pp_cxx_right_paren (pp);
2506 break;
2507
2508 case ARROW_EXPR:
2509 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2510 pp_cxx_arrow (pp);
2511 break;
2512
2513 case SIZEOF_EXPR:
2514 case ALIGNOF_EXPR:
2515 if (TREE_CODE (t) == SIZEOF_EXPR)
2516 pp_cxx_ws_string (pp, "sizeof");
2517 else
2518 {
2519 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
2520 pp_cxx_ws_string (pp, "__alignof__");
2521 }
2522 op = TREE_OPERAND (t, 0);
2523 if (PACK_EXPANSION_P (op))
2524 {
2525 pp_string (pp, "...");
2526 op = PACK_EXPANSION_PATTERN (op);
2527 }
2528 pp_cxx_whitespace (pp);
2529 pp_cxx_left_paren (pp);
2530 if (TREE_CODE (t) == SIZEOF_EXPR && SIZEOF_EXPR_TYPE_P (t))
2531 dump_type (pp, TREE_TYPE (op), flags);
2532 else if (TYPE_P (TREE_OPERAND (t, 0)))
2533 dump_type (pp, op, flags);
2534 else
2535 dump_expr (pp, op, flags);
2536 pp_cxx_right_paren (pp);
2537 break;
2538
2539 case AT_ENCODE_EXPR:
2540 pp_cxx_ws_string (pp, "@encode");
2541 pp_cxx_whitespace (pp);
2542 pp_cxx_left_paren (pp);
2543 dump_type (pp, TREE_OPERAND (t, 0), flags);
2544 pp_cxx_right_paren (pp);
2545 break;
2546
2547 case NOEXCEPT_EXPR:
2548 pp_cxx_ws_string (pp, "noexcept");
2549 pp_cxx_whitespace (pp);
2550 pp_cxx_left_paren (pp);
2551 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2552 pp_cxx_right_paren (pp);
2553 break;
2554
2555 case REALPART_EXPR:
2556 case IMAGPART_EXPR:
2557 pp_cxx_ws_string (pp, operator_name_info[TREE_CODE (t)].name);
2558 pp_cxx_whitespace (pp);
2559 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2560 break;
2561
2562 case DEFAULT_ARG:
2563 pp_string (pp, M_("<unparsed>"));
2564 break;
2565
2566 case TRY_CATCH_EXPR:
2567 case WITH_CLEANUP_EXPR:
2568 case CLEANUP_POINT_EXPR:
2569 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2570 break;
2571
2572 case PSEUDO_DTOR_EXPR:
2573 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2574 pp_cxx_dot (pp);
2575 if (TREE_OPERAND (t, 1))
2576 {
2577 dump_type (pp, TREE_OPERAND (t, 1), flags);
2578 pp_cxx_colon_colon (pp);
2579 }
2580 pp_cxx_complement (pp);
2581 dump_type (pp, TREE_OPERAND (t, 2), flags);
2582 break;
2583
2584 case TEMPLATE_ID_EXPR:
2585 dump_decl (pp, t, flags);
2586 break;
2587
2588 case BIND_EXPR:
2589 case STMT_EXPR:
2590 case EXPR_STMT:
2591 case STATEMENT_LIST:
2592 /* We don't yet have a way of dumping statements in a
2593 human-readable format. */
2594 pp_string (pp, "({...})");
2595 break;
2596
2597 case LOOP_EXPR:
2598 pp_string (pp, "while (1) { ");
2599 dump_expr (pp, TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2600 pp_cxx_right_brace (pp);
2601 break;
2602
2603 case EXIT_EXPR:
2604 pp_string (pp, "if (");
2605 dump_expr (pp, TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2606 pp_string (pp, ") break; ");
2607 break;
2608
2609 case BASELINK:
2610 dump_expr (pp, BASELINK_FUNCTIONS (t), flags & ~TFF_EXPR_IN_PARENS);
2611 break;
2612
2613 case EMPTY_CLASS_EXPR:
2614 dump_type (pp, TREE_TYPE (t), flags);
2615 pp_cxx_left_paren (pp);
2616 pp_cxx_right_paren (pp);
2617 break;
2618
2619 case NON_DEPENDENT_EXPR:
2620 dump_expr (pp, TREE_OPERAND (t, 0), flags);
2621 break;
2622
2623 case ARGUMENT_PACK_SELECT:
2624 dump_template_argument (pp, ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2625 break;
2626
2627 case RECORD_TYPE:
2628 case UNION_TYPE:
2629 case ENUMERAL_TYPE:
2630 case REAL_TYPE:
2631 case VOID_TYPE:
2632 case BOOLEAN_TYPE:
2633 case INTEGER_TYPE:
2634 case COMPLEX_TYPE:
2635 case VECTOR_TYPE:
2636 pp_type_specifier_seq (pp, t);
2637 break;
2638
2639 case TYPENAME_TYPE:
2640 /* We get here when we want to print a dependent type as an
2641 id-expression, without any disambiguator decoration. */
2642 pp->id_expression (t);
2643 break;
2644
2645 case TEMPLATE_TYPE_PARM:
2646 case TEMPLATE_TEMPLATE_PARM:
2647 case BOUND_TEMPLATE_TEMPLATE_PARM:
2648 dump_type (pp, t, flags);
2649 break;
2650
2651 case TRAIT_EXPR:
2652 pp_cxx_trait_expression (pp, t);
2653 break;
2654
2655 case VA_ARG_EXPR:
2656 pp_cxx_va_arg_expression (pp, t);
2657 break;
2658
2659 case OFFSETOF_EXPR:
2660 pp_cxx_offsetof_expression (pp, t);
2661 break;
2662
2663 case SCOPE_REF:
2664 dump_decl (pp, t, flags);
2665 break;
2666
2667 case EXPR_PACK_EXPANSION:
2668 case TYPEID_EXPR:
2669 case MEMBER_REF:
2670 case DOTSTAR_EXPR:
2671 case NEW_EXPR:
2672 case VEC_NEW_EXPR:
2673 case DELETE_EXPR:
2674 case VEC_DELETE_EXPR:
2675 case MODOP_EXPR:
2676 case ABS_EXPR:
2677 case CONJ_EXPR:
2678 case VECTOR_CST:
2679 case FIXED_CST:
2680 case UNORDERED_EXPR:
2681 case ORDERED_EXPR:
2682 case UNLT_EXPR:
2683 case UNLE_EXPR:
2684 case UNGT_EXPR:
2685 case UNGE_EXPR:
2686 case UNEQ_EXPR:
2687 case LTGT_EXPR:
2688 case COMPLEX_EXPR:
2689 case BIT_FIELD_REF:
2690 case FIX_TRUNC_EXPR:
2691 case FLOAT_EXPR:
2692 pp->expression (t);
2693 break;
2694
2695 case TRUTH_AND_EXPR:
2696 case TRUTH_OR_EXPR:
2697 case TRUTH_XOR_EXPR:
2698 if (flags & TFF_EXPR_IN_PARENS)
2699 pp_cxx_left_paren (pp);
2700 pp->expression (t);
2701 if (flags & TFF_EXPR_IN_PARENS)
2702 pp_cxx_right_paren (pp);
2703 break;
2704
2705 case OBJ_TYPE_REF:
2706 dump_expr (pp, resolve_virtual_fun_from_obj_type_ref (t), flags);
2707 break;
2708
2709 case LAMBDA_EXPR:
2710 pp_string (pp, M_("<lambda>"));
2711 break;
2712
2713 case PAREN_EXPR:
2714 pp_cxx_left_paren (pp);
2715 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2716 pp_cxx_right_paren (pp);
2717 break;
2718
2719 case REQUIRES_EXPR:
2720 pp_cxx_requires_expr (cxx_pp, t);
2721 break;
2722
2723 case SIMPLE_REQ:
2724 pp_cxx_simple_requirement (cxx_pp, t);
2725 break;
2726
2727 case TYPE_REQ:
2728 pp_cxx_type_requirement (cxx_pp, t);
2729 break;
2730
2731 case COMPOUND_REQ:
2732 pp_cxx_compound_requirement (cxx_pp, t);
2733 break;
2734
2735 case NESTED_REQ:
2736 pp_cxx_nested_requirement (cxx_pp, t);
2737 break;
2738
2739 case PRED_CONSTR:
2740 case EXPR_CONSTR:
2741 case TYPE_CONSTR:
2742 case ICONV_CONSTR:
2743 case DEDUCT_CONSTR:
2744 case EXCEPT_CONSTR:
2745 case PARM_CONSTR:
2746 case CONJ_CONSTR:
2747 case DISJ_CONSTR:
2748 pp_cxx_constraint (cxx_pp, t);
2749 break;
2750
2751 case PLACEHOLDER_EXPR:
2752 pp_string (pp, M_("*this"));
2753 break;
2754
2755 /* This list is incomplete, but should suffice for now.
2756 It is very important that `sorry' does not call
2757 `report_error_function'. That could cause an infinite loop. */
2758 default:
2759 pp_unsupported_tree (pp, t);
2760 /* fall through to ERROR_MARK... */
2761 case ERROR_MARK:
2762 pp_string (pp, M_("<expression error>"));
2763 break;
2764 }
2765 }
2766
2767 static void
2768 dump_binary_op (cxx_pretty_printer *pp, const char *opstring, tree t,
2769 int flags)
2770 {
2771 pp_cxx_left_paren (pp);
2772 dump_expr (pp, TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2773 pp_cxx_whitespace (pp);
2774 if (opstring)
2775 pp_cxx_ws_string (pp, opstring);
2776 else
2777 pp_string (pp, M_("<unknown operator>"));
2778 pp_cxx_whitespace (pp);
2779 dump_expr (pp, TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2780 pp_cxx_right_paren (pp);
2781 }
2782
2783 static void
2784 dump_unary_op (cxx_pretty_printer *pp, const char *opstring, tree t, int flags)
2785 {
2786 if (flags & TFF_EXPR_IN_PARENS)
2787 pp_cxx_left_paren (pp);
2788 pp_cxx_ws_string (pp, opstring);
2789 dump_expr (pp, TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2790 if (flags & TFF_EXPR_IN_PARENS)
2791 pp_cxx_right_paren (pp);
2792 }
2793
2794 static void
2795 reinit_cxx_pp (void)
2796 {
2797 pp_clear_output_area (cxx_pp);
2798 cxx_pp->padding = pp_none;
2799 pp_indentation (cxx_pp) = 0;
2800 pp_needs_newline (cxx_pp) = false;
2801 cxx_pp->enclosing_scope = current_function_decl;
2802 }
2803
2804 /* Same as pp_formatted_text, except the return string is a separate
2805 copy and has a GGC storage duration, e.g. an indefinite lifetime. */
2806
2807 inline const char *
2808 pp_ggc_formatted_text (pretty_printer *pp)
2809 {
2810 return ggc_strdup (pp_formatted_text (pp));
2811 }
2812
2813 /* Exported interface to stringifying types, exprs and decls under TFF_*
2814 control. */
2815
2816 const char *
2817 type_as_string (tree typ, int flags)
2818 {
2819 reinit_cxx_pp ();
2820 pp_translate_identifiers (cxx_pp) = false;
2821 dump_type (cxx_pp, typ, flags);
2822 return pp_ggc_formatted_text (cxx_pp);
2823 }
2824
2825 const char *
2826 type_as_string_translate (tree typ, int flags)
2827 {
2828 reinit_cxx_pp ();
2829 dump_type (cxx_pp, typ, flags);
2830 return pp_ggc_formatted_text (cxx_pp);
2831 }
2832
2833 const char *
2834 expr_as_string (tree decl, int flags)
2835 {
2836 reinit_cxx_pp ();
2837 pp_translate_identifiers (cxx_pp) = false;
2838 dump_expr (cxx_pp, decl, flags);
2839 return pp_ggc_formatted_text (cxx_pp);
2840 }
2841
2842 /* Wrap decl_as_string with options appropriate for dwarf. */
2843
2844 const char *
2845 decl_as_dwarf_string (tree decl, int flags)
2846 {
2847 const char *name;
2848 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2849 here will be adequate to get the desired behaviour. */
2850 cxx_pp->flags |= pp_c_flag_gnu_v3;
2851 name = decl_as_string (decl, flags);
2852 /* Subsequent calls to the pretty printer shouldn't use this style. */
2853 cxx_pp->flags &= ~pp_c_flag_gnu_v3;
2854 return name;
2855 }
2856
2857 const char *
2858 decl_as_string (tree decl, int flags)
2859 {
2860 reinit_cxx_pp ();
2861 pp_translate_identifiers (cxx_pp) = false;
2862 dump_decl (cxx_pp, decl, flags);
2863 return pp_ggc_formatted_text (cxx_pp);
2864 }
2865
2866 const char *
2867 decl_as_string_translate (tree decl, int flags)
2868 {
2869 reinit_cxx_pp ();
2870 dump_decl (cxx_pp, decl, flags);
2871 return pp_ggc_formatted_text (cxx_pp);
2872 }
2873
2874 /* Wrap lang_decl_name with options appropriate for dwarf. */
2875
2876 const char *
2877 lang_decl_dwarf_name (tree decl, int v, bool translate)
2878 {
2879 const char *name;
2880 /* Curiously, reinit_cxx_pp doesn't reset the flags field, so setting the flag
2881 here will be adequate to get the desired behaviour. */
2882 cxx_pp->flags |= pp_c_flag_gnu_v3;
2883 name = lang_decl_name (decl, v, translate);
2884 /* Subsequent calls to the pretty printer shouldn't use this style. */
2885 cxx_pp->flags &= ~pp_c_flag_gnu_v3;
2886 return name;
2887 }
2888
2889 /* Generate the three forms of printable names for cxx_printable_name. */
2890
2891 const char *
2892 lang_decl_name (tree decl, int v, bool translate)
2893 {
2894 if (v >= 2)
2895 return (translate
2896 ? decl_as_string_translate (decl, TFF_DECL_SPECIFIERS)
2897 : decl_as_string (decl, TFF_DECL_SPECIFIERS));
2898
2899 reinit_cxx_pp ();
2900 pp_translate_identifiers (cxx_pp) = translate;
2901 if (v == 1
2902 && (DECL_CLASS_SCOPE_P (decl)
2903 || (DECL_NAMESPACE_SCOPE_P (decl)
2904 && CP_DECL_CONTEXT (decl) != global_namespace)))
2905 {
2906 dump_type (cxx_pp, CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2907 pp_cxx_colon_colon (cxx_pp);
2908 }
2909
2910 if (TREE_CODE (decl) == FUNCTION_DECL)
2911 dump_function_name (cxx_pp, decl, TFF_PLAIN_IDENTIFIER);
2912 else if ((DECL_NAME (decl) == NULL_TREE)
2913 && TREE_CODE (decl) == NAMESPACE_DECL)
2914 dump_decl (cxx_pp, decl, TFF_PLAIN_IDENTIFIER | TFF_UNQUALIFIED_NAME);
2915 else
2916 dump_decl (cxx_pp, DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2917
2918 return pp_ggc_formatted_text (cxx_pp);
2919 }
2920
2921 /* Return the location of a tree passed to %+ formats. */
2922
2923 location_t
2924 location_of (tree t)
2925 {
2926 if (TYPE_P (t))
2927 {
2928 t = TYPE_MAIN_DECL (t);
2929 if (t == NULL_TREE)
2930 return input_location;
2931 }
2932 else if (TREE_CODE (t) == OVERLOAD)
2933 t = OVL_FUNCTION (t);
2934
2935 if (DECL_P (t))
2936 return DECL_SOURCE_LOCATION (t);
2937 return EXPR_LOC_OR_LOC (t, input_location);
2938 }
2939
2940 /* Now the interfaces from error et al to dump_type et al. Each takes an
2941 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2942 function. */
2943
2944 static const char *
2945 decl_to_string (tree decl, int verbose)
2946 {
2947 int flags = 0;
2948
2949 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2950 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2951 flags = TFF_CLASS_KEY_OR_ENUM;
2952 if (verbose)
2953 flags |= TFF_DECL_SPECIFIERS;
2954 else if (TREE_CODE (decl) == FUNCTION_DECL)
2955 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2956 flags |= TFF_TEMPLATE_HEADER;
2957
2958 reinit_cxx_pp ();
2959 dump_decl (cxx_pp, decl, flags);
2960 return pp_ggc_formatted_text (cxx_pp);
2961 }
2962
2963 static const char *
2964 expr_to_string (tree decl)
2965 {
2966 reinit_cxx_pp ();
2967 dump_expr (cxx_pp, decl, 0);
2968 return pp_ggc_formatted_text (cxx_pp);
2969 }
2970
2971 static const char *
2972 fndecl_to_string (tree fndecl, int verbose)
2973 {
2974 int flags;
2975
2976 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2977 | TFF_TEMPLATE_HEADER;
2978 if (verbose)
2979 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2980 reinit_cxx_pp ();
2981 dump_decl (cxx_pp, fndecl, flags);
2982 return pp_ggc_formatted_text (cxx_pp);
2983 }
2984
2985
2986 static const char *
2987 code_to_string (enum tree_code c)
2988 {
2989 return get_tree_code_name (c);
2990 }
2991
2992 const char *
2993 language_to_string (enum languages c)
2994 {
2995 switch (c)
2996 {
2997 case lang_c:
2998 return "C";
2999
3000 case lang_cplusplus:
3001 return "C++";
3002
3003 case lang_java:
3004 return "Java";
3005
3006 default:
3007 gcc_unreachable ();
3008 }
3009 return NULL;
3010 }
3011
3012 /* Return the proper printed version of a parameter to a C++ function. */
3013
3014 static const char *
3015 parm_to_string (int p)
3016 {
3017 reinit_cxx_pp ();
3018 if (p < 0)
3019 pp_string (cxx_pp, "'this'");
3020 else
3021 pp_decimal_int (cxx_pp, p + 1);
3022 return pp_ggc_formatted_text (cxx_pp);
3023 }
3024
3025 static const char *
3026 op_to_string (enum tree_code p)
3027 {
3028 tree id = operator_name_info[p].identifier;
3029 return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
3030 }
3031
3032 static const char *
3033 type_to_string (tree typ, int verbose)
3034 {
3035 int flags = 0;
3036 if (verbose)
3037 flags |= TFF_CLASS_KEY_OR_ENUM;
3038 flags |= TFF_TEMPLATE_HEADER;
3039
3040 reinit_cxx_pp ();
3041 dump_type (cxx_pp, typ, flags);
3042 /* If we're printing a type that involves typedefs, also print the
3043 stripped version. But sometimes the stripped version looks
3044 exactly the same, so we don't want it after all. To avoid printing
3045 it in that case, we play ugly obstack games. */
3046 if (typ && TYPE_P (typ) && typ != TYPE_CANONICAL (typ)
3047 && !uses_template_parms (typ))
3048 {
3049 int aka_start, aka_len; char *p;
3050 struct obstack *ob = pp_buffer (cxx_pp)->obstack;
3051 /* Remember the end of the initial dump. */
3052 int len = obstack_object_size (ob);
3053 tree aka = strip_typedefs (typ);
3054 pp_string (cxx_pp, " {aka");
3055 pp_cxx_whitespace (cxx_pp);
3056 /* And remember the start of the aka dump. */
3057 aka_start = obstack_object_size (ob);
3058 dump_type (cxx_pp, aka, flags);
3059 aka_len = obstack_object_size (ob) - aka_start;
3060 pp_right_brace (cxx_pp);
3061 p = (char*)obstack_base (ob);
3062 /* If they are identical, cut off the aka with a NUL. */
3063 if (len == aka_len && memcmp (p, p+aka_start, len) == 0)
3064 p[len] = '\0';
3065 }
3066 return pp_ggc_formatted_text (cxx_pp);
3067 }
3068
3069 static const char *
3070 assop_to_string (enum tree_code p)
3071 {
3072 tree id = assignment_operator_name_info[(int) p].identifier;
3073 return id ? IDENTIFIER_POINTER (id) : M_("{unknown}");
3074 }
3075
3076 static const char *
3077 args_to_string (tree p, int verbose)
3078 {
3079 int flags = 0;
3080 if (verbose)
3081 flags |= TFF_CLASS_KEY_OR_ENUM;
3082
3083 if (p == NULL_TREE)
3084 return "";
3085
3086 if (TYPE_P (TREE_VALUE (p)))
3087 return type_as_string_translate (p, flags);
3088
3089 reinit_cxx_pp ();
3090 for (; p; p = TREE_CHAIN (p))
3091 {
3092 if (TREE_VALUE (p) == null_node)
3093 pp_cxx_ws_string (cxx_pp, "NULL");
3094 else
3095 dump_type (cxx_pp, error_type (TREE_VALUE (p)), flags);
3096 if (TREE_CHAIN (p))
3097 pp_separate_with_comma (cxx_pp);
3098 }
3099 return pp_ggc_formatted_text (cxx_pp);
3100 }
3101
3102 /* Pretty-print a deduction substitution (from deduction_tsubst_fntype). P
3103 is a TREE_LIST with purpose the TEMPLATE_DECL, value the template
3104 arguments. */
3105
3106 static const char *
3107 subst_to_string (tree p)
3108 {
3109 tree decl = TREE_PURPOSE (p);
3110 tree targs = TREE_VALUE (p);
3111 tree tparms = DECL_TEMPLATE_PARMS (decl);
3112 int flags = (TFF_DECL_SPECIFIERS|TFF_TEMPLATE_HEADER
3113 |TFF_NO_TEMPLATE_BINDINGS);
3114
3115 if (p == NULL_TREE)
3116 return "";
3117
3118 reinit_cxx_pp ();
3119 dump_template_decl (cxx_pp, TREE_PURPOSE (p), flags);
3120 dump_substitution (cxx_pp, NULL, tparms, targs, /*flags=*/0);
3121 return pp_ggc_formatted_text (cxx_pp);
3122 }
3123
3124 static const char *
3125 cv_to_string (tree p, int v)
3126 {
3127 reinit_cxx_pp ();
3128 cxx_pp->padding = v ? pp_before : pp_none;
3129 pp_cxx_cv_qualifier_seq (cxx_pp, p);
3130 return pp_ggc_formatted_text (cxx_pp);
3131 }
3132
3133 static const char *
3134 eh_spec_to_string (tree p, int /*v*/)
3135 {
3136 int flags = 0;
3137 reinit_cxx_pp ();
3138 dump_exception_spec (cxx_pp, p, flags);
3139 return pp_ggc_formatted_text (cxx_pp);
3140 }
3141
3142 /* Langhook for print_error_function. */
3143 void
3144 cxx_print_error_function (diagnostic_context *context, const char *file,
3145 diagnostic_info *diagnostic)
3146 {
3147 lhd_print_error_function (context, file, diagnostic);
3148 pp_set_prefix (context->printer, file);
3149 maybe_print_instantiation_context (context);
3150 }
3151
3152 static void
3153 cp_diagnostic_starter (diagnostic_context *context,
3154 diagnostic_info *diagnostic)
3155 {
3156 diagnostic_report_current_module (context, diagnostic_location (diagnostic));
3157 cp_print_error_function (context, diagnostic);
3158 maybe_print_instantiation_context (context);
3159 maybe_print_constexpr_context (context);
3160 pp_set_prefix (context->printer, diagnostic_build_prefix (context,
3161 diagnostic));
3162 }
3163
3164 /* Print current function onto BUFFER, in the process of reporting
3165 a diagnostic message. Called from cp_diagnostic_starter. */
3166 static void
3167 cp_print_error_function (diagnostic_context *context,
3168 diagnostic_info *diagnostic)
3169 {
3170 /* If we are in an instantiation context, current_function_decl is likely
3171 to be wrong, so just rely on print_instantiation_full_context. */
3172 if (current_instantiation ())
3173 return;
3174 if (diagnostic_last_function_changed (context, diagnostic))
3175 {
3176 const char *old_prefix = context->printer->prefix;
3177 const char *file = LOCATION_FILE (diagnostic_location (diagnostic));
3178 tree abstract_origin = diagnostic_abstract_origin (diagnostic);
3179 char *new_prefix = (file && abstract_origin == NULL)
3180 ? file_name_as_prefix (context, file) : NULL;
3181
3182 pp_set_prefix (context->printer, new_prefix);
3183
3184 if (current_function_decl == NULL)
3185 pp_string (context->printer, _("At global scope:"));
3186 else
3187 {
3188 tree fndecl, ao;
3189
3190 if (abstract_origin)
3191 {
3192 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
3193 while (TREE_CODE (ao) == BLOCK
3194 && BLOCK_ABSTRACT_ORIGIN (ao)
3195 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
3196 ao = BLOCK_ABSTRACT_ORIGIN (ao);
3197 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
3198 fndecl = ao;
3199 }
3200 else
3201 fndecl = current_function_decl;
3202
3203 pp_printf (context->printer, function_category (fndecl),
3204 cxx_printable_name_translate (fndecl, 2));
3205
3206 while (abstract_origin)
3207 {
3208 location_t *locus;
3209 tree block = abstract_origin;
3210
3211 locus = &BLOCK_SOURCE_LOCATION (block);
3212 fndecl = NULL;
3213 block = BLOCK_SUPERCONTEXT (block);
3214 while (block && TREE_CODE (block) == BLOCK
3215 && BLOCK_ABSTRACT_ORIGIN (block))
3216 {
3217 ao = BLOCK_ABSTRACT_ORIGIN (block);
3218
3219 while (TREE_CODE (ao) == BLOCK
3220 && BLOCK_ABSTRACT_ORIGIN (ao)
3221 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
3222 ao = BLOCK_ABSTRACT_ORIGIN (ao);
3223
3224 if (TREE_CODE (ao) == FUNCTION_DECL)
3225 {
3226 fndecl = ao;
3227 break;
3228 }
3229 else if (TREE_CODE (ao) != BLOCK)
3230 break;
3231
3232 block = BLOCK_SUPERCONTEXT (block);
3233 }
3234 if (fndecl)
3235 abstract_origin = block;
3236 else
3237 {
3238 while (block && TREE_CODE (block) == BLOCK)
3239 block = BLOCK_SUPERCONTEXT (block);
3240
3241 if (block && TREE_CODE (block) == FUNCTION_DECL)
3242 fndecl = block;
3243 abstract_origin = NULL;
3244 }
3245 if (fndecl)
3246 {
3247 expanded_location s = expand_location (*locus);
3248 pp_character (context->printer, ',');
3249 pp_newline (context->printer);
3250 if (s.file != NULL)
3251 {
3252 if (context->show_column && s.column != 0)
3253 pp_printf (context->printer,
3254 _(" inlined from %qs at %r%s:%d:%d%R"),
3255 cxx_printable_name_translate (fndecl, 2),
3256 "locus", s.file, s.line, s.column);
3257 else
3258 pp_printf (context->printer,
3259 _(" inlined from %qs at %r%s:%d%R"),
3260 cxx_printable_name_translate (fndecl, 2),
3261 "locus", s.file, s.line);
3262
3263 }
3264 else
3265 pp_printf (context->printer, _(" inlined from %qs"),
3266 cxx_printable_name_translate (fndecl, 2));
3267 }
3268 }
3269 pp_character (context->printer, ':');
3270 }
3271 pp_newline (context->printer);
3272
3273 diagnostic_set_last_function (context, diagnostic);
3274 pp_destroy_prefix (context->printer);
3275 context->printer->prefix = old_prefix;
3276 }
3277 }
3278
3279 /* Returns a description of FUNCTION using standard terminology. The
3280 result is a format string of the form "In CATEGORY %qs". */
3281 static const char *
3282 function_category (tree fn)
3283 {
3284 /* We can get called from the middle-end for diagnostics of function
3285 clones. Make sure we have language specific information before
3286 dereferencing it. */
3287 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn))
3288 && DECL_FUNCTION_MEMBER_P (fn))
3289 {
3290 if (DECL_STATIC_FUNCTION_P (fn))
3291 return _("In static member function %qs");
3292 else if (DECL_COPY_CONSTRUCTOR_P (fn))
3293 return _("In copy constructor %qs");
3294 else if (DECL_CONSTRUCTOR_P (fn))
3295 return _("In constructor %qs");
3296 else if (DECL_DESTRUCTOR_P (fn))
3297 return _("In destructor %qs");
3298 else if (LAMBDA_FUNCTION_P (fn))
3299 return _("In lambda function");
3300 else
3301 return _("In member function %qs");
3302 }
3303 else
3304 return _("In function %qs");
3305 }
3306
3307 /* Report the full context of a current template instantiation,
3308 onto BUFFER. */
3309 static void
3310 print_instantiation_full_context (diagnostic_context *context)
3311 {
3312 struct tinst_level *p = current_instantiation ();
3313 location_t location = input_location;
3314
3315 if (p)
3316 {
3317 pp_verbatim (context->printer,
3318 TREE_CODE (p->decl) == TREE_LIST
3319 ? _("%s: In substitution of %qS:\n")
3320 : _("%s: In instantiation of %q#D:\n"),
3321 LOCATION_FILE (location),
3322 p->decl);
3323
3324 location = p->locus;
3325 p = p->next;
3326 }
3327
3328 print_instantiation_partial_context (context, p, location);
3329 }
3330
3331 /* Helper function of print_instantiation_partial_context() that
3332 prints a single line of instantiation context. */
3333
3334 static void
3335 print_instantiation_partial_context_line (diagnostic_context *context,
3336 const struct tinst_level *t,
3337 location_t loc, bool recursive_p)
3338 {
3339 if (loc == UNKNOWN_LOCATION)
3340 return;
3341
3342 expanded_location xloc = expand_location (loc);
3343
3344 if (context->show_column)
3345 pp_verbatim (context->printer, _("%r%s:%d:%d:%R "),
3346 "locus", xloc.file, xloc.line, xloc.column);
3347 else
3348 pp_verbatim (context->printer, _("%r%s:%d:%R "),
3349 "locus", xloc.file, xloc.line);
3350
3351 if (t != NULL)
3352 {
3353 if (TREE_CODE (t->decl) == TREE_LIST)
3354 pp_verbatim (context->printer,
3355 recursive_p
3356 ? _("recursively required by substitution of %qS\n")
3357 : _("required by substitution of %qS\n"),
3358 t->decl);
3359 else
3360 pp_verbatim (context->printer,
3361 recursive_p
3362 ? _("recursively required from %q#D\n")
3363 : _("required from %q#D\n"),
3364 t->decl);
3365 }
3366 else
3367 {
3368 pp_verbatim (context->printer,
3369 recursive_p
3370 ? _("recursively required from here")
3371 : _("required from here"));
3372 }
3373 }
3374
3375 /* Same as print_instantiation_full_context but less verbose. */
3376
3377 static void
3378 print_instantiation_partial_context (diagnostic_context *context,
3379 struct tinst_level *t0, location_t loc)
3380 {
3381 struct tinst_level *t;
3382 int n_total = 0;
3383 int n;
3384 location_t prev_loc = loc;
3385
3386 for (t = t0; t != NULL; t = t->next)
3387 if (prev_loc != t->locus)
3388 {
3389 prev_loc = t->locus;
3390 n_total++;
3391 }
3392
3393 t = t0;
3394
3395 if (template_backtrace_limit
3396 && n_total > template_backtrace_limit)
3397 {
3398 int skip = n_total - template_backtrace_limit;
3399 int head = template_backtrace_limit / 2;
3400
3401 /* Avoid skipping just 1. If so, skip 2. */
3402 if (skip == 1)
3403 {
3404 skip = 2;
3405 head = (template_backtrace_limit - 1) / 2;
3406 }
3407
3408 for (n = 0; n < head; n++)
3409 {
3410 gcc_assert (t != NULL);
3411 if (loc != t->locus)
3412 print_instantiation_partial_context_line (context, t, loc,
3413 /*recursive_p=*/false);
3414 loc = t->locus;
3415 t = t->next;
3416 }
3417 if (t != NULL && skip > 0)
3418 {
3419 expanded_location xloc;
3420 xloc = expand_location (loc);
3421 if (context->show_column)
3422 pp_verbatim (context->printer,
3423 _("%r%s:%d:%d:%R [ skipping %d instantiation "
3424 "contexts, use -ftemplate-backtrace-limit=0 to "
3425 "disable ]\n"),
3426 "locus", xloc.file, xloc.line, xloc.column, skip);
3427 else
3428 pp_verbatim (context->printer,
3429 _("%r%s:%d:%R [ skipping %d instantiation "
3430 "contexts, use -ftemplate-backtrace-limit=0 to "
3431 "disable ]\n"),
3432 "locus", xloc.file, xloc.line, skip);
3433
3434 do {
3435 loc = t->locus;
3436 t = t->next;
3437 } while (t != NULL && --skip > 0);
3438 }
3439 }
3440
3441 while (t != NULL)
3442 {
3443 while (t->next != NULL && t->locus == t->next->locus)
3444 {
3445 loc = t->locus;
3446 t = t->next;
3447 }
3448 print_instantiation_partial_context_line (context, t, loc,
3449 t->locus == loc);
3450 loc = t->locus;
3451 t = t->next;
3452 }
3453 print_instantiation_partial_context_line (context, NULL, loc,
3454 /*recursive_p=*/false);
3455 pp_newline (context->printer);
3456 }
3457
3458 /* Called from cp_thing to print the template context for an error. */
3459 static void
3460 maybe_print_instantiation_context (diagnostic_context *context)
3461 {
3462 if (!problematic_instantiation_changed () || current_instantiation () == 0)
3463 return;
3464
3465 record_last_problematic_instantiation ();
3466 print_instantiation_full_context (context);
3467 }
3468 \f
3469 /* Report what constexpr call(s) we're trying to expand, if any. */
3470
3471 void
3472 maybe_print_constexpr_context (diagnostic_context *context)
3473 {
3474 vec<tree> call_stack = cx_error_context ();
3475 unsigned ix;
3476 tree t;
3477
3478 FOR_EACH_VEC_ELT (call_stack, ix, t)
3479 {
3480 expanded_location xloc = expand_location (EXPR_LOCATION (t));
3481 const char *s = expr_as_string (t, 0);
3482 if (context->show_column)
3483 pp_verbatim (context->printer,
3484 _("%r%s:%d:%d:%R in constexpr expansion of %qs"),
3485 "locus", xloc.file, xloc.line, xloc.column, s);
3486 else
3487 pp_verbatim (context->printer,
3488 _("%r%s:%d:%R in constexpr expansion of %qs"),
3489 "locus", xloc.file, xloc.line, s);
3490 pp_newline (context->printer);
3491 }
3492 }
3493 \f
3494 /* Called from output_format -- during diagnostic message processing --
3495 to handle C++ specific format specifier with the following meanings:
3496 %A function argument-list.
3497 %C tree code.
3498 %D declaration.
3499 %E expression.
3500 %F function declaration.
3501 %L language as used in extern "lang".
3502 %O binary operator.
3503 %P function parameter whose position is indicated by an integer.
3504 %Q assignment operator.
3505 %S substitution (template + args)
3506 %T type.
3507 %V cv-qualifier.
3508 %X exception-specification. */
3509 static bool
3510 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
3511 int precision, bool wide, bool set_locus, bool verbose)
3512 {
3513 const char *result;
3514 tree t = NULL;
3515 #define next_tree (t = va_arg (*text->args_ptr, tree))
3516 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3517 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3518 #define next_int va_arg (*text->args_ptr, int)
3519
3520 if (precision != 0 || wide)
3521 return false;
3522
3523 switch (*spec)
3524 {
3525 case 'A': result = args_to_string (next_tree, verbose); break;
3526 case 'C': result = code_to_string (next_tcode); break;
3527 case 'D':
3528 {
3529 tree temp = next_tree;
3530 if (VAR_P (temp)
3531 && DECL_HAS_DEBUG_EXPR_P (temp))
3532 {
3533 temp = DECL_DEBUG_EXPR (temp);
3534 if (!DECL_P (temp))
3535 {
3536 result = expr_to_string (temp);
3537 break;
3538 }
3539 }
3540 result = decl_to_string (temp, verbose);
3541 }
3542 break;
3543 case 'E': result = expr_to_string (next_tree); break;
3544 case 'F': result = fndecl_to_string (next_tree, verbose); break;
3545 case 'L': result = language_to_string (next_lang); break;
3546 case 'O': result = op_to_string (next_tcode); break;
3547 case 'P': result = parm_to_string (next_int); break;
3548 case 'Q': result = assop_to_string (next_tcode); break;
3549 case 'S': result = subst_to_string (next_tree); break;
3550 case 'T': result = type_to_string (next_tree, verbose); break;
3551 case 'V': result = cv_to_string (next_tree, verbose); break;
3552 case 'X': result = eh_spec_to_string (next_tree, verbose); break;
3553
3554 case 'K':
3555 percent_K_format (text);
3556 return true;
3557
3558 default:
3559 return false;
3560 }
3561
3562 pp_string (pp, result);
3563 if (set_locus && t != NULL)
3564 text->set_location (0, location_of (t));
3565 return true;
3566 #undef next_tree
3567 #undef next_tcode
3568 #undef next_lang
3569 #undef next_int
3570 }
3571 \f
3572 /* Warn about the use of C++0x features when appropriate. */
3573 void
3574 maybe_warn_cpp0x (cpp0x_warn_str str)
3575 {
3576 if ((cxx_dialect == cxx98) && !in_system_header_at (input_location))
3577 /* We really want to suppress this warning in system headers,
3578 because libstdc++ uses variadic templates even when we aren't
3579 in C++0x mode. */
3580 switch (str)
3581 {
3582 case CPP0X_INITIALIZER_LISTS:
3583 pedwarn (input_location, 0,
3584 "extended initializer lists "
3585 "only available with -std=c++11 or -std=gnu++11");
3586 break;
3587 case CPP0X_EXPLICIT_CONVERSION:
3588 pedwarn (input_location, 0,
3589 "explicit conversion operators "
3590 "only available with -std=c++11 or -std=gnu++11");
3591 break;
3592 case CPP0X_VARIADIC_TEMPLATES:
3593 pedwarn (input_location, 0,
3594 "variadic templates "
3595 "only available with -std=c++11 or -std=gnu++11");
3596 break;
3597 case CPP0X_LAMBDA_EXPR:
3598 pedwarn (input_location, 0,
3599 "lambda expressions "
3600 "only available with -std=c++11 or -std=gnu++11");
3601 break;
3602 case CPP0X_AUTO:
3603 pedwarn (input_location, 0,
3604 "C++11 auto only available with -std=c++11 or -std=gnu++11");
3605 break;
3606 case CPP0X_SCOPED_ENUMS:
3607 pedwarn (input_location, 0,
3608 "scoped enums only available with -std=c++11 or -std=gnu++11");
3609 break;
3610 case CPP0X_DEFAULTED_DELETED:
3611 pedwarn (input_location, 0,
3612 "defaulted and deleted functions "
3613 "only available with -std=c++11 or -std=gnu++11");
3614 break;
3615 case CPP0X_INLINE_NAMESPACES:
3616 pedwarn (input_location, OPT_Wpedantic,
3617 "inline namespaces "
3618 "only available with -std=c++11 or -std=gnu++11");
3619 break;
3620 case CPP0X_OVERRIDE_CONTROLS:
3621 pedwarn (input_location, 0,
3622 "override controls (override/final) "
3623 "only available with -std=c++11 or -std=gnu++11");
3624 break;
3625 case CPP0X_NSDMI:
3626 pedwarn (input_location, 0,
3627 "non-static data member initializers "
3628 "only available with -std=c++11 or -std=gnu++11");
3629 break;
3630 case CPP0X_USER_DEFINED_LITERALS:
3631 pedwarn (input_location, 0,
3632 "user-defined literals "
3633 "only available with -std=c++11 or -std=gnu++11");
3634 break;
3635 case CPP0X_DELEGATING_CTORS:
3636 pedwarn (input_location, 0,
3637 "delegating constructors "
3638 "only available with -std=c++11 or -std=gnu++11");
3639 break;
3640 case CPP0X_INHERITING_CTORS:
3641 pedwarn (input_location, 0,
3642 "inheriting constructors "
3643 "only available with -std=c++11 or -std=gnu++11");
3644 break;
3645 case CPP0X_ATTRIBUTES:
3646 pedwarn (input_location, 0,
3647 "c++11 attributes "
3648 "only available with -std=c++11 or -std=gnu++11");
3649 break;
3650 case CPP0X_REF_QUALIFIER:
3651 pedwarn (input_location, 0,
3652 "ref-qualifiers "
3653 "only available with -std=c++11 or -std=gnu++11");
3654 break;
3655 default:
3656 gcc_unreachable ();
3657 }
3658 }
3659
3660 /* Warn about the use of variadic templates when appropriate. */
3661 void
3662 maybe_warn_variadic_templates (void)
3663 {
3664 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES);
3665 }
3666
3667
3668 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3669 option OPT with text GMSGID. Use this function to report
3670 diagnostics for constructs that are invalid C++98, but valid
3671 C++0x. */
3672 bool
3673 pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...)
3674 {
3675 diagnostic_info diagnostic;
3676 va_list ap;
3677 bool ret;
3678
3679 va_start (ap, gmsgid);
3680 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
3681 (cxx_dialect == cxx98) ? DK_PEDWARN : DK_WARNING);
3682 diagnostic.option_index = opt;
3683 ret = report_diagnostic (&diagnostic);
3684 va_end (ap);
3685 return ret;
3686 }
3687
3688 /* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is what
3689 we found when we tried to do the lookup. LOCATION is the location of
3690 the NAME identifier. */
3691
3692 void
3693 qualified_name_lookup_error (tree scope, tree name,
3694 tree decl, location_t location)
3695 {
3696 if (scope == error_mark_node)
3697 ; /* We already complained. */
3698 else if (TYPE_P (scope))
3699 {
3700 if (!COMPLETE_TYPE_P (scope))
3701 error_at (location, "incomplete type %qT used in nested name specifier",
3702 scope);
3703 else if (TREE_CODE (decl) == TREE_LIST)
3704 {
3705 error_at (location, "reference to %<%T::%D%> is ambiguous",
3706 scope, name);
3707 print_candidates (decl);
3708 }
3709 else
3710 error_at (location, "%qD is not a member of %qT", name, scope);
3711 }
3712 else if (scope != global_namespace)
3713 {
3714 error_at (location, "%qD is not a member of %qD", name, scope);
3715 suggest_alternatives_for (location, name);
3716 }
3717 else
3718 {
3719 error_at (location, "%<::%D%> has not been declared", name);
3720 suggest_alternatives_for (location, name);
3721 }
3722 }