ropeimpl.h: #include <ostream> instead of <iostream>
[official-gcc.git] / gcc / cp / error.c
blob9aeb555c615033fe0df690bc3277a8725b3270af
1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002,
4 2003 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
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 COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "cp-tree.h"
28 #include "real.h"
29 #include "toplev.h"
30 #include "flags.h"
31 #include "diagnostic.h"
32 #include "langhooks-def.h"
33 #include "cxx-pretty-print.h"
35 enum pad { none, before, after };
37 #define pp_template_argument_list_start(PP) \
38 pp_non_consecutive_character (PP, '<')
39 #define pp_template_argument_list_end(PP) \
40 pp_non_consecutive_character (PP, '>')
41 #define pp_separate_with_comma(PP) pp_string (PP, ", ")
43 /* The global buffer where we dump everything. It is there only for
44 transitional purpose. It is expected, in the near future, to be
45 completely removed. */
46 static cxx_pretty_printer scratch_pretty_printer;
47 #define cxx_pp (&scratch_pretty_printer)
49 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
51 #define reinit_global_formatting_buffer() \
52 output_clear_message_text (scratch_buffer)
54 static const char *args_to_string (tree, int);
55 static const char *assop_to_string (enum tree_code);
56 static const char *code_to_string (enum tree_code);
57 static const char *cv_to_string (tree, int);
58 static const char *decl_to_string (tree, int);
59 static const char *expr_to_string (tree);
60 static const char *fndecl_to_string (tree, int);
61 static const char *op_to_string (enum tree_code);
62 static const char *parm_to_string (int);
63 static const char *type_to_string (tree, int);
65 static void dump_type (tree, int);
66 static void dump_typename (tree, int);
67 static void dump_simple_decl (tree, tree, int);
68 static void dump_decl (tree, int);
69 static void dump_template_decl (tree, int);
70 static void dump_function_decl (tree, int);
71 static void dump_expr (tree, int);
72 static void dump_unary_op (const char *, tree, int);
73 static void dump_binary_op (const char *, tree, int);
74 static void dump_aggr_type (tree, int);
75 static enum pad dump_type_prefix (tree, int);
76 static void dump_type_suffix (tree, int);
77 static void dump_function_name (tree, int);
78 static void dump_expr_list (tree, int);
79 static void dump_global_iord (tree);
80 static enum pad dump_qualifiers (tree, enum pad);
81 static void dump_parameters (tree, int);
82 static void dump_exception_spec (tree, int);
83 static const char *class_key_or_enum (tree);
84 static void dump_template_argument (tree, int);
85 static void dump_template_argument_list (tree, int);
86 static void dump_template_parameter (tree, int);
87 static void dump_template_bindings (tree, tree);
88 static void dump_scope (tree, int);
89 static void dump_template_parms (tree, int, int);
91 static const char *function_category (tree);
92 static void maybe_print_instantiation_context (diagnostic_context *);
93 static void print_instantiation_full_context (diagnostic_context *);
94 static void print_instantiation_partial_context (diagnostic_context *,
95 tree, location_t);
96 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
97 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
98 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
100 static bool cp_printer (pretty_printer *, text_info *);
101 static void pp_non_consecutive_character (cxx_pretty_printer *, int);
102 static tree locate_error (const char *, va_list);
103 static location_t location_of (tree);
105 void
106 init_error (void)
108 diagnostic_starter (global_dc) = cp_diagnostic_starter;
109 diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
110 diagnostic_format_decoder (global_dc) = cp_printer;
112 pp_construct (pp_base (cxx_pp), NULL, 0);
113 pp_cxx_pretty_printer_init (cxx_pp);
116 /* Dump a scope, if deemed necessary. */
118 static void
119 dump_scope (tree scope, int flags)
121 int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
123 if (scope == NULL_TREE)
124 return;
126 if (TREE_CODE (scope) == NAMESPACE_DECL)
128 if (scope != global_namespace)
130 dump_decl (scope, f);
131 pp_colon_colon (cxx_pp);
134 else if (AGGREGATE_TYPE_P (scope))
136 dump_type (scope, f);
137 pp_colon_colon (cxx_pp);
139 else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
141 dump_function_decl (scope, f);
142 pp_colon_colon (cxx_pp);
146 /* Dump type qualifiers, providing padding as requested. Return an
147 indication of whether we dumped something. */
149 static enum pad
150 dump_qualifiers (tree t, enum pad p)
152 static const int masks[] =
153 {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT};
154 static const char *const names[] =
155 {"const", "volatile", "__restrict"};
156 int ix;
157 int quals = TYPE_QUALS (t);
158 int do_after = p == after;
160 if (quals)
162 for (ix = 0; ix != 3; ix++)
163 if (masks[ix] & quals)
165 if (p == before)
166 pp_space (cxx_pp);
167 p = before;
168 pp_identifier (cxx_pp, names[ix]);
170 if (do_after)
171 pp_space (cxx_pp);
173 else
174 p = none;
175 return p;
178 /* Dump the template ARGument under control of FLAGS. */
180 static void
181 dump_template_argument (tree arg, int flags)
183 if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
184 dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
185 else
186 dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
189 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
190 of FLAGS. */
192 static void
193 dump_template_argument_list (tree args, int flags)
195 int n = TREE_VEC_LENGTH (args);
196 int need_comma = 0;
197 int i;
199 for (i = 0; i< n; ++i)
201 if (need_comma)
202 pp_separate_with_comma (cxx_pp);
203 dump_template_argument (TREE_VEC_ELT (args, i), flags);
204 need_comma = 1;
208 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
210 static void
211 dump_template_parameter (tree parm, int flags)
213 tree p = TREE_VALUE (parm);
214 tree a = TREE_PURPOSE (parm);
216 if (TREE_CODE (p) == TYPE_DECL)
218 if (flags & TFF_DECL_SPECIFIERS)
220 pp_identifier (cxx_pp, "class");
221 if (DECL_NAME (p))
223 pp_space (cxx_pp);
224 pp_tree_identifier (cxx_pp, DECL_NAME (p));
227 else if (DECL_NAME (p))
228 pp_tree_identifier (cxx_pp, DECL_NAME (p));
229 else
230 pp_identifier (cxx_pp, "<template default argument error>");
232 else
233 dump_decl (p, flags | TFF_DECL_SPECIFIERS);
235 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
237 pp_string (cxx_pp, " = ");
238 if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
239 dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
240 else
241 dump_expr (a, flags | TFF_EXPR_IN_PARENS);
245 /* Dump, under control of FLAGS, a template-parameter-list binding.
246 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
247 TREE_VEC. */
249 static void
250 dump_template_bindings (tree parms, tree args)
252 int need_comma = 0;
254 while (parms)
256 tree p = TREE_VALUE (parms);
257 int lvl = TMPL_PARMS_DEPTH (parms);
258 int arg_idx = 0;
259 int i;
261 for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
263 tree arg = NULL_TREE;
265 /* Don't crash if we had an invalid argument list. */
266 if (TMPL_ARGS_DEPTH (args) >= lvl)
268 tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
269 if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
270 arg = TREE_VEC_ELT (lvl_args, arg_idx);
273 if (need_comma)
274 pp_separate_with_comma (cxx_pp);
275 dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
276 pp_string (cxx_pp, " = ");
277 if (arg)
278 dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
279 else
280 pp_identifier (cxx_pp, "<missing>");
282 ++arg_idx;
283 need_comma = 1;
286 parms = TREE_CHAIN (parms);
290 /* Dump a human-readable equivalent of TYPE. FLAGS controls the
291 format. */
293 static void
294 dump_type (tree t, int flags)
296 if (t == NULL_TREE)
297 return;
299 if (TYPE_PTRMEMFUNC_P (t))
300 goto offset_type;
302 switch (TREE_CODE (t))
304 case UNKNOWN_TYPE:
305 pp_identifier (cxx_pp, "<unknown type>");
306 break;
308 case TREE_LIST:
309 /* A list of function parms. */
310 dump_parameters (t, flags);
311 break;
313 case IDENTIFIER_NODE:
314 pp_tree_identifier (cxx_pp, t);
315 break;
317 case TREE_VEC:
318 dump_type (BINFO_TYPE (t), flags);
319 break;
321 case RECORD_TYPE:
322 case UNION_TYPE:
323 case ENUMERAL_TYPE:
324 dump_aggr_type (t, flags);
325 break;
327 case TYPE_DECL:
328 if (flags & TFF_CHASE_TYPEDEF)
330 dump_type (DECL_ORIGINAL_TYPE (t)
331 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
332 break;
334 /* else fallthrough */
336 case TEMPLATE_DECL:
337 case NAMESPACE_DECL:
338 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
339 break;
341 case COMPLEX_TYPE:
342 pp_string (cxx_pp, "__complex__ ");
343 dump_type (TREE_TYPE (t), flags);
344 break;
346 case VECTOR_TYPE:
347 pp_string (cxx_pp, "__vector__ ");
349 /* The subtype of a VECTOR_TYPE is something like intQI_type_node,
350 which has no name and is not very useful for diagnostics. So
351 look up the equivalent C type and print its name. */
352 tree elt = TREE_TYPE (t);
353 elt = c_common_type_for_mode (TYPE_MODE (elt), TREE_UNSIGNED (elt));
354 dump_type (elt, flags);
356 break;
358 case INTEGER_TYPE:
359 if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && TREE_UNSIGNED (t))
360 pp_string (cxx_pp, "unsigned ");
361 else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && !TREE_UNSIGNED (t))
362 pp_string (cxx_pp, "signed ");
364 /* fall through. */
365 case REAL_TYPE:
366 case VOID_TYPE:
367 case BOOLEAN_TYPE:
369 tree type;
370 dump_qualifiers (t, after);
371 type = flags & TFF_CHASE_TYPEDEF ? TYPE_MAIN_VARIANT (t) : t;
372 if (TYPE_NAME (type) && TYPE_IDENTIFIER (type))
373 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (type));
374 else
375 /* Types like intQI_type_node and friends have no names.
376 These don't come up in user error messages, but it's nice
377 to be able to print them from the debugger. */
378 pp_identifier (cxx_pp, "<anonymous>");
380 break;
382 case TEMPLATE_TEMPLATE_PARM:
383 /* For parameters inside template signature. */
384 if (TYPE_IDENTIFIER (t))
385 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
386 else
387 pp_identifier (cxx_pp, "<anonymous template template parameter>");
388 break;
390 case BOUND_TEMPLATE_TEMPLATE_PARM:
392 tree args = TYPE_TI_ARGS (t);
393 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
394 pp_template_argument_list_start (cxx_pp);
395 dump_template_argument_list (args, flags);
396 pp_template_argument_list_end (cxx_pp);
398 break;
400 case TEMPLATE_TYPE_PARM:
401 dump_qualifiers (t, after);
402 if (TYPE_IDENTIFIER (t))
403 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
404 else
405 pp_identifier (cxx_pp, "<anonymous template type parameter>");
406 break;
408 /* This is not always necessary for pointers and such, but doing this
409 reduces code size. */
410 case ARRAY_TYPE:
411 case POINTER_TYPE:
412 case REFERENCE_TYPE:
413 case OFFSET_TYPE:
414 offset_type:
415 case FUNCTION_TYPE:
416 case METHOD_TYPE:
418 dump_type_prefix (t, flags);
419 dump_type_suffix (t, flags);
420 break;
422 case TYPENAME_TYPE:
423 dump_qualifiers (t, after);
424 pp_string (cxx_pp, "typename ");
425 dump_typename (t, flags);
426 break;
428 case UNBOUND_CLASS_TEMPLATE:
429 dump_type (TYPE_CONTEXT (t), flags);
430 pp_colon_colon (cxx_pp);
431 pp_identifier (cxx_pp, "template ");
432 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
433 break;
435 case TYPEOF_TYPE:
436 pp_string (cxx_pp, "__typeof (");
437 dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS);
438 pp_right_paren (cxx_pp);
439 break;
441 default:
442 pp_unsupported_tree (cxx_pp, t);
443 /* Fall through to error. */
445 case ERROR_MARK:
446 pp_identifier (cxx_pp, "<type error>");
447 break;
451 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
452 a TYPENAME_TYPE. */
454 static void
455 dump_typename (tree t, int flags)
457 tree ctx = TYPE_CONTEXT (t);
459 if (TREE_CODE (ctx) == TYPENAME_TYPE)
460 dump_typename (ctx, flags);
461 else
462 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
463 pp_colon_colon (cxx_pp);
464 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
467 /* Return the name of the supplied aggregate, or enumeral type. */
469 static const char *
470 class_key_or_enum (tree t)
472 if (TREE_CODE (t) == ENUMERAL_TYPE)
473 return "enum";
474 else if (TREE_CODE (t) == UNION_TYPE)
475 return "union";
476 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
477 return "class";
478 else
479 return "struct";
482 /* Print out a class declaration T under the control of FLAGS,
483 in the form `class foo'. */
485 static void
486 dump_aggr_type (tree t, int flags)
488 tree name;
489 const char *variety = class_key_or_enum (t);
490 int typdef = 0;
491 int tmplate = 0;
493 dump_qualifiers (t, after);
495 if (flags & TFF_CLASS_KEY_OR_ENUM)
497 pp_identifier (cxx_pp, variety);
498 pp_space (cxx_pp);
501 if (flags & TFF_CHASE_TYPEDEF)
502 t = TYPE_MAIN_VARIANT (t);
504 name = TYPE_NAME (t);
506 if (name)
508 typdef = !DECL_ARTIFICIAL (name);
509 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
510 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
511 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
512 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
513 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
514 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
515 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
516 if (tmplate)
518 /* Because the template names are mangled, we have to locate
519 the most general template, and use that name. */
520 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
522 while (DECL_TEMPLATE_INFO (tpl))
523 tpl = DECL_TI_TEMPLATE (tpl);
524 name = tpl;
526 name = DECL_NAME (name);
529 if (name == 0 || ANON_AGGRNAME_P (name))
531 if (flags & TFF_CLASS_KEY_OR_ENUM)
532 pp_identifier (cxx_pp, "<anonymous>");
533 else
534 pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
536 else
537 pp_tree_identifier (cxx_pp, name);
538 if (tmplate)
539 dump_template_parms (TYPE_TEMPLATE_INFO (t),
540 !CLASSTYPE_USE_TEMPLATE (t),
541 flags & ~TFF_TEMPLATE_HEADER);
544 /* Dump into the obstack the initial part of the output for a given type.
545 This is necessary when dealing with things like functions returning
546 functions. Examples:
548 return type of `int (* fee ())()': pointer -> function -> int. Both
549 pointer (and reference and offset) and function (and member) types must
550 deal with prefix and suffix.
552 Arrays must also do this for DECL nodes, like int a[], and for things like
553 int *[]&.
555 Return indicates how you should pad an object name after this. I.e. you
556 want to pad non-*, non-& cores, but not pad * or & types. */
558 static enum pad
559 dump_type_prefix (tree t, int flags)
561 enum pad padding = before;
563 if (TYPE_PTRMEMFUNC_P (t))
565 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
566 goto offset_type;
569 switch (TREE_CODE (t))
571 case POINTER_TYPE:
572 case REFERENCE_TYPE:
574 tree sub = TREE_TYPE (t);
576 padding = dump_type_prefix (sub, flags);
577 if (TREE_CODE (sub) == ARRAY_TYPE)
579 pp_space (cxx_pp);
580 pp_left_paren (cxx_pp);
582 pp_character (cxx_pp, "&*"[TREE_CODE (t) == POINTER_TYPE]);
583 padding = dump_qualifiers (t, before);
585 break;
587 case OFFSET_TYPE:
588 offset_type:
589 padding = dump_type_prefix (TREE_TYPE (t), flags);
590 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
592 if (padding != none)
593 pp_space (cxx_pp);
594 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
595 pp_colon_colon (cxx_pp);
597 pp_star (cxx_pp);
598 padding = dump_qualifiers (t, none);
599 break;
601 /* Can only be reached through function pointer -- this would not be
602 correct if FUNCTION_DECLs used it. */
603 case FUNCTION_TYPE:
604 padding = dump_type_prefix (TREE_TYPE (t), flags);
605 if (padding != none)
606 pp_space (cxx_pp);
607 pp_left_paren (cxx_pp);
608 padding = none;
609 break;
611 case METHOD_TYPE:
612 padding = dump_type_prefix (TREE_TYPE (t), flags);
613 if (padding != none)
614 pp_space (cxx_pp);
615 pp_left_paren (cxx_pp);
616 padding = none;
617 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
618 pp_colon_colon (cxx_pp);
619 break;
621 case ARRAY_TYPE:
622 padding = dump_type_prefix (TREE_TYPE (t), flags);
623 break;
625 case ENUMERAL_TYPE:
626 case IDENTIFIER_NODE:
627 case INTEGER_TYPE:
628 case BOOLEAN_TYPE:
629 case REAL_TYPE:
630 case RECORD_TYPE:
631 case TEMPLATE_TYPE_PARM:
632 case TEMPLATE_TEMPLATE_PARM:
633 case BOUND_TEMPLATE_TEMPLATE_PARM:
634 case TREE_LIST:
635 case TYPE_DECL:
636 case TREE_VEC:
637 case UNION_TYPE:
638 case UNKNOWN_TYPE:
639 case VOID_TYPE:
640 case TYPENAME_TYPE:
641 case COMPLEX_TYPE:
642 case VECTOR_TYPE:
643 case TYPEOF_TYPE:
644 dump_type (t, flags);
645 padding = before;
646 break;
648 default:
649 pp_unsupported_tree (cxx_pp, t);
650 /* fall through. */
651 case ERROR_MARK:
652 pp_identifier (cxx_pp, "<typeprefixerror>");
653 break;
655 return padding;
658 /* Dump the suffix of type T, under control of FLAGS. This is the part
659 which appears after the identifier (or function parms). */
661 static void
662 dump_type_suffix (tree t, int flags)
664 if (TYPE_PTRMEMFUNC_P (t))
665 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
667 switch (TREE_CODE (t))
669 case POINTER_TYPE:
670 case REFERENCE_TYPE:
671 case OFFSET_TYPE:
672 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
673 pp_right_paren (cxx_pp);
674 dump_type_suffix (TREE_TYPE (t), flags);
675 break;
677 /* Can only be reached through function pointer */
678 case FUNCTION_TYPE:
679 case METHOD_TYPE:
681 tree arg;
682 pp_right_paren (cxx_pp);
683 arg = TYPE_ARG_TYPES (t);
684 if (TREE_CODE (t) == METHOD_TYPE)
685 arg = TREE_CHAIN (arg);
687 /* Function pointers don't have default args. Not in standard C++,
688 anyway; they may in g++, but we'll just pretend otherwise. */
689 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
691 if (TREE_CODE (t) == METHOD_TYPE)
692 dump_qualifiers
693 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before);
694 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
695 dump_type_suffix (TREE_TYPE (t), flags);
696 break;
699 case ARRAY_TYPE:
700 pp_left_bracket (cxx_pp);
701 if (TYPE_DOMAIN (t))
703 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
704 pp_wide_integer
705 (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
706 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
707 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
708 flags & ~TFF_EXPR_IN_PARENS);
709 else
710 dump_expr (fold (cp_build_binary_op
711 (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
712 integer_one_node)),
713 flags & ~TFF_EXPR_IN_PARENS);
715 pp_right_bracket (cxx_pp);
716 dump_type_suffix (TREE_TYPE (t), flags);
717 break;
719 case ENUMERAL_TYPE:
720 case IDENTIFIER_NODE:
721 case INTEGER_TYPE:
722 case BOOLEAN_TYPE:
723 case REAL_TYPE:
724 case RECORD_TYPE:
725 case TEMPLATE_TYPE_PARM:
726 case TEMPLATE_TEMPLATE_PARM:
727 case BOUND_TEMPLATE_TEMPLATE_PARM:
728 case TREE_LIST:
729 case TYPE_DECL:
730 case TREE_VEC:
731 case UNION_TYPE:
732 case UNKNOWN_TYPE:
733 case VOID_TYPE:
734 case TYPENAME_TYPE:
735 case COMPLEX_TYPE:
736 case VECTOR_TYPE:
737 case TYPEOF_TYPE:
738 break;
740 default:
741 pp_unsupported_tree (cxx_pp, t);
742 case ERROR_MARK:
743 /* Don't mark it here, we should have already done in
744 dump_type_prefix. */
745 break;
749 static void
750 dump_global_iord (tree t)
752 const char *p = NULL;
754 if (DECL_GLOBAL_CTOR_P (t))
755 p = "initializers";
756 else if (DECL_GLOBAL_DTOR_P (t))
757 p = "destructors";
758 else
759 abort ();
761 pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
764 static void
765 dump_simple_decl (tree t, tree type, int flags)
767 if (flags & TFF_DECL_SPECIFIERS)
769 if (dump_type_prefix (type, flags) != none)
770 pp_space (cxx_pp);
772 if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
773 dump_scope (CP_DECL_CONTEXT (t), flags);
774 if (DECL_NAME (t))
775 dump_decl (DECL_NAME (t), flags);
776 else
777 pp_identifier (cxx_pp, "<anonymous>");
778 if (flags & TFF_DECL_SPECIFIERS)
779 dump_type_suffix (type, flags);
782 /* Dump a human readable string for the decl T under control of FLAGS. */
784 static void
785 dump_decl (tree t, int flags)
787 if (t == NULL_TREE)
788 return;
790 switch (TREE_CODE (t))
792 case TYPE_DECL:
794 /* Don't say 'typedef class A' */
795 if (DECL_ARTIFICIAL (t))
797 if ((flags & TFF_DECL_SPECIFIERS)
798 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
799 /* Say `class T' not just `T'. */
800 pp_string (cxx_pp, "class ");
802 dump_type (TREE_TYPE (t), flags);
803 break;
806 if (flags & TFF_DECL_SPECIFIERS)
807 pp_string (cxx_pp, "typedef ");
808 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
809 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
810 flags);
811 break;
813 case VAR_DECL:
814 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
816 pp_string (cxx_pp, "vtable for ");
817 my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720);
818 dump_type (DECL_CONTEXT (t), flags);
819 break;
821 /* else fall through */
822 case FIELD_DECL:
823 case PARM_DECL:
824 dump_simple_decl (t, TREE_TYPE (t), flags);
825 break;
827 case RESULT_DECL:
828 pp_string (cxx_pp, "<return value> ");
829 dump_simple_decl (t, TREE_TYPE (t), flags);
830 break;
832 case NAMESPACE_DECL:
833 dump_scope (CP_DECL_CONTEXT (t), flags);
834 if (DECL_NAME (t) == anonymous_namespace_name)
835 pp_identifier (cxx_pp, "<unnamed>");
836 else
837 pp_tree_identifier (cxx_pp, DECL_NAME (t));
838 break;
840 case SCOPE_REF:
841 dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
842 pp_colon_colon (cxx_pp);
843 dump_decl (TREE_OPERAND (t, 1), flags);
844 break;
846 case ARRAY_REF:
847 dump_decl (TREE_OPERAND (t, 0), flags);
848 pp_left_bracket (cxx_pp);
849 dump_decl (TREE_OPERAND (t, 1), flags);
850 pp_right_bracket (cxx_pp);
851 break;
853 /* So that we can do dump_decl on an aggr type. */
854 case RECORD_TYPE:
855 case UNION_TYPE:
856 case ENUMERAL_TYPE:
857 dump_type (t, flags);
858 break;
860 case BIT_NOT_EXPR:
861 /* This is a pseudo destructor call which has not been folded into
862 a PSEUDO_DTOR_EXPR yet. */
863 pp_complement (cxx_pp);
864 dump_type (TREE_OPERAND (t, 0), flags);
865 break;
867 case TYPE_EXPR:
868 abort ();
869 break;
871 /* These special cases are duplicated here so that other functions
872 can feed identifiers to error and get them demangled properly. */
873 case IDENTIFIER_NODE:
874 if (IDENTIFIER_TYPENAME_P (t))
876 pp_string (cxx_pp, "operator ");
877 /* Not exactly IDENTIFIER_TYPE_VALUE. */
878 dump_type (TREE_TYPE (t), flags);
879 break;
881 else
882 pp_tree_identifier (cxx_pp, t);
883 break;
885 case OVERLOAD:
886 if (OVL_CHAIN (t))
888 t = OVL_CURRENT (t);
889 if (DECL_CLASS_SCOPE_P (t))
891 dump_type (DECL_CONTEXT (t), flags);
892 pp_colon_colon (cxx_pp);
894 else if (DECL_CONTEXT (t))
896 dump_decl (DECL_CONTEXT (t), flags);
897 pp_colon_colon (cxx_pp);
899 dump_decl (DECL_NAME (t), flags);
900 break;
903 /* If there's only one function, just treat it like an ordinary
904 FUNCTION_DECL. */
905 t = OVL_CURRENT (t);
906 /* Fall through. */
908 case FUNCTION_DECL:
909 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
910 dump_global_iord (t);
911 else if (! DECL_LANG_SPECIFIC (t))
912 pp_identifier (cxx_pp, "<internal>");
913 else
914 dump_function_decl (t, flags);
915 break;
917 case TEMPLATE_DECL:
918 dump_template_decl (t, flags);
919 break;
921 case TEMPLATE_ID_EXPR:
923 tree name = TREE_OPERAND (t, 0);
925 if (is_overloaded_fn (name))
926 name = DECL_NAME (get_first_fn (name));
927 dump_decl (name, flags);
928 pp_template_argument_list_start (cxx_pp);
929 if (TREE_OPERAND (t, 1))
930 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
931 pp_template_argument_list_end (cxx_pp);
933 break;
935 case LABEL_DECL:
936 pp_tree_identifier (cxx_pp, DECL_NAME (t));
937 break;
939 case CONST_DECL:
940 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
941 || (DECL_INITIAL (t) &&
942 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
943 dump_simple_decl (t, TREE_TYPE (t), flags);
944 else if (DECL_NAME (t))
945 dump_decl (DECL_NAME (t), flags);
946 else if (DECL_INITIAL (t))
947 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
948 else
949 pp_identifier (cxx_pp, "<enumerator>");
950 break;
952 case USING_DECL:
953 pp_string (cxx_pp, "using ");
954 dump_type (DECL_INITIAL (t), flags);
955 pp_colon_colon (cxx_pp);
956 dump_decl (DECL_NAME (t), flags);
957 break;
959 case BASELINK:
960 dump_decl (BASELINK_FUNCTIONS (t), flags);
961 break;
963 case NON_DEPENDENT_EXPR:
964 dump_expr (t, flags);
965 break;
967 default:
968 pp_unsupported_tree (cxx_pp, t);
969 /* Fallthrough to error. */
971 case ERROR_MARK:
972 pp_identifier (cxx_pp, "<declaration error>");
973 break;
977 /* Dump a template declaration T under control of FLAGS. This means the
978 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
980 static void
981 dump_template_decl (tree t, int flags)
983 tree orig_parms = DECL_TEMPLATE_PARMS (t);
984 tree parms;
985 int i;
987 if (flags & TFF_TEMPLATE_HEADER)
989 for (parms = orig_parms = nreverse (orig_parms);
990 parms;
991 parms = TREE_CHAIN (parms))
993 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
994 int len = TREE_VEC_LENGTH (inner_parms);
996 pp_string (cxx_pp, "template<");
998 /* If we've shown the template prefix, we'd better show the
999 parameters' and decl's type too. */
1000 flags |= TFF_DECL_SPECIFIERS;
1002 for (i = 0; i < len; i++)
1004 if (i)
1005 pp_separate_with_comma (cxx_pp);
1006 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
1008 pp_template_argument_list_end (cxx_pp);
1009 pp_space (cxx_pp);
1011 nreverse(orig_parms);
1013 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
1014 /* Say `template<arg> class TT' not just `template<arg> TT'. */
1015 pp_string (cxx_pp, "class ");
1018 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
1019 dump_type (TREE_TYPE (t),
1020 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1021 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
1022 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
1023 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
1024 else if (TREE_TYPE (t) == NULL_TREE)
1025 abort ();
1026 else
1027 switch (NEXT_CODE (t))
1029 case METHOD_TYPE:
1030 case FUNCTION_TYPE:
1031 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1032 break;
1033 default:
1034 /* This case can occur with some invalid code. */
1035 dump_type (TREE_TYPE (t),
1036 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1037 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0));
1041 /* Pretty print a function decl. There are several ways we want to print a
1042 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1043 As error can only apply the '#' flag once to give 0 and 1 for V, there
1044 is %D which doesn't print the throw specs, and %F which does. */
1046 static void
1047 dump_function_decl (tree t, int flags)
1049 tree fntype;
1050 tree parmtypes;
1051 tree cname = NULL_TREE;
1052 tree template_args = NULL_TREE;
1053 tree template_parms = NULL_TREE;
1054 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1056 if (TREE_CODE (t) == TEMPLATE_DECL)
1057 t = DECL_TEMPLATE_RESULT (t);
1059 /* Pretty print template instantiations only. */
1060 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1062 tree tmpl;
1064 template_args = DECL_TI_ARGS (t);
1065 tmpl = most_general_template (t);
1066 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1068 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1069 t = tmpl;
1073 fntype = TREE_TYPE (t);
1074 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1076 if (DECL_CLASS_SCOPE_P (t))
1077 cname = DECL_CONTEXT (t);
1078 /* this is for partially instantiated template methods */
1079 else if (TREE_CODE (fntype) == METHOD_TYPE)
1080 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1082 if (!(flags & TFF_DECL_SPECIFIERS))
1083 /* OK */;
1084 else if (DECL_STATIC_FUNCTION_P (t))
1085 pp_identifier (cxx_pp, "static ");
1086 else if (DECL_VIRTUAL_P (t))
1087 pp_identifier (cxx_pp, "virtual ");
1089 /* Print the return type? */
1090 if (show_return)
1091 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1092 && !DECL_DESTRUCTOR_P (t);
1093 if (show_return)
1095 dump_type_prefix (TREE_TYPE (fntype), flags);
1096 pp_space (cxx_pp);
1099 /* Print the function name. */
1100 if (cname)
1102 dump_type (cname, flags);
1103 pp_colon_colon (cxx_pp);
1105 else
1106 dump_scope (CP_DECL_CONTEXT (t), flags);
1108 dump_function_name (t, flags);
1110 if (1)
1112 dump_parameters (parmtypes, flags);
1114 if (TREE_CODE (fntype) == METHOD_TYPE)
1115 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
1116 before);
1118 if (flags & TFF_EXCEPTION_SPECIFICATION)
1119 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1121 if (show_return)
1122 dump_type_suffix (TREE_TYPE (fntype), flags);
1125 /* If T is a template instantiation, dump the parameter binding. */
1126 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1128 pp_string (cxx_pp, " [with ");
1129 dump_template_bindings (template_parms, template_args);
1130 pp_right_bracket (cxx_pp);
1134 /* Print a parameter list. If this is for a member function, the
1135 member object ptr (and any other hidden args) should have
1136 already been removed. */
1138 static void
1139 dump_parameters (tree parmtypes, int flags)
1141 int first;
1143 pp_left_paren (cxx_pp);
1145 for (first = 1; parmtypes != void_list_node;
1146 parmtypes = TREE_CHAIN (parmtypes))
1148 if (!first)
1149 pp_separate_with_comma (cxx_pp);
1150 first = 0;
1151 if (!parmtypes)
1153 pp_identifier (cxx_pp, "...");
1154 break;
1156 dump_type (TREE_VALUE (parmtypes), flags);
1158 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1160 pp_string (cxx_pp, " = ");
1161 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1165 pp_right_paren (cxx_pp);
1168 /* Print an exception specification. T is the exception specification. */
1170 static void
1171 dump_exception_spec (tree t, int flags)
1173 if (t)
1175 pp_string (cxx_pp, " throw (");
1176 if (TREE_VALUE (t) != NULL_TREE)
1177 while (1)
1179 dump_type (TREE_VALUE (t), flags);
1180 t = TREE_CHAIN (t);
1181 if (!t)
1182 break;
1183 pp_separate_with_comma (cxx_pp);
1185 pp_right_paren (cxx_pp);
1189 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1190 and destructors properly. */
1192 static void
1193 dump_function_name (tree t, int flags)
1195 tree name = DECL_NAME (t);
1197 if (TREE_CODE (t) == TEMPLATE_DECL)
1198 t = DECL_TEMPLATE_RESULT (t);
1200 /* Don't let the user see __comp_ctor et al. */
1201 if (DECL_CONSTRUCTOR_P (t)
1202 || DECL_DESTRUCTOR_P (t))
1203 name = constructor_name (DECL_CONTEXT (t));
1205 if (DECL_DESTRUCTOR_P (t))
1207 pp_complement (cxx_pp);
1208 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1210 else if (DECL_CONV_FN_P (t))
1212 /* This cannot use the hack that the operator's return
1213 type is stashed off of its name because it may be
1214 used for error reporting. In the case of conflicting
1215 declarations, both will have the same name, yet
1216 the types will be different, hence the TREE_TYPE field
1217 of the first name will be clobbered by the second. */
1218 pp_string (cxx_pp, "operator ");
1219 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1221 else if (IDENTIFIER_OPNAME_P (name))
1222 pp_tree_identifier (cxx_pp, name);
1223 else
1224 dump_decl (name, flags);
1226 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
1227 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1228 && (DECL_TEMPLATE_SPECIALIZATION (t)
1229 || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1230 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t))
1231 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1232 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1235 /* Dump the template parameters from the template info INFO under control of
1236 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1237 specialization (partial or complete). For partial specializations we show
1238 the specialized parameter values. For a primary template we show no
1239 decoration. */
1241 static void
1242 dump_template_parms (tree info, int primary, int flags)
1244 tree args = info ? TI_ARGS (info) : NULL_TREE;
1246 if (primary && flags & TFF_TEMPLATE_NAME)
1247 return;
1248 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1249 pp_template_argument_list_start (cxx_pp);
1251 /* Be careful only to print things when we have them, so as not
1252 to crash producing error messages. */
1253 if (args && !primary)
1255 int len, ix;
1257 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
1258 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1260 len = TREE_VEC_LENGTH (args);
1262 for (ix = 0; ix != len; ix++)
1264 tree arg = TREE_VEC_ELT (args, ix);
1266 if (ix)
1267 pp_separate_with_comma (cxx_pp);
1269 if (!arg)
1270 pp_identifier (cxx_pp, "<template parameter error>");
1271 else
1272 dump_template_argument (arg, flags);
1275 else if (primary)
1277 tree tpl = TI_TEMPLATE (info);
1278 tree parms = DECL_TEMPLATE_PARMS (tpl);
1279 int len, ix;
1281 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1282 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1284 for (ix = 0; ix != len; ix++)
1286 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1288 if (ix)
1289 pp_separate_with_comma (cxx_pp);
1291 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1294 pp_template_argument_list_end (cxx_pp);
1297 /* Print out a list of initializers (subr of dump_expr) */
1299 static void
1300 dump_expr_list (tree l, int flags)
1302 while (l)
1304 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1305 l = TREE_CHAIN (l);
1306 if (l)
1307 pp_separate_with_comma (cxx_pp);
1311 /* Print out an expression E under control of FLAGS. */
1313 static void
1314 dump_expr (tree t, int flags)
1316 if (t == 0)
1317 return;
1319 switch (TREE_CODE (t))
1321 case VAR_DECL:
1322 case PARM_DECL:
1323 case FIELD_DECL:
1324 case CONST_DECL:
1325 case FUNCTION_DECL:
1326 case TEMPLATE_DECL:
1327 case NAMESPACE_DECL:
1328 case OVERLOAD:
1329 case IDENTIFIER_NODE:
1330 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
1331 break;
1333 case INTEGER_CST:
1334 case STRING_CST:
1335 case REAL_CST:
1336 pp_c_constant (pp_c_base (cxx_pp), t);
1337 break;
1339 case PTRMEM_CST:
1340 pp_ampersand (cxx_pp);
1341 dump_type (PTRMEM_CST_CLASS (t), flags);
1342 pp_colon_colon (cxx_pp);
1343 pp_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1344 break;
1346 case COMPOUND_EXPR:
1347 pp_left_paren (cxx_pp);
1348 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1349 pp_separate_with_comma (cxx_pp);
1350 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1351 pp_right_paren (cxx_pp);
1352 break;
1354 case COND_EXPR:
1355 pp_left_paren (cxx_pp);
1356 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1357 pp_string (cxx_pp, " ? ");
1358 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1359 pp_string (cxx_pp, " : ");
1360 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1361 pp_right_paren (cxx_pp);
1362 break;
1364 case SAVE_EXPR:
1365 if (TREE_HAS_CONSTRUCTOR (t))
1367 pp_string (cxx_pp, "new ");
1368 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1370 else
1371 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1372 break;
1374 case AGGR_INIT_EXPR:
1376 tree fn = NULL_TREE;
1378 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1379 fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1381 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1383 if (DECL_CONSTRUCTOR_P (fn))
1384 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (TREE_TYPE (t)));
1385 else
1386 dump_decl (fn, 0);
1388 else
1389 dump_expr (TREE_OPERAND (t, 0), 0);
1391 pp_left_paren (cxx_pp);
1392 if (TREE_OPERAND (t, 1))
1393 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1394 pp_right_paren (cxx_pp);
1395 break;
1397 case CALL_EXPR:
1399 tree fn = TREE_OPERAND (t, 0);
1400 tree args = TREE_OPERAND (t, 1);
1402 if (TREE_CODE (fn) == ADDR_EXPR)
1403 fn = TREE_OPERAND (fn, 0);
1405 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1407 tree ob = TREE_VALUE (args);
1408 if (TREE_CODE (ob) == ADDR_EXPR)
1410 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1411 pp_dot (cxx_pp);
1413 else if (TREE_CODE (ob) != PARM_DECL
1414 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1416 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1417 pp_arrow (cxx_pp);
1419 args = TREE_CHAIN (args);
1421 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1422 pp_left_paren (cxx_pp);
1423 dump_expr_list (args, flags);
1424 pp_right_paren (cxx_pp);
1426 break;
1428 case NEW_EXPR:
1430 tree type = TREE_OPERAND (t, 1);
1431 tree init = TREE_OPERAND (t, 2);
1432 if (NEW_EXPR_USE_GLOBAL (t))
1433 pp_colon_colon (cxx_pp);
1434 pp_string (cxx_pp, "new ");
1435 if (TREE_OPERAND (t, 0))
1437 pp_left_paren (cxx_pp);
1438 dump_expr_list (TREE_OPERAND (t, 0), flags);
1439 pp_string (cxx_pp, ") ");
1441 if (TREE_CODE (type) == ARRAY_REF)
1442 type = build_cplus_array_type
1443 (TREE_OPERAND (type, 0),
1444 build_index_type (fold (build (MINUS_EXPR, integer_type_node,
1445 TREE_OPERAND (type, 1),
1446 integer_one_node))));
1447 dump_type (type, flags);
1448 if (init)
1450 pp_left_paren (cxx_pp);
1451 if (TREE_CODE (init) == TREE_LIST)
1452 dump_expr_list (init, flags);
1453 else if (init == void_zero_node)
1454 /* This representation indicates an empty initializer,
1455 e.g.: "new int()". */
1457 else
1458 dump_expr (init, flags);
1459 pp_right_paren (cxx_pp);
1462 break;
1464 case TARGET_EXPR:
1465 /* Note that this only works for G++ target exprs. If somebody
1466 builds a general TARGET_EXPR, there's no way to represent that
1467 it initializes anything other that the parameter slot for the
1468 default argument. Note we may have cleared out the first
1469 operand in expand_expr, so don't go killing ourselves. */
1470 if (TREE_OPERAND (t, 1))
1471 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1472 break;
1474 case INIT_EXPR:
1475 case MODIFY_EXPR:
1476 case PLUS_EXPR:
1477 case MINUS_EXPR:
1478 case MULT_EXPR:
1479 case TRUNC_DIV_EXPR:
1480 case TRUNC_MOD_EXPR:
1481 case MIN_EXPR:
1482 case MAX_EXPR:
1483 case LSHIFT_EXPR:
1484 case RSHIFT_EXPR:
1485 case BIT_IOR_EXPR:
1486 case BIT_XOR_EXPR:
1487 case BIT_AND_EXPR:
1488 case BIT_ANDTC_EXPR:
1489 case TRUTH_ANDIF_EXPR:
1490 case TRUTH_ORIF_EXPR:
1491 case LT_EXPR:
1492 case LE_EXPR:
1493 case GT_EXPR:
1494 case GE_EXPR:
1495 case EQ_EXPR:
1496 case NE_EXPR:
1497 case EXACT_DIV_EXPR:
1498 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1499 break;
1501 case CEIL_DIV_EXPR:
1502 case FLOOR_DIV_EXPR:
1503 case ROUND_DIV_EXPR:
1504 dump_binary_op ("/", t, flags);
1505 break;
1507 case CEIL_MOD_EXPR:
1508 case FLOOR_MOD_EXPR:
1509 case ROUND_MOD_EXPR:
1510 dump_binary_op ("%", t, flags);
1511 break;
1513 case COMPONENT_REF:
1515 tree ob = TREE_OPERAND (t, 0);
1516 if (TREE_CODE (ob) == INDIRECT_REF)
1518 ob = TREE_OPERAND (ob, 0);
1519 if (TREE_CODE (ob) != PARM_DECL
1520 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1522 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1523 pp_arrow (cxx_pp);
1526 else
1528 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1529 pp_dot (cxx_pp);
1531 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1533 break;
1535 case ARRAY_REF:
1536 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1537 pp_left_bracket (cxx_pp);
1538 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1539 pp_right_bracket (cxx_pp);
1540 break;
1542 case CONVERT_EXPR:
1543 if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
1545 pp_left_paren (cxx_pp);
1546 dump_type (TREE_TYPE (t), flags);
1547 pp_right_paren (cxx_pp);
1548 dump_expr (TREE_OPERAND (t, 0), flags);
1550 else
1551 dump_unary_op ("+", t, flags);
1552 break;
1554 case ADDR_EXPR:
1555 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1556 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1557 /* An ADDR_EXPR can have reference type. In that case, we
1558 shouldn't print the `&' doing so indicates to the user
1559 that the expression has pointer type. */
1560 || (TREE_TYPE (t)
1561 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1562 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1563 else
1564 dump_unary_op ("&", t, flags);
1565 break;
1567 case INDIRECT_REF:
1568 if (TREE_HAS_CONSTRUCTOR (t))
1570 t = TREE_OPERAND (t, 0);
1571 my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);
1572 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1573 pp_left_paren (cxx_pp);
1574 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1575 pp_right_paren (cxx_pp);
1577 else
1579 if (TREE_OPERAND (t,0) != NULL_TREE
1580 && TREE_TYPE (TREE_OPERAND (t, 0))
1581 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1582 dump_expr (TREE_OPERAND (t, 0), flags);
1583 else
1584 dump_unary_op ("*", t, flags);
1586 break;
1588 case NEGATE_EXPR:
1589 case BIT_NOT_EXPR:
1590 case TRUTH_NOT_EXPR:
1591 case PREDECREMENT_EXPR:
1592 case PREINCREMENT_EXPR:
1593 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1594 break;
1596 case POSTDECREMENT_EXPR:
1597 case POSTINCREMENT_EXPR:
1598 pp_left_paren (cxx_pp);
1599 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1600 pp_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1601 pp_right_paren (cxx_pp);
1602 break;
1604 case NON_LVALUE_EXPR:
1605 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1606 should be another level of INDIRECT_REF so that I don't have to do
1607 this. */
1608 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1610 tree next = TREE_TYPE (TREE_TYPE (t));
1612 while (TREE_CODE (next) == POINTER_TYPE)
1613 next = TREE_TYPE (next);
1615 if (TREE_CODE (next) == FUNCTION_TYPE)
1617 if (flags & TFF_EXPR_IN_PARENS)
1618 pp_left_paren (cxx_pp);
1619 pp_star (cxx_pp);
1620 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1621 if (flags & TFF_EXPR_IN_PARENS)
1622 pp_right_paren (cxx_pp);
1623 break;
1625 /* else FALLTHRU */
1627 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1628 break;
1630 case NOP_EXPR:
1632 tree op = TREE_OPERAND (t, 0);
1634 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1636 /* It is a cast, but we cannot tell whether it is a
1637 reinterpret or static cast. Use the C style notation. */
1638 if (flags & TFF_EXPR_IN_PARENS)
1639 pp_left_paren (cxx_pp);
1640 pp_left_paren (cxx_pp);
1641 dump_type (TREE_TYPE (t), flags);
1642 pp_right_paren (cxx_pp);
1643 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1644 if (flags & TFF_EXPR_IN_PARENS)
1645 pp_right_paren (cxx_pp);
1647 else
1648 dump_expr (op, flags);
1649 break;
1652 case EXPR_WITH_FILE_LOCATION:
1653 dump_expr (EXPR_WFL_NODE (t), flags);
1654 break;
1656 case CONSTRUCTOR:
1657 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1659 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1661 if (integer_zerop (idx))
1663 /* A NULL pointer-to-member constant. */
1664 pp_left_paren (cxx_pp);
1665 pp_left_paren (cxx_pp);
1666 dump_type (TREE_TYPE (t), flags);
1667 pp_right_paren (cxx_pp);
1668 pp_string (cxx_pp, ")0)");
1669 break;
1671 else if (host_integerp (idx, 0))
1673 tree virtuals;
1674 unsigned HOST_WIDE_INT n;
1676 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1677 t = TYPE_METHOD_BASETYPE (t);
1678 virtuals = TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t));
1680 n = tree_low_cst (idx, 0);
1682 /* Map vtable index back one, to allow for the null pointer to
1683 member. */
1684 --n;
1686 while (n > 0 && virtuals)
1688 --n;
1689 virtuals = TREE_CHAIN (virtuals);
1691 if (virtuals)
1693 dump_expr (BV_FN (virtuals),
1694 flags | TFF_EXPR_IN_PARENS);
1695 break;
1699 if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
1701 dump_type (TREE_TYPE (t), 0);
1702 pp_left_paren (cxx_pp);
1703 pp_right_paren (cxx_pp);
1705 else
1707 pp_left_brace (cxx_pp);
1708 dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
1709 pp_right_brace (cxx_pp);
1712 break;
1714 case OFFSET_REF:
1716 tree ob = TREE_OPERAND (t, 0);
1717 if (is_dummy_object (ob))
1719 t = TREE_OPERAND (t, 1);
1720 if (TREE_CODE (t) == FUNCTION_DECL)
1721 /* A::f */
1722 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1723 else if (BASELINK_P (t))
1724 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1725 flags | TFF_EXPR_IN_PARENS);
1726 else
1727 dump_decl (t, flags);
1729 else
1731 if (TREE_CODE (ob) == INDIRECT_REF)
1733 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1734 pp_string (cxx_pp, "->*");
1736 else
1738 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1739 pp_string (cxx_pp, ".*");
1741 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1743 break;
1746 case TEMPLATE_PARM_INDEX:
1747 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1748 break;
1750 case SCOPE_REF:
1751 dump_type (TREE_OPERAND (t, 0), flags);
1752 pp_colon_colon (cxx_pp);
1753 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1754 break;
1756 case CAST_EXPR:
1757 if (TREE_OPERAND (t, 0) == NULL_TREE
1758 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1760 dump_type (TREE_TYPE (t), flags);
1761 pp_left_paren (cxx_pp);
1762 dump_expr_list (TREE_OPERAND (t, 0), flags);
1763 pp_right_paren (cxx_pp);
1765 else
1767 pp_left_paren (cxx_pp);
1768 dump_type (TREE_TYPE (t), flags);
1769 pp_string (cxx_pp, ")(");
1770 dump_expr_list (TREE_OPERAND (t, 0), flags);
1771 pp_right_paren (cxx_pp);
1773 break;
1775 case STATIC_CAST_EXPR:
1776 pp_string (cxx_pp, "static_cast<");
1777 goto cast;
1778 case REINTERPRET_CAST_EXPR:
1779 pp_string (cxx_pp, "reinterpret_cast<");
1780 goto cast;
1781 case CONST_CAST_EXPR:
1782 pp_string (cxx_pp, "const_cast<");
1783 goto cast;
1784 case DYNAMIC_CAST_EXPR:
1785 pp_string (cxx_pp, "dynamic_cast<");
1786 cast:
1787 dump_type (TREE_TYPE (t), flags);
1788 pp_string (cxx_pp, ">(");
1789 dump_expr (TREE_OPERAND (t, 0), flags);
1790 pp_right_paren (cxx_pp);
1791 break;
1793 case ARROW_EXPR:
1794 dump_expr (TREE_OPERAND (t, 0), flags);
1795 pp_arrow (cxx_pp);
1796 break;
1798 case SIZEOF_EXPR:
1799 case ALIGNOF_EXPR:
1800 if (TREE_CODE (t) == SIZEOF_EXPR)
1801 pp_string (cxx_pp, "sizeof (");
1802 else
1804 my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
1805 pp_string (cxx_pp, "__alignof__ (");
1807 if (TYPE_P (TREE_OPERAND (t, 0)))
1808 dump_type (TREE_OPERAND (t, 0), flags);
1809 else
1810 dump_expr (TREE_OPERAND (t, 0), flags);
1811 pp_right_paren (cxx_pp);
1812 break;
1814 case REALPART_EXPR:
1815 case IMAGPART_EXPR:
1816 pp_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1817 pp_space (cxx_pp);
1818 dump_expr (TREE_OPERAND (t, 0), flags);
1819 break;
1821 case DEFAULT_ARG:
1822 pp_identifier (cxx_pp, "<unparsed>");
1823 break;
1825 case TRY_CATCH_EXPR:
1826 case WITH_CLEANUP_EXPR:
1827 case CLEANUP_POINT_EXPR:
1828 dump_expr (TREE_OPERAND (t, 0), flags);
1829 break;
1831 case PSEUDO_DTOR_EXPR:
1832 dump_expr (TREE_OPERAND (t, 2), flags);
1833 pp_dot (cxx_pp);
1834 dump_type (TREE_OPERAND (t, 0), flags);
1835 pp_colon_colon (cxx_pp);
1836 pp_complement (cxx_pp);
1837 dump_type (TREE_OPERAND (t, 1), flags);
1838 break;
1840 case TEMPLATE_ID_EXPR:
1841 dump_decl (t, flags);
1842 break;
1844 case STMT_EXPR:
1845 /* We don't yet have a way of dumping statements in a
1846 human-readable format. */
1847 pp_string (cxx_pp, "({...})");
1848 break;
1850 case BIND_EXPR:
1851 pp_left_brace (cxx_pp);
1852 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1853 pp_right_brace (cxx_pp);
1854 break;
1856 case LOOP_EXPR:
1857 pp_string (cxx_pp, "while (1) { ");
1858 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1859 pp_right_brace (cxx_pp);
1860 break;
1862 case EXIT_EXPR:
1863 pp_string (cxx_pp, "if (");
1864 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1865 pp_string (cxx_pp, ") break; ");
1866 break;
1868 case BASELINK:
1869 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
1870 break;
1872 case EMPTY_CLASS_EXPR:
1873 dump_type (TREE_TYPE (t), flags);
1874 pp_left_paren (cxx_pp);
1875 pp_right_paren (cxx_pp);
1876 break;
1878 case NON_DEPENDENT_EXPR:
1879 dump_expr (TREE_OPERAND (t, 0), flags);
1880 break;
1882 /* This list is incomplete, but should suffice for now.
1883 It is very important that `sorry' does not call
1884 `report_error_function'. That could cause an infinite loop. */
1885 default:
1886 pp_unsupported_tree (cxx_pp, t);
1887 /* fall through to ERROR_MARK... */
1888 case ERROR_MARK:
1889 pp_identifier (cxx_pp, "<expression error>");
1890 break;
1894 static void
1895 dump_binary_op (const char *opstring, tree t, int flags)
1897 pp_left_paren (cxx_pp);
1898 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1899 pp_space (cxx_pp);
1900 if (opstring)
1901 pp_identifier (cxx_pp, opstring);
1902 else
1903 pp_identifier (cxx_pp, "<unknown operator>");
1904 pp_space (cxx_pp);
1905 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1906 pp_right_paren (cxx_pp);
1909 static void
1910 dump_unary_op (const char *opstring, tree t, int flags)
1912 if (flags & TFF_EXPR_IN_PARENS)
1913 pp_left_paren (cxx_pp);
1914 pp_identifier (cxx_pp, opstring);
1915 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1916 if (flags & TFF_EXPR_IN_PARENS)
1917 pp_right_paren (cxx_pp);
1920 /* Exported interface to stringifying types, exprs and decls under TFF_*
1921 control. */
1923 const char *
1924 type_as_string (tree typ, int flags)
1926 pp_clear_output_area (cxx_pp);
1927 dump_type (typ, flags);
1928 return pp_formatted_text (cxx_pp);
1931 const char *
1932 expr_as_string (tree decl, int flags)
1934 pp_clear_output_area (cxx_pp);
1935 dump_expr (decl, flags);
1936 return pp_formatted_text (cxx_pp);
1939 const char *
1940 decl_as_string (tree decl, int flags)
1942 pp_clear_output_area (cxx_pp);
1943 dump_decl (decl, flags);
1944 return pp_formatted_text (cxx_pp);
1947 const char *
1948 context_as_string (tree context, int flags)
1950 pp_clear_output_area (cxx_pp);
1951 dump_scope (context, flags);
1952 return pp_formatted_text (cxx_pp);
1955 /* Generate the three forms of printable names for cxx_printable_name. */
1957 const char *
1958 lang_decl_name (tree decl, int v)
1960 if (v >= 2)
1961 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
1963 pp_clear_output_area (cxx_pp);
1964 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
1966 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
1967 pp_colon_colon (cxx_pp);
1970 if (TREE_CODE (decl) == FUNCTION_DECL)
1971 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
1972 else
1973 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
1975 return pp_formatted_text (cxx_pp);
1978 static location_t
1979 location_of (tree t)
1981 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
1982 t = DECL_CONTEXT (t);
1983 else if (TYPE_P (t))
1984 t = TYPE_MAIN_DECL (t);
1985 else if (TREE_CODE (t) == OVERLOAD)
1986 t = OVL_FUNCTION (t);
1988 return DECL_SOURCE_LOCATION (t);
1991 /* Now the interfaces from error et al to dump_type et al. Each takes an
1992 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
1993 function. */
1995 static const char *
1996 decl_to_string (tree decl, int verbose)
1998 int flags = 0;
2000 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
2001 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2002 flags = TFF_CLASS_KEY_OR_ENUM;
2003 if (verbose)
2004 flags |= TFF_DECL_SPECIFIERS;
2005 else if (TREE_CODE (decl) == FUNCTION_DECL)
2006 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2007 flags |= TFF_TEMPLATE_HEADER;
2009 pp_clear_output_area (cxx_pp);
2010 dump_decl (decl, flags);
2011 return pp_formatted_text (cxx_pp);
2014 static const char *
2015 expr_to_string (tree decl)
2017 pp_clear_output_area (cxx_pp);
2018 dump_expr (decl, 0);
2019 return pp_formatted_text (cxx_pp);
2022 static const char *
2023 fndecl_to_string (tree fndecl, int verbose)
2025 int flags;
2027 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
2028 if (verbose)
2029 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2030 pp_clear_output_area (cxx_pp);
2031 dump_decl (fndecl, flags);
2032 return pp_formatted_text (cxx_pp);
2036 static const char *
2037 code_to_string (enum tree_code c)
2039 return tree_code_name [c];
2042 const char *
2043 language_to_string (enum languages c)
2045 switch (c)
2047 case lang_c:
2048 return "C";
2050 case lang_cplusplus:
2051 return "C++";
2053 case lang_java:
2054 return "Java";
2056 default:
2057 abort ();
2058 return 0;
2062 /* Return the proper printed version of a parameter to a C++ function. */
2064 static const char *
2065 parm_to_string (int p)
2067 pp_clear_output_area (cxx_pp);
2068 if (p < 0)
2069 pp_string (cxx_pp, "'this'");
2070 else
2071 pp_decimal_int (cxx_pp, p + 1);
2072 return pp_formatted_text (cxx_pp);
2075 static const char *
2076 op_to_string (enum tree_code p)
2078 tree id = operator_name_info[(int) p].identifier;
2079 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2082 static const char *
2083 type_to_string (tree typ, int verbose)
2085 int flags = 0;
2086 if (verbose)
2087 flags |= TFF_CLASS_KEY_OR_ENUM;
2088 flags |= TFF_TEMPLATE_HEADER;
2090 pp_clear_output_area (cxx_pp);
2091 dump_type (typ, flags);
2092 return pp_formatted_text (cxx_pp);
2095 static const char *
2096 assop_to_string (enum tree_code p)
2098 tree id = assignment_operator_name_info[(int) p].identifier;
2099 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2102 static const char *
2103 args_to_string (tree p, int verbose)
2105 int flags = 0;
2106 if (verbose)
2107 flags |= TFF_CLASS_KEY_OR_ENUM;
2109 if (p == NULL_TREE)
2110 return "";
2112 if (TYPE_P (TREE_VALUE (p)))
2113 return type_as_string (p, flags);
2115 pp_clear_output_area (cxx_pp);
2116 for (; p; p = TREE_CHAIN (p))
2118 if (TREE_VALUE (p) == null_node)
2119 pp_identifier (cxx_pp, "NULL");
2120 else
2121 dump_type (error_type (TREE_VALUE (p)), flags);
2122 if (TREE_CHAIN (p))
2123 pp_separate_with_comma (cxx_pp);
2125 return pp_formatted_text (cxx_pp);
2128 static const char *
2129 cv_to_string (tree p, int v)
2131 pp_clear_output_area (cxx_pp);
2132 dump_qualifiers (p, v ? before : none);
2133 return pp_formatted_text (cxx_pp);
2136 /* Langhook for print_error_function. */
2137 void
2138 cxx_print_error_function (diagnostic_context *context, const char *file)
2140 lhd_print_error_function (context, file);
2141 pp_base_set_prefix (context->printer, file);
2142 maybe_print_instantiation_context (context);
2145 static void
2146 cp_diagnostic_starter (diagnostic_context *context,
2147 diagnostic_info *diagnostic)
2149 diagnostic_report_current_module (context);
2150 cp_print_error_function (context, diagnostic);
2151 maybe_print_instantiation_context (context);
2152 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2155 static void
2156 cp_diagnostic_finalizer (diagnostic_context *context,
2157 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2159 pp_base_destroy_prefix (context->printer);
2162 /* Print current function onto BUFFER, in the process of reporting
2163 a diagnostic message. Called from cp_diagnostic_starter. */
2164 static void
2165 cp_print_error_function (diagnostic_context *context,
2166 diagnostic_info *diagnostic)
2168 if (diagnostic_last_function_changed (context))
2170 const char *old_prefix = context->printer->prefix;
2171 char *new_prefix = diagnostic->location.file
2172 ? file_name_as_prefix (diagnostic->location.file)
2173 : NULL;
2175 pp_base_set_prefix (context->printer, new_prefix);
2177 if (current_function_decl == NULL)
2178 pp_base_string (context->printer, "At global scope:");
2179 else
2180 pp_printf (context->printer, "In %s `%s':",
2181 function_category (current_function_decl),
2182 cxx_printable_name (current_function_decl, 2));
2183 pp_base_newline (context->printer);
2185 diagnostic_set_last_function (context);
2186 pp_base_destroy_prefix (context->printer);
2187 context->printer->prefix = old_prefix;
2191 /* Returns a description of FUNCTION using standard terminology. */
2192 static const char *
2193 function_category (tree fn)
2195 if (DECL_FUNCTION_MEMBER_P (fn))
2197 if (DECL_STATIC_FUNCTION_P (fn))
2198 return "static member function";
2199 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2200 return "copy constructor";
2201 else if (DECL_CONSTRUCTOR_P (fn))
2202 return "constructor";
2203 else if (DECL_DESTRUCTOR_P (fn))
2204 return "destructor";
2205 else
2206 return "member function";
2208 else
2209 return "function";
2212 /* Report the full context of a current template instantiation,
2213 onto BUFFER. */
2214 static void
2215 print_instantiation_full_context (diagnostic_context *context)
2217 tree p = current_instantiation ();
2218 location_t location = input_location;
2220 if (p)
2222 if (current_function_decl != TINST_DECL (p)
2223 && current_function_decl != NULL_TREE)
2224 /* We can get here during the processing of some synthesized
2225 method. Then, TINST_DECL (p) will be the function that's causing
2226 the synthesis. */
2228 else
2230 if (current_function_decl == TINST_DECL (p))
2231 /* Avoid redundancy with the the "In function" line. */;
2232 else
2233 pp_verbatim (context->printer,
2234 "%s: In instantiation of `%s':\n", location.file,
2235 decl_as_string (TINST_DECL (p),
2236 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2238 location.line = TINST_LINE (p);
2239 location.file = TINST_FILE (p);
2240 p = TREE_CHAIN (p);
2244 print_instantiation_partial_context (context, p, location);
2247 /* Same as above but less verbose. */
2248 static void
2249 print_instantiation_partial_context (diagnostic_context *context,
2250 tree t, location_t loc)
2252 for (; t; t = TREE_CHAIN (t))
2254 pp_verbatim (context->printer, "%s:%d: instantiated from `%s'\n",
2255 loc.file, loc.line,
2256 decl_as_string (TINST_DECL (t),
2257 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2258 loc.line = TINST_LINE (t);
2259 loc.file = TINST_FILE (t);
2261 pp_verbatim (context->printer, "%s:%d: instantiated from here\n",
2262 loc.file, loc.line);
2265 /* Called from cp_thing to print the template context for an error. */
2266 static void
2267 maybe_print_instantiation_context (diagnostic_context *context)
2269 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2270 return;
2272 record_last_problematic_instantiation ();
2273 print_instantiation_full_context (context);
2276 /* Report the bare minimum context of a template instantiation. */
2277 void
2278 print_instantiation_context (void)
2280 print_instantiation_partial_context
2281 (global_dc, current_instantiation (), input_location);
2282 diagnostic_flush_buffer (global_dc);
2285 /* Called from output_format -- during diagnostic message processing --
2286 to handle C++ specific format specifier with the following meanings:
2287 %A function argument-list.
2288 %C tree code.
2289 %D declaration.
2290 %E expression.
2291 %F function declaration.
2292 %L language as used in extern "lang".
2293 %O binary operator.
2294 %P function parameter whose position is indicated by an integer.
2295 %Q assignment operator.
2296 %T type.
2297 %V cv-qualifier. */
2298 static bool
2299 cp_printer (pretty_printer *pp, text_info *text)
2301 int verbose = 0;
2302 const char *result;
2303 #define next_tree va_arg (*text->args_ptr, tree)
2304 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2305 #define next_lang va_arg (*text->args_ptr, enum languages)
2306 #define next_int va_arg (*text->args_ptr, int)
2308 if (*text->format_spec == '+')
2309 ++text->format_spec;
2310 if (*text->format_spec == '#')
2312 verbose = 1;
2313 ++text->format_spec;
2316 switch (*text->format_spec)
2318 case 'A': result = args_to_string (next_tree, verbose); break;
2319 case 'C': result = code_to_string (next_tcode); break;
2320 case 'D': result = decl_to_string (next_tree, verbose); break;
2321 case 'E': result = expr_to_string (next_tree); break;
2322 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2323 case 'L': result = language_to_string (next_lang); break;
2324 case 'O': result = op_to_string (next_tcode); break;
2325 case 'P': result = parm_to_string (next_int); break;
2326 case 'Q': result = assop_to_string (next_tcode); break;
2327 case 'T': result = type_to_string (next_tree, verbose); break;
2328 case 'V': result = cv_to_string (next_tree, verbose); break;
2330 default:
2331 return false;
2334 pp_base_string (pp, result);
2335 return true;
2336 #undef next_tree
2337 #undef next_tcode
2338 #undef next_lang
2339 #undef next_int
2342 static void
2343 pp_non_consecutive_character (cxx_pretty_printer *pp, int c)
2345 const char *p = pp_last_position_in_text (pp);
2347 if (p != NULL && *p == c)
2348 pp_space (pp);
2349 pp_character (pp, c);
2352 /* These are temporary wrapper functions which handle the historic
2353 behavior of cp_*_at. */
2355 static tree
2356 locate_error (const char *msgid, va_list ap)
2358 tree here = 0, t;
2359 int plus = 0;
2360 const char *f;
2362 for (f = msgid; *f; f++)
2364 plus = 0;
2365 if (*f == '%')
2367 f++;
2368 if (*f == '+')
2369 f++, plus = 1;
2370 if (*f == '#')
2371 f++;
2373 switch (*f)
2375 /* Just ignore these possibilities. */
2376 case '%': break;
2377 case 'P':
2378 case 'd': (void) va_arg (ap, int); break;
2379 case 's': (void) va_arg (ap, char *); break;
2380 case 'L': (void) va_arg (ap, enum languages); break;
2381 case 'C':
2382 case 'O':
2383 case 'Q': (void) va_arg (ap, enum tree_code); break;
2385 /* These take a tree, which may be where the error is
2386 located. */
2387 case 'A':
2388 case 'D':
2389 case 'E':
2390 case 'F':
2391 case 'T':
2392 case 'V':
2393 t = va_arg (ap, tree);
2394 if (!here || plus)
2395 here = t;
2396 break;
2398 default:
2399 errorcount = 0; /* damn ICE suppression */
2400 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2405 if (here == 0)
2406 here = va_arg (ap, tree);
2408 return here;
2412 void
2413 cp_error_at (const char *msgid, ...)
2415 tree here;
2416 diagnostic_info diagnostic;
2417 va_list ap;
2419 va_start (ap, msgid);
2420 here = locate_error (msgid, ap);
2421 va_end (ap);
2423 va_start (ap, msgid);
2424 diagnostic_set_info (&diagnostic, msgid, &ap,
2425 location_of (here), DK_ERROR);
2426 report_diagnostic (&diagnostic);
2427 va_end (ap);
2430 void
2431 cp_warning_at (const char *msgid, ...)
2433 tree here;
2434 diagnostic_info diagnostic;
2435 va_list ap;
2437 va_start (ap, msgid);
2438 here = locate_error (msgid, ap);
2439 va_end (ap);
2441 va_start (ap, msgid);
2442 diagnostic_set_info (&diagnostic, msgid, &ap,
2443 location_of (here), DK_WARNING);
2444 report_diagnostic (&diagnostic);
2445 va_end (ap);
2448 void
2449 cp_pedwarn_at (const char *msgid, ...)
2451 tree here;
2452 diagnostic_info diagnostic;
2453 va_list ap;
2455 va_start (ap, msgid);
2456 here = locate_error (msgid, ap);
2457 va_end (ap);
2459 va_start (ap, msgid);
2460 diagnostic_set_info (&diagnostic, msgid, &ap,
2461 location_of (here), pedantic_error_kind());
2462 report_diagnostic (&diagnostic);
2463 va_end (ap);