1 /* Call-backs for C++ error reporting.
2 This code is non-reentrant.
3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
4 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
29 typedef const char *cp_printer ();
31 #define obstack_chunk_alloc xmalloc
32 #define obstack_chunk_free free
34 /* Obstack where we build text strings for overloading, etc. */
35 static struct obstack scratch_obstack
;
36 static char *scratch_firstobj
;
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'))
48 # define OB_PUTI(CST) do { sprintf (digit_buffer, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)(CST)); \
49 OB_PUTCP (digit_buffer); } while (0)
51 # define OB_END_TEMPLATE_ID() \
52 (((obstack_next_free (&scratch_obstack) != obstack_base (&scratch_obstack) \
53 && obstack_next_free (&scratch_obstack)[-1] == '>') \
54 ? OB_PUTC (' ') : (void)0), OB_PUTC ('>'))
56 # define NEXT_CODE(t) (TREE_CODE (TREE_TYPE (t)))
58 enum pad
{ none
, before
, after
};
60 static const char *args_to_string
PARAMS ((tree
, int));
61 static const char *assop_to_string
PARAMS ((enum tree_code
, int));
62 static const char *code_to_string
PARAMS ((enum tree_code
, int));
63 static const char *cv_to_string
PARAMS ((tree
, int));
64 static const char *decl_to_string
PARAMS ((tree
, int));
65 static const char *expr_to_string
PARAMS ((tree
, int));
66 static const char *fndecl_to_string
PARAMS ((tree
, int));
67 static const char *op_to_string
PARAMS ((enum tree_code
, int));
68 static const char *parm_to_string
PARAMS ((int, int));
69 static const char *type_to_string
PARAMS ((tree
, int));
71 static void dump_type
PARAMS ((tree
, enum tree_string_flags
));
72 static void dump_simple_decl
PARAMS ((tree
, tree
, enum tree_string_flags
));
73 static void dump_decl
PARAMS ((tree
, enum tree_string_flags
));
74 static void dump_template_decl
PARAMS ((tree
, enum tree_string_flags
));
75 static void dump_function_decl
PARAMS ((tree
, enum tree_string_flags
));
76 static void dump_expr
PARAMS ((tree
, enum tree_string_flags
));
77 static void dump_unary_op
PARAMS ((const char *, tree
, enum tree_string_flags
));
78 static void dump_binary_op
PARAMS ((const char *, tree
, enum tree_string_flags
));
79 static void dump_aggr_type
PARAMS ((tree
, enum tree_string_flags
));
80 static enum pad dump_type_prefix
PARAMS ((tree
, enum tree_string_flags
));
81 static void dump_type_suffix
PARAMS ((tree
, enum tree_string_flags
));
82 static void dump_function_name
PARAMS ((tree
, enum tree_string_flags
));
83 static void dump_expr_list
PARAMS ((tree
, enum tree_string_flags
));
84 static void dump_global_iord
PARAMS ((tree
));
85 static enum pad dump_qualifiers
PARAMS ((tree
, enum pad
));
86 static void dump_char
PARAMS ((int));
87 static void dump_parameters
PARAMS ((tree
, enum tree_string_flags
));
88 static void dump_exception_spec
PARAMS ((tree
, enum tree_string_flags
));
89 static const char *aggr_variety
PARAMS ((tree
));
90 static tree ident_fndecl
PARAMS ((tree
));
91 static void dump_template_argument
PARAMS ((tree
, enum tree_string_flags
));
92 static void dump_template_argument_list
PARAMS ((tree
, enum tree_string_flags
));
93 static void dump_template_parameter
PARAMS ((tree
, enum tree_string_flags
));
94 static void dump_template_bindings
PARAMS ((tree
, tree
));
95 static void dump_scope
PARAMS ((tree
, enum tree_string_flags
));
96 static void dump_template_parms
PARAMS ((tree
, int, enum tree_string_flags
));
98 #define A args_to_string
99 #define C code_to_string
100 #define D decl_to_string
101 #define E expr_to_string
102 #define F fndecl_to_string
103 #define L language_to_string
104 #define O op_to_string
105 #define P parm_to_string
106 #define Q assop_to_string
107 #define T type_to_string
108 #define V cv_to_string
110 #define o (cp_printer *) 0
111 cp_printer
* cp_printers
[256] =
113 /*0 1 2 3 4 5 6 7 8 9 A B C D E F */
114 o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, /* 0x00 */
115 o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, /* 0x10 */
116 o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, /* 0x20 */
117 o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, /* 0x30 */
118 o
, A
, o
, C
, D
, E
, F
, o
, o
, o
, o
, o
, L
, o
, o
, O
, /* 0x40 */
119 P
, Q
, o
, o
, T
, o
, V
, o
, o
, o
, o
, o
, o
, o
, o
, o
, /* 0x50 */
120 o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, /* 0x60 */
121 o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, o
, /* 0x70 */
138 gcc_obstack_init (&scratch_obstack
);
139 scratch_firstobj
= (char *)obstack_alloc (&scratch_obstack
, 0);
142 /* Dump a scope, if deemed necessary. */
145 dump_scope (scope
, flags
)
147 enum tree_string_flags flags
;
149 if (scope
== NULL_TREE
)
152 if (TREE_CODE (scope
) == NAMESPACE_DECL
)
154 if (scope
!= global_namespace
)
156 dump_decl (scope
, (flags
& (TS_PEDANTIC_NAME
| TS_FUNC_SCOPE
| TS_CHASE_TYPEDEFS
))
157 | TS_FUNC_NORETURN
| TS_DECL_TYPE
);
160 else if (flags
& TS_PEDANTIC_NAME
)
163 else if (AGGREGATE_TYPE_P (scope
))
165 dump_type (scope
, (flags
& (TS_PEDANTIC_NAME
| TS_FUNC_SCOPE
| TS_CHASE_TYPEDEFS
))
166 | TS_FUNC_NORETURN
| TS_DECL_TYPE
);
169 else if ((flags
& (TS_PEDANTIC_NAME
| TS_FUNC_SCOPE
))
170 && TREE_CODE (scope
) == FUNCTION_DECL
)
172 dump_function_decl (scope
, (flags
& (TS_PEDANTIC_NAME
| TS_FUNC_SCOPE
| TS_CHASE_TYPEDEFS
))
173 | TS_FUNC_NORETURN
| TS_DECL_TYPE
);
178 /* Dump type qualifiers, providing padding as requested. Return an
179 indication of whether we dumped something. */
182 dump_qualifiers (t
, p
)
186 static const int masks
[] =
187 {TYPE_QUAL_CONST
, TYPE_QUAL_VOLATILE
, TYPE_QUAL_RESTRICT
};
188 static const char *const names
[] =
189 {"const", "volatile", "__restrict"};
191 int quals
= TYPE_QUALS (t
);
192 int do_after
= p
== after
;
196 for (ix
= 0; ix
!= 3; ix
++)
197 if (masks
[ix
] & quals
)
202 OB_PUTCP (names
[ix
]);
212 /* This must be large enough to hold any printed integer or floating-point
214 static char digit_buffer
[128];
216 /* Dump the template ARGument under control of FLAGS. */
219 dump_template_argument (arg
, flags
)
221 enum tree_string_flags flags
;
223 if (TYPE_P (arg
) || TREE_CODE (arg
) == TEMPLATE_DECL
)
224 dump_type (arg
, flags
& ~TS_AGGR_TAGS
);
226 dump_expr (arg
, (flags
| TS_EXPR_PARENS
) & ~TS_AGGR_TAGS
);
229 /* Dump a template-argument-list ARGS (always a TREE_VEC) under control
233 dump_template_argument_list (args
, flags
)
235 enum tree_string_flags flags
;
237 int n
= TREE_VEC_LENGTH (args
);
241 for (i
= 0; i
< n
; ++i
)
245 dump_template_argument (TREE_VEC_ELT (args
, i
), flags
);
250 /* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */
253 dump_template_parameter (parm
, flags
)
255 enum tree_string_flags flags
;
257 tree p
= TREE_VALUE (parm
);
258 tree a
= TREE_PURPOSE (parm
);
260 if (TREE_CODE (p
) == TYPE_DECL
)
262 if (flags
& TS_DECL_TYPE
)
268 OB_PUTID (DECL_NAME (p
));
271 else if (DECL_NAME (p
))
272 OB_PUTID (DECL_NAME (p
));
274 OB_PUTS ("{template default argument error}");
277 dump_decl (p
, flags
| TS_DECL_TYPE
);
279 if ((flags
& TS_PARM_DEFAULTS
) && a
!= NULL_TREE
)
282 if (TREE_CODE (a
) == TYPE_DECL
|| TREE_CODE (a
) == TEMPLATE_DECL
)
283 dump_type (a
, flags
& ~TS_CHASE_TYPEDEFS
);
285 dump_expr (a
, flags
| TS_EXPR_PARENS
);
289 /* Dump, under control of FLAGS, a template-parameter-list binding.
290 PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a
294 dump_template_bindings (parms
, args
)
301 tree p
= TREE_VALUE (parms
);
302 int lvl
= TMPL_PARMS_DEPTH (parms
);
306 for (i
= 0; i
< TREE_VEC_LENGTH (p
); ++i
)
308 tree arg
= TMPL_ARG (args
, lvl
, arg_idx
);
312 dump_template_parameter (TREE_VEC_ELT (p
, i
), TS_PLAIN
);
315 dump_template_argument (arg
, TS_PLAIN
);
317 OB_PUTS ("{missing}");
323 parms
= TREE_CHAIN (parms
);
327 /* Dump into the obstack a human-readable equivalent of TYPE. FLAGS
328 controls the format. */
333 enum tree_string_flags flags
;
338 if (TYPE_PTRMEMFUNC_P (t
))
341 switch (TREE_CODE (t
))
344 OB_PUTS ("{unknown type}");
348 /* A list of function parms. */
349 dump_parameters (t
, flags
);
352 case IDENTIFIER_NODE
:
357 dump_type (BINFO_TYPE (t
), flags
);
363 dump_aggr_type (t
, flags
);
367 if (flags
& TS_CHASE_TYPEDEFS
)
369 dump_type (DECL_ORIGINAL_TYPE (t
)
370 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
), flags
);
373 /* else fallthrough */
377 dump_decl (t
, flags
& ~TS_DECL_TYPE
);
381 OB_PUTS ("complex ");
382 dump_type (TREE_TYPE (t
), flags
);
386 if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t
)) && TREE_UNSIGNED (t
))
387 OB_PUTS ("unsigned ");
388 else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t
)) && !TREE_UNSIGNED (t
))
397 dump_qualifiers (t
, after
);
398 type
= flags
& TS_CHASE_TYPEDEFS
? TYPE_MAIN_VARIANT (t
) : t
;
399 if (TYPE_NAME (type
) && TYPE_IDENTIFIER (type
))
400 OB_PUTID (TYPE_IDENTIFIER (type
));
402 /* Types like intQI_type_node and friends have no names.
403 These don't come up in user error messages, but it's nice
404 to be able to print them from the debugger. */
405 OB_PUTS ("{anonymous}");
409 case TEMPLATE_TEMPLATE_PARM
:
410 if (!TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t
))
412 /* For parameters inside template signature. */
413 if (TYPE_IDENTIFIER (t
))
414 OB_PUTID (TYPE_IDENTIFIER (t
));
416 OB_PUTS ("{anonymous template template parameter}");
420 tree args
= TYPE_TI_ARGS (t
);
421 OB_PUTID (TYPE_IDENTIFIER (t
));
423 dump_template_argument_list (args
, flags
);
424 OB_END_TEMPLATE_ID ();
428 case TEMPLATE_TYPE_PARM
:
429 dump_qualifiers (t
, after
);
430 if (TYPE_IDENTIFIER (t
))
431 OB_PUTID (TYPE_IDENTIFIER (t
));
433 OB_PUTS ("{anonymous template type parameter}");
436 /* This is not always necessary for pointers and such, but doing this
437 reduces code size. */
446 dump_type_prefix (t
, flags
);
447 dump_type_suffix (t
, flags
);
451 OB_PUTS ("typename ");
452 dump_type (TYPE_CONTEXT (t
), flags
);
454 dump_decl (TYPENAME_TYPE_FULLNAME (t
), flags
);
458 OB_PUTS ("__typeof (");
459 dump_expr (TYPE_FIELDS (t
), flags
& ~TS_EXPR_PARENS
);
464 sorry ("`%s' not supported by dump_type",
465 tree_code_name
[(int) TREE_CODE (t
)]);
466 /* Fall through to error. */
469 OB_PUTS ("{type error}");
474 /* Return the name of the supplied aggregate, or enumeral type. */
480 if (TREE_CODE (t
) == ENUMERAL_TYPE
)
482 else if (TREE_CODE (t
) == UNION_TYPE
)
484 else if (TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_DECLARED_CLASS (t
))
490 /* Print out a class declaration T under the control of FLAGS,
491 in the form `class foo'. */
494 dump_aggr_type (t
, flags
)
496 enum tree_string_flags flags
;
499 const char *variety
= aggr_variety (t
);
503 dump_qualifiers (t
, after
);
505 if (flags
& TS_AGGR_TAGS
)
511 if (flags
& TS_CHASE_TYPEDEFS
)
512 t
= TYPE_MAIN_VARIANT (t
);
514 name
= TYPE_NAME (t
);
518 typdef
= !DECL_ARTIFICIAL (name
);
519 tmplate
= !typdef
&& TREE_CODE (t
) != ENUMERAL_TYPE
520 && TYPE_LANG_SPECIFIC (t
) && CLASSTYPE_TEMPLATE_INFO (t
)
521 && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t
)
522 || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t
)) != TEMPLATE_DECL
523 || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t
))
524 || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t
)));
525 dump_scope (CP_DECL_CONTEXT (name
), flags
| TS_FUNC_SCOPE
);
528 /* Because the template names are mangled, we have to locate
529 the most general template, and use that name. */
530 tree tpl
= CLASSTYPE_TI_TEMPLATE (t
);
532 while (DECL_TEMPLATE_INFO (tpl
))
533 tpl
= DECL_TI_TEMPLATE (tpl
);
536 name
= DECL_NAME (name
);
539 if (name
== 0 || ANON_AGGRNAME_P (name
))
541 OB_PUTS ("{anonymous");
542 if (!(flags
& TS_AGGR_TAGS
))
552 dump_template_parms (TYPE_TEMPLATE_INFO (t
),
553 !CLASSTYPE_USE_TEMPLATE (t
),
554 flags
& ~TS_TEMPLATE_PREFIX
);
557 /* Dump into the obstack the initial part of the output for a given type.
558 This is necessary when dealing with things like functions returning
561 return type of `int (* fee ())()': pointer -> function -> int. Both
562 pointer (and reference and offset) and function (and member) types must
563 deal with prefix and suffix.
565 Arrays must also do this for DECL nodes, like int a[], and for things like
568 Return indicates how you should pad an object name after this. I.e. you
569 want to pad non-*, non-& cores, but not pad * or & types. */
572 dump_type_prefix (t
, flags
)
574 enum tree_string_flags flags
;
576 enum pad padding
= before
;
578 if (TYPE_PTRMEMFUNC_P (t
))
580 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
584 switch (TREE_CODE (t
))
589 tree sub
= TREE_TYPE (t
);
591 padding
= dump_type_prefix (sub
, flags
);
592 /* A tree for a member pointer looks like pointer to offset,
593 so let the OFFSET_TYPE case handle it. */
594 if (!TYPE_PTRMEM_P (t
))
598 if (TREE_CODE (sub
) == ARRAY_TYPE
)
600 OB_PUTC ("&*"[TREE_CODE (t
) == POINTER_TYPE
]);
601 padding
= dump_qualifiers (t
, none
);
608 padding
= dump_type_prefix (TREE_TYPE (t
), flags
);
609 if (TREE_CODE (t
) == OFFSET_TYPE
) /* pmfs deal with this in d_t_p */
613 dump_type (TYPE_OFFSET_BASETYPE (t
), flags
);
617 padding
= dump_qualifiers (t
, none
);
620 /* Can only be reached through function pointer -- this would not be
621 correct if FUNCTION_DECLs used it. */
623 padding
= dump_type_prefix (TREE_TYPE (t
), flags
);
631 padding
= dump_type_prefix (TREE_TYPE (t
), flags
);
636 dump_aggr_type (TYPE_METHOD_BASETYPE (t
), flags
);
641 padding
= dump_type_prefix (TREE_TYPE (t
), flags
);
645 case IDENTIFIER_NODE
:
650 case TEMPLATE_TYPE_PARM
:
651 case TEMPLATE_TEMPLATE_PARM
:
660 dump_type (t
, flags
);
665 sorry ("`%s' not supported by dump_type_prefix",
666 tree_code_name
[(int) TREE_CODE (t
)]);
669 OB_PUTS ("{typeprefixerror}");
675 /* Dump the suffix of type T, under control of FLAGS. This is the part
676 which appears after the identifier (or function parms). */
679 dump_type_suffix (t
, flags
)
681 enum tree_string_flags flags
;
683 if (TYPE_PTRMEMFUNC_P (t
))
684 t
= TYPE_PTRMEMFUNC_FN_TYPE (t
);
686 switch (TREE_CODE (t
))
691 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
693 dump_type_suffix (TREE_TYPE (t
), flags
);
696 /* Can only be reached through function pointer */
702 arg
= TYPE_ARG_TYPES (t
);
703 if (TREE_CODE (t
) == METHOD_TYPE
)
704 arg
= TREE_CHAIN (arg
);
706 /* Function pointers don't have default args. Not in standard C++,
707 anyway; they may in g++, but we'll just pretend otherwise. */
708 dump_parameters (arg
, flags
& ~TS_PARM_DEFAULTS
);
710 if (TREE_CODE (t
) == METHOD_TYPE
)
712 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t
))), before
);
713 dump_type_suffix (TREE_TYPE (t
), flags
);
714 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t
), flags
);
722 if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t
)), 0))
723 OB_PUTI (tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t
)), 0) + 1);
724 else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t
))) == MINUS_EXPR
)
725 dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t
)), 0),
726 flags
& ~TS_EXPR_PARENS
);
728 dump_expr (fold (build_binary_op
729 (PLUS_EXPR
, TYPE_MAX_VALUE (TYPE_DOMAIN (t
)),
731 flags
& ~TS_EXPR_PARENS
);
734 dump_type_suffix (TREE_TYPE (t
), flags
);
738 case IDENTIFIER_NODE
:
743 case TEMPLATE_TYPE_PARM
:
744 case TEMPLATE_TEMPLATE_PARM
:
756 sorry ("`%s' not supported by dump_type_suffix",
757 tree_code_name
[(int) TREE_CODE (t
)]);
760 /* Don't mark it here, we should have already done in
766 /* Return a function declaration which corresponds to the IDENTIFIER_NODE
773 tree n
= lookup_name (t
, 0);
778 if (TREE_CODE (n
) == FUNCTION_DECL
)
780 else if (TREE_CODE (n
) == TREE_LIST
781 && TREE_CODE (TREE_VALUE (n
)) == FUNCTION_DECL
)
782 return TREE_VALUE (n
);
784 my_friendly_abort (66);
788 #ifndef NO_DOLLAR_IN_LABEL
789 # define GLOBAL_THING "_GLOBAL_$"
791 # ifndef NO_DOT_IN_LABEL
792 # define GLOBAL_THING "_GLOBAL_."
794 # define GLOBAL_THING "_GLOBAL__"
798 #define GLOBAL_IORD_P(NODE) \
799 ! strncmp (IDENTIFIER_POINTER(NODE), GLOBAL_THING, sizeof (GLOBAL_THING) - 1)
805 const char *name
= IDENTIFIER_POINTER (t
);
807 OB_PUTS ("(static ");
808 if (name
[sizeof (GLOBAL_THING
) - 1] == 'I')
809 OB_PUTS ("initializers");
810 else if (name
[sizeof (GLOBAL_THING
) - 1] == 'D')
811 OB_PUTS ("destructors");
813 my_friendly_abort (352);
816 OB_PUTCP (input_filename
);
821 dump_simple_decl (t
, type
, flags
)
824 enum tree_string_flags flags
;
826 if (flags
& TS_DECL_TYPE
)
828 if (dump_type_prefix (type
, flags
) != none
)
831 if (!DECL_INITIAL (t
) || TREE_CODE (DECL_INITIAL (t
)) != TEMPLATE_PARM_INDEX
)
832 dump_scope (CP_DECL_CONTEXT (t
), flags
);
834 dump_decl (DECL_NAME (t
), flags
);
836 OB_PUTS ("{anonymous}");
837 if (flags
& TS_DECL_TYPE
)
838 dump_type_suffix (type
, flags
);
841 /* Dump a human readable string for the decl T under control of FLAGS. */
846 enum tree_string_flags flags
;
851 switch (TREE_CODE (t
))
855 /* Don't say 'typedef class A' */
856 if (DECL_ARTIFICIAL (t
))
858 if ((flags
& TS_DECL_TYPE
)
859 && TREE_CODE (TREE_TYPE (t
)) == TEMPLATE_TYPE_PARM
)
860 /* Say `class T' not just `T'. */
863 dump_type (TREE_TYPE (t
), flags
);
867 if (flags
& TS_DECORATE
)
868 OB_PUTS ("typedef ");
869 dump_simple_decl (t
, DECL_ORIGINAL_TYPE (t
)
870 ? DECL_ORIGINAL_TYPE (t
) : TREE_TYPE (t
),
875 if (DECL_NAME (t
) && VTABLE_NAME_P (DECL_NAME (t
)))
877 OB_PUTS ("vtable for ");
878 if (TYPE_P (DECL_CONTEXT (t
)))
879 dump_type (DECL_CONTEXT (t
), flags
);
881 /* This case can arise with -fno-vtable-thunks. See
882 expand_upcast_fixups. It's not clear what to print
884 OB_PUTS ("{unknown type}");
887 /* else fall through */
890 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
894 OB_PUTS ("{return} ");
895 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
899 dump_scope (CP_DECL_CONTEXT (t
), flags
);
900 if (DECL_NAME (t
) == anonymous_namespace_name
)
901 OB_PUTS ("{unnamed}");
903 OB_PUTID (DECL_NAME (t
));
907 dump_decl (TREE_OPERAND (t
, 0), flags
& ~TS_DECL_TYPE
);
909 dump_decl (TREE_OPERAND (t
, 1), flags
);
913 dump_decl (TREE_OPERAND (t
, 0), flags
);
915 dump_decl (TREE_OPERAND (t
, 1), flags
);
919 /* So that we can do dump_decl on an aggr type. */
923 dump_type (t
, flags
);
927 my_friendly_abort (69);
930 /* These special cases are duplicated here so that other functions
931 can feed identifiers to cp_error and get them demangled properly. */
932 case IDENTIFIER_NODE
:
934 if (DESTRUCTOR_NAME_P (t
)
935 && (f
= ident_fndecl (t
))
936 && DECL_LANGUAGE (f
) == lang_cplusplus
)
939 dump_decl (DECL_NAME (f
), flags
);
941 else if (IDENTIFIER_TYPENAME_P (t
))
943 OB_PUTS ("operator ");
944 /* Not exactly IDENTIFIER_TYPE_VALUE. */
945 dump_type (TREE_TYPE (t
), flags
);
958 if (GLOBAL_IORD_P (DECL_ASSEMBLER_NAME (t
)))
959 dump_global_iord (DECL_ASSEMBLER_NAME (t
));
960 else if (! DECL_LANG_SPECIFIC (t
))
961 OB_PUTS ("{internal}");
962 else if (flags
& TS_PEDANTIC_NAME
)
963 dump_function_decl (t
, flags
| TS_FUNC_NORETURN
| TS_DECL_TYPE
);
965 dump_function_decl (t
, flags
);
969 if (flags
& TS_PEDANTIC_NAME
)
970 dump_template_decl (t
, flags
| TS_FUNC_NORETURN
| TS_DECL_TYPE
);
972 dump_template_decl (t
, flags
);
975 case TEMPLATE_ID_EXPR
:
978 tree name
= TREE_OPERAND (t
, 0);
979 if (is_overloaded_fn (name
))
980 name
= DECL_NAME (get_first_fn (name
));
981 dump_decl (name
, flags
);
983 for (args
= TREE_OPERAND (t
, 1); args
; args
= TREE_CHAIN (args
))
985 dump_template_argument (TREE_VALUE (args
), flags
);
986 if (TREE_CHAIN (args
))
989 OB_END_TEMPLATE_ID ();
994 dump_decl (TREE_OPERAND (t
, 0), flags
);
998 OB_PUTID (DECL_NAME (t
));
1002 if ((TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == ENUMERAL_TYPE
)
1003 || (DECL_INITIAL (t
) &&
1004 TREE_CODE (DECL_INITIAL (t
)) == TEMPLATE_PARM_INDEX
))
1005 dump_simple_decl (t
, TREE_TYPE (t
), flags
);
1006 else if (DECL_NAME (t
))
1007 dump_decl (DECL_NAME (t
), flags
);
1008 else if (DECL_INITIAL (t
))
1009 dump_expr (DECL_INITIAL (t
), flags
| TS_EXPR_PARENS
);
1011 OB_PUTS ("enumerator");
1016 dump_type (DECL_INITIAL (t
), flags
);
1018 OB_PUTID (DECL_NAME (t
));
1022 sorry ("`%s' not supported by dump_decl",
1023 tree_code_name
[(int) TREE_CODE (t
)]);
1024 /* Fallthrough to error. */
1027 OB_PUTS ("{declaration error}");
1032 /* Dump a template declaration T under control of FLAGS. This means the
1033 'template <...> leaders plus the 'class X' or 'void fn(...)' part. */
1036 dump_template_decl (t
, flags
)
1038 enum tree_string_flags flags
;
1040 tree orig_parms
= DECL_TEMPLATE_PARMS (t
);
1044 if (flags
& TS_TEMPLATE_PREFIX
)
1046 for (parms
= orig_parms
= nreverse (orig_parms
);
1048 parms
= TREE_CHAIN (parms
))
1050 tree inner_parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1051 int len
= TREE_VEC_LENGTH (inner_parms
);
1053 OB_PUTS ("template <");
1054 for (i
= 0; i
< len
; i
++)
1058 dump_template_parameter (TREE_VEC_ELT (inner_parms
, i
), flags
);
1060 OB_END_TEMPLATE_ID ();
1063 nreverse(orig_parms
);
1064 /* If we've shown the template<args> prefix, we'd better show the
1066 flags
|= TS_DECL_TYPE
;
1068 if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == TYPE_DECL
)
1069 dump_type (TREE_TYPE (t
),
1070 ((flags
& ~TS_AGGR_TAGS
) | TS_TEMPLATE_PLAIN
1071 | (flags
& TS_DECL_TYPE
? TS_AGGR_TAGS
: 0)));
1072 else if (TREE_CODE (DECL_TEMPLATE_RESULT (t
)) == VAR_DECL
)
1073 dump_decl (DECL_TEMPLATE_RESULT (t
), flags
| TS_TEMPLATE_PLAIN
);
1074 else if (TREE_TYPE (t
) == NULL_TREE
)
1075 my_friendly_abort (353);
1077 switch (NEXT_CODE (t
))
1081 dump_function_decl (t
, flags
| TS_TEMPLATE_PLAIN
);
1084 /* This case can occur with some illegal code. */
1085 dump_type (TREE_TYPE (t
),
1086 (flags
& ~TS_AGGR_TAGS
) | TS_TEMPLATE_PLAIN
1087 | (flags
& TS_DECL_TYPE
? TS_AGGR_TAGS
: 0));
1091 /* Pretty print a function decl. There are several ways we want to print a
1092 function declaration. The TS_FUNC bits in FLAGS tells us how to behave.
1093 As cp_error can only apply the '#' flag once to give 0 and 1 for V, there
1094 is %D which doesn't print the throw specs, and %F which does. */
1097 dump_function_decl (t
, flags
)
1099 enum tree_string_flags flags
;
1103 tree cname
= NULL_TREE
;
1104 tree template_args
= NULL_TREE
;
1105 tree template_parms
= NULL_TREE
;
1106 int show_return
= !(flags
& TS_FUNC_NORETURN
) && (flags
& TS_DECL_TYPE
);
1108 if (TREE_CODE (t
) == TEMPLATE_DECL
)
1109 t
= DECL_TEMPLATE_RESULT (t
);
1111 /* Pretty print template instantiations only. */
1112 if (DECL_USE_TEMPLATE (t
) && DECL_TEMPLATE_INFO (t
))
1116 template_args
= DECL_TI_ARGS (t
);
1117 tmpl
= most_general_template (t
);
1118 if (tmpl
&& TREE_CODE (tmpl
) == TEMPLATE_DECL
)
1120 template_parms
= DECL_TEMPLATE_PARMS (tmpl
);
1125 fntype
= TREE_TYPE (t
);
1126 parmtypes
= TYPE_ARG_TYPES (fntype
);
1128 if (DECL_CLASS_SCOPE_P (t
))
1129 cname
= DECL_CONTEXT (t
);
1130 /* this is for partially instantiated template methods */
1131 else if (TREE_CODE (fntype
) == METHOD_TYPE
)
1132 cname
= TREE_TYPE (TREE_VALUE (parmtypes
));
1134 if (!(flags
& TS_DECORATE
))
1136 else if (DECL_STATIC_FUNCTION_P (t
))
1137 OB_PUTS ("static ");
1138 else if (TYPE_POLYMORPHIC_P (t
))
1139 OB_PUTS ("virtual ");
1141 /* Print the return type? */
1143 show_return
= !DECL_CONV_FN_P (t
) && !DECL_CONSTRUCTOR_P (t
)
1144 && !DECL_DESTRUCTOR_P (t
);
1147 if (dump_type_prefix (TREE_TYPE (fntype
), flags
) != none
)
1151 /* Print the function name. */
1154 dump_type (cname
, flags
);
1158 dump_scope (CP_DECL_CONTEXT (t
), flags
);
1160 dump_function_name (t
, flags
);
1162 if (!(flags
& TS_DECL_TYPE
))
1164 if (TREE_CODE (fntype
) == METHOD_TYPE
&& parmtypes
)
1165 /* Skip "this" parameter. */
1166 parmtypes
= TREE_CHAIN (parmtypes
);
1168 /* Skip past the "in_charge" parameter. */
1169 if (DECL_HAS_IN_CHARGE_PARM_P (t
))
1170 parmtypes
= TREE_CHAIN (parmtypes
);
1172 dump_parameters (parmtypes
, flags
);
1175 dump_type_suffix (TREE_TYPE (fntype
), flags
);
1177 if (TREE_CODE (fntype
) == METHOD_TYPE
)
1178 dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype
))),
1181 if (flags
& TS_FUNC_THROW
)
1182 dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype
), flags
);
1184 /* If T is a template instantiation, dump the parameter binding. */
1185 if (template_parms
!= NULL_TREE
&& template_args
!= NULL_TREE
)
1187 OB_PUTS (" [with ");
1188 dump_template_bindings (template_parms
, template_args
);
1193 /* Print a parameter list. If this is for a member function, the
1194 member object ptr (and any other hidden args) should have
1195 already been removed. */
1198 dump_parameters (parmtypes
, flags
)
1200 enum tree_string_flags flags
;
1205 for (first
= 1; parmtypes
!= void_list_node
;
1206 parmtypes
= TREE_CHAIN (parmtypes
))
1216 dump_type (TREE_VALUE (parmtypes
), flags
);
1218 if ((flags
& TS_PARM_DEFAULTS
) && TREE_PURPOSE (parmtypes
))
1221 dump_expr (TREE_PURPOSE (parmtypes
), flags
| TS_EXPR_PARENS
);
1228 /* Print an exception specification. T is the exception specification. */
1231 dump_exception_spec (t
, flags
)
1233 enum tree_string_flags flags
;
1237 OB_PUTS (" throw (");
1238 if (TREE_VALUE (t
) != NULL_TREE
)
1241 dump_type (TREE_VALUE (t
), flags
);
1251 /* Handle the function name for a FUNCTION_DECL node, grokking operators
1252 and destructors properly. */
1255 dump_function_name (t
, flags
)
1257 enum tree_string_flags flags
;
1259 tree name
= DECL_NAME (t
);
1261 if (DECL_DESTRUCTOR_P (t
))
1264 dump_decl (name
, TS_PLAIN
);
1266 else if (DECL_CONV_FN_P (t
))
1268 /* This cannot use the hack that the operator's return
1269 type is stashed off of its name because it may be
1270 used for error reporting. In the case of conflicting
1271 declarations, both will have the same name, yet
1272 the types will be different, hence the TREE_TYPE field
1273 of the first name will be clobbered by the second. */
1274 OB_PUTS ("operator ");
1275 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1277 else if (IDENTIFIER_OPNAME_P (name
))
1280 dump_decl (name
, flags
);
1282 if (DECL_LANG_SPECIFIC (t
) && DECL_TEMPLATE_INFO (t
)
1283 && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t
)
1284 && (DECL_TEMPLATE_SPECIALIZATION (t
)
1285 || TREE_CODE (DECL_TI_TEMPLATE (t
)) != TEMPLATE_DECL
1286 || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t
))
1287 || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t
))))
1288 dump_template_parms (DECL_TEMPLATE_INFO (t
), !DECL_USE_TEMPLATE (t
), flags
);
1291 /* Dump the template parameters from the template info INFO under control of
1292 FLAGS. PRIMARY indicates whether this is a primary template decl, or
1293 specialization (partial or complete). For partial specializations we show
1294 the specialized parameter values. For a primary template we show no
1298 dump_template_parms (info
, primary
, flags
)
1301 enum tree_string_flags flags
;
1303 tree args
= info
? TI_ARGS (info
) : NULL_TREE
;
1305 if (primary
&& flags
& TS_TEMPLATE_PLAIN
)
1307 flags
&= ~(TS_AGGR_TAGS
| TS_TEMPLATE_PLAIN
);
1310 /* Be careful only to print things when we have them, so as not
1311 to crash producing error messages. */
1312 if (args
&& !primary
)
1318 if (TREE_CODE (args
) == TREE_VEC
)
1320 if (TREE_VEC_LENGTH (args
) > 0
1321 && TREE_CODE (TREE_VEC_ELT (args
, 0)) == TREE_VEC
)
1322 args
= TREE_VEC_ELT (args
, TREE_VEC_LENGTH (args
) - 1);
1324 len
= TREE_VEC_LENGTH (args
);
1326 else if (TREE_CODE (args
) == TREE_LIST
)
1328 while (ix
!= len
&& args
)
1333 arg
= TREE_VEC_ELT (args
, ix
);
1338 arg
= TREE_VALUE (args
);
1339 args
= TREE_CHAIN (args
);
1345 OB_PUTS ("{template parameter error}");
1347 dump_template_argument (arg
, flags
);
1353 tree tpl
= TI_TEMPLATE (info
);
1354 tree parms
= DECL_TEMPLATE_PARMS (tpl
);
1357 parms
= TREE_CODE (parms
) == TREE_LIST
? TREE_VALUE (parms
) : NULL_TREE
;
1358 len
= parms
? TREE_VEC_LENGTH (parms
) : 0;
1360 for (ix
= 0; ix
!= len
; ix
++)
1362 tree parm
= TREE_VALUE (TREE_VEC_ELT (parms
, ix
));
1367 dump_decl (parm
, flags
& ~TS_DECL_TYPE
);
1370 OB_END_TEMPLATE_ID ();
1379 case TARGET_NEWLINE
:
1414 sprintf (digit_buffer
, "\\%03o", (int) c
);
1415 OB_PUTCP (digit_buffer
);
1420 /* Print out a list of initializers (subr of dump_expr) */
1423 dump_expr_list (l
, flags
)
1425 enum tree_string_flags flags
;
1429 dump_expr (TREE_VALUE (l
), flags
| TS_EXPR_PARENS
);
1436 /* Print out an expression E under control of FLAGS. */
1439 dump_expr (t
, flags
)
1441 enum tree_string_flags flags
;
1443 switch (TREE_CODE (t
))
1451 case NAMESPACE_DECL
:
1453 dump_decl (t
, flags
& ~TS_DECL_TYPE
);
1458 tree type
= TREE_TYPE (t
);
1459 my_friendly_assert (type
!= 0, 81);
1461 /* If it's an enum, output its tag, rather than its value. */
1462 if (TREE_CODE (type
) == ENUMERAL_TYPE
)
1464 const char *p
= enum_name_string (t
, type
);
1467 else if (type
== boolean_type_node
)
1469 if (t
== boolean_false_node
|| integer_zerop (t
))
1471 else if (t
== boolean_true_node
)
1474 else if (type
== char_type_node
)
1477 dump_char (tree_low_cst (t
, 0));
1480 else if ((unsigned HOST_WIDE_INT
) TREE_INT_CST_HIGH (t
)
1481 != (TREE_INT_CST_LOW (t
) >> (HOST_BITS_PER_WIDE_INT
- 1)))
1485 if (tree_int_cst_sgn (val
) < 0)
1488 val
= build_int_2 (~TREE_INT_CST_LOW (val
),
1489 -TREE_INT_CST_HIGH (val
));
1491 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
1494 static char format
[10]; /* "%x%09999x\0" */
1496 sprintf (format
, "%%x%%0%dx", HOST_BITS_PER_INT
/ 4);
1497 sprintf (digit_buffer
, format
, TREE_INT_CST_HIGH (val
),
1498 TREE_INT_CST_LOW (val
));
1499 OB_PUTCP (digit_buffer
);
1503 OB_PUTI (TREE_INT_CST_LOW (t
));
1508 #ifndef REAL_IS_NOT_DOUBLE
1509 sprintf (digit_buffer
, "%g", TREE_REAL_CST (t
));
1512 const unsigned char *p
= (const unsigned char *) &TREE_REAL_CST (t
);
1514 strcpy (digit_buffer
, "0x");
1515 for (i
= 0; i
< sizeof TREE_REAL_CST (t
); i
++)
1516 sprintf (digit_buffer
+ 2 + 2*i
, "%02x", *p
++);
1519 OB_PUTCP (digit_buffer
);
1524 dump_type (PTRMEM_CST_CLASS (t
), flags
);
1526 OB_PUTID (DECL_NAME (PTRMEM_CST_MEMBER (t
)));
1531 const char *p
= TREE_STRING_POINTER (t
);
1532 int len
= TREE_STRING_LENGTH (t
) - 1;
1536 for (i
= 0; i
< len
; i
++)
1544 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
1546 dump_expr (TREE_OPERAND (t
, 1), flags
| TS_EXPR_PARENS
);
1552 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
1554 dump_expr (TREE_OPERAND (t
, 1), flags
| TS_EXPR_PARENS
);
1556 dump_expr (TREE_OPERAND (t
, 2), flags
| TS_EXPR_PARENS
);
1561 if (TREE_HAS_CONSTRUCTOR (t
))
1564 dump_type (TREE_TYPE (TREE_TYPE (t
)), flags
);
1568 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
1572 case AGGR_INIT_EXPR
:
1574 tree fn
= NULL_TREE
;
1576 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
)
1577 fn
= TREE_OPERAND (TREE_OPERAND (t
, 0), 0);
1579 if (fn
&& TREE_CODE (fn
) == FUNCTION_DECL
)
1581 if (DECL_CONSTRUCTOR_P (fn
))
1582 OB_PUTID (TYPE_IDENTIFIER (TREE_TYPE (t
)));
1587 dump_expr (TREE_OPERAND (t
, 0), 0);
1590 if (TREE_OPERAND (t
, 1))
1591 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t
, 1)), flags
);
1597 tree fn
= TREE_OPERAND (t
, 0);
1598 tree args
= TREE_OPERAND (t
, 1);
1600 if (TREE_CODE (fn
) == ADDR_EXPR
)
1601 fn
= TREE_OPERAND (fn
, 0);
1603 if (TREE_TYPE (fn
) != NULL_TREE
&& NEXT_CODE (fn
) == METHOD_TYPE
)
1605 tree ob
= TREE_VALUE (args
);
1606 if (TREE_CODE (ob
) == ADDR_EXPR
)
1608 dump_expr (TREE_OPERAND (ob
, 0), flags
| TS_EXPR_PARENS
);
1611 else if (TREE_CODE (ob
) != PARM_DECL
1612 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1614 dump_expr (ob
, flags
| TS_EXPR_PARENS
);
1617 args
= TREE_CHAIN (args
);
1619 dump_expr (fn
, flags
| TS_EXPR_PARENS
);
1621 dump_expr_list (args
, flags
);
1628 tree type
= TREE_OPERAND (t
, 1);
1629 if (NEW_EXPR_USE_GLOBAL (t
))
1632 if (TREE_OPERAND (t
, 0))
1635 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1638 if (TREE_CODE (type
) == ARRAY_REF
)
1639 type
= build_cplus_array_type
1640 (TREE_OPERAND (type
, 0),
1641 build_index_type (fold (build (MINUS_EXPR
, integer_type_node
,
1642 TREE_OPERAND (type
, 1),
1643 integer_one_node
))));
1644 dump_type (type
, flags
);
1645 if (TREE_OPERAND (t
, 2))
1648 dump_expr_list (TREE_OPERAND (t
, 2), flags
);
1655 /* Note that this only works for G++ target exprs. If somebody
1656 builds a general TARGET_EXPR, there's no way to represent that
1657 it initializes anything other that the parameter slot for the
1658 default argument. Note we may have cleared out the first
1659 operand in expand_expr, so don't go killing ourselves. */
1660 if (TREE_OPERAND (t
, 1))
1661 dump_expr (TREE_OPERAND (t
, 1), flags
| TS_EXPR_PARENS
);
1669 case TRUNC_DIV_EXPR
:
1670 case TRUNC_MOD_EXPR
:
1678 case BIT_ANDTC_EXPR
:
1679 case TRUTH_ANDIF_EXPR
:
1680 case TRUTH_ORIF_EXPR
:
1687 case EXACT_DIV_EXPR
:
1688 dump_binary_op (operator_name_info
[(int) TREE_CODE (t
)].name
, t
, flags
);
1692 case FLOOR_DIV_EXPR
:
1693 case ROUND_DIV_EXPR
:
1694 dump_binary_op ("/", t
, flags
);
1698 case FLOOR_MOD_EXPR
:
1699 case ROUND_MOD_EXPR
:
1700 dump_binary_op ("%", t
, flags
);
1705 tree ob
= TREE_OPERAND (t
, 0);
1706 if (TREE_CODE (ob
) == INDIRECT_REF
)
1708 ob
= TREE_OPERAND (ob
, 0);
1709 if (TREE_CODE (ob
) != PARM_DECL
1710 || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob
)), "this"))
1712 dump_expr (ob
, flags
| TS_EXPR_PARENS
);
1718 dump_expr (ob
, flags
| TS_EXPR_PARENS
);
1721 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TS_EXPR_PARENS
);
1726 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
1728 dump_expr (TREE_OPERAND (t
, 1), flags
| TS_EXPR_PARENS
);
1733 if (VOID_TYPE_P (TREE_TYPE (t
)))
1736 dump_type (TREE_TYPE (t
), flags
);
1738 dump_expr (TREE_OPERAND (t
, 0), flags
);
1741 dump_unary_op ("+", t
, flags
);
1745 if (TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
1746 || TREE_CODE (TREE_OPERAND (t
, 0)) == STRING_CST
1747 /* An ADDR_EXPR can have reference type. In that case, we
1748 shouldn't print the `&' doing so indicates to the user
1749 that the expression has pointer type. */
1751 && TREE_CODE (TREE_TYPE (t
)) == REFERENCE_TYPE
))
1752 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
1754 dump_unary_op ("&", t
, flags
);
1758 if (TREE_HAS_CONSTRUCTOR (t
))
1760 t
= TREE_OPERAND (t
, 0);
1761 my_friendly_assert (TREE_CODE (t
) == CALL_EXPR
, 237);
1762 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
1764 dump_expr_list (TREE_CHAIN (TREE_OPERAND (t
, 1)), flags
);
1769 if (TREE_OPERAND (t
,0) != NULL_TREE
1770 && TREE_TYPE (TREE_OPERAND (t
, 0))
1771 && NEXT_CODE (TREE_OPERAND (t
, 0)) == REFERENCE_TYPE
)
1772 dump_expr (TREE_OPERAND (t
, 0), flags
);
1774 dump_unary_op ("*", t
, flags
);
1780 case TRUTH_NOT_EXPR
:
1781 case PREDECREMENT_EXPR
:
1782 case PREINCREMENT_EXPR
:
1783 dump_unary_op (operator_name_info
[(int)TREE_CODE (t
)].name
, t
, flags
);
1786 case POSTDECREMENT_EXPR
:
1787 case POSTINCREMENT_EXPR
:
1789 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
1790 OB_PUTCP (operator_name_info
[(int)TREE_CODE (t
)].name
);
1794 case NON_LVALUE_EXPR
:
1795 /* FIXME: This is a KLUDGE workaround for a parsing problem. There
1796 should be another level of INDIRECT_REF so that I don't have to do
1798 if (TREE_TYPE (t
) != NULL_TREE
&& NEXT_CODE (t
) == POINTER_TYPE
)
1800 tree next
= TREE_TYPE (TREE_TYPE (t
));
1802 while (TREE_CODE (next
) == POINTER_TYPE
)
1803 next
= TREE_TYPE (next
);
1805 if (TREE_CODE (next
) == FUNCTION_TYPE
)
1807 if (flags
& TS_EXPR_PARENS
)
1810 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TS_EXPR_PARENS
);
1811 if (flags
& TS_EXPR_PARENS
)
1817 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
1821 dump_expr (TREE_OPERAND (t
, 0), flags
);
1824 case EXPR_WITH_FILE_LOCATION
:
1825 dump_expr (EXPR_WFL_NODE (t
), flags
);
1829 if (TREE_TYPE (t
) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t
)))
1831 tree idx
= build_component_ref (t
, index_identifier
, NULL_TREE
, 0);
1833 if (integer_all_onesp (idx
))
1835 tree pfn
= PFN_FROM_PTRMEMFUNC (t
);
1836 dump_unary_op ("&", pfn
, flags
| TS_EXPR_PARENS
);
1839 else if (TREE_CODE (idx
) == INTEGER_CST
1840 && tree_int_cst_equal (idx
, integer_zero_node
))
1842 /* A NULL pointer-to-member constant. */
1844 dump_type (TREE_TYPE (t
), flags
);
1848 else if (host_integerp (idx
, 0))
1851 unsigned HOST_WIDE_INT n
;
1853 t
= TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t
)));
1854 t
= TYPE_METHOD_BASETYPE (t
);
1855 virtuals
= TYPE_BINFO_VIRTUALS (TYPE_MAIN_VARIANT (t
));
1857 n
= tree_low_cst (idx
, 0) - first_vfun_index (t
);
1859 /* Map vtable index back one, to allow for the null pointer to
1863 while (n
> 0 && virtuals
)
1866 virtuals
= TREE_CHAIN (virtuals
);
1870 dump_expr (BV_FN (virtuals
),
1871 flags
| TS_EXPR_PARENS
);
1877 dump_expr_list (CONSTRUCTOR_ELTS (t
), flags
);
1883 tree ob
= TREE_OPERAND (t
, 0);
1884 if (is_dummy_object (ob
))
1886 t
= TREE_OPERAND (t
, 1);
1887 if (TREE_CODE (t
) == FUNCTION_DECL
)
1889 dump_expr (t
, flags
| TS_EXPR_PARENS
);
1890 else if (BASELINK_P (t
))
1891 dump_expr (OVL_CURRENT (TREE_VALUE (t
)), flags
| TS_EXPR_PARENS
);
1893 dump_decl (t
, flags
);
1897 if (TREE_CODE (ob
) == INDIRECT_REF
)
1899 dump_expr (TREE_OPERAND (ob
, 0), flags
| TS_EXPR_PARENS
);
1904 dump_expr (ob
, flags
| TS_EXPR_PARENS
);
1907 dump_expr (TREE_OPERAND (t
, 1), flags
| TS_EXPR_PARENS
);
1912 case TEMPLATE_PARM_INDEX
:
1913 dump_decl (TEMPLATE_PARM_DECL (t
), flags
& ~TS_DECL_TYPE
);
1916 case IDENTIFIER_NODE
:
1921 dump_type (TREE_OPERAND (t
, 0), flags
);
1923 dump_expr (TREE_OPERAND (t
, 1), flags
| TS_EXPR_PARENS
);
1927 if (TREE_OPERAND (t
, 0) == NULL_TREE
1928 || TREE_CHAIN (TREE_OPERAND (t
, 0)))
1930 dump_type (TREE_TYPE (t
), flags
);
1932 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1938 dump_type (TREE_TYPE (t
), flags
);
1941 dump_expr_list (TREE_OPERAND (t
, 0), flags
);
1947 OB_PUTID (TREE_OPERAND (t
, 0));
1951 dump_expr (TREE_OPERAND (t
, 0), flags
);
1957 if (TREE_CODE (t
) == SIZEOF_EXPR
)
1958 OB_PUTS ("sizeof (");
1961 my_friendly_assert (TREE_CODE (t
) == ALIGNOF_EXPR
, 0);
1962 OB_PUTS ("__alignof__ (");
1964 if (TYPE_P (TREE_OPERAND (t
, 0)))
1965 dump_type (TREE_OPERAND (t
, 0), flags
);
1967 dump_unary_op ("*", t
, flags
| TS_EXPR_PARENS
);
1972 OB_PUTS ("{unparsed}");
1975 case TRY_CATCH_EXPR
:
1976 case WITH_CLEANUP_EXPR
:
1977 case CLEANUP_POINT_EXPR
:
1978 dump_expr (TREE_OPERAND (t
, 0), flags
);
1981 case PSEUDO_DTOR_EXPR
:
1982 dump_expr (TREE_OPERAND (t
, 2), flags
);
1984 dump_type (TREE_OPERAND (t
, 0), flags
);
1986 dump_type (TREE_OPERAND (t
, 1), flags
);
1989 case TEMPLATE_ID_EXPR
:
1990 dump_decl (t
, flags
);
1994 /* We don't yet have a way of dumping statements in a
1995 human-readable format. */
1996 OB_PUTS ("{ ... }");
2001 dump_expr (TREE_OPERAND (t
, 1), flags
& ~TS_EXPR_PARENS
);
2006 OB_PUTS ("while (1) { ");
2007 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TS_EXPR_PARENS
);
2013 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TS_EXPR_PARENS
);
2014 OB_PUTS (") break; ");
2018 if (TREE_VALUE (t
) && TREE_CODE (TREE_VALUE (t
)) == FUNCTION_DECL
)
2020 OB_PUTID (DECL_NAME (TREE_VALUE (t
)));
2023 /* else fall through */
2025 /* This list is incomplete, but should suffice for now.
2026 It is very important that `sorry' does not call
2027 `report_error_function'. That could cause an infinite loop. */
2029 sorry ("`%s' not supported by dump_expr",
2030 tree_code_name
[(int) TREE_CODE (t
)]);
2032 /* fall through to ERROR_MARK... */
2034 OB_PUTCP ("{expression error}");
2040 dump_binary_op (opstring
, t
, flags
)
2041 const char *opstring
;
2043 enum tree_string_flags flags
;
2046 dump_expr (TREE_OPERAND (t
, 0), flags
| TS_EXPR_PARENS
);
2049 OB_PUTCP (opstring
);
2051 OB_PUTS ("<unknown operator>");
2053 dump_expr (TREE_OPERAND (t
, 1), flags
| TS_EXPR_PARENS
);
2058 dump_unary_op (opstring
, t
, flags
)
2059 const char *opstring
;
2061 enum tree_string_flags flags
;
2063 if (flags
& TS_EXPR_PARENS
)
2065 OB_PUTCP (opstring
);
2066 dump_expr (TREE_OPERAND (t
, 0), flags
& ~TS_EXPR_PARENS
);
2067 if (flags
& TS_EXPR_PARENS
)
2071 /* Exported interface to stringifying types, exprs and decls under TS_*
2075 type_as_string (typ
, flags
)
2077 enum tree_string_flags flags
;
2081 dump_type (typ
, flags
);
2085 return (char *)obstack_base (&scratch_obstack
);
2089 expr_as_string (decl
, flags
)
2091 enum tree_string_flags flags
;
2095 dump_expr (decl
, flags
);
2099 return (char *)obstack_base (&scratch_obstack
);
2103 decl_as_string (decl
, flags
)
2105 enum tree_string_flags flags
;
2109 dump_decl (decl
, flags
);
2113 return (char *)obstack_base (&scratch_obstack
);
2117 context_as_string (context
, flags
)
2119 enum tree_string_flags flags
;
2123 dump_scope (context
, flags
);
2127 return (char *)obstack_base (&scratch_obstack
);
2130 /* Generate the three forms of printable names for lang_printable_name. */
2133 lang_decl_name (decl
, v
)
2138 return decl_as_string (decl
, TS_DECL_TYPE
);
2142 if (v
== 1 && DECL_CLASS_SCOPE_P (decl
))
2144 dump_type (CP_DECL_CONTEXT (decl
), TS_PLAIN
);
2148 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2149 dump_function_name (decl
, TS_PLAIN
);
2151 dump_decl (DECL_NAME (decl
), TS_PLAIN
);
2155 return (char *)obstack_base (&scratch_obstack
);
2162 if (TREE_CODE (t
) == PARM_DECL
&& DECL_CONTEXT (t
))
2163 return DECL_SOURCE_FILE (DECL_CONTEXT (t
));
2164 else if (TYPE_P (t
))
2165 return DECL_SOURCE_FILE (TYPE_MAIN_DECL (t
));
2166 else if (TREE_CODE (t
) == OVERLOAD
)
2167 return DECL_SOURCE_FILE (OVL_FUNCTION (t
));
2169 return DECL_SOURCE_FILE (t
);
2177 if (TREE_CODE (t
) == PARM_DECL
&& DECL_CONTEXT (t
))
2178 line
= DECL_SOURCE_LINE (DECL_CONTEXT (t
));
2179 if (TREE_CODE (t
) == TYPE_DECL
&& DECL_ARTIFICIAL (t
)
2180 && TYPE_MAIN_DECL (TREE_TYPE (t
)))
2184 line
= DECL_SOURCE_LINE (TYPE_MAIN_DECL (t
));
2185 else if (TREE_CODE (t
) == OVERLOAD
)
2186 line
= DECL_SOURCE_LINE (OVL_FUNCTION (t
));
2188 line
= DECL_SOURCE_LINE (t
);
2196 /* Now the interfaces from cp_error et al to dump_type et al. Each takes an
2197 on/off VERBOSE flag and supply the appropriate TS_ flags to a dump_
2201 decl_to_string (decl
, verbose
)
2205 enum tree_string_flags flags
= 0;
2207 if (TREE_CODE (decl
) == TYPE_DECL
|| TREE_CODE (decl
) == RECORD_TYPE
2208 || TREE_CODE (decl
) == UNION_TYPE
|| TREE_CODE (decl
) == ENUMERAL_TYPE
)
2209 flags
= TS_AGGR_TAGS
;
2211 flags
|= TS_DECL_TYPE
| TS_DECORATE
| TS_PARM_DEFAULTS
;
2212 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
2213 flags
|= TS_DECL_TYPE
| TS_FUNC_NORETURN
;
2214 flags
|= TS_TEMPLATE_PREFIX
;
2218 dump_decl (decl
, flags
);
2222 return (char *)obstack_base (&scratch_obstack
);
2226 expr_to_string (decl
, verbose
)
2228 int verbose ATTRIBUTE_UNUSED
;
2232 dump_expr (decl
, 0);
2236 return (char *)obstack_base (&scratch_obstack
);
2240 fndecl_to_string (fndecl
, verbose
)
2244 enum tree_string_flags flags
;
2246 flags
= TS_FUNC_THROW
| TS_DECL_TYPE
;
2248 flags
|= TS_PARM_DEFAULTS
;
2251 dump_decl (fndecl
, flags
);
2255 return (char *)obstack_base (&scratch_obstack
);
2260 code_to_string (c
, v
)
2262 int v ATTRIBUTE_UNUSED
;
2264 return tree_code_name
[c
];
2268 language_to_string (c
, v
)
2270 int v ATTRIBUTE_UNUSED
;
2277 case lang_cplusplus
:
2284 my_friendly_abort (355);
2289 /* Return the proper printed version of a parameter to a C++ function. */
2292 parm_to_string (p
, v
)
2294 int v ATTRIBUTE_UNUSED
;
2299 sprintf (digit_buffer
, "%d", p
+1);
2300 return digit_buffer
;
2306 int v ATTRIBUTE_UNUSED
;
2310 id
= operator_name_info
[(int) p
].identifier
;
2311 return id
? IDENTIFIER_POINTER (id
) : "{unknown}";
2315 type_to_string (typ
, verbose
)
2319 enum tree_string_flags flags
;
2323 flags
|= TS_AGGR_TAGS
;
2324 flags
|= TS_TEMPLATE_PREFIX
;
2328 dump_type (typ
, flags
);
2332 return (char *)obstack_base (&scratch_obstack
);
2336 assop_to_string (p
, v
)
2338 int v ATTRIBUTE_UNUSED
;
2342 id
= assignment_operator_name_info
[(int) p
].identifier
;
2343 return id
? IDENTIFIER_POINTER (id
) : "{unknown}";
2347 args_to_string (p
, verbose
)
2351 enum tree_string_flags flags
= 0;
2353 flags
|= TS_AGGR_TAGS
;
2358 if (TYPE_P (TREE_VALUE (p
)))
2359 return type_as_string (p
, flags
);
2362 for (; p
; p
= TREE_CHAIN (p
))
2364 if (TREE_VALUE (p
) == null_node
)
2367 dump_type (error_type (TREE_VALUE (p
)), flags
);
2372 return (char *)obstack_base (&scratch_obstack
);
2378 int v ATTRIBUTE_UNUSED
;
2382 dump_qualifiers (p
, before
);
2386 return (char *)obstack_base (&scratch_obstack
);