]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/error.c
invoke.texi (Darwin Options): Improve description of how the subtype is chosen.
[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
c81f61b2 275 case TREE_BINFO:
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))
17a27b4f 1346 dump_type (DECL_CONTEXT (fn), flags);
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:
ba52691c 1466 case RDIV_EXPR:
9e93bc9d 1467 dump_binary_op ("/", t, flags);
8d08fdba
MS
1468 break;
1469
1470 case CEIL_MOD_EXPR:
1471 case FLOOR_MOD_EXPR:
1472 case ROUND_MOD_EXPR:
9e93bc9d 1473 dump_binary_op ("%", t, flags);
8d08fdba
MS
1474 break;
1475
1476 case COMPONENT_REF:
1477 {
1478 tree ob = TREE_OPERAND (t, 0);
1479 if (TREE_CODE (ob) == INDIRECT_REF)
1480 {
1481 ob = TREE_OPERAND (ob, 0);
1482 if (TREE_CODE (ob) != PARM_DECL
1483 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
1484 {
761f0855 1485 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
73bbafe5 1486 pp_cxx_arrow (cxx_pp);
8d08fdba
MS
1487 }
1488 }
1489 else
1490 {
761f0855 1491 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
73bbafe5 1492 pp_cxx_dot (cxx_pp);
8d08fdba 1493 }
761f0855 1494 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
8d08fdba
MS
1495 }
1496 break;
1497
28cbf42c 1498 case ARRAY_REF:
761f0855 1499 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
73bbafe5 1500 pp_cxx_left_bracket (cxx_pp);
761f0855 1501 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
73bbafe5 1502 pp_cxx_right_bracket (cxx_pp);
28cbf42c
MS
1503 break;
1504
8d08fdba 1505 case CONVERT_EXPR:
03da5286 1506 if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
df39af7d 1507 {
73bbafe5 1508 pp_cxx_left_paren (cxx_pp);
b72801e2 1509 dump_type (TREE_TYPE (t), flags);
73bbafe5 1510 pp_cxx_right_paren (cxx_pp);
9e93bc9d 1511 dump_expr (TREE_OPERAND (t, 0), flags);
df39af7d
JM
1512 }
1513 else
9e93bc9d 1514 dump_unary_op ("+", t, flags);
8d08fdba
MS
1515 break;
1516
1517 case ADDR_EXPR:
1518 if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
fd74ca0b
MM
1519 || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST
1520 /* An ADDR_EXPR can have reference type. In that case, we
1521 shouldn't print the `&' doing so indicates to the user
1522 that the expression has pointer type. */
bb20cc46 1523 || (TREE_TYPE (t)
fd74ca0b 1524 && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
761f0855 1525 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
8d08fdba 1526 else
9e93bc9d 1527 dump_unary_op ("&", t, flags);
8d08fdba
MS
1528 break;
1529
1530 case INDIRECT_REF:
1531 if (TREE_HAS_CONSTRUCTOR (t))
1532 {
1533 t = TREE_OPERAND (t, 0);
50bc768d 1534 gcc_assert (TREE_CODE (t) == CALL_EXPR);
761f0855 1535 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
73bbafe5 1536 pp_cxx_left_paren (cxx_pp);
9e93bc9d 1537 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)), flags);
73bbafe5 1538 pp_cxx_right_paren (cxx_pp);
8d08fdba
MS
1539 }
1540 else
1541 {
6467930b 1542 if (TREE_OPERAND (t,0) != NULL_TREE
5082a355 1543 && TREE_TYPE (TREE_OPERAND (t, 0))
6467930b 1544 && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)
9e93bc9d 1545 dump_expr (TREE_OPERAND (t, 0), flags);
8d08fdba 1546 else
9e93bc9d 1547 dump_unary_op ("*", t, flags);
8d08fdba
MS
1548 }
1549 break;
1550
1551 case NEGATE_EXPR:
1552 case BIT_NOT_EXPR:
1553 case TRUTH_NOT_EXPR:
1554 case PREDECREMENT_EXPR:
1555 case PREINCREMENT_EXPR:
596ea4e5 1556 dump_unary_op (operator_name_info [(int)TREE_CODE (t)].name, t, flags);
8d08fdba
MS
1557 break;
1558
1559 case POSTDECREMENT_EXPR:
1560 case POSTINCREMENT_EXPR:
73bbafe5 1561 pp_cxx_left_paren (cxx_pp);
761f0855 1562 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
73bbafe5
GDR
1563 pp_cxx_identifier (cxx_pp, operator_name_info[(int)TREE_CODE (t)].name);
1564 pp_cxx_right_paren (cxx_pp);
8d08fdba
MS
1565 break;
1566
1567 case NON_LVALUE_EXPR:
1568 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1569 should be another level of INDIRECT_REF so that I don't have to do
1570 this. */
6467930b 1571 if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE)
8d08fdba
MS
1572 {
1573 tree next = TREE_TYPE (TREE_TYPE (t));
1574
1575 while (TREE_CODE (next) == POINTER_TYPE)
1576 next = TREE_TYPE (next);
bb20cc46 1577
8d08fdba
MS
1578 if (TREE_CODE (next) == FUNCTION_TYPE)
1579 {
761f0855 1580 if (flags & TFF_EXPR_IN_PARENS)
73bbafe5
GDR
1581 pp_cxx_left_paren (cxx_pp);
1582 pp_cxx_star (cxx_pp);
761f0855
GDR
1583 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1584 if (flags & TFF_EXPR_IN_PARENS)
73bbafe5 1585 pp_cxx_right_paren (cxx_pp);
8d08fdba
MS
1586 break;
1587 }
f4f206f4 1588 /* Else fall through. */
8d08fdba 1589 }
761f0855 1590 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
8d08fdba
MS
1591 break;
1592
1593 case NOP_EXPR:
ffc76561
NS
1594 {
1595 tree op = TREE_OPERAND (t, 0);
1596
1597 if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
1598 {
1599 /* It is a cast, but we cannot tell whether it is a
1600 reinterpret or static cast. Use the C style notation. */
1601 if (flags & TFF_EXPR_IN_PARENS)
73bbafe5
GDR
1602 pp_cxx_left_paren (cxx_pp);
1603 pp_cxx_left_paren (cxx_pp);
ffc76561 1604 dump_type (TREE_TYPE (t), flags);
73bbafe5 1605 pp_cxx_right_paren (cxx_pp);
ffc76561
NS
1606 dump_expr (op, flags | TFF_EXPR_IN_PARENS);
1607 if (flags & TFF_EXPR_IN_PARENS)
73bbafe5 1608 pp_cxx_right_paren (cxx_pp);
ffc76561
NS
1609 }
1610 else
1611 dump_expr (op, flags);
1612 break;
1613 }
1614
8d08fdba 1615 case CONSTRUCTOR:
9a3b49ac
MS
1616 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
1617 {
50ad9642 1618 tree idx = build_ptrmemfunc_access_expr (t, pfn_identifier);
9a3b49ac 1619
c4372ef4 1620 if (integer_zerop (idx))
e08a8f45
MM
1621 {
1622 /* A NULL pointer-to-member constant. */
73bbafe5
GDR
1623 pp_cxx_left_paren (cxx_pp);
1624 pp_cxx_left_paren (cxx_pp);
9e93bc9d 1625 dump_type (TREE_TYPE (t), flags);
73bbafe5
GDR
1626 pp_cxx_right_paren (cxx_pp);
1627 pp_character (cxx_pp, '0');
1628 pp_cxx_right_paren (cxx_pp);
e08a8f45
MM
1629 break;
1630 }
665f2503 1631 else if (host_integerp (idx, 0))
9a3b49ac
MS
1632 {
1633 tree virtuals;
1634 unsigned HOST_WIDE_INT n;
1635
1636 t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
1637 t = TYPE_METHOD_BASETYPE (t);
604a3205 1638 virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t)));
bb20cc46 1639
1f84ec23 1640 n = tree_low_cst (idx, 0);
9a3b49ac
MS
1641
1642 /* Map vtable index back one, to allow for the null pointer to
1643 member. */
1644 --n;
1645
1646 while (n > 0 && virtuals)
1647 {
1648 --n;
1649 virtuals = TREE_CHAIN (virtuals);
1650 }
1651 if (virtuals)
1652 {
31f8e4f3 1653 dump_expr (BV_FN (virtuals),
761f0855 1654 flags | TFF_EXPR_IN_PARENS);
9a3b49ac
MS
1655 break;
1656 }
1657 }
1658 }
f3146d75
NS
1659 if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
1660 {
1661 dump_type (TREE_TYPE (t), 0);
73bbafe5
GDR
1662 pp_cxx_left_paren (cxx_pp);
1663 pp_cxx_right_paren (cxx_pp);
f3146d75
NS
1664 }
1665 else
1666 {
73bbafe5 1667 pp_cxx_left_brace (cxx_pp);
f3146d75 1668 dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
73bbafe5 1669 pp_cxx_right_brace (cxx_pp);
f3146d75
NS
1670 }
1671
8d08fdba
MS
1672 break;
1673
51c184be
MS
1674 case OFFSET_REF:
1675 {
1676 tree ob = TREE_OPERAND (t, 0);
51924768 1677 if (is_dummy_object (ob))
61a127b3 1678 {
05e0b2f4
JM
1679 t = TREE_OPERAND (t, 1);
1680 if (TREE_CODE (t) == FUNCTION_DECL)
61a127b3 1681 /* A::f */
761f0855 1682 dump_expr (t, flags | TFF_EXPR_IN_PARENS);
05e0b2f4 1683 else if (BASELINK_P (t))
da15dae6
MM
1684 dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
1685 flags | TFF_EXPR_IN_PARENS);
61a127b3 1686 else
9e93bc9d 1687 dump_decl (t, flags);
61a127b3 1688 }
51c184be
MS
1689 else
1690 {
bbcec105
JM
1691 if (TREE_CODE (ob) == INDIRECT_REF)
1692 {
761f0855 1693 dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
73bbafe5
GDR
1694 pp_cxx_arrow (cxx_pp);
1695 pp_cxx_star (cxx_pp);
bbcec105
JM
1696 }
1697 else
1698 {
761f0855 1699 dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
73bbafe5
GDR
1700 pp_cxx_dot (cxx_pp);
1701 pp_cxx_star (cxx_pp);
bbcec105 1702 }
761f0855 1703 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
51c184be
MS
1704 }
1705 break;
1706 }
1707
f84b4be9 1708 case TEMPLATE_PARM_INDEX:
761f0855 1709 dump_decl (TEMPLATE_PARM_DECL (t), flags & ~TFF_DECL_SPECIFIERS);
de22184b 1710 break;
5566b478 1711
5566b478 1712 case SCOPE_REF:
3601f003 1713 pp_expression (cxx_pp, t);
5566b478
MS
1714 break;
1715
1716 case CAST_EXPR:
e349ee73
MS
1717 if (TREE_OPERAND (t, 0) == NULL_TREE
1718 || TREE_CHAIN (TREE_OPERAND (t, 0)))
e76a2646 1719 {
9e93bc9d 1720 dump_type (TREE_TYPE (t), flags);
73bbafe5 1721 pp_cxx_left_paren (cxx_pp);
9e93bc9d 1722 dump_expr_list (TREE_OPERAND (t, 0), flags);
73bbafe5 1723 pp_cxx_right_paren (cxx_pp);
e76a2646
MS
1724 }
1725 else
1726 {
73bbafe5 1727 pp_cxx_left_paren (cxx_pp);
9e93bc9d 1728 dump_type (TREE_TYPE (t), flags);
73bbafe5
GDR
1729 pp_cxx_right_paren (cxx_pp);
1730 pp_cxx_left_paren (cxx_pp);
9e93bc9d 1731 dump_expr_list (TREE_OPERAND (t, 0), flags);
73bbafe5 1732 pp_cxx_right_paren (cxx_pp);
e76a2646
MS
1733 }
1734 break;
1735
477f6664 1736 case STATIC_CAST_EXPR:
73bbafe5 1737 pp_cxx_identifier (cxx_pp, "static_cast");
477f6664
JM
1738 goto cast;
1739 case REINTERPRET_CAST_EXPR:
73bbafe5 1740 pp_cxx_identifier (cxx_pp, "reinterpret_cast");
477f6664
JM
1741 goto cast;
1742 case CONST_CAST_EXPR:
73bbafe5 1743 pp_cxx_identifier (cxx_pp, "const_cast");
477f6664
JM
1744 goto cast;
1745 case DYNAMIC_CAST_EXPR:
73bbafe5 1746 pp_cxx_identifier (cxx_pp, "dynamic_cast");
477f6664 1747 cast:
73bbafe5 1748 pp_cxx_begin_template_argument_list (cxx_pp);
477f6664 1749 dump_type (TREE_TYPE (t), flags);
73bbafe5
GDR
1750 pp_cxx_end_template_argument_list (cxx_pp);
1751 pp_cxx_left_paren (cxx_pp);
477f6664 1752 dump_expr (TREE_OPERAND (t, 0), flags);
73bbafe5 1753 pp_cxx_right_paren (cxx_pp);
477f6664
JM
1754 break;
1755
5a11e05b 1756 case ARROW_EXPR:
9e93bc9d 1757 dump_expr (TREE_OPERAND (t, 0), flags);
73bbafe5 1758 pp_cxx_arrow (cxx_pp);
5a11e05b
BK
1759 break;
1760
e76a2646 1761 case SIZEOF_EXPR:
abff8e06
JM
1762 case ALIGNOF_EXPR:
1763 if (TREE_CODE (t) == SIZEOF_EXPR)
73bbafe5 1764 pp_cxx_identifier (cxx_pp, "sizeof");
bb20cc46 1765 else
abff8e06 1766 {
50bc768d 1767 gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
73bbafe5 1768 pp_cxx_identifier (cxx_pp, "__alignof__");
abff8e06 1769 }
73bbafe5
GDR
1770 pp_cxx_whitespace (cxx_pp);
1771 pp_cxx_left_paren (cxx_pp);
2f939d94 1772 if (TYPE_P (TREE_OPERAND (t, 0)))
9e93bc9d 1773 dump_type (TREE_OPERAND (t, 0), flags);
e76a2646 1774 else
44978276 1775 dump_expr (TREE_OPERAND (t, 0), flags);
73bbafe5 1776 pp_cxx_right_paren (cxx_pp);
e76a2646 1777 break;
5566b478 1778
19948e32
GDR
1779 case REALPART_EXPR:
1780 case IMAGPART_EXPR:
73bbafe5
GDR
1781 pp_cxx_identifier (cxx_pp, operator_name_info[TREE_CODE (t)].name);
1782 pp_cxx_whitespace (cxx_pp);
19948e32
GDR
1783 dump_expr (TREE_OPERAND (t, 0), flags);
1784 break;
1785
da20811c 1786 case DEFAULT_ARG:
b6fe0bb8 1787 pp_identifier (cxx_pp, "<unparsed>");
da20811c
JM
1788 break;
1789
6748b643
JM
1790 case TRY_CATCH_EXPR:
1791 case WITH_CLEANUP_EXPR:
1792 case CLEANUP_POINT_EXPR:
9e93bc9d 1793 dump_expr (TREE_OPERAND (t, 0), flags);
6748b643
JM
1794 break;
1795
40242ccf 1796 case PSEUDO_DTOR_EXPR:
9e93bc9d 1797 dump_expr (TREE_OPERAND (t, 2), flags);
73bbafe5 1798 pp_cxx_dot (cxx_pp);
9e93bc9d 1799 dump_type (TREE_OPERAND (t, 0), flags);
73bbafe5
GDR
1800 pp_cxx_colon_colon (cxx_pp);
1801 pp_cxx_complement (cxx_pp);
9e93bc9d 1802 dump_type (TREE_OPERAND (t, 1), flags);
40242ccf
MM
1803 break;
1804
7ac7b28f 1805 case TEMPLATE_ID_EXPR:
9e93bc9d 1806 dump_decl (t, flags);
7ac7b28f
MM
1807 break;
1808
558475f0
MM
1809 case STMT_EXPR:
1810 /* We don't yet have a way of dumping statements in a
1811 human-readable format. */
b6fe0bb8 1812 pp_string (cxx_pp, "({...})");
558475f0
MM
1813 break;
1814
0045e0bc 1815 case BIND_EXPR:
73bbafe5 1816 pp_cxx_left_brace (cxx_pp);
761f0855 1817 dump_expr (TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS);
73bbafe5 1818 pp_cxx_right_brace (cxx_pp);
0045e0bc 1819 break;
bb20cc46 1820
0045e0bc 1821 case LOOP_EXPR:
b6fe0bb8 1822 pp_string (cxx_pp, "while (1) { ");
761f0855 1823 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
73bbafe5 1824 pp_cxx_right_brace (cxx_pp);
0045e0bc
MM
1825 break;
1826
1827 case EXIT_EXPR:
b6fe0bb8 1828 pp_string (cxx_pp, "if (");
761f0855 1829 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
b6fe0bb8 1830 pp_string (cxx_pp, ") break; ");
0045e0bc
MM
1831 break;
1832
a723baf1 1833 case BASELINK:
bd83b409 1834 dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
a723baf1
MM
1835 break;
1836
98ed3906
GDR
1837 case EMPTY_CLASS_EXPR:
1838 dump_type (TREE_TYPE (t), flags);
73bbafe5
GDR
1839 pp_cxx_left_paren (cxx_pp);
1840 pp_cxx_right_paren (cxx_pp);
98ed3906
GDR
1841 break;
1842
d17811fd 1843 case NON_DEPENDENT_EXPR:
018a5803 1844 dump_expr (TREE_OPERAND (t, 0), flags);
d17811fd 1845 break;
00595019 1846
8d08fdba
MS
1847 /* This list is incomplete, but should suffice for now.
1848 It is very important that `sorry' does not call
1849 `report_error_function'. That could cause an infinite loop. */
1850 default:
b6fe0bb8 1851 pp_unsupported_tree (cxx_pp, t);
8d08fdba
MS
1852 /* fall through to ERROR_MARK... */
1853 case ERROR_MARK:
b6fe0bb8 1854 pp_identifier (cxx_pp, "<expression error>");
8d08fdba
MS
1855 break;
1856 }
1857}
1858
1859static void
3f8548e7 1860dump_binary_op (const char *opstring, tree t, int flags)
8d08fdba 1861{
73bbafe5 1862 pp_cxx_left_paren (cxx_pp);
761f0855 1863 dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
73bbafe5 1864 pp_cxx_whitespace (cxx_pp);
2adeacc9 1865 if (opstring)
73bbafe5 1866 pp_cxx_identifier (cxx_pp, opstring);
2adeacc9 1867 else
b6fe0bb8 1868 pp_identifier (cxx_pp, "<unknown operator>");
73bbafe5 1869 pp_cxx_whitespace (cxx_pp);
761f0855 1870 dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
73bbafe5 1871 pp_cxx_right_paren (cxx_pp);
8d08fdba
MS
1872}
1873
1874static void
3f8548e7 1875dump_unary_op (const char *opstring, tree t, int flags)
8d08fdba 1876{
761f0855 1877 if (flags & TFF_EXPR_IN_PARENS)
73bbafe5
GDR
1878 pp_cxx_left_paren (cxx_pp);
1879 pp_cxx_identifier (cxx_pp, opstring);
761f0855
GDR
1880 dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
1881 if (flags & TFF_EXPR_IN_PARENS)
73bbafe5 1882 pp_cxx_right_paren (cxx_pp);
8d08fdba
MS
1883}
1884
73bbafe5
GDR
1885static void
1886reinit_cxx_pp (void)
1887{
1888 pp_clear_output_area (cxx_pp);
1889 pp_base (cxx_pp)->padding = pp_none;
1890 pp_indentation (cxx_pp) = 0;
1891 pp_needs_newline (cxx_pp) = false;
1892 cxx_pp->enclosing_scope = 0;
1893}
1894
1895
761f0855 1896/* Exported interface to stringifying types, exprs and decls under TFF_*
9e93bc9d 1897 control. */
4995028c 1898
e1def31b 1899const char *
3f8548e7 1900type_as_string (tree typ, int flags)
8d08fdba 1901{
73bbafe5 1902 reinit_cxx_pp ();
9e93bc9d 1903 dump_type (typ, flags);
b6fe0bb8 1904 return pp_formatted_text (cxx_pp);
8d08fdba
MS
1905}
1906
e1def31b 1907const char *
3f8548e7 1908expr_as_string (tree decl, int flags)
8d08fdba 1909{
73bbafe5 1910 reinit_cxx_pp ();
9e93bc9d 1911 dump_expr (decl, flags);
b6fe0bb8 1912 return pp_formatted_text (cxx_pp);
8d08fdba
MS
1913}
1914
e1def31b 1915const char *
3f8548e7 1916decl_as_string (tree decl, int flags)
8d08fdba 1917{
73bbafe5 1918 reinit_cxx_pp ();
9e93bc9d 1919 dump_decl (decl, flags);
b6fe0bb8 1920 return pp_formatted_text (cxx_pp);
8d08fdba
MS
1921}
1922
e1def31b 1923const char *
3f8548e7 1924context_as_string (tree context, int flags)
8d08fdba 1925{
73bbafe5 1926 reinit_cxx_pp ();
9e93bc9d 1927 dump_scope (context, flags);
b6fe0bb8 1928 return pp_formatted_text (cxx_pp);
8d08fdba
MS
1929}
1930
7afff7cf 1931/* Generate the three forms of printable names for cxx_printable_name. */
2ba25f50 1932
e1def31b 1933const char *
3f8548e7 1934lang_decl_name (tree decl, int v)
2ba25f50
MS
1935{
1936 if (v >= 2)
761f0855 1937 return decl_as_string (decl, TFF_DECL_SPECIFIERS);
2ba25f50 1938
73bbafe5 1939 reinit_cxx_pp ();
6eb3bb27 1940 if (v == 1 && DECL_CLASS_SCOPE_P (decl))
2ba25f50 1941 {
761f0855 1942 dump_type (CP_DECL_CONTEXT (decl), TFF_PLAIN_IDENTIFIER);
73bbafe5 1943 pp_cxx_colon_colon (cxx_pp);
2ba25f50
MS
1944 }
1945
1946 if (TREE_CODE (decl) == FUNCTION_DECL)
761f0855 1947 dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
2ba25f50 1948 else
761f0855 1949 dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
2ba25f50 1950
b6fe0bb8 1951 return pp_formatted_text (cxx_pp);
2ba25f50 1952}
2ba25f50 1953
9a472a42
NS
1954static location_t
1955location_of (tree t)
8d08fdba 1956{
741f2839 1957 if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t))
9a472a42 1958 t = DECL_CONTEXT (t);
2f939d94 1959 else if (TYPE_P (t))
9a472a42 1960 t = TYPE_MAIN_DECL (t);
8f032717 1961 else if (TREE_CODE (t) == OVERLOAD)
9a472a42
NS
1962 t = OVL_FUNCTION (t);
1963
f31686a3 1964 return DECL_SOURCE_LOCATION (t);
8d08fdba
MS
1965}
1966
33bd39a2 1967/* Now the interfaces from error et al to dump_type et al. Each takes an
761f0855 1968 on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_
9e93bc9d
NS
1969 function. */
1970
1971static const char *
3f8548e7 1972decl_to_string (tree decl, int verbose)
9e93bc9d 1973{
761f0855 1974 int flags = 0;
d67cdbc3 1975
9e93bc9d
NS
1976 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == RECORD_TYPE
1977 || TREE_CODE (decl) == UNION_TYPE || TREE_CODE (decl) == ENUMERAL_TYPE)
761f0855 1978 flags = TFF_CLASS_KEY_OR_ENUM;
9e93bc9d 1979 if (verbose)
4a386498 1980 flags |= TFF_DECL_SPECIFIERS;
9e93bc9d 1981 else if (TREE_CODE (decl) == FUNCTION_DECL)
761f0855
GDR
1982 flags |= TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE;
1983 flags |= TFF_TEMPLATE_HEADER;
bb20cc46 1984
73bbafe5 1985 reinit_cxx_pp ();
9e93bc9d 1986 dump_decl (decl, flags);
b6fe0bb8 1987 return pp_formatted_text (cxx_pp);
9e93bc9d
NS
1988}
1989
1990static const char *
4e3f84b7 1991expr_to_string (tree decl)
9e93bc9d 1992{
73bbafe5 1993 reinit_cxx_pp ();
9e93bc9d 1994 dump_expr (decl, 0);
b6fe0bb8 1995 return pp_formatted_text (cxx_pp);
9e93bc9d
NS
1996}
1997
1998static const char *
3f8548e7 1999fndecl_to_string (tree fndecl, int verbose)
9e93bc9d 2000{
761f0855 2001 int flags;
bb20cc46 2002
761f0855 2003 flags = TFF_EXCEPTION_SPECIFICATION | TFF_DECL_SPECIFIERS;
9e93bc9d 2004 if (verbose)
761f0855 2005 flags |= TFF_FUNCTION_DEFAULT_ARGUMENTS;
73bbafe5 2006 reinit_cxx_pp ();
9e93bc9d 2007 dump_decl (fndecl, flags);
b6fe0bb8 2008 return pp_formatted_text (cxx_pp);
9e93bc9d
NS
2009}
2010
2011
2012static const char *
4e3f84b7 2013code_to_string (enum tree_code c)
8d08fdba
MS
2014{
2015 return tree_code_name [c];
2016}
2017
421844e7 2018const char *
4e3f84b7 2019language_to_string (enum languages c)
8d08fdba
MS
2020{
2021 switch (c)
2022 {
2023 case lang_c:
2024 return "C";
2025
2026 case lang_cplusplus:
2027 return "C++";
2028
31b72b87
PB
2029 case lang_java:
2030 return "Java";
2031
8d08fdba 2032 default:
8dc2b103 2033 gcc_unreachable ();
8d08fdba 2034 }
8dc2b103 2035 return 0;
8d08fdba
MS
2036}
2037
2038/* Return the proper printed version of a parameter to a C++ function. */
e92cc029 2039
9e93bc9d 2040static const char *
4e3f84b7 2041parm_to_string (int p)
8d08fdba 2042{
73bbafe5 2043 reinit_cxx_pp ();
8d08fdba 2044 if (p < 0)
b6fe0bb8 2045 pp_string (cxx_pp, "'this'");
4e3f84b7 2046 else
b6fe0bb8
GDR
2047 pp_decimal_int (cxx_pp, p + 1);
2048 return pp_formatted_text (cxx_pp);
8d08fdba
MS
2049}
2050
9e93bc9d 2051static const char *
4e3f84b7 2052op_to_string (enum tree_code p)
8d08fdba 2053{
b6fe0bb8 2054 tree id = operator_name_info[(int) p].identifier;
4e3f84b7 2055 return id ? IDENTIFIER_POINTER (id) : "<unknown>";
8d08fdba
MS
2056}
2057
9e93bc9d 2058static const char *
3f8548e7 2059type_to_string (tree typ, int verbose)
9e93bc9d 2060{
b6fe0bb8 2061 int flags = 0;
9e93bc9d 2062 if (verbose)
761f0855
GDR
2063 flags |= TFF_CLASS_KEY_OR_ENUM;
2064 flags |= TFF_TEMPLATE_HEADER;
bb20cc46 2065
73bbafe5 2066 reinit_cxx_pp ();
9e93bc9d 2067 dump_type (typ, flags);
b6fe0bb8 2068 return pp_formatted_text (cxx_pp);
9e93bc9d
NS
2069}
2070
2071static const char *
4e3f84b7 2072assop_to_string (enum tree_code p)
c91a56d2 2073{
b6fe0bb8 2074 tree id = assignment_operator_name_info[(int) p].identifier;
596ea4e5 2075 return id ? IDENTIFIER_POINTER (id) : "{unknown}";
c91a56d2
MS
2076}
2077
9e93bc9d 2078static const char *
3f8548e7 2079args_to_string (tree p, int verbose)
8d08fdba 2080{
761f0855 2081 int flags = 0;
9e93bc9d 2082 if (verbose)
761f0855 2083 flags |= TFF_CLASS_KEY_OR_ENUM;
bb20cc46 2084
8d08fdba 2085 if (p == NULL_TREE)
c73964b2 2086 return "";
8d08fdba 2087
2f939d94 2088 if (TYPE_P (TREE_VALUE (p)))
9e93bc9d 2089 return type_as_string (p, flags);
c73964b2 2090
73bbafe5 2091 reinit_cxx_pp ();
c73964b2
MS
2092 for (; p; p = TREE_CHAIN (p))
2093 {
a6967cc0 2094 if (TREE_VALUE (p) == null_node)
73bbafe5 2095 pp_cxx_identifier (cxx_pp, "NULL");
a6967cc0 2096 else
9e93bc9d 2097 dump_type (error_type (TREE_VALUE (p)), flags);
c73964b2 2098 if (TREE_CHAIN (p))
b6fe0bb8 2099 pp_separate_with_comma (cxx_pp);
c73964b2 2100 }
b6fe0bb8 2101 return pp_formatted_text (cxx_pp);
8d08fdba 2102}
f30432d7 2103
9e93bc9d 2104static const char *
3f8548e7 2105cv_to_string (tree p, int v)
f30432d7 2106{
73bbafe5 2107 reinit_cxx_pp ();
b9b44fb9
GDR
2108 pp_base (cxx_pp)->padding = v ? pp_before : pp_none;
2109 pp_cxx_cv_qualifier_seq (cxx_pp, p);
b6fe0bb8 2110 return pp_formatted_text (cxx_pp);
f30432d7 2111}
cb753e49 2112
7cb32822
NB
2113/* Langhook for print_error_function. */
2114void
3f8548e7 2115cxx_print_error_function (diagnostic_context *context, const char *file)
a72462a4 2116{
7cb32822 2117 lhd_print_error_function (context, file);
e1a4dd13 2118 pp_base_set_prefix (context->printer, file);
47b69537 2119 maybe_print_instantiation_context (context);
a72462a4
GDR
2120}
2121
cb753e49 2122static void
3f8548e7
GDR
2123cp_diagnostic_starter (diagnostic_context *context,
2124 diagnostic_info *diagnostic)
cb753e49 2125{
47b69537
GDR
2126 diagnostic_report_current_module (context);
2127 cp_print_error_function (context, diagnostic);
2128 maybe_print_instantiation_context (context);
e1a4dd13 2129 pp_base_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
cb753e49
GDR
2130}
2131
2132static void
3f8548e7
GDR
2133cp_diagnostic_finalizer (diagnostic_context *context,
2134 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
cb753e49 2135{
e1a4dd13 2136 pp_base_destroy_prefix (context->printer);
cb753e49
GDR
2137}
2138
2139/* Print current function onto BUFFER, in the process of reporting
2140 a diagnostic message. Called from cp_diagnostic_starter. */
2141static void
3f8548e7
GDR
2142cp_print_error_function (diagnostic_context *context,
2143 diagnostic_info *diagnostic)
cb753e49 2144{
47b69537 2145 if (diagnostic_last_function_changed (context))
cb753e49 2146 {
b6fe0bb8 2147 const char *old_prefix = context->printer->prefix;
93409b8c
PB
2148 const char *file = LOCATION_FILE (diagnostic->location);
2149 char *new_prefix = file ? file_name_as_prefix (file) : NULL;
cb753e49 2150
e1a4dd13 2151 pp_base_set_prefix (context->printer, new_prefix);
bb20cc46 2152
cb753e49 2153 if (current_function_decl == NULL)
e1a4dd13 2154 pp_base_string (context->printer, "At global scope:");
cb753e49 2155 else
b6fe0bb8
GDR
2156 pp_printf (context->printer, "In %s `%s':",
2157 function_category (current_function_decl),
2158 cxx_printable_name (current_function_decl, 2));
e1a4dd13 2159 pp_base_newline (context->printer);
47b69537
GDR
2160
2161 diagnostic_set_last_function (context);
e1a4dd13 2162 pp_base_destroy_prefix (context->printer);
b6fe0bb8 2163 context->printer->prefix = old_prefix;
cb753e49
GDR
2164 }
2165}
2166
2167/* Returns a description of FUNCTION using standard terminology. */
2168static const char *
3f8548e7 2169function_category (tree fn)
cb753e49
GDR
2170{
2171 if (DECL_FUNCTION_MEMBER_P (fn))
2172 {
2173 if (DECL_STATIC_FUNCTION_P (fn))
2174 return "static member function";
2175 else if (DECL_COPY_CONSTRUCTOR_P (fn))
2176 return "copy constructor";
2177 else if (DECL_CONSTRUCTOR_P (fn))
2178 return "constructor";
2179 else if (DECL_DESTRUCTOR_P (fn))
2180 return "destructor";
2181 else
2182 return "member function";
2183 }
2184 else
2185 return "function";
2186}
2187
2188/* Report the full context of a current template instantiation,
2189 onto BUFFER. */
2190static void
3f8548e7 2191print_instantiation_full_context (diagnostic_context *context)
cb753e49
GDR
2192{
2193 tree p = current_instantiation ();
82a98427
NS
2194 location_t location = input_location;
2195
cb753e49
GDR
2196 if (p)
2197 {
2198 if (current_function_decl != TINST_DECL (p)
2199 && current_function_decl != NULL_TREE)
2200 /* We can get here during the processing of some synthesized
2201 method. Then, TINST_DECL (p) will be the function that's causing
2202 the synthesis. */
2203 ;
2204 else
2205 {
2206 if (current_function_decl == TINST_DECL (p))
2207 /* Avoid redundancy with the the "In function" line. */;
bb20cc46 2208 else
b6fe0bb8 2209 pp_verbatim (context->printer,
93409b8c
PB
2210 "%s: In instantiation of `%s':\n",
2211 LOCATION_FILE (location),
b6fe0bb8
GDR
2212 decl_as_string (TINST_DECL (p),
2213 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
bb20cc46 2214
406d77a4 2215 location = TINST_LOCATION (p);
cb753e49
GDR
2216 p = TREE_CHAIN (p);
2217 }
2218 }
bb20cc46 2219
35773471 2220 print_instantiation_partial_context (context, p, location);
cb753e49
GDR
2221}
2222
2223/* Same as above but less verbose. */
2224static void
3f8548e7 2225print_instantiation_partial_context (diagnostic_context *context,
35773471 2226 tree t, location_t loc)
cb753e49 2227{
93409b8c
PB
2228 expanded_location xloc;
2229 for (; ; t = TREE_CHAIN (t))
cb753e49 2230 {
93409b8c
PB
2231 xloc = expand_location (loc);
2232 if (t == NULL_TREE)
2233 break;
b6fe0bb8 2234 pp_verbatim (context->printer, "%s:%d: instantiated from `%s'\n",
93409b8c 2235 xloc.file, xloc.line,
b6fe0bb8
GDR
2236 decl_as_string (TINST_DECL (t),
2237 TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
406d77a4 2238 loc = TINST_LOCATION (t);
cb753e49 2239 }
b6fe0bb8 2240 pp_verbatim (context->printer, "%s:%d: instantiated from here\n",
93409b8c 2241 xloc.file, xloc.line);
cb753e49
GDR
2242}
2243
2244/* Called from cp_thing to print the template context for an error. */
2245static void
3f8548e7 2246maybe_print_instantiation_context (diagnostic_context *context)
cb753e49
GDR
2247{
2248 if (!problematic_instantiation_changed () || current_instantiation () == 0)
2249 return;
2250
2251 record_last_problematic_instantiation ();
47b69537 2252 print_instantiation_full_context (context);
cb753e49
GDR
2253}
2254
2255/* Report the bare minimum context of a template instantiation. */
2256void
3f8548e7 2257print_instantiation_context (void)
cb753e49
GDR
2258{
2259 print_instantiation_partial_context
35773471 2260 (global_dc, current_instantiation (), input_location);
47b69537 2261 diagnostic_flush_buffer (global_dc);
cb753e49 2262}
a1066c99
GDR
2263\f
2264/* Called from output_format -- during diagnostic message processing --
2265 to handle C++ specific format specifier with the following meanings:
2266 %A function argument-list.
749ced52 2267 %C tree code.
a1066c99
GDR
2268 %D declaration.
2269 %E expression.
2270 %F function declaration.
749ced52
ZW
2271 %L language as used in extern "lang".
2272 %O binary operator.
a1066c99 2273 %P function parameter whose position is indicated by an integer.
749ced52 2274 %Q assignment operator.
a1066c99
GDR
2275 %T type.
2276 %V cv-qualifier. */
47b69537 2277static bool
b6fe0bb8 2278cp_printer (pretty_printer *pp, text_info *text)
a1066c99 2279{
749ced52
ZW
2280 int verbose = 0;
2281 const char *result;
47b69537
GDR
2282#define next_tree va_arg (*text->args_ptr, tree)
2283#define next_tcode va_arg (*text->args_ptr, enum tree_code)
2284#define next_lang va_arg (*text->args_ptr, enum languages)
2285#define next_int va_arg (*text->args_ptr, int)
2286
2287 if (*text->format_spec == '+')
2288 ++text->format_spec;
2289 if (*text->format_spec == '#')
a1066c99 2290 {
749ced52 2291 verbose = 1;
47b69537 2292 ++text->format_spec;
a1066c99
GDR
2293 }
2294
47b69537 2295 switch (*text->format_spec)
22a4158c 2296 {
749ced52 2297 case 'A': result = args_to_string (next_tree, verbose); break;
4e3f84b7 2298 case 'C': result = code_to_string (next_tcode); break;
749ced52 2299 case 'D': result = decl_to_string (next_tree, verbose); break;
4e3f84b7 2300 case 'E': result = expr_to_string (next_tree); break;
749ced52 2301 case 'F': result = fndecl_to_string (next_tree, verbose); break;
4e3f84b7
GDR
2302 case 'L': result = language_to_string (next_lang); break;
2303 case 'O': result = op_to_string (next_tcode); break;
2304 case 'P': result = parm_to_string (next_int); break;
2305 case 'Q': result = assop_to_string (next_tcode); break;
749ced52
ZW
2306 case 'T': result = type_to_string (next_tree, verbose); break;
2307 case 'V': result = cv_to_string (next_tree, verbose); break;
2308
22a4158c 2309 default:
47b69537 2310 return false;
a1066c99 2311 }
bb20cc46 2312
e1a4dd13 2313 pp_base_string (pp, result);
47b69537 2314 return true;
749ced52
ZW
2315#undef next_tree
2316#undef next_tcode
2317#undef next_lang
2318#undef next_int
a1066c99
GDR
2319}
2320
749ced52
ZW
2321/* These are temporary wrapper functions which handle the historic
2322 behavior of cp_*_at. */
c3e76028 2323
749ced52 2324static tree
3f8548e7 2325locate_error (const char *msgid, va_list ap)
c3e76028 2326{
749ced52
ZW
2327 tree here = 0, t;
2328 int plus = 0;
2329 const char *f;
c3e76028 2330
749ced52 2331 for (f = msgid; *f; f++)
c3e76028 2332 {
749ced52
ZW
2333 plus = 0;
2334 if (*f == '%')
2335 {
41775162
GDR
2336 if (*++f == 'q')
2337 ++f; /* ignore quoting flag. */
2338
749ced52 2339 if (*f == '+')
41775162
GDR
2340 {
2341 ++f;
2342 plus = 1;
2343 }
749ced52
ZW
2344 if (*f == '#')
2345 f++;
c3e76028 2346
749ced52
ZW
2347 switch (*f)
2348 {
2349 /* Just ignore these possibilities. */
2350 case '%': break;
b01b2484 2351 case 'P':
749ced52
ZW
2352 case 'd': (void) va_arg (ap, int); break;
2353 case 's': (void) va_arg (ap, char *); break;
2354 case 'L': (void) va_arg (ap, enum languages); break;
2355 case 'C':
2356 case 'O':
2357 case 'Q': (void) va_arg (ap, enum tree_code); break;
2358
2359 /* These take a tree, which may be where the error is
2360 located. */
2361 case 'A':
2362 case 'D':
2363 case 'E':
2364 case 'F':
749ced52
ZW
2365 case 'T':
2366 case 'V':
2367 t = va_arg (ap, tree);
2368 if (!here || plus)
2369 here = t;
2370 break;
c3e76028 2371
749ced52
ZW
2372 default:
2373 errorcount = 0; /* damn ICE suppression */
2374 internal_error ("unexpected letter `%c' in locate_error\n", *f);
2375 }
2376 }
c3e76028
GDR
2377 }
2378
749ced52
ZW
2379 if (here == 0)
2380 here = va_arg (ap, tree);
c3e76028 2381
749ced52 2382 return here;
c3e76028
GDR
2383}
2384
c3e76028 2385
749ced52 2386void
e34d07f2 2387cp_error_at (const char *msgid, ...)
a1066c99 2388{
749ced52 2389 tree here;
47b69537 2390 diagnostic_info diagnostic;
e34d07f2 2391 va_list ap;
bb20cc46 2392
e34d07f2 2393 va_start (ap, msgid);
749ced52 2394 here = locate_error (msgid, ap);
e34d07f2 2395 va_end (ap);
c3e76028 2396
e34d07f2 2397 va_start (ap, msgid);
22a49f18
AP
2398 diagnostic_set_info (&diagnostic, msgid, &ap,
2399 input_location, DK_ERROR);
2400 cp_diagnostic_starter (global_dc, &diagnostic);
47b69537 2401 diagnostic_set_info (&diagnostic, msgid, &ap,
9a472a42 2402 location_of (here), DK_ERROR);
47b69537 2403 report_diagnostic (&diagnostic);
e34d07f2 2404 va_end (ap);
c3e76028
GDR
2405}
2406
749ced52 2407void
e34d07f2 2408cp_warning_at (const char *msgid, ...)
c3e76028 2409{
749ced52 2410 tree here;
47b69537 2411 diagnostic_info diagnostic;
e34d07f2 2412 va_list ap;
c3e76028 2413
e34d07f2 2414 va_start (ap, msgid);
749ced52 2415 here = locate_error (msgid, ap);
e34d07f2 2416 va_end (ap);
c3e76028 2417
e34d07f2 2418 va_start (ap, msgid);
47b69537 2419 diagnostic_set_info (&diagnostic, msgid, &ap,
9a472a42 2420 location_of (here), DK_WARNING);
47b69537 2421 report_diagnostic (&diagnostic);
e34d07f2 2422 va_end (ap);
c3e76028
GDR
2423}
2424
749ced52 2425void
e34d07f2 2426cp_pedwarn_at (const char *msgid, ...)
c3e76028 2427{
749ced52 2428 tree here;
47b69537 2429 diagnostic_info diagnostic;
e34d07f2 2430 va_list ap;
c3e76028 2431
e34d07f2 2432 va_start (ap, msgid);
749ced52 2433 here = locate_error (msgid, ap);
e34d07f2 2434 va_end (ap);
c3e76028 2435
e34d07f2 2436 va_start (ap, msgid);
47b69537 2437 diagnostic_set_info (&diagnostic, msgid, &ap,
9a472a42 2438 location_of (here), pedantic_error_kind());
47b69537 2439 report_diagnostic (&diagnostic);
e34d07f2 2440 va_end (ap);
c3e76028 2441}
This page took 2.742644 seconds and 5 git commands to generate.