]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/cp-tree.h
cp-tree.h (finish_function): Adjust prototype.
[gcc.git] / gcc / cp / cp-tree.h
CommitLineData
8d08fdba 1/* Definitions for C++ parsing and type checking.
4c571114 2 Copyright (C) 1987, 92-97, 1998, 1999 Free Software Foundation, Inc.
8d08fdba
MS
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5This 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 21
7f4edbcb 22#include "c-common.h"
99dccabc 23#include "function.h"
9cd64686 24#include "varray.h"
7f4edbcb 25
8d08fdba
MS
26#ifndef _CP_TREE_H
27#define _CP_TREE_H
28
cfdd0551 29/* Usage of TREE_LANG_FLAG_?:
280f9385 30 0: BINFO_MARKED (BINFO nodes).
cfdd0551 31 COMPOUND_STMT_NO_SCOPE (in COMPOUND_STMT).
a7e4cfa0 32 EXPR_STMT_ASSIGNS_THIS (in EXPR_STMT).
cfdd0551
PB
33 NEW_EXPR_USE_GLOBAL (in NEW_EXPR).
34 DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR).
35 LOOKUP_EXPR_GLOBAL (in LOOKUP_EXPR).
36 TREE_NEGATED_INT (in INTEGER_CST).
b26caacd 37 TREE_INDIRECT_USING (in NAMESPACE_DECL).
72c4a2a6 38 IDENTIFIER_MARKED (used by search routines).
f181d4ae 39 LOCAL_BINDING_P (in CPLUS_BINDING)
27b8d0cd 40 ICS_USER_FLAG (in _CONV)
f1dedc31 41 CLEANUP_P (in TRY_BLOCK)
e1376b00 42 AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR)
4bb0968f 43 1: IDENTIFIER_VIRTUAL_P.
cfdd0551 44 TI_PENDING_TEMPLATE_FLAG.
cfdd0551
PB
45 TEMPLATE_PARMS_FOR_INLINE.
46 DELETE_EXPR_USE_VEC (in DELETE_EXPR).
47 (TREE_CALLS_NEW) (in _EXPR or _REF) (commented-out).
48 TYPE_USES_COMPLEX_INHERITANCE (in _TYPE).
b5434ee0 49 C_DECLARED_LABEL_FLAG (in LABEL_DECL)
8f032717 50 INHERITED_VALUE_BINDING_P (in CPLUS_BINDING)
4bb0968f 51 BASELINK_P (in TREE_LIST)
27b8d0cd 52 ICS_ELLIPSIS_FLAG (in _CONV)
a7e4cfa0 53 STMT_IS_FULL_EXPR_P (in _STMT)
cfdd0551 54 2: IDENTIFIER_OPNAME_P.
0ec57017 55 BINFO_VBASE_MARKED.
cfdd0551
PB
56 BINFO_FIELDS_MARKED.
57 TYPE_VIRTUAL_P.
27b8d0cd 58 ICS_THIS_FLAG (in _CONV)
a7e4cfa0
MM
59 STMT_LINENO_FOR_FN_P (in _STMT)
60 BINDING_HAS_LEVEL_P (in CPLUS_BINDING)
cfdd0551
PB
61 3: TYPE_USES_VIRTUAL_BASECLASSES (in a class TYPE).
62 BINFO_VTABLE_PATH_MARKED.
0ec57017 63 BINFO_PUSHDECLS_MARKED.
cfdd0551 64 (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
27b8d0cd 65 ICS_BAD_FLAG (in _CONV)
cfdd0551
PB
66 4: BINFO_NEW_VTABLE_MARKED.
67 TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
68 or FIELD_DECL).
27b8d0cd 69 NEED_TEMPORARY_P (in REF_BIND, BASE_CONV)
0ec57017 70 5: Not used.
cfdd0551
PB
71 6: Not used.
72
73 Usage of TYPE_LANG_FLAG_?:
74 0: C_TYPE_FIELDS_READONLY (in RECORD_TYPE or UNION_TYPE).
75 1: TYPE_HAS_CONSTRUCTOR.
76 2: TYPE_HAS_DESTRUCTOR.
ea419909 77 3: TYPE_FOR_JAVA.
cfdd0551
PB
78 4: TYPE_NEEDS_DESTRUCTOR.
79 5: IS_AGGR_TYPE.
ea419909 80 6: TYPE_BUILT_IN.
cfdd0551
PB
81
82 Usage of DECL_LANG_FLAG_?:
83 0: DECL_ERROR_REPORTED (in VAR_DECL).
50714e79 84 DECL_TEMPLATE_PARM_P (in CONST_DECL, TYPE_DECL, or TEMPLATE_DECL)
cfdd0551 85 1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL).
fbf1c34b 86 DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL)
cfdd0551 87 2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL).
9188c363 88 DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL)
cfdd0551
PB
89 3: DECL_IN_AGGR_P.
90 4: DECL_MAYBE_TEMPLATE.
91 5: DECL_INTERFACE_KNOWN.
92 6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL).
93 7: DECL_DEAD_FOR_LOCAL (in VAR_DECL).
7ddedda4
MM
94
95 Usage of language-independent fields in a language-dependent manner:
96
97 TYPE_ALIAS_SET
98 This field is used by TYPENAME_TYPEs, TEMPLATE_TYPE_PARMs, and so
99 forth as a substitute for the mark bits provided in `lang_type'.
100 At present, only the six low-order bits are used.
101
102 TYPE_BINFO
103 For an ENUMERAL_TYPE, this is ENUM_TEMPLATE_INFO.
104 For a TYPENAME_TYPE, this is TYPENAME_TYPE_FULLNAME.
105 For a TEMPLATE_TEMPLATE_PARM, this is
106 TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO.
0aafb128
MM
107
108 DECL_SAVED_INSNS/DECL_FIELD_SIZE
109 For a static VAR_DECL, this is DECL_INIT_PRIORITY.
83f2ccf4
MM
110
111 BINFO_VIRTUALS
112 For a binfo, this is a TREE_LIST. The TREE_PURPOSE of each node
113 gives the amount by which to adjust the `this' pointer when
114 calling the function. The TREE_VALUE is the declaration for the
115 virtual function itself. When CLASSTYPE_COM_INTERFACE_P does not
116 hold, the first entry does not have a TREE_VALUE; it is just an
117 offset. */
cfdd0551 118
8d08fdba
MS
119/* Language-dependent contents of an identifier. */
120
121struct lang_identifier
122{
123 struct tree_identifier ignore;
f181d4ae
MM
124 tree namespace_bindings;
125 tree bindings;
8d08fdba
MS
126 tree class_value;
127 tree class_template_info;
128 struct lang_id2 *x;
129};
130
131struct lang_id2
132{
133 tree label_value, implicit_decl;
9e0781b5 134 tree error_locus;
8d08fdba
MS
135};
136
46b02c6d
MS
137typedef struct
138{
139 tree t;
140 int new_type_flag;
141} flagged_type_tree;
142
f84b4be9
JM
143typedef struct
144{
145 char common[sizeof (struct tree_common)];
f84b4be9
JM
146 HOST_WIDE_INT index;
147 HOST_WIDE_INT level;
148 HOST_WIDE_INT orig_level;
149 tree decl;
150} template_parm_index;
151
61a127b3
MM
152typedef struct ptrmem_cst
153{
154 char common[sizeof (struct tree_common)];
87e3dbc9
MM
155 /* This isn't used, but the middle-end expects all constants to have
156 this field. */
157 struct rtx_def *rtl;
61a127b3
MM
158 tree member;
159}* ptrmem_cst_t;
160
f181d4ae
MM
161/* Nonzero if this binding is for a local scope, as opposed to a class
162 or namespace scope. */
163#define LOCAL_BINDING_P(NODE) TREE_LANG_FLAG_0(NODE)
164
8f032717
MM
165/* Nonzero if BINDING_VALUE is from a base class of the class which is
166 currently being defined. */
167#define INHERITED_VALUE_BINDING_P(NODE) TREE_LANG_FLAG_1(NODE)
168
f181d4ae
MM
169/* For a binding between a name and an entity at a non-local scope,
170 defines the scope where the binding is declared. (Either a class
171 _TYPE node, or a NAMESPACE_DECL.) This macro should be used only
172 for namespace-level bindings; on the IDENTIFIER_BINDING list
173 BINDING_LEVEL is used instead. */
c7a932b1 174#define BINDING_SCOPE(NODE) (((struct tree_binding*)NODE)->scope.scope)
f181d4ae 175
87e3dbc9
MM
176/* Nonzero if NODE has BINDING_LEVEL, rather than BINDING_SCOPE. */
177#define BINDING_HAS_LEVEL_P(NODE) TREE_LANG_FLAG_2 ((NODE))
178
2c73f9f5
ML
179/* This is the declaration bound to the name. Possible values:
180 variable, overloaded function, namespace, template, enumerator. */
181#define BINDING_VALUE(NODE) (((struct tree_binding*)NODE)->value)
f181d4ae 182
2c73f9f5
ML
183/* If name is bound to a type, this is the type (struct, union, enum). */
184#define BINDING_TYPE(NODE) TREE_TYPE(NODE)
f181d4ae 185
30394414 186#define IDENTIFIER_GLOBAL_VALUE(NODE) \
2c73f9f5
ML
187 namespace_binding (NODE, global_namespace)
188#define SET_IDENTIFIER_GLOBAL_VALUE(NODE, VAL) \
189 set_namespace_binding (NODE, global_namespace, VAL)
30394414 190#define IDENTIFIER_NAMESPACE_VALUE(NODE) \
2c73f9f5
ML
191 namespace_binding (NODE, current_namespace)
192#define SET_IDENTIFIER_NAMESPACE_VALUE(NODE, VAL) \
193 set_namespace_binding (NODE, current_namespace, VAL)
30394414
JM
194
195struct tree_binding
196{
197 char common[sizeof (struct tree_common)];
c7a932b1
JM
198 union {
199 tree scope;
200 struct binding_level *level;
201 } scope;
30394414
JM
202 tree value;
203};
204
2c73f9f5
ML
205/* The overloaded FUNCTION_DECL. */
206#define OVL_FUNCTION(NODE) (((struct tree_overload*)NODE)->function)
207#define OVL_CHAIN(NODE) TREE_CHAIN(NODE)
208/* Polymorphic access to FUNCTION and CHAIN. */
209#define OVL_CURRENT(NODE) \
210 ((TREE_CODE(NODE)==OVERLOAD) ? OVL_FUNCTION(NODE) : NODE)
211#define OVL_NEXT(NODE) \
212 ((TREE_CODE(NODE)==OVERLOAD) ? TREE_CHAIN(NODE) : NULL_TREE)
213/* If set, this was imported in a using declaration.
214 This is not to confuse with being used somewhere, which
215 is not important for this node. */
216#define OVL_USED(NODE) TREE_USED(NODE)
217
218struct tree_overload
219{
220 char common[sizeof (struct tree_common)];
221 tree function;
222};
223
4bb0968f
MM
224/* A `baselink' is a TREE_LIST whose TREE_PURPOSE is a BINFO
225 indicating a particular base class, and whose TREE_VALUE is a
226 (possibly overloaded) function from that base class. */
227#define BASELINK_P(NODE) \
3927874d 228 (TREE_CODE (NODE) == TREE_LIST && TREE_LANG_FLAG_1 (NODE))
4bb0968f 229#define SET_BASELINK_P(NODE) \
3927874d 230 (TREE_LANG_FLAG_1 (NODE) = 1)
4bb0968f 231
3927874d
JM
232#define WRAPPER_PTR(NODE) (((struct tree_wrapper*)(NODE))->u.ptr)
233#define WRAPPER_INT(NODE) (((struct tree_wrapper*)(NODE))->u.i)
5ffe581d
JM
234
235struct tree_wrapper
236{
237 char common[sizeof (struct tree_common)];
238 union {
239 void *ptr;
240 int i;
241 } u;
242};
243
1139b3d8
JM
244#define SRCLOC_FILE(NODE) (((struct tree_srcloc*)NODE)->filename)
245#define SRCLOC_LINE(NODE) (((struct tree_srcloc*)NODE)->linenum)
246struct tree_srcloc
247{
248 char common[sizeof (struct tree_common)];
249 char *filename;
250 int linenum;
251};
252
8d08fdba
MS
253/* To identify to the debug emitters if it should pay attention to the
254 flag `-Wtemplate-debugging'. */
255#define HAVE_TEMPLATES 1
256
257/* Macros for access to language-specific slots in an identifier. */
258
30394414 259#define IDENTIFIER_NAMESPACE_BINDINGS(NODE) \
32e02ee0 260 (((struct lang_identifier *)(NODE))->namespace_bindings)
8d08fdba
MS
261#define IDENTIFIER_TEMPLATE(NODE) \
262 (((struct lang_identifier *)(NODE))->class_template_info)
263
f181d4ae
MM
264/* The IDENTIFIER_BINDING is the innermost CPLUS_BINDING for the
265 identifier. It's TREE_CHAIN is the next outermost binding. Each
266 BINDING_VALUE is a DECL for the associated declaration. Thus,
267 name lookup consists simply of pulling off the node at the front
268 of the list (modulo oddities for looking up the names of types,
269 and such.) You can use BINDING_SCOPE or BINDING_LEVEL to
270 determine the scope that bound the name. */
271#define IDENTIFIER_BINDING(NODE) \
272 (((struct lang_identifier*) (NODE))->bindings)
273
274/* The IDENTIFIER_VALUE is the value of the IDENTIFIER_BINDING, or
275 NULL_TREE if there is no binding. */
276#define IDENTIFIER_VALUE(NODE) \
277 (IDENTIFIER_BINDING (NODE) \
278 ? BINDING_VALUE (IDENTIFIER_BINDING (NODE)) \
279 : NULL_TREE)
280
8f032717
MM
281/* If IDENTIFIER_CLASS_VALUE is set, then NODE is bound in the current
282 class, and IDENTIFIER_CLASS_VALUE is the value binding. This is
283 just a pointer to the BINDING_VALUE of one of the bindings in the
284 IDENTIFIER_BINDINGs list, so any time that this is non-NULL so is
f181d4ae
MM
285 IDENTIFIER_BINDING. */
286#define IDENTIFIER_CLASS_VALUE(NODE) \
287 (((struct lang_identifier *) (NODE))->class_value)
288
289/* The amount of time used by the file whose special "time identifier"
290 is NODE, represented as an INTEGER_CST. See get_time_identifier. */
291#define TIME_IDENTIFIER_TIME(NODE) IDENTIFIER_BINDING(NODE)
292
293/* For a "time identifier" this is a INTEGER_CST. The
294 TREE_INT_CST_LOW is 1 if the corresponding file is "interface only".
295 The TRE_INT_CST_HIGH is 1 if it is "interface unknown". */
296#define TIME_IDENTIFIER_FILEINFO(NODE) IDENTIFIER_CLASS_VALUE (NODE)
297
2c73f9f5
ML
298/* TREE_TYPE only indicates on local and class scope the current
299 type. For namespace scope, the presence of a type in any namespace
300 is indicated with global_type_node, and the real type behind must
301 be found through lookup. */
302#define IDENTIFIER_TYPE_VALUE(NODE) (identifier_type_value(NODE))
303#define REAL_IDENTIFIER_TYPE_VALUE(NODE) (TREE_TYPE (NODE))
8d08fdba 304#define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = TYPE)
2c73f9f5 305#define IDENTIFIER_HAS_TYPE_VALUE(NODE) (IDENTIFIER_TYPE_VALUE (NODE) ? 1 : 0)
8d08fdba
MS
306
307#define LANG_ID_FIELD(NAME,NODE) \
308 (((struct lang_identifier *)(NODE))->x \
309 ? ((struct lang_identifier *)(NODE))->x->NAME : 0)
310#define SET_LANG_ID(NODE,VALUE,NAME) \
311 (((struct lang_identifier *)(NODE))->x == 0 \
312 ? ((struct lang_identifier *)(NODE))->x \
313 = (struct lang_id2 *)perm_calloc (1, sizeof (struct lang_id2)) : 0, \
314 ((struct lang_identifier *)(NODE))->x->NAME = (VALUE))
315
316#define IDENTIFIER_LABEL_VALUE(NODE) LANG_ID_FIELD(label_value, NODE)
317#define SET_IDENTIFIER_LABEL_VALUE(NODE,VALUE) \
318 SET_LANG_ID(NODE, VALUE, label_value)
319
320#define IDENTIFIER_IMPLICIT_DECL(NODE) LANG_ID_FIELD(implicit_decl, NODE)
321#define SET_IDENTIFIER_IMPLICIT_DECL(NODE,VALUE) \
322 SET_LANG_ID(NODE, VALUE, implicit_decl)
323
8d08fdba
MS
324#define IDENTIFIER_ERROR_LOCUS(NODE) LANG_ID_FIELD(error_locus, NODE)
325#define SET_IDENTIFIER_ERROR_LOCUS(NODE,VALUE) \
326 SET_LANG_ID(NODE, VALUE, error_locus)
327
328
329#define IDENTIFIER_VIRTUAL_P(NODE) TREE_LANG_FLAG_1(NODE)
330
f71f87f9
MM
331/* Nonzero if this identifier is the prefix for a mangled C++ operator
332 name. */
8d08fdba
MS
333#define IDENTIFIER_OPNAME_P(NODE) TREE_LANG_FLAG_2(NODE)
334
4c571114
MM
335/* Nonzero if this identifier is the name of a type-conversion
336 operator. */
337#define IDENTIFIER_TYPENAME_P(NODE) \
338 (! strncmp (IDENTIFIER_POINTER (NODE), \
339 OPERATOR_TYPENAME_FORMAT, \
340 strlen (OPERATOR_TYPENAME_FORMAT)))
8d08fdba
MS
341
342/* Nonzero means reject anything that ANSI standard C forbids. */
343extern int pedantic;
344
345/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */
346#define C_TYPE_FIELDS_READONLY(type) TYPE_LANG_FLAG_0 (type)
e1cd6e56
MS
347
348/* Record in each node resulting from a binary operator
349 what operator was specified for it. */
350#define C_EXP_ORIGINAL_CODE(exp) ((enum tree_code) TREE_COMPLEXITY (exp))
351
352/* Store a value in that field. */
353#define C_SET_EXP_ORIGINAL_CODE(exp, code) \
354 (TREE_COMPLEXITY (exp) = (int)(code))
8d08fdba
MS
355\f
356/* If non-zero, a VAR_DECL whose cleanup will cause a throw to the
357 next exception handler. */
358extern tree exception_throw_decl;
359
7f4edbcb
BS
360enum cp_tree_index
361{
362 CPTI_JAVA_BYTE_TYPE,
363 CPTI_JAVA_SHORT_TYPE,
364 CPTI_JAVA_INT_TYPE,
365 CPTI_JAVA_LONG_TYPE,
366 CPTI_JAVA_FLOAT_TYPE,
367 CPTI_JAVA_DOUBLE_TYPE,
368 CPTI_JAVA_CHAR_TYPE,
369 CPTI_JAVA_BOOLEAN_TYPE,
370
371 CPTI_VOID_ZERO,
372 CPTI_WCHAR_DECL,
373 CPTI_VTABLE_ENTRY_TYPE,
374 CPTI_DELTA_TYPE,
375
376 CPTI_TP_DESC_TYPE,
377 CPTI_ACCESS_MODE_TYPE,
378 CPTI_BLTN_DESC_TYPE,
379 CPTI_USER_DESC_TYPE,
380 CPTI_CLASS_DESC_TYPE,
381 CPTI_PTR_DESC_TYPE,
382 CPTI_ATTR_DESC_TYPE,
383 CPTI_FUNC_DESC_TYPE,
384 CPTI_PTMF_DESC_TYPE,
385 CPTI_PTMD_DESC_TYPE,
386
387 CPTI_CLASS_STAR_TYPE,
388 CPTI_CLASS_TYPE,
389 CPTI_RECORD_TYPE,
390 CPTI_UNION_TYPE,
391 CPTI_ENUM_TYPE,
392 CPTI_UNKNOWN_TYPE,
7f4edbcb
BS
393 CPTI_VTBL_TYPE,
394 CPTI_VTBL_PTR_TYPE,
395 CPTI_STD,
396 CPTI_TYPE_INFO_TYPE,
397 CPTI_TINFO_FN_ID,
398 CPTI_TINFO_FN_TYPE,
399 CPTI_ABORT_FNDECL,
400 CPTI_GLOBAL_DELETE_FNDECL,
401
9cd64686
MM
402 CPTI_ACCESS_DEFAULT,
403 CPTI_ACCESS_PUBLIC,
404 CPTI_ACCESS_PROTECTED,
405 CPTI_ACCESS_PRIVATE,
406 CPTI_ACCESS_DEFAULT_VIRTUAL,
407 CPTI_ACCESS_PUBLIC_VIRTUAL,
408 CPTI_ACCESS_PROTECTED_VIRTUAL,
409 CPTI_ACCESS_PRIVATE_VIRTUAL,
410
411 CPTI_CTOR_IDENTIFIER,
412 CPTI_DELTA2_IDENTIFIER,
413 CPTI_DELTA_IDENTIFIER,
414 CPTI_DTOR_IDENTIFIER,
415 CPTI_IN_CHARGE_IDENTIFIER,
416 CPTI_INDEX_IDENTIFIER,
417 CPTI_NELTS_IDENTIFIER,
418 CPTI_THIS_IDENTIFIER,
419 CPTI_PFN_IDENTIFIER,
420 CPTI_PFN_OR_DELTA2_IDENTIFIER,
421 CPTI_VPTR_IDENTIFIER,
422
423 CPTI_LANG_NAME_C,
424 CPTI_LANG_NAME_CPLUSPLUS,
425 CPTI_LANG_NAME_JAVA,
426
427 CPTI_EMPTY_EXCEPT_SPEC,
428 CPTI_NULL,
429 CPTI_JCLASS,
430 CPTI_MINUS_ONE,
431 CPTI_TERMINATE,
f0105ed3 432 CPTI_ATEXIT,
9cd64686 433
7f4edbcb
BS
434 CPTI_MAX
435};
8d08fdba 436
7f4edbcb
BS
437extern tree cp_global_trees[CPTI_MAX];
438
439#define java_byte_type_node cp_global_trees[CPTI_JAVA_BYTE_TYPE]
440#define java_short_type_node cp_global_trees[CPTI_JAVA_SHORT_TYPE]
441#define java_int_type_node cp_global_trees[CPTI_JAVA_INT_TYPE]
442#define java_long_type_node cp_global_trees[CPTI_JAVA_LONG_TYPE]
443#define java_float_type_node cp_global_trees[CPTI_JAVA_FLOAT_TYPE]
444#define java_double_type_node cp_global_trees[CPTI_JAVA_DOUBLE_TYPE]
445#define java_char_type_node cp_global_trees[CPTI_JAVA_CHAR_TYPE]
446#define java_boolean_type_node cp_global_trees[CPTI_JAVA_BOOLEAN_TYPE]
447
448#define void_zero_node cp_global_trees[CPTI_VOID_ZERO]
449#define wchar_decl_node cp_global_trees[CPTI_WCHAR_DECL]
450#define vtable_entry_type cp_global_trees[CPTI_VTABLE_ENTRY_TYPE]
451#define delta_type_node cp_global_trees[CPTI_DELTA_TYPE]
452#define __tp_desc_type_node cp_global_trees[CPTI_TP_DESC_TYPE]
453#define __access_mode_type_node cp_global_trees[CPTI_ACCESS_MODE_TYPE]
454#define __bltn_desc_type_node cp_global_trees[CPTI_BLTN_DESC_TYPE]
455#define __user_desc_type_node cp_global_trees[CPTI_USER_DESC_TYPE]
456#define __class_desc_type_node cp_global_trees[CPTI_CLASS_DESC_TYPE]
457#define __ptr_desc_type_node cp_global_trees[CPTI_PTR_DESC_TYPE]
458#define __attr_desc_type_node cp_global_trees[CPTI_ATTR_DESC_TYPE]
459#define __func_desc_type_node cp_global_trees[CPTI_FUNC_DESC_TYPE]
460#define __ptmf_desc_type_node cp_global_trees[CPTI_PTMF_DESC_TYPE]
461#define __ptmd_desc_type_node cp_global_trees[CPTI_PTMD_DESC_TYPE]
462#define class_star_type_node cp_global_trees[CPTI_CLASS_STAR_TYPE]
463#define class_type_node cp_global_trees[CPTI_CLASS_TYPE]
464#define record_type_node cp_global_trees[CPTI_RECORD_TYPE]
465#define union_type_node cp_global_trees[CPTI_UNION_TYPE]
466#define enum_type_node cp_global_trees[CPTI_ENUM_TYPE]
467#define unknown_type_node cp_global_trees[CPTI_UNKNOWN_TYPE]
7f4edbcb
BS
468#define vtbl_type_node cp_global_trees[CPTI_VTBL_TYPE]
469#define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE]
470#define std_node cp_global_trees[CPTI_STD]
471#define type_info_type_node cp_global_trees[CPTI_TYPE_INFO_TYPE]
472#define tinfo_fn_id cp_global_trees[CPTI_TINFO_FN_ID]
473#define tinfo_fn_type cp_global_trees[CPTI_TINFO_FN_TYPE]
474#define abort_fndecl cp_global_trees[CPTI_ABORT_FNDECL]
475#define global_delete_fndecl cp_global_trees[CPTI_GLOBAL_DELETE_FNDECL]
ea419909 476
9cd64686
MM
477/* Define the sets of attributes that member functions and baseclasses
478 can have. These are sensible combinations of {public,private,protected}
479 cross {virtual,non-virtual}. */
480
481#define access_default_node cp_global_trees[CPTI_ACCESS_DEFAULT]
482#define access_public_node cp_global_trees[CPTI_ACCESS_PUBLIC]
483#define access_protected_node cp_global_trees[CPTI_ACCESS_PROTECTED]
484#define access_private_node cp_global_trees[CPTI_ACCESS_PRIVATE]
485#define access_default_virtual_node cp_global_trees[CPTI_ACCESS_DEFAULT_VIRTUAL]
486#define access_public_virtual_node cp_global_trees[CPTI_ACCESS_PUBLIC_VIRTUAL]
487#define access_protected_virtual_node cp_global_trees[CPTI_ACCESS_PROTECTED_VIRTUAL]
488#define access_private_virtual_node cp_global_trees[CPTI_ACCESS_PRIVATE_VIRTUAL]
489
490/* We cache these tree nodes so as to call get_identifier less
491 frequently. */
492
493#define ctor_identifier cp_global_trees[CPTI_CTOR_IDENTIFIER]
494#define delta2_identifier cp_global_trees[CPTI_DELTA2_IDENTIFIER]
495#define delta_identifier cp_global_trees[CPTI_DELTA_IDENTIFIER]
496#define dtor_identifier cp_global_trees[CPTI_DTOR_IDENTIFIER]
497#define in_charge_identifier cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
498#define index_identifier cp_global_trees[CPTI_INDEX_IDENTIFIER]
499#define nelts_identifier cp_global_trees[CPTI_NELTS_IDENTIFIER]
500#define this_identifier cp_global_trees[CPTI_THIS_IDENTIFIER]
501#define pfn_identifier cp_global_trees[CPTI_PFN_IDENTIFIER]
502#define pfn_or_delta2_identifier cp_global_trees[CPTI_PFN_OR_DELTA2_IDENTIFIER]
503#define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER]
504
505#define lang_name_c cp_global_trees[CPTI_LANG_NAME_C]
506#define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
507#define lang_name_java cp_global_trees[CPTI_LANG_NAME_JAVA]
508
509/* Exception specifier used for throw(). */
510#define empty_except_spec cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
511
512/* The node for `__null'. */
513#define null_node cp_global_trees[CPTI_NULL]
514
515/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */
516#define jclass_node cp_global_trees[CPTI_JCLASS]
517
518/* A node for `(int) -1'. */
519#define minus_one_node cp_global_trees[CPTI_MINUS_ONE]
520
521/* The declaration for `std::terminate'. */
522#define terminate_node cp_global_trees[CPTI_TERMINATE]
523
f0105ed3
MM
524/* The declaration for `std::atexit'. */
525#define atexit_node cp_global_trees[CPTI_ATEXIT]
526
9cd64686
MM
527/* Global state. */
528
529struct saved_scope {
9cd64686
MM
530 tree old_bindings;
531 tree old_namespace;
fc0e7bf5
MM
532 tree class_name;
533 tree class_type;
9cd64686 534 tree access_specifier;
a8f73d4b 535 tree function_decl;
9cd64686
MM
536 varray_type lang_base;
537 tree *lang_stack;
538 tree lang_name;
539 tree x_function_parms;
540 tree template_parms;
9cd64686
MM
541 tree x_previous_class_type;
542 tree x_previous_class_values;
fc0e7bf5
MM
543
544 HOST_WIDE_INT x_processing_template_decl;
9cd64686
MM
545 int x_processing_specialization;
546 int x_processing_explicit_instantiation;
a8f73d4b 547 int need_pop_function_context;
fc0e7bf5 548
9cd64686 549 char *firstobj;
fc0e7bf5
MM
550
551 struct binding_level *class_bindings;
a8f73d4b 552 struct binding_level *bindings;
fc0e7bf5
MM
553
554 struct saved_scope *prev;
9cd64686
MM
555};
556
557/* The current open namespace. */
558
559#define current_namespace scope_chain->old_namespace
560
561/* IDENTIFIER_NODE: name of current class */
562
563#define current_class_name scope_chain->class_name
564
565/* _TYPE: the type of the current class */
566
567#define current_class_type scope_chain->class_type
568
569/* When parsing a class definition, the access specifier most recently
570 given by the user, or, if no access specifier was given, the
571 default value appropriate for the kind of class (i.e., struct,
572 class, or union). */
573
574#define current_access_specifier scope_chain->access_specifier
575
576/* Pointer to the top of the language name stack. */
577
578#define current_lang_stack scope_chain->lang_stack
579#define current_lang_base scope_chain->lang_base
580#define current_lang_name scope_chain->lang_name
581
582/* Parsing a function declarator leaves a list of parameter names
583 or a chain or parameter decls here. */
584
585#define current_function_parms scope_chain->x_function_parms
586#define current_template_parms scope_chain->template_parms
587
588#define processing_template_decl scope_chain->x_processing_template_decl
589#define processing_specialization scope_chain->x_processing_specialization
590#define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation
591
592/* _TYPE: the previous type that was a class */
593
594#define previous_class_type scope_chain->x_previous_class_type
595
596/* This is a copy of the class_shadowed list of the previous class
597 binding contour when at global scope. It's used to reset
598 IDENTIFIER_CLASS_VALUEs when entering another class scope (i.e. a
599 cache miss). */
600
601#define previous_class_values scope_chain->x_previous_class_values
602
603/* The low-water mark on the class-cache obstack. */
604
605#define class_cache_firstobj scope_chain->firstobj
606
607extern struct saved_scope *scope_chain;
608
8012c983
MM
609/* Global state pertinent to the current function. */
610
99dccabc 611struct language_function
8012c983 612{
4519c0a8
MM
613 tree x_named_labels;
614 tree x_ctor_label;
615 tree x_dtor_label;
616 tree x_base_init_list;
617 tree x_member_init_list;
618 tree x_base_init_expr;
619 tree x_current_class_ptr;
620 tree x_current_class_ref;
621 tree x_last_tree;
622 tree x_last_expr_type;
623
624 struct rtx_def *x_last_dtor_insn;
625 struct rtx_def *x_last_parm_cleanup_insn;
626 struct rtx_def *x_result_rtx;
8012c983
MM
627
628 int returns_value;
629 int returns_null;
630 int assigns_this;
631 int just_assigned_this;
632 int parms_stored;
633 int temp_name_counter;
634 int static_labelno;
635 int in_function_try_handler;
636 int expanding_p;
637 int stmts_are_full_exprs_p;
638
639 struct named_label_list *named_label_uses;
a8f73d4b 640 struct binding_level *bindings;
8012c983
MM
641};
642
99dccabc 643/* The current C++-specific per-function global variables. */
8012c983 644
a8f73d4b 645#define cp_function_chain (current_function->language)
8012c983
MM
646
647/* In a destructor, the point at which all derived class destroying
648 has been done, just before any base class destroying will be done. */
649
4519c0a8 650#define dtor_label cp_function_chain->x_dtor_label
8012c983
MM
651
652/* In a constructor, the point at which we are ready to return
653 the pointer to the initialized object. */
654
4519c0a8 655#define ctor_label cp_function_chain->x_ctor_label
8012c983
MM
656
657/* In C++, structures with well-defined constructors are initialized by
658 those constructors, unasked. CURRENT_BASE_INIT_LIST
659 holds a list of stmts for a BASE_INIT term in the grammar.
660 This list has one element for each base class which must be
661 initialized. The list elements are [basename, init], with
662 type basetype. This allows the possibly anachronistic form
663 (assuming d : a, b, c) "d (int a) : c(a+5), b (a-4), a (a+3)"
664 where each successive term can be handed down the constructor
665 line. Perhaps this was not intended. */
666
4519c0a8
MM
667#define current_base_init_list cp_function_chain->x_base_init_list
668#define current_member_init_list cp_function_chain->x_member_init_list
8012c983
MM
669
670/* Sequence of insns which represents base initialization. */
671
4519c0a8 672#define base_init_expr cp_function_chain->x_base_init_expr
8012c983
MM
673
674/* When we're processing a member function, current_class_ptr is the
675 PARM_DECL for the `this' pointer. The current_class_ref is an
676 expression for `*this'. */
677
a8f73d4b
MM
678#define current_class_ptr \
679 (current_function ? cp_function_chain->x_current_class_ptr : NULL_TREE)
680#define current_class_ref \
681 (current_function ? cp_function_chain->x_current_class_ref : NULL_TREE)
8012c983
MM
682
683/* When building a statement-tree, this is the last node added to the
684 tree. */
685
4519c0a8 686#define last_tree cp_function_chain->x_last_tree
8012c983
MM
687
688/* The type of the last expression-statement we have seen. This is
689 required because the type of a statement-expression is the type of
690 the last expression statement. */
691
4519c0a8 692#define last_expr_type cp_function_chain->x_last_expr_type
8d08fdba 693
8012c983
MM
694/* Set to 0 at beginning of a function definition, set to 1 if
695 a return statement that specifies a return value is seen. */
696
697#define current_function_returns_value cp_function_chain->returns_value
698
699/* Set to 0 at beginning of a function definition, set to 1 if
700 a return statement with no argument is seen. */
701
702#define current_function_returns_null cp_function_chain->returns_null
703
704#define current_function_just_assigned_this \
705 cp_function_chain->just_assigned_this
706
707#define current_function_parms_stored \
708 cp_function_chain->parms_stored
709
710/* Used to help generate temporary names which are unique within
711 a function. Reset to 0 by start_function. */
712
713#define temp_name_counter cp_function_chain->temp_name_counter
714
715#define static_labelno cp_function_chain->static_labelno
716
717/* Non-zero if we should generate RTL for functions that we process.
718 When this is zero, we just accumulate tree structure, without
719 interacting with the back end. */
720
721#define expanding_p cp_function_chain->expanding_p
722
723/* Non-zero if we should treat statements as full expressions. In
724 particular, this variable is no-zero if at the end of a statement
725 we should destroy any temporaries created during that statement.
726 Similarly, if, at the end of a block, we should destroy any local
727 variables in this block. Normally, this variable is non-zero,
728 since those are the normal semantics of C++.
729
730 However, in order to represent aggregate initialization code as
731 tree structure, we use statement-expressions. The statements
732 within the statement expression should not result in cleanups being
733 run until the entire enclosing statement is complete. */
734
735#define stmts_are_full_exprs_p cp_function_chain->stmts_are_full_exprs_p
736
737#define in_function_try_handler cp_function_chain->in_function_try_handler
738
739extern tree current_function_return_value;
30394414
JM
740extern tree global_namespace;
741
8d08fdba
MS
742extern tree ridpointers[];
743extern tree ansi_opname[];
744extern tree ansi_assopname[];
9cd64686 745extern tree null_pointer_node;
8d08fdba
MS
746
747/* Nonzero means `$' can be in an identifier. */
748
749extern int dollars_in_ident;
750
751/* Nonzero means allow type mismatches in conditional expressions;
752 just make their values `void'. */
753
754extern int flag_cond_mismatch;
755
756/* Nonzero means don't recognize the keyword `asm'. */
757
758extern int flag_no_asm;
759
760/* For cross referencing. */
761
762extern int flag_gnu_xref;
763
764/* For environments where you can use GNU binutils (as, ld in particular). */
765
766extern int flag_gnu_binutils;
767
8d08fdba
MS
768/* Nonzero means warn about implicit declarations. */
769
770extern int warn_implicit;
771
795add94
VM
772/* Nonzero means warn about usage of long long when `-pedantic'. */
773
774extern int warn_long_long;
775
8d08fdba
MS
776/* Nonzero means warn when all ctors or dtors are private, and the class
777 has no friends. */
778
779extern int warn_ctor_dtor_privacy;
780
781/* Nonzero means warn about function definitions that default the return type
782 or that use a null return and have a return-type other than void. */
783
784extern int warn_return_type;
785
d9cf7c82
JM
786/* Nonzero means give string constants the type `const char *', as mandated
787 by the standard. */
788
789extern int flag_const_strings;
790
791/* Nonzero means warn about deprecated conversion from string constant to
792 `char *'. */
8d08fdba
MS
793
794extern int warn_write_strings;
795
796/* Nonzero means warn about sizeof(function) or addition/subtraction
797 of function pointers. */
798
799extern int warn_pointer_arith;
800
8d08fdba
MS
801/* Nonzero means warn about suggesting putting in ()'s. */
802
803extern int warn_parentheses;
804
805/* Nonzero means warn about multiple (redundant) decls for the same single
806 variable or function. */
807
808extern int warn_redundant_decls;
809
810/* Warn if initializer is not completely bracketed. */
811
812extern int warn_missing_braces;
813
2ee887f2
MS
814/* Warn about comparison of signed and unsigned values. */
815
816extern int warn_sign_compare;
817
8d08fdba
MS
818/* Warn about a subscript that has type char. */
819
820extern int warn_char_subscripts;
821
822/* Nonzero means warn about pointer casts that can drop a type qualifier
823 from the pointer target type. */
824
825extern int warn_cast_qual;
826
e92cc029 827/* Warn about *printf or *scanf format/argument anomalies. */
8d08fdba
MS
828
829extern int warn_format;
830
831/* Nonzero means warn about non virtual destructors in classes that have
e92cc029 832 virtual functions. */
8d08fdba
MS
833
834extern int warn_nonvdtor;
835
9a3b49ac
MS
836/* Non-zero means warn when we convert a pointer to member function
837 into a pointer to (void or function). */
838
839extern int warn_pmf2ptr;
840
eb448459
MS
841/* Nonzero means warn about violation of some Effective C++ style rules. */
842
843extern int warn_ecpp;
844
da20811c
JM
845/* Nonzero means warn where overload resolution chooses a promotion from
846 unsigned to signed over a conversion to an unsigned of the same size. */
847
848extern int warn_sign_promo;
849
8d08fdba 850/* Non-zero means warn when a function is declared extern and later inline. */
eb448459 851
8d08fdba
MS
852extern int warn_extern_inline;
853
0c4b14c4
JM
854/* Non-zero means warn when an old-style cast is used. */
855
856extern int warn_old_style_cast;
857
8d08fdba
MS
858/* Nonzero means to treat bitfields as unsigned unless they say `signed'. */
859
860extern int flag_signed_bitfields;
861
38e01259 862/* True for more efficient but incompatible (not fully tested)
8926095f 863 vtable implementation (using thunks).
e92cc029 864 0 is old behavior; 1 is new behavior. */
8926095f 865extern int flag_vtable_thunks;
51c184be 866
8d08fdba
MS
867/* INTERFACE_ONLY nonzero means that we are in an "interface"
868 section of the compiler. INTERFACE_UNKNOWN nonzero means
869 we cannot trust the value of INTERFACE_ONLY. If INTERFACE_UNKNOWN
870 is zero and INTERFACE_ONLY is zero, it means that we are responsible
871 for exporting definitions that others might need. */
872extern int interface_only, interface_unknown;
873
874/* Nonzero means we should attempt to elide constructors when possible. */
875
876extern int flag_elide_constructors;
877
e1cd6e56
MS
878/* Nonzero means enable obscure ANSI features and disable GNU extensions
879 that might cause ANSI-compliant code to be miscompiled. */
39211cd5
MS
880
881extern int flag_ansi;
882
8d08fdba
MS
883/* Nonzero means that member functions defined in class scope are
884 inline by default. */
885
886extern int flag_default_inline;
386b8a85
JM
887
888/* The name-mangling scheme to use. Versions of gcc before 2.8 use
889 version 0. */
890extern int name_mangling_version;
891
892/* Nonzero means that guiding declarations are allowed. */
893extern int flag_guiding_decls;
894
5bd17905
AM
895/* Nonzero if squashed mangling is to be performed.
896 This uses the B and K codes to reference previously seen class types
897 and class qualifiers. */
898extern int flag_do_squangling;
899
2aaf816d
JM
900/* Nonzero means generate separate instantiation control files and juggle
901 them at link time. */
902extern int flag_use_repository;
903
dc8263bc
JM
904/* Nonzero if we want to issue diagnostics that the standard says are not
905 required. */
906extern int flag_optional_diags;
a1dd0d36 907
830fcda8
JM
908/* Nonzero means do not consider empty argument prototype to mean function
909 takes no arguments. */
830fcda8
JM
910extern int flag_strict_prototype;
911
a1dd0d36
JM
912/* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc. */
913extern int flag_vtable_gc;
2642b9bf
JM
914
915/* Nonzero means make the default pedwarns warnings instead of errors.
916 The value of this flag is ignored if -pedantic is specified. */
dfcafcb6 917extern int flag_permissive;
d6479fe7
MM
918
919/* Nonzero if we want to obey access control semantics. */
920
921extern int flag_access_control;
922
1b12a13e
MM
923/* If this variable is defined to a non-NULL value, it will be called
924 after the file has been completely parsed. The argument will be
925 the GLOBAL_NAMESPACE. */
926
927extern void (*back_end_hook) PROTO((tree));
928
8d08fdba
MS
929\f
930/* C++ language-specific tree codes. */
931#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM,
932enum cplus_tree_code {
933 __DUMMY = LAST_AND_UNUSED_TREE_CODE,
e92cc029 934#include "cp-tree.def"
8d08fdba
MS
935 LAST_CPLUS_TREE_CODE
936};
937#undef DEFTREECODE
938
fcad5cf5 939enum languages { lang_c, lang_cplusplus, lang_java };
8d08fdba
MS
940
941/* Macros to make error reporting functions' lives easier. */
942#define TYPE_IDENTIFIER(NODE) (DECL_NAME (TYPE_NAME (NODE)))
943#define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE)))
944#define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE)))
945
946#define TYPE_ASSEMBLER_NAME_STRING(NODE) (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE))))
947#define TYPE_ASSEMBLER_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE))))
948
a4443a08 949/* The _DECL for this _TYPE. */
d2e5ee5c 950#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
a4443a08 951
c92366fb 952/* Nonzero if T is a class (or struct or union) type. Also nonzero
83233dca
MM
953 for template type parameters, typename types, and instantiated
954 template template parameters. Despite its name,
b80c4d77
MM
955 this macro has nothing to do with the definition of aggregate given
956 in the standard. Think of this macro as MAYBE_CLASS_TYPE_P. */
7ddedda4 957#define IS_AGGR_TYPE(t) \
83233dca
MM
958 (TREE_CODE (t) == TEMPLATE_TYPE_PARM \
959 || TREE_CODE (t) == TYPENAME_TYPE \
7ddedda4 960 || TREE_CODE (t) == TYPEOF_TYPE \
83233dca
MM
961 || (TREE_CODE (t) == TEMPLATE_TEMPLATE_PARM \
962 && TYPE_TEMPLATE_INFO (t)) \
7ddedda4
MM
963 || TYPE_LANG_FLAG_5 (t))
964
965/* Set IS_AGGR_TYPE for T to VAL. T must be a class, struct, or
966 union type. */
967#define SET_IS_AGGR_TYPE(T, VAL) \
968 (TYPE_LANG_FLAG_5 (T) = (VAL))
c92366fb 969
b80c4d77
MM
970/* Nonzero if T is a class type. Zero for template type parameters,
971 typename types, and so forth. */
c92366fb 972#define CLASS_TYPE_P(t) \
7ddedda4 973 (IS_AGGR_TYPE_CODE (TREE_CODE (t)) && IS_AGGR_TYPE (t))
c92366fb 974
5566b478 975#define IS_AGGR_TYPE_CODE(t) (t == RECORD_TYPE || t == UNION_TYPE)
8d08fdba
MS
976#define IS_AGGR_TYPE_2(TYPE1,TYPE2) \
977 (TREE_CODE (TYPE1) == TREE_CODE (TYPE2) \
829297e6 978 && IS_AGGR_TYPE (TYPE1) && IS_AGGR_TYPE (TYPE2))
6467930b
MS
979#define IS_OVERLOAD_TYPE(t) \
980 (IS_AGGR_TYPE (t) || TREE_CODE (t) == ENUMERAL_TYPE)
8d08fdba
MS
981
982/* In a *_TYPE, nonzero means a built-in type. */
983#define TYPE_BUILT_IN(NODE) TYPE_LANG_FLAG_6(NODE)
984
ea419909
PB
985/* True if this a "Java" type, defined in 'extern "Java"'. */
986#define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3(NODE)
987
91063b51
MM
988/* The type qualifiers for this type, including the qualifiers on the
989 elements for an array type. */
990#define CP_TYPE_QUALS(NODE) \
991 ((TREE_CODE (NODE) != ARRAY_TYPE) \
992 ? TYPE_QUALS (NODE) : cp_type_quals (NODE))
993
994/* Nonzero if this type is const-qualified. */
995#define CP_TYPE_CONST_P(NODE) \
174bcdb9 996 ((CP_TYPE_QUALS (NODE) & TYPE_QUAL_CONST) != 0)
91063b51
MM
997
998/* Nonzero if this type is volatile-qualified. */
999#define CP_TYPE_VOLATILE_P(NODE) \
174bcdb9 1000 ((CP_TYPE_QUALS (NODE) & TYPE_QUAL_VOLATILE) != 0)
91063b51 1001
174bcdb9 1002/* Nonzero if this type is restrict-qualified. */
91063b51 1003#define CP_TYPE_RESTRICT_P(NODE) \
174bcdb9 1004 ((CP_TYPE_QUALS (NODE) & TYPE_QUAL_RESTRICT) != 0)
91063b51
MM
1005
1006/* Nonzero if this type is const-qualified, but not
1007 volatile-qualified. Other qualifiers are ignored. This macro is
1008 used to test whether or not it is OK to bind an rvalue to a
1009 reference. */
1010#define CP_TYPE_CONST_NON_VOLATILE_P(NODE) \
1011 ((CP_TYPE_QUALS (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) \
1012 == TYPE_QUAL_CONST)
1013
21474714
MS
1014#define DELTA_FROM_VTABLE_ENTRY(ENTRY) \
1015 (!flag_vtable_thunks ? \
1016 TREE_VALUE (CONSTRUCTOR_ELTS (ENTRY)) \
1017 : TREE_CODE (TREE_OPERAND ((ENTRY), 0)) != THUNK_DECL ? integer_zero_node \
1018 : build_int_2 (THUNK_DELTA (TREE_OPERAND ((ENTRY), 0)), 0))
bd6dd845 1019
8d08fdba
MS
1020/* Virtual function addresses can be gotten from a virtual function
1021 table entry using this macro. */
1022#define FNADDR_FROM_VTABLE_ENTRY(ENTRY) \
8926095f
MS
1023 (!flag_vtable_thunks ? \
1024 TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) \
1025 : TREE_CODE (TREE_OPERAND ((ENTRY), 0)) != THUNK_DECL ? (ENTRY) \
1026 : DECL_INITIAL (TREE_OPERAND ((ENTRY), 0)))
8d08fdba
MS
1027#define SET_FNADDR_FROM_VTABLE_ENTRY(ENTRY,VALUE) \
1028 (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) = (VALUE))
8d08fdba
MS
1029#define FUNCTION_ARG_CHAIN(NODE) (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE))))
1030#define PROMOTES_TO_AGGR_TYPE(NODE,CODE) \
1031 (((CODE) == TREE_CODE (NODE) \
1032 && IS_AGGR_TYPE (TREE_TYPE (NODE))) \
1033 || IS_AGGR_TYPE (NODE))
1034
8d08fdba
MS
1035/* Nonzero iff TYPE is uniquely derived from PARENT. Under MI, PARENT can
1036 be an ambiguous base class of TYPE, and this macro will be false. */
1037#define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) >= 0)
1038#define ACCESSIBLY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, -1, (tree *)0) >= 0)
1039#define ACCESSIBLY_UNIQUELY_DERIVED_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 1, (tree *)0) >= 0)
a0a33927 1040#define DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) != -1)
8d08fdba 1041\f
7ddedda4
MM
1042/* This structure provides additional information above and beyond
1043 what is provide in the ordinary tree_type. In the past, we used it
1044 for the types of class types, template parameters types, typename
1045 types, and so forth. However, there can be many (tens to hundreds
1046 of thousands) of template parameter types in a compilation, and
1047 there's no need for this additional information in that case.
1048 Therefore, we now use this data structure only for class types.
1049
1050 In the past, it was thought that there would be relatively few
1051 class types. However, in the presence of heavy use of templates,
1052 many (i.e., thousands) of classes can easily be generated.
1053 Therefore, we should endeavor to keep the size of this structure to
1054 a minimum. */
8d08fdba
MS
1055struct lang_type
1056{
8012c983
MM
1057 unsigned char align;
1058
1059 unsigned has_type_conversion : 1;
1060 unsigned has_init_ref : 1;
1061 unsigned has_default_ctor : 1;
1062 unsigned uses_multiple_inheritance : 1;
1063 unsigned const_needs_init : 1;
1064 unsigned ref_needs_init : 1;
1065 unsigned has_const_assign_ref : 1;
1066 unsigned anon_aggr : 1;
1067
1068 unsigned has_nonpublic_ctor : 2;
1069 unsigned has_nonpublic_assign_ref : 2;
1070 unsigned vtable_needs_writing : 1;
1071 unsigned has_assign_ref : 1;
1072 unsigned gets_new : 2;
1073
1074 unsigned gets_delete : 2;
1075 unsigned has_call_overloaded : 1;
1076 unsigned has_array_ref_overloaded : 1;
1077 unsigned has_arrow_overloaded : 1;
1078 unsigned interface_only : 1;
1079 unsigned interface_unknown : 1;
1080 unsigned needs_virtual_reinit : 1;
1081
1082 unsigned marks: 6;
1083 unsigned vec_delete_takes_size : 1;
1084 unsigned declared_class : 1;
1085
1086 unsigned being_defined : 1;
1087 unsigned redefined : 1;
1088 unsigned debug_requested : 1;
1089 unsigned use_template : 2;
1090 unsigned got_semicolon : 1;
1091 unsigned ptrmemfunc_flag : 1;
1092 unsigned was_anonymous : 1;
1093
1094 unsigned has_real_assign_ref : 1;
1095 unsigned has_const_init_ref : 1;
1096 unsigned has_complex_init_ref : 1;
1097 unsigned has_complex_assign_ref : 1;
1098 unsigned has_abstract_assign_ref : 1;
1099 unsigned non_aggregate : 1;
1100 unsigned is_partial_instantiation : 1;
1101 unsigned has_mutable : 1;
1102
1103 unsigned com_interface : 1;
1104 unsigned non_pod_class : 1;
1105
1106 /* When adding a flag here, consider whether or not it ought to
1107 apply to a template instance if it applies to the template. If
1108 so, make sure to copy it in instantiate_class_template! */
1109
1110 /* There are six bits left to fill out a 32-bit word. Keep track of
1111 this by updating the size of this bitfield whenever you add or
1112 remove a flag. */
1113 unsigned dummy : 6;
c7f9c6f5 1114
8d08fdba 1115 int vsize;
8d08fdba
MS
1116 int vfield_parent;
1117
8d08fdba
MS
1118 union tree_node *vfields;
1119 union tree_node *vbases;
8d08fdba
MS
1120
1121 union tree_node *tags;
8d08fdba 1122
fc378698 1123 union tree_node *search_slot;
8d08fdba 1124
8d08fdba
MS
1125 union tree_node *size;
1126
8d08fdba 1127 union tree_node *abstract_virtuals;
8d08fdba
MS
1128 union tree_node *friend_classes;
1129
db5ae43f 1130 union tree_node *rtti;
8d08fdba 1131
51c184be
MS
1132 union tree_node *methods;
1133
5566b478 1134 union tree_node *template_info;
6a629cac 1135 tree befriending_classes;
8d08fdba
MS
1136};
1137
a0a33927
MS
1138/* Indicates whether or not (and how) a template was expanded for this class.
1139 0=no information yet/non-template class
1140 1=implicit template instantiation
1141 2=explicit template specialization
1142 3=explicit template instantiation */
8012c983 1143#define CLASSTYPE_USE_TEMPLATE(NODE) (TYPE_LANG_SPECIFIC(NODE)->use_template)
8d08fdba
MS
1144
1145/* Fields used for storing information before the class is defined.
1146 After the class is defined, these fields hold other information. */
1147
1148/* List of friends which were defined inline in this class definition. */
1149#define CLASSTYPE_INLINE_FRIENDS(NODE) (TYPE_NONCOPIED_PARTS (NODE))
1150
8d08fdba
MS
1151/* Nonzero for _CLASSTYPE means that operator new and delete are defined,
1152 respectively. */
8012c983
MM
1153#define TYPE_GETS_NEW(NODE) (TYPE_LANG_SPECIFIC(NODE)->gets_new)
1154#define TYPE_GETS_DELETE(NODE) (TYPE_LANG_SPECIFIC(NODE)->gets_delete)
a28e3c7f
MS
1155#define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1)
1156
1157/* Nonzero for _CLASSTYPE means that operator vec delete is defined and
1158 takes the optional size_t argument. */
1159#define TYPE_VEC_DELETE_TAKES_SIZE(NODE) \
8012c983 1160 (TYPE_LANG_SPECIFIC(NODE)->vec_delete_takes_size)
a28e3c7f
MS
1161#define TYPE_VEC_NEW_USES_COOKIE(NODE) \
1162 (TYPE_NEEDS_DESTRUCTOR (NODE) \
1163 || (TYPE_LANG_SPECIFIC (NODE) && TYPE_VEC_DELETE_TAKES_SIZE (NODE)))
8d08fdba 1164
8d08fdba
MS
1165/* Nonzero means that this _CLASSTYPE node defines ways of converting
1166 itself to other types. */
8012c983 1167#define TYPE_HAS_CONVERSION(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_type_conversion)
8d08fdba 1168
8d08fdba 1169/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */
8012c983
MM
1170#define TYPE_HAS_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_assign_ref)
1171#define TYPE_HAS_CONST_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_const_assign_ref)
8d08fdba
MS
1172
1173/* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */
8012c983
MM
1174#define TYPE_HAS_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_init_ref)
1175#define TYPE_HAS_CONST_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_const_init_ref)
8d08fdba 1176
8d08fdba
MS
1177/* Nonzero means that this type is being defined. I.e., the left brace
1178 starting the definition of this type has been seen. */
8012c983 1179#define TYPE_BEING_DEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->being_defined)
8d08fdba
MS
1180/* Nonzero means that this type has been redefined. In this case, if
1181 convenient, don't reprocess any methods that appear in its redefinition. */
8012c983 1182#define TYPE_REDEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->redefined)
8d08fdba 1183
9e0781b5 1184/* The is the basetype that contains NODE's rtti. */
db5ae43f 1185#define CLASSTYPE_RTTI(NODE) (TYPE_LANG_SPECIFIC(NODE)->rtti)
8d08fdba
MS
1186
1187/* Nonzero means that this _CLASSTYPE node overloads operator(). */
8012c983 1188#define TYPE_OVERLOADS_CALL_EXPR(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_call_overloaded)
8d08fdba
MS
1189
1190/* Nonzero means that this _CLASSTYPE node overloads operator[]. */
8012c983 1191#define TYPE_OVERLOADS_ARRAY_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_array_ref_overloaded)
8d08fdba
MS
1192
1193/* Nonzero means that this _CLASSTYPE node overloads operator->. */
8012c983 1194#define TYPE_OVERLOADS_ARROW(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_arrow_overloaded)
8d08fdba
MS
1195
1196/* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses
1197 multiple inheritance. If this is 0 for the root of a type
1198 hierarchy, then we can use more efficient search techniques. */
8012c983 1199#define TYPE_USES_MULTIPLE_INHERITANCE(NODE) (TYPE_LANG_SPECIFIC(NODE)->uses_multiple_inheritance)
8d08fdba
MS
1200
1201/* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses
1202 virtual base classes. If this is 0 for the root of a type
1203 hierarchy, then we can use more efficient search techniques. */
1204#define TYPE_USES_VIRTUAL_BASECLASSES(NODE) (TREE_LANG_FLAG_3(NODE))
1205
61a127b3 1206/* Vector member functions defined in this class. Each element is
03017874
MM
1207 either a FUNCTION_DECL, a TEMPLATE_DECL, or an OVERLOAD. All
1208 functions with the same name end up in the same slot. The first
61a127b3 1209 two elements are for constructors, and destructors, respectively.
03017874
MM
1210 These are followed by ordinary member functions. There may be
1211 empty entries at the end of the vector. */
72b7eeff 1212#define CLASSTYPE_METHOD_VEC(NODE) (TYPE_LANG_SPECIFIC(NODE)->methods)
8d08fdba 1213
e1cd6e56
MS
1214/* The first type conversion operator in the class (the others can be
1215 searched with TREE_CHAIN), or the first non-constructor function if
1216 there are no type conversion operators. */
1217#define CLASSTYPE_FIRST_CONVERSION(NODE) \
fc378698
MS
1218 TREE_VEC_LENGTH (CLASSTYPE_METHOD_VEC (NODE)) > 2 \
1219 ? TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (NODE), 2) \
8ccc31eb 1220 : NULL_TREE;
e1cd6e56 1221
8d08fdba 1222/* Mark bits for depth-first and breath-first searches. */
7ddedda4
MM
1223
1224/* Get the value of the Nth mark bit. */
1225#define CLASSTYPE_MARKED_N(NODE, N) \
8012c983 1226 (((CLASS_TYPE_P (NODE) ? TYPE_LANG_SPECIFIC (NODE)->marks \
7ddedda4
MM
1227 : TYPE_ALIAS_SET (NODE)) & (1 << N)) != 0)
1228
1229/* Set the Nth mark bit. */
1230#define SET_CLASSTYPE_MARKED_N(NODE, N) \
1231 (CLASS_TYPE_P (NODE) \
8012c983 1232 ? (TYPE_LANG_SPECIFIC (NODE)->marks |= (1 << (N))) \
7ddedda4
MM
1233 : (TYPE_ALIAS_SET (NODE) |= (1 << (N))))
1234
1235/* Clear the Nth mark bit. */
1236#define CLEAR_CLASSTYPE_MARKED_N(NODE, N) \
1237 (CLASS_TYPE_P (NODE) \
8012c983 1238 ? (TYPE_LANG_SPECIFIC (NODE)->marks &= ~(1 << (N))) \
7ddedda4
MM
1239 : (TYPE_ALIAS_SET (NODE) &= ~(1 << (N))))
1240
1241/* Get the value of the mark bits. */
1242#define CLASSTYPE_MARKED(NODE) CLASSTYPE_MARKED_N(NODE, 0)
1243#define CLASSTYPE_MARKED2(NODE) CLASSTYPE_MARKED_N(NODE, 1)
1244#define CLASSTYPE_MARKED3(NODE) CLASSTYPE_MARKED_N(NODE, 2)
1245#define CLASSTYPE_MARKED4(NODE) CLASSTYPE_MARKED_N(NODE, 3)
1246#define CLASSTYPE_MARKED5(NODE) CLASSTYPE_MARKED_N(NODE, 4)
1247#define CLASSTYPE_MARKED6(NODE) CLASSTYPE_MARKED_N(NODE, 5)
1248
8d08fdba 1249/* Macros to modify the above flags */
7ddedda4
MM
1250#define SET_CLASSTYPE_MARKED(NODE) SET_CLASSTYPE_MARKED_N(NODE, 0)
1251#define CLEAR_CLASSTYPE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 0)
1252#define SET_CLASSTYPE_MARKED2(NODE) SET_CLASSTYPE_MARKED_N(NODE, 1)
1253#define CLEAR_CLASSTYPE_MARKED2(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 1)
1254#define SET_CLASSTYPE_MARKED3(NODE) SET_CLASSTYPE_MARKED_N(NODE, 2)
1255#define CLEAR_CLASSTYPE_MARKED3(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 2)
1256#define SET_CLASSTYPE_MARKED4(NODE) SET_CLASSTYPE_MARKED_N(NODE, 3)
1257#define CLEAR_CLASSTYPE_MARKED4(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 3)
1258#define SET_CLASSTYPE_MARKED5(NODE) SET_CLASSTYPE_MARKED_N(NODE, 4)
1259#define CLEAR_CLASSTYPE_MARKED5(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 4)
1260#define SET_CLASSTYPE_MARKED6(NODE) SET_CLASSTYPE_MARKED_N(NODE, 5)
1261#define CLEAR_CLASSTYPE_MARKED6(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 5)
8d08fdba 1262
35acd3f2
MM
1263/* A list of the nested tag-types (class, struct, union, or enum)
1264 found within this class. The TREE_PURPOSE of each node is the name
1265 of the type; the TREE_VALUE is the type itself. This list includes
1266 nested member class templates. */
8d08fdba
MS
1267#define CLASSTYPE_TAGS(NODE) (TYPE_LANG_SPECIFIC(NODE)->tags)
1268
1269/* If this class has any bases, this is the number of the base class from
1270 which our VFIELD is based, -1 otherwise. If this class has no base
1271 classes, this is not used.
1272 In D : B1, B2, PARENT would be 0, if D's vtable came from B1,
e92cc029 1273 1, if D's vtable came from B2. */
8d08fdba
MS
1274#define CLASSTYPE_VFIELD_PARENT(NODE) (TYPE_LANG_SPECIFIC(NODE)->vfield_parent)
1275
1276/* Remove when done merging. */
1277#define CLASSTYPE_VFIELD(NODE) TYPE_VFIELD(NODE)
1278
1279/* The number of virtual functions defined for this
1280 _CLASSTYPE node. */
1281#define CLASSTYPE_VSIZE(NODE) (TYPE_LANG_SPECIFIC(NODE)->vsize)
1282/* The virtual base classes that this type uses. */
1283#define CLASSTYPE_VBASECLASSES(NODE) (TYPE_LANG_SPECIFIC(NODE)->vbases)
1284/* The virtual function pointer fields that this type contains. */
1285#define CLASSTYPE_VFIELDS(NODE) (TYPE_LANG_SPECIFIC(NODE)->vfields)
1286
1287/* Number of baseclasses defined for this type.
1288 0 means no base classes. */
1289#define CLASSTYPE_N_BASECLASSES(NODE) \
1290 (TYPE_BINFO_BASETYPES (NODE) ? TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES(NODE)) : 0)
1291
8d08fdba
MS
1292/* Used for keeping search-specific information. Any search routine
1293 which uses this must define what exactly this slot is used for. */
1294#define CLASSTYPE_SEARCH_SLOT(NODE) (TYPE_LANG_SPECIFIC(NODE)->search_slot)
1295
0b41abe6 1296/* These are the size, mode and alignment of the type without its
9a71c18b 1297 virtual base classes, for when we use this type as a base itself. */
8d08fdba 1298#define CLASSTYPE_SIZE(NODE) (TYPE_LANG_SPECIFIC(NODE)->size)
8012c983 1299#define CLASSTYPE_ALIGN(NODE) (TYPE_LANG_SPECIFIC(NODE)->align)
8d08fdba 1300
8d08fdba
MS
1301/* A cons list of virtual functions which cannot be inherited by
1302 derived classes. When deriving from this type, the derived
1303 class must provide its own definition for each of these functions. */
1304#define CLASSTYPE_ABSTRACT_VIRTUALS(NODE) (TYPE_LANG_SPECIFIC(NODE)->abstract_virtuals)
1305
1306/* Nonzero means that this aggr type has been `closed' by a semicolon. */
8012c983 1307#define CLASSTYPE_GOT_SEMICOLON(NODE) (TYPE_LANG_SPECIFIC (NODE)->got_semicolon)
8d08fdba
MS
1308
1309/* Nonzero means that the main virtual function table pointer needs to be
1310 set because base constructors have placed the wrong value there.
1311 If this is zero, it means that they placed the right value there,
1312 and there is no need to change it. */
8012c983 1313#define CLASSTYPE_NEEDS_VIRTUAL_REINIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->needs_virtual_reinit)
8d08fdba
MS
1314
1315/* Nonzero means that if this type has virtual functions, that
1316 the virtual function table will be written out. */
8012c983 1317#define CLASSTYPE_VTABLE_NEEDS_WRITING(NODE) (TYPE_LANG_SPECIFIC(NODE)->vtable_needs_writing)
8d08fdba 1318
8d08fdba 1319/* Nonzero means that this type has an X() constructor. */
8012c983 1320#define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_default_ctor)
8d08fdba
MS
1321
1322/* Nonzero means the type declared a ctor as private or protected. We
1323 use this to make sure we don't try to generate a copy ctor for a
1324 class that has a member of type NODE. */
8012c983 1325#define TYPE_HAS_NONPUBLIC_CTOR(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_nonpublic_ctor)
8d08fdba
MS
1326
1327/* Ditto, for operator=. */
8012c983 1328#define TYPE_HAS_NONPUBLIC_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_nonpublic_assign_ref)
8d08fdba 1329
a7a7710d 1330/* Nonzero means that this type contains a mutable member */
8012c983 1331#define CLASSTYPE_HAS_MUTABLE(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_mutable)
a7a7710d
NS
1332#define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE))
1333
52fb2769 1334/* Nonzero means that this class type is a non-POD class. */
8012c983 1335#define CLASSTYPE_NON_POD_P(NODE) (TYPE_LANG_SPECIFIC (NODE)->non_pod_class)
52fb2769 1336
aff08c18
JM
1337/* Nonzero means that this type is meant for communication via COM. */
1338#define CLASSTYPE_COM_INTERFACE(NODE) \
8012c983 1339 (TYPE_LANG_SPECIFIC(NODE)->com_interface)
aff08c18 1340
6a629cac 1341/* A list of class types of which this type is a friend. The
ea4e080b
MM
1342 TREE_VALUE is normally a TYPE, but will be a TEMPLATE_DECL in the
1343 case of a template friend. */
8d08fdba
MS
1344#define CLASSTYPE_FRIEND_CLASSES(NODE) (TYPE_LANG_SPECIFIC(NODE)->friend_classes)
1345
6a629cac
MM
1346/* A list of the classes which grant friendship to this class. */
1347#define CLASSTYPE_BEFRIENDING_CLASSES(NODE) \
1348 (TYPE_LANG_SPECIFIC (NODE)->befriending_classes)
1349
8d08fdba 1350/* Say whether this node was declared as a "class" or a "struct". */
8012c983 1351#define CLASSTYPE_DECLARED_CLASS(NODE) (TYPE_LANG_SPECIFIC(NODE)->declared_class)
8d08fdba
MS
1352
1353/* Nonzero if this class has const members which have no specified initialization. */
8012c983 1354#define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->const_needs_init)
8d08fdba
MS
1355
1356/* Nonzero if this class has ref members which have no specified initialization. */
8012c983 1357#define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->ref_needs_init)
8d08fdba
MS
1358
1359/* Nonzero if this class is included from a header file which employs
1360 `#pragma interface', and it is not included in its implementation file. */
8012c983 1361#define CLASSTYPE_INTERFACE_ONLY(NODE) (TYPE_LANG_SPECIFIC(NODE)->interface_only)
8d08fdba
MS
1362
1363/* Same as above, but for classes whose purpose we do not know. */
8012c983
MM
1364#define CLASSTYPE_INTERFACE_UNKNOWN(NODE) (TYPE_LANG_SPECIFIC(NODE)->interface_unknown)
1365#define CLASSTYPE_INTERFACE_KNOWN(NODE) (TYPE_LANG_SPECIFIC(NODE)->interface_unknown == 0)
1366#define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) (TYPE_LANG_SPECIFIC(NODE)->interface_unknown = !!(X))
1367#define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) (TYPE_LANG_SPECIFIC(NODE)->interface_unknown = 1)
1368#define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) (TYPE_LANG_SPECIFIC(NODE)->interface_unknown = 0)
8d08fdba
MS
1369
1370/* Nonzero if a _DECL node requires us to output debug info for this class. */
8012c983 1371#define CLASSTYPE_DEBUG_REQUESTED(NODE) (TYPE_LANG_SPECIFIC(NODE)->debug_requested)
8d08fdba
MS
1372\f
1373/* Additional macros for inheritance information. */
1374
ca107ded
MM
1375/* The BINFO_INHERITANCE_CHAIN is used opposite to the description in
1376 gcc/tree.h. In particular if D is derived from B then the BINFO
1377 for B (in D) will have a BINFO_INHERITANCE_CHAIN pointing to
1378 D. In tree.h, this pointer is described as pointing in other
d6479fe7
MM
1379 direction. There is a different BINFO for each path to a virtual
1380 base; BINFOs for virtual bases are not shared. In addition, shared
1381 versions of each of the virtual class BINFOs are stored in
1382 CLASSTYPE_VBASECLASSES.
ca107ded 1383
d6479fe7
MM
1384 We use TREE_VIA_PROTECTED and TREE_VIA_PUBLIC, but private
1385 inheritance is indicated by the absence of the other two flags, not
1386 by TREE_VIAR_PRIVATE, which is unused.
1387
1388 The TREE_CHAIN is for scratch space in search.c. */
ca107ded 1389
8d08fdba
MS
1390/* Nonzero means marked by DFS or BFS search, including searches
1391 by `get_binfo' and `get_base_distance'. */
1392#define BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED(BINFO_TYPE(NODE)):TREE_LANG_FLAG_0(NODE))
1393/* Macros needed because of C compilers that don't allow conditional
1394 expressions to be lvalues. Grr! */
1395#define SET_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=1))
1396#define CLEAR_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=0))
1397
8d08fdba
MS
1398/* Nonzero means marked in search through virtual inheritance hierarchy. */
1399#define BINFO_VBASE_MARKED(NODE) CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
1400/* Modifier macros */
1401#define SET_BINFO_VBASE_MARKED(NODE) SET_CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
1402#define CLEAR_BINFO_VBASE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
1403
1404/* Nonzero means marked in search for members or member functions. */
1405#define BINFO_FIELDS_MARKED(NODE) \
1406 (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED2 (BINFO_TYPE (NODE)):TREE_LANG_FLAG_2(NODE))
1407#define SET_BINFO_FIELDS_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED2(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_2(NODE)=1))
1408#define CLEAR_BINFO_FIELDS_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED2(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_2(NODE)=0))
1409
1410/* Nonzero means that this class is on a path leading to a new vtable. */
1411#define BINFO_VTABLE_PATH_MARKED(NODE) \
1412 (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):TREE_LANG_FLAG_3(NODE))
1413#define SET_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=1))
1414#define CLEAR_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=0))
1415
1416/* Nonzero means that this class has a new vtable. */
1417#define BINFO_NEW_VTABLE_MARKED(NODE) \
1418 (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):TREE_LANG_FLAG_4(NODE))
1419#define SET_BINFO_NEW_VTABLE_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_4(NODE)=1))
1420#define CLEAR_BINFO_NEW_VTABLE_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_4(NODE)=0))
1421
0ec57017
JM
1422/* Nonzero means this class has done dfs_pushdecls. */
1423#define BINFO_PUSHDECLS_MARKED(NODE) BINFO_VTABLE_PATH_MARKED (NODE)
1424#define SET_BINFO_PUSHDECLS_MARKED(NODE) SET_BINFO_VTABLE_PATH_MARKED (NODE)
1425#define CLEAR_BINFO_PUSHDECLS_MARKED(NODE) CLEAR_BINFO_VTABLE_PATH_MARKED (NODE)
72c4a2a6
JM
1426
1427/* Used by various search routines. */
1428#define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE)
8d08fdba
MS
1429\f
1430/* Accessor macros for the vfield slots in structures. */
1431
1432/* Get the assoc info that caused this vfield to exist. */
1433#define VF_BINFO_VALUE(NODE) TREE_PURPOSE (NODE)
1434
1435/* Get that same information as a _TYPE. */
1436#define VF_BASETYPE_VALUE(NODE) TREE_VALUE (NODE)
1437
1438/* Get the value of the top-most type dominating the non-`normal' vfields. */
1439#define VF_DERIVED_VALUE(NODE) (VF_BINFO_VALUE (NODE) ? BINFO_TYPE (VF_BINFO_VALUE (NODE)) : NULL_TREE)
1440
1441/* Get the value of the top-most type that's `normal' for the vfield. */
1442#define VF_NORMAL_VALUE(NODE) TREE_TYPE (NODE)
1443\f
1444/* Nonzero for TREE_LIST node means that this list of things
1445 is a list of parameters, as opposed to a list of expressions. */
1446#define TREE_PARMLIST(NODE) ((NODE)->common.unsigned_flag) /* overloaded! */
1447
1448/* For FUNCTION_TYPE or METHOD_TYPE, a list of the exceptions that
193306f7 1449 this type can raise. Each TREE_VALUE is a _TYPE. The TREE_VALUE
66a6250f
JM
1450 will be NULL_TREE to indicate a throw specification of `()', or
1451 no exceptions allowed. */
8d08fdba 1452#define TYPE_RAISES_EXCEPTIONS(NODE) TYPE_NONCOPIED_PARTS (NODE)
a9aedbc2 1453
7f477e81
NS
1454/* For FUNCTION_TYPE or METHOD_TYPE, return 1 iff it is declared `throw()'. */
1455#define TYPE_NOTHROW_P(NODE) \
1456 (TYPE_RAISES_EXCEPTIONS (NODE) \
1457 && TREE_VALUE (TYPE_RAISES_EXCEPTIONS (NODE)) == NULL_TREE)
1458
e92cc029 1459/* The binding level associated with the namespace. */
3ebc5c52
MM
1460#define NAMESPACE_LEVEL(NODE) \
1461 (DECL_LANG_SPECIFIC(NODE)->decl_flags.u.level)
8d08fdba 1462\f
6a629cac
MM
1463
1464/* If a DECL has DECL_LANG_SPECIFIC, it is either a lang_decl_flags or
b0d06515
MM
1465 a lang_decl (which has lang_decl_flags as its initial prefix).
1466 This macro is nonzero for tree nodes whose DECL_LANG_SPECIFIC is
1467 the full lang_decl, and not just lang_decl_flags. */
1468#define CAN_HAVE_FULL_LANG_DECL_P(NODE) \
1469 (!(TREE_CODE ((NODE)) == VAR_DECL \
1470 || TREE_CODE ((NODE)) == CONST_DECL \
1471 || TREE_CODE ((NODE)) == FIELD_DECL \
1472 || TREE_CODE ((NODE)) == USING_DECL))
6a629cac 1473
8d08fdba
MS
1474struct lang_decl_flags
1475{
1476#ifdef ONLY_INT_FIELDS
1477 int language : 8;
1478#else
1479 enum languages language : 8;
1480#endif
1481
1482 unsigned operator_attr : 1;
1483 unsigned constructor_attr : 1;
8d08fdba
MS
1484 unsigned friend_attr : 1;
1485 unsigned static_function : 1;
1486 unsigned const_memfunc : 1;
1487 unsigned volatile_memfunc : 1;
8d08fdba 1488 unsigned abstract_virtual : 1;
8d08fdba 1489 unsigned constructor_for_vbase_attr : 1;
d60f72ae 1490
8d08fdba 1491 unsigned mutable_flag : 1;
8926095f 1492 unsigned saved_inline : 1;
a0a33927 1493 unsigned use_template : 2;
db5ae43f 1494 unsigned nonconverting : 1;
faae18ab
MS
1495 unsigned declared_inline : 1;
1496 unsigned not_really_extern : 1;
cdcb673e 1497 unsigned needs_final_overrider : 1;
d60f72ae 1498
162bc98d 1499 unsigned bitfield : 1;
6ba89f8e 1500 unsigned defined_in_class : 1;
d60f72ae 1501 unsigned dummy : 6;
8d08fdba
MS
1502
1503 tree access;
1504 tree context;
3ebc5c52 1505
3ebc5c52 1506 union {
9188c363 1507 /* In a FUNCTION_DECL or a VAR_DECL, this is DECL_TEMPLATE_INFO. */
3ebc5c52
MM
1508 tree template_info;
1509
1510 /* In a NAMESPACE_DECL, this is NAMESPACE_LEVEL. */
1511 struct binding_level *level;
1512 } u;
8d08fdba
MS
1513};
1514
1515struct lang_decl
1516{
1517 struct lang_decl_flags decl_flags;
1518
8d08fdba 1519 tree main_decl_variant;
6a629cac 1520 tree befriending_classes;
9188c363
MM
1521
1522 /* In a FUNCTION_DECL, this is DECL_SAVED_TREE. */
1523 tree saved_tree;
1524
f90cdf34
MT
1525 union
1526 {
1527 tree sorted_fields;
1528 struct pending_inline *pending_inline_info;
1529 } u;
8d08fdba
MS
1530};
1531
1532/* Non-zero if NODE is a _DECL with TREE_READONLY set. */
1533#define TREE_READONLY_DECL_P(NODE) \
1534 (TREE_READONLY (NODE) && TREE_CODE_CLASS (TREE_CODE (NODE)) == 'd')
1535
cffa8729
MS
1536/* Non-zero iff DECL is memory-based. The DECL_RTL of
1537 certain const variables might be a CONST_INT, or a REG
1538 in some cases. We cannot use `memory_operand' as a test
1539 here because on most RISC machines, a variable's address
1540 is not, by itself, a legitimate address. */
1541#define DECL_IN_MEMORY_P(NODE) \
1542 (DECL_RTL (NODE) != NULL_RTX && GET_CODE (DECL_RTL (NODE)) == MEM)
1543
8d08fdba
MS
1544/* For FUNCTION_DECLs: return the language in which this decl
1545 was declared. */
1546#define DECL_LANGUAGE(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.language)
1547
1548/* For FUNCTION_DECLs: nonzero means that this function is a constructor. */
1549#define DECL_CONSTRUCTOR_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.constructor_attr)
aa45967f
JM
1550
1551/* There ought to be a better way to find out whether or not something is
1552 a destructor. */
1553#define DECL_DESTRUCTOR_P(NODE) \
1554 (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (NODE)) \
1555 && DECL_LANGUAGE (NODE) == lang_cplusplus)
1556
f71f87f9 1557/* Non-zero if NODE is a user-defined conversion operator. */
aa45967f
JM
1558#define DECL_CONV_FN_P(NODE) \
1559 (IDENTIFIER_TYPENAME_P (DECL_NAME (NODE)) && TREE_TYPE (DECL_NAME (NODE)))
711734a9 1560
f71f87f9
MM
1561/* Non-zero if NODE is an overloaded operator. */
1562#define DECL_OVERLOADED_OPERATOR_P(NODE) \
1563 (IDENTIFIER_OPNAME_P (DECL_NAME ((NODE))))
1564
8d08fdba
MS
1565/* For FUNCTION_DECLs: nonzero means that this function is a constructor
1566 for an object with virtual baseclasses. */
1567#define DECL_CONSTRUCTOR_FOR_VBASE_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.constructor_for_vbase_attr)
1568
0aafb128
MM
1569/* Non-zero for a FUNCTION_DECL that declares a type-info function. */
1570#define DECL_TINFO_FN_P(NODE) \
1571 (TREE_CODE (NODE) == FUNCTION_DECL \
1572 && DECL_ARTIFICIAL (NODE) \
1573 && DECL_LANG_SPECIFIC(NODE)->decl_flags.mutable_flag)
1574
1575/* Mark NODE as a type-info function. */
1576#define SET_DECL_TINFO_FN_P(NODE) \
1577 (DECL_LANG_SPECIFIC((NODE))->decl_flags.mutable_flag = 1)
1578
8d08fdba
MS
1579/* Nonzero for _DECL means that this decl appears in (or will appear
1580 in) as a member in a RECORD_TYPE or UNION_TYPE node. It is also for
1581 detecting circularity in case members are multiply defined. In the
1582 case of a VAR_DECL, it is also used to determine how program storage
1583 should be allocated. */
1584#define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3(NODE))
1585
6ba89f8e
MM
1586/* Nonzero if the DECL was defined in the class definition itself,
1587 rather than outside the class. */
1588#define DECL_DEFINED_IN_CLASS_P(DECL) \
1589 (DECL_LANG_SPECIFIC (DECL)->decl_flags.defined_in_class)
1590
8d08fdba
MS
1591/* Nonzero for FUNCTION_DECL means that this decl is just a
1592 friend declaration, and should not be added to the list of
1593 member functions for this class. */
1594#define DECL_FRIEND_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.friend_attr)
1595
6a629cac
MM
1596/* A TREE_LIST of the types which have befriended this FUNCTION_DECL. */
1597#define DECL_BEFRIENDING_CLASSES(NODE) \
1598 (DECL_LANG_SPECIFIC(NODE)->befriending_classes)
1599
8d08fdba
MS
1600/* Nonzero for FUNCTION_DECL means that this decl is a static
1601 member function. */
1602#define DECL_STATIC_FUNCTION_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.static_function)
1603
700f8a87
MS
1604/* Nonzero for a class member means that it is shared between all objects
1605 of that class. */
1606#define SHARED_MEMBER_P(NODE) \
1607 (TREE_CODE (NODE) == VAR_DECL || TREE_CODE (NODE) == TYPE_DECL \
1608 || TREE_CODE (NODE) == CONST_DECL)
1609
8857f91e
MM
1610/* Nonzero for FUNCTION_DECL means that this decl is a non-static
1611 member function. */
1612#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \
1613 (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)
1614
8926095f
MS
1615/* Nonzero for FUNCTION_DECL means that this decl is a member function
1616 (static or non-static). */
1617#define DECL_FUNCTION_MEMBER_P(NODE) \
8857f91e 1618 (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE))
8926095f 1619
8d08fdba
MS
1620/* Nonzero for FUNCTION_DECL means that this member function
1621 has `this' as const X *const. */
1622#define DECL_CONST_MEMFUNC_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.const_memfunc)
1623
1624/* Nonzero for FUNCTION_DECL means that this member function
1625 has `this' as volatile X *const. */
1626#define DECL_VOLATILE_MEMFUNC_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.volatile_memfunc)
1627
d6479fe7
MM
1628/* Nonzero for a DECL means that this member is a non-static member. */
1629#define DECL_NONSTATIC_MEMBER_P(NODE) \
1630 ((TREE_CODE (NODE) == FUNCTION_DECL \
1631 && DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE)) \
1632 || TREE_CODE (NODE) == FIELD_DECL)
1633
8d08fdba
MS
1634/* Nonzero for _DECL means that this member object type
1635 is mutable. */
1636#define DECL_MUTABLE_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.mutable_flag)
1637
db5ae43f
MS
1638/* Nonzero for _DECL means that this constructor is a non-converting
1639 constructor. */
1640#define DECL_NONCONVERTING_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.nonconverting)
1641
8d08fdba
MS
1642/* Nonzero for FUNCTION_DECL means that this member function
1643 exists as part of an abstract class's interface. */
1644#define DECL_ABSTRACT_VIRTUAL_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.abstract_virtual)
1645
cdcb673e
MH
1646/* Nonzero for FUNCTION_DECL means that this member function
1647 must be overridden by derived classes. */
1648#define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.needs_final_overrider)
1649
8926095f
MS
1650/* The _TYPE context in which this _DECL appears. This field holds the
1651 class where a virtual function instance is actually defined, and the
30394414 1652 lexical scope of a friend function defined in a class body. */
8d08fdba 1653#define DECL_CLASS_CONTEXT(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.context)
f30432d7
MS
1654#define DECL_REAL_CONTEXT(NODE) \
1655 ((TREE_CODE (NODE) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (NODE)) \
cb0dbb9a
JM
1656 ? DECL_CLASS_CONTEXT (NODE) : CP_DECL_CONTEXT (NODE))
1657
1658/* NULL_TREE in DECL_CONTEXT represents the global namespace. */
1659#define CP_DECL_CONTEXT(NODE) \
1660 (DECL_CONTEXT (NODE) ? DECL_CONTEXT (NODE) : global_namespace)
1661#define FROB_CONTEXT(NODE) ((NODE) == global_namespace ? NULL_TREE : (NODE))
8d08fdba 1662
3927874d
JM
1663/* For a virtual function, the base where we find its vtable entry.
1664 For a non-virtual function, the base where it is defined. */
1665#define DECL_VIRTUAL_CONTEXT(NODE) DECL_CONTEXT (NODE)
1666
42c7b807 1667/* 1 iff NODE has namespace scope, including the global namespace. */
6eb3bb27 1668#define DECL_NAMESPACE_SCOPE_P(NODE) \
42c7b807
JM
1669 (DECL_CONTEXT (NODE) == NULL_TREE \
1670 || TREE_CODE (DECL_CONTEXT (NODE)) == NAMESPACE_DECL)
1671
1672/* 1 iff NODE is a class member. */
6eb3bb27 1673#define DECL_CLASS_SCOPE_P(NODE) \
42c7b807
JM
1674 (DECL_CONTEXT (NODE) \
1675 && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (NODE))) == 't')
1676
2642b9bf
JM
1677/* 1 iff NODE is function-local. */
1678#define DECL_FUNCTION_SCOPE_P(NODE) \
1679 (DECL_CONTEXT (NODE) \
1680 && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL)
1681
2c73f9f5 1682/* For a NAMESPACE_DECL: the list of using namespace directives
30394414 1683 The PURPOSE is the used namespace, the value is the namespace
2c73f9f5
ML
1684 that is the common ancestor. */
1685#define DECL_NAMESPACE_USING(NODE) DECL_VINDEX(NODE)
30394414
JM
1686
1687/* In a NAMESPACE_DECL, the DECL_INITIAL is used to record all users
2c73f9f5 1688 of a namespace, to record the transitive closure of using namespace. */
30394414
JM
1689#define DECL_NAMESPACE_USERS(NODE) DECL_INITIAL (NODE)
1690
3e3f722c
ML
1691/* In a NAMESPACE_DECL, points to the original namespace if this is
1692 a namespace alias. */
1693#define DECL_NAMESPACE_ALIAS(NODE) DECL_ABSTRACT_ORIGIN (NODE)
1694#define ORIGINAL_NAMESPACE(NODE) \
1695 (DECL_NAMESPACE_ALIAS (NODE) ? DECL_NAMESPACE_ALIAS (NODE) : (NODE))
1696
0aafb128
MM
1697/* In a non-local VAR_DECL with static storage duration, this is the
1698 initialization priority. If this value is zero, the NODE will be
1699 initialized at the DEFAULT_INIT_PRIORITY. */
1700#define DECL_INIT_PRIORITY(NODE) (DECL_FIELD_SIZE ((NODE)))
1701
30394414
JM
1702/* In a TREE_LIST concatenating using directives, indicate indirekt
1703 directives */
1704#define TREE_INDIRECT_USING(NODE) ((NODE)->common.lang_flag_0)
8d08fdba 1705
d2ad151f 1706/* In a VAR_DECL for a variable declared in a for statement,
e92cc029 1707 this is the shadowed (local) variable. */
d2ad151f
PB
1708#define DECL_SHADOWED_FOR_VAR(NODE) DECL_RESULT(NODE)
1709
8d08fdba
MS
1710/* Points back to the decl which caused this lang_decl to be allocated. */
1711#define DECL_MAIN_VARIANT(NODE) (DECL_LANG_SPECIFIC(NODE)->main_decl_variant)
1712
1713/* For a FUNCTION_DECL: if this function was declared inline inside of
1714 a class declaration, this is where the text for the function is
1715 squirreled away. */
f90cdf34
MT
1716#define DECL_PENDING_INLINE_INFO(NODE) (DECL_LANG_SPECIFIC(NODE)->u.pending_inline_info)
1717
1718/* For a TYPE_DECL: if this function has many fields, we'll sort them
1719 and put them into a TREE_VEC. */
1720#define DECL_SORTED_FIELDS(NODE) (DECL_LANG_SPECIFIC(NODE)->u.sorted_fields)
8d08fdba 1721
e92cc029 1722/* True if on the saved_inlines (see decl2.c) list. */
8926095f
MS
1723#define DECL_SAVED_INLINE(DECL) \
1724 (DECL_LANG_SPECIFIC(DECL)->decl_flags.saved_inline)
1725
5566b478 1726/* For a VAR_DECL or FUNCTION_DECL: template-specific information. */
3ebc5c52
MM
1727#define DECL_TEMPLATE_INFO(NODE) \
1728 (DECL_LANG_SPECIFIC(NODE)->decl_flags.u.template_info)
ed44da02
MM
1729
1730/* Template information for a RECORD_TYPE or UNION_TYPE. */
5566b478 1731#define CLASSTYPE_TEMPLATE_INFO(NODE) (TYPE_LANG_SPECIFIC(NODE)->template_info)
ed44da02
MM
1732
1733/* Template information for an ENUMERAL_TYPE. Although an enumeration may
1734 not be a primary template, it may be declared within the scope of a
1735 primary template and the enumeration constants may depend on
1736 non-type template parameters. */
1737#define ENUM_TEMPLATE_INFO(NODE) (TYPE_BINFO (NODE))
1738
7ddedda4
MM
1739/* Template information for a template template parameter. */
1740#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) (TYPE_BINFO (NODE))
1741
ed44da02 1742/* Template information for an ENUMERAL_, RECORD_, or UNION_TYPE. */
7ddedda4
MM
1743#define TYPE_TEMPLATE_INFO(NODE) \
1744 (TREE_CODE (NODE) == ENUMERAL_TYPE \
1745 ? ENUM_TEMPLATE_INFO (NODE) : \
1746 (TREE_CODE (NODE) == TEMPLATE_TEMPLATE_PARM \
1747 ? TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (NODE) \
1748 : CLASSTYPE_TEMPLATE_INFO (NODE)))
ed44da02
MM
1749
1750/* Set the template information for an ENUMERAL_, RECORD_, or
1751 UNION_TYPE to VAL. */
1752#define SET_TYPE_TEMPLATE_INFO(NODE, VAL) \
1753 (TREE_CODE (NODE) == ENUMERAL_TYPE \
1754 ? (ENUM_TEMPLATE_INFO (NODE) = VAL) \
1755 : (CLASSTYPE_TEMPLATE_INFO (NODE) = VAL))
1756
5566b478
MS
1757#define TI_TEMPLATE(NODE) (TREE_PURPOSE (NODE))
1758#define TI_ARGS(NODE) (TREE_VALUE (NODE))
6633d636 1759#define TI_SPEC_INFO(NODE) (TREE_CHAIN (NODE))
824b9a4c 1760#define TI_PENDING_TEMPLATE_FLAG(NODE) TREE_LANG_FLAG_1 (NODE)
ed44da02 1761
36a117a5
MM
1762/* The TEMPLATE_DECL instantiated or specialized by NODE. This
1763 TEMPLATE_DECL will be the immediate parent, not the most general
1764 template. For example, in:
1765
1766 template <class T> struct S { template <class U> void f(U); }
1767
1768 the FUNCTION_DECL for S<int>::f<double> will have, as its
1769 DECL_TI_TEMPLATE, `template <class U> S<int>::f<U>'.
1770
1771 As a special case, for a member friend template of a template
1772 class, this value will not be a TEMPLATE_DECL, but rather a
672476cb
MM
1773 LOOKUP_EXPR or IDENTIFIER_NODE indicating the name of the template
1774 and any explicit template arguments provided. For example, in:
36a117a5
MM
1775
1776 template <class T> struct S { friend void f<int>(int, double); }
1777
1778 the DECL_TI_TEMPLATE will be a LOOKUP_EXPR for `f' and the
1779 DECL_TI_ARGS will be {int}. */
5566b478 1780#define DECL_TI_TEMPLATE(NODE) TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE))
ed44da02 1781
36a117a5
MM
1782/* The template arguments used to obtain this decl from the most
1783 general form of DECL_TI_TEMPLATE. For the example given for
1784 DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}. These
1785 are always the full set of arguments required to instantiate this
1786 declaration from the most general template specialized here. */
5566b478
MS
1787#define DECL_TI_ARGS(NODE) TI_ARGS (DECL_TEMPLATE_INFO (NODE))
1788#define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE))
1789#define CLASSTYPE_TI_ARGS(NODE) TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE))
6633d636 1790#define CLASSTYPE_TI_SPEC_INFO(NODE) TI_SPEC_INFO (CLASSTYPE_TEMPLATE_INFO (NODE))
ed44da02
MM
1791#define ENUM_TI_TEMPLATE(NODE) \
1792 TI_TEMPLATE (ENUM_TEMPLATE_INFO (NODE))
1793#define ENUM_TI_ARGS(NODE) \
1794 TI_ARGS (ENUM_TEMPLATE_INFO (NODE))
1795
1796/* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */
1797#define TYPE_TI_TEMPLATE(NODE) \
1798 (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE)))
1799
1800/* Like DECL_TI_ARGS, , but for an ENUMERAL_, RECORD_, or UNION_TYPE. */
1801#define TYPE_TI_ARGS(NODE) \
1802 (TI_ARGS (TYPE_TEMPLATE_INFO (NODE)))
1803
98c1c668 1804#define INNERMOST_TEMPLATE_PARMS(NODE) TREE_VALUE(NODE)
5566b478 1805
6ba89f8e
MM
1806/* Nonzero if the NODE corresponds to the template parameters for a
1807 member template, whose inline definition is being processed after
1808 the class definition is complete. */
cae40af6
JM
1809#define TEMPLATE_PARMS_FOR_INLINE(NODE) TREE_LANG_FLAG_1 (NODE)
1810
3ebc5c52
MM
1811/* In a template FUNCTION_DECL, the tree structure that will be
1812 substituted into to obtain instantiations. */
6eabb241 1813#define DECL_SAVED_TREE(NODE) \
9188c363 1814 (DECL_LANG_SPECIFIC ((NODE))->saved_tree)
3ebc5c52 1815
5566b478
MS
1816#define COMPOUND_STMT_NO_SCOPE(NODE) TREE_LANG_FLAG_0 (NODE)
1817#define NEW_EXPR_USE_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE)
1818#define DELETE_EXPR_USE_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE)
1819#define DELETE_EXPR_USE_VEC(NODE) TREE_LANG_FLAG_1 (NODE)
1820#define LOOKUP_EXPR_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE)
8d08fdba 1821
e1376b00
MM
1822/* Nonzero if this AGGR_INIT_EXPR provides for initialization via a
1823 constructor call, rather than an ordinary function call. */
1824#define AGGR_INIT_VIA_CTOR_P(NODE) TREE_LANG_FLAG_0 (NODE)
1825
a7e4cfa0
MM
1826/* Nonzero if this statement contained the first assigned to `this' in
1827 the current function. (Of course, one cannot assign to `this' in
1828 ANSI/ISO C++, but we still support assignments to this with
1829 -fthis-is-variable.) */
1830#define EXPR_STMT_ASSIGNS_THIS(NODE) TREE_LANG_FLAG_0 ((NODE))
1831
1832/* Nonzero if this statement should be considered a full-expression. */
1833#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE))
1834
6757edfe
MM
1835/* The TYPE_MAIN_DECL for a class template type is a TYPE_DECL, not a
1836 TEMPLATE_DECL. This macro determines whether or not a given class
1837 type is really a template type, as opposed to an instantiation or
1838 specialization of one. */
1839#define CLASSTYPE_IS_TEMPLATE(NODE) \
1840 (CLASSTYPE_TEMPLATE_INFO (NODE) \
1841 && !CLASSTYPE_USE_TEMPLATE (NODE) \
1842 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE)))
1843
45869a6c
MM
1844/* The name used by the user to name the typename type. Typically,
1845 this is an IDENTIFIER_NODE, and the same as the DECL_NAME on the
1846 corresponding TYPE_DECL. However, this may also be a
1847 TEMPLATE_ID_EXPR if we had something like `typename X::Y<T>'. */
7ddedda4 1848#define TYPENAME_TYPE_FULLNAME(NODE) TYPE_BINFO (NODE)
ca40b399 1849
f181d4ae
MM
1850/* Nonzero if NODE is an implicit typename. */
1851#define IMPLICIT_TYPENAME_P(NODE) \
1852 (TREE_CODE (NODE) == TYPENAME_TYPE && TREE_TYPE (NODE))
1853
83233dca
MM
1854/* Nonzero if NODE is a TYPE_DECL that should not be visible because
1855 it is from a dependent base class. */
1856#define IMPLICIT_TYPENAME_TYPE_DECL_P(NODE) \
1857 (TREE_CODE (NODE) == TYPE_DECL \
1858 && DECL_ARTIFICIAL (NODE) \
1859 && IMPLICIT_TYPENAME_P (TREE_TYPE (NODE)))
1860
cfdd0551 1861/* Nonzero in INTEGER_CST means that this int is negative by dint of
8d08fdba
MS
1862 using a twos-complement negated operand. */
1863#define TREE_NEGATED_INT(NODE) (TREE_LANG_FLAG_0 (NODE))
1864
a0d5fba7 1865#if 0 /* UNUSED */
8d08fdba
MS
1866/* Nonzero in any kind of _EXPR or _REF node means that it is a call
1867 to a storage allocation routine. If, later, alternate storage
1868 is found to hold the object, this call can be ignored. */
1869#define TREE_CALLS_NEW(NODE) (TREE_LANG_FLAG_1 (NODE))
a0d5fba7 1870#endif
8d08fdba
MS
1871
1872/* Nonzero in any kind of _TYPE that uses multiple inheritance
1873 or virtual baseclasses. */
1874#define TYPE_USES_COMPLEX_INHERITANCE(NODE) (TREE_LANG_FLAG_1 (NODE))
1875
a80e4195 1876#if 0 /* UNUSED */
8d2733ca
MS
1877/* Nonzero in IDENTIFIER_NODE means that this name is not the name the user
1878 gave; it's a DECL_NESTED_TYPENAME. Someone may want to set this on
1879 mangled function names, too, but it isn't currently. */
72c4a2a6 1880#define TREE_MANGLED(NODE) (FOO)
a80e4195 1881#endif
8d2733ca 1882
7177d104 1883#if 0 /* UNUSED */
8d08fdba
MS
1884/* Nonzero in IDENTIFIER_NODE means that this name is overloaded, and
1885 should be looked up in a non-standard way. */
73aad9b9 1886#define DECL_OVERLOADED(NODE) (FOO)
8926095f 1887#endif
8d08fdba
MS
1888
1889/* Nonzero if this (non-TYPE)_DECL has its virtual attribute set.
1890 For a FUNCTION_DECL, this is when the function is a virtual function.
1891 For a VAR_DECL, this is when the variable is a virtual function table.
1892 For a FIELD_DECL, when the field is the field for the virtual function table.
1893 For an IDENTIFIER_NODE, nonzero if any function with this name
1894 has been declared virtual.
1895
1896 For a _TYPE if it uses virtual functions (or is derived from
1897 one that does). */
1898#define TYPE_VIRTUAL_P(NODE) (TREE_LANG_FLAG_2 (NODE))
1899
d2ad151f
PB
1900extern int flag_new_for_scope;
1901
1902/* This flag is true of a local VAR_DECL if it was declared in a for
e92cc029 1903 statement, but we are no longer in the scope of the for. */
d2ad151f
PB
1904#define DECL_DEAD_FOR_LOCAL(NODE) DECL_LANG_FLAG_7 (NODE)
1905
1906/* This flag is set on a VAR_DECL that is a DECL_DEAD_FOR_LOCAL
1907 if we already emitted a warning about using it. */
1908#define DECL_ERROR_REPORTED(NODE) DECL_LANG_FLAG_0 (NODE)
1909
700f8a87 1910/* This _DECL represents a compiler-generated entity. */
863adfc0 1911#define SET_DECL_ARTIFICIAL(NODE) (DECL_ARTIFICIAL (NODE) = 1)
8d08fdba
MS
1912
1913/* Record whether a typedef for type `int' was actually `signed int'. */
1914#define C_TYPEDEF_EXPLICITLY_SIGNED(exp) DECL_LANG_FLAG_1 ((exp))
1915
162bc98d
JM
1916/* In a FIELD_DECL, nonzero if the decl was originally a bitfield. */
1917#define DECL_C_BIT_FIELD(NODE) \
1918 (DECL_LANG_SPECIFIC (NODE) && DECL_LANG_SPECIFIC (NODE)->decl_flags.bitfield)
1919#define SET_DECL_C_BIT_FIELD(NODE) \
1920 (DECL_LANG_SPECIFIC (NODE)->decl_flags.bitfield = 1)
1921
2986ae00
MS
1922#define INTEGRAL_CODE_P(CODE) \
1923 (CODE == INTEGER_TYPE || CODE == ENUMERAL_TYPE || CODE == BOOLEAN_TYPE)
a7a64a77
MM
1924
1925/* [basic.fundamental]
1926
1927 Types bool, char, wchar_t, and the signed and unsigned integer types
1928 are collectively called integral types.
1929
1930 Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration
1931 types as well, which is incorrect in C++. */
1932#define CP_INTEGRAL_TYPE_P(TYPE) \
1933 (TREE_CODE ((TYPE)) == BOOLEAN_TYPE \
1934 || TREE_CODE ((TYPE)) == INTEGER_TYPE)
1935
1936/* [basic.fundamental]
1937
1938 Integral and floating types are collectively called arithmetic
1939 types. */
1940#define ARITHMETIC_TYPE_P(TYPE) \
1941 (CP_INTEGRAL_TYPE_P (TYPE) || TREE_CODE (TYPE) == REAL_TYPE)
2986ae00 1942
8d08fdba
MS
1943/* Mark which labels are explicitly declared.
1944 These may be shadowed, and may be referenced from nested functions. */
1945#define C_DECLARED_LABEL_FLAG(label) TREE_LANG_FLAG_1 (label)
1946
8d08fdba
MS
1947/* Nonzero for _TYPE means that the _TYPE defines
1948 at least one constructor. */
1949#define TYPE_HAS_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1(NODE))
1950
1951/* When appearing in an INDIRECT_REF, it means that the tree structure
1952 underneath is actually a call to a constructor. This is needed
1953 when the constructor must initialize local storage (which can
1954 be automatically destroyed), rather than allowing it to allocate
1955 space from the heap.
1956
1957 When appearing in a SAVE_EXPR, it means that underneath
1958 is a call to a constructor.
1959
1960 When appearing in a CONSTRUCTOR, it means that it was
1961 a GNU C constructor expression.
1962
1963 When appearing in a FIELD_DECL, it means that this field
1964 has been duly initialized in its constructor. */
1965#define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4(NODE))
1966
8452b1d3
JM
1967#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \
1968 && CONSTRUCTOR_ELTS (NODE) == NULL_TREE \
1969 && ! TREE_HAS_CONSTRUCTOR (NODE))
a3203465 1970
eb66be0e 1971#if 0
8d08fdba
MS
1972/* Indicates that a NON_LVALUE_EXPR came from a C++ reference.
1973 Used to generate more helpful error message in case somebody
1974 tries to take its address. */
1975#define TREE_REFERENCE_EXPR(NODE) (TREE_LANG_FLAG_3(NODE))
eb66be0e 1976#endif
8d08fdba
MS
1977
1978/* Nonzero for _TYPE means that the _TYPE defines a destructor. */
1979#define TYPE_HAS_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_2(NODE))
1980
f30432d7
MS
1981/* Nonzero means that an object of this type can not be initialized using
1982 an initializer list. */
1983#define CLASSTYPE_NON_AGGREGATE(NODE) \
8012c983 1984 (TYPE_LANG_SPECIFIC (NODE)->non_aggregate)
f30432d7
MS
1985#define TYPE_NON_AGGREGATE_CLASS(NODE) \
1986 (IS_AGGR_TYPE (NODE) && CLASSTYPE_NON_AGGREGATE (NODE))
1987
8d08fdba 1988/* Nonzero if there is a user-defined X::op=(x&) for this class. */
8012c983
MM
1989#define TYPE_HAS_REAL_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_real_assign_ref)
1990#define TYPE_HAS_COMPLEX_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_complex_assign_ref)
1991#define TYPE_HAS_ABSTRACT_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_abstract_assign_ref)
1992#define TYPE_HAS_COMPLEX_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_complex_init_ref)
8d08fdba
MS
1993
1994/* Nonzero for _TYPE node means that destroying an object of this type
1995 will involve a call to a destructor. This can apply to objects
1996 of ARRAY_TYPE is the type of the elements needs a destructor. */
1997#define TYPE_NEEDS_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_4(NODE))
1998
e8abc66f
MS
1999/* Nonzero for class type means that initialization of this type can use
2000 a bitwise copy. */
2001#define TYPE_HAS_TRIVIAL_INIT_REF(NODE) \
2002 (TYPE_HAS_INIT_REF (NODE) && ! TYPE_HAS_COMPLEX_INIT_REF (NODE))
2003
2004/* Nonzero for class type means that assignment of this type can use
2005 a bitwise copy. */
2006#define TYPE_HAS_TRIVIAL_ASSIGN_REF(NODE) \
2007 (TYPE_HAS_ASSIGN_REF (NODE) && ! TYPE_HAS_COMPLEX_ASSIGN_REF (NODE))
2008
c11b6f21
MS
2009#define TYPE_PTRMEM_P(NODE) \
2010 (TREE_CODE (NODE) == POINTER_TYPE \
2011 && TREE_CODE (TREE_TYPE (NODE)) == OFFSET_TYPE)
2012#define TYPE_PTR_P(NODE) \
2013 (TREE_CODE (NODE) == POINTER_TYPE \
2014 && TREE_CODE (TREE_TYPE (NODE)) != OFFSET_TYPE)
2015#define TYPE_PTROB_P(NODE) \
2016 (TYPE_PTR_P (NODE) && TREE_CODE (TREE_TYPE (NODE)) != FUNCTION_TYPE \
2017 && TREE_CODE (TREE_TYPE (NODE)) != VOID_TYPE)
2018#define TYPE_PTROBV_P(NODE) \
2019 (TYPE_PTR_P (NODE) && TREE_CODE (TREE_TYPE (NODE)) != FUNCTION_TYPE)
2020#define TYPE_PTRFN_P(NODE) \
2021 (TREE_CODE (NODE) == POINTER_TYPE \
2022 && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
2023
8d08fdba 2024/* Nonzero for _TYPE node means that this type is a pointer to member
e92cc029 2025 function type. */
83e9506e
RH
2026#define TYPE_PTRMEMFUNC_P(NODE) \
2027 (TREE_CODE(NODE) == RECORD_TYPE \
2028 && TYPE_LANG_SPECIFIC(NODE) \
2029 && TYPE_PTRMEMFUNC_FLAG (NODE))
2030
e08a8f45 2031#define TYPE_PTRMEMFUNC_FLAG(NODE) \
8012c983 2032 (TYPE_LANG_SPECIFIC(NODE)->ptrmemfunc_flag)
e08a8f45
MM
2033
2034/* A pointer-to-function member type looks like:
2035
2036 struct {
2037 short __delta;
2038 short __index;
2039 union {
2040 P __pfn;
2041 short __delta2;
2042 } __pfn_or_delta2;
2043 };
2044
2045 where P is a POINTER_TYPE to a METHOD_TYPE appropriate for the
2046 pointer to member. The fields are used as follows:
2047
2048 If __INDEX is -1, then the function to call is non-virtual, and
2049 is located at the address given by __PFN.
2050
2051 If __INDEX is zero, then this a NULL pointer-to-member.
2052
2053 Otherwise, the function to call is virtual. Then, __DELTA2 gives
2054 the offset from an instance of the object to the virtual function
2055 table, and __INDEX - 1 is the index into the vtable to use to
2056 find the function.
2057
2058 The value to use for the THIS parameter is the address of the
2059 object plus __DELTA.
2060
2061 For example, given:
2062
2063 struct B1 {
2064 int i;
2065 };
2066
2067 struct B2 {
2068 double d;
2069 void f();
2070 };
2071
2072 struct S : public B1, B2 {};
2073
2074 the pointer-to-member for `&S::f' looks like:
2075
2076 { 4, -1, { &f__2B2 } };
2077
2078 The `4' means that given an `S*' you have to add 4 bytes to get to
2079 the address of the `B2*'. Then, the -1 indicates that this is a
2080 non-virtual function. Of course, `&f__2B2' is the name of that
2081 function.
2082
adecb3f4 2083 (Of course, the exact values may differ depending on the mangling
e08a8f45
MM
2084 scheme, sizes of types, and such.). */
2085
8d08fdba
MS
2086/* Get the POINTER_TYPE to the METHOD_TYPE associated with this
2087 pointer to member function. TYPE_PTRMEMFUNC_P _must_ be true,
e92cc029 2088 before using this macro. */
8d08fdba 2089#define TYPE_PTRMEMFUNC_FN_TYPE(NODE) (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (NODE)))))))
ceab47eb
MM
2090
2091/* Returns `A' for a type like `int (A::*)(double)' */
2092#define TYPE_PTRMEMFUNC_OBJECT_TYPE(NODE) \
2093 TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE)))
2094
38e01259 2095/* These are use to manipulate the canonical RECORD_TYPE from the
e92cc029 2096 hashed POINTER_TYPE, and can only be used on the POINTER_TYPE. */
8d08fdba
MS
2097#define TYPE_GET_PTRMEMFUNC_TYPE(NODE) ((tree)TYPE_LANG_SPECIFIC(NODE))
2098#define TYPE_SET_PTRMEMFUNC_TYPE(NODE, VALUE) (TYPE_LANG_SPECIFIC(NODE) = ((struct lang_type *)(void*)(VALUE)))
e92cc029 2099/* These are to get the delta2 and pfn fields from a TYPE_PTRMEMFUNC_P. */
e08a8f45
MM
2100#define DELTA2_FROM_PTRMEMFUNC(NODE) delta2_from_ptrmemfunc ((NODE))
2101#define PFN_FROM_PTRMEMFUNC(NODE) pfn_from_ptrmemfunc ((NODE))
8d08fdba 2102
f71f87f9
MM
2103/* For a pointer-to-member type of the form `T X::*', this is `X'. */
2104#define TYPE_PTRMEM_CLASS_TYPE(NODE) \
2105 (TYPE_PTRMEM_P ((NODE)) \
2106 ? TYPE_OFFSET_BASETYPE (TREE_TYPE ((NODE))) \
2107 : TYPE_PTRMEMFUNC_OBJECT_TYPE ((NODE)))
2108
2109/* For a pointer-to-member type of the form `T X::*', this is `T'. */
2110#define TYPE_PTRMEM_POINTED_TO_TYPE(NODE) \
2111 (TYPE_PTRMEM_P ((NODE)) \
2112 ? TREE_TYPE (TREE_TYPE (NODE)) \
2113 : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE ((NODE))))
2114
61a127b3
MM
2115/* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for
2116 `X'. */
f71f87f9
MM
2117#define PTRMEM_CST_CLASS(NODE) \
2118 TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (NODE))
61a127b3
MM
2119
2120/* For a pointer-to-member constant `X::Y' this is the _DECL for
2121 `Y'. */
2122#define PTRMEM_CST_MEMBER(NODE) (((ptrmem_cst_t) NODE)->member)
2123
faae18ab 2124/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `extern' was
8926095f 2125 specified in its declaration. */
8d08fdba
MS
2126#define DECL_THIS_EXTERN(NODE) (DECL_LANG_FLAG_2(NODE))
2127
faae18ab
MS
2128/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `static' was
2129 specified in its declaration. */
2130#define DECL_THIS_STATIC(NODE) (DECL_LANG_FLAG_6(NODE))
2131
8d08fdba
MS
2132/* Nonzero in FUNCTION_DECL means it is really an operator.
2133 Just used to communicate formatting information to dbxout.c. */
2134#define DECL_OPERATOR(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.operator_attr)
2135
6bdb8141
JM
2136/* Nonzero if TYPE is an anonymous union or struct type. We have to use a
2137 flag for this because "A union for which objects or pointers are
2138 declared is not an anonymous union" [class.union]. */
2139#define ANON_AGGR_TYPE_P(NODE) \
8012c983 2140 (CLASS_TYPE_P (NODE) && TYPE_LANG_SPECIFIC (NODE)->anon_aggr)
6bdb8141 2141#define SET_ANON_AGGR_TYPE_P(NODE) \
8012c983 2142 (TYPE_LANG_SPECIFIC (NODE)->anon_aggr = 1)
67ffc812 2143
8d08fdba
MS
2144#define UNKNOWN_TYPE LANG_TYPE
2145
2146/* Define fields and accessors for nodes representing declared names. */
2147
2148#if 0
2149/* C++: A derived class may be able to directly use the virtual
2150 function table of a base class. When it does so, it may
2151 still have a decl node used to access the virtual function
2152 table (so that variables of this type can initialize their
2153 virtual function table pointers by name). When such thievery
2154 is committed, know exactly which base class's virtual function
2155 table is the one being stolen. This effectively computes the
2156 transitive closure. */
2157#define DECL_VPARENT(NODE) ((NODE)->decl.arguments)
2158#endif
2159
8012c983 2160#define TYPE_WAS_ANONYMOUS(NODE) (TYPE_LANG_SPECIFIC (NODE)->was_anonymous)
8d08fdba
MS
2161
2162/* C++: all of these are overloaded! These apply only to TYPE_DECLs. */
f84b4be9
JM
2163
2164/* The format of each node in the DECL_FRIENDLIST is as follows:
2165
2166 The TREE_PURPOSE will be the name of a function, i.e., an
2167 IDENTIFIER_NODE. The TREE_VALUE will be itself a TREE_LIST, the
2168 list of functions with that name which are friends. The
2169 TREE_PURPOSE of each node in this sublist will be error_mark_node,
2170 if the function was declared a friend individually, in which case
2171 the TREE_VALUE will be the function_decl. If, however, all
2172 functions with a given name in a class were declared to be friends,
2173 the TREE_PUROSE will be the class type, and the TREE_VALUE will be
2174 NULL_TREE. */
8d08fdba 2175#define DECL_FRIENDLIST(NODE) (DECL_INITIAL (NODE))
6a629cac
MM
2176#define FRIEND_NAME(LIST) (TREE_PURPOSE (LIST))
2177#define FRIEND_DECLS(LIST) (TREE_VALUE (LIST))
8d08fdba 2178
2036a15c
MM
2179/* The DECL_ACCESS, if non-NULL, is a TREE_LIST. The TREE_PURPOSE of
2180 each node is a type; the TREE_VALUE is the access granted for this
2181 DECL in that type. The DECL_ACCESS is set by access declarations.
2182 For example, if a member that would normally be public in a
2183 derived class is made protected, then the derived class and the
2184 protected_access_node will appear in the DECL_ACCESS for the node. */
8d08fdba
MS
2185#define DECL_ACCESS(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.access)
2186
2187/* C++: all of these are overloaded!
2188 These apply to PARM_DECLs and VAR_DECLs. */
2189#define DECL_REFERENCE_SLOT(NODE) ((tree)(NODE)->decl.arguments)
2190#define SET_DECL_REFERENCE_SLOT(NODE,VAL) ((NODE)->decl.arguments=VAL)
2191
8d08fdba 2192/* Accessor macros for C++ template decl nodes. */
f84b4be9
JM
2193
2194/* The DECL_TEMPLATE_PARMS are a list. The TREE_PURPOSE of each node
36a117a5
MM
2195 is a INT_CST whose TREE_INT_CST_HIGH indicates the level of the
2196 template parameters, with 1 being the outermost set of template
2197 parameters. The TREE_VALUE is a vector, whose elements are the
2198 template parameters at each level. Each element in the vector is a
2199 TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a
2200 non-type parameter), or a TYPE_DECL (if the parameter is a type
2201 parameter). The TREE_PURPOSE is the default value, if any. The
2202 TEMPLATE_PARM_INDEX for the parameter is avilable as the
2203 DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a
2204 TYPE_DECL). */
8d08fdba 2205#define DECL_TEMPLATE_PARMS(NODE) DECL_ARGUMENTS(NODE)
98c1c668
JM
2206#define DECL_INNERMOST_TEMPLATE_PARMS(NODE) \
2207 INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (NODE))
2208#define DECL_NTPARMS(NODE) \
2209 TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (NODE))
8d08fdba
MS
2210/* For function, method, class-data templates. */
2211#define DECL_TEMPLATE_RESULT(NODE) DECL_RESULT(NODE)
36a117a5
MM
2212/* For a static member variable template, the
2213 DECL_TEMPLATE_INSTANTIATIONS list contains the explicitly and
2214 implicitly generated instantiations of the variable. There are no
2215 partial instantiations of static member variables, so all of these
2216 will be full instantiations.
2217
2218 For a class template the DECL_TEMPLATE_INSTANTIATIONS lists holds
2219 all instantiations and specializations of the class type, including
2220 partial instantiations and partial specializations.
2221
2222 In both cases, the TREE_PURPOSE of each node contains the arguments
2223 used; the TREE_VALUE contains the generated variable. The template
2224 arguments are always complete. For example, given:
2225
2226 template <class T> struct S1 {
2227 template <class U> struct S2 {};
2228 template <class U> struct S2<U*> {};
2229 };
2230
2231 the record for the partial specialization will contain, as its
2232 argument list, { {T}, {U*} }, and will be on the
2233 DECL_TEMPLATE_INSTANTIATIONS list for `template <class T> template
2234 <class U> struct S1<T>::S2'.
2235
2236 This list is not used for function templates. */
8d08fdba 2237#define DECL_TEMPLATE_INSTANTIATIONS(NODE) DECL_VINDEX(NODE)
36a117a5
MM
2238/* For a function template, the DECL_TEMPLATE_SPECIALIZATIONS lists
2239 contains all instantiations and specializations of the function,
2240 including partial instantiations. For a partial instantiation
2241 which is a specialization, this list holds only full
2242 specializations of the template that are instantiations of the
2243 partial instantiation. For example, given:
2244
2245 template <class T> struct S {
2246 template <class U> void f(U);
2247 template <> void f(T);
2248 };
2249
2250 the `S<int>::f<int>(int)' function will appear on the
2251 DECL_TEMPLATE_SPECIALIZATIONS list for both `template <class T>
2252 template <class U> void S<T>::f(U)' and `template <class T> void
2253 S<int>::f(T)'. In the latter case, however, it will have only the
2254 innermost set of arguments (T, in this case). The DECL_TI_TEMPLATE
2255 for the function declaration will point at the specialization, not
2256 the fully general template.
2257
2258 For a class template, this list contains the partial
2259 specializations of this template. (Full specializations are not
2260 recorded on this list.) The TREE_PURPOSE holds the innermost
2261 arguments used in the partial specialization (e.g., for `template
2262 <class T> struct S<T*, int>' this will be `T*'.) The TREE_VALUE
2263 holds the innermost template parameters for the specialization
2264 (e.g., `T' in the example above.) The TREE_TYPE is the _TYPE node
2265 for the partial specialization.
2266
2267 This list is not used for static variable templates. */
2268#define DECL_TEMPLATE_SPECIALIZATIONS(NODE) DECL_SIZE(NODE)
5566b478 2269
50714e79
MM
2270/* Nonzero for a DECL which is actually a template parameter. */
2271#define DECL_TEMPLATE_PARM_P(NODE) \
2272 DECL_LANG_FLAG_0 (NODE)
2273
73b0fce8 2274#define DECL_TEMPLATE_TEMPLATE_PARM_P(NODE) \
50714e79 2275 (TREE_CODE (NODE) == TEMPLATE_DECL && DECL_TEMPLATE_PARM_P (NODE))
73b0fce8 2276
5566b478
MS
2277#define DECL_FUNCTION_TEMPLATE_P(NODE) \
2278 (TREE_CODE (NODE) == TEMPLATE_DECL \
2279 && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == FUNCTION_DECL)
2280
6757edfe
MM
2281/* Nonzero for a DECL that represents a template class. */
2282#define DECL_CLASS_TEMPLATE_P(NODE) \
2283 (TREE_CODE (NODE) == TEMPLATE_DECL \
2284 && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == TYPE_DECL \
2285 && !DECL_TEMPLATE_TEMPLATE_PARM_P (NODE))
2286
35acd3f2
MM
2287/* Nonzero if NODE which declares a type. */
2288#define DECL_DECLARES_TYPE_P(NODE) \
2289 (TREE_CODE (NODE) == TYPE_DECL || DECL_CLASS_TEMPLATE_P (NODE))
2290
9188c363
MM
2291/* Nonzero if NODE is the typedef implicitly generated for a type when
2292 the type is declared. (In C++, `struct S {};' is roughly equivalent
2293 to `struct S {}; typedef struct S S;' in C. This macro will hold
2294 for the typedef indicated in this example. Note that in C++, there
2295 is a second implicit typedef for each class, in the scope of `S'
2296 itself, so that you can `S::S'. This macro does *not* hold for
2297 those typedefs. */
2298#define DECL_IMPLICIT_TYPEDEF_P(NODE) \
2299 (TREE_CODE ((NODE)) == TYPE_DECL && DECL_LANG_FLAG_2 ((NODE)))
2300#define SET_DECL_IMPLICIT_TYPEDEF_P(NODE) \
2301 (DECL_LANG_FLAG_2 ((NODE)) = 1)
2302
93cdc044
JM
2303/* A `primary' template is one that has its own template header. A
2304 member function of a class template is a template, but not primary.
6757edfe
MM
2305 A member template is primary. Friend templates are primary, too. */
2306
2307/* Returns the primary template corresponding to these parameters. */
2308#define DECL_PRIMARY_TEMPLATE(NODE) \
2309 (TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (NODE)))
2310
2311/* Returns non-zero if NODE is a primary template. */
2312#define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == NODE)
5566b478
MS
2313
2314#define CLASSTYPE_TEMPLATE_LEVEL(NODE) \
2315 (TREE_INT_CST_HIGH (TREE_PURPOSE (CLASSTYPE_TI_TEMPLATE (NODE))))
8d08fdba 2316
a0a33927
MS
2317/* Indicates whether or not (and how) a template was expanded for this
2318 FUNCTION_DECL or VAR_DECL.
2319 0=normal declaration, e.g. int min (int, int);
2320 1=implicit template instantiation
2321 2=explicit template specialization, e.g. int min<int> (int, int);
e92cc029 2322 3=explicit template instantiation, e.g. template int min<int> (int, int); */
a0a33927
MS
2323#define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.use_template)
2324
2325#define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1)
2326#define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \
2327 (CLASSTYPE_USE_TEMPLATE (NODE) & 1)
2328
2329#define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2)
2330#define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2)
2331#define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
2332 (CLASSTYPE_USE_TEMPLATE (NODE) == 2)
2333#define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
2334 (CLASSTYPE_USE_TEMPLATE (NODE) = 2)
2335
2336#define DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 1)
2337#define SET_DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 1)
2338#define CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \
2339 (CLASSTYPE_USE_TEMPLATE(NODE) == 1)
2340#define SET_CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \
2341 (CLASSTYPE_USE_TEMPLATE(NODE) = 1)
2342
2343#define DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 3)
2344#define SET_DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 3)
2345#define CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
2346 (CLASSTYPE_USE_TEMPLATE(NODE) == 3)
2347#define SET_CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
2348 (CLASSTYPE_USE_TEMPLATE(NODE) = 3)
7177d104 2349
61289ca3
MM
2350/* Non-zero if DECL is a friend function which is an instantiation
2351 from the point of view of the compiler, but not from the point of
2352 view of the language. For example given:
2353 template <class T> struct S { friend void f(T) {}; };
2354 the declaration of `void f(int)' generated when S<int> is
2355 instantiated will not be a DECL_TEMPLATE_INSTANTIATION, but will be
2356 a DECL_FRIEND_PSUEDO_TEMPLATE_INSTANTIATION. */
2357#define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \
2358 (DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (DECL))
2359
4c571114
MM
2360/* Non-zero if TYPE is a partial instantiation of a template class,
2361 i.e., an instantiation whose instantiation arguments involve
2362 template types. */
2363#define PARTIAL_INSTANTIATION_P(TYPE) \
8012c983 2364 (TYPE_LANG_SPECIFIC (TYPE)->is_partial_instantiation)
4c571114 2365
39c01e4c
MM
2366/* Non-zero iff we are currently processing a declaration for an
2367 entity with its own template parameter list, and which is not a
2368 full specialization. */
2369#define PROCESSING_REAL_TEMPLATE_DECL_P() \
2370 (processing_template_decl > template_class_depth (current_class_type))
2371
73aad9b9
JM
2372/* This function may be a guiding decl for a template. */
2373#define DECL_MAYBE_TEMPLATE(NODE) DECL_LANG_FLAG_4 (NODE)
fbf1c34b
MM
2374
2375/* Nonzero if this VAR_DECL or FUNCTION_DECL has already been
2376 instantiated, i.e. its definition has been generated from the
2377 pattern given in the the template. */
2378#define DECL_TEMPLATE_INSTANTIATED(NODE) DECL_LANG_FLAG_1(NODE)
2379
db5ae43f 2380/* We know what we're doing with this decl now. */
e3417fcd 2381#define DECL_INTERFACE_KNOWN(NODE) DECL_LANG_FLAG_5 (NODE)
db5ae43f 2382
faae18ab
MS
2383/* This function was declared inline. This flag controls the linkage
2384 semantics of 'inline'; whether or not the function is inlined is
2385 controlled by DECL_INLINE. */
2386#define DECL_THIS_INLINE(NODE) \
2387 (DECL_LANG_SPECIFIC (NODE)->decl_flags.declared_inline)
2388
2389/* DECL_EXTERNAL must be set on a decl until the decl is actually emitted,
2390 so that assemble_external will work properly. So we have this flag to
2391 tell us whether the decl is really not external. */
2392#define DECL_NOT_REALLY_EXTERN(NODE) \
2393 (DECL_LANG_SPECIFIC (NODE)->decl_flags.not_really_extern)
db5ae43f 2394
6b5fbb55
MS
2395#define DECL_REALLY_EXTERN(NODE) \
2396 (DECL_EXTERNAL (NODE) && ! DECL_NOT_REALLY_EXTERN (NODE))
2397
39211cd5 2398#define THUNK_DELTA(DECL) ((DECL)->decl.frame_size.i)
8926095f 2399
8d08fdba
MS
2400/* ...and for unexpanded-parameterized-type nodes. */
2401#define UPT_TEMPLATE(NODE) TREE_PURPOSE(TYPE_VALUES(NODE))
2402#define UPT_PARMS(NODE) TREE_VALUE(TYPE_VALUES(NODE))
2403
42976354 2404/* An un-parsed default argument looks like an identifier. */
2b9dc906
JM
2405#define DEFARG_NODE_CHECK(t) TREE_CHECK(t, DEFAULT_ARG)
2406#define DEFARG_LENGTH(NODE) (DEFARG_NODE_CHECK(NODE)->identifier.length)
2407#define DEFARG_POINTER(NODE) (DEFARG_NODE_CHECK(NODE)->identifier.pointer)
42976354 2408
ad321293
MM
2409/* These macros provide convenient access to the various _STMT nodes
2410 created when parsing template declarations. */
2411#define IF_COND(NODE) TREE_OPERAND (NODE, 0)
2412#define THEN_CLAUSE(NODE) TREE_OPERAND (NODE, 1)
2413#define ELSE_CLAUSE(NODE) TREE_OPERAND (NODE, 2)
2414#define WHILE_COND(NODE) TREE_OPERAND (NODE, 0)
2415#define WHILE_BODY(NODE) TREE_OPERAND (NODE, 1)
2416#define DO_COND(NODE) TREE_OPERAND (NODE, 0)
2417#define DO_BODY(NODE) TREE_OPERAND (NODE, 1)
2418#define RETURN_EXPR(NODE) TREE_OPERAND (NODE, 0)
2419#define EXPR_STMT_EXPR(NODE) TREE_OPERAND (NODE, 0)
2420#define FOR_INIT_STMT(NODE) TREE_OPERAND (NODE, 0)
2421#define FOR_COND(NODE) TREE_OPERAND (NODE, 1)
2422#define FOR_EXPR(NODE) TREE_OPERAND (NODE, 2)
2423#define FOR_BODY(NODE) TREE_OPERAND (NODE, 3)
2424#define SWITCH_COND(NODE) TREE_OPERAND (NODE, 0)
2425#define SWITCH_BODY(NODE) TREE_OPERAND (NODE, 1)
2426#define CASE_LOW(NODE) TREE_OPERAND (NODE, 0)
2427#define CASE_HIGH(NODE) TREE_OPERAND (NODE, 1)
2428#define GOTO_DESTINATION(NODE) TREE_OPERAND (NODE, 0)
2429#define TRY_STMTS(NODE) TREE_OPERAND (NODE, 0)
2430#define TRY_HANDLERS(NODE) TREE_OPERAND (NODE, 1)
f1dedc31 2431#define CLEANUP_P(NODE) TREE_LANG_FLAG_0 (NODE)
ad321293
MM
2432#define HANDLER_PARMS(NODE) TREE_OPERAND (NODE, 0)
2433#define HANDLER_BODY(NODE) TREE_OPERAND (NODE, 1)
2434#define COMPOUND_BODY(NODE) TREE_OPERAND (NODE, 0)
2435#define ASM_CV_QUAL(NODE) TREE_OPERAND (NODE, 0)
2436#define ASM_STRING(NODE) TREE_OPERAND (NODE, 1)
2437#define ASM_OUTPUTS(NODE) TREE_OPERAND (NODE, 2)
2438#define ASM_INPUTS(NODE) TREE_OPERAND (NODE, 3)
2439#define ASM_CLOBBERS(NODE) TREE_OPERAND (NODE, 4)
9188c363 2440#define DECL_STMT_DECL(NODE) TREE_OPERAND (NODE, 0)
558475f0 2441#define STMT_EXPR_STMT(NODE) TREE_OPERAND (NODE, 0)
f1dedc31 2442#define SUBOBJECT_CLEANUP(NODE) TREE_OPERAND (NODE, 0)
b5434ee0 2443#define LABEL_STMT_LABEL(NODE) TREE_OPERAND (NODE, 0)
ad321293 2444
f71f87f9
MM
2445/* Nonzero for an ASM_STMT if the assembly statement is volatile. */
2446#define ASM_VOLATILE_P(NODE) \
2447 (ASM_CV_QUAL ((NODE)) != NULL_TREE)
2448
a7e4cfa0
MM
2449/* The line-number at which a statement began. But if
2450 STMT_LINENO_FOR_FN_P does holds, then this macro gives the
2451 line number for the end of the current function instead. */
f71f87f9
MM
2452#define STMT_LINENO(NODE) \
2453 (TREE_COMPLEXITY ((NODE)))
2454
a7e4cfa0
MM
2455/* If non-zero, the STMT_LINENO for NODE is the line at which the
2456 function ended. */
2457#define STMT_LINENO_FOR_FN_P(NODE) \
2458 (TREE_LANG_FLAG_2 ((NODE)))
2459
43f887f9
MM
2460/* The parameters for a call-declarator. */
2461#define CALL_DECLARATOR_PARMS(NODE) \
2462 (TREE_PURPOSE (TREE_OPERAND ((NODE), 1)))
2463
2464/* The cv-qualifiers for a call-declarator. */
2465#define CALL_DECLARATOR_QUALS(NODE) \
2466 (TREE_VALUE (TREE_OPERAND ((NODE), 1)))
2467
2468/* The exception-specification for a call-declarator. */
2469#define CALL_DECLARATOR_EXCEPTION_SPEC(NODE) \
2470 (TREE_TYPE ((NODE)))
2471
8d08fdba 2472/* An enumeration of the kind of tags that C++ accepts. */
6eabb241 2473enum tag_types { record_type, class_type, union_type, enum_type };
8d08fdba 2474
27b8d0cd
MM
2475/* The various kinds of lvalues we distinguish. */
2476typedef enum cp_lvalue_kind {
2477 clk_none = 0, /* Things that are not an lvalue. */
2478 clk_ordinary = 1, /* An ordinary lvalue. */
2479 clk_class = 2, /* An rvalue of class-type. */
2480 clk_bitfield = 4, /* An lvalue for a bit-field. */
2481} cp_lvalue_kind;
2482
8d08fdba
MS
2483/* Zero means prototype weakly, as in ANSI C (no args means nothing).
2484 Each language context defines how this variable should be set. */
2485extern int strict_prototype;
2486extern int strict_prototypes_lang_c, strict_prototypes_lang_cplusplus;
2487
2488/* Non-zero means that if a label exists, and no other identifier
2489 applies, use the value of the label. */
2490extern int flag_labels_ok;
2491
d2c192ad
JM
2492/* Nonzero means allow Microsoft extensions without a pedwarn. */
2493extern int flag_ms_extensions;
2494
8d08fdba
MS
2495/* Non-zero means to collect statistics which might be expensive
2496 and to print them when we are done. */
2497extern int flag_detailed_statistics;
2498
2499/* Non-zero means warn in function declared in derived class has the
2500 same name as a virtual in the base class, but fails to match the
2501 type signature of any virtual function in the base class. */
2502extern int warn_overloaded_virtual;
2503
dc8263bc
JM
2504/* Nonzero means warn about use of multicharacter literals. */
2505extern int warn_multichar;
2506
9018ce4d
BK
2507/* Non-zero means warn if a non-templatized friend function is
2508 declared in a templatized class. This behavior is warned about with
2509 flag_guiding_decls in do_friend. */
2510extern int warn_nontemplate_friend;
2511
8d08fdba
MS
2512/* in c-common.c */
2513extern void declare_function_name PROTO((void));
820b778a 2514extern void decl_attributes PROTO((tree, tree, tree));
8d08fdba
MS
2515extern void init_function_format_info PROTO((void));
2516extern void record_function_format PROTO((tree, tree, int, int, int));
2517extern void check_function_format PROTO((tree, tree, tree));
2518/* Print an error message for invalid operands to arith operation CODE.
2519 NOP_EXPR is used as a special case (see truthvalue_conversion). */
2520extern void binary_op_error PROTO((enum tree_code));
53929c47 2521extern tree canonical_type_variant PROTO((tree));
8d08fdba
MS
2522extern void c_expand_expr_stmt PROTO((tree));
2523/* Validate the expression after `case' and apply default promotions. */
2524extern tree check_case_value PROTO((tree));
2525/* Concatenate a list of STRING_CST nodes into one STRING_CST. */
2526extern tree combine_strings PROTO((tree));
2527extern void constant_expression_warning PROTO((tree));
2528extern tree convert_and_check PROTO((tree, tree));
2529extern void overflow_warning PROTO((tree));
2530extern void unsigned_conversion_warning PROTO((tree, tree));
91063b51 2531extern void c_apply_type_quals_to_decl PROTO((int, tree));
61a127b3 2532
8d08fdba 2533/* Read the rest of the current #-directive line. */
d4dfe7d6
DB
2534#if USE_CPPLIB
2535extern char *get_directive_line PROTO((void));
2536#define GET_DIRECTIVE_LINE() get_directive_line ()
2537#else
da20811c 2538extern char *get_directive_line PROTO((FILE *));
d4dfe7d6
DB
2539#define GET_DIRECTIVE_LINE() get_directive_line (finput)
2540#endif
8d08fdba
MS
2541/* Subroutine of build_binary_op, used for comparison operations.
2542 See if the operands have both been converted from subword integer types
2543 and, if so, perhaps change them both back to their original type. */
2544extern tree shorten_compare PROTO((tree *, tree *, tree *, enum tree_code *));
2545/* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
e92cc029 2546 or validate its data type for an `if' or `while' statement or ?..: exp. */
8d08fdba
MS
2547extern tree truthvalue_conversion PROTO((tree));
2548extern tree type_for_mode PROTO((enum machine_mode, int));
2549extern tree type_for_size PROTO((unsigned, int));
501ba25a 2550extern int c_get_alias_set PROTO((tree));
8d08fdba 2551
51c184be 2552/* in decl{2}.c */
8d08fdba
MS
2553/* A node that is a list (length 1) of error_mark_nodes. */
2554extern tree error_mark_list;
2555
9cd64686
MM
2556/* A list of virtual function tables we must make sure to write out. */
2557extern tree pending_vtables;
2558
700f8a87 2559/* Node for "pointer to (virtual) function".
e92cc029 2560 This may be distinct from ptr_type_node so gdb can distinguish them. */
700f8a87
MS
2561#define vfunc_ptr_type_node \
2562 (flag_vtable_thunks ? vtable_entry_type : ptr_type_node)
2563
8d08fdba 2564
8d08fdba
MS
2565/* For building calls to `delete'. */
2566extern tree integer_two_node, integer_three_node;
2567
0c8feefe
MM
2568extern tree anonymous_namespace_name;
2569
51c184be 2570/* in pt.c */
5566b478 2571
830bfa74
MM
2572/* These values are used for the `STRICT' parameter to type_unfication and
2573 fn_type_unification. Their meanings are described with the
2574 documentation for fn_type_unification. */
2575
2576typedef enum unification_kind_t {
2577 DEDUCE_CALL,
2578 DEDUCE_CONV,
2579 DEDUCE_EXACT
2580} unification_kind_t;
2581
8d08fdba
MS
2582/* The template currently being instantiated, and where the instantiation
2583 was triggered. */
2584struct tinst_level
2585{
5566b478 2586 tree decl;
8d08fdba
MS
2587 int line;
2588 char *file;
2589 struct tinst_level *next;
2590};
2591
bcb80729
KG
2592extern void maybe_print_template_context PROTO ((void));
2593
51c184be 2594/* in class.c */
61a127b3 2595
b4c4a9ec 2596extern int current_class_depth;
8d08fdba 2597
8d08fdba
MS
2598/* Points to the name of that function. May not be the DECL_NAME
2599 of CURRENT_FUNCTION_DECL due to overloading */
2600extern tree original_function_name;
2601
51c184be 2602/* in init.c */
8d08fdba 2603extern tree global_base_init_list;
8d08fdba 2604
8d08fdba
MS
2605\f
2606/* Here's where we control how name mangling takes place. */
2607
2608#define OPERATOR_ASSIGN_FORMAT "__a%s"
2609#define OPERATOR_FORMAT "__%s"
2610#define OPERATOR_TYPENAME_FORMAT "__op"
8d08fdba
MS
2611
2612/* Cannot use '$' up front, because this confuses gdb
2613 (names beginning with '$' are gdb-local identifiers).
2614
2615 Note that all forms in which the '$' is significant are long enough
2616 for direct indexing (meaning that if we know there is a '$'
2617 at a particular location, we can index into the string at
2618 any other location that provides distinguishing characters). */
2619
2620/* Define NO_DOLLAR_IN_LABEL in your favorite tm file if your assembler
2621 doesn't allow '$' in symbol names. */
2622#ifndef NO_DOLLAR_IN_LABEL
2623
2624#define JOINER '$'
2625
2626#define VPTR_NAME "$v"
2627#define THROW_NAME "$eh_throw"
2628#define DESTRUCTOR_DECL_PREFIX "_$_"
2629#define AUTO_VTABLE_NAME "__vtbl$me__"
2630#define AUTO_TEMP_NAME "_$tmp_"
2631#define AUTO_TEMP_FORMAT "_$tmp_%d"
2632#define VTABLE_BASE "$vb"
a0a33927 2633#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt$%s")
8d08fdba
MS
2634#define VFIELD_BASE "$vf"
2635#define VFIELD_NAME "_vptr$"
2636#define VFIELD_NAME_FORMAT "_vptr$%s"
2637#define VBASE_NAME "_vb$"
2638#define VBASE_NAME_FORMAT "_vb$%s"
2639#define STATIC_NAME_FORMAT "_%s$%s"
2640#define ANON_AGGRNAME_FORMAT "$_%d"
2641
2642#else /* NO_DOLLAR_IN_LABEL */
2643
2644#ifndef NO_DOT_IN_LABEL
2645
2646#define JOINER '.'
2647
2648#define VPTR_NAME ".v"
2649#define THROW_NAME ".eh_throw"
2650#define DESTRUCTOR_DECL_PREFIX "_._"
2651#define AUTO_VTABLE_NAME "__vtbl.me__"
2652#define AUTO_TEMP_NAME "_.tmp_"
2653#define AUTO_TEMP_FORMAT "_.tmp_%d"
2654#define VTABLE_BASE ".vb"
a0a33927 2655#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt.%s")
8d08fdba
MS
2656#define VFIELD_BASE ".vf"
2657#define VFIELD_NAME "_vptr."
2658#define VFIELD_NAME_FORMAT "_vptr.%s"
2659#define VBASE_NAME "_vb."
2660#define VBASE_NAME_FORMAT "_vb.%s"
2661#define STATIC_NAME_FORMAT "_%s.%s"
2662
2663#define ANON_AGGRNAME_FORMAT "._%d"
2664
2665#else /* NO_DOT_IN_LABEL */
2666
2667#define VPTR_NAME "__vptr"
2668#define VPTR_NAME_P(ID_NODE) \
2669 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VPTR_NAME, sizeof (VPTR_NAME) - 1))
2670#define THROW_NAME "__eh_throw"
2671#define DESTRUCTOR_DECL_PREFIX "__destr_"
2672#define DESTRUCTOR_NAME_P(ID_NODE) \
2673 (!strncmp (IDENTIFIER_POINTER (ID_NODE), DESTRUCTOR_DECL_PREFIX, \
2674 sizeof (DESTRUCTOR_DECL_PREFIX) - 1))
2675#define IN_CHARGE_NAME "__in_chrg"
2676#define AUTO_VTABLE_NAME "__vtbl_me__"
2677#define AUTO_TEMP_NAME "__tmp_"
2678#define TEMP_NAME_P(ID_NODE) \
2679 (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, \
2680 sizeof (AUTO_TEMP_NAME) - 1))
2681#define AUTO_TEMP_FORMAT "__tmp_%d"
2682#define VTABLE_BASE "__vtb"
2683#define VTABLE_NAME "__vt_"
a0a33927 2684#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt_%s")
8d08fdba
MS
2685#define VTABLE_NAME_P(ID_NODE) \
2686 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \
2687 sizeof (VTABLE_NAME) - 1))
2688#define VFIELD_BASE "__vfb"
2689#define VFIELD_NAME "__vptr_"
2690#define VFIELD_NAME_P(ID_NODE) \
2691 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \
2692 sizeof (VFIELD_NAME) - 1))
2693#define VFIELD_NAME_FORMAT "_vptr_%s"
2694#define VBASE_NAME "__vb_"
2695#define VBASE_NAME_P(ID_NODE) \
2696 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VBASE_NAME, \
2697 sizeof (VBASE_NAME) - 1))
2698#define VBASE_NAME_FORMAT "__vb_%s"
2699#define STATIC_NAME_FORMAT "__static_%s_%s"
2700
2701#define ANON_AGGRNAME_PREFIX "__anon_"
2702#define ANON_AGGRNAME_P(ID_NODE) \
2703 (!strncmp (IDENTIFIER_POINTER (ID_NODE), ANON_AGGRNAME_PREFIX, \
2704 sizeof (ANON_AGGRNAME_PREFIX) - 1))
2705#define ANON_AGGRNAME_FORMAT "__anon_%d"
2706#define ANON_PARMNAME_FORMAT "__%d"
2707#define ANON_PARMNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '_' \
2708 && IDENTIFIER_POINTER (ID_NODE)[1] == '_' \
2709 && IDENTIFIER_POINTER (ID_NODE)[2] <= '9')
2710
2711#endif /* NO_DOT_IN_LABEL */
2712#endif /* NO_DOLLAR_IN_LABEL */
2713
2714#define THIS_NAME "this"
2715#define DESTRUCTOR_NAME_FORMAT "~%s"
2716#define FILE_FUNCTION_PREFIX_LEN 9
fc378698
MS
2717#define CTOR_NAME "__ct"
2718#define DTOR_NAME "__dt"
8d08fdba
MS
2719
2720#define IN_CHARGE_NAME "__in_chrg"
2721
2722#define VTBL_PTR_TYPE "__vtbl_ptr_type"
2723#define VTABLE_DELTA_NAME "__delta"
2724#define VTABLE_INDEX_NAME "__index"
2725#define VTABLE_PFN_NAME "__pfn"
2726#define VTABLE_DELTA2_NAME "__delta2"
2727
8d08fdba
MS
2728#define EXCEPTION_CLEANUP_NAME "exception cleanup"
2729
2730#define THIS_NAME_P(ID_NODE) (strcmp(IDENTIFIER_POINTER (ID_NODE), "this") == 0)
2731
2732#if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL)
2733
2734#define VPTR_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == JOINER \
2735 && IDENTIFIER_POINTER (ID_NODE)[1] == 'v')
2736#define DESTRUCTOR_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == JOINER \
2737 && IDENTIFIER_POINTER (ID_NODE)[2] == '_')
2738
2739#define VTABLE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \
2740 && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \
2741 && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER)
2742
2743#define VBASE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \
2744 && IDENTIFIER_POINTER (ID_NODE)[2] == 'b' \
2745 && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER)
2746
2747#define TEMP_NAME_P(ID_NODE) (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, sizeof (AUTO_TEMP_NAME)-1))
2748#define VFIELD_NAME_P(ID_NODE) (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1))
2749
2750/* For anonymous aggregate types, we need some sort of name to
2751 hold on to. In practice, this should not appear, but it should
2752 not be harmful if it does. */
2753#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == JOINER \
2754 && IDENTIFIER_POINTER (ID_NODE)[1] == '_')
2755#define ANON_PARMNAME_FORMAT "_%d"
2756#define ANON_PARMNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '_' \
2757 && IDENTIFIER_POINTER (ID_NODE)[1] <= '9')
2758#endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */
35680744 2759
c8298f61 2760/* Store the vbase pointer field name for type TYPE into pointer BUF. */
d8e178a0
KG
2761#define FORMAT_VBASE_NAME(BUF,TYPE) do { \
2762 char *wbuf = (char *) alloca (TYPE_ASSEMBLER_NAME_LENGTH (TYPE) \
c8298f61 2763 + sizeof (VBASE_NAME) + 1); \
d8e178a0
KG
2764 sprintf (wbuf, VBASE_NAME_FORMAT, TYPE_ASSEMBLER_NAME_STRING (TYPE)); \
2765 (BUF) = wbuf; \
c8298f61
MH
2766} while (0)
2767
35680744
MM
2768/* Returns non-zero iff ID_NODE is an IDENTIFIER_NODE whose name is
2769 `main'. */
2770#define MAIN_NAME_P(ID_NODE) \
2771 (strcmp (IDENTIFIER_POINTER (ID_NODE), "main") == 0)
2772
2773/* Returns non-zero iff NODE is a declaration for the global function
2774 `main'. */
2775#define DECL_MAIN_P(NODE) \
2776 (TREE_CODE (NODE) == FUNCTION_DECL \
0f8766b8 2777 && DECL_LANGUAGE (NODE) == lang_c \
35680744
MM
2778 && DECL_NAME (NODE) != NULL_TREE \
2779 && MAIN_NAME_P (DECL_NAME (NODE)))
2780
8d08fdba 2781\f
8d08fdba
MS
2782/* Things for handling inline functions. */
2783
2784struct pending_inline
2785{
2786 struct pending_inline *next; /* pointer to next in chain */
2787 int lineno; /* line number we got the text from */
2788 char *filename; /* name of file we were processing */
2789 tree fndecl; /* FUNCTION_DECL that brought us here */
2790 int token; /* token we were scanning */
2791 int token_value; /* value of token we were scanning (YYSTYPE) */
2792
2793 char *buf; /* pointer to character stream */
2794 int len; /* length of stream */
8d08fdba
MS
2795 unsigned int can_free : 1; /* free this after we're done with it? */
2796 unsigned int deja_vu : 1; /* set iff we don't want to see it again. */
2797 unsigned int interface : 2; /* 0=interface 1=unknown 2=implementation */
2798};
2799
51c184be 2800/* in method.c */
8d08fdba
MS
2801extern struct pending_inline *pending_inlines;
2802
8d08fdba
MS
2803/* Positive values means that we cannot make optimizing assumptions about
2804 `this'. Negative values means we know `this' to be of static type. */
2805
2806extern int flag_this_is_variable;
2807
db5ae43f 2808/* Nonzero means generate 'rtti' that give run-time type information. */
8d08fdba 2809
db5ae43f 2810extern int flag_rtti;
8d08fdba 2811
a0a33927
MS
2812/* Nonzero means do emit exported implementations of functions even if
2813 they can be inlined. */
2814
2815extern int flag_implement_inlines;
2816
8d08fdba
MS
2817/* Nonzero means templates obey #pragma interface and implementation. */
2818
2819extern int flag_external_templates;
2820
2821/* Nonzero means templates are emitted where they are instantiated. */
2822
2823extern int flag_alt_external_templates;
2824
ddd5a7c1 2825/* Nonzero means implicit template instantiations are emitted. */
a0a33927
MS
2826
2827extern int flag_implicit_templates;
2828
72b7eeff
MS
2829/* Nonzero if we want to emit defined symbols with common-like linkage as
2830 weak symbols where possible, in order to conform to C++ semantics.
2831 Otherwise, emit them as local symbols. */
2832
2833extern int flag_weak;
2834
732dcb6f
JM
2835/* Nonzero to enable experimental ABI changes. */
2836
2837extern int flag_new_abi;
2838
2c73f9f5
ML
2839/* Nonzero to not ignore namespace std. */
2840
2841extern int flag_honor_std;
2842
5566b478
MS
2843/* Nonzero if we're done parsing and into end-of-file activities. */
2844
2845extern int at_eof;
2846
8d08fdba
MS
2847enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
2848
8d08fdba
MS
2849/* Some macros for char-based bitfields. */
2850#define B_SET(a,x) (a[x>>3] |= (1 << (x&7)))
2851#define B_CLR(a,x) (a[x>>3] &= ~(1 << (x&7)))
2852#define B_TST(a,x) (a[x>>3] & (1 << (x&7)))
2853
2854/* These are uses as bits in flags passed to build_method_call
2855 to control its error reporting behavior.
2856
2857 LOOKUP_PROTECT means flag access violations.
2858 LOOKUP_COMPLAIN mean complain if no suitable member function
2859 matching the arguments is found.
2860 LOOKUP_NORMAL is just a combination of these two.
8d08fdba
MS
2861 LOOKUP_NONVIRTUAL means make a direct call to the member function found
2862 LOOKUP_GLOBAL means search through the space of overloaded functions,
2863 as well as the space of member functions.
2864 LOOKUP_HAS_IN_CHARGE means that the "in charge" variable is already
2865 in the parameter list.
6060a796 2866 LOOKUP_ONLYCONVERTING means that non-conversion constructors are not tried.
9a3b49ac
MS
2867 DIRECT_BIND means that if a temporary is created, it should be created so
2868 that it lives as long as the current variable bindings; otherwise it
2869 only lives until the end of the complete-expression.
878cd289
MS
2870 LOOKUP_SPECULATIVELY means return NULL_TREE if we cannot find what we are
2871 after. Note, LOOKUP_COMPLAIN is checked and error messages printed
2872 before LOOKUP_SPECULATIVELY is checked.
8d08fdba
MS
2873 LOOKUP_NO_CONVERSION means that user-defined conversions are not
2874 permitted. Built-in conversions are permitted.
c73964b2 2875 LOOKUP_DESTRUCTOR means explicit call to destructor.
52c11ef6
JM
2876 LOOKUP_NO_TEMP_BIND means temporaries will not be bound to references.
2877
2878 These are used in global lookup to support elaborated types and
2879 qualifiers.
2880
2881 LOOKUP_PREFER_TYPES means not to accept objects, and possibly namespaces.
2882 LOOKUP_PREFER_NAMESPACES means not to accept objects, and possibly types.
2883 LOOKUP_PREFER_BOTH means class-or-namespace-name.
2884 LOOKUP_TEMPLATES_EXPECTED means that class templates also count
2885 as types. */
8d08fdba
MS
2886
2887#define LOOKUP_PROTECT (1)
2888#define LOOKUP_COMPLAIN (2)
2889#define LOOKUP_NORMAL (3)
4ac14744 2890/* #define LOOKUP_UNUSED (4) */
8d08fdba
MS
2891#define LOOKUP_NONVIRTUAL (8)
2892#define LOOKUP_GLOBAL (16)
2893#define LOOKUP_HAS_IN_CHARGE (32)
2894#define LOOKUP_SPECULATIVELY (64)
db5ae43f 2895#define LOOKUP_ONLYCONVERTING (128)
9a3b49ac 2896#define DIRECT_BIND (256)
8d08fdba
MS
2897#define LOOKUP_NO_CONVERSION (512)
2898#define LOOKUP_DESTRUCTOR (512)
c73964b2 2899#define LOOKUP_NO_TEMP_BIND (1024)
52c11ef6
JM
2900#define LOOKUP_PREFER_TYPES (2048)
2901#define LOOKUP_PREFER_NAMESPACES (4096)
2902#define LOOKUP_PREFER_BOTH (6144)
2903#define LOOKUP_TEMPLATES_EXPECTED (8192)
2904
2905#define LOOKUP_NAMESPACES_ONLY(f) \
2906 (((f) & LOOKUP_PREFER_NAMESPACES) && !((f) & LOOKUP_PREFER_TYPES))
2907#define LOOKUP_TYPES_ONLY(f) \
2908 (!((f) & LOOKUP_PREFER_NAMESPACES) && ((f) & LOOKUP_PREFER_TYPES))
2909#define LOOKUP_QUALIFIERS_ONLY(f) ((f) & LOOKUP_PREFER_BOTH)
2910
8d08fdba 2911
a4443a08
MS
2912/* These flags are used by the conversion code.
2913 CONV_IMPLICIT : Perform implicit conversions (standard and user-defined).
2914 CONV_STATIC : Perform the explicit conversions for static_cast.
2915 CONV_CONST : Perform the explicit conversions for const_cast.
2916 CONV_REINTERPRET: Perform the explicit conversions for reinterpret_cast.
6060a796 2917 CONV_PRIVATE : Perform upcasts to private bases.
8ccc31eb
MS
2918 CONV_FORCE_TEMP : Require a new temporary when converting to the same
2919 aggregate type. */
a4443a08
MS
2920
2921#define CONV_IMPLICIT 1
2922#define CONV_STATIC 2
2923#define CONV_CONST 4
2924#define CONV_REINTERPRET 8
2925#define CONV_PRIVATE 16
faf5394a 2926/* #define CONV_NONCONVERTING 32 */
8ccc31eb
MS
2927#define CONV_FORCE_TEMP 64
2928#define CONV_STATIC_CAST (CONV_IMPLICIT | CONV_STATIC | CONV_FORCE_TEMP)
a4443a08
MS
2929#define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
2930 | CONV_REINTERPRET)
2931#define CONV_C_CAST (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
8ccc31eb 2932 | CONV_REINTERPRET | CONV_PRIVATE | CONV_FORCE_TEMP)
a4443a08 2933
b7484fbe
MS
2934/* Used by build_expr_type_conversion to indicate which types are
2935 acceptable as arguments to the expression under consideration. */
2936
2937#define WANT_INT 1 /* integer types, including bool */
2938#define WANT_FLOAT 2 /* floating point types */
2939#define WANT_ENUM 4 /* enumerated types */
2940#define WANT_POINTER 8 /* pointer types */
2941#define WANT_NULL 16 /* null pointer constant */
b7484fbe
MS
2942#define WANT_ARITH (WANT_INT | WANT_FLOAT)
2943
3bfdc719
MM
2944/* Used with comptypes, and related functions, to guide type
2945 comparison. */
2946
2947#define COMPARE_STRICT 0 /* Just check if the types are the
2948 same. */
2949#define COMPARE_BASE 1 /* Check to see if the second type is
2950 derived from the first, or if both
2951 are pointers (or references) and
2952 the types pointed to by the second
2953 type is derived from the pointed to
2954 by the first. */
2955#define COMPARE_RELAXED 2 /* Like COMPARE_DERIVED, but in
2956 reverse. Also treat enmeration
2957 types as the same as integer types
2958 of the same width. */
2959#define COMPARE_REDECLARATION 4 /* The comparsion is being done when
2960 another declaration of an existing
2961 entity is seen. */
940ff223
JM
2962#define COMPARE_NO_ATTRIBUTES 8 /* The comparison should ignore
2963 extra-linguistic type attributes. */
3bfdc719 2964
7bdbfa05
MM
2965/* Used with push_overloaded_decl. */
2966#define PUSH_GLOBAL 0 /* Push the DECL into namespace scope,
2967 regardless of the current scope. */
2968#define PUSH_LOCAL 1 /* Push the DECL into the current
2969 scope. */
2970#define PUSH_USING 2 /* We are pushing this DECL as the
2971 result of a using declaration. */
2972
a8f73d4b
MM
2973/* Used with start function. */
2974#define SF_DEFAULT SF_EXPAND
2975 /* No flags. Temporarily, this is
2976 SF_EXPAND. Once we are fully
2977 function-at-a-time, this will be
2978 0. */
2979#define SF_PRE_PARSED 1 /* The function declaration has
2980 already been parsed. */
2981#define SF_INCLASS_INLINE 2 /* The function is an inline, defined
2982 in the class body. */
2983#define SF_EXPAND 4 /* Generate RTL for this function. */
2984
3bfdc719
MM
2985/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
2986 sense of `same'. */
2987#define same_type_p(type1, type2) \
2988 comptypes ((type1), (type2), COMPARE_STRICT)
2989
2990/* Returns nonzero iff TYPE1 and TYPE2 are the same type, or if TYPE2
2991 is derived from TYPE1, or if TYPE2 is a pointer (reference) to a
2992 class derived from the type pointed to (referred to) by TYPE1. */
2993#define same_or_base_type_p(type1, type2) \
2994 comptypes ((type1), (type2), COMPARE_BASE)
2995
f84b4be9
JM
2996/* These macros are used to access a TEMPLATE_PARM_INDEX. */
2997#define TEMPLATE_PARM_IDX(NODE) (((template_parm_index*) NODE)->index)
2998#define TEMPLATE_PARM_LEVEL(NODE) (((template_parm_index*) NODE)->level)
2999#define TEMPLATE_PARM_DESCENDANTS(NODE) (TREE_CHAIN (NODE))
3000#define TEMPLATE_PARM_ORIG_LEVEL(NODE) (((template_parm_index*) NODE)->orig_level)
3001#define TEMPLATE_PARM_DECL(NODE) (((template_parm_index*) NODE)->decl)
3002
73b0fce8
KL
3003/* These macros are for accessing the fields of TEMPLATE_TYPE_PARM
3004 and TEMPLATE_TEMPLATE_PARM nodes. */
f84b4be9
JM
3005#define TEMPLATE_TYPE_PARM_INDEX(NODE) (TYPE_FIELDS (NODE))
3006#define TEMPLATE_TYPE_IDX(NODE) \
3007 (TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (NODE)))
3008#define TEMPLATE_TYPE_LEVEL(NODE) \
3009 (TEMPLATE_PARM_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
3010#define TEMPLATE_TYPE_ORIG_LEVEL(NODE) \
3011 (TEMPLATE_PARM_ORIG_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
3012#define TEMPLATE_TYPE_DECL(NODE) \
3013 (TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
8d08fdba 3014
51c184be 3015/* in lex.c */
8d08fdba
MS
3016/* Indexed by TREE_CODE, these tables give C-looking names to
3017 operators represented by TREE_CODES. For example,
3018 opname_tab[(int) MINUS_EXPR] == "-". */
9c0758dd 3019extern const char **opname_tab, **assignop_tab;
8d08fdba 3020\f
51c184be 3021/* in call.c */
63d088b7 3022extern int check_dtor_name PROTO((tree, tree));
824b9a4c 3023extern int get_arglist_len_in_bytes PROTO((tree));
8d08fdba 3024
8d08fdba 3025extern tree build_vfield_ref PROTO((tree, tree));
8d08fdba
MS
3026extern tree resolve_scope_to_name PROTO((tree, tree));
3027extern tree build_scoped_method_call PROTO((tree, tree, tree, tree));
824b9a4c
MS
3028extern tree build_addr_func PROTO((tree));
3029extern tree build_call PROTO((tree, tree, tree));
8d08fdba 3030extern tree build_method_call PROTO((tree, tree, tree, tree, int));
824b9a4c
MS
3031extern int null_ptr_cst_p PROTO((tree));
3032extern tree type_decays_to PROTO((tree));
faf5394a 3033extern tree build_user_type_conversion PROTO((tree, tree, int));
9babbf20 3034extern tree build_new_function_call PROTO((tree, tree));
c73964b2 3035extern tree build_new_op PROTO((enum tree_code, int, tree, tree, tree));
da4768fe 3036extern tree build_op_new_call PROTO((enum tree_code, tree, tree, int));
519ebd1e 3037extern tree build_op_delete_call PROTO((enum tree_code, tree, tree, int, tree));
824b9a4c
MS
3038extern int can_convert PROTO((tree, tree));
3039extern int can_convert_arg PROTO((tree, tree, tree));
d6479fe7 3040extern int enforce_access PROTO((tree, tree));
297e73d8 3041extern tree convert_default_arg PROTO((tree, tree, tree));
41efda8f 3042extern tree convert_arg_to_ellipsis PROTO((tree));
8f032717 3043extern int is_properly_derived_from PROTO((tree, tree));
27b8d0cd 3044extern tree initialize_reference PROTO((tree, tree));
a7a64a77 3045extern tree strip_top_quals PROTO((tree));
4143af33 3046extern tree perform_implicit_conversion PROTO((tree, tree));
8d08fdba 3047
51c184be 3048/* in class.c */
8d08fdba 3049extern tree build_vbase_path PROTO((enum tree_code, tree, tree, tree, int));
6b5fbb55 3050extern tree build_vtbl_ref PROTO((tree, tree));
8d08fdba
MS
3051extern tree build_vfn_ref PROTO((tree *, tree, tree));
3052extern void add_method PROTO((tree, tree *, tree));
77dc0938 3053extern int currently_open_class PROTO((tree));
51c184be 3054extern tree get_vfield_offset PROTO((tree));
8d08fdba 3055extern void duplicate_tag_error PROTO((tree));
9f33663b
JM
3056extern tree finish_struct PROTO((tree, tree));
3057extern void finish_struct_1 PROTO((tree));
8d08fdba
MS
3058extern int resolves_to_fixed_type_p PROTO((tree, int *));
3059extern void init_class_processing PROTO((void));
77dc0938 3060extern int is_empty_class PROTO((tree));
8d08fdba 3061extern void pushclass PROTO((tree, int));
b74a0560 3062extern void popclass PROTO((void));
8d08fdba 3063extern void push_nested_class PROTO((tree, int));
b74a0560 3064extern void pop_nested_class PROTO((void));
8d08fdba
MS
3065extern void push_lang_context PROTO((tree));
3066extern void pop_lang_context PROTO((void));
8d08fdba
MS
3067extern tree instantiate_type PROTO((tree, tree, int));
3068extern void print_class_statistics PROTO((void));
3f1892e1 3069extern void push_cache_obstack PROTO((void));
aff08c18 3070extern unsigned HOST_WIDE_INT skip_rtti_stuff PROTO((tree *, tree));
d6479fe7 3071extern void build_self_reference PROTO((void));
49c249e1 3072extern void warn_hidden PROTO((tree));
b54ccf71
JM
3073extern tree get_enclosing_class PROTO((tree));
3074int is_base_of_enclosing_class PROTO((tree, tree));
61a127b3 3075extern void unreverse_member_declarations PROTO((tree));
8f032717
MM
3076extern void invalidate_class_lookup_cache PROTO((void));
3077extern void maybe_note_name_used_in_class PROTO((tree, tree));
3078extern void note_name_declared_in_class PROTO((tree, tree));
8d08fdba 3079
51c184be 3080/* in cvt.c */
a4443a08 3081extern tree convert_to_reference PROTO((tree, tree, int, int, tree));
8d08fdba 3082extern tree convert_from_reference PROTO((tree));
8d08fdba 3083extern tree convert_pointer_to_real PROTO((tree, tree));
824b9a4c 3084extern tree convert_pointer_to PROTO((tree, tree));
37c46b43
MS
3085extern tree ocp_convert PROTO((tree, tree, int, int));
3086extern tree cp_convert PROTO((tree, tree));
02cac427 3087extern tree convert_to_void PROTO((tree, const char */*implicit context*/));
824b9a4c 3088extern tree convert PROTO((tree, tree));
6060a796 3089extern tree convert_force PROTO((tree, tree, int));
e08a8f45 3090extern tree build_type_conversion PROTO((tree, tree, int));
b7484fbe 3091extern tree build_expr_type_conversion PROTO((int, tree, int));
39211cd5 3092extern tree type_promotes_to PROTO((tree));
75650646 3093extern tree perform_qualification_conversions PROTO((tree, tree));
8d08fdba 3094
51c184be 3095/* decl.c */
824b9a4c 3096/* resume_binding_level */
69789cfc 3097extern void set_identifier_local_value PROTO((tree, tree));
8d08fdba 3098extern int global_bindings_p PROTO((void));
a9aedbc2 3099extern int toplevel_bindings_p PROTO((void));
7bdbfa05 3100extern int namespace_bindings_p PROTO((void));
f1dedc31 3101extern void keep_next_level PROTO((int));
8d08fdba
MS
3102extern int kept_level_p PROTO((void));
3103extern void declare_parm_level PROTO((void));
8d08fdba
MS
3104extern void declare_pseudo_global_level PROTO((void));
3105extern int pseudo_global_level_p PROTO((void));
824b9a4c 3106extern void set_class_shadows PROTO((tree));
8d08fdba 3107extern void pushlevel PROTO((int));
824b9a4c 3108extern void note_level_for_for PROTO((void));
8d08fdba
MS
3109extern void pushlevel_temporary PROTO((int));
3110extern tree poplevel PROTO((int, int, int));
49c249e1 3111extern void resume_level PROTO((struct binding_level *));
8d08fdba
MS
3112extern void delete_block PROTO((tree));
3113extern void insert_block PROTO((tree));
3114extern void add_block_current_level PROTO((tree));
3115extern void set_block PROTO((tree));
3116extern void pushlevel_class PROTO((void));
8d08fdba 3117extern void print_binding_stack PROTO((void));
49c249e1 3118extern void print_binding_level PROTO((struct binding_level *));
824b9a4c
MS
3119extern void push_namespace PROTO((tree));
3120extern void pop_namespace PROTO((void));
61fc8c9e
MM
3121extern void push_nested_namespace PROTO((tree));
3122extern void pop_nested_namespace PROTO((tree));
824b9a4c 3123extern void maybe_push_to_top_level PROTO((int));
8d08fdba
MS
3124extern void push_to_top_level PROTO((void));
3125extern void pop_from_top_level PROTO((void));
2c73f9f5 3126extern tree identifier_type_value PROTO((tree));
8d08fdba 3127extern void set_identifier_type_value PROTO((tree, tree));
8926095f 3128extern void pop_everything PROTO((void));
8d08fdba
MS
3129extern void pushtag PROTO((tree, tree, int));
3130extern tree make_anon_name PROTO((void));
3131extern void clear_anon_tags PROTO((void));
824b9a4c
MS
3132extern int decls_match PROTO((tree, tree));
3133extern int duplicate_decls PROTO((tree, tree));
8d08fdba
MS
3134extern tree pushdecl PROTO((tree));
3135extern tree pushdecl_top_level PROTO((tree));
61a127b3 3136extern void pushdecl_class_level PROTO((tree));
bd6dd845 3137#if 0
5566b478 3138extern void pushdecl_nonclass_level PROTO((tree));
bd6dd845 3139#endif
2c73f9f5
ML
3140extern tree pushdecl_namespace_level PROTO((tree));
3141extern tree push_using_decl PROTO((tree, tree));
9ed182dc 3142extern tree push_using_directive PROTO((tree));
824b9a4c 3143extern void push_class_level_binding PROTO((tree, tree));
8d08fdba
MS
3144extern tree implicitly_declare PROTO((tree));
3145extern tree lookup_label PROTO((tree));
b5434ee0 3146extern tree declare_local_label PROTO((tree));
8d08fdba 3147extern tree define_label PROTO((char *, int, tree));
824b9a4c
MS
3148extern void push_switch PROTO((void));
3149extern void pop_switch PROTO((void));
b370501f 3150extern void define_case_label PROTO((void));
8d08fdba
MS
3151extern tree getdecls PROTO((void));
3152extern tree gettags PROTO((void));
bd6dd845 3153#if 0
8d08fdba 3154extern void set_current_level_tags_transparency PROTO((int));
bd6dd845 3155#endif
30394414 3156extern tree binding_for_name PROTO((tree, tree));
2c73f9f5
ML
3157extern tree namespace_binding PROTO((tree, tree));
3158extern void set_namespace_binding PROTO((tree, tree, tree));
a9aedbc2 3159extern tree lookup_namespace_name PROTO((tree, tree));
45869a6c 3160extern tree build_typename_type PROTO((tree, tree, tree, tree));
824b9a4c
MS
3161extern tree make_typename_type PROTO((tree, tree));
3162extern tree lookup_name_nonclass PROTO((tree));
2c73f9f5 3163extern tree lookup_function_nonclass PROTO((tree, tree));
824b9a4c 3164extern tree lookup_name PROTO((tree, int));
8d08fdba 3165extern tree lookup_name_current_level PROTO((tree));
9ed182dc 3166extern tree lookup_type_current_level PROTO((tree));
3e3f722c
ML
3167extern tree lookup_name_namespace_only PROTO((tree));
3168extern void begin_only_namespace_names PROTO((void));
3169extern void end_only_namespace_names PROTO((void));
9ed182dc 3170extern tree namespace_ancestor PROTO((tree, tree));
2c169bab
JM
3171extern tree unqualified_namespace_lookup PROTO((tree, int, tree *));
3172extern int lookup_using_namespace PROTO((tree, tree, tree, tree, int, tree *));
3173extern int qualified_lookup_using_namespace PROTO((tree, tree, tree, int));
824b9a4c 3174extern tree auto_function PROTO((tree, tree, enum built_in_function));
8d08fdba 3175extern void init_decl_processing PROTO((void));
5566b478 3176extern int init_type_desc PROTO((void));
49c249e1 3177extern tree define_function
d8e178a0 3178 PROTO((const char *, tree, enum built_in_function,
7f4edbcb 3179 void (*) (tree), const char *));
72a93143 3180extern tree check_tag_decl PROTO((tree));
8d08fdba 3181extern void shadow_tag PROTO((tree));
8d08fdba 3182extern tree groktypename PROTO((tree));
fcad5cf5 3183extern tree start_decl PROTO((tree, tree, int, tree, tree));
824b9a4c 3184extern void start_decl_1 PROTO((tree));
b3417a04 3185extern void cp_finish_decl PROTO((tree, tree, tree, int, int));
824b9a4c 3186extern void finish_decl PROTO((tree, tree, tree));
b7b8bcd2
MM
3187extern void maybe_inject_for_scope_var PROTO((tree));
3188extern void initialize_local_var PROTO((tree, tree, int));
8d08fdba 3189extern void expand_static_init PROTO((tree, tree));
3c5c0849 3190extern void start_handler_parms PROTO((tree, tree));
8d08fdba
MS
3191extern int complete_array_type PROTO((tree, tree, int));
3192extern tree build_ptrmemfunc_type PROTO((tree));
f30432d7 3193/* the grokdeclarator prototype is in decl.h */
8926095f 3194extern int parmlist_is_exprlist PROTO((tree));
824b9a4c
MS
3195extern int copy_args_p PROTO((tree));
3196extern int grok_ctor_properties PROTO((tree, tree));
3197extern void grok_op_properties PROTO((tree, int, int));
ca107ded 3198extern tree xref_tag PROTO((tree, tree, int));
fc378698 3199extern tree xref_tag_from_type PROTO((tree, tree, int));
8ccc31eb 3200extern void xref_basetypes PROTO((tree, tree, tree, tree));
8d08fdba 3201extern tree start_enum PROTO((tree));
dbfe2124 3202extern tree finish_enum PROTO((tree));
079e1098 3203extern tree build_enumerator PROTO((tree, tree, tree));
c11b6f21 3204extern int start_function PROTO((tree, tree, tree, int));
f30432d7 3205extern void expand_start_early_try_stmts PROTO((void));
824b9a4c 3206extern void store_parm_decls PROTO((void));
558475f0 3207extern void store_return_init PROTO((tree));
4d6abc1c 3208extern tree finish_function PROTO((int, int));
acf82af2 3209extern tree start_method PROTO((tree, tree, tree));
8d08fdba
MS
3210extern tree finish_method PROTO((tree));
3211extern void hack_incomplete_structures PROTO((tree));
c73964b2 3212extern tree maybe_build_cleanup_and_delete PROTO((tree));
824b9a4c 3213extern tree maybe_build_cleanup PROTO((tree));
8d08fdba
MS
3214extern void cplus_expand_expr_stmt PROTO((tree));
3215extern void finish_stmt PROTO((void));
824b9a4c 3216extern int in_function_p PROTO((void));
49c249e1
JM
3217extern void replace_defarg PROTO((tree, tree));
3218extern void print_other_binding_stack PROTO((struct binding_level *));
8857f91e 3219extern void revert_static_member_fn PROTO((tree*, tree*, tree*));
6bdb8141 3220extern void fixup_anonymous_aggr PROTO((tree));
6ba89f8e 3221extern int check_static_variable_definition PROTO((tree, tree));
0034cf72 3222extern void push_local_binding PROTO((tree, tree, int));
8f032717 3223extern int push_class_binding PROTO((tree, tree));
297e73d8 3224extern tree check_default_argument PROTO((tree, tree));
7bdbfa05 3225extern tree push_overloaded_decl PROTO((tree, int));
8f032717 3226extern void clear_identifier_class_values PROTO((void));
280f9385 3227extern void storetags PROTO((tree));
0aafb128
MM
3228extern int vtable_decl_p PROTO((tree, void *));
3229extern int vtype_decl_p PROTO((tree, void *));
3230extern int sigtable_decl_p PROTO((tree, void *));
3231typedef int (*walk_globals_pred) PROTO((tree, void *));
3232typedef int (*walk_globals_fn) PROTO((tree *, void *));
3233extern int walk_globals PROTO((walk_globals_pred,
3234 walk_globals_fn,
3235 void *));
3236typedef int (*walk_namespaces_fn) PROTO((tree, void *));
3237extern int walk_namespaces PROTO((walk_namespaces_fn,
3238 void *));
3239extern int wrapup_globals_for_namespace PROTO((tree, void *));
f71f87f9 3240extern tree cp_namespace_decls PROTO((tree));
9188c363
MM
3241extern tree create_implicit_typedef PROTO((tree, tree));
3242extern tree maybe_push_decl PROTO((tree));
8d08fdba 3243
51c184be 3244/* in decl2.c */
fc6af6e3 3245extern void init_decl2 PROTO((void));
b370501f 3246extern int check_java_method PROTO((tree));
297441fd 3247extern int lang_decode_option PROTO((int, char **));
8d08fdba 3248extern tree grok_method_quals PROTO((tree, tree, tree));
824b9a4c 3249extern void warn_if_unknown_interface PROTO((tree));
61a127b3 3250extern void grok_x_components PROTO((tree));
711734a9 3251extern void maybe_retrofit_in_chrg PROTO((tree));
bcb80729 3252extern void maybe_make_one_only PROTO((tree));
b370501f 3253extern void grokclassfn PROTO((tree, tree, enum overload_flags, tree));
8d08fdba
MS
3254extern tree grok_alignof PROTO((tree));
3255extern tree grok_array_decl PROTO((tree, tree));
3256extern tree delete_sanity PROTO((tree, tree, int, int));
5566b478 3257extern tree check_classfn PROTO((tree, tree));
98c1c668 3258extern void check_member_template PROTO((tree));
c11b6f21 3259extern tree grokfield PROTO((tree, tree, tree, tree, tree));
8d08fdba
MS
3260extern tree grokbitfield PROTO((tree, tree, tree));
3261extern tree groktypefield PROTO((tree, tree));
51c184be 3262extern tree grokoptypename PROTO((tree, tree));
5566b478 3263extern int copy_assignment_arg_p PROTO((tree, int));
f6abb50a 3264extern void cplus_decl_attributes PROTO((tree, tree, tree));
8d08fdba
MS
3265extern tree constructor_name_full PROTO((tree));
3266extern tree constructor_name PROTO((tree));
3267extern void setup_vtbl_ptr PROTO((void));
3268extern void mark_inline_for_output PROTO((tree));
8d08fdba 3269extern tree get_temp_name PROTO((tree, int));
8d08fdba
MS
3270extern void finish_anon_union PROTO((tree));
3271extern tree finish_table PROTO((tree, tree, tree, int));
d8e178a0
KG
3272extern void finish_builtin_type PROTO((tree, const char *,
3273 tree *, int, tree));
8d08fdba
MS
3274extern tree coerce_new_type PROTO((tree));
3275extern tree coerce_delete_type PROTO((tree));
824b9a4c 3276extern void comdat_linkage PROTO((tree));
7e776093 3277extern void import_export_class PROTO((tree));
5566b478 3278extern void import_export_vtable PROTO((tree, tree, int));
824b9a4c
MS
3279extern void import_export_decl PROTO((tree));
3280extern tree build_cleanup PROTO((tree));
8d08fdba 3281extern void finish_file PROTO((void));
51c184be
MS
3282extern tree reparse_absdcl_as_expr PROTO((tree, tree));
3283extern tree reparse_absdcl_as_casts PROTO((tree, tree));
5566b478 3284extern tree build_expr_from_tree PROTO((tree));
51c184be
MS
3285extern tree reparse_decl_as_expr PROTO((tree, tree));
3286extern tree finish_decl_parsing PROTO((tree));
2986ae00 3287extern tree check_cp_case_value PROTO((tree));
b262d64c 3288extern void set_decl_namespace PROTO((tree, tree, int));
2c73f9f5
ML
3289extern tree current_decl_namespace PROTO((void));
3290extern void push_decl_namespace PROTO((tree));
3291extern void pop_decl_namespace PROTO((void));
f09bbbed
ML
3292extern void push_scope PROTO((tree));
3293extern void pop_scope PROTO((tree));
824b9a4c 3294extern void do_namespace_alias PROTO((tree, tree));
6b5fbb55 3295extern void do_toplevel_using_decl PROTO((tree));
ea9635c7 3296extern void do_local_using_decl PROTO((tree));
a9aedbc2 3297extern tree do_class_using_decl PROTO((tree));
824b9a4c 3298extern void do_using_directive PROTO((tree));
f30432d7 3299extern void check_default_args PROTO((tree));
5566b478 3300extern void mark_used PROTO((tree));
49c249e1 3301extern tree handle_class_head PROTO((tree, tree, tree));
2c73f9f5 3302extern tree lookup_arg_dependent PROTO((tree, tree, tree));
fa8d6e85 3303extern void finish_static_data_member_decl PROTO((tree, tree, tree, int, int));
8d08fdba 3304
fc6af6e3
RH
3305/* in parse.y */
3306extern void cp_parse_init PROTO((void));
3307
824b9a4c 3308/* in errfn.c */
d8e178a0
KG
3309/* The cp_* functions aren't suitable for ATTRIBUTE_PRINTF. */
3310extern void cp_error PVPROTO((const char *, ...));
3311extern void cp_error_at PVPROTO((const char *, ...));
3312extern void cp_warning PVPROTO((const char *, ...));
3313extern void cp_warning_at PVPROTO((const char *, ...));
3314extern void cp_pedwarn PVPROTO((const char *, ...));
3315extern void cp_pedwarn_at PVPROTO((const char *, ...));
3316extern void cp_compiler_error PVPROTO((const char *, ...));
3317extern void cp_sprintf PVPROTO((const char *, ...));
2de45c06 3318extern void cp_deprecated PROTO((const char*));
824b9a4c
MS
3319
3320/* in error.c */
3321extern void init_error PROTO((void));
e1def31b
KG
3322extern const char *fndecl_as_string PROTO((tree, int));
3323extern const char *type_as_string PROTO((tree, int));
3324extern const char *type_as_string_real PROTO((tree, int, int));
3325extern const char *args_as_string PROTO((tree, int));
3326extern const char *decl_as_string PROTO((tree, int));
3327extern const char *expr_as_string PROTO((tree, int));
3328extern const char *code_as_string PROTO((enum tree_code, int));
3329extern const char *language_as_string PROTO((enum languages, int));
3330extern const char *parm_as_string PROTO((int, int));
3331extern const char *op_as_string PROTO((enum tree_code, int));
3332extern const char *assop_as_string PROTO((enum tree_code, int));
3333extern const char *cv_as_string PROTO((tree, int));
3334extern const char *lang_decl_name PROTO((tree, int));
3335extern const char *cp_file_of PROTO((tree));
49c249e1 3336extern int cp_line_of PROTO((tree));
824b9a4c 3337
51c184be 3338/* in except.c */
8d08fdba 3339extern void init_exception_processing PROTO((void));
3c5c0849 3340extern void expand_start_catch_block PROTO((tree));
824b9a4c 3341extern void expand_end_catch_block PROTO((void));
f30432d7
MS
3342extern void expand_builtin_throw PROTO((void));
3343extern void expand_start_eh_spec PROTO((void));
824b9a4c 3344extern void expand_exception_blocks PROTO((void));
72b7eeff 3345extern tree start_anon_func PROTO((void));
824b9a4c
MS
3346extern void end_anon_func PROTO((void));
3347extern void expand_throw PROTO((tree));
3348extern tree build_throw PROTO((tree));
9c606f69 3349extern void mark_all_runtime_matches PROTO((void));
8d08fdba 3350
51c184be 3351/* in expr.c */
8d08fdba
MS
3352extern void init_cplus_expand PROTO((void));
3353extern void fixup_result_decl PROTO((tree, struct rtx_def *));
824b9a4c
MS
3354extern int extract_init PROTO((tree, tree));
3355extern void do_case PROTO((tree, tree));
b928a651 3356extern tree cplus_expand_constant PROTO((tree));
8d08fdba 3357
bd6dd845
MS
3358/* friend.c */
3359extern int is_friend PROTO((tree, tree));
3360extern void make_friend_class PROTO((tree, tree));
0c0aac2f
MM
3361extern void add_friend PROTO((tree, tree));
3362extern void add_friends PROTO((tree, tree, tree));
7a8f9fa9 3363extern tree do_friend PROTO((tree, tree, tree, tree, tree, enum overload_flags, tree, int));
bd6dd845 3364
51c184be 3365/* in init.c */
824b9a4c
MS
3366extern void init_init_processing PROTO((void));
3367extern void expand_direct_vtbls_init PROTO((tree, tree, int, int, tree));
f1dedc31 3368extern void emit_base_init PROTO((tree));
8d08fdba 3369extern void check_base_init PROTO((tree));
8d08fdba 3370extern void expand_member_init PROTO((tree, tree, tree));
f1dedc31 3371extern tree build_aggr_init PROTO((tree, tree, int));
8d08fdba 3372extern int is_aggr_typedef PROTO((tree, int));
5566b478 3373extern int is_aggr_type PROTO((tree, int));
8d08fdba
MS
3374extern tree get_aggr_from_typedef PROTO((tree, int));
3375extern tree get_type_value PROTO((tree));
3376extern tree build_member_call PROTO((tree, tree, tree));
3377extern tree build_offset_ref PROTO((tree, tree));
8d08fdba
MS
3378extern tree resolve_offset_ref PROTO((tree));
3379extern tree decl_constant_value PROTO((tree));
8d08fdba 3380extern tree build_new PROTO((tree, tree, tree, int));
a0d5fba7 3381extern tree build_new_1 PROTO((tree));
f1dedc31 3382extern tree build_vec_init PROTO((tree, tree, tree, tree, int));
b370501f 3383extern tree build_x_delete PROTO((tree, int, tree));
8d08fdba
MS
3384extern tree build_delete PROTO((tree, tree, tree, int, int));
3385extern tree build_vbase_delete PROTO((tree, tree));
5566b478 3386extern tree build_vec_delete PROTO((tree, tree, tree, tree, int));
f1dedc31 3387extern tree create_temporary_var PROTO((tree));
8d1e67c6
MM
3388extern void begin_init_stmts PROTO((tree *, tree *));
3389extern tree finish_init_stmts PROTO((tree, tree));
8d08fdba 3390
51c184be 3391/* in input.c */
8d08fdba 3392
51c184be 3393/* in lex.c */
d8e178a0 3394extern char *file_name_nondirectory PROTO((const char *));
8d08fdba
MS
3395extern tree make_pointer_declarator PROTO((tree, tree));
3396extern tree make_reference_declarator PROTO((tree, tree));
c11b6f21
MS
3397extern tree make_call_declarator PROTO((tree, tree, tree, tree));
3398extern void set_quals_and_spec PROTO((tree, tree, tree));
9c0758dd 3399extern const char *operator_name_string PROTO((tree));
8d08fdba
MS
3400extern void lang_init PROTO((void));
3401extern void lang_finish PROTO((void));
bd6dd845 3402#if 0
8d08fdba 3403extern void reinit_lang_specific PROTO((void));
bd6dd845 3404#endif
8d08fdba 3405extern void reinit_parse_for_function PROTO((void));
8d08fdba
MS
3406extern void print_parse_statistics PROTO((void));
3407extern void extract_interface_info PROTO((void));
8d08fdba 3408extern void do_pending_inlines PROTO((void));
87e3dbc9 3409extern void process_next_inline PROTO((struct pending_inline *));
49c249e1
JM
3410extern struct pending_input *save_pending_input PROTO((void));
3411extern void restore_pending_input PROTO((struct pending_input *));
8d08fdba
MS
3412extern void yyungetc PROTO((int, int));
3413extern void reinit_parse_for_method PROTO((int, tree));
bd6dd845 3414extern void reinit_parse_for_block PROTO((int, struct obstack *));
f376e137 3415extern tree cons_up_default_function PROTO((tree, tree, int));
8d08fdba
MS
3416extern void check_for_missing_semicolon PROTO((tree));
3417extern void note_got_semicolon PROTO((tree));
3418extern void note_list_got_semicolon PROTO((tree));
824b9a4c 3419extern void do_pending_lang_change PROTO((void));
8d08fdba
MS
3420extern int identifier_type PROTO((tree));
3421extern void see_typename PROTO((void));
a759e627 3422extern tree do_identifier PROTO((tree, int, tree));
5566b478 3423extern tree do_scoped_id PROTO((tree, int));
8d08fdba
MS
3424extern tree identifier_typedecl_value PROTO((tree));
3425extern int real_yylex PROTO((void));
824b9a4c 3426extern int is_rid PROTO((tree));
8d08fdba 3427extern tree build_lang_decl PROTO((enum tree_code, tree, tree));
01235b80 3428extern void retrofit_lang_decl PROTO((tree));
8d08fdba
MS
3429extern void copy_lang_decl PROTO((tree));
3430extern tree make_lang_type PROTO((enum tree_code));
8d08fdba 3431extern void dump_time_statistics PROTO((void));
d8e178a0
KG
3432extern void compiler_error PVPROTO((const char *, ...))
3433 ATTRIBUTE_PRINTF_1;
3434extern void yyerror PROTO((const char *));
49c249e1
JM
3435extern void clear_inline_text_obstack PROTO((void));
3436extern void maybe_snarf_defarg PROTO((void));
3437extern tree snarf_defarg PROTO((void));
3438extern void add_defarg_fn PROTO((tree));
3439extern void do_pending_defargs PROTO((void));
3440extern int identifier_type PROTO((tree));
9f617717 3441extern void yyhook PROTO((int));
91063b51 3442extern int cp_type_qual_from_rid PROTO((tree));
8d08fdba 3443
51c184be 3444/* in method.c */
8d08fdba 3445extern void init_method PROTO((void));
8d08fdba 3446extern void do_inline_function_hair PROTO((tree, tree));
8d08fdba 3447extern char *build_overload_name PROTO((tree, int, int));
f376e137 3448extern tree build_static_name PROTO((tree, tree));
8d08fdba 3449extern tree build_decl_overload PROTO((tree, tree, int));
36a117a5
MM
3450extern tree build_decl_overload_real PROTO((tree, tree, tree, tree,
3451 tree, int));
c1def683 3452extern void set_mangled_name_for_decl PROTO((tree));
8d08fdba 3453extern tree build_typename_overload PROTO((tree));
6b5fbb55 3454extern tree build_overload_with_type PROTO((tree, tree));
711734a9 3455extern tree build_destructor_name PROTO((tree));
8d08fdba 3456extern tree build_opfncall PROTO((enum tree_code, int, tree, tree, tree));
5566b478 3457extern tree hack_identifier PROTO((tree, tree));
6b5fbb55 3458extern tree make_thunk PROTO((tree, int));
824b9a4c 3459extern void emit_thunk PROTO((tree));
5566b478 3460extern void synthesize_method PROTO((tree));
9c0758dd 3461extern tree get_id_2 PROTO((const char *, tree));
8d08fdba 3462
51c184be 3463/* in pt.c */
9cd64686 3464extern void init_pt PROTO ((void));
e833cb11 3465extern void check_template_shadow PROTO ((tree));
36a117a5 3466extern tree innermost_args PROTO ((tree));
4393e105
MM
3467extern tree tsubst PROTO ((tree, tree, int, tree));
3468extern tree tsubst_expr PROTO ((tree, tree, int, tree));
3469extern tree tsubst_copy PROTO ((tree, tree, int, tree));
f84b4be9 3470extern void maybe_begin_member_template_processing PROTO((tree));
b370501f 3471extern void maybe_end_member_template_processing PROTO((void));
61a127b3 3472extern tree finish_member_template_decl PROTO((tree));
8d08fdba 3473extern void begin_template_parm_list PROTO((void));
386b8a85
JM
3474extern void begin_specialization PROTO((void));
3475extern void reset_specialization PROTO((void));
3476extern void end_specialization PROTO((void));
75650646
MM
3477extern void begin_explicit_instantiation PROTO((void));
3478extern void end_explicit_instantiation PROTO((void));
61a127b3 3479extern tree check_explicit_specialization PROTO((tree, tree, int, int));
8d08fdba
MS
3480extern tree process_template_parm PROTO((tree, tree));
3481extern tree end_template_parm_list PROTO((tree));
5566b478 3482extern void end_template_decl PROTO((void));
9a3b49ac 3483extern tree current_template_args PROTO((void));
3ac3d9ea 3484extern tree push_template_decl PROTO((tree));
6757edfe
MM
3485extern tree push_template_decl_real PROTO((tree, int));
3486extern void redeclare_class_template PROTO((tree, tree));
36a117a5 3487extern tree lookup_template_class PROTO((tree, tree, tree, tree, int));
386b8a85 3488extern tree lookup_template_function PROTO((tree, tree));
8d08fdba 3489extern int uses_template_parms PROTO((tree));
5566b478 3490extern tree instantiate_class_template PROTO((tree));
98c1c668 3491extern tree instantiate_template PROTO((tree, tree));
6b5fbb55 3492extern void overload_template_name PROTO((tree));
03017874 3493extern int fn_type_unification PROTO((tree, tree, tree, tree, tree, unification_kind_t));
8d08fdba 3494struct tinst_level *tinst_for_decl PROTO((void));
5566b478 3495extern void mark_decl_instantiated PROTO((tree, int));
e1467ff2 3496extern int more_specialized PROTO((tree, tree, tree));
5566b478 3497extern void mark_class_instantiated PROTO((tree, int));
6633d636 3498extern void do_decl_instantiation PROTO((tree, tree, tree));
f0e01782 3499extern void do_type_instantiation PROTO((tree, tree));
5566b478 3500extern tree instantiate_decl PROTO((tree));
e1467ff2 3501extern tree get_bindings PROTO((tree, tree, tree));
824b9a4c 3502extern void add_tree PROTO((tree));
75650646
MM
3503extern void begin_tree PROTO((void));
3504extern void end_tree PROTO((void));
824b9a4c 3505extern void add_maybe_template PROTO((tree, tree));
49c249e1 3506extern void pop_tinst_level PROTO((void));
49c249e1 3507extern int more_specialized_class PROTO((tree, tree));
98c1c668 3508extern int is_member_template PROTO((tree));
34016c81 3509extern int template_parms_equal PROTO((tree, tree));
75650646 3510extern int comp_template_parms PROTO((tree, tree));
f84b4be9 3511extern int template_class_depth PROTO((tree));
6757edfe
MM
3512extern int is_specialization_of PROTO((tree, tree));
3513extern int comp_template_args PROTO((tree, tree));
36a117a5 3514extern void maybe_process_partial_specialization PROTO((tree));
39c01e4c 3515extern void maybe_check_template_type PROTO((tree));
104bf76a
MM
3516extern tree most_specialized_instantiation PROTO((tree, tree));
3517extern void print_candidates PROTO((tree));
0aafb128 3518extern int instantiate_pending_templates PROTO((void));
9188c363 3519extern tree tsubst_default_argument PROTO((tree, tree, tree));
6757edfe 3520
67ffc812 3521extern int processing_template_parmlist;
824b9a4c
MS
3522
3523/* in repo.c */
3524extern void repo_template_used PROTO((tree));
3525extern void repo_template_instantiated PROTO((tree, int));
d8e178a0 3526extern void init_repo PROTO((const char *));
824b9a4c
MS
3527extern void finish_repo PROTO((void));
3528
3529/* in rtti.c */
3530extern void init_rtti_processing PROTO((void));
3531extern tree get_tinfo_fn_dynamic PROTO((tree));
3532extern tree build_typeid PROTO((tree));
3533extern tree build_x_typeid PROTO((tree));
3534extern tree get_tinfo_fn PROTO((tree));
3535extern tree get_typeid PROTO((tree));
6a8f78d5 3536extern tree get_typeid_1 PROTO((tree));
824b9a4c
MS
3537extern tree build_dynamic_cast PROTO((tree, tree));
3538extern void synthesize_tinfo_fn PROTO((tree));
8d08fdba 3539
51c184be 3540/* in search.c */
7dee3f36 3541extern int types_overlap_p PROTO((tree, tree));
bd6dd845 3542extern tree get_vbase PROTO((tree, tree));
8d08fdba
MS
3543extern tree get_binfo PROTO((tree, tree, int));
3544extern int get_base_distance PROTO((tree, tree, int, tree *));
d6479fe7 3545extern int accessible_p PROTO((tree, tree));
8d08fdba 3546extern tree lookup_field PROTO((tree, tree, int, int));
03017874 3547extern int lookup_fnfields_1 PROTO((tree, tree));
8d08fdba 3548extern tree lookup_fnfields PROTO((tree, tree, int));
d23a1bb1 3549extern tree lookup_member PROTO((tree, tree, int, int));
a28e3c7f 3550extern tree lookup_nested_tag PROTO((tree, tree));
7177d104 3551extern tree get_matching_virtual PROTO((tree, tree, int));
8d08fdba 3552extern tree get_abstract_virtuals PROTO((tree));
8d08fdba 3553extern tree init_vbase_pointers PROTO((tree, tree));
9e9ff709 3554extern void expand_indirect_vtbls_init PROTO((tree, tree, tree));
8d08fdba
MS
3555extern void clear_search_slots PROTO((tree));
3556extern tree get_vbase_types PROTO((tree));
8d08fdba 3557extern void note_debug_info_needed PROTO((tree));
45537677 3558extern void push_class_decls PROTO((tree));
49c249e1 3559extern void pop_class_decls PROTO((void));
8d08fdba 3560extern void unuse_fields PROTO((tree));
8d08fdba
MS
3561extern void print_search_statistics PROTO((void));
3562extern void init_search_processing PROTO((void));
3563extern void reinit_search_statistics PROTO((void));
3564extern tree current_scope PROTO((void));
9188c363 3565extern int at_function_scope_p PROTO((void));
e1cd6e56 3566extern tree lookup_conversions PROTO((tree));
84663f74 3567extern tree binfo_for_vtable PROTO((tree));
6ad07332 3568extern int binfo_from_vbase PROTO((tree));
d6479fe7
MM
3569extern tree dfs_walk PROTO((tree,
3570 tree (*)(tree, void *),
3571 tree (*) (tree, void *),
3572 void *));
3573extern tree dfs_unmark PROTO((tree, void *));
3574extern tree markedp PROTO((tree, void *));
8d08fdba 3575
ad321293
MM
3576/* in semantics.c */
3577extern void finish_expr_stmt PROTO((tree));
3578extern tree begin_if_stmt PROTO((void));
3579extern void finish_if_stmt_cond PROTO((tree, tree));
3580extern tree finish_then_clause PROTO((tree));
3581extern void begin_else_clause PROTO((void));
3582extern void finish_else_clause PROTO((tree));
3583extern void finish_if_stmt PROTO((void));
3584extern tree begin_while_stmt PROTO((void));
3585extern void finish_while_stmt_cond PROTO((tree, tree));
3586extern void finish_while_stmt PROTO((tree));
3587extern tree begin_do_stmt PROTO((void));
3588extern void finish_do_body PROTO((tree));
3589extern void finish_do_stmt PROTO((tree, tree));
3590extern void finish_return_stmt PROTO((tree));
3591extern tree begin_for_stmt PROTO((void));
3592extern void finish_for_init_stmt PROTO((tree));
3593extern void finish_for_cond PROTO((tree, tree));
e4959d7c 3594extern void finish_for_expr PROTO((tree, tree));
ad321293
MM
3595extern void finish_for_stmt PROTO((tree, tree));
3596extern void finish_break_stmt PROTO((void));
3597extern void finish_continue_stmt PROTO((void));
527f0080
MM
3598extern tree begin_switch_stmt PROTO((void));
3599extern void finish_switch_cond PROTO((tree, tree));
ad321293
MM
3600extern void finish_switch_stmt PROTO((tree, tree));
3601extern void finish_case_label PROTO((tree, tree));
3602extern void finish_goto_stmt PROTO((tree));
3603extern tree begin_try_block PROTO((void));
3604extern void finish_try_block PROTO((tree));
3605extern void finish_handler_sequence PROTO((tree));
0dde4175
JM
3606extern tree begin_function_try_block PROTO((void));
3607extern void finish_function_try_block PROTO((tree));
3608extern void finish_function_handler_sequence PROTO((tree));
ad321293 3609extern tree begin_handler PROTO((void));
3c5c0849 3610extern void start_handler_parms PROTO((tree, tree));
ad321293
MM
3611extern void finish_handler_parms PROTO((tree));
3612extern void finish_handler PROTO((tree));
f1dedc31 3613extern void finish_cleanup PROTO((tree, tree));
ad321293
MM
3614extern tree begin_compound_stmt PROTO((int));
3615extern tree finish_compound_stmt PROTO((int, tree));
3616extern void finish_asm_stmt PROTO((tree, tree, tree, tree, tree));
f01b0acb 3617extern void finish_label_stmt PROTO((tree));
b5434ee0 3618extern void finish_label_decl PROTO((tree));
f1dedc31 3619extern void finish_subobject PROTO((tree));
b4c4a9ec
MM
3620extern tree finish_parenthesized_expr PROTO((tree));
3621extern tree begin_stmt_expr PROTO((void));
3622extern tree finish_stmt_expr PROTO((tree, tree));
a759e627 3623extern tree finish_call_expr PROTO((tree, tree, int));
b4c4a9ec
MM
3624extern tree finish_increment_expr PROTO((tree, enum tree_code));
3625extern tree finish_this_expr PROTO((void));
3626extern tree finish_object_call_expr PROTO((tree, tree, tree));
3627extern tree finish_qualified_object_call_expr PROTO((tree, tree, tree));
3628extern tree finish_pseudo_destructor_call_expr PROTO((tree, tree, tree));
75d587eb 3629extern tree finish_qualified_call_expr PROTO ((tree, tree));
b4c4a9ec 3630extern tree finish_label_address_expr PROTO((tree));
ce4a0391
MM
3631extern tree finish_unary_op_expr PROTO((enum tree_code, tree));
3632extern tree finish_id_expr PROTO((tree));
3633extern int begin_new_placement PROTO((void));
3634extern tree finish_new_placement PROTO((tree, int));
b4c4a9ec
MM
3635extern int begin_function_definition PROTO((tree, tree));
3636extern tree begin_constructor_declarator PROTO((tree, tree));
ce4a0391
MM
3637extern tree finish_declarator PROTO((tree, tree, tree, tree, int));
3638extern void finish_translation_unit PROTO((void));
b4c4a9ec
MM
3639extern tree finish_template_type_parm PROTO((tree, tree));
3640extern tree finish_template_template_parm PROTO((tree, tree));
ce4a0391
MM
3641extern tree finish_parmlist PROTO((tree, int));
3642extern tree begin_class_definition PROTO((tree));
fbdd0024 3643extern tree finish_class_definition PROTO((tree, tree, int, int));
ce4a0391
MM
3644extern void finish_default_args PROTO((void));
3645extern void begin_inline_definitions PROTO((void));
51632249 3646extern void finish_inline_definitions PROTO((void));
61a127b3 3647extern tree finish_member_class_template PROTO((tree));
36a117a5
MM
3648extern void finish_template_decl PROTO((tree));
3649extern tree finish_template_type PROTO((tree, tree, int));
648f19f6 3650extern void enter_scope_of PROTO((tree));
6eabb241 3651extern tree finish_base_specifier PROTO((tree, tree));
61a127b3
MM
3652extern void finish_member_declaration PROTO((tree));
3653extern void check_multiple_declarators PROTO((void));
b894fc05 3654extern tree finish_typeof PROTO((tree));
9188c363 3655extern void add_decl_stmt PROTO((tree));
558475f0
MM
3656extern void finish_named_return_value PROTO((tree, tree));
3657extern tree expand_stmt PROTO((tree));
3658extern void expand_body PROTO((tree));
3659extern void begin_stmt_tree PROTO((tree));
3660extern void finish_stmt_tree PROTO((tree));
a7e4cfa0 3661extern void prep_stmt PROTO((tree));
558475f0
MM
3662/* Non-zero if we are presently building a statement tree, rather
3663 than expanding each statement as we encounter it. */
a7e4cfa0
MM
3664#define building_stmt_tree() \
3665 (current_function && (processing_template_decl || !expanding_p))
b4c4a9ec 3666
51c184be 3667/* in spew.c */
8d08fdba 3668extern void init_spew PROTO((void));
49c249e1 3669extern int peekyylex PROTO((void));
8d08fdba
MS
3670extern int yylex PROTO((void));
3671extern tree arbitrate_lookup PROTO((tree, tree, tree));
3672
51c184be 3673/* in tree.c */
87e3dbc9 3674extern void init_tree PROTO((void));
4ef8e8f5 3675extern void cplus_unsave_expr_now PROTO((tree));
e833cb11 3676extern int pod_type_p PROTO((tree));
b370501f 3677extern void unshare_base_binfos PROTO((tree));
77dc0938 3678extern int member_p PROTO((tree));
27b8d0cd 3679extern cp_lvalue_kind real_lvalue_p PROTO((tree));
5566b478
MS
3680extern tree build_min PVPROTO((enum tree_code, tree, ...));
3681extern tree build_min_nt PVPROTO((enum tree_code, ...));
3682extern tree min_tree_cons PROTO((tree, tree, tree));
8d08fdba 3683extern int lvalue_p PROTO((tree));
834003f4 3684extern int lvalue_or_else PROTO((tree, const char *));
5566b478 3685extern tree build_cplus_new PROTO((tree, tree));
aa36c081 3686extern tree get_target_expr PROTO((tree));
8d08fdba
MS
3687extern tree break_out_cleanups PROTO((tree));
3688extern tree break_out_calls PROTO((tree));
3689extern tree build_cplus_method_type PROTO((tree, tree, tree));
3690extern tree build_cplus_staticfn_type PROTO((tree, tree, tree));
3691extern tree build_cplus_array_type PROTO((tree, tree));
9a71c18b
JM
3692extern int layout_basetypes PROTO((tree, int));
3693extern tree build_vbase_pointer_fields PROTO((tree));
3694extern tree build_base_fields PROTO((tree));
51632249 3695extern tree hash_tree_cons PROTO((tree, tree, tree));
8d08fdba
MS
3696extern tree hash_tree_chain PROTO((tree, tree));
3697extern tree hash_chainon PROTO((tree, tree));
ca107ded 3698extern tree make_binfo PROTO((tree, tree, tree, tree));
8d08fdba 3699extern tree binfo_value PROTO((tree, tree));
dfbcd65a 3700extern tree reverse_path PROTO((tree));
8926095f 3701extern int count_functions PROTO((tree));
8d08fdba
MS
3702extern int is_overloaded_fn PROTO((tree));
3703extern tree get_first_fn PROTO((tree));
ddaed37e 3704extern int bound_pmf_p PROTO((tree));
2c73f9f5
ML
3705extern tree ovl_cons PROTO((tree, tree));
3706extern tree scratch_ovl_cons PROTO((tree, tree));
3707extern int ovl_member PROTO((tree, tree));
3708extern tree build_overload PROTO((tree, tree));
8d08fdba 3709extern tree fnaddr_from_vtable_entry PROTO((tree));
8d08fdba
MS
3710extern tree function_arg_chain PROTO((tree));
3711extern int promotes_to_aggr_type PROTO((tree, enum tree_code));
3712extern int is_aggr_type_2 PROTO((tree, tree));
e1def31b 3713extern const char *lang_printable_name PROTO((tree, int));
f30432d7 3714extern tree build_exception_variant PROTO((tree, tree));
73b0fce8 3715extern tree copy_template_template_parm PROTO((tree));
8d08fdba 3716extern void print_lang_statistics PROTO((void));
49c249e1
JM
3717extern void __eprintf
3718 PROTO((const char *, const char *, unsigned, const char *));
8d08fdba
MS
3719extern tree array_type_nelts_total PROTO((tree));
3720extern tree array_type_nelts_top PROTO((tree));
878cd289 3721extern tree break_out_target_exprs PROTO((tree));
5566b478 3722extern tree get_type_decl PROTO((tree));
6b5fbb55 3723extern tree vec_binfo_member PROTO((tree, tree));
e76a2646 3724extern tree hack_decl_function_context PROTO((tree));
700466c2 3725extern tree decl_namespace_context PROTO((tree));
d11ad92e
MS
3726extern tree lvalue_type PROTO((tree));
3727extern tree error_type PROTO((tree));
49c249e1 3728extern tree make_temp_vec PROTO((int));
5ffe581d
JM
3729extern tree build_ptr_wrapper PROTO((void *));
3730extern tree build_expr_ptr_wrapper PROTO((void *));
3731extern tree build_int_wrapper PROTO((int));
1139b3d8 3732extern tree build_srcloc_here PROTO((void));
49c249e1
JM
3733extern int varargs_function_p PROTO((tree));
3734extern int really_overloaded_fn PROTO((tree));
3735extern int cp_tree_equal PROTO((tree, tree));
3736extern int can_free PROTO((struct obstack *, tree));
3737extern tree mapcar PROTO((tree, tree (*) (tree)));
50a6dbd7 3738extern tree no_linkage_check PROTO((tree));
49c249e1 3739extern void debug_binfo PROTO((tree));
00c493f2 3740extern void push_expression_obstack PROTO((void));
9188c363 3741extern void push_permanent_obstack PROTO((void));
51924768
JM
3742extern tree build_dummy_object PROTO((tree));
3743extern tree maybe_dummy_object PROTO((tree, tree *));
3744extern int is_dummy_object PROTO((tree));
297e73d8 3745extern tree search_tree PROTO((tree, tree (*)(tree)));
e5dc5fb2 3746extern int cp_valid_lang_attribute PROTO((tree, tree, tree, tree));
87533b37 3747extern tree make_ptrmem_cst PROTO((tree, tree));
adecb3f4
MM
3748extern tree cp_build_qualified_type_real PROTO((tree, int, int));
3749#define cp_build_qualified_type(TYPE, QUALS) \
3750 cp_build_qualified_type_real ((TYPE), (QUALS), /*complain=*/1)
51632249 3751
e66d884e 3752#define scratchalloc expralloc
e66d884e
JM
3753#define build_scratch_list build_expr_list
3754#define make_scratch_vec make_temp_vec
2c73f9f5 3755#define push_scratch_obstack push_expression_obstack
8d08fdba 3756
51c184be 3757/* in typeck.c */
b370501f 3758extern int string_conv_p PROTO((tree, tree, int));
8ccc31eb 3759extern tree condition_conversion PROTO((tree));
8d08fdba
MS
3760extern tree target_type PROTO((tree));
3761extern tree require_complete_type PROTO((tree));
5566b478 3762extern tree complete_type PROTO((tree));
66543169 3763extern tree complete_type_or_else PROTO((tree, tree));
8d08fdba
MS
3764extern int type_unknown_p PROTO((tree));
3765extern int fntype_p PROTO((tree));
8d08fdba 3766extern tree commonparms PROTO((tree, tree));
f2ee215b 3767extern tree original_type PROTO((tree));
8d08fdba 3768extern tree common_type PROTO((tree, tree));
4cc1d462 3769extern int comp_except_specs PROTO((tree, tree, int));
8d08fdba
MS
3770extern int comptypes PROTO((tree, tree, int));
3771extern int comp_target_types PROTO((tree, tree, int));
91063b51 3772extern int compparms PROTO((tree, tree));
8d08fdba 3773extern int comp_target_types PROTO((tree, tree, int));
ceab47eb
MM
3774extern int comp_cv_qualification PROTO((tree, tree));
3775extern int comp_cv_qual_signature PROTO((tree, tree));
8d08fdba
MS
3776extern tree unsigned_type PROTO((tree));
3777extern tree signed_type PROTO((tree));
3778extern tree signed_or_unsigned_type PROTO((int, tree));
5566b478 3779extern tree expr_sizeof PROTO((tree));
8d08fdba
MS
3780extern tree c_sizeof PROTO((tree));
3781extern tree c_sizeof_nowarn PROTO((tree));
3782extern tree c_alignof PROTO((tree));
6b5fbb55 3783extern tree inline_conversion PROTO((tree));
f30432d7 3784extern tree decay_conversion PROTO((tree));
8d08fdba
MS
3785extern tree default_conversion PROTO((tree));
3786extern tree build_object_ref PROTO((tree, tree, tree));
3787extern tree build_component_ref_1 PROTO((tree, tree, int));
3788extern tree build_component_ref PROTO((tree, tree, tree, int));
5156628f 3789extern tree build_x_component_ref PROTO((tree, tree, tree, int));
d8e178a0
KG
3790extern tree build_x_indirect_ref PROTO((tree, const char *));
3791extern tree build_indirect_ref PROTO((tree, const char *));
8d08fdba
MS
3792extern tree build_array_ref PROTO((tree, tree));
3793extern tree build_x_function_call PROTO((tree, tree, tree));
824b9a4c 3794extern tree get_member_function_from_ptrfunc PROTO((tree *, tree));
8d08fdba
MS
3795extern tree build_function_call_real PROTO((tree, tree, int, int));
3796extern tree build_function_call PROTO((tree, tree));
3797extern tree build_function_call_maybe PROTO((tree, tree));
56ae6d77 3798extern tree convert_arguments PROTO((tree, tree, tree, int));
8d08fdba 3799extern tree build_x_binary_op PROTO((enum tree_code, tree, tree));
337c90cc 3800extern tree build_binary_op PROTO((enum tree_code, tree, tree));
8d08fdba 3801extern tree build_binary_op_nodefault PROTO((enum tree_code, tree, tree, enum tree_code));
8d08fdba
MS
3802extern tree build_x_unary_op PROTO((enum tree_code, tree));
3803extern tree build_unary_op PROTO((enum tree_code, tree, int));
3804extern tree unary_complex_lvalue PROTO((enum tree_code, tree));
3805extern int mark_addressable PROTO((tree));
3806extern tree build_x_conditional_expr PROTO((tree, tree, tree));
3807extern tree build_conditional_expr PROTO((tree, tree, tree));
3808extern tree build_x_compound_expr PROTO((tree));
3809extern tree build_compound_expr PROTO((tree));
2986ae00
MS
3810extern tree build_static_cast PROTO((tree, tree));
3811extern tree build_reinterpret_cast PROTO((tree, tree));
3812extern tree build_const_cast PROTO((tree, tree));
faf5394a 3813extern tree build_c_cast PROTO((tree, tree));
5566b478 3814extern tree build_x_modify_expr PROTO((tree, enum tree_code, tree));
8d08fdba 3815extern tree build_modify_expr PROTO((tree, enum tree_code, tree));
d8e178a0 3816extern tree convert_for_initialization PROTO((tree, tree, tree, int, const char *, tree, int));
8d08fdba
MS
3817extern void c_expand_asm_operands PROTO((tree, tree, tree, tree, int, char *, int));
3818extern void c_expand_return PROTO((tree));
3819extern tree c_expand_start_case PROTO((tree));
bd6dd845 3820extern int comp_ptr_ttypes PROTO((tree, tree));
d2e5ee5c 3821extern int ptr_reasonably_similar PROTO((tree, tree));
8d08fdba 3822extern tree build_ptrmemfunc PROTO((tree, tree, int));
27778b73 3823extern tree strip_array_types PROTO((tree));
91063b51 3824extern int cp_type_quals PROTO((tree));
a7a7710d 3825extern int cp_has_mutable_p PROTO((tree));
91063b51
MM
3826extern int at_least_as_qualified_p PROTO((tree, tree));
3827extern int more_qualified_p PROTO((tree, tree));
e08a8f45
MM
3828extern tree build_ptrmemfunc1 PROTO((tree, tree, tree, tree, tree));
3829extern void expand_ptrmemfunc_cst PROTO((tree, tree *, tree *, tree *, tree *));
3830extern tree delta2_from_ptrmemfunc PROTO((tree));
3831extern tree pfn_from_ptrmemfunc PROTO((tree));
a7a64a77 3832extern tree type_after_usual_arithmetic_conversions PROTO((tree, tree));
9c0758dd
KG
3833extern tree composite_pointer_type PROTO((tree, tree, tree, tree,
3834 const char*));
8d08fdba 3835
51c184be 3836/* in typeck2.c */
8d08fdba
MS
3837extern tree error_not_base_type PROTO((tree, tree));
3838extern tree binfo_or_else PROTO((tree, tree));
d8e178a0 3839extern void readonly_error PROTO((tree, const char *, int));
a7a64a77 3840extern int abstract_virtuals_error PROTO((tree, tree));
8d08fdba 3841extern void incomplete_type_error PROTO((tree, tree));
b370501f
KG
3842extern void my_friendly_abort PROTO((int))
3843 ATTRIBUTE_NORETURN;
8d08fdba
MS
3844extern void my_friendly_assert PROTO((int, int));
3845extern tree store_init_value PROTO((tree, tree));
3846extern tree digest_init PROTO((tree, tree, tree *));
3847extern tree build_scoped_ref PROTO((tree, tree));
3848extern tree build_x_arrow PROTO((tree));
3849extern tree build_m_component_ref PROTO((tree, tree));
3850extern tree build_functional_cast PROTO((tree, tree));
3851extern char *enum_name_string PROTO((tree, tree));
3852extern void report_case_error PROTO((int, tree, tree, tree));
d8e178a0 3853extern void check_for_new_type PROTO((const char *, flagged_type_tree));
4cc1d462 3854extern tree add_exception_specifier PROTO((tree, tree, int));
8d08fdba 3855
51c184be 3856/* in xref.c */
d8e178a0 3857extern void GNU_xref_begin PROTO((const char *));
8d08fdba 3858extern void GNU_xref_end PROTO((int));
d8e178a0 3859extern void GNU_xref_file PROTO((const char *));
8d08fdba 3860extern void GNU_xref_start_scope PROTO((HOST_WIDE_INT));
5566b478 3861extern void GNU_xref_end_scope PROTO((HOST_WIDE_INT, HOST_WIDE_INT, int, int));
d8e178a0 3862extern void GNU_xref_ref PROTO((tree, const char *));
8d08fdba 3863extern void GNU_xref_decl PROTO((tree, tree));
d8e178a0 3864extern void GNU_xref_call PROTO((tree, const char *));
8d08fdba
MS
3865extern void GNU_xref_function PROTO((tree, tree));
3866extern void GNU_xref_assign PROTO((tree));
11b5139c 3867extern void GNU_xref_hier PROTO((tree, tree, int, int, int));
8d08fdba
MS
3868extern void GNU_xref_member PROTO((tree, tree));
3869
f71f87f9 3870/* in dump.c */
9c0758dd 3871extern void dump_node_to_file PROTO ((tree, const char *));
f71f87f9 3872
8d08fdba
MS
3873/* -- end of C++ */
3874
3875#endif /* not _CP_TREE_H */
This page took 1.196505 seconds and 5 git commands to generate.