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 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 2, 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 COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "coretypes.h"
31 #include "diagnostic.h"
32 #include "langhooks-def.h"
33 #include "cxx-pretty-print.h"
35 #define pp_template_argument_list_start(PP) \
36 pp_non_consecutive_character (PP, '<')
37 #define pp_template_argument_list_end(PP) \
38 pp_non_consecutive_character (PP, '>')
39 #define pp_separate_with_comma(PP) pp_string (PP, ", ")
41 /* The global buffer where we dump everything. It is there only for
42 transitional purpose. It is expected, in the near future, to be
43 completely removed. */
44 static cxx_pretty_printer scratch_pretty_printer;
45 #define cxx_pp (&scratch_pretty_printer)
47 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
49 #define reinit_global_formatting_buffer() \
50 pp_clear_output_area (scratch_buffer)
52 static const char *args_to_string (tree, int);
53 static const char *assop_to_string (enum tree_code);
54 static const char *code_to_string (enum tree_code);
55 static const char *cv_to_string (tree, int);
56 static const char *decl_to_string (tree, int);
57 static const char *expr_to_string (tree);
58 static const char *fndecl_to_string (tree, int);
59 static const char *op_to_string (enum tree_code);
60 static const char *parm_to_string (int);
61 static const char *type_to_string (tree, int);
63 static void dump_type (tree, int);
64 static void dump_typename (tree, int);
65 static void dump_simple_decl (tree, tree, int);
66 static void dump_decl (tree, int);
67 static void dump_template_decl (tree, int);
68 static void dump_function_decl (tree, int);
69 static void dump_expr (tree, int);
70 static void dump_unary_op (const char *, tree, int);
71 static void dump_binary_op (const char *, tree, int);
72 static void dump_aggr_type (tree, int);
73 static void dump_type_prefix (tree, int);
74 static void dump_type_suffix (tree, int);
75 static void dump_function_name (tree, int);
76 static void dump_expr_list (tree, int);
77 static void dump_global_iord (tree);
78 static void dump_parameters (tree, int);
79 static void dump_exception_spec (tree, int);
80 static const char *class_key_or_enum (tree);
81 static void dump_template_argument (tree, int);
82 static void dump_template_argument_list (tree, int);
83 static void dump_template_parameter (tree, int);
84 static void dump_template_bindings (tree, tree);
85 static void dump_scope (tree, int);
86 static void dump_template_parms (tree, int, int);
88 static const char *function_category (tree);
89 static void maybe_print_instantiation_context (diagnostic_context *);
90 static void print_instantiation_full_context (diagnostic_context *);
91 static void print_instantiation_partial_context (diagnostic_context *,
93 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
94 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
95 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
97 static bool cp_printer (pretty_printer *, text_info *);
98 static void pp_non_consecutive_character (cxx_pretty_printer *, int);
99 static tree locate_error (const char *, va_list);
100 static location_t location_of (tree);
105 diagnostic_starter (global_dc) = cp_diagnostic_starter;
106 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
107 diagnostic_format_decoder (global_dc) = cp_printer;
109 pp_construct (pp_base (cxx_pp), NULL, 0);
110 pp_cxx_pretty_printer_init (cxx_pp);
113 /* Dump a scope, if deemed necessary. */
116 dump_scope (tree scope, int flags)
118 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
120 if (scope == NULL_TREE)
123 if (TREE_CODE (scope) == NAMESPACE_DECL)
125 if (scope != global_namespace)
127 dump_decl (scope, f);
128 pp_colon_colon (cxx_pp);
131 else if (AGGREGATE_TYPE_P (scope))
133 dump_type (scope, f);
134 pp_colon_colon (cxx_pp);
136 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
138 dump_function_decl (scope, f);
139 pp_colon_colon (cxx_pp);
143 /* Dump the template ARGument under control of FLAGS. */
146 dump_template_argument (tree arg, int flags)
148 if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
149 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
151 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)
167 pp_separate_with_comma (cxx_pp);
168 dump_template_argument (TREE_VEC_ELT (args, i), flags);
173 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
176 dump_template_parameter (tree parm, int flags)
178 tree p = TREE_VALUE (parm);
179 tree a = TREE_PURPOSE (parm);
181 if (TREE_CODE (p) == TYPE_DECL)
183 if (flags & TFF_DECL_SPECIFIERS)
185 pp_identifier (cxx_pp, "class");
189 pp_tree_identifier (cxx_pp, DECL_NAME (p));
192 else if (DECL_NAME (p))
193 pp_tree_identifier (cxx_pp, DECL_NAME (p));
195 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
198 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
200 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
202 pp_string (cxx_pp, " = ");
203 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
204 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
206 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
210 /* Dump, under control of FLAGS, a template-parameter-list binding.
211 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
215 dump_template_bindings (tree parms, tree args)
221 tree p = TREE_VALUE (parms);
222 int lvl = TMPL_PARMS_DEPTH (parms);
226 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
228 tree arg = NULL_TREE;
230 /* Don't crash if we had an invalid argument list. */
231 if (TMPL_ARGS_DEPTH (args) >= lvl)
233 tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
234 if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
235 arg = TREE_VEC_ELT (lvl_args, arg_idx);
239 pp_separate_with_comma (cxx_pp);
240 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
241 pp_string (cxx_pp, " = ");
243 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
245 pp_identifier (cxx_pp, "<missing>");
251 parms = TREE_CHAIN (parms);
255 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
259 dump_type (tree t, int flags)
264 if (TYPE_PTRMEMFUNC_P (t))
267 switch (TREE_CODE (t))
270 pp_identifier (cxx_pp, "<unknown type>");
274 /* A list of function parms. */
275 dump_parameters (t, flags);
278 case IDENTIFIER_NODE:
279 pp_tree_identifier (cxx_pp, t);
283 dump_type (BINFO_TYPE (t), flags);
289 dump_aggr_type (t, flags);
293 if (flags & TFF_CHASE_TYPEDEF)
295 dump_type (DECL_ORIGINAL_TYPE (t)
296 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
299 /* Else fall through. */
303 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
312 pp_base (cxx_pp)->padding = pp_none;
313 pp_type_specifier_seq (cxx_pp, t);
316 case TEMPLATE_TEMPLATE_PARM:
317 /* For parameters inside template signature. */
318 if (TYPE_IDENTIFIER (t))
319 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
321 pp_cxx_canonical_template_parameter (cxx_pp, t);
324 case BOUND_TEMPLATE_TEMPLATE_PARM:
326 tree args = TYPE_TI_ARGS (t);
327 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
328 pp_template_argument_list_start (cxx_pp);
329 dump_template_argument_list (args, flags);
330 pp_template_argument_list_end (cxx_pp);
334 case TEMPLATE_TYPE_PARM:
335 pp_cxx_cv_qualifier_seq (cxx_pp, t);
336 if (TYPE_IDENTIFIER (t))
337 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
339 pp_cxx_canonical_template_parameter
340 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
343 /* This is not always necessary for pointers and such, but doing this
344 reduces code size. */
353 dump_type_prefix (t, flags);
354 dump_type_suffix (t, flags);
358 pp_cxx_cv_qualifier_seq (cxx_pp, t);
359 pp_string (cxx_pp, "typename ");
360 dump_typename (t, flags);
363 case UNBOUND_CLASS_TEMPLATE:
364 dump_type (TYPE_CONTEXT (t), flags);
365 pp_colon_colon (cxx_pp);
366 pp_identifier (cxx_pp, "template ");
367 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
371 pp_string (cxx_pp, "__typeof (");
372 dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
373 pp_right_paren (cxx_pp);
377 pp_unsupported_tree (cxx_pp, t);
378 /* Fall through to error. */
381 pp_identifier (cxx_pp, "<type error>");
386 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
390 dump_typename (tree t, int flags)
392 tree ctx = TYPE_CONTEXT (t);
394 if (TREE_CODE (ctx) == TYPENAME_TYPE)
395 dump_typename (ctx, flags);
397 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
398 pp_colon_colon (cxx_pp);
399 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
402 /* Return the name of the supplied aggregate, or enumeral type. */
405 class_key_or_enum (tree t)
407 if (TREE_CODE (t) == ENUMERAL_TYPE)
409 else if (TREE_CODE (t) == UNION_TYPE)
411 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
417 /* Print out a class declaration T under the control of FLAGS,
418 in the form `class foo'. */
421 dump_aggr_type (tree t, int flags)
424 const char *variety = class_key_or_enum (t);
428 pp_cxx_cv_qualifier_seq (cxx_pp, t);
430 if (flags & TFF_CLASS_KEY_OR_ENUM)
432 pp_identifier (cxx_pp, variety);
436 if (flags & TFF_CHASE_TYPEDEF)
437 t = TYPE_MAIN_VARIANT (t);
439 name = TYPE_NAME (t);
443 typdef = !DECL_ARTIFICIAL (name);
444 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
445 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
446 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
447 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
448 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
449 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
450 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
453 /* Because the template names are mangled, we have to locate
454 the most general template, and use that name. */
455 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
457 while (DECL_TEMPLATE_INFO (tpl))
458 tpl = DECL_TI_TEMPLATE (tpl);
461 name = DECL_NAME (name);
464 if (name == 0 || ANON_AGGRNAME_P (name))
466 if (flags & TFF_CLASS_KEY_OR_ENUM)
467 pp_identifier (cxx_pp, "<anonymous>");
469 pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
472 pp_tree_identifier (cxx_pp, name);
474 dump_template_parms (TYPE_TEMPLATE_INFO (t),
475 !CLASSTYPE_USE_TEMPLATE (t),
476 flags & ~TFF_TEMPLATE_HEADER);
479 /* Dump into the obstack the initial part of the output for a given type.
480 This is necessary when dealing with things like functions returning
483 return type of `int (* fee ())()': pointer -> function -> int. Both
484 pointer (and reference and offset) and function (and member) types must
485 deal with prefix and suffix.
487 Arrays must also do this for DECL nodes, like int a[], and for things like
491 dump_type_prefix (tree t, int flags)
493 pp_base (cxx_pp)->padding = pp_none;
495 if (TYPE_PTRMEMFUNC_P (t))
497 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
501 switch (TREE_CODE (t))
506 tree sub = TREE_TYPE (t);
508 dump_type_prefix (sub, flags);
509 if (TREE_CODE (sub) == ARRAY_TYPE)
512 pp_left_paren (cxx_pp);
514 pp_character (cxx_pp, "&*"[TREE_CODE (t) == POINTER_TYPE]);
515 pp_base (cxx_pp)->padding = pp_before;
516 pp_cxx_cv_qualifier_seq (cxx_pp, t);
522 dump_type_prefix (TREE_TYPE (t), flags);
523 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
525 pp_maybe_space (cxx_pp);
526 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
527 pp_colon_colon (cxx_pp);
530 pp_cxx_cv_qualifier_seq (cxx_pp, t);
533 /* Can only be reached through function pointer -- this would not be
534 correct if FUNCTION_DECLs used it. */
536 dump_type_prefix (TREE_TYPE (t), flags);
537 pp_maybe_space (cxx_pp);
538 pp_left_paren (cxx_pp);
542 dump_type_prefix (TREE_TYPE (t), flags);
543 pp_maybe_space (cxx_pp);
544 pp_left_paren (cxx_pp);
545 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
546 pp_colon_colon (cxx_pp);
550 dump_type_prefix (TREE_TYPE (t), flags);
554 case IDENTIFIER_NODE:
559 case TEMPLATE_TYPE_PARM:
560 case TEMPLATE_TEMPLATE_PARM:
561 case BOUND_TEMPLATE_TEMPLATE_PARM:
572 dump_type (t, flags);
573 pp_base (cxx_pp)->padding = pp_before;
577 pp_unsupported_tree (cxx_pp, t);
580 pp_identifier (cxx_pp, "<typeprefixerror>");
585 /* Dump the suffix of type T, under control of FLAGS. This is the part
586 which appears after the identifier (or function parms). */
589 dump_type_suffix (tree t, int flags)
591 if (TYPE_PTRMEMFUNC_P (t))
592 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
594 switch (TREE_CODE (t))
599 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
600 pp_right_paren (cxx_pp);
601 dump_type_suffix (TREE_TYPE (t), flags);
604 /* Can only be reached through function pointer. */
609 pp_right_paren (cxx_pp);
610 arg = TYPE_ARG_TYPES (t);
611 if (TREE_CODE (t) == METHOD_TYPE)
612 arg = TREE_CHAIN (arg);
614 /* Function pointers don't have default args. Not in standard C++,
615 anyway; they may in g++, but we'll just pretend otherwise. */
616 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
618 if (TREE_CODE (t) == METHOD_TYPE)
619 pp_cxx_cv_qualifier_seq
620 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
621 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
622 dump_type_suffix (TREE_TYPE (t), flags);
627 pp_left_bracket (cxx_pp);
630 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
632 (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
633 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
634 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
635 flags & ~TFF_EXPR_IN_PARENS);
637 dump_expr (fold (cp_build_binary_op
638 (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
640 flags & ~TFF_EXPR_IN_PARENS);
642 pp_right_bracket (cxx_pp);
643 dump_type_suffix (TREE_TYPE (t), flags);
647 case IDENTIFIER_NODE:
652 case TEMPLATE_TYPE_PARM:
653 case TEMPLATE_TEMPLATE_PARM:
654 case BOUND_TEMPLATE_TEMPLATE_PARM:
668 pp_unsupported_tree (cxx_pp, t);
670 /* Don't mark it here, we should have already done in
677 dump_global_iord (tree t)
679 const char *p = NULL;
681 if (DECL_GLOBAL_CTOR_P (t))
683 else if (DECL_GLOBAL_DTOR_P (t))
688 pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
692 dump_simple_decl (tree t, tree type, int flags)
694 if (flags & TFF_DECL_SPECIFIERS)
696 dump_type_prefix (type, flags);
697 pp_maybe_space (cxx_pp);
699 if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
700 dump_scope (CP_DECL_CONTEXT (t), flags);
702 dump_decl (DECL_NAME (t), flags);
704 pp_identifier (cxx_pp, "<anonymous>");
705 if (flags & TFF_DECL_SPECIFIERS)
706 dump_type_suffix (type, flags);
709 /* Dump a human readable string for the decl T under control of FLAGS. */
712 dump_decl (tree t, int flags)
717 switch (TREE_CODE (t))
721 /* Don't say 'typedef class A' */
722 if (DECL_ARTIFICIAL (t))
724 if ((flags & TFF_DECL_SPECIFIERS)
725 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
726 /* Say `class T' not just `T'. */
727 pp_string (cxx_pp, "class ");
729 dump_type (TREE_TYPE (t), flags);
733 if (flags & TFF_DECL_SPECIFIERS)
734 pp_string (cxx_pp, "typedef ");
735 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
736 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
741 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
743 pp_string (cxx_pp, "vtable for ");
744 my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720);
745 dump_type (DECL_CONTEXT (t), flags);
748 /* Else fall through. */
752 dump_simple_decl (t, TREE_TYPE (t), flags);
756 pp_string (cxx_pp, "<return value> ");
757 dump_simple_decl (t, TREE_TYPE (t), flags);
761 if (flags & TFF_DECL_SPECIFIERS)
762 pp_cxx_declaration (cxx_pp, t);
765 dump_scope (CP_DECL_CONTEXT (t), flags);
766 if (DECL_NAME (t) == NULL_TREE)
767 pp_identifier (cxx_pp, "<unnamed>");
769 pp_tree_identifier (cxx_pp, DECL_NAME (t));
774 pp_expression (cxx_pp, t);
778 dump_decl (TREE_OPERAND (t, 0), flags);
779 pp_left_bracket (cxx_pp);
780 dump_decl (TREE_OPERAND (t, 1), flags);
781 pp_right_bracket (cxx_pp);
784 /* So that we can do dump_decl on an aggr type. */
788 dump_type (t, flags);
792 /* This is a pseudo destructor call which has not been folded into
793 a PSEUDO_DTOR_EXPR yet. */
794 pp_complement (cxx_pp);
795 dump_type (TREE_OPERAND (t, 0), flags);
802 /* These special cases are duplicated here so that other functions
803 can feed identifiers to error and get them demangled properly. */
804 case IDENTIFIER_NODE:
805 if (IDENTIFIER_TYPENAME_P (t))
807 pp_string (cxx_pp, "operator ");
808 /* Not exactly IDENTIFIER_TYPE_VALUE. */
809 dump_type (TREE_TYPE (t), flags);
813 pp_tree_identifier (cxx_pp, t);
820 if (DECL_CLASS_SCOPE_P (t))
822 dump_type (DECL_CONTEXT (t), flags);
823 pp_colon_colon (cxx_pp);
825 else if (DECL_CONTEXT (t))
827 dump_decl (DECL_CONTEXT (t), flags);
828 pp_colon_colon (cxx_pp);
830 dump_decl (DECL_NAME (t), flags);
834 /* If there's only one function, just treat it like an ordinary
840 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
841 dump_global_iord (t);
842 else if (! DECL_LANG_SPECIFIC (t))
843 pp_identifier (cxx_pp, "<internal>");
845 dump_function_decl (t, flags);
849 dump_template_decl (t, flags);
852 case TEMPLATE_ID_EXPR:
854 tree name = TREE_OPERAND (t, 0);
856 if (is_overloaded_fn (name))
857 name = DECL_NAME (get_first_fn (name));
858 dump_decl (name, flags);
859 pp_template_argument_list_start (cxx_pp);
860 if (TREE_OPERAND (t, 1))
861 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
862 pp_template_argument_list_end (cxx_pp);
867 pp_tree_identifier (cxx_pp, DECL_NAME (t));
871 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
872 || (DECL_INITIAL (t) &&
873 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
874 dump_simple_decl (t, TREE_TYPE (t), flags);
875 else if (DECL_NAME (t))
876 dump_decl (DECL_NAME (t), flags);
877 else if (DECL_INITIAL (t))
878 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
880 pp_identifier (cxx_pp, "<enumerator>");
884 pp_string (cxx_pp, "using ");
885 dump_type (DECL_INITIAL (t), flags);
886 pp_colon_colon (cxx_pp);
887 dump_decl (DECL_NAME (t), flags);
891 dump_decl (BASELINK_FUNCTIONS (t), flags);
894 case NON_DEPENDENT_EXPR:
895 dump_expr (t, flags);
898 case TEMPLATE_TYPE_PARM:
899 if (flags & TFF_DECL_SPECIFIERS)
900 pp_cxx_declaration (cxx_pp, t);
902 pp_type_id (cxx_pp, t);
906 pp_unsupported_tree (cxx_pp, t);
907 /* Fall through to error. */
910 pp_identifier (cxx_pp, "<declaration error>");
915 /* Dump a template declaration T under control of FLAGS. This means the
916 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
919 dump_template_decl (tree t, int flags)
921 tree orig_parms = DECL_TEMPLATE_PARMS (t);
925 if (flags & TFF_TEMPLATE_HEADER)
927 for (parms = orig_parms = nreverse (orig_parms);
929 parms = TREE_CHAIN (parms))
931 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
932 int len = TREE_VEC_LENGTH (inner_parms);
934 pp_string (cxx_pp, "template<");
936 /* If we've shown the template prefix, we'd better show the
937 parameters' and decl's type too. */
938 flags |= TFF_DECL_SPECIFIERS;
940 for (i = 0; i < len; i++)
943 pp_separate_with_comma (cxx_pp);
944 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
946 pp_template_argument_list_end (cxx_pp);
949 nreverse(orig_parms);
951 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
952 /* Say `template<arg> class TT' not just `template<arg> TT'. */
953 pp_string (cxx_pp, "class ");
956 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
957 dump_type (TREE_TYPE (t),
958 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
959 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
960 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
961 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
962 else if (TREE_TYPE (t) == NULL_TREE)
965 switch (NEXT_CODE (t))
969 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
972 /* This case can occur with some invalid code. */
973 dump_type (TREE_TYPE (t),
974 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
975 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0));
979 /* Pretty print a function decl. There are several ways we want to print a
980 function declaration. The TFF_ bits in FLAGS tells us how to behave.
981 As error can only apply the '#' flag once to give 0 and 1 for V, there
982 is %D which doesn't print the throw specs, and %F which does. */
985 dump_function_decl (tree t, int flags)
989 tree cname = NULL_TREE;
990 tree template_args = NULL_TREE;
991 tree template_parms = NULL_TREE;
992 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
994 if (TREE_CODE (t) == TEMPLATE_DECL)
995 t = DECL_TEMPLATE_RESULT (t);
997 /* Pretty print template instantiations only. */
998 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1002 template_args = DECL_TI_ARGS (t);
1003 tmpl = most_general_template (t);
1004 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1006 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1011 fntype = TREE_TYPE (t);
1012 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1014 if (DECL_CLASS_SCOPE_P (t))
1015 cname = DECL_CONTEXT (t);
1016 /* This is for partially instantiated template methods. */
1017 else if (TREE_CODE (fntype) == METHOD_TYPE)
1018 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1020 if (!(flags & TFF_DECL_SPECIFIERS))
1022 else if (DECL_STATIC_FUNCTION_P (t))
1023 pp_identifier (cxx_pp, "static ");
1024 else if (DECL_VIRTUAL_P (t))
1025 pp_identifier (cxx_pp, "virtual ");
1027 /* Print the return type? */
1029 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1030 && !DECL_DESTRUCTOR_P (t);
1033 dump_type_prefix (TREE_TYPE (fntype), flags);
1037 /* Print the function name. */
1040 dump_type (cname, flags);
1041 pp_colon_colon (cxx_pp);
1044 dump_scope (CP_DECL_CONTEXT (t), flags);
1046 dump_function_name (t, flags);
1048 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1050 dump_parameters (parmtypes, flags);
1052 if (TREE_CODE (fntype) == METHOD_TYPE)
1053 pp_cxx_cv_qualifier_seq
1054 (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1056 if (flags & TFF_EXCEPTION_SPECIFICATION)
1057 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1060 dump_type_suffix (TREE_TYPE (fntype), flags);
1063 /* If T is a template instantiation, dump the parameter binding. */
1064 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1066 pp_string (cxx_pp, " [with ");
1067 dump_template_bindings (template_parms, template_args);
1068 pp_right_bracket (cxx_pp);
1072 /* Print a parameter list. If this is for a member function, the
1073 member object ptr (and any other hidden args) should have
1074 already been removed. */
1077 dump_parameters (tree parmtypes, int flags)
1081 pp_left_paren (cxx_pp);
1083 for (first = 1; parmtypes != void_list_node;
1084 parmtypes = TREE_CHAIN (parmtypes))
1087 pp_separate_with_comma (cxx_pp);
1091 pp_identifier (cxx_pp, "...");
1094 dump_type (TREE_VALUE (parmtypes), flags);
1096 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1098 pp_string (cxx_pp, " = ");
1099 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1103 pp_right_paren (cxx_pp);
1106 /* Print an exception specification. T is the exception specification. */
1109 dump_exception_spec (tree t, int flags)
1113 pp_string (cxx_pp, " throw (");
1114 if (TREE_VALUE (t) != NULL_TREE)
1117 dump_type (TREE_VALUE (t), flags);
1121 pp_separate_with_comma (cxx_pp);
1123 pp_right_paren (cxx_pp);
1127 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1128 and destructors properly. */
1131 dump_function_name (tree t, int flags)
1133 tree name = DECL_NAME (t);
1135 /* We can get here with a decl that was synthesized by language-
1136 independent machinery (e.g. coverage.c) in which case it won't
1137 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1138 will crash. In this case it is safe just to print out the
1140 if (!DECL_LANG_SPECIFIC (t))
1142 pp_tree_identifier (cxx_pp, name);
1146 if (TREE_CODE (t) == TEMPLATE_DECL)
1147 t = DECL_TEMPLATE_RESULT (t);
1149 /* Don't let the user see __comp_ctor et al. */
1150 if (DECL_CONSTRUCTOR_P (t)
1151 || DECL_DESTRUCTOR_P (t))
1152 name = constructor_name (DECL_CONTEXT (t));
1154 if (DECL_DESTRUCTOR_P (t))
1156 pp_complement (cxx_pp);
1157 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1159 else if (DECL_CONV_FN_P (t))
1161 /* This cannot use the hack that the operator's return
1162 type is stashed off of its name because it may be
1163 used for error reporting. In the case of conflicting
1164 declarations, both will have the same name, yet
1165 the types will be different, hence the TREE_TYPE field
1166 of the first name will be clobbered by the second. */
1167 pp_string (cxx_pp, "operator ");
1168 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1170 else if (IDENTIFIER_OPNAME_P (name))
1171 pp_tree_identifier (cxx_pp, name);
1173 dump_decl (name, flags);
1175 if (DECL_TEMPLATE_INFO (t)
1176 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1177 && (DECL_TEMPLATE_SPECIALIZATION (t)
1178 || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1179 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t))
1180 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1181 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1184 /* Dump the template parameters from the template info INFO under control of
1185 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1186 specialization (partial or complete). For partial specializations we show
1187 the specialized parameter values. For a primary template we show no
1191 dump_template_parms (tree info, int primary, int flags)
1193 tree args = info ? TI_ARGS (info) : NULL_TREE;
1195 if (primary && flags & TFF_TEMPLATE_NAME)
1197 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1198 pp_template_argument_list_start (cxx_pp);
1200 /* Be careful only to print things when we have them, so as not
1201 to crash producing error messages. */
1202 if (args && !primary)
1206 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
1207 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1209 len = TREE_VEC_LENGTH (args);
1211 for (ix = 0; ix != len; ix++)
1213 tree arg = TREE_VEC_ELT (args, ix);
1216 pp_separate_with_comma (cxx_pp);
1219 pp_identifier (cxx_pp, "<template parameter error>");
1221 dump_template_argument (arg, flags);
1226 tree tpl = TI_TEMPLATE (info);
1227 tree parms = DECL_TEMPLATE_PARMS (tpl);
1230 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1231 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1233 for (ix = 0; ix != len; ix++)
1235 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1238 pp_separate_with_comma (cxx_pp);
1240 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1243 pp_template_argument_list_end (cxx_pp);
1246 /* Print out a list of initializers (subr of dump_expr). */
1249 dump_expr_list (tree l, int flags)
1253 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1256 pp_separate_with_comma (cxx_pp);
1260 /* Print out an expression E under control of FLAGS. */
1263 dump_expr (tree t, int flags)
1268 switch (TREE_CODE (t))
1276 case NAMESPACE_DECL:
1278 case IDENTIFIER_NODE:
1279 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1285 pp_c_constant (pp_c_base (cxx_pp), t);
1289 pp_identifier (cxx_pp, "throw");
1290 dump_expr (TREE_OPERAND (t, 0), flags);
1294 pp_ampersand (cxx_pp);
1295 dump_type (PTRMEM_CST_CLASS (t), flags);
1296 pp_colon_colon (cxx_pp);
1297 pp_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1301 pp_left_paren (cxx_pp);
1302 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1303 pp_separate_with_comma (cxx_pp);
1304 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1305 pp_right_paren (cxx_pp);
1309 pp_left_paren (cxx_pp);
1310 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1311 pp_string (cxx_pp, " ? ");
1312 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1313 pp_string (cxx_pp, " : ");
1314 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1315 pp_right_paren (cxx_pp);
1319 if (TREE_HAS_CONSTRUCTOR (t))
1321 pp_string (cxx_pp, "new ");
1322 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1325 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1328 case AGGR_INIT_EXPR:
1330 tree fn = NULL_TREE;
1332 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1333 fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1335 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1337 if (DECL_CONSTRUCTOR_P (fn))
1338 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (TREE_TYPE (t)));
1343 dump_expr (TREE_OPERAND (t, 0), 0);
1345 pp_left_paren (cxx_pp);
1346 if (TREE_OPERAND (t, 1))
1347 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1348 pp_right_paren (cxx_pp);
1353 tree fn = TREE_OPERAND (t, 0);
1354 tree args = TREE_OPERAND (t, 1);
1356 if (TREE_CODE (fn) == ADDR_EXPR)
1357 fn = TREE_OPERAND (fn, 0);
1359 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1361 tree ob = TREE_VALUE (args);
1362 if (TREE_CODE (ob) == ADDR_EXPR)
1364 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1367 else if (TREE_CODE (ob) != PARM_DECL
1368 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1370 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1373 args = TREE_CHAIN (args);
1375 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1376 pp_left_paren (cxx_pp);
1377 dump_expr_list (args, flags);
1378 pp_right_paren (cxx_pp);
1384 tree type = TREE_OPERAND (t, 1);
1385 tree init = TREE_OPERAND (t, 2);
1386 if (NEW_EXPR_USE_GLOBAL (t))
1387 pp_colon_colon (cxx_pp);
1388 pp_string (cxx_pp, "new ");
1389 if (TREE_OPERAND (t, 0))
1391 pp_left_paren (cxx_pp);
1392 dump_expr_list (TREE_OPERAND (t, 0), flags);
1393 pp_string (cxx_pp, ") ");
1395 if (TREE_CODE (type) == ARRAY_REF)
1396 type = build_cplus_array_type
1397 (TREE_OPERAND (type, 0),
1398 build_index_type (fold (build (MINUS_EXPR, integer_type_node,
1399 TREE_OPERAND (type, 1),
1400 integer_one_node))));
1401 dump_type (type, flags);
1404 pp_left_paren (cxx_pp);
1405 if (TREE_CODE (init) == TREE_LIST)
1406 dump_expr_list (init, flags);
1407 else if (init == void_zero_node)
1408 /* This representation indicates an empty initializer,
1409 e.g.: "new int()". */
1412 dump_expr (init, flags);
1413 pp_right_paren (cxx_pp);
1419 /* Note that this only works for G++ target exprs. If somebody
1420 builds a general TARGET_EXPR, there's no way to represent that
1421 it initializes anything other that the parameter slot for the
1422 default argument. Note we may have cleared out the first
1423 operand in expand_expr, so don't go killing ourselves. */
1424 if (TREE_OPERAND (t, 1))
1425 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1433 case TRUNC_DIV_EXPR:
1434 case TRUNC_MOD_EXPR:
1442 case TRUTH_ANDIF_EXPR:
1443 case TRUTH_ORIF_EXPR:
1450 case EXACT_DIV_EXPR:
1451 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1455 case FLOOR_DIV_EXPR:
1456 case ROUND_DIV_EXPR:
1457 dump_binary_op ("/", t, flags);
1461 case FLOOR_MOD_EXPR:
1462 case ROUND_MOD_EXPR:
1463 dump_binary_op ("%", t, flags);
1468 tree ob = TREE_OPERAND (t, 0);
1469 if (TREE_CODE (ob) == INDIRECT_REF)
1471 ob = TREE_OPERAND (ob, 0);
1472 if (TREE_CODE (ob) != PARM_DECL
1473 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1475 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1481 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1484 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1489 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1490 pp_left_bracket (cxx_pp);
1491 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1492 pp_right_bracket (cxx_pp);
1496 if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
1498 pp_left_paren (cxx_pp);
1499 dump_type (TREE_TYPE (t), flags);
1500 pp_right_paren (cxx_pp);
1501 dump_expr (TREE_OPERAND (t, 0), flags);
1504 dump_unary_op ("+", t, flags);
1508 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1509 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1510 /* An ADDR_EXPR can have reference type. In that case, we
1511 shouldn't print the `&' doing so indicates to the user
1512 that the expression has pointer type. */
1514 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1515 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1517 dump_unary_op ("&", t, flags);
1521 if (TREE_HAS_CONSTRUCTOR (t))
1523 t = TREE_OPERAND (t, 0);
1524 my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);
1525 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1526 pp_left_paren (cxx_pp);
1527 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1528 pp_right_paren (cxx_pp);
1532 if (TREE_OPERAND (t,0) != NULL_TREE
1533 && TREE_TYPE (TREE_OPERAND (t, 0))
1534 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1535 dump_expr (TREE_OPERAND (t, 0), flags);
1537 dump_unary_op ("*", t, flags);
1543 case TRUTH_NOT_EXPR:
1544 case PREDECREMENT_EXPR:
1545 case PREINCREMENT_EXPR:
1546 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1549 case POSTDECREMENT_EXPR:
1550 case POSTINCREMENT_EXPR:
1551 pp_left_paren (cxx_pp);
1552 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1553 pp_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1554 pp_right_paren (cxx_pp);
1557 case NON_LVALUE_EXPR:
1558 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1559 should be another level of INDIRECT_REF so that I don't have to do
1561 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1563 tree next = TREE_TYPE (TREE_TYPE (t));
1565 while (TREE_CODE (next) == POINTER_TYPE)
1566 next = TREE_TYPE (next);
1568 if (TREE_CODE (next) == FUNCTION_TYPE)
1570 if (flags & TFF_EXPR_IN_PARENS)
1571 pp_left_paren (cxx_pp);
1573 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1574 if (flags & TFF_EXPR_IN_PARENS)
1575 pp_right_paren (cxx_pp);
1578 /* Else fall through. */
1580 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1585 tree op = TREE_OPERAND (t, 0);
1587 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1589 /* It is a cast, but we cannot tell whether it is a
1590 reinterpret or static cast. Use the C style notation. */
1591 if (flags & TFF_EXPR_IN_PARENS)
1592 pp_left_paren (cxx_pp);
1593 pp_left_paren (cxx_pp);
1594 dump_type (TREE_TYPE (t), flags);
1595 pp_right_paren (cxx_pp);
1596 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1597 if (flags & TFF_EXPR_IN_PARENS)
1598 pp_right_paren (cxx_pp);
1601 dump_expr (op, flags);
1606 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1608 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1610 if (integer_zerop (idx))
1612 /* A NULL pointer-to-member constant. */
1613 pp_left_paren (cxx_pp);
1614 pp_left_paren (cxx_pp);
1615 dump_type (TREE_TYPE (t), flags);
1616 pp_right_paren (cxx_pp);
1617 pp_string (cxx_pp, ")0)");
1620 else if (host_integerp (idx, 0))
1623 unsigned HOST_WIDE_INT n;
1625 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1626 t = TYPE_METHOD_BASETYPE (t);
1627 virtuals = TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t));
1629 n = tree_low_cst (idx, 0);
1631 /* Map vtable index back one, to allow for the null pointer to
1635 while (n > 0 && virtuals)
1638 virtuals = TREE_CHAIN (virtuals);
1642 dump_expr (BV_FN (virtuals),
1643 flags | TFF_EXPR_IN_PARENS);
1648 if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
1650 dump_type (TREE_TYPE (t), 0);
1651 pp_left_paren (cxx_pp);
1652 pp_right_paren (cxx_pp);
1656 pp_left_brace (cxx_pp);
1657 dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
1658 pp_right_brace (cxx_pp);
1665 tree ob = TREE_OPERAND (t, 0);
1666 if (is_dummy_object (ob))
1668 t = TREE_OPERAND (t, 1);
1669 if (TREE_CODE (t) == FUNCTION_DECL)
1671 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1672 else if (BASELINK_P (t))
1673 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1674 flags | TFF_EXPR_IN_PARENS);
1676 dump_decl (t, flags);
1680 if (TREE_CODE (ob) == INDIRECT_REF)
1682 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1683 pp_string (cxx_pp, "->*");
1687 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1688 pp_string (cxx_pp, ".*");
1690 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1695 case TEMPLATE_PARM_INDEX:
1696 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1700 pp_expression (cxx_pp, t);
1704 if (TREE_OPERAND (t, 0) == NULL_TREE
1705 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1707 dump_type (TREE_TYPE (t), flags);
1708 pp_left_paren (cxx_pp);
1709 dump_expr_list (TREE_OPERAND (t, 0), flags);
1710 pp_right_paren (cxx_pp);
1714 pp_left_paren (cxx_pp);
1715 dump_type (TREE_TYPE (t), flags);
1716 pp_string (cxx_pp, ")(");
1717 dump_expr_list (TREE_OPERAND (t, 0), flags);
1718 pp_right_paren (cxx_pp);
1722 case STATIC_CAST_EXPR:
1723 pp_string (cxx_pp, "static_cast<");
1725 case REINTERPRET_CAST_EXPR:
1726 pp_string (cxx_pp, "reinterpret_cast<");
1728 case CONST_CAST_EXPR:
1729 pp_string (cxx_pp, "const_cast<");
1731 case DYNAMIC_CAST_EXPR:
1732 pp_string (cxx_pp, "dynamic_cast<");
1734 dump_type (TREE_TYPE (t), flags);
1735 pp_string (cxx_pp, ">(");
1736 dump_expr (TREE_OPERAND (t, 0), flags);
1737 pp_right_paren (cxx_pp);
1741 dump_expr (TREE_OPERAND (t, 0), flags);
1747 if (TREE_CODE (t) == SIZEOF_EXPR)
1748 pp_string (cxx_pp, "sizeof (");
1751 my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
1752 pp_string (cxx_pp, "__alignof__ (");
1754 if (TYPE_P (TREE_OPERAND (t, 0)))
1755 dump_type (TREE_OPERAND (t, 0), flags);
1757 dump_expr (TREE_OPERAND (t, 0), flags);
1758 pp_right_paren (cxx_pp);
1763 pp_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1765 dump_expr (TREE_OPERAND (t, 0), flags);
1769 pp_identifier (cxx_pp, "<unparsed>");
1772 case TRY_CATCH_EXPR:
1773 case WITH_CLEANUP_EXPR:
1774 case CLEANUP_POINT_EXPR:
1775 dump_expr (TREE_OPERAND (t, 0), flags);
1778 case PSEUDO_DTOR_EXPR:
1779 dump_expr (TREE_OPERAND (t, 2), flags);
1781 dump_type (TREE_OPERAND (t, 0), flags);
1782 pp_colon_colon (cxx_pp);
1783 pp_complement (cxx_pp);
1784 dump_type (TREE_OPERAND (t, 1), flags);
1787 case TEMPLATE_ID_EXPR:
1788 dump_decl (t, flags);
1792 /* We don't yet have a way of dumping statements in a
1793 human-readable format. */
1794 pp_string (cxx_pp, "({...})");
1798 pp_left_brace (cxx_pp);
1799 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1800 pp_right_brace (cxx_pp);
1804 pp_string (cxx_pp, "while (1) { ");
1805 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1806 pp_right_brace (cxx_pp);
1810 pp_string (cxx_pp, "if (");
1811 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1812 pp_string (cxx_pp, ") break; ");
1816 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
1819 case EMPTY_CLASS_EXPR:
1820 dump_type (TREE_TYPE (t), flags);
1821 pp_left_paren (cxx_pp);
1822 pp_right_paren (cxx_pp);
1825 case NON_DEPENDENT_EXPR:
1826 dump_expr (TREE_OPERAND (t, 0), flags);
1829 /* This list is incomplete, but should suffice for now.
1830 It is very important that `sorry' does not call
1831 `report_error_function'. That could cause an infinite loop. */
1833 pp_unsupported_tree (cxx_pp, t);
1834 /* fall through to ERROR_MARK... */
1836 pp_identifier (cxx_pp, "<expression error>");
1842 dump_binary_op (const char *opstring, tree t, int flags)
1844 pp_left_paren (cxx_pp);
1845 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1848 pp_identifier (cxx_pp, opstring);
1850 pp_identifier (cxx_pp, "<unknown operator>");
1852 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1853 pp_right_paren (cxx_pp);
1857 dump_unary_op (const char *opstring, tree t, int flags)
1859 if (flags & TFF_EXPR_IN_PARENS)
1860 pp_left_paren (cxx_pp);
1861 pp_identifier (cxx_pp, opstring);
1862 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1863 if (flags & TFF_EXPR_IN_PARENS)
1864 pp_right_paren (cxx_pp);
1867 /* Exported interface to stringifying types, exprs and decls under TFF_*
1871 type_as_string (tree typ, int flags)
1873 pp_clear_output_area (cxx_pp);
1874 dump_type (typ, flags);
1875 return pp_formatted_text (cxx_pp);
1879 expr_as_string (tree decl, int flags)
1881 pp_clear_output_area (cxx_pp);
1882 dump_expr (decl, flags);
1883 return pp_formatted_text (cxx_pp);
1887 decl_as_string (tree decl, int flags)
1889 pp_clear_output_area (cxx_pp);
1890 dump_decl (decl, flags);
1891 return pp_formatted_text (cxx_pp);
1895 context_as_string (tree context, int flags)
1897 pp_clear_output_area (cxx_pp);
1898 dump_scope (context, flags);
1899 return pp_formatted_text (cxx_pp);
1902 /* Generate the three forms of printable names for cxx_printable_name. */
1905 lang_decl_name (tree decl, int v)
1908 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
1910 pp_clear_output_area (cxx_pp);
1911 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
1913 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
1914 pp_colon_colon (cxx_pp);
1917 if (TREE_CODE (decl) == FUNCTION_DECL)
1918 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
1920 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
1922 return pp_formatted_text (cxx_pp);
1926 location_of (tree t)
1928 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
1929 t = DECL_CONTEXT (t);
1930 else if (TYPE_P (t))
1931 t = TYPE_MAIN_DECL (t);
1932 else if (TREE_CODE (t) == OVERLOAD)
1933 t = OVL_FUNCTION (t);
1935 return DECL_SOURCE_LOCATION (t);
1938 /* Now the interfaces from error et al to dump_type et al. Each takes an
1939 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
1943 decl_to_string (tree decl, int verbose)
1947 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
1948 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
1949 flags = TFF_CLASS_KEY_OR_ENUM;
1951 flags |= TFF_DECL_SPECIFIERS;
1952 else if (TREE_CODE (decl) == FUNCTION_DECL)
1953 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
1954 flags |= TFF_TEMPLATE_HEADER;
1956 pp_clear_output_area (cxx_pp);
1957 dump_decl (decl, flags);
1958 return pp_formatted_text (cxx_pp);
1962 expr_to_string (tree decl)
1964 pp_clear_output_area (cxx_pp);
1965 dump_expr (decl, 0);
1966 return pp_formatted_text (cxx_pp);
1970 fndecl_to_string (tree fndecl, int verbose)
1974 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
1976 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
1977 pp_clear_output_area (cxx_pp);
1978 dump_decl (fndecl, flags);
1979 return pp_formatted_text (cxx_pp);
1984 code_to_string (enum tree_code c)
1986 return tree_code_name [c];
1990 language_to_string (enum languages c)
1997 case lang_cplusplus:
2009 /* Return the proper printed version of a parameter to a C++ function. */
2012 parm_to_string (int p)
2014 pp_clear_output_area (cxx_pp);
2016 pp_string (cxx_pp, "'this'");
2018 pp_decimal_int (cxx_pp, p + 1);
2019 return pp_formatted_text (cxx_pp);
2023 op_to_string (enum tree_code p)
2025 tree id = operator_name_info[(int) p].identifier;
2026 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2030 type_to_string (tree typ, int verbose)
2034 flags |= TFF_CLASS_KEY_OR_ENUM;
2035 flags |= TFF_TEMPLATE_HEADER;
2037 pp_clear_output_area (cxx_pp);
2038 dump_type (typ, flags);
2039 return pp_formatted_text (cxx_pp);
2043 assop_to_string (enum tree_code p)
2045 tree id = assignment_operator_name_info[(int) p].identifier;
2046 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2050 args_to_string (tree p, int verbose)
2054 flags |= TFF_CLASS_KEY_OR_ENUM;
2059 if (TYPE_P (TREE_VALUE (p)))
2060 return type_as_string (p, flags);
2062 pp_clear_output_area (cxx_pp);
2063 for (; p; p = TREE_CHAIN (p))
2065 if (TREE_VALUE (p) == null_node)
2066 pp_identifier (cxx_pp, "NULL");
2068 dump_type (error_type (TREE_VALUE (p)), flags);
2070 pp_separate_with_comma (cxx_pp);
2072 return pp_formatted_text (cxx_pp);
2076 cv_to_string (tree p, int v)
2078 pp_clear_output_area (cxx_pp);
2079 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2080 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2081 return pp_formatted_text (cxx_pp);
2084 /* Langhook for print_error_function. */
2086 cxx_print_error_function (diagnostic_context *context, const char *file)
2088 lhd_print_error_function (context, file);
2089 pp_base_set_prefix (context->printer, file);
2090 maybe_print_instantiation_context (context);
2094 cp_diagnostic_starter (diagnostic_context *context,
2095 diagnostic_info *diagnostic)
2097 diagnostic_report_current_module (context);
2098 cp_print_error_function (context, diagnostic);
2099 maybe_print_instantiation_context (context);
2100 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2104 cp_diagnostic_finalizer (diagnostic_context *context,
2105 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2107 pp_base_destroy_prefix (context->printer);
2110 /* Print current function onto BUFFER, in the process of reporting
2111 a diagnostic message. Called from cp_diagnostic_starter. */
2113 cp_print_error_function (diagnostic_context *context,
2114 diagnostic_info *diagnostic)
2116 if (diagnostic_last_function_changed (context))
2118 const char *old_prefix = context->printer->prefix;
2119 char *new_prefix = diagnostic->location.file
2120 ? file_name_as_prefix (diagnostic->location.file)
2123 pp_base_set_prefix (context->printer, new_prefix);
2125 if (current_function_decl == NULL)
2126 pp_base_string (context->printer, "At global scope:");
2128 pp_printf (context->printer, "In %s `%s':",
2129 function_category (current_function_decl),
2130 cxx_printable_name (current_function_decl, 2));
2131 pp_base_newline (context->printer);
2133 diagnostic_set_last_function (context);
2134 pp_base_destroy_prefix (context->printer);
2135 context->printer->prefix = old_prefix;
2139 /* Returns a description of FUNCTION using standard terminology. */
2141 function_category (tree fn)
2143 if (DECL_FUNCTION_MEMBER_P (fn))
2145 if (DECL_STATIC_FUNCTION_P (fn))
2146 return "static member function";
2147 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2148 return "copy constructor";
2149 else if (DECL_CONSTRUCTOR_P (fn))
2150 return "constructor";
2151 else if (DECL_DESTRUCTOR_P (fn))
2152 return "destructor";
2154 return "member function";
2160 /* Report the full context of a current template instantiation,
2163 print_instantiation_full_context (diagnostic_context *context)
2165 tree p = current_instantiation ();
2166 location_t location = input_location;
2170 if (current_function_decl != TINST_DECL (p)
2171 && current_function_decl != NULL_TREE)
2172 /* We can get here during the processing of some synthesized
2173 method. Then, TINST_DECL (p) will be the function that's causing
2178 if (current_function_decl == TINST_DECL (p))
2179 /* Avoid redundancy with the the "In function" line. */;
2181 pp_verbatim (context->printer,
2182 "%s: In instantiation of `%s':\n", location.file,
2183 decl_as_string (TINST_DECL (p),
2184 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2186 location = *EXPR_LOCUS (p);
2191 print_instantiation_partial_context (context, p, location);
2194 /* Same as above but less verbose. */
2196 print_instantiation_partial_context (diagnostic_context *context,
2197 tree t, location_t loc)
2199 for (; t; t = TREE_CHAIN (t))
2201 pp_verbatim (context->printer, "%s:%d: instantiated from `%s'\n",
2203 decl_as_string (TINST_DECL (t),
2204 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2205 loc = *EXPR_LOCUS (t);
2207 pp_verbatim (context->printer, "%s:%d: instantiated from here\n",
2208 loc.file, loc.line);
2211 /* Called from cp_thing to print the template context for an error. */
2213 maybe_print_instantiation_context (diagnostic_context *context)
2215 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2218 record_last_problematic_instantiation ();
2219 print_instantiation_full_context (context);
2222 /* Report the bare minimum context of a template instantiation. */
2224 print_instantiation_context (void)
2226 print_instantiation_partial_context
2227 (global_dc, current_instantiation (), input_location);
2228 diagnostic_flush_buffer (global_dc);
2231 /* Called from output_format -- during diagnostic message processing --
2232 to handle C++ specific format specifier with the following meanings:
2233 %A function argument-list.
2237 %F function declaration.
2238 %L language as used in extern "lang".
2240 %P function parameter whose position is indicated by an integer.
2241 %Q assignment operator.
2245 cp_printer (pretty_printer *pp, text_info *text)
2249 #define next_tree va_arg (*text->args_ptr, tree)
2250 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2251 #define next_lang va_arg (*text->args_ptr, enum languages)
2252 #define next_int va_arg (*text->args_ptr, int)
2254 if (*text->format_spec == '+')
2255 ++text->format_spec;
2256 if (*text->format_spec == '#')
2259 ++text->format_spec;
2262 switch (*text->format_spec)
2264 case 'A': result = args_to_string (next_tree, verbose); break;
2265 case 'C': result = code_to_string (next_tcode); break;
2266 case 'D': result = decl_to_string (next_tree, verbose); break;
2267 case 'E': result = expr_to_string (next_tree); break;
2268 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2269 case 'L': result = language_to_string (next_lang); break;
2270 case 'O': result = op_to_string (next_tcode); break;
2271 case 'P': result = parm_to_string (next_int); break;
2272 case 'Q': result = assop_to_string (next_tcode); break;
2273 case 'T': result = type_to_string (next_tree, verbose); break;
2274 case 'V': result = cv_to_string (next_tree, verbose); break;
2280 pp_base_string (pp, result);
2289 pp_non_consecutive_character (cxx_pretty_printer *pp, int c)
2291 const char *p = pp_last_position_in_text (pp);
2293 if (p != NULL && *p == c)
2295 pp_character (pp, c);
2298 /* These are temporary wrapper functions which handle the historic
2299 behavior of cp_*_at. */
2302 locate_error (const char *msgid, va_list ap)
2308 for (f = msgid; *f; f++)
2321 /* Just ignore these possibilities. */
2324 case 'd': (void) va_arg (ap, int); break;
2325 case 's': (void) va_arg (ap, char *); break;
2326 case 'L': (void) va_arg (ap, enum languages); break;
2329 case 'Q': (void) va_arg (ap, enum tree_code); break;
2331 /* These take a tree, which may be where the error is
2339 t = va_arg (ap, tree);
2345 errorcount = 0; /* damn ICE suppression */
2346 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2352 here = va_arg (ap, tree);
2359 cp_error_at (const char *msgid, ...)
2362 diagnostic_info diagnostic;
2365 va_start (ap, msgid);
2366 here = locate_error (msgid, ap);
2369 va_start (ap, msgid);
2370 diagnostic_set_info (&diagnostic, msgid, &ap,
2371 location_of (here), DK_ERROR);
2372 report_diagnostic (&diagnostic);
2377 cp_warning_at (const char *msgid, ...)
2380 diagnostic_info diagnostic;
2383 va_start (ap, msgid);
2384 here = locate_error (msgid, ap);
2387 va_start (ap, msgid);
2388 diagnostic_set_info (&diagnostic, msgid, &ap,
2389 location_of (here), DK_WARNING);
2390 report_diagnostic (&diagnostic);
2395 cp_pedwarn_at (const char *msgid, ...)
2398 diagnostic_info diagnostic;
2401 va_start (ap, msgid);
2402 here = locate_error (msgid, ap);
2405 va_start (ap, msgid);
2406 diagnostic_set_info (&diagnostic, msgid, &ap,
2407 location_of (here), pedantic_error_kind());
2408 report_diagnostic (&diagnostic);