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