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