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 enum pad { none, before, after };
37 #define pp_template_argument_list_start(PP) \
38 pp_non_consecutive_character (PP, '<')
39 #define pp_template_argument_list_end(PP) \
40 pp_non_consecutive_character (PP, '>')
41 #define pp_separate_with_comma(PP) pp_string (PP, ", ")
43 /* The global buffer where we dump everything. It is there only for
44 transitional purpose. It is expected, in the near future, to be
45 completely removed. */
46 static cxx_pretty_printer scratch_pretty_printer;
47 #define cxx_pp (&scratch_pretty_printer)
49 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
51 #define reinit_global_formatting_buffer() \
52 output_clear_message_text (scratch_buffer)
54 static const char *args_to_string (tree, int);
55 static const char *assop_to_string (enum tree_code);
56 static const char *code_to_string (enum tree_code);
57 static const char *cv_to_string (tree, int);
58 static const char *decl_to_string (tree, int);
59 static const char *expr_to_string (tree);
60 static const char *fndecl_to_string (tree, int);
61 static const char *op_to_string (enum tree_code);
62 static const char *parm_to_string (int);
63 static const char *type_to_string (tree, int);
65 static void dump_type (tree, int);
66 static void dump_typename (tree, int);
67 static void dump_simple_decl (tree, tree, int);
68 static void dump_decl (tree, int);
69 static void dump_template_decl (tree, int);
70 static void dump_function_decl (tree, int);
71 static void dump_expr (tree, int);
72 static void dump_unary_op (const char *, tree, int);
73 static void dump_binary_op (const char *, tree, int);
74 static void dump_aggr_type (tree, int);
75 static enum pad dump_type_prefix (tree, int);
76 static void dump_type_suffix (tree, int);
77 static void dump_function_name (tree, int);
78 static void dump_expr_list (tree, int);
79 static void dump_global_iord (tree);
80 static enum pad dump_qualifiers (tree, enum pad);
81 static void dump_parameters (tree, int);
82 static void dump_exception_spec (tree, int);
83 static const char *class_key_or_enum (tree);
84 static void dump_template_argument (tree, int);
85 static void dump_template_argument_list (tree, int);
86 static void dump_template_parameter (tree, int);
87 static void dump_template_bindings (tree, tree);
88 static void dump_scope (tree, int);
89 static void dump_template_parms (tree, int, int);
91 static const char *function_category (tree);
92 static void maybe_print_instantiation_context (diagnostic_context *);
93 static void print_instantiation_full_context (diagnostic_context *);
94 static void print_instantiation_partial_context (diagnostic_context *,
96 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
97 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
98 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
100 static bool cp_printer (pretty_printer *, text_info *);
101 static void pp_non_consecutive_character (cxx_pretty_printer *, int);
102 static tree locate_error (const char *, va_list);
103 static location_t location_of (tree);
108 diagnostic_starter (global_dc) = cp_diagnostic_starter;
109 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
110 diagnostic_format_decoder (global_dc) = cp_printer;
112 pp_construct (pp_base (cxx_pp), NULL, 0);
113 pp_cxx_pretty_printer_init (cxx_pp);
116 /* Dump a scope, if deemed necessary. */
119 dump_scope (tree scope, int flags)
121 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
123 if (scope == NULL_TREE)
126 if (TREE_CODE (scope) == NAMESPACE_DECL)
128 if (scope != global_namespace)
130 dump_decl (scope, f);
131 pp_colon_colon (cxx_pp);
134 else if (AGGREGATE_TYPE_P (scope))
136 dump_type (scope, f);
137 pp_colon_colon (cxx_pp);
139 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
141 dump_function_decl (scope, f);
142 pp_colon_colon (cxx_pp);
146 /* Dump type qualifiers, providing padding as requested. Return an
147 indication of whether we dumped something. */
150 dump_qualifiers (tree t, enum pad p)
152 static const int masks[] =
153 {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT};
154 static const char *const names[] =
155 {"const", "volatile", "__restrict"};
157 int quals = TYPE_QUALS (t);
158 int do_after = p == after;
162 for (ix = 0; ix != 3; ix++)
163 if (masks[ix] & quals)
168 pp_identifier (cxx_pp, names[ix]);
178 /* Dump the template ARGument under control of FLAGS. */
181 dump_template_argument (tree arg, int flags)
183 if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
184 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
186 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
189 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
193 dump_template_argument_list (tree args, int flags)
195 int n = TREE_VEC_LENGTH (args);
199 for (i = 0; i< n; ++i)
202 pp_separate_with_comma (cxx_pp);
203 dump_template_argument (TREE_VEC_ELT (args, i), flags);
208 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
211 dump_template_parameter (tree parm, int flags)
213 tree p = TREE_VALUE (parm);
214 tree a = TREE_PURPOSE (parm);
216 if (TREE_CODE (p) == TYPE_DECL)
218 if (flags & TFF_DECL_SPECIFIERS)
220 pp_identifier (cxx_pp, "class");
224 pp_tree_identifier (cxx_pp, DECL_NAME (p));
227 else if (DECL_NAME (p))
228 pp_tree_identifier (cxx_pp, DECL_NAME (p));
230 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
233 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
235 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
237 pp_string (cxx_pp, " = ");
238 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
239 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
241 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
245 /* Dump, under control of FLAGS, a template-parameter-list binding.
246 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
250 dump_template_bindings (tree parms, tree args)
256 tree p = TREE_VALUE (parms);
257 int lvl = TMPL_PARMS_DEPTH (parms);
261 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
263 tree arg = NULL_TREE;
265 /* Don't crash if we had an invalid argument list. */
266 if (TMPL_ARGS_DEPTH (args) >= lvl)
268 tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
269 if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
270 arg = TREE_VEC_ELT (lvl_args, arg_idx);
274 pp_separate_with_comma (cxx_pp);
275 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
276 pp_string (cxx_pp, " = ");
278 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
280 pp_identifier (cxx_pp, "<missing>");
286 parms = TREE_CHAIN (parms);
290 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
294 dump_type (tree t, int flags)
299 if (TYPE_PTRMEMFUNC_P (t))
302 switch (TREE_CODE (t))
305 pp_identifier (cxx_pp, "<unknown type>");
309 /* A list of function parms. */
310 dump_parameters (t, flags);
313 case IDENTIFIER_NODE:
314 pp_tree_identifier (cxx_pp, t);
318 dump_type (BINFO_TYPE (t), flags);
324 dump_aggr_type (t, flags);
328 if (flags & TFF_CHASE_TYPEDEF)
330 dump_type (DECL_ORIGINAL_TYPE (t)
331 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
334 /* Else fall through. */
338 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
347 pp_base (cxx_pp)->padding = pp_none;
348 pp_type_specifier_seq (cxx_pp, t);
351 case TEMPLATE_TEMPLATE_PARM:
352 /* For parameters inside template signature. */
353 if (TYPE_IDENTIFIER (t))
354 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
356 pp_cxx_canonical_template_parameter (cxx_pp, t);
359 case BOUND_TEMPLATE_TEMPLATE_PARM:
361 tree args = TYPE_TI_ARGS (t);
362 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
363 pp_template_argument_list_start (cxx_pp);
364 dump_template_argument_list (args, flags);
365 pp_template_argument_list_end (cxx_pp);
369 case TEMPLATE_TYPE_PARM:
370 dump_qualifiers (t, after);
371 if (TYPE_IDENTIFIER (t))
372 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
374 pp_cxx_canonical_template_parameter
375 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
378 /* This is not always necessary for pointers and such, but doing this
379 reduces code size. */
388 dump_type_prefix (t, flags);
389 dump_type_suffix (t, flags);
393 dump_qualifiers (t, after);
394 pp_string (cxx_pp, "typename ");
395 dump_typename (t, flags);
398 case UNBOUND_CLASS_TEMPLATE:
399 dump_type (TYPE_CONTEXT (t), flags);
400 pp_colon_colon (cxx_pp);
401 pp_identifier (cxx_pp, "template ");
402 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
406 pp_string (cxx_pp, "__typeof (");
407 dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS);
408 pp_right_paren (cxx_pp);
412 pp_unsupported_tree (cxx_pp, t);
413 /* Fall through to error. */
416 pp_identifier (cxx_pp, "<type error>");
421 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
425 dump_typename (tree t, int flags)
427 tree ctx = TYPE_CONTEXT (t);
429 if (TREE_CODE (ctx) == TYPENAME_TYPE)
430 dump_typename (ctx, flags);
432 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
433 pp_colon_colon (cxx_pp);
434 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
437 /* Return the name of the supplied aggregate, or enumeral type. */
440 class_key_or_enum (tree t)
442 if (TREE_CODE (t) == ENUMERAL_TYPE)
444 else if (TREE_CODE (t) == UNION_TYPE)
446 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
452 /* Print out a class declaration T under the control of FLAGS,
453 in the form `class foo'. */
456 dump_aggr_type (tree t, int flags)
459 const char *variety = class_key_or_enum (t);
463 dump_qualifiers (t, after);
465 if (flags & TFF_CLASS_KEY_OR_ENUM)
467 pp_identifier (cxx_pp, variety);
471 if (flags & TFF_CHASE_TYPEDEF)
472 t = TYPE_MAIN_VARIANT (t);
474 name = TYPE_NAME (t);
478 typdef = !DECL_ARTIFICIAL (name);
479 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
480 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
481 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
482 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
483 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
484 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
485 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
488 /* Because the template names are mangled, we have to locate
489 the most general template, and use that name. */
490 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
492 while (DECL_TEMPLATE_INFO (tpl))
493 tpl = DECL_TI_TEMPLATE (tpl);
496 name = DECL_NAME (name);
499 if (name == 0 || ANON_AGGRNAME_P (name))
501 if (flags & TFF_CLASS_KEY_OR_ENUM)
502 pp_identifier (cxx_pp, "<anonymous>");
504 pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
507 pp_tree_identifier (cxx_pp, name);
509 dump_template_parms (TYPE_TEMPLATE_INFO (t),
510 !CLASSTYPE_USE_TEMPLATE (t),
511 flags & ~TFF_TEMPLATE_HEADER);
514 /* Dump into the obstack the initial part of the output for a given type.
515 This is necessary when dealing with things like functions returning
518 return type of `int (* fee ())()': pointer -> function -> int. Both
519 pointer (and reference and offset) and function (and member) types must
520 deal with prefix and suffix.
522 Arrays must also do this for DECL nodes, like int a[], and for things like
525 Return indicates how you should pad an object name after this. I.e. you
526 want to pad non-*, non-& cores, but not pad * or & types. */
529 dump_type_prefix (tree t, int flags)
531 enum pad padding = before;
533 if (TYPE_PTRMEMFUNC_P (t))
535 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
539 switch (TREE_CODE (t))
544 tree sub = TREE_TYPE (t);
546 padding = dump_type_prefix (sub, flags);
547 if (TREE_CODE (sub) == ARRAY_TYPE)
550 pp_left_paren (cxx_pp);
552 pp_character (cxx_pp, "&*"[TREE_CODE (t) == POINTER_TYPE]);
553 padding = dump_qualifiers (t, before);
559 padding = dump_type_prefix (TREE_TYPE (t), flags);
560 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
564 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
565 pp_colon_colon (cxx_pp);
568 padding = dump_qualifiers (t, none);
571 /* Can only be reached through function pointer -- this would not be
572 correct if FUNCTION_DECLs used it. */
574 padding = dump_type_prefix (TREE_TYPE (t), flags);
577 pp_left_paren (cxx_pp);
582 padding = dump_type_prefix (TREE_TYPE (t), flags);
585 pp_left_paren (cxx_pp);
587 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
588 pp_colon_colon (cxx_pp);
592 padding = dump_type_prefix (TREE_TYPE (t), flags);
596 case IDENTIFIER_NODE:
601 case TEMPLATE_TYPE_PARM:
602 case TEMPLATE_TEMPLATE_PARM:
603 case BOUND_TEMPLATE_TEMPLATE_PARM:
614 dump_type (t, flags);
619 pp_unsupported_tree (cxx_pp, t);
622 pp_identifier (cxx_pp, "<typeprefixerror>");
628 /* Dump the suffix of type T, under control of FLAGS. This is the part
629 which appears after the identifier (or function parms). */
632 dump_type_suffix (tree t, int flags)
634 if (TYPE_PTRMEMFUNC_P (t))
635 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
637 switch (TREE_CODE (t))
642 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
643 pp_right_paren (cxx_pp);
644 dump_type_suffix (TREE_TYPE (t), flags);
647 /* Can only be reached through function pointer. */
652 pp_right_paren (cxx_pp);
653 arg = TYPE_ARG_TYPES (t);
654 if (TREE_CODE (t) == METHOD_TYPE)
655 arg = TREE_CHAIN (arg);
657 /* Function pointers don't have default args. Not in standard C++,
658 anyway; they may in g++, but we'll just pretend otherwise. */
659 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
661 if (TREE_CODE (t) == METHOD_TYPE)
663 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before);
664 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
665 dump_type_suffix (TREE_TYPE (t), flags);
670 pp_left_bracket (cxx_pp);
673 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
675 (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
676 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
677 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
678 flags & ~TFF_EXPR_IN_PARENS);
680 dump_expr (fold (cp_build_binary_op
681 (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
683 flags & ~TFF_EXPR_IN_PARENS);
685 pp_right_bracket (cxx_pp);
686 dump_type_suffix (TREE_TYPE (t), flags);
690 case IDENTIFIER_NODE:
695 case TEMPLATE_TYPE_PARM:
696 case TEMPLATE_TEMPLATE_PARM:
697 case BOUND_TEMPLATE_TEMPLATE_PARM:
711 pp_unsupported_tree (cxx_pp, t);
713 /* Don't mark it here, we should have already done in
720 dump_global_iord (tree t)
722 const char *p = NULL;
724 if (DECL_GLOBAL_CTOR_P (t))
726 else if (DECL_GLOBAL_DTOR_P (t))
731 pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
735 dump_simple_decl (tree t, tree type, int flags)
737 if (flags & TFF_DECL_SPECIFIERS)
739 if (dump_type_prefix (type, flags) != none)
742 if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
743 dump_scope (CP_DECL_CONTEXT (t), flags);
745 dump_decl (DECL_NAME (t), flags);
747 pp_identifier (cxx_pp, "<anonymous>");
748 if (flags & TFF_DECL_SPECIFIERS)
749 dump_type_suffix (type, flags);
752 /* Dump a human readable string for the decl T under control of FLAGS. */
755 dump_decl (tree t, int flags)
760 switch (TREE_CODE (t))
764 /* Don't say 'typedef class A' */
765 if (DECL_ARTIFICIAL (t))
767 if ((flags & TFF_DECL_SPECIFIERS)
768 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
769 /* Say `class T' not just `T'. */
770 pp_string (cxx_pp, "class ");
772 dump_type (TREE_TYPE (t), flags);
776 if (flags & TFF_DECL_SPECIFIERS)
777 pp_string (cxx_pp, "typedef ");
778 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
779 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
784 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
786 pp_string (cxx_pp, "vtable for ");
787 my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720);
788 dump_type (DECL_CONTEXT (t), flags);
791 /* Else fall through. */
795 dump_simple_decl (t, TREE_TYPE (t), flags);
799 pp_string (cxx_pp, "<return value> ");
800 dump_simple_decl (t, TREE_TYPE (t), flags);
804 if (flags & TFF_DECL_SPECIFIERS)
805 pp_cxx_declaration (cxx_pp, t);
808 dump_scope (CP_DECL_CONTEXT (t), flags);
809 if (DECL_NAME (t) == NULL_TREE)
810 pp_identifier (cxx_pp, "<unnamed>");
812 pp_tree_identifier (cxx_pp, DECL_NAME (t));
817 dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
818 pp_colon_colon (cxx_pp);
819 dump_decl (TREE_OPERAND (t, 1), flags);
823 dump_decl (TREE_OPERAND (t, 0), flags);
824 pp_left_bracket (cxx_pp);
825 dump_decl (TREE_OPERAND (t, 1), flags);
826 pp_right_bracket (cxx_pp);
829 /* So that we can do dump_decl on an aggr type. */
833 dump_type (t, flags);
837 /* This is a pseudo destructor call which has not been folded into
838 a PSEUDO_DTOR_EXPR yet. */
839 pp_complement (cxx_pp);
840 dump_type (TREE_OPERAND (t, 0), flags);
847 /* These special cases are duplicated here so that other functions
848 can feed identifiers to error and get them demangled properly. */
849 case IDENTIFIER_NODE:
850 if (IDENTIFIER_TYPENAME_P (t))
852 pp_string (cxx_pp, "operator ");
853 /* Not exactly IDENTIFIER_TYPE_VALUE. */
854 dump_type (TREE_TYPE (t), flags);
858 pp_tree_identifier (cxx_pp, t);
865 if (DECL_CLASS_SCOPE_P (t))
867 dump_type (DECL_CONTEXT (t), flags);
868 pp_colon_colon (cxx_pp);
870 else if (DECL_CONTEXT (t))
872 dump_decl (DECL_CONTEXT (t), flags);
873 pp_colon_colon (cxx_pp);
875 dump_decl (DECL_NAME (t), flags);
879 /* If there's only one function, just treat it like an ordinary
885 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
886 dump_global_iord (t);
887 else if (! DECL_LANG_SPECIFIC (t))
888 pp_identifier (cxx_pp, "<internal>");
890 dump_function_decl (t, flags);
894 dump_template_decl (t, flags);
897 case TEMPLATE_ID_EXPR:
899 tree name = TREE_OPERAND (t, 0);
901 if (is_overloaded_fn (name))
902 name = DECL_NAME (get_first_fn (name));
903 dump_decl (name, flags);
904 pp_template_argument_list_start (cxx_pp);
905 if (TREE_OPERAND (t, 1))
906 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
907 pp_template_argument_list_end (cxx_pp);
912 pp_tree_identifier (cxx_pp, DECL_NAME (t));
916 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
917 || (DECL_INITIAL (t) &&
918 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
919 dump_simple_decl (t, TREE_TYPE (t), flags);
920 else if (DECL_NAME (t))
921 dump_decl (DECL_NAME (t), flags);
922 else if (DECL_INITIAL (t))
923 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
925 pp_identifier (cxx_pp, "<enumerator>");
929 pp_string (cxx_pp, "using ");
930 dump_type (DECL_INITIAL (t), flags);
931 pp_colon_colon (cxx_pp);
932 dump_decl (DECL_NAME (t), flags);
936 dump_decl (BASELINK_FUNCTIONS (t), flags);
939 case NON_DEPENDENT_EXPR:
940 dump_expr (t, flags);
944 pp_unsupported_tree (cxx_pp, t);
945 /* Fall through to error. */
948 pp_identifier (cxx_pp, "<declaration error>");
953 /* Dump a template declaration T under control of FLAGS. This means the
954 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
957 dump_template_decl (tree t, int flags)
959 tree orig_parms = DECL_TEMPLATE_PARMS (t);
963 if (flags & TFF_TEMPLATE_HEADER)
965 for (parms = orig_parms = nreverse (orig_parms);
967 parms = TREE_CHAIN (parms))
969 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
970 int len = TREE_VEC_LENGTH (inner_parms);
972 pp_string (cxx_pp, "template<");
974 /* If we've shown the template prefix, we'd better show the
975 parameters' and decl's type too. */
976 flags |= TFF_DECL_SPECIFIERS;
978 for (i = 0; i < len; i++)
981 pp_separate_with_comma (cxx_pp);
982 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
984 pp_template_argument_list_end (cxx_pp);
987 nreverse(orig_parms);
989 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
990 /* Say `template<arg> class TT' not just `template<arg> TT'. */
991 pp_string (cxx_pp, "class ");
994 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
995 dump_type (TREE_TYPE (t),
996 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
997 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
998 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
999 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1000 else if (TREE_TYPE (t) == NULL_TREE)
1003 switch (NEXT_CODE (t))
1007 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1010 /* This case can occur with some invalid code. */
1011 dump_type (TREE_TYPE (t),
1012 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1013 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0));
1017 /* Pretty print a function decl. There are several ways we want to print a
1018 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1019 As error can only apply the '#' flag once to give 0 and 1 for V, there
1020 is %D which doesn't print the throw specs, and %F which does. */
1023 dump_function_decl (tree t, int flags)
1027 tree cname = NULL_TREE;
1028 tree template_args = NULL_TREE;
1029 tree template_parms = NULL_TREE;
1030 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1032 if (TREE_CODE (t) == TEMPLATE_DECL)
1033 t = DECL_TEMPLATE_RESULT (t);
1035 /* Pretty print template instantiations only. */
1036 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1040 template_args = DECL_TI_ARGS (t);
1041 tmpl = most_general_template (t);
1042 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1044 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1049 fntype = TREE_TYPE (t);
1050 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1052 if (DECL_CLASS_SCOPE_P (t))
1053 cname = DECL_CONTEXT (t);
1054 /* This is for partially instantiated template methods. */
1055 else if (TREE_CODE (fntype) == METHOD_TYPE)
1056 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1058 if (!(flags & TFF_DECL_SPECIFIERS))
1060 else if (DECL_STATIC_FUNCTION_P (t))
1061 pp_identifier (cxx_pp, "static ");
1062 else if (DECL_VIRTUAL_P (t))
1063 pp_identifier (cxx_pp, "virtual ");
1065 /* Print the return type? */
1067 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1068 && !DECL_DESTRUCTOR_P (t);
1071 dump_type_prefix (TREE_TYPE (fntype), flags);
1075 /* Print the function name. */
1078 dump_type (cname, flags);
1079 pp_colon_colon (cxx_pp);
1082 dump_scope (CP_DECL_CONTEXT (t), flags);
1084 dump_function_name (t, flags);
1086 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1088 dump_parameters (parmtypes, flags);
1090 if (TREE_CODE (fntype) == METHOD_TYPE)
1091 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
1094 if (flags & TFF_EXCEPTION_SPECIFICATION)
1095 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1098 dump_type_suffix (TREE_TYPE (fntype), flags);
1101 /* If T is a template instantiation, dump the parameter binding. */
1102 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1104 pp_string (cxx_pp, " [with ");
1105 dump_template_bindings (template_parms, template_args);
1106 pp_right_bracket (cxx_pp);
1110 /* Print a parameter list. If this is for a member function, the
1111 member object ptr (and any other hidden args) should have
1112 already been removed. */
1115 dump_parameters (tree parmtypes, int flags)
1119 pp_left_paren (cxx_pp);
1121 for (first = 1; parmtypes != void_list_node;
1122 parmtypes = TREE_CHAIN (parmtypes))
1125 pp_separate_with_comma (cxx_pp);
1129 pp_identifier (cxx_pp, "...");
1132 dump_type (TREE_VALUE (parmtypes), flags);
1134 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1136 pp_string (cxx_pp, " = ");
1137 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1141 pp_right_paren (cxx_pp);
1144 /* Print an exception specification. T is the exception specification. */
1147 dump_exception_spec (tree t, int flags)
1151 pp_string (cxx_pp, " throw (");
1152 if (TREE_VALUE (t) != NULL_TREE)
1155 dump_type (TREE_VALUE (t), flags);
1159 pp_separate_with_comma (cxx_pp);
1161 pp_right_paren (cxx_pp);
1165 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1166 and destructors properly. */
1169 dump_function_name (tree t, int flags)
1171 tree name = DECL_NAME (t);
1173 if (TREE_CODE (t) == TEMPLATE_DECL)
1174 t = DECL_TEMPLATE_RESULT (t);
1176 /* Don't let the user see __comp_ctor et al. */
1177 if (DECL_CONSTRUCTOR_P (t)
1178 || DECL_DESTRUCTOR_P (t))
1179 name = constructor_name (DECL_CONTEXT (t));
1181 if (DECL_DESTRUCTOR_P (t))
1183 pp_complement (cxx_pp);
1184 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1186 else if (DECL_CONV_FN_P (t))
1188 /* This cannot use the hack that the operator's return
1189 type is stashed off of its name because it may be
1190 used for error reporting. In the case of conflicting
1191 declarations, both will have the same name, yet
1192 the types will be different, hence the TREE_TYPE field
1193 of the first name will be clobbered by the second. */
1194 pp_string (cxx_pp, "operator ");
1195 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1197 else if (IDENTIFIER_OPNAME_P (name))
1198 pp_tree_identifier (cxx_pp, name);
1200 dump_decl (name, flags);
1202 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
1203 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1204 && (DECL_TEMPLATE_SPECIALIZATION (t)
1205 || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1206 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t))
1207 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1208 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1211 /* Dump the template parameters from the template info INFO under control of
1212 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1213 specialization (partial or complete). For partial specializations we show
1214 the specialized parameter values. For a primary template we show no
1218 dump_template_parms (tree info, int primary, int flags)
1220 tree args = info ? TI_ARGS (info) : NULL_TREE;
1222 if (primary && flags & TFF_TEMPLATE_NAME)
1224 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1225 pp_template_argument_list_start (cxx_pp);
1227 /* Be careful only to print things when we have them, so as not
1228 to crash producing error messages. */
1229 if (args && !primary)
1233 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
1234 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1236 len = TREE_VEC_LENGTH (args);
1238 for (ix = 0; ix != len; ix++)
1240 tree arg = TREE_VEC_ELT (args, ix);
1243 pp_separate_with_comma (cxx_pp);
1246 pp_identifier (cxx_pp, "<template parameter error>");
1248 dump_template_argument (arg, flags);
1253 tree tpl = TI_TEMPLATE (info);
1254 tree parms = DECL_TEMPLATE_PARMS (tpl);
1257 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1258 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1260 for (ix = 0; ix != len; ix++)
1262 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1265 pp_separate_with_comma (cxx_pp);
1267 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1270 pp_template_argument_list_end (cxx_pp);
1273 /* Print out a list of initializers (subr of dump_expr). */
1276 dump_expr_list (tree l, int flags)
1280 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1283 pp_separate_with_comma (cxx_pp);
1287 /* Print out an expression E under control of FLAGS. */
1290 dump_expr (tree t, int flags)
1295 switch (TREE_CODE (t))
1303 case NAMESPACE_DECL:
1305 case IDENTIFIER_NODE:
1306 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1312 pp_c_constant (pp_c_base (cxx_pp), t);
1316 pp_ampersand (cxx_pp);
1317 dump_type (PTRMEM_CST_CLASS (t), flags);
1318 pp_colon_colon (cxx_pp);
1319 pp_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1323 pp_left_paren (cxx_pp);
1324 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1325 pp_separate_with_comma (cxx_pp);
1326 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1327 pp_right_paren (cxx_pp);
1331 pp_left_paren (cxx_pp);
1332 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1333 pp_string (cxx_pp, " ? ");
1334 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1335 pp_string (cxx_pp, " : ");
1336 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1337 pp_right_paren (cxx_pp);
1341 if (TREE_HAS_CONSTRUCTOR (t))
1343 pp_string (cxx_pp, "new ");
1344 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1347 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1350 case AGGR_INIT_EXPR:
1352 tree fn = NULL_TREE;
1354 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1355 fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1357 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1359 if (DECL_CONSTRUCTOR_P (fn))
1360 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (TREE_TYPE (t)));
1365 dump_expr (TREE_OPERAND (t, 0), 0);
1367 pp_left_paren (cxx_pp);
1368 if (TREE_OPERAND (t, 1))
1369 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1370 pp_right_paren (cxx_pp);
1375 tree fn = TREE_OPERAND (t, 0);
1376 tree args = TREE_OPERAND (t, 1);
1378 if (TREE_CODE (fn) == ADDR_EXPR)
1379 fn = TREE_OPERAND (fn, 0);
1381 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1383 tree ob = TREE_VALUE (args);
1384 if (TREE_CODE (ob) == ADDR_EXPR)
1386 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1389 else if (TREE_CODE (ob) != PARM_DECL
1390 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1392 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1395 args = TREE_CHAIN (args);
1397 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1398 pp_left_paren (cxx_pp);
1399 dump_expr_list (args, flags);
1400 pp_right_paren (cxx_pp);
1406 tree type = TREE_OPERAND (t, 1);
1407 tree init = TREE_OPERAND (t, 2);
1408 if (NEW_EXPR_USE_GLOBAL (t))
1409 pp_colon_colon (cxx_pp);
1410 pp_string (cxx_pp, "new ");
1411 if (TREE_OPERAND (t, 0))
1413 pp_left_paren (cxx_pp);
1414 dump_expr_list (TREE_OPERAND (t, 0), flags);
1415 pp_string (cxx_pp, ") ");
1417 if (TREE_CODE (type) == ARRAY_REF)
1418 type = build_cplus_array_type
1419 (TREE_OPERAND (type, 0),
1420 build_index_type (fold (build (MINUS_EXPR, integer_type_node,
1421 TREE_OPERAND (type, 1),
1422 integer_one_node))));
1423 dump_type (type, flags);
1426 pp_left_paren (cxx_pp);
1427 if (TREE_CODE (init) == TREE_LIST)
1428 dump_expr_list (init, flags);
1429 else if (init == void_zero_node)
1430 /* This representation indicates an empty initializer,
1431 e.g.: "new int()". */
1434 dump_expr (init, flags);
1435 pp_right_paren (cxx_pp);
1441 /* Note that this only works for G++ target exprs. If somebody
1442 builds a general TARGET_EXPR, there's no way to represent that
1443 it initializes anything other that the parameter slot for the
1444 default argument. Note we may have cleared out the first
1445 operand in expand_expr, so don't go killing ourselves. */
1446 if (TREE_OPERAND (t, 1))
1447 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1455 case TRUNC_DIV_EXPR:
1456 case TRUNC_MOD_EXPR:
1464 case TRUTH_ANDIF_EXPR:
1465 case TRUTH_ORIF_EXPR:
1472 case EXACT_DIV_EXPR:
1473 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1477 case FLOOR_DIV_EXPR:
1478 case ROUND_DIV_EXPR:
1479 dump_binary_op ("/", t, flags);
1483 case FLOOR_MOD_EXPR:
1484 case ROUND_MOD_EXPR:
1485 dump_binary_op ("%", t, flags);
1490 tree ob = TREE_OPERAND (t, 0);
1491 if (TREE_CODE (ob) == INDIRECT_REF)
1493 ob = TREE_OPERAND (ob, 0);
1494 if (TREE_CODE (ob) != PARM_DECL
1495 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1497 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1503 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1506 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1511 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1512 pp_left_bracket (cxx_pp);
1513 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1514 pp_right_bracket (cxx_pp);
1518 if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
1520 pp_left_paren (cxx_pp);
1521 dump_type (TREE_TYPE (t), flags);
1522 pp_right_paren (cxx_pp);
1523 dump_expr (TREE_OPERAND (t, 0), flags);
1526 dump_unary_op ("+", t, flags);
1530 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1531 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1532 /* An ADDR_EXPR can have reference type. In that case, we
1533 shouldn't print the `&' doing so indicates to the user
1534 that the expression has pointer type. */
1536 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1537 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1539 dump_unary_op ("&", t, flags);
1543 if (TREE_HAS_CONSTRUCTOR (t))
1545 t = TREE_OPERAND (t, 0);
1546 my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);
1547 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1548 pp_left_paren (cxx_pp);
1549 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1550 pp_right_paren (cxx_pp);
1554 if (TREE_OPERAND (t,0) != NULL_TREE
1555 && TREE_TYPE (TREE_OPERAND (t, 0))
1556 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1557 dump_expr (TREE_OPERAND (t, 0), flags);
1559 dump_unary_op ("*", t, flags);
1565 case TRUTH_NOT_EXPR:
1566 case PREDECREMENT_EXPR:
1567 case PREINCREMENT_EXPR:
1568 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1571 case POSTDECREMENT_EXPR:
1572 case POSTINCREMENT_EXPR:
1573 pp_left_paren (cxx_pp);
1574 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1575 pp_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1576 pp_right_paren (cxx_pp);
1579 case NON_LVALUE_EXPR:
1580 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1581 should be another level of INDIRECT_REF so that I don't have to do
1583 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1585 tree next = TREE_TYPE (TREE_TYPE (t));
1587 while (TREE_CODE (next) == POINTER_TYPE)
1588 next = TREE_TYPE (next);
1590 if (TREE_CODE (next) == FUNCTION_TYPE)
1592 if (flags & TFF_EXPR_IN_PARENS)
1593 pp_left_paren (cxx_pp);
1595 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1596 if (flags & TFF_EXPR_IN_PARENS)
1597 pp_right_paren (cxx_pp);
1600 /* Else fall through. */
1602 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1607 tree op = TREE_OPERAND (t, 0);
1609 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1611 /* It is a cast, but we cannot tell whether it is a
1612 reinterpret or static cast. Use the C style notation. */
1613 if (flags & TFF_EXPR_IN_PARENS)
1614 pp_left_paren (cxx_pp);
1615 pp_left_paren (cxx_pp);
1616 dump_type (TREE_TYPE (t), flags);
1617 pp_right_paren (cxx_pp);
1618 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1619 if (flags & TFF_EXPR_IN_PARENS)
1620 pp_right_paren (cxx_pp);
1623 dump_expr (op, flags);
1627 case EXPR_WITH_FILE_LOCATION:
1628 dump_expr (EXPR_WFL_NODE (t), flags);
1632 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1634 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1636 if (integer_zerop (idx))
1638 /* A NULL pointer-to-member constant. */
1639 pp_left_paren (cxx_pp);
1640 pp_left_paren (cxx_pp);
1641 dump_type (TREE_TYPE (t), flags);
1642 pp_right_paren (cxx_pp);
1643 pp_string (cxx_pp, ")0)");
1646 else if (host_integerp (idx, 0))
1649 unsigned HOST_WIDE_INT n;
1651 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1652 t = TYPE_METHOD_BASETYPE (t);
1653 virtuals = TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t));
1655 n = tree_low_cst (idx, 0);
1657 /* Map vtable index back one, to allow for the null pointer to
1661 while (n > 0 && virtuals)
1664 virtuals = TREE_CHAIN (virtuals);
1668 dump_expr (BV_FN (virtuals),
1669 flags | TFF_EXPR_IN_PARENS);
1674 if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
1676 dump_type (TREE_TYPE (t), 0);
1677 pp_left_paren (cxx_pp);
1678 pp_right_paren (cxx_pp);
1682 pp_left_brace (cxx_pp);
1683 dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
1684 pp_right_brace (cxx_pp);
1691 tree ob = TREE_OPERAND (t, 0);
1692 if (is_dummy_object (ob))
1694 t = TREE_OPERAND (t, 1);
1695 if (TREE_CODE (t) == FUNCTION_DECL)
1697 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1698 else if (BASELINK_P (t))
1699 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1700 flags | TFF_EXPR_IN_PARENS);
1702 dump_decl (t, flags);
1706 if (TREE_CODE (ob) == INDIRECT_REF)
1708 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1709 pp_string (cxx_pp, "->*");
1713 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1714 pp_string (cxx_pp, ".*");
1716 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1721 case TEMPLATE_PARM_INDEX:
1722 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1726 dump_type (TREE_OPERAND (t, 0), flags);
1727 pp_colon_colon (cxx_pp);
1728 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1732 if (TREE_OPERAND (t, 0) == NULL_TREE
1733 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1735 dump_type (TREE_TYPE (t), flags);
1736 pp_left_paren (cxx_pp);
1737 dump_expr_list (TREE_OPERAND (t, 0), flags);
1738 pp_right_paren (cxx_pp);
1742 pp_left_paren (cxx_pp);
1743 dump_type (TREE_TYPE (t), flags);
1744 pp_string (cxx_pp, ")(");
1745 dump_expr_list (TREE_OPERAND (t, 0), flags);
1746 pp_right_paren (cxx_pp);
1750 case STATIC_CAST_EXPR:
1751 pp_string (cxx_pp, "static_cast<");
1753 case REINTERPRET_CAST_EXPR:
1754 pp_string (cxx_pp, "reinterpret_cast<");
1756 case CONST_CAST_EXPR:
1757 pp_string (cxx_pp, "const_cast<");
1759 case DYNAMIC_CAST_EXPR:
1760 pp_string (cxx_pp, "dynamic_cast<");
1762 dump_type (TREE_TYPE (t), flags);
1763 pp_string (cxx_pp, ">(");
1764 dump_expr (TREE_OPERAND (t, 0), flags);
1765 pp_right_paren (cxx_pp);
1769 dump_expr (TREE_OPERAND (t, 0), flags);
1775 if (TREE_CODE (t) == SIZEOF_EXPR)
1776 pp_string (cxx_pp, "sizeof (");
1779 my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
1780 pp_string (cxx_pp, "__alignof__ (");
1782 if (TYPE_P (TREE_OPERAND (t, 0)))
1783 dump_type (TREE_OPERAND (t, 0), flags);
1785 dump_expr (TREE_OPERAND (t, 0), flags);
1786 pp_right_paren (cxx_pp);
1791 pp_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1793 dump_expr (TREE_OPERAND (t, 0), flags);
1797 pp_identifier (cxx_pp, "<unparsed>");
1800 case TRY_CATCH_EXPR:
1801 case WITH_CLEANUP_EXPR:
1802 case CLEANUP_POINT_EXPR:
1803 dump_expr (TREE_OPERAND (t, 0), flags);
1806 case PSEUDO_DTOR_EXPR:
1807 dump_expr (TREE_OPERAND (t, 2), flags);
1809 dump_type (TREE_OPERAND (t, 0), flags);
1810 pp_colon_colon (cxx_pp);
1811 pp_complement (cxx_pp);
1812 dump_type (TREE_OPERAND (t, 1), flags);
1815 case TEMPLATE_ID_EXPR:
1816 dump_decl (t, flags);
1820 /* We don't yet have a way of dumping statements in a
1821 human-readable format. */
1822 pp_string (cxx_pp, "({...})");
1826 pp_left_brace (cxx_pp);
1827 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1828 pp_right_brace (cxx_pp);
1832 pp_string (cxx_pp, "while (1) { ");
1833 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1834 pp_right_brace (cxx_pp);
1838 pp_string (cxx_pp, "if (");
1839 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1840 pp_string (cxx_pp, ") break; ");
1844 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
1847 case EMPTY_CLASS_EXPR:
1848 dump_type (TREE_TYPE (t), flags);
1849 pp_left_paren (cxx_pp);
1850 pp_right_paren (cxx_pp);
1853 case NON_DEPENDENT_EXPR:
1854 dump_expr (TREE_OPERAND (t, 0), flags);
1857 /* This list is incomplete, but should suffice for now.
1858 It is very important that `sorry' does not call
1859 `report_error_function'. That could cause an infinite loop. */
1861 pp_unsupported_tree (cxx_pp, t);
1862 /* fall through to ERROR_MARK... */
1864 pp_identifier (cxx_pp, "<expression error>");
1870 dump_binary_op (const char *opstring, tree t, int flags)
1872 pp_left_paren (cxx_pp);
1873 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1876 pp_identifier (cxx_pp, opstring);
1878 pp_identifier (cxx_pp, "<unknown operator>");
1880 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1881 pp_right_paren (cxx_pp);
1885 dump_unary_op (const char *opstring, tree t, int flags)
1887 if (flags & TFF_EXPR_IN_PARENS)
1888 pp_left_paren (cxx_pp);
1889 pp_identifier (cxx_pp, opstring);
1890 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1891 if (flags & TFF_EXPR_IN_PARENS)
1892 pp_right_paren (cxx_pp);
1895 /* Exported interface to stringifying types, exprs and decls under TFF_*
1899 type_as_string (tree typ, int flags)
1901 pp_clear_output_area (cxx_pp);
1902 dump_type (typ, flags);
1903 return pp_formatted_text (cxx_pp);
1907 expr_as_string (tree decl, int flags)
1909 pp_clear_output_area (cxx_pp);
1910 dump_expr (decl, flags);
1911 return pp_formatted_text (cxx_pp);
1915 decl_as_string (tree decl, int flags)
1917 pp_clear_output_area (cxx_pp);
1918 dump_decl (decl, flags);
1919 return pp_formatted_text (cxx_pp);
1923 context_as_string (tree context, int flags)
1925 pp_clear_output_area (cxx_pp);
1926 dump_scope (context, flags);
1927 return pp_formatted_text (cxx_pp);
1930 /* Generate the three forms of printable names for cxx_printable_name. */
1933 lang_decl_name (tree decl, int v)
1936 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
1938 pp_clear_output_area (cxx_pp);
1939 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
1941 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
1942 pp_colon_colon (cxx_pp);
1945 if (TREE_CODE (decl) == FUNCTION_DECL)
1946 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
1948 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
1950 return pp_formatted_text (cxx_pp);
1954 location_of (tree t)
1956 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
1957 t = DECL_CONTEXT (t);
1958 else if (TYPE_P (t))
1959 t = TYPE_MAIN_DECL (t);
1960 else if (TREE_CODE (t) == OVERLOAD)
1961 t = OVL_FUNCTION (t);
1963 return DECL_SOURCE_LOCATION (t);
1966 /* Now the interfaces from error et al to dump_type et al. Each takes an
1967 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
1971 decl_to_string (tree decl, int verbose)
1975 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
1976 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
1977 flags = TFF_CLASS_KEY_OR_ENUM;
1979 flags |= TFF_DECL_SPECIFIERS;
1980 else if (TREE_CODE (decl) == FUNCTION_DECL)
1981 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
1982 flags |= TFF_TEMPLATE_HEADER;
1984 pp_clear_output_area (cxx_pp);
1985 dump_decl (decl, flags);
1986 return pp_formatted_text (cxx_pp);
1990 expr_to_string (tree decl)
1992 pp_clear_output_area (cxx_pp);
1993 dump_expr (decl, 0);
1994 return pp_formatted_text (cxx_pp);
1998 fndecl_to_string (tree fndecl, int verbose)
2002 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
2004 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2005 pp_clear_output_area (cxx_pp);
2006 dump_decl (fndecl, flags);
2007 return pp_formatted_text (cxx_pp);
2012 code_to_string (enum tree_code c)
2014 return tree_code_name [c];
2018 language_to_string (enum languages c)
2025 case lang_cplusplus:
2037 /* Return the proper printed version of a parameter to a C++ function. */
2040 parm_to_string (int p)
2042 pp_clear_output_area (cxx_pp);
2044 pp_string (cxx_pp, "'this'");
2046 pp_decimal_int (cxx_pp, p + 1);
2047 return pp_formatted_text (cxx_pp);
2051 op_to_string (enum tree_code p)
2053 tree id = operator_name_info[(int) p].identifier;
2054 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2058 type_to_string (tree typ, int verbose)
2062 flags |= TFF_CLASS_KEY_OR_ENUM;
2063 flags |= TFF_TEMPLATE_HEADER;
2065 pp_clear_output_area (cxx_pp);
2066 dump_type (typ, flags);
2067 return pp_formatted_text (cxx_pp);
2071 assop_to_string (enum tree_code p)
2073 tree id = assignment_operator_name_info[(int) p].identifier;
2074 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2078 args_to_string (tree p, int verbose)
2082 flags |= TFF_CLASS_KEY_OR_ENUM;
2087 if (TYPE_P (TREE_VALUE (p)))
2088 return type_as_string (p, flags);
2090 pp_clear_output_area (cxx_pp);
2091 for (; p; p = TREE_CHAIN (p))
2093 if (TREE_VALUE (p) == null_node)
2094 pp_identifier (cxx_pp, "NULL");
2096 dump_type (error_type (TREE_VALUE (p)), flags);
2098 pp_separate_with_comma (cxx_pp);
2100 return pp_formatted_text (cxx_pp);
2104 cv_to_string (tree p, int v)
2106 pp_clear_output_area (cxx_pp);
2107 dump_qualifiers (p, v ? before : none);
2108 return pp_formatted_text (cxx_pp);
2111 /* Langhook for print_error_function. */
2113 cxx_print_error_function (diagnostic_context *context, const char *file)
2115 lhd_print_error_function (context, file);
2116 pp_base_set_prefix (context->printer, file);
2117 maybe_print_instantiation_context (context);
2121 cp_diagnostic_starter (diagnostic_context *context,
2122 diagnostic_info *diagnostic)
2124 diagnostic_report_current_module (context);
2125 cp_print_error_function (context, diagnostic);
2126 maybe_print_instantiation_context (context);
2127 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2131 cp_diagnostic_finalizer (diagnostic_context *context,
2132 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2134 pp_base_destroy_prefix (context->printer);
2137 /* Print current function onto BUFFER, in the process of reporting
2138 a diagnostic message. Called from cp_diagnostic_starter. */
2140 cp_print_error_function (diagnostic_context *context,
2141 diagnostic_info *diagnostic)
2143 if (diagnostic_last_function_changed (context))
2145 const char *old_prefix = context->printer->prefix;
2146 char *new_prefix = diagnostic->location.file
2147 ? file_name_as_prefix (diagnostic->location.file)
2150 pp_base_set_prefix (context->printer, new_prefix);
2152 if (current_function_decl == NULL)
2153 pp_base_string (context->printer, "At global scope:");
2155 pp_printf (context->printer, "In %s `%s':",
2156 function_category (current_function_decl),
2157 cxx_printable_name (current_function_decl, 2));
2158 pp_base_newline (context->printer);
2160 diagnostic_set_last_function (context);
2161 pp_base_destroy_prefix (context->printer);
2162 context->printer->prefix = old_prefix;
2166 /* Returns a description of FUNCTION using standard terminology. */
2168 function_category (tree fn)
2170 if (DECL_FUNCTION_MEMBER_P (fn))
2172 if (DECL_STATIC_FUNCTION_P (fn))
2173 return "static member function";
2174 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2175 return "copy constructor";
2176 else if (DECL_CONSTRUCTOR_P (fn))
2177 return "constructor";
2178 else if (DECL_DESTRUCTOR_P (fn))
2179 return "destructor";
2181 return "member function";
2187 /* Report the full context of a current template instantiation,
2190 print_instantiation_full_context (diagnostic_context *context)
2192 tree p = current_instantiation ();
2193 location_t location = input_location;
2197 if (current_function_decl != TINST_DECL (p)
2198 && current_function_decl != NULL_TREE)
2199 /* We can get here during the processing of some synthesized
2200 method. Then, TINST_DECL (p) will be the function that's causing
2205 if (current_function_decl == TINST_DECL (p))
2206 /* Avoid redundancy with the the "In function" line. */;
2208 pp_verbatim (context->printer,
2209 "%s: In instantiation of `%s':\n", location.file,
2210 decl_as_string (TINST_DECL (p),
2211 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2213 location.line = TINST_LINE (p);
2214 location.file = TINST_FILE (p);
2219 print_instantiation_partial_context (context, p, location);
2222 /* Same as above but less verbose. */
2224 print_instantiation_partial_context (diagnostic_context *context,
2225 tree t, location_t loc)
2227 for (; t; t = TREE_CHAIN (t))
2229 pp_verbatim (context->printer, "%s:%d: instantiated from `%s'\n",
2231 decl_as_string (TINST_DECL (t),
2232 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2233 loc.line = TINST_LINE (t);
2234 loc.file = TINST_FILE (t);
2236 pp_verbatim (context->printer, "%s:%d: instantiated from here\n",
2237 loc.file, loc.line);
2240 /* Called from cp_thing to print the template context for an error. */
2242 maybe_print_instantiation_context (diagnostic_context *context)
2244 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2247 record_last_problematic_instantiation ();
2248 print_instantiation_full_context (context);
2251 /* Report the bare minimum context of a template instantiation. */
2253 print_instantiation_context (void)
2255 print_instantiation_partial_context
2256 (global_dc, current_instantiation (), input_location);
2257 diagnostic_flush_buffer (global_dc);
2260 /* Called from output_format -- during diagnostic message processing --
2261 to handle C++ specific format specifier with the following meanings:
2262 %A function argument-list.
2266 %F function declaration.
2267 %L language as used in extern "lang".
2269 %P function parameter whose position is indicated by an integer.
2270 %Q assignment operator.
2274 cp_printer (pretty_printer *pp, text_info *text)
2278 #define next_tree va_arg (*text->args_ptr, tree)
2279 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2280 #define next_lang va_arg (*text->args_ptr, enum languages)
2281 #define next_int va_arg (*text->args_ptr, int)
2283 if (*text->format_spec == '+')
2284 ++text->format_spec;
2285 if (*text->format_spec == '#')
2288 ++text->format_spec;
2291 switch (*text->format_spec)
2293 case 'A': result = args_to_string (next_tree, verbose); break;
2294 case 'C': result = code_to_string (next_tcode); break;
2295 case 'D': result = decl_to_string (next_tree, verbose); break;
2296 case 'E': result = expr_to_string (next_tree); break;
2297 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2298 case 'L': result = language_to_string (next_lang); break;
2299 case 'O': result = op_to_string (next_tcode); break;
2300 case 'P': result = parm_to_string (next_int); break;
2301 case 'Q': result = assop_to_string (next_tcode); break;
2302 case 'T': result = type_to_string (next_tree, verbose); break;
2303 case 'V': result = cv_to_string (next_tree, verbose); break;
2309 pp_base_string (pp, result);
2318 pp_non_consecutive_character (cxx_pretty_printer *pp, int c)
2320 const char *p = pp_last_position_in_text (pp);
2322 if (p != NULL && *p == c)
2324 pp_character (pp, c);
2327 /* These are temporary wrapper functions which handle the historic
2328 behavior of cp_*_at. */
2331 locate_error (const char *msgid, va_list ap)
2337 for (f = msgid; *f; f++)
2350 /* Just ignore these possibilities. */
2353 case 'd': (void) va_arg (ap, int); break;
2354 case 's': (void) va_arg (ap, char *); break;
2355 case 'L': (void) va_arg (ap, enum languages); break;
2358 case 'Q': (void) va_arg (ap, enum tree_code); break;
2360 /* These take a tree, which may be where the error is
2368 t = va_arg (ap, tree);
2374 errorcount = 0; /* damn ICE suppression */
2375 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2381 here = va_arg (ap, tree);
2388 cp_error_at (const char *msgid, ...)
2391 diagnostic_info diagnostic;
2394 va_start (ap, msgid);
2395 here = locate_error (msgid, ap);
2398 va_start (ap, msgid);
2399 diagnostic_set_info (&diagnostic, msgid, &ap,
2400 location_of (here), DK_ERROR);
2401 report_diagnostic (&diagnostic);
2406 cp_warning_at (const char *msgid, ...)
2409 diagnostic_info diagnostic;
2412 va_start (ap, msgid);
2413 here = locate_error (msgid, ap);
2416 va_start (ap, msgid);
2417 diagnostic_set_info (&diagnostic, msgid, &ap,
2418 location_of (here), DK_WARNING);
2419 report_diagnostic (&diagnostic);
2424 cp_pedwarn_at (const char *msgid, ...)
2427 diagnostic_info diagnostic;
2430 va_start (ap, msgid);
2431 here = locate_error (msgid, ap);
2434 va_start (ap, msgid);
2435 diagnostic_set_info (&diagnostic, msgid, &ap,
2436 location_of (here), pedantic_error_kind());
2437 report_diagnostic (&diagnostic);