OSDN Git Service

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