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 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)
555 pp_cxx_whitespace (cxx_pp);
556 pp_cxx_left_paren (cxx_pp);
558 if (TREE_CODE (t) == POINTER_TYPE)
559 pp_character(cxx_pp, '*');
560 else if (TREE_CODE (t) == REFERENCE_TYPE)
562 if (TYPE_REF_IS_RVALUE (t))
563 pp_string (cxx_pp, "&&");
565 pp_character (cxx_pp, '&');
567 pp_base (cxx_pp)->padding = pp_before;
568 pp_cxx_cv_qualifier_seq (cxx_pp, t);
574 dump_type_prefix (TREE_TYPE (t), flags);
575 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
577 pp_maybe_space (cxx_pp);
578 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
579 pp_cxx_left_paren (cxx_pp);
580 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
581 pp_cxx_colon_colon (cxx_pp);
583 pp_cxx_star (cxx_pp);
584 pp_cxx_cv_qualifier_seq (cxx_pp, t);
585 pp_base (cxx_pp)->padding = pp_before;
588 /* Can only be reached through function pointer -- this would not be
589 correct if FUNCTION_DECLs used it. */
591 dump_type_prefix (TREE_TYPE (t), flags);
592 pp_maybe_space (cxx_pp);
593 pp_cxx_left_paren (cxx_pp);
597 dump_type_prefix (TREE_TYPE (t), flags);
598 pp_maybe_space (cxx_pp);
599 pp_cxx_left_paren (cxx_pp);
600 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
601 pp_cxx_colon_colon (cxx_pp);
605 dump_type_prefix (TREE_TYPE (t), flags);
609 case IDENTIFIER_NODE:
614 case TEMPLATE_TYPE_PARM:
615 case TEMPLATE_TEMPLATE_PARM:
616 case BOUND_TEMPLATE_TEMPLATE_PARM:
628 case TYPE_PACK_EXPANSION:
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 pp_cxx_right_paren (cxx_pp);
658 dump_type_suffix (TREE_TYPE (t), flags);
661 /* Can only be reached through function pointer. */
666 pp_cxx_right_paren (cxx_pp);
667 arg = TYPE_ARG_TYPES (t);
668 if (TREE_CODE (t) == METHOD_TYPE)
669 arg = TREE_CHAIN (arg);
671 /* Function pointers don't have default args. Not in standard C++,
672 anyway; they may in g++, but we'll just pretend otherwise. */
673 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
675 if (TREE_CODE (t) == METHOD_TYPE)
676 pp_cxx_cv_qualifier_seq
677 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
679 pp_cxx_cv_qualifier_seq(cxx_pp, t);
680 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
681 dump_type_suffix (TREE_TYPE (t), flags);
686 pp_maybe_space (cxx_pp);
687 pp_cxx_left_bracket (cxx_pp);
690 tree dtype = TYPE_DOMAIN (t);
691 tree max = TYPE_MAX_VALUE (dtype);
692 if (host_integerp (max, 0))
693 pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1);
694 else if (TREE_CODE (max) == MINUS_EXPR)
695 dump_expr (TREE_OPERAND (max, 0),
696 flags & ~TFF_EXPR_IN_PARENS);
698 dump_expr (fold_build2 (PLUS_EXPR, dtype, max,
699 build_int_cst (dtype, 1)),
700 flags & ~TFF_EXPR_IN_PARENS);
702 pp_cxx_right_bracket (cxx_pp);
703 dump_type_suffix (TREE_TYPE (t), flags);
707 case IDENTIFIER_NODE:
712 case TEMPLATE_TYPE_PARM:
713 case TEMPLATE_TEMPLATE_PARM:
714 case BOUND_TEMPLATE_TEMPLATE_PARM:
726 case TYPE_PACK_EXPANSION:
730 pp_unsupported_tree (cxx_pp, t);
732 /* Don't mark it here, we should have already done in
739 dump_global_iord (tree t)
741 const char *p = NULL;
743 if (DECL_GLOBAL_CTOR_P (t))
745 else if (DECL_GLOBAL_DTOR_P (t))
750 pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
754 dump_simple_decl (tree t, tree type, int flags)
756 if (flags & TFF_DECL_SPECIFIERS)
758 dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME);
759 pp_maybe_space (cxx_pp);
761 if (! (flags & TFF_UNQUALIFIED_NAME)
762 && (!DECL_INITIAL (t)
763 || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX))
764 dump_scope (CP_DECL_CONTEXT (t), flags);
765 flags &= ~TFF_UNQUALIFIED_NAME;
766 if ((flags & TFF_DECL_SPECIFIERS)
767 && DECL_TEMPLATE_PARM_P (t)
768 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
769 pp_identifier (cxx_pp, "...");
771 dump_decl (DECL_NAME (t), flags);
773 pp_identifier (cxx_pp, "<anonymous>");
774 if (flags & TFF_DECL_SPECIFIERS)
775 dump_type_suffix (type, flags);
778 /* Dump a human readable string for the decl T under control of FLAGS. */
781 dump_decl (tree t, int flags)
786 switch (TREE_CODE (t))
789 /* Don't say 'typedef class A' */
790 if (DECL_ARTIFICIAL (t))
792 if ((flags & TFF_DECL_SPECIFIERS)
793 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
795 /* Say `class T' not just `T'. */
796 pp_cxx_identifier (cxx_pp, "class");
798 /* Emit the `...' for a parameter pack. */
799 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
800 pp_cxx_identifier (cxx_pp, "...");
803 dump_type (TREE_TYPE (t), flags);
806 if (flags & TFF_DECL_SPECIFIERS)
807 pp_cxx_identifier (cxx_pp, "typedef");
808 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
809 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
814 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
816 pp_string (cxx_pp, "vtable for ");
817 gcc_assert (TYPE_P (DECL_CONTEXT (t)));
818 dump_type (DECL_CONTEXT (t), flags);
821 /* Else fall through. */
824 dump_simple_decl (t, TREE_TYPE (t), flags);
828 pp_string (cxx_pp, "<return value> ");
829 dump_simple_decl (t, TREE_TYPE (t), flags);
833 if (flags & TFF_DECL_SPECIFIERS)
834 pp_cxx_declaration (cxx_pp, t);
837 if (! (flags & TFF_UNQUALIFIED_NAME))
838 dump_scope (CP_DECL_CONTEXT (t), flags);
839 flags &= ~TFF_UNQUALIFIED_NAME;
840 if (DECL_NAME (t) == NULL_TREE)
841 pp_identifier (cxx_pp, "<unnamed>");
843 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
848 pp_expression (cxx_pp, t);
852 dump_decl (TREE_OPERAND (t, 0), flags);
853 pp_cxx_left_bracket (cxx_pp);
854 dump_decl (TREE_OPERAND (t, 1), flags);
855 pp_cxx_right_bracket (cxx_pp);
858 /* So that we can do dump_decl on an aggr type. */
862 dump_type (t, flags);
866 /* This is a pseudo destructor call which has not been folded into
867 a PSEUDO_DTOR_EXPR yet. */
868 pp_cxx_complement (cxx_pp);
869 dump_type (TREE_OPERAND (t, 0), flags);
876 /* These special cases are duplicated here so that other functions
877 can feed identifiers to error and get them demangled properly. */
878 case IDENTIFIER_NODE:
879 if (IDENTIFIER_TYPENAME_P (t))
881 pp_cxx_identifier (cxx_pp, "operator");
882 /* Not exactly IDENTIFIER_TYPE_VALUE. */
883 dump_type (TREE_TYPE (t), flags);
887 pp_cxx_tree_identifier (cxx_pp, t);
894 if (DECL_CLASS_SCOPE_P (t))
896 dump_type (DECL_CONTEXT (t), flags);
897 pp_cxx_colon_colon (cxx_pp);
899 else if (DECL_CONTEXT (t))
901 dump_decl (DECL_CONTEXT (t), flags);
902 pp_cxx_colon_colon (cxx_pp);
904 dump_decl (DECL_NAME (t), flags);
908 /* If there's only one function, just treat it like an ordinary
914 if (! DECL_LANG_SPECIFIC (t))
915 pp_identifier (cxx_pp, "<built-in>");
916 else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
917 dump_global_iord (t);
919 dump_function_decl (t, flags);
923 dump_template_decl (t, flags);
926 case TEMPLATE_ID_EXPR:
928 tree name = TREE_OPERAND (t, 0);
930 if (is_overloaded_fn (name))
931 name = DECL_NAME (get_first_fn (name));
932 dump_decl (name, flags);
933 pp_cxx_begin_template_argument_list (cxx_pp);
934 if (TREE_OPERAND (t, 1))
935 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
936 pp_cxx_end_template_argument_list (cxx_pp);
941 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
945 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
946 || (DECL_INITIAL (t) &&
947 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
948 dump_simple_decl (t, TREE_TYPE (t), flags);
949 else if (DECL_NAME (t))
950 dump_decl (DECL_NAME (t), flags);
951 else if (DECL_INITIAL (t))
952 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
954 pp_identifier (cxx_pp, "<enumerator>");
958 pp_cxx_identifier (cxx_pp, "using");
959 dump_type (USING_DECL_SCOPE (t), flags);
960 pp_cxx_colon_colon (cxx_pp);
961 dump_decl (DECL_NAME (t), flags);
965 pp_cxx_declaration (cxx_pp, t);
969 dump_decl (BASELINK_FUNCTIONS (t), flags);
972 case NON_DEPENDENT_EXPR:
973 dump_expr (t, flags);
976 case TEMPLATE_TYPE_PARM:
977 if (flags & TFF_DECL_SPECIFIERS)
978 pp_cxx_declaration (cxx_pp, t);
980 pp_type_id (cxx_pp, t);
983 case UNBOUND_CLASS_TEMPLATE:
984 case TYPE_PACK_EXPANSION:
986 dump_type (t, flags);
990 pp_unsupported_tree (cxx_pp, t);
991 /* Fall through to error. */
994 pp_identifier (cxx_pp, "<declaration error>");
999 /* Dump a template declaration T under control of FLAGS. This means the
1000 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1003 dump_template_decl (tree t, int flags)
1005 tree orig_parms = DECL_TEMPLATE_PARMS (t);
1009 if (flags & TFF_TEMPLATE_HEADER)
1011 for (parms = orig_parms = nreverse (orig_parms);
1013 parms = TREE_CHAIN (parms))
1015 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
1016 int len = TREE_VEC_LENGTH (inner_parms);
1018 pp_cxx_identifier (cxx_pp, "template");
1019 pp_cxx_begin_template_argument_list (cxx_pp);
1021 /* If we've shown the template prefix, we'd better show the
1022 parameters' and decl's type too. */
1023 flags |= TFF_DECL_SPECIFIERS;
1025 for (i = 0; i < len; i++)
1028 pp_separate_with_comma (cxx_pp);
1029 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1031 pp_cxx_end_template_argument_list (cxx_pp);
1032 pp_cxx_whitespace (cxx_pp);
1034 nreverse(orig_parms);
1036 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1038 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1039 pp_cxx_identifier (cxx_pp, "class");
1041 /* If this is a parameter pack, print the ellipsis. */
1042 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
1043 pp_cxx_identifier (cxx_pp, "...");
1047 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1048 dump_type (TREE_TYPE (t),
1049 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1050 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1051 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1052 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1055 gcc_assert (TREE_TYPE (t));
1056 switch (NEXT_CODE (t))
1060 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1063 /* This case can occur with some invalid code. */
1064 dump_type (TREE_TYPE (t),
1065 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1066 | (flags & TFF_DECL_SPECIFIERS
1067 ? TFF_CLASS_KEY_OR_ENUM : 0));
1072 /* Pretty print a function decl. There are several ways we want to print a
1073 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1074 As error can only apply the '#' flag once to give 0 and 1 for V, there
1075 is %D which doesn't print the throw specs, and %F which does. */
1078 dump_function_decl (tree t, int flags)
1082 tree cname = NULL_TREE;
1083 tree template_args = NULL_TREE;
1084 tree template_parms = NULL_TREE;
1085 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1086 int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
1089 flags &= ~TFF_UNQUALIFIED_NAME;
1090 if (TREE_CODE (t) == TEMPLATE_DECL)
1091 t = DECL_TEMPLATE_RESULT (t);
1093 /* Save the exceptions, in case t is a specialization and we are
1094 emitting an error about incompatible specifications. */
1095 exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
1097 /* Pretty print template instantiations only. */
1098 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1102 template_args = DECL_TI_ARGS (t);
1103 tmpl = most_general_template (t);
1104 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1106 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1111 fntype = TREE_TYPE (t);
1112 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1114 if (DECL_CLASS_SCOPE_P (t))
1115 cname = DECL_CONTEXT (t);
1116 /* This is for partially instantiated template methods. */
1117 else if (TREE_CODE (fntype) == METHOD_TYPE)
1118 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1120 if (!(flags & TFF_DECL_SPECIFIERS))
1122 else if (DECL_STATIC_FUNCTION_P (t))
1123 pp_cxx_identifier (cxx_pp, "static");
1124 else if (DECL_VIRTUAL_P (t))
1125 pp_cxx_identifier (cxx_pp, "virtual");
1127 /* Print the return type? */
1129 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1130 && !DECL_DESTRUCTOR_P (t);
1132 dump_type_prefix (TREE_TYPE (fntype), flags);
1134 /* Print the function name. */
1135 if (!do_outer_scope)
1139 dump_type (cname, flags);
1140 pp_cxx_colon_colon (cxx_pp);
1143 dump_scope (CP_DECL_CONTEXT (t), flags);
1145 dump_function_name (t, flags);
1147 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1149 dump_parameters (parmtypes, flags);
1151 if (TREE_CODE (fntype) == METHOD_TYPE)
1153 pp_base (cxx_pp)->padding = pp_before;
1154 pp_cxx_cv_qualifier_seq
1155 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1158 if (flags & TFF_EXCEPTION_SPECIFICATION)
1160 pp_base (cxx_pp)->padding = pp_before;
1161 dump_exception_spec (exceptions, flags);
1165 dump_type_suffix (TREE_TYPE (fntype), flags);
1168 /* If T is a template instantiation, dump the parameter binding. */
1169 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1171 pp_cxx_whitespace (cxx_pp);
1172 pp_cxx_left_bracket (cxx_pp);
1173 pp_cxx_identifier (cxx_pp, "with");
1174 pp_cxx_whitespace (cxx_pp);
1175 dump_template_bindings (template_parms, template_args);
1176 pp_cxx_right_bracket (cxx_pp);
1180 /* Print a parameter list. If this is for a member function, the
1181 member object ptr (and any other hidden args) should have
1182 already been removed. */
1185 dump_parameters (tree parmtypes, int flags)
1188 pp_cxx_left_paren (cxx_pp);
1190 for (first = 1; parmtypes != void_list_node;
1191 parmtypes = TREE_CHAIN (parmtypes))
1194 pp_separate_with_comma (cxx_pp);
1198 pp_cxx_identifier (cxx_pp, "...");
1202 dump_type (TREE_VALUE (parmtypes), flags);
1204 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1206 pp_cxx_whitespace (cxx_pp);
1208 pp_cxx_whitespace (cxx_pp);
1209 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1213 pp_cxx_right_paren (cxx_pp);
1216 /* Print an exception specification. T is the exception specification. */
1219 dump_exception_spec (tree t, int flags)
1223 pp_cxx_identifier (cxx_pp, "throw");
1224 pp_cxx_whitespace (cxx_pp);
1225 pp_cxx_left_paren (cxx_pp);
1226 if (TREE_VALUE (t) != NULL_TREE)
1229 dump_type (TREE_VALUE (t), flags);
1233 pp_separate_with_comma (cxx_pp);
1235 pp_cxx_right_paren (cxx_pp);
1239 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1240 and destructors properly. */
1243 dump_function_name (tree t, int flags)
1245 tree name = DECL_NAME (t);
1247 /* We can get here with a decl that was synthesized by language-
1248 independent machinery (e.g. coverage.c) in which case it won't
1249 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1250 will crash. In this case it is safe just to print out the
1252 if (!DECL_LANG_SPECIFIC (t))
1254 pp_cxx_tree_identifier (cxx_pp, name);
1258 if (TREE_CODE (t) == TEMPLATE_DECL)
1259 t = DECL_TEMPLATE_RESULT (t);
1261 /* Don't let the user see __comp_ctor et al. */
1262 if (DECL_CONSTRUCTOR_P (t)
1263 || DECL_DESTRUCTOR_P (t))
1264 name = constructor_name (DECL_CONTEXT (t));
1266 if (DECL_DESTRUCTOR_P (t))
1268 pp_cxx_complement (cxx_pp);
1269 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1271 else if (DECL_CONV_FN_P (t))
1273 /* This cannot use the hack that the operator's return
1274 type is stashed off of its name because it may be
1275 used for error reporting. In the case of conflicting
1276 declarations, both will have the same name, yet
1277 the types will be different, hence the TREE_TYPE field
1278 of the first name will be clobbered by the second. */
1279 pp_cxx_identifier (cxx_pp, "operator");
1280 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1282 else if (IDENTIFIER_OPNAME_P (name))
1283 pp_cxx_tree_identifier (cxx_pp, name);
1285 dump_decl (name, flags);
1287 if (DECL_TEMPLATE_INFO (t)
1288 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1289 && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1290 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1291 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1294 /* Dump the template parameters from the template info INFO under control of
1295 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1296 specialization (partial or complete). For partial specializations we show
1297 the specialized parameter values. For a primary template we show no
1301 dump_template_parms (tree info, int primary, int flags)
1303 tree args = info ? TI_ARGS (info) : NULL_TREE;
1305 if (primary && flags & TFF_TEMPLATE_NAME)
1307 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1308 pp_cxx_begin_template_argument_list (cxx_pp);
1310 /* Be careful only to print things when we have them, so as not
1311 to crash producing error messages. */
1312 if (args && !primary)
1316 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
1317 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1319 len = TREE_VEC_LENGTH (args);
1321 for (ix = 0; ix != len; ix++)
1323 tree arg = TREE_VEC_ELT (args, ix);
1325 /* Only print a comma if we know there is an argument coming. In
1326 the case of an empty template argument pack, no actual
1327 argument will be printed. */
1329 && (!ARGUMENT_PACK_P (arg)
1330 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1331 pp_separate_with_comma (cxx_pp);
1334 pp_identifier (cxx_pp, "<template parameter error>");
1336 dump_template_argument (arg, flags);
1341 tree tpl = TI_TEMPLATE (info);
1342 tree parms = DECL_TEMPLATE_PARMS (tpl);
1345 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1346 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1348 for (ix = 0; ix != len; ix++)
1352 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1354 pp_identifier (cxx_pp, "<template parameter error>");
1358 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1361 pp_separate_with_comma (cxx_pp);
1363 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1366 pp_cxx_end_template_argument_list (cxx_pp);
1369 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1370 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1373 dump_call_expr_args (tree t, int flags, bool skipfirst)
1376 call_expr_arg_iterator iter;
1378 pp_cxx_left_paren (cxx_pp);
1379 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1385 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1386 if (more_call_expr_args_p (&iter))
1387 pp_separate_with_comma (cxx_pp);
1390 pp_cxx_right_paren (cxx_pp);
1393 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1394 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1398 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1401 aggr_init_expr_arg_iterator iter;
1403 pp_cxx_left_paren (cxx_pp);
1404 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1410 dump_expr (arg, flags | TFF_EXPR_IN_PARENS);
1411 if (more_aggr_init_expr_args_p (&iter))
1412 pp_separate_with_comma (cxx_pp);
1415 pp_cxx_right_paren (cxx_pp);
1418 /* Print out a list of initializers (subr of dump_expr). */
1421 dump_expr_list (tree l, int flags)
1425 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1428 pp_separate_with_comma (cxx_pp);
1432 /* Print out a vector of initializers (subr of dump_expr). */
1435 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1437 unsigned HOST_WIDE_INT idx;
1440 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1442 dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1443 if (idx != VEC_length (constructor_elt, v) - 1)
1444 pp_separate_with_comma (cxx_pp);
1449 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1450 function. Resolve it to a close relative -- in the sense of static
1451 type -- variant being overridden. That is close to what was written in
1452 the source code. Subroutine of dump_expr. */
1455 resolve_virtual_fun_from_obj_type_ref (tree ref)
1457 tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1458 HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1459 tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1462 fun = TREE_CHAIN (fun);
1463 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1464 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1470 /* Print out an expression E under control of FLAGS. */
1473 dump_expr (tree t, int flags)
1478 if (STATEMENT_CLASS_P (t))
1480 pp_cxx_identifier (cxx_pp, "<statement>");
1484 switch (TREE_CODE (t))
1492 case NAMESPACE_DECL:
1495 case IDENTIFIER_NODE:
1496 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1503 pp_constant (cxx_pp, t);
1507 pp_cxx_identifier (cxx_pp, "throw");
1508 dump_expr (TREE_OPERAND (t, 0), flags);
1512 pp_ampersand (cxx_pp);
1513 dump_type (PTRMEM_CST_CLASS (t), flags);
1514 pp_cxx_colon_colon (cxx_pp);
1515 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1519 pp_cxx_left_paren (cxx_pp);
1520 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1521 pp_separate_with_comma (cxx_pp);
1522 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1523 pp_cxx_right_paren (cxx_pp);
1527 pp_cxx_left_paren (cxx_pp);
1528 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1529 pp_string (cxx_pp, " ? ");
1530 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1531 pp_string (cxx_pp, " : ");
1532 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1533 pp_cxx_right_paren (cxx_pp);
1537 if (TREE_HAS_CONSTRUCTOR (t))
1539 pp_cxx_identifier (cxx_pp, "new");
1540 pp_cxx_whitespace (cxx_pp);
1541 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1544 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1547 case AGGR_INIT_EXPR:
1549 tree fn = NULL_TREE;
1551 if (TREE_CODE (AGGR_INIT_EXPR_FN (t)) == ADDR_EXPR)
1552 fn = TREE_OPERAND (AGGR_INIT_EXPR_FN (t), 0);
1554 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1556 if (DECL_CONSTRUCTOR_P (fn))
1557 dump_type (DECL_CONTEXT (fn), flags);
1562 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1564 dump_aggr_init_expr_args (t, flags, true);
1569 tree fn = CALL_EXPR_FN (t);
1570 bool skipfirst = false;
1572 if (TREE_CODE (fn) == ADDR_EXPR)
1573 fn = TREE_OPERAND (fn, 0);
1575 /* Nobody is interested in seeing the guts of vcalls. */
1576 if (TREE_CODE (fn) == OBJ_TYPE_REF)
1577 fn = resolve_virtual_fun_from_obj_type_ref (fn);
1579 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1581 tree ob = CALL_EXPR_ARG (t, 0);
1582 if (TREE_CODE (ob) == ADDR_EXPR)
1584 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1585 pp_cxx_dot (cxx_pp);
1587 else if (TREE_CODE (ob) != PARM_DECL
1588 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1590 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1591 pp_cxx_arrow (cxx_pp);
1595 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1596 dump_call_expr_args (t, flags, skipfirst);
1601 /* Note that this only works for G++ target exprs. If somebody
1602 builds a general TARGET_EXPR, there's no way to represent that
1603 it initializes anything other that the parameter slot for the
1604 default argument. Note we may have cleared out the first
1605 operand in expand_expr, so don't go killing ourselves. */
1606 if (TREE_OPERAND (t, 1))
1607 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1610 case POINTER_PLUS_EXPR:
1611 dump_binary_op ("+", t, flags);
1619 case TRUNC_DIV_EXPR:
1620 case TRUNC_MOD_EXPR:
1628 case TRUTH_ANDIF_EXPR:
1629 case TRUTH_ORIF_EXPR:
1636 case EXACT_DIV_EXPR:
1637 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1641 case FLOOR_DIV_EXPR:
1642 case ROUND_DIV_EXPR:
1644 dump_binary_op ("/", t, flags);
1648 case FLOOR_MOD_EXPR:
1649 case ROUND_MOD_EXPR:
1650 dump_binary_op ("%", t, flags);
1655 tree ob = TREE_OPERAND (t, 0);
1656 if (TREE_CODE (ob) == INDIRECT_REF)
1658 ob = TREE_OPERAND (ob, 0);
1659 if (TREE_CODE (ob) != PARM_DECL
1661 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1663 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1664 pp_cxx_arrow (cxx_pp);
1669 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1670 pp_cxx_dot (cxx_pp);
1672 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1677 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1678 pp_cxx_left_bracket (cxx_pp);
1679 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1680 pp_cxx_right_bracket (cxx_pp);
1683 case UNARY_PLUS_EXPR:
1684 dump_unary_op ("+", t, flags);
1688 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1689 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1690 /* An ADDR_EXPR can have reference type. In that case, we
1691 shouldn't print the `&' doing so indicates to the user
1692 that the expression has pointer type. */
1694 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1695 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1696 else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1697 dump_unary_op ("&&", t, flags);
1699 dump_unary_op ("&", t, flags);
1703 if (TREE_HAS_CONSTRUCTOR (t))
1705 t = TREE_OPERAND (t, 0);
1706 gcc_assert (TREE_CODE (t) == CALL_EXPR);
1707 dump_expr (CALL_EXPR_FN (t), flags | TFF_EXPR_IN_PARENS);
1708 dump_call_expr_args (t, flags, true);
1712 if (TREE_OPERAND (t,0) != NULL_TREE
1713 && TREE_TYPE (TREE_OPERAND (t, 0))
1714 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1715 dump_expr (TREE_OPERAND (t, 0), flags);
1717 dump_unary_op ("*", t, flags);
1723 case TRUTH_NOT_EXPR:
1724 case PREDECREMENT_EXPR:
1725 case PREINCREMENT_EXPR:
1726 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1729 case POSTDECREMENT_EXPR:
1730 case POSTINCREMENT_EXPR:
1731 pp_cxx_left_paren (cxx_pp);
1732 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1733 pp_cxx_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1734 pp_cxx_right_paren (cxx_pp);
1737 case NON_LVALUE_EXPR:
1738 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1739 should be another level of INDIRECT_REF so that I don't have to do
1741 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1743 tree next = TREE_TYPE (TREE_TYPE (t));
1745 while (TREE_CODE (next) == POINTER_TYPE)
1746 next = TREE_TYPE (next);
1748 if (TREE_CODE (next) == FUNCTION_TYPE)
1750 if (flags & TFF_EXPR_IN_PARENS)
1751 pp_cxx_left_paren (cxx_pp);
1752 pp_cxx_star (cxx_pp);
1753 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1754 if (flags & TFF_EXPR_IN_PARENS)
1755 pp_cxx_right_paren (cxx_pp);
1758 /* Else fall through. */
1760 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1764 case VIEW_CONVERT_EXPR:
1766 tree op = TREE_OPERAND (t, 0);
1768 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1770 /* It is a cast, but we cannot tell whether it is a
1771 reinterpret or static cast. Use the C style notation. */
1772 if (flags & TFF_EXPR_IN_PARENS)
1773 pp_cxx_left_paren (cxx_pp);
1774 pp_cxx_left_paren (cxx_pp);
1775 dump_type (TREE_TYPE (t), flags);
1776 pp_cxx_right_paren (cxx_pp);
1777 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1778 if (flags & TFF_EXPR_IN_PARENS)
1779 pp_cxx_right_paren (cxx_pp);
1782 dump_expr (op, flags);
1787 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1789 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1791 if (integer_zerop (idx))
1793 /* A NULL pointer-to-member constant. */
1794 pp_cxx_left_paren (cxx_pp);
1795 pp_cxx_left_paren (cxx_pp);
1796 dump_type (TREE_TYPE (t), flags);
1797 pp_cxx_right_paren (cxx_pp);
1798 pp_character (cxx_pp, '0');
1799 pp_cxx_right_paren (cxx_pp);
1802 else if (host_integerp (idx, 0))
1805 unsigned HOST_WIDE_INT n;
1807 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1808 t = TYPE_METHOD_BASETYPE (t);
1809 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1811 n = tree_low_cst (idx, 0);
1813 /* Map vtable index back one, to allow for the null pointer to
1817 while (n > 0 && virtuals)
1820 virtuals = TREE_CHAIN (virtuals);
1824 dump_expr (BV_FN (virtuals),
1825 flags | TFF_EXPR_IN_PARENS);
1830 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
1832 dump_type (TREE_TYPE (t), 0);
1833 pp_cxx_left_paren (cxx_pp);
1834 pp_cxx_right_paren (cxx_pp);
1838 pp_cxx_left_brace (cxx_pp);
1839 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
1840 pp_cxx_right_brace (cxx_pp);
1847 tree ob = TREE_OPERAND (t, 0);
1848 if (is_dummy_object (ob))
1850 t = TREE_OPERAND (t, 1);
1851 if (TREE_CODE (t) == FUNCTION_DECL)
1853 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1854 else if (BASELINK_P (t))
1855 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1856 flags | TFF_EXPR_IN_PARENS);
1858 dump_decl (t, flags);
1862 if (TREE_CODE (ob) == INDIRECT_REF)
1864 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1865 pp_cxx_arrow (cxx_pp);
1866 pp_cxx_star (cxx_pp);
1870 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1871 pp_cxx_dot (cxx_pp);
1872 pp_cxx_star (cxx_pp);
1874 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1879 case TEMPLATE_PARM_INDEX:
1880 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1884 if (TREE_OPERAND (t, 0) == NULL_TREE
1885 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1887 dump_type (TREE_TYPE (t), flags);
1888 pp_cxx_left_paren (cxx_pp);
1889 dump_expr_list (TREE_OPERAND (t, 0), flags);
1890 pp_cxx_right_paren (cxx_pp);
1894 pp_cxx_left_paren (cxx_pp);
1895 dump_type (TREE_TYPE (t), flags);
1896 pp_cxx_right_paren (cxx_pp);
1897 pp_cxx_left_paren (cxx_pp);
1898 dump_expr_list (TREE_OPERAND (t, 0), flags);
1899 pp_cxx_right_paren (cxx_pp);
1903 case STATIC_CAST_EXPR:
1904 pp_cxx_identifier (cxx_pp, "static_cast");
1906 case REINTERPRET_CAST_EXPR:
1907 pp_cxx_identifier (cxx_pp, "reinterpret_cast");
1909 case CONST_CAST_EXPR:
1910 pp_cxx_identifier (cxx_pp, "const_cast");
1912 case DYNAMIC_CAST_EXPR:
1913 pp_cxx_identifier (cxx_pp, "dynamic_cast");
1915 pp_cxx_begin_template_argument_list (cxx_pp);
1916 dump_type (TREE_TYPE (t), flags);
1917 pp_cxx_end_template_argument_list (cxx_pp);
1918 pp_cxx_left_paren (cxx_pp);
1919 dump_expr (TREE_OPERAND (t, 0), flags);
1920 pp_cxx_right_paren (cxx_pp);
1924 dump_expr (TREE_OPERAND (t, 0), flags);
1925 pp_cxx_arrow (cxx_pp);
1930 if (TREE_CODE (t) == SIZEOF_EXPR)
1931 pp_cxx_identifier (cxx_pp, "sizeof");
1934 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
1935 pp_cxx_identifier (cxx_pp, "__alignof__");
1937 pp_cxx_whitespace (cxx_pp);
1938 pp_cxx_left_paren (cxx_pp);
1939 if (TYPE_P (TREE_OPERAND (t, 0)))
1940 dump_type (TREE_OPERAND (t, 0), flags);
1942 dump_expr (TREE_OPERAND (t, 0), flags);
1943 pp_cxx_right_paren (cxx_pp);
1948 pp_cxx_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1949 pp_cxx_whitespace (cxx_pp);
1950 dump_expr (TREE_OPERAND (t, 0), flags);
1954 pp_identifier (cxx_pp, "<unparsed>");
1957 case TRY_CATCH_EXPR:
1958 case WITH_CLEANUP_EXPR:
1959 case CLEANUP_POINT_EXPR:
1960 dump_expr (TREE_OPERAND (t, 0), flags);
1963 case PSEUDO_DTOR_EXPR:
1964 dump_expr (TREE_OPERAND (t, 2), flags);
1965 pp_cxx_dot (cxx_pp);
1966 dump_type (TREE_OPERAND (t, 0), flags);
1967 pp_cxx_colon_colon (cxx_pp);
1968 pp_cxx_complement (cxx_pp);
1969 dump_type (TREE_OPERAND (t, 1), flags);
1972 case TEMPLATE_ID_EXPR:
1973 dump_decl (t, flags);
1978 case STATEMENT_LIST:
1979 /* We don't yet have a way of dumping statements in a
1980 human-readable format. */
1981 pp_string (cxx_pp, "({...})");
1985 pp_string (cxx_pp, "while (1) { ");
1986 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1987 pp_cxx_right_brace (cxx_pp);
1991 pp_string (cxx_pp, "if (");
1992 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1993 pp_string (cxx_pp, ") break; ");
1997 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
2000 case EMPTY_CLASS_EXPR:
2001 dump_type (TREE_TYPE (t), flags);
2002 pp_cxx_left_paren (cxx_pp);
2003 pp_cxx_right_paren (cxx_pp);
2006 case NON_DEPENDENT_EXPR:
2007 dump_expr (TREE_OPERAND (t, 0), flags);
2010 case ARGUMENT_PACK_SELECT:
2011 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
2023 pp_type_specifier_seq (cxx_pp, t);
2027 /* We get here when we want to print a dependent type as an
2028 id-expression, without any disambiguator decoration. */
2029 pp_id_expression (cxx_pp, t);
2032 case TEMPLATE_TYPE_PARM:
2033 case BOUND_TEMPLATE_TEMPLATE_PARM:
2034 dump_type (t, flags);
2038 pp_cxx_trait_expression (cxx_pp, t);
2042 pp_cxx_va_arg_expression (cxx_pp, t);
2046 pp_cxx_offsetof_expression (cxx_pp, t);
2050 case EXPR_PACK_EXPANSION:
2057 case VEC_DELETE_EXPR:
2063 case UNORDERED_EXPR:
2071 pp_expression (cxx_pp, t);
2074 case TRUTH_AND_EXPR:
2076 case TRUTH_XOR_EXPR:
2077 if (flags & TFF_EXPR_IN_PARENS)
2078 pp_cxx_left_paren (cxx_pp);
2079 pp_expression (cxx_pp, t);
2080 if (flags & TFF_EXPR_IN_PARENS)
2081 pp_cxx_right_paren (cxx_pp);
2085 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2088 /* This list is incomplete, but should suffice for now.
2089 It is very important that `sorry' does not call
2090 `report_error_function'. That could cause an infinite loop. */
2092 pp_unsupported_tree (cxx_pp, t);
2093 /* fall through to ERROR_MARK... */
2095 pp_identifier (cxx_pp, "<expression error>");
2101 dump_binary_op (const char *opstring, tree t, int flags)
2103 pp_cxx_left_paren (cxx_pp);
2104 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2105 pp_cxx_whitespace (cxx_pp);
2107 pp_cxx_identifier (cxx_pp, opstring);
2109 pp_identifier (cxx_pp, "<unknown operator>");
2110 pp_cxx_whitespace (cxx_pp);
2111 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2112 pp_cxx_right_paren (cxx_pp);
2116 dump_unary_op (const char *opstring, tree t, int flags)
2118 if (flags & TFF_EXPR_IN_PARENS)
2119 pp_cxx_left_paren (cxx_pp);
2120 pp_cxx_identifier (cxx_pp, opstring);
2121 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2122 if (flags & TFF_EXPR_IN_PARENS)
2123 pp_cxx_right_paren (cxx_pp);
2127 reinit_cxx_pp (void)
2129 pp_clear_output_area (cxx_pp);
2130 pp_base (cxx_pp)->padding = pp_none;
2131 pp_indentation (cxx_pp) = 0;
2132 pp_needs_newline (cxx_pp) = false;
2133 cxx_pp->enclosing_scope = current_function_decl;
2137 /* Exported interface to stringifying types, exprs and decls under TFF_*
2141 type_as_string (tree typ, int flags)
2144 dump_type (typ, flags);
2145 return pp_formatted_text (cxx_pp);
2149 expr_as_string (tree decl, int flags)
2152 dump_expr (decl, flags);
2153 return pp_formatted_text (cxx_pp);
2157 decl_as_string (tree decl, int flags)
2160 dump_decl (decl, flags);
2161 return pp_formatted_text (cxx_pp);
2164 /* Generate the three forms of printable names for cxx_printable_name. */
2167 lang_decl_name (tree decl, int v)
2170 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2173 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
2175 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2176 pp_cxx_colon_colon (cxx_pp);
2179 if (TREE_CODE (decl) == FUNCTION_DECL)
2180 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2182 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2184 return pp_formatted_text (cxx_pp);
2187 /* Return the location of a tree passed to %+ formats. */
2190 location_of (tree t)
2192 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2193 t = DECL_CONTEXT (t);
2194 else if (TYPE_P (t))
2195 t = TYPE_MAIN_DECL (t);
2196 else if (TREE_CODE (t) == OVERLOAD)
2197 t = OVL_FUNCTION (t);
2199 return DECL_SOURCE_LOCATION (t);
2202 /* Now the interfaces from error et al to dump_type et al. Each takes an
2203 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2207 decl_to_string (tree decl, int verbose)
2211 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2212 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2213 flags = TFF_CLASS_KEY_OR_ENUM;
2215 flags |= TFF_DECL_SPECIFIERS;
2216 else if (TREE_CODE (decl) == FUNCTION_DECL)
2217 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2218 flags |= TFF_TEMPLATE_HEADER;
2221 dump_decl (decl, flags);
2222 return pp_formatted_text (cxx_pp);
2226 expr_to_string (tree decl)
2229 dump_expr (decl, 0);
2230 return pp_formatted_text (cxx_pp);
2234 fndecl_to_string (tree fndecl, int verbose)
2238 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2239 | TFF_TEMPLATE_HEADER;
2241 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2243 dump_decl (fndecl, flags);
2244 return pp_formatted_text (cxx_pp);
2249 code_to_string (enum tree_code c)
2251 return tree_code_name [c];
2255 language_to_string (enum languages c)
2262 case lang_cplusplus:
2274 /* Return the proper printed version of a parameter to a C++ function. */
2277 parm_to_string (int p)
2281 pp_string (cxx_pp, "'this'");
2283 pp_decimal_int (cxx_pp, p + 1);
2284 return pp_formatted_text (cxx_pp);
2288 op_to_string (enum tree_code p)
2290 tree id = operator_name_info[(int) p].identifier;
2291 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2295 type_to_string (tree typ, int verbose)
2299 flags |= TFF_CLASS_KEY_OR_ENUM;
2300 flags |= TFF_TEMPLATE_HEADER;
2303 dump_type (typ, flags);
2304 return pp_formatted_text (cxx_pp);
2308 assop_to_string (enum tree_code p)
2310 tree id = assignment_operator_name_info[(int) p].identifier;
2311 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2315 args_to_string (tree p, int verbose)
2319 flags |= TFF_CLASS_KEY_OR_ENUM;
2324 if (TYPE_P (TREE_VALUE (p)))
2325 return type_as_string (p, flags);
2328 for (; p; p = TREE_CHAIN (p))
2330 if (TREE_VALUE (p) == null_node)
2331 pp_cxx_identifier (cxx_pp, "NULL");
2333 dump_type (error_type (TREE_VALUE (p)), flags);
2335 pp_separate_with_comma (cxx_pp);
2337 return pp_formatted_text (cxx_pp);
2341 cv_to_string (tree p, int v)
2344 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2345 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2346 return pp_formatted_text (cxx_pp);
2349 /* Langhook for print_error_function. */
2351 cxx_print_error_function (diagnostic_context *context, const char *file,
2352 diagnostic_info *diagnostic)
2354 lhd_print_error_function (context, file, diagnostic);
2355 pp_base_set_prefix (context->printer, file);
2356 maybe_print_instantiation_context (context);
2360 cp_diagnostic_starter (diagnostic_context *context,
2361 diagnostic_info *diagnostic)
2363 diagnostic_report_current_module (context);
2364 cp_print_error_function (context, diagnostic);
2365 maybe_print_instantiation_context (context);
2366 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2370 cp_diagnostic_finalizer (diagnostic_context *context,
2371 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2373 pp_base_destroy_prefix (context->printer);
2376 /* Print current function onto BUFFER, in the process of reporting
2377 a diagnostic message. Called from cp_diagnostic_starter. */
2379 cp_print_error_function (diagnostic_context *context,
2380 diagnostic_info *diagnostic)
2382 if (diagnostic_last_function_changed (context, diagnostic))
2384 const char *old_prefix = context->printer->prefix;
2385 const char *file = LOCATION_FILE (diagnostic->location);
2386 tree abstract_origin = diagnostic->abstract_origin;
2387 char *new_prefix = (file && abstract_origin == NULL)
2388 ? file_name_as_prefix (file) : NULL;
2390 pp_base_set_prefix (context->printer, new_prefix);
2392 if (current_function_decl == NULL)
2393 pp_base_string (context->printer, "At global scope:");
2398 if (abstract_origin)
2400 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2401 while (TREE_CODE (ao) == BLOCK
2402 && BLOCK_ABSTRACT_ORIGIN (ao)
2403 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2404 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2405 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2409 fndecl = current_function_decl;
2411 pp_printf (context->printer, "In %s %qs",
2412 function_category (fndecl),
2413 cxx_printable_name (fndecl, 2));
2415 while (abstract_origin)
2418 tree block = abstract_origin;
2420 locus = &BLOCK_SOURCE_LOCATION (block);
2422 block = BLOCK_SUPERCONTEXT (block);
2423 while (block && TREE_CODE (block) == BLOCK
2424 && BLOCK_ABSTRACT_ORIGIN (block))
2426 ao = BLOCK_ABSTRACT_ORIGIN (block);
2428 while (TREE_CODE (ao) == BLOCK
2429 && BLOCK_ABSTRACT_ORIGIN (ao)
2430 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2431 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2433 if (TREE_CODE (ao) == FUNCTION_DECL)
2438 else if (TREE_CODE (ao) != BLOCK)
2441 block = BLOCK_SUPERCONTEXT (block);
2444 abstract_origin = block;
2447 while (block && TREE_CODE (block) == BLOCK)
2448 block = BLOCK_SUPERCONTEXT (block);
2450 if (TREE_CODE (block) == FUNCTION_DECL)
2452 abstract_origin = NULL;
2456 expanded_location s = expand_location (*locus);
2457 pp_base_character (context->printer, ',');
2458 pp_base_newline (context->printer);
2461 if (flag_show_column && s.column != 0)
2462 pp_printf (context->printer,
2463 " inlined from %qs at %s:%d:%d",
2464 cxx_printable_name (fndecl, 2),
2465 s.file, s.line, s.column);
2467 pp_printf (context->printer,
2468 " inlined from %qs at %s:%d",
2469 cxx_printable_name (fndecl, 2),
2474 pp_printf (context->printer, " inlined from %qs",
2475 cxx_printable_name (fndecl, 2));
2478 pp_base_character (context->printer, ':');
2480 pp_base_newline (context->printer);
2482 diagnostic_set_last_function (context, diagnostic);
2483 pp_base_destroy_prefix (context->printer);
2484 context->printer->prefix = old_prefix;
2488 /* Returns a description of FUNCTION using standard terminology. */
2490 function_category (tree fn)
2492 if (DECL_FUNCTION_MEMBER_P (fn))
2494 if (DECL_STATIC_FUNCTION_P (fn))
2495 return "static member function";
2496 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2497 return "copy constructor";
2498 else if (DECL_CONSTRUCTOR_P (fn))
2499 return "constructor";
2500 else if (DECL_DESTRUCTOR_P (fn))
2501 return "destructor";
2503 return "member function";
2509 /* Report the full context of a current template instantiation,
2512 print_instantiation_full_context (diagnostic_context *context)
2514 struct tinst_level *p = current_instantiation ();
2515 location_t location = input_location;
2519 if (current_function_decl != p->decl
2520 && current_function_decl != NULL_TREE)
2521 /* We can get here during the processing of some synthesized
2522 method. Then, P->DECL will be the function that's causing
2527 if (current_function_decl == p->decl)
2528 /* Avoid redundancy with the "In function" line. */;
2530 pp_verbatim (context->printer,
2531 "%s: In instantiation of %qs:\n",
2532 LOCATION_FILE (location),
2533 decl_as_string (p->decl,
2534 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2536 location = p->locus;
2541 print_instantiation_partial_context (context, p, location);
2544 /* Same as above but less verbose. */
2546 print_instantiation_partial_context (diagnostic_context *context,
2547 struct tinst_level *t, location_t loc)
2549 expanded_location xloc;
2550 for (; ; t = t->next)
2552 xloc = expand_location (loc);
2555 pp_verbatim (context->printer, "%s:%d: instantiated from %qs\n",
2556 xloc.file, xloc.line,
2557 decl_as_string (t->decl,
2558 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2561 pp_verbatim (context->printer, "%s:%d: instantiated from here",
2562 xloc.file, xloc.line);
2563 pp_base_newline (context->printer);
2566 /* Called from cp_thing to print the template context for an error. */
2568 maybe_print_instantiation_context (diagnostic_context *context)
2570 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2573 record_last_problematic_instantiation ();
2574 print_instantiation_full_context (context);
2577 /* Report the bare minimum context of a template instantiation. */
2579 print_instantiation_context (void)
2581 print_instantiation_partial_context
2582 (global_dc, current_instantiation (), input_location);
2583 diagnostic_flush_buffer (global_dc);
2586 /* Called from output_format -- during diagnostic message processing --
2587 to handle C++ specific format specifier with the following meanings:
2588 %A function argument-list.
2592 %F function declaration.
2593 %L language as used in extern "lang".
2595 %P function parameter whose position is indicated by an integer.
2596 %Q assignment operator.
2600 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2601 int precision, bool wide, bool set_locus, bool verbose)
2605 #define next_tree (t = va_arg (*text->args_ptr, tree))
2606 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2607 #define next_lang va_arg (*text->args_ptr, enum languages)
2608 #define next_int va_arg (*text->args_ptr, int)
2610 if (precision != 0 || wide)
2613 if (text->locus == NULL)
2618 case 'A': result = args_to_string (next_tree, verbose); break;
2619 case 'C': result = code_to_string (next_tcode); break;
2622 tree temp = next_tree;
2624 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
2626 temp = DECL_DEBUG_EXPR (temp);
2629 result = expr_to_string (temp);
2633 result = decl_to_string (temp, verbose);
2636 case 'E': result = expr_to_string (next_tree); break;
2637 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2638 case 'L': result = language_to_string (next_lang); break;
2639 case 'O': result = op_to_string (next_tcode); break;
2640 case 'P': result = parm_to_string (next_int); break;
2641 case 'Q': result = assop_to_string (next_tcode); break;
2642 case 'T': result = type_to_string (next_tree, verbose); break;
2643 case 'V': result = cv_to_string (next_tree, verbose); break;
2649 pp_base_string (pp, result);
2650 if (set_locus && t != NULL)
2651 *text->locus = location_of (t);
2659 /* Callback from cpp_error for PFILE to print diagnostics arising from
2660 interpreting strings. The diagnostic is of type LEVEL; MSG is the
2661 translated message and AP the arguments. */
2664 cp_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
2665 const char *msg, va_list *ap)
2667 diagnostic_info diagnostic;
2668 diagnostic_t dlevel;
2671 case CPP_DL_WARNING:
2672 case CPP_DL_WARNING_SYSHDR:
2673 dlevel = DK_WARNING;
2675 case CPP_DL_PEDWARN:
2676 dlevel = DK_PEDWARN;
2687 diagnostic_set_info_translated (&diagnostic, msg, ap,
2688 input_location, dlevel);
2689 report_diagnostic (&diagnostic);
2692 /* Warn about the use of C++0x features when appropriate. */
2694 maybe_warn_cpp0x (const char* str)
2696 if ((cxx_dialect == cxx98) && !in_system_header)
2697 /* We really want to suppress this warning in system headers,
2698 because libstdc++ uses variadic templates even when we aren't
2700 pedwarn (input_location, 0, "%s only available with -std=c++0x or -std=gnu++0x", str);
2703 /* Warn about the use of variadic templates when appropriate. */
2705 maybe_warn_variadic_templates (void)
2707 maybe_warn_cpp0x ("variadic templates");