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, 2008 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 3, 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 COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
30 #include "diagnostic.h"
31 #include "langhooks-def.h"
32 #include "cxx-pretty-print.h"
34 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
36 /* The global buffer where we dump everything. It is there only for
37 transitional purpose. It is expected, in the near future, to be
38 completely removed. */
39 static cxx_pretty_printer scratch_pretty_printer
;
40 #define cxx_pp (&scratch_pretty_printer)
42 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
44 static const char *args_to_string (tree
, int);
45 static const char *assop_to_string (enum tree_code
);
46 static const char *code_to_string (enum tree_code
);
47 static const char *cv_to_string (tree
, int);
48 static const char *decl_to_string (tree
, int);
49 static const char *expr_to_string (tree
);
50 static const char *fndecl_to_string (tree
, int);
51 static const char *op_to_string (enum tree_code
);
52 static const char *parm_to_string (int);
53 static const char *type_to_string (tree
, int);
55 static void dump_type (tree
, int);
56 static void dump_typename (tree
, int);
57 static void dump_simple_decl (tree
, tree
, int);
58 static void dump_decl (tree
, int);
59 static void dump_template_decl (tree
, int);
60 static void dump_function_decl (tree
, int);
61 static void dump_expr (tree
, int);
62 static void dump_unary_op (const char *, tree
, int);
63 static void dump_binary_op (const char *, tree
, int);
64 static void dump_aggr_type (tree
, int);
65 static void dump_type_prefix (tree
, int);
66 static void dump_type_suffix (tree
, int);
67 static void dump_function_name (tree
, int);
68 static void dump_call_expr_args (tree
, int, bool);
69 static void dump_aggr_init_expr_args (tree
, int, bool);
70 static void dump_expr_list (tree
, int);
71 static void dump_global_iord (tree
);
72 static void dump_parameters (tree
, int);
73 static void dump_exception_spec (tree
, int);
74 static void dump_template_argument (tree
, int);
75 static void dump_template_argument_list (tree
, int);
76 static void dump_template_parameter (tree
, int);
77 static void dump_template_bindings (tree
, tree
);
78 static void dump_scope (tree
, int);
79 static void dump_template_parms (tree
, int, int);
81 static const char *function_category (tree
);
82 static void maybe_print_instantiation_context (diagnostic_context
*);
83 static void print_instantiation_full_context (diagnostic_context
*);
84 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 (ARGUMENT_PACK_P (arg
))
142 dump_template_argument_list (ARGUMENT_PACK_ARGS (arg
), flags
);
143 else if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
144 dump_type (arg
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
147 if (TREE_CODE (arg
) == TREE_LIST
)
148 arg
= TREE_VALUE (arg
);
150 dump_expr (arg
, (flags
| TFF_EXPR_IN_PARENS
) & ~TFF_CLASS_KEY_OR_ENUM
);
154 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
158 dump_template_argument_list (tree args
, int flags
)
160 int n
= TREE_VEC_LENGTH (args
);
164 for (i
= 0; i
< n
; ++i
)
166 tree arg
= TREE_VEC_ELT (args
, i
);
168 /* Only print a comma if we know there is an argument coming. In
169 the case of an empty template argument pack, no actual
170 argument will be printed. */
172 && (!ARGUMENT_PACK_P (arg
)
173 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
174 pp_separate_with_comma (cxx_pp
);
176 dump_template_argument (arg
, flags
);
181 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
184 dump_template_parameter (tree parm
, int flags
)
189 if (parm
== error_mark_node
)
192 p
= TREE_VALUE (parm
);
193 a
= TREE_PURPOSE (parm
);
195 if (TREE_CODE (p
) == TYPE_DECL
)
197 if (flags
& TFF_DECL_SPECIFIERS
)
199 pp_cxx_identifier (cxx_pp
, "class");
200 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p
)))
201 pp_cxx_identifier (cxx_pp
, "...");
203 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (p
));
205 else if (DECL_NAME (p
))
206 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (p
));
208 pp_cxx_canonical_template_parameter (cxx_pp
, TREE_TYPE (p
));
211 dump_decl (p
, flags
| TFF_DECL_SPECIFIERS
);
213 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && a
!= NULL_TREE
)
215 pp_cxx_whitespace (cxx_pp
);
217 pp_cxx_whitespace (cxx_pp
);
218 if (TREE_CODE (p
) == TYPE_DECL
|| TREE_CODE (p
) == TEMPLATE_DECL
)
219 dump_type (a
, flags
& ~TFF_CHASE_TYPEDEF
);
221 dump_expr (a
, flags
| TFF_EXPR_IN_PARENS
);
225 /* Dump, under control of FLAGS, a template-parameter-list binding.
226 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
230 dump_template_bindings (tree parms
, tree args
)
236 tree p
= TREE_VALUE (parms
);
237 int lvl
= TMPL_PARMS_DEPTH (parms
);
241 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
243 tree arg
= NULL_TREE
;
245 /* Don't crash if we had an invalid argument list. */
246 if (TMPL_ARGS_DEPTH (args
) >= lvl
)
248 tree lvl_args
= TMPL_ARGS_LEVEL (args
, lvl
);
249 if (NUM_TMPL_ARGS (lvl_args
) > arg_idx
)
250 arg
= TREE_VEC_ELT (lvl_args
, arg_idx
);
254 pp_separate_with_comma (cxx_pp
);
255 dump_template_parameter (TREE_VEC_ELT (p
, i
), TFF_PLAIN_IDENTIFIER
);
256 pp_cxx_whitespace (cxx_pp
);
258 pp_cxx_whitespace (cxx_pp
);
260 dump_template_argument (arg
, TFF_PLAIN_IDENTIFIER
);
262 pp_identifier (cxx_pp
, "<missing>");
268 parms
= TREE_CHAIN (parms
);
272 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
276 dump_type (tree t
, int flags
)
281 if (TYPE_PTRMEMFUNC_P (t
))
284 switch (TREE_CODE (t
))
287 pp_identifier (cxx_pp
, "<unresolved overloaded function type>");
291 /* A list of function parms. */
292 dump_parameters (t
, flags
);
295 case IDENTIFIER_NODE
:
296 pp_cxx_tree_identifier (cxx_pp
, t
);
300 dump_type (BINFO_TYPE (t
), flags
);
306 dump_aggr_type (t
, flags
);
310 if (flags
& TFF_CHASE_TYPEDEF
)
312 dump_type (DECL_ORIGINAL_TYPE (t
)
313 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
316 /* Else fall through. */
320 dump_decl (t
, flags
& ~TFF_DECL_SPECIFIERS
);
329 case FIXED_POINT_TYPE
:
330 pp_type_specifier_seq (cxx_pp
, t
);
333 case TEMPLATE_TEMPLATE_PARM
:
334 /* For parameters inside template signature. */
335 if (TYPE_IDENTIFIER (t
))
336 pp_cxx_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
338 pp_cxx_canonical_template_parameter (cxx_pp
, t
);
341 case BOUND_TEMPLATE_TEMPLATE_PARM
:
343 tree args
= TYPE_TI_ARGS (t
);
344 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
345 pp_cxx_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
346 pp_cxx_begin_template_argument_list (cxx_pp
);
347 dump_template_argument_list (args
, flags
);
348 pp_cxx_end_template_argument_list (cxx_pp
);
352 case TEMPLATE_TYPE_PARM
:
353 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
354 if (TYPE_IDENTIFIER (t
))
355 pp_cxx_tree_identifier (cxx_pp
, TYPE_IDENTIFIER (t
));
357 pp_cxx_canonical_template_parameter
358 (cxx_pp
, TEMPLATE_TYPE_PARM_INDEX (t
));
361 /* This is not always necessary for pointers and such, but doing this
362 reduces code size. */
371 dump_type_prefix (t
, flags
);
372 dump_type_suffix (t
, flags
);
376 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
377 pp_cxx_identifier (cxx_pp
,
378 TYPENAME_IS_ENUM_P (t
) ? "enum"
379 : TYPENAME_IS_CLASS_P (t
) ? "class"
381 dump_typename (t
, flags
);
384 case UNBOUND_CLASS_TEMPLATE
:
385 dump_type (TYPE_CONTEXT (t
), flags
);
386 pp_cxx_colon_colon (cxx_pp
);
387 pp_cxx_identifier (cxx_pp
, "template");
388 dump_type (DECL_NAME (TYPE_NAME (t
)), flags
);
392 pp_cxx_identifier (cxx_pp
, "__typeof__");
393 pp_cxx_whitespace (cxx_pp
);
394 pp_cxx_left_paren (cxx_pp
);
395 dump_expr (TYPEOF_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
396 pp_cxx_right_paren (cxx_pp
);
399 case TYPE_PACK_EXPANSION
:
400 dump_type (PACK_EXPANSION_PATTERN (t
), flags
);
401 pp_cxx_identifier (cxx_pp
, "...");
404 case TYPE_ARGUMENT_PACK
:
405 dump_template_argument (t
, flags
);
409 pp_cxx_identifier (cxx_pp
, "decltype");
410 pp_cxx_whitespace (cxx_pp
);
411 pp_cxx_left_paren (cxx_pp
);
412 dump_expr (DECLTYPE_TYPE_EXPR (t
), flags
& ~TFF_EXPR_IN_PARENS
);
413 pp_cxx_right_paren (cxx_pp
);
417 pp_unsupported_tree (cxx_pp
, t
);
418 /* Fall through to error. */
421 pp_identifier (cxx_pp
, "<type error>");
426 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
430 dump_typename (tree t
, int flags
)
432 tree ctx
= TYPE_CONTEXT (t
);
434 if (TREE_CODE (ctx
) == TYPENAME_TYPE
)
435 dump_typename (ctx
, flags
);
437 dump_type (ctx
, flags
& ~TFF_CLASS_KEY_OR_ENUM
);
438 pp_cxx_colon_colon (cxx_pp
);
439 dump_decl (TYPENAME_TYPE_FULLNAME (t
), flags
);
442 /* Return the name of the supplied aggregate, or enumeral type. */
445 class_key_or_enum_as_string (tree t
)
447 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
449 else if (TREE_CODE (t
) == UNION_TYPE
)
451 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
457 /* Print out a class declaration T under the control of FLAGS,
458 in the form `class foo'. */
461 dump_aggr_type (tree t
, int flags
)
464 const char *variety
= class_key_or_enum_as_string (t
);
468 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
470 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
471 pp_cxx_identifier (cxx_pp
, variety
);
473 if (flags
& TFF_CHASE_TYPEDEF
)
474 t
= TYPE_MAIN_VARIANT (t
);
476 name
= TYPE_NAME (t
);
480 typdef
= !DECL_ARTIFICIAL (name
);
481 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
482 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
483 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
484 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
486 if (! (flags
& TFF_UNQUALIFIED_NAME
))
487 dump_scope (CP_DECL_CONTEXT (name
), flags
| TFF_SCOPE
);
488 flags
&= ~TFF_UNQUALIFIED_NAME
;
491 /* Because the template names are mangled, we have to locate
492 the most general template, and use that name. */
493 tree tpl
= CLASSTYPE_TI_TEMPLATE (t
);
495 while (DECL_TEMPLATE_INFO (tpl
))
496 tpl
= DECL_TI_TEMPLATE (tpl
);
499 name
= DECL_NAME (name
);
502 if (name
== 0 || ANON_AGGRNAME_P (name
))
504 if (flags
& TFF_CLASS_KEY_OR_ENUM
)
505 pp_identifier (cxx_pp
, "<anonymous>");
507 pp_printf (pp_base (cxx_pp
), "<anonymous %s>", variety
);
510 pp_cxx_tree_identifier (cxx_pp
, name
);
512 dump_template_parms (TYPE_TEMPLATE_INFO (t
),
513 !CLASSTYPE_USE_TEMPLATE (t
),
514 flags
& ~TFF_TEMPLATE_HEADER
);
517 /* Dump into the obstack the initial part of the output for a given type.
518 This is necessary when dealing with things like functions returning
521 return type of `int (* fee ())()': pointer -> function -> int. Both
522 pointer (and reference and offset) and function (and member) types must
523 deal with prefix and suffix.
525 Arrays must also do this for DECL nodes, like int a[], and for things like
529 dump_type_prefix (tree t
, int flags
)
531 if (TYPE_PTRMEMFUNC_P (t
))
533 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
537 switch (TREE_CODE (t
))
542 tree sub
= TREE_TYPE (t
);
544 dump_type_prefix (sub
, flags
);
545 if (TREE_CODE (sub
) == ARRAY_TYPE
)
547 pp_cxx_whitespace (cxx_pp
);
548 pp_cxx_left_paren (cxx_pp
);
550 if (TREE_CODE (t
) == POINTER_TYPE
)
551 pp_character(cxx_pp
, '*');
552 else if (TREE_CODE (t
) == REFERENCE_TYPE
)
554 if (TYPE_REF_IS_RVALUE (t
))
555 pp_string (cxx_pp
, "&&");
557 pp_character (cxx_pp
, '&');
559 pp_base (cxx_pp
)->padding
= pp_before
;
560 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
566 dump_type_prefix (TREE_TYPE (t
), flags
);
567 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
569 pp_maybe_space (cxx_pp
);
570 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
571 pp_cxx_left_paren (cxx_pp
);
572 dump_type (TYPE_OFFSET_BASETYPE (t
), flags
);
573 pp_cxx_colon_colon (cxx_pp
);
575 pp_cxx_star (cxx_pp
);
576 pp_cxx_cv_qualifier_seq (cxx_pp
, t
);
577 pp_base (cxx_pp
)->padding
= pp_before
;
580 /* Can only be reached through function pointer -- this would not be
581 correct if FUNCTION_DECLs used it. */
583 dump_type_prefix (TREE_TYPE (t
), flags
);
584 pp_maybe_space (cxx_pp
);
585 pp_cxx_left_paren (cxx_pp
);
589 dump_type_prefix (TREE_TYPE (t
), flags
);
590 pp_maybe_space (cxx_pp
);
591 pp_cxx_left_paren (cxx_pp
);
592 dump_aggr_type (TYPE_METHOD_BASETYPE (t
), flags
);
593 pp_cxx_colon_colon (cxx_pp
);
597 dump_type_prefix (TREE_TYPE (t
), flags
);
601 case IDENTIFIER_NODE
:
606 case TEMPLATE_TYPE_PARM
:
607 case TEMPLATE_TEMPLATE_PARM
:
608 case BOUND_TEMPLATE_TEMPLATE_PARM
:
620 case TYPE_PACK_EXPANSION
:
621 dump_type (t
, flags
);
622 pp_base (cxx_pp
)->padding
= pp_before
;
626 pp_unsupported_tree (cxx_pp
, t
);
629 pp_identifier (cxx_pp
, "<typeprefixerror>");
634 /* Dump the suffix of type T, under control of FLAGS. This is the part
635 which appears after the identifier (or function parms). */
638 dump_type_suffix (tree t
, int flags
)
640 if (TYPE_PTRMEMFUNC_P (t
))
641 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
643 switch (TREE_CODE (t
))
648 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
649 pp_cxx_right_paren (cxx_pp
);
650 dump_type_suffix (TREE_TYPE (t
), flags
);
653 /* Can only be reached through function pointer. */
658 pp_cxx_right_paren (cxx_pp
);
659 arg
= TYPE_ARG_TYPES (t
);
660 if (TREE_CODE (t
) == METHOD_TYPE
)
661 arg
= TREE_CHAIN (arg
);
663 /* Function pointers don't have default args. Not in standard C++,
664 anyway; they may in g++, but we'll just pretend otherwise. */
665 dump_parameters (arg
, flags
& ~TFF_FUNCTION_DEFAULT_ARGUMENTS
);
667 if (TREE_CODE (t
) == METHOD_TYPE
)
668 pp_cxx_cv_qualifier_seq
669 (cxx_pp
, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t
))));
671 pp_cxx_cv_qualifier_seq(cxx_pp
, t
);
672 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t
), flags
);
673 dump_type_suffix (TREE_TYPE (t
), flags
);
678 pp_maybe_space (cxx_pp
);
679 pp_cxx_left_bracket (cxx_pp
);
682 tree dtype
= TYPE_DOMAIN (t
);
683 tree max
= TYPE_MAX_VALUE (dtype
);
684 if (host_integerp (max
, 0))
685 pp_wide_integer (cxx_pp
, tree_low_cst (max
, 0) + 1);
686 else if (TREE_CODE (max
) == MINUS_EXPR
)
687 dump_expr (TREE_OPERAND (max
, 0),
688 flags
& ~TFF_EXPR_IN_PARENS
);
690 dump_expr (fold_build2 (PLUS_EXPR
, dtype
, max
,
691 build_int_cst (dtype
, 1)),
692 flags
& ~TFF_EXPR_IN_PARENS
);
694 pp_cxx_right_bracket (cxx_pp
);
695 dump_type_suffix (TREE_TYPE (t
), flags
);
699 case IDENTIFIER_NODE
:
704 case TEMPLATE_TYPE_PARM
:
705 case TEMPLATE_TEMPLATE_PARM
:
706 case BOUND_TEMPLATE_TEMPLATE_PARM
:
718 case TYPE_PACK_EXPANSION
:
722 pp_unsupported_tree (cxx_pp
, t
);
724 /* Don't mark it here, we should have already done in
731 dump_global_iord (tree t
)
733 const char *p
= NULL
;
735 if (DECL_GLOBAL_CTOR_P (t
))
737 else if (DECL_GLOBAL_DTOR_P (t
))
742 pp_printf (pp_base (cxx_pp
), "(static %s for %s)", p
, input_filename
);
746 dump_simple_decl (tree t
, tree type
, int flags
)
748 if (flags
& TFF_DECL_SPECIFIERS
)
750 dump_type_prefix (type
, flags
& ~TFF_UNQUALIFIED_NAME
);
751 pp_maybe_space (cxx_pp
);
753 if (! (flags
& TFF_UNQUALIFIED_NAME
)
754 && (!DECL_INITIAL (t
)
755 || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
))
756 dump_scope (CP_DECL_CONTEXT (t
), flags
);
757 flags
&= ~TFF_UNQUALIFIED_NAME
;
758 if ((flags
& TFF_DECL_SPECIFIERS
)
759 && DECL_TEMPLATE_PARM_P (t
)
760 && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t
)))
761 pp_identifier (cxx_pp
, "...");
763 dump_decl (DECL_NAME (t
), flags
);
765 pp_identifier (cxx_pp
, "<anonymous>");
766 if (flags
& TFF_DECL_SPECIFIERS
)
767 dump_type_suffix (type
, flags
);
770 /* Dump a human readable string for the decl T under control of FLAGS. */
773 dump_decl (tree t
, int flags
)
778 switch (TREE_CODE (t
))
781 /* Don't say 'typedef class A' */
782 if (DECL_ARTIFICIAL (t
))
784 if ((flags
& TFF_DECL_SPECIFIERS
)
785 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
787 /* Say `class T' not just `T'. */
788 pp_cxx_identifier (cxx_pp
, "class");
790 /* Emit the `...' for a parameter pack. */
791 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
792 pp_cxx_identifier (cxx_pp
, "...");
795 dump_type (TREE_TYPE (t
), flags
);
798 if (flags
& TFF_DECL_SPECIFIERS
)
799 pp_cxx_identifier (cxx_pp
, "typedef");
800 dump_simple_decl (t
, DECL_ORIGINAL_TYPE (t
)
801 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
806 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
808 pp_string (cxx_pp
, "vtable for ");
809 gcc_assert (TYPE_P (DECL_CONTEXT (t
)));
810 dump_type (DECL_CONTEXT (t
), flags
);
813 /* Else fall through. */
816 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
820 pp_string (cxx_pp
, "<return value> ");
821 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
825 if (flags
& TFF_DECL_SPECIFIERS
)
826 pp_cxx_declaration (cxx_pp
, t
);
829 if (! (flags
& TFF_UNQUALIFIED_NAME
))
830 dump_scope (CP_DECL_CONTEXT (t
), flags
);
831 flags
&= ~TFF_UNQUALIFIED_NAME
;
832 if (DECL_NAME (t
) == NULL_TREE
)
833 pp_identifier (cxx_pp
, "<unnamed>");
835 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (t
));
840 pp_expression (cxx_pp
, t
);
844 dump_decl (TREE_OPERAND (t
, 0), flags
);
845 pp_cxx_left_bracket (cxx_pp
);
846 dump_decl (TREE_OPERAND (t
, 1), flags
);
847 pp_cxx_right_bracket (cxx_pp
);
850 /* So that we can do dump_decl on an aggr type. */
854 dump_type (t
, flags
);
858 /* This is a pseudo destructor call which has not been folded into
859 a PSEUDO_DTOR_EXPR yet. */
860 pp_cxx_complement (cxx_pp
);
861 dump_type (TREE_OPERAND (t
, 0), flags
);
868 /* These special cases are duplicated here so that other functions
869 can feed identifiers to error and get them demangled properly. */
870 case IDENTIFIER_NODE
:
871 if (IDENTIFIER_TYPENAME_P (t
))
873 pp_cxx_identifier (cxx_pp
, "operator");
874 /* Not exactly IDENTIFIER_TYPE_VALUE. */
875 dump_type (TREE_TYPE (t
), flags
);
879 pp_cxx_tree_identifier (cxx_pp
, t
);
886 if (DECL_CLASS_SCOPE_P (t
))
888 dump_type (DECL_CONTEXT (t
), flags
);
889 pp_cxx_colon_colon (cxx_pp
);
891 else if (DECL_CONTEXT (t
))
893 dump_decl (DECL_CONTEXT (t
), flags
);
894 pp_cxx_colon_colon (cxx_pp
);
896 dump_decl (DECL_NAME (t
), flags
);
900 /* If there's only one function, just treat it like an ordinary
906 if (! DECL_LANG_SPECIFIC (t
))
907 pp_identifier (cxx_pp
, "<built-in>");
908 else if (DECL_GLOBAL_CTOR_P (t
) || DECL_GLOBAL_DTOR_P (t
))
909 dump_global_iord (t
);
911 dump_function_decl (t
, flags
);
915 dump_template_decl (t
, flags
);
918 case TEMPLATE_ID_EXPR
:
920 tree name
= TREE_OPERAND (t
, 0);
922 if (is_overloaded_fn (name
))
923 name
= DECL_NAME (get_first_fn (name
));
924 dump_decl (name
, flags
);
925 pp_cxx_begin_template_argument_list (cxx_pp
);
926 if (TREE_OPERAND (t
, 1))
927 dump_template_argument_list (TREE_OPERAND (t
, 1), flags
);
928 pp_cxx_end_template_argument_list (cxx_pp
);
933 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (t
));
937 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
938 || (DECL_INITIAL (t
) &&
939 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
940 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
941 else if (DECL_NAME (t
))
942 dump_decl (DECL_NAME (t
), flags
);
943 else if (DECL_INITIAL (t
))
944 dump_expr (DECL_INITIAL (t
), flags
| TFF_EXPR_IN_PARENS
);
946 pp_identifier (cxx_pp
, "<enumerator>");
950 pp_cxx_identifier (cxx_pp
, "using");
951 dump_type (USING_DECL_SCOPE (t
), flags
);
952 pp_cxx_colon_colon (cxx_pp
);
953 dump_decl (DECL_NAME (t
), flags
);
957 pp_cxx_declaration (cxx_pp
, t
);
961 dump_decl (BASELINK_FUNCTIONS (t
), flags
);
964 case NON_DEPENDENT_EXPR
:
965 dump_expr (t
, flags
);
968 case TEMPLATE_TYPE_PARM
:
969 if (flags
& TFF_DECL_SPECIFIERS
)
970 pp_cxx_declaration (cxx_pp
, t
);
972 pp_type_id (cxx_pp
, t
);
975 case UNBOUND_CLASS_TEMPLATE
:
976 case TYPE_PACK_EXPANSION
:
978 dump_type (t
, flags
);
982 pp_unsupported_tree (cxx_pp
, t
);
983 /* Fall through to error. */
986 pp_identifier (cxx_pp
, "<declaration error>");
991 /* Dump a template declaration T under control of FLAGS. This means the
992 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
995 dump_template_decl (tree t
, int flags
)
997 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1001 if (flags
& TFF_TEMPLATE_HEADER
)
1003 for (parms
= orig_parms
= nreverse (orig_parms
);
1005 parms
= TREE_CHAIN (parms
))
1007 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1008 int len
= TREE_VEC_LENGTH (inner_parms
);
1010 pp_cxx_identifier (cxx_pp
, "template");
1011 pp_cxx_begin_template_argument_list (cxx_pp
);
1013 /* If we've shown the template prefix, we'd better show the
1014 parameters' and decl's type too. */
1015 flags
|= TFF_DECL_SPECIFIERS
;
1017 for (i
= 0; i
< len
; i
++)
1020 pp_separate_with_comma (cxx_pp
);
1021 dump_template_parameter (TREE_VEC_ELT (inner_parms
, i
), flags
);
1023 pp_cxx_end_template_argument_list (cxx_pp
);
1024 pp_cxx_whitespace (cxx_pp
);
1026 nreverse(orig_parms
);
1028 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t
))
1030 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1031 pp_cxx_identifier (cxx_pp
, "class");
1033 /* If this is a parameter pack, print the ellipsis. */
1034 if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t
)))
1035 pp_cxx_identifier (cxx_pp
, "...");
1039 if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == TYPE_DECL
)
1040 dump_type (TREE_TYPE (t
),
1041 ((flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1042 | (flags
& TFF_DECL_SPECIFIERS
? TFF_CLASS_KEY_OR_ENUM
: 0)));
1043 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == VAR_DECL
)
1044 dump_decl (DECL_TEMPLATE_RESULT (t
), flags
| TFF_TEMPLATE_NAME
);
1047 gcc_assert (TREE_TYPE (t
));
1048 switch (NEXT_CODE (t
))
1052 dump_function_decl (t
, flags
| TFF_TEMPLATE_NAME
);
1055 /* This case can occur with some invalid code. */
1056 dump_type (TREE_TYPE (t
),
1057 (flags
& ~TFF_CLASS_KEY_OR_ENUM
) | TFF_TEMPLATE_NAME
1058 | (flags
& TFF_DECL_SPECIFIERS
1059 ? TFF_CLASS_KEY_OR_ENUM
: 0));
1064 /* Pretty print a function decl. There are several ways we want to print a
1065 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1066 As error can only apply the '#' flag once to give 0 and 1 for V, there
1067 is %D which doesn't print the throw specs, and %F which does. */
1070 dump_function_decl (tree t
, int flags
)
1074 tree cname
= NULL_TREE
;
1075 tree template_args
= NULL_TREE
;
1076 tree template_parms
= NULL_TREE
;
1077 int show_return
= flags
& TFF_RETURN_TYPE
|| flags
& TFF_DECL_SPECIFIERS
;
1078 int do_outer_scope
= ! (flags
& TFF_UNQUALIFIED_NAME
);
1080 flags
&= ~TFF_UNQUALIFIED_NAME
;
1081 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1082 t
= DECL_TEMPLATE_RESULT (t
);
1084 /* Pretty print template instantiations only. */
1085 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
))
1089 template_args
= DECL_TI_ARGS (t
);
1090 tmpl
= most_general_template (t
);
1091 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1093 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1098 fntype
= TREE_TYPE (t
);
1099 parmtypes
= FUNCTION_FIRST_USER_PARMTYPE (t
);
1101 if (DECL_CLASS_SCOPE_P (t
))
1102 cname
= DECL_CONTEXT (t
);
1103 /* This is for partially instantiated template methods. */
1104 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1105 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1107 if (!(flags
& TFF_DECL_SPECIFIERS
))
1109 else if (DECL_STATIC_FUNCTION_P (t
))
1110 pp_cxx_identifier (cxx_pp
, "static");
1111 else if (DECL_VIRTUAL_P (t
))
1112 pp_cxx_identifier (cxx_pp
, "virtual");
1114 /* Print the return type? */
1116 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1117 && !DECL_DESTRUCTOR_P (t
);
1119 dump_type_prefix (TREE_TYPE (fntype
), flags
);
1121 /* Print the function name. */
1122 if (!do_outer_scope
)
1126 dump_type (cname
, flags
);
1127 pp_cxx_colon_colon (cxx_pp
);
1130 dump_scope (CP_DECL_CONTEXT (t
), flags
);
1132 dump_function_name (t
, flags
);
1134 if (!(flags
& TFF_NO_FUNCTION_ARGUMENTS
))
1136 dump_parameters (parmtypes
, flags
);
1138 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1140 pp_base (cxx_pp
)->padding
= pp_before
;
1141 pp_cxx_cv_qualifier_seq
1142 (cxx_pp
, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype
))));
1145 if (flags
& TFF_EXCEPTION_SPECIFICATION
)
1147 pp_base (cxx_pp
)->padding
= pp_before
;
1148 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype
), flags
);
1152 dump_type_suffix (TREE_TYPE (fntype
), flags
);
1155 /* If T is a template instantiation, dump the parameter binding. */
1156 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
)
1158 pp_cxx_whitespace (cxx_pp
);
1159 pp_cxx_left_bracket (cxx_pp
);
1160 pp_cxx_identifier (cxx_pp
, "with");
1161 pp_cxx_whitespace (cxx_pp
);
1162 dump_template_bindings (template_parms
, template_args
);
1163 pp_cxx_right_bracket (cxx_pp
);
1167 /* Print a parameter list. If this is for a member function, the
1168 member object ptr (and any other hidden args) should have
1169 already been removed. */
1172 dump_parameters (tree parmtypes
, int flags
)
1175 pp_cxx_left_paren (cxx_pp
);
1177 for (first
= 1; parmtypes
!= void_list_node
;
1178 parmtypes
= TREE_CHAIN (parmtypes
))
1181 pp_separate_with_comma (cxx_pp
);
1185 pp_cxx_identifier (cxx_pp
, "...");
1189 dump_type (TREE_VALUE (parmtypes
), flags
);
1191 if ((flags
& TFF_FUNCTION_DEFAULT_ARGUMENTS
) && TREE_PURPOSE (parmtypes
))
1193 pp_cxx_whitespace (cxx_pp
);
1195 pp_cxx_whitespace (cxx_pp
);
1196 dump_expr (TREE_PURPOSE (parmtypes
), flags
| TFF_EXPR_IN_PARENS
);
1200 pp_cxx_right_paren (cxx_pp
);
1203 /* Print an exception specification. T is the exception specification. */
1206 dump_exception_spec (tree t
, int flags
)
1210 pp_cxx_identifier (cxx_pp
, "throw");
1211 pp_cxx_whitespace (cxx_pp
);
1212 pp_cxx_left_paren (cxx_pp
);
1213 if (TREE_VALUE (t
) != NULL_TREE
)
1216 dump_type (TREE_VALUE (t
), flags
);
1220 pp_separate_with_comma (cxx_pp
);
1222 pp_cxx_right_paren (cxx_pp
);
1226 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1227 and destructors properly. */
1230 dump_function_name (tree t
, int flags
)
1232 tree name
= DECL_NAME (t
);
1234 /* We can get here with a decl that was synthesized by language-
1235 independent machinery (e.g. coverage.c) in which case it won't
1236 have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1237 will crash. In this case it is safe just to print out the
1239 if (!DECL_LANG_SPECIFIC (t
))
1241 pp_cxx_tree_identifier (cxx_pp
, name
);
1245 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1246 t
= DECL_TEMPLATE_RESULT (t
);
1248 /* Don't let the user see __comp_ctor et al. */
1249 if (DECL_CONSTRUCTOR_P (t
)
1250 || DECL_DESTRUCTOR_P (t
))
1251 name
= constructor_name (DECL_CONTEXT (t
));
1253 if (DECL_DESTRUCTOR_P (t
))
1255 pp_cxx_complement (cxx_pp
);
1256 dump_decl (name
, TFF_PLAIN_IDENTIFIER
);
1258 else if (DECL_CONV_FN_P (t
))
1260 /* This cannot use the hack that the operator's return
1261 type is stashed off of its name because it may be
1262 used for error reporting. In the case of conflicting
1263 declarations, both will have the same name, yet
1264 the types will be different, hence the TREE_TYPE field
1265 of the first name will be clobbered by the second. */
1266 pp_cxx_identifier (cxx_pp
, "operator");
1267 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1269 else if (IDENTIFIER_OPNAME_P (name
))
1270 pp_cxx_tree_identifier (cxx_pp
, name
);
1272 dump_decl (name
, flags
);
1274 if (DECL_TEMPLATE_INFO (t
)
1275 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1276 && (TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1277 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1278 dump_template_parms (DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
), flags
);
1281 /* Dump the template parameters from the template info INFO under control of
1282 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1283 specialization (partial or complete). For partial specializations we show
1284 the specialized parameter values. For a primary template we show no
1288 dump_template_parms (tree info
, int primary
, int flags
)
1290 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1292 if (primary
&& flags
& TFF_TEMPLATE_NAME
)
1294 flags
&= ~(TFF_CLASS_KEY_OR_ENUM
| TFF_TEMPLATE_NAME
);
1295 pp_cxx_begin_template_argument_list (cxx_pp
);
1297 /* Be careful only to print things when we have them, so as not
1298 to crash producing error messages. */
1299 if (args
&& !primary
)
1303 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args
))
1304 args
= TREE_VEC_ELT (args
, TREE_VEC_LENGTH (args
) - 1);
1306 len
= TREE_VEC_LENGTH (args
);
1308 for (ix
= 0; ix
!= len
; ix
++)
1310 tree arg
= TREE_VEC_ELT (args
, ix
);
1312 /* Only print a comma if we know there is an argument coming. In
1313 the case of an empty template argument pack, no actual
1314 argument will be printed. */
1316 && (!ARGUMENT_PACK_P (arg
)
1317 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg
)) > 0))
1318 pp_separate_with_comma (cxx_pp
);
1321 pp_identifier (cxx_pp
, "<template parameter error>");
1323 dump_template_argument (arg
, flags
);
1328 tree tpl
= TI_TEMPLATE (info
);
1329 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1332 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1333 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1335 for (ix
= 0; ix
!= len
; ix
++)
1339 if (TREE_VEC_ELT (parms
, ix
) == error_mark_node
)
1341 pp_identifier (cxx_pp
, "<template parameter error>");
1345 parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1348 pp_separate_with_comma (cxx_pp
);
1350 dump_decl (parm
, flags
& ~TFF_DECL_SPECIFIERS
);
1353 pp_cxx_end_template_argument_list (cxx_pp
);
1356 /* Print out the arguments of CALL_EXPR T as a parenthesized list using
1357 flags FLAGS. Skip over the first argument if SKIPFIRST is true. */
1360 dump_call_expr_args (tree t
, int flags
, bool skipfirst
)
1363 call_expr_arg_iterator iter
;
1365 pp_cxx_left_paren (cxx_pp
);
1366 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, t
)
1372 dump_expr (arg
, flags
| TFF_EXPR_IN_PARENS
);
1373 if (more_call_expr_args_p (&iter
))
1374 pp_separate_with_comma (cxx_pp
);
1377 pp_cxx_right_paren (cxx_pp
);
1380 /* Print out the arguments of AGGR_INIT_EXPR T as a parenthesized list
1381 using flags FLAGS. Skip over the first argument if SKIPFIRST is
1385 dump_aggr_init_expr_args (tree t
, int flags
, bool skipfirst
)
1388 aggr_init_expr_arg_iterator iter
;
1390 pp_cxx_left_paren (cxx_pp
);
1391 FOR_EACH_AGGR_INIT_EXPR_ARG (arg
, iter
, t
)
1397 dump_expr (arg
, flags
| TFF_EXPR_IN_PARENS
);
1398 if (more_aggr_init_expr_args_p (&iter
))
1399 pp_separate_with_comma (cxx_pp
);
1402 pp_cxx_right_paren (cxx_pp
);
1405 /* Print out a list of initializers (subr of dump_expr). */
1408 dump_expr_list (tree l
, int flags
)
1412 dump_expr (TREE_VALUE (l
), flags
| TFF_EXPR_IN_PARENS
);
1415 pp_separate_with_comma (cxx_pp
);
1419 /* Print out a vector of initializers (subr of dump_expr). */
1422 dump_expr_init_vec (VEC(constructor_elt
,gc
) *v
, int flags
)
1424 unsigned HOST_WIDE_INT idx
;
1427 FOR_EACH_CONSTRUCTOR_VALUE (v
, idx
, value
)
1429 dump_expr (value
, flags
| TFF_EXPR_IN_PARENS
);
1430 if (idx
!= VEC_length (constructor_elt
, v
) - 1)
1431 pp_separate_with_comma (cxx_pp
);
1436 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1437 function. Resolve it to a close relative -- in the sense of static
1438 type -- variant being overridden. That is close to what was written in
1439 the source code. Subroutine of dump_expr. */
1442 resolve_virtual_fun_from_obj_type_ref (tree ref
)
1444 tree obj_type
= TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref
));
1445 HOST_WIDE_INT index
= tree_low_cst (OBJ_TYPE_REF_TOKEN (ref
), 1);
1446 tree fun
= BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type
)));
1449 fun
= TREE_CHAIN (fun
);
1450 index
-= (TARGET_VTABLE_USES_DESCRIPTORS
1451 ? TARGET_VTABLE_USES_DESCRIPTORS
: 1);
1457 /* Print out an expression E under control of FLAGS. */
1460 dump_expr (tree t
, int flags
)
1465 if (STATEMENT_CLASS_P (t
))
1467 pp_cxx_identifier (cxx_pp
, "<statement>");
1471 switch (TREE_CODE (t
))
1479 case NAMESPACE_DECL
:
1482 case IDENTIFIER_NODE
:
1483 dump_decl (t
, (flags
& ~TFF_DECL_SPECIFIERS
) | TFF_NO_FUNCTION_ARGUMENTS
);
1490 pp_constant (cxx_pp
, t
);
1494 pp_cxx_identifier (cxx_pp
, "throw");
1495 dump_expr (TREE_OPERAND (t
, 0), flags
);
1499 pp_ampersand (cxx_pp
);
1500 dump_type (PTRMEM_CST_CLASS (t
), flags
);
1501 pp_cxx_colon_colon (cxx_pp
);
1502 pp_cxx_tree_identifier (cxx_pp
, DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1506 pp_cxx_left_paren (cxx_pp
);
1507 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1508 pp_separate_with_comma (cxx_pp
);
1509 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1510 pp_cxx_right_paren (cxx_pp
);
1514 pp_cxx_left_paren (cxx_pp
);
1515 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1516 pp_string (cxx_pp
, " ? ");
1517 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1518 pp_string (cxx_pp
, " : ");
1519 dump_expr (TREE_OPERAND (t
, 2), flags
| TFF_EXPR_IN_PARENS
);
1520 pp_cxx_right_paren (cxx_pp
);
1524 if (TREE_HAS_CONSTRUCTOR (t
))
1526 pp_cxx_identifier (cxx_pp
, "new");
1527 pp_cxx_whitespace (cxx_pp
);
1528 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1531 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1534 case AGGR_INIT_EXPR
:
1536 tree fn
= NULL_TREE
;
1538 if (TREE_CODE (AGGR_INIT_EXPR_FN (t
)) == ADDR_EXPR
)
1539 fn
= TREE_OPERAND (AGGR_INIT_EXPR_FN (t
), 0);
1541 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
1543 if (DECL_CONSTRUCTOR_P (fn
))
1544 dump_type (DECL_CONTEXT (fn
), flags
);
1549 dump_expr (AGGR_INIT_EXPR_FN (t
), 0);
1551 dump_aggr_init_expr_args (t
, flags
, true);
1556 tree fn
= CALL_EXPR_FN (t
);
1557 bool skipfirst
= false;
1559 if (TREE_CODE (fn
) == ADDR_EXPR
)
1560 fn
= TREE_OPERAND (fn
, 0);
1562 /* Nobody is interested in seeing the guts of vcalls. */
1563 if (TREE_CODE (fn
) == OBJ_TYPE_REF
)
1564 fn
= resolve_virtual_fun_from_obj_type_ref (fn
);
1566 if (TREE_TYPE (fn
) != NULL_TREE
&& NEXT_CODE (fn
) == METHOD_TYPE
)
1568 tree ob
= CALL_EXPR_ARG (t
, 0);
1569 if (TREE_CODE (ob
) == ADDR_EXPR
)
1571 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1572 pp_cxx_dot (cxx_pp
);
1574 else if (TREE_CODE (ob
) != PARM_DECL
1575 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1577 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1578 pp_cxx_arrow (cxx_pp
);
1582 dump_expr (fn
, flags
| TFF_EXPR_IN_PARENS
);
1583 dump_call_expr_args (t
, flags
, skipfirst
);
1588 /* Note that this only works for G++ target exprs. If somebody
1589 builds a general TARGET_EXPR, there's no way to represent that
1590 it initializes anything other that the parameter slot for the
1591 default argument. Note we may have cleared out the first
1592 operand in expand_expr, so don't go killing ourselves. */
1593 if (TREE_OPERAND (t
, 1))
1594 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1597 case POINTER_PLUS_EXPR
:
1598 dump_binary_op ("+", t
, flags
);
1606 case TRUNC_DIV_EXPR
:
1607 case TRUNC_MOD_EXPR
:
1615 case TRUTH_ANDIF_EXPR
:
1616 case TRUTH_ORIF_EXPR
:
1623 case EXACT_DIV_EXPR
:
1624 dump_binary_op (operator_name_info
[(int) TREE_CODE (t
)].name
, t
, flags
);
1628 case FLOOR_DIV_EXPR
:
1629 case ROUND_DIV_EXPR
:
1631 dump_binary_op ("/", t
, flags
);
1635 case FLOOR_MOD_EXPR
:
1636 case ROUND_MOD_EXPR
:
1637 dump_binary_op ("%", t
, flags
);
1642 tree ob
= TREE_OPERAND (t
, 0);
1643 if (TREE_CODE (ob
) == INDIRECT_REF
)
1645 ob
= TREE_OPERAND (ob
, 0);
1646 if (TREE_CODE (ob
) != PARM_DECL
1648 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this")))
1650 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1651 pp_cxx_arrow (cxx_pp
);
1656 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1657 pp_cxx_dot (cxx_pp
);
1659 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TFF_EXPR_IN_PARENS
);
1664 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1665 pp_cxx_left_bracket (cxx_pp
);
1666 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1667 pp_cxx_right_bracket (cxx_pp
);
1670 case UNARY_PLUS_EXPR
:
1671 dump_unary_op ("+", t
, flags
);
1675 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
1676 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
1677 /* An ADDR_EXPR can have reference type. In that case, we
1678 shouldn't print the `&' doing so indicates to the user
1679 that the expression has pointer type. */
1681 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
1682 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1683 else if (TREE_CODE (TREE_OPERAND (t
, 0)) == LABEL_DECL
)
1684 dump_unary_op ("&&", t
, flags
);
1686 dump_unary_op ("&", t
, flags
);
1690 if (TREE_HAS_CONSTRUCTOR (t
))
1692 t
= TREE_OPERAND (t
, 0);
1693 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
1694 dump_expr (CALL_EXPR_FN (t
), flags
| TFF_EXPR_IN_PARENS
);
1695 dump_call_expr_args (t
, flags
, true);
1699 if (TREE_OPERAND (t
,0) != NULL_TREE
1700 && TREE_TYPE (TREE_OPERAND (t
, 0))
1701 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
1702 dump_expr (TREE_OPERAND (t
, 0), flags
);
1704 dump_unary_op ("*", t
, flags
);
1710 case TRUTH_NOT_EXPR
:
1711 case PREDECREMENT_EXPR
:
1712 case PREINCREMENT_EXPR
:
1713 dump_unary_op (operator_name_info
[(int)TREE_CODE (t
)].name
, t
, flags
);
1716 case POSTDECREMENT_EXPR
:
1717 case POSTINCREMENT_EXPR
:
1718 pp_cxx_left_paren (cxx_pp
);
1719 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1720 pp_cxx_identifier (cxx_pp
, operator_name_info
[(int)TREE_CODE (t
)].name
);
1721 pp_cxx_right_paren (cxx_pp
);
1724 case NON_LVALUE_EXPR
:
1725 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1726 should be another level of INDIRECT_REF so that I don't have to do
1728 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
1730 tree next
= TREE_TYPE (TREE_TYPE (t
));
1732 while (TREE_CODE (next
) == POINTER_TYPE
)
1733 next
= TREE_TYPE (next
);
1735 if (TREE_CODE (next
) == FUNCTION_TYPE
)
1737 if (flags
& TFF_EXPR_IN_PARENS
)
1738 pp_cxx_left_paren (cxx_pp
);
1739 pp_cxx_star (cxx_pp
);
1740 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1741 if (flags
& TFF_EXPR_IN_PARENS
)
1742 pp_cxx_right_paren (cxx_pp
);
1745 /* Else fall through. */
1747 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
1752 case VIEW_CONVERT_EXPR
:
1754 tree op
= TREE_OPERAND (t
, 0);
1756 if (!same_type_p (TREE_TYPE (op
), TREE_TYPE (t
)))
1758 /* It is a cast, but we cannot tell whether it is a
1759 reinterpret or static cast. Use the C style notation. */
1760 if (flags
& TFF_EXPR_IN_PARENS
)
1761 pp_cxx_left_paren (cxx_pp
);
1762 pp_cxx_left_paren (cxx_pp
);
1763 dump_type (TREE_TYPE (t
), flags
);
1764 pp_cxx_right_paren (cxx_pp
);
1765 dump_expr (op
, flags
| TFF_EXPR_IN_PARENS
);
1766 if (flags
& TFF_EXPR_IN_PARENS
)
1767 pp_cxx_right_paren (cxx_pp
);
1770 dump_expr (op
, flags
);
1775 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
1777 tree idx
= build_ptrmemfunc_access_expr (t
, pfn_identifier
);
1779 if (integer_zerop (idx
))
1781 /* A NULL pointer-to-member constant. */
1782 pp_cxx_left_paren (cxx_pp
);
1783 pp_cxx_left_paren (cxx_pp
);
1784 dump_type (TREE_TYPE (t
), flags
);
1785 pp_cxx_right_paren (cxx_pp
);
1786 pp_character (cxx_pp
, '0');
1787 pp_cxx_right_paren (cxx_pp
);
1790 else if (host_integerp (idx
, 0))
1793 unsigned HOST_WIDE_INT n
;
1795 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
1796 t
= TYPE_METHOD_BASETYPE (t
);
1797 virtuals
= BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t
)));
1799 n
= tree_low_cst (idx
, 0);
1801 /* Map vtable index back one, to allow for the null pointer to
1805 while (n
> 0 && virtuals
)
1808 virtuals
= TREE_CHAIN (virtuals
);
1812 dump_expr (BV_FN (virtuals
),
1813 flags
| TFF_EXPR_IN_PARENS
);
1818 if (TREE_TYPE (t
) && EMPTY_CONSTRUCTOR_P (t
))
1820 dump_type (TREE_TYPE (t
), 0);
1821 pp_cxx_left_paren (cxx_pp
);
1822 pp_cxx_right_paren (cxx_pp
);
1826 pp_cxx_left_brace (cxx_pp
);
1827 dump_expr_init_vec (CONSTRUCTOR_ELTS (t
), flags
);
1828 pp_cxx_right_brace (cxx_pp
);
1835 tree ob
= TREE_OPERAND (t
, 0);
1836 if (is_dummy_object (ob
))
1838 t
= TREE_OPERAND (t
, 1);
1839 if (TREE_CODE (t
) == FUNCTION_DECL
)
1841 dump_expr (t
, flags
| TFF_EXPR_IN_PARENS
);
1842 else if (BASELINK_P (t
))
1843 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t
)),
1844 flags
| TFF_EXPR_IN_PARENS
);
1846 dump_decl (t
, flags
);
1850 if (TREE_CODE (ob
) == INDIRECT_REF
)
1852 dump_expr (TREE_OPERAND (ob
, 0), flags
| TFF_EXPR_IN_PARENS
);
1853 pp_cxx_arrow (cxx_pp
);
1854 pp_cxx_star (cxx_pp
);
1858 dump_expr (ob
, flags
| TFF_EXPR_IN_PARENS
);
1859 pp_cxx_dot (cxx_pp
);
1860 pp_cxx_star (cxx_pp
);
1862 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
1867 case TEMPLATE_PARM_INDEX
:
1868 dump_decl (TEMPLATE_PARM_DECL (t
), flags
& ~TFF_DECL_SPECIFIERS
);
1872 if (TREE_OPERAND (t
, 0) == NULL_TREE
1873 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
1875 dump_type (TREE_TYPE (t
), flags
);
1876 pp_cxx_left_paren (cxx_pp
);
1877 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1878 pp_cxx_right_paren (cxx_pp
);
1882 pp_cxx_left_paren (cxx_pp
);
1883 dump_type (TREE_TYPE (t
), flags
);
1884 pp_cxx_right_paren (cxx_pp
);
1885 pp_cxx_left_paren (cxx_pp
);
1886 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1887 pp_cxx_right_paren (cxx_pp
);
1891 case STATIC_CAST_EXPR
:
1892 pp_cxx_identifier (cxx_pp
, "static_cast");
1894 case REINTERPRET_CAST_EXPR
:
1895 pp_cxx_identifier (cxx_pp
, "reinterpret_cast");
1897 case CONST_CAST_EXPR
:
1898 pp_cxx_identifier (cxx_pp
, "const_cast");
1900 case DYNAMIC_CAST_EXPR
:
1901 pp_cxx_identifier (cxx_pp
, "dynamic_cast");
1903 pp_cxx_begin_template_argument_list (cxx_pp
);
1904 dump_type (TREE_TYPE (t
), flags
);
1905 pp_cxx_end_template_argument_list (cxx_pp
);
1906 pp_cxx_left_paren (cxx_pp
);
1907 dump_expr (TREE_OPERAND (t
, 0), flags
);
1908 pp_cxx_right_paren (cxx_pp
);
1912 dump_expr (TREE_OPERAND (t
, 0), flags
);
1913 pp_cxx_arrow (cxx_pp
);
1918 if (TREE_CODE (t
) == SIZEOF_EXPR
)
1919 pp_cxx_identifier (cxx_pp
, "sizeof");
1922 gcc_assert (TREE_CODE (t
) == ALIGNOF_EXPR
);
1923 pp_cxx_identifier (cxx_pp
, "__alignof__");
1925 pp_cxx_whitespace (cxx_pp
);
1926 pp_cxx_left_paren (cxx_pp
);
1927 if (TYPE_P (TREE_OPERAND (t
, 0)))
1928 dump_type (TREE_OPERAND (t
, 0), flags
);
1930 dump_expr (TREE_OPERAND (t
, 0), flags
);
1931 pp_cxx_right_paren (cxx_pp
);
1936 pp_cxx_identifier (cxx_pp
, operator_name_info
[TREE_CODE (t
)].name
);
1937 pp_cxx_whitespace (cxx_pp
);
1938 dump_expr (TREE_OPERAND (t
, 0), flags
);
1942 pp_identifier (cxx_pp
, "<unparsed>");
1945 case TRY_CATCH_EXPR
:
1946 case WITH_CLEANUP_EXPR
:
1947 case CLEANUP_POINT_EXPR
:
1948 dump_expr (TREE_OPERAND (t
, 0), flags
);
1951 case PSEUDO_DTOR_EXPR
:
1952 dump_expr (TREE_OPERAND (t
, 2), flags
);
1953 pp_cxx_dot (cxx_pp
);
1954 dump_type (TREE_OPERAND (t
, 0), flags
);
1955 pp_cxx_colon_colon (cxx_pp
);
1956 pp_cxx_complement (cxx_pp
);
1957 dump_type (TREE_OPERAND (t
, 1), flags
);
1960 case TEMPLATE_ID_EXPR
:
1961 dump_decl (t
, flags
);
1966 case STATEMENT_LIST
:
1967 /* We don't yet have a way of dumping statements in a
1968 human-readable format. */
1969 pp_string (cxx_pp
, "({...})");
1973 pp_string (cxx_pp
, "while (1) { ");
1974 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1975 pp_cxx_right_brace (cxx_pp
);
1979 pp_string (cxx_pp
, "if (");
1980 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
1981 pp_string (cxx_pp
, ") break; ");
1985 dump_expr (get_first_fn (t
), flags
& ~TFF_EXPR_IN_PARENS
);
1988 case EMPTY_CLASS_EXPR
:
1989 dump_type (TREE_TYPE (t
), flags
);
1990 pp_cxx_left_paren (cxx_pp
);
1991 pp_cxx_right_paren (cxx_pp
);
1994 case NON_DEPENDENT_EXPR
:
1995 dump_expr (TREE_OPERAND (t
, 0), flags
);
1998 case ARGUMENT_PACK_SELECT
:
1999 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t
), flags
);
2011 pp_type_specifier_seq (cxx_pp
, t
);
2015 /* We get here when we want to print a dependent type as an
2016 id-expression, without any disambiguator decoration. */
2017 pp_id_expression (cxx_pp
, t
);
2020 case TEMPLATE_TYPE_PARM
:
2021 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2022 dump_type (t
, flags
);
2026 pp_cxx_trait_expression (cxx_pp
, t
);
2030 pp_cxx_va_arg_expression (cxx_pp
, t
);
2034 pp_cxx_offsetof_expression (cxx_pp
, t
);
2038 case EXPR_PACK_EXPANSION
:
2045 case VEC_DELETE_EXPR
:
2051 case UNORDERED_EXPR
:
2059 pp_expression (cxx_pp
, t
);
2062 case TRUTH_AND_EXPR
:
2064 case TRUTH_XOR_EXPR
:
2065 if (flags
& TFF_EXPR_IN_PARENS
)
2066 pp_cxx_left_paren (cxx_pp
);
2067 pp_expression (cxx_pp
, t
);
2068 if (flags
& TFF_EXPR_IN_PARENS
)
2069 pp_cxx_right_paren (cxx_pp
);
2073 dump_expr (resolve_virtual_fun_from_obj_type_ref (t
), flags
);
2076 /* This list is incomplete, but should suffice for now.
2077 It is very important that `sorry' does not call
2078 `report_error_function'. That could cause an infinite loop. */
2080 pp_unsupported_tree (cxx_pp
, t
);
2081 /* fall through to ERROR_MARK... */
2083 pp_identifier (cxx_pp
, "<expression error>");
2089 dump_binary_op (const char *opstring
, tree t
, int flags
)
2091 pp_cxx_left_paren (cxx_pp
);
2092 dump_expr (TREE_OPERAND (t
, 0), flags
| TFF_EXPR_IN_PARENS
);
2093 pp_cxx_whitespace (cxx_pp
);
2095 pp_cxx_identifier (cxx_pp
, opstring
);
2097 pp_identifier (cxx_pp
, "<unknown operator>");
2098 pp_cxx_whitespace (cxx_pp
);
2099 dump_expr (TREE_OPERAND (t
, 1), flags
| TFF_EXPR_IN_PARENS
);
2100 pp_cxx_right_paren (cxx_pp
);
2104 dump_unary_op (const char *opstring
, tree t
, int flags
)
2106 if (flags
& TFF_EXPR_IN_PARENS
)
2107 pp_cxx_left_paren (cxx_pp
);
2108 pp_cxx_identifier (cxx_pp
, opstring
);
2109 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TFF_EXPR_IN_PARENS
);
2110 if (flags
& TFF_EXPR_IN_PARENS
)
2111 pp_cxx_right_paren (cxx_pp
);
2115 reinit_cxx_pp (void)
2117 pp_clear_output_area (cxx_pp
);
2118 pp_base (cxx_pp
)->padding
= pp_none
;
2119 pp_indentation (cxx_pp
) = 0;
2120 pp_needs_newline (cxx_pp
) = false;
2121 cxx_pp
->enclosing_scope
= current_function_decl
;
2125 /* Exported interface to stringifying types, exprs and decls under TFF_*
2129 type_as_string (tree typ
, int flags
)
2132 dump_type (typ
, flags
);
2133 return pp_formatted_text (cxx_pp
);
2137 expr_as_string (tree decl
, int flags
)
2140 dump_expr (decl
, flags
);
2141 return pp_formatted_text (cxx_pp
);
2145 decl_as_string (tree decl
, int flags
)
2148 dump_decl (decl
, flags
);
2149 return pp_formatted_text (cxx_pp
);
2152 /* Generate the three forms of printable names for cxx_printable_name. */
2155 lang_decl_name (tree decl
, int v
)
2158 return decl_as_string (decl
, TFF_DECL_SPECIFIERS
);
2161 if (v
== 1 && DECL_CLASS_SCOPE_P (decl
))
2163 dump_type (CP_DECL_CONTEXT (decl
), TFF_PLAIN_IDENTIFIER
);
2164 pp_cxx_colon_colon (cxx_pp
);
2167 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2168 dump_function_name (decl
, TFF_PLAIN_IDENTIFIER
);
2170 dump_decl (DECL_NAME (decl
), TFF_PLAIN_IDENTIFIER
);
2172 return pp_formatted_text (cxx_pp
);
2175 /* Return the location of a tree passed to %+ formats. */
2178 location_of (tree t
)
2180 if (TREE_CODE (t
) == PARM_DECL
&& DECL_CONTEXT (t
))
2181 t
= DECL_CONTEXT (t
);
2182 else if (TYPE_P (t
))
2183 t
= TYPE_MAIN_DECL (t
);
2184 else if (TREE_CODE (t
) == OVERLOAD
)
2185 t
= OVL_FUNCTION (t
);
2187 return DECL_SOURCE_LOCATION (t
);
2190 /* Now the interfaces from error et al to dump_type et al. Each takes an
2191 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2195 decl_to_string (tree decl
, int verbose
)
2199 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2200 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2201 flags
= TFF_CLASS_KEY_OR_ENUM
;
2203 flags
|= TFF_DECL_SPECIFIERS
;
2204 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2205 flags
|= TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
;
2206 flags
|= TFF_TEMPLATE_HEADER
;
2209 dump_decl (decl
, flags
);
2210 return pp_formatted_text (cxx_pp
);
2214 expr_to_string (tree decl
)
2217 dump_expr (decl
, 0);
2218 return pp_formatted_text (cxx_pp
);
2222 fndecl_to_string (tree fndecl
, int verbose
)
2226 flags
= TFF_EXCEPTION_SPECIFICATION
| TFF_DECL_SPECIFIERS
2227 | TFF_TEMPLATE_HEADER
;
2229 flags
|= TFF_FUNCTION_DEFAULT_ARGUMENTS
;
2231 dump_decl (fndecl
, flags
);
2232 return pp_formatted_text (cxx_pp
);
2237 code_to_string (enum tree_code c
)
2239 return tree_code_name
[c
];
2243 language_to_string (enum languages c
)
2250 case lang_cplusplus
:
2262 /* Return the proper printed version of a parameter to a C++ function. */
2265 parm_to_string (int p
)
2269 pp_string (cxx_pp
, "'this'");
2271 pp_decimal_int (cxx_pp
, p
+ 1);
2272 return pp_formatted_text (cxx_pp
);
2276 op_to_string (enum tree_code p
)
2278 tree id
= operator_name_info
[(int) p
].identifier
;
2279 return id
? IDENTIFIER_POINTER (id
) : "<unknown>";
2283 type_to_string (tree typ
, int verbose
)
2287 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2288 flags
|= TFF_TEMPLATE_HEADER
;
2291 dump_type (typ
, flags
);
2292 return pp_formatted_text (cxx_pp
);
2296 assop_to_string (enum tree_code p
)
2298 tree id
= assignment_operator_name_info
[(int) p
].identifier
;
2299 return id
? IDENTIFIER_POINTER (id
) : "{unknown}";
2303 args_to_string (tree p
, int verbose
)
2307 flags
|= TFF_CLASS_KEY_OR_ENUM
;
2312 if (TYPE_P (TREE_VALUE (p
)))
2313 return type_as_string (p
, flags
);
2316 for (; p
; p
= TREE_CHAIN (p
))
2318 if (TREE_VALUE (p
) == null_node
)
2319 pp_cxx_identifier (cxx_pp
, "NULL");
2321 dump_type (error_type (TREE_VALUE (p
)), flags
);
2323 pp_separate_with_comma (cxx_pp
);
2325 return pp_formatted_text (cxx_pp
);
2329 cv_to_string (tree p
, int v
)
2332 pp_base (cxx_pp
)->padding
= v
? pp_before
: pp_none
;
2333 pp_cxx_cv_qualifier_seq (cxx_pp
, p
);
2334 return pp_formatted_text (cxx_pp
);
2337 /* Langhook for print_error_function. */
2339 cxx_print_error_function (diagnostic_context
*context
, const char *file
,
2340 diagnostic_info
*diagnostic
)
2342 lhd_print_error_function (context
, file
, diagnostic
);
2343 pp_base_set_prefix (context
->printer
, file
);
2344 maybe_print_instantiation_context (context
);
2348 cp_diagnostic_starter (diagnostic_context
*context
,
2349 diagnostic_info
*diagnostic
)
2351 diagnostic_report_current_module (context
);
2352 cp_print_error_function (context
, diagnostic
);
2353 maybe_print_instantiation_context (context
);
2354 pp_base_set_prefix (context
->printer
, diagnostic_build_prefix (diagnostic
));
2358 cp_diagnostic_finalizer (diagnostic_context
*context
,
2359 diagnostic_info
*diagnostic ATTRIBUTE_UNUSED
)
2361 pp_base_destroy_prefix (context
->printer
);
2364 /* Print current function onto BUFFER, in the process of reporting
2365 a diagnostic message. Called from cp_diagnostic_starter. */
2367 cp_print_error_function (diagnostic_context
*context
,
2368 diagnostic_info
*diagnostic
)
2370 if (diagnostic_last_function_changed (context
, diagnostic
))
2372 const char *old_prefix
= context
->printer
->prefix
;
2373 const char *file
= LOCATION_FILE (diagnostic
->location
);
2374 tree abstract_origin
= diagnostic
->abstract_origin
;
2375 char *new_prefix
= (file
&& abstract_origin
== NULL
)
2376 ? file_name_as_prefix (file
) : NULL
;
2378 pp_base_set_prefix (context
->printer
, new_prefix
);
2380 if (current_function_decl
== NULL
)
2381 pp_base_string (context
->printer
, "At global scope:");
2386 if (abstract_origin
)
2388 ao
= BLOCK_ABSTRACT_ORIGIN (abstract_origin
);
2389 while (TREE_CODE (ao
) == BLOCK
&& BLOCK_ABSTRACT_ORIGIN (ao
))
2390 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
2391 gcc_assert (TREE_CODE (ao
) == FUNCTION_DECL
);
2395 fndecl
= current_function_decl
;
2397 pp_printf (context
->printer
, "In %s %qs",
2398 function_category (fndecl
),
2399 cxx_printable_name (fndecl
, 2));
2401 while (abstract_origin
)
2404 tree block
= abstract_origin
;
2406 locus
= &BLOCK_SOURCE_LOCATION (block
);
2408 block
= BLOCK_SUPERCONTEXT (block
);
2409 while (block
&& TREE_CODE (block
) == BLOCK
2410 && BLOCK_ABSTRACT_ORIGIN (block
))
2412 ao
= BLOCK_ABSTRACT_ORIGIN (block
);
2414 while (TREE_CODE (ao
) == BLOCK
2415 && BLOCK_ABSTRACT_ORIGIN (ao
)
2416 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
2417 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
2419 if (TREE_CODE (ao
) == FUNCTION_DECL
)
2424 else if (TREE_CODE (ao
) != BLOCK
)
2427 block
= BLOCK_SUPERCONTEXT (block
);
2430 abstract_origin
= block
;
2433 while (block
&& TREE_CODE (block
) == BLOCK
)
2434 block
= BLOCK_SUPERCONTEXT (block
);
2436 if (TREE_CODE (block
) == FUNCTION_DECL
)
2438 abstract_origin
= NULL
;
2442 expanded_location s
= expand_location (*locus
);
2443 pp_base_character (context
->printer
, ',');
2444 pp_base_newline (context
->printer
);
2447 if (flag_show_column
&& s
.column
!= 0)
2448 pp_printf (context
->printer
,
2449 " inlined from %qs at %s:%d:%d",
2450 cxx_printable_name (fndecl
, 2),
2451 s
.file
, s
.line
, s
.column
);
2453 pp_printf (context
->printer
,
2454 " inlined from %qs at %s:%d",
2455 cxx_printable_name (fndecl
, 2),
2460 pp_printf (context
->printer
, " inlined from %qs",
2461 cxx_printable_name (fndecl
, 2));
2464 pp_base_character (context
->printer
, ':');
2466 pp_base_newline (context
->printer
);
2468 diagnostic_set_last_function (context
, diagnostic
);
2469 pp_base_destroy_prefix (context
->printer
);
2470 context
->printer
->prefix
= old_prefix
;
2474 /* Returns a description of FUNCTION using standard terminology. */
2476 function_category (tree fn
)
2478 if (DECL_FUNCTION_MEMBER_P (fn
))
2480 if (DECL_STATIC_FUNCTION_P (fn
))
2481 return "static member function";
2482 else if (DECL_COPY_CONSTRUCTOR_P (fn
))
2483 return "copy constructor";
2484 else if (DECL_CONSTRUCTOR_P (fn
))
2485 return "constructor";
2486 else if (DECL_DESTRUCTOR_P (fn
))
2487 return "destructor";
2489 return "member function";
2495 /* Report the full context of a current template instantiation,
2498 print_instantiation_full_context (diagnostic_context
*context
)
2500 struct tinst_level
*p
= current_instantiation ();
2501 location_t location
= input_location
;
2505 if (current_function_decl
!= p
->decl
2506 && current_function_decl
!= NULL_TREE
)
2507 /* We can get here during the processing of some synthesized
2508 method. Then, P->DECL will be the function that's causing
2513 if (current_function_decl
== p
->decl
)
2514 /* Avoid redundancy with the "In function" line. */;
2516 pp_verbatim (context
->printer
,
2517 "%s: In instantiation of %qs:\n",
2518 LOCATION_FILE (location
),
2519 decl_as_string (p
->decl
,
2520 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2522 location
= p
->locus
;
2527 print_instantiation_partial_context (context
, p
, location
);
2530 /* Same as above but less verbose. */
2532 print_instantiation_partial_context (diagnostic_context
*context
,
2533 struct tinst_level
*t
, location_t loc
)
2535 expanded_location xloc
;
2536 for (; ; t
= t
->next
)
2538 xloc
= expand_location (loc
);
2541 pp_verbatim (context
->printer
, "%s:%d: instantiated from %qs\n",
2542 xloc
.file
, xloc
.line
,
2543 decl_as_string (t
->decl
,
2544 TFF_DECL_SPECIFIERS
| TFF_RETURN_TYPE
));
2547 pp_verbatim (context
->printer
, "%s:%d: instantiated from here",
2548 xloc
.file
, xloc
.line
);
2549 pp_base_newline (context
->printer
);
2552 /* Called from cp_thing to print the template context for an error. */
2554 maybe_print_instantiation_context (diagnostic_context
*context
)
2556 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2559 record_last_problematic_instantiation ();
2560 print_instantiation_full_context (context
);
2563 /* Report the bare minimum context of a template instantiation. */
2565 print_instantiation_context (void)
2567 print_instantiation_partial_context
2568 (global_dc
, current_instantiation (), input_location
);
2569 diagnostic_flush_buffer (global_dc
);
2572 /* Called from output_format -- during diagnostic message processing --
2573 to handle C++ specific format specifier with the following meanings:
2574 %A function argument-list.
2578 %F function declaration.
2579 %L language as used in extern "lang".
2581 %P function parameter whose position is indicated by an integer.
2582 %Q assignment operator.
2586 cp_printer (pretty_printer
*pp
, text_info
*text
, const char *spec
,
2587 int precision
, bool wide
, bool set_locus
, bool verbose
)
2591 #define next_tree (t = va_arg (*text->args_ptr, tree))
2592 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2593 #define next_lang va_arg (*text->args_ptr, enum languages)
2594 #define next_int va_arg (*text->args_ptr, int)
2596 if (precision
!= 0 || wide
)
2599 if (text
->locus
== NULL
)
2604 case 'A': result
= args_to_string (next_tree
, verbose
); break;
2605 case 'C': result
= code_to_string (next_tcode
); break;
2608 tree temp
= next_tree
;
2610 && DECL_DEBUG_EXPR_IS_FROM (temp
) && DECL_DEBUG_EXPR (temp
))
2612 temp
= DECL_DEBUG_EXPR (temp
);
2615 result
= expr_to_string (temp
);
2619 result
= decl_to_string (temp
, verbose
);
2622 case 'E': result
= expr_to_string (next_tree
); break;
2623 case 'F': result
= fndecl_to_string (next_tree
, verbose
); break;
2624 case 'L': result
= language_to_string (next_lang
); break;
2625 case 'O': result
= op_to_string (next_tcode
); break;
2626 case 'P': result
= parm_to_string (next_int
); break;
2627 case 'Q': result
= assop_to_string (next_tcode
); break;
2628 case 'T': result
= type_to_string (next_tree
, verbose
); break;
2629 case 'V': result
= cv_to_string (next_tree
, verbose
); break;
2635 pp_base_string (pp
, result
);
2636 if (set_locus
&& t
!= NULL
)
2637 *text
->locus
= location_of (t
);
2645 /* Callback from cpp_error for PFILE to print diagnostics arising from
2646 interpreting strings. The diagnostic is of type LEVEL; MSG is the
2647 translated message and AP the arguments. */
2650 cp_cpp_error (cpp_reader
*pfile ATTRIBUTE_UNUSED
, int level
,
2651 const char *msg
, va_list *ap
)
2653 diagnostic_info diagnostic
;
2654 diagnostic_t dlevel
;
2657 case CPP_DL_WARNING
:
2658 case CPP_DL_WARNING_SYSHDR
:
2659 dlevel
= DK_WARNING
;
2661 case CPP_DL_PEDWARN
:
2662 dlevel
= pedantic_warning_kind ();
2673 diagnostic_set_info_translated (&diagnostic
, msg
, ap
,
2674 input_location
, dlevel
);
2675 report_diagnostic (&diagnostic
);
2678 /* Warn about the use of variadic templates when appropriate. */
2680 maybe_warn_variadic_templates (void)
2682 if ((cxx_dialect
== cxx98
) && !in_system_header
)
2683 /* We really want to suppress this warning in system headers,
2684 because libstdc++ uses variadic templates even when we aren't
2686 pedwarn ("ISO C++ does not include variadic templates");