OSDN Git Service

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