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,
4 2003, 2004, 2005, 2006, 2007, 2008, 2009 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)
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/>. */
23 #include "coretypes.h"
30 #include "diagnostic.h"
31 #include "langhooks-def.h"
32 #include "cxx-pretty-print.h"
34 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
36 /* The global buffer where we dump everything. It is there only for
37 transitional purpose. It is expected, in the near future, to be
38 completely removed. */
39 static cxx_pretty_printer scratch_pretty_printer;
40 #define cxx_pp (&scratch_pretty_printer)
42 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
44 static const char *args_to_string (tree, int);
45 static const char *assop_to_string (enum tree_code);
46 static const char *code_to_string (enum tree_code);
47 static const char *cv_to_string (tree, int);
48 static const char *decl_to_string (tree, int);
49 static const char *expr_to_string (tree);
50 static const char *fndecl_to_string (tree, int);
51 static const char *op_to_string (enum tree_code);
52 static const char *parm_to_string (int);
53 static const char *type_to_string (tree, int);
55 static void dump_type (tree, int);
56 static void dump_typename (tree, int);
57 static void dump_simple_decl (tree, tree, int);
58 static void dump_decl (tree, int);
59 static void dump_template_decl (tree, int);
60 static void dump_function_decl (tree, int);
61 static void dump_expr (tree, int);
62 static void dump_unary_op (const char *, tree, int);
63 static void dump_binary_op (const char *, tree, int);
64 static void dump_aggr_type (tree, int);
65 static void dump_type_prefix (tree, int);
66 static void dump_type_suffix (tree, int);
67 static void dump_function_name (tree, int);
68 static void dump_call_expr_args (tree, int, bool);
69 static void dump_aggr_init_expr_args (tree, int, bool);
70 static void dump_expr_list (tree, int);
71 static void dump_global_iord (tree);
72 static void dump_parameters (tree, int);
73 static void dump_exception_spec (tree, int);
74 static void dump_template_argument (tree, int);
75 static void dump_template_argument_list (tree, int);
76 static void dump_template_parameter (tree, int);
77 static void dump_template_bindings (tree, tree);
78 static void dump_scope (tree, int);
79 static void dump_template_parms (tree, int, int);
81 static const char *function_category (tree);
82 static void maybe_print_instantiation_context (diagnostic_context *);
83 static void print_instantiation_full_context (diagnostic_context *);
84 static void print_instantiation_partial_context (diagnostic_context *,
87 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
88 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
89 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
91 static bool cp_printer (pretty_printer *, text_info *, const char *,
92 int, bool, bool, bool);
93 static location_t location_of (tree);
98 diagnostic_starter (global_dc) = cp_diagnostic_starter;
99 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
100 diagnostic_format_decoder (global_dc) = cp_printer;
102 pp_construct (pp_base (cxx_pp), NULL, 0);
103 pp_cxx_pretty_printer_init (cxx_pp);
106 /* Dump a scope, if deemed necessary. */
109 dump_scope (tree scope, int flags)
111 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
113 if (scope == NULL_TREE)
116 if (TREE_CODE (scope) == NAMESPACE_DECL)
118 if (scope != global_namespace)
120 dump_decl (scope, f);
121 pp_cxx_colon_colon (cxx_pp);
124 else if (AGGREGATE_TYPE_P (scope))
126 dump_type (scope, f);
127 pp_cxx_colon_colon (cxx_pp);
129 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
131 dump_function_decl (scope, f);
132 pp_cxx_colon_colon (cxx_pp);
136 /* Dump the template ARGument under control of FLAGS. */
139 dump_template_argument (tree arg, int flags)
141 if (ARGUMENT_PACK_P (arg))
142 dump_template_argument_list (ARGUMENT_PACK_ARGS (arg), flags);
143 else if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
144 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
147 if (TREE_CODE (arg) == TREE_LIST)
148 arg = TREE_VALUE (arg);
150 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
154 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
158 dump_template_argument_list (tree args, int flags)
160 int n = TREE_VEC_LENGTH (args);
164 for (i = 0; i< n; ++i)
166 tree arg = TREE_VEC_ELT (args, i);
168 /* Only print a comma if we know there is an argument coming. In
169 the case of an empty template argument pack, no actual
170 argument will be printed. */
172 && (!ARGUMENT_PACK_P (arg)
173 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
174 pp_separate_with_comma (cxx_pp);
176 dump_template_argument (arg, flags);
181 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
184 dump_template_parameter (tree parm, int flags)
189 if (parm == error_mark_node)
192 p = TREE_VALUE (parm);
193 a = TREE_PURPOSE (parm);
195 if (TREE_CODE (p) == TYPE_DECL)
197 if (flags & TFF_DECL_SPECIFIERS)
199 pp_cxx_identifier (cxx_pp, "class");
200 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p)))
201 pp_cxx_identifier (cxx_pp, "...");
203 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
205 else if (DECL_NAME (p))
206 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
208 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
211 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
213 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
215 pp_cxx_whitespace (cxx_pp);
217 pp_cxx_whitespace (cxx_pp);
218 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
219 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
221 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
225 /* Dump, under control of FLAGS, a template-parameter-list binding.
226 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
230 dump_template_bindings (tree parms, tree args)
236 tree p = TREE_VALUE (parms);
237 int lvl = TMPL_PARMS_DEPTH (parms);
241 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
243 tree arg = NULL_TREE;
245 /* Don't crash if we had an invalid argument list. */
246 if (TMPL_ARGS_DEPTH (args) >= lvl)
248 tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
249 if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
250 arg = TREE_VEC_ELT (lvl_args, arg_idx);
254 pp_separate_with_comma (cxx_pp);
255 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
256 pp_cxx_whitespace (cxx_pp);
258 pp_cxx_whitespace (cxx_pp);
260 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
262 pp_identifier (cxx_pp, "<missing>");
268 parms = TREE_CHAIN (parms);
272 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
276 dump_type (tree t, int flags)
281 if (TYPE_PTRMEMFUNC_P (t))
284 switch (TREE_CODE (t))
287 if (t == init_list_type_node)
288 pp_identifier (cxx_pp, "<brace-enclosed initializer list>");
290 pp_identifier (cxx_pp, "<unresolved overloaded function type>");
294 /* A list of function parms. */
295 dump_parameters (t, flags);
298 case IDENTIFIER_NODE:
299 pp_cxx_tree_identifier (cxx_pp, t);
303 dump_type (BINFO_TYPE (t), flags);
309 dump_aggr_type (t, flags);
313 if (flags & TFF_CHASE_TYPEDEF)
315 dump_type (DECL_ORIGINAL_TYPE (t)
316 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
319 /* Else fall through. */
323 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
332 case FIXED_POINT_TYPE:
333 pp_type_specifier_seq (cxx_pp, t);
336 case TEMPLATE_TEMPLATE_PARM:
337 /* For parameters inside template signature. */
338 if (TYPE_IDENTIFIER (t))
339 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
341 pp_cxx_canonical_template_parameter (cxx_pp, t);
344 case BOUND_TEMPLATE_TEMPLATE_PARM:
346 tree args = TYPE_TI_ARGS (t);
347 pp_cxx_cv_qualifier_seq (cxx_pp, t);
348 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
349 pp_cxx_begin_template_argument_list (cxx_pp);
350 dump_template_argument_list (args, flags);
351 pp_cxx_end_template_argument_list (cxx_pp);
355 case TEMPLATE_TYPE_PARM:
356 pp_cxx_cv_qualifier_seq (cxx_pp, t);
357 if (TYPE_IDENTIFIER (t))
358 pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
360 pp_cxx_canonical_template_parameter
361 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
364 /* This is not always necessary for pointers and such, but doing this
365 reduces code size. */
374 dump_type_prefix (t, flags);
375 dump_type_suffix (t, flags);
379 pp_cxx_cv_qualifier_seq (cxx_pp, t);
380 pp_cxx_identifier (cxx_pp,
381 TYPENAME_IS_ENUM_P (t) ? "enum"
382 : TYPENAME_IS_CLASS_P (t) ? "class"
384 dump_typename (t, flags);
387 case UNBOUND_CLASS_TEMPLATE:
388 dump_type (TYPE_CONTEXT (t), flags);
389 pp_cxx_colon_colon (cxx_pp);
390 pp_cxx_identifier (cxx_pp, "template");
391 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
395 pp_cxx_identifier (cxx_pp, "__typeof__");
396 pp_cxx_whitespace (cxx_pp);
397 pp_cxx_left_paren (cxx_pp);
398 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
399 pp_cxx_right_paren (cxx_pp);
402 case TYPE_PACK_EXPANSION:
403 dump_type (PACK_EXPANSION_PATTERN (t), flags);
404 pp_cxx_identifier (cxx_pp, "...");
407 case TYPE_ARGUMENT_PACK:
408 dump_template_argument (t, flags);
412 pp_cxx_identifier (cxx_pp, "decltype");
413 pp_cxx_whitespace (cxx_pp);
414 pp_cxx_left_paren (cxx_pp);
415 dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
416 pp_cxx_right_paren (cxx_pp);
420 pp_unsupported_tree (cxx_pp, t);
421 /* Fall through to error. */
424 pp_identifier (cxx_pp, "<type error>");
429 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
433 dump_typename (tree t, int flags)
435 tree ctx = TYPE_CONTEXT (t);
437 if (TREE_CODE (ctx) == TYPENAME_TYPE)
438 dump_typename (ctx, flags);
440 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
441 pp_cxx_colon_colon (cxx_pp);
442 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
445 /* Return the name of the supplied aggregate, or enumeral type. */
448 class_key_or_enum_as_string (tree t)
450 if (TREE_CODE (t) == ENUMERAL_TYPE)
452 if (SCOPED_ENUM_P (t))
457 else if (TREE_CODE (t) == UNION_TYPE)
459 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
465 /* Print out a class declaration T under the control of FLAGS,
466 in the form `class foo'. */
469 dump_aggr_type (tree t, int flags)
472 const char *variety = class_key_or_enum_as_string (t);
476 pp_cxx_cv_qualifier_seq (cxx_pp, t);
478 if (flags & TFF_CLASS_KEY_OR_ENUM)
479 pp_cxx_identifier (cxx_pp, variety);
481 if (flags & TFF_CHASE_TYPEDEF)
482 t = TYPE_MAIN_VARIANT (t);
484 name = TYPE_NAME (t);
488 typdef = !DECL_ARTIFICIAL (name);
489 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
490 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
491 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
492 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
494 if (! (flags & TFF_UNQUALIFIED_NAME))
495 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
496 flags &= ~TFF_UNQUALIFIED_NAME;
499 /* Because the template names are mangled, we have to locate
500 the most general template, and use that name. */
501 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
503 while (DECL_TEMPLATE_INFO (tpl))
504 tpl = DECL_TI_TEMPLATE (tpl);
507 name = DECL_NAME (name);
510 if (name == 0 || ANON_AGGRNAME_P (name))
512 if (flags & TFF_CLASS_KEY_OR_ENUM)
513 pp_identifier (cxx_pp, "<anonymous>");
515 pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
518 pp_cxx_tree_identifier (cxx_pp, name);
520 dump_template_parms (TYPE_TEMPLATE_INFO (t),
521 !CLASSTYPE_USE_TEMPLATE (t),
522 flags & ~TFF_TEMPLATE_HEADER);
525 /* Dump into the obstack the initial part of the output for a given type.
526 This is necessary when dealing with things like functions returning
529 return type of `int (* fee ())()': pointer -> function -> int. Both
530 pointer (and reference and offset) and function (and member) types must
531 deal with prefix and suffix.
533 Arrays must also do this for DECL nodes, like int a[], and for things like
537 dump_type_prefix (tree t, int flags)
539 if (TYPE_PTRMEMFUNC_P (t))
541 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
545 switch (TREE_CODE (t))
550 tree sub = TREE_TYPE (t);
552 dump_type_prefix (sub, flags);
553 if (TREE_CODE (sub) == ARRAY_TYPE
554 || TREE_CODE (sub) == FUNCTION_TYPE)
556 pp_cxx_whitespace (cxx_pp);
557 pp_cxx_left_paren (cxx_pp);
559 if (TREE_CODE (t) == POINTER_TYPE)
560 pp_character(cxx_pp, '*');
561 else if (TREE_CODE (t) == REFERENCE_TYPE)
563 if (TYPE_REF_IS_RVALUE (t))
564 pp_string (cxx_pp, "&&");
566 pp_character (cxx_pp, '&');
568 pp_base (cxx_pp)->padding = pp_before;
569 pp_cxx_cv_qualifier_seq (cxx_pp, t);
575 dump_type_prefix (TREE_TYPE (t), flags);
576 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
578 pp_maybe_space (cxx_pp);
579 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
580 pp_cxx_left_paren (cxx_pp);
581 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
582 pp_cxx_colon_colon (cxx_pp);
584 pp_cxx_star (cxx_pp);
585 pp_cxx_cv_qualifier_seq (cxx_pp, t);
586 pp_base (cxx_pp)->padding = pp_before;
589 /* This can be reached without a pointer when dealing with
590 templates, e.g. std::is_function. */
592 dump_type_prefix (TREE_TYPE (t), flags);
596 dump_type_prefix (TREE_TYPE (t), flags);
597 pp_maybe_space (cxx_pp);
598 pp_cxx_left_paren (cxx_pp);
599 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
600 pp_cxx_colon_colon (cxx_pp);
604 dump_type_prefix (TREE_TYPE (t), flags);
608 case IDENTIFIER_NODE:
613 case TEMPLATE_TYPE_PARM:
614 case TEMPLATE_TEMPLATE_PARM:
615 case BOUND_TEMPLATE_TEMPLATE_PARM:
627 case TYPE_PACK_EXPANSION:
628 case FIXED_POINT_TYPE:
629 dump_type (t, flags);
630 pp_base (cxx_pp)->padding = pp_before;
634 pp_unsupported_tree (cxx_pp, t);
637 pp_identifier (cxx_pp, "<typeprefixerror>");
642 /* Dump the suffix of type T, under control of FLAGS. This is the part
643 which appears after the identifier (or function parms). */
646 dump_type_suffix (tree t, int flags)
648 if (TYPE_PTRMEMFUNC_P (t))
649 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
651 switch (TREE_CODE (t))
656 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
657 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
658 pp_cxx_right_paren (cxx_pp);
659 dump_type_suffix (TREE_TYPE (t), flags);
666 if (TREE_CODE (t) == METHOD_TYPE)
667 /* Can only be reached through a pointer. */
668 pp_cxx_right_paren (cxx_pp);
669 arg = TYPE_ARG_TYPES (t);
670 if (TREE_CODE (t) == METHOD_TYPE)
671 arg = TREE_CHAIN (arg);
673 /* Function pointers don't have default args. Not in standard C++,
674 anyway; they may in g++, but we'll just pretend otherwise. */
675 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
677 if (TREE_CODE (t) == METHOD_TYPE)
678 pp_cxx_cv_qualifier_seq
679 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
681 pp_cxx_cv_qualifier_seq (cxx_pp, t);
682 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
683 dump_type_suffix (TREE_TYPE (t), flags);
688 pp_maybe_space (cxx_pp);
689 pp_cxx_left_bracket (cxx_pp);
692 tree dtype = TYPE_DOMAIN (t);
693 tree max = TYPE_MAX_VALUE (dtype);
694 if (host_integerp (max, 0))
695 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
696 else if (TREE_CODE (max) == MINUS_EXPR)
697 dump_expr (TREE_OPERAND (max, 0),
698 flags & ~TFF_EXPR_IN_PARENS);
700 dump_expr (fold_build2 (PLUS_EXPR, dtype, max,
701 build_int_cst (dtype, 1)),
702 flags & ~TFF_EXPR_IN_PARENS);
704 pp_cxx_right_bracket (cxx_pp);
705 dump_type_suffix (TREE_TYPE (t), flags);
709 case IDENTIFIER_NODE:
714 case TEMPLATE_TYPE_PARM:
715 case TEMPLATE_TEMPLATE_PARM:
716 case BOUND_TEMPLATE_TEMPLATE_PARM:
728 case TYPE_PACK_EXPANSION:
729 case FIXED_POINT_TYPE:
733 pp_unsupported_tree (cxx_pp, t);
735 /* Don't mark it here, we should have already done in
742 dump_global_iord (tree t)
744 const char *p = NULL;
746 if (DECL_GLOBAL_CTOR_P (t))
748 else if (DECL_GLOBAL_DTOR_P (t))
753 pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
757 dump_simple_decl (tree t, tree type, int flags)
759 if (flags & TFF_DECL_SPECIFIERS)
761 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
762 pp_maybe_space (cxx_pp);
764 if (! (flags & TFF_UNQUALIFIED_NAME)
765 && (!DECL_INITIAL (t)
766 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
767 dump_scope (CP_DECL_CONTEXT (t), flags);
768 flags &= ~TFF_UNQUALIFIED_NAME;
769 if ((flags & TFF_DECL_SPECIFIERS)
770 && DECL_TEMPLATE_PARM_P (t)
771 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
772 pp_identifier (cxx_pp, "...");
774 dump_decl (DECL_NAME (t), flags);
776 pp_identifier (cxx_pp, "<anonymous>");
777 if (flags & TFF_DECL_SPECIFIERS)
778 dump_type_suffix (type, flags);
781 /* Dump a human readable string for the decl T under control of FLAGS. */
784 dump_decl (tree t, int flags)
789 switch (TREE_CODE (t))
792 /* Don't say 'typedef class A' */
793 if (DECL_ARTIFICIAL (t))
795 if ((flags & TFF_DECL_SPECIFIERS)
796 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
798 /* Say `class T' not just `T'. */
799 pp_cxx_identifier (cxx_pp, "class");
801 /* Emit the `...' for a parameter pack. */
802 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
803 pp_cxx_identifier (cxx_pp, "...");
806 dump_type (TREE_TYPE (t), flags);
809 if (flags & TFF_DECL_SPECIFIERS)
810 pp_cxx_identifier (cxx_pp, "typedef");
811 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
812 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
817 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
819 pp_string (cxx_pp, "vtable for ");
820 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
821 dump_type (DECL_CONTEXT (t), flags);
824 /* Else fall through. */
827 dump_simple_decl (t, TREE_TYPE (t), flags);
831 pp_string (cxx_pp, "<return value> ");
832 dump_simple_decl (t, TREE_TYPE (t), flags);
836 if (flags & TFF_DECL_SPECIFIERS)
837 pp_cxx_declaration (cxx_pp, t);
840 if (! (flags & TFF_UNQUALIFIED_NAME))
841 dump_scope (CP_DECL_CONTEXT (t), flags);
842 flags &= ~TFF_UNQUALIFIED_NAME;
843 if (DECL_NAME (t) == NULL_TREE)
844 pp_identifier (cxx_pp, "<unnamed>");
846 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
851 pp_expression (cxx_pp, t);
855 dump_decl (TREE_OPERAND (t, 0), flags);
856 pp_cxx_left_bracket (cxx_pp);
857 dump_decl (TREE_OPERAND (t, 1), flags);
858 pp_cxx_right_bracket (cxx_pp);
861 /* So that we can do dump_decl on an aggr type. */
865 dump_type (t, flags);
869 /* This is a pseudo destructor call which has not been folded into
870 a PSEUDO_DTOR_EXPR yet. */
871 pp_cxx_complement (cxx_pp);
872 dump_type (TREE_OPERAND (t, 0), flags);
879 /* These special cases are duplicated here so that other functions
880 can feed identifiers to error and get them demangled properly. */
881 case IDENTIFIER_NODE:
882 if (IDENTIFIER_TYPENAME_P (t))
884 pp_cxx_identifier (cxx_pp, "operator");
885 /* Not exactly IDENTIFIER_TYPE_VALUE. */
886 dump_type (TREE_TYPE (t), flags);
890 pp_cxx_tree_identifier (cxx_pp, t);
897 if (DECL_CLASS_SCOPE_P (t))
899 dump_type (DECL_CONTEXT (t), flags);
900 pp_cxx_colon_colon (cxx_pp);
902 else if (DECL_CONTEXT (t))
904 dump_decl (DECL_CONTEXT (t), flags);
905 pp_cxx_colon_colon (cxx_pp);
907 dump_decl (DECL_NAME (t), flags);
911 /* If there's only one function, just treat it like an ordinary
917 if (! DECL_LANG_SPECIFIC (t))
918 pp_identifier (cxx_pp, "<built-in>");
919 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
920 dump_global_iord (t);
922 dump_function_decl (t, flags);
926 dump_template_decl (t, flags);
929 case TEMPLATE_ID_EXPR:
931 tree name = TREE_OPERAND (t, 0);
933 if (is_overloaded_fn (name))
934 name = DECL_NAME (get_first_fn (name));
935 dump_decl (name, flags);
936 pp_cxx_begin_template_argument_list (cxx_pp);
937 if (TREE_OPERAND (t, 1))
938 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
939 pp_cxx_end_template_argument_list (cxx_pp);
944 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
948 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
949 || (DECL_INITIAL (t) &&
950 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
951 dump_simple_decl (t, TREE_TYPE (t), flags);
952 else if (DECL_NAME (t))
953 dump_decl (DECL_NAME (t), flags);
954 else if (DECL_INITIAL (t))
955 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
957 pp_identifier (cxx_pp, "<enumerator>");
961 pp_cxx_identifier (cxx_pp, "using");
962 dump_type (USING_DECL_SCOPE (t), flags);
963 pp_cxx_colon_colon (cxx_pp);
964 dump_decl (DECL_NAME (t), flags);
968 pp_cxx_declaration (cxx_pp, t);
972 dump_decl (BASELINK_FUNCTIONS (t), flags);
975 case NON_DEPENDENT_EXPR:
976 dump_expr (t, flags);
979 case TEMPLATE_TYPE_PARM:
980 if (flags & TFF_DECL_SPECIFIERS)
981 pp_cxx_declaration (cxx_pp, t);
983 pp_type_id (cxx_pp, t);
986 case UNBOUND_CLASS_TEMPLATE:
987 case TYPE_PACK_EXPANSION:
989 dump_type (t, flags);
993 pp_unsupported_tree (cxx_pp, t);
994 /* Fall through to error. */
997 pp_identifier (cxx_pp, "<declaration error>");
1002 /* Dump a template declaration T under control of FLAGS. This means the
1003 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1006 dump_template_decl (tree t, int flags)
1008 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1012 if (flags & TFF_TEMPLATE_HEADER)
1014 for (parms = orig_parms = nreverse (orig_parms);
1016 parms = TREE_CHAIN (parms))
1018 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1019 int len = TREE_VEC_LENGTH (inner_parms);
1021 pp_cxx_identifier (cxx_pp, "template");
1022 pp_cxx_begin_template_argument_list (cxx_pp);
1024 /* If we've shown the template prefix, we'd better show the
1025 parameters' and decl's type too. */
1026 flags |= TFF_DECL_SPECIFIERS;
1028 for (i = 0; i < len; i++)
1031 pp_separate_with_comma (cxx_pp);
1032 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1034 pp_cxx_end_template_argument_list (cxx_pp);
1035 pp_cxx_whitespace (cxx_pp);
1037 nreverse(orig_parms);
1039 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1041 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1042 pp_cxx_identifier (cxx_pp, "class");
1044 /* If this is a parameter pack, print the ellipsis. */
1045 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1046 pp_cxx_identifier (cxx_pp, "...");
1050 if (DECL_TEMPLATE_RESULT (t)
1051 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1052 dump_type (TREE_TYPE (t),
1053 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1054 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1055 else if (DECL_TEMPLATE_RESULT (t)
1056 && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1057 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1060 gcc_assert (TREE_TYPE (t));
1061 switch (NEXT_CODE (t))
1065 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1068 /* This case can occur with some invalid code. */
1069 dump_type (TREE_TYPE (t),
1070 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1071 | (flags & TFF_DECL_SPECIFIERS
1072 ? TFF_CLASS_KEY_OR_ENUM : 0));
1077 /* Pretty print a function decl. There are several ways we want to print a
1078 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1079 As error can only apply the '#' flag once to give 0 and 1 for V, there
1080 is %D which doesn't print the throw specs, and %F which does. */
1083 dump_function_decl (tree t, int flags)
1087 tree cname = NULL_TREE;
1088 tree template_args = NULL_TREE;
1089 tree template_parms = NULL_TREE;
1090 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1091 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1094 flags &= ~TFF_UNQUALIFIED_NAME;
1095 if (TREE_CODE (t) == TEMPLATE_DECL)
1096 t = DECL_TEMPLATE_RESULT (t);
1098 /* Save the exceptions, in case t is a specialization and we are
1099 emitting an error about incompatible specifications. */
1100 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1102 /* Pretty print template instantiations only. */
1103 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1107 template_args = DECL_TI_ARGS (t);
1108 tmpl = most_general_template (t);
1109 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1111 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1116 fntype = TREE_TYPE (t);
1117 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1119 if (DECL_CLASS_SCOPE_P (t))
1120 cname = DECL_CONTEXT (t);
1121 /* This is for partially instantiated template methods. */
1122 else if (TREE_CODE (fntype) == METHOD_TYPE)
1123 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1125 if (!(flags & TFF_DECL_SPECIFIERS))
1127 else if (DECL_STATIC_FUNCTION_P (t))
1128 pp_cxx_identifier (cxx_pp, "static");
1129 else if (DECL_VIRTUAL_P (t))
1130 pp_cxx_identifier (cxx_pp, "virtual");
1132 /* Print the return type? */
1134 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1135 && !DECL_DESTRUCTOR_P (t);
1137 dump_type_prefix (TREE_TYPE (fntype), flags);
1139 /* Print the function name. */
1140 if (!do_outer_scope)
1144 dump_type (cname, flags);
1145 pp_cxx_colon_colon (cxx_pp);
1148 dump_scope (CP_DECL_CONTEXT (t), flags);
1150 dump_function_name (t, flags);
1152 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1154 dump_parameters (parmtypes, flags);
1156 if (TREE_CODE (fntype) == METHOD_TYPE)
1158 pp_base (cxx_pp)->padding = pp_before;
1159 pp_cxx_cv_qualifier_seq
1160 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1163 if (flags & TFF_EXCEPTION_SPECIFICATION)
1165 pp_base (cxx_pp)->padding = pp_before;
1166 dump_exception_spec (exceptions, flags);
1170 dump_type_suffix (TREE_TYPE (fntype), flags);
1173 /* If T is a template instantiation, dump the parameter binding. */
1174 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1176 pp_cxx_whitespace (cxx_pp);
1177 pp_cxx_left_bracket (cxx_pp);
1178 pp_cxx_identifier (cxx_pp, "with");
1179 pp_cxx_whitespace (cxx_pp);
1180 dump_template_bindings (template_parms, template_args);
1181 pp_cxx_right_bracket (cxx_pp);
1185 /* Print a parameter list. If this is for a member function, the
1186 member object ptr (and any other hidden args) should have
1187 already been removed. */
1190 dump_parameters (tree parmtypes, int flags)
1193 pp_cxx_left_paren (cxx_pp);
1195 for (first = 1; parmtypes != void_list_node;
1196 parmtypes = TREE_CHAIN (parmtypes))
1199 pp_separate_with_comma (cxx_pp);
1203 pp_cxx_identifier (cxx_pp, "...");
1207 dump_type (TREE_VALUE (parmtypes), flags);
1209 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1211 pp_cxx_whitespace (cxx_pp);
1213 pp_cxx_whitespace (cxx_pp);
1214 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1218 pp_cxx_right_paren (cxx_pp);
1221 /* Print an exception specification. T is the exception specification. */
1224 dump_exception_spec (tree t, int flags)
1228 pp_cxx_identifier (cxx_pp, "throw");
1229 pp_cxx_whitespace (cxx_pp);
1230 pp_cxx_left_paren (cxx_pp);
1231 if (TREE_VALUE (t) != NULL_TREE)
1234 dump_type (TREE_VALUE (t), flags);
1238 pp_separate_with_comma (cxx_pp);
1240 pp_cxx_right_paren (cxx_pp);
1244 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1245 and destructors properly. */
1248 dump_function_name (tree t, int flags)
1250 tree name = DECL_NAME (t);
1252 /* We can get here with a decl that was synthesized by language-
1253 independent machinery (e.g. coverage.c) in which case it won't
1254 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1255 will crash. In this case it is safe just to print out the
1257 if (!DECL_LANG_SPECIFIC (t))
1259 pp_cxx_tree_identifier (cxx_pp, name);
1263 if (TREE_CODE (t) == TEMPLATE_DECL)
1264 t = DECL_TEMPLATE_RESULT (t);
1266 /* Don't let the user see __comp_ctor et al. */
1267 if (DECL_CONSTRUCTOR_P (t)
1268 || DECL_DESTRUCTOR_P (t))
1269 name = constructor_name (DECL_CONTEXT (t));
1271 if (DECL_DESTRUCTOR_P (t))
1273 pp_cxx_complement (cxx_pp);
1274 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1276 else if (DECL_CONV_FN_P (t))
1278 /* This cannot use the hack that the operator's return
1279 type is stashed off of its name because it may be
1280 used for error reporting. In the case of conflicting
1281 declarations, both will have the same name, yet
1282 the types will be different, hence the TREE_TYPE field
1283 of the first name will be clobbered by the second. */
1284 pp_cxx_identifier (cxx_pp, "operator");
1285 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1287 else if (IDENTIFIER_OPNAME_P (name))
1288 pp_cxx_tree_identifier (cxx_pp, name);
1290 dump_decl (name, flags);
1292 if (DECL_TEMPLATE_INFO (t)
1293 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1294 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1295 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1296 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1299 /* Dump the template parameters from the template info INFO under control of
1300 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1301 specialization (partial or complete). For partial specializations we show
1302 the specialized parameter values. For a primary template we show no
1306 dump_template_parms (tree info, int primary, int flags)
1308 tree args = info ? TI_ARGS (info) : NULL_TREE;
1310 if (primary && flags & TFF_TEMPLATE_NAME)
1312 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1313 pp_cxx_begin_template_argument_list (cxx_pp);
1315 /* Be careful only to print things when we have them, so as not
1316 to crash producing error messages. */
1317 if (args && !primary)
1321 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
1322 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1324 len = TREE_VEC_LENGTH (args);
1326 for (ix = 0; ix != len; ix++)
1328 tree arg = TREE_VEC_ELT (args, ix);
1330 /* Only print a comma if we know there is an argument coming. In
1331 the case of an empty template argument pack, no actual
1332 argument will be printed. */
1334 && (!ARGUMENT_PACK_P (arg)
1335 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1336 pp_separate_with_comma (cxx_pp);
1339 pp_identifier (cxx_pp, "<template parameter error>");
1341 dump_template_argument (arg, flags);
1346 tree tpl = TI_TEMPLATE (info);
1347 tree parms = DECL_TEMPLATE_PARMS (tpl);
1350 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1351 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1353 for (ix = 0; ix != len; ix++)
1357 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1359 pp_identifier (cxx_pp, "<template parameter error>");
1363 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1366 pp_separate_with_comma (cxx_pp);
1368 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1371 pp_cxx_end_template_argument_list (cxx_pp);
1374 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1375 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1378 dump_call_expr_args (tree t, int flags, bool skipfirst)
1381 call_expr_arg_iterator iter;
1383 pp_cxx_left_paren (cxx_pp);
1384 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1390 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1391 if (more_call_expr_args_p (&iter))
1392 pp_separate_with_comma (cxx_pp);
1395 pp_cxx_right_paren (cxx_pp);
1398 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1399 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1403 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1406 aggr_init_expr_arg_iterator iter;
1408 pp_cxx_left_paren (cxx_pp);
1409 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1415 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1416 if (more_aggr_init_expr_args_p (&iter))
1417 pp_separate_with_comma (cxx_pp);
1420 pp_cxx_right_paren (cxx_pp);
1423 /* Print out a list of initializers (subr of dump_expr). */
1426 dump_expr_list (tree l, int flags)
1430 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1433 pp_separate_with_comma (cxx_pp);
1437 /* Print out a vector of initializers (subr of dump_expr). */
1440 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1442 unsigned HOST_WIDE_INT idx;
1445 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1447 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1448 if (idx != VEC_length (constructor_elt, v) - 1)
1449 pp_separate_with_comma (cxx_pp);
1454 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1455 function. Resolve it to a close relative -- in the sense of static
1456 type -- variant being overridden. That is close to what was written in
1457 the source code. Subroutine of dump_expr. */
1460 resolve_virtual_fun_from_obj_type_ref (tree ref)
1462 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1463 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1464 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1467 fun = TREE_CHAIN (fun);
1468 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1469 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1475 /* Print out an expression E under control of FLAGS. */
1478 dump_expr (tree t, int flags)
1483 if (STATEMENT_CLASS_P (t))
1485 pp_cxx_identifier (cxx_pp, "<statement>");
1489 switch (TREE_CODE (t))
1497 case NAMESPACE_DECL:
1500 case IDENTIFIER_NODE:
1501 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1508 pp_constant (cxx_pp, t);
1512 /* While waiting for caret diagnostics, avoid printing
1513 __cxa_allocate_exception, __cxa_throw, and the like. */
1514 pp_cxx_identifier (cxx_pp, "<throw-expression>");
1518 pp_ampersand (cxx_pp);
1519 dump_type (PTRMEM_CST_CLASS (t), flags);
1520 pp_cxx_colon_colon (cxx_pp);
1521 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1525 pp_cxx_left_paren (cxx_pp);
1526 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1527 pp_separate_with_comma (cxx_pp);
1528 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1529 pp_cxx_right_paren (cxx_pp);
1533 pp_cxx_left_paren (cxx_pp);
1534 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1535 pp_string (cxx_pp, " ? ");
1536 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1537 pp_string (cxx_pp, " : ");
1538 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1539 pp_cxx_right_paren (cxx_pp);
1543 if (TREE_HAS_CONSTRUCTOR (t))
1545 pp_cxx_identifier (cxx_pp, "new");
1546 pp_cxx_whitespace (cxx_pp);
1547 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1550 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1553 case AGGR_INIT_EXPR:
1555 tree fn = NULL_TREE;
1557 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1558 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1560 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1562 if (DECL_CONSTRUCTOR_P (fn))
1563 dump_type (DECL_CONTEXT (fn), flags);
1568 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1570 dump_aggr_init_expr_args (t, flags, true);
1575 tree fn = CALL_EXPR_FN (t);
1576 bool skipfirst = false;
1578 if (TREE_CODE (fn) == ADDR_EXPR)
1579 fn = TREE_OPERAND (fn, 0);
1581 /* Nobody is interested in seeing the guts of vcalls. */
1582 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1583 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1585 if (TREE_TYPE (fn) != NULL_TREE
1586 && NEXT_CODE (fn) == METHOD_TYPE
1587 && call_expr_nargs (t))
1589 tree ob = CALL_EXPR_ARG (t, 0);
1590 if (TREE_CODE (ob) == ADDR_EXPR)
1592 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1593 pp_cxx_dot (cxx_pp);
1595 else if (TREE_CODE (ob) != PARM_DECL
1596 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1598 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1599 pp_cxx_arrow (cxx_pp);
1603 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1604 dump_call_expr_args (t, flags, skipfirst);
1609 /* Note that this only works for G++ target exprs. If somebody
1610 builds a general TARGET_EXPR, there's no way to represent that
1611 it initializes anything other that the parameter slot for the
1612 default argument. Note we may have cleared out the first
1613 operand in expand_expr, so don't go killing ourselves. */
1614 if (TREE_OPERAND (t, 1))
1615 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1618 case POINTER_PLUS_EXPR:
1619 dump_binary_op ("+", t, flags);
1627 case TRUNC_DIV_EXPR:
1628 case TRUNC_MOD_EXPR:
1636 case TRUTH_ANDIF_EXPR:
1637 case TRUTH_ORIF_EXPR:
1644 case EXACT_DIV_EXPR:
1645 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1649 case FLOOR_DIV_EXPR:
1650 case ROUND_DIV_EXPR:
1652 dump_binary_op ("/", t, flags);
1656 case FLOOR_MOD_EXPR:
1657 case ROUND_MOD_EXPR:
1658 dump_binary_op ("%", t, flags);
1663 tree ob = TREE_OPERAND (t, 0);
1664 if (TREE_CODE (ob) == INDIRECT_REF)
1666 ob = TREE_OPERAND (ob, 0);
1667 if (TREE_CODE (ob) != PARM_DECL
1669 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1671 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1672 pp_cxx_arrow (cxx_pp);
1677 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1678 pp_cxx_dot (cxx_pp);
1680 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1685 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1686 pp_cxx_left_bracket (cxx_pp);
1687 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1688 pp_cxx_right_bracket (cxx_pp);
1691 case UNARY_PLUS_EXPR:
1692 dump_unary_op ("+", t, flags);
1696 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1697 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1698 /* An ADDR_EXPR can have reference type. In that case, we
1699 shouldn't print the `&' doing so indicates to the user
1700 that the expression has pointer type. */
1702 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1703 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1704 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1705 dump_unary_op ("&&", t, flags);
1707 dump_unary_op ("&", t, flags);
1711 if (TREE_HAS_CONSTRUCTOR (t))
1713 t = TREE_OPERAND (t, 0);
1714 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1715 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1716 dump_call_expr_args (t, flags, true);
1720 if (TREE_OPERAND (t,0) != NULL_TREE
1721 && TREE_TYPE (TREE_OPERAND (t, 0))
1722 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1723 dump_expr (TREE_OPERAND (t, 0), flags);
1725 dump_unary_op ("*", t, flags);
1731 case TRUTH_NOT_EXPR:
1732 case PREDECREMENT_EXPR:
1733 case PREINCREMENT_EXPR:
1734 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1737 case POSTDECREMENT_EXPR:
1738 case POSTINCREMENT_EXPR:
1739 pp_cxx_left_paren (cxx_pp);
1740 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1741 pp_cxx_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1742 pp_cxx_right_paren (cxx_pp);
1745 case NON_LVALUE_EXPR:
1746 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1747 should be another level of INDIRECT_REF so that I don't have to do
1749 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1751 tree next = TREE_TYPE (TREE_TYPE (t));
1753 while (TREE_CODE (next) == POINTER_TYPE)
1754 next = TREE_TYPE (next);
1756 if (TREE_CODE (next) == FUNCTION_TYPE)
1758 if (flags & TFF_EXPR_IN_PARENS)
1759 pp_cxx_left_paren (cxx_pp);
1760 pp_cxx_star (cxx_pp);
1761 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1762 if (flags & TFF_EXPR_IN_PARENS)
1763 pp_cxx_right_paren (cxx_pp);
1766 /* Else fall through. */
1768 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1772 case VIEW_CONVERT_EXPR:
1774 tree op = TREE_OPERAND (t, 0);
1776 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1778 /* It is a cast, but we cannot tell whether it is a
1779 reinterpret or static cast. Use the C style notation. */
1780 if (flags & TFF_EXPR_IN_PARENS)
1781 pp_cxx_left_paren (cxx_pp);
1782 pp_cxx_left_paren (cxx_pp);
1783 dump_type (TREE_TYPE (t), flags);
1784 pp_cxx_right_paren (cxx_pp);
1785 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1786 if (flags & TFF_EXPR_IN_PARENS)
1787 pp_cxx_right_paren (cxx_pp);
1790 dump_expr (op, flags);
1795 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1797 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1799 if (integer_zerop (idx))
1801 /* A NULL pointer-to-member constant. */
1802 pp_cxx_left_paren (cxx_pp);
1803 pp_cxx_left_paren (cxx_pp);
1804 dump_type (TREE_TYPE (t), flags);
1805 pp_cxx_right_paren (cxx_pp);
1806 pp_character (cxx_pp, '0');
1807 pp_cxx_right_paren (cxx_pp);
1810 else if (host_integerp (idx, 0))
1813 unsigned HOST_WIDE_INT n;
1815 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1816 t = TYPE_METHOD_BASETYPE (t);
1817 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1819 n = tree_low_cst (idx, 0);
1821 /* Map vtable index back one, to allow for the null pointer to
1825 while (n > 0 && virtuals)
1828 virtuals = TREE_CHAIN (virtuals);
1832 dump_expr (BV_FN (virtuals),
1833 flags | TFF_EXPR_IN_PARENS);
1838 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
1840 dump_type (TREE_TYPE (t), 0);
1841 pp_cxx_left_paren (cxx_pp);
1842 pp_cxx_right_paren (cxx_pp);
1846 pp_cxx_left_brace (cxx_pp);
1847 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
1848 pp_cxx_right_brace (cxx_pp);
1855 tree ob = TREE_OPERAND (t, 0);
1856 if (is_dummy_object (ob))
1858 t = TREE_OPERAND (t, 1);
1859 if (TREE_CODE (t) == FUNCTION_DECL)
1861 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1862 else if (BASELINK_P (t))
1863 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1864 flags | TFF_EXPR_IN_PARENS);
1866 dump_decl (t, flags);
1870 if (TREE_CODE (ob) == INDIRECT_REF)
1872 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1873 pp_cxx_arrow (cxx_pp);
1874 pp_cxx_star (cxx_pp);
1878 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1879 pp_cxx_dot (cxx_pp);
1880 pp_cxx_star (cxx_pp);
1882 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1887 case TEMPLATE_PARM_INDEX:
1888 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1892 if (TREE_OPERAND (t, 0) == NULL_TREE
1893 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1895 dump_type (TREE_TYPE (t), flags);
1896 pp_cxx_left_paren (cxx_pp);
1897 dump_expr_list (TREE_OPERAND (t, 0), flags);
1898 pp_cxx_right_paren (cxx_pp);
1902 pp_cxx_left_paren (cxx_pp);
1903 dump_type (TREE_TYPE (t), flags);
1904 pp_cxx_right_paren (cxx_pp);
1905 pp_cxx_left_paren (cxx_pp);
1906 dump_expr_list (TREE_OPERAND (t, 0), flags);
1907 pp_cxx_right_paren (cxx_pp);
1911 case STATIC_CAST_EXPR:
1912 pp_cxx_identifier (cxx_pp, "static_cast");
1914 case REINTERPRET_CAST_EXPR:
1915 pp_cxx_identifier (cxx_pp, "reinterpret_cast");
1917 case CONST_CAST_EXPR:
1918 pp_cxx_identifier (cxx_pp, "const_cast");
1920 case DYNAMIC_CAST_EXPR:
1921 pp_cxx_identifier (cxx_pp, "dynamic_cast");
1923 pp_cxx_begin_template_argument_list (cxx_pp);
1924 dump_type (TREE_TYPE (t), flags);
1925 pp_cxx_end_template_argument_list (cxx_pp);
1926 pp_cxx_left_paren (cxx_pp);
1927 dump_expr (TREE_OPERAND (t, 0), flags);
1928 pp_cxx_right_paren (cxx_pp);
1932 dump_expr (TREE_OPERAND (t, 0), flags);
1933 pp_cxx_arrow (cxx_pp);
1938 if (TREE_CODE (t) == SIZEOF_EXPR)
1939 pp_cxx_identifier (cxx_pp, "sizeof");
1942 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
1943 pp_cxx_identifier (cxx_pp, "__alignof__");
1945 pp_cxx_whitespace (cxx_pp);
1946 pp_cxx_left_paren (cxx_pp);
1947 if (TYPE_P (TREE_OPERAND (t, 0)))
1948 dump_type (TREE_OPERAND (t, 0), flags);
1950 dump_expr (TREE_OPERAND (t, 0), flags);
1951 pp_cxx_right_paren (cxx_pp);
1956 pp_cxx_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1957 pp_cxx_whitespace (cxx_pp);
1958 dump_expr (TREE_OPERAND (t, 0), flags);
1962 pp_identifier (cxx_pp, "<unparsed>");
1965 case TRY_CATCH_EXPR:
1966 case WITH_CLEANUP_EXPR:
1967 case CLEANUP_POINT_EXPR:
1968 dump_expr (TREE_OPERAND (t, 0), flags);
1971 case PSEUDO_DTOR_EXPR:
1972 dump_expr (TREE_OPERAND (t, 2), flags);
1973 pp_cxx_dot (cxx_pp);
1974 dump_type (TREE_OPERAND (t, 0), flags);
1975 pp_cxx_colon_colon (cxx_pp);
1976 pp_cxx_complement (cxx_pp);
1977 dump_type (TREE_OPERAND (t, 1), flags);
1980 case TEMPLATE_ID_EXPR:
1981 dump_decl (t, flags);
1987 case STATEMENT_LIST:
1988 /* We don't yet have a way of dumping statements in a
1989 human-readable format. */
1990 pp_string (cxx_pp, "({...})");
1994 pp_string (cxx_pp, "while (1) { ");
1995 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1996 pp_cxx_right_brace (cxx_pp);
2000 pp_string (cxx_pp, "if (");
2001 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2002 pp_string (cxx_pp, ") break; ");
2006 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2009 case EMPTY_CLASS_EXPR:
2010 dump_type (TREE_TYPE (t), flags);
2011 pp_cxx_left_paren (cxx_pp);
2012 pp_cxx_right_paren (cxx_pp);
2015 case NON_DEPENDENT_EXPR:
2016 dump_expr (TREE_OPERAND (t, 0), flags);
2019 case ARGUMENT_PACK_SELECT:
2020 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2032 pp_type_specifier_seq (cxx_pp, t);
2036 /* We get here when we want to print a dependent type as an
2037 id-expression, without any disambiguator decoration. */
2038 pp_id_expression (cxx_pp, t);
2041 case TEMPLATE_TYPE_PARM:
2042 case BOUND_TEMPLATE_TEMPLATE_PARM:
2043 dump_type (t, flags);
2047 pp_cxx_trait_expression (cxx_pp, t);
2051 pp_cxx_va_arg_expression (cxx_pp, t);
2055 pp_cxx_offsetof_expression (cxx_pp, t);
2059 case EXPR_PACK_EXPANSION:
2066 case VEC_DELETE_EXPR:
2072 case UNORDERED_EXPR:
2082 case FIX_TRUNC_EXPR:
2084 pp_expression (cxx_pp, t);
2087 case TRUTH_AND_EXPR:
2089 case TRUTH_XOR_EXPR:
2090 if (flags & TFF_EXPR_IN_PARENS)
2091 pp_cxx_left_paren (cxx_pp);
2092 pp_expression (cxx_pp, t);
2093 if (flags & TFF_EXPR_IN_PARENS)
2094 pp_cxx_right_paren (cxx_pp);
2098 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2101 /* This list is incomplete, but should suffice for now.
2102 It is very important that `sorry' does not call
2103 `report_error_function'. That could cause an infinite loop. */
2105 pp_unsupported_tree (cxx_pp, t);
2106 /* fall through to ERROR_MARK... */
2108 pp_identifier (cxx_pp, "<expression error>");
2114 dump_binary_op (const char *opstring, tree t, int flags)
2116 pp_cxx_left_paren (cxx_pp);
2117 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2118 pp_cxx_whitespace (cxx_pp);
2120 pp_cxx_identifier (cxx_pp, opstring);
2122 pp_identifier (cxx_pp, "<unknown operator>");
2123 pp_cxx_whitespace (cxx_pp);
2124 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2125 pp_cxx_right_paren (cxx_pp);
2129 dump_unary_op (const char *opstring, tree t, int flags)
2131 if (flags & TFF_EXPR_IN_PARENS)
2132 pp_cxx_left_paren (cxx_pp);
2133 pp_cxx_identifier (cxx_pp, opstring);
2134 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2135 if (flags & TFF_EXPR_IN_PARENS)
2136 pp_cxx_right_paren (cxx_pp);
2140 reinit_cxx_pp (void)
2142 pp_clear_output_area (cxx_pp);
2143 pp_base (cxx_pp)->padding = pp_none;
2144 pp_indentation (cxx_pp) = 0;
2145 pp_needs_newline (cxx_pp) = false;
2146 cxx_pp->enclosing_scope = current_function_decl;
2150 /* Exported interface to stringifying types, exprs and decls under TFF_*
2154 type_as_string (tree typ, int flags)
2157 dump_type (typ, flags);
2158 return pp_formatted_text (cxx_pp);
2162 expr_as_string (tree decl, int flags)
2165 dump_expr (decl, flags);
2166 return pp_formatted_text (cxx_pp);
2170 decl_as_string (tree decl, int flags)
2173 dump_decl (decl, flags);
2174 return pp_formatted_text (cxx_pp);
2177 /* Generate the three forms of printable names for cxx_printable_name. */
2180 lang_decl_name (tree decl, int v)
2183 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2187 && (DECL_CLASS_SCOPE_P (decl)
2188 || (DECL_NAMESPACE_SCOPE_P (decl)
2189 && CP_DECL_CONTEXT (decl) != global_namespace)))
2191 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2192 pp_cxx_colon_colon (cxx_pp);
2195 if (TREE_CODE (decl) == FUNCTION_DECL)
2196 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2198 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2200 return pp_formatted_text (cxx_pp);
2203 /* Return the location of a tree passed to %+ formats. */
2206 location_of (tree t)
2208 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2209 t = DECL_CONTEXT (t);
2210 else if (TYPE_P (t))
2211 t = TYPE_MAIN_DECL (t);
2212 else if (TREE_CODE (t) == OVERLOAD)
2213 t = OVL_FUNCTION (t);
2215 return DECL_SOURCE_LOCATION (t);
2218 /* Now the interfaces from error et al to dump_type et al. Each takes an
2219 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2223 decl_to_string (tree decl, int verbose)
2227 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2228 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2229 flags = TFF_CLASS_KEY_OR_ENUM;
2231 flags |= TFF_DECL_SPECIFIERS;
2232 else if (TREE_CODE (decl) == FUNCTION_DECL)
2233 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2234 flags |= TFF_TEMPLATE_HEADER;
2237 dump_decl (decl, flags);
2238 return pp_formatted_text (cxx_pp);
2242 expr_to_string (tree decl)
2245 dump_expr (decl, 0);
2246 return pp_formatted_text (cxx_pp);
2250 fndecl_to_string (tree fndecl, int verbose)
2254 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2255 | TFF_TEMPLATE_HEADER;
2257 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2259 dump_decl (fndecl, flags);
2260 return pp_formatted_text (cxx_pp);
2265 code_to_string (enum tree_code c)
2267 return tree_code_name [c];
2271 language_to_string (enum languages c)
2278 case lang_cplusplus:
2290 /* Return the proper printed version of a parameter to a C++ function. */
2293 parm_to_string (int p)
2297 pp_string (cxx_pp, "'this'");
2299 pp_decimal_int (cxx_pp, p + 1);
2300 return pp_formatted_text (cxx_pp);
2304 op_to_string (enum tree_code p)
2306 tree id = operator_name_info[(int) p].identifier;
2307 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2311 type_to_string (tree typ, int verbose)
2315 flags |= TFF_CLASS_KEY_OR_ENUM;
2316 flags |= TFF_TEMPLATE_HEADER;
2319 dump_type (typ, flags);
2320 return pp_formatted_text (cxx_pp);
2324 assop_to_string (enum tree_code p)
2326 tree id = assignment_operator_name_info[(int) p].identifier;
2327 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2331 args_to_string (tree p, int verbose)
2335 flags |= TFF_CLASS_KEY_OR_ENUM;
2340 if (TYPE_P (TREE_VALUE (p)))
2341 return type_as_string (p, flags);
2344 for (; p; p = TREE_CHAIN (p))
2346 if (TREE_VALUE (p) == null_node)
2347 pp_cxx_identifier (cxx_pp, "NULL");
2349 dump_type (error_type (TREE_VALUE (p)), flags);
2351 pp_separate_with_comma (cxx_pp);
2353 return pp_formatted_text (cxx_pp);
2357 cv_to_string (tree p, int v)
2360 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2361 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2362 return pp_formatted_text (cxx_pp);
2365 /* Langhook for print_error_function. */
2367 cxx_print_error_function (diagnostic_context *context, const char *file,
2368 diagnostic_info *diagnostic)
2370 lhd_print_error_function (context, file, diagnostic);
2371 pp_base_set_prefix (context->printer, file);
2372 maybe_print_instantiation_context (context);
2376 cp_diagnostic_starter (diagnostic_context *context,
2377 diagnostic_info *diagnostic)
2379 diagnostic_report_current_module (context);
2380 cp_print_error_function (context, diagnostic);
2381 maybe_print_instantiation_context (context);
2382 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2386 cp_diagnostic_finalizer (diagnostic_context *context,
2387 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2389 pp_base_destroy_prefix (context->printer);
2392 /* Print current function onto BUFFER, in the process of reporting
2393 a diagnostic message. Called from cp_diagnostic_starter. */
2395 cp_print_error_function (diagnostic_context *context,
2396 diagnostic_info *diagnostic)
2398 if (diagnostic_last_function_changed (context, diagnostic))
2400 const char *old_prefix = context->printer->prefix;
2401 const char *file = LOCATION_FILE (diagnostic->location);
2402 tree abstract_origin = diagnostic->abstract_origin;
2403 char *new_prefix = (file && abstract_origin == NULL)
2404 ? file_name_as_prefix (file) : NULL;
2406 pp_base_set_prefix (context->printer, new_prefix);
2408 if (current_function_decl == NULL)
2409 pp_base_string (context->printer, "At global scope:");
2414 if (abstract_origin)
2416 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2417 while (TREE_CODE (ao) == BLOCK
2418 && BLOCK_ABSTRACT_ORIGIN (ao)
2419 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2420 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2421 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2425 fndecl = current_function_decl;
2427 pp_printf (context->printer, "In %s %qs",
2428 function_category (fndecl),
2429 cxx_printable_name (fndecl, 2));
2431 while (abstract_origin)
2434 tree block = abstract_origin;
2436 locus = &BLOCK_SOURCE_LOCATION (block);
2438 block = BLOCK_SUPERCONTEXT (block);
2439 while (block && TREE_CODE (block) == BLOCK
2440 && BLOCK_ABSTRACT_ORIGIN (block))
2442 ao = BLOCK_ABSTRACT_ORIGIN (block);
2444 while (TREE_CODE (ao) == BLOCK
2445 && BLOCK_ABSTRACT_ORIGIN (ao)
2446 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2447 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2449 if (TREE_CODE (ao) == FUNCTION_DECL)
2454 else if (TREE_CODE (ao) != BLOCK)
2457 block = BLOCK_SUPERCONTEXT (block);
2460 abstract_origin = block;
2463 while (block && TREE_CODE (block) == BLOCK)
2464 block = BLOCK_SUPERCONTEXT (block);
2466 if (block && TREE_CODE (block) == FUNCTION_DECL)
2468 abstract_origin = NULL;
2472 expanded_location s = expand_location (*locus);
2473 pp_base_character (context->printer, ',');
2474 pp_base_newline (context->printer);
2477 if (flag_show_column && s.column != 0)
2478 pp_printf (context->printer,
2479 " inlined from %qs at %s:%d:%d",
2480 cxx_printable_name (fndecl, 2),
2481 s.file, s.line, s.column);
2483 pp_printf (context->printer,
2484 " inlined from %qs at %s:%d",
2485 cxx_printable_name (fndecl, 2),
2490 pp_printf (context->printer, " inlined from %qs",
2491 cxx_printable_name (fndecl, 2));
2494 pp_base_character (context->printer, ':');
2496 pp_base_newline (context->printer);
2498 diagnostic_set_last_function (context, diagnostic);
2499 pp_base_destroy_prefix (context->printer);
2500 context->printer->prefix = old_prefix;
2504 /* Returns a description of FUNCTION using standard terminology. */
2506 function_category (tree fn)
2508 if (DECL_FUNCTION_MEMBER_P (fn))
2510 if (DECL_STATIC_FUNCTION_P (fn))
2511 return "static member function";
2512 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2513 return "copy constructor";
2514 else if (DECL_CONSTRUCTOR_P (fn))
2515 return "constructor";
2516 else if (DECL_DESTRUCTOR_P (fn))
2517 return "destructor";
2519 return "member function";
2525 /* Report the full context of a current template instantiation,
2528 print_instantiation_full_context (diagnostic_context *context)
2530 struct tinst_level *p = current_instantiation ();
2531 location_t location = input_location;
2535 if (current_function_decl != p->decl
2536 && current_function_decl != NULL_TREE)
2537 /* We can get here during the processing of some synthesized
2538 method. Then, P->DECL will be the function that's causing
2543 if (current_function_decl == p->decl)
2544 /* Avoid redundancy with the "In function" line. */;
2546 pp_verbatim (context->printer,
2547 "%s: In instantiation of %qs:\n",
2548 LOCATION_FILE (location),
2549 decl_as_string (p->decl,
2550 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2552 location = p->locus;
2557 print_instantiation_partial_context (context, p, location);
2560 /* Same as above but less verbose. */
2562 print_instantiation_partial_context (diagnostic_context *context,
2563 struct tinst_level *t, location_t loc)
2565 expanded_location xloc;
2566 for (; ; t = t->next)
2568 xloc = expand_location (loc);
2571 pp_verbatim (context->printer, "%s:%d: instantiated from %qs\n",
2572 xloc.file, xloc.line,
2573 decl_as_string (t->decl,
2574 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2577 pp_verbatim (context->printer, "%s:%d: instantiated from here",
2578 xloc.file, xloc.line);
2579 pp_base_newline (context->printer);
2582 /* Called from cp_thing to print the template context for an error. */
2584 maybe_print_instantiation_context (diagnostic_context *context)
2586 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2589 record_last_problematic_instantiation ();
2590 print_instantiation_full_context (context);
2593 /* Report the bare minimum context of a template instantiation. */
2595 print_instantiation_context (void)
2597 print_instantiation_partial_context
2598 (global_dc, current_instantiation (), input_location);
2599 diagnostic_flush_buffer (global_dc);
2602 /* Called from output_format -- during diagnostic message processing --
2603 to handle C++ specific format specifier with the following meanings:
2604 %A function argument-list.
2608 %F function declaration.
2609 %L language as used in extern "lang".
2611 %P function parameter whose position is indicated by an integer.
2612 %Q assignment operator.
2616 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2617 int precision, bool wide, bool set_locus, bool verbose)
2621 #define next_tree (t = va_arg (*text->args_ptr, tree))
2622 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2623 #define next_lang va_arg (*text->args_ptr, enum languages)
2624 #define next_int va_arg (*text->args_ptr, int)
2626 if (precision != 0 || wide)
2629 if (text->locus == NULL)
2634 case 'A': result = args_to_string (next_tree, verbose); break;
2635 case 'C': result = code_to_string (next_tcode); break;
2638 tree temp = next_tree;
2640 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
2642 temp = DECL_DEBUG_EXPR (temp);
2645 result = expr_to_string (temp);
2649 result = decl_to_string (temp, verbose);
2652 case 'E': result = expr_to_string (next_tree); break;
2653 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2654 case 'L': result = language_to_string (next_lang); break;
2655 case 'O': result = op_to_string (next_tcode); break;
2656 case 'P': result = parm_to_string (next_int); break;
2657 case 'Q': result = assop_to_string (next_tcode); break;
2658 case 'T': result = type_to_string (next_tree, verbose); break;
2659 case 'V': result = cv_to_string (next_tree, verbose); break;
2665 pp_base_string (pp, result);
2666 if (set_locus && t != NULL)
2667 *text->locus = location_of (t);
2675 /* Callback from cpp_error for PFILE to print diagnostics arising from
2676 interpreting strings. The diagnostic is of type LEVEL; MSG is the
2677 translated message and AP the arguments. */
2680 cp_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
2681 const char *msg, va_list *ap)
2683 diagnostic_info diagnostic;
2684 diagnostic_t dlevel;
2687 case CPP_DL_WARNING:
2688 case CPP_DL_WARNING_SYSHDR:
2689 dlevel = DK_WARNING;
2691 case CPP_DL_PEDWARN:
2692 dlevel = DK_PEDWARN;
2703 diagnostic_set_info_translated (&diagnostic, msg, ap,
2704 input_location, dlevel);
2705 report_diagnostic (&diagnostic);
2708 /* Warn about the use of C++0x features when appropriate. */
2710 maybe_warn_cpp0x (const char* str)
2712 if ((cxx_dialect == cxx98) && !in_system_header)
2713 /* We really want to suppress this warning in system headers,
2714 because libstdc++ uses variadic templates even when we aren't
2716 pedwarn (input_location, 0, "%s only available with -std=c++0x or -std=gnu++0x", str);
2719 /* Warn about the use of variadic templates when appropriate. */
2721 maybe_warn_variadic_templates (void)
2723 maybe_warn_cpp0x ("variadic templates");