2008-05-30 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / cp / error.c
blob55e620a6b542aaae8ee607adde9891ade30d55e0
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)
10 any later version.
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/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "cp-tree.h"
27 #include "real.h"
28 #include "toplev.h"
29 #include "flags.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 *,
85 struct tinst_level *,
86 location_t);
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);
95 void
96 init_error (void)
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. */
108 static void
109 dump_scope (tree scope, int flags)
111 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
113 if (scope == NULL_TREE)
114 return;
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. */
138 static void
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);
145 else
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
155 of FLAGS. */
157 static void
158 dump_template_argument_list (tree args, int flags)
160 int n = TREE_VEC_LENGTH (args);
161 int need_comma = 0;
162 int i;
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. */
171 if (need_comma
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);
177 need_comma = 1;
181 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
183 static void
184 dump_template_parameter (tree parm, int flags)
186 tree p;
187 tree a;
189 if (parm == error_mark_node)
190 return;
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, "...");
202 if (DECL_NAME (p))
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));
207 else
208 pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
210 else
211 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
213 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
215 pp_cxx_whitespace (cxx_pp);
216 pp_equal (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);
220 else
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
227 TREE_VEC. */
229 static void
230 dump_template_bindings (tree parms, tree args)
232 int need_comma = 0;
234 while (parms)
236 tree p = TREE_VALUE (parms);
237 int lvl = TMPL_PARMS_DEPTH (parms);
238 int arg_idx = 0;
239 int i;
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);
253 if (need_comma)
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);
257 pp_equal (cxx_pp);
258 pp_cxx_whitespace (cxx_pp);
259 if (arg)
260 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
261 else
262 pp_identifier (cxx_pp, "<missing>");
264 ++arg_idx;
265 need_comma = 1;
268 parms = TREE_CHAIN (parms);
272 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
273 format. */
275 static void
276 dump_type (tree t, int flags)
278 if (t == NULL_TREE)
279 return;
281 if (TYPE_PTRMEMFUNC_P (t))
282 goto offset_type;
284 switch (TREE_CODE (t))
286 case UNKNOWN_TYPE:
287 pp_identifier (cxx_pp, "<unresolved overloaded function type>");
288 break;
290 case TREE_LIST:
291 /* A list of function parms. */
292 dump_parameters (t, flags);
293 break;
295 case IDENTIFIER_NODE:
296 pp_cxx_tree_identifier (cxx_pp, t);
297 break;
299 case TREE_BINFO:
300 dump_type (BINFO_TYPE (t), flags);
301 break;
303 case RECORD_TYPE:
304 case UNION_TYPE:
305 case ENUMERAL_TYPE:
306 dump_aggr_type (t, flags);
307 break;
309 case TYPE_DECL:
310 if (flags & TFF_CHASE_TYPEDEF)
312 dump_type (DECL_ORIGINAL_TYPE (t)
313 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
314 break;
316 /* Else fall through. */
318 case TEMPLATE_DECL:
319 case NAMESPACE_DECL:
320 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
321 break;
323 case INTEGER_TYPE:
324 case REAL_TYPE:
325 case VOID_TYPE:
326 case BOOLEAN_TYPE:
327 case COMPLEX_TYPE:
328 case VECTOR_TYPE:
329 case FIXED_POINT_TYPE:
330 pp_type_specifier_seq (cxx_pp, t);
331 break;
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));
337 else
338 pp_cxx_canonical_template_parameter (cxx_pp, t);
339 break;
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);
350 break;
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));
356 else
357 pp_cxx_canonical_template_parameter
358 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
359 break;
361 /* This is not always necessary for pointers and such, but doing this
362 reduces code size. */
363 case ARRAY_TYPE:
364 case POINTER_TYPE:
365 case REFERENCE_TYPE:
366 case OFFSET_TYPE:
367 offset_type:
368 case FUNCTION_TYPE:
369 case METHOD_TYPE:
371 dump_type_prefix (t, flags);
372 dump_type_suffix (t, flags);
373 break;
375 case TYPENAME_TYPE:
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"
380 : "typename");
381 dump_typename (t, flags);
382 break;
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);
389 break;
391 case TYPEOF_TYPE:
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);
397 break;
399 case TYPE_PACK_EXPANSION:
400 dump_type (PACK_EXPANSION_PATTERN (t), flags);
401 pp_cxx_identifier (cxx_pp, "...");
402 break;
404 case TYPE_ARGUMENT_PACK:
405 dump_template_argument (t, flags);
406 break;
408 case DECLTYPE_TYPE:
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);
414 break;
416 default:
417 pp_unsupported_tree (cxx_pp, t);
418 /* Fall through to error. */
420 case ERROR_MARK:
421 pp_identifier (cxx_pp, "<type error>");
422 break;
426 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
427 a TYPENAME_TYPE. */
429 static void
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);
436 else
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. */
444 const char *
445 class_key_or_enum_as_string (tree t)
447 if (TREE_CODE (t) == ENUMERAL_TYPE)
448 return "enum";
449 else if (TREE_CODE (t) == UNION_TYPE)
450 return "union";
451 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
452 return "class";
453 else
454 return "struct";
457 /* Print out a class declaration T under the control of FLAGS,
458 in the form `class foo'. */
460 static void
461 dump_aggr_type (tree t, int flags)
463 tree name;
464 const char *variety = class_key_or_enum_as_string (t);
465 int typdef = 0;
466 int tmplate = 0;
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);
478 if (name)
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;
489 if (tmplate)
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);
497 name = 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>");
506 else
507 pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
509 else
510 pp_cxx_tree_identifier (cxx_pp, name);
511 if (tmplate)
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
519 functions. Examples:
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
526 int *[]&. */
528 static void
529 dump_type_prefix (tree t, int flags)
531 if (TYPE_PTRMEMFUNC_P (t))
533 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
534 goto offset_type;
537 switch (TREE_CODE (t))
539 case POINTER_TYPE:
540 case REFERENCE_TYPE:
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, "&&");
556 else
557 pp_character (cxx_pp, '&');
559 pp_base (cxx_pp)->padding = pp_before;
560 pp_cxx_cv_qualifier_seq (cxx_pp, t);
562 break;
564 case OFFSET_TYPE:
565 offset_type:
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;
578 break;
580 /* Can only be reached through function pointer -- this would not be
581 correct if FUNCTION_DECLs used it. */
582 case FUNCTION_TYPE:
583 dump_type_prefix (TREE_TYPE (t), flags);
584 pp_maybe_space (cxx_pp);
585 pp_cxx_left_paren (cxx_pp);
586 break;
588 case METHOD_TYPE:
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);
594 break;
596 case ARRAY_TYPE:
597 dump_type_prefix (TREE_TYPE (t), flags);
598 break;
600 case ENUMERAL_TYPE:
601 case IDENTIFIER_NODE:
602 case INTEGER_TYPE:
603 case BOOLEAN_TYPE:
604 case REAL_TYPE:
605 case RECORD_TYPE:
606 case TEMPLATE_TYPE_PARM:
607 case TEMPLATE_TEMPLATE_PARM:
608 case BOUND_TEMPLATE_TEMPLATE_PARM:
609 case TREE_LIST:
610 case TYPE_DECL:
611 case TREE_VEC:
612 case UNION_TYPE:
613 case UNKNOWN_TYPE:
614 case VOID_TYPE:
615 case TYPENAME_TYPE:
616 case COMPLEX_TYPE:
617 case VECTOR_TYPE:
618 case TYPEOF_TYPE:
619 case DECLTYPE_TYPE:
620 case TYPE_PACK_EXPANSION:
621 dump_type (t, flags);
622 pp_base (cxx_pp)->padding = pp_before;
623 break;
625 default:
626 pp_unsupported_tree (cxx_pp, t);
627 /* fall through. */
628 case ERROR_MARK:
629 pp_identifier (cxx_pp, "<typeprefixerror>");
630 break;
634 /* Dump the suffix of type T, under control of FLAGS. This is the part
635 which appears after the identifier (or function parms). */
637 static void
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))
645 case POINTER_TYPE:
646 case REFERENCE_TYPE:
647 case OFFSET_TYPE:
648 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
649 pp_cxx_right_paren (cxx_pp);
650 dump_type_suffix (TREE_TYPE (t), flags);
651 break;
653 /* Can only be reached through function pointer. */
654 case FUNCTION_TYPE:
655 case METHOD_TYPE:
657 tree arg;
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))));
670 else
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);
674 break;
677 case ARRAY_TYPE:
678 pp_maybe_space (cxx_pp);
679 pp_cxx_left_bracket (cxx_pp);
680 if (TYPE_DOMAIN (t))
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);
689 else
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);
696 break;
698 case ENUMERAL_TYPE:
699 case IDENTIFIER_NODE:
700 case INTEGER_TYPE:
701 case BOOLEAN_TYPE:
702 case REAL_TYPE:
703 case RECORD_TYPE:
704 case TEMPLATE_TYPE_PARM:
705 case TEMPLATE_TEMPLATE_PARM:
706 case BOUND_TEMPLATE_TEMPLATE_PARM:
707 case TREE_LIST:
708 case TYPE_DECL:
709 case TREE_VEC:
710 case UNION_TYPE:
711 case UNKNOWN_TYPE:
712 case VOID_TYPE:
713 case TYPENAME_TYPE:
714 case COMPLEX_TYPE:
715 case VECTOR_TYPE:
716 case TYPEOF_TYPE:
717 case DECLTYPE_TYPE:
718 case TYPE_PACK_EXPANSION:
719 break;
721 default:
722 pp_unsupported_tree (cxx_pp, t);
723 case ERROR_MARK:
724 /* Don't mark it here, we should have already done in
725 dump_type_prefix. */
726 break;
730 static void
731 dump_global_iord (tree t)
733 const char *p = NULL;
735 if (DECL_GLOBAL_CTOR_P (t))
736 p = "initializers";
737 else if (DECL_GLOBAL_DTOR_P (t))
738 p = "destructors";
739 else
740 gcc_unreachable ();
742 pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
745 static void
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, "...");
762 if (DECL_NAME (t))
763 dump_decl (DECL_NAME (t), flags);
764 else
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. */
772 static void
773 dump_decl (tree t, int flags)
775 if (t == NULL_TREE)
776 return;
778 switch (TREE_CODE (t))
780 case TYPE_DECL:
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);
796 break;
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),
802 flags);
803 break;
805 case VAR_DECL:
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);
811 break;
813 /* Else fall through. */
814 case FIELD_DECL:
815 case PARM_DECL:
816 dump_simple_decl (t, TREE_TYPE (t), flags);
817 break;
819 case RESULT_DECL:
820 pp_string (cxx_pp, "<return value> ");
821 dump_simple_decl (t, TREE_TYPE (t), flags);
822 break;
824 case NAMESPACE_DECL:
825 if (flags & TFF_DECL_SPECIFIERS)
826 pp_cxx_declaration (cxx_pp, t);
827 else
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>");
834 else
835 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
837 break;
839 case SCOPE_REF:
840 pp_expression (cxx_pp, t);
841 break;
843 case ARRAY_REF:
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);
848 break;
850 /* So that we can do dump_decl on an aggr type. */
851 case RECORD_TYPE:
852 case UNION_TYPE:
853 case ENUMERAL_TYPE:
854 dump_type (t, flags);
855 break;
857 case BIT_NOT_EXPR:
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);
862 break;
864 case TYPE_EXPR:
865 gcc_unreachable ();
866 break;
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);
876 break;
878 else
879 pp_cxx_tree_identifier (cxx_pp, t);
880 break;
882 case OVERLOAD:
883 if (OVL_CHAIN (t))
885 t = OVL_CURRENT (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);
897 break;
900 /* If there's only one function, just treat it like an ordinary
901 FUNCTION_DECL. */
902 t = OVL_CURRENT (t);
903 /* Fall through. */
905 case FUNCTION_DECL:
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);
910 else
911 dump_function_decl (t, flags);
912 break;
914 case TEMPLATE_DECL:
915 dump_template_decl (t, flags);
916 break;
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);
930 break;
932 case LABEL_DECL:
933 pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
934 break;
936 case CONST_DECL:
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);
945 else
946 pp_identifier (cxx_pp, "<enumerator>");
947 break;
949 case USING_DECL:
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);
954 break;
956 case STATIC_ASSERT:
957 pp_cxx_declaration (cxx_pp, t);
958 break;
960 case BASELINK:
961 dump_decl (BASELINK_FUNCTIONS (t), flags);
962 break;
964 case NON_DEPENDENT_EXPR:
965 dump_expr (t, flags);
966 break;
968 case TEMPLATE_TYPE_PARM:
969 if (flags & TFF_DECL_SPECIFIERS)
970 pp_cxx_declaration (cxx_pp, t);
971 else
972 pp_type_id (cxx_pp, t);
973 break;
975 case UNBOUND_CLASS_TEMPLATE:
976 case TYPE_PACK_EXPANSION:
977 case TREE_BINFO:
978 dump_type (t, flags);
979 break;
981 default:
982 pp_unsupported_tree (cxx_pp, t);
983 /* Fall through to error. */
985 case ERROR_MARK:
986 pp_identifier (cxx_pp, "<declaration error>");
987 break;
991 /* Dump a template declaration T under control of FLAGS. This means the
992 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
994 static void
995 dump_template_decl (tree t, int flags)
997 tree orig_parms = DECL_TEMPLATE_PARMS (t);
998 tree parms;
999 int i;
1001 if (flags & TFF_TEMPLATE_HEADER)
1003 for (parms = orig_parms = nreverse (orig_parms);
1004 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++)
1019 if (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);
1045 else
1047 gcc_assert (TREE_TYPE (t));
1048 switch (NEXT_CODE (t))
1050 case METHOD_TYPE:
1051 case FUNCTION_TYPE:
1052 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1053 break;
1054 default:
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. */
1069 static void
1070 dump_function_decl (tree t, int flags)
1072 tree fntype;
1073 tree parmtypes;
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))
1087 tree tmpl;
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);
1094 t = 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))
1108 /* OK */;
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? */
1115 if (show_return)
1116 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1117 && !DECL_DESTRUCTOR_P (t);
1118 if (show_return)
1119 dump_type_prefix (TREE_TYPE (fntype), flags);
1121 /* Print the function name. */
1122 if (!do_outer_scope)
1123 /* Nothing. */;
1124 else if (cname)
1126 dump_type (cname, flags);
1127 pp_cxx_colon_colon (cxx_pp);
1129 else
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);
1151 if (show_return)
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. */
1171 static void
1172 dump_parameters (tree parmtypes, int flags)
1174 int first = 1;
1175 pp_cxx_left_paren (cxx_pp);
1177 for (first = 1; parmtypes != void_list_node;
1178 parmtypes = TREE_CHAIN (parmtypes))
1180 if (!first)
1181 pp_separate_with_comma (cxx_pp);
1182 first = 0;
1183 if (!parmtypes)
1185 pp_cxx_identifier (cxx_pp, "...");
1186 break;
1189 dump_type (TREE_VALUE (parmtypes), flags);
1191 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1193 pp_cxx_whitespace (cxx_pp);
1194 pp_equal (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. */
1205 static void
1206 dump_exception_spec (tree t, int flags)
1208 if (t)
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)
1214 while (1)
1216 dump_type (TREE_VALUE (t), flags);
1217 t = TREE_CHAIN (t);
1218 if (!t)
1219 break;
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. */
1229 static void
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
1238 literal name. */
1239 if (!DECL_LANG_SPECIFIC (t))
1241 pp_cxx_tree_identifier (cxx_pp, name);
1242 return;
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);
1271 else
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
1285 decoration. */
1287 static void
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)
1293 return;
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)
1301 int len, ix;
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. */
1315 if (ix
1316 && (!ARGUMENT_PACK_P (arg)
1317 || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0))
1318 pp_separate_with_comma (cxx_pp);
1320 if (!arg)
1321 pp_identifier (cxx_pp, "<template parameter error>");
1322 else
1323 dump_template_argument (arg, flags);
1326 else if (primary)
1328 tree tpl = TI_TEMPLATE (info);
1329 tree parms = DECL_TEMPLATE_PARMS (tpl);
1330 int len, ix;
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++)
1337 tree parm;
1339 if (TREE_VEC_ELT (parms, ix) == error_mark_node)
1341 pp_identifier (cxx_pp, "<template parameter error>");
1342 continue;
1345 parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1347 if (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. */
1359 static void
1360 dump_call_expr_args (tree t, int flags, bool skipfirst)
1362 tree arg;
1363 call_expr_arg_iterator iter;
1365 pp_cxx_left_paren (cxx_pp);
1366 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
1368 if (skipfirst)
1369 skipfirst = false;
1370 else
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
1382 true. */
1384 static void
1385 dump_aggr_init_expr_args (tree t, int flags, bool skipfirst)
1387 tree arg;
1388 aggr_init_expr_arg_iterator iter;
1390 pp_cxx_left_paren (cxx_pp);
1391 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
1393 if (skipfirst)
1394 skipfirst = false;
1395 else
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). */
1407 static void
1408 dump_expr_list (tree l, int flags)
1410 while (l)
1412 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1413 l = TREE_CHAIN (l);
1414 if (l)
1415 pp_separate_with_comma (cxx_pp);
1419 /* Print out a vector of initializers (subr of dump_expr). */
1421 static void
1422 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1424 unsigned HOST_WIDE_INT idx;
1425 tree value;
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. */
1441 static tree
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)));
1447 while (index)
1449 fun = TREE_CHAIN (fun);
1450 index -= (TARGET_VTABLE_USES_DESCRIPTORS
1451 ? TARGET_VTABLE_USES_DESCRIPTORS : 1);
1454 return BV_FN (fun);
1457 /* Print out an expression E under control of FLAGS. */
1459 static void
1460 dump_expr (tree t, int flags)
1462 if (t == 0)
1463 return;
1465 if (STATEMENT_CLASS_P (t))
1467 pp_cxx_identifier (cxx_pp, "<statement>");
1468 return;
1471 switch (TREE_CODE (t))
1473 case VAR_DECL:
1474 case PARM_DECL:
1475 case FIELD_DECL:
1476 case CONST_DECL:
1477 case FUNCTION_DECL:
1478 case TEMPLATE_DECL:
1479 case NAMESPACE_DECL:
1480 case LABEL_DECL:
1481 case OVERLOAD:
1482 case IDENTIFIER_NODE:
1483 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1484 break;
1486 case INTEGER_CST:
1487 case REAL_CST:
1488 case STRING_CST:
1489 case COMPLEX_CST:
1490 pp_constant (cxx_pp, t);
1491 break;
1493 case THROW_EXPR:
1494 pp_cxx_identifier (cxx_pp, "throw");
1495 dump_expr (TREE_OPERAND (t, 0), flags);
1496 break;
1498 case PTRMEM_CST:
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)));
1503 break;
1505 case COMPOUND_EXPR:
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);
1511 break;
1513 case COND_EXPR:
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);
1521 break;
1523 case SAVE_EXPR:
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);
1530 else
1531 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1532 break;
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);
1545 else
1546 dump_decl (fn, 0);
1548 else
1549 dump_expr (AGGR_INIT_EXPR_FN (t), 0);
1551 dump_aggr_init_expr_args (t, flags, true);
1552 break;
1554 case CALL_EXPR:
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);
1580 skipfirst = true;
1582 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1583 dump_call_expr_args (t, flags, skipfirst);
1585 break;
1587 case TARGET_EXPR:
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);
1595 break;
1597 case POINTER_PLUS_EXPR:
1598 dump_binary_op ("+", t, flags);
1599 break;
1601 case INIT_EXPR:
1602 case MODIFY_EXPR:
1603 case PLUS_EXPR:
1604 case MINUS_EXPR:
1605 case MULT_EXPR:
1606 case TRUNC_DIV_EXPR:
1607 case TRUNC_MOD_EXPR:
1608 case MIN_EXPR:
1609 case MAX_EXPR:
1610 case LSHIFT_EXPR:
1611 case RSHIFT_EXPR:
1612 case BIT_IOR_EXPR:
1613 case BIT_XOR_EXPR:
1614 case BIT_AND_EXPR:
1615 case TRUTH_ANDIF_EXPR:
1616 case TRUTH_ORIF_EXPR:
1617 case LT_EXPR:
1618 case LE_EXPR:
1619 case GT_EXPR:
1620 case GE_EXPR:
1621 case EQ_EXPR:
1622 case NE_EXPR:
1623 case EXACT_DIV_EXPR:
1624 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1625 break;
1627 case CEIL_DIV_EXPR:
1628 case FLOOR_DIV_EXPR:
1629 case ROUND_DIV_EXPR:
1630 case RDIV_EXPR:
1631 dump_binary_op ("/", t, flags);
1632 break;
1634 case CEIL_MOD_EXPR:
1635 case FLOOR_MOD_EXPR:
1636 case ROUND_MOD_EXPR:
1637 dump_binary_op ("%", t, flags);
1638 break;
1640 case COMPONENT_REF:
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
1647 || (DECL_NAME (ob)
1648 && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1650 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1651 pp_cxx_arrow (cxx_pp);
1654 else
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);
1661 break;
1663 case ARRAY_REF:
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);
1668 break;
1670 case UNARY_PLUS_EXPR:
1671 dump_unary_op ("+", t, flags);
1672 break;
1674 case ADDR_EXPR:
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. */
1680 || (TREE_TYPE (t)
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);
1685 else
1686 dump_unary_op ("&", t, flags);
1687 break;
1689 case INDIRECT_REF:
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);
1697 else
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);
1703 else
1704 dump_unary_op ("*", t, flags);
1706 break;
1708 case NEGATE_EXPR:
1709 case BIT_NOT_EXPR:
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);
1714 break;
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);
1722 break;
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
1727 this. */
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);
1743 break;
1745 /* Else fall through. */
1747 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1748 break;
1750 CASE_CONVERT:
1751 case VIEW_CONVERT_EXPR:
1753 tree op = TREE_OPERAND (t, 0);
1755 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1757 /* It is a cast, but we cannot tell whether it is a
1758 reinterpret or static cast. Use the C style notation. */
1759 if (flags & TFF_EXPR_IN_PARENS)
1760 pp_cxx_left_paren (cxx_pp);
1761 pp_cxx_left_paren (cxx_pp);
1762 dump_type (TREE_TYPE (t), flags);
1763 pp_cxx_right_paren (cxx_pp);
1764 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1765 if (flags & TFF_EXPR_IN_PARENS)
1766 pp_cxx_right_paren (cxx_pp);
1768 else
1769 dump_expr (op, flags);
1770 break;
1773 case CONSTRUCTOR:
1774 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1776 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1778 if (integer_zerop (idx))
1780 /* A NULL pointer-to-member constant. */
1781 pp_cxx_left_paren (cxx_pp);
1782 pp_cxx_left_paren (cxx_pp);
1783 dump_type (TREE_TYPE (t), flags);
1784 pp_cxx_right_paren (cxx_pp);
1785 pp_character (cxx_pp, '0');
1786 pp_cxx_right_paren (cxx_pp);
1787 break;
1789 else if (host_integerp (idx, 0))
1791 tree virtuals;
1792 unsigned HOST_WIDE_INT n;
1794 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1795 t = TYPE_METHOD_BASETYPE (t);
1796 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1798 n = tree_low_cst (idx, 0);
1800 /* Map vtable index back one, to allow for the null pointer to
1801 member. */
1802 --n;
1804 while (n > 0 && virtuals)
1806 --n;
1807 virtuals = TREE_CHAIN (virtuals);
1809 if (virtuals)
1811 dump_expr (BV_FN (virtuals),
1812 flags | TFF_EXPR_IN_PARENS);
1813 break;
1817 if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
1819 dump_type (TREE_TYPE (t), 0);
1820 pp_cxx_left_paren (cxx_pp);
1821 pp_cxx_right_paren (cxx_pp);
1823 else
1825 pp_cxx_left_brace (cxx_pp);
1826 dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
1827 pp_cxx_right_brace (cxx_pp);
1830 break;
1832 case OFFSET_REF:
1834 tree ob = TREE_OPERAND (t, 0);
1835 if (is_dummy_object (ob))
1837 t = TREE_OPERAND (t, 1);
1838 if (TREE_CODE (t) == FUNCTION_DECL)
1839 /* A::f */
1840 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1841 else if (BASELINK_P (t))
1842 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1843 flags | TFF_EXPR_IN_PARENS);
1844 else
1845 dump_decl (t, flags);
1847 else
1849 if (TREE_CODE (ob) == INDIRECT_REF)
1851 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1852 pp_cxx_arrow (cxx_pp);
1853 pp_cxx_star (cxx_pp);
1855 else
1857 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1858 pp_cxx_dot (cxx_pp);
1859 pp_cxx_star (cxx_pp);
1861 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1863 break;
1866 case TEMPLATE_PARM_INDEX:
1867 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1868 break;
1870 case CAST_EXPR:
1871 if (TREE_OPERAND (t, 0) == NULL_TREE
1872 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1874 dump_type (TREE_TYPE (t), flags);
1875 pp_cxx_left_paren (cxx_pp);
1876 dump_expr_list (TREE_OPERAND (t, 0), flags);
1877 pp_cxx_right_paren (cxx_pp);
1879 else
1881 pp_cxx_left_paren (cxx_pp);
1882 dump_type (TREE_TYPE (t), flags);
1883 pp_cxx_right_paren (cxx_pp);
1884 pp_cxx_left_paren (cxx_pp);
1885 dump_expr_list (TREE_OPERAND (t, 0), flags);
1886 pp_cxx_right_paren (cxx_pp);
1888 break;
1890 case STATIC_CAST_EXPR:
1891 pp_cxx_identifier (cxx_pp, "static_cast");
1892 goto cast;
1893 case REINTERPRET_CAST_EXPR:
1894 pp_cxx_identifier (cxx_pp, "reinterpret_cast");
1895 goto cast;
1896 case CONST_CAST_EXPR:
1897 pp_cxx_identifier (cxx_pp, "const_cast");
1898 goto cast;
1899 case DYNAMIC_CAST_EXPR:
1900 pp_cxx_identifier (cxx_pp, "dynamic_cast");
1901 cast:
1902 pp_cxx_begin_template_argument_list (cxx_pp);
1903 dump_type (TREE_TYPE (t), flags);
1904 pp_cxx_end_template_argument_list (cxx_pp);
1905 pp_cxx_left_paren (cxx_pp);
1906 dump_expr (TREE_OPERAND (t, 0), flags);
1907 pp_cxx_right_paren (cxx_pp);
1908 break;
1910 case ARROW_EXPR:
1911 dump_expr (TREE_OPERAND (t, 0), flags);
1912 pp_cxx_arrow (cxx_pp);
1913 break;
1915 case SIZEOF_EXPR:
1916 case ALIGNOF_EXPR:
1917 if (TREE_CODE (t) == SIZEOF_EXPR)
1918 pp_cxx_identifier (cxx_pp, "sizeof");
1919 else
1921 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
1922 pp_cxx_identifier (cxx_pp, "__alignof__");
1924 pp_cxx_whitespace (cxx_pp);
1925 pp_cxx_left_paren (cxx_pp);
1926 if (TYPE_P (TREE_OPERAND (t, 0)))
1927 dump_type (TREE_OPERAND (t, 0), flags);
1928 else
1929 dump_expr (TREE_OPERAND (t, 0), flags);
1930 pp_cxx_right_paren (cxx_pp);
1931 break;
1933 case REALPART_EXPR:
1934 case IMAGPART_EXPR:
1935 pp_cxx_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1936 pp_cxx_whitespace (cxx_pp);
1937 dump_expr (TREE_OPERAND (t, 0), flags);
1938 break;
1940 case DEFAULT_ARG:
1941 pp_identifier (cxx_pp, "<unparsed>");
1942 break;
1944 case TRY_CATCH_EXPR:
1945 case WITH_CLEANUP_EXPR:
1946 case CLEANUP_POINT_EXPR:
1947 dump_expr (TREE_OPERAND (t, 0), flags);
1948 break;
1950 case PSEUDO_DTOR_EXPR:
1951 dump_expr (TREE_OPERAND (t, 2), flags);
1952 pp_cxx_dot (cxx_pp);
1953 dump_type (TREE_OPERAND (t, 0), flags);
1954 pp_cxx_colon_colon (cxx_pp);
1955 pp_cxx_complement (cxx_pp);
1956 dump_type (TREE_OPERAND (t, 1), flags);
1957 break;
1959 case TEMPLATE_ID_EXPR:
1960 dump_decl (t, flags);
1961 break;
1963 case BIND_EXPR:
1964 case STMT_EXPR:
1965 case STATEMENT_LIST:
1966 /* We don't yet have a way of dumping statements in a
1967 human-readable format. */
1968 pp_string (cxx_pp, "({...})");
1969 break;
1971 case LOOP_EXPR:
1972 pp_string (cxx_pp, "while (1) { ");
1973 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1974 pp_cxx_right_brace (cxx_pp);
1975 break;
1977 case EXIT_EXPR:
1978 pp_string (cxx_pp, "if (");
1979 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1980 pp_string (cxx_pp, ") break; ");
1981 break;
1983 case BASELINK:
1984 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
1985 break;
1987 case EMPTY_CLASS_EXPR:
1988 dump_type (TREE_TYPE (t), flags);
1989 pp_cxx_left_paren (cxx_pp);
1990 pp_cxx_right_paren (cxx_pp);
1991 break;
1993 case NON_DEPENDENT_EXPR:
1994 dump_expr (TREE_OPERAND (t, 0), flags);
1995 break;
1997 case ARGUMENT_PACK_SELECT:
1998 dump_template_argument (ARGUMENT_PACK_SELECT_FROM_PACK (t), flags);
1999 break;
2001 case RECORD_TYPE:
2002 case UNION_TYPE:
2003 case ENUMERAL_TYPE:
2004 case REAL_TYPE:
2005 case VOID_TYPE:
2006 case BOOLEAN_TYPE:
2007 case INTEGER_TYPE:
2008 case COMPLEX_TYPE:
2009 case VECTOR_TYPE:
2010 pp_type_specifier_seq (cxx_pp, t);
2011 break;
2013 case TYPENAME_TYPE:
2014 /* We get here when we want to print a dependent type as an
2015 id-expression, without any disambiguator decoration. */
2016 pp_id_expression (cxx_pp, t);
2017 break;
2019 case TEMPLATE_TYPE_PARM:
2020 case BOUND_TEMPLATE_TEMPLATE_PARM:
2021 dump_type (t, flags);
2022 break;
2024 case TRAIT_EXPR:
2025 pp_cxx_trait_expression (cxx_pp, t);
2026 break;
2028 case VA_ARG_EXPR:
2029 pp_cxx_va_arg_expression (cxx_pp, t);
2030 break;
2032 case OFFSETOF_EXPR:
2033 pp_cxx_offsetof_expression (cxx_pp, t);
2034 break;
2036 case SCOPE_REF:
2037 case EXPR_PACK_EXPANSION:
2038 case TYPEID_EXPR:
2039 case MEMBER_REF:
2040 case DOTSTAR_EXPR:
2041 case NEW_EXPR:
2042 case VEC_NEW_EXPR:
2043 case DELETE_EXPR:
2044 case VEC_DELETE_EXPR:
2045 case MODOP_EXPR:
2046 case ABS_EXPR:
2047 case CONJ_EXPR:
2048 case VECTOR_CST:
2049 case FIXED_CST:
2050 case UNORDERED_EXPR:
2051 case ORDERED_EXPR:
2052 case UNLT_EXPR:
2053 case UNLE_EXPR:
2054 case UNGT_EXPR:
2055 case UNGE_EXPR:
2056 case UNEQ_EXPR:
2057 case LTGT_EXPR:
2058 pp_expression (cxx_pp, t);
2059 break;
2061 case TRUTH_AND_EXPR:
2062 case TRUTH_OR_EXPR:
2063 case TRUTH_XOR_EXPR:
2064 if (flags & TFF_EXPR_IN_PARENS)
2065 pp_cxx_left_paren (cxx_pp);
2066 pp_expression (cxx_pp, t);
2067 if (flags & TFF_EXPR_IN_PARENS)
2068 pp_cxx_right_paren (cxx_pp);
2069 break;
2071 case OBJ_TYPE_REF:
2072 dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
2073 break;
2075 /* This list is incomplete, but should suffice for now.
2076 It is very important that `sorry' does not call
2077 `report_error_function'. That could cause an infinite loop. */
2078 default:
2079 pp_unsupported_tree (cxx_pp, t);
2080 /* fall through to ERROR_MARK... */
2081 case ERROR_MARK:
2082 pp_identifier (cxx_pp, "<expression error>");
2083 break;
2087 static void
2088 dump_binary_op (const char *opstring, tree t, int flags)
2090 pp_cxx_left_paren (cxx_pp);
2091 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
2092 pp_cxx_whitespace (cxx_pp);
2093 if (opstring)
2094 pp_cxx_identifier (cxx_pp, opstring);
2095 else
2096 pp_identifier (cxx_pp, "<unknown operator>");
2097 pp_cxx_whitespace (cxx_pp);
2098 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
2099 pp_cxx_right_paren (cxx_pp);
2102 static void
2103 dump_unary_op (const char *opstring, tree t, int flags)
2105 if (flags & TFF_EXPR_IN_PARENS)
2106 pp_cxx_left_paren (cxx_pp);
2107 pp_cxx_identifier (cxx_pp, opstring);
2108 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
2109 if (flags & TFF_EXPR_IN_PARENS)
2110 pp_cxx_right_paren (cxx_pp);
2113 static void
2114 reinit_cxx_pp (void)
2116 pp_clear_output_area (cxx_pp);
2117 pp_base (cxx_pp)->padding = pp_none;
2118 pp_indentation (cxx_pp) = 0;
2119 pp_needs_newline (cxx_pp) = false;
2120 cxx_pp->enclosing_scope = current_function_decl;
2124 /* Exported interface to stringifying types, exprs and decls under TFF_*
2125 control. */
2127 const char *
2128 type_as_string (tree typ, int flags)
2130 reinit_cxx_pp ();
2131 dump_type (typ, flags);
2132 return pp_formatted_text (cxx_pp);
2135 const char *
2136 expr_as_string (tree decl, int flags)
2138 reinit_cxx_pp ();
2139 dump_expr (decl, flags);
2140 return pp_formatted_text (cxx_pp);
2143 const char *
2144 decl_as_string (tree decl, int flags)
2146 reinit_cxx_pp ();
2147 dump_decl (decl, flags);
2148 return pp_formatted_text (cxx_pp);
2151 /* Generate the three forms of printable names for cxx_printable_name. */
2153 const char *
2154 lang_decl_name (tree decl, int v)
2156 if (v >= 2)
2157 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2159 reinit_cxx_pp ();
2160 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
2162 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
2163 pp_cxx_colon_colon (cxx_pp);
2166 if (TREE_CODE (decl) == FUNCTION_DECL)
2167 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2168 else
2169 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2171 return pp_formatted_text (cxx_pp);
2174 /* Return the location of a tree passed to %+ formats. */
2176 static location_t
2177 location_of (tree t)
2179 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
2180 t = DECL_CONTEXT (t);
2181 else if (TYPE_P (t))
2182 t = TYPE_MAIN_DECL (t);
2183 else if (TREE_CODE (t) == OVERLOAD)
2184 t = OVL_FUNCTION (t);
2186 return DECL_SOURCE_LOCATION (t);
2189 /* Now the interfaces from error et al to dump_type et al. Each takes an
2190 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
2191 function. */
2193 static const char *
2194 decl_to_string (tree decl, int verbose)
2196 int flags = 0;
2198 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2199 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2200 flags = TFF_CLASS_KEY_OR_ENUM;
2201 if (verbose)
2202 flags |= TFF_DECL_SPECIFIERS;
2203 else if (TREE_CODE (decl) == FUNCTION_DECL)
2204 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2205 flags |= TFF_TEMPLATE_HEADER;
2207 reinit_cxx_pp ();
2208 dump_decl (decl, flags);
2209 return pp_formatted_text (cxx_pp);
2212 static const char *
2213 expr_to_string (tree decl)
2215 reinit_cxx_pp ();
2216 dump_expr (decl, 0);
2217 return pp_formatted_text (cxx_pp);
2220 static const char *
2221 fndecl_to_string (tree fndecl, int verbose)
2223 int flags;
2225 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2226 | TFF_TEMPLATE_HEADER;
2227 if (verbose)
2228 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2229 reinit_cxx_pp ();
2230 dump_decl (fndecl, flags);
2231 return pp_formatted_text (cxx_pp);
2235 static const char *
2236 code_to_string (enum tree_code c)
2238 return tree_code_name [c];
2241 const char *
2242 language_to_string (enum languages c)
2244 switch (c)
2246 case lang_c:
2247 return "C";
2249 case lang_cplusplus:
2250 return "C++";
2252 case lang_java:
2253 return "Java";
2255 default:
2256 gcc_unreachable ();
2258 return NULL;
2261 /* Return the proper printed version of a parameter to a C++ function. */
2263 static const char *
2264 parm_to_string (int p)
2266 reinit_cxx_pp ();
2267 if (p < 0)
2268 pp_string (cxx_pp, "'this'");
2269 else
2270 pp_decimal_int (cxx_pp, p + 1);
2271 return pp_formatted_text (cxx_pp);
2274 static const char *
2275 op_to_string (enum tree_code p)
2277 tree id = operator_name_info[(int) p].identifier;
2278 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2281 static const char *
2282 type_to_string (tree typ, int verbose)
2284 int flags = 0;
2285 if (verbose)
2286 flags |= TFF_CLASS_KEY_OR_ENUM;
2287 flags |= TFF_TEMPLATE_HEADER;
2289 reinit_cxx_pp ();
2290 dump_type (typ, flags);
2291 return pp_formatted_text (cxx_pp);
2294 static const char *
2295 assop_to_string (enum tree_code p)
2297 tree id = assignment_operator_name_info[(int) p].identifier;
2298 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2301 static const char *
2302 args_to_string (tree p, int verbose)
2304 int flags = 0;
2305 if (verbose)
2306 flags |= TFF_CLASS_KEY_OR_ENUM;
2308 if (p == NULL_TREE)
2309 return "";
2311 if (TYPE_P (TREE_VALUE (p)))
2312 return type_as_string (p, flags);
2314 reinit_cxx_pp ();
2315 for (; p; p = TREE_CHAIN (p))
2317 if (TREE_VALUE (p) == null_node)
2318 pp_cxx_identifier (cxx_pp, "NULL");
2319 else
2320 dump_type (error_type (TREE_VALUE (p)), flags);
2321 if (TREE_CHAIN (p))
2322 pp_separate_with_comma (cxx_pp);
2324 return pp_formatted_text (cxx_pp);
2327 static const char *
2328 cv_to_string (tree p, int v)
2330 reinit_cxx_pp ();
2331 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2332 pp_cxx_cv_qualifier_seq (cxx_pp, p);
2333 return pp_formatted_text (cxx_pp);
2336 /* Langhook for print_error_function. */
2337 void
2338 cxx_print_error_function (diagnostic_context *context, const char *file,
2339 diagnostic_info *diagnostic)
2341 lhd_print_error_function (context, file, diagnostic);
2342 pp_base_set_prefix (context->printer, file);
2343 maybe_print_instantiation_context (context);
2346 static void
2347 cp_diagnostic_starter (diagnostic_context *context,
2348 diagnostic_info *diagnostic)
2350 diagnostic_report_current_module (context);
2351 cp_print_error_function (context, diagnostic);
2352 maybe_print_instantiation_context (context);
2353 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2356 static void
2357 cp_diagnostic_finalizer (diagnostic_context *context,
2358 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2360 pp_base_destroy_prefix (context->printer);
2363 /* Print current function onto BUFFER, in the process of reporting
2364 a diagnostic message. Called from cp_diagnostic_starter. */
2365 static void
2366 cp_print_error_function (diagnostic_context *context,
2367 diagnostic_info *diagnostic)
2369 if (diagnostic_last_function_changed (context, diagnostic))
2371 const char *old_prefix = context->printer->prefix;
2372 const char *file = LOCATION_FILE (diagnostic->location);
2373 tree abstract_origin = diagnostic->abstract_origin;
2374 char *new_prefix = (file && abstract_origin == NULL)
2375 ? file_name_as_prefix (file) : NULL;
2377 pp_base_set_prefix (context->printer, new_prefix);
2379 if (current_function_decl == NULL)
2380 pp_base_string (context->printer, "At global scope:");
2381 else
2383 tree fndecl, ao;
2385 if (abstract_origin)
2387 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
2388 while (TREE_CODE (ao) == BLOCK && BLOCK_ABSTRACT_ORIGIN (ao))
2389 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2390 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
2391 fndecl = ao;
2393 else
2394 fndecl = current_function_decl;
2396 pp_printf (context->printer, "In %s %qs",
2397 function_category (fndecl),
2398 cxx_printable_name (fndecl, 2));
2400 while (abstract_origin)
2402 location_t *locus;
2403 tree block = abstract_origin;
2405 locus = &BLOCK_SOURCE_LOCATION (block);
2406 fndecl = NULL;
2407 block = BLOCK_SUPERCONTEXT (block);
2408 while (block && TREE_CODE (block) == BLOCK
2409 && BLOCK_ABSTRACT_ORIGIN (block))
2411 ao = BLOCK_ABSTRACT_ORIGIN (block);
2413 while (TREE_CODE (ao) == BLOCK
2414 && BLOCK_ABSTRACT_ORIGIN (ao)
2415 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
2416 ao = BLOCK_ABSTRACT_ORIGIN (ao);
2418 if (TREE_CODE (ao) == FUNCTION_DECL)
2420 fndecl = ao;
2421 break;
2423 else if (TREE_CODE (ao) != BLOCK)
2424 break;
2426 block = BLOCK_SUPERCONTEXT (block);
2428 if (fndecl)
2429 abstract_origin = block;
2430 else
2432 while (block && TREE_CODE (block) == BLOCK)
2433 block = BLOCK_SUPERCONTEXT (block);
2435 if (TREE_CODE (block) == FUNCTION_DECL)
2436 fndecl = block;
2437 abstract_origin = NULL;
2439 if (fndecl)
2441 expanded_location s = expand_location (*locus);
2442 pp_base_character (context->printer, ',');
2443 pp_base_newline (context->printer);
2444 if (s.file != NULL)
2446 if (flag_show_column && s.column != 0)
2447 pp_printf (context->printer,
2448 " inlined from %qs at %s:%d:%d",
2449 cxx_printable_name (fndecl, 2),
2450 s.file, s.line, s.column);
2451 else
2452 pp_printf (context->printer,
2453 " inlined from %qs at %s:%d",
2454 cxx_printable_name (fndecl, 2),
2455 s.file, s.line);
2458 else
2459 pp_printf (context->printer, " inlined from %qs",
2460 cxx_printable_name (fndecl, 2));
2463 pp_base_character (context->printer, ':');
2465 pp_base_newline (context->printer);
2467 diagnostic_set_last_function (context, diagnostic);
2468 pp_base_destroy_prefix (context->printer);
2469 context->printer->prefix = old_prefix;
2473 /* Returns a description of FUNCTION using standard terminology. */
2474 static const char *
2475 function_category (tree fn)
2477 if (DECL_FUNCTION_MEMBER_P (fn))
2479 if (DECL_STATIC_FUNCTION_P (fn))
2480 return "static member function";
2481 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2482 return "copy constructor";
2483 else if (DECL_CONSTRUCTOR_P (fn))
2484 return "constructor";
2485 else if (DECL_DESTRUCTOR_P (fn))
2486 return "destructor";
2487 else
2488 return "member function";
2490 else
2491 return "function";
2494 /* Report the full context of a current template instantiation,
2495 onto BUFFER. */
2496 static void
2497 print_instantiation_full_context (diagnostic_context *context)
2499 struct tinst_level *p = current_instantiation ();
2500 location_t location = input_location;
2502 if (p)
2504 if (current_function_decl != p->decl
2505 && current_function_decl != NULL_TREE)
2506 /* We can get here during the processing of some synthesized
2507 method. Then, P->DECL will be the function that's causing
2508 the synthesis. */
2510 else
2512 if (current_function_decl == p->decl)
2513 /* Avoid redundancy with the "In function" line. */;
2514 else
2515 pp_verbatim (context->printer,
2516 "%s: In instantiation of %qs:\n",
2517 LOCATION_FILE (location),
2518 decl_as_string (p->decl,
2519 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2521 location = p->locus;
2522 p = p->next;
2526 print_instantiation_partial_context (context, p, location);
2529 /* Same as above but less verbose. */
2530 static void
2531 print_instantiation_partial_context (diagnostic_context *context,
2532 struct tinst_level *t, location_t loc)
2534 expanded_location xloc;
2535 for (; ; t = t->next)
2537 xloc = expand_location (loc);
2538 if (t == NULL)
2539 break;
2540 pp_verbatim (context->printer, "%s:%d: instantiated from %qs\n",
2541 xloc.file, xloc.line,
2542 decl_as_string (t->decl,
2543 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2544 loc = t->locus;
2546 pp_verbatim (context->printer, "%s:%d: instantiated from here",
2547 xloc.file, xloc.line);
2548 pp_base_newline (context->printer);
2551 /* Called from cp_thing to print the template context for an error. */
2552 static void
2553 maybe_print_instantiation_context (diagnostic_context *context)
2555 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2556 return;
2558 record_last_problematic_instantiation ();
2559 print_instantiation_full_context (context);
2562 /* Report the bare minimum context of a template instantiation. */
2563 void
2564 print_instantiation_context (void)
2566 print_instantiation_partial_context
2567 (global_dc, current_instantiation (), input_location);
2568 diagnostic_flush_buffer (global_dc);
2571 /* Called from output_format -- during diagnostic message processing --
2572 to handle C++ specific format specifier with the following meanings:
2573 %A function argument-list.
2574 %C tree code.
2575 %D declaration.
2576 %E expression.
2577 %F function declaration.
2578 %L language as used in extern "lang".
2579 %O binary operator.
2580 %P function parameter whose position is indicated by an integer.
2581 %Q assignment operator.
2582 %T type.
2583 %V cv-qualifier. */
2584 static bool
2585 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2586 int precision, bool wide, bool set_locus, bool verbose)
2588 const char *result;
2589 tree t = NULL;
2590 #define next_tree (t = va_arg (*text->args_ptr, tree))
2591 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2592 #define next_lang va_arg (*text->args_ptr, enum languages)
2593 #define next_int va_arg (*text->args_ptr, int)
2595 if (precision != 0 || wide)
2596 return false;
2598 if (text->locus == NULL)
2599 set_locus = false;
2601 switch (*spec)
2603 case 'A': result = args_to_string (next_tree, verbose); break;
2604 case 'C': result = code_to_string (next_tcode); break;
2605 case 'D':
2607 tree temp = next_tree;
2608 if (DECL_P (temp)
2609 && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp))
2611 temp = DECL_DEBUG_EXPR (temp);
2612 if (!DECL_P (temp))
2614 result = expr_to_string (temp);
2615 break;
2618 result = decl_to_string (temp, verbose);
2620 break;
2621 case 'E': result = expr_to_string (next_tree); break;
2622 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2623 case 'L': result = language_to_string (next_lang); break;
2624 case 'O': result = op_to_string (next_tcode); break;
2625 case 'P': result = parm_to_string (next_int); break;
2626 case 'Q': result = assop_to_string (next_tcode); break;
2627 case 'T': result = type_to_string (next_tree, verbose); break;
2628 case 'V': result = cv_to_string (next_tree, verbose); break;
2630 default:
2631 return false;
2634 pp_base_string (pp, result);
2635 if (set_locus && t != NULL)
2636 *text->locus = location_of (t);
2637 return true;
2638 #undef next_tree
2639 #undef next_tcode
2640 #undef next_lang
2641 #undef next_int
2644 /* Callback from cpp_error for PFILE to print diagnostics arising from
2645 interpreting strings. The diagnostic is of type LEVEL; MSG is the
2646 translated message and AP the arguments. */
2648 void
2649 cp_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
2650 const char *msg, va_list *ap)
2652 diagnostic_info diagnostic;
2653 diagnostic_t dlevel;
2654 switch (level)
2656 case CPP_DL_WARNING:
2657 case CPP_DL_WARNING_SYSHDR:
2658 dlevel = DK_WARNING;
2659 break;
2660 case CPP_DL_PEDWARN:
2661 dlevel = pedantic_warning_kind ();
2662 break;
2663 case CPP_DL_ERROR:
2664 dlevel = DK_ERROR;
2665 break;
2666 case CPP_DL_ICE:
2667 dlevel = DK_ICE;
2668 break;
2669 default:
2670 gcc_unreachable ();
2672 diagnostic_set_info_translated (&diagnostic, msg, ap,
2673 input_location, dlevel);
2674 report_diagnostic (&diagnostic);
2677 /* Warn about the use of variadic templates when appropriate. */
2678 void
2679 maybe_warn_variadic_templates (void)
2681 if ((cxx_dialect == cxx98) && !in_system_header)
2682 /* We really want to suppress this warning in system headers,
2683 because libstdc++ uses variadic templates even when we aren't
2684 in C++0x mode. */
2685 pedwarn ("ISO C++ does not include variadic templates");