OSDN Git Service

8e39ccadd1e0603c287b217f7b1511be4d53e569
[pf3gnuchains/gcc-fork.git] / gcc / cp / error.c
1 /* Call-backs for C++ error reporting.
2    This code is non-reentrant.
3    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002,
4    2003, 2004, 2005 Free Software Foundation, Inc.
5    This file is part of GCC.
6
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.
11
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.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.  */
21
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"
34
35 #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
36
37 /* The global buffer where we dump everything.  It is there only for
38    transitional purpose.  It is expected, in the near future, to be
39    completely removed.  */
40 static cxx_pretty_printer scratch_pretty_printer;
41 #define cxx_pp (&scratch_pretty_printer)
42
43 # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T)))
44
45 static const char *args_to_string (tree, int);
46 static const char *assop_to_string (enum tree_code);
47 static const char *code_to_string (enum tree_code);
48 static const char *cv_to_string (tree, int);
49 static const char *decl_to_string (tree, int);
50 static const char *expr_to_string (tree);
51 static const char *fndecl_to_string (tree, int);
52 static const char *op_to_string (enum tree_code);
53 static const char *parm_to_string (int);
54 static const char *type_to_string (tree, int);
55
56 static void dump_type (tree, int);
57 static void dump_typename (tree, int);
58 static void dump_simple_decl (tree, tree, int);
59 static void dump_decl (tree, int);
60 static void dump_template_decl (tree, int);
61 static void dump_function_decl (tree, int);
62 static void dump_expr (tree, int);
63 static void dump_unary_op (const char *, tree, int);
64 static void dump_binary_op (const char *, tree, int);
65 static void dump_aggr_type (tree, int);
66 static void dump_type_prefix (tree, int);
67 static void dump_type_suffix (tree, int);
68 static void dump_function_name (tree, int);
69 static void dump_expr_list (tree, int);
70 static void dump_global_iord (tree);
71 static void dump_parameters (tree, int);
72 static void dump_exception_spec (tree, int);
73 static void dump_template_argument (tree, int);
74 static void dump_template_argument_list (tree, int);
75 static void dump_template_parameter (tree, int);
76 static void dump_template_bindings (tree, tree);
77 static void dump_scope (tree, int);
78 static void dump_template_parms (tree, int, int);
79
80 static const char *function_category (tree);
81 static void maybe_print_instantiation_context (diagnostic_context *);
82 static void print_instantiation_full_context (diagnostic_context *);
83 static void print_instantiation_partial_context (diagnostic_context *,
84                                                  tree, location_t);
85 static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
86 static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
87 static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
88
89 static bool cp_printer (pretty_printer *, text_info *, const char *,
90                         int, bool, bool, bool);
91 static location_t location_of (tree);
92
93 void
94 init_error (void)
95 {
96   diagnostic_starter (global_dc) = cp_diagnostic_starter;
97   diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer;
98   diagnostic_format_decoder (global_dc) = cp_printer;
99
100   pp_construct (pp_base (cxx_pp), NULL, 0);
101   pp_cxx_pretty_printer_init (cxx_pp);
102 }
103
104 /* Dump a scope, if deemed necessary.  */
105
106 static void
107 dump_scope (tree scope, int flags)
108 {
109   int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF));
110
111   if (scope == NULL_TREE)
112     return;
113
114   if (TREE_CODE (scope) == NAMESPACE_DECL)
115     {
116       if (scope != global_namespace)
117         {
118           dump_decl (scope, f);
119           pp_cxx_colon_colon (cxx_pp);
120         }
121     }
122   else if (AGGREGATE_TYPE_P (scope))
123     {
124       dump_type (scope, f);
125       pp_cxx_colon_colon (cxx_pp);
126     }
127   else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL)
128     {
129       dump_function_decl (scope, f);
130       pp_cxx_colon_colon (cxx_pp);
131     }
132 }
133
134 /* Dump the template ARGument under control of FLAGS.  */
135
136 static void
137 dump_template_argument (tree arg, int flags)
138 {
139   if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)
140     dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM);
141   else
142     dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM);
143 }
144
145 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
146    of FLAGS.  */
147
148 static void
149 dump_template_argument_list (tree args, int flags)
150 {
151   int n = TREE_VEC_LENGTH (args);
152   int need_comma = 0;
153   int i;
154
155   for (i = 0; i< n; ++i)
156     {
157       if (need_comma)
158         pp_separate_with_comma (cxx_pp);
159       dump_template_argument (TREE_VEC_ELT (args, i), flags);
160       need_comma = 1;
161     }
162 }
163
164 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS.  */
165
166 static void
167 dump_template_parameter (tree parm, int flags)
168 {
169   tree p = TREE_VALUE (parm);
170   tree a = TREE_PURPOSE (parm);
171
172   if (TREE_CODE (p) == TYPE_DECL)
173     {
174       if (flags & TFF_DECL_SPECIFIERS)
175         {
176           pp_cxx_identifier (cxx_pp, "class");
177           if (DECL_NAME (p))
178             pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
179         }
180       else if (DECL_NAME (p))
181         pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
182       else
183         pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
184     }
185   else
186     dump_decl (p, flags | TFF_DECL_SPECIFIERS);
187
188   if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && a != NULL_TREE)
189     {
190       pp_cxx_whitespace (cxx_pp);
191       pp_equal (cxx_pp);
192       pp_cxx_whitespace (cxx_pp);
193       if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
194         dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
195       else
196         dump_expr (a, flags | TFF_EXPR_IN_PARENS);
197     }
198 }
199
200 /* Dump, under control of FLAGS, a template-parameter-list binding.
201    PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
202    TREE_VEC.  */
203
204 static void
205 dump_template_bindings (tree parms, tree args)
206 {
207   int need_comma = 0;
208
209   while (parms)
210     {
211       tree p = TREE_VALUE (parms);
212       int lvl = TMPL_PARMS_DEPTH (parms);
213       int arg_idx = 0;
214       int i;
215
216       for (i = 0; i < TREE_VEC_LENGTH (p); ++i)
217         {
218           tree arg = NULL_TREE;
219
220           /* Don't crash if we had an invalid argument list.  */
221           if (TMPL_ARGS_DEPTH (args) >= lvl)
222             {
223               tree lvl_args = TMPL_ARGS_LEVEL (args, lvl);
224               if (NUM_TMPL_ARGS (lvl_args) > arg_idx)
225                 arg = TREE_VEC_ELT (lvl_args, arg_idx);
226             }
227
228           if (need_comma)
229             pp_separate_with_comma (cxx_pp);
230           dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
231           pp_cxx_whitespace (cxx_pp);
232           pp_equal (cxx_pp);
233           pp_cxx_whitespace (cxx_pp);
234           if (arg)
235             dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
236           else
237             pp_identifier (cxx_pp, "<missing>");
238
239           ++arg_idx;
240           need_comma = 1;
241         }
242
243       parms = TREE_CHAIN (parms);
244     }
245 }
246
247 /* Dump a human-readable equivalent of TYPE.  FLAGS controls the
248    format.  */
249
250 static void
251 dump_type (tree t, int flags)
252 {
253   if (t == NULL_TREE)
254     return;
255
256   if (TYPE_PTRMEMFUNC_P (t))
257     goto offset_type;
258
259   switch (TREE_CODE (t))
260     {
261     case UNKNOWN_TYPE:
262       pp_identifier (cxx_pp, "<unresolved overloaded function type>");
263       break;
264
265     case TREE_LIST:
266       /* A list of function parms.  */
267       dump_parameters (t, flags);
268       break;
269
270     case IDENTIFIER_NODE:
271       pp_cxx_tree_identifier (cxx_pp, t);
272       break;
273
274     case TREE_BINFO:
275       dump_type (BINFO_TYPE (t), flags);
276       break;
277
278     case RECORD_TYPE:
279     case UNION_TYPE:
280     case ENUMERAL_TYPE:
281       dump_aggr_type (t, flags);
282       break;
283
284     case TYPE_DECL:
285       if (flags & TFF_CHASE_TYPEDEF)
286         {
287           dump_type (DECL_ORIGINAL_TYPE (t)
288                      ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
289           break;
290         }
291       /* Else fall through.  */
292
293     case TEMPLATE_DECL:
294     case NAMESPACE_DECL:
295       dump_decl (t, flags & ~TFF_DECL_SPECIFIERS);
296       break;
297
298     case INTEGER_TYPE:
299     case REAL_TYPE:
300     case VOID_TYPE:
301     case BOOLEAN_TYPE:
302     case COMPLEX_TYPE:
303     case VECTOR_TYPE:
304       pp_type_specifier_seq (cxx_pp, t);
305       break;
306
307     case TEMPLATE_TEMPLATE_PARM:
308       /* For parameters inside template signature.  */
309       if (TYPE_IDENTIFIER (t))
310         pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
311       else
312         pp_cxx_canonical_template_parameter (cxx_pp, t);
313       break;
314
315     case BOUND_TEMPLATE_TEMPLATE_PARM:
316       {
317         tree args = TYPE_TI_ARGS (t);
318         pp_cxx_cv_qualifier_seq (cxx_pp, t);
319         pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
320         pp_cxx_begin_template_argument_list (cxx_pp);
321         dump_template_argument_list (args, flags);
322         pp_cxx_end_template_argument_list (cxx_pp);
323       }
324       break;
325
326     case TEMPLATE_TYPE_PARM:
327       pp_cxx_cv_qualifier_seq (cxx_pp, t);
328       if (TYPE_IDENTIFIER (t))
329         pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
330       else
331         pp_cxx_canonical_template_parameter
332           (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
333       break;
334
335       /* This is not always necessary for pointers and such, but doing this
336          reduces code size.  */
337     case ARRAY_TYPE:
338     case POINTER_TYPE:
339     case REFERENCE_TYPE:
340     case OFFSET_TYPE:
341     offset_type:
342     case FUNCTION_TYPE:
343     case METHOD_TYPE:
344     {
345       dump_type_prefix (t, flags);
346       dump_type_suffix (t, flags);
347       break;
348     }
349     case TYPENAME_TYPE:
350       pp_cxx_cv_qualifier_seq (cxx_pp, t);
351       pp_cxx_identifier (cxx_pp,
352                          TYPENAME_IS_ENUM_P (t) ? "enum"
353                          : TYPENAME_IS_CLASS_P (t) ? "class"
354                          : "typename");
355       dump_typename (t, flags);
356       break;
357
358     case UNBOUND_CLASS_TEMPLATE:
359       dump_type (TYPE_CONTEXT (t), flags);
360       pp_cxx_colon_colon (cxx_pp);
361       pp_cxx_identifier (cxx_pp, "template");
362       dump_type (DECL_NAME (TYPE_NAME (t)), flags);
363       break;
364
365     case TYPEOF_TYPE:
366       pp_cxx_identifier (cxx_pp, "__typeof__");
367       pp_cxx_whitespace (cxx_pp);
368       pp_cxx_left_paren (cxx_pp);
369       dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
370       pp_cxx_right_paren (cxx_pp);
371       break;
372
373     default:
374       pp_unsupported_tree (cxx_pp, t);
375       /* Fall through to error.  */
376
377     case ERROR_MARK:
378       pp_identifier (cxx_pp, "<type error>");
379       break;
380     }
381 }
382
383 /* Dump a TYPENAME_TYPE. We need to notice when the context is itself
384    a TYPENAME_TYPE.  */
385
386 static void
387 dump_typename (tree t, int flags)
388 {
389   tree ctx = TYPE_CONTEXT (t);
390
391   if (TREE_CODE (ctx) == TYPENAME_TYPE)
392     dump_typename (ctx, flags);
393   else
394     dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM);
395   pp_cxx_colon_colon (cxx_pp);
396   dump_decl (TYPENAME_TYPE_FULLNAME (t), flags);
397 }
398
399 /* Return the name of the supplied aggregate, or enumeral type.  */
400
401 const char *
402 class_key_or_enum_as_string (tree t)
403 {
404   if (TREE_CODE (t) == ENUMERAL_TYPE)
405     return "enum";
406   else if (TREE_CODE (t) == UNION_TYPE)
407     return "union";
408   else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t))
409     return "class";
410   else
411     return "struct";
412 }
413
414 /* Print out a class declaration T under the control of FLAGS,
415    in the form `class foo'.  */
416
417 static void
418 dump_aggr_type (tree t, int flags)
419 {
420   tree name;
421   const char *variety = class_key_or_enum_as_string (t);
422   int typdef = 0;
423   int tmplate = 0;
424
425   pp_cxx_cv_qualifier_seq (cxx_pp, t);
426
427   if (flags & TFF_CLASS_KEY_OR_ENUM)
428     pp_cxx_identifier (cxx_pp, variety);
429
430   if (flags & TFF_CHASE_TYPEDEF)
431     t = TYPE_MAIN_VARIANT (t);
432
433   name = TYPE_NAME (t);
434
435   if (name)
436     {
437       typdef = !DECL_ARTIFICIAL (name);
438       tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
439                 && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
440                 && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
441                     || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
442       dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
443       if (tmplate)
444         {
445           /* Because the template names are mangled, we have to locate
446              the most general template, and use that name.  */
447           tree tpl = CLASSTYPE_TI_TEMPLATE (t);
448
449           while (DECL_TEMPLATE_INFO (tpl))
450             tpl = DECL_TI_TEMPLATE (tpl);
451           name = tpl;
452         }
453       name = DECL_NAME (name);
454     }
455
456   if (name == 0 || ANON_AGGRNAME_P (name))
457     {
458       if (flags & TFF_CLASS_KEY_OR_ENUM)
459         pp_identifier (cxx_pp, "<anonymous>");
460       else
461         pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
462     }
463   else
464     pp_cxx_tree_identifier (cxx_pp, name);
465   if (tmplate)
466     dump_template_parms (TYPE_TEMPLATE_INFO (t),
467                          !CLASSTYPE_USE_TEMPLATE (t),
468                          flags & ~TFF_TEMPLATE_HEADER);
469 }
470
471 /* Dump into the obstack the initial part of the output for a given type.
472    This is necessary when dealing with things like functions returning
473    functions.  Examples:
474
475    return type of `int (* fee ())()': pointer -> function -> int.  Both
476    pointer (and reference and offset) and function (and member) types must
477    deal with prefix and suffix.
478
479    Arrays must also do this for DECL nodes, like int a[], and for things like
480    int *[]&.  */
481
482 static void
483 dump_type_prefix (tree t, int flags)
484 {
485   if (TYPE_PTRMEMFUNC_P (t))
486     {
487       t = TYPE_PTRMEMFUNC_FN_TYPE (t);
488       goto offset_type;
489     }
490
491   switch (TREE_CODE (t))
492     {
493     case POINTER_TYPE:
494     case REFERENCE_TYPE:
495       {
496         tree sub = TREE_TYPE (t);
497
498         dump_type_prefix (sub, flags);
499         if (TREE_CODE (sub) == ARRAY_TYPE)
500           {
501             pp_cxx_whitespace (cxx_pp);
502             pp_cxx_left_paren (cxx_pp);
503           }
504         pp_character (cxx_pp, "&*"[TREE_CODE (t) == POINTER_TYPE]);
505         pp_base (cxx_pp)->padding = pp_before;
506         pp_cxx_cv_qualifier_seq (cxx_pp, t);
507       }
508       break;
509
510     case OFFSET_TYPE:
511     offset_type:
512       dump_type_prefix (TREE_TYPE (t), flags);
513       if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
514         {
515           pp_maybe_space (cxx_pp);
516           if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
517              pp_cxx_left_paren (cxx_pp);
518           dump_type (TYPE_OFFSET_BASETYPE (t), flags);
519           pp_cxx_colon_colon (cxx_pp);
520         }
521       pp_cxx_star (cxx_pp);
522       pp_cxx_cv_qualifier_seq (cxx_pp, t);
523       pp_base (cxx_pp)->padding = pp_before;
524       break;
525
526       /* Can only be reached through function pointer -- this would not be
527          correct if FUNCTION_DECLs used it.  */
528     case FUNCTION_TYPE:
529       dump_type_prefix (TREE_TYPE (t), flags);
530       pp_maybe_space (cxx_pp);
531       pp_cxx_left_paren (cxx_pp);
532       break;
533
534     case METHOD_TYPE:
535       dump_type_prefix (TREE_TYPE (t), flags);
536       pp_maybe_space (cxx_pp);
537       pp_cxx_left_paren (cxx_pp);
538       dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags);
539       pp_cxx_colon_colon (cxx_pp);
540       break;
541
542     case ARRAY_TYPE:
543       dump_type_prefix (TREE_TYPE (t), flags);
544       break;
545
546     case ENUMERAL_TYPE:
547     case IDENTIFIER_NODE:
548     case INTEGER_TYPE:
549     case BOOLEAN_TYPE:
550     case REAL_TYPE:
551     case RECORD_TYPE:
552     case TEMPLATE_TYPE_PARM:
553     case TEMPLATE_TEMPLATE_PARM:
554     case BOUND_TEMPLATE_TEMPLATE_PARM:
555     case TREE_LIST:
556     case TYPE_DECL:
557     case TREE_VEC:
558     case UNION_TYPE:
559     case UNKNOWN_TYPE:
560     case VOID_TYPE:
561     case TYPENAME_TYPE:
562     case COMPLEX_TYPE:
563     case VECTOR_TYPE:
564     case TYPEOF_TYPE:
565       dump_type (t, flags);
566       pp_base (cxx_pp)->padding = pp_before;
567       break;
568
569     default:
570       pp_unsupported_tree (cxx_pp, t);
571       /* fall through.  */
572     case ERROR_MARK:
573       pp_identifier (cxx_pp, "<typeprefixerror>");
574       break;
575     }
576 }
577
578 /* Dump the suffix of type T, under control of FLAGS.  This is the part
579    which appears after the identifier (or function parms).  */
580
581 static void
582 dump_type_suffix (tree t, int flags)
583 {
584   if (TYPE_PTRMEMFUNC_P (t))
585     t = TYPE_PTRMEMFUNC_FN_TYPE (t);
586
587   switch (TREE_CODE (t))
588     {
589     case POINTER_TYPE:
590     case REFERENCE_TYPE:
591     case OFFSET_TYPE:
592       if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
593         pp_cxx_right_paren (cxx_pp);
594       dump_type_suffix (TREE_TYPE (t), flags);
595       break;
596
597       /* Can only be reached through function pointer.  */
598     case FUNCTION_TYPE:
599     case METHOD_TYPE:
600       {
601         tree arg;
602         pp_cxx_right_paren (cxx_pp);
603         arg = TYPE_ARG_TYPES (t);
604         if (TREE_CODE (t) == METHOD_TYPE)
605           arg = TREE_CHAIN (arg);
606
607         /* Function pointers don't have default args.  Not in standard C++,
608            anyway; they may in g++, but we'll just pretend otherwise.  */
609         dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
610
611         if (TREE_CODE (t) == METHOD_TYPE)
612           pp_cxx_cv_qualifier_seq
613             (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
614         else
615           pp_cxx_cv_qualifier_seq(cxx_pp, t);
616         dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
617         dump_type_suffix (TREE_TYPE (t), flags);
618         break;
619       }
620
621     case ARRAY_TYPE:
622       pp_maybe_space (cxx_pp);
623       pp_cxx_left_bracket (cxx_pp);
624       if (TYPE_DOMAIN (t))
625         {
626           if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
627             pp_wide_integer
628               (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
629           else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
630             dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
631                        flags & ~TFF_EXPR_IN_PARENS);
632           else
633             dump_expr (fold (cp_build_binary_op
634                              (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
635                               integer_one_node)),
636                        flags & ~TFF_EXPR_IN_PARENS);
637         }
638       pp_cxx_right_bracket (cxx_pp);
639       dump_type_suffix (TREE_TYPE (t), flags);
640       break;
641
642     case ENUMERAL_TYPE:
643     case IDENTIFIER_NODE:
644     case INTEGER_TYPE:
645     case BOOLEAN_TYPE:
646     case REAL_TYPE:
647     case RECORD_TYPE:
648     case TEMPLATE_TYPE_PARM:
649     case TEMPLATE_TEMPLATE_PARM:
650     case BOUND_TEMPLATE_TEMPLATE_PARM:
651     case TREE_LIST:
652     case TYPE_DECL:
653     case TREE_VEC:
654     case UNION_TYPE:
655     case UNKNOWN_TYPE:
656     case VOID_TYPE:
657     case TYPENAME_TYPE:
658     case COMPLEX_TYPE:
659     case VECTOR_TYPE:
660     case TYPEOF_TYPE:
661       break;
662
663     default:
664       pp_unsupported_tree (cxx_pp, t);
665     case ERROR_MARK:
666       /* Don't mark it here, we should have already done in
667          dump_type_prefix.  */
668       break;
669     }
670 }
671
672 static void
673 dump_global_iord (tree t)
674 {
675   const char *p = NULL;
676
677   if (DECL_GLOBAL_CTOR_P (t))
678     p = "initializers";
679   else if (DECL_GLOBAL_DTOR_P (t))
680     p = "destructors";
681   else
682     gcc_unreachable ();
683
684   pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename);
685 }
686
687 static void
688 dump_simple_decl (tree t, tree type, int flags)
689 {
690   if (flags & TFF_DECL_SPECIFIERS)
691     {
692       dump_type_prefix (type, flags);
693       pp_maybe_space (cxx_pp);
694     }
695   if (!DECL_INITIAL (t) || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)
696     dump_scope (CP_DECL_CONTEXT (t), flags);
697   if (DECL_NAME (t))
698     dump_decl (DECL_NAME (t), flags);
699   else
700     pp_identifier (cxx_pp, "<anonymous>");
701   if (flags & TFF_DECL_SPECIFIERS)
702     dump_type_suffix (type, flags);
703 }
704
705 /* Dump a human readable string for the decl T under control of FLAGS.  */
706
707 static void
708 dump_decl (tree t, int flags)
709 {
710   if (t == NULL_TREE)
711     return;
712
713   switch (TREE_CODE (t))
714     {
715     case TYPE_DECL:
716       /* Don't say 'typedef class A' */
717       if (DECL_ARTIFICIAL (t))
718         {
719           if ((flags & TFF_DECL_SPECIFIERS)
720               && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
721             /* Say `class T' not just `T'.  */
722             pp_cxx_identifier (cxx_pp, "class");
723
724           dump_type (TREE_TYPE (t), flags);
725           break;
726         }
727       if (flags & TFF_DECL_SPECIFIERS)
728         pp_cxx_identifier (cxx_pp, "typedef");
729       dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
730                         ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
731                         flags);
732       break;
733
734     case VAR_DECL:
735       if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t)))
736         {
737           pp_string (cxx_pp, "vtable for ");
738           gcc_assert (TYPE_P (DECL_CONTEXT (t)));
739           dump_type (DECL_CONTEXT (t), flags);
740           break;
741         }
742       /* Else fall through.  */
743     case FIELD_DECL:
744     case PARM_DECL:
745       dump_simple_decl (t, TREE_TYPE (t), flags);
746       break;
747
748     case RESULT_DECL:
749       pp_string (cxx_pp, "<return value> ");
750       dump_simple_decl (t, TREE_TYPE (t), flags);
751       break;
752
753     case NAMESPACE_DECL:
754       if (flags & TFF_DECL_SPECIFIERS)
755         pp_cxx_declaration (cxx_pp, t);
756       else
757         {
758           dump_scope (CP_DECL_CONTEXT (t), flags);
759           if (DECL_NAME (t) == NULL_TREE)
760             pp_identifier (cxx_pp, "<unnamed>");
761           else
762             pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
763         }
764       break;
765
766     case SCOPE_REF:
767       pp_expression (cxx_pp, t);
768       break;
769
770     case ARRAY_REF:
771       dump_decl (TREE_OPERAND (t, 0), flags);
772       pp_cxx_left_bracket (cxx_pp);
773       dump_decl (TREE_OPERAND (t, 1), flags);
774       pp_cxx_right_bracket (cxx_pp);
775       break;
776
777       /* So that we can do dump_decl on an aggr type.  */
778     case RECORD_TYPE:
779     case UNION_TYPE:
780     case ENUMERAL_TYPE:
781       dump_type (t, flags);
782       break;
783
784     case BIT_NOT_EXPR:
785       /* This is a pseudo destructor call which has not been folded into
786          a PSEUDO_DTOR_EXPR yet.  */
787       pp_cxx_complement (cxx_pp);
788       dump_type (TREE_OPERAND (t, 0), flags);
789       break;
790
791     case TYPE_EXPR:
792       gcc_unreachable ();
793       break;
794
795       /* These special cases are duplicated here so that other functions
796          can feed identifiers to error and get them demangled properly.  */
797     case IDENTIFIER_NODE:
798       if (IDENTIFIER_TYPENAME_P (t))
799         {
800           pp_cxx_identifier (cxx_pp, "operator");
801           /* Not exactly IDENTIFIER_TYPE_VALUE.  */
802           dump_type (TREE_TYPE (t), flags);
803           break;
804         }
805       else
806         pp_cxx_tree_identifier (cxx_pp, t);
807       break;
808
809     case OVERLOAD:
810       if (OVL_CHAIN (t))
811         {
812           t = OVL_CURRENT (t);
813           if (DECL_CLASS_SCOPE_P (t))
814             {
815               dump_type (DECL_CONTEXT (t), flags);
816               pp_cxx_colon_colon (cxx_pp);
817             }
818           else if (DECL_CONTEXT (t))
819             {
820               dump_decl (DECL_CONTEXT (t), flags);
821               pp_cxx_colon_colon (cxx_pp);
822             }
823           dump_decl (DECL_NAME (t), flags);
824           break;
825         }
826
827       /* If there's only one function, just treat it like an ordinary
828          FUNCTION_DECL.  */
829       t = OVL_CURRENT (t);
830       /* Fall through.  */
831
832     case FUNCTION_DECL:
833       if (! DECL_LANG_SPECIFIC (t))
834         pp_identifier (cxx_pp, "<built-in>");
835       else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
836         dump_global_iord (t);
837       else
838         dump_function_decl (t, flags);
839       break;
840
841     case TEMPLATE_DECL:
842       dump_template_decl (t, flags);
843       break;
844
845     case TEMPLATE_ID_EXPR:
846       {
847         tree name = TREE_OPERAND (t, 0);
848
849         if (is_overloaded_fn (name))
850           name = DECL_NAME (get_first_fn (name));
851         dump_decl (name, flags);
852         pp_cxx_begin_template_argument_list (cxx_pp);
853         if (TREE_OPERAND (t, 1))
854           dump_template_argument_list (TREE_OPERAND (t, 1), flags);
855         pp_cxx_end_template_argument_list (cxx_pp);
856       }
857       break;
858
859     case LABEL_DECL:
860       pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
861       break;
862
863     case CONST_DECL:
864       if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE)
865           || (DECL_INITIAL (t) &&
866               TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX))
867         dump_simple_decl (t, TREE_TYPE (t), flags);
868       else if (DECL_NAME (t))
869         dump_decl (DECL_NAME (t), flags);
870       else if (DECL_INITIAL (t))
871         dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS);
872       else
873         pp_identifier (cxx_pp, "<enumerator>");
874       break;
875
876     case USING_DECL:
877       pp_cxx_identifier (cxx_pp, "using");
878       dump_type (USING_DECL_SCOPE (t), flags);
879       pp_cxx_colon_colon (cxx_pp);
880       dump_decl (DECL_NAME (t), flags);
881       break;
882
883     case BASELINK:
884       dump_decl (BASELINK_FUNCTIONS (t), flags);
885       break;
886
887     case NON_DEPENDENT_EXPR:
888       dump_expr (t, flags);
889       break;
890
891     case TEMPLATE_TYPE_PARM:
892       if (flags & TFF_DECL_SPECIFIERS)
893         pp_cxx_declaration (cxx_pp, t);
894       else
895         pp_type_id (cxx_pp, t);
896       break;
897
898     default:
899       pp_unsupported_tree (cxx_pp, t);
900       /* Fall through to error.  */
901
902     case ERROR_MARK:
903       pp_identifier (cxx_pp, "<declaration error>");
904       break;
905     }
906 }
907
908 /* Dump a template declaration T under control of FLAGS. This means the
909    'template <...> leaders plus the 'class X' or 'void fn(...)' part.  */
910
911 static void
912 dump_template_decl (tree t, int flags)
913 {
914   tree orig_parms = DECL_TEMPLATE_PARMS (t);
915   tree parms;
916   int i;
917
918   if (flags & TFF_TEMPLATE_HEADER)
919     {
920       for (parms = orig_parms = nreverse (orig_parms);
921            parms;
922            parms = TREE_CHAIN (parms))
923         {
924           tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
925           int len = TREE_VEC_LENGTH (inner_parms);
926
927           pp_cxx_identifier (cxx_pp, "template");
928           pp_cxx_begin_template_argument_list (cxx_pp);
929
930           /* If we've shown the template prefix, we'd better show the
931              parameters' and decl's type too.  */
932             flags |= TFF_DECL_SPECIFIERS;
933
934           for (i = 0; i < len; i++)
935             {
936               if (i)
937                 pp_separate_with_comma (cxx_pp);
938               dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
939             }
940           pp_cxx_end_template_argument_list (cxx_pp);
941           pp_cxx_whitespace (cxx_pp);
942         }
943       nreverse(orig_parms);
944
945       if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
946         /* Say `template<arg> class TT' not just `template<arg> TT'.  */
947         pp_cxx_identifier (cxx_pp, "class");
948     }
949
950   if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
951     dump_type (TREE_TYPE (t),
952                ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
953                 | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
954   else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
955     dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
956   else
957     {
958       gcc_assert (TREE_TYPE (t));
959       switch (NEXT_CODE (t))
960         {
961         case METHOD_TYPE:
962         case FUNCTION_TYPE:
963           dump_function_decl (t, flags | TFF_TEMPLATE_NAME);
964           break;
965         default:
966           /* This case can occur with some invalid code.  */
967           dump_type (TREE_TYPE (t),
968                      (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
969                      | (flags & TFF_DECL_SPECIFIERS
970                         ? TFF_CLASS_KEY_OR_ENUM : 0));
971         }
972     }
973 }
974
975 /* Pretty print a function decl. There are several ways we want to print a
976    function declaration. The TFF_ bits in FLAGS tells us how to behave.
977    As error can only apply the '#' flag once to give 0 and 1 for V, there
978    is %D which doesn't print the throw specs, and %F which does.  */
979
980 static void
981 dump_function_decl (tree t, int flags)
982 {
983   tree fntype;
984   tree parmtypes;
985   tree cname = NULL_TREE;
986   tree template_args = NULL_TREE;
987   tree template_parms = NULL_TREE;
988   int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
989
990   if (TREE_CODE (t) == TEMPLATE_DECL)
991     t = DECL_TEMPLATE_RESULT (t);
992
993   /* Pretty print template instantiations only.  */
994   if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
995     {
996       tree tmpl;
997
998       template_args = DECL_TI_ARGS (t);
999       tmpl = most_general_template (t);
1000       if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL)
1001         {
1002           template_parms = DECL_TEMPLATE_PARMS (tmpl);
1003           t = tmpl;
1004         }
1005     }
1006
1007   fntype = TREE_TYPE (t);
1008   parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t);
1009
1010   if (DECL_CLASS_SCOPE_P (t))
1011     cname = DECL_CONTEXT (t);
1012   /* This is for partially instantiated template methods.  */
1013   else if (TREE_CODE (fntype) == METHOD_TYPE)
1014     cname = TREE_TYPE (TREE_VALUE (parmtypes));
1015
1016   if (!(flags & TFF_DECL_SPECIFIERS))
1017     /* OK */;
1018   else if (DECL_STATIC_FUNCTION_P (t))
1019     pp_cxx_identifier (cxx_pp, "static");
1020   else if (DECL_VIRTUAL_P (t))
1021     pp_cxx_identifier (cxx_pp, "virtual");
1022
1023   /* Print the return type?  */
1024   if (show_return)
1025     show_return = !DECL_CONV_FN_P (t)  && !DECL_CONSTRUCTOR_P (t)
1026                   && !DECL_DESTRUCTOR_P (t);
1027   if (show_return)
1028     dump_type_prefix (TREE_TYPE (fntype), flags);
1029
1030   /* Print the function name.  */
1031   if (cname)
1032     {
1033       dump_type (cname, flags);
1034       pp_cxx_colon_colon (cxx_pp);
1035     }
1036   else
1037     dump_scope (CP_DECL_CONTEXT (t), flags);
1038
1039   dump_function_name (t, flags);
1040
1041   if (!(flags & TFF_NO_FUNCTION_ARGUMENTS))
1042     {
1043       dump_parameters (parmtypes, flags);
1044
1045       if (TREE_CODE (fntype) == METHOD_TYPE)
1046         {
1047           pp_base (cxx_pp)->padding = pp_before;
1048           pp_cxx_cv_qualifier_seq
1049             (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
1050         }
1051
1052       if (flags & TFF_EXCEPTION_SPECIFICATION)
1053         {
1054           pp_base (cxx_pp)->padding = pp_before;
1055           dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
1056         }
1057
1058       if (show_return)
1059         dump_type_suffix (TREE_TYPE (fntype), flags);
1060     }
1061
1062   /* If T is a template instantiation, dump the parameter binding.  */
1063   if (template_parms != NULL_TREE && template_args != NULL_TREE)
1064     {
1065       pp_cxx_whitespace (cxx_pp);
1066       pp_cxx_left_bracket (cxx_pp);
1067       pp_cxx_identifier (cxx_pp, "with");
1068       pp_cxx_whitespace (cxx_pp);
1069       dump_template_bindings (template_parms, template_args);
1070       pp_cxx_right_bracket (cxx_pp);
1071     }
1072 }
1073
1074 /* Print a parameter list. If this is for a member function, the
1075    member object ptr (and any other hidden args) should have
1076    already been removed.  */
1077
1078 static void
1079 dump_parameters (tree parmtypes, int flags)
1080 {
1081   int first;
1082
1083   pp_cxx_left_paren (cxx_pp);
1084
1085   for (first = 1; parmtypes != void_list_node;
1086        parmtypes = TREE_CHAIN (parmtypes))
1087     {
1088       if (!first)
1089         pp_separate_with_comma (cxx_pp);
1090       first = 0;
1091       if (!parmtypes)
1092         {
1093           pp_cxx_identifier (cxx_pp, "...");
1094           break;
1095         }
1096       dump_type (TREE_VALUE (parmtypes), flags);
1097
1098       if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
1099         {
1100           pp_cxx_whitespace (cxx_pp);
1101           pp_equal (cxx_pp);
1102           pp_cxx_whitespace (cxx_pp);
1103           dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
1104         }
1105     }
1106
1107   pp_cxx_right_paren (cxx_pp);
1108 }
1109
1110 /* Print an exception specification. T is the exception specification.  */
1111
1112 static void
1113 dump_exception_spec (tree t, int flags)
1114 {
1115   if (t)
1116     {
1117       pp_cxx_identifier (cxx_pp, "throw");
1118       pp_cxx_whitespace (cxx_pp);
1119       pp_cxx_left_paren (cxx_pp);
1120       if (TREE_VALUE (t) != NULL_TREE)
1121         while (1)
1122           {
1123             dump_type (TREE_VALUE (t), flags);
1124             t = TREE_CHAIN (t);
1125             if (!t)
1126               break;
1127             pp_separate_with_comma (cxx_pp);
1128           }
1129       pp_cxx_right_paren (cxx_pp);
1130     }
1131 }
1132
1133 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1134    and destructors properly.  */
1135
1136 static void
1137 dump_function_name (tree t, int flags)
1138 {
1139   tree name = DECL_NAME (t);
1140
1141   /* We can get here with a decl that was synthesized by language-
1142      independent machinery (e.g. coverage.c) in which case it won't
1143      have a lang_specific structure attached and DECL_CONSTRUCTOR_P
1144      will crash.  In this case it is safe just to print out the
1145      literal name.  */
1146   if (!DECL_LANG_SPECIFIC (t))
1147     {
1148       pp_cxx_tree_identifier (cxx_pp, name);
1149       return;
1150     }
1151
1152   if (TREE_CODE (t) == TEMPLATE_DECL)
1153     t = DECL_TEMPLATE_RESULT (t);
1154
1155   /* Don't let the user see __comp_ctor et al.  */
1156   if (DECL_CONSTRUCTOR_P (t)
1157       || DECL_DESTRUCTOR_P (t))
1158     name = constructor_name (DECL_CONTEXT (t));
1159
1160   if (DECL_DESTRUCTOR_P (t))
1161     {
1162       pp_cxx_complement (cxx_pp);
1163       dump_decl (name, TFF_PLAIN_IDENTIFIER);
1164     }
1165   else if (DECL_CONV_FN_P (t))
1166     {
1167       /* This cannot use the hack that the operator's return
1168          type is stashed off of its name because it may be
1169          used for error reporting.  In the case of conflicting
1170          declarations, both will have the same name, yet
1171          the types will be different, hence the TREE_TYPE field
1172          of the first name will be clobbered by the second.  */
1173       pp_cxx_identifier (cxx_pp, "operator");
1174       dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1175     }
1176   else if (IDENTIFIER_OPNAME_P (name))
1177     pp_cxx_tree_identifier (cxx_pp, name);
1178   else
1179     dump_decl (name, flags);
1180
1181   if (DECL_TEMPLATE_INFO (t)
1182       && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)
1183       && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL
1184           || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t))))
1185     dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags);
1186 }
1187
1188 /* Dump the template parameters from the template info INFO under control of
1189    FLAGS. PRIMARY indicates whether this is a primary template decl, or
1190    specialization (partial or complete). For partial specializations we show
1191    the specialized parameter values. For a primary template we show no
1192    decoration.  */
1193
1194 static void
1195 dump_template_parms (tree info, int primary, int flags)
1196 {
1197   tree args = info ? TI_ARGS (info) : NULL_TREE;
1198
1199   if (primary && flags & TFF_TEMPLATE_NAME)
1200     return;
1201   flags &= ~(TFF_CLASS_KEY_OR_ENUM | TFF_TEMPLATE_NAME);
1202   pp_cxx_begin_template_argument_list (cxx_pp);
1203
1204   /* Be careful only to print things when we have them, so as not
1205          to crash producing error messages.  */
1206   if (args && !primary)
1207     {
1208       int len, ix;
1209
1210       if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
1211         args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1212
1213       len = TREE_VEC_LENGTH (args);
1214
1215       for (ix = 0; ix != len; ix++)
1216         {
1217           tree arg = TREE_VEC_ELT (args, ix);
1218
1219           if (ix)
1220             pp_separate_with_comma (cxx_pp);
1221
1222           if (!arg)
1223             pp_identifier (cxx_pp, "<template parameter error>");
1224           else
1225             dump_template_argument (arg, flags);
1226         }
1227     }
1228   else if (primary)
1229     {
1230       tree tpl = TI_TEMPLATE (info);
1231       tree parms = DECL_TEMPLATE_PARMS (tpl);
1232       int len, ix;
1233
1234       parms = TREE_CODE (parms) == TREE_LIST ? TREE_VALUE (parms) : NULL_TREE;
1235       len = parms ? TREE_VEC_LENGTH (parms) : 0;
1236
1237       for (ix = 0; ix != len; ix++)
1238         {
1239           tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
1240
1241           if (ix)
1242             pp_separate_with_comma (cxx_pp);
1243
1244           dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
1245         }
1246     }
1247   pp_cxx_end_template_argument_list (cxx_pp);
1248 }
1249
1250 /* Print out a list of initializers (subr of dump_expr).  */
1251
1252 static void
1253 dump_expr_list (tree l, int flags)
1254 {
1255   while (l)
1256     {
1257       dump_expr (TREE_VALUE (l), flags | TFF_EXPR_IN_PARENS);
1258       l = TREE_CHAIN (l);
1259       if (l)
1260         pp_separate_with_comma (cxx_pp);
1261     }
1262 }
1263
1264 /* Print out a vector of initializers (subr of dump_expr).  */
1265
1266 static void
1267 dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
1268 {
1269   unsigned HOST_WIDE_INT idx;
1270   tree value;
1271
1272   FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1273     {
1274       dump_expr (value, flags | TFF_EXPR_IN_PARENS);
1275       if (idx != VEC_length (constructor_elt, v) - 1)
1276         pp_separate_with_comma (cxx_pp);
1277     }
1278 }
1279
1280
1281 /* Print out an expression E under control of FLAGS.  */
1282
1283 static void
1284 dump_expr (tree t, int flags)
1285 {
1286   if (t == 0)
1287     return;
1288
1289   switch (TREE_CODE (t))
1290     {
1291     case VAR_DECL:
1292     case PARM_DECL:
1293     case FIELD_DECL:
1294     case CONST_DECL:
1295     case FUNCTION_DECL:
1296     case TEMPLATE_DECL:
1297     case NAMESPACE_DECL:
1298     case LABEL_DECL:
1299     case OVERLOAD:
1300     case IDENTIFIER_NODE:
1301       dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1302       break;
1303
1304     case STRING_CST:
1305       if (PAREN_STRING_LITERAL_P (t))
1306         pp_cxx_left_paren (cxx_pp);
1307       pp_c_constant (pp_c_base (cxx_pp), t);
1308       if (PAREN_STRING_LITERAL_P (t))
1309         pp_cxx_right_paren (cxx_pp);
1310       break;
1311
1312     case INTEGER_CST:
1313     case REAL_CST:
1314        pp_c_constant (pp_c_base (cxx_pp), t);
1315       break;
1316
1317     case THROW_EXPR:
1318       pp_cxx_identifier (cxx_pp, "throw");
1319       dump_expr (TREE_OPERAND (t, 0), flags);
1320       break;
1321
1322     case PTRMEM_CST:
1323       pp_ampersand (cxx_pp);
1324       dump_type (PTRMEM_CST_CLASS (t), flags);
1325       pp_cxx_colon_colon (cxx_pp);
1326       pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1327       break;
1328
1329     case COMPOUND_EXPR:
1330       pp_cxx_left_paren (cxx_pp);
1331       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1332       pp_separate_with_comma (cxx_pp);
1333       dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1334       pp_cxx_right_paren (cxx_pp);
1335       break;
1336
1337     case COND_EXPR:
1338       pp_cxx_left_paren (cxx_pp);
1339       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1340       pp_string (cxx_pp, " ? ");
1341       dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1342       pp_string (cxx_pp, " : ");
1343       dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1344       pp_cxx_right_paren (cxx_pp);
1345       break;
1346
1347     case SAVE_EXPR:
1348       if (TREE_HAS_CONSTRUCTOR (t))
1349         {
1350           pp_cxx_identifier (cxx_pp, "new");
1351           pp_cxx_whitespace (cxx_pp);
1352           dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1353         }
1354       else
1355         dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1356       break;
1357
1358     case AGGR_INIT_EXPR:
1359       {
1360         tree fn = NULL_TREE;
1361
1362         if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1363           fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1364
1365         if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1366           {
1367             if (DECL_CONSTRUCTOR_P (fn))
1368               dump_type (DECL_CONTEXT (fn), flags);
1369             else
1370               dump_decl (fn, 0);
1371           }
1372         else
1373           dump_expr (TREE_OPERAND (t, 0), 0);
1374       }
1375       pp_cxx_left_paren (cxx_pp);
1376       if (TREE_OPERAND (t, 1))
1377         dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1378       pp_cxx_right_paren (cxx_pp);
1379       break;
1380
1381     case CALL_EXPR:
1382       {
1383         tree fn = TREE_OPERAND (t, 0);
1384         tree args = TREE_OPERAND (t, 1);
1385
1386         if (TREE_CODE (fn) == ADDR_EXPR)
1387           fn = TREE_OPERAND (fn, 0);
1388
1389         if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1390           {
1391             tree ob = TREE_VALUE (args);
1392             if (TREE_CODE (ob) == ADDR_EXPR)
1393               {
1394                 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1395                 pp_dot (cxx_pp);
1396               }
1397             else if (TREE_CODE (ob) != PARM_DECL
1398                      || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1399               {
1400                 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1401                 pp_arrow (cxx_pp);
1402               }
1403             args = TREE_CHAIN (args);
1404           }
1405         dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1406         pp_cxx_left_paren (cxx_pp);
1407         dump_expr_list (args, flags);
1408         pp_cxx_right_paren (cxx_pp);
1409       }
1410       break;
1411
1412     case NEW_EXPR:
1413       {
1414         tree type = TREE_OPERAND (t, 1);
1415         tree init = TREE_OPERAND (t, 2);
1416         if (NEW_EXPR_USE_GLOBAL (t))
1417           pp_cxx_colon_colon (cxx_pp);
1418         pp_cxx_identifier (cxx_pp, "new");
1419         if (TREE_OPERAND (t, 0))
1420           {
1421             pp_cxx_left_paren (cxx_pp);
1422             dump_expr_list (TREE_OPERAND (t, 0), flags);
1423             pp_cxx_right_paren (cxx_pp);
1424             pp_cxx_whitespace (cxx_pp);
1425           }
1426         if (TREE_CODE (type) == ARRAY_REF)
1427           type = build_cplus_array_type
1428             (TREE_OPERAND (type, 0),
1429              build_index_type (fold_build2 (MINUS_EXPR, integer_type_node,
1430                                             TREE_OPERAND (type, 1),
1431                                             integer_one_node)));
1432         dump_type (type, flags);
1433         if (init)
1434           {
1435             pp_cxx_left_paren (cxx_pp);
1436             if (TREE_CODE (init) == TREE_LIST)
1437               dump_expr_list (init, flags);
1438             else if (init == void_zero_node)
1439               /* This representation indicates an empty initializer,
1440                  e.g.: "new int()".  */
1441               ;
1442             else
1443               dump_expr (init, flags);
1444             pp_cxx_right_paren (cxx_pp);
1445           }
1446       }
1447       break;
1448
1449     case TARGET_EXPR:
1450       /* Note that this only works for G++ target exprs.  If somebody
1451          builds a general TARGET_EXPR, there's no way to represent that
1452          it initializes anything other that the parameter slot for the
1453          default argument.  Note we may have cleared out the first
1454          operand in expand_expr, so don't go killing ourselves.  */
1455       if (TREE_OPERAND (t, 1))
1456         dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1457       break;
1458
1459     case INIT_EXPR:
1460     case MODIFY_EXPR:
1461     case PLUS_EXPR:
1462     case MINUS_EXPR:
1463     case MULT_EXPR:
1464     case TRUNC_DIV_EXPR:
1465     case TRUNC_MOD_EXPR:
1466     case MIN_EXPR:
1467     case MAX_EXPR:
1468     case LSHIFT_EXPR:
1469     case RSHIFT_EXPR:
1470     case BIT_IOR_EXPR:
1471     case BIT_XOR_EXPR:
1472     case BIT_AND_EXPR:
1473     case TRUTH_ANDIF_EXPR:
1474     case TRUTH_ORIF_EXPR:
1475     case LT_EXPR:
1476     case LE_EXPR:
1477     case GT_EXPR:
1478     case GE_EXPR:
1479     case EQ_EXPR:
1480     case NE_EXPR:
1481     case EXACT_DIV_EXPR:
1482       dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1483       break;
1484
1485     case CEIL_DIV_EXPR:
1486     case FLOOR_DIV_EXPR:
1487     case ROUND_DIV_EXPR:
1488     case RDIV_EXPR:
1489       dump_binary_op ("/", t, flags);
1490       break;
1491
1492     case CEIL_MOD_EXPR:
1493     case FLOOR_MOD_EXPR:
1494     case ROUND_MOD_EXPR:
1495       dump_binary_op ("%", t, flags);
1496       break;
1497
1498     case COMPONENT_REF:
1499       {
1500         tree ob = TREE_OPERAND (t, 0);
1501         if (TREE_CODE (ob) == INDIRECT_REF)
1502           {
1503             ob = TREE_OPERAND (ob, 0);
1504             if (TREE_CODE (ob) != PARM_DECL
1505                 || (DECL_NAME (ob)
1506                     && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1507               {
1508                 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1509                 pp_cxx_arrow (cxx_pp);
1510               }
1511           }
1512         else
1513           {
1514             dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1515             pp_cxx_dot (cxx_pp);
1516           }
1517         dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1518       }
1519       break;
1520
1521     case ARRAY_REF:
1522       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1523       pp_cxx_left_bracket (cxx_pp);
1524       dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1525       pp_cxx_right_bracket (cxx_pp);
1526       break;
1527
1528     case UNARY_PLUS_EXPR:
1529       dump_unary_op ("+", t, flags);
1530       break;
1531
1532     case ADDR_EXPR:
1533       if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1534           || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1535           /* An ADDR_EXPR can have reference type.  In that case, we
1536              shouldn't print the `&' doing so indicates to the user
1537              that the expression has pointer type.  */
1538           || (TREE_TYPE (t)
1539               && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1540         dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1541       else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1542         dump_unary_op ("&&", t, flags);
1543       else
1544         dump_unary_op ("&", t, flags);
1545       break;
1546
1547     case INDIRECT_REF:
1548       if (TREE_HAS_CONSTRUCTOR (t))
1549         {
1550           t = TREE_OPERAND (t, 0);
1551           gcc_assert (TREE_CODE (t) == CALL_EXPR);
1552           dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1553           pp_cxx_left_paren (cxx_pp);
1554           dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1555           pp_cxx_right_paren (cxx_pp);
1556         }
1557       else
1558         {
1559           if (TREE_OPERAND (t,0) != NULL_TREE
1560               && TREE_TYPE (TREE_OPERAND (t, 0))
1561               && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1562             dump_expr (TREE_OPERAND (t, 0), flags);
1563           else
1564             dump_unary_op ("*", t, flags);
1565         }
1566       break;
1567
1568     case NEGATE_EXPR:
1569     case BIT_NOT_EXPR:
1570     case TRUTH_NOT_EXPR:
1571     case PREDECREMENT_EXPR:
1572     case PREINCREMENT_EXPR:
1573       dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1574       break;
1575
1576     case POSTDECREMENT_EXPR:
1577     case POSTINCREMENT_EXPR:
1578       pp_cxx_left_paren (cxx_pp);
1579       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1580       pp_cxx_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1581       pp_cxx_right_paren (cxx_pp);
1582       break;
1583
1584     case NON_LVALUE_EXPR:
1585       /* FIXME: This is a KLUDGE workaround for a parsing problem.  There
1586          should be another level of INDIRECT_REF so that I don't have to do
1587          this.  */
1588       if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1589         {
1590           tree next = TREE_TYPE (TREE_TYPE (t));
1591
1592           while (TREE_CODE (next) == POINTER_TYPE)
1593             next = TREE_TYPE (next);
1594
1595           if (TREE_CODE (next) == FUNCTION_TYPE)
1596             {
1597               if (flags & TFF_EXPR_IN_PARENS)
1598                 pp_cxx_left_paren (cxx_pp);
1599               pp_cxx_star (cxx_pp);
1600               dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1601               if (flags & TFF_EXPR_IN_PARENS)
1602                 pp_cxx_right_paren (cxx_pp);
1603               break;
1604             }
1605           /* Else fall through.  */
1606         }
1607       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1608       break;
1609
1610     case NOP_EXPR:
1611     case CONVERT_EXPR:
1612       {
1613         tree op = TREE_OPERAND (t, 0);
1614
1615         if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1616           {
1617             /* It is a cast, but we cannot tell whether it is a
1618                reinterpret or static cast. Use the C style notation.  */
1619             if (flags & TFF_EXPR_IN_PARENS)
1620               pp_cxx_left_paren (cxx_pp);
1621             pp_cxx_left_paren (cxx_pp);
1622             dump_type (TREE_TYPE (t), flags);
1623             pp_cxx_right_paren (cxx_pp);
1624             dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1625             if (flags & TFF_EXPR_IN_PARENS)
1626               pp_cxx_right_paren (cxx_pp);
1627           }
1628         else
1629           dump_expr (op, flags);
1630         break;
1631       }
1632
1633     case CONSTRUCTOR:
1634       if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1635         {
1636           tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1637
1638           if (integer_zerop (idx))
1639             {
1640               /* A NULL pointer-to-member constant.  */
1641               pp_cxx_left_paren (cxx_pp);
1642               pp_cxx_left_paren (cxx_pp);
1643               dump_type (TREE_TYPE (t), flags);
1644               pp_cxx_right_paren (cxx_pp);
1645               pp_character (cxx_pp, '0');
1646               pp_cxx_right_paren (cxx_pp);
1647               break;
1648             }
1649           else if (host_integerp (idx, 0))
1650             {
1651               tree virtuals;
1652               unsigned HOST_WIDE_INT n;
1653
1654               t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1655               t = TYPE_METHOD_BASETYPE (t);
1656               virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1657
1658               n = tree_low_cst (idx, 0);
1659
1660               /* Map vtable index back one, to allow for the null pointer to
1661                  member.  */
1662               --n;
1663
1664               while (n > 0 && virtuals)
1665                 {
1666                   --n;
1667                   virtuals = TREE_CHAIN (virtuals);
1668                 }
1669               if (virtuals)
1670                 {
1671                   dump_expr (BV_FN (virtuals),
1672                              flags | TFF_EXPR_IN_PARENS);
1673                   break;
1674                 }
1675             }
1676         }
1677       if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
1678         {
1679           dump_type (TREE_TYPE (t), 0);
1680           pp_cxx_left_paren (cxx_pp);
1681           pp_cxx_right_paren (cxx_pp);
1682         }
1683       else
1684         {
1685           pp_cxx_left_brace (cxx_pp);
1686           dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
1687           pp_cxx_right_brace (cxx_pp);
1688         }
1689
1690       break;
1691
1692     case OFFSET_REF:
1693       {
1694         tree ob = TREE_OPERAND (t, 0);
1695         if (is_dummy_object (ob))
1696           {
1697             t = TREE_OPERAND (t, 1);
1698             if (TREE_CODE (t) == FUNCTION_DECL)
1699               /* A::f */
1700               dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1701             else if (BASELINK_P (t))
1702               dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1703                          flags | TFF_EXPR_IN_PARENS);
1704             else
1705               dump_decl (t, flags);
1706           }
1707         else
1708           {
1709             if (TREE_CODE (ob) == INDIRECT_REF)
1710               {
1711                 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1712                 pp_cxx_arrow (cxx_pp);
1713                 pp_cxx_star (cxx_pp);
1714               }
1715             else
1716               {
1717                 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1718                 pp_cxx_dot (cxx_pp);
1719                 pp_cxx_star (cxx_pp);
1720               }
1721             dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1722           }
1723         break;
1724       }
1725
1726     case TEMPLATE_PARM_INDEX:
1727       dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1728       break;
1729
1730     case SCOPE_REF:
1731       pp_expression (cxx_pp, t);
1732       break;
1733
1734     case CAST_EXPR:
1735       if (TREE_OPERAND (t, 0) == NULL_TREE
1736           || TREE_CHAIN (TREE_OPERAND (t, 0)))
1737         {
1738           dump_type (TREE_TYPE (t), flags);
1739           pp_cxx_left_paren (cxx_pp);
1740           dump_expr_list (TREE_OPERAND (t, 0), flags);
1741           pp_cxx_right_paren (cxx_pp);
1742         }
1743       else
1744         {
1745           pp_cxx_left_paren (cxx_pp);
1746           dump_type (TREE_TYPE (t), flags);
1747           pp_cxx_right_paren (cxx_pp);
1748           pp_cxx_left_paren (cxx_pp);
1749           dump_expr_list (TREE_OPERAND (t, 0), flags);
1750           pp_cxx_right_paren (cxx_pp);
1751         }
1752       break;
1753
1754     case STATIC_CAST_EXPR:
1755       pp_cxx_identifier (cxx_pp, "static_cast");
1756       goto cast;
1757     case REINTERPRET_CAST_EXPR:
1758       pp_cxx_identifier (cxx_pp, "reinterpret_cast");
1759       goto cast;
1760     case CONST_CAST_EXPR:
1761       pp_cxx_identifier (cxx_pp, "const_cast");
1762       goto cast;
1763     case DYNAMIC_CAST_EXPR:
1764       pp_cxx_identifier (cxx_pp, "dynamic_cast");
1765     cast:
1766       pp_cxx_begin_template_argument_list (cxx_pp);
1767       dump_type (TREE_TYPE (t), flags);
1768       pp_cxx_end_template_argument_list (cxx_pp);
1769       pp_cxx_left_paren (cxx_pp);
1770       dump_expr (TREE_OPERAND (t, 0), flags);
1771       pp_cxx_right_paren (cxx_pp);
1772       break;
1773
1774     case ARROW_EXPR:
1775       dump_expr (TREE_OPERAND (t, 0), flags);
1776       pp_cxx_arrow (cxx_pp);
1777       break;
1778
1779     case SIZEOF_EXPR:
1780     case ALIGNOF_EXPR:
1781       if (TREE_CODE (t) == SIZEOF_EXPR)
1782         pp_cxx_identifier (cxx_pp, "sizeof");
1783       else
1784         {
1785           gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
1786           pp_cxx_identifier (cxx_pp, "__alignof__");
1787         }
1788       pp_cxx_whitespace (cxx_pp);
1789       pp_cxx_left_paren (cxx_pp);
1790       if (TYPE_P (TREE_OPERAND (t, 0)))
1791         dump_type (TREE_OPERAND (t, 0), flags);
1792       else
1793         dump_expr (TREE_OPERAND (t, 0), flags);
1794       pp_cxx_right_paren (cxx_pp);
1795       break;
1796
1797     case REALPART_EXPR:
1798     case IMAGPART_EXPR:
1799       pp_cxx_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1800       pp_cxx_whitespace (cxx_pp);
1801       dump_expr (TREE_OPERAND (t, 0), flags);
1802       break;
1803
1804     case DEFAULT_ARG:
1805       pp_identifier (cxx_pp, "<unparsed>");
1806       break;
1807
1808     case TRY_CATCH_EXPR:
1809     case WITH_CLEANUP_EXPR:
1810     case CLEANUP_POINT_EXPR:
1811       dump_expr (TREE_OPERAND (t, 0), flags);
1812       break;
1813
1814     case PSEUDO_DTOR_EXPR:
1815       dump_expr (TREE_OPERAND (t, 2), flags);
1816       pp_cxx_dot (cxx_pp);
1817       dump_type (TREE_OPERAND (t, 0), flags);
1818       pp_cxx_colon_colon (cxx_pp);
1819       pp_cxx_complement (cxx_pp);
1820       dump_type (TREE_OPERAND (t, 1), flags);
1821       break;
1822
1823     case TEMPLATE_ID_EXPR:
1824       dump_decl (t, flags);
1825       break;
1826
1827     case BIND_EXPR:
1828     case STMT_EXPR:
1829     case STATEMENT_LIST:
1830       /* We don't yet have a way of dumping statements in a
1831          human-readable format.  */
1832       pp_string (cxx_pp, "({...})");
1833       break;
1834
1835     case LOOP_EXPR:
1836       pp_string (cxx_pp, "while (1) { ");
1837       dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1838       pp_cxx_right_brace (cxx_pp);
1839       break;
1840
1841     case EXIT_EXPR:
1842       pp_string (cxx_pp, "if (");
1843       dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1844       pp_string (cxx_pp, ") break; ");
1845       break;
1846
1847     case BASELINK:
1848       dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
1849       break;
1850
1851     case EMPTY_CLASS_EXPR:
1852       dump_type (TREE_TYPE (t), flags);
1853       pp_cxx_left_paren (cxx_pp);
1854       pp_cxx_right_paren (cxx_pp);
1855       break;
1856
1857     case NON_DEPENDENT_EXPR:
1858       dump_expr (TREE_OPERAND (t, 0), flags);
1859       break;
1860
1861       /*  This list is incomplete, but should suffice for now.
1862           It is very important that `sorry' does not call
1863           `report_error_function'.  That could cause an infinite loop.  */
1864     default:
1865       pp_unsupported_tree (cxx_pp, t);
1866       /* fall through to ERROR_MARK...  */
1867     case ERROR_MARK:
1868       pp_identifier (cxx_pp, "<expression error>");
1869       break;
1870     }
1871 }
1872
1873 static void
1874 dump_binary_op (const char *opstring, tree t, int flags)
1875 {
1876   pp_cxx_left_paren (cxx_pp);
1877   dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1878   pp_cxx_whitespace (cxx_pp);
1879   if (opstring)
1880     pp_cxx_identifier (cxx_pp, opstring);
1881   else
1882     pp_identifier (cxx_pp, "<unknown operator>");
1883   pp_cxx_whitespace (cxx_pp);
1884   dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1885   pp_cxx_right_paren (cxx_pp);
1886 }
1887
1888 static void
1889 dump_unary_op (const char *opstring, tree t, int flags)
1890 {
1891   if (flags & TFF_EXPR_IN_PARENS)
1892     pp_cxx_left_paren (cxx_pp);
1893   pp_cxx_identifier (cxx_pp, opstring);
1894   dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1895   if (flags & TFF_EXPR_IN_PARENS)
1896     pp_cxx_right_paren (cxx_pp);
1897 }
1898
1899 static void
1900 reinit_cxx_pp (void)
1901 {
1902   pp_clear_output_area (cxx_pp);
1903   pp_base (cxx_pp)->padding = pp_none;
1904   pp_indentation (cxx_pp) = 0;
1905   pp_needs_newline (cxx_pp) = false;
1906   cxx_pp->enclosing_scope = 0;
1907 }
1908
1909
1910 /* Exported interface to stringifying types, exprs and decls under TFF_*
1911    control.  */
1912
1913 const char *
1914 type_as_string (tree typ, int flags)
1915 {
1916   reinit_cxx_pp ();
1917   dump_type (typ, flags);
1918   return pp_formatted_text (cxx_pp);
1919 }
1920
1921 const char *
1922 expr_as_string (tree decl, int flags)
1923 {
1924   reinit_cxx_pp ();
1925   dump_expr (decl, flags);
1926   return pp_formatted_text (cxx_pp);
1927 }
1928
1929 const char *
1930 decl_as_string (tree decl, int flags)
1931 {
1932   reinit_cxx_pp ();
1933   dump_decl (decl, flags);
1934   return pp_formatted_text (cxx_pp);
1935 }
1936
1937 /* Generate the three forms of printable names for cxx_printable_name.  */
1938
1939 const char *
1940 lang_decl_name (tree decl, int v)
1941 {
1942   if (v >= 2)
1943     return decl_as_string (decl, TFF_DECL_SPECIFIERS);
1944
1945   reinit_cxx_pp ();
1946   if (v == 1 && DECL_CLASS_SCOPE_P (decl))
1947     {
1948       dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
1949       pp_cxx_colon_colon (cxx_pp);
1950     }
1951
1952   if (TREE_CODE (decl) == FUNCTION_DECL)
1953     dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
1954   else
1955     dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
1956
1957   return pp_formatted_text (cxx_pp);
1958 }
1959
1960 /* Return the location of a tree passed to %+ formats.  */
1961
1962 static location_t
1963 location_of (tree t)
1964 {
1965   if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
1966     t = DECL_CONTEXT (t);
1967   else if (TYPE_P (t))
1968     t = TYPE_MAIN_DECL (t);
1969   else if (TREE_CODE (t) == OVERLOAD)
1970     t = OVL_FUNCTION (t);
1971
1972   return DECL_SOURCE_LOCATION (t);
1973 }
1974
1975 /* Now the interfaces from error et al to dump_type et al. Each takes an
1976    on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
1977    function.  */
1978
1979 static const char *
1980 decl_to_string (tree decl, int verbose)
1981 {
1982   int flags = 0;
1983
1984   if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
1985       || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
1986     flags = TFF_CLASS_KEY_OR_ENUM;
1987   if (verbose)
1988     flags |= TFF_DECL_SPECIFIERS;
1989   else if (TREE_CODE (decl) == FUNCTION_DECL)
1990     flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
1991   flags |= TFF_TEMPLATE_HEADER;
1992
1993   reinit_cxx_pp ();
1994   dump_decl (decl, flags);
1995   return pp_formatted_text (cxx_pp);
1996 }
1997
1998 static const char *
1999 expr_to_string (tree decl)
2000 {
2001   reinit_cxx_pp ();
2002   dump_expr (decl, 0);
2003   return pp_formatted_text (cxx_pp);
2004 }
2005
2006 static const char *
2007 fndecl_to_string (tree fndecl, int verbose)
2008 {
2009   int flags;
2010
2011   flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
2012   if (verbose)
2013     flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2014   reinit_cxx_pp ();
2015   dump_decl (fndecl, flags);
2016   return pp_formatted_text (cxx_pp);
2017 }
2018
2019
2020 static const char *
2021 code_to_string (enum tree_code c)
2022 {
2023   return tree_code_name [c];
2024 }
2025
2026 const char *
2027 language_to_string (enum languages c)
2028 {
2029   switch (c)
2030     {
2031     case lang_c:
2032       return "C";
2033
2034     case lang_cplusplus:
2035       return "C++";
2036
2037     case lang_java:
2038       return "Java";
2039
2040     default:
2041       gcc_unreachable ();
2042     }
2043   return 0;
2044 }
2045
2046 /* Return the proper printed version of a parameter to a C++ function.  */
2047
2048 static const char *
2049 parm_to_string (int p)
2050 {
2051   reinit_cxx_pp ();
2052   if (p < 0)
2053     pp_string (cxx_pp, "'this'");
2054   else
2055     pp_decimal_int (cxx_pp, p + 1);
2056   return pp_formatted_text (cxx_pp);
2057 }
2058
2059 static const char *
2060 op_to_string (enum tree_code p)
2061 {
2062   tree id = operator_name_info[(int) p].identifier;
2063   return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2064 }
2065
2066 static const char *
2067 type_to_string (tree typ, int verbose)
2068 {
2069   int flags = 0;
2070   if (verbose)
2071     flags |= TFF_CLASS_KEY_OR_ENUM;
2072   flags |= TFF_TEMPLATE_HEADER;
2073
2074   reinit_cxx_pp ();
2075   dump_type (typ, flags);
2076   return pp_formatted_text (cxx_pp);
2077 }
2078
2079 static const char *
2080 assop_to_string (enum tree_code p)
2081 {
2082   tree id = assignment_operator_name_info[(int) p].identifier;
2083   return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2084 }
2085
2086 static const char *
2087 args_to_string (tree p, int verbose)
2088 {
2089   int flags = 0;
2090   if (verbose)
2091     flags |= TFF_CLASS_KEY_OR_ENUM;
2092
2093   if (p == NULL_TREE)
2094     return "";
2095
2096   if (TYPE_P (TREE_VALUE (p)))
2097     return type_as_string (p, flags);
2098
2099   reinit_cxx_pp ();
2100   for (; p; p = TREE_CHAIN (p))
2101     {
2102       if (TREE_VALUE (p) == null_node)
2103         pp_cxx_identifier (cxx_pp, "NULL");
2104       else
2105         dump_type (error_type (TREE_VALUE (p)), flags);
2106       if (TREE_CHAIN (p))
2107         pp_separate_with_comma (cxx_pp);
2108     }
2109   return pp_formatted_text (cxx_pp);
2110 }
2111
2112 static const char *
2113 cv_to_string (tree p, int v)
2114 {
2115   reinit_cxx_pp ();
2116   pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2117   pp_cxx_cv_qualifier_seq (cxx_pp, p);
2118   return pp_formatted_text (cxx_pp);
2119 }
2120
2121 /* Langhook for print_error_function.  */
2122 void
2123 cxx_print_error_function (diagnostic_context *context, const char *file)
2124 {
2125   lhd_print_error_function (context, file);
2126   pp_base_set_prefix (context->printer, file);
2127   maybe_print_instantiation_context (context);
2128 }
2129
2130 static void
2131 cp_diagnostic_starter (diagnostic_context *context,
2132                        diagnostic_info *diagnostic)
2133 {
2134   diagnostic_report_current_module (context);
2135   cp_print_error_function (context, diagnostic);
2136   maybe_print_instantiation_context (context);
2137   pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2138 }
2139
2140 static void
2141 cp_diagnostic_finalizer (diagnostic_context *context,
2142                          diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2143 {
2144   pp_base_destroy_prefix (context->printer);
2145 }
2146
2147 /* Print current function onto BUFFER, in the process of reporting
2148    a diagnostic message.  Called from cp_diagnostic_starter.  */
2149 static void
2150 cp_print_error_function (diagnostic_context *context,
2151                          diagnostic_info *diagnostic)
2152 {
2153   if (diagnostic_last_function_changed (context))
2154     {
2155       const char *old_prefix = context->printer->prefix;
2156       const char *file = LOCATION_FILE (diagnostic->location);
2157       char *new_prefix = file ? file_name_as_prefix (file) : NULL;
2158
2159       pp_base_set_prefix (context->printer, new_prefix);
2160
2161       if (current_function_decl == NULL)
2162         pp_base_string (context->printer, "At global scope:");
2163       else
2164         pp_printf (context->printer, "In %s %qs:",
2165                    function_category (current_function_decl),
2166                    cxx_printable_name (current_function_decl, 2));
2167       pp_base_newline (context->printer);
2168
2169       diagnostic_set_last_function (context);
2170       pp_base_destroy_prefix (context->printer);
2171       context->printer->prefix = old_prefix;
2172     }
2173 }
2174
2175 /* Returns a description of FUNCTION using standard terminology.  */
2176 static const char *
2177 function_category (tree fn)
2178 {
2179   if (DECL_FUNCTION_MEMBER_P (fn))
2180     {
2181       if (DECL_STATIC_FUNCTION_P (fn))
2182         return "static member function";
2183       else if (DECL_COPY_CONSTRUCTOR_P (fn))
2184         return "copy constructor";
2185       else if (DECL_CONSTRUCTOR_P (fn))
2186         return "constructor";
2187       else if (DECL_DESTRUCTOR_P (fn))
2188         return "destructor";
2189       else
2190         return "member function";
2191     }
2192   else
2193     return "function";
2194 }
2195
2196 /* Report the full context of a current template instantiation,
2197    onto BUFFER.  */
2198 static void
2199 print_instantiation_full_context (diagnostic_context *context)
2200 {
2201   tree p = current_instantiation ();
2202   location_t location = input_location;
2203
2204   if (p)
2205     {
2206       if (current_function_decl != TINST_DECL (p)
2207           && current_function_decl != NULL_TREE)
2208         /* We can get here during the processing of some synthesized
2209            method.  Then, TINST_DECL (p) will be the function that's causing
2210            the synthesis.  */
2211         ;
2212       else
2213         {
2214           if (current_function_decl == TINST_DECL (p))
2215             /* Avoid redundancy with the "In function" line.  */;
2216           else
2217             pp_verbatim (context->printer,
2218                          "%s: In instantiation of %qs:\n",
2219                          LOCATION_FILE (location),
2220                          decl_as_string (TINST_DECL (p),
2221                                          TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2222
2223           location = TINST_LOCATION (p);
2224           p = TREE_CHAIN (p);
2225         }
2226     }
2227
2228   print_instantiation_partial_context (context, p, location);
2229 }
2230
2231 /* Same as above but less verbose.  */
2232 static void
2233 print_instantiation_partial_context (diagnostic_context *context,
2234                                      tree t, location_t loc)
2235 {
2236   expanded_location xloc;
2237   for (; ; t = TREE_CHAIN (t))
2238     {
2239       xloc = expand_location (loc);
2240       if (t == NULL_TREE)
2241         break;
2242       pp_verbatim (context->printer, "%s:%d:   instantiated from %qs\n",
2243                    xloc.file, xloc.line,
2244                    decl_as_string (TINST_DECL (t),
2245                                    TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2246       loc = TINST_LOCATION (t);
2247     }
2248   pp_verbatim (context->printer, "%s:%d:   instantiated from here",
2249                xloc.file, xloc.line);
2250   pp_base_newline (context->printer);
2251 }
2252
2253 /* Called from cp_thing to print the template context for an error.  */
2254 static void
2255 maybe_print_instantiation_context (diagnostic_context *context)
2256 {
2257   if (!problematic_instantiation_changed () || current_instantiation () == 0)
2258     return;
2259
2260   record_last_problematic_instantiation ();
2261   print_instantiation_full_context (context);
2262 }
2263
2264 /* Report the bare minimum context of a template instantiation.  */
2265 void
2266 print_instantiation_context (void)
2267 {
2268   print_instantiation_partial_context
2269     (global_dc, current_instantiation (), input_location);
2270   diagnostic_flush_buffer (global_dc);
2271 }
2272 \f
2273 /* Called from output_format -- during diagnostic message processing --
2274    to handle C++ specific format specifier with the following meanings:
2275    %A   function argument-list.
2276    %C   tree code.
2277    %D   declaration.
2278    %E   expression.
2279    %F   function declaration.
2280    %L   language as used in extern "lang".
2281    %O   binary operator.
2282    %P   function parameter whose position is indicated by an integer.
2283    %Q   assignment operator.
2284    %T   type.
2285    %V   cv-qualifier.  */
2286 static bool
2287 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2288             int precision, bool wide, bool set_locus, bool verbose)
2289 {
2290   const char *result;
2291   tree t = NULL;
2292 #define next_tree    (t = va_arg (*text->args_ptr, tree))
2293 #define next_tcode   va_arg (*text->args_ptr, enum tree_code)
2294 #define next_lang    va_arg (*text->args_ptr, enum languages)
2295 #define next_int     va_arg (*text->args_ptr, int)
2296
2297   if (precision != 0 || wide)
2298     return false;
2299
2300   if (text->locus == NULL)
2301     set_locus = false;
2302
2303   switch (*spec)
2304     {
2305     case 'A': result = args_to_string (next_tree, verbose);     break;
2306     case 'C': result = code_to_string (next_tcode);             break;
2307     case 'D': result = decl_to_string (next_tree, verbose);     break;
2308     case 'E': result = expr_to_string (next_tree);              break;
2309     case 'F': result = fndecl_to_string (next_tree, verbose);   break;
2310     case 'L': result = language_to_string (next_lang);          break;
2311     case 'O': result = op_to_string (next_tcode);               break;
2312     case 'P': result = parm_to_string (next_int);               break;
2313     case 'Q': result = assop_to_string (next_tcode);            break;
2314     case 'T': result = type_to_string (next_tree, verbose);     break;
2315     case 'V': result = cv_to_string (next_tree, verbose);       break;
2316
2317     default:
2318       return false;
2319     }
2320
2321   pp_base_string (pp, result);
2322   if (set_locus && t != NULL)
2323     *text->locus = location_of (t);
2324   return true;
2325 #undef next_tree
2326 #undef next_tcode
2327 #undef next_lang
2328 #undef next_int
2329 }