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