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 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. */
794 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
798 pp_string (cxx_pp
, "<return value> ");
799 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
803 if (flags
& TFF_DECL_SPECIFIERS
)
804 pp_cxx_declaration (cxx_pp
, t
);
807 dump_scope (CP_DECL_CONTEXT (t
), flags
);
808 if (DECL_NAME (t
) == NULL_TREE
)
809 pp_identifier (cxx_pp
, "<unnamed>");
811 pp_tree_identifier (cxx_pp
, DECL_NAME (t
));
816 dump_decl (TREE_OPERAND (t
, 0), flags
& ~TFF_DECL_SPECIFIERS
);
817 pp_colon_colon (cxx_pp
);
818 dump_decl (TREE_OPERAND (t
, 1), flags
);
822 dump_decl (TREE_OPERAND (t
, 0), flags
);
823 pp_left_bracket (cxx_pp
);
824 dump_decl (TREE_OPERAND (t
, 1), flags
);
825 pp_right_bracket (cxx_pp
);
828 /* So that we can do dump_decl on an aggr type. */
832 dump_type (t
, flags
);
836 /* This is a pseudo destructor call which has not been folded into
837 a PSEUDO_DTOR_EXPR yet. */
838 pp_complement (cxx_pp
);
839 dump_type (TREE_OPERAND (t
, 0), flags
);
846 /* These special cases are duplicated here so that other functions
847 can feed identifiers to error and get them demangled properly. */
848 case IDENTIFIER_NODE
:
849 if (IDENTIFIER_TYPENAME_P (t
))
851 pp_string (cxx_pp
, "operator ");
852 /* Not exactly IDENTIFIER_TYPE_VALUE. */
853 dump_type (TREE_TYPE (t
), flags
);
857 pp_tree_identifier (cxx_pp
, t
);
864 if (DECL_CLASS_SCOPE_P (t
))
866 dump_type (DECL_CONTEXT (t
), flags
);
867 pp_colon_colon (cxx_pp
);
869 else if (DECL_CONTEXT (t
))
871 dump_decl (DECL_CONTEXT (t
), flags
);
872 pp_colon_colon (cxx_pp
);
874 dump_decl (DECL_NAME (t
), flags
);
878 /* If there's only one function, just treat it like an ordinary
884 if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
885 dump_global_iord (t
);
886 else if (! DECL_LANG_SPECIFIC (t
))
887 pp_identifier (cxx_pp
, "<internal>");
889 dump_function_decl (t
, flags
);
893 dump_template_decl (t
, flags
);
896 case TEMPLATE_ID_EXPR
:
898 tree name
= TREE_OPERAND (t
, 0);
900 if (is_overloaded_fn (name
))
901 name
= DECL_NAME (get_first_fn (name
));
902 dump_decl (name
, flags
);
903 pp_template_argument_list_start (cxx_pp
);
904 if (TREE_OPERAND (t
, 1))
905 dump_template_argument_list (TREE_OPERAND (t
, 1), flags
);
906 pp_template_argument_list_end (cxx_pp
);
911 pp_tree_identifier (cxx_pp
, DECL_NAME (t
));
915 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
916 || (DECL_INITIAL (t
) &&
917 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
918 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
919 else if (DECL_NAME (t
))
920 dump_decl (DECL_NAME (t
), flags
);
921 else if (DECL_INITIAL (t
))
922 dump_expr (DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
924 pp_identifier (cxx_pp
, "<enumerator>");
928 pp_string (cxx_pp
, "using ");
929 dump_type (DECL_INITIAL (t
), flags
);
930 pp_colon_colon (cxx_pp
);
931 dump_decl (DECL_NAME (t
), flags
);
935 dump_decl (BASELINK_FUNCTIONS (t
), flags
);
938 case NON_DEPENDENT_EXPR
:
939 dump_expr (t
, flags
);
943 pp_unsupported_tree (cxx_pp
, t
);
944 /* Fallthrough to error. */
947 pp_identifier (cxx_pp
, "<declaration error>");
952 /* Dump a template declaration T under control of FLAGS. This means the
953 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
956 dump_template_decl (tree t
, int flags
)
958 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
962 if (flags
& TFF_TEMPLATE_HEADER
)
964 for (parms
= orig_parms
= nreverse (orig_parms
);
966 parms
= TREE_CHAIN (parms
))
968 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
969 int len
= TREE_VEC_LENGTH (inner_parms
);
971 pp_string (cxx_pp
, "template<");
973 /* If we've shown the template prefix, we'd better show the
974 parameters' and decl's type too. */
975 flags
|= TFF_DECL_SPECIFIERS
;
977 for (i
= 0; i
< len
; i
++)
980 pp_separate_with_comma (cxx_pp
);
981 dump_template_parameter (TREE_VEC_ELT (inner_parms
, i
), flags
);
983 pp_template_argument_list_end (cxx_pp
);
986 nreverse(orig_parms
);
988 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
989 /* Say `template<arg> class TT' not just `template<arg> TT'. */
990 pp_string (cxx_pp
, "class ");
993 if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == TYPE_DECL
)
994 dump_type (TREE_TYPE (t
),
995 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
996 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
997 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == VAR_DECL
)
998 dump_decl (DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
999 else if (TREE_TYPE (t
) == NULL_TREE
)
1002 switch (NEXT_CODE (t
))
1006 dump_function_decl (t
, flags
| TFF_TEMPLATE_NAME
);
1009 /* This case can occur with some invalid code. */
1010 dump_type (TREE_TYPE (t
),
1011 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1012 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0));
1016 /* Pretty print a function decl. There are several ways we want to print a
1017 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1018 As error can only apply the '#' flag once to give 0 and 1 for V, there
1019 is %D which doesn't print the throw specs, and %F which does. */
1022 dump_function_decl (tree t
, int flags
)
1026 tree cname
= NULL_TREE
;
1027 tree template_args
= NULL_TREE
;
1028 tree template_parms
= NULL_TREE
;
1029 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1031 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1032 t
= DECL_TEMPLATE_RESULT (t
);
1034 /* Pretty print template instantiations only. */
1035 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
))
1039 template_args
= DECL_TI_ARGS (t
);
1040 tmpl
= most_general_template (t
);
1041 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1043 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1048 fntype
= TREE_TYPE (t
);
1049 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1051 if (DECL_CLASS_SCOPE_P (t
))
1052 cname
= DECL_CONTEXT (t
);
1053 /* This is for partially instantiated template methods. */
1054 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1055 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1057 if (!(flags
& TFF_DECL_SPECIFIERS
))
1059 else if (DECL_STATIC_FUNCTION_P (t
))
1060 pp_identifier (cxx_pp
, "static ");
1061 else if (DECL_VIRTUAL_P (t
))
1062 pp_identifier (cxx_pp
, "virtual ");
1064 /* Print the return type? */
1066 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1067 && !DECL_DESTRUCTOR_P (t
);
1070 dump_type_prefix (TREE_TYPE (fntype
), flags
);
1074 /* Print the function name. */
1077 dump_type (cname
, flags
);
1078 pp_colon_colon (cxx_pp
);
1081 dump_scope (CP_DECL_CONTEXT (t
), flags
);
1083 dump_function_name (t
, flags
);
1085 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1087 dump_parameters (parmtypes
, flags
);
1089 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1090 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype
))),
1093 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1094 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype
), flags
);
1097 dump_type_suffix (TREE_TYPE (fntype
), flags
);
1100 /* If T is a template instantiation, dump the parameter binding. */
1101 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
)
1103 pp_string (cxx_pp
, " [with ");
1104 dump_template_bindings (template_parms
, template_args
);
1105 pp_right_bracket (cxx_pp
);
1109 /* Print a parameter list. If this is for a member function, the
1110 member object ptr (and any other hidden args) should have
1111 already been removed. */
1114 dump_parameters (tree parmtypes
, int flags
)
1118 pp_left_paren (cxx_pp
);
1120 for (first
= 1; parmtypes
!= void_list_node
;
1121 parmtypes
= TREE_CHAIN (parmtypes
))
1124 pp_separate_with_comma (cxx_pp
);
1128 pp_identifier (cxx_pp
, "...");
1131 dump_type (TREE_VALUE (parmtypes
), flags
);
1133 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1135 pp_string (cxx_pp
, " = ");
1136 dump_expr (TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1140 pp_right_paren (cxx_pp
);
1143 /* Print an exception specification. T is the exception specification. */
1146 dump_exception_spec (tree t
, int flags
)
1150 pp_string (cxx_pp
, " throw (");
1151 if (TREE_VALUE (t
) != NULL_TREE
)
1154 dump_type (TREE_VALUE (t
), flags
);
1158 pp_separate_with_comma (cxx_pp
);
1160 pp_right_paren (cxx_pp
);
1164 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1165 and destructors properly. */
1168 dump_function_name (tree t
, int flags
)
1170 tree name
= DECL_NAME (t
);
1172 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1173 t
= DECL_TEMPLATE_RESULT (t
);
1175 /* Don't let the user see __comp_ctor et al. */
1176 if (DECL_CONSTRUCTOR_P (t
)
1177 || DECL_DESTRUCTOR_P (t
))
1178 name
= constructor_name (DECL_CONTEXT (t
));
1180 if (DECL_DESTRUCTOR_P (t
))
1182 pp_complement (cxx_pp
);
1183 dump_decl (name
, TFF_PLAIN_IDENTIFIER
);
1185 else if (DECL_CONV_FN_P (t
))
1187 /* This cannot use the hack that the operator's return
1188 type is stashed off of its name because it may be
1189 used for error reporting. In the case of conflicting
1190 declarations, both will have the same name, yet
1191 the types will be different, hence the TREE_TYPE field
1192 of the first name will be clobbered by the second. */
1193 pp_string (cxx_pp
, "operator ");
1194 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1196 else if (IDENTIFIER_OPNAME_P (name
))
1197 pp_tree_identifier (cxx_pp
, name
);
1199 dump_decl (name
, flags
);
1201 if (DECL_LANG_SPECIFIC (t
) && DECL_TEMPLATE_INFO (t
)
1202 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1203 && (DECL_TEMPLATE_SPECIALIZATION (t
)
1204 || TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1205 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t
))
1206 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1207 dump_template_parms (DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
), flags
);
1210 /* Dump the template parameters from the template info INFO under control of
1211 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1212 specialization (partial or complete). For partial specializations we show
1213 the specialized parameter values. For a primary template we show no
1217 dump_template_parms (tree info
, int primary
, int flags
)
1219 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1221 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1223 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1224 pp_template_argument_list_start (cxx_pp
);
1226 /* Be careful only to print things when we have them, so as not
1227 to crash producing error messages. */
1228 if (args
&& !primary
)
1232 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args
))
1233 args
= TREE_VEC_ELT (args
, TREE_VEC_LENGTH (args
) - 1);
1235 len
= TREE_VEC_LENGTH (args
);
1237 for (ix
= 0; ix
!= len
; ix
++)
1239 tree arg
= TREE_VEC_ELT (args
, ix
);
1242 pp_separate_with_comma (cxx_pp
);
1245 pp_identifier (cxx_pp
, "<template parameter error>");
1247 dump_template_argument (arg
, flags
);
1252 tree tpl
= TI_TEMPLATE (info
);
1253 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1256 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1257 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1259 for (ix
= 0; ix
!= len
; ix
++)
1261 tree parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1264 pp_separate_with_comma (cxx_pp
);
1266 dump_decl (parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1269 pp_template_argument_list_end (cxx_pp
);
1272 /* Print out a list of initializers (subr of dump_expr). */
1275 dump_expr_list (tree l
, int flags
)
1279 dump_expr (TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1282 pp_separate_with_comma (cxx_pp
);
1286 /* Print out an expression E under control of FLAGS. */
1289 dump_expr (tree t
, int flags
)
1294 switch (TREE_CODE (t
))
1302 case NAMESPACE_DECL
:
1304 case IDENTIFIER_NODE
:
1305 dump_decl (t
, (flags
& ~TFF_DECL_SPECIFIERS
) | TFF_NO_FUNCTION_ARGUMENTS
);
1311 pp_c_constant (pp_c_base (cxx_pp
), t
);
1315 pp_ampersand (cxx_pp
);
1316 dump_type (PTRMEM_CST_CLASS (t
), flags
);
1317 pp_colon_colon (cxx_pp
);
1318 pp_tree_identifier (cxx_pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1322 pp_left_paren (cxx_pp
);
1323 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1324 pp_separate_with_comma (cxx_pp
);
1325 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1326 pp_right_paren (cxx_pp
);
1330 pp_left_paren (cxx_pp
);
1331 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1332 pp_string (cxx_pp
, " ? ");
1333 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1334 pp_string (cxx_pp
, " : ");
1335 dump_expr (TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
1336 pp_right_paren (cxx_pp
);
1340 if (TREE_HAS_CONSTRUCTOR (t
))
1342 pp_string (cxx_pp
, "new ");
1343 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1346 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1349 case AGGR_INIT_EXPR
:
1351 tree fn
= NULL_TREE
;
1353 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
)
1354 fn
= TREE_OPERAND (TREE_OPERAND (t
, 0), 0);
1356 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
1358 if (DECL_CONSTRUCTOR_P (fn
))
1359 pp_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (TREE_TYPE (t
)));
1364 dump_expr (TREE_OPERAND (t
, 0), 0);
1366 pp_left_paren (cxx_pp
);
1367 if (TREE_OPERAND (t
, 1))
1368 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t
, 1)), flags
);
1369 pp_right_paren (cxx_pp
);
1374 tree fn
= TREE_OPERAND (t
, 0);
1375 tree args
= TREE_OPERAND (t
, 1);
1377 if (TREE_CODE (fn
) == ADDR_EXPR
)
1378 fn
= TREE_OPERAND (fn
, 0);
1380 if (TREE_TYPE (fn
) != NULL_TREE
&& NEXT_CODE (fn
) == METHOD_TYPE
)
1382 tree ob
= TREE_VALUE (args
);
1383 if (TREE_CODE (ob
) == ADDR_EXPR
)
1385 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1388 else if (TREE_CODE (ob
) != PARM_DECL
1389 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1391 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1394 args
= TREE_CHAIN (args
);
1396 dump_expr (fn
, flags
| TFF_EXPR_IN_PARENS
);
1397 pp_left_paren (cxx_pp
);
1398 dump_expr_list (args
, flags
);
1399 pp_right_paren (cxx_pp
);
1405 tree type
= TREE_OPERAND (t
, 1);
1406 tree init
= TREE_OPERAND (t
, 2);
1407 if (NEW_EXPR_USE_GLOBAL (t
))
1408 pp_colon_colon (cxx_pp
);
1409 pp_string (cxx_pp
, "new ");
1410 if (TREE_OPERAND (t
, 0))
1412 pp_left_paren (cxx_pp
);
1413 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1414 pp_string (cxx_pp
, ") ");
1416 if (TREE_CODE (type
) == ARRAY_REF
)
1417 type
= build_cplus_array_type
1418 (TREE_OPERAND (type
, 0),
1419 build_index_type (fold (build (MINUS_EXPR
, integer_type_node
,
1420 TREE_OPERAND (type
, 1),
1421 integer_one_node
))));
1422 dump_type (type
, flags
);
1425 pp_left_paren (cxx_pp
);
1426 if (TREE_CODE (init
) == TREE_LIST
)
1427 dump_expr_list (init
, flags
);
1428 else if (init
== void_zero_node
)
1429 /* This representation indicates an empty initializer,
1430 e.g.: "new int()". */
1433 dump_expr (init
, flags
);
1434 pp_right_paren (cxx_pp
);
1440 /* Note that this only works for G++ target exprs. If somebody
1441 builds a general TARGET_EXPR, there's no way to represent that
1442 it initializes anything other that the parameter slot for the
1443 default argument. Note we may have cleared out the first
1444 operand in expand_expr, so don't go killing ourselves. */
1445 if (TREE_OPERAND (t
, 1))
1446 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1454 case TRUNC_DIV_EXPR
:
1455 case TRUNC_MOD_EXPR
:
1463 case TRUTH_ANDIF_EXPR
:
1464 case TRUTH_ORIF_EXPR
:
1471 case EXACT_DIV_EXPR
:
1472 dump_binary_op (operator_name_info
[(int) TREE_CODE (t
)].name
, t
, flags
);
1476 case FLOOR_DIV_EXPR
:
1477 case ROUND_DIV_EXPR
:
1478 dump_binary_op ("/", t
, flags
);
1482 case FLOOR_MOD_EXPR
:
1483 case ROUND_MOD_EXPR
:
1484 dump_binary_op ("%", t
, flags
);
1489 tree ob
= TREE_OPERAND (t
, 0);
1490 if (TREE_CODE (ob
) == INDIRECT_REF
)
1492 ob
= TREE_OPERAND (ob
, 0);
1493 if (TREE_CODE (ob
) != PARM_DECL
1494 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1496 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1502 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1505 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
1510 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1511 pp_left_bracket (cxx_pp
);
1512 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1513 pp_right_bracket (cxx_pp
);
1517 if (TREE_TYPE (t
) && VOID_TYPE_P (TREE_TYPE (t
)))
1519 pp_left_paren (cxx_pp
);
1520 dump_type (TREE_TYPE (t
), flags
);
1521 pp_right_paren (cxx_pp
);
1522 dump_expr (TREE_OPERAND (t
, 0), flags
);
1525 dump_unary_op ("+", t
, flags
);
1529 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
1530 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
1531 /* An ADDR_EXPR can have reference type. In that case, we
1532 shouldn't print the `&' doing so indicates to the user
1533 that the expression has pointer type. */
1535 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
1536 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1538 dump_unary_op ("&", t
, flags
);
1542 if (TREE_HAS_CONSTRUCTOR (t
))
1544 t
= TREE_OPERAND (t
, 0);
1545 my_friendly_assert (TREE_CODE (t
) == CALL_EXPR
, 237);
1546 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1547 pp_left_paren (cxx_pp
);
1548 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t
, 1)), flags
);
1549 pp_right_paren (cxx_pp
);
1553 if (TREE_OPERAND (t
,0) != NULL_TREE
1554 && TREE_TYPE (TREE_OPERAND (t
, 0))
1555 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
1556 dump_expr (TREE_OPERAND (t
, 0), flags
);
1558 dump_unary_op ("*", t
, flags
);
1564 case TRUTH_NOT_EXPR
:
1565 case PREDECREMENT_EXPR
:
1566 case PREINCREMENT_EXPR
:
1567 dump_unary_op (operator_name_info
[(int)TREE_CODE (t
)].name
, t
, flags
);
1570 case POSTDECREMENT_EXPR
:
1571 case POSTINCREMENT_EXPR
:
1572 pp_left_paren (cxx_pp
);
1573 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1574 pp_identifier (cxx_pp
, operator_name_info
[(int)TREE_CODE (t
)].name
);
1575 pp_right_paren (cxx_pp
);
1578 case NON_LVALUE_EXPR
:
1579 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1580 should be another level of INDIRECT_REF so that I don't have to do
1582 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
1584 tree next
= TREE_TYPE (TREE_TYPE (t
));
1586 while (TREE_CODE (next
) == POINTER_TYPE
)
1587 next
= TREE_TYPE (next
);
1589 if (TREE_CODE (next
) == FUNCTION_TYPE
)
1591 if (flags
& TFF_EXPR_IN_PARENS
)
1592 pp_left_paren (cxx_pp
);
1594 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1595 if (flags
& TFF_EXPR_IN_PARENS
)
1596 pp_right_paren (cxx_pp
);
1599 /* Else fall through. */
1601 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1606 tree op
= TREE_OPERAND (t
, 0);
1608 if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
1610 /* It is a cast, but we cannot tell whether it is a
1611 reinterpret or static cast. Use the C style notation. */
1612 if (flags
& TFF_EXPR_IN_PARENS
)
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 dump_expr (op
, flags
| TFF_EXPR_IN_PARENS
);
1618 if (flags
& TFF_EXPR_IN_PARENS
)
1619 pp_right_paren (cxx_pp
);
1622 dump_expr (op
, flags
);
1626 case EXPR_WITH_FILE_LOCATION
:
1627 dump_expr (EXPR_WFL_NODE (t
), flags
);
1631 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
1633 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
1635 if (integer_zerop (idx
))
1637 /* A NULL pointer-to-member constant. */
1638 pp_left_paren (cxx_pp
);
1639 pp_left_paren (cxx_pp
);
1640 dump_type (TREE_TYPE (t
), flags
);
1641 pp_right_paren (cxx_pp
);
1642 pp_string (cxx_pp
, ")0)");
1645 else if (host_integerp (idx
, 0))
1648 unsigned HOST_WIDE_INT n
;
1650 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
1651 t
= TYPE_METHOD_BASETYPE (t
);
1652 virtuals
= TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t
));
1654 n
= tree_low_cst (idx
, 0);
1656 /* Map vtable index back one, to allow for the null pointer to
1660 while (n
> 0 && virtuals
)
1663 virtuals
= TREE_CHAIN (virtuals
);
1667 dump_expr (BV_FN (virtuals
),
1668 flags
| TFF_EXPR_IN_PARENS
);
1673 if (TREE_TYPE (t
) && !CONSTRUCTOR_ELTS (t
))
1675 dump_type (TREE_TYPE (t
), 0);
1676 pp_left_paren (cxx_pp
);
1677 pp_right_paren (cxx_pp
);
1681 pp_left_brace (cxx_pp
);
1682 dump_expr_list (CONSTRUCTOR_ELTS (t
), flags
);
1683 pp_right_brace (cxx_pp
);
1690 tree ob
= TREE_OPERAND (t
, 0);
1691 if (is_dummy_object (ob
))
1693 t
= TREE_OPERAND (t
, 1);
1694 if (TREE_CODE (t
) == FUNCTION_DECL
)
1696 dump_expr (t
, flags
| TFF_EXPR_IN_PARENS
);
1697 else if (BASELINK_P (t
))
1698 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
1699 flags
| TFF_EXPR_IN_PARENS
);
1701 dump_decl (t
, flags
);
1705 if (TREE_CODE (ob
) == INDIRECT_REF
)
1707 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1708 pp_string (cxx_pp
, "->*");
1712 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1713 pp_string (cxx_pp
, ".*");
1715 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1720 case TEMPLATE_PARM_INDEX
:
1721 dump_decl (TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
1725 dump_type (TREE_OPERAND (t
, 0), flags
);
1726 pp_colon_colon (cxx_pp
);
1727 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1731 if (TREE_OPERAND (t
, 0) == NULL_TREE
1732 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
1734 dump_type (TREE_TYPE (t
), flags
);
1735 pp_left_paren (cxx_pp
);
1736 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1737 pp_right_paren (cxx_pp
);
1741 pp_left_paren (cxx_pp
);
1742 dump_type (TREE_TYPE (t
), flags
);
1743 pp_string (cxx_pp
, ")(");
1744 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1745 pp_right_paren (cxx_pp
);
1749 case STATIC_CAST_EXPR
:
1750 pp_string (cxx_pp
, "static_cast<");
1752 case REINTERPRET_CAST_EXPR
:
1753 pp_string (cxx_pp
, "reinterpret_cast<");
1755 case CONST_CAST_EXPR
:
1756 pp_string (cxx_pp
, "const_cast<");
1758 case DYNAMIC_CAST_EXPR
:
1759 pp_string (cxx_pp
, "dynamic_cast<");
1761 dump_type (TREE_TYPE (t
), flags
);
1762 pp_string (cxx_pp
, ">(");
1763 dump_expr (TREE_OPERAND (t
, 0), flags
);
1764 pp_right_paren (cxx_pp
);
1768 dump_expr (TREE_OPERAND (t
, 0), flags
);
1774 if (TREE_CODE (t
) == SIZEOF_EXPR
)
1775 pp_string (cxx_pp
, "sizeof (");
1778 my_friendly_assert (TREE_CODE (t
) == ALIGNOF_EXPR
, 0);
1779 pp_string (cxx_pp
, "__alignof__ (");
1781 if (TYPE_P (TREE_OPERAND (t
, 0)))
1782 dump_type (TREE_OPERAND (t
, 0), flags
);
1784 dump_expr (TREE_OPERAND (t
, 0), flags
);
1785 pp_right_paren (cxx_pp
);
1790 pp_identifier (cxx_pp
, operator_name_info
[TREE_CODE (t
)].name
);
1792 dump_expr (TREE_OPERAND (t
, 0), flags
);
1796 pp_identifier (cxx_pp
, "<unparsed>");
1799 case TRY_CATCH_EXPR
:
1800 case WITH_CLEANUP_EXPR
:
1801 case CLEANUP_POINT_EXPR
:
1802 dump_expr (TREE_OPERAND (t
, 0), flags
);
1805 case PSEUDO_DTOR_EXPR
:
1806 dump_expr (TREE_OPERAND (t
, 2), flags
);
1808 dump_type (TREE_OPERAND (t
, 0), flags
);
1809 pp_colon_colon (cxx_pp
);
1810 pp_complement (cxx_pp
);
1811 dump_type (TREE_OPERAND (t
, 1), flags
);
1814 case TEMPLATE_ID_EXPR
:
1815 dump_decl (t
, flags
);
1819 /* We don't yet have a way of dumping statements in a
1820 human-readable format. */
1821 pp_string (cxx_pp
, "({...})");
1825 pp_left_brace (cxx_pp
);
1826 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
1827 pp_right_brace (cxx_pp
);
1831 pp_string (cxx_pp
, "while (1) { ");
1832 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1833 pp_right_brace (cxx_pp
);
1837 pp_string (cxx_pp
, "if (");
1838 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1839 pp_string (cxx_pp
, ") break; ");
1843 dump_expr (get_first_fn (t
), flags
& ~TFF_EXPR_IN_PARENS
);
1846 case EMPTY_CLASS_EXPR
:
1847 dump_type (TREE_TYPE (t
), flags
);
1848 pp_left_paren (cxx_pp
);
1849 pp_right_paren (cxx_pp
);
1852 case NON_DEPENDENT_EXPR
:
1853 dump_expr (TREE_OPERAND (t
, 0), flags
);
1856 /* This list is incomplete, but should suffice for now.
1857 It is very important that `sorry' does not call
1858 `report_error_function'. That could cause an infinite loop. */
1860 pp_unsupported_tree (cxx_pp
, t
);
1861 /* fall through to ERROR_MARK... */
1863 pp_identifier (cxx_pp
, "<expression error>");
1869 dump_binary_op (const char *opstring
, tree t
, int flags
)
1871 pp_left_paren (cxx_pp
);
1872 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1875 pp_identifier (cxx_pp
, opstring
);
1877 pp_identifier (cxx_pp
, "<unknown operator>");
1879 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1880 pp_right_paren (cxx_pp
);
1884 dump_unary_op (const char *opstring
, tree t
, int flags
)
1886 if (flags
& TFF_EXPR_IN_PARENS
)
1887 pp_left_paren (cxx_pp
);
1888 pp_identifier (cxx_pp
, opstring
);
1889 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1890 if (flags
& TFF_EXPR_IN_PARENS
)
1891 pp_right_paren (cxx_pp
);
1894 /* Exported interface to stringifying types, exprs and decls under TFF_*
1898 type_as_string (tree typ
, int flags
)
1900 pp_clear_output_area (cxx_pp
);
1901 dump_type (typ
, flags
);
1902 return pp_formatted_text (cxx_pp
);
1906 expr_as_string (tree decl
, int flags
)
1908 pp_clear_output_area (cxx_pp
);
1909 dump_expr (decl
, flags
);
1910 return pp_formatted_text (cxx_pp
);
1914 decl_as_string (tree decl
, int flags
)
1916 pp_clear_output_area (cxx_pp
);
1917 dump_decl (decl
, flags
);
1918 return pp_formatted_text (cxx_pp
);
1922 context_as_string (tree context
, int flags
)
1924 pp_clear_output_area (cxx_pp
);
1925 dump_scope (context
, flags
);
1926 return pp_formatted_text (cxx_pp
);
1929 /* Generate the three forms of printable names for cxx_printable_name. */
1932 lang_decl_name (tree decl
, int v
)
1935 return decl_as_string (decl
, TFF_DECL_SPECIFIERS
);
1937 pp_clear_output_area (cxx_pp
);
1938 if (v
== 1 && DECL_CLASS_SCOPE_P (decl
))
1940 dump_type (CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
1941 pp_colon_colon (cxx_pp
);
1944 if (TREE_CODE (decl
) == FUNCTION_DECL
)
1945 dump_function_name (decl
, TFF_PLAIN_IDENTIFIER
);
1947 dump_decl (DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
1949 return pp_formatted_text (cxx_pp
);
1953 location_of (tree t
)
1955 if (TREE_CODE (t
) == PARM_DECL
&& DECL_CONTEXT (t
))
1956 t
= DECL_CONTEXT (t
);
1957 else if (TYPE_P (t
))
1958 t
= TYPE_MAIN_DECL (t
);
1959 else if (TREE_CODE (t
) == OVERLOAD
)
1960 t
= OVL_FUNCTION (t
);
1962 return DECL_SOURCE_LOCATION (t
);
1965 /* Now the interfaces from error et al to dump_type et al. Each takes an
1966 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
1970 decl_to_string (tree decl
, int verbose
)
1974 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
1975 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
1976 flags
= TFF_CLASS_KEY_OR_ENUM
;
1978 flags
|= TFF_DECL_SPECIFIERS
;
1979 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
1980 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
1981 flags
|= TFF_TEMPLATE_HEADER
;
1983 pp_clear_output_area (cxx_pp
);
1984 dump_decl (decl
, flags
);
1985 return pp_formatted_text (cxx_pp
);
1989 expr_to_string (tree decl
)
1991 pp_clear_output_area (cxx_pp
);
1992 dump_expr (decl
, 0);
1993 return pp_formatted_text (cxx_pp
);
1997 fndecl_to_string (tree fndecl
, int verbose
)
2001 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
;
2003 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2004 pp_clear_output_area (cxx_pp
);
2005 dump_decl (fndecl
, flags
);
2006 return pp_formatted_text (cxx_pp
);
2011 code_to_string (enum tree_code c
)
2013 return tree_code_name
[c
];
2017 language_to_string (enum languages c
)
2024 case lang_cplusplus
:
2036 /* Return the proper printed version of a parameter to a C++ function. */
2039 parm_to_string (int p
)
2041 pp_clear_output_area (cxx_pp
);
2043 pp_string (cxx_pp
, "'this'");
2045 pp_decimal_int (cxx_pp
, p
+ 1);
2046 return pp_formatted_text (cxx_pp
);
2050 op_to_string (enum tree_code p
)
2052 tree id
= operator_name_info
[(int) p
].identifier
;
2053 return id
? IDENTIFIER_POINTER (id
) : "<unknown>";
2057 type_to_string (tree typ
, int verbose
)
2061 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2062 flags
|= TFF_TEMPLATE_HEADER
;
2064 pp_clear_output_area (cxx_pp
);
2065 dump_type (typ
, flags
);
2066 return pp_formatted_text (cxx_pp
);
2070 assop_to_string (enum tree_code p
)
2072 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
2073 return id
? IDENTIFIER_POINTER (id
) : "{unknown}";
2077 args_to_string (tree p
, int verbose
)
2081 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2086 if (TYPE_P (TREE_VALUE (p
)))
2087 return type_as_string (p
, flags
);
2089 pp_clear_output_area (cxx_pp
);
2090 for (; p
; p
= TREE_CHAIN (p
))
2092 if (TREE_VALUE (p
) == null_node
)
2093 pp_identifier (cxx_pp
, "NULL");
2095 dump_type (error_type (TREE_VALUE (p
)), flags
);
2097 pp_separate_with_comma (cxx_pp
);
2099 return pp_formatted_text (cxx_pp
);
2103 cv_to_string (tree p
, int v
)
2105 pp_clear_output_area (cxx_pp
);
2106 dump_qualifiers (p
, v
? before
: none
);
2107 return pp_formatted_text (cxx_pp
);
2110 /* Langhook for print_error_function. */
2112 cxx_print_error_function (diagnostic_context
*context
, const char *file
)
2114 lhd_print_error_function (context
, file
);
2115 pp_base_set_prefix (context
->printer
, file
);
2116 maybe_print_instantiation_context (context
);
2120 cp_diagnostic_starter (diagnostic_context
*context
,
2121 diagnostic_info
*diagnostic
)
2123 diagnostic_report_current_module (context
);
2124 cp_print_error_function (context
, diagnostic
);
2125 maybe_print_instantiation_context (context
);
2126 pp_base_set_prefix (context
->printer
, diagnostic_build_prefix (diagnostic
));
2130 cp_diagnostic_finalizer (diagnostic_context
*context
,
2131 diagnostic_info
*diagnostic ATTRIBUTE_UNUSED
)
2133 pp_base_destroy_prefix (context
->printer
);
2136 /* Print current function onto BUFFER, in the process of reporting
2137 a diagnostic message. Called from cp_diagnostic_starter. */
2139 cp_print_error_function (diagnostic_context
*context
,
2140 diagnostic_info
*diagnostic
)
2142 if (diagnostic_last_function_changed (context
))
2144 const char *old_prefix
= context
->printer
->prefix
;
2145 char *new_prefix
= diagnostic
->location
.file
2146 ? file_name_as_prefix (diagnostic
->location
.file
)
2149 pp_base_set_prefix (context
->printer
, new_prefix
);
2151 if (current_function_decl
== NULL
)
2152 pp_base_string (context
->printer
, "At global scope:");
2154 pp_printf (context
->printer
, "In %s `%s':",
2155 function_category (current_function_decl
),
2156 cxx_printable_name (current_function_decl
, 2));
2157 pp_base_newline (context
->printer
);
2159 diagnostic_set_last_function (context
);
2160 pp_base_destroy_prefix (context
->printer
);
2161 context
->printer
->prefix
= old_prefix
;
2165 /* Returns a description of FUNCTION using standard terminology. */
2167 function_category (tree fn
)
2169 if (DECL_FUNCTION_MEMBER_P (fn
))
2171 if (DECL_STATIC_FUNCTION_P (fn
))
2172 return "static member function";
2173 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
2174 return "copy constructor";
2175 else if (DECL_CONSTRUCTOR_P (fn
))
2176 return "constructor";
2177 else if (DECL_DESTRUCTOR_P (fn
))
2178 return "destructor";
2180 return "member function";
2186 /* Report the full context of a current template instantiation,
2189 print_instantiation_full_context (diagnostic_context
*context
)
2191 tree p
= current_instantiation ();
2192 location_t location
= input_location
;
2196 if (current_function_decl
!= TINST_DECL (p
)
2197 && current_function_decl
!= NULL_TREE
)
2198 /* We can get here during the processing of some synthesized
2199 method. Then, TINST_DECL (p) will be the function that's causing
2204 if (current_function_decl
== TINST_DECL (p
))
2205 /* Avoid redundancy with the the "In function" line. */;
2207 pp_verbatim (context
->printer
,
2208 "%s: In instantiation of `%s':\n", location
.file
,
2209 decl_as_string (TINST_DECL (p
),
2210 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2212 location
.line
= TINST_LINE (p
);
2213 location
.file
= TINST_FILE (p
);
2218 print_instantiation_partial_context (context
, p
, location
);
2221 /* Same as above but less verbose. */
2223 print_instantiation_partial_context (diagnostic_context
*context
,
2224 tree t
, location_t loc
)
2226 for (; t
; t
= TREE_CHAIN (t
))
2228 pp_verbatim (context
->printer
, "%s:%d: instantiated from `%s'\n",
2230 decl_as_string (TINST_DECL (t
),
2231 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2232 loc
.line
= TINST_LINE (t
);
2233 loc
.file
= TINST_FILE (t
);
2235 pp_verbatim (context
->printer
, "%s:%d: instantiated from here\n",
2236 loc
.file
, loc
.line
);
2239 /* Called from cp_thing to print the template context for an error. */
2241 maybe_print_instantiation_context (diagnostic_context
*context
)
2243 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2246 record_last_problematic_instantiation ();
2247 print_instantiation_full_context (context
);
2250 /* Report the bare minimum context of a template instantiation. */
2252 print_instantiation_context (void)
2254 print_instantiation_partial_context
2255 (global_dc
, current_instantiation (), input_location
);
2256 diagnostic_flush_buffer (global_dc
);
2259 /* Called from output_format -- during diagnostic message processing --
2260 to handle C++ specific format specifier with the following meanings:
2261 %A function argument-list.
2265 %F function declaration.
2266 %L language as used in extern "lang".
2268 %P function parameter whose position is indicated by an integer.
2269 %Q assignment operator.
2273 cp_printer (pretty_printer
*pp
, text_info
*text
)
2277 #define next_tree va_arg (*text->args_ptr, tree)
2278 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2279 #define next_lang va_arg (*text->args_ptr, enum languages)
2280 #define next_int va_arg (*text->args_ptr, int)
2282 if (*text
->format_spec
== '+')
2283 ++text
->format_spec
;
2284 if (*text
->format_spec
== '#')
2287 ++text
->format_spec
;
2290 switch (*text
->format_spec
)
2292 case 'A': result
= args_to_string (next_tree
, verbose
); break;
2293 case 'C': result
= code_to_string (next_tcode
); break;
2294 case 'D': result
= decl_to_string (next_tree
, verbose
); break;
2295 case 'E': result
= expr_to_string (next_tree
); break;
2296 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
2297 case 'L': result
= language_to_string (next_lang
); break;
2298 case 'O': result
= op_to_string (next_tcode
); break;
2299 case 'P': result
= parm_to_string (next_int
); break;
2300 case 'Q': result
= assop_to_string (next_tcode
); break;
2301 case 'T': result
= type_to_string (next_tree
, verbose
); break;
2302 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
2308 pp_base_string (pp
, result
);
2317 pp_non_consecutive_character (cxx_pretty_printer
*pp
, int c
)
2319 const char *p
= pp_last_position_in_text (pp
);
2321 if (p
!= NULL
&& *p
== c
)
2323 pp_character (pp
, c
);
2326 /* These are temporary wrapper functions which handle the historic
2327 behavior of cp_*_at. */
2330 locate_error (const char *msgid
, va_list ap
)
2336 for (f
= msgid
; *f
; f
++)
2349 /* Just ignore these possibilities. */
2352 case 'd': (void) va_arg (ap
, int); break;
2353 case 's': (void) va_arg (ap
, char *); break;
2354 case 'L': (void) va_arg (ap
, enum languages
); break;
2357 case 'Q': (void) va_arg (ap
, enum tree_code
); break;
2359 /* These take a tree, which may be where the error is
2367 t
= va_arg (ap
, tree
);
2373 errorcount
= 0; /* damn ICE suppression */
2374 internal_error ("unexpected letter `%c' in locate_error\n", *f
);
2380 here
= va_arg (ap
, tree
);
2387 cp_error_at (const char *msgid
, ...)
2390 diagnostic_info diagnostic
;
2393 va_start (ap
, msgid
);
2394 here
= locate_error (msgid
, ap
);
2397 va_start (ap
, msgid
);
2398 diagnostic_set_info (&diagnostic
, msgid
, &ap
,
2399 location_of (here
), DK_ERROR
);
2400 report_diagnostic (&diagnostic
);
2405 cp_warning_at (const char *msgid
, ...)
2408 diagnostic_info diagnostic
;
2411 va_start (ap
, msgid
);
2412 here
= locate_error (msgid
, ap
);
2415 va_start (ap
, msgid
);
2416 diagnostic_set_info (&diagnostic
, msgid
, &ap
,
2417 location_of (here
), DK_WARNING
);
2418 report_diagnostic (&diagnostic
);
2423 cp_pedwarn_at (const char *msgid
, ...)
2426 diagnostic_info diagnostic
;
2429 va_start (ap
, msgid
);
2430 here
= locate_error (msgid
, ap
);
2433 va_start (ap
, msgid
);
2434 diagnostic_set_info (&diagnostic
, msgid
, &ap
,
2435 location_of (here
), pedantic_error_kind());
2436 report_diagnostic (&diagnostic
);