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