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
)));
451 if (! (flags
& TFF_UNQUALIFIED_NAME
))
452 dump_scope (CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
453 flags
&= ~TFF_UNQUALIFIED_NAME
;
456 /* Because the template names are mangled, we have to locate
457 the most general template, and use that name. */
458 tree tpl
= CLASSTYPE_TI_TEMPLATE (t
);
460 while (DECL_TEMPLATE_INFO (tpl
))
461 tpl
= DECL_TI_TEMPLATE (tpl
);
464 name
= DECL_NAME (name
);
467 if (name
== 0 || ANON_AGGRNAME_P (name
))
469 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
470 pp_identifier (cxx_pp
, "<anonymous>");
472 pp_printf (pp_base (cxx_pp
), "<anonymous %s>", variety
);
475 pp_cxx_tree_identifier (cxx_pp
, name
);
477 dump_template_parms (TYPE_TEMPLATE_INFO (t
),
478 !CLASSTYPE_USE_TEMPLATE (t
),
479 flags
& ~TFF_TEMPLATE_HEADER
);
482 /* Dump into the obstack the initial part of the output for a given type.
483 This is necessary when dealing with things like functions returning
486 return type of `int (* fee ())()': pointer -> function -> int. Both
487 pointer (and reference and offset) and function (and member) types must
488 deal with prefix and suffix.
490 Arrays must also do this for DECL nodes, like int a[], and for things like
494 dump_type_prefix (tree t
, int flags
)
496 if (TYPE_PTRMEMFUNC_P (t
))
498 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
502 switch (TREE_CODE (t
))
507 tree sub
= TREE_TYPE (t
);
509 dump_type_prefix (sub
, flags
);
510 if (TREE_CODE (sub
) == ARRAY_TYPE
)
512 pp_cxx_whitespace (cxx_pp
);
513 pp_cxx_left_paren (cxx_pp
);
515 pp_character (cxx_pp
, "&*"[TREE_CODE (t
) == POINTER_TYPE
]);
516 pp_base (cxx_pp
)->padding
= pp_before
;
517 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
523 dump_type_prefix (TREE_TYPE (t
), flags
);
524 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
526 pp_maybe_space (cxx_pp
);
527 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
528 pp_cxx_left_paren (cxx_pp
);
529 dump_type (TYPE_OFFSET_BASETYPE (t
), flags
);
530 pp_cxx_colon_colon (cxx_pp
);
532 pp_cxx_star (cxx_pp
);
533 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
534 pp_base (cxx_pp
)->padding
= pp_before
;
537 /* Can only be reached through function pointer -- this would not be
538 correct if FUNCTION_DECLs used it. */
540 dump_type_prefix (TREE_TYPE (t
), flags
);
541 pp_maybe_space (cxx_pp
);
542 pp_cxx_left_paren (cxx_pp
);
546 dump_type_prefix (TREE_TYPE (t
), flags
);
547 pp_maybe_space (cxx_pp
);
548 pp_cxx_left_paren (cxx_pp
);
549 dump_aggr_type (TYPE_METHOD_BASETYPE (t
), flags
);
550 pp_cxx_colon_colon (cxx_pp
);
554 dump_type_prefix (TREE_TYPE (t
), flags
);
558 case IDENTIFIER_NODE
:
563 case TEMPLATE_TYPE_PARM
:
564 case TEMPLATE_TEMPLATE_PARM
:
565 case BOUND_TEMPLATE_TEMPLATE_PARM
:
576 dump_type (t
, flags
);
577 pp_base (cxx_pp
)->padding
= pp_before
;
581 pp_unsupported_tree (cxx_pp
, t
);
584 pp_identifier (cxx_pp
, "<typeprefixerror>");
589 /* Dump the suffix of type T, under control of FLAGS. This is the part
590 which appears after the identifier (or function parms). */
593 dump_type_suffix (tree t
, int flags
)
595 if (TYPE_PTRMEMFUNC_P (t
))
596 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
598 switch (TREE_CODE (t
))
603 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
604 pp_cxx_right_paren (cxx_pp
);
605 dump_type_suffix (TREE_TYPE (t
), flags
);
608 /* Can only be reached through function pointer. */
613 pp_cxx_right_paren (cxx_pp
);
614 arg
= TYPE_ARG_TYPES (t
);
615 if (TREE_CODE (t
) == METHOD_TYPE
)
616 arg
= TREE_CHAIN (arg
);
618 /* Function pointers don't have default args. Not in standard C++,
619 anyway; they may in g++, but we'll just pretend otherwise. */
620 dump_parameters (arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
622 if (TREE_CODE (t
) == METHOD_TYPE
)
623 pp_cxx_cv_qualifier_seq
624 (cxx_pp
, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t
))));
626 pp_cxx_cv_qualifier_seq(cxx_pp
, t
);
627 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t
), flags
);
628 dump_type_suffix (TREE_TYPE (t
), flags
);
633 pp_maybe_space (cxx_pp
);
634 pp_cxx_left_bracket (cxx_pp
);
637 tree dtype
= TYPE_DOMAIN (t
);
638 tree max
= TYPE_MAX_VALUE (dtype
);
639 if (host_integerp (max
, 0))
640 pp_wide_integer (cxx_pp
, tree_low_cst (max
, 0) + 1);
641 else if (TREE_CODE (max
) == MINUS_EXPR
)
642 dump_expr (TREE_OPERAND (max
, 0),
643 flags
& ~TFF_EXPR_IN_PARENS
);
645 dump_expr (fold_build2 (PLUS_EXPR
, dtype
, max
,
646 build_int_cst (dtype
, 1)),
647 flags
& ~TFF_EXPR_IN_PARENS
);
649 pp_cxx_right_bracket (cxx_pp
);
650 dump_type_suffix (TREE_TYPE (t
), flags
);
654 case IDENTIFIER_NODE
:
659 case TEMPLATE_TYPE_PARM
:
660 case TEMPLATE_TEMPLATE_PARM
:
661 case BOUND_TEMPLATE_TEMPLATE_PARM
:
675 pp_unsupported_tree (cxx_pp
, t
);
677 /* Don't mark it here, we should have already done in
684 dump_global_iord (tree t
)
686 const char *p
= NULL
;
688 if (DECL_GLOBAL_CTOR_P (t
))
690 else if (DECL_GLOBAL_DTOR_P (t
))
695 pp_printf (pp_base (cxx_pp
), "(static %s for %s)", p
, input_filename
);
699 dump_simple_decl (tree t
, tree type
, int flags
)
701 if (flags
& TFF_DECL_SPECIFIERS
)
703 dump_type_prefix (type
, flags
& ~TFF_UNQUALIFIED_NAME
);
704 pp_maybe_space (cxx_pp
);
706 if (! (flags
& TFF_UNQUALIFIED_NAME
)
707 && (!DECL_INITIAL (t
)
708 || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
))
709 dump_scope (CP_DECL_CONTEXT (t
), flags
);
710 flags
&= ~TFF_UNQUALIFIED_NAME
;
712 dump_decl (DECL_NAME (t
), flags
);
714 pp_identifier (cxx_pp
, "<anonymous>");
715 if (flags
& TFF_DECL_SPECIFIERS
)
716 dump_type_suffix (type
, flags
);
719 /* Dump a human readable string for the decl T under control of FLAGS. */
722 dump_decl (tree t
, int flags
)
727 switch (TREE_CODE (t
))
730 /* Don't say 'typedef class A' */
731 if (DECL_ARTIFICIAL (t
))
733 if ((flags
& TFF_DECL_SPECIFIERS
)
734 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
735 /* Say `class T' not just `T'. */
736 pp_cxx_identifier (cxx_pp
, "class");
738 dump_type (TREE_TYPE (t
), flags
);
741 if (flags
& TFF_DECL_SPECIFIERS
)
742 pp_cxx_identifier (cxx_pp
, "typedef");
743 dump_simple_decl (t
, DECL_ORIGINAL_TYPE (t
)
744 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
749 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
751 pp_string (cxx_pp
, "vtable for ");
752 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
753 dump_type (DECL_CONTEXT (t
), flags
);
756 /* Else fall through. */
759 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
763 pp_string (cxx_pp
, "<return value> ");
764 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
768 if (flags
& TFF_DECL_SPECIFIERS
)
769 pp_cxx_declaration (cxx_pp
, t
);
772 if (! (flags
& TFF_UNQUALIFIED_NAME
))
773 dump_scope (CP_DECL_CONTEXT (t
), flags
);
774 flags
&= ~TFF_UNQUALIFIED_NAME
;
775 if (DECL_NAME (t
) == NULL_TREE
)
776 pp_identifier (cxx_pp
, "<unnamed>");
778 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (t
));
783 pp_expression (cxx_pp
, t
);
787 dump_decl (TREE_OPERAND (t
, 0), flags
);
788 pp_cxx_left_bracket (cxx_pp
);
789 dump_decl (TREE_OPERAND (t
, 1), flags
);
790 pp_cxx_right_bracket (cxx_pp
);
793 /* So that we can do dump_decl on an aggr type. */
797 dump_type (t
, flags
);
801 /* This is a pseudo destructor call which has not been folded into
802 a PSEUDO_DTOR_EXPR yet. */
803 pp_cxx_complement (cxx_pp
);
804 dump_type (TREE_OPERAND (t
, 0), flags
);
811 /* These special cases are duplicated here so that other functions
812 can feed identifiers to error and get them demangled properly. */
813 case IDENTIFIER_NODE
:
814 if (IDENTIFIER_TYPENAME_P (t
))
816 pp_cxx_identifier (cxx_pp
, "operator");
817 /* Not exactly IDENTIFIER_TYPE_VALUE. */
818 dump_type (TREE_TYPE (t
), flags
);
822 pp_cxx_tree_identifier (cxx_pp
, t
);
829 if (DECL_CLASS_SCOPE_P (t
))
831 dump_type (DECL_CONTEXT (t
), flags
);
832 pp_cxx_colon_colon (cxx_pp
);
834 else if (DECL_CONTEXT (t
))
836 dump_decl (DECL_CONTEXT (t
), flags
);
837 pp_cxx_colon_colon (cxx_pp
);
839 dump_decl (DECL_NAME (t
), flags
);
843 /* If there's only one function, just treat it like an ordinary
849 if (! DECL_LANG_SPECIFIC (t
))
850 pp_identifier (cxx_pp
, "<built-in>");
851 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
852 dump_global_iord (t
);
854 dump_function_decl (t
, flags
);
858 dump_template_decl (t
, flags
);
861 case TEMPLATE_ID_EXPR
:
863 tree name
= TREE_OPERAND (t
, 0);
865 if (is_overloaded_fn (name
))
866 name
= DECL_NAME (get_first_fn (name
));
867 dump_decl (name
, flags
);
868 pp_cxx_begin_template_argument_list (cxx_pp
);
869 if (TREE_OPERAND (t
, 1))
870 dump_template_argument_list (TREE_OPERAND (t
, 1), flags
);
871 pp_cxx_end_template_argument_list (cxx_pp
);
876 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (t
));
880 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
881 || (DECL_INITIAL (t
) &&
882 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
883 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
884 else if (DECL_NAME (t
))
885 dump_decl (DECL_NAME (t
), flags
);
886 else if (DECL_INITIAL (t
))
887 dump_expr (DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
889 pp_identifier (cxx_pp
, "<enumerator>");
893 pp_cxx_identifier (cxx_pp
, "using");
894 dump_type (USING_DECL_SCOPE (t
), flags
);
895 pp_cxx_colon_colon (cxx_pp
);
896 dump_decl (DECL_NAME (t
), flags
);
900 pp_cxx_declaration (cxx_pp
, t
);
904 dump_decl (BASELINK_FUNCTIONS (t
), flags
);
907 case NON_DEPENDENT_EXPR
:
908 dump_expr (t
, flags
);
911 case TEMPLATE_TYPE_PARM
:
912 if (flags
& TFF_DECL_SPECIFIERS
)
913 pp_cxx_declaration (cxx_pp
, t
);
915 pp_type_id (cxx_pp
, t
);
919 pp_unsupported_tree (cxx_pp
, t
);
920 /* Fall through to error. */
923 pp_identifier (cxx_pp
, "<declaration error>");
928 /* Dump a template declaration T under control of FLAGS. This means the
929 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
932 dump_template_decl (tree t
, int flags
)
934 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
938 if (flags
& TFF_TEMPLATE_HEADER
)
940 for (parms
= orig_parms
= nreverse (orig_parms
);
942 parms
= TREE_CHAIN (parms
))
944 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
945 int len
= TREE_VEC_LENGTH (inner_parms
);
947 pp_cxx_identifier (cxx_pp
, "template");
948 pp_cxx_begin_template_argument_list (cxx_pp
);
950 /* If we've shown the template prefix, we'd better show the
951 parameters' and decl's type too. */
952 flags
|= TFF_DECL_SPECIFIERS
;
954 for (i
= 0; i
< len
; i
++)
957 pp_separate_with_comma (cxx_pp
);
958 dump_template_parameter (TREE_VEC_ELT (inner_parms
, i
), flags
);
960 pp_cxx_end_template_argument_list (cxx_pp
);
961 pp_cxx_whitespace (cxx_pp
);
963 nreverse(orig_parms
);
965 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
966 /* Say `template<arg> class TT' not just `template<arg> TT'. */
967 pp_cxx_identifier (cxx_pp
, "class");
970 if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == TYPE_DECL
)
971 dump_type (TREE_TYPE (t
),
972 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
973 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
974 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == VAR_DECL
)
975 dump_decl (DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
978 gcc_assert (TREE_TYPE (t
));
979 switch (NEXT_CODE (t
))
983 dump_function_decl (t
, flags
| TFF_TEMPLATE_NAME
);
986 /* This case can occur with some invalid code. */
987 dump_type (TREE_TYPE (t
),
988 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
989 | (flags
& TFF_DECL_SPECIFIERS
990 ? TFF_CLASS_KEY_OR_ENUM
: 0));
995 /* Pretty print a function decl. There are several ways we want to print a
996 function declaration. The TFF_ bits in FLAGS tells us how to behave.
997 As error can only apply the '#' flag once to give 0 and 1 for V, there
998 is %D which doesn't print the throw specs, and %F which does. */
1001 dump_function_decl (tree t
, int flags
)
1005 tree cname
= NULL_TREE
;
1006 tree template_args
= NULL_TREE
;
1007 tree template_parms
= NULL_TREE
;
1008 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1009 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1011 flags
&= ~TFF_UNQUALIFIED_NAME
;
1012 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1013 t
= DECL_TEMPLATE_RESULT (t
);
1015 /* Pretty print template instantiations only. */
1016 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
))
1020 template_args
= DECL_TI_ARGS (t
);
1021 tmpl
= most_general_template (t
);
1022 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1024 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1029 fntype
= TREE_TYPE (t
);
1030 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1032 if (DECL_CLASS_SCOPE_P (t
))
1033 cname
= DECL_CONTEXT (t
);
1034 /* This is for partially instantiated template methods. */
1035 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1036 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1038 if (!(flags
& TFF_DECL_SPECIFIERS
))
1040 else if (DECL_STATIC_FUNCTION_P (t
))
1041 pp_cxx_identifier (cxx_pp
, "static");
1042 else if (DECL_VIRTUAL_P (t
))
1043 pp_cxx_identifier (cxx_pp
, "virtual");
1045 /* Print the return type? */
1047 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1048 && !DECL_DESTRUCTOR_P (t
);
1050 dump_type_prefix (TREE_TYPE (fntype
), flags
);
1052 /* Print the function name. */
1053 if (!do_outer_scope
)
1057 dump_type (cname
, flags
);
1058 pp_cxx_colon_colon (cxx_pp
);
1061 dump_scope (CP_DECL_CONTEXT (t
), flags
);
1063 dump_function_name (t
, flags
);
1065 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1067 dump_parameters (parmtypes
, flags
);
1069 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1071 pp_base (cxx_pp
)->padding
= pp_before
;
1072 pp_cxx_cv_qualifier_seq
1073 (cxx_pp
, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype
))));
1076 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1078 pp_base (cxx_pp
)->padding
= pp_before
;
1079 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype
), flags
);
1083 dump_type_suffix (TREE_TYPE (fntype
), flags
);
1086 /* If T is a template instantiation, dump the parameter binding. */
1087 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
)
1089 pp_cxx_whitespace (cxx_pp
);
1090 pp_cxx_left_bracket (cxx_pp
);
1091 pp_cxx_identifier (cxx_pp
, "with");
1092 pp_cxx_whitespace (cxx_pp
);
1093 dump_template_bindings (template_parms
, template_args
);
1094 pp_cxx_right_bracket (cxx_pp
);
1098 /* Print a parameter list. If this is for a member function, the
1099 member object ptr (and any other hidden args) should have
1100 already been removed. */
1103 dump_parameters (tree parmtypes
, int flags
)
1107 pp_cxx_left_paren (cxx_pp
);
1109 for (first
= 1; parmtypes
!= void_list_node
;
1110 parmtypes
= TREE_CHAIN (parmtypes
))
1113 pp_separate_with_comma (cxx_pp
);
1117 pp_cxx_identifier (cxx_pp
, "...");
1120 dump_type (TREE_VALUE (parmtypes
), flags
);
1122 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1124 pp_cxx_whitespace (cxx_pp
);
1126 pp_cxx_whitespace (cxx_pp
);
1127 dump_expr (TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1131 pp_cxx_right_paren (cxx_pp
);
1134 /* Print an exception specification. T is the exception specification. */
1137 dump_exception_spec (tree t
, int flags
)
1141 pp_cxx_identifier (cxx_pp
, "throw");
1142 pp_cxx_whitespace (cxx_pp
);
1143 pp_cxx_left_paren (cxx_pp
);
1144 if (TREE_VALUE (t
) != NULL_TREE
)
1147 dump_type (TREE_VALUE (t
), flags
);
1151 pp_separate_with_comma (cxx_pp
);
1153 pp_cxx_right_paren (cxx_pp
);
1157 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1158 and destructors properly. */
1161 dump_function_name (tree t
, int flags
)
1163 tree name
= DECL_NAME (t
);
1165 /* We can get here with a decl that was synthesized by language-
1166 independent machinery (e.g. coverage.c) in which case it won't
1167 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1168 will crash. In this case it is safe just to print out the
1170 if (!DECL_LANG_SPECIFIC (t
))
1172 pp_cxx_tree_identifier (cxx_pp
, name
);
1176 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1177 t
= DECL_TEMPLATE_RESULT (t
);
1179 /* Don't let the user see __comp_ctor et al. */
1180 if (DECL_CONSTRUCTOR_P (t
)
1181 || DECL_DESTRUCTOR_P (t
))
1182 name
= constructor_name (DECL_CONTEXT (t
));
1184 if (DECL_DESTRUCTOR_P (t
))
1186 pp_cxx_complement (cxx_pp
);
1187 dump_decl (name
, TFF_PLAIN_IDENTIFIER
);
1189 else if (DECL_CONV_FN_P (t
))
1191 /* This cannot use the hack that the operator's return
1192 type is stashed off of its name because it may be
1193 used for error reporting. In the case of conflicting
1194 declarations, both will have the same name, yet
1195 the types will be different, hence the TREE_TYPE field
1196 of the first name will be clobbered by the second. */
1197 pp_cxx_identifier (cxx_pp
, "operator");
1198 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1200 else if (IDENTIFIER_OPNAME_P (name
))
1201 pp_cxx_tree_identifier (cxx_pp
, name
);
1203 dump_decl (name
, flags
);
1205 if (DECL_TEMPLATE_INFO (t
)
1206 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1207 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1208 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1209 dump_template_parms (DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
), flags
);
1212 /* Dump the template parameters from the template info INFO under control of
1213 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1214 specialization (partial or complete). For partial specializations we show
1215 the specialized parameter values. For a primary template we show no
1219 dump_template_parms (tree info
, int primary
, int flags
)
1221 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1223 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1225 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1226 pp_cxx_begin_template_argument_list (cxx_pp
);
1228 /* Be careful only to print things when we have them, so as not
1229 to crash producing error messages. */
1230 if (args
&& !primary
)
1234 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args
))
1235 args
= TREE_VEC_ELT (args
, TREE_VEC_LENGTH (args
) - 1);
1237 len
= TREE_VEC_LENGTH (args
);
1239 for (ix
= 0; ix
!= len
; ix
++)
1241 tree arg
= TREE_VEC_ELT (args
, ix
);
1244 pp_separate_with_comma (cxx_pp
);
1247 pp_identifier (cxx_pp
, "<template parameter error>");
1249 dump_template_argument (arg
, flags
);
1254 tree tpl
= TI_TEMPLATE (info
);
1255 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1258 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1259 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1261 for (ix
= 0; ix
!= len
; ix
++)
1265 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1267 pp_identifier (cxx_pp
, "<template parameter error>");
1271 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1274 pp_separate_with_comma (cxx_pp
);
1276 dump_decl (parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1279 pp_cxx_end_template_argument_list (cxx_pp
);
1282 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1283 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1286 dump_call_expr_args (tree t
, int flags
, bool skipfirst
)
1289 call_expr_arg_iterator iter
;
1291 pp_cxx_left_paren (cxx_pp
);
1292 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1298 dump_expr (arg
, flags
| TFF_EXPR_IN_PARENS
);
1299 if (more_call_expr_args_p (&iter
))
1300 pp_separate_with_comma (cxx_pp
);
1303 pp_cxx_right_paren (cxx_pp
);
1306 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1307 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1311 dump_aggr_init_expr_args (tree t
, int flags
, bool skipfirst
)
1314 aggr_init_expr_arg_iterator iter
;
1316 pp_cxx_left_paren (cxx_pp
);
1317 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1323 dump_expr (arg
, flags
| TFF_EXPR_IN_PARENS
);
1324 if (more_aggr_init_expr_args_p (&iter
))
1325 pp_separate_with_comma (cxx_pp
);
1328 pp_cxx_right_paren (cxx_pp
);
1331 /* Print out a list of initializers (subr of dump_expr). */
1334 dump_expr_list (tree l
, int flags
)
1338 dump_expr (TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1341 pp_separate_with_comma (cxx_pp
);
1345 /* Print out a vector of initializers (subr of dump_expr). */
1348 dump_expr_init_vec (VEC(constructor_elt
,gc
) *v
, int flags
)
1350 unsigned HOST_WIDE_INT idx
;
1353 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1355 dump_expr (value
, flags
| TFF_EXPR_IN_PARENS
);
1356 if (idx
!= VEC_length (constructor_elt
, v
) - 1)
1357 pp_separate_with_comma (cxx_pp
);
1362 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1363 function. Resolve it to a close relative -- in the sense of static
1364 type -- variant being overridden. That is close to what was written in
1365 the source code. Subroutine of dump_expr. */
1368 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1370 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1371 int index
= tree_low_cst (OBJ_TYPE_REF_TOKEN (ref
), 1);
1372 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1374 fun
= TREE_CHAIN (fun
);
1379 /* Print out an expression E under control of FLAGS. */
1382 dump_expr (tree t
, int flags
)
1387 switch (TREE_CODE (t
))
1395 case NAMESPACE_DECL
:
1398 case IDENTIFIER_NODE
:
1399 dump_decl (t
, (flags
& ~TFF_DECL_SPECIFIERS
) | TFF_NO_FUNCTION_ARGUMENTS
);
1405 pp_constant (cxx_pp
, t
);
1409 pp_cxx_identifier (cxx_pp
, "throw");
1410 dump_expr (TREE_OPERAND (t
, 0), flags
);
1414 pp_ampersand (cxx_pp
);
1415 dump_type (PTRMEM_CST_CLASS (t
), flags
);
1416 pp_cxx_colon_colon (cxx_pp
);
1417 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1421 pp_cxx_left_paren (cxx_pp
);
1422 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1423 pp_separate_with_comma (cxx_pp
);
1424 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1425 pp_cxx_right_paren (cxx_pp
);
1429 pp_cxx_left_paren (cxx_pp
);
1430 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1431 pp_string (cxx_pp
, " ? ");
1432 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1433 pp_string (cxx_pp
, " : ");
1434 dump_expr (TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
1435 pp_cxx_right_paren (cxx_pp
);
1439 if (TREE_HAS_CONSTRUCTOR (t
))
1441 pp_cxx_identifier (cxx_pp
, "new");
1442 pp_cxx_whitespace (cxx_pp
);
1443 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1446 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1449 case AGGR_INIT_EXPR
:
1451 tree fn
= NULL_TREE
;
1453 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
1454 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
1456 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
1458 if (DECL_CONSTRUCTOR_P (fn
))
1459 dump_type (DECL_CONTEXT (fn
), flags
);
1464 dump_expr (AGGR_INIT_EXPR_FN (t
), 0);
1466 dump_aggr_init_expr_args (t
, flags
, false);
1471 tree fn
= CALL_EXPR_FN (t
);
1472 bool skipfirst
= false;
1474 if (TREE_CODE (fn
) == ADDR_EXPR
)
1475 fn
= TREE_OPERAND (fn
, 0);
1477 /* Nobody is interested in seeing the guts of vcalls. */
1478 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
1479 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
1481 if (TREE_TYPE (fn
) != NULL_TREE
&& NEXT_CODE (fn
) == METHOD_TYPE
)
1483 tree ob
= CALL_EXPR_ARG (t
, 0);
1484 if (TREE_CODE (ob
) == ADDR_EXPR
)
1486 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1489 else if (TREE_CODE (ob
) != PARM_DECL
1490 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1492 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1497 dump_expr (fn
, flags
| TFF_EXPR_IN_PARENS
);
1498 dump_call_expr_args (t
, flags
, skipfirst
);
1504 tree type
= TREE_OPERAND (t
, 1);
1505 tree init
= TREE_OPERAND (t
, 2);
1506 if (NEW_EXPR_USE_GLOBAL (t
))
1507 pp_cxx_colon_colon (cxx_pp
);
1508 pp_cxx_identifier (cxx_pp
, "new");
1509 if (TREE_OPERAND (t
, 0))
1511 pp_cxx_left_paren (cxx_pp
);
1512 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1513 pp_cxx_right_paren (cxx_pp
);
1514 pp_cxx_whitespace (cxx_pp
);
1516 if (TREE_CODE (type
) == ARRAY_REF
)
1517 type
= build_cplus_array_type
1518 (TREE_OPERAND (type
, 0),
1519 build_index_type (fold_build2 (MINUS_EXPR
, integer_type_node
,
1520 TREE_OPERAND (type
, 1),
1521 integer_one_node
)));
1522 dump_type (type
, flags
);
1525 pp_cxx_left_paren (cxx_pp
);
1526 if (TREE_CODE (init
) == TREE_LIST
)
1527 dump_expr_list (init
, flags
);
1528 else if (init
== void_zero_node
)
1529 /* This representation indicates an empty initializer,
1530 e.g.: "new int()". */
1533 dump_expr (init
, flags
);
1534 pp_cxx_right_paren (cxx_pp
);
1540 /* Note that this only works for G++ target exprs. If somebody
1541 builds a general TARGET_EXPR, there's no way to represent that
1542 it initializes anything other that the parameter slot for the
1543 default argument. Note we may have cleared out the first
1544 operand in expand_expr, so don't go killing ourselves. */
1545 if (TREE_OPERAND (t
, 1))
1546 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1554 case TRUNC_DIV_EXPR
:
1555 case TRUNC_MOD_EXPR
:
1563 case TRUTH_ANDIF_EXPR
:
1564 case TRUTH_ORIF_EXPR
:
1571 case EXACT_DIV_EXPR
:
1572 dump_binary_op (operator_name_info
[(int) TREE_CODE (t
)].name
, t
, flags
);
1576 case FLOOR_DIV_EXPR
:
1577 case ROUND_DIV_EXPR
:
1579 dump_binary_op ("/", t
, flags
);
1583 case FLOOR_MOD_EXPR
:
1584 case ROUND_MOD_EXPR
:
1585 dump_binary_op ("%", t
, flags
);
1590 tree ob
= TREE_OPERAND (t
, 0);
1591 if (TREE_CODE (ob
) == INDIRECT_REF
)
1593 ob
= TREE_OPERAND (ob
, 0);
1594 if (TREE_CODE (ob
) != PARM_DECL
1596 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
1598 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1599 pp_cxx_arrow (cxx_pp
);
1604 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1605 pp_cxx_dot (cxx_pp
);
1607 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
1612 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1613 pp_cxx_left_bracket (cxx_pp
);
1614 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1615 pp_cxx_right_bracket (cxx_pp
);
1618 case UNARY_PLUS_EXPR
:
1619 dump_unary_op ("+", t
, flags
);
1623 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
1624 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
1625 /* An ADDR_EXPR can have reference type. In that case, we
1626 shouldn't print the `&' doing so indicates to the user
1627 that the expression has pointer type. */
1629 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
1630 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1631 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
1632 dump_unary_op ("&&", t
, flags
);
1634 dump_unary_op ("&", t
, flags
);
1638 if (TREE_HAS_CONSTRUCTOR (t
))
1640 t
= TREE_OPERAND (t
, 0);
1641 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
1642 dump_expr (CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
1643 dump_call_expr_args (t
, flags
, true);
1647 if (TREE_OPERAND (t
,0) != NULL_TREE
1648 && TREE_TYPE (TREE_OPERAND (t
, 0))
1649 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
1650 dump_expr (TREE_OPERAND (t
, 0), flags
);
1652 dump_unary_op ("*", t
, flags
);
1658 case TRUTH_NOT_EXPR
:
1659 case PREDECREMENT_EXPR
:
1660 case PREINCREMENT_EXPR
:
1661 dump_unary_op (operator_name_info
[(int)TREE_CODE (t
)].name
, t
, flags
);
1664 case POSTDECREMENT_EXPR
:
1665 case POSTINCREMENT_EXPR
:
1666 pp_cxx_left_paren (cxx_pp
);
1667 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1668 pp_cxx_identifier (cxx_pp
, operator_name_info
[(int)TREE_CODE (t
)].name
);
1669 pp_cxx_right_paren (cxx_pp
);
1672 case NON_LVALUE_EXPR
:
1673 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1674 should be another level of INDIRECT_REF so that I don't have to do
1676 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
1678 tree next
= TREE_TYPE (TREE_TYPE (t
));
1680 while (TREE_CODE (next
) == POINTER_TYPE
)
1681 next
= TREE_TYPE (next
);
1683 if (TREE_CODE (next
) == FUNCTION_TYPE
)
1685 if (flags
& TFF_EXPR_IN_PARENS
)
1686 pp_cxx_left_paren (cxx_pp
);
1687 pp_cxx_star (cxx_pp
);
1688 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1689 if (flags
& TFF_EXPR_IN_PARENS
)
1690 pp_cxx_right_paren (cxx_pp
);
1693 /* Else fall through. */
1695 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1701 tree op
= TREE_OPERAND (t
, 0);
1703 if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
1705 /* It is a cast, but we cannot tell whether it is a
1706 reinterpret or static cast. Use the C style notation. */
1707 if (flags
& TFF_EXPR_IN_PARENS
)
1708 pp_cxx_left_paren (cxx_pp
);
1709 pp_cxx_left_paren (cxx_pp
);
1710 dump_type (TREE_TYPE (t
), flags
);
1711 pp_cxx_right_paren (cxx_pp
);
1712 dump_expr (op
, flags
| TFF_EXPR_IN_PARENS
);
1713 if (flags
& TFF_EXPR_IN_PARENS
)
1714 pp_cxx_right_paren (cxx_pp
);
1717 dump_expr (op
, flags
);
1722 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
1724 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
1726 if (integer_zerop (idx
))
1728 /* A NULL pointer-to-member constant. */
1729 pp_cxx_left_paren (cxx_pp
);
1730 pp_cxx_left_paren (cxx_pp
);
1731 dump_type (TREE_TYPE (t
), flags
);
1732 pp_cxx_right_paren (cxx_pp
);
1733 pp_character (cxx_pp
, '0');
1734 pp_cxx_right_paren (cxx_pp
);
1737 else if (host_integerp (idx
, 0))
1740 unsigned HOST_WIDE_INT n
;
1742 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
1743 t
= TYPE_METHOD_BASETYPE (t
);
1744 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
1746 n
= tree_low_cst (idx
, 0);
1748 /* Map vtable index back one, to allow for the null pointer to
1752 while (n
> 0 && virtuals
)
1755 virtuals
= TREE_CHAIN (virtuals
);
1759 dump_expr (BV_FN (virtuals
),
1760 flags
| TFF_EXPR_IN_PARENS
);
1765 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
1767 dump_type (TREE_TYPE (t
), 0);
1768 pp_cxx_left_paren (cxx_pp
);
1769 pp_cxx_right_paren (cxx_pp
);
1773 pp_cxx_left_brace (cxx_pp
);
1774 dump_expr_init_vec (CONSTRUCTOR_ELTS (t
), flags
);
1775 pp_cxx_right_brace (cxx_pp
);
1782 tree ob
= TREE_OPERAND (t
, 0);
1783 if (is_dummy_object (ob
))
1785 t
= TREE_OPERAND (t
, 1);
1786 if (TREE_CODE (t
) == FUNCTION_DECL
)
1788 dump_expr (t
, flags
| TFF_EXPR_IN_PARENS
);
1789 else if (BASELINK_P (t
))
1790 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
1791 flags
| TFF_EXPR_IN_PARENS
);
1793 dump_decl (t
, flags
);
1797 if (TREE_CODE (ob
) == INDIRECT_REF
)
1799 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1800 pp_cxx_arrow (cxx_pp
);
1801 pp_cxx_star (cxx_pp
);
1805 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1806 pp_cxx_dot (cxx_pp
);
1807 pp_cxx_star (cxx_pp
);
1809 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1814 case TEMPLATE_PARM_INDEX
:
1815 dump_decl (TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
1819 pp_expression (cxx_pp
, t
);
1823 if (TREE_OPERAND (t
, 0) == NULL_TREE
1824 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
1826 dump_type (TREE_TYPE (t
), flags
);
1827 pp_cxx_left_paren (cxx_pp
);
1828 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1829 pp_cxx_right_paren (cxx_pp
);
1833 pp_cxx_left_paren (cxx_pp
);
1834 dump_type (TREE_TYPE (t
), flags
);
1835 pp_cxx_right_paren (cxx_pp
);
1836 pp_cxx_left_paren (cxx_pp
);
1837 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1838 pp_cxx_right_paren (cxx_pp
);
1842 case STATIC_CAST_EXPR
:
1843 pp_cxx_identifier (cxx_pp
, "static_cast");
1845 case REINTERPRET_CAST_EXPR
:
1846 pp_cxx_identifier (cxx_pp
, "reinterpret_cast");
1848 case CONST_CAST_EXPR
:
1849 pp_cxx_identifier (cxx_pp
, "const_cast");
1851 case DYNAMIC_CAST_EXPR
:
1852 pp_cxx_identifier (cxx_pp
, "dynamic_cast");
1854 pp_cxx_begin_template_argument_list (cxx_pp
);
1855 dump_type (TREE_TYPE (t
), flags
);
1856 pp_cxx_end_template_argument_list (cxx_pp
);
1857 pp_cxx_left_paren (cxx_pp
);
1858 dump_expr (TREE_OPERAND (t
, 0), flags
);
1859 pp_cxx_right_paren (cxx_pp
);
1863 dump_expr (TREE_OPERAND (t
, 0), flags
);
1864 pp_cxx_arrow (cxx_pp
);
1869 if (TREE_CODE (t
) == SIZEOF_EXPR
)
1870 pp_cxx_identifier (cxx_pp
, "sizeof");
1873 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
1874 pp_cxx_identifier (cxx_pp
, "__alignof__");
1876 pp_cxx_whitespace (cxx_pp
);
1877 pp_cxx_left_paren (cxx_pp
);
1878 if (TYPE_P (TREE_OPERAND (t
, 0)))
1879 dump_type (TREE_OPERAND (t
, 0), flags
);
1881 dump_expr (TREE_OPERAND (t
, 0), flags
);
1882 pp_cxx_right_paren (cxx_pp
);
1887 pp_cxx_identifier (cxx_pp
, operator_name_info
[TREE_CODE (t
)].name
);
1888 pp_cxx_whitespace (cxx_pp
);
1889 dump_expr (TREE_OPERAND (t
, 0), flags
);
1893 pp_identifier (cxx_pp
, "<unparsed>");
1896 case TRY_CATCH_EXPR
:
1897 case WITH_CLEANUP_EXPR
:
1898 case CLEANUP_POINT_EXPR
:
1899 dump_expr (TREE_OPERAND (t
, 0), flags
);
1902 case PSEUDO_DTOR_EXPR
:
1903 dump_expr (TREE_OPERAND (t
, 2), flags
);
1904 pp_cxx_dot (cxx_pp
);
1905 dump_type (TREE_OPERAND (t
, 0), flags
);
1906 pp_cxx_colon_colon (cxx_pp
);
1907 pp_cxx_complement (cxx_pp
);
1908 dump_type (TREE_OPERAND (t
, 1), flags
);
1911 case TEMPLATE_ID_EXPR
:
1912 dump_decl (t
, flags
);
1917 case STATEMENT_LIST
:
1918 /* We don't yet have a way of dumping statements in a
1919 human-readable format. */
1920 pp_string (cxx_pp
, "({...})");
1924 pp_string (cxx_pp
, "while (1) { ");
1925 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1926 pp_cxx_right_brace (cxx_pp
);
1930 pp_string (cxx_pp
, "if (");
1931 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1932 pp_string (cxx_pp
, ") break; ");
1936 dump_expr (get_first_fn (t
), flags
& ~TFF_EXPR_IN_PARENS
);
1939 case EMPTY_CLASS_EXPR
:
1940 dump_type (TREE_TYPE (t
), flags
);
1941 pp_cxx_left_paren (cxx_pp
);
1942 pp_cxx_right_paren (cxx_pp
);
1945 case NON_DEPENDENT_EXPR
:
1946 dump_expr (TREE_OPERAND (t
, 0), flags
);
1949 /* This list is incomplete, but should suffice for now.
1950 It is very important that `sorry' does not call
1951 `report_error_function'. That could cause an infinite loop. */
1953 pp_unsupported_tree (cxx_pp
, t
);
1954 /* fall through to ERROR_MARK... */
1956 pp_identifier (cxx_pp
, "<expression error>");
1962 dump_binary_op (const char *opstring
, tree t
, int flags
)
1964 pp_cxx_left_paren (cxx_pp
);
1965 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1966 pp_cxx_whitespace (cxx_pp
);
1968 pp_cxx_identifier (cxx_pp
, opstring
);
1970 pp_identifier (cxx_pp
, "<unknown operator>");
1971 pp_cxx_whitespace (cxx_pp
);
1972 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1973 pp_cxx_right_paren (cxx_pp
);
1977 dump_unary_op (const char *opstring
, tree t
, int flags
)
1979 if (flags
& TFF_EXPR_IN_PARENS
)
1980 pp_cxx_left_paren (cxx_pp
);
1981 pp_cxx_identifier (cxx_pp
, opstring
);
1982 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1983 if (flags
& TFF_EXPR_IN_PARENS
)
1984 pp_cxx_right_paren (cxx_pp
);
1988 reinit_cxx_pp (void)
1990 pp_clear_output_area (cxx_pp
);
1991 pp_base (cxx_pp
)->padding
= pp_none
;
1992 pp_indentation (cxx_pp
) = 0;
1993 pp_needs_newline (cxx_pp
) = false;
1994 cxx_pp
->enclosing_scope
= 0;
1998 /* Exported interface to stringifying types, exprs and decls under TFF_*
2002 type_as_string (tree typ
, int flags
)
2005 dump_type (typ
, flags
);
2006 return pp_formatted_text (cxx_pp
);
2010 expr_as_string (tree decl
, int flags
)
2013 dump_expr (decl
, flags
);
2014 return pp_formatted_text (cxx_pp
);
2018 decl_as_string (tree decl
, int flags
)
2021 dump_decl (decl
, flags
);
2022 return pp_formatted_text (cxx_pp
);
2025 /* Generate the three forms of printable names for cxx_printable_name. */
2028 lang_decl_name (tree decl
, int v
)
2031 return decl_as_string (decl
, TFF_DECL_SPECIFIERS
);
2034 if (v
== 1 && DECL_CLASS_SCOPE_P (decl
))
2036 dump_type (CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2037 pp_cxx_colon_colon (cxx_pp
);
2040 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2041 dump_function_name (decl
, TFF_PLAIN_IDENTIFIER
);
2043 dump_decl (DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2045 return pp_formatted_text (cxx_pp
);
2048 /* Return the location of a tree passed to %+ formats. */
2051 location_of (tree t
)
2053 if (TREE_CODE (t
) == PARM_DECL
&& DECL_CONTEXT (t
))
2054 t
= DECL_CONTEXT (t
);
2055 else if (TYPE_P (t
))
2056 t
= TYPE_MAIN_DECL (t
);
2057 else if (TREE_CODE (t
) == OVERLOAD
)
2058 t
= OVL_FUNCTION (t
);
2060 return DECL_SOURCE_LOCATION (t
);
2063 /* Now the interfaces from error et al to dump_type et al. Each takes an
2064 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2068 decl_to_string (tree decl
, int verbose
)
2072 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2073 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2074 flags
= TFF_CLASS_KEY_OR_ENUM
;
2076 flags
|= TFF_DECL_SPECIFIERS
;
2077 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2078 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2079 flags
|= TFF_TEMPLATE_HEADER
;
2082 dump_decl (decl
, flags
);
2083 return pp_formatted_text (cxx_pp
);
2087 expr_to_string (tree decl
)
2090 dump_expr (decl
, 0);
2091 return pp_formatted_text (cxx_pp
);
2095 fndecl_to_string (tree fndecl
, int verbose
)
2099 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2100 | TFF_TEMPLATE_HEADER
;
2102 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2104 dump_decl (fndecl
, flags
);
2105 return pp_formatted_text (cxx_pp
);
2110 code_to_string (enum tree_code c
)
2112 return tree_code_name
[c
];
2116 language_to_string (enum languages c
)
2123 case lang_cplusplus
:
2135 /* Return the proper printed version of a parameter to a C++ function. */
2138 parm_to_string (int p
)
2142 pp_string (cxx_pp
, "'this'");
2144 pp_decimal_int (cxx_pp
, p
+ 1);
2145 return pp_formatted_text (cxx_pp
);
2149 op_to_string (enum tree_code p
)
2151 tree id
= operator_name_info
[(int) p
].identifier
;
2152 return id
? IDENTIFIER_POINTER (id
) : "<unknown>";
2156 type_to_string (tree typ
, int verbose
)
2160 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2161 flags
|= TFF_TEMPLATE_HEADER
;
2164 dump_type (typ
, flags
);
2165 return pp_formatted_text (cxx_pp
);
2169 assop_to_string (enum tree_code p
)
2171 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
2172 return id
? IDENTIFIER_POINTER (id
) : "{unknown}";
2176 args_to_string (tree p
, int verbose
)
2180 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2185 if (TYPE_P (TREE_VALUE (p
)))
2186 return type_as_string (p
, flags
);
2189 for (; p
; p
= TREE_CHAIN (p
))
2191 if (TREE_VALUE (p
) == null_node
)
2192 pp_cxx_identifier (cxx_pp
, "NULL");
2194 dump_type (error_type (TREE_VALUE (p
)), flags
);
2196 pp_separate_with_comma (cxx_pp
);
2198 return pp_formatted_text (cxx_pp
);
2202 cv_to_string (tree p
, int v
)
2205 pp_base (cxx_pp
)->padding
= v
? pp_before
: pp_none
;
2206 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
2207 return pp_formatted_text (cxx_pp
);
2210 /* Langhook for print_error_function. */
2212 cxx_print_error_function (diagnostic_context
*context
, const char *file
)
2214 lhd_print_error_function (context
, file
);
2215 pp_base_set_prefix (context
->printer
, file
);
2216 maybe_print_instantiation_context (context
);
2220 cp_diagnostic_starter (diagnostic_context
*context
,
2221 diagnostic_info
*diagnostic
)
2223 diagnostic_report_current_module (context
);
2224 cp_print_error_function (context
, diagnostic
);
2225 maybe_print_instantiation_context (context
);
2226 pp_base_set_prefix (context
->printer
, diagnostic_build_prefix (diagnostic
));
2230 cp_diagnostic_finalizer (diagnostic_context
*context
,
2231 diagnostic_info
*diagnostic ATTRIBUTE_UNUSED
)
2233 pp_base_destroy_prefix (context
->printer
);
2236 /* Print current function onto BUFFER, in the process of reporting
2237 a diagnostic message. Called from cp_diagnostic_starter. */
2239 cp_print_error_function (diagnostic_context
*context
,
2240 diagnostic_info
*diagnostic
)
2242 if (diagnostic_last_function_changed (context
))
2244 const char *old_prefix
= context
->printer
->prefix
;
2245 const char *file
= LOCATION_FILE (diagnostic
->location
);
2246 char *new_prefix
= file
? file_name_as_prefix (file
) : NULL
;
2248 pp_base_set_prefix (context
->printer
, new_prefix
);
2250 if (current_function_decl
== NULL
)
2251 pp_base_string (context
->printer
, "At global scope:");
2253 pp_printf (context
->printer
, "In %s %qs:",
2254 function_category (current_function_decl
),
2255 cxx_printable_name (current_function_decl
, 2));
2256 pp_base_newline (context
->printer
);
2258 diagnostic_set_last_function (context
);
2259 pp_base_destroy_prefix (context
->printer
);
2260 context
->printer
->prefix
= old_prefix
;
2264 /* Returns a description of FUNCTION using standard terminology. */
2266 function_category (tree fn
)
2268 if (DECL_FUNCTION_MEMBER_P (fn
))
2270 if (DECL_STATIC_FUNCTION_P (fn
))
2271 return "static member function";
2272 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
2273 return "copy constructor";
2274 else if (DECL_CONSTRUCTOR_P (fn
))
2275 return "constructor";
2276 else if (DECL_DESTRUCTOR_P (fn
))
2277 return "destructor";
2279 return "member function";
2285 /* Report the full context of a current template instantiation,
2288 print_instantiation_full_context (diagnostic_context
*context
)
2290 tree p
= current_instantiation ();
2291 location_t location
= input_location
;
2295 if (current_function_decl
!= TINST_DECL (p
)
2296 && current_function_decl
!= NULL_TREE
)
2297 /* We can get here during the processing of some synthesized
2298 method. Then, TINST_DECL (p) will be the function that's causing
2303 if (current_function_decl
== TINST_DECL (p
))
2304 /* Avoid redundancy with the "In function" line. */;
2306 pp_verbatim (context
->printer
,
2307 "%s: In instantiation of %qs:\n",
2308 LOCATION_FILE (location
),
2309 decl_as_string (TINST_DECL (p
),
2310 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2312 location
= TINST_LOCATION (p
);
2317 print_instantiation_partial_context (context
, p
, location
);
2320 /* Same as above but less verbose. */
2322 print_instantiation_partial_context (diagnostic_context
*context
,
2323 tree t
, location_t loc
)
2325 expanded_location xloc
;
2326 for (; ; t
= TREE_CHAIN (t
))
2328 xloc
= expand_location (loc
);
2331 pp_verbatim (context
->printer
, "%s:%d: instantiated from %qs\n",
2332 xloc
.file
, xloc
.line
,
2333 decl_as_string (TINST_DECL (t
),
2334 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2335 loc
= TINST_LOCATION (t
);
2337 pp_verbatim (context
->printer
, "%s:%d: instantiated from here",
2338 xloc
.file
, xloc
.line
);
2339 pp_base_newline (context
->printer
);
2342 /* Called from cp_thing to print the template context for an error. */
2344 maybe_print_instantiation_context (diagnostic_context
*context
)
2346 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2349 record_last_problematic_instantiation ();
2350 print_instantiation_full_context (context
);
2353 /* Report the bare minimum context of a template instantiation. */
2355 print_instantiation_context (void)
2357 print_instantiation_partial_context
2358 (global_dc
, current_instantiation (), input_location
);
2359 diagnostic_flush_buffer (global_dc
);
2362 /* Called from output_format -- during diagnostic message processing --
2363 to handle C++ specific format specifier with the following meanings:
2364 %A function argument-list.
2368 %F function declaration.
2369 %L language as used in extern "lang".
2371 %P function parameter whose position is indicated by an integer.
2372 %Q assignment operator.
2376 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
2377 int precision
, bool wide
, bool set_locus
, bool verbose
)
2381 #define next_tree (t = va_arg (*text->args_ptr, tree))
2382 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2383 #define next_lang va_arg (*text->args_ptr, enum languages)
2384 #define next_int va_arg (*text->args_ptr, int)
2386 if (precision
!= 0 || wide
)
2389 if (text
->locus
== NULL
)
2394 case 'A': result
= args_to_string (next_tree
, verbose
); break;
2395 case 'C': result
= code_to_string (next_tcode
); break;
2398 tree temp
= next_tree
;
2400 && DECL_DEBUG_EXPR_IS_FROM (temp
) && DECL_DEBUG_EXPR (temp
))
2402 temp
= DECL_DEBUG_EXPR (temp
);
2405 result
= expr_to_string (temp
);
2409 result
= decl_to_string (temp
, verbose
);
2412 case 'E': result
= expr_to_string (next_tree
); break;
2413 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
2414 case 'L': result
= language_to_string (next_lang
); break;
2415 case 'O': result
= op_to_string (next_tcode
); break;
2416 case 'P': result
= parm_to_string (next_int
); break;
2417 case 'Q': result
= assop_to_string (next_tcode
); break;
2418 case 'T': result
= type_to_string (next_tree
, verbose
); break;
2419 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
2425 pp_base_string (pp
, result
);
2426 if (set_locus
&& t
!= NULL
)
2427 *text
->locus
= location_of (t
);
2435 /* Callback from cpp_error for PFILE to print diagnostics arising from
2436 interpreting strings. The diagnostic is of type LEVEL; MSG is the
2437 translated message and AP the arguments. */
2440 cp_cpp_error (cpp_reader
*pfile ATTRIBUTE_UNUSED
, int level
,
2441 const char *msg
, va_list *ap
)
2443 diagnostic_info diagnostic
;
2444 diagnostic_t dlevel
;
2447 case CPP_DL_WARNING
:
2448 case CPP_DL_WARNING_SYSHDR
:
2449 dlevel
= DK_WARNING
;
2451 case CPP_DL_PEDWARN
:
2452 dlevel
= pedantic_error_kind ();
2463 diagnostic_set_info_translated (&diagnostic
, msg
, ap
,
2464 input_location
, dlevel
);
2465 report_diagnostic (&diagnostic
);