OSDN Git Service

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