OSDN Git Service

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