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