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