1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002,
4 2003, 2004, 2005, 2006, 2007 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, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
24 #include "coretypes.h"
31 #include "diagnostic.h"
32 #include "langhooks-def.h"
33 #include "cxx-pretty-print.h"
35 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
37 /* The global buffer where we dump everything. It is there only for
38 transitional purpose. It is expected, in the near future, to be
39 completely removed. */
40 static cxx_pretty_printer scratch_pretty_printer
;
41 #define cxx_pp (&scratch_pretty_printer)
43 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
45 static const char *args_to_string (tree
, int);
46 static const char *assop_to_string (enum tree_code
);
47 static const char *code_to_string (enum tree_code
);
48 static const char *cv_to_string (tree
, int);
49 static const char *decl_to_string (tree
, int);
50 static const char *expr_to_string (tree
);
51 static const char *fndecl_to_string (tree
, int);
52 static const char *op_to_string (enum tree_code
);
53 static const char *parm_to_string (int);
54 static const char *type_to_string (tree
, int);
56 static void dump_type (tree
, int);
57 static void dump_typename (tree
, int);
58 static void dump_simple_decl (tree
, tree
, int);
59 static void dump_decl (tree
, int);
60 static void dump_template_decl (tree
, int);
61 static void dump_function_decl (tree
, int);
62 static void dump_expr (tree
, int);
63 static void dump_unary_op (const char *, tree
, int);
64 static void dump_binary_op (const char *, tree
, int);
65 static void dump_aggr_type (tree
, int);
66 static void dump_type_prefix (tree
, int);
67 static void dump_type_suffix (tree
, int);
68 static void dump_function_name (tree
, int);
69 static void dump_call_expr_args (tree
, int, bool);
70 static void dump_aggr_init_expr_args (tree
, int, bool);
71 static void dump_expr_list (tree
, int);
72 static void dump_global_iord (tree
);
73 static void dump_parameters (tree
, int);
74 static void dump_exception_spec (tree
, int);
75 static void dump_template_argument (tree
, int);
76 static void dump_template_argument_list (tree
, int);
77 static void dump_template_parameter (tree
, int);
78 static void dump_template_bindings (tree
, tree
);
79 static void dump_scope (tree
, int);
80 static void dump_template_parms (tree
, int, int);
82 static const char *function_category (tree
);
83 static void maybe_print_instantiation_context (diagnostic_context
*);
84 static void print_instantiation_full_context (diagnostic_context
*);
85 static void print_instantiation_partial_context (diagnostic_context
*,
87 static void cp_diagnostic_starter (diagnostic_context
*, diagnostic_info
*);
88 static void cp_diagnostic_finalizer (diagnostic_context
*, diagnostic_info
*);
89 static void cp_print_error_function (diagnostic_context
*, diagnostic_info
*);
91 static bool cp_printer (pretty_printer
*, text_info
*, const char *,
92 int, bool, bool, bool);
93 static location_t
location_of (tree
);
98 diagnostic_starter (global_dc
) = cp_diagnostic_starter
;
99 diagnostic_finalizer (global_dc
) = cp_diagnostic_finalizer
;
100 diagnostic_format_decoder (global_dc
) = cp_printer
;
102 pp_construct (pp_base (cxx_pp
), NULL
, 0);
103 pp_cxx_pretty_printer_init (cxx_pp
);
106 /* Dump a scope, if deemed necessary. */
109 dump_scope (tree scope
, int flags
)
111 int f
= ~TFF_RETURN_TYPE
& (flags
& (TFF_SCOPE
| TFF_CHASE_TYPEDEF
));
113 if (scope
== NULL_TREE
)
116 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
118 if (scope
!= global_namespace
)
120 dump_decl (scope
, f
);
121 pp_cxx_colon_colon (cxx_pp
);
124 else if (AGGREGATE_TYPE_P (scope
))
126 dump_type (scope
, f
);
127 pp_cxx_colon_colon (cxx_pp
);
129 else if ((flags
& TFF_SCOPE
) && TREE_CODE (scope
) == FUNCTION_DECL
)
131 dump_function_decl (scope
, f
);
132 pp_cxx_colon_colon (cxx_pp
);
136 /* Dump the template ARGument under control of FLAGS. */
139 dump_template_argument (tree arg
, int flags
)
141 if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
142 dump_type (arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
144 dump_expr (arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
147 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
151 dump_template_argument_list (tree args
, int flags
)
153 int n
= TREE_VEC_LENGTH (args
);
157 for (i
= 0; i
< n
; ++i
)
160 pp_separate_with_comma (cxx_pp
);
161 dump_template_argument (TREE_VEC_ELT (args
, i
), flags
);
166 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
169 dump_template_parameter (tree parm
, int flags
)
174 if (parm
== error_mark_node
)
177 p
= TREE_VALUE (parm
);
178 a
= TREE_PURPOSE (parm
);
180 if (TREE_CODE (p
) == TYPE_DECL
)
182 if (flags
& TFF_DECL_SPECIFIERS
)
184 pp_cxx_identifier (cxx_pp
, "class");
186 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (p
));
188 else if (DECL_NAME (p
))
189 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (p
));
191 pp_cxx_canonical_template_parameter (cxx_pp
, TREE_TYPE (p
));
194 dump_decl (p
, flags
| TFF_DECL_SPECIFIERS
);
196 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
198 pp_cxx_whitespace (cxx_pp
);
200 pp_cxx_whitespace (cxx_pp
);
201 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
202 dump_type (a
, flags
& ~TFF_CHASE_TYPEDEF
);
204 dump_expr (a
, flags
| TFF_EXPR_IN_PARENS
);
208 /* Dump, under control of FLAGS, a template-parameter-list binding.
209 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
213 dump_template_bindings (tree parms
, tree args
)
219 tree p
= TREE_VALUE (parms
);
220 int lvl
= TMPL_PARMS_DEPTH (parms
);
224 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
226 tree arg
= NULL_TREE
;
228 /* Don't crash if we had an invalid argument list. */
229 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
231 tree lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
232 if (NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
233 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
237 pp_separate_with_comma (cxx_pp
);
238 dump_template_parameter (TREE_VEC_ELT (p
, i
), TFF_PLAIN_IDENTIFIER
);
239 pp_cxx_whitespace (cxx_pp
);
241 pp_cxx_whitespace (cxx_pp
);
243 dump_template_argument (arg
, TFF_PLAIN_IDENTIFIER
);
245 pp_identifier (cxx_pp
, "<missing>");
251 parms
= TREE_CHAIN (parms
);
255 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
259 dump_type (tree t
, int flags
)
264 if (TYPE_PTRMEMFUNC_P (t
))
267 switch (TREE_CODE (t
))
270 pp_identifier (cxx_pp
, "<unresolved overloaded function type>");
274 /* A list of function parms. */
275 dump_parameters (t
, flags
);
278 case IDENTIFIER_NODE
:
279 pp_cxx_tree_identifier (cxx_pp
, t
);
283 dump_type (BINFO_TYPE (t
), flags
);
289 dump_aggr_type (t
, flags
);
293 if (flags
& TFF_CHASE_TYPEDEF
)
295 dump_type (DECL_ORIGINAL_TYPE (t
)
296 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
299 /* Else fall through. */
303 dump_decl (t
, flags
& ~TFF_DECL_SPECIFIERS
);
312 pp_type_specifier_seq (cxx_pp
, t
);
315 case TEMPLATE_TEMPLATE_PARM
:
316 /* For parameters inside template signature. */
317 if (TYPE_IDENTIFIER (t
))
318 pp_cxx_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
320 pp_cxx_canonical_template_parameter (cxx_pp
, t
);
323 case BOUND_TEMPLATE_TEMPLATE_PARM
:
325 tree args
= TYPE_TI_ARGS (t
);
326 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
327 pp_cxx_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
328 pp_cxx_begin_template_argument_list (cxx_pp
);
329 dump_template_argument_list (args
, flags
);
330 pp_cxx_end_template_argument_list (cxx_pp
);
334 case TEMPLATE_TYPE_PARM
:
335 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
336 if (TYPE_IDENTIFIER (t
))
337 pp_cxx_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
339 pp_cxx_canonical_template_parameter
340 (cxx_pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
343 /* This is not always necessary for pointers and such, but doing this
344 reduces code size. */
353 dump_type_prefix (t
, flags
);
354 dump_type_suffix (t
, flags
);
358 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
359 pp_cxx_identifier (cxx_pp
,
360 TYPENAME_IS_ENUM_P (t
) ? "enum"
361 : TYPENAME_IS_CLASS_P (t
) ? "class"
363 dump_typename (t
, flags
);
366 case UNBOUND_CLASS_TEMPLATE
:
367 dump_type (TYPE_CONTEXT (t
), flags
);
368 pp_cxx_colon_colon (cxx_pp
);
369 pp_cxx_identifier (cxx_pp
, "template");
370 dump_type (DECL_NAME (TYPE_NAME (t
)), flags
);
374 pp_cxx_identifier (cxx_pp
, "__typeof__");
375 pp_cxx_whitespace (cxx_pp
);
376 pp_cxx_left_paren (cxx_pp
);
377 dump_expr (TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
378 pp_cxx_right_paren (cxx_pp
);
382 pp_unsupported_tree (cxx_pp
, t
);
383 /* Fall through to error. */
386 pp_identifier (cxx_pp
, "<type error>");
391 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
395 dump_typename (tree t
, int flags
)
397 tree ctx
= TYPE_CONTEXT (t
);
399 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
400 dump_typename (ctx
, flags
);
402 dump_type (ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
403 pp_cxx_colon_colon (cxx_pp
);
404 dump_decl (TYPENAME_TYPE_FULLNAME (t
), flags
);
407 /* Return the name of the supplied aggregate, or enumeral type. */
410 class_key_or_enum_as_string (tree t
)
412 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
414 else if (TREE_CODE (t
) == UNION_TYPE
)
416 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
422 /* Print out a class declaration T under the control of FLAGS,
423 in the form `class foo'. */
426 dump_aggr_type (tree t
, int flags
)
429 const char *variety
= class_key_or_enum_as_string (t
);
433 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
435 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
436 pp_cxx_identifier (cxx_pp
, variety
);
438 if (flags
& TFF_CHASE_TYPEDEF
)
439 t
= TYPE_MAIN_VARIANT (t
);
441 name
= TYPE_NAME (t
);
445 typdef
= !DECL_ARTIFICIAL (name
);
446 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
447 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
448 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
449 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
450 dump_scope (CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
453 /* Because the template names are mangled, we have to locate
454 the most general template, and use that name. */
455 tree tpl
= CLASSTYPE_TI_TEMPLATE (t
);
457 while (DECL_TEMPLATE_INFO (tpl
))
458 tpl
= DECL_TI_TEMPLATE (tpl
);
461 name
= DECL_NAME (name
);
464 if (name
== 0 || ANON_AGGRNAME_P (name
))
466 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
467 pp_identifier (cxx_pp
, "<anonymous>");
469 pp_printf (pp_base (cxx_pp
), "<anonymous %s>", variety
);
472 pp_cxx_tree_identifier (cxx_pp
, name
);
474 dump_template_parms (TYPE_TEMPLATE_INFO (t
),
475 !CLASSTYPE_USE_TEMPLATE (t
),
476 flags
& ~TFF_TEMPLATE_HEADER
);
479 /* Dump into the obstack the initial part of the output for a given type.
480 This is necessary when dealing with things like functions returning
483 return type of `int (* fee ())()': pointer -> function -> int. Both
484 pointer (and reference and offset) and function (and member) types must
485 deal with prefix and suffix.
487 Arrays must also do this for DECL nodes, like int a[], and for things like
491 dump_type_prefix (tree t
, int flags
)
493 if (TYPE_PTRMEMFUNC_P (t
))
495 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
499 switch (TREE_CODE (t
))
504 tree sub
= TREE_TYPE (t
);
506 dump_type_prefix (sub
, flags
);
507 if (TREE_CODE (sub
) == ARRAY_TYPE
)
509 pp_cxx_whitespace (cxx_pp
);
510 pp_cxx_left_paren (cxx_pp
);
512 pp_character (cxx_pp
, "&*"[TREE_CODE (t
) == POINTER_TYPE
]);
513 pp_base (cxx_pp
)->padding
= pp_before
;
514 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
520 dump_type_prefix (TREE_TYPE (t
), flags
);
521 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
523 pp_maybe_space (cxx_pp
);
524 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
525 pp_cxx_left_paren (cxx_pp
);
526 dump_type (TYPE_OFFSET_BASETYPE (t
), flags
);
527 pp_cxx_colon_colon (cxx_pp
);
529 pp_cxx_star (cxx_pp
);
530 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
531 pp_base (cxx_pp
)->padding
= pp_before
;
534 /* Can only be reached through function pointer -- this would not be
535 correct if FUNCTION_DECLs used it. */
537 dump_type_prefix (TREE_TYPE (t
), flags
);
538 pp_maybe_space (cxx_pp
);
539 pp_cxx_left_paren (cxx_pp
);
543 dump_type_prefix (TREE_TYPE (t
), flags
);
544 pp_maybe_space (cxx_pp
);
545 pp_cxx_left_paren (cxx_pp
);
546 dump_aggr_type (TYPE_METHOD_BASETYPE (t
), flags
);
547 pp_cxx_colon_colon (cxx_pp
);
551 dump_type_prefix (TREE_TYPE (t
), flags
);
555 case IDENTIFIER_NODE
:
560 case TEMPLATE_TYPE_PARM
:
561 case TEMPLATE_TEMPLATE_PARM
:
562 case BOUND_TEMPLATE_TEMPLATE_PARM
:
573 dump_type (t
, flags
);
574 pp_base (cxx_pp
)->padding
= pp_before
;
578 pp_unsupported_tree (cxx_pp
, t
);
581 pp_identifier (cxx_pp
, "<typeprefixerror>");
586 /* Dump the suffix of type T, under control of FLAGS. This is the part
587 which appears after the identifier (or function parms). */
590 dump_type_suffix (tree t
, int flags
)
592 if (TYPE_PTRMEMFUNC_P (t
))
593 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
595 switch (TREE_CODE (t
))
600 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
601 pp_cxx_right_paren (cxx_pp
);
602 dump_type_suffix (TREE_TYPE (t
), flags
);
605 /* Can only be reached through function pointer. */
610 pp_cxx_right_paren (cxx_pp
);
611 arg
= TYPE_ARG_TYPES (t
);
612 if (TREE_CODE (t
) == METHOD_TYPE
)
613 arg
= TREE_CHAIN (arg
);
615 /* Function pointers don't have default args. Not in standard C++,
616 anyway; they may in g++, but we'll just pretend otherwise. */
617 dump_parameters (arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
619 if (TREE_CODE (t
) == METHOD_TYPE
)
620 pp_cxx_cv_qualifier_seq
621 (cxx_pp
, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t
))));
623 pp_cxx_cv_qualifier_seq(cxx_pp
, t
);
624 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t
), flags
);
625 dump_type_suffix (TREE_TYPE (t
), flags
);
630 pp_maybe_space (cxx_pp
);
631 pp_cxx_left_bracket (cxx_pp
);
634 tree dtype
= TYPE_DOMAIN (t
);
635 tree max
= TYPE_MAX_VALUE (dtype
);
636 if (host_integerp (max
, 0))
637 pp_wide_integer (cxx_pp
, tree_low_cst (max
, 0) + 1);
638 else if (TREE_CODE (max
) == MINUS_EXPR
)
639 dump_expr (TREE_OPERAND (max
, 0),
640 flags
& ~TFF_EXPR_IN_PARENS
);
642 dump_expr (fold_build2 (PLUS_EXPR
, dtype
, max
,
643 build_int_cst (dtype
, 1)),
644 flags
& ~TFF_EXPR_IN_PARENS
);
646 pp_cxx_right_bracket (cxx_pp
);
647 dump_type_suffix (TREE_TYPE (t
), flags
);
651 case IDENTIFIER_NODE
:
656 case TEMPLATE_TYPE_PARM
:
657 case TEMPLATE_TEMPLATE_PARM
:
658 case BOUND_TEMPLATE_TEMPLATE_PARM
:
672 pp_unsupported_tree (cxx_pp
, t
);
674 /* Don't mark it here, we should have already done in
681 dump_global_iord (tree t
)
683 const char *p
= NULL
;
685 if (DECL_GLOBAL_CTOR_P (t
))
687 else if (DECL_GLOBAL_DTOR_P (t
))
692 pp_printf (pp_base (cxx_pp
), "(static %s for %s)", p
, input_filename
);
696 dump_simple_decl (tree t
, tree type
, int flags
)
698 if (flags
& TFF_DECL_SPECIFIERS
)
700 dump_type_prefix (type
, flags
);
701 pp_maybe_space (cxx_pp
);
703 if (!DECL_INITIAL (t
) || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
)
704 dump_scope (CP_DECL_CONTEXT (t
), flags
);
706 dump_decl (DECL_NAME (t
), flags
);
708 pp_identifier (cxx_pp
, "<anonymous>");
709 if (flags
& TFF_DECL_SPECIFIERS
)
710 dump_type_suffix (type
, flags
);
713 /* Dump a human readable string for the decl T under control of FLAGS. */
716 dump_decl (tree t
, int flags
)
721 switch (TREE_CODE (t
))
724 /* Don't say 'typedef class A' */
725 if (DECL_ARTIFICIAL (t
))
727 if ((flags
& TFF_DECL_SPECIFIERS
)
728 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
729 /* Say `class T' not just `T'. */
730 pp_cxx_identifier (cxx_pp
, "class");
732 dump_type (TREE_TYPE (t
), flags
);
735 if (flags
& TFF_DECL_SPECIFIERS
)
736 pp_cxx_identifier (cxx_pp
, "typedef");
737 dump_simple_decl (t
, DECL_ORIGINAL_TYPE (t
)
738 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
743 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
745 pp_string (cxx_pp
, "vtable for ");
746 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
747 dump_type (DECL_CONTEXT (t
), flags
);
750 /* Else fall through. */
753 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
757 pp_string (cxx_pp
, "<return value> ");
758 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
762 if (flags
& TFF_DECL_SPECIFIERS
)
763 pp_cxx_declaration (cxx_pp
, t
);
766 dump_scope (CP_DECL_CONTEXT (t
), flags
);
767 if (DECL_NAME (t
) == NULL_TREE
)
768 pp_identifier (cxx_pp
, "<unnamed>");
770 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (t
));
775 pp_expression (cxx_pp
, t
);
779 dump_decl (TREE_OPERAND (t
, 0), flags
);
780 pp_cxx_left_bracket (cxx_pp
);
781 dump_decl (TREE_OPERAND (t
, 1), flags
);
782 pp_cxx_right_bracket (cxx_pp
);
785 /* So that we can do dump_decl on an aggr type. */
789 dump_type (t
, flags
);
793 /* This is a pseudo destructor call which has not been folded into
794 a PSEUDO_DTOR_EXPR yet. */
795 pp_cxx_complement (cxx_pp
);
796 dump_type (TREE_OPERAND (t
, 0), flags
);
803 /* These special cases are duplicated here so that other functions
804 can feed identifiers to error and get them demangled properly. */
805 case IDENTIFIER_NODE
:
806 if (IDENTIFIER_TYPENAME_P (t
))
808 pp_cxx_identifier (cxx_pp
, "operator");
809 /* Not exactly IDENTIFIER_TYPE_VALUE. */
810 dump_type (TREE_TYPE (t
), flags
);
814 pp_cxx_tree_identifier (cxx_pp
, t
);
821 if (DECL_CLASS_SCOPE_P (t
))
823 dump_type (DECL_CONTEXT (t
), flags
);
824 pp_cxx_colon_colon (cxx_pp
);
826 else if (DECL_CONTEXT (t
))
828 dump_decl (DECL_CONTEXT (t
), flags
);
829 pp_cxx_colon_colon (cxx_pp
);
831 dump_decl (DECL_NAME (t
), flags
);
835 /* If there's only one function, just treat it like an ordinary
841 if (! DECL_LANG_SPECIFIC (t
))
842 pp_identifier (cxx_pp
, "<built-in>");
843 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
844 dump_global_iord (t
);
846 dump_function_decl (t
, flags
);
850 dump_template_decl (t
, flags
);
853 case TEMPLATE_ID_EXPR
:
855 tree name
= TREE_OPERAND (t
, 0);
857 if (is_overloaded_fn (name
))
858 name
= DECL_NAME (get_first_fn (name
));
859 dump_decl (name
, flags
);
860 pp_cxx_begin_template_argument_list (cxx_pp
);
861 if (TREE_OPERAND (t
, 1))
862 dump_template_argument_list (TREE_OPERAND (t
, 1), flags
);
863 pp_cxx_end_template_argument_list (cxx_pp
);
868 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (t
));
872 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
873 || (DECL_INITIAL (t
) &&
874 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
875 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
876 else if (DECL_NAME (t
))
877 dump_decl (DECL_NAME (t
), flags
);
878 else if (DECL_INITIAL (t
))
879 dump_expr (DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
881 pp_identifier (cxx_pp
, "<enumerator>");
885 pp_cxx_identifier (cxx_pp
, "using");
886 dump_type (USING_DECL_SCOPE (t
), flags
);
887 pp_cxx_colon_colon (cxx_pp
);
888 dump_decl (DECL_NAME (t
), flags
);
892 pp_cxx_declaration (cxx_pp
, t
);
896 dump_decl (BASELINK_FUNCTIONS (t
), flags
);
899 case NON_DEPENDENT_EXPR
:
900 dump_expr (t
, flags
);
903 case TEMPLATE_TYPE_PARM
:
904 if (flags
& TFF_DECL_SPECIFIERS
)
905 pp_cxx_declaration (cxx_pp
, t
);
907 pp_type_id (cxx_pp
, t
);
911 pp_unsupported_tree (cxx_pp
, t
);
912 /* Fall through to error. */
915 pp_identifier (cxx_pp
, "<declaration error>");
920 /* Dump a template declaration T under control of FLAGS. This means the
921 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
924 dump_template_decl (tree t
, int flags
)
926 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
930 if (flags
& TFF_TEMPLATE_HEADER
)
932 for (parms
= orig_parms
= nreverse (orig_parms
);
934 parms
= TREE_CHAIN (parms
))
936 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
937 int len
= TREE_VEC_LENGTH (inner_parms
);
939 pp_cxx_identifier (cxx_pp
, "template");
940 pp_cxx_begin_template_argument_list (cxx_pp
);
942 /* If we've shown the template prefix, we'd better show the
943 parameters' and decl's type too. */
944 flags
|= TFF_DECL_SPECIFIERS
;
946 for (i
= 0; i
< len
; i
++)
949 pp_separate_with_comma (cxx_pp
);
950 dump_template_parameter (TREE_VEC_ELT (inner_parms
, i
), flags
);
952 pp_cxx_end_template_argument_list (cxx_pp
);
953 pp_cxx_whitespace (cxx_pp
);
955 nreverse(orig_parms
);
957 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
958 /* Say `template<arg> class TT' not just `template<arg> TT'. */
959 pp_cxx_identifier (cxx_pp
, "class");
962 if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == TYPE_DECL
)
963 dump_type (TREE_TYPE (t
),
964 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
965 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
966 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == VAR_DECL
)
967 dump_decl (DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
970 gcc_assert (TREE_TYPE (t
));
971 switch (NEXT_CODE (t
))
975 dump_function_decl (t
, flags
| TFF_TEMPLATE_NAME
);
978 /* This case can occur with some invalid code. */
979 dump_type (TREE_TYPE (t
),
980 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
981 | (flags
& TFF_DECL_SPECIFIERS
982 ? TFF_CLASS_KEY_OR_ENUM
: 0));
987 /* Pretty print a function decl. There are several ways we want to print a
988 function declaration. The TFF_ bits in FLAGS tells us how to behave.
989 As error can only apply the '#' flag once to give 0 and 1 for V, there
990 is %D which doesn't print the throw specs, and %F which does. */
993 dump_function_decl (tree t
, int flags
)
997 tree cname
= NULL_TREE
;
998 tree template_args
= NULL_TREE
;
999 tree template_parms
= NULL_TREE
;
1000 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1002 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1003 t
= DECL_TEMPLATE_RESULT (t
);
1005 /* Pretty print template instantiations only. */
1006 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
))
1010 template_args
= DECL_TI_ARGS (t
);
1011 tmpl
= most_general_template (t
);
1012 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1014 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1019 fntype
= TREE_TYPE (t
);
1020 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1022 if (DECL_CLASS_SCOPE_P (t
))
1023 cname
= DECL_CONTEXT (t
);
1024 /* This is for partially instantiated template methods. */
1025 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1026 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1028 if (!(flags
& TFF_DECL_SPECIFIERS
))
1030 else if (DECL_STATIC_FUNCTION_P (t
))
1031 pp_cxx_identifier (cxx_pp
, "static");
1032 else if (DECL_VIRTUAL_P (t
))
1033 pp_cxx_identifier (cxx_pp
, "virtual");
1035 /* Print the return type? */
1037 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1038 && !DECL_DESTRUCTOR_P (t
);
1040 dump_type_prefix (TREE_TYPE (fntype
), flags
);
1042 /* Print the function name. */
1045 dump_type (cname
, flags
);
1046 pp_cxx_colon_colon (cxx_pp
);
1049 dump_scope (CP_DECL_CONTEXT (t
), flags
);
1051 dump_function_name (t
, flags
);
1053 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1055 dump_parameters (parmtypes
, flags
);
1057 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1059 pp_base (cxx_pp
)->padding
= pp_before
;
1060 pp_cxx_cv_qualifier_seq
1061 (cxx_pp
, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype
))));
1064 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1066 pp_base (cxx_pp
)->padding
= pp_before
;
1067 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype
), flags
);
1071 dump_type_suffix (TREE_TYPE (fntype
), flags
);
1074 /* If T is a template instantiation, dump the parameter binding. */
1075 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
)
1077 pp_cxx_whitespace (cxx_pp
);
1078 pp_cxx_left_bracket (cxx_pp
);
1079 pp_cxx_identifier (cxx_pp
, "with");
1080 pp_cxx_whitespace (cxx_pp
);
1081 dump_template_bindings (template_parms
, template_args
);
1082 pp_cxx_right_bracket (cxx_pp
);
1086 /* Print a parameter list. If this is for a member function, the
1087 member object ptr (and any other hidden args) should have
1088 already been removed. */
1091 dump_parameters (tree parmtypes
, int flags
)
1095 pp_cxx_left_paren (cxx_pp
);
1097 for (first
= 1; parmtypes
!= void_list_node
;
1098 parmtypes
= TREE_CHAIN (parmtypes
))
1101 pp_separate_with_comma (cxx_pp
);
1105 pp_cxx_identifier (cxx_pp
, "...");
1108 dump_type (TREE_VALUE (parmtypes
), flags
);
1110 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1112 pp_cxx_whitespace (cxx_pp
);
1114 pp_cxx_whitespace (cxx_pp
);
1115 dump_expr (TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1119 pp_cxx_right_paren (cxx_pp
);
1122 /* Print an exception specification. T is the exception specification. */
1125 dump_exception_spec (tree t
, int flags
)
1129 pp_cxx_identifier (cxx_pp
, "throw");
1130 pp_cxx_whitespace (cxx_pp
);
1131 pp_cxx_left_paren (cxx_pp
);
1132 if (TREE_VALUE (t
) != NULL_TREE
)
1135 dump_type (TREE_VALUE (t
), flags
);
1139 pp_separate_with_comma (cxx_pp
);
1141 pp_cxx_right_paren (cxx_pp
);
1145 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1146 and destructors properly. */
1149 dump_function_name (tree t
, int flags
)
1151 tree name
= DECL_NAME (t
);
1153 /* We can get here with a decl that was synthesized by language-
1154 independent machinery (e.g. coverage.c) in which case it won't
1155 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1156 will crash. In this case it is safe just to print out the
1158 if (!DECL_LANG_SPECIFIC (t
))
1160 pp_cxx_tree_identifier (cxx_pp
, name
);
1164 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1165 t
= DECL_TEMPLATE_RESULT (t
);
1167 /* Don't let the user see __comp_ctor et al. */
1168 if (DECL_CONSTRUCTOR_P (t
)
1169 || DECL_DESTRUCTOR_P (t
))
1170 name
= constructor_name (DECL_CONTEXT (t
));
1172 if (DECL_DESTRUCTOR_P (t
))
1174 pp_cxx_complement (cxx_pp
);
1175 dump_decl (name
, TFF_PLAIN_IDENTIFIER
);
1177 else if (DECL_CONV_FN_P (t
))
1179 /* This cannot use the hack that the operator's return
1180 type is stashed off of its name because it may be
1181 used for error reporting. In the case of conflicting
1182 declarations, both will have the same name, yet
1183 the types will be different, hence the TREE_TYPE field
1184 of the first name will be clobbered by the second. */
1185 pp_cxx_identifier (cxx_pp
, "operator");
1186 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1188 else if (IDENTIFIER_OPNAME_P (name
))
1189 pp_cxx_tree_identifier (cxx_pp
, name
);
1191 dump_decl (name
, flags
);
1193 if (DECL_TEMPLATE_INFO (t
)
1194 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1195 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1196 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1197 dump_template_parms (DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
), flags
);
1200 /* Dump the template parameters from the template info INFO under control of
1201 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1202 specialization (partial or complete). For partial specializations we show
1203 the specialized parameter values. For a primary template we show no
1207 dump_template_parms (tree info
, int primary
, int flags
)
1209 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1211 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1213 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1214 pp_cxx_begin_template_argument_list (cxx_pp
);
1216 /* Be careful only to print things when we have them, so as not
1217 to crash producing error messages. */
1218 if (args
&& !primary
)
1222 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args
))
1223 args
= TREE_VEC_ELT (args
, TREE_VEC_LENGTH (args
) - 1);
1225 len
= TREE_VEC_LENGTH (args
);
1227 for (ix
= 0; ix
!= len
; ix
++)
1229 tree arg
= TREE_VEC_ELT (args
, ix
);
1232 pp_separate_with_comma (cxx_pp
);
1235 pp_identifier (cxx_pp
, "<template parameter error>");
1237 dump_template_argument (arg
, flags
);
1242 tree tpl
= TI_TEMPLATE (info
);
1243 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1246 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1247 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1249 for (ix
= 0; ix
!= len
; ix
++)
1253 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1255 pp_identifier (cxx_pp
, "<template parameter error>");
1259 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1262 pp_separate_with_comma (cxx_pp
);
1264 dump_decl (parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1267 pp_cxx_end_template_argument_list (cxx_pp
);
1270 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1271 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1274 dump_call_expr_args (tree t
, int flags
, bool skipfirst
)
1277 call_expr_arg_iterator iter
;
1279 pp_cxx_left_paren (cxx_pp
);
1280 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1286 dump_expr (arg
, flags
| TFF_EXPR_IN_PARENS
);
1287 if (more_call_expr_args_p (&iter
))
1288 pp_separate_with_comma (cxx_pp
);
1291 pp_cxx_right_paren (cxx_pp
);
1294 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1295 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1299 dump_aggr_init_expr_args (tree t
, int flags
, bool skipfirst
)
1302 aggr_init_expr_arg_iterator iter
;
1304 pp_cxx_left_paren (cxx_pp
);
1305 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1311 dump_expr (arg
, flags
| TFF_EXPR_IN_PARENS
);
1312 if (more_aggr_init_expr_args_p (&iter
))
1313 pp_separate_with_comma (cxx_pp
);
1316 pp_cxx_right_paren (cxx_pp
);
1319 /* Print out a list of initializers (subr of dump_expr). */
1322 dump_expr_list (tree l
, int flags
)
1326 dump_expr (TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1329 pp_separate_with_comma (cxx_pp
);
1333 /* Print out a vector of initializers (subr of dump_expr). */
1336 dump_expr_init_vec (VEC(constructor_elt
,gc
) *v
, int flags
)
1338 unsigned HOST_WIDE_INT idx
;
1341 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1343 dump_expr (value
, flags
| TFF_EXPR_IN_PARENS
);
1344 if (idx
!= VEC_length (constructor_elt
, v
) - 1)
1345 pp_separate_with_comma (cxx_pp
);
1350 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1351 function. Resolve it to a close relative -- in the sense of static
1352 type -- variant being overridden. That is close to what was written in
1353 the source code. Subroutine of dump_expr. */
1356 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1358 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1359 int index
= tree_low_cst (OBJ_TYPE_REF_TOKEN (ref
), 1);
1360 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1362 fun
= TREE_CHAIN (fun
);
1367 /* Print out an expression E under control of FLAGS. */
1370 dump_expr (tree t
, int flags
)
1375 switch (TREE_CODE (t
))
1383 case NAMESPACE_DECL
:
1386 case IDENTIFIER_NODE
:
1387 dump_decl (t
, (flags
& ~TFF_DECL_SPECIFIERS
) | TFF_NO_FUNCTION_ARGUMENTS
);
1393 pp_constant (cxx_pp
, t
);
1397 pp_cxx_identifier (cxx_pp
, "throw");
1398 dump_expr (TREE_OPERAND (t
, 0), flags
);
1402 pp_ampersand (cxx_pp
);
1403 dump_type (PTRMEM_CST_CLASS (t
), flags
);
1404 pp_cxx_colon_colon (cxx_pp
);
1405 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1409 pp_cxx_left_paren (cxx_pp
);
1410 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1411 pp_separate_with_comma (cxx_pp
);
1412 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1413 pp_cxx_right_paren (cxx_pp
);
1417 pp_cxx_left_paren (cxx_pp
);
1418 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1419 pp_string (cxx_pp
, " ? ");
1420 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1421 pp_string (cxx_pp
, " : ");
1422 dump_expr (TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
1423 pp_cxx_right_paren (cxx_pp
);
1427 if (TREE_HAS_CONSTRUCTOR (t
))
1429 pp_cxx_identifier (cxx_pp
, "new");
1430 pp_cxx_whitespace (cxx_pp
);
1431 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1434 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1437 case AGGR_INIT_EXPR
:
1439 tree fn
= NULL_TREE
;
1441 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
1442 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
1444 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
1446 if (DECL_CONSTRUCTOR_P (fn
))
1447 dump_type (DECL_CONTEXT (fn
), flags
);
1452 dump_expr (AGGR_INIT_EXPR_FN (t
), 0);
1454 dump_aggr_init_expr_args (t
, flags
, false);
1459 tree fn
= CALL_EXPR_FN (t
);
1460 bool skipfirst
= false;
1462 if (TREE_CODE (fn
) == ADDR_EXPR
)
1463 fn
= TREE_OPERAND (fn
, 0);
1465 /* Nobody is interested in seeing the guts of vcalls. */
1466 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
1467 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
1469 if (TREE_TYPE (fn
) != NULL_TREE
&& NEXT_CODE (fn
) == METHOD_TYPE
)
1471 tree ob
= CALL_EXPR_ARG (t
, 0);
1472 if (TREE_CODE (ob
) == ADDR_EXPR
)
1474 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1477 else if (TREE_CODE (ob
) != PARM_DECL
1478 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1480 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1485 dump_expr (fn
, flags
| TFF_EXPR_IN_PARENS
);
1486 dump_call_expr_args (t
, flags
, skipfirst
);
1492 tree type
= TREE_OPERAND (t
, 1);
1493 tree init
= TREE_OPERAND (t
, 2);
1494 if (NEW_EXPR_USE_GLOBAL (t
))
1495 pp_cxx_colon_colon (cxx_pp
);
1496 pp_cxx_identifier (cxx_pp
, "new");
1497 if (TREE_OPERAND (t
, 0))
1499 pp_cxx_left_paren (cxx_pp
);
1500 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1501 pp_cxx_right_paren (cxx_pp
);
1502 pp_cxx_whitespace (cxx_pp
);
1504 if (TREE_CODE (type
) == ARRAY_REF
)
1505 type
= build_cplus_array_type
1506 (TREE_OPERAND (type
, 0),
1507 build_index_type (fold_build2 (MINUS_EXPR
, integer_type_node
,
1508 TREE_OPERAND (type
, 1),
1509 integer_one_node
)));
1510 dump_type (type
, flags
);
1513 pp_cxx_left_paren (cxx_pp
);
1514 if (TREE_CODE (init
) == TREE_LIST
)
1515 dump_expr_list (init
, flags
);
1516 else if (init
== void_zero_node
)
1517 /* This representation indicates an empty initializer,
1518 e.g.: "new int()". */
1521 dump_expr (init
, flags
);
1522 pp_cxx_right_paren (cxx_pp
);
1528 /* Note that this only works for G++ target exprs. If somebody
1529 builds a general TARGET_EXPR, there's no way to represent that
1530 it initializes anything other that the parameter slot for the
1531 default argument. Note we may have cleared out the first
1532 operand in expand_expr, so don't go killing ourselves. */
1533 if (TREE_OPERAND (t
, 1))
1534 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1542 case TRUNC_DIV_EXPR
:
1543 case TRUNC_MOD_EXPR
:
1551 case TRUTH_ANDIF_EXPR
:
1552 case TRUTH_ORIF_EXPR
:
1559 case EXACT_DIV_EXPR
:
1560 dump_binary_op (operator_name_info
[(int) TREE_CODE (t
)].name
, t
, flags
);
1564 case FLOOR_DIV_EXPR
:
1565 case ROUND_DIV_EXPR
:
1567 dump_binary_op ("/", t
, flags
);
1571 case FLOOR_MOD_EXPR
:
1572 case ROUND_MOD_EXPR
:
1573 dump_binary_op ("%", t
, flags
);
1578 tree ob
= TREE_OPERAND (t
, 0);
1579 if (TREE_CODE (ob
) == INDIRECT_REF
)
1581 ob
= TREE_OPERAND (ob
, 0);
1582 if (TREE_CODE (ob
) != PARM_DECL
1584 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
1586 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1587 pp_cxx_arrow (cxx_pp
);
1592 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1593 pp_cxx_dot (cxx_pp
);
1595 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
1600 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1601 pp_cxx_left_bracket (cxx_pp
);
1602 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1603 pp_cxx_right_bracket (cxx_pp
);
1606 case UNARY_PLUS_EXPR
:
1607 dump_unary_op ("+", t
, flags
);
1611 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
1612 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
1613 /* An ADDR_EXPR can have reference type. In that case, we
1614 shouldn't print the `&' doing so indicates to the user
1615 that the expression has pointer type. */
1617 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
1618 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1619 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
1620 dump_unary_op ("&&", t
, flags
);
1622 dump_unary_op ("&", t
, flags
);
1626 if (TREE_HAS_CONSTRUCTOR (t
))
1628 t
= TREE_OPERAND (t
, 0);
1629 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
1630 dump_expr (CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
1631 dump_call_expr_args (t
, flags
, true);
1635 if (TREE_OPERAND (t
,0) != NULL_TREE
1636 && TREE_TYPE (TREE_OPERAND (t
, 0))
1637 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
1638 dump_expr (TREE_OPERAND (t
, 0), flags
);
1640 dump_unary_op ("*", t
, flags
);
1646 case TRUTH_NOT_EXPR
:
1647 case PREDECREMENT_EXPR
:
1648 case PREINCREMENT_EXPR
:
1649 dump_unary_op (operator_name_info
[(int)TREE_CODE (t
)].name
, t
, flags
);
1652 case POSTDECREMENT_EXPR
:
1653 case POSTINCREMENT_EXPR
:
1654 pp_cxx_left_paren (cxx_pp
);
1655 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1656 pp_cxx_identifier (cxx_pp
, operator_name_info
[(int)TREE_CODE (t
)].name
);
1657 pp_cxx_right_paren (cxx_pp
);
1660 case NON_LVALUE_EXPR
:
1661 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1662 should be another level of INDIRECT_REF so that I don't have to do
1664 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
1666 tree next
= TREE_TYPE (TREE_TYPE (t
));
1668 while (TREE_CODE (next
) == POINTER_TYPE
)
1669 next
= TREE_TYPE (next
);
1671 if (TREE_CODE (next
) == FUNCTION_TYPE
)
1673 if (flags
& TFF_EXPR_IN_PARENS
)
1674 pp_cxx_left_paren (cxx_pp
);
1675 pp_cxx_star (cxx_pp
);
1676 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1677 if (flags
& TFF_EXPR_IN_PARENS
)
1678 pp_cxx_right_paren (cxx_pp
);
1681 /* Else fall through. */
1683 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1689 tree op
= TREE_OPERAND (t
, 0);
1691 if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
1693 /* It is a cast, but we cannot tell whether it is a
1694 reinterpret or static cast. Use the C style notation. */
1695 if (flags
& TFF_EXPR_IN_PARENS
)
1696 pp_cxx_left_paren (cxx_pp
);
1697 pp_cxx_left_paren (cxx_pp
);
1698 dump_type (TREE_TYPE (t
), flags
);
1699 pp_cxx_right_paren (cxx_pp
);
1700 dump_expr (op
, flags
| TFF_EXPR_IN_PARENS
);
1701 if (flags
& TFF_EXPR_IN_PARENS
)
1702 pp_cxx_right_paren (cxx_pp
);
1705 dump_expr (op
, flags
);
1710 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
1712 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
1714 if (integer_zerop (idx
))
1716 /* A NULL pointer-to-member constant. */
1717 pp_cxx_left_paren (cxx_pp
);
1718 pp_cxx_left_paren (cxx_pp
);
1719 dump_type (TREE_TYPE (t
), flags
);
1720 pp_cxx_right_paren (cxx_pp
);
1721 pp_character (cxx_pp
, '0');
1722 pp_cxx_right_paren (cxx_pp
);
1725 else if (host_integerp (idx
, 0))
1728 unsigned HOST_WIDE_INT n
;
1730 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
1731 t
= TYPE_METHOD_BASETYPE (t
);
1732 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
1734 n
= tree_low_cst (idx
, 0);
1736 /* Map vtable index back one, to allow for the null pointer to
1740 while (n
> 0 && virtuals
)
1743 virtuals
= TREE_CHAIN (virtuals
);
1747 dump_expr (BV_FN (virtuals
),
1748 flags
| TFF_EXPR_IN_PARENS
);
1753 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
1755 dump_type (TREE_TYPE (t
), 0);
1756 pp_cxx_left_paren (cxx_pp
);
1757 pp_cxx_right_paren (cxx_pp
);
1761 pp_cxx_left_brace (cxx_pp
);
1762 dump_expr_init_vec (CONSTRUCTOR_ELTS (t
), flags
);
1763 pp_cxx_right_brace (cxx_pp
);
1770 tree ob
= TREE_OPERAND (t
, 0);
1771 if (is_dummy_object (ob
))
1773 t
= TREE_OPERAND (t
, 1);
1774 if (TREE_CODE (t
) == FUNCTION_DECL
)
1776 dump_expr (t
, flags
| TFF_EXPR_IN_PARENS
);
1777 else if (BASELINK_P (t
))
1778 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
1779 flags
| TFF_EXPR_IN_PARENS
);
1781 dump_decl (t
, flags
);
1785 if (TREE_CODE (ob
) == INDIRECT_REF
)
1787 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1788 pp_cxx_arrow (cxx_pp
);
1789 pp_cxx_star (cxx_pp
);
1793 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1794 pp_cxx_dot (cxx_pp
);
1795 pp_cxx_star (cxx_pp
);
1797 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1802 case TEMPLATE_PARM_INDEX
:
1803 dump_decl (TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
1807 pp_expression (cxx_pp
, t
);
1811 if (TREE_OPERAND (t
, 0) == NULL_TREE
1812 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
1814 dump_type (TREE_TYPE (t
), flags
);
1815 pp_cxx_left_paren (cxx_pp
);
1816 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1817 pp_cxx_right_paren (cxx_pp
);
1821 pp_cxx_left_paren (cxx_pp
);
1822 dump_type (TREE_TYPE (t
), flags
);
1823 pp_cxx_right_paren (cxx_pp
);
1824 pp_cxx_left_paren (cxx_pp
);
1825 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1826 pp_cxx_right_paren (cxx_pp
);
1830 case STATIC_CAST_EXPR
:
1831 pp_cxx_identifier (cxx_pp
, "static_cast");
1833 case REINTERPRET_CAST_EXPR
:
1834 pp_cxx_identifier (cxx_pp
, "reinterpret_cast");
1836 case CONST_CAST_EXPR
:
1837 pp_cxx_identifier (cxx_pp
, "const_cast");
1839 case DYNAMIC_CAST_EXPR
:
1840 pp_cxx_identifier (cxx_pp
, "dynamic_cast");
1842 pp_cxx_begin_template_argument_list (cxx_pp
);
1843 dump_type (TREE_TYPE (t
), flags
);
1844 pp_cxx_end_template_argument_list (cxx_pp
);
1845 pp_cxx_left_paren (cxx_pp
);
1846 dump_expr (TREE_OPERAND (t
, 0), flags
);
1847 pp_cxx_right_paren (cxx_pp
);
1851 dump_expr (TREE_OPERAND (t
, 0), flags
);
1852 pp_cxx_arrow (cxx_pp
);
1857 if (TREE_CODE (t
) == SIZEOF_EXPR
)
1858 pp_cxx_identifier (cxx_pp
, "sizeof");
1861 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
1862 pp_cxx_identifier (cxx_pp
, "__alignof__");
1864 pp_cxx_whitespace (cxx_pp
);
1865 pp_cxx_left_paren (cxx_pp
);
1866 if (TYPE_P (TREE_OPERAND (t
, 0)))
1867 dump_type (TREE_OPERAND (t
, 0), flags
);
1869 dump_expr (TREE_OPERAND (t
, 0), flags
);
1870 pp_cxx_right_paren (cxx_pp
);
1875 pp_cxx_identifier (cxx_pp
, operator_name_info
[TREE_CODE (t
)].name
);
1876 pp_cxx_whitespace (cxx_pp
);
1877 dump_expr (TREE_OPERAND (t
, 0), flags
);
1881 pp_identifier (cxx_pp
, "<unparsed>");
1884 case TRY_CATCH_EXPR
:
1885 case WITH_CLEANUP_EXPR
:
1886 case CLEANUP_POINT_EXPR
:
1887 dump_expr (TREE_OPERAND (t
, 0), flags
);
1890 case PSEUDO_DTOR_EXPR
:
1891 dump_expr (TREE_OPERAND (t
, 2), flags
);
1892 pp_cxx_dot (cxx_pp
);
1893 dump_type (TREE_OPERAND (t
, 0), flags
);
1894 pp_cxx_colon_colon (cxx_pp
);
1895 pp_cxx_complement (cxx_pp
);
1896 dump_type (TREE_OPERAND (t
, 1), flags
);
1899 case TEMPLATE_ID_EXPR
:
1900 dump_decl (t
, flags
);
1905 case STATEMENT_LIST
:
1906 /* We don't yet have a way of dumping statements in a
1907 human-readable format. */
1908 pp_string (cxx_pp
, "({...})");
1912 pp_string (cxx_pp
, "while (1) { ");
1913 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1914 pp_cxx_right_brace (cxx_pp
);
1918 pp_string (cxx_pp
, "if (");
1919 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1920 pp_string (cxx_pp
, ") break; ");
1924 dump_expr (get_first_fn (t
), flags
& ~TFF_EXPR_IN_PARENS
);
1927 case EMPTY_CLASS_EXPR
:
1928 dump_type (TREE_TYPE (t
), flags
);
1929 pp_cxx_left_paren (cxx_pp
);
1930 pp_cxx_right_paren (cxx_pp
);
1933 case NON_DEPENDENT_EXPR
:
1934 dump_expr (TREE_OPERAND (t
, 0), flags
);
1937 /* This list is incomplete, but should suffice for now.
1938 It is very important that `sorry' does not call
1939 `report_error_function'. That could cause an infinite loop. */
1941 pp_unsupported_tree (cxx_pp
, t
);
1942 /* fall through to ERROR_MARK... */
1944 pp_identifier (cxx_pp
, "<expression error>");
1950 dump_binary_op (const char *opstring
, tree t
, int flags
)
1952 pp_cxx_left_paren (cxx_pp
);
1953 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1954 pp_cxx_whitespace (cxx_pp
);
1956 pp_cxx_identifier (cxx_pp
, opstring
);
1958 pp_identifier (cxx_pp
, "<unknown operator>");
1959 pp_cxx_whitespace (cxx_pp
);
1960 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1961 pp_cxx_right_paren (cxx_pp
);
1965 dump_unary_op (const char *opstring
, tree t
, int flags
)
1967 if (flags
& TFF_EXPR_IN_PARENS
)
1968 pp_cxx_left_paren (cxx_pp
);
1969 pp_cxx_identifier (cxx_pp
, opstring
);
1970 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1971 if (flags
& TFF_EXPR_IN_PARENS
)
1972 pp_cxx_right_paren (cxx_pp
);
1976 reinit_cxx_pp (void)
1978 pp_clear_output_area (cxx_pp
);
1979 pp_base (cxx_pp
)->padding
= pp_none
;
1980 pp_indentation (cxx_pp
) = 0;
1981 pp_needs_newline (cxx_pp
) = false;
1982 cxx_pp
->enclosing_scope
= 0;
1986 /* Exported interface to stringifying types, exprs and decls under TFF_*
1990 type_as_string (tree typ
, int flags
)
1993 dump_type (typ
, flags
);
1994 return pp_formatted_text (cxx_pp
);
1998 expr_as_string (tree decl
, int flags
)
2001 dump_expr (decl
, flags
);
2002 return pp_formatted_text (cxx_pp
);
2006 decl_as_string (tree decl
, int flags
)
2009 dump_decl (decl
, flags
);
2010 return pp_formatted_text (cxx_pp
);
2013 /* Generate the three forms of printable names for cxx_printable_name. */
2016 lang_decl_name (tree decl
, int v
)
2019 return decl_as_string (decl
, TFF_DECL_SPECIFIERS
);
2022 if (v
== 1 && DECL_CLASS_SCOPE_P (decl
))
2024 dump_type (CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2025 pp_cxx_colon_colon (cxx_pp
);
2028 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2029 dump_function_name (decl
, TFF_PLAIN_IDENTIFIER
);
2031 dump_decl (DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2033 return pp_formatted_text (cxx_pp
);
2036 /* Return the location of a tree passed to %+ formats. */
2039 location_of (tree t
)
2041 if (TREE_CODE (t
) == PARM_DECL
&& DECL_CONTEXT (t
))
2042 t
= DECL_CONTEXT (t
);
2043 else if (TYPE_P (t
))
2044 t
= TYPE_MAIN_DECL (t
);
2045 else if (TREE_CODE (t
) == OVERLOAD
)
2046 t
= OVL_FUNCTION (t
);
2048 return DECL_SOURCE_LOCATION (t
);
2051 /* Now the interfaces from error et al to dump_type et al. Each takes an
2052 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2056 decl_to_string (tree decl
, int verbose
)
2060 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2061 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2062 flags
= TFF_CLASS_KEY_OR_ENUM
;
2064 flags
|= TFF_DECL_SPECIFIERS
;
2065 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2066 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2067 flags
|= TFF_TEMPLATE_HEADER
;
2070 dump_decl (decl
, flags
);
2071 return pp_formatted_text (cxx_pp
);
2075 expr_to_string (tree decl
)
2078 dump_expr (decl
, 0);
2079 return pp_formatted_text (cxx_pp
);
2083 fndecl_to_string (tree fndecl
, int verbose
)
2087 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2088 | TFF_TEMPLATE_HEADER
;
2090 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2092 dump_decl (fndecl
, flags
);
2093 return pp_formatted_text (cxx_pp
);
2098 code_to_string (enum tree_code c
)
2100 return tree_code_name
[c
];
2104 language_to_string (enum languages c
)
2111 case lang_cplusplus
:
2123 /* Return the proper printed version of a parameter to a C++ function. */
2126 parm_to_string (int p
)
2130 pp_string (cxx_pp
, "'this'");
2132 pp_decimal_int (cxx_pp
, p
+ 1);
2133 return pp_formatted_text (cxx_pp
);
2137 op_to_string (enum tree_code p
)
2139 tree id
= operator_name_info
[(int) p
].identifier
;
2140 return id
? IDENTIFIER_POINTER (id
) : "<unknown>";
2144 type_to_string (tree typ
, int verbose
)
2148 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2149 flags
|= TFF_TEMPLATE_HEADER
;
2152 dump_type (typ
, flags
);
2153 return pp_formatted_text (cxx_pp
);
2157 assop_to_string (enum tree_code p
)
2159 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
2160 return id
? IDENTIFIER_POINTER (id
) : "{unknown}";
2164 args_to_string (tree p
, int verbose
)
2168 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2173 if (TYPE_P (TREE_VALUE (p
)))
2174 return type_as_string (p
, flags
);
2177 for (; p
; p
= TREE_CHAIN (p
))
2179 if (TREE_VALUE (p
) == null_node
)
2180 pp_cxx_identifier (cxx_pp
, "NULL");
2182 dump_type (error_type (TREE_VALUE (p
)), flags
);
2184 pp_separate_with_comma (cxx_pp
);
2186 return pp_formatted_text (cxx_pp
);
2190 cv_to_string (tree p
, int v
)
2193 pp_base (cxx_pp
)->padding
= v
? pp_before
: pp_none
;
2194 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
2195 return pp_formatted_text (cxx_pp
);
2198 /* Langhook for print_error_function. */
2200 cxx_print_error_function (diagnostic_context
*context
, const char *file
)
2202 lhd_print_error_function (context
, file
);
2203 pp_base_set_prefix (context
->printer
, file
);
2204 maybe_print_instantiation_context (context
);
2208 cp_diagnostic_starter (diagnostic_context
*context
,
2209 diagnostic_info
*diagnostic
)
2211 diagnostic_report_current_module (context
);
2212 cp_print_error_function (context
, diagnostic
);
2213 maybe_print_instantiation_context (context
);
2214 pp_base_set_prefix (context
->printer
, diagnostic_build_prefix (diagnostic
));
2218 cp_diagnostic_finalizer (diagnostic_context
*context
,
2219 diagnostic_info
*diagnostic ATTRIBUTE_UNUSED
)
2221 pp_base_destroy_prefix (context
->printer
);
2224 /* Print current function onto BUFFER, in the process of reporting
2225 a diagnostic message. Called from cp_diagnostic_starter. */
2227 cp_print_error_function (diagnostic_context
*context
,
2228 diagnostic_info
*diagnostic
)
2230 if (diagnostic_last_function_changed (context
))
2232 const char *old_prefix
= context
->printer
->prefix
;
2233 const char *file
= LOCATION_FILE (diagnostic
->location
);
2234 char *new_prefix
= file
? file_name_as_prefix (file
) : NULL
;
2236 pp_base_set_prefix (context
->printer
, new_prefix
);
2238 if (current_function_decl
== NULL
)
2239 pp_base_string (context
->printer
, "At global scope:");
2241 pp_printf (context
->printer
, "In %s %qs:",
2242 function_category (current_function_decl
),
2243 cxx_printable_name (current_function_decl
, 2));
2244 pp_base_newline (context
->printer
);
2246 diagnostic_set_last_function (context
);
2247 pp_base_destroy_prefix (context
->printer
);
2248 context
->printer
->prefix
= old_prefix
;
2252 /* Returns a description of FUNCTION using standard terminology. */
2254 function_category (tree fn
)
2256 if (DECL_FUNCTION_MEMBER_P (fn
))
2258 if (DECL_STATIC_FUNCTION_P (fn
))
2259 return "static member function";
2260 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
2261 return "copy constructor";
2262 else if (DECL_CONSTRUCTOR_P (fn
))
2263 return "constructor";
2264 else if (DECL_DESTRUCTOR_P (fn
))
2265 return "destructor";
2267 return "member function";
2273 /* Report the full context of a current template instantiation,
2276 print_instantiation_full_context (diagnostic_context
*context
)
2278 tree p
= current_instantiation ();
2279 location_t location
= input_location
;
2283 if (current_function_decl
!= TINST_DECL (p
)
2284 && current_function_decl
!= NULL_TREE
)
2285 /* We can get here during the processing of some synthesized
2286 method. Then, TINST_DECL (p) will be the function that's causing
2291 if (current_function_decl
== TINST_DECL (p
))
2292 /* Avoid redundancy with the "In function" line. */;
2294 pp_verbatim (context
->printer
,
2295 "%s: In instantiation of %qs:\n",
2296 LOCATION_FILE (location
),
2297 decl_as_string (TINST_DECL (p
),
2298 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2300 location
= TINST_LOCATION (p
);
2305 print_instantiation_partial_context (context
, p
, location
);
2308 /* Same as above but less verbose. */
2310 print_instantiation_partial_context (diagnostic_context
*context
,
2311 tree t
, location_t loc
)
2313 expanded_location xloc
;
2314 for (; ; t
= TREE_CHAIN (t
))
2316 xloc
= expand_location (loc
);
2319 pp_verbatim (context
->printer
, "%s:%d: instantiated from %qs\n",
2320 xloc
.file
, xloc
.line
,
2321 decl_as_string (TINST_DECL (t
),
2322 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2323 loc
= TINST_LOCATION (t
);
2325 pp_verbatim (context
->printer
, "%s:%d: instantiated from here",
2326 xloc
.file
, xloc
.line
);
2327 pp_base_newline (context
->printer
);
2330 /* Called from cp_thing to print the template context for an error. */
2332 maybe_print_instantiation_context (diagnostic_context
*context
)
2334 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2337 record_last_problematic_instantiation ();
2338 print_instantiation_full_context (context
);
2341 /* Report the bare minimum context of a template instantiation. */
2343 print_instantiation_context (void)
2345 print_instantiation_partial_context
2346 (global_dc
, current_instantiation (), input_location
);
2347 diagnostic_flush_buffer (global_dc
);
2350 /* Called from output_format -- during diagnostic message processing --
2351 to handle C++ specific format specifier with the following meanings:
2352 %A function argument-list.
2356 %F function declaration.
2357 %L language as used in extern "lang".
2359 %P function parameter whose position is indicated by an integer.
2360 %Q assignment operator.
2364 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
2365 int precision
, bool wide
, bool set_locus
, bool verbose
)
2369 #define next_tree (t = va_arg (*text->args_ptr, tree))
2370 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2371 #define next_lang va_arg (*text->args_ptr, enum languages)
2372 #define next_int va_arg (*text->args_ptr, int)
2374 if (precision
!= 0 || wide
)
2377 if (text
->locus
== NULL
)
2382 case 'A': result
= args_to_string (next_tree
, verbose
); break;
2383 case 'C': result
= code_to_string (next_tcode
); break;
2386 tree temp
= next_tree
;
2388 && DECL_DEBUG_EXPR_IS_FROM (temp
) && DECL_DEBUG_EXPR (temp
))
2390 temp
= DECL_DEBUG_EXPR (temp
);
2393 result
= expr_to_string (temp
);
2397 result
= decl_to_string (temp
, verbose
);
2400 case 'E': result
= expr_to_string (next_tree
); break;
2401 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
2402 case 'L': result
= language_to_string (next_lang
); break;
2403 case 'O': result
= op_to_string (next_tcode
); break;
2404 case 'P': result
= parm_to_string (next_int
); break;
2405 case 'Q': result
= assop_to_string (next_tcode
); break;
2406 case 'T': result
= type_to_string (next_tree
, verbose
); break;
2407 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
2413 pp_base_string (pp
, result
);
2414 if (set_locus
&& t
!= NULL
)
2415 *text
->locus
= location_of (t
);
2423 /* Callback from cpp_error for PFILE to print diagnostics arising from
2424 interpreting strings. The diagnostic is of type LEVEL; MSG is the
2425 translated message and AP the arguments. */
2428 cp_cpp_error (cpp_reader
*pfile ATTRIBUTE_UNUSED
, int level
,
2429 const char *msg
, va_list *ap
)
2431 diagnostic_info diagnostic
;
2432 diagnostic_t dlevel
;
2435 case CPP_DL_WARNING
:
2436 case CPP_DL_WARNING_SYSHDR
:
2437 dlevel
= DK_WARNING
;
2439 case CPP_DL_PEDWARN
:
2440 dlevel
= pedantic_error_kind ();
2451 diagnostic_set_info_translated (&diagnostic
, msg
, ap
,
2452 input_location
, dlevel
);
2453 report_diagnostic (&diagnostic
);