2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / cp / error.c
blobbb6ff341572f359a079357199e11ecb039704f64
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_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
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 fall through. */
336 case TEMPLATE_DECL:
337 case NAMESPACE_DECL:
338 dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
339 break;
341 case INTEGER_TYPE:
342 case REAL_TYPE:
343 case VOID_TYPE:
344 case BOOLEAN_TYPE:
345 case COMPLEX_TYPE:
346 case VECTOR_TYPE:
347 pp_base (cxx_pp)->padding = pp_none;
348 pp_type_specifier_seq (cxx_pp, t);
349 break;
351 case TEMPLATE_TEMPLATE_PARM:
352 /* For parameters inside template signature. */
353 if (TYPE_IDENTIFIER (t))
354 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
355 else
356 pp_cxx_canonical_template_parameter (cxx_pp, t);
357 break;
359 case BOUND_TEMPLATE_TEMPLATE_PARM:
361 tree args = TYPE_TI_ARGS (t);
362 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
363 pp_template_argument_list_start (cxx_pp);
364 dump_template_argument_list (args, flags);
365 pp_template_argument_list_end (cxx_pp);
367 break;
369 case TEMPLATE_TYPE_PARM:
370 dump_qualifiers (t, after);
371 if (TYPE_IDENTIFIER (t))
372 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
373 else
374 pp_cxx_canonical_template_parameter
375 (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
376 break;
378 /* This is not always necessary for pointers and such, but doing this
379 reduces code size. */
380 case ARRAY_TYPE:
381 case POINTER_TYPE:
382 case REFERENCE_TYPE:
383 case OFFSET_TYPE:
384 offset_type:
385 case FUNCTION_TYPE:
386 case METHOD_TYPE:
388 dump_type_prefix (t, flags);
389 dump_type_suffix (t, flags);
390 break;
392 case TYPENAME_TYPE:
393 dump_qualifiers (t, after);
394 pp_string (cxx_pp, "typename ");
395 dump_typename (t, flags);
396 break;
398 case UNBOUND_CLASS_TEMPLATE:
399 dump_type (TYPE_CONTEXT (t), flags);
400 pp_colon_colon (cxx_pp);
401 pp_identifier (cxx_pp, "template ");
402 dump_type (DECL_NAME (TYPE_NAME (t)), flags);
403 break;
405 case TYPEOF_TYPE:
406 pp_string (cxx_pp, "__typeof (");
407 dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS);
408 pp_right_paren (cxx_pp);
409 break;
411 default:
412 pp_unsupported_tree (cxx_pp, t);
413 /* Fall through to error. */
415 case ERROR_MARK:
416 pp_identifier (cxx_pp, "<type error>");
417 break;
421 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
422 a TYPENAME_TYPE. */
424 static void
425 dump_typename (tree t, int flags)
427 tree ctx = TYPE_CONTEXT (t);
429 if (TREE_CODE (ctx) == TYPENAME_TYPE)
430 dump_typename (ctx, flags);
431 else
432 dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
433 pp_colon_colon (cxx_pp);
434 dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
437 /* Return the name of the supplied aggregate, or enumeral type. */
439 static const char *
440 class_key_or_enum (tree t)
442 if (TREE_CODE (t) == ENUMERAL_TYPE)
443 return "enum";
444 else if (TREE_CODE (t) == UNION_TYPE)
445 return "union";
446 else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
447 return "class";
448 else
449 return "struct";
452 /* Print out a class declaration T under the control of FLAGS,
453 in the form `class foo'. */
455 static void
456 dump_aggr_type (tree t, int flags)
458 tree name;
459 const char *variety = class_key_or_enum (t);
460 int typdef = 0;
461 int tmplate = 0;
463 dump_qualifiers (t, after);
465 if (flags & TFF_CLASS_KEY_OR_ENUM)
467 pp_identifier (cxx_pp, variety);
468 pp_space (cxx_pp);
471 if (flags & TFF_CHASE_TYPEDEF)
472 t = TYPE_MAIN_VARIANT (t);
474 name = TYPE_NAME (t);
476 if (name)
478 typdef = !DECL_ARTIFICIAL (name);
479 tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
480 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
481 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
482 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
483 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
484 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
485 dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
486 if (tmplate)
488 /* Because the template names are mangled, we have to locate
489 the most general template, and use that name. */
490 tree tpl = CLASSTYPE_TI_TEMPLATE (t);
492 while (DECL_TEMPLATE_INFO (tpl))
493 tpl = DECL_TI_TEMPLATE (tpl);
494 name = tpl;
496 name = DECL_NAME (name);
499 if (name == 0 || ANON_AGGRNAME_P (name))
501 if (flags & TFF_CLASS_KEY_OR_ENUM)
502 pp_identifier (cxx_pp, "<anonymous>");
503 else
504 pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
506 else
507 pp_tree_identifier (cxx_pp, name);
508 if (tmplate)
509 dump_template_parms (TYPE_TEMPLATE_INFO (t),
510 !CLASSTYPE_USE_TEMPLATE (t),
511 flags & ~TFF_TEMPLATE_HEADER);
514 /* Dump into the obstack the initial part of the output for a given type.
515 This is necessary when dealing with things like functions returning
516 functions. Examples:
518 return type of `int (* fee ())()': pointer -> function -> int. Both
519 pointer (and reference and offset) and function (and member) types must
520 deal with prefix and suffix.
522 Arrays must also do this for DECL nodes, like int a[], and for things like
523 int *[]&.
525 Return indicates how you should pad an object name after this. I.e. you
526 want to pad non-*, non-& cores, but not pad * or & types. */
528 static enum pad
529 dump_type_prefix (tree t, int flags)
531 enum pad padding = before;
533 if (TYPE_PTRMEMFUNC_P (t))
535 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
536 goto offset_type;
539 switch (TREE_CODE (t))
541 case POINTER_TYPE:
542 case REFERENCE_TYPE:
544 tree sub = TREE_TYPE (t);
546 padding = dump_type_prefix (sub, flags);
547 if (TREE_CODE (sub) == ARRAY_TYPE)
549 pp_space (cxx_pp);
550 pp_left_paren (cxx_pp);
552 pp_character (cxx_pp, "&*"[TREE_CODE (t) == POINTER_TYPE]);
553 padding = dump_qualifiers (t, before);
555 break;
557 case OFFSET_TYPE:
558 offset_type:
559 padding = dump_type_prefix (TREE_TYPE (t), flags);
560 if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
562 if (padding != none)
563 pp_space (cxx_pp);
564 dump_type (TYPE_OFFSET_BASETYPE (t), flags);
565 pp_colon_colon (cxx_pp);
567 pp_star (cxx_pp);
568 padding = dump_qualifiers (t, none);
569 break;
571 /* Can only be reached through function pointer -- this would not be
572 correct if FUNCTION_DECLs used it. */
573 case FUNCTION_TYPE:
574 padding = dump_type_prefix (TREE_TYPE (t), flags);
575 if (padding != none)
576 pp_space (cxx_pp);
577 pp_left_paren (cxx_pp);
578 padding = none;
579 break;
581 case METHOD_TYPE:
582 padding = dump_type_prefix (TREE_TYPE (t), flags);
583 if (padding != none)
584 pp_space (cxx_pp);
585 pp_left_paren (cxx_pp);
586 padding = none;
587 dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
588 pp_colon_colon (cxx_pp);
589 break;
591 case ARRAY_TYPE:
592 padding = dump_type_prefix (TREE_TYPE (t), flags);
593 break;
595 case ENUMERAL_TYPE:
596 case IDENTIFIER_NODE:
597 case INTEGER_TYPE:
598 case BOOLEAN_TYPE:
599 case REAL_TYPE:
600 case RECORD_TYPE:
601 case TEMPLATE_TYPE_PARM:
602 case TEMPLATE_TEMPLATE_PARM:
603 case BOUND_TEMPLATE_TEMPLATE_PARM:
604 case TREE_LIST:
605 case TYPE_DECL:
606 case TREE_VEC:
607 case UNION_TYPE:
608 case UNKNOWN_TYPE:
609 case VOID_TYPE:
610 case TYPENAME_TYPE:
611 case COMPLEX_TYPE:
612 case VECTOR_TYPE:
613 case TYPEOF_TYPE:
614 dump_type (t, flags);
615 padding = before;
616 break;
618 default:
619 pp_unsupported_tree (cxx_pp, t);
620 /* fall through. */
621 case ERROR_MARK:
622 pp_identifier (cxx_pp, "<typeprefixerror>");
623 break;
625 return padding;
628 /* Dump the suffix of type T, under control of FLAGS. This is the part
629 which appears after the identifier (or function parms). */
631 static void
632 dump_type_suffix (tree t, int flags)
634 if (TYPE_PTRMEMFUNC_P (t))
635 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
637 switch (TREE_CODE (t))
639 case POINTER_TYPE:
640 case REFERENCE_TYPE:
641 case OFFSET_TYPE:
642 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
643 pp_right_paren (cxx_pp);
644 dump_type_suffix (TREE_TYPE (t), flags);
645 break;
647 /* Can only be reached through function pointer. */
648 case FUNCTION_TYPE:
649 case METHOD_TYPE:
651 tree arg;
652 pp_right_paren (cxx_pp);
653 arg = TYPE_ARG_TYPES (t);
654 if (TREE_CODE (t) == METHOD_TYPE)
655 arg = TREE_CHAIN (arg);
657 /* Function pointers don't have default args. Not in standard C++,
658 anyway; they may in g++, but we'll just pretend otherwise. */
659 dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
661 if (TREE_CODE (t) == METHOD_TYPE)
662 dump_qualifiers
663 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before);
664 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
665 dump_type_suffix (TREE_TYPE (t), flags);
666 break;
669 case ARRAY_TYPE:
670 pp_left_bracket (cxx_pp);
671 if (TYPE_DOMAIN (t))
673 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
674 pp_wide_integer
675 (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
676 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
677 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
678 flags & ~TFF_EXPR_IN_PARENS);
679 else
680 dump_expr (fold (cp_build_binary_op
681 (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
682 integer_one_node)),
683 flags & ~TFF_EXPR_IN_PARENS);
685 pp_right_bracket (cxx_pp);
686 dump_type_suffix (TREE_TYPE (t), flags);
687 break;
689 case ENUMERAL_TYPE:
690 case IDENTIFIER_NODE:
691 case INTEGER_TYPE:
692 case BOOLEAN_TYPE:
693 case REAL_TYPE:
694 case RECORD_TYPE:
695 case TEMPLATE_TYPE_PARM:
696 case TEMPLATE_TEMPLATE_PARM:
697 case BOUND_TEMPLATE_TEMPLATE_PARM:
698 case TREE_LIST:
699 case TYPE_DECL:
700 case TREE_VEC:
701 case UNION_TYPE:
702 case UNKNOWN_TYPE:
703 case VOID_TYPE:
704 case TYPENAME_TYPE:
705 case COMPLEX_TYPE:
706 case VECTOR_TYPE:
707 case TYPEOF_TYPE:
708 break;
710 default:
711 pp_unsupported_tree (cxx_pp, t);
712 case ERROR_MARK:
713 /* Don't mark it here, we should have already done in
714 dump_type_prefix. */
715 break;
719 static void
720 dump_global_iord (tree t)
722 const char *p = NULL;
724 if (DECL_GLOBAL_CTOR_P (t))
725 p = "initializers";
726 else if (DECL_GLOBAL_DTOR_P (t))
727 p = "destructors";
728 else
729 abort ();
731 pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
734 static void
735 dump_simple_decl (tree t, tree type, int flags)
737 if (flags & TFF_DECL_SPECIFIERS)
739 if (dump_type_prefix (type, flags) != none)
740 pp_space (cxx_pp);
742 if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
743 dump_scope (CP_DECL_CONTEXT (t), flags);
744 if (DECL_NAME (t))
745 dump_decl (DECL_NAME (t), flags);
746 else
747 pp_identifier (cxx_pp, "<anonymous>");
748 if (flags & TFF_DECL_SPECIFIERS)
749 dump_type_suffix (type, flags);
752 /* Dump a human readable string for the decl T under control of FLAGS. */
754 static void
755 dump_decl (tree t, int flags)
757 if (t == NULL_TREE)
758 return;
760 switch (TREE_CODE (t))
762 case TYPE_DECL:
764 /* Don't say 'typedef class A' */
765 if (DECL_ARTIFICIAL (t))
767 if ((flags & TFF_DECL_SPECIFIERS)
768 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
769 /* Say `class T' not just `T'. */
770 pp_string (cxx_pp, "class ");
772 dump_type (TREE_TYPE (t), flags);
773 break;
776 if (flags & TFF_DECL_SPECIFIERS)
777 pp_string (cxx_pp, "typedef ");
778 dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
779 ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
780 flags);
781 break;
783 case VAR_DECL:
784 if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
786 pp_string (cxx_pp, "vtable for ");
787 my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720);
788 dump_type (DECL_CONTEXT (t), flags);
789 break;
791 /* Else fall through. */
792 case FIELD_DECL:
793 case PARM_DECL:
794 dump_simple_decl (t, TREE_TYPE (t), flags);
795 break;
797 case RESULT_DECL:
798 pp_string (cxx_pp, "<return value> ");
799 dump_simple_decl (t, TREE_TYPE (t), flags);
800 break;
802 case NAMESPACE_DECL:
803 if (flags & TFF_DECL_SPECIFIERS)
804 pp_cxx_declaration (cxx_pp, t);
805 else
807 dump_scope (CP_DECL_CONTEXT (t), flags);
808 if (DECL_NAME (t) == NULL_TREE)
809 pp_identifier (cxx_pp, "<unnamed>");
810 else
811 pp_tree_identifier (cxx_pp, DECL_NAME (t));
813 break;
815 case SCOPE_REF:
816 dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
817 pp_colon_colon (cxx_pp);
818 dump_decl (TREE_OPERAND (t, 1), flags);
819 break;
821 case ARRAY_REF:
822 dump_decl (TREE_OPERAND (t, 0), flags);
823 pp_left_bracket (cxx_pp);
824 dump_decl (TREE_OPERAND (t, 1), flags);
825 pp_right_bracket (cxx_pp);
826 break;
828 /* So that we can do dump_decl on an aggr type. */
829 case RECORD_TYPE:
830 case UNION_TYPE:
831 case ENUMERAL_TYPE:
832 dump_type (t, flags);
833 break;
835 case BIT_NOT_EXPR:
836 /* This is a pseudo destructor call which has not been folded into
837 a PSEUDO_DTOR_EXPR yet. */
838 pp_complement (cxx_pp);
839 dump_type (TREE_OPERAND (t, 0), flags);
840 break;
842 case TYPE_EXPR:
843 abort ();
844 break;
846 /* These special cases are duplicated here so that other functions
847 can feed identifiers to error and get them demangled properly. */
848 case IDENTIFIER_NODE:
849 if (IDENTIFIER_TYPENAME_P (t))
851 pp_string (cxx_pp, "operator ");
852 /* Not exactly IDENTIFIER_TYPE_VALUE. */
853 dump_type (TREE_TYPE (t), flags);
854 break;
856 else
857 pp_tree_identifier (cxx_pp, t);
858 break;
860 case OVERLOAD:
861 if (OVL_CHAIN (t))
863 t = OVL_CURRENT (t);
864 if (DECL_CLASS_SCOPE_P (t))
866 dump_type (DECL_CONTEXT (t), flags);
867 pp_colon_colon (cxx_pp);
869 else if (DECL_CONTEXT (t))
871 dump_decl (DECL_CONTEXT (t), flags);
872 pp_colon_colon (cxx_pp);
874 dump_decl (DECL_NAME (t), flags);
875 break;
878 /* If there's only one function, just treat it like an ordinary
879 FUNCTION_DECL. */
880 t = OVL_CURRENT (t);
881 /* Fall through. */
883 case FUNCTION_DECL:
884 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
885 dump_global_iord (t);
886 else if (! DECL_LANG_SPECIFIC (t))
887 pp_identifier (cxx_pp, "<internal>");
888 else
889 dump_function_decl (t, flags);
890 break;
892 case TEMPLATE_DECL:
893 dump_template_decl (t, flags);
894 break;
896 case TEMPLATE_ID_EXPR:
898 tree name = TREE_OPERAND (t, 0);
900 if (is_overloaded_fn (name))
901 name = DECL_NAME (get_first_fn (name));
902 dump_decl (name, flags);
903 pp_template_argument_list_start (cxx_pp);
904 if (TREE_OPERAND (t, 1))
905 dump_template_argument_list (TREE_OPERAND (t, 1), flags);
906 pp_template_argument_list_end (cxx_pp);
908 break;
910 case LABEL_DECL:
911 pp_tree_identifier (cxx_pp, DECL_NAME (t));
912 break;
914 case CONST_DECL:
915 if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
916 || (DECL_INITIAL (t) &&
917 TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
918 dump_simple_decl (t, TREE_TYPE (t), flags);
919 else if (DECL_NAME (t))
920 dump_decl (DECL_NAME (t), flags);
921 else if (DECL_INITIAL (t))
922 dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
923 else
924 pp_identifier (cxx_pp, "<enumerator>");
925 break;
927 case USING_DECL:
928 pp_string (cxx_pp, "using ");
929 dump_type (DECL_INITIAL (t), flags);
930 pp_colon_colon (cxx_pp);
931 dump_decl (DECL_NAME (t), flags);
932 break;
934 case BASELINK:
935 dump_decl (BASELINK_FUNCTIONS (t), flags);
936 break;
938 case NON_DEPENDENT_EXPR:
939 dump_expr (t, flags);
940 break;
942 default:
943 pp_unsupported_tree (cxx_pp, t);
944 /* Fallthrough to error. */
946 case ERROR_MARK:
947 pp_identifier (cxx_pp, "<declaration error>");
948 break;
952 /* Dump a template declaration T under control of FLAGS. This means the
953 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
955 static void
956 dump_template_decl (tree t, int flags)
958 tree orig_parms = DECL_TEMPLATE_PARMS (t);
959 tree parms;
960 int i;
962 if (flags & TFF_TEMPLATE_HEADER)
964 for (parms = orig_parms = nreverse (orig_parms);
965 parms;
966 parms = TREE_CHAIN (parms))
968 tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
969 int len = TREE_VEC_LENGTH (inner_parms);
971 pp_string (cxx_pp, "template<");
973 /* If we've shown the template prefix, we'd better show the
974 parameters' and decl's type too. */
975 flags |= TFF_DECL_SPECIFIERS;
977 for (i = 0; i < len; i++)
979 if (i)
980 pp_separate_with_comma (cxx_pp);
981 dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
983 pp_template_argument_list_end (cxx_pp);
984 pp_space (cxx_pp);
986 nreverse(orig_parms);
988 if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
989 /* Say `template<arg> class TT' not just `template<arg> TT'. */
990 pp_string (cxx_pp, "class ");
993 if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
994 dump_type (TREE_TYPE (t),
995 ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
996 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
997 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
998 dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
999 else if (TREE_TYPE (t) == NULL_TREE)
1000 abort ();
1001 else
1002 switch (NEXT_CODE (t))
1004 case METHOD_TYPE:
1005 case FUNCTION_TYPE:
1006 dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
1007 break;
1008 default:
1009 /* This case can occur with some invalid code. */
1010 dump_type (TREE_TYPE (t),
1011 (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
1012 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0));
1016 /* Pretty print a function decl. There are several ways we want to print a
1017 function declaration. The TFF_ bits in FLAGS tells us how to behave.
1018 As error can only apply the '#' flag once to give 0 and 1 for V, there
1019 is %D which doesn't print the throw specs, and %F which does. */
1021 static void
1022 dump_function_decl (tree t, int flags)
1024 tree fntype;
1025 tree parmtypes;
1026 tree cname = NULL_TREE;
1027 tree template_args = NULL_TREE;
1028 tree template_parms = NULL_TREE;
1029 int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
1031 if (TREE_CODE (t) == TEMPLATE_DECL)
1032 t = DECL_TEMPLATE_RESULT (t);
1034 /* Pretty print template instantiations only. */
1035 if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
1037 tree tmpl;
1039 template_args = DECL_TI_ARGS (t);
1040 tmpl = most_general_template (t);
1041 if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1043 template_parms = DECL_TEMPLATE_PARMS (tmpl);
1044 t = tmpl;
1048 fntype = TREE_TYPE (t);
1049 parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1051 if (DECL_CLASS_SCOPE_P (t))
1052 cname = DECL_CONTEXT (t);
1053 /* This is for partially instantiated template methods. */
1054 else if (TREE_CODE (fntype) == METHOD_TYPE)
1055 cname = TREE_TYPE (TREE_VALUE (parmtypes));
1057 if (!(flags & TFF_DECL_SPECIFIERS))
1058 /* OK */;
1059 else if (DECL_STATIC_FUNCTION_P (t))
1060 pp_identifier (cxx_pp, "static ");
1061 else if (DECL_VIRTUAL_P (t))
1062 pp_identifier (cxx_pp, "virtual ");
1064 /* Print the return type? */
1065 if (show_return)
1066 show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
1067 && !DECL_DESTRUCTOR_P (t);
1068 if (show_return)
1070 dump_type_prefix (TREE_TYPE (fntype), flags);
1071 pp_space (cxx_pp);
1074 /* Print the function name. */
1075 if (cname)
1077 dump_type (cname, flags);
1078 pp_colon_colon (cxx_pp);
1080 else
1081 dump_scope (CP_DECL_CONTEXT (t), flags);
1083 dump_function_name (t, flags);
1085 if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1087 dump_parameters (parmtypes, flags);
1089 if (TREE_CODE (fntype) == METHOD_TYPE)
1090 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
1091 before);
1093 if (flags & TFF_EXCEPTION_SPECIFICATION)
1094 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1096 if (show_return)
1097 dump_type_suffix (TREE_TYPE (fntype), flags);
1100 /* If T is a template instantiation, dump the parameter binding. */
1101 if (template_parms != NULL_TREE && template_args != NULL_TREE)
1103 pp_string (cxx_pp, " [with ");
1104 dump_template_bindings (template_parms, template_args);
1105 pp_right_bracket (cxx_pp);
1109 /* Print a parameter list. If this is for a member function, the
1110 member object ptr (and any other hidden args) should have
1111 already been removed. */
1113 static void
1114 dump_parameters (tree parmtypes, int flags)
1116 int first;
1118 pp_left_paren (cxx_pp);
1120 for (first = 1; parmtypes != void_list_node;
1121 parmtypes = TREE_CHAIN (parmtypes))
1123 if (!first)
1124 pp_separate_with_comma (cxx_pp);
1125 first = 0;
1126 if (!parmtypes)
1128 pp_identifier (cxx_pp, "...");
1129 break;
1131 dump_type (TREE_VALUE (parmtypes), flags);
1133 if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1135 pp_string (cxx_pp, " = ");
1136 dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1140 pp_right_paren (cxx_pp);
1143 /* Print an exception specification. T is the exception specification. */
1145 static void
1146 dump_exception_spec (tree t, int flags)
1148 if (t)
1150 pp_string (cxx_pp, " throw (");
1151 if (TREE_VALUE (t) != NULL_TREE)
1152 while (1)
1154 dump_type (TREE_VALUE (t), flags);
1155 t = TREE_CHAIN (t);
1156 if (!t)
1157 break;
1158 pp_separate_with_comma (cxx_pp);
1160 pp_right_paren (cxx_pp);
1164 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1165 and destructors properly. */
1167 static void
1168 dump_function_name (tree t, int flags)
1170 tree name = DECL_NAME (t);
1172 if (TREE_CODE (t) == TEMPLATE_DECL)
1173 t = DECL_TEMPLATE_RESULT (t);
1175 /* Don't let the user see __comp_ctor et al. */
1176 if (DECL_CONSTRUCTOR_P (t)
1177 || DECL_DESTRUCTOR_P (t))
1178 name = constructor_name (DECL_CONTEXT (t));
1180 if (DECL_DESTRUCTOR_P (t))
1182 pp_complement (cxx_pp);
1183 dump_decl (name, TFF_PLAIN_IDENTIFIER);
1185 else if (DECL_CONV_FN_P (t))
1187 /* This cannot use the hack that the operator's return
1188 type is stashed off of its name because it may be
1189 used for error reporting. In the case of conflicting
1190 declarations, both will have the same name, yet
1191 the types will be different, hence the TREE_TYPE field
1192 of the first name will be clobbered by the second. */
1193 pp_string (cxx_pp, "operator ");
1194 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1196 else if (IDENTIFIER_OPNAME_P (name))
1197 pp_tree_identifier (cxx_pp, name);
1198 else
1199 dump_decl (name, flags);
1201 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
1202 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1203 && (DECL_TEMPLATE_SPECIALIZATION (t)
1204 || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1205 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t))
1206 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1207 dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1210 /* Dump the template parameters from the template info INFO under control of
1211 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1212 specialization (partial or complete). For partial specializations we show
1213 the specialized parameter values. For a primary template we show no
1214 decoration. */
1216 static void
1217 dump_template_parms (tree info, int primary, int flags)
1219 tree args = info ? TI_ARGS (info) : NULL_TREE;
1221 if (primary && flags & TFF_TEMPLATE_NAME)
1222 return;
1223 flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1224 pp_template_argument_list_start (cxx_pp);
1226 /* Be careful only to print things when we have them, so as not
1227 to crash producing error messages. */
1228 if (args && !primary)
1230 int len, ix;
1232 if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
1233 args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1235 len = TREE_VEC_LENGTH (args);
1237 for (ix = 0; ix != len; ix++)
1239 tree arg = TREE_VEC_ELT (args, ix);
1241 if (ix)
1242 pp_separate_with_comma (cxx_pp);
1244 if (!arg)
1245 pp_identifier (cxx_pp, "<template parameter error>");
1246 else
1247 dump_template_argument (arg, flags);
1250 else if (primary)
1252 tree tpl = TI_TEMPLATE (info);
1253 tree parms = DECL_TEMPLATE_PARMS (tpl);
1254 int len, ix;
1256 parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1257 len = parms ? TREE_VEC_LENGTH (parms) : 0;
1259 for (ix = 0; ix != len; ix++)
1261 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1263 if (ix)
1264 pp_separate_with_comma (cxx_pp);
1266 dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1269 pp_template_argument_list_end (cxx_pp);
1272 /* Print out a list of initializers (subr of dump_expr). */
1274 static void
1275 dump_expr_list (tree l, int flags)
1277 while (l)
1279 dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1280 l = TREE_CHAIN (l);
1281 if (l)
1282 pp_separate_with_comma (cxx_pp);
1286 /* Print out an expression E under control of FLAGS. */
1288 static void
1289 dump_expr (tree t, int flags)
1291 if (t == 0)
1292 return;
1294 switch (TREE_CODE (t))
1296 case VAR_DECL:
1297 case PARM_DECL:
1298 case FIELD_DECL:
1299 case CONST_DECL:
1300 case FUNCTION_DECL:
1301 case TEMPLATE_DECL:
1302 case NAMESPACE_DECL:
1303 case OVERLOAD:
1304 case IDENTIFIER_NODE:
1305 dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1306 break;
1308 case INTEGER_CST:
1309 case STRING_CST:
1310 case REAL_CST:
1311 pp_c_constant (pp_c_base (cxx_pp), t);
1312 break;
1314 case PTRMEM_CST:
1315 pp_ampersand (cxx_pp);
1316 dump_type (PTRMEM_CST_CLASS (t), flags);
1317 pp_colon_colon (cxx_pp);
1318 pp_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1319 break;
1321 case COMPOUND_EXPR:
1322 pp_left_paren (cxx_pp);
1323 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1324 pp_separate_with_comma (cxx_pp);
1325 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1326 pp_right_paren (cxx_pp);
1327 break;
1329 case COND_EXPR:
1330 pp_left_paren (cxx_pp);
1331 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1332 pp_string (cxx_pp, " ? ");
1333 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1334 pp_string (cxx_pp, " : ");
1335 dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1336 pp_right_paren (cxx_pp);
1337 break;
1339 case SAVE_EXPR:
1340 if (TREE_HAS_CONSTRUCTOR (t))
1342 pp_string (cxx_pp, "new ");
1343 dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1345 else
1346 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1347 break;
1349 case AGGR_INIT_EXPR:
1351 tree fn = NULL_TREE;
1353 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1354 fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1356 if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1358 if (DECL_CONSTRUCTOR_P (fn))
1359 pp_tree_identifier (cxx_pp, TYPE_IDENTIFIER (TREE_TYPE (t)));
1360 else
1361 dump_decl (fn, 0);
1363 else
1364 dump_expr (TREE_OPERAND (t, 0), 0);
1366 pp_left_paren (cxx_pp);
1367 if (TREE_OPERAND (t, 1))
1368 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1369 pp_right_paren (cxx_pp);
1370 break;
1372 case CALL_EXPR:
1374 tree fn = TREE_OPERAND (t, 0);
1375 tree args = TREE_OPERAND (t, 1);
1377 if (TREE_CODE (fn) == ADDR_EXPR)
1378 fn = TREE_OPERAND (fn, 0);
1380 if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1382 tree ob = TREE_VALUE (args);
1383 if (TREE_CODE (ob) == ADDR_EXPR)
1385 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1386 pp_dot (cxx_pp);
1388 else if (TREE_CODE (ob) != PARM_DECL
1389 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1391 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1392 pp_arrow (cxx_pp);
1394 args = TREE_CHAIN (args);
1396 dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1397 pp_left_paren (cxx_pp);
1398 dump_expr_list (args, flags);
1399 pp_right_paren (cxx_pp);
1401 break;
1403 case NEW_EXPR:
1405 tree type = TREE_OPERAND (t, 1);
1406 tree init = TREE_OPERAND (t, 2);
1407 if (NEW_EXPR_USE_GLOBAL (t))
1408 pp_colon_colon (cxx_pp);
1409 pp_string (cxx_pp, "new ");
1410 if (TREE_OPERAND (t, 0))
1412 pp_left_paren (cxx_pp);
1413 dump_expr_list (TREE_OPERAND (t, 0), flags);
1414 pp_string (cxx_pp, ") ");
1416 if (TREE_CODE (type) == ARRAY_REF)
1417 type = build_cplus_array_type
1418 (TREE_OPERAND (type, 0),
1419 build_index_type (fold (build (MINUS_EXPR, integer_type_node,
1420 TREE_OPERAND (type, 1),
1421 integer_one_node))));
1422 dump_type (type, flags);
1423 if (init)
1425 pp_left_paren (cxx_pp);
1426 if (TREE_CODE (init) == TREE_LIST)
1427 dump_expr_list (init, flags);
1428 else if (init == void_zero_node)
1429 /* This representation indicates an empty initializer,
1430 e.g.: "new int()". */
1432 else
1433 dump_expr (init, flags);
1434 pp_right_paren (cxx_pp);
1437 break;
1439 case TARGET_EXPR:
1440 /* Note that this only works for G++ target exprs. If somebody
1441 builds a general TARGET_EXPR, there's no way to represent that
1442 it initializes anything other that the parameter slot for the
1443 default argument. Note we may have cleared out the first
1444 operand in expand_expr, so don't go killing ourselves. */
1445 if (TREE_OPERAND (t, 1))
1446 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1447 break;
1449 case INIT_EXPR:
1450 case MODIFY_EXPR:
1451 case PLUS_EXPR:
1452 case MINUS_EXPR:
1453 case MULT_EXPR:
1454 case TRUNC_DIV_EXPR:
1455 case TRUNC_MOD_EXPR:
1456 case MIN_EXPR:
1457 case MAX_EXPR:
1458 case LSHIFT_EXPR:
1459 case RSHIFT_EXPR:
1460 case BIT_IOR_EXPR:
1461 case BIT_XOR_EXPR:
1462 case BIT_AND_EXPR:
1463 case TRUTH_ANDIF_EXPR:
1464 case TRUTH_ORIF_EXPR:
1465 case LT_EXPR:
1466 case LE_EXPR:
1467 case GT_EXPR:
1468 case GE_EXPR:
1469 case EQ_EXPR:
1470 case NE_EXPR:
1471 case EXACT_DIV_EXPR:
1472 dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1473 break;
1475 case CEIL_DIV_EXPR:
1476 case FLOOR_DIV_EXPR:
1477 case ROUND_DIV_EXPR:
1478 dump_binary_op ("/", t, flags);
1479 break;
1481 case CEIL_MOD_EXPR:
1482 case FLOOR_MOD_EXPR:
1483 case ROUND_MOD_EXPR:
1484 dump_binary_op ("%", t, flags);
1485 break;
1487 case COMPONENT_REF:
1489 tree ob = TREE_OPERAND (t, 0);
1490 if (TREE_CODE (ob) == INDIRECT_REF)
1492 ob = TREE_OPERAND (ob, 0);
1493 if (TREE_CODE (ob) != PARM_DECL
1494 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1496 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1497 pp_arrow (cxx_pp);
1500 else
1502 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1503 pp_dot (cxx_pp);
1505 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1507 break;
1509 case ARRAY_REF:
1510 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1511 pp_left_bracket (cxx_pp);
1512 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1513 pp_right_bracket (cxx_pp);
1514 break;
1516 case CONVERT_EXPR:
1517 if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
1519 pp_left_paren (cxx_pp);
1520 dump_type (TREE_TYPE (t), flags);
1521 pp_right_paren (cxx_pp);
1522 dump_expr (TREE_OPERAND (t, 0), flags);
1524 else
1525 dump_unary_op ("+", t, flags);
1526 break;
1528 case ADDR_EXPR:
1529 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1530 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1531 /* An ADDR_EXPR can have reference type. In that case, we
1532 shouldn't print the `&' doing so indicates to the user
1533 that the expression has pointer type. */
1534 || (TREE_TYPE (t)
1535 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1536 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1537 else
1538 dump_unary_op ("&", t, flags);
1539 break;
1541 case INDIRECT_REF:
1542 if (TREE_HAS_CONSTRUCTOR (t))
1544 t = TREE_OPERAND (t, 0);
1545 my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);
1546 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1547 pp_left_paren (cxx_pp);
1548 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1549 pp_right_paren (cxx_pp);
1551 else
1553 if (TREE_OPERAND (t,0) != NULL_TREE
1554 && TREE_TYPE (TREE_OPERAND (t, 0))
1555 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1556 dump_expr (TREE_OPERAND (t, 0), flags);
1557 else
1558 dump_unary_op ("*", t, flags);
1560 break;
1562 case NEGATE_EXPR:
1563 case BIT_NOT_EXPR:
1564 case TRUTH_NOT_EXPR:
1565 case PREDECREMENT_EXPR:
1566 case PREINCREMENT_EXPR:
1567 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1568 break;
1570 case POSTDECREMENT_EXPR:
1571 case POSTINCREMENT_EXPR:
1572 pp_left_paren (cxx_pp);
1573 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1574 pp_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1575 pp_right_paren (cxx_pp);
1576 break;
1578 case NON_LVALUE_EXPR:
1579 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1580 should be another level of INDIRECT_REF so that I don't have to do
1581 this. */
1582 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1584 tree next = TREE_TYPE (TREE_TYPE (t));
1586 while (TREE_CODE (next) == POINTER_TYPE)
1587 next = TREE_TYPE (next);
1589 if (TREE_CODE (next) == FUNCTION_TYPE)
1591 if (flags & TFF_EXPR_IN_PARENS)
1592 pp_left_paren (cxx_pp);
1593 pp_star (cxx_pp);
1594 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1595 if (flags & TFF_EXPR_IN_PARENS)
1596 pp_right_paren (cxx_pp);
1597 break;
1599 /* Else fall through. */
1601 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1602 break;
1604 case NOP_EXPR:
1606 tree op = TREE_OPERAND (t, 0);
1608 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1610 /* It is a cast, but we cannot tell whether it is a
1611 reinterpret or static cast. Use the C style notation. */
1612 if (flags & TFF_EXPR_IN_PARENS)
1613 pp_left_paren (cxx_pp);
1614 pp_left_paren (cxx_pp);
1615 dump_type (TREE_TYPE (t), flags);
1616 pp_right_paren (cxx_pp);
1617 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1618 if (flags & TFF_EXPR_IN_PARENS)
1619 pp_right_paren (cxx_pp);
1621 else
1622 dump_expr (op, flags);
1623 break;
1626 case EXPR_WITH_FILE_LOCATION:
1627 dump_expr (EXPR_WFL_NODE (t), flags);
1628 break;
1630 case CONSTRUCTOR:
1631 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1633 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1635 if (integer_zerop (idx))
1637 /* A NULL pointer-to-member constant. */
1638 pp_left_paren (cxx_pp);
1639 pp_left_paren (cxx_pp);
1640 dump_type (TREE_TYPE (t), flags);
1641 pp_right_paren (cxx_pp);
1642 pp_string (cxx_pp, ")0)");
1643 break;
1645 else if (host_integerp (idx, 0))
1647 tree virtuals;
1648 unsigned HOST_WIDE_INT n;
1650 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1651 t = TYPE_METHOD_BASETYPE (t);
1652 virtuals = TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t));
1654 n = tree_low_cst (idx, 0);
1656 /* Map vtable index back one, to allow for the null pointer to
1657 member. */
1658 --n;
1660 while (n > 0 && virtuals)
1662 --n;
1663 virtuals = TREE_CHAIN (virtuals);
1665 if (virtuals)
1667 dump_expr (BV_FN (virtuals),
1668 flags | TFF_EXPR_IN_PARENS);
1669 break;
1673 if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
1675 dump_type (TREE_TYPE (t), 0);
1676 pp_left_paren (cxx_pp);
1677 pp_right_paren (cxx_pp);
1679 else
1681 pp_left_brace (cxx_pp);
1682 dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
1683 pp_right_brace (cxx_pp);
1686 break;
1688 case OFFSET_REF:
1690 tree ob = TREE_OPERAND (t, 0);
1691 if (is_dummy_object (ob))
1693 t = TREE_OPERAND (t, 1);
1694 if (TREE_CODE (t) == FUNCTION_DECL)
1695 /* A::f */
1696 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1697 else if (BASELINK_P (t))
1698 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1699 flags | TFF_EXPR_IN_PARENS);
1700 else
1701 dump_decl (t, flags);
1703 else
1705 if (TREE_CODE (ob) == INDIRECT_REF)
1707 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1708 pp_string (cxx_pp, "->*");
1710 else
1712 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1713 pp_string (cxx_pp, ".*");
1715 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1717 break;
1720 case TEMPLATE_PARM_INDEX:
1721 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1722 break;
1724 case SCOPE_REF:
1725 dump_type (TREE_OPERAND (t, 0), flags);
1726 pp_colon_colon (cxx_pp);
1727 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1728 break;
1730 case CAST_EXPR:
1731 if (TREE_OPERAND (t, 0) == NULL_TREE
1732 || TREE_CHAIN (TREE_OPERAND (t, 0)))
1734 dump_type (TREE_TYPE (t), flags);
1735 pp_left_paren (cxx_pp);
1736 dump_expr_list (TREE_OPERAND (t, 0), flags);
1737 pp_right_paren (cxx_pp);
1739 else
1741 pp_left_paren (cxx_pp);
1742 dump_type (TREE_TYPE (t), flags);
1743 pp_string (cxx_pp, ")(");
1744 dump_expr_list (TREE_OPERAND (t, 0), flags);
1745 pp_right_paren (cxx_pp);
1747 break;
1749 case STATIC_CAST_EXPR:
1750 pp_string (cxx_pp, "static_cast<");
1751 goto cast;
1752 case REINTERPRET_CAST_EXPR:
1753 pp_string (cxx_pp, "reinterpret_cast<");
1754 goto cast;
1755 case CONST_CAST_EXPR:
1756 pp_string (cxx_pp, "const_cast<");
1757 goto cast;
1758 case DYNAMIC_CAST_EXPR:
1759 pp_string (cxx_pp, "dynamic_cast<");
1760 cast:
1761 dump_type (TREE_TYPE (t), flags);
1762 pp_string (cxx_pp, ">(");
1763 dump_expr (TREE_OPERAND (t, 0), flags);
1764 pp_right_paren (cxx_pp);
1765 break;
1767 case ARROW_EXPR:
1768 dump_expr (TREE_OPERAND (t, 0), flags);
1769 pp_arrow (cxx_pp);
1770 break;
1772 case SIZEOF_EXPR:
1773 case ALIGNOF_EXPR:
1774 if (TREE_CODE (t) == SIZEOF_EXPR)
1775 pp_string (cxx_pp, "sizeof (");
1776 else
1778 my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0);
1779 pp_string (cxx_pp, "__alignof__ (");
1781 if (TYPE_P (TREE_OPERAND (t, 0)))
1782 dump_type (TREE_OPERAND (t, 0), flags);
1783 else
1784 dump_expr (TREE_OPERAND (t, 0), flags);
1785 pp_right_paren (cxx_pp);
1786 break;
1788 case REALPART_EXPR:
1789 case IMAGPART_EXPR:
1790 pp_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1791 pp_space (cxx_pp);
1792 dump_expr (TREE_OPERAND (t, 0), flags);
1793 break;
1795 case DEFAULT_ARG:
1796 pp_identifier (cxx_pp, "<unparsed>");
1797 break;
1799 case TRY_CATCH_EXPR:
1800 case WITH_CLEANUP_EXPR:
1801 case CLEANUP_POINT_EXPR:
1802 dump_expr (TREE_OPERAND (t, 0), flags);
1803 break;
1805 case PSEUDO_DTOR_EXPR:
1806 dump_expr (TREE_OPERAND (t, 2), flags);
1807 pp_dot (cxx_pp);
1808 dump_type (TREE_OPERAND (t, 0), flags);
1809 pp_colon_colon (cxx_pp);
1810 pp_complement (cxx_pp);
1811 dump_type (TREE_OPERAND (t, 1), flags);
1812 break;
1814 case TEMPLATE_ID_EXPR:
1815 dump_decl (t, flags);
1816 break;
1818 case STMT_EXPR:
1819 /* We don't yet have a way of dumping statements in a
1820 human-readable format. */
1821 pp_string (cxx_pp, "({...})");
1822 break;
1824 case BIND_EXPR:
1825 pp_left_brace (cxx_pp);
1826 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1827 pp_right_brace (cxx_pp);
1828 break;
1830 case LOOP_EXPR:
1831 pp_string (cxx_pp, "while (1) { ");
1832 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1833 pp_right_brace (cxx_pp);
1834 break;
1836 case EXIT_EXPR:
1837 pp_string (cxx_pp, "if (");
1838 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1839 pp_string (cxx_pp, ") break; ");
1840 break;
1842 case BASELINK:
1843 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
1844 break;
1846 case EMPTY_CLASS_EXPR:
1847 dump_type (TREE_TYPE (t), flags);
1848 pp_left_paren (cxx_pp);
1849 pp_right_paren (cxx_pp);
1850 break;
1852 case NON_DEPENDENT_EXPR:
1853 dump_expr (TREE_OPERAND (t, 0), flags);
1854 break;
1856 /* This list is incomplete, but should suffice for now.
1857 It is very important that `sorry' does not call
1858 `report_error_function'. That could cause an infinite loop. */
1859 default:
1860 pp_unsupported_tree (cxx_pp, t);
1861 /* fall through to ERROR_MARK... */
1862 case ERROR_MARK:
1863 pp_identifier (cxx_pp, "<expression error>");
1864 break;
1868 static void
1869 dump_binary_op (const char *opstring, tree t, int flags)
1871 pp_left_paren (cxx_pp);
1872 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1873 pp_space (cxx_pp);
1874 if (opstring)
1875 pp_identifier (cxx_pp, opstring);
1876 else
1877 pp_identifier (cxx_pp, "<unknown operator>");
1878 pp_space (cxx_pp);
1879 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1880 pp_right_paren (cxx_pp);
1883 static void
1884 dump_unary_op (const char *opstring, tree t, int flags)
1886 if (flags & TFF_EXPR_IN_PARENS)
1887 pp_left_paren (cxx_pp);
1888 pp_identifier (cxx_pp, opstring);
1889 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1890 if (flags & TFF_EXPR_IN_PARENS)
1891 pp_right_paren (cxx_pp);
1894 /* Exported interface to stringifying types, exprs and decls under TFF_*
1895 control. */
1897 const char *
1898 type_as_string (tree typ, int flags)
1900 pp_clear_output_area (cxx_pp);
1901 dump_type (typ, flags);
1902 return pp_formatted_text (cxx_pp);
1905 const char *
1906 expr_as_string (tree decl, int flags)
1908 pp_clear_output_area (cxx_pp);
1909 dump_expr (decl, flags);
1910 return pp_formatted_text (cxx_pp);
1913 const char *
1914 decl_as_string (tree decl, int flags)
1916 pp_clear_output_area (cxx_pp);
1917 dump_decl (decl, flags);
1918 return pp_formatted_text (cxx_pp);
1921 const char *
1922 context_as_string (tree context, int flags)
1924 pp_clear_output_area (cxx_pp);
1925 dump_scope (context, flags);
1926 return pp_formatted_text (cxx_pp);
1929 /* Generate the three forms of printable names for cxx_printable_name. */
1931 const char *
1932 lang_decl_name (tree decl, int v)
1934 if (v >= 2)
1935 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
1937 pp_clear_output_area (cxx_pp);
1938 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
1940 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
1941 pp_colon_colon (cxx_pp);
1944 if (TREE_CODE (decl) == FUNCTION_DECL)
1945 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
1946 else
1947 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
1949 return pp_formatted_text (cxx_pp);
1952 static location_t
1953 location_of (tree t)
1955 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
1956 t = DECL_CONTEXT (t);
1957 else if (TYPE_P (t))
1958 t = TYPE_MAIN_DECL (t);
1959 else if (TREE_CODE (t) == OVERLOAD)
1960 t = OVL_FUNCTION (t);
1962 return DECL_SOURCE_LOCATION (t);
1965 /* Now the interfaces from error et al to dump_type et al. Each takes an
1966 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
1967 function. */
1969 static const char *
1970 decl_to_string (tree decl, int verbose)
1972 int flags = 0;
1974 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
1975 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
1976 flags = TFF_CLASS_KEY_OR_ENUM;
1977 if (verbose)
1978 flags |= TFF_DECL_SPECIFIERS;
1979 else if (TREE_CODE (decl) == FUNCTION_DECL)
1980 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
1981 flags |= TFF_TEMPLATE_HEADER;
1983 pp_clear_output_area (cxx_pp);
1984 dump_decl (decl, flags);
1985 return pp_formatted_text (cxx_pp);
1988 static const char *
1989 expr_to_string (tree decl)
1991 pp_clear_output_area (cxx_pp);
1992 dump_expr (decl, 0);
1993 return pp_formatted_text (cxx_pp);
1996 static const char *
1997 fndecl_to_string (tree fndecl, int verbose)
1999 int flags;
2001 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
2002 if (verbose)
2003 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2004 pp_clear_output_area (cxx_pp);
2005 dump_decl (fndecl, flags);
2006 return pp_formatted_text (cxx_pp);
2010 static const char *
2011 code_to_string (enum tree_code c)
2013 return tree_code_name [c];
2016 const char *
2017 language_to_string (enum languages c)
2019 switch (c)
2021 case lang_c:
2022 return "C";
2024 case lang_cplusplus:
2025 return "C++";
2027 case lang_java:
2028 return "Java";
2030 default:
2031 abort ();
2032 return 0;
2036 /* Return the proper printed version of a parameter to a C++ function. */
2038 static const char *
2039 parm_to_string (int p)
2041 pp_clear_output_area (cxx_pp);
2042 if (p < 0)
2043 pp_string (cxx_pp, "'this'");
2044 else
2045 pp_decimal_int (cxx_pp, p + 1);
2046 return pp_formatted_text (cxx_pp);
2049 static const char *
2050 op_to_string (enum tree_code p)
2052 tree id = operator_name_info[(int) p].identifier;
2053 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2056 static const char *
2057 type_to_string (tree typ, int verbose)
2059 int flags = 0;
2060 if (verbose)
2061 flags |= TFF_CLASS_KEY_OR_ENUM;
2062 flags |= TFF_TEMPLATE_HEADER;
2064 pp_clear_output_area (cxx_pp);
2065 dump_type (typ, flags);
2066 return pp_formatted_text (cxx_pp);
2069 static const char *
2070 assop_to_string (enum tree_code p)
2072 tree id = assignment_operator_name_info[(int) p].identifier;
2073 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2076 static const char *
2077 args_to_string (tree p, int verbose)
2079 int flags = 0;
2080 if (verbose)
2081 flags |= TFF_CLASS_KEY_OR_ENUM;
2083 if (p == NULL_TREE)
2084 return "";
2086 if (TYPE_P (TREE_VALUE (p)))
2087 return type_as_string (p, flags);
2089 pp_clear_output_area (cxx_pp);
2090 for (; p; p = TREE_CHAIN (p))
2092 if (TREE_VALUE (p) == null_node)
2093 pp_identifier (cxx_pp, "NULL");
2094 else
2095 dump_type (error_type (TREE_VALUE (p)), flags);
2096 if (TREE_CHAIN (p))
2097 pp_separate_with_comma (cxx_pp);
2099 return pp_formatted_text (cxx_pp);
2102 static const char *
2103 cv_to_string (tree p, int v)
2105 pp_clear_output_area (cxx_pp);
2106 dump_qualifiers (p, v ? before : none);
2107 return pp_formatted_text (cxx_pp);
2110 /* Langhook for print_error_function. */
2111 void
2112 cxx_print_error_function (diagnostic_context *context, const char *file)
2114 lhd_print_error_function (context, file);
2115 pp_base_set_prefix (context->printer, file);
2116 maybe_print_instantiation_context (context);
2119 static void
2120 cp_diagnostic_starter (diagnostic_context *context,
2121 diagnostic_info *diagnostic)
2123 diagnostic_report_current_module (context);
2124 cp_print_error_function (context, diagnostic);
2125 maybe_print_instantiation_context (context);
2126 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2129 static void
2130 cp_diagnostic_finalizer (diagnostic_context *context,
2131 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2133 pp_base_destroy_prefix (context->printer);
2136 /* Print current function onto BUFFER, in the process of reporting
2137 a diagnostic message. Called from cp_diagnostic_starter. */
2138 static void
2139 cp_print_error_function (diagnostic_context *context,
2140 diagnostic_info *diagnostic)
2142 if (diagnostic_last_function_changed (context))
2144 const char *old_prefix = context->printer->prefix;
2145 char *new_prefix = diagnostic->location.file
2146 ? file_name_as_prefix (diagnostic->location.file)
2147 : NULL;
2149 pp_base_set_prefix (context->printer, new_prefix);
2151 if (current_function_decl == NULL)
2152 pp_base_string (context->printer, "At global scope:");
2153 else
2154 pp_printf (context->printer, "In %s `%s':",
2155 function_category (current_function_decl),
2156 cxx_printable_name (current_function_decl, 2));
2157 pp_base_newline (context->printer);
2159 diagnostic_set_last_function (context);
2160 pp_base_destroy_prefix (context->printer);
2161 context->printer->prefix = old_prefix;
2165 /* Returns a description of FUNCTION using standard terminology. */
2166 static const char *
2167 function_category (tree fn)
2169 if (DECL_FUNCTION_MEMBER_P (fn))
2171 if (DECL_STATIC_FUNCTION_P (fn))
2172 return "static member function";
2173 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2174 return "copy constructor";
2175 else if (DECL_CONSTRUCTOR_P (fn))
2176 return "constructor";
2177 else if (DECL_DESTRUCTOR_P (fn))
2178 return "destructor";
2179 else
2180 return "member function";
2182 else
2183 return "function";
2186 /* Report the full context of a current template instantiation,
2187 onto BUFFER. */
2188 static void
2189 print_instantiation_full_context (diagnostic_context *context)
2191 tree p = current_instantiation ();
2192 location_t location = input_location;
2194 if (p)
2196 if (current_function_decl != TINST_DECL (p)
2197 && current_function_decl != NULL_TREE)
2198 /* We can get here during the processing of some synthesized
2199 method. Then, TINST_DECL (p) will be the function that's causing
2200 the synthesis. */
2202 else
2204 if (current_function_decl == TINST_DECL (p))
2205 /* Avoid redundancy with the the "In function" line. */;
2206 else
2207 pp_verbatim (context->printer,
2208 "%s: In instantiation of `%s':\n", location.file,
2209 decl_as_string (TINST_DECL (p),
2210 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2212 location.line = TINST_LINE (p);
2213 location.file = TINST_FILE (p);
2214 p = TREE_CHAIN (p);
2218 print_instantiation_partial_context (context, p, location);
2221 /* Same as above but less verbose. */
2222 static void
2223 print_instantiation_partial_context (diagnostic_context *context,
2224 tree t, location_t loc)
2226 for (; t; t = TREE_CHAIN (t))
2228 pp_verbatim (context->printer, "%s:%d: instantiated from `%s'\n",
2229 loc.file, loc.line,
2230 decl_as_string (TINST_DECL (t),
2231 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2232 loc.line = TINST_LINE (t);
2233 loc.file = TINST_FILE (t);
2235 pp_verbatim (context->printer, "%s:%d: instantiated from here\n",
2236 loc.file, loc.line);
2239 /* Called from cp_thing to print the template context for an error. */
2240 static void
2241 maybe_print_instantiation_context (diagnostic_context *context)
2243 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2244 return;
2246 record_last_problematic_instantiation ();
2247 print_instantiation_full_context (context);
2250 /* Report the bare minimum context of a template instantiation. */
2251 void
2252 print_instantiation_context (void)
2254 print_instantiation_partial_context
2255 (global_dc, current_instantiation (), input_location);
2256 diagnostic_flush_buffer (global_dc);
2259 /* Called from output_format -- during diagnostic message processing --
2260 to handle C++ specific format specifier with the following meanings:
2261 %A function argument-list.
2262 %C tree code.
2263 %D declaration.
2264 %E expression.
2265 %F function declaration.
2266 %L language as used in extern "lang".
2267 %O binary operator.
2268 %P function parameter whose position is indicated by an integer.
2269 %Q assignment operator.
2270 %T type.
2271 %V cv-qualifier. */
2272 static bool
2273 cp_printer (pretty_printer *pp, text_info *text)
2275 int verbose = 0;
2276 const char *result;
2277 #define next_tree va_arg (*text->args_ptr, tree)
2278 #define next_tcode va_arg (*text->args_ptr, enum tree_code)
2279 #define next_lang va_arg (*text->args_ptr, enum languages)
2280 #define next_int va_arg (*text->args_ptr, int)
2282 if (*text->format_spec == '+')
2283 ++text->format_spec;
2284 if (*text->format_spec == '#')
2286 verbose = 1;
2287 ++text->format_spec;
2290 switch (*text->format_spec)
2292 case 'A': result = args_to_string (next_tree, verbose); break;
2293 case 'C': result = code_to_string (next_tcode); break;
2294 case 'D': result = decl_to_string (next_tree, verbose); break;
2295 case 'E': result = expr_to_string (next_tree); break;
2296 case 'F': result = fndecl_to_string (next_tree, verbose); break;
2297 case 'L': result = language_to_string (next_lang); break;
2298 case 'O': result = op_to_string (next_tcode); break;
2299 case 'P': result = parm_to_string (next_int); break;
2300 case 'Q': result = assop_to_string (next_tcode); break;
2301 case 'T': result = type_to_string (next_tree, verbose); break;
2302 case 'V': result = cv_to_string (next_tree, verbose); break;
2304 default:
2305 return false;
2308 pp_base_string (pp, result);
2309 return true;
2310 #undef next_tree
2311 #undef next_tcode
2312 #undef next_lang
2313 #undef next_int
2316 static void
2317 pp_non_consecutive_character (cxx_pretty_printer *pp, int c)
2319 const char *p = pp_last_position_in_text (pp);
2321 if (p != NULL && *p == c)
2322 pp_space (pp);
2323 pp_character (pp, c);
2326 /* These are temporary wrapper functions which handle the historic
2327 behavior of cp_*_at. */
2329 static tree
2330 locate_error (const char *msgid, va_list ap)
2332 tree here = 0, t;
2333 int plus = 0;
2334 const char *f;
2336 for (f = msgid; *f; f++)
2338 plus = 0;
2339 if (*f == '%')
2341 f++;
2342 if (*f == '+')
2343 f++, plus = 1;
2344 if (*f == '#')
2345 f++;
2347 switch (*f)
2349 /* Just ignore these possibilities. */
2350 case '%': break;
2351 case 'P':
2352 case 'd': (void) va_arg (ap, int); break;
2353 case 's': (void) va_arg (ap, char *); break;
2354 case 'L': (void) va_arg (ap, enum languages); break;
2355 case 'C':
2356 case 'O':
2357 case 'Q': (void) va_arg (ap, enum tree_code); break;
2359 /* These take a tree, which may be where the error is
2360 located. */
2361 case 'A':
2362 case 'D':
2363 case 'E':
2364 case 'F':
2365 case 'T':
2366 case 'V':
2367 t = va_arg (ap, tree);
2368 if (!here || plus)
2369 here = t;
2370 break;
2372 default:
2373 errorcount = 0; /* damn ICE suppression */
2374 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2379 if (here == 0)
2380 here = va_arg (ap, tree);
2382 return here;
2386 void
2387 cp_error_at (const char *msgid, ...)
2389 tree here;
2390 diagnostic_info diagnostic;
2391 va_list ap;
2393 va_start (ap, msgid);
2394 here = locate_error (msgid, ap);
2395 va_end (ap);
2397 va_start (ap, msgid);
2398 diagnostic_set_info (&diagnostic, msgid, &ap,
2399 location_of (here), DK_ERROR);
2400 report_diagnostic (&diagnostic);
2401 va_end (ap);
2404 void
2405 cp_warning_at (const char *msgid, ...)
2407 tree here;
2408 diagnostic_info diagnostic;
2409 va_list ap;
2411 va_start (ap, msgid);
2412 here = locate_error (msgid, ap);
2413 va_end (ap);
2415 va_start (ap, msgid);
2416 diagnostic_set_info (&diagnostic, msgid, &ap,
2417 location_of (here), DK_WARNING);
2418 report_diagnostic (&diagnostic);
2419 va_end (ap);
2422 void
2423 cp_pedwarn_at (const char *msgid, ...)
2425 tree here;
2426 diagnostic_info diagnostic;
2427 va_list ap;
2429 va_start (ap, msgid);
2430 here = locate_error (msgid, ap);
2431 va_end (ap);
2433 va_start (ap, msgid);
2434 diagnostic_set_info (&diagnostic, msgid, &ap,
2435 location_of (here), pedantic_error_kind());
2436 report_diagnostic (&diagnostic);
2437 va_end (ap);