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