OSDN Git Service

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