OSDN Git Service

PR c++/28048
[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 /* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
1282    function.  Resolve it to a close relative -- in the sense of static
1283    type -- variant being overridden.  That is close to what was written in
1284    the source code.  Subroutine of dump_expr.  */
1285
1286 static tree
1287 resolve_virtual_fun_from_obj_type_ref (tree ref)
1288 {
1289   tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
1290   int index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
1291   tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
1292     while (index--)
1293       fun = TREE_CHAIN (fun);
1294
1295   return BV_FN (fun);
1296 }
1297
1298 /* Print out an expression E under control of FLAGS.  */
1299
1300 static void
1301 dump_expr (tree t, int flags)
1302 {
1303   if (t == 0)
1304     return;
1305
1306   switch (TREE_CODE (t))
1307     {
1308     case VAR_DECL:
1309     case PARM_DECL:
1310     case FIELD_DECL:
1311     case CONST_DECL:
1312     case FUNCTION_DECL:
1313     case TEMPLATE_DECL:
1314     case NAMESPACE_DECL:
1315     case LABEL_DECL:
1316     case OVERLOAD:
1317     case IDENTIFIER_NODE:
1318       dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
1319       break;
1320
1321     case INTEGER_CST:
1322     case REAL_CST:
1323     case STRING_CST:
1324       pp_constant (cxx_pp, t);
1325       break;
1326
1327     case THROW_EXPR:
1328       pp_cxx_identifier (cxx_pp, "throw");
1329       dump_expr (TREE_OPERAND (t, 0), flags);
1330       break;
1331
1332     case PTRMEM_CST:
1333       pp_ampersand (cxx_pp);
1334       dump_type (PTRMEM_CST_CLASS (t), flags);
1335       pp_cxx_colon_colon (cxx_pp);
1336       pp_cxx_tree_identifier (cxx_pp, DECL_NAME (PTRMEM_CST_MEMBER (t)));
1337       break;
1338
1339     case COMPOUND_EXPR:
1340       pp_cxx_left_paren (cxx_pp);
1341       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1342       pp_separate_with_comma (cxx_pp);
1343       dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1344       pp_cxx_right_paren (cxx_pp);
1345       break;
1346
1347     case COND_EXPR:
1348       pp_cxx_left_paren (cxx_pp);
1349       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1350       pp_string (cxx_pp, " ? ");
1351       dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1352       pp_string (cxx_pp, " : ");
1353       dump_expr (TREE_OPERAND (t, 2), flags | TFF_EXPR_IN_PARENS);
1354       pp_cxx_right_paren (cxx_pp);
1355       break;
1356
1357     case SAVE_EXPR:
1358       if (TREE_HAS_CONSTRUCTOR (t))
1359         {
1360           pp_cxx_identifier (cxx_pp, "new");
1361           pp_cxx_whitespace (cxx_pp);
1362           dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
1363         }
1364       else
1365         dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1366       break;
1367
1368     case AGGR_INIT_EXPR:
1369       {
1370         tree fn = NULL_TREE;
1371
1372         if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
1373           fn = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
1374
1375         if (fn && TREE_CODE (fn) == FUNCTION_DECL)
1376           {
1377             if (DECL_CONSTRUCTOR_P (fn))
1378               dump_type (DECL_CONTEXT (fn), flags);
1379             else
1380               dump_decl (fn, 0);
1381           }
1382         else
1383           dump_expr (TREE_OPERAND (t, 0), 0);
1384       }
1385       pp_cxx_left_paren (cxx_pp);
1386       if (TREE_OPERAND (t, 1))
1387         dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1388       pp_cxx_right_paren (cxx_pp);
1389       break;
1390
1391     case CALL_EXPR:
1392       {
1393         tree fn = TREE_OPERAND (t, 0);
1394         tree args = TREE_OPERAND (t, 1);
1395
1396         if (TREE_CODE (fn) == ADDR_EXPR)
1397           fn = TREE_OPERAND (fn, 0);
1398
1399         /* Nobody is interested in seeing the guts of vcalls.  */
1400         if (TREE_CODE (fn) == OBJ_TYPE_REF)
1401           fn = resolve_virtual_fun_from_obj_type_ref (fn);
1402
1403         if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
1404           {
1405             tree ob = TREE_VALUE (args);
1406             if (TREE_CODE (ob) == ADDR_EXPR)
1407               {
1408                 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1409                 pp_dot (cxx_pp);
1410               }
1411             else if (TREE_CODE (ob) != PARM_DECL
1412                      || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1413               {
1414                 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1415                 pp_arrow (cxx_pp);
1416               }
1417             args = TREE_CHAIN (args);
1418           }
1419         dump_expr (fn, flags | TFF_EXPR_IN_PARENS);
1420         pp_cxx_left_paren (cxx_pp);
1421         dump_expr_list (args, flags);
1422         pp_cxx_right_paren (cxx_pp);
1423       }
1424       break;
1425
1426     case NEW_EXPR:
1427       {
1428         tree type = TREE_OPERAND (t, 1);
1429         tree init = TREE_OPERAND (t, 2);
1430         if (NEW_EXPR_USE_GLOBAL (t))
1431           pp_cxx_colon_colon (cxx_pp);
1432         pp_cxx_identifier (cxx_pp, "new");
1433         if (TREE_OPERAND (t, 0))
1434           {
1435             pp_cxx_left_paren (cxx_pp);
1436             dump_expr_list (TREE_OPERAND (t, 0), flags);
1437             pp_cxx_right_paren (cxx_pp);
1438             pp_cxx_whitespace (cxx_pp);
1439           }
1440         if (TREE_CODE (type) == ARRAY_REF)
1441           type = build_cplus_array_type
1442             (TREE_OPERAND (type, 0),
1443              build_index_type (fold_build2 (MINUS_EXPR, integer_type_node,
1444                                             TREE_OPERAND (type, 1),
1445                                             integer_one_node)));
1446         dump_type (type, flags);
1447         if (init)
1448           {
1449             pp_cxx_left_paren (cxx_pp);
1450             if (TREE_CODE (init) == TREE_LIST)
1451               dump_expr_list (init, flags);
1452             else if (init == void_zero_node)
1453               /* This representation indicates an empty initializer,
1454                  e.g.: "new int()".  */
1455               ;
1456             else
1457               dump_expr (init, flags);
1458             pp_cxx_right_paren (cxx_pp);
1459           }
1460       }
1461       break;
1462
1463     case TARGET_EXPR:
1464       /* Note that this only works for G++ target exprs.  If somebody
1465          builds a general TARGET_EXPR, there's no way to represent that
1466          it initializes anything other that the parameter slot for the
1467          default argument.  Note we may have cleared out the first
1468          operand in expand_expr, so don't go killing ourselves.  */
1469       if (TREE_OPERAND (t, 1))
1470         dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1471       break;
1472
1473     case INIT_EXPR:
1474     case MODIFY_EXPR:
1475     case PLUS_EXPR:
1476     case MINUS_EXPR:
1477     case MULT_EXPR:
1478     case TRUNC_DIV_EXPR:
1479     case TRUNC_MOD_EXPR:
1480     case MIN_EXPR:
1481     case MAX_EXPR:
1482     case LSHIFT_EXPR:
1483     case RSHIFT_EXPR:
1484     case BIT_IOR_EXPR:
1485     case BIT_XOR_EXPR:
1486     case BIT_AND_EXPR:
1487     case TRUTH_ANDIF_EXPR:
1488     case TRUTH_ORIF_EXPR:
1489     case LT_EXPR:
1490     case LE_EXPR:
1491     case GT_EXPR:
1492     case GE_EXPR:
1493     case EQ_EXPR:
1494     case NE_EXPR:
1495     case EXACT_DIV_EXPR:
1496       dump_binary_op (operator_name_info[(int) TREE_CODE (t)].name, t, flags);
1497       break;
1498
1499     case CEIL_DIV_EXPR:
1500     case FLOOR_DIV_EXPR:
1501     case ROUND_DIV_EXPR:
1502     case RDIV_EXPR:
1503       dump_binary_op ("/", t, flags);
1504       break;
1505
1506     case CEIL_MOD_EXPR:
1507     case FLOOR_MOD_EXPR:
1508     case ROUND_MOD_EXPR:
1509       dump_binary_op ("%", t, flags);
1510       break;
1511
1512     case COMPONENT_REF:
1513       {
1514         tree ob = TREE_OPERAND (t, 0);
1515         if (TREE_CODE (ob) == INDIRECT_REF)
1516           {
1517             ob = TREE_OPERAND (ob, 0);
1518             if (TREE_CODE (ob) != PARM_DECL
1519                 || (DECL_NAME (ob)
1520                     && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
1521               {
1522                 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1523                 pp_cxx_arrow (cxx_pp);
1524               }
1525           }
1526         else
1527           {
1528             dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1529             pp_cxx_dot (cxx_pp);
1530           }
1531         dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
1532       }
1533       break;
1534
1535     case ARRAY_REF:
1536       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1537       pp_cxx_left_bracket (cxx_pp);
1538       dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1539       pp_cxx_right_bracket (cxx_pp);
1540       break;
1541
1542     case UNARY_PLUS_EXPR:
1543       dump_unary_op ("+", t, flags);
1544       break;
1545
1546     case ADDR_EXPR:
1547       if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
1548           || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1549           /* An ADDR_EXPR can have reference type.  In that case, we
1550              shouldn't print the `&' doing so indicates to the user
1551              that the expression has pointer type.  */
1552           || (TREE_TYPE (t)
1553               && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
1554         dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1555       else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
1556         dump_unary_op ("&&", t, flags);
1557       else
1558         dump_unary_op ("&", t, flags);
1559       break;
1560
1561     case INDIRECT_REF:
1562       if (TREE_HAS_CONSTRUCTOR (t))
1563         {
1564           t = TREE_OPERAND (t, 0);
1565           gcc_assert (TREE_CODE (t) == CALL_EXPR);
1566           dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1567           pp_cxx_left_paren (cxx_pp);
1568           dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
1569           pp_cxx_right_paren (cxx_pp);
1570         }
1571       else
1572         {
1573           if (TREE_OPERAND (t,0) != NULL_TREE
1574               && TREE_TYPE (TREE_OPERAND (t, 0))
1575               && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
1576             dump_expr (TREE_OPERAND (t, 0), flags);
1577           else
1578             dump_unary_op ("*", t, flags);
1579         }
1580       break;
1581
1582     case NEGATE_EXPR:
1583     case BIT_NOT_EXPR:
1584     case TRUTH_NOT_EXPR:
1585     case PREDECREMENT_EXPR:
1586     case PREINCREMENT_EXPR:
1587       dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
1588       break;
1589
1590     case POSTDECREMENT_EXPR:
1591     case POSTINCREMENT_EXPR:
1592       pp_cxx_left_paren (cxx_pp);
1593       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1594       pp_cxx_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1595       pp_cxx_right_paren (cxx_pp);
1596       break;
1597
1598     case NON_LVALUE_EXPR:
1599       /* FIXME: This is a KLUDGE workaround for a parsing problem.  There
1600          should be another level of INDIRECT_REF so that I don't have to do
1601          this.  */
1602       if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
1603         {
1604           tree next = TREE_TYPE (TREE_TYPE (t));
1605
1606           while (TREE_CODE (next) == POINTER_TYPE)
1607             next = TREE_TYPE (next);
1608
1609           if (TREE_CODE (next) == FUNCTION_TYPE)
1610             {
1611               if (flags & TFF_EXPR_IN_PARENS)
1612                 pp_cxx_left_paren (cxx_pp);
1613               pp_cxx_star (cxx_pp);
1614               dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1615               if (flags & TFF_EXPR_IN_PARENS)
1616                 pp_cxx_right_paren (cxx_pp);
1617               break;
1618             }
1619           /* Else fall through.  */
1620         }
1621       dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1622       break;
1623
1624     case NOP_EXPR:
1625     case CONVERT_EXPR:
1626       {
1627         tree op = TREE_OPERAND (t, 0);
1628
1629         if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1630           {
1631             /* It is a cast, but we cannot tell whether it is a
1632                reinterpret or static cast. Use the C style notation.  */
1633             if (flags & TFF_EXPR_IN_PARENS)
1634               pp_cxx_left_paren (cxx_pp);
1635             pp_cxx_left_paren (cxx_pp);
1636             dump_type (TREE_TYPE (t), flags);
1637             pp_cxx_right_paren (cxx_pp);
1638             dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1639             if (flags & TFF_EXPR_IN_PARENS)
1640               pp_cxx_right_paren (cxx_pp);
1641           }
1642         else
1643           dump_expr (op, flags);
1644         break;
1645       }
1646
1647     case CONSTRUCTOR:
1648       if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1649         {
1650           tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
1651
1652           if (integer_zerop (idx))
1653             {
1654               /* A NULL pointer-to-member constant.  */
1655               pp_cxx_left_paren (cxx_pp);
1656               pp_cxx_left_paren (cxx_pp);
1657               dump_type (TREE_TYPE (t), flags);
1658               pp_cxx_right_paren (cxx_pp);
1659               pp_character (cxx_pp, '0');
1660               pp_cxx_right_paren (cxx_pp);
1661               break;
1662             }
1663           else if (host_integerp (idx, 0))
1664             {
1665               tree virtuals;
1666               unsigned HOST_WIDE_INT n;
1667
1668               t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1669               t = TYPE_METHOD_BASETYPE (t);
1670               virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
1671
1672               n = tree_low_cst (idx, 0);
1673
1674               /* Map vtable index back one, to allow for the null pointer to
1675                  member.  */
1676               --n;
1677
1678               while (n > 0 && virtuals)
1679                 {
1680                   --n;
1681                   virtuals = TREE_CHAIN (virtuals);
1682                 }
1683               if (virtuals)
1684                 {
1685                   dump_expr (BV_FN (virtuals),
1686                              flags | TFF_EXPR_IN_PARENS);
1687                   break;
1688                 }
1689             }
1690         }
1691       if (TREE_TYPE (t) && EMPTY_CONSTRUCTOR_P (t))
1692         {
1693           dump_type (TREE_TYPE (t), 0);
1694           pp_cxx_left_paren (cxx_pp);
1695           pp_cxx_right_paren (cxx_pp);
1696         }
1697       else
1698         {
1699           pp_cxx_left_brace (cxx_pp);
1700           dump_expr_init_vec (CONSTRUCTOR_ELTS (t), flags);
1701           pp_cxx_right_brace (cxx_pp);
1702         }
1703
1704       break;
1705
1706     case OFFSET_REF:
1707       {
1708         tree ob = TREE_OPERAND (t, 0);
1709         if (is_dummy_object (ob))
1710           {
1711             t = TREE_OPERAND (t, 1);
1712             if (TREE_CODE (t) == FUNCTION_DECL)
1713               /* A::f */
1714               dump_expr (t, flags | TFF_EXPR_IN_PARENS);
1715             else if (BASELINK_P (t))
1716               dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1717                          flags | TFF_EXPR_IN_PARENS);
1718             else
1719               dump_decl (t, flags);
1720           }
1721         else
1722           {
1723             if (TREE_CODE (ob) == INDIRECT_REF)
1724               {
1725                 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
1726                 pp_cxx_arrow (cxx_pp);
1727                 pp_cxx_star (cxx_pp);
1728               }
1729             else
1730               {
1731                 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
1732                 pp_cxx_dot (cxx_pp);
1733                 pp_cxx_star (cxx_pp);
1734               }
1735             dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1736           }
1737         break;
1738       }
1739
1740     case TEMPLATE_PARM_INDEX:
1741       dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
1742       break;
1743
1744     case SCOPE_REF:
1745       pp_expression (cxx_pp, t);
1746       break;
1747
1748     case CAST_EXPR:
1749       if (TREE_OPERAND (t, 0) == NULL_TREE
1750           || TREE_CHAIN (TREE_OPERAND (t, 0)))
1751         {
1752           dump_type (TREE_TYPE (t), flags);
1753           pp_cxx_left_paren (cxx_pp);
1754           dump_expr_list (TREE_OPERAND (t, 0), flags);
1755           pp_cxx_right_paren (cxx_pp);
1756         }
1757       else
1758         {
1759           pp_cxx_left_paren (cxx_pp);
1760           dump_type (TREE_TYPE (t), flags);
1761           pp_cxx_right_paren (cxx_pp);
1762           pp_cxx_left_paren (cxx_pp);
1763           dump_expr_list (TREE_OPERAND (t, 0), flags);
1764           pp_cxx_right_paren (cxx_pp);
1765         }
1766       break;
1767
1768     case STATIC_CAST_EXPR:
1769       pp_cxx_identifier (cxx_pp, "static_cast");
1770       goto cast;
1771     case REINTERPRET_CAST_EXPR:
1772       pp_cxx_identifier (cxx_pp, "reinterpret_cast");
1773       goto cast;
1774     case CONST_CAST_EXPR:
1775       pp_cxx_identifier (cxx_pp, "const_cast");
1776       goto cast;
1777     case DYNAMIC_CAST_EXPR:
1778       pp_cxx_identifier (cxx_pp, "dynamic_cast");
1779     cast:
1780       pp_cxx_begin_template_argument_list (cxx_pp);
1781       dump_type (TREE_TYPE (t), flags);
1782       pp_cxx_end_template_argument_list (cxx_pp);
1783       pp_cxx_left_paren (cxx_pp);
1784       dump_expr (TREE_OPERAND (t, 0), flags);
1785       pp_cxx_right_paren (cxx_pp);
1786       break;
1787
1788     case ARROW_EXPR:
1789       dump_expr (TREE_OPERAND (t, 0), flags);
1790       pp_cxx_arrow (cxx_pp);
1791       break;
1792
1793     case SIZEOF_EXPR:
1794     case ALIGNOF_EXPR:
1795       if (TREE_CODE (t) == SIZEOF_EXPR)
1796         pp_cxx_identifier (cxx_pp, "sizeof");
1797       else
1798         {
1799           gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
1800           pp_cxx_identifier (cxx_pp, "__alignof__");
1801         }
1802       pp_cxx_whitespace (cxx_pp);
1803       pp_cxx_left_paren (cxx_pp);
1804       if (TYPE_P (TREE_OPERAND (t, 0)))
1805         dump_type (TREE_OPERAND (t, 0), flags);
1806       else
1807         dump_expr (TREE_OPERAND (t, 0), flags);
1808       pp_cxx_right_paren (cxx_pp);
1809       break;
1810
1811     case REALPART_EXPR:
1812     case IMAGPART_EXPR:
1813       pp_cxx_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1814       pp_cxx_whitespace (cxx_pp);
1815       dump_expr (TREE_OPERAND (t, 0), flags);
1816       break;
1817
1818     case DEFAULT_ARG:
1819       pp_identifier (cxx_pp, "<unparsed>");
1820       break;
1821
1822     case TRY_CATCH_EXPR:
1823     case WITH_CLEANUP_EXPR:
1824     case CLEANUP_POINT_EXPR:
1825       dump_expr (TREE_OPERAND (t, 0), flags);
1826       break;
1827
1828     case PSEUDO_DTOR_EXPR:
1829       dump_expr (TREE_OPERAND (t, 2), flags);
1830       pp_cxx_dot (cxx_pp);
1831       dump_type (TREE_OPERAND (t, 0), flags);
1832       pp_cxx_colon_colon (cxx_pp);
1833       pp_cxx_complement (cxx_pp);
1834       dump_type (TREE_OPERAND (t, 1), flags);
1835       break;
1836
1837     case TEMPLATE_ID_EXPR:
1838       dump_decl (t, flags);
1839       break;
1840
1841     case BIND_EXPR:
1842     case STMT_EXPR:
1843     case STATEMENT_LIST:
1844       /* We don't yet have a way of dumping statements in a
1845          human-readable format.  */
1846       pp_string (cxx_pp, "({...})");
1847       break;
1848
1849     case LOOP_EXPR:
1850       pp_string (cxx_pp, "while (1) { ");
1851       dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1852       pp_cxx_right_brace (cxx_pp);
1853       break;
1854
1855     case EXIT_EXPR:
1856       pp_string (cxx_pp, "if (");
1857       dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1858       pp_string (cxx_pp, ") break; ");
1859       break;
1860
1861     case BASELINK:
1862       dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
1863       break;
1864
1865     case EMPTY_CLASS_EXPR:
1866       dump_type (TREE_TYPE (t), flags);
1867       pp_cxx_left_paren (cxx_pp);
1868       pp_cxx_right_paren (cxx_pp);
1869       break;
1870
1871     case NON_DEPENDENT_EXPR:
1872       dump_expr (TREE_OPERAND (t, 0), flags);
1873       break;
1874
1875       /*  This list is incomplete, but should suffice for now.
1876           It is very important that `sorry' does not call
1877           `report_error_function'.  That could cause an infinite loop.  */
1878     default:
1879       pp_unsupported_tree (cxx_pp, t);
1880       /* fall through to ERROR_MARK...  */
1881     case ERROR_MARK:
1882       pp_identifier (cxx_pp, "<expression error>");
1883       break;
1884     }
1885 }
1886
1887 static void
1888 dump_binary_op (const char *opstring, tree t, int flags)
1889 {
1890   pp_cxx_left_paren (cxx_pp);
1891   dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
1892   pp_cxx_whitespace (cxx_pp);
1893   if (opstring)
1894     pp_cxx_identifier (cxx_pp, opstring);
1895   else
1896     pp_identifier (cxx_pp, "<unknown operator>");
1897   pp_cxx_whitespace (cxx_pp);
1898   dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
1899   pp_cxx_right_paren (cxx_pp);
1900 }
1901
1902 static void
1903 dump_unary_op (const char *opstring, tree t, int flags)
1904 {
1905   if (flags & TFF_EXPR_IN_PARENS)
1906     pp_cxx_left_paren (cxx_pp);
1907   pp_cxx_identifier (cxx_pp, opstring);
1908   dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1909   if (flags & TFF_EXPR_IN_PARENS)
1910     pp_cxx_right_paren (cxx_pp);
1911 }
1912
1913 static void
1914 reinit_cxx_pp (void)
1915 {
1916   pp_clear_output_area (cxx_pp);
1917   pp_base (cxx_pp)->padding = pp_none;
1918   pp_indentation (cxx_pp) = 0;
1919   pp_needs_newline (cxx_pp) = false;
1920   cxx_pp->enclosing_scope = 0;
1921 }
1922
1923
1924 /* Exported interface to stringifying types, exprs and decls under TFF_*
1925    control.  */
1926
1927 const char *
1928 type_as_string (tree typ, int flags)
1929 {
1930   reinit_cxx_pp ();
1931   dump_type (typ, flags);
1932   return pp_formatted_text (cxx_pp);
1933 }
1934
1935 const char *
1936 expr_as_string (tree decl, int flags)
1937 {
1938   reinit_cxx_pp ();
1939   dump_expr (decl, flags);
1940   return pp_formatted_text (cxx_pp);
1941 }
1942
1943 const char *
1944 decl_as_string (tree decl, int flags)
1945 {
1946   reinit_cxx_pp ();
1947   dump_decl (decl, flags);
1948   return pp_formatted_text (cxx_pp);
1949 }
1950
1951 /* Generate the three forms of printable names for cxx_printable_name.  */
1952
1953 const char *
1954 lang_decl_name (tree decl, int v)
1955 {
1956   if (v >= 2)
1957     return decl_as_string (decl, TFF_DECL_SPECIFIERS);
1958
1959   reinit_cxx_pp ();
1960   if (v == 1 && DECL_CLASS_SCOPE_P (decl))
1961     {
1962       dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
1963       pp_cxx_colon_colon (cxx_pp);
1964     }
1965
1966   if (TREE_CODE (decl) == FUNCTION_DECL)
1967     dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
1968   else
1969     dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
1970
1971   return pp_formatted_text (cxx_pp);
1972 }
1973
1974 /* Return the location of a tree passed to %+ formats.  */
1975
1976 static location_t
1977 location_of (tree t)
1978 {
1979   if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
1980     t = DECL_CONTEXT (t);
1981   else if (TYPE_P (t))
1982     t = TYPE_MAIN_DECL (t);
1983   else if (TREE_CODE (t) == OVERLOAD)
1984     t = OVL_FUNCTION (t);
1985
1986   return DECL_SOURCE_LOCATION (t);
1987 }
1988
1989 /* Now the interfaces from error et al to dump_type et al. Each takes an
1990    on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
1991    function.  */
1992
1993 static const char *
1994 decl_to_string (tree decl, int verbose)
1995 {
1996   int flags = 0;
1997
1998   if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
1999       || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
2000     flags = TFF_CLASS_KEY_OR_ENUM;
2001   if (verbose)
2002     flags |= TFF_DECL_SPECIFIERS;
2003   else if (TREE_CODE (decl) == FUNCTION_DECL)
2004     flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
2005   flags |= TFF_TEMPLATE_HEADER;
2006
2007   reinit_cxx_pp ();
2008   dump_decl (decl, flags);
2009   return pp_formatted_text (cxx_pp);
2010 }
2011
2012 static const char *
2013 expr_to_string (tree decl)
2014 {
2015   reinit_cxx_pp ();
2016   dump_expr (decl, 0);
2017   return pp_formatted_text (cxx_pp);
2018 }
2019
2020 static const char *
2021 fndecl_to_string (tree fndecl, int verbose)
2022 {
2023   int flags;
2024
2025   flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS
2026     | TFF_TEMPLATE_HEADER;
2027   if (verbose)
2028     flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
2029   reinit_cxx_pp ();
2030   dump_decl (fndecl, flags);
2031   return pp_formatted_text (cxx_pp);
2032 }
2033
2034
2035 static const char *
2036 code_to_string (enum tree_code c)
2037 {
2038   return tree_code_name [c];
2039 }
2040
2041 const char *
2042 language_to_string (enum languages c)
2043 {
2044   switch (c)
2045     {
2046     case lang_c:
2047       return "C";
2048
2049     case lang_cplusplus:
2050       return "C++";
2051
2052     case lang_java:
2053       return "Java";
2054
2055     default:
2056       gcc_unreachable ();
2057     }
2058   return NULL;
2059 }
2060
2061 /* Return the proper printed version of a parameter to a C++ function.  */
2062
2063 static const char *
2064 parm_to_string (int p)
2065 {
2066   reinit_cxx_pp ();
2067   if (p < 0)
2068     pp_string (cxx_pp, "'this'");
2069   else
2070     pp_decimal_int (cxx_pp, p + 1);
2071   return pp_formatted_text (cxx_pp);
2072 }
2073
2074 static const char *
2075 op_to_string (enum tree_code p)
2076 {
2077   tree id = operator_name_info[(int) p].identifier;
2078   return id ? IDENTIFIER_POINTER (id) : "<unknown>";
2079 }
2080
2081 static const char *
2082 type_to_string (tree typ, int verbose)
2083 {
2084   int flags = 0;
2085   if (verbose)
2086     flags |= TFF_CLASS_KEY_OR_ENUM;
2087   flags |= TFF_TEMPLATE_HEADER;
2088
2089   reinit_cxx_pp ();
2090   dump_type (typ, flags);
2091   return pp_formatted_text (cxx_pp);
2092 }
2093
2094 static const char *
2095 assop_to_string (enum tree_code p)
2096 {
2097   tree id = assignment_operator_name_info[(int) p].identifier;
2098   return id ? IDENTIFIER_POINTER (id) : "{unknown}";
2099 }
2100
2101 static const char *
2102 args_to_string (tree p, int verbose)
2103 {
2104   int flags = 0;
2105   if (verbose)
2106     flags |= TFF_CLASS_KEY_OR_ENUM;
2107
2108   if (p == NULL_TREE)
2109     return "";
2110
2111   if (TYPE_P (TREE_VALUE (p)))
2112     return type_as_string (p, flags);
2113
2114   reinit_cxx_pp ();
2115   for (; p; p = TREE_CHAIN (p))
2116     {
2117       if (TREE_VALUE (p) == null_node)
2118         pp_cxx_identifier (cxx_pp, "NULL");
2119       else
2120         dump_type (error_type (TREE_VALUE (p)), flags);
2121       if (TREE_CHAIN (p))
2122         pp_separate_with_comma (cxx_pp);
2123     }
2124   return pp_formatted_text (cxx_pp);
2125 }
2126
2127 static const char *
2128 cv_to_string (tree p, int v)
2129 {
2130   reinit_cxx_pp ();
2131   pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2132   pp_cxx_cv_qualifier_seq (cxx_pp, p);
2133   return pp_formatted_text (cxx_pp);
2134 }
2135
2136 /* Langhook for print_error_function.  */
2137 void
2138 cxx_print_error_function (diagnostic_context *context, const char *file)
2139 {
2140   lhd_print_error_function (context, file);
2141   pp_base_set_prefix (context->printer, file);
2142   maybe_print_instantiation_context (context);
2143 }
2144
2145 static void
2146 cp_diagnostic_starter (diagnostic_context *context,
2147                        diagnostic_info *diagnostic)
2148 {
2149   diagnostic_report_current_module (context);
2150   cp_print_error_function (context, diagnostic);
2151   maybe_print_instantiation_context (context);
2152   pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
2153 }
2154
2155 static void
2156 cp_diagnostic_finalizer (diagnostic_context *context,
2157                          diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
2158 {
2159   pp_base_destroy_prefix (context->printer);
2160 }
2161
2162 /* Print current function onto BUFFER, in the process of reporting
2163    a diagnostic message.  Called from cp_diagnostic_starter.  */
2164 static void
2165 cp_print_error_function (diagnostic_context *context,
2166                          diagnostic_info *diagnostic)
2167 {
2168   if (diagnostic_last_function_changed (context))
2169     {
2170       const char *old_prefix = context->printer->prefix;
2171       const char *file = LOCATION_FILE (diagnostic->location);
2172       char *new_prefix = file ? file_name_as_prefix (file) : NULL;
2173
2174       pp_base_set_prefix (context->printer, new_prefix);
2175
2176       if (current_function_decl == NULL)
2177         pp_base_string (context->printer, "At global scope:");
2178       else
2179         pp_printf (context->printer, "In %s %qs:",
2180                    function_category (current_function_decl),
2181                    cxx_printable_name (current_function_decl, 2));
2182       pp_base_newline (context->printer);
2183
2184       diagnostic_set_last_function (context);
2185       pp_base_destroy_prefix (context->printer);
2186       context->printer->prefix = old_prefix;
2187     }
2188 }
2189
2190 /* Returns a description of FUNCTION using standard terminology.  */
2191 static const char *
2192 function_category (tree fn)
2193 {
2194   if (DECL_FUNCTION_MEMBER_P (fn))
2195     {
2196       if (DECL_STATIC_FUNCTION_P (fn))
2197         return "static member function";
2198       else if (DECL_COPY_CONSTRUCTOR_P (fn))
2199         return "copy constructor";
2200       else if (DECL_CONSTRUCTOR_P (fn))
2201         return "constructor";
2202       else if (DECL_DESTRUCTOR_P (fn))
2203         return "destructor";
2204       else
2205         return "member function";
2206     }
2207   else
2208     return "function";
2209 }
2210
2211 /* Report the full context of a current template instantiation,
2212    onto BUFFER.  */
2213 static void
2214 print_instantiation_full_context (diagnostic_context *context)
2215 {
2216   tree p = current_instantiation ();
2217   location_t location = input_location;
2218
2219   if (p)
2220     {
2221       if (current_function_decl != TINST_DECL (p)
2222           && current_function_decl != NULL_TREE)
2223         /* We can get here during the processing of some synthesized
2224            method.  Then, TINST_DECL (p) will be the function that's causing
2225            the synthesis.  */
2226         ;
2227       else
2228         {
2229           if (current_function_decl == TINST_DECL (p))
2230             /* Avoid redundancy with the "In function" line.  */;
2231           else
2232             pp_verbatim (context->printer,
2233                          "%s: In instantiation of %qs:\n",
2234                          LOCATION_FILE (location),
2235                          decl_as_string (TINST_DECL (p),
2236                                          TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2237
2238           location = TINST_LOCATION (p);
2239           p = TREE_CHAIN (p);
2240         }
2241     }
2242
2243   print_instantiation_partial_context (context, p, location);
2244 }
2245
2246 /* Same as above but less verbose.  */
2247 static void
2248 print_instantiation_partial_context (diagnostic_context *context,
2249                                      tree t, location_t loc)
2250 {
2251   expanded_location xloc;
2252   for (; ; t = TREE_CHAIN (t))
2253     {
2254       xloc = expand_location (loc);
2255       if (t == NULL_TREE)
2256         break;
2257       pp_verbatim (context->printer, "%s:%d:   instantiated from %qs\n",
2258                    xloc.file, xloc.line,
2259                    decl_as_string (TINST_DECL (t),
2260                                    TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
2261       loc = TINST_LOCATION (t);
2262     }
2263   pp_verbatim (context->printer, "%s:%d:   instantiated from here",
2264                xloc.file, xloc.line);
2265   pp_base_newline (context->printer);
2266 }
2267
2268 /* Called from cp_thing to print the template context for an error.  */
2269 static void
2270 maybe_print_instantiation_context (diagnostic_context *context)
2271 {
2272   if (!problematic_instantiation_changed () || current_instantiation () == 0)
2273     return;
2274
2275   record_last_problematic_instantiation ();
2276   print_instantiation_full_context (context);
2277 }
2278
2279 /* Report the bare minimum context of a template instantiation.  */
2280 void
2281 print_instantiation_context (void)
2282 {
2283   print_instantiation_partial_context
2284     (global_dc, current_instantiation (), input_location);
2285   diagnostic_flush_buffer (global_dc);
2286 }
2287 \f
2288 /* Called from output_format -- during diagnostic message processing --
2289    to handle C++ specific format specifier with the following meanings:
2290    %A   function argument-list.
2291    %C   tree code.
2292    %D   declaration.
2293    %E   expression.
2294    %F   function declaration.
2295    %L   language as used in extern "lang".
2296    %O   binary operator.
2297    %P   function parameter whose position is indicated by an integer.
2298    %Q   assignment operator.
2299    %T   type.
2300    %V   cv-qualifier.  */
2301 static bool
2302 cp_printer (pretty_printer *pp, text_info *text, const char *spec,
2303             int precision, bool wide, bool set_locus, bool verbose)
2304 {
2305   const char *result;
2306   tree t = NULL;
2307 #define next_tree    (t = va_arg (*text->args_ptr, tree))
2308 #define next_tcode   va_arg (*text->args_ptr, enum tree_code)
2309 #define next_lang    va_arg (*text->args_ptr, enum languages)
2310 #define next_int     va_arg (*text->args_ptr, int)
2311
2312   if (precision != 0 || wide)
2313     return false;
2314
2315   if (text->locus == NULL)
2316     set_locus = false;
2317
2318   switch (*spec)
2319     {
2320     case 'A': result = args_to_string (next_tree, verbose);     break;
2321     case 'C': result = code_to_string (next_tcode);             break;
2322     case 'D': result = decl_to_string (next_tree, verbose);     break;
2323     case 'E': result = expr_to_string (next_tree);              break;
2324     case 'F': result = fndecl_to_string (next_tree, verbose);   break;
2325     case 'L': result = language_to_string (next_lang);          break;
2326     case 'O': result = op_to_string (next_tcode);               break;
2327     case 'P': result = parm_to_string (next_int);               break;
2328     case 'Q': result = assop_to_string (next_tcode);            break;
2329     case 'T': result = type_to_string (next_tree, verbose);     break;
2330     case 'V': result = cv_to_string (next_tree, verbose);       break;
2331
2332     default:
2333       return false;
2334     }
2335
2336   pp_base_string (pp, result);
2337   if (set_locus && t != NULL)
2338     *text->locus = location_of (t);
2339   return true;
2340 #undef next_tree
2341 #undef next_tcode
2342 #undef next_lang
2343 #undef next_int
2344 }
2345 \f
2346 /* Callback from cpp_error for PFILE to print diagnostics arising from
2347    interpreting strings.  The diagnostic is of type LEVEL; MSG is the
2348    translated message and AP the arguments.  */
2349
2350 void
2351 cp_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
2352               const char *msg, va_list *ap)
2353 {
2354   diagnostic_info diagnostic;
2355   diagnostic_t dlevel;
2356   switch (level)
2357     {
2358     case CPP_DL_WARNING:
2359     case CPP_DL_WARNING_SYSHDR:
2360       dlevel = DK_WARNING;
2361       break;
2362     case CPP_DL_PEDWARN:
2363       dlevel = pedantic_error_kind ();
2364       break;
2365     case CPP_DL_ERROR:
2366       dlevel = DK_ERROR;
2367       break;
2368     case CPP_DL_ICE:
2369       dlevel = DK_ICE;
2370       break;
2371     default:
2372       gcc_unreachable ();
2373     }
2374   diagnostic_set_info_translated (&diagnostic, msg, ap,
2375                                   input_location, dlevel);
2376   report_diagnostic (&diagnostic);
2377 }