Merge from mainline (165734:167278).
[official-gcc/graphite-test-results.git] / gcc / cp / error.c
blob1560fc6047be211ac420b35d9d52660c5c0a3a73
1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003,
4 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "cp-tree.h"
27 #include "toplev.h"
28 #include "flags.h"
29 #include "diagnostic.h"
30 #include "tree-diagnostic.h"
31 #include "langhooks-def.h"
32 #include "intl.h"
33 #include "cxx-pretty-print.h"
34 #include "tree-pretty-print.h"
35 #include "pointer-set.h"
37 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
39 /* The global buffer where we dump everything. It is there only for
40 transitional purpose. It is expected, in the near future, to be
41 completely removed. */
42 static cxx_pretty_printer scratch_pretty_printer;
43 #define cxx_pp (&scratch_pretty_printer)
45 /* Translate if being used for diagnostics, but not for dump files or
46 __PRETTY_FUNCTION. */
47 #define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid))
49 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
51 static const char *args_to_string (tree, int);
52 static const char *assop_to_string (enum tree_code);
53 static const char *code_to_string (enum tree_code);
54 static const char *cv_to_string (tree, int);
55 static const char *decl_to_string (tree, int);
56 static const char *expr_to_string (tree);
57 static const char *fndecl_to_string (tree, int);
58 static const char *op_to_string (enum tree_code);
59 static const char *parm_to_string (int);
60 static const char *type_to_string (tree, int);
62 static void dump_type (tree, int);
63 static void dump_typename (tree, int);
64 static void dump_simple_decl (tree, tree, int);
65 static void dump_decl (tree, int);
66 static void dump_template_decl (tree, int);
67 static void dump_function_decl (tree, int);
68 static void dump_expr (tree, int);
69 static void dump_unary_op (const char *, tree, int);
70 static void dump_binary_op (const char *, tree, int);
71 static void dump_aggr_type (tree, int);
72 static void dump_type_prefix (tree, int);
73 static void dump_type_suffix (tree, int);
74 static void dump_function_name (tree, int);
75 static void dump_call_expr_args (tree, int, bool);
76 static void dump_aggr_init_expr_args (tree, int, bool);
77 static void dump_expr_list (tree, int);
78 static void dump_global_iord (tree);
79 static void dump_parameters (tree, int);
80 static void dump_exception_spec (tree, int);
81 static void dump_template_argument (tree, int);
82 static void dump_template_argument_list (tree, int);
83 static void dump_template_parameter (tree, int);
84 static void dump_template_bindings (tree, tree, VEC(tree,gc) *);
85 static void dump_scope (tree, int);
86 static void dump_template_parms (tree, int, int);
87 static int get_non_default_template_args_count (tree, int);
88 static const char *function_category (tree);
89 static void maybe_print_constexpr_context (diagnostic_context *);
90 static void maybe_print_instantiation_context (diagnostic_context *);
91 static void print_instantiation_full_context (diagnostic_context *);
92 static void print_instantiation_partial_context (diagnostic_context *,
93 struct tinst_level *,
94 location_t);
95 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
96 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
97 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
99 static bool cp_printer (pretty_printer *, text_info *, const char *,
100 int, bool, bool, bool);
101 static location_t location_of (tree);
103 void
104 init_error (void)
106 diagnostic_starter (global_dc) = cp_diagnostic_starter;
107 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
108 diagnostic_format_decoder (global_dc) = cp_printer;
110 pp_construct (pp_base (cxx_pp), NULL, 0);
111 pp_cxx_pretty_printer_init (cxx_pp);
114 /* Dump a scope, if deemed necessary. */
116 static void
117 dump_scope (tree scope, int flags)
119 int f = flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF);
121 if (scope == NULL_TREE)
122 return;
124 if (TREE_CODE (scope) == NAMESPACE_DECL)
126 if (scope != global_namespace)
128 dump_decl (scope, f);
129 pp_cxx_colon_colon (cxx_pp);
132 else if (AGGREGATE_TYPE_P (scope))
134 dump_type (scope, f);
135 pp_cxx_colon_colon (cxx_pp);
137 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
139 dump_function_decl (scope, f);
140 pp_cxx_colon_colon (cxx_pp);
144 /* Dump the template ARGument under control of FLAGS. */
146 static void
147 dump_template_argument (tree arg, int flags)
149 if (ARGUMENT_PACK_P (arg))
150 dump_template_argument_list (ARGUMENT_PACK_ARGS (arg), flags);
151 else if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
152 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
153 else
155 if (TREE_CODE (arg) == TREE_LIST)
156 arg = TREE_VALUE (arg);
158 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
162 /* Count the number of template arguments ARGS whose value does not
163 match the (optional) default template parameter in PARAMS */
165 static int
166 get_non_default_template_args_count (tree args, int flags)
168 int n = TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args));
170 if (/* We use this flag when generating debug information. We don't
171 want to expand templates at this point, for this may generate
172 new decls, which gets decl counts out of sync, which may in
173 turn cause codegen differences between compilations with and
174 without -g. */
175 (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0
176 || !flag_pretty_templates)
177 return n;
179 return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args));
182 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
183 of FLAGS. */
185 static void
186 dump_template_argument_list (tree args, int flags)
188 int n = get_non_default_template_args_count (args, flags);
189 int need_comma = 0;
190 int i;
192 for (i = 0; i < n; ++i)
194 tree arg = TREE_VEC_ELT (args, i);
196 /* Only print a comma if we know there is an argument coming. In
197 the case of an empty template argument pack, no actual
198 argument will be printed. */
199 if (need_comma
200 && (!ARGUMENT_PACK_P (arg)
201 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
202 pp_separate_with_comma (cxx_pp);
204 dump_template_argument (arg, flags);
205 need_comma = 1;
209 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
211 static void
212 dump_template_parameter (tree parm, int flags)
214 tree p;
215 tree a;
217 if (parm == error_mark_node)
218 return;
220 p = TREE_VALUE (parm);
221 a = TREE_PURPOSE (parm);
223 if (TREE_CODE (p) == TYPE_DECL)
225 if (flags & TFF_DECL_SPECIFIERS)
227 pp_cxx_ws_string (cxx_pp, "class");
228 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
229 pp_cxx_ws_string (cxx_pp, "...");
230 if (DECL_NAME (p))
231 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
233 else if (DECL_NAME (p))
234 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
235 else
236 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
238 else
239 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
241 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
243 pp_cxx_whitespace (cxx_pp);
244 pp_equal (cxx_pp);
245 pp_cxx_whitespace (cxx_pp);
246 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
247 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
248 else
249 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
253 /* Dump, under control of FLAGS, a template-parameter-list binding.
254 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
255 TREE_VEC. */
257 static void
258 dump_template_bindings (tree parms, tree args, VEC(tree,gc)* typenames)
260 int need_comma = 0;
261 int i;
262 tree t;
264 while (parms)
266 tree p = TREE_VALUE (parms);
267 int lvl = TMPL_PARMS_DEPTH (parms);
268 int arg_idx = 0;
269 int i;
270 tree lvl_args = NULL_TREE;
272 /* Don't crash if we had an invalid argument list. */
273 if (TMPL_ARGS_DEPTH (args) >= lvl)
274 lvl_args = TMPL_ARGS_LEVEL (args, lvl);
276 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
278 tree arg = NULL_TREE;
280 /* Don't crash if we had an invalid argument list. */
281 if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx)
282 arg = TREE_VEC_ELT (lvl_args, arg_idx);
284 if (need_comma)
285 pp_separate_with_comma (cxx_pp);
286 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
287 pp_cxx_whitespace (cxx_pp);
288 pp_equal (cxx_pp);
289 pp_cxx_whitespace (cxx_pp);
290 if (arg)
292 if (ARGUMENT_PACK_P (arg))
293 pp_cxx_left_brace (cxx_pp);
294 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
295 if (ARGUMENT_PACK_P (arg))
296 pp_cxx_right_brace (cxx_pp);
298 else
299 pp_string (cxx_pp, M_("<missing>"));
301 ++arg_idx;
302 need_comma = 1;
305 parms = TREE_CHAIN (parms);
308 FOR_EACH_VEC_ELT (tree, typenames, i, t)
310 if (need_comma)
311 pp_separate_with_comma (cxx_pp);
312 dump_type (t, TFF_PLAIN_IDENTIFIER);
313 pp_cxx_whitespace (cxx_pp);
314 pp_equal (cxx_pp);
315 pp_cxx_whitespace (cxx_pp);
316 t = tsubst (t, args, tf_none, NULL_TREE);
317 /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because
318 pp_simple_type_specifier doesn't know about it. */
319 t = strip_typedefs (t);
320 dump_type (t, TFF_PLAIN_IDENTIFIER);
324 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
325 format. */
327 static void
328 dump_type (tree t, int flags)
330 if (t == NULL_TREE)
331 return;
333 /* Don't print e.g. "struct mytypedef". */
334 if (TYPE_P (t) && typedef_variant_p (t))
336 tree decl = TYPE_NAME (t);
337 if ((flags & TFF_CHASE_TYPEDEF)
338 || DECL_SELF_REFERENCE_P (decl)
339 || (!flag_pretty_templates
340 && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)))
341 t = strip_typedefs (t);
342 else if (same_type_p (t, TREE_TYPE (decl)))
343 t = decl;
344 else
346 pp_cxx_cv_qualifier_seq (cxx_pp, t);
347 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
348 return;
352 if (TYPE_PTRMEMFUNC_P (t))
353 goto offset_type;
355 switch (TREE_CODE (t))
357 case LANG_TYPE:
358 if (t == init_list_type_node)
359 pp_string (cxx_pp, M_("<brace-enclosed initializer list>"));
360 else if (t == unknown_type_node)
361 pp_string (cxx_pp, M_("<unresolved overloaded function type>"));
362 else
364 pp_cxx_cv_qualifier_seq (cxx_pp, t);
365 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
367 break;
369 case TREE_LIST:
370 /* A list of function parms. */
371 dump_parameters (t, flags);
372 break;
374 case IDENTIFIER_NODE:
375 pp_cxx_tree_identifier (cxx_pp, t);
376 break;
378 case TREE_BINFO:
379 dump_type (BINFO_TYPE (t), flags);
380 break;
382 case RECORD_TYPE:
383 case UNION_TYPE:
384 case ENUMERAL_TYPE:
385 dump_aggr_type (t, flags);
386 break;
388 case TYPE_DECL:
389 if (flags & TFF_CHASE_TYPEDEF)
391 dump_type (DECL_ORIGINAL_TYPE (t)
392 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
393 break;
395 /* Else fall through. */
397 case TEMPLATE_DECL:
398 case NAMESPACE_DECL:
399 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
400 break;
402 case INTEGER_TYPE:
403 case REAL_TYPE:
404 case VOID_TYPE:
405 case BOOLEAN_TYPE:
406 case COMPLEX_TYPE:
407 case VECTOR_TYPE:
408 case FIXED_POINT_TYPE:
409 pp_type_specifier_seq (cxx_pp, t);
410 break;
412 case TEMPLATE_TEMPLATE_PARM:
413 /* For parameters inside template signature. */
414 if (TYPE_IDENTIFIER (t))
415 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
416 else
417 pp_cxx_canonical_template_parameter (cxx_pp, t);
418 break;
420 case BOUND_TEMPLATE_TEMPLATE_PARM:
422 tree args = TYPE_TI_ARGS (t);
423 pp_cxx_cv_qualifier_seq (cxx_pp, t);
424 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
425 pp_cxx_begin_template_argument_list (cxx_pp);
426 dump_template_argument_list (args, flags);
427 pp_cxx_end_template_argument_list (cxx_pp);
429 break;
431 case TEMPLATE_TYPE_PARM:
432 pp_cxx_cv_qualifier_seq (cxx_pp, t);
433 if (TYPE_IDENTIFIER (t))
434 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
435 else
436 pp_cxx_canonical_template_parameter
437 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
438 break;
440 /* This is not always necessary for pointers and such, but doing this
441 reduces code size. */
442 case ARRAY_TYPE:
443 case POINTER_TYPE:
444 case REFERENCE_TYPE:
445 case OFFSET_TYPE:
446 offset_type:
447 case FUNCTION_TYPE:
448 case METHOD_TYPE:
450 dump_type_prefix (t, flags);
451 dump_type_suffix (t, flags);
452 break;
454 case TYPENAME_TYPE:
455 if (! (flags & TFF_CHASE_TYPEDEF)
456 && DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
458 dump_decl (TYPE_NAME (t), TFF_PLAIN_IDENTIFIER);
459 break;
461 pp_cxx_cv_qualifier_seq (cxx_pp, t);
462 pp_cxx_ws_string (cxx_pp,
463 TYPENAME_IS_ENUM_P (t) ? "enum"
464 : TYPENAME_IS_CLASS_P (t) ? "class"
465 : "typename");
466 dump_typename (t, flags);
467 break;
469 case UNBOUND_CLASS_TEMPLATE:
470 if (! (flags & TFF_UNQUALIFIED_NAME))
472 dump_type (TYPE_CONTEXT (t), flags);
473 pp_cxx_colon_colon (cxx_pp);
475 pp_cxx_ws_string (cxx_pp, "template");
476 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
477 break;
479 case TYPEOF_TYPE:
480 pp_cxx_ws_string (cxx_pp, "__typeof__");
481 pp_cxx_whitespace (cxx_pp);
482 pp_cxx_left_paren (cxx_pp);
483 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
484 pp_cxx_right_paren (cxx_pp);
485 break;
487 case TYPE_PACK_EXPANSION:
488 dump_type (PACK_EXPANSION_PATTERN (t), flags);
489 pp_cxx_ws_string (cxx_pp, "...");
490 break;
492 case TYPE_ARGUMENT_PACK:
493 dump_template_argument (t, flags);
494 break;
496 case DECLTYPE_TYPE:
497 pp_cxx_ws_string (cxx_pp, "decltype");
498 pp_cxx_whitespace (cxx_pp);
499 pp_cxx_left_paren (cxx_pp);
500 dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
501 pp_cxx_right_paren (cxx_pp);
502 break;
504 case NULLPTR_TYPE:
505 pp_string (cxx_pp, "std::nullptr_t");
506 break;
508 default:
509 pp_unsupported_tree (cxx_pp, t);
510 /* Fall through to error. */
512 case ERROR_MARK:
513 pp_string (cxx_pp, M_("<type error>"));
514 break;
518 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
519 a TYPENAME_TYPE. */
521 static void
522 dump_typename (tree t, int flags)
524 tree ctx = TYPE_CONTEXT (t);
526 if (TREE_CODE (ctx) == TYPENAME_TYPE)
527 dump_typename (ctx, flags);
528 else
529 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
530 pp_cxx_colon_colon (cxx_pp);
531 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
534 /* Return the name of the supplied aggregate, or enumeral type. */
536 const char *
537 class_key_or_enum_as_string (tree t)
539 if (TREE_CODE (t) == ENUMERAL_TYPE)
541 if (SCOPED_ENUM_P (t))
542 return "enum class";
543 else
544 return "enum";
546 else if (TREE_CODE (t) == UNION_TYPE)
547 return "union";
548 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
549 return "class";
550 else
551 return "struct";
554 /* Print out a class declaration T under the control of FLAGS,
555 in the form `class foo'. */
557 static void
558 dump_aggr_type (tree t, int flags)
560 tree name;
561 const char *variety = class_key_or_enum_as_string (t);
562 int typdef = 0;
563 int tmplate = 0;
565 pp_cxx_cv_qualifier_seq (cxx_pp, t);
567 if (flags & TFF_CLASS_KEY_OR_ENUM)
568 pp_cxx_ws_string (cxx_pp, variety);
570 name = TYPE_NAME (t);
572 if (name)
574 typdef = !DECL_ARTIFICIAL (name);
576 if ((typdef
577 && ((flags & TFF_CHASE_TYPEDEF)
578 || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name)
579 && DECL_TEMPLATE_INFO (name))))
580 || DECL_SELF_REFERENCE_P (name))
582 t = TYPE_MAIN_VARIANT (t);
583 name = TYPE_NAME (t);
584 typdef = 0;
587 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
588 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
589 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
590 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
592 if (! (flags & TFF_UNQUALIFIED_NAME))
593 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
594 flags &= ~TFF_UNQUALIFIED_NAME;
595 if (tmplate)
597 /* Because the template names are mangled, we have to locate
598 the most general template, and use that name. */
599 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
601 while (DECL_TEMPLATE_INFO (tpl))
602 tpl = DECL_TI_TEMPLATE (tpl);
603 name = tpl;
605 name = DECL_NAME (name);
608 if (name == 0 || ANON_AGGRNAME_P (name))
610 if (flags & TFF_CLASS_KEY_OR_ENUM)
611 pp_string (cxx_pp, M_("<anonymous>"));
612 else
613 pp_printf (pp_base (cxx_pp), M_("<anonymous %s>"), variety);
615 else if (LAMBDANAME_P (name))
617 /* A lambda's "type" is essentially its signature. */
618 pp_string (cxx_pp, M_("<lambda"));
619 if (lambda_function (t))
620 dump_parameters (FUNCTION_FIRST_USER_PARMTYPE (lambda_function (t)),
621 flags);
622 pp_character(cxx_pp, '>');
624 else
625 pp_cxx_tree_identifier (cxx_pp, name);
626 if (tmplate)
627 dump_template_parms (TYPE_TEMPLATE_INFO (t),
628 !CLASSTYPE_USE_TEMPLATE (t),
629 flags & ~TFF_TEMPLATE_HEADER);
632 /* Dump into the obstack the initial part of the output for a given type.
633 This is necessary when dealing with things like functions returning
634 functions. Examples:
636 return type of `int (* fee ())()': pointer -> function -> int. Both
637 pointer (and reference and offset) and function (and member) types must
638 deal with prefix and suffix.
640 Arrays must also do this for DECL nodes, like int a[], and for things like
641 int *[]&. */
643 static void
644 dump_type_prefix (tree t, int flags)
646 if (TYPE_PTRMEMFUNC_P (t))
648 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
649 goto offset_type;
652 switch (TREE_CODE (t))
654 case POINTER_TYPE:
655 case REFERENCE_TYPE:
657 tree sub = TREE_TYPE (t);
659 dump_type_prefix (sub, flags);
660 if (TREE_CODE (sub) == ARRAY_TYPE
661 || TREE_CODE (sub) == FUNCTION_TYPE)
663 pp_cxx_whitespace (cxx_pp);
664 pp_cxx_left_paren (cxx_pp);
666 if (TREE_CODE (t) == POINTER_TYPE)
667 pp_character(cxx_pp, '*');
668 else if (TREE_CODE (t) == REFERENCE_TYPE)
670 if (TYPE_REF_IS_RVALUE (t))
671 pp_string (cxx_pp, "&&");
672 else
673 pp_character (cxx_pp, '&');
675 pp_base (cxx_pp)->padding = pp_before;
676 pp_cxx_cv_qualifier_seq (cxx_pp, t);
678 break;
680 case OFFSET_TYPE:
681 offset_type:
682 dump_type_prefix (TREE_TYPE (t), flags);
683 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
685 pp_maybe_space (cxx_pp);
686 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
687 pp_cxx_left_paren (cxx_pp);
688 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
689 pp_cxx_colon_colon (cxx_pp);
691 pp_cxx_star (cxx_pp);
692 pp_cxx_cv_qualifier_seq (cxx_pp, t);
693 pp_base (cxx_pp)->padding = pp_before;
694 break;
696 /* This can be reached without a pointer when dealing with
697 templates, e.g. std::is_function. */
698 case FUNCTION_TYPE:
699 dump_type_prefix (TREE_TYPE (t), flags);
700 break;
702 case METHOD_TYPE:
703 dump_type_prefix (TREE_TYPE (t), flags);
704 pp_maybe_space (cxx_pp);
705 pp_cxx_left_paren (cxx_pp);
706 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
707 pp_cxx_colon_colon (cxx_pp);
708 break;
710 case ARRAY_TYPE:
711 dump_type_prefix (TREE_TYPE (t), flags);
712 break;
714 case ENUMERAL_TYPE:
715 case IDENTIFIER_NODE:
716 case INTEGER_TYPE:
717 case BOOLEAN_TYPE:
718 case REAL_TYPE:
719 case RECORD_TYPE:
720 case TEMPLATE_TYPE_PARM:
721 case TEMPLATE_TEMPLATE_PARM:
722 case BOUND_TEMPLATE_TEMPLATE_PARM:
723 case TREE_LIST:
724 case TYPE_DECL:
725 case TREE_VEC:
726 case UNION_TYPE:
727 case LANG_TYPE:
728 case VOID_TYPE:
729 case TYPENAME_TYPE:
730 case COMPLEX_TYPE:
731 case VECTOR_TYPE:
732 case TYPEOF_TYPE:
733 case DECLTYPE_TYPE:
734 case TYPE_PACK_EXPANSION:
735 case FIXED_POINT_TYPE:
736 case NULLPTR_TYPE:
737 dump_type (t, flags);
738 pp_base (cxx_pp)->padding = pp_before;
739 break;
741 default:
742 pp_unsupported_tree (cxx_pp, t);
743 /* fall through. */
744 case ERROR_MARK:
745 pp_string (cxx_pp, M_("<typeprefixerror>"));
746 break;
750 /* Dump the suffix of type T, under control of FLAGS. This is the part
751 which appears after the identifier (or function parms). */
753 static void
754 dump_type_suffix (tree t, int flags)
756 if (TYPE_PTRMEMFUNC_P (t))
757 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
759 switch (TREE_CODE (t))
761 case POINTER_TYPE:
762 case REFERENCE_TYPE:
763 case OFFSET_TYPE:
764 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
765 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
766 pp_cxx_right_paren (cxx_pp);
767 dump_type_suffix (TREE_TYPE (t), flags);
768 break;
770 case FUNCTION_TYPE:
771 case METHOD_TYPE:
773 tree arg;
774 if (TREE_CODE (t) == METHOD_TYPE)
775 /* Can only be reached through a pointer. */
776 pp_cxx_right_paren (cxx_pp);
777 arg = TYPE_ARG_TYPES (t);
778 if (TREE_CODE (t) == METHOD_TYPE)
779 arg = TREE_CHAIN (arg);
781 /* Function pointers don't have default args. Not in standard C++,
782 anyway; they may in g++, but we'll just pretend otherwise. */
783 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
785 if (TREE_CODE (t) == METHOD_TYPE)
786 pp_cxx_cv_qualifier_seq
787 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
788 else
789 pp_cxx_cv_qualifier_seq (cxx_pp, t);
790 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
791 dump_type_suffix (TREE_TYPE (t), flags);
792 break;
795 case ARRAY_TYPE:
796 pp_maybe_space (cxx_pp);
797 pp_cxx_left_bracket (cxx_pp);
798 if (TYPE_DOMAIN (t))
800 tree dtype = TYPE_DOMAIN (t);
801 tree max = TYPE_MAX_VALUE (dtype);
802 if (host_integerp (max, 0))
803 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
804 else if (TREE_CODE (max) == MINUS_EXPR)
805 dump_expr (TREE_OPERAND (max, 0),
806 flags & ~TFF_EXPR_IN_PARENS);
807 else
808 dump_expr (fold_build2_loc (input_location,
809 PLUS_EXPR, dtype, max,
810 build_int_cst (dtype, 1)),
811 flags & ~TFF_EXPR_IN_PARENS);
813 pp_cxx_right_bracket (cxx_pp);
814 dump_type_suffix (TREE_TYPE (t), flags);
815 break;
817 case ENUMERAL_TYPE:
818 case IDENTIFIER_NODE:
819 case INTEGER_TYPE:
820 case BOOLEAN_TYPE:
821 case REAL_TYPE:
822 case RECORD_TYPE:
823 case TEMPLATE_TYPE_PARM:
824 case TEMPLATE_TEMPLATE_PARM:
825 case BOUND_TEMPLATE_TEMPLATE_PARM:
826 case TREE_LIST:
827 case TYPE_DECL:
828 case TREE_VEC:
829 case UNION_TYPE:
830 case LANG_TYPE:
831 case VOID_TYPE:
832 case TYPENAME_TYPE:
833 case COMPLEX_TYPE:
834 case VECTOR_TYPE:
835 case TYPEOF_TYPE:
836 case DECLTYPE_TYPE:
837 case TYPE_PACK_EXPANSION:
838 case FIXED_POINT_TYPE:
839 case NULLPTR_TYPE:
840 break;
842 default:
843 pp_unsupported_tree (cxx_pp, t);
844 case ERROR_MARK:
845 /* Don't mark it here, we should have already done in
846 dump_type_prefix. */
847 break;
851 static void
852 dump_global_iord (tree t)
854 const char *p = NULL;
856 if (DECL_GLOBAL_CTOR_P (t))
857 p = M_("(static initializers for %s)");
858 else if (DECL_GLOBAL_DTOR_P (t))
859 p = M_("(static destructors for %s)");
860 else
861 gcc_unreachable ();
863 pp_printf (pp_base (cxx_pp), p, input_filename);
866 static void
867 dump_simple_decl (tree t, tree type, int flags)
869 if (flags & TFF_DECL_SPECIFIERS)
871 if (TREE_CODE (t) == VAR_DECL
872 && DECL_DECLARED_CONSTEXPR_P (t))
873 pp_cxx_ws_string (cxx_pp, "constexpr");
874 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
875 pp_maybe_space (cxx_pp);
877 if (! (flags & TFF_UNQUALIFIED_NAME)
878 && TREE_CODE (t) != PARM_DECL
879 && (!DECL_INITIAL (t)
880 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
881 dump_scope (CP_DECL_CONTEXT (t), flags);
882 flags &= ~TFF_UNQUALIFIED_NAME;
883 if ((flags & TFF_DECL_SPECIFIERS)
884 && DECL_TEMPLATE_PARM_P (t)
885 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
886 pp_string (cxx_pp, "...");
887 if (DECL_NAME (t))
888 dump_decl (DECL_NAME (t), flags);
889 else
890 pp_string (cxx_pp, M_("<anonymous>"));
891 if (flags & TFF_DECL_SPECIFIERS)
892 dump_type_suffix (type, flags);
895 /* Dump a human readable string for the decl T under control of FLAGS. */
897 static void
898 dump_decl (tree t, int flags)
900 if (t == NULL_TREE)
901 return;
903 /* If doing Objective-C++, give Objective-C a chance to demangle
904 Objective-C method names. */
905 if (c_dialect_objc ())
907 const char *demangled = objc_maybe_printable_name (t, flags);
908 if (demangled)
910 pp_string (cxx_pp, demangled);
911 return;
915 switch (TREE_CODE (t))
917 case TYPE_DECL:
918 /* Don't say 'typedef class A' */
919 if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t))
921 if ((flags & TFF_DECL_SPECIFIERS)
922 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
924 /* Say `class T' not just `T'. */
925 pp_cxx_ws_string (cxx_pp, "class");
927 /* Emit the `...' for a parameter pack. */
928 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
929 pp_cxx_ws_string (cxx_pp, "...");
932 dump_type (TREE_TYPE (t), flags);
933 break;
935 if ((flags & TFF_DECL_SPECIFIERS)
936 && !DECL_SELF_REFERENCE_P (t))
937 pp_cxx_ws_string (cxx_pp, "typedef");
938 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
939 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
940 flags);
941 break;
943 case VAR_DECL:
944 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
946 pp_string (cxx_pp, M_("vtable for "));
947 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
948 dump_type (DECL_CONTEXT (t), flags);
949 break;
951 /* Else fall through. */
952 case FIELD_DECL:
953 case PARM_DECL:
954 dump_simple_decl (t, TREE_TYPE (t), flags);
955 break;
957 case RESULT_DECL:
958 pp_string (cxx_pp, M_("<return value> "));
959 dump_simple_decl (t, TREE_TYPE (t), flags);
960 break;
962 case NAMESPACE_DECL:
963 if (flags & TFF_DECL_SPECIFIERS)
964 pp_cxx_declaration (cxx_pp, t);
965 else
967 if (! (flags & TFF_UNQUALIFIED_NAME))
968 dump_scope (CP_DECL_CONTEXT (t), flags);
969 flags &= ~TFF_UNQUALIFIED_NAME;
970 if (DECL_NAME (t) == NULL_TREE)
971 pp_cxx_ws_string (cxx_pp, M_("{anonymous}"));
972 else
973 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
975 break;
977 case SCOPE_REF:
978 dump_type (TREE_OPERAND (t, 0), flags);
979 pp_string (cxx_pp, "::");
980 dump_decl (TREE_OPERAND (t, 1), flags|TFF_UNQUALIFIED_NAME);
981 break;
983 case ARRAY_REF:
984 dump_decl (TREE_OPERAND (t, 0), flags);
985 pp_cxx_left_bracket (cxx_pp);
986 dump_decl (TREE_OPERAND (t, 1), flags);
987 pp_cxx_right_bracket (cxx_pp);
988 break;
990 /* So that we can do dump_decl on an aggr type. */
991 case RECORD_TYPE:
992 case UNION_TYPE:
993 case ENUMERAL_TYPE:
994 dump_type (t, flags);
995 break;
997 case BIT_NOT_EXPR:
998 /* This is a pseudo destructor call which has not been folded into
999 a PSEUDO_DTOR_EXPR yet. */
1000 pp_cxx_complement (cxx_pp);
1001 dump_type (TREE_OPERAND (t, 0), flags);
1002 break;
1004 case TYPE_EXPR:
1005 gcc_unreachable ();
1006 break;
1008 /* These special cases are duplicated here so that other functions
1009 can feed identifiers to error and get them demangled properly. */
1010 case IDENTIFIER_NODE:
1011 if (IDENTIFIER_TYPENAME_P (t))
1013 pp_cxx_ws_string (cxx_pp, "operator");
1014 /* Not exactly IDENTIFIER_TYPE_VALUE. */
1015 dump_type (TREE_TYPE (t), flags);
1016 break;
1018 else
1019 pp_cxx_tree_identifier (cxx_pp, t);
1020 break;
1022 case OVERLOAD:
1023 if (OVL_CHAIN (t))
1025 t = OVL_CURRENT (t);
1026 if (DECL_CLASS_SCOPE_P (t))
1028 dump_type (DECL_CONTEXT (t), flags);
1029 pp_cxx_colon_colon (cxx_pp);
1031 else if (DECL_CONTEXT (t))
1033 dump_decl (DECL_CONTEXT (t), flags);
1034 pp_cxx_colon_colon (cxx_pp);
1036 dump_decl (DECL_NAME (t), flags);
1037 break;
1040 /* If there's only one function, just treat it like an ordinary
1041 FUNCTION_DECL. */
1042 t = OVL_CURRENT (t);
1043 /* Fall through. */
1045 case FUNCTION_DECL:
1046 if (! DECL_LANG_SPECIFIC (t))
1047 pp_string (cxx_pp, M_("<built-in>"));
1048 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
1049 dump_global_iord (t);
1050 else
1051 dump_function_decl (t, flags);
1052 break;
1054 case TEMPLATE_DECL:
1055 dump_template_decl (t, flags);
1056 break;
1058 case TEMPLATE_ID_EXPR:
1060 tree name = TREE_OPERAND (t, 0);
1062 if (is_overloaded_fn (name))
1063 name = DECL_NAME (get_first_fn (name));
1064 dump_decl (name, flags);
1065 pp_cxx_begin_template_argument_list (cxx_pp);
1066 if (TREE_OPERAND (t, 1))
1067 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
1068 pp_cxx_end_template_argument_list (cxx_pp);
1070 break;
1072 case LABEL_DECL:
1073 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
1074 break;
1076 case CONST_DECL:
1077 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
1078 || (DECL_INITIAL (t) &&
1079 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
1080 dump_simple_decl (t, TREE_TYPE (t), flags);
1081 else if (DECL_NAME (t))
1082 dump_decl (DECL_NAME (t), flags);
1083 else if (DECL_INITIAL (t))
1084 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
1085 else
1086 pp_string (cxx_pp, M_("<enumerator>"));
1087 break;
1089 case USING_DECL:
1090 pp_cxx_ws_string (cxx_pp, "using");
1091 dump_type (USING_DECL_SCOPE (t), flags);
1092 pp_cxx_colon_colon (cxx_pp);
1093 dump_decl (DECL_NAME (t), flags);
1094 break;
1096 case STATIC_ASSERT:
1097 pp_cxx_declaration (cxx_pp, t);
1098 break;
1100 case BASELINK:
1101 dump_decl (BASELINK_FUNCTIONS (t), flags);
1102 break;
1104 case NON_DEPENDENT_EXPR:
1105 dump_expr (t, flags);
1106 break;
1108 case TEMPLATE_TYPE_PARM:
1109 if (flags & TFF_DECL_SPECIFIERS)
1110 pp_cxx_declaration (cxx_pp, t);
1111 else
1112 pp_type_id (cxx_pp, t);
1113 break;
1115 case UNBOUND_CLASS_TEMPLATE:
1116 case TYPE_PACK_EXPANSION:
1117 case TREE_BINFO:
1118 dump_type (t, flags);
1119 break;
1121 default:
1122 pp_unsupported_tree (cxx_pp, t);
1123 /* Fall through to error. */
1125 case ERROR_MARK:
1126 pp_string (cxx_pp, M_("<declaration error>"));
1127 break;
1131 /* Dump a template declaration T under control of FLAGS. This means the
1132 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1134 static void
1135 dump_template_decl (tree t, int flags)
1137 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1138 tree parms;
1139 int i;
1141 if (flags & TFF_TEMPLATE_HEADER)
1143 for (parms = orig_parms = nreverse (orig_parms);
1144 parms;
1145 parms = TREE_CHAIN (parms))
1147 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1148 int len = TREE_VEC_LENGTH (inner_parms);
1150 pp_cxx_ws_string (cxx_pp, "template");
1151 pp_cxx_begin_template_argument_list (cxx_pp);
1153 /* If we've shown the template prefix, we'd better show the
1154 parameters' and decl's type too. */
1155 flags |= TFF_DECL_SPECIFIERS;
1157 for (i = 0; i < len; i++)
1159 if (i)
1160 pp_separate_with_comma (cxx_pp);
1161 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1163 pp_cxx_end_template_argument_list (cxx_pp);
1164 pp_cxx_whitespace (cxx_pp);
1166 nreverse(orig_parms);
1168 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1170 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1171 pp_cxx_ws_string (cxx_pp, "class");
1173 /* If this is a parameter pack, print the ellipsis. */
1174 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1175 pp_cxx_ws_string (cxx_pp, "...");
1179 if (DECL_TEMPLATE_RESULT (t)
1180 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1181 dump_type (TREE_TYPE (t),
1182 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1183 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1184 else if (DECL_TEMPLATE_RESULT (t)
1185 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1186 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1187 else
1189 gcc_assert (TREE_TYPE (t));
1190 switch (NEXT_CODE (t))
1192 case METHOD_TYPE:
1193 case FUNCTION_TYPE:
1194 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1195 break;
1196 default:
1197 /* This case can occur with some invalid code. */
1198 dump_type (TREE_TYPE (t),
1199 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1200 | (flags & TFF_DECL_SPECIFIERS
1201 ? TFF_CLASS_KEY_OR_ENUM : 0));
1206 /* find_typenames looks through the type of the function template T
1207 and returns a VEC containing any typedefs, decltypes or TYPENAME_TYPEs
1208 it finds. */
1210 struct find_typenames_t
1212 struct pointer_set_t *p_set;
1213 VEC (tree,gc) *typenames;
1216 static tree
1217 find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
1219 struct find_typenames_t *d = (struct find_typenames_t *)data;
1220 tree mv = NULL_TREE;
1222 if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp)))
1223 /* Add the type of the typedef without any additional cv-quals. */
1224 mv = TREE_TYPE (TYPE_NAME (*tp));
1225 else if (TREE_CODE (*tp) == TYPENAME_TYPE
1226 || TREE_CODE (*tp) == DECLTYPE_TYPE)
1227 /* Add the typename without any cv-qualifiers. */
1228 mv = TYPE_MAIN_VARIANT (*tp);
1230 if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv)))
1231 VEC_safe_push (tree, gc, d->typenames, mv);
1233 /* Search into class template arguments, which cp_walk_subtrees
1234 doesn't do. */
1235 if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp))
1236 cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r,
1237 data, d->p_set);
1239 return NULL_TREE;
1242 static VEC(tree,gc) *
1243 find_typenames (tree t)
1245 struct find_typenames_t ft;
1246 ft.p_set = pointer_set_create ();
1247 ft.typenames = NULL;
1248 cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
1249 find_typenames_r, &ft, ft.p_set);
1250 pointer_set_destroy (ft.p_set);
1251 return ft.typenames;
1254 /* Pretty print a function decl. There are several ways we want to print a
1255 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1256 As error can only apply the '#' flag once to give 0 and 1 for V, there
1257 is %D which doesn't print the throw specs, and %F which does. */
1259 static void
1260 dump_function_decl (tree t, int flags)
1262 tree fntype;
1263 tree parmtypes;
1264 tree cname = NULL_TREE;
1265 tree template_args = NULL_TREE;
1266 tree template_parms = NULL_TREE;
1267 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1268 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1269 tree exceptions;
1270 VEC(tree,gc) *typenames = NULL;
1272 if (DECL_NAME (t) && LAMBDA_FUNCTION_P (t))
1274 /* A lambda's signature is essentially its "type", so defer. */
1275 gcc_assert (LAMBDA_TYPE_P (DECL_CONTEXT (t)));
1276 dump_type (DECL_CONTEXT (t), flags);
1277 return;
1280 flags &= ~TFF_UNQUALIFIED_NAME;
1281 if (TREE_CODE (t) == TEMPLATE_DECL)
1282 t = DECL_TEMPLATE_RESULT (t);
1284 /* Save the exceptions, in case t is a specialization and we are
1285 emitting an error about incompatible specifications. */
1286 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1288 /* Pretty print template instantiations only. */
1289 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)
1290 && flag_pretty_templates)
1292 tree tmpl;
1294 template_args = DECL_TI_ARGS (t);
1295 tmpl = most_general_template (t);
1296 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1298 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1299 t = tmpl;
1300 typenames = find_typenames (t);
1304 fntype = TREE_TYPE (t);
1305 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1307 if (DECL_CLASS_SCOPE_P (t))
1308 cname = DECL_CONTEXT (t);
1309 /* This is for partially instantiated template methods. */
1310 else if (TREE_CODE (fntype) == METHOD_TYPE)
1311 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1313 if (flags & TFF_DECL_SPECIFIERS)
1315 if (DECL_STATIC_FUNCTION_P (t))
1316 pp_cxx_ws_string (cxx_pp, "static");
1317 else if (DECL_VIRTUAL_P (t))
1318 pp_cxx_ws_string (cxx_pp, "virtual");
1320 if (DECL_DECLARED_CONSTEXPR_P (STRIP_TEMPLATE (t)))
1321 pp_cxx_ws_string (cxx_pp, "constexpr");
1324 /* Print the return type? */
1325 if (show_return)
1326 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1327 && !DECL_DESTRUCTOR_P (t);
1328 if (show_return)
1329 dump_type_prefix (TREE_TYPE (fntype), flags);
1331 /* Print the function name. */
1332 if (!do_outer_scope)
1333 /* Nothing. */;
1334 else if (cname)
1336 dump_type (cname, flags);
1337 pp_cxx_colon_colon (cxx_pp);
1339 else
1340 dump_scope (CP_DECL_CONTEXT (t), flags);
1342 dump_function_name (t, flags);
1344 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1346 dump_parameters (parmtypes, flags);
1348 if (TREE_CODE (fntype) == METHOD_TYPE)
1350 pp_base (cxx_pp)->padding = pp_before;
1351 pp_cxx_cv_qualifier_seq
1352 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1355 if (flags & TFF_EXCEPTION_SPECIFICATION)
1357 pp_base (cxx_pp)->padding = pp_before;
1358 dump_exception_spec (exceptions, flags);
1361 if (show_return)
1362 dump_type_suffix (TREE_TYPE (fntype), flags);
1365 /* If T is a template instantiation, dump the parameter binding. */
1366 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1368 pp_cxx_whitespace (cxx_pp);
1369 pp_cxx_left_bracket (cxx_pp);
1370 pp_cxx_ws_string (cxx_pp, M_("with"));
1371 pp_cxx_whitespace (cxx_pp);
1372 dump_template_bindings (template_parms, template_args, typenames);
1373 pp_cxx_right_bracket (cxx_pp);
1377 /* Print a parameter list. If this is for a member function, the
1378 member object ptr (and any other hidden args) should have
1379 already been removed. */
1381 static void
1382 dump_parameters (tree parmtypes, int flags)
1384 int first = 1;
1385 flags &= ~TFF_SCOPE;
1386 pp_cxx_left_paren (cxx_pp);
1388 for (first = 1; parmtypes != void_list_node;
1389 parmtypes = TREE_CHAIN (parmtypes))
1391 if (!first)
1392 pp_separate_with_comma (cxx_pp);
1393 first = 0;
1394 if (!parmtypes)
1396 pp_cxx_ws_string (cxx_pp, "...");
1397 break;
1400 dump_type (TREE_VALUE (parmtypes), flags);
1402 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1404 pp_cxx_whitespace (cxx_pp);
1405 pp_equal (cxx_pp);
1406 pp_cxx_whitespace (cxx_pp);
1407 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1411 pp_cxx_right_paren (cxx_pp);
1414 /* Print an exception specification. T is the exception specification. */
1416 static void
1417 dump_exception_spec (tree t, int flags)
1419 if (t && TREE_PURPOSE (t))
1421 pp_cxx_ws_string (cxx_pp, "noexcept");
1422 pp_cxx_whitespace (cxx_pp);
1423 pp_cxx_left_paren (cxx_pp);
1424 dump_expr (TREE_PURPOSE (t), flags);
1425 pp_cxx_right_paren (cxx_pp);
1427 else if (t)
1429 pp_cxx_ws_string (cxx_pp, "throw");
1430 pp_cxx_whitespace (cxx_pp);
1431 pp_cxx_left_paren (cxx_pp);
1432 if (TREE_VALUE (t) != NULL_TREE)
1433 while (1)
1435 dump_type (TREE_VALUE (t), flags);
1436 t = TREE_CHAIN (t);
1437 if (!t)
1438 break;
1439 pp_separate_with_comma (cxx_pp);
1441 pp_cxx_right_paren (cxx_pp);
1445 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1446 and destructors properly. */
1448 static void
1449 dump_function_name (tree t, int flags)
1451 tree name = DECL_NAME (t);
1453 /* We can get here with a decl that was synthesized by language-
1454 independent machinery (e.g. coverage.c) in which case it won't
1455 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1456 will crash. In this case it is safe just to print out the
1457 literal name. */
1458 if (!DECL_LANG_SPECIFIC (t))
1460 pp_cxx_tree_identifier (cxx_pp, name);
1461 return;
1464 if (TREE_CODE (t) == TEMPLATE_DECL)
1465 t = DECL_TEMPLATE_RESULT (t);
1467 /* Don't let the user see __comp_ctor et al. */
1468 if (DECL_CONSTRUCTOR_P (t)
1469 || DECL_DESTRUCTOR_P (t))
1471 if (LAMBDA_TYPE_P (DECL_CONTEXT (t)))
1472 name = get_identifier ("<lambda>");
1473 else
1474 name = constructor_name (DECL_CONTEXT (t));
1477 if (DECL_DESTRUCTOR_P (t))
1479 pp_cxx_complement (cxx_pp);
1480 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1482 else if (DECL_CONV_FN_P (t))
1484 /* This cannot use the hack that the operator's return
1485 type is stashed off of its name because it may be
1486 used for error reporting. In the case of conflicting
1487 declarations, both will have the same name, yet
1488 the types will be different, hence the TREE_TYPE field
1489 of the first name will be clobbered by the second. */
1490 pp_cxx_ws_string (cxx_pp, "operator");
1491 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1493 else if (name && IDENTIFIER_OPNAME_P (name))
1494 pp_cxx_tree_identifier (cxx_pp, name);
1495 else
1496 dump_decl (name, flags);
1498 if (DECL_TEMPLATE_INFO (t)
1499 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1500 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1501 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1502 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1505 /* Dump the template parameters from the template info INFO under control of
1506 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1507 specialization (partial or complete). For partial specializations we show
1508 the specialized parameter values. For a primary template we show no
1509 decoration. */
1511 static void
1512 dump_template_parms (tree info, int primary, int flags)
1514 tree args = info ? TI_ARGS (info) : NULL_TREE;
1516 if (primary && flags & TFF_TEMPLATE_NAME)
1517 return;
1518 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1519 pp_cxx_begin_template_argument_list (cxx_pp);
1521 /* Be careful only to print things when we have them, so as not
1522 to crash producing error messages. */
1523 if (args && !primary)
1525 int len, ix;
1526 len = get_non_default_template_args_count (args, flags);
1528 args = INNERMOST_TEMPLATE_ARGS (args);
1529 for (ix = 0; ix != len; ix++)
1531 tree arg = TREE_VEC_ELT (args, ix);
1533 /* Only print a comma if we know there is an argument coming. In
1534 the case of an empty template argument pack, no actual
1535 argument will be printed. */
1536 if (ix
1537 && (!ARGUMENT_PACK_P (arg)
1538 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1539 pp_separate_with_comma (cxx_pp);
1541 if (!arg)
1542 pp_string (cxx_pp, M_("<template parameter error>"));
1543 else
1544 dump_template_argument (arg, flags);
1547 else if (primary)
1549 tree tpl = TI_TEMPLATE (info);
1550 tree parms = DECL_TEMPLATE_PARMS (tpl);
1551 int len, ix;
1553 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1554 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1556 for (ix = 0; ix != len; ix++)
1558 tree parm;
1560 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1562 pp_string (cxx_pp, M_("<template parameter error>"));
1563 continue;
1566 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1568 if (ix)
1569 pp_separate_with_comma (cxx_pp);
1571 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1574 pp_cxx_end_template_argument_list (cxx_pp);
1577 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1578 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1580 static void
1581 dump_call_expr_args (tree t, int flags, bool skipfirst)
1583 tree arg;
1584 call_expr_arg_iterator iter;
1586 pp_cxx_left_paren (cxx_pp);
1587 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1589 if (skipfirst)
1590 skipfirst = false;
1591 else
1593 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1594 if (more_call_expr_args_p (&iter))
1595 pp_separate_with_comma (cxx_pp);
1598 pp_cxx_right_paren (cxx_pp);
1601 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1602 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1603 true. */
1605 static void
1606 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1608 tree arg;
1609 aggr_init_expr_arg_iterator iter;
1611 pp_cxx_left_paren (cxx_pp);
1612 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1614 if (skipfirst)
1615 skipfirst = false;
1616 else
1618 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1619 if (more_aggr_init_expr_args_p (&iter))
1620 pp_separate_with_comma (cxx_pp);
1623 pp_cxx_right_paren (cxx_pp);
1626 /* Print out a list of initializers (subr of dump_expr). */
1628 static void
1629 dump_expr_list (tree l, int flags)
1631 while (l)
1633 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1634 l = TREE_CHAIN (l);
1635 if (l)
1636 pp_separate_with_comma (cxx_pp);
1640 /* Print out a vector of initializers (subr of dump_expr). */
1642 static void
1643 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1645 unsigned HOST_WIDE_INT idx;
1646 tree value;
1648 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1650 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1651 if (idx != VEC_length (constructor_elt, v) - 1)
1652 pp_separate_with_comma (cxx_pp);
1657 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1658 function. Resolve it to a close relative -- in the sense of static
1659 type -- variant being overridden. That is close to what was written in
1660 the source code. Subroutine of dump_expr. */
1662 static tree
1663 resolve_virtual_fun_from_obj_type_ref (tree ref)
1665 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1666 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1667 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1668 while (index)
1670 fun = TREE_CHAIN (fun);
1671 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1672 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1675 return BV_FN (fun);
1678 /* Print out an expression E under control of FLAGS. */
1680 static void
1681 dump_expr (tree t, int flags)
1683 if (t == 0)
1684 return;
1686 if (STATEMENT_CLASS_P (t))
1688 pp_cxx_ws_string (cxx_pp, M_("<statement>"));
1689 return;
1692 switch (TREE_CODE (t))
1694 case VAR_DECL:
1695 case PARM_DECL:
1696 case FIELD_DECL:
1697 case CONST_DECL:
1698 case FUNCTION_DECL:
1699 case TEMPLATE_DECL:
1700 case NAMESPACE_DECL:
1701 case LABEL_DECL:
1702 case OVERLOAD:
1703 case IDENTIFIER_NODE:
1704 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1705 break;
1707 case INTEGER_CST:
1708 case REAL_CST:
1709 case STRING_CST:
1710 case COMPLEX_CST:
1711 pp_constant (cxx_pp, t);
1712 break;
1714 case THROW_EXPR:
1715 /* While waiting for caret diagnostics, avoid printing
1716 __cxa_allocate_exception, __cxa_throw, and the like. */
1717 pp_cxx_ws_string (cxx_pp, M_("<throw-expression>"));
1718 break;
1720 case PTRMEM_CST:
1721 pp_ampersand (cxx_pp);
1722 dump_type (PTRMEM_CST_CLASS (t), flags);
1723 pp_cxx_colon_colon (cxx_pp);
1724 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1725 break;
1727 case COMPOUND_EXPR:
1728 pp_cxx_left_paren (cxx_pp);
1729 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1730 pp_separate_with_comma (cxx_pp);
1731 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1732 pp_cxx_right_paren (cxx_pp);
1733 break;
1735 case COND_EXPR:
1736 pp_cxx_left_paren (cxx_pp);
1737 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1738 pp_string (cxx_pp, " ? ");
1739 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1740 pp_string (cxx_pp, " : ");
1741 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1742 pp_cxx_right_paren (cxx_pp);
1743 break;
1745 case SAVE_EXPR:
1746 if (TREE_HAS_CONSTRUCTOR (t))
1748 pp_cxx_ws_string (cxx_pp, "new");
1749 pp_cxx_whitespace (cxx_pp);
1750 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1752 else
1753 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1754 break;
1756 case AGGR_INIT_EXPR:
1758 tree fn = NULL_TREE;
1760 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1761 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1763 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1765 if (DECL_CONSTRUCTOR_P (fn))
1766 dump_type (DECL_CONTEXT (fn), flags);
1767 else
1768 dump_decl (fn, 0);
1770 else
1771 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1773 dump_aggr_init_expr_args (t, flags, true);
1774 break;
1776 case CALL_EXPR:
1778 tree fn = CALL_EXPR_FN (t);
1779 bool skipfirst = false;
1781 if (TREE_CODE (fn) == ADDR_EXPR)
1782 fn = TREE_OPERAND (fn, 0);
1784 /* Nobody is interested in seeing the guts of vcalls. */
1785 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1786 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1788 if (TREE_TYPE (fn) != NULL_TREE
1789 && NEXT_CODE (fn) == METHOD_TYPE
1790 && call_expr_nargs (t))
1792 tree ob = CALL_EXPR_ARG (t, 0);
1793 if (TREE_CODE (ob) == ADDR_EXPR)
1795 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1796 pp_cxx_dot (cxx_pp);
1798 else if (TREE_CODE (ob) != PARM_DECL
1799 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1801 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1802 pp_cxx_arrow (cxx_pp);
1804 skipfirst = true;
1806 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1807 dump_call_expr_args (t, flags, skipfirst);
1809 break;
1811 case TARGET_EXPR:
1812 /* Note that this only works for G++ target exprs. If somebody
1813 builds a general TARGET_EXPR, there's no way to represent that
1814 it initializes anything other that the parameter slot for the
1815 default argument. Note we may have cleared out the first
1816 operand in expand_expr, so don't go killing ourselves. */
1817 if (TREE_OPERAND (t, 1))
1818 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1819 break;
1821 case POINTER_PLUS_EXPR:
1822 dump_binary_op ("+", t, flags);
1823 break;
1825 case INIT_EXPR:
1826 case MODIFY_EXPR:
1827 case PLUS_EXPR:
1828 case MINUS_EXPR:
1829 case MULT_EXPR:
1830 case TRUNC_DIV_EXPR:
1831 case TRUNC_MOD_EXPR:
1832 case MIN_EXPR:
1833 case MAX_EXPR:
1834 case LSHIFT_EXPR:
1835 case RSHIFT_EXPR:
1836 case BIT_IOR_EXPR:
1837 case BIT_XOR_EXPR:
1838 case BIT_AND_EXPR:
1839 case TRUTH_ANDIF_EXPR:
1840 case TRUTH_ORIF_EXPR:
1841 case LT_EXPR:
1842 case LE_EXPR:
1843 case GT_EXPR:
1844 case GE_EXPR:
1845 case EQ_EXPR:
1846 case NE_EXPR:
1847 case EXACT_DIV_EXPR:
1848 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1849 break;
1851 case CEIL_DIV_EXPR:
1852 case FLOOR_DIV_EXPR:
1853 case ROUND_DIV_EXPR:
1854 case RDIV_EXPR:
1855 dump_binary_op ("/", t, flags);
1856 break;
1858 case CEIL_MOD_EXPR:
1859 case FLOOR_MOD_EXPR:
1860 case ROUND_MOD_EXPR:
1861 dump_binary_op ("%", t, flags);
1862 break;
1864 case COMPONENT_REF:
1866 tree ob = TREE_OPERAND (t, 0);
1867 if (TREE_CODE (ob) == INDIRECT_REF)
1869 ob = TREE_OPERAND (ob, 0);
1870 if (TREE_CODE (ob) != PARM_DECL
1871 || (DECL_NAME (ob)
1872 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1874 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1875 pp_cxx_arrow (cxx_pp);
1878 else
1880 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1881 pp_cxx_dot (cxx_pp);
1883 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1885 break;
1887 case ARRAY_REF:
1888 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1889 pp_cxx_left_bracket (cxx_pp);
1890 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1891 pp_cxx_right_bracket (cxx_pp);
1892 break;
1894 case UNARY_PLUS_EXPR:
1895 dump_unary_op ("+", t, flags);
1896 break;
1898 case ADDR_EXPR:
1899 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1900 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1901 /* An ADDR_EXPR can have reference type. In that case, we
1902 shouldn't print the `&' doing so indicates to the user
1903 that the expression has pointer type. */
1904 || (TREE_TYPE (t)
1905 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1906 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1907 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1908 dump_unary_op ("&&", t, flags);
1909 else
1910 dump_unary_op ("&", t, flags);
1911 break;
1913 case INDIRECT_REF:
1914 if (TREE_HAS_CONSTRUCTOR (t))
1916 t = TREE_OPERAND (t, 0);
1917 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1918 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1919 dump_call_expr_args (t, flags, true);
1921 else
1923 if (TREE_OPERAND (t,0) != NULL_TREE
1924 && TREE_TYPE (TREE_OPERAND (t, 0))
1925 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1926 dump_expr (TREE_OPERAND (t, 0), flags);
1927 else
1928 dump_unary_op ("*", t, flags);
1930 break;
1932 case NEGATE_EXPR:
1933 case BIT_NOT_EXPR:
1934 case TRUTH_NOT_EXPR:
1935 case PREDECREMENT_EXPR:
1936 case PREINCREMENT_EXPR:
1937 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1938 break;
1940 case POSTDECREMENT_EXPR:
1941 case POSTINCREMENT_EXPR:
1942 pp_cxx_left_paren (cxx_pp);
1943 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1944 pp_cxx_ws_string (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1945 pp_cxx_right_paren (cxx_pp);
1946 break;
1948 case NON_LVALUE_EXPR:
1949 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1950 should be another level of INDIRECT_REF so that I don't have to do
1951 this. */
1952 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1954 tree next = TREE_TYPE (TREE_TYPE (t));
1956 while (TREE_CODE (next) == POINTER_TYPE)
1957 next = TREE_TYPE (next);
1959 if (TREE_CODE (next) == FUNCTION_TYPE)
1961 if (flags & TFF_EXPR_IN_PARENS)
1962 pp_cxx_left_paren (cxx_pp);
1963 pp_cxx_star (cxx_pp);
1964 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1965 if (flags & TFF_EXPR_IN_PARENS)
1966 pp_cxx_right_paren (cxx_pp);
1967 break;
1969 /* Else fall through. */
1971 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1972 break;
1974 CASE_CONVERT:
1975 case VIEW_CONVERT_EXPR:
1977 tree op = TREE_OPERAND (t, 0);
1978 tree ttype = TREE_TYPE (t);
1979 tree optype = TREE_TYPE (op);
1981 if (TREE_CODE (ttype) != TREE_CODE (optype)
1982 && POINTER_TYPE_P (ttype)
1983 && POINTER_TYPE_P (optype)
1984 && same_type_p (TREE_TYPE (optype),
1985 TREE_TYPE (ttype)))
1987 if (TREE_CODE (ttype) == REFERENCE_TYPE)
1988 dump_unary_op ("*", t, flags);
1989 else
1990 dump_unary_op ("&", t, flags);
1992 else if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1994 /* It is a cast, but we cannot tell whether it is a
1995 reinterpret or static cast. Use the C style notation. */
1996 if (flags & TFF_EXPR_IN_PARENS)
1997 pp_cxx_left_paren (cxx_pp);
1998 pp_cxx_left_paren (cxx_pp);
1999 dump_type (TREE_TYPE (t), flags);
2000 pp_cxx_right_paren (cxx_pp);
2001 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
2002 if (flags & TFF_EXPR_IN_PARENS)
2003 pp_cxx_right_paren (cxx_pp);
2005 else
2006 dump_expr (op, flags);
2007 break;
2010 case CONSTRUCTOR:
2011 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
2013 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
2015 if (integer_zerop (idx))
2017 /* A NULL pointer-to-member constant. */
2018 pp_cxx_left_paren (cxx_pp);
2019 pp_cxx_left_paren (cxx_pp);
2020 dump_type (TREE_TYPE (t), flags);
2021 pp_cxx_right_paren (cxx_pp);
2022 pp_character (cxx_pp, '0');
2023 pp_cxx_right_paren (cxx_pp);
2024 break;
2026 else if (host_integerp (idx, 0))
2028 tree virtuals;
2029 unsigned HOST_WIDE_INT n;
2031 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
2032 t = TYPE_METHOD_BASETYPE (t);
2033 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
2035 n = tree_low_cst (idx, 0);
2037 /* Map vtable index back one, to allow for the null pointer to
2038 member. */
2039 --n;
2041 while (n > 0 && virtuals)
2043 --n;
2044 virtuals = TREE_CHAIN (virtuals);
2046 if (virtuals)
2048 dump_expr (BV_FN (virtuals),
2049 flags | TFF_EXPR_IN_PARENS);
2050 break;
2054 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
2056 dump_type (TREE_TYPE (t), 0);
2057 pp_cxx_left_paren (cxx_pp);
2058 pp_cxx_right_paren (cxx_pp);
2060 else
2062 pp_cxx_left_brace (cxx_pp);
2063 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
2064 pp_cxx_right_brace (cxx_pp);
2067 break;
2069 case OFFSET_REF:
2071 tree ob = TREE_OPERAND (t, 0);
2072 if (is_dummy_object (ob))
2074 t = TREE_OPERAND (t, 1);
2075 if (TREE_CODE (t) == FUNCTION_DECL)
2076 /* A::f */
2077 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
2078 else if (BASELINK_P (t))
2079 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
2080 flags | TFF_EXPR_IN_PARENS);
2081 else
2082 dump_decl (t, flags);
2084 else
2086 if (TREE_CODE (ob) == INDIRECT_REF)
2088 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
2089 pp_cxx_arrow (cxx_pp);
2090 pp_cxx_star (cxx_pp);
2092 else
2094 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
2095 pp_cxx_dot (cxx_pp);
2096 pp_cxx_star (cxx_pp);
2098 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2100 break;
2103 case TEMPLATE_PARM_INDEX:
2104 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
2105 break;
2107 case CAST_EXPR:
2108 if (TREE_OPERAND (t, 0) == NULL_TREE
2109 || TREE_CHAIN (TREE_OPERAND (t, 0)))
2111 dump_type (TREE_TYPE (t), flags);
2112 pp_cxx_left_paren (cxx_pp);
2113 dump_expr_list (TREE_OPERAND (t, 0), flags);
2114 pp_cxx_right_paren (cxx_pp);
2116 else
2118 pp_cxx_left_paren (cxx_pp);
2119 dump_type (TREE_TYPE (t), flags);
2120 pp_cxx_right_paren (cxx_pp);
2121 pp_cxx_left_paren (cxx_pp);
2122 dump_expr_list (TREE_OPERAND (t, 0), flags);
2123 pp_cxx_right_paren (cxx_pp);
2125 break;
2127 case STATIC_CAST_EXPR:
2128 pp_cxx_ws_string (cxx_pp, "static_cast");
2129 goto cast;
2130 case REINTERPRET_CAST_EXPR:
2131 pp_cxx_ws_string (cxx_pp, "reinterpret_cast");
2132 goto cast;
2133 case CONST_CAST_EXPR:
2134 pp_cxx_ws_string (cxx_pp, "const_cast");
2135 goto cast;
2136 case DYNAMIC_CAST_EXPR:
2137 pp_cxx_ws_string (cxx_pp, "dynamic_cast");
2138 cast:
2139 pp_cxx_begin_template_argument_list (cxx_pp);
2140 dump_type (TREE_TYPE (t), flags);
2141 pp_cxx_end_template_argument_list (cxx_pp);
2142 pp_cxx_left_paren (cxx_pp);
2143 dump_expr (TREE_OPERAND (t, 0), flags);
2144 pp_cxx_right_paren (cxx_pp);
2145 break;
2147 case ARROW_EXPR:
2148 dump_expr (TREE_OPERAND (t, 0), flags);
2149 pp_cxx_arrow (cxx_pp);
2150 break;
2152 case SIZEOF_EXPR:
2153 case ALIGNOF_EXPR:
2154 if (TREE_CODE (t) == SIZEOF_EXPR)
2155 pp_cxx_ws_string (cxx_pp, "sizeof");
2156 else
2158 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
2159 pp_cxx_ws_string (cxx_pp, "__alignof__");
2161 pp_cxx_whitespace (cxx_pp);
2162 pp_cxx_left_paren (cxx_pp);
2163 if (TYPE_P (TREE_OPERAND (t, 0)))
2164 dump_type (TREE_OPERAND (t, 0), flags);
2165 else
2166 dump_expr (TREE_OPERAND (t, 0), flags);
2167 pp_cxx_right_paren (cxx_pp);
2168 break;
2170 case AT_ENCODE_EXPR:
2171 pp_cxx_ws_string (cxx_pp, "@encode");
2172 pp_cxx_whitespace (cxx_pp);
2173 pp_cxx_left_paren (cxx_pp);
2174 dump_type (TREE_OPERAND (t, 0), flags);
2175 pp_cxx_right_paren (cxx_pp);
2176 break;
2178 case NOEXCEPT_EXPR:
2179 pp_cxx_ws_string (cxx_pp, "noexcept");
2180 pp_cxx_whitespace (cxx_pp);
2181 pp_cxx_left_paren (cxx_pp);
2182 dump_expr (TREE_OPERAND (t, 0), flags);
2183 pp_cxx_right_paren (cxx_pp);
2184 break;
2186 case REALPART_EXPR:
2187 case IMAGPART_EXPR:
2188 pp_cxx_ws_string (cxx_pp, operator_name_info[TREE_CODE (t)].name);
2189 pp_cxx_whitespace (cxx_pp);
2190 dump_expr (TREE_OPERAND (t, 0), flags);
2191 break;
2193 case DEFAULT_ARG:
2194 pp_string (cxx_pp, M_("<unparsed>"));
2195 break;
2197 case TRY_CATCH_EXPR:
2198 case WITH_CLEANUP_EXPR:
2199 case CLEANUP_POINT_EXPR:
2200 dump_expr (TREE_OPERAND (t, 0), flags);
2201 break;
2203 case PSEUDO_DTOR_EXPR:
2204 dump_expr (TREE_OPERAND (t, 2), flags);
2205 pp_cxx_dot (cxx_pp);
2206 dump_type (TREE_OPERAND (t, 0), flags);
2207 pp_cxx_colon_colon (cxx_pp);
2208 pp_cxx_complement (cxx_pp);
2209 dump_type (TREE_OPERAND (t, 1), flags);
2210 break;
2212 case TEMPLATE_ID_EXPR:
2213 dump_decl (t, flags);
2214 break;
2216 case BIND_EXPR:
2217 case STMT_EXPR:
2218 case EXPR_STMT:
2219 case STATEMENT_LIST:
2220 /* We don't yet have a way of dumping statements in a
2221 human-readable format. */
2222 pp_string (cxx_pp, "({...})");
2223 break;
2225 case LOOP_EXPR:
2226 pp_string (cxx_pp, "while (1) { ");
2227 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2228 pp_cxx_right_brace (cxx_pp);
2229 break;
2231 case EXIT_EXPR:
2232 pp_string (cxx_pp, "if (");
2233 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2234 pp_string (cxx_pp, ") break; ");
2235 break;
2237 case BASELINK:
2238 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2239 break;
2241 case EMPTY_CLASS_EXPR:
2242 dump_type (TREE_TYPE (t), flags);
2243 pp_cxx_left_paren (cxx_pp);
2244 pp_cxx_right_paren (cxx_pp);
2245 break;
2247 case NON_DEPENDENT_EXPR:
2248 dump_expr (TREE_OPERAND (t, 0), flags);
2249 break;
2251 case ARGUMENT_PACK_SELECT:
2252 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2253 break;
2255 case RECORD_TYPE:
2256 case UNION_TYPE:
2257 case ENUMERAL_TYPE:
2258 case REAL_TYPE:
2259 case VOID_TYPE:
2260 case BOOLEAN_TYPE:
2261 case INTEGER_TYPE:
2262 case COMPLEX_TYPE:
2263 case VECTOR_TYPE:
2264 pp_type_specifier_seq (cxx_pp, t);
2265 break;
2267 case TYPENAME_TYPE:
2268 /* We get here when we want to print a dependent type as an
2269 id-expression, without any disambiguator decoration. */
2270 pp_id_expression (cxx_pp, t);
2271 break;
2273 case TEMPLATE_TYPE_PARM:
2274 case BOUND_TEMPLATE_TEMPLATE_PARM:
2275 dump_type (t, flags);
2276 break;
2278 case TRAIT_EXPR:
2279 pp_cxx_trait_expression (cxx_pp, t);
2280 break;
2282 case VA_ARG_EXPR:
2283 pp_cxx_va_arg_expression (cxx_pp, t);
2284 break;
2286 case OFFSETOF_EXPR:
2287 pp_cxx_offsetof_expression (cxx_pp, t);
2288 break;
2290 case SCOPE_REF:
2291 dump_decl (t, flags);
2292 break;
2294 case EXPR_PACK_EXPANSION:
2295 case TYPEID_EXPR:
2296 case MEMBER_REF:
2297 case DOTSTAR_EXPR:
2298 case NEW_EXPR:
2299 case VEC_NEW_EXPR:
2300 case DELETE_EXPR:
2301 case VEC_DELETE_EXPR:
2302 case MODOP_EXPR:
2303 case ABS_EXPR:
2304 case CONJ_EXPR:
2305 case VECTOR_CST:
2306 case FIXED_CST:
2307 case UNORDERED_EXPR:
2308 case ORDERED_EXPR:
2309 case UNLT_EXPR:
2310 case UNLE_EXPR:
2311 case UNGT_EXPR:
2312 case UNGE_EXPR:
2313 case UNEQ_EXPR:
2314 case LTGT_EXPR:
2315 case COMPLEX_EXPR:
2316 case BIT_FIELD_REF:
2317 case FIX_TRUNC_EXPR:
2318 case FLOAT_EXPR:
2319 pp_expression (cxx_pp, t);
2320 break;
2322 case TRUTH_AND_EXPR:
2323 case TRUTH_OR_EXPR:
2324 case TRUTH_XOR_EXPR:
2325 if (flags & TFF_EXPR_IN_PARENS)
2326 pp_cxx_left_paren (cxx_pp);
2327 pp_expression (cxx_pp, t);
2328 if (flags & TFF_EXPR_IN_PARENS)
2329 pp_cxx_right_paren (cxx_pp);
2330 break;
2332 case OBJ_TYPE_REF:
2333 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2334 break;
2336 /* This list is incomplete, but should suffice for now.
2337 It is very important that `sorry' does not call
2338 `report_error_function'. That could cause an infinite loop. */
2339 default:
2340 pp_unsupported_tree (cxx_pp, t);
2341 /* fall through to ERROR_MARK... */
2342 case ERROR_MARK:
2343 pp_string (cxx_pp, M_("<expression error>"));
2344 break;
2348 static void
2349 dump_binary_op (const char *opstring, tree t, int flags)
2351 pp_cxx_left_paren (cxx_pp);
2352 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2353 pp_cxx_whitespace (cxx_pp);
2354 if (opstring)
2355 pp_cxx_ws_string (cxx_pp, opstring);
2356 else
2357 pp_string (cxx_pp, M_("<unknown operator>"));
2358 pp_cxx_whitespace (cxx_pp);
2359 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2360 pp_cxx_right_paren (cxx_pp);
2363 static void
2364 dump_unary_op (const char *opstring, tree t, int flags)
2366 if (flags & TFF_EXPR_IN_PARENS)
2367 pp_cxx_left_paren (cxx_pp);
2368 pp_cxx_ws_string (cxx_pp, opstring);
2369 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2370 if (flags & TFF_EXPR_IN_PARENS)
2371 pp_cxx_right_paren (cxx_pp);
2374 static void
2375 reinit_cxx_pp (void)
2377 pp_clear_output_area (cxx_pp);
2378 pp_base (cxx_pp)->padding = pp_none;
2379 pp_indentation (cxx_pp) = 0;
2380 pp_needs_newline (cxx_pp) = false;
2381 cxx_pp->enclosing_scope = current_function_decl;
2385 /* Exported interface to stringifying types, exprs and decls under TFF_*
2386 control. */
2388 const char *
2389 type_as_string (tree typ, int flags)
2391 reinit_cxx_pp ();
2392 pp_translate_identifiers (cxx_pp) = false;
2393 dump_type (typ, flags);
2394 return pp_formatted_text (cxx_pp);
2397 const char *
2398 type_as_string_translate (tree typ, int flags)
2400 reinit_cxx_pp ();
2401 dump_type (typ, flags);
2402 return pp_formatted_text (cxx_pp);
2405 const char *
2406 expr_as_string (tree decl, int flags)
2408 reinit_cxx_pp ();
2409 pp_translate_identifiers (cxx_pp) = false;
2410 dump_expr (decl, flags);
2411 return pp_formatted_text (cxx_pp);
2414 const char *
2415 decl_as_string (tree decl, int flags)
2417 reinit_cxx_pp ();
2418 pp_translate_identifiers (cxx_pp) = false;
2419 dump_decl (decl, flags);
2420 return pp_formatted_text (cxx_pp);
2423 const char *
2424 decl_as_string_translate (tree decl, int flags)
2426 reinit_cxx_pp ();
2427 dump_decl (decl, flags);
2428 return pp_formatted_text (cxx_pp);
2431 /* Generate the three forms of printable names for cxx_printable_name. */
2433 const char *
2434 lang_decl_name (tree decl, int v, bool translate)
2436 if (v >= 2)
2437 return (translate
2438 ? decl_as_string_translate (decl, TFF_DECL_SPECIFIERS)
2439 : decl_as_string (decl, TFF_DECL_SPECIFIERS));
2441 reinit_cxx_pp ();
2442 pp_translate_identifiers (cxx_pp) = translate;
2443 if (v == 1
2444 && (DECL_CLASS_SCOPE_P (decl)
2445 || (DECL_NAMESPACE_SCOPE_P (decl)
2446 && CP_DECL_CONTEXT (decl) != global_namespace)))
2448 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2449 pp_cxx_colon_colon (cxx_pp);
2452 if (TREE_CODE (decl) == FUNCTION_DECL)
2453 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2454 else
2455 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2457 return pp_formatted_text (cxx_pp);
2460 /* Return the location of a tree passed to %+ formats. */
2462 static location_t
2463 location_of (tree t)
2465 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2466 t = DECL_CONTEXT (t);
2467 else if (TYPE_P (t))
2468 t = TYPE_MAIN_DECL (t);
2469 else if (TREE_CODE (t) == OVERLOAD)
2470 t = OVL_FUNCTION (t);
2472 if (DECL_P (t))
2473 return DECL_SOURCE_LOCATION (t);
2474 return EXPR_LOC_OR_HERE (t);
2477 /* Now the interfaces from error et al to dump_type et al. Each takes an
2478 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2479 function. */
2481 static const char *
2482 decl_to_string (tree decl, int verbose)
2484 int flags = 0;
2486 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2487 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2488 flags = TFF_CLASS_KEY_OR_ENUM;
2489 if (verbose)
2490 flags |= TFF_DECL_SPECIFIERS;
2491 else if (TREE_CODE (decl) == FUNCTION_DECL)
2492 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2493 flags |= TFF_TEMPLATE_HEADER;
2495 reinit_cxx_pp ();
2496 dump_decl (decl, flags);
2497 return pp_formatted_text (cxx_pp);
2500 static const char *
2501 expr_to_string (tree decl)
2503 reinit_cxx_pp ();
2504 dump_expr (decl, 0);
2505 return pp_formatted_text (cxx_pp);
2508 static const char *
2509 fndecl_to_string (tree fndecl, int verbose)
2511 int flags;
2513 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2514 | TFF_TEMPLATE_HEADER;
2515 if (verbose)
2516 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2517 reinit_cxx_pp ();
2518 dump_decl (fndecl, flags);
2519 return pp_formatted_text (cxx_pp);
2523 static const char *
2524 code_to_string (enum tree_code c)
2526 return tree_code_name [c];
2529 const char *
2530 language_to_string (enum languages c)
2532 switch (c)
2534 case lang_c:
2535 return "C";
2537 case lang_cplusplus:
2538 return "C++";
2540 case lang_java:
2541 return "Java";
2543 default:
2544 gcc_unreachable ();
2546 return NULL;
2549 /* Return the proper printed version of a parameter to a C++ function. */
2551 static const char *
2552 parm_to_string (int p)
2554 reinit_cxx_pp ();
2555 if (p < 0)
2556 pp_string (cxx_pp, "'this'");
2557 else
2558 pp_decimal_int (cxx_pp, p + 1);
2559 return pp_formatted_text (cxx_pp);
2562 static const char *
2563 op_to_string (enum tree_code p)
2565 tree id = operator_name_info[(int) p].identifier;
2566 return id ? IDENTIFIER_POINTER (id) : M_("<unknown>");
2569 static const char *
2570 type_to_string (tree typ, int verbose)
2572 int flags = 0;
2573 if (verbose)
2574 flags |= TFF_CLASS_KEY_OR_ENUM;
2575 flags |= TFF_TEMPLATE_HEADER;
2577 reinit_cxx_pp ();
2578 dump_type (typ, flags);
2579 return pp_formatted_text (cxx_pp);
2582 static const char *
2583 assop_to_string (enum tree_code p)
2585 tree id = assignment_operator_name_info[(int) p].identifier;
2586 return id ? IDENTIFIER_POINTER (id) : M_("{unknown}");
2589 static const char *
2590 args_to_string (tree p, int verbose)
2592 int flags = 0;
2593 if (verbose)
2594 flags |= TFF_CLASS_KEY_OR_ENUM;
2596 if (p == NULL_TREE)
2597 return "";
2599 if (TYPE_P (TREE_VALUE (p)))
2600 return type_as_string_translate (p, flags);
2602 reinit_cxx_pp ();
2603 for (; p; p = TREE_CHAIN (p))
2605 if (TREE_VALUE (p) == null_node)
2606 pp_cxx_ws_string (cxx_pp, "NULL");
2607 else
2608 dump_type (error_type (TREE_VALUE (p)), flags);
2609 if (TREE_CHAIN (p))
2610 pp_separate_with_comma (cxx_pp);
2612 return pp_formatted_text (cxx_pp);
2615 static const char *
2616 cv_to_string (tree p, int v)
2618 reinit_cxx_pp ();
2619 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2620 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2621 return pp_formatted_text (cxx_pp);
2624 /* Langhook for print_error_function. */
2625 void
2626 cxx_print_error_function (diagnostic_context *context, const char *file,
2627 diagnostic_info *diagnostic)
2629 lhd_print_error_function (context, file, diagnostic);
2630 pp_base_set_prefix (context->printer, file);
2631 maybe_print_instantiation_context (context);
2634 static void
2635 cp_diagnostic_starter (diagnostic_context *context,
2636 diagnostic_info *diagnostic)
2638 diagnostic_report_current_module (context);
2639 cp_print_error_function (context, diagnostic);
2640 maybe_print_instantiation_context (context);
2641 maybe_print_constexpr_context (context);
2642 pp_base_set_prefix (context->printer, diagnostic_build_prefix (context,
2643 diagnostic));
2646 static void
2647 cp_diagnostic_finalizer (diagnostic_context *context,
2648 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2650 pp_base_destroy_prefix (context->printer);
2653 /* Print current function onto BUFFER, in the process of reporting
2654 a diagnostic message. Called from cp_diagnostic_starter. */
2655 static void
2656 cp_print_error_function (diagnostic_context *context,
2657 diagnostic_info *diagnostic)
2659 if (diagnostic_last_function_changed (context, diagnostic))
2661 const char *old_prefix = context->printer->prefix;
2662 const char *file = LOCATION_FILE (diagnostic->location);
2663 tree abstract_origin = diagnostic_abstract_origin (diagnostic);
2664 char *new_prefix = (file && abstract_origin == NULL)
2665 ? file_name_as_prefix (file) : NULL;
2667 pp_base_set_prefix (context->printer, new_prefix);
2669 if (current_function_decl == NULL)
2670 pp_base_string (context->printer, _("At global scope:"));
2671 else
2673 tree fndecl, ao;
2675 if (abstract_origin)
2677 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2678 while (TREE_CODE (ao) == BLOCK
2679 && BLOCK_ABSTRACT_ORIGIN (ao)
2680 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2681 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2682 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2683 fndecl = ao;
2685 else
2686 fndecl = current_function_decl;
2688 pp_printf (context->printer, function_category (fndecl),
2689 cxx_printable_name_translate (fndecl, 2));
2691 while (abstract_origin)
2693 location_t *locus;
2694 tree block = abstract_origin;
2696 locus = &BLOCK_SOURCE_LOCATION (block);
2697 fndecl = NULL;
2698 block = BLOCK_SUPERCONTEXT (block);
2699 while (block && TREE_CODE (block) == BLOCK
2700 && BLOCK_ABSTRACT_ORIGIN (block))
2702 ao = BLOCK_ABSTRACT_ORIGIN (block);
2704 while (TREE_CODE (ao) == BLOCK
2705 && BLOCK_ABSTRACT_ORIGIN (ao)
2706 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2707 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2709 if (TREE_CODE (ao) == FUNCTION_DECL)
2711 fndecl = ao;
2712 break;
2714 else if (TREE_CODE (ao) != BLOCK)
2715 break;
2717 block = BLOCK_SUPERCONTEXT (block);
2719 if (fndecl)
2720 abstract_origin = block;
2721 else
2723 while (block && TREE_CODE (block) == BLOCK)
2724 block = BLOCK_SUPERCONTEXT (block);
2726 if (block && TREE_CODE (block) == FUNCTION_DECL)
2727 fndecl = block;
2728 abstract_origin = NULL;
2730 if (fndecl)
2732 expanded_location s = expand_location (*locus);
2733 pp_base_character (context->printer, ',');
2734 pp_base_newline (context->printer);
2735 if (s.file != NULL)
2737 if (context->show_column && s.column != 0)
2738 pp_printf (context->printer,
2739 _(" inlined from %qs at %s:%d:%d"),
2740 cxx_printable_name_translate (fndecl, 2),
2741 s.file, s.line, s.column);
2742 else
2743 pp_printf (context->printer,
2744 _(" inlined from %qs at %s:%d"),
2745 cxx_printable_name_translate (fndecl, 2),
2746 s.file, s.line);
2749 else
2750 pp_printf (context->printer, _(" inlined from %qs"),
2751 cxx_printable_name_translate (fndecl, 2));
2754 pp_base_character (context->printer, ':');
2756 pp_base_newline (context->printer);
2758 diagnostic_set_last_function (context, diagnostic);
2759 pp_base_destroy_prefix (context->printer);
2760 context->printer->prefix = old_prefix;
2764 /* Returns a description of FUNCTION using standard terminology. The
2765 result is a format string of the form "In CATEGORY %qs". */
2766 static const char *
2767 function_category (tree fn)
2769 /* We can get called from the middle-end for diagnostics of function
2770 clones. Make sure we have language specific information before
2771 dereferencing it. */
2772 if (DECL_LANG_SPECIFIC (STRIP_TEMPLATE (fn))
2773 && DECL_FUNCTION_MEMBER_P (fn))
2775 if (DECL_STATIC_FUNCTION_P (fn))
2776 return _("In static member function %qs");
2777 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2778 return _("In copy constructor %qs");
2779 else if (DECL_CONSTRUCTOR_P (fn))
2780 return _("In constructor %qs");
2781 else if (DECL_DESTRUCTOR_P (fn))
2782 return _("In destructor %qs");
2783 else if (LAMBDA_FUNCTION_P (fn))
2784 return _("In lambda function");
2785 else
2786 return _("In member function %qs");
2788 else
2789 return _("In function %qs");
2792 /* Report the full context of a current template instantiation,
2793 onto BUFFER. */
2794 static void
2795 print_instantiation_full_context (diagnostic_context *context)
2797 struct tinst_level *p = current_instantiation ();
2798 location_t location = input_location;
2800 if (p)
2802 if (current_function_decl != p->decl
2803 && current_function_decl != NULL_TREE)
2804 /* We can get here during the processing of some synthesized
2805 method. Then, P->DECL will be the function that's causing
2806 the synthesis. */
2808 else
2810 if (current_function_decl == p->decl)
2811 /* Avoid redundancy with the "In function" line. */;
2812 else
2813 pp_verbatim (context->printer,
2814 _("%s: In instantiation of %qs:\n"),
2815 LOCATION_FILE (location),
2816 decl_as_string_translate (p->decl,
2817 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2819 location = p->locus;
2820 p = p->next;
2824 print_instantiation_partial_context (context, p, location);
2827 /* Helper function of print_instantiation_partial_context() that
2828 prints a single line of instantiation context. */
2830 static void
2831 print_instantiation_partial_context_line (diagnostic_context *context,
2832 const struct tinst_level *t,
2833 location_t loc, bool recursive_p)
2835 expanded_location xloc;
2836 xloc = expand_location (loc);
2838 if (t != NULL)
2840 const char *str;
2841 str = decl_as_string_translate (t->decl,
2842 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE);
2843 if (context->show_column)
2844 pp_verbatim (context->printer,
2845 recursive_p
2846 ? _("%s:%d:%d: recursively instantiated from %qs\n")
2847 : _("%s:%d:%d: instantiated from %qs\n"),
2848 xloc.file, xloc.line, xloc.column, str);
2849 else
2850 pp_verbatim (context->printer,
2851 recursive_p
2852 ? _("%s:%d: recursively instantiated from %qs\n")
2853 : _("%s:%d: recursively instantiated from %qs\n"),
2854 xloc.file, xloc.line, str);
2856 else
2858 if (context->show_column)
2859 pp_verbatim (context->printer,
2860 recursive_p
2861 ? _("%s:%d:%d: recursively instantiated from here")
2862 : _("%s:%d:%d: instantiated from here"),
2863 xloc.file, xloc.line, xloc.column);
2864 else
2865 pp_verbatim (context->printer,
2866 recursive_p
2867 ? _("%s:%d: recursively instantiated from here")
2868 : _("%s:%d: instantiated from here"),
2869 xloc.file, xloc.line);
2873 /* Same as print_instantiation_full_context but less verbose. */
2875 static void
2876 print_instantiation_partial_context (diagnostic_context *context,
2877 struct tinst_level *t0, location_t loc)
2879 struct tinst_level *t;
2880 int n_total = 0;
2881 int n;
2882 location_t prev_loc = loc;
2884 for (t = t0; t != NULL; t = t->next)
2885 if (prev_loc != t->locus)
2887 prev_loc = t->locus;
2888 n_total++;
2891 t = t0;
2893 if (n_total >= 12)
2895 int skip = n_total - 10;
2896 for (n = 0; n < 5; n++)
2898 gcc_assert (t != NULL);
2899 if (loc != t->locus)
2900 print_instantiation_partial_context_line (context, t, loc,
2901 /*recursive_p=*/false);
2902 loc = t->locus;
2903 t = t->next;
2905 if (t != NULL && skip > 1)
2907 expanded_location xloc;
2908 xloc = expand_location (loc);
2909 if (context->show_column)
2910 pp_verbatim (context->printer,
2911 _("%s:%d:%d: [ skipping %d instantiation contexts ]\n"),
2912 xloc.file, xloc.line, xloc.column, skip);
2913 else
2914 pp_verbatim (context->printer,
2915 _("%s:%d: [ skipping %d instantiation contexts ]\n"),
2916 xloc.file, xloc.line, skip);
2918 do {
2919 loc = t->locus;
2920 t = t->next;
2921 } while (t != NULL && --skip > 0);
2925 while (t != NULL)
2927 while (t->next != NULL && t->locus == t->next->locus)
2929 loc = t->locus;
2930 t = t->next;
2932 print_instantiation_partial_context_line (context, t, loc,
2933 t->locus == loc);
2934 loc = t->locus;
2935 t = t->next;
2937 print_instantiation_partial_context_line (context, NULL, loc,
2938 /*recursive_p=*/false);
2939 pp_base_newline (context->printer);
2942 /* Called from cp_thing to print the template context for an error. */
2943 static void
2944 maybe_print_instantiation_context (diagnostic_context *context)
2946 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2947 return;
2949 record_last_problematic_instantiation ();
2950 print_instantiation_full_context (context);
2953 /* Report the bare minimum context of a template instantiation. */
2954 void
2955 print_instantiation_context (void)
2957 print_instantiation_partial_context
2958 (global_dc, current_instantiation (), input_location);
2959 diagnostic_flush_buffer (global_dc);
2962 /* Report what constexpr call(s) we're trying to expand, if any. */
2964 void
2965 maybe_print_constexpr_context (diagnostic_context *context)
2967 VEC(tree,heap) *call_stack = cx_error_context ();
2968 unsigned ix;
2969 tree t;
2971 FOR_EACH_VEC_ELT (tree, call_stack, ix, t)
2973 expanded_location xloc = expand_location (EXPR_LOCATION (t));
2974 const char *s = expr_as_string (t, 0);
2975 if (context->show_column)
2976 pp_verbatim (context->printer,
2977 _("%s:%d:%d: in constexpr expansion of %qs"),
2978 xloc.file, xloc.line, xloc.column, s);
2979 else
2980 pp_verbatim (context->printer,
2981 _("%s:%d: in constexpr expansion of %qs"),
2982 xloc.file, xloc.line, s);
2983 pp_base_newline (context->printer);
2987 /* Called from output_format -- during diagnostic message processing --
2988 to handle C++ specific format specifier with the following meanings:
2989 %A function argument-list.
2990 %C tree code.
2991 %D declaration.
2992 %E expression.
2993 %F function declaration.
2994 %L language as used in extern "lang".
2995 %O binary operator.
2996 %P function parameter whose position is indicated by an integer.
2997 %Q assignment operator.
2998 %T type.
2999 %V cv-qualifier. */
3000 static bool
3001 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
3002 int precision, bool wide, bool set_locus, bool verbose)
3004 const char *result;
3005 tree t = NULL;
3006 #define next_tree (t = va_arg (*text->args_ptr, tree))
3007 #define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int))
3008 #define next_lang ((enum languages) va_arg (*text->args_ptr, int))
3009 #define next_int va_arg (*text->args_ptr, int)
3011 if (precision != 0 || wide)
3012 return false;
3014 if (text->locus == NULL)
3015 set_locus = false;
3017 switch (*spec)
3019 case 'A': result = args_to_string (next_tree, verbose); break;
3020 case 'C': result = code_to_string (next_tcode); break;
3021 case 'D':
3023 tree temp = next_tree;
3024 if (DECL_P (temp)
3025 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
3027 temp = DECL_DEBUG_EXPR (temp);
3028 if (!DECL_P (temp))
3030 result = expr_to_string (temp);
3031 break;
3034 result = decl_to_string (temp, verbose);
3036 break;
3037 case 'E': result = expr_to_string (next_tree); break;
3038 case 'F': result = fndecl_to_string (next_tree, verbose); break;
3039 case 'L': result = language_to_string (next_lang); break;
3040 case 'O': result = op_to_string (next_tcode); break;
3041 case 'P': result = parm_to_string (next_int); break;
3042 case 'Q': result = assop_to_string (next_tcode); break;
3043 case 'T': result = type_to_string (next_tree, verbose); break;
3044 case 'V': result = cv_to_string (next_tree, verbose); break;
3046 case 'K':
3047 percent_K_format (text);
3048 return true;
3050 default:
3051 return false;
3054 pp_base_string (pp, result);
3055 if (set_locus && t != NULL)
3056 *text->locus = location_of (t);
3057 return true;
3058 #undef next_tree
3059 #undef next_tcode
3060 #undef next_lang
3061 #undef next_int
3064 /* Warn about the use of C++0x features when appropriate. */
3065 void
3066 maybe_warn_cpp0x (cpp0x_warn_str str)
3068 if ((cxx_dialect == cxx98) && !in_system_header)
3069 /* We really want to suppress this warning in system headers,
3070 because libstdc++ uses variadic templates even when we aren't
3071 in C++0x mode. */
3072 switch (str)
3074 case CPP0X_INITIALIZER_LISTS:
3075 pedwarn (input_location, 0,
3076 "extended initializer lists "
3077 "only available with -std=c++0x or -std=gnu++0x");
3078 break;
3079 case CPP0X_EXPLICIT_CONVERSION:
3080 pedwarn (input_location, 0,
3081 "explicit conversion operators "
3082 "only available with -std=c++0x or -std=gnu++0x");
3083 break;
3084 case CPP0X_VARIADIC_TEMPLATES:
3085 pedwarn (input_location, 0,
3086 "variadic templates "
3087 "only available with -std=c++0x or -std=gnu++0x");
3088 break;
3089 case CPP0X_LAMBDA_EXPR:
3090 pedwarn (input_location, 0,
3091 "lambda expressions "
3092 "only available with -std=c++0x or -std=gnu++0x");
3093 break;
3094 case CPP0X_AUTO:
3095 pedwarn (input_location, 0,
3096 "C++0x auto only available with -std=c++0x or -std=gnu++0x");
3097 break;
3098 case CPP0X_SCOPED_ENUMS:
3099 pedwarn (input_location, 0,
3100 "scoped enums only available with -std=c++0x or -std=gnu++0x");
3101 break;
3102 case CPP0X_DEFAULTED_DELETED:
3103 pedwarn (input_location, 0,
3104 "defaulted and deleted functions "
3105 "only available with -std=c++0x or -std=gnu++0x");
3106 break;
3107 case CPP0X_INLINE_NAMESPACES:
3108 pedwarn (input_location, OPT_pedantic,
3109 "inline namespaces "
3110 "only available with -std=c++0x or -std=gnu++0x");
3111 break;
3112 default:
3113 gcc_unreachable();
3117 /* Warn about the use of variadic templates when appropriate. */
3118 void
3119 maybe_warn_variadic_templates (void)
3121 maybe_warn_cpp0x (CPP0X_VARIADIC_TEMPLATES);
3125 /* Issue an ISO C++98 pedantic warning at LOCATION, conditional on
3126 option OPT with text GMSGID. Use this function to report
3127 diagnostics for constructs that are invalid C++98, but valid
3128 C++0x. */
3129 bool
3130 pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...)
3132 diagnostic_info diagnostic;
3133 va_list ap;
3135 va_start (ap, gmsgid);
3136 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
3137 (cxx_dialect == cxx98) ? DK_PEDWARN : DK_WARNING);
3138 diagnostic.option_index = opt;
3139 va_end (ap);
3140 return report_diagnostic (&diagnostic);