OSDN Git Service

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