]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/cp-tree.h
re PR c++/24163 (dependent Base class scope examined during unqualified name lookup...
[thirdparty/gcc.git] / gcc / cp / cp-tree.h
CommitLineData
8d08fdba 1/* Definitions for C++ parsing and type checking.
b2f29cd9 2 Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4e3c0a15 3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
e77f031d 4 Free Software Foundation, Inc.
06ceef4e 5 Contributed by Michael Tiemann (tiemann@cygnus.com)
8d08fdba 6
f5adbb8d 7This file is part of GCC.
8d08fdba 8
f5adbb8d 9GCC is free software; you can redistribute it and/or modify
8d08fdba 10it under the terms of the GNU General Public License as published by
e77f031d 11the Free Software Foundation; either version 3, or (at your option)
8d08fdba
MS
12any later version.
13
f5adbb8d 14GCC is distributed in the hope that it will be useful,
8d08fdba
MS
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
e77f031d
NC
20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
8d08fdba 22
8c6ae51f
GK
23#ifndef GCC_CP_TREE_H
24#define GCC_CP_TREE_H
25
17211ab5 26#include "ggc.h"
99dccabc 27#include "function.h"
ee94fce6 28#include "hashtab.h"
58c42dc2 29#include "vec.h"
71205d17
MLI
30
31/* In order for the format checking to accept the C++ front end
32 diagnostic framework extensions, you must include this file before
718f9c0f 33 diagnostic-core.h, not after. We override the definition of GCC_DIAG_STYLE
71205d17
MLI
34 in c-common.h. */
35#undef GCC_DIAG_STYLE
36#define GCC_DIAG_STYLE __gcc_cxxdiag__
718f9c0f 37#if defined(GCC_DIAGNOSTIC_CORE_H) || defined (GCC_C_COMMON_H)
71205d17 38#error \
b5fa2870 39In order for the format checking to accept the C++ front end diagnostic \
718f9c0f 40framework extensions, you must include this file before diagnostic-core.h and \
59cc9210 41c-common.h, not after.
71205d17 42#endif
39dabefd 43#include "c-family/c-common.h"
718f9c0f 44#include "diagnostic.h"
59cc9210
SB
45
46#include "name-lookup.h"
7cb32822 47
cfdd0551 48/* Usage of TREE_LANG_FLAG_?:
809e3e7f 49 0: IDENTIFIER_MARKED (IDENTIFIER_NODEs)
cfdd0551
PB
50 NEW_EXPR_USE_GLOBAL (in NEW_EXPR).
51 DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR).
8e1daa34 52 COMPOUND_EXPR_OVERLOADED (in COMPOUND_EXPR).
b26caacd 53 TREE_INDIRECT_USING (in NAMESPACE_DECL).
f1dedc31 54 CLEANUP_P (in TRY_BLOCK)
e1376b00 55 AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR)
19420d00 56 PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF)
7a8380ae 57 PAREN_STRING_LITERAL (in STRING_CST)
39703eb9 58 DECL_PRETTY_FUNCTION_P (in VAR_DECL)
6d80c4b9 59 KOENIG_LOOKUP_P (in CALL_EXPR)
325c3691
RH
60 STATEMENT_LIST_NO_SCOPE (in STATEMENT_LIST).
61 EXPR_STMT_STMT_EXPR_RESULT (in EXPR_STMT)
c3e5898b 62 STMT_EXPR_NO_SCOPE (in STMT_EXPR)
5882f0f3 63 BIND_EXPR_TRY_BLOCK (in BIND_EXPR)
fc6a28d7 64 TYPENAME_IS_ENUM_P (in TYPENAME_TYPE)
02ed62dd 65 QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF)
1799e5d5 66 OMP_FOR_GIMPLIFYING_P (in OMP_FOR)
61e71a9e 67 BASELINK_QUALIFIED_P (in BASELINK)
c08cd4c1 68 TARGET_EXPR_IMPLICIT_P (in TARGET_EXPR)
30bcc028 69 TEMPLATE_PARM_PARAMETER_PACK (in TEMPLATE_PARM_INDEX)
a7f6bc8c 70 ATTR_IS_DEPENDENT (in the TREE_LIST for an attribute)
09357846 71 CONSTRUCTOR_IS_DIRECT_INIT (in CONSTRUCTOR)
d5f4eddd
JM
72 LAMBDA_EXPR_CAPTURES_THIS_P (in LAMBDA_EXPR)
73 DECLTYPE_FOR_LAMBDA_CAPTURE (in DECLTYPE_TYPE)
4de2f020 74 VEC_INIT_EXPR_IS_CONSTEXPR (in VEC_INIT_EXPR)
b5da71d4 75 DECL_OVERRIDE_P (in FUNCTION_DECL)
4684cd27 76 1: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE)
cfdd0551 77 TI_PENDING_TEMPLATE_FLAG.
cfdd0551
PB
78 TEMPLATE_PARMS_FOR_INLINE.
79 DELETE_EXPR_USE_VEC (in DELETE_EXPR).
80 (TREE_CALLS_NEW) (in _EXPR or _REF) (commented-out).
27b8d0cd 81 ICS_ELLIPSIS_FLAG (in _CONV)
17bbb839 82 DECL_INITIALIZED_P (in VAR_DECL)
fc6a28d7 83 TYPENAME_IS_CLASS_P (in TYPENAME_TYPE)
ed3d0b14 84 STMT_IS_FULL_EXPR_P (in _STMT)
3f6079dd 85 TARGET_EXPR_LIST_INIT_P (in TARGET_EXPR)
d5f4eddd
JM
86 LAMBDA_EXPR_MUTABLE_P (in LAMBDA_EXPR)
87 DECLTYPE_FOR_LAMBDA_RETURN (in DECLTYPE_TYPE)
b5da71d4 88 DECL_FINAL_P (in FUNCTION_DECL)
4684cd27 89 2: IDENTIFIER_OPNAME_P (in IDENTIFIER_NODE)
27b8d0cd 90 ICS_THIS_FLAG (in _CONV)
39703eb9 91 DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL)
325c3691 92 STATEMENT_LIST_TRY_BLOCK (in STATEMENT_LIST)
4195a767 93 TYPENAME_IS_RESOLVING_P (in TYPE_NAME_TYPE)
d5f4eddd 94 LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (in LAMBDA_EXPR)
37a7519a 95 TARGET_EXPR_DIRECT_INIT_P (in TARGET_EXPR)
5775a06a 96 3: (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
27b8d0cd 97 ICS_BAD_FLAG (in _CONV)
62409b39 98 FN_TRY_BLOCK_P (in TRY_BLOCK)
298d6f60 99 IDENTIFIER_CTOR_OR_DTOR_P (in IDENTIFIER_NODE)
5882f0f3 100 BIND_EXPR_BODY_BLOCK (in BIND_EXPR)
6c06fbce 101 DECL_NON_TRIVIALLY_INITIALIZED_P (in VAR_DECL)
809e3e7f 102 4: TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
0cbd7506 103 or FIELD_DECL).
421844e7 104 IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE)
4684cd27 105 DECL_TINFO_P (in VAR_DECL)
0e5921e8 106 5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE)
d35543c0 107 DECL_VTABLE_OR_VTT_P (in VAR_DECL)
4684cd27 108 6: IDENTIFIER_REPO_CHOSEN (in IDENTIFIER_NODE)
505970fc 109 DECL_CONSTRUCTION_VTABLE_P (in VAR_DECL)
3543e114 110 TYPE_MARKED_P (in _TYPE)
cfdd0551
PB
111
112 Usage of TYPE_LANG_FLAG_?:
5552b43c 113 0: TYPE_DEPENDENT_P
0fcedd9c 114 1: TYPE_HAS_USER_CONSTRUCTOR.
7ecbca9d 115 2: unused
ea419909 116 3: TYPE_FOR_JAVA.
834c6dff 117 4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR
adf2edec 118 5: CLASS_TYPE_P (in RECORD_TYPE and UNION_TYPE)
4e3c0a15 119 ENUM_FIXED_UNDERLYING_TYPE_P (in ENUMERAL_TYPE)
5552b43c 120 6: TYPE_DEPENDENT_P_VALID
cfdd0551
PB
121
122 Usage of DECL_LANG_FLAG_?:
123 0: DECL_ERROR_REPORTED (in VAR_DECL).
833aa4c4 124 DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL)
cd9f6678 125 DECL_LOCAL_FUNCTION_P (in FUNCTION_DECL)
721c3b42 126 DECL_MUTABLE_P (in FIELD_DECL)
98ed9dae 127 DECL_DEPENDENT_P (in USING_DECL)
cfdd0551 128 1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL).
fbf1c34b 129 DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL)
c7222c02 130 DECL_MEMBER_TEMPLATE_P (in TEMPLATE_DECL)
5d80a306 131 FUNCTION_PARAMETER_PACK_P (in PARM_DECL)
cfdd0551 132 2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL).
9188c363 133 DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL)
cfdd0551 134 3: DECL_IN_AGGR_P.
17bbb839 135 4: DECL_C_BIT_FIELD (in a FIELD_DECL)
555551c2 136 DECL_ANON_UNION_VAR_P (in a VAR_DECL)
a3d87771 137 DECL_SELF_REFERENCE_P (in a TYPE_DECL)
878cbb73 138 DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL)
cfdd0551
PB
139 5: DECL_INTERFACE_KNOWN.
140 6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL).
642124c6 141 DECL_FIELD_IS_BASE (in FIELD_DECL)
cfdd0551 142 7: DECL_DEAD_FOR_LOCAL (in VAR_DECL).
cc057ef3 143 DECL_THUNK_P (in a member FUNCTION_DECL)
37a7519a 144 DECL_NORMAL_CAPTURE_P (in FIELD_DECL)
32a58b37 145 8: DECL_DECLARED_CONSTEXPR_P (in VAR_DECL, FUNCTION_DECL)
7ddedda4
MM
146
147 Usage of language-independent fields in a language-dependent manner:
911a71a7 148
7ddedda4
MM
149 TYPE_ALIAS_SET
150 This field is used by TYPENAME_TYPEs, TEMPLATE_TYPE_PARMs, and so
151 forth as a substitute for the mark bits provided in `lang_type'.
152 At present, only the six low-order bits are used.
153
95b4aca6 154 TYPE_LANG_SLOT_1
7ddedda4 155 For an ENUMERAL_TYPE, this is ENUM_TEMPLATE_INFO.
6d0a3f67 156 For a FUNCTION_TYPE or METHOD_TYPE, this is TYPE_RAISES_EXCEPTIONS
0aafb128 157
9df2c88c 158 BINFO_VIRTUALS
bb5e8a7f
MM
159 For a binfo, this is a TREE_LIST. There is an entry for each
160 virtual function declared either in BINFO or its direct and
161 indirect primary bases.
162
163 The BV_DELTA of each node gives the amount by which to adjust the
164 `this' pointer when calling the function. If the method is an
4639c5c6 165 overridden version of a base class method, then it is assumed
bb5e8a7f
MM
166 that, prior to adjustment, the this pointer points to an object
167 of the base class.
174eceea 168
5e19c053 169 The BV_VCALL_INDEX of each node, if non-NULL, gives the vtable
19114537 170 index of the vcall offset for this entry.
c0bbf652 171
5e19c053 172 The BV_FN is the declaration for the virtual function itself.
5e19c053 173
02dea3ff
JM
174 If BV_LOST_PRIMARY is set, it means that this entry is for a lost
175 primary virtual base and can be left null in the vtable.
176
c35cce41 177 BINFO_VTABLE
3461fba7 178 This is an expression with POINTER_TYPE that gives the value
c35cce41 179 to which the vptr should be initialized. Use get_vtbl_decl_for_binfo
3461fba7 180 to extract the VAR_DECL for the complete vtable.
c35cce41 181
051e6fd7
MM
182 DECL_VINDEX
183 This field is NULL for a non-virtual function. For a virtual
184 function, it is eventually set to an INTEGER_CST indicating the
185 index in the vtable at which this function can be found. When
186 a virtual function is declared, but before it is known what
4639c5c6 187 function is overridden, this field is the error_mark_node.
051e6fd7 188
bb20cc46 189 Temporarily, it may be set to a TREE_LIST whose TREE_VALUE is
051e6fd7
MM
190 the virtual function this one overrides, and whose TREE_CHAIN is
191 the old DECL_VINDEX. */
cfdd0551 192
00a17e31 193/* Language-specific tree checkers. */
da8a66fc 194
086e3095
NS
195#define VAR_OR_FUNCTION_DECL_CHECK(NODE) \
196 TREE_CHECK2(NODE,VAR_DECL,FUNCTION_DECL)
197
198#define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \
199 TREE_CHECK3(NODE,VAR_DECL,FUNCTION_DECL,PARM_DECL)
200
201#define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \
202 TREE_CHECK4(NODE,VAR_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL)
203
086e3095
NS
204#define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \
205 TREE_CHECK(NODE,BOUND_TEMPLATE_TEMPLATE_PARM)
d7e7759d 206
ea1763b1 207#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
ea1763b1 208#define THUNK_FUNCTION_CHECK(NODE) __extension__ \
58f9752a 209({ __typeof (NODE) const __t = (NODE); \
b97e8a14
JM
210 if (TREE_CODE (__t) != FUNCTION_DECL || !__t->decl_common.lang_specific \
211 || !__t->decl_common.lang_specific->u.fn.thunk_p) \
3db45ab5 212 tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0); \
ea1763b1
NS
213 __t; })
214#else
ea1763b1
NS
215#define THUNK_FUNCTION_CHECK(NODE) (NODE)
216#endif
bbd15aac 217\f
8d08fdba
MS
218/* Language-dependent contents of an identifier. */
219
d1b38208 220struct GTY(()) lang_identifier {
e2500fed 221 struct c_common_identifier c_common;
af6fd53f
GDR
222 cxx_binding *namespace_bindings;
223 cxx_binding *bindings;
8d08fdba 224 tree class_template_info;
85209a3c 225 tree label_value;
8d08fdba
MS
226};
227
0e5921e8
ZW
228/* In an IDENTIFIER_NODE, nonzero if this identifier is actually a
229 keyword. C_RID_CODE (node) is then the RID_* value of the keyword,
230 and C_RID_YYCODE is the token number wanted by Yacc. */
231
98e40e83 232#define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_5 (ID)
0e5921e8 233
da8a66fc
ML
234#define LANG_IDENTIFIER_CAST(NODE) \
235 ((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE))
236
d1b38208 237struct GTY(()) template_parm_index_s {
2bf105ab 238 struct tree_common common;
30bcc028
DG
239 int index;
240 int level;
241 int orig_level;
6f1abb06 242 int num_siblings;
f84b4be9 243 tree decl;
406d77a4
SB
244};
245typedef struct template_parm_index_s template_parm_index;
246
d1b38208 247struct GTY(()) ptrmem_cst {
2bf105ab 248 struct tree_common common;
61a127b3 249 tree member;
e2500fed
GK
250};
251typedef struct ptrmem_cst * ptrmem_cst_t;
61a127b3 252
30394414 253#define IDENTIFIER_GLOBAL_VALUE(NODE) \
98e40e83 254 namespace_binding ((NODE), global_namespace)
2c73f9f5 255#define SET_IDENTIFIER_GLOBAL_VALUE(NODE, VAL) \
98e40e83 256 set_namespace_binding ((NODE), global_namespace, (VAL))
30394414 257#define IDENTIFIER_NAMESPACE_VALUE(NODE) \
98e40e83 258 namespace_binding ((NODE), current_namespace)
2c73f9f5 259#define SET_IDENTIFIER_NAMESPACE_VALUE(NODE, VAL) \
98e40e83 260 set_namespace_binding ((NODE), current_namespace, (VAL))
30394414 261
0cbd7506 262#define CLEANUP_P(NODE) TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
d7e7759d 263
5882f0f3
RH
264#define BIND_EXPR_TRY_BLOCK(NODE) \
265 TREE_LANG_FLAG_0 (BIND_EXPR_CHECK (NODE))
325c3691
RH
266
267/* Used to mark the block around the member initializers and cleanups. */
5882f0f3
RH
268#define BIND_EXPR_BODY_BLOCK(NODE) \
269 TREE_LANG_FLAG_3 (BIND_EXPR_CHECK (NODE))
86ad3aa9
JM
270#define FUNCTION_NEEDS_BODY_BLOCK(NODE) \
271 (DECL_CONSTRUCTOR_P (NODE) || DECL_DESTRUCTOR_P (NODE))
325c3691
RH
272
273#define STATEMENT_LIST_NO_SCOPE(NODE) \
274 TREE_LANG_FLAG_0 (STATEMENT_LIST_CHECK (NODE))
275#define STATEMENT_LIST_TRY_BLOCK(NODE) \
276 TREE_LANG_FLAG_2 (STATEMENT_LIST_CHECK (NODE))
277
ed3d0b14
ILT
278/* Nonzero if this statement should be considered a full-expression,
279 i.e., if temporaries created during this statement should have
280 their destructors run at the end of this statement. */
281#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE))
282
325c3691
RH
283/* Marks the result of a statement expression. */
284#define EXPR_STMT_STMT_EXPR_RESULT(NODE) \
285 TREE_LANG_FLAG_0 (EXPR_STMT_CHECK (NODE))
286
c3e5898b
ILT
287/* Nonzero if this statement-expression does not have an associated scope. */
288#define STMT_EXPR_NO_SCOPE(NODE) \
289 TREE_LANG_FLAG_0 (STMT_EXPR_CHECK (NODE))
290
d7e7759d
BC
291/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
292 sense of `same'. */
98e40e83 293#define same_type_p(TYPE1, TYPE2) \
96d84882 294 comptypes ((TYPE1), (TYPE2), COMPARE_STRICT)
d7e7759d 295
838dfd8a 296/* Nonzero if we are presently building a statement tree, rather
d7e7759d 297 than expanding each statement as we encounter it. */
325c3691 298#define building_stmt_tree() (cur_stmt_list != NULL_TREE)
d7e7759d 299
838dfd8a 300/* Returns nonzero iff NODE is a declaration for the global function
d7e7759d
BC
301 `main'. */
302#define DECL_MAIN_P(NODE) \
0cbd7506 303 (DECL_EXTERN_C_FUNCTION_P (NODE) \
d7e7759d 304 && DECL_NAME (NODE) != NULL_TREE \
7f7aa9e1
DE
305 && MAIN_NAME_P (DECL_NAME (NODE)) \
306 && flag_hosted)
d7e7759d 307
00a17e31 308/* The overloaded FUNCTION_DECL. */
98e40e83
GS
309#define OVL_FUNCTION(NODE) \
310 (((struct tree_overload*)OVERLOAD_CHECK (NODE))->function)
311#define OVL_CHAIN(NODE) TREE_CHAIN (NODE)
00a17e31 312/* Polymorphic access to FUNCTION and CHAIN. */
0cbd7506 313#define OVL_CURRENT(NODE) \
98e40e83 314 ((TREE_CODE (NODE) == OVERLOAD) ? OVL_FUNCTION (NODE) : (NODE))
0cbd7506 315#define OVL_NEXT(NODE) \
98e40e83 316 ((TREE_CODE (NODE) == OVERLOAD) ? TREE_CHAIN (NODE) : NULL_TREE)
2c73f9f5
ML
317/* If set, this was imported in a using declaration.
318 This is not to confuse with being used somewhere, which
00a17e31 319 is not important for this node. */
0cbd7506 320#define OVL_USED(NODE) TREE_USED (NODE)
3a2cb4d0
JM
321/* If set, this OVERLOAD was created for argument-dependent lookup
322 and can be freed afterward. */
323#define OVL_ARG_DEPENDENT(NODE) TREE_LANG_FLAG_0 (OVERLOAD_CHECK (NODE))
2c73f9f5 324
d1b38208 325struct GTY(()) tree_overload {
2bf105ab 326 struct tree_common common;
2c73f9f5
ML
327 tree function;
328};
329
50ad9642 330/* Returns true iff NODE is a BASELINK. */
4bb0968f 331#define BASELINK_P(NODE) \
50ad9642
MM
332 (TREE_CODE (NODE) == BASELINK)
333/* The BINFO indicating the base from which the BASELINK_FUNCTIONS came. */
4ba126e4 334#define BASELINK_BINFO(NODE) \
5dae1114 335 (((struct tree_baselink*) BASELINK_CHECK (NODE))->binfo)
50ad9642
MM
336/* The functions referred to by the BASELINK; either a FUNCTION_DECL,
337 a TEMPLATE_DECL, an OVERLOAD, or a TEMPLATE_ID_EXPR. */
da15dae6 338#define BASELINK_FUNCTIONS(NODE) \
5dae1114 339 (((struct tree_baselink*) BASELINK_CHECK (NODE))->functions)
19114537
EC
340/* The BINFO in which the search for the functions indicated by this baselink
341 began. This base is used to determine the accessibility of functions
4ba126e4
MM
342 selected by overload resolution. */
343#define BASELINK_ACCESS_BINFO(NODE) \
5dae1114 344 (((struct tree_baselink*) BASELINK_CHECK (NODE))->access_binfo)
4ba126e4
MM
345/* For a type-conversion operator, the BASELINK_OPTYPE indicates the type
346 to which the conversion should occur. This value is important if
347 the BASELINK_FUNCTIONS include a template conversion operator --
348 the BASELINK_OPTYPE can be used to determine what type the user
349 requested. */
350#define BASELINK_OPTYPE(NODE) \
50ad9642 351 (TREE_CHAIN (BASELINK_CHECK (NODE)))
3b426391 352/* Nonzero if this baselink was from a qualified lookup. */
61e71a9e
NS
353#define BASELINK_QUALIFIED_P(NODE) \
354 TREE_LANG_FLAG_0 (BASELINK_CHECK (NODE))
4bb0968f 355
d1b38208 356struct GTY(()) tree_baselink {
5dae1114
MM
357 struct tree_common common;
358 tree binfo;
359 tree functions;
360 tree access_binfo;
361};
362
77880ae4 363/* The different kinds of ids that we encounter. */
b3445994
MM
364
365typedef enum cp_id_kind
366{
367 /* Not an id at all. */
368 CP_ID_KIND_NONE,
369 /* An unqualified-id that is not a template-id. */
370 CP_ID_KIND_UNQUALIFIED,
cd0be382 371 /* An unqualified-id that is a dependent name. */
10b1d5e7 372 CP_ID_KIND_UNQUALIFIED_DEPENDENT,
b3445994
MM
373 /* An unqualified template-id. */
374 CP_ID_KIND_TEMPLATE_ID,
375 /* A qualified-id. */
376 CP_ID_KIND_QUALIFIED
377} cp_id_kind;
378
848f237b
SZ
379
380/* The various kinds of C++0x warnings we encounter. */
381
382typedef enum cpp0x_warn_str
383{
384 /* extended initializer lists */
385 CPP0X_INITIALIZER_LISTS,
386 /* explicit conversion operators */
387 CPP0X_EXPLICIT_CONVERSION,
388 /* variadic templates */
389 CPP0X_VARIADIC_TEMPLATES,
390 /* lambda expressions */
391 CPP0X_LAMBDA_EXPR,
392 /* C++0x auto */
393 CPP0X_AUTO,
394 /* scoped enums */
395 CPP0X_SCOPED_ENUMS,
396 /* defaulted and deleted functions */
bc2c4cb4
RRC
397 CPP0X_DEFAULTED_DELETED,
398 /* inline namespaces */
399 CPP0X_INLINE_NAMESPACES
848f237b
SZ
400} cpp0x_warn_str;
401
c86818cf
SZ
402/* The various kinds of operation used by composite_pointer_type. */
403
404typedef enum composite_pointer_operation
405{
406 /* comparison */
407 CPO_COMPARISON,
408 /* conversion */
409 CPO_CONVERSION,
410 /* conditional expression */
411 CPO_CONDITIONAL_EXPR
412} composite_pointer_operation;
848f237b 413
2f5b91f5
SZ
414/* Possible cases of expression list used by build_x_compound_expr_from_list. */
415typedef enum expr_list_kind {
416 ELK_INIT, /* initializer */
417 ELK_MEM_INIT, /* member initializer */
418 ELK_FUNC_CAST /* functional cast */
419} expr_list_kind;
420
421/* Possible cases of implicit bad rhs conversions. */
422typedef enum impl_conv_rhs {
423 ICR_DEFAULT_ARGUMENT, /* default argument */
424 ICR_CONVERTING, /* converting */
425 ICR_INIT, /* initialization */
426 ICR_ARGPASS, /* argument passing */
427 ICR_RETURN, /* return */
428 ICR_ASSIGN /* assignment */
429} impl_conv_rhs;
430
ebeb2c24
SZ
431/* Possible cases of implicit or explicit bad conversions to void. */
432typedef enum impl_conv_void {
433 ICV_CAST, /* (explicit) conversion to void */
434 ICV_SECOND_OF_COND, /* second operand of conditional expression */
435 ICV_THIRD_OF_COND, /* third operand of conditional expression */
436 ICV_RIGHT_OF_COMMA, /* right operand of comma operator */
437 ICV_LEFT_OF_COMMA, /* left operand of comma operator */
438 ICV_STATEMENT, /* statement */
439 ICV_THIRD_IN_FOR /* for increment expression */
440} impl_conv_void;
441
8d08fdba
MS
442/* Macros for access to language-specific slots in an identifier. */
443
30394414 444#define IDENTIFIER_NAMESPACE_BINDINGS(NODE) \
da8a66fc 445 (LANG_IDENTIFIER_CAST (NODE)->namespace_bindings)
8d08fdba 446#define IDENTIFIER_TEMPLATE(NODE) \
da8a66fc 447 (LANG_IDENTIFIER_CAST (NODE)->class_template_info)
8d08fdba 448
af6fd53f
GDR
449/* The IDENTIFIER_BINDING is the innermost cxx_binding for the
450 identifier. It's PREVIOUS is the next outermost binding. Each
147135cc 451 VALUE field is a DECL for the associated declaration. Thus,
f181d4ae
MM
452 name lookup consists simply of pulling off the node at the front
453 of the list (modulo oddities for looking up the names of types,
147135cc 454 and such.) You can use SCOPE field to determine the scope
ed3cf953 455 that bound the name. */
f181d4ae 456#define IDENTIFIER_BINDING(NODE) \
da8a66fc 457 (LANG_IDENTIFIER_CAST (NODE)->bindings)
f181d4ae 458
2c73f9f5
ML
459/* TREE_TYPE only indicates on local and class scope the current
460 type. For namespace scope, the presence of a type in any namespace
461 is indicated with global_type_node, and the real type behind must
00a17e31 462 be found through lookup. */
98e40e83
GS
463#define IDENTIFIER_TYPE_VALUE(NODE) identifier_type_value (NODE)
464#define REAL_IDENTIFIER_TYPE_VALUE(NODE) TREE_TYPE (NODE)
465#define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = (TYPE))
2c73f9f5 466#define IDENTIFIER_HAS_TYPE_VALUE(NODE) (IDENTIFIER_TYPE_VALUE (NODE) ? 1 : 0)
8d08fdba 467
98e40e83 468#define IDENTIFIER_LABEL_VALUE(NODE) \
85209a3c 469 (LANG_IDENTIFIER_CAST (NODE)->label_value)
98e40e83 470#define SET_IDENTIFIER_LABEL_VALUE(NODE, VALUE) \
85209a3c 471 IDENTIFIER_LABEL_VALUE (NODE) = (VALUE)
8d08fdba 472
cbb40945
NS
473/* Nonzero if this identifier is used as a virtual function name somewhere
474 (optimizes searches). */
98e40e83 475#define IDENTIFIER_VIRTUAL_P(NODE) TREE_LANG_FLAG_1 (NODE)
8d08fdba 476
f71f87f9
MM
477/* Nonzero if this identifier is the prefix for a mangled C++ operator
478 name. */
98e40e83 479#define IDENTIFIER_OPNAME_P(NODE) TREE_LANG_FLAG_2 (NODE)
8d08fdba 480
4c571114
MM
481/* Nonzero if this identifier is the name of a type-conversion
482 operator. */
421844e7 483#define IDENTIFIER_TYPENAME_P(NODE) \
98e40e83 484 TREE_LANG_FLAG_4 (NODE)
8d08fdba 485
298d6f60
MM
486/* Nonzero if this identifier is the name of a constructor or
487 destructor. */
488#define IDENTIFIER_CTOR_OR_DTOR_P(NODE) \
489 TREE_LANG_FLAG_3 (NODE)
490
4684cd27
MM
491/* True iff NAME is the DECL_ASSEMBLER_NAME for an entity with vague
492 linkage which the prelinker has assigned to this translation
493 unit. */
494#define IDENTIFIER_REPO_CHOSEN(NAME) \
495 (TREE_LANG_FLAG_6 (NAME))
496
8d08fdba 497/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */
5552b43c
MM
498#define C_TYPE_FIELDS_READONLY(TYPE) \
499 (LANG_TYPE_CLASS_CHECK (TYPE)->fields_readonly)
e1cd6e56 500
a723baf1
MM
501/* The tokens stored in the default argument. */
502
503#define DEFARG_TOKENS(NODE) \
504 (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens)
01ea1ea8
NS
505#define DEFARG_INSTANTIATIONS(NODE) \
506 (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->instantiations)
a723baf1 507
d1b38208 508struct GTY (()) tree_default_arg {
a723baf1
MM
509 struct tree_common common;
510 struct cp_token_cache *tokens;
01ea1ea8 511 VEC(tree,gc) *instantiations;
a723baf1
MM
512};
513
55a3debe
DG
514/* The condition associated with the static assertion. This must be
515 an integral constant expression. */
516#define STATIC_ASSERT_CONDITION(NODE) \
517 (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->condition)
518
519/* The message associated with the static assertion. This must be a
520 string constant, which will be emitted as an error message when the
521 static assert condition is false. */
522#define STATIC_ASSERT_MESSAGE(NODE) \
523 (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->message)
524
525/* Source location information for a static assertion. */
526#define STATIC_ASSERT_SOURCE_LOCATION(NODE) \
527 (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->location)
528
d1b38208 529struct GTY (()) tree_static_assert {
55a3debe
DG
530 struct tree_common common;
531 tree condition;
532 tree message;
533 location_t location;
534};
535
d1b38208 536struct GTY (()) tree_argument_pack_select {
5d80a306
DG
537 struct tree_common common;
538 tree argument_pack;
539 int index;
540};
541
cb68ec50
PC
542/* The different kinds of traits that we encounter. */
543
544typedef enum cp_trait_kind
545{
546 CPTK_HAS_NOTHROW_ASSIGN,
547 CPTK_HAS_NOTHROW_CONSTRUCTOR,
548 CPTK_HAS_NOTHROW_COPY,
549 CPTK_HAS_TRIVIAL_ASSIGN,
550 CPTK_HAS_TRIVIAL_CONSTRUCTOR,
551 CPTK_HAS_TRIVIAL_COPY,
552 CPTK_HAS_TRIVIAL_DESTRUCTOR,
553 CPTK_HAS_VIRTUAL_DESTRUCTOR,
554 CPTK_IS_ABSTRACT,
555 CPTK_IS_BASE_OF,
556 CPTK_IS_CLASS,
557 CPTK_IS_CONVERTIBLE_TO,
558 CPTK_IS_EMPTY,
559 CPTK_IS_ENUM,
a0d260fc 560 CPTK_IS_LITERAL_TYPE,
cb68ec50
PC
561 CPTK_IS_POD,
562 CPTK_IS_POLYMORPHIC,
c32097d8
JM
563 CPTK_IS_STD_LAYOUT,
564 CPTK_IS_TRIVIAL,
a0d260fc
PC
565 CPTK_IS_UNION,
566 CPTK_UNDERLYING_TYPE
cb68ec50
PC
567} cp_trait_kind;
568
569/* The types that we are processing. */
570#define TRAIT_EXPR_TYPE1(NODE) \
571 (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type1)
572
573#define TRAIT_EXPR_TYPE2(NODE) \
574 (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type2)
575
576/* The specific trait that we are processing. */
577#define TRAIT_EXPR_KIND(NODE) \
578 (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->kind)
579
d1b38208 580struct GTY (()) tree_trait_expr {
cb68ec50
PC
581 struct tree_common common;
582 tree type1;
583 tree type2;
584 enum cp_trait_kind kind;
585};
586
d5f4eddd
JM
587/* Based off of TYPE_ANONYMOUS_P. */
588#define LAMBDA_TYPE_P(NODE) \
589 (CLASS_TYPE_P (NODE) && LAMBDANAME_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
590
591/* Test if FUNCTION_DECL is a lambda function. */
592#define LAMBDA_FUNCTION_P(FNDECL) \
593 (DECL_OVERLOADED_OPERATOR_P (FNDECL) == CALL_EXPR \
594 && LAMBDA_TYPE_P (CP_DECL_CONTEXT (FNDECL)))
595
596enum cp_lambda_default_capture_mode_type {
597 CPLD_NONE,
598 CPLD_COPY,
599 CPLD_REFERENCE
600};
601
602/* The method of default capture, if any. */
603#define LAMBDA_EXPR_DEFAULT_CAPTURE_MODE(NODE) \
604 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->default_capture_mode)
605
606/* The capture-list, including `this'. Each capture is stored as a FIELD_DECL
607 * so that the name, type, and field are all together, whether or not it has
608 * been added to the lambda's class type.
609 TREE_LIST:
610 TREE_PURPOSE: The FIELD_DECL for this capture.
611 TREE_VALUE: The initializer. This is part of a GNU extension. */
612#define LAMBDA_EXPR_CAPTURE_LIST(NODE) \
613 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->capture_list)
614
615/* The node in the capture-list that holds the 'this' capture. */
616#define LAMBDA_EXPR_THIS_CAPTURE(NODE) \
617 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->this_capture)
618
619/* Predicate tracking whether `this' is in the effective capture set. */
620#define LAMBDA_EXPR_CAPTURES_THIS_P(NODE) \
621 LAMBDA_EXPR_THIS_CAPTURE(NODE)
622
623/* Predicate tracking whether the lambda was declared 'mutable'. */
624#define LAMBDA_EXPR_MUTABLE_P(NODE) \
625 TREE_LANG_FLAG_1 (LAMBDA_EXPR_CHECK (NODE))
626
627/* True iff we should try to deduce the lambda return type from any return
628 statement. */
629#define LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P(NODE) \
630 TREE_LANG_FLAG_2 (LAMBDA_EXPR_CHECK (NODE))
631
632/* The return type in the expression.
633 * NULL_TREE indicates that none was specified. */
634#define LAMBDA_EXPR_RETURN_TYPE(NODE) \
635 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->return_type)
636
637/* The source location of the lambda. */
638#define LAMBDA_EXPR_LOCATION(NODE) \
639 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->locus)
640
641/* The mangling scope for the lambda: FUNCTION_DECL, PARM_DECL, VAR_DECL,
642 FIELD_DECL or NULL_TREE. If this is NULL_TREE, we have no linkage. */
643#define LAMBDA_EXPR_EXTRA_SCOPE(NODE) \
644 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->extra_scope)
645
646/* If EXTRA_SCOPE, this is the number of the lambda within that scope. */
647#define LAMBDA_EXPR_DISCRIMINATOR(NODE) \
648 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->discriminator)
649
650struct GTY (()) tree_lambda_expr
651{
652 struct tree_common common;
653 location_t locus;
654 enum cp_lambda_default_capture_mode_type default_capture_mode;
655 tree capture_list;
656 tree this_capture;
657 tree return_type;
658 tree extra_scope;
659 int discriminator;
660};
661
aa373032
DS
662/* A (typedef,context,usage location) triplet.
663 It represents a typedef used through a
664 context at a given source location.
665 e.g.
666 struct foo {
667 typedef int myint;
668 };
669
670 struct bar {
671 foo::myint v; // #1<-- this location.
672 };
673
674 In bar, the triplet will be (myint, foo, #1).
675 */
676struct GTY(()) qualified_typedef_usage_s {
677 tree typedef_decl;
678 tree context;
679 location_t locus;
680};
681typedef struct qualified_typedef_usage_s qualified_typedef_usage_t;
682DEF_VEC_O (qualified_typedef_usage_t);
683DEF_VEC_ALLOC_O (qualified_typedef_usage_t,gc);
684
685struct GTY(()) tree_template_info {
686 struct tree_common common;
687 VEC(qualified_typedef_usage_t,gc) *typedefs_needing_access_checking;
688};
689
e2500fed 690enum cp_tree_node_structure_enum {
e2500fed
GK
691 TS_CP_GENERIC,
692 TS_CP_IDENTIFIER,
693 TS_CP_TPI,
694 TS_CP_PTRMEM,
695 TS_CP_BINDING,
696 TS_CP_OVERLOAD,
5dae1114 697 TS_CP_BASELINK,
e2500fed 698 TS_CP_WRAPPER,
a723baf1 699 TS_CP_DEFAULT_ARG,
55a3debe 700 TS_CP_STATIC_ASSERT,
5d80a306 701 TS_CP_ARGUMENT_PACK_SELECT,
cb68ec50 702 TS_CP_TRAIT_EXPR,
d5f4eddd 703 TS_CP_LAMBDA_EXPR,
aa373032 704 TS_CP_TEMPLATE_INFO,
e2500fed
GK
705 LAST_TS_CP_ENUM
706};
707
708/* The resulting tree type. */
d1b38208 709union GTY((desc ("cp_tree_node_structure (&%h)"),
81f653d6 710 chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL"))) lang_tree_node {
e2500fed
GK
711 union tree_node GTY ((tag ("TS_CP_GENERIC"),
712 desc ("tree_node_structure (&%h)"))) generic;
713 struct template_parm_index_s GTY ((tag ("TS_CP_TPI"))) tpi;
714 struct ptrmem_cst GTY ((tag ("TS_CP_PTRMEM"))) ptrmem;
e2500fed 715 struct tree_overload GTY ((tag ("TS_CP_OVERLOAD"))) overload;
5dae1114 716 struct tree_baselink GTY ((tag ("TS_CP_BASELINK"))) baselink;
a723baf1 717 struct tree_default_arg GTY ((tag ("TS_CP_DEFAULT_ARG"))) default_arg;
e2500fed 718 struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier;
55a3debe
DG
719 struct tree_static_assert GTY ((tag ("TS_CP_STATIC_ASSERT")))
720 static_assertion;
5d80a306
DG
721 struct tree_argument_pack_select GTY ((tag ("TS_CP_ARGUMENT_PACK_SELECT")))
722 argument_pack_select;
cb68ec50
PC
723 struct tree_trait_expr GTY ((tag ("TS_CP_TRAIT_EXPR")))
724 trait_expression;
d5f4eddd
JM
725 struct tree_lambda_expr GTY ((tag ("TS_CP_LAMBDA_EXPR")))
726 lambda_expression;
aa373032
DS
727 struct tree_template_info GTY ((tag ("TS_CP_TEMPLATE_INFO")))
728 template_info;
e2500fed
GK
729};
730
731\f
7f4edbcb
BS
732enum cp_tree_index
733{
e2d0a11c
MM
734 CPTI_JAVA_BYTE_TYPE,
735 CPTI_JAVA_SHORT_TYPE,
736 CPTI_JAVA_INT_TYPE,
737 CPTI_JAVA_LONG_TYPE,
738 CPTI_JAVA_FLOAT_TYPE,
739 CPTI_JAVA_DOUBLE_TYPE,
740 CPTI_JAVA_CHAR_TYPE,
741 CPTI_JAVA_BOOLEAN_TYPE,
742
7f4edbcb
BS
743 CPTI_WCHAR_DECL,
744 CPTI_VTABLE_ENTRY_TYPE,
745 CPTI_DELTA_TYPE,
c7e266a6 746 CPTI_VTABLE_INDEX_TYPE,
b3ab27f3 747 CPTI_CLEANUP_TYPE,
3ec6bad3 748 CPTI_VTT_PARM_TYPE,
7f4edbcb 749
7f4edbcb 750 CPTI_CLASS_TYPE,
7f4edbcb 751 CPTI_UNKNOWN_TYPE,
09357846 752 CPTI_INIT_LIST_TYPE,
7f4edbcb
BS
753 CPTI_VTBL_TYPE,
754 CPTI_VTBL_PTR_TYPE,
755 CPTI_STD,
2854d3c6 756 CPTI_ABI,
db24eb1f 757 CPTI_CONST_TYPE_INFO_TYPE,
d689a8f1 758 CPTI_TYPE_INFO_PTR_TYPE,
7f4edbcb
BS
759 CPTI_ABORT_FNDECL,
760 CPTI_GLOBAL_DELETE_FNDECL,
4b054b80 761 CPTI_AGGR_TAG,
7f4edbcb 762
9cd64686 763 CPTI_CTOR_IDENTIFIER,
9eb71d8c 764 CPTI_COMPLETE_CTOR_IDENTIFIER,
d43829f9
MM
765 CPTI_BASE_CTOR_IDENTIFIER,
766 CPTI_DTOR_IDENTIFIER,
db9b2174 767 CPTI_COMPLETE_DTOR_IDENTIFIER,
d43829f9
MM
768 CPTI_BASE_DTOR_IDENTIFIER,
769 CPTI_DELETING_DTOR_IDENTIFIER,
9cd64686 770 CPTI_DELTA_IDENTIFIER,
9cd64686 771 CPTI_IN_CHARGE_IDENTIFIER,
3ec6bad3 772 CPTI_VTT_PARM_IDENTIFIER,
9cd64686
MM
773 CPTI_NELTS_IDENTIFIER,
774 CPTI_THIS_IDENTIFIER,
775 CPTI_PFN_IDENTIFIER,
9cd64686 776 CPTI_VPTR_IDENTIFIER,
1f6e1acc 777 CPTI_STD_IDENTIFIER,
9cd64686
MM
778
779 CPTI_LANG_NAME_C,
780 CPTI_LANG_NAME_CPLUSPLUS,
781 CPTI_LANG_NAME_JAVA,
782
783 CPTI_EMPTY_EXCEPT_SPEC,
3a55fb4c
JM
784 CPTI_NOEXCEPT_TRUE_SPEC,
785 CPTI_NOEXCEPT_FALSE_SPEC,
9cd64686 786 CPTI_JCLASS,
9cd64686 787 CPTI_TERMINATE,
52a11cbf 788 CPTI_CALL_UNEXPECTED,
46a9e521 789 CPTI_ATEXIT_FN_PTR_TYPE,
f0105ed3 790 CPTI_ATEXIT,
db4283a0 791 CPTI_DSO_HANDLE,
059fa5e7 792 CPTI_DCAST,
9cd64686 793
9aad8f83 794 CPTI_KEYED_CLASSES,
548502d3 795
14c2101d 796 CPTI_NULLPTR,
5116acc6 797 CPTI_NULLPTR_TYPE,
14c2101d 798
7f4edbcb
BS
799 CPTI_MAX
800};
8d08fdba 801
e2500fed 802extern GTY(()) tree cp_global_trees[CPTI_MAX];
7f4edbcb 803
4d8a1dd6
MM
804#define java_byte_type_node cp_global_trees[CPTI_JAVA_BYTE_TYPE]
805#define java_short_type_node cp_global_trees[CPTI_JAVA_SHORT_TYPE]
806#define java_int_type_node cp_global_trees[CPTI_JAVA_INT_TYPE]
807#define java_long_type_node cp_global_trees[CPTI_JAVA_LONG_TYPE]
808#define java_float_type_node cp_global_trees[CPTI_JAVA_FLOAT_TYPE]
809#define java_double_type_node cp_global_trees[CPTI_JAVA_DOUBLE_TYPE]
810#define java_char_type_node cp_global_trees[CPTI_JAVA_CHAR_TYPE]
811#define java_boolean_type_node cp_global_trees[CPTI_JAVA_BOOLEAN_TYPE]
812
7f4edbcb
BS
813#define wchar_decl_node cp_global_trees[CPTI_WCHAR_DECL]
814#define vtable_entry_type cp_global_trees[CPTI_VTABLE_ENTRY_TYPE]
c7e266a6 815/* The type used to represent an offset by which to adjust the `this'
c4372ef4 816 pointer in pointer-to-member types. */
7f4edbcb 817#define delta_type_node cp_global_trees[CPTI_DELTA_TYPE]
c7e266a6 818/* The type used to represent an index into the vtable. */
0cbd7506 819#define vtable_index_type cp_global_trees[CPTI_VTABLE_INDEX_TYPE]
db1147b2 820
7f4edbcb 821#define class_type_node cp_global_trees[CPTI_CLASS_TYPE]
7f4edbcb 822#define unknown_type_node cp_global_trees[CPTI_UNKNOWN_TYPE]
09357846 823#define init_list_type_node cp_global_trees[CPTI_INIT_LIST_TYPE]
7f4edbcb
BS
824#define vtbl_type_node cp_global_trees[CPTI_VTBL_TYPE]
825#define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE]
826#define std_node cp_global_trees[CPTI_STD]
0cbd7506 827#define abi_node cp_global_trees[CPTI_ABI]
db24eb1f 828#define const_type_info_type_node cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE]
d689a8f1 829#define type_info_ptr_type cp_global_trees[CPTI_TYPE_INFO_PTR_TYPE]
7f4edbcb
BS
830#define abort_fndecl cp_global_trees[CPTI_ABORT_FNDECL]
831#define global_delete_fndecl cp_global_trees[CPTI_GLOBAL_DELETE_FNDECL]
4b054b80 832#define current_aggr cp_global_trees[CPTI_AGGR_TAG]
14c2101d 833#define nullptr_node cp_global_trees[CPTI_NULLPTR]
5116acc6 834#define nullptr_type_node cp_global_trees[CPTI_NULLPTR_TYPE]
ea419909 835
9cd64686
MM
836/* We cache these tree nodes so as to call get_identifier less
837 frequently. */
838
9eb71d8c 839/* The name of a constructor that takes an in-charge parameter to
db9b2174 840 decide whether or not to construct virtual base classes. */
0cbd7506 841#define ctor_identifier cp_global_trees[CPTI_CTOR_IDENTIFIER]
9eb71d8c 842/* The name of a constructor that constructs virtual base classes. */
0cbd7506 843#define complete_ctor_identifier cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER]
d43829f9 844/* The name of a constructor that does not construct virtual base classes. */
0cbd7506 845#define base_ctor_identifier cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER]
db9b2174
MM
846/* The name of a destructor that takes an in-charge parameter to
847 decide whether or not to destroy virtual base classes and whether
848 or not to delete the object. */
0cbd7506 849#define dtor_identifier cp_global_trees[CPTI_DTOR_IDENTIFIER]
db9b2174 850/* The name of a destructor that destroys virtual base classes. */
0cbd7506 851#define complete_dtor_identifier cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER]
d43829f9
MM
852/* The name of a destructor that does not destroy virtual base
853 classes. */
0cbd7506 854#define base_dtor_identifier cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
d43829f9
MM
855/* The name of a destructor that destroys virtual base classes, and
856 then deletes the entire object. */
0cbd7506
MS
857#define deleting_dtor_identifier cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
858#define delta_identifier cp_global_trees[CPTI_DELTA_IDENTIFIER]
859#define in_charge_identifier cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
3ec6bad3
MM
860/* The name of the parameter that contains a pointer to the VTT to use
861 for this subobject constructor or destructor. */
0cbd7506
MS
862#define vtt_parm_identifier cp_global_trees[CPTI_VTT_PARM_IDENTIFIER]
863#define nelts_identifier cp_global_trees[CPTI_NELTS_IDENTIFIER]
864#define this_identifier cp_global_trees[CPTI_THIS_IDENTIFIER]
865#define pfn_identifier cp_global_trees[CPTI_PFN_IDENTIFIER]
866#define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER]
1f6e1acc 867/* The name of the std namespace. */
0cbd7506
MS
868#define std_identifier cp_global_trees[CPTI_STD_IDENTIFIER]
869#define lang_name_c cp_global_trees[CPTI_LANG_NAME_C]
870#define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
871#define lang_name_java cp_global_trees[CPTI_LANG_NAME_JAVA]
9cd64686
MM
872
873/* Exception specifier used for throw(). */
0cbd7506 874#define empty_except_spec cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
3a55fb4c
JM
875#define noexcept_true_spec cp_global_trees[CPTI_NOEXCEPT_TRUE_SPEC]
876#define noexcept_false_spec cp_global_trees[CPTI_NOEXCEPT_FALSE_SPEC]
9cd64686 877
00a17e31 878/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */
0cbd7506 879#define jclass_node cp_global_trees[CPTI_JCLASS]
9cd64686 880
9cd64686 881/* The declaration for `std::terminate'. */
0cbd7506 882#define terminate_node cp_global_trees[CPTI_TERMINATE]
9cd64686 883
52a11cbf 884/* The declaration for "__cxa_call_unexpected". */
0cbd7506 885#define call_unexpected_node cp_global_trees[CPTI_CALL_UNEXPECTED]
52a11cbf 886
46a9e521
MM
887/* The type of the function-pointer argument to "__cxa_atexit" (or
888 "std::atexit", if "__cxa_atexit" is not being used). */
889#define atexit_fn_ptr_type_node cp_global_trees[CPTI_ATEXIT_FN_PTR_TYPE]
890
db4283a0 891/* A pointer to `std::atexit'. */
0cbd7506 892#define atexit_node cp_global_trees[CPTI_ATEXIT]
f0105ed3 893
db4283a0 894/* A pointer to `__dso_handle'. */
0cbd7506 895#define dso_handle_node cp_global_trees[CPTI_DSO_HANDLE]
db4283a0 896
059fa5e7 897/* The declaration of the dynamic_cast runtime. */
0cbd7506 898#define dynamic_cast_node cp_global_trees[CPTI_DCAST]
059fa5e7 899
b3ab27f3 900/* The type of a destructor. */
0cbd7506 901#define cleanup_type cp_global_trees[CPTI_CLEANUP_TYPE]
b3ab27f3 902
3ec6bad3
MM
903/* The type of the vtt parameter passed to subobject constructors and
904 destructors. */
0cbd7506 905#define vtt_parm_type cp_global_trees[CPTI_VTT_PARM_TYPE]
3ec6bad3 906
9aad8f83
MA
907/* A TREE_LIST of the dynamic classes whose vtables may have to be
908 emitted in this translation unit. */
548502d3 909
0cbd7506 910#define keyed_classes cp_global_trees[CPTI_KEYED_CLASSES]
548502d3 911
dbbf88d1
NS
912/* Node to indicate default access. This must be distinct from the
913 access nodes in tree.h. */
914
915#define access_default_node null_node
916
9cd64686
MM
917/* Global state. */
918
d1b38208 919struct GTY(()) saved_scope {
d4e6fecb 920 VEC(cxx_saved_binding,gc) *old_bindings;
9cd64686 921 tree old_namespace;
2a4449a3 922 VEC(tree,gc) *decl_ns_list;
fc0e7bf5
MM
923 tree class_name;
924 tree class_type;
9cd64686 925 tree access_specifier;
a8f73d4b 926 tree function_decl;
aff44741 927 VEC(tree,gc) *lang_base;
9cd64686 928 tree lang_name;
9cd64686 929 tree template_parms;
89b578be 930 struct cp_binding_level *x_previous_class_level;
6f80451c 931 tree x_saved_tree;
fc0e7bf5 932
30bcc028 933 int x_processing_template_decl;
9cd64686 934 int x_processing_specialization;
30bcc028
DG
935 BOOL_BITFIELD x_processing_explicit_instantiation : 1;
936 BOOL_BITFIELD need_pop_function_context : 1;
7d882b83
ILT
937
938 int unevaluated_operand;
939 int inhibit_evaluation_warnings;
fc0e7bf5 940
ae499cce 941 struct stmt_tree_s x_stmt_tree;
fc0e7bf5 942
e2500fed
GK
943 struct cp_binding_level *class_bindings;
944 struct cp_binding_level *bindings;
fc0e7bf5
MM
945
946 struct saved_scope *prev;
9cd64686
MM
947};
948
949/* The current open namespace. */
950
951#define current_namespace scope_chain->old_namespace
952
00a17e31 953/* The stack for namespaces of current declarations. */
ee8fc32b
JM
954
955#define decl_namespace_list scope_chain->decl_ns_list
956
9cd64686
MM
957/* IDENTIFIER_NODE: name of current class */
958
959#define current_class_name scope_chain->class_name
960
961/* _TYPE: the type of the current class */
962
963#define current_class_type scope_chain->class_type
964
965/* When parsing a class definition, the access specifier most recently
966 given by the user, or, if no access specifier was given, the
967 default value appropriate for the kind of class (i.e., struct,
968 class, or union). */
969
970#define current_access_specifier scope_chain->access_specifier
971
972/* Pointer to the top of the language name stack. */
973
9cd64686
MM
974#define current_lang_base scope_chain->lang_base
975#define current_lang_name scope_chain->lang_name
976
cac4ddf0 977/* When parsing a template declaration, a TREE_LIST represents the
a57a55de 978 active template parameters. Each node in the list represents one
03c17ccd
MM
979 level of template parameters. The innermost level is first in the
980 list. The depth of each level is stored as an INTEGER_CST in the
981 TREE_PURPOSE of each node. The parameters for that level are
982 stored in the TREE_VALUE. */
9cd64686 983
9cd64686
MM
984#define current_template_parms scope_chain->template_parms
985
986#define processing_template_decl scope_chain->x_processing_template_decl
987#define processing_specialization scope_chain->x_processing_specialization
988#define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation
989
89b578be
MM
990/* The cached class binding level, from the most recently exited
991 class, or NULL if none. */
9cd64686 992
89b578be 993#define previous_class_level scope_chain->x_previous_class_level
9cd64686 994
70adf8a9
JM
995/* A list of private types mentioned, for deferred access checking. */
996
e2500fed 997extern GTY(()) struct saved_scope *scope_chain;
9cd64686 998
d1b38208 999struct GTY(()) cxx_int_tree_map {
10827cd8
JJ
1000 unsigned int uid;
1001 tree to;
1002};
1003
1004extern unsigned int cxx_int_tree_map_hash (const void *);
1005extern int cxx_int_tree_map_eq (const void *, const void *);
1006
8012c983
MM
1007/* Global state pertinent to the current function. */
1008
d1b38208 1009struct GTY(()) language_function {
e2500fed 1010 struct c_language_function base;
ae499cce 1011
44d10c10 1012 tree x_cdtor_label;
4519c0a8
MM
1013 tree x_current_class_ptr;
1014 tree x_current_class_ref;
52a11cbf 1015 tree x_eh_spec_block;
2c146a76 1016 tree x_in_charge_parm;
e0fff4b3 1017 tree x_vtt_parm;
0d97bf4c 1018 tree x_return_value;
4519c0a8 1019
30bcc028
DG
1020 BOOL_BITFIELD returns_value : 1;
1021 BOOL_BITFIELD returns_null : 1;
1022 BOOL_BITFIELD returns_abnormally : 1;
1023 BOOL_BITFIELD in_function_try_handler : 1;
1024 BOOL_BITFIELD in_base_initializer : 1;
8012c983 1025
b2dd096b 1026 /* True if this function can throw an exception. */
1c62e7b2 1027 BOOL_BITFIELD can_throw : 1;
b2dd096b 1028
1799e5d5 1029 htab_t GTY((param_is(struct named_label_entry))) x_named_labels;
e2500fed 1030 struct cp_binding_level *bindings;
9acaf84a 1031 VEC(tree,gc) *x_local_names;
10827cd8 1032 htab_t GTY((param_is (struct cxx_int_tree_map))) extern_decl_map;
8012c983
MM
1033};
1034
99dccabc 1035/* The current C++-specific per-function global variables. */
8012c983 1036
e2500fed 1037#define cp_function_chain (cfun->language)
8012c983 1038
44d10c10 1039/* In a constructor destructor, the point at which all derived class
39a13be5 1040 destroying/construction has been done. I.e., just before a
77880ae4 1041 constructor returns, or before any base class destroying will be done
44d10c10 1042 in a destructor. */
8012c983 1043
44d10c10 1044#define cdtor_label cp_function_chain->x_cdtor_label
8012c983 1045
8012c983
MM
1046/* When we're processing a member function, current_class_ptr is the
1047 PARM_DECL for the `this' pointer. The current_class_ref is an
1048 expression for `*this'. */
1049
a8f73d4b 1050#define current_class_ptr \
3efd49f9
JJ
1051 (cfun && cp_function_chain \
1052 ? cp_function_chain->x_current_class_ptr : NULL_TREE)
a8f73d4b 1053#define current_class_ref \
7c663eb0
MJ
1054 ((cfun && cp_function_chain) \
1055 ? cp_function_chain->x_current_class_ref : NULL_TREE)
8012c983 1056
52a11cbf 1057/* The EH_SPEC_BLOCK for the exception-specifiers for the current
2c146a76
MM
1058 function, if any. */
1059
52a11cbf 1060#define current_eh_spec_block cp_function_chain->x_eh_spec_block
2c146a76 1061
2c146a76 1062/* The `__in_chrg' parameter for the current function. Only used for
e0fff4b3 1063 constructors and destructors. */
2c146a76
MM
1064
1065#define current_in_charge_parm cp_function_chain->x_in_charge_parm
1066
e0fff4b3
JM
1067/* The `__vtt_parm' parameter for the current function. Only used for
1068 constructors and destructors. */
1069
1070#define current_vtt_parm cp_function_chain->x_vtt_parm
1071
8012c983
MM
1072/* Set to 0 at beginning of a function definition, set to 1 if
1073 a return statement that specifies a return value is seen. */
1074
1075#define current_function_returns_value cp_function_chain->returns_value
1076
1077/* Set to 0 at beginning of a function definition, set to 1 if
1078 a return statement with no argument is seen. */
1079
1080#define current_function_returns_null cp_function_chain->returns_null
1081
efe49da0
JM
1082/* Set to 0 at beginning of a function definition, set to 1 if
1083 a call to a noreturn function is seen. */
1084
1085#define current_function_returns_abnormally \
1086 cp_function_chain->returns_abnormally
1087
4de8668e 1088/* Nonzero if we are processing a base initializer. Zero elsewhere. */
1f5a253a
NS
1089#define in_base_initializer cp_function_chain->in_base_initializer
1090
8012c983
MM
1091#define in_function_try_handler cp_function_chain->in_function_try_handler
1092
0d97bf4c
JM
1093/* Expression always returned from function, or error_mark_node
1094 otherwise, for use by the automatic named return value optimization. */
1095
1096#define current_function_return_value \
1097 (cp_function_chain->x_return_value)
1098
4546865e
MM
1099/* True if NAME is the IDENTIFIER_NODE for an overloaded "operator
1100 new" or "operator delete". */
1101#define NEW_DELETE_OPNAME_P(NAME) \
0cbd7506
MS
1102 ((NAME) == ansi_opname (NEW_EXPR) \
1103 || (NAME) == ansi_opname (VEC_NEW_EXPR) \
1104 || (NAME) == ansi_opname (DELETE_EXPR) \
4546865e
MM
1105 || (NAME) == ansi_opname (VEC_DELETE_EXPR))
1106
596ea4e5
AS
1107#define ansi_opname(CODE) \
1108 (operator_name_info[(int) (CODE)].identifier)
1109#define ansi_assopname(CODE) \
1110 (assignment_operator_name_info[(int) (CODE)].identifier)
8d08fdba 1111
a723baf1
MM
1112/* True if NODE is an erroneous expression. */
1113
1114#define error_operand_p(NODE) \
0cbd7506 1115 ((NODE) == error_mark_node \
a723baf1 1116 || ((NODE) && TREE_TYPE ((NODE)) == error_mark_node))
8d08fdba 1117\f
feea5b18
ILT
1118/* TRUE if a tree code represents a statement. */
1119extern bool statement_code_p[MAX_TREE_CODES];
1120
1121#define STATEMENT_CODE_P(CODE) statement_code_p[(int) (CODE)]
1122
fcad5cf5 1123enum languages { lang_c, lang_cplusplus, lang_java };
8d08fdba
MS
1124
1125/* Macros to make error reporting functions' lives easier. */
1126#define TYPE_IDENTIFIER(NODE) (DECL_NAME (TYPE_NAME (NODE)))
1951a1b6
JM
1127#define TYPE_LINKAGE_IDENTIFIER(NODE) \
1128 (TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (NODE)))
8d08fdba
MS
1129#define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE)))
1130#define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE)))
1131
1951a1b6
JM
1132/* Nonzero if NODE has no name for linkage purposes. */
1133#define TYPE_ANONYMOUS_P(NODE) \
1134 (TAGGED_TYPE_P (NODE) && ANON_AGGRNAME_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
1135
a4443a08 1136/* The _DECL for this _TYPE. */
d2e5ee5c 1137#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
a4443a08 1138
c92366fb 1139/* Nonzero if T is a class (or struct or union) type. Also nonzero
83233dca 1140 for template type parameters, typename types, and instantiated
9e1e64ec
PC
1141 template template parameters. Keep these checks in ascending code
1142 order. */
1143#define MAYBE_CLASS_TYPE_P(T) \
98e40e83
GS
1144 (TREE_CODE (T) == TEMPLATE_TYPE_PARM \
1145 || TREE_CODE (T) == TYPENAME_TYPE \
1146 || TREE_CODE (T) == TYPEOF_TYPE \
1147 || TREE_CODE (T) == BOUND_TEMPLATE_TEMPLATE_PARM \
3ad6a8e1 1148 || TREE_CODE (T) == DECLTYPE_TYPE \
adf2edec 1149 || CLASS_TYPE_P (T))
7ddedda4 1150
9e1e64ec 1151/* Set CLASS_TYPE_P for T to VAL. T must be a class, struct, or
bb20cc46 1152 union type. */
9e1e64ec 1153#define SET_CLASS_TYPE_P(T, VAL) \
7ddedda4 1154 (TYPE_LANG_FLAG_5 (T) = (VAL))
c92366fb 1155
b80c4d77
MM
1156/* Nonzero if T is a class type. Zero for template type parameters,
1157 typename types, and so forth. */
98e40e83 1158#define CLASS_TYPE_P(T) \
9e1e64ec 1159 (RECORD_OR_UNION_CODE_P (TREE_CODE (T)) && TYPE_LANG_FLAG_5 (T))
c92366fb 1160
cb68ec50
PC
1161/* Nonzero if T is a class type but not an union. */
1162#define NON_UNION_CLASS_TYPE_P(T) \
1163 (CLASS_TYPE_P (T) && TREE_CODE (T) != UNION_TYPE)
1164
38b3627d 1165/* Keep these checks in ascending code order. */
9e1e64ec 1166#define RECORD_OR_UNION_CODE_P(T) \
38b3627d 1167 ((T) == RECORD_TYPE || (T) == UNION_TYPE)
98e40e83
GS
1168#define TAGGED_TYPE_P(T) \
1169 (CLASS_TYPE_P (T) || TREE_CODE (T) == ENUMERAL_TYPE)
1951a1b6 1170#define IS_OVERLOAD_TYPE(T) TAGGED_TYPE_P (T)
8d08fdba 1171
00a17e31 1172/* True if this a "Java" type, defined in 'extern "Java"'. */
98e40e83 1173#define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3 (NODE)
ea419909 1174
5552b43c
MM
1175/* True if this type is dependent. This predicate is only valid if
1176 TYPE_DEPENDENT_P_VALID is true. */
1177#define TYPE_DEPENDENT_P(NODE) TYPE_LANG_FLAG_0 (NODE)
1178
1179/* True if dependent_type_p has been called for this type, with the
1180 result that TYPE_DEPENDENT_P is valid. */
1181#define TYPE_DEPENDENT_P_VALID(NODE) TYPE_LANG_FLAG_6(NODE)
1182
91063b51
MM
1183/* Nonzero if this type is const-qualified. */
1184#define CP_TYPE_CONST_P(NODE) \
89d684bb 1185 ((cp_type_quals (NODE) & TYPE_QUAL_CONST) != 0)
91063b51
MM
1186
1187/* Nonzero if this type is volatile-qualified. */
1188#define CP_TYPE_VOLATILE_P(NODE) \
89d684bb 1189 ((cp_type_quals (NODE) & TYPE_QUAL_VOLATILE) != 0)
91063b51 1190
174bcdb9 1191/* Nonzero if this type is restrict-qualified. */
91063b51 1192#define CP_TYPE_RESTRICT_P(NODE) \
89d684bb 1193 ((cp_type_quals (NODE) & TYPE_QUAL_RESTRICT) != 0)
91063b51
MM
1194
1195/* Nonzero if this type is const-qualified, but not
1196 volatile-qualified. Other qualifiers are ignored. This macro is
1197 used to test whether or not it is OK to bind an rvalue to a
1198 reference. */
1199#define CP_TYPE_CONST_NON_VOLATILE_P(NODE) \
89d684bb 1200 ((cp_type_quals (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) \
91063b51
MM
1201 == TYPE_QUAL_CONST)
1202
e0fff4b3 1203#define FUNCTION_ARG_CHAIN(NODE) \
98e40e83 1204 TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE)))
e0fff4b3
JM
1205
1206/* Given a FUNCTION_DECL, returns the first TREE_LIST out of TYPE_ARG_TYPES
1207 which refers to a user-written parameter. */
1208#define FUNCTION_FIRST_USER_PARMTYPE(NODE) \
98e40e83 1209 skip_artificial_parms_for ((NODE), TYPE_ARG_TYPES (TREE_TYPE (NODE)))
e0fff4b3
JM
1210
1211/* Similarly, but for DECL_ARGUMENTS. */
1212#define FUNCTION_FIRST_USER_PARM(NODE) \
98e40e83 1213 skip_artificial_parms_for ((NODE), DECL_ARGUMENTS (NODE))
e0fff4b3 1214
2db1ab2d
NS
1215/* Nonzero iff TYPE is derived from PARENT. Ignores accessibility and
1216 ambiguity issues. */
98e40e83 1217#define DERIVED_FROM_P(PARENT, TYPE) \
c44e68a5 1218 (lookup_base ((TYPE), (PARENT), ba_any, NULL) != NULL_TREE)
2db1ab2d
NS
1219/* Nonzero iff TYPE is uniquely derived from PARENT. Ignores
1220 accessibility. */
98e40e83 1221#define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) \
18e4be85 1222 (lookup_base ((TYPE), (PARENT), ba_unique | ba_quiet, NULL) != NULL_TREE)
2db1ab2d 1223/* Nonzero iff TYPE is publicly & uniquely derived from PARENT. */
98e40e83 1224#define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \
18e4be85 1225 (lookup_base ((TYPE), (PARENT), ba_ignore_scope | ba_check | ba_quiet, \
0cbd7506 1226 NULL) != NULL_TREE)
d7afec4b
ND
1227
1228/* Gives the visibility specification for a class type. */
0871761b 1229#define CLASSTYPE_VISIBILITY(TYPE) \
a2b63a20 1230 DECL_VISIBILITY (TYPE_MAIN_DECL (TYPE))
0871761b 1231#define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE) \
a2b63a20 1232 DECL_VISIBILITY_SPECIFIED (TYPE_MAIN_DECL (TYPE))
d7afec4b 1233
d1b38208 1234typedef struct GTY (()) tree_pair_s {
0871761b
NS
1235 tree purpose;
1236 tree value;
1237} tree_pair_s;
1238typedef tree_pair_s *tree_pair_p;
d4e6fecb
NS
1239DEF_VEC_O (tree_pair_s);
1240DEF_VEC_ALLOC_O (tree_pair_s,gc);
d7afec4b 1241
e2500fed
GK
1242/* This is a few header flags for 'struct lang_type'. Actually,
1243 all but the first are used only for lang_type_class; they
1244 are put in this structure to save space. */
d1b38208 1245struct GTY(()) lang_type_header {
1c62e7b2
KG
1246 BOOL_BITFIELD is_lang_type_class : 1;
1247
1248 BOOL_BITFIELD has_type_conversion : 1;
066ec0a4 1249 BOOL_BITFIELD has_copy_ctor : 1;
1c62e7b2 1250 BOOL_BITFIELD has_default_ctor : 1;
1c62e7b2
KG
1251 BOOL_BITFIELD const_needs_init : 1;
1252 BOOL_BITFIELD ref_needs_init : 1;
066ec0a4 1253 BOOL_BITFIELD has_const_copy_assign : 1;
5775a06a
NS
1254
1255 BOOL_BITFIELD spare : 1;
e2500fed
GK
1256};
1257
7ddedda4
MM
1258/* This structure provides additional information above and beyond
1259 what is provide in the ordinary tree_type. In the past, we used it
1260 for the types of class types, template parameters types, typename
1261 types, and so forth. However, there can be many (tens to hundreds
1262 of thousands) of template parameter types in a compilation, and
1263 there's no need for this additional information in that case.
1264 Therefore, we now use this data structure only for class types.
1265
1266 In the past, it was thought that there would be relatively few
1267 class types. However, in the presence of heavy use of templates,
1268 many (i.e., thousands) of classes can easily be generated.
1269 Therefore, we should endeavor to keep the size of this structure to
1270 a minimum. */
d1b38208 1271struct GTY(()) lang_type_class {
e2500fed 1272 struct lang_type_header h;
19114537 1273
8012c983
MM
1274 unsigned char align;
1275
5b0cec3b
MM
1276 unsigned has_mutable : 1;
1277 unsigned com_interface : 1;
1278 unsigned non_pod_class : 1;
1279 unsigned nearly_empty_p : 1;
46ccf50a 1280 unsigned user_align : 1;
066ec0a4 1281 unsigned has_copy_assign : 1;
834c6dff
MM
1282 unsigned has_new : 1;
1283 unsigned has_array_new : 1;
8012c983
MM
1284
1285 unsigned gets_delete : 2;
8012c983
MM
1286 unsigned interface_only : 1;
1287 unsigned interface_unknown : 1;
8fbc5ae7 1288 unsigned contains_empty_class_p : 1;
560ad596
MM
1289 unsigned anon_aggr : 1;
1290 unsigned non_zero_init : 1;
1291 unsigned empty_p : 1;
8012c983 1292
dbc957f1 1293 unsigned vec_new_uses_cookie : 1;
8012c983 1294 unsigned declared_class : 1;
3543e114
NS
1295 unsigned diamond_shaped : 1;
1296 unsigned repeated_base : 1;
8012c983 1297 unsigned being_defined : 1;
fae4f6aa 1298 unsigned java_interface : 1;
8012c983 1299 unsigned debug_requested : 1;
560ad596 1300 unsigned fields_readonly : 1;
c8094d83 1301
3543e114 1302 unsigned use_template : 2;
8012c983
MM
1303 unsigned ptrmemfunc_flag : 1;
1304 unsigned was_anonymous : 1;
508a1c9c
MM
1305 unsigned lazy_default_ctor : 1;
1306 unsigned lazy_copy_ctor : 1;
066ec0a4 1307 unsigned lazy_copy_assign : 1;
9f4faeae
MM
1308 unsigned lazy_destructor : 1;
1309
066ec0a4
JM
1310 unsigned has_const_copy_ctor : 1;
1311 unsigned has_complex_copy_ctor : 1;
1312 unsigned has_complex_copy_assign : 1;
8012c983 1313 unsigned non_aggregate : 1;
cb68ec50 1314 unsigned has_complex_dflt : 1;
09357846 1315 unsigned has_list_ctor : 1;
c32097d8 1316 unsigned non_std_layout : 1;
7ecbca9d 1317 unsigned is_literal : 1;
94e6e4c4 1318
ac177431
JM
1319 unsigned lazy_move_ctor : 1;
1320 unsigned lazy_move_assign : 1;
1321 unsigned has_complex_move_ctor : 1;
1322 unsigned has_complex_move_assign : 1;
3b49d762 1323 unsigned has_constexpr_ctor : 1;
486d481b 1324 unsigned is_final : 1;
ac177431 1325
8012c983
MM
1326 /* When adding a flag here, consider whether or not it ought to
1327 apply to a template instance if it applies to the template. If
1328 so, make sure to copy it in instantiate_class_template! */
1329
5b0cec3b
MM
1330 /* There are some bits left to fill out a 32-bit word. Keep track
1331 of this by updating the size of this bitfield whenever you add or
8012c983 1332 remove a flag. */
486d481b 1333 unsigned dummy : 2;
bb20cc46 1334
911a71a7 1335 tree primary_base;
d4e6fecb 1336 VEC(tree_pair_s,gc) *vcall_indices;
548502d3 1337 tree vtables;
a82d6da5 1338 tree typeinfo_var;
d4e6fecb 1339 VEC(tree,gc) *vbases;
5e0c54e5 1340 binding_table nested_udts;
17bbb839 1341 tree as_base;
d4e6fecb 1342 VEC(tree,gc) *pure_virtuals;
c35cce41 1343 tree friend_classes;
d4e6fecb 1344 VEC(tree,gc) * GTY((reorder ("resort_type_method_vec"))) methods;
9aad8f83 1345 tree key_method;
7088fca9 1346 tree decl_list;
c35cce41 1347 tree template_info;
6a629cac 1348 tree befriending_classes;
c7baa145
ZL
1349 /* In a RECORD_TYPE, information specific to Objective-C++, such
1350 as a list of adopted protocols or a pointer to a corresponding
1351 @interface. See objc/objc-act.h for details. */
1352 tree objc_info;
b97e8a14
JM
1353 /* sorted_fields is sorted based on a pointer, so we need to be able
1354 to resort it if pointers get rearranged. */
1355 struct sorted_fields_type * GTY ((reorder ("resort_sorted_fields")))
1356 sorted_fields;
d5f4eddd
JM
1357 /* FIXME reuse another field? */
1358 tree lambda_expr;
8d08fdba
MS
1359};
1360
d1b38208 1361struct GTY(()) lang_type_ptrmem {
e2500fed
GK
1362 struct lang_type_header h;
1363 tree record;
1364};
1365
a9429e29 1366struct GTY((variable_size)) lang_type {
19114537 1367 union lang_type_u
e2500fed 1368 {
165b54c3 1369 struct lang_type_header GTY((skip (""))) h;
e2500fed
GK
1370 struct lang_type_class GTY((tag ("1"))) c;
1371 struct lang_type_ptrmem GTY((tag ("0"))) ptrmem;
1372 } GTY((desc ("%h.h.is_lang_type_class"))) u;
1373};
1374
1375#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
1376
de94b46c 1377#define LANG_TYPE_CLASS_CHECK(NODE) __extension__ \
e2500fed
GK
1378({ struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE); \
1379 if (! lt->u.h.is_lang_type_class) \
1380 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1381 &lt->u.c; })
1382
de94b46c 1383#define LANG_TYPE_PTRMEM_CHECK(NODE) __extension__ \
e2500fed
GK
1384({ struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE); \
1385 if (lt->u.h.is_lang_type_class) \
1386 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1387 &lt->u.ptrmem; })
1388
1389#else
1390
1391#define LANG_TYPE_CLASS_CHECK(NODE) (&TYPE_LANG_SPECIFIC (NODE)->u.c)
1392#define LANG_TYPE_PTRMEM_CHECK(NODE) (&TYPE_LANG_SPECIFIC (NODE)->u.ptrmem)
1393
1394#endif /* ENABLE_TREE_CHECKING */
1395
834c6dff 1396/* Nonzero for _CLASSTYPE means that operator delete is defined. */
e2500fed 1397#define TYPE_GETS_DELETE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->gets_delete)
a28e3c7f
MS
1398#define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1)
1399
834c6dff 1400/* Nonzero if `new NODE[x]' should cause the allocation of extra
dbc957f1
MM
1401 storage to indicate how many array elements are in use. */
1402#define TYPE_VEC_NEW_USES_COOKIE(NODE) \
1403 (CLASS_TYPE_P (NODE) \
e2500fed 1404 && LANG_TYPE_CLASS_CHECK (NODE)->vec_new_uses_cookie)
8d08fdba 1405
8d08fdba
MS
1406/* Nonzero means that this _CLASSTYPE node defines ways of converting
1407 itself to other types. */
98e40e83 1408#define TYPE_HAS_CONVERSION(NODE) \
e2500fed 1409 (LANG_TYPE_CLASS_CHECK (NODE)->h.has_type_conversion)
8d08fdba 1410
508a1c9c
MM
1411/* Nonzero means that NODE (a class type) has a default constructor --
1412 but that it has not yet been declared. */
1413#define CLASSTYPE_LAZY_DEFAULT_CTOR(NODE) \
1414 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_default_ctor)
1415
1416/* Nonzero means that NODE (a class type) has a copy constructor --
1417 but that it has not yet been declared. */
1418#define CLASSTYPE_LAZY_COPY_CTOR(NODE) \
1419 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_ctor)
1420
d5f4eddd
JM
1421/* Nonzero means that NODE (a class type) has a move constructor --
1422 but that it has not yet been declared. */
1423#define CLASSTYPE_LAZY_MOVE_CTOR(NODE) \
1424 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_ctor)
1425
fb232476
MM
1426/* Nonzero means that NODE (a class type) has an assignment operator
1427 -- but that it has not yet been declared. */
066ec0a4
JM
1428#define CLASSTYPE_LAZY_COPY_ASSIGN(NODE) \
1429 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_assign)
fb232476 1430
ac177431
JM
1431/* Nonzero means that NODE (a class type) has an assignment operator
1432 -- but that it has not yet been declared. */
1433#define CLASSTYPE_LAZY_MOVE_ASSIGN(NODE) \
1434 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_assign)
1435
9f4faeae
MM
1436/* Nonzero means that NODE (a class type) has a destructor -- but that
1437 it has not yet been declared. */
1438#define CLASSTYPE_LAZY_DESTRUCTOR(NODE) \
1439 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_destructor)
c8094d83 1440
486d481b
VV
1441/* Nonzero means that NODE (a class type) is final */
1442#define CLASSTYPE_FINAL(NODE) \
1443 (LANG_TYPE_CLASS_CHECK (NODE)->is_final)
1444
1445
8d08fdba 1446/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */
066ec0a4 1447#define TYPE_HAS_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_copy_assign)
aaaa46d2
MM
1448
1449/* True iff the class type NODE has an "operator =" whose parameter
1450 has a parameter of type "const X&". */
066ec0a4
JM
1451#define TYPE_HAS_CONST_COPY_ASSIGN(NODE) \
1452 (LANG_TYPE_CLASS_CHECK (NODE)->h.has_const_copy_assign)
8d08fdba
MS
1453
1454/* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */
066ec0a4
JM
1455#define TYPE_HAS_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->h.has_copy_ctor)
1456#define TYPE_HAS_CONST_COPY_CTOR(NODE) \
1457 (LANG_TYPE_CLASS_CHECK (NODE)->has_const_copy_ctor)
8d08fdba 1458
09357846
JM
1459/* Nonzero if this class has an X(initializer_list<T>) constructor. */
1460#define TYPE_HAS_LIST_CTOR(NODE) \
1461 (LANG_TYPE_CLASS_CHECK (NODE)->has_list_ctor)
1462
3b49d762
GDR
1463/* Nonzero if this class has a constexpr constructor other than a copy/move
1464 constructor. Note that a class can have constexpr constructors for
1465 static initialization even if it isn't a literal class. */
1466#define TYPE_HAS_CONSTEXPR_CTOR(NODE) \
1467 (LANG_TYPE_CLASS_CHECK (NODE)->has_constexpr_ctor)
1468
834c6dff
MM
1469/* Nonzero if this class defines an overloaded operator new. (An
1470 operator new [] doesn't count.) */
1471#define TYPE_HAS_NEW_OPERATOR(NODE) \
e2500fed 1472 (LANG_TYPE_CLASS_CHECK (NODE)->has_new)
834c6dff
MM
1473
1474/* Nonzero if this class defines an overloaded operator new[]. */
1475#define TYPE_HAS_ARRAY_NEW_OPERATOR(NODE) \
e2500fed 1476 (LANG_TYPE_CLASS_CHECK (NODE)->has_array_new)
834c6dff 1477
8d08fdba
MS
1478/* Nonzero means that this type is being defined. I.e., the left brace
1479 starting the definition of this type has been seen. */
e2500fed 1480#define TYPE_BEING_DEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->being_defined)
8d08fdba 1481
01628e54
JM
1482/* Nonzero means that this type is either complete or being defined, so we
1483 can do lookup in it. */
1484#define COMPLETE_OR_OPEN_TYPE_P(NODE) \
1485 (COMPLETE_TYPE_P (NODE) || (CLASS_TYPE_P (NODE) && TYPE_BEING_DEFINED (NODE)))
1486
3543e114
NS
1487/* Mark bits for repeated base checks. */
1488#define TYPE_MARKED_P(NODE) TREE_LANG_FLAG_6 (TYPE_CHECK (NODE))
1489
1634705d 1490/* Nonzero if the class NODE has multiple paths to the same (virtual)
3543e114
NS
1491 base object. */
1492#define CLASSTYPE_DIAMOND_SHAPED_P(NODE) \
1493 (LANG_TYPE_CLASS_CHECK(NODE)->diamond_shaped)
1494
1634705d 1495/* Nonzero if the class NODE has multiple instances of the same base
3543e114
NS
1496 type. */
1497#define CLASSTYPE_REPEATED_BASE_P(NODE) \
1498 (LANG_TYPE_CLASS_CHECK(NODE)->repeated_base)
1499
9aad8f83
MA
1500/* The member function with which the vtable will be emitted:
1501 the first noninline non-pure-virtual member function. NULL_TREE
1502 if there is no key function or if this is a class template */
1503#define CLASSTYPE_KEY_METHOD(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->key_method)
1504
61a127b3 1505/* Vector member functions defined in this class. Each element is
03017874
MM
1506 either a FUNCTION_DECL, a TEMPLATE_DECL, or an OVERLOAD. All
1507 functions with the same name end up in the same slot. The first
61a127b3 1508 two elements are for constructors, and destructors, respectively.
5dd236e2
NS
1509 All template conversion operators to innermost template dependent
1510 types are overloaded on the next slot, if they exist. Note, the
1511 names for these functions will not all be the same. The
1512 non-template conversion operators & templated conversions to
1513 non-innermost template types are next, followed by ordinary member
1514 functions. There may be empty entries at the end of the vector.
1515 The conversion operators are unsorted. The ordinary member
1516 functions are sorted, once the class is complete. */
e2500fed 1517#define CLASSTYPE_METHOD_VEC(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->methods)
8d08fdba 1518
7088fca9
KL
1519/* For class templates, this is a TREE_LIST of all member data,
1520 functions, types, and friends in the order of declaration.
1521 The TREE_PURPOSE of each TREE_LIST is NULL_TREE for a friend,
1522 and the RECORD_TYPE for the class template otherwise. */
1523#define CLASSTYPE_DECL_LIST(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->decl_list)
1524
db9b2174
MM
1525/* The slot in the CLASSTYPE_METHOD_VEC where constructors go. */
1526#define CLASSTYPE_CONSTRUCTOR_SLOT 0
1527
1528/* The slot in the CLASSTYPE_METHOD_VEC where destructors go. */
1529#define CLASSTYPE_DESTRUCTOR_SLOT 1
1530
1531/* The first slot in the CLASSTYPE_METHOD_VEC where conversion
1532 operators can appear. */
1533#define CLASSTYPE_FIRST_CONVERSION_SLOT 2
1534
1535/* A FUNCTION_DECL or OVERLOAD for the constructors for NODE. These
1536 are the constructors that take an in-charge parameter. */
1537#define CLASSTYPE_CONSTRUCTORS(NODE) \
aaaa46d2 1538 (VEC_index (tree, CLASSTYPE_METHOD_VEC (NODE), CLASSTYPE_CONSTRUCTOR_SLOT))
db9b2174 1539
52682a1b 1540/* A FUNCTION_DECL for the destructor for NODE. These are the
9f4faeae
MM
1541 destructors that take an in-charge parameter. If
1542 CLASSTYPE_LAZY_DESTRUCTOR is true, then this entry will be NULL
1543 until the destructor is created with lazily_declare_fn. */
db9b2174 1544#define CLASSTYPE_DESTRUCTORS(NODE) \
9f4faeae
MM
1545 (CLASSTYPE_METHOD_VEC (NODE) \
1546 ? VEC_index (tree, CLASSTYPE_METHOD_VEC (NODE), CLASSTYPE_DESTRUCTOR_SLOT) \
1547 : NULL_TREE)
e1cd6e56 1548
5e0c54e5
GDR
1549/* A dictionary of the nested user-defined-types (class-types, or enums)
1550 found within this class. This table includes nested member class
1551 templates. */
1552#define CLASSTYPE_NESTED_UTDS(NODE) \
1553 (LANG_TYPE_CLASS_CHECK (NODE)->nested_udts)
8d08fdba 1554
3ef397c1 1555/* Nonzero if NODE has a primary base class, i.e., a base class with
0811ea8f 1556 which it shares the virtual function table pointer. */
3ef397c1 1557#define CLASSTYPE_HAS_PRIMARY_BASE_P(NODE) \
911a71a7 1558 (CLASSTYPE_PRIMARY_BINFO (NODE) != NULL_TREE)
3ef397c1
MM
1559
1560/* If non-NULL, this is the binfo for the primary base class, i.e.,
1561 the base class which contains the virtual function table pointer
1562 for this class. */
5e19c053 1563#define CLASSTYPE_PRIMARY_BINFO(NODE) \
e2500fed 1564 (LANG_TYPE_CLASS_CHECK (NODE)->primary_base)
3ef397c1 1565
58c42dc2 1566/* A vector of BINFOs for the direct and indirect virtual base classes
c35cce41
MM
1567 that this type uses in a post-order depth-first left-to-right
1568 order. (In other words, these bases appear in the order that they
dbbf88d1 1569 should be initialized.) */
e2500fed 1570#define CLASSTYPE_VBASECLASSES(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->vbases)
23381155 1571
17bbb839
MM
1572/* The type corresponding to NODE when NODE is used as a base class,
1573 i.e., NODE without virtual base classes. */
1574
1575#define CLASSTYPE_AS_BASE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->as_base)
1576
00bfffa4
JM
1577/* True iff NODE is the CLASSTYPE_AS_BASE version of some type. */
1578
1579#define IS_FAKE_BASE_TYPE(NODE) \
1580 (TREE_CODE (NODE) == RECORD_TYPE \
1581 && TYPE_CONTEXT (NODE) && CLASS_TYPE_P (TYPE_CONTEXT (NODE)) \
1582 && CLASSTYPE_AS_BASE (TYPE_CONTEXT (NODE)) == (NODE))
1583
2d926395
MM
1584/* These are the size and alignment of the type without its virtual
1585 base classes, for when we use this type as a base itself. */
17bbb839
MM
1586#define CLASSTYPE_SIZE(NODE) TYPE_SIZE (CLASSTYPE_AS_BASE (NODE))
1587#define CLASSTYPE_SIZE_UNIT(NODE) TYPE_SIZE_UNIT (CLASSTYPE_AS_BASE (NODE))
1588#define CLASSTYPE_ALIGN(NODE) TYPE_ALIGN (CLASSTYPE_AS_BASE (NODE))
1589#define CLASSTYPE_USER_ALIGN(NODE) TYPE_USER_ALIGN (CLASSTYPE_AS_BASE (NODE))
8d08fdba 1590
1b50716d
MM
1591/* The alignment of NODE, without its virtual bases, in bytes. */
1592#define CLASSTYPE_ALIGN_UNIT(NODE) \
1593 (CLASSTYPE_ALIGN (NODE) / BITS_PER_UNIT)
1594
19114537 1595/* True if this a Java interface type, declared with
00a17e31 1596 '__attribute__ ((java_interface))'. */
585b44d3
NS
1597#define TYPE_JAVA_INTERFACE(NODE) \
1598 (LANG_TYPE_CLASS_CHECK (NODE)->java_interface)
60c87482 1599
585b44d3 1600/* A VEC(tree) of virtual functions which cannot be inherited by
8d08fdba
MS
1601 derived classes. When deriving from this type, the derived
1602 class must provide its own definition for each of these functions. */
585b44d3
NS
1603#define CLASSTYPE_PURE_VIRTUALS(NODE) \
1604 (LANG_TYPE_CLASS_CHECK (NODE)->pure_virtuals)
8d08fdba 1605
8d08fdba 1606/* Nonzero means that this type has an X() constructor. */
98e40e83 1607#define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) \
e2500fed 1608 (LANG_TYPE_CLASS_CHECK (NODE)->h.has_default_ctor)
8d08fdba 1609
f4f206f4 1610/* Nonzero means that this type contains a mutable member. */
e2500fed 1611#define CLASSTYPE_HAS_MUTABLE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_mutable)
a7a7710d
NS
1612#define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE))
1613
c32097d8
JM
1614/* Nonzero means that this class type is not POD for the purpose of layout
1615 (as defined in the ABI). This is different from the language's POD. */
1616#define CLASSTYPE_NON_LAYOUT_POD_P(NODE) \
1617 (LANG_TYPE_CLASS_CHECK (NODE)->non_pod_class)
1618
1619/* Nonzero means that this class type is a non-standard-layout class. */
1620#define CLASSTYPE_NON_STD_LAYOUT(NODE) \
1621 (LANG_TYPE_CLASS_CHECK (NODE)->non_std_layout)
52fb2769 1622
94e6e4c4
AO
1623/* Nonzero means that this class contains pod types whose default
1624 initialization is not a zero initialization (namely, pointers to
1625 data members). */
e2500fed
GK
1626#define CLASSTYPE_NON_ZERO_INIT_P(NODE) \
1627 (LANG_TYPE_CLASS_CHECK (NODE)->non_zero_init)
94e6e4c4 1628
58731fd1
MM
1629/* Nonzero if this class is "empty" in the sense of the C++ ABI. */
1630#define CLASSTYPE_EMPTY_P(NODE) \
1631 (LANG_TYPE_CLASS_CHECK (NODE)->empty_p)
1632
f9c528ea
MM
1633/* Nonzero if this class is "nearly empty", i.e., contains only a
1634 virtual function table pointer. */
1635#define CLASSTYPE_NEARLY_EMPTY_P(NODE) \
e2500fed 1636 (LANG_TYPE_CLASS_CHECK (NODE)->nearly_empty_p)
f9c528ea 1637
5ec1192e
MM
1638/* Nonzero if this class contains an empty subobject. */
1639#define CLASSTYPE_CONTAINS_EMPTY_CLASS_P(NODE) \
1640 (LANG_TYPE_CLASS_CHECK (NODE)->contains_empty_class_p)
1641
6a629cac 1642/* A list of class types of which this type is a friend. The
ea4e080b
MM
1643 TREE_VALUE is normally a TYPE, but will be a TEMPLATE_DECL in the
1644 case of a template friend. */
98e40e83 1645#define CLASSTYPE_FRIEND_CLASSES(NODE) \
e2500fed 1646 (LANG_TYPE_CLASS_CHECK (NODE)->friend_classes)
8d08fdba 1647
6a629cac
MM
1648/* A list of the classes which grant friendship to this class. */
1649#define CLASSTYPE_BEFRIENDING_CLASSES(NODE) \
e2500fed 1650 (LANG_TYPE_CLASS_CHECK (NODE)->befriending_classes)
6a629cac 1651
d5f4eddd
JM
1652/* The associated LAMBDA_EXPR that made this class. */
1653#define CLASSTYPE_LAMBDA_EXPR(NODE) \
1654 (LANG_TYPE_CLASS_CHECK (NODE)->lambda_expr)
1655/* The extra mangling scope for this closure type. */
1656#define LAMBDA_TYPE_EXTRA_SCOPE(NODE) \
1657 (LAMBDA_EXPR_EXTRA_SCOPE (CLASSTYPE_LAMBDA_EXPR (NODE)))
1658
8d08fdba 1659/* Say whether this node was declared as a "class" or a "struct". */
98e40e83 1660#define CLASSTYPE_DECLARED_CLASS(NODE) \
e2500fed 1661 (LANG_TYPE_CLASS_CHECK (NODE)->declared_class)
8d08fdba 1662
6eb35968
DE
1663/* Nonzero if this class has const members
1664 which have no specified initialization. */
1665#define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE) \
1666 (TYPE_LANG_SPECIFIC (NODE) \
1667 ? LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init : 0)
1668#define SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE, VALUE) \
1669 (LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init = (VALUE))
1670
1671/* Nonzero if this class has ref members
1672 which have no specified initialization. */
1673#define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) \
1674 (TYPE_LANG_SPECIFIC (NODE) \
1675 ? LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init : 0)
1676#define SET_CLASSTYPE_REF_FIELDS_NEED_INIT(NODE, VALUE) \
1677 (LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init = (VALUE))
8d08fdba
MS
1678
1679/* Nonzero if this class is included from a header file which employs
1680 `#pragma interface', and it is not included in its implementation file. */
98e40e83 1681#define CLASSTYPE_INTERFACE_ONLY(NODE) \
e2500fed 1682 (LANG_TYPE_CLASS_CHECK (NODE)->interface_only)
8d08fdba 1683
97458258
MM
1684/* True if we have already determined whether or not vtables, VTTs,
1685 typeinfo, and other similar per-class data should be emitted in
1686 this translation unit. This flag does not indicate whether or not
1687 these items should be emitted; it only indicates that we know one
1688 way or the other. */
1689#define CLASSTYPE_INTERFACE_KNOWN(NODE) \
e2500fed 1690 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown == 0)
a692ad2e 1691/* The opposite of CLASSTYPE_INTERFACE_KNOWN. */
97458258 1692#define CLASSTYPE_INTERFACE_UNKNOWN(NODE) \
e2500fed 1693 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown)
97458258
MM
1694
1695#define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) \
e2500fed 1696 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = !!(X))
97458258 1697#define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) \
e2500fed 1698 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 1)
97458258 1699#define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) \
e2500fed 1700 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 0)
8d08fdba
MS
1701
1702/* Nonzero if a _DECL node requires us to output debug info for this class. */
98e40e83 1703#define CLASSTYPE_DEBUG_REQUESTED(NODE) \
e2500fed 1704 (LANG_TYPE_CLASS_CHECK (NODE)->debug_requested)
8d08fdba
MS
1705\f
1706/* Additional macros for inheritance information. */
1707
8d08fdba 1708/* Nonzero means that this class is on a path leading to a new vtable. */
809e3e7f 1709#define BINFO_VTABLE_PATH_MARKED(NODE) BINFO_FLAG_1 (NODE)
dbbf88d1
NS
1710
1711/* Nonzero means B (a BINFO) has its own vtable. Any copies will not
9bcb9aae 1712 have this flag set. */
809e3e7f 1713#define BINFO_NEW_VTABLE_MARKED(B) (BINFO_FLAG_2 (B))
23656158 1714
539ed333
NS
1715/* Compare a BINFO_TYPE with another type for equality. For a binfo,
1716 this is functionally equivalent to using same_type_p, but
1717 measurably faster. At least one of the arguments must be a
1718 BINFO_TYPE. The other can be a BINFO_TYPE or a regular type. If
1719 BINFO_TYPE(T) ever stops being the main variant of the class the
1720 binfo is for, this macro must change. */
1721#define SAME_BINFO_TYPE_P(A, B) ((A) == (B))
1722
23656158 1723/* Any subobject that needs a new vtable must have a vptr and must not
9965d119
NS
1724 be a non-virtual primary base (since it would then use the vtable from a
1725 derived class and never become non-primary.) */
dbbf88d1
NS
1726#define SET_BINFO_NEW_VTABLE_MARKED(B) \
1727 (BINFO_NEW_VTABLE_MARKED (B) = 1, \
4094f4d2
NS
1728 gcc_assert (!BINFO_PRIMARY_P (B) || BINFO_VIRTUAL_P (B)), \
1729 gcc_assert (TYPE_VFIELD (BINFO_TYPE (B))))
8d08fdba 1730
dbbf88d1
NS
1731/* Nonzero if this binfo is for a dependent base - one that should not
1732 be searched. */
809e3e7f 1733#define BINFO_DEPENDENT_BASE_P(NODE) BINFO_FLAG_3 (NODE)
dbbf88d1 1734
9965d119
NS
1735/* Nonzero if this binfo has lost its primary base binfo (because that
1736 is a nearly-empty virtual base that has been taken by some other
aba649ba 1737 base in the complete hierarchy. */
809e3e7f 1738#define BINFO_LOST_PRIMARY_P(NODE) BINFO_FLAG_4 (NODE)
db3d8cde 1739
fc6633e0
NS
1740/* Nonzero if this BINFO is a primary base class. */
1741#define BINFO_PRIMARY_P(NODE) BINFO_FLAG_5(NODE)
911a71a7 1742
72c4a2a6
JM
1743/* Used by various search routines. */
1744#define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE)
8d08fdba 1745\f
0871761b
NS
1746/* A VEC(tree_pair_s) of the vcall indices associated with the class
1747 NODE. The PURPOSE of each element is a FUNCTION_DECL for a virtual
1748 function. The VALUE is the index into the virtual table where the
1749 vcall offset for that function is stored, when NODE is a virtual
1750 base. */
548502d3
MM
1751#define CLASSTYPE_VCALL_INDICES(NODE) \
1752 (LANG_TYPE_CLASS_CHECK (NODE)->vcall_indices)
1753
1754/* The various vtables for the class NODE. The primary vtable will be
1755 first, followed by the construction vtables and VTT, if any. */
1756#define CLASSTYPE_VTABLES(NODE) \
1757 (LANG_TYPE_CLASS_CHECK (NODE)->vtables)
1758
a82d6da5
MM
1759/* The std::type_info variable representing this class, or NULL if no
1760 such variable has been created. This field is only set for the
1761 TYPE_MAIN_VARIANT of the class. */
1762#define CLASSTYPE_TYPEINFO_VAR(NODE) \
1763 (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var)
1764
00a17e31 1765/* Accessor macros for the BINFO_VIRTUALS list. */
c0bbf652
MM
1766
1767/* The number of bytes by which to adjust the `this' pointer when
03fc215c 1768 calling this virtual function. Subtract this value from the this
00a17e31 1769 pointer. Always non-NULL, might be constant zero though. */
5e19c053 1770#define BV_DELTA(NODE) (TREE_PURPOSE (NODE))
c0bbf652
MM
1771
1772/* If non-NULL, the vtable index at which to find the vcall offset
03fc215c
NS
1773 when calling this virtual function. Add the value at that vtable
1774 index to the this pointer. */
5e19c053 1775#define BV_VCALL_INDEX(NODE) (TREE_TYPE (NODE))
c0bbf652
MM
1776
1777/* The function to call. */
5e19c053
MM
1778#define BV_FN(NODE) (TREE_VALUE (NODE))
1779
02dea3ff
JM
1780/* Whether or not this entry is for a lost primary virtual base. */
1781#define BV_LOST_PRIMARY(NODE) (TREE_LANG_FLAG_0 (NODE))
8d08fdba 1782\f
8d08fdba 1783/* For FUNCTION_TYPE or METHOD_TYPE, a list of the exceptions that
193306f7 1784 this type can raise. Each TREE_VALUE is a _TYPE. The TREE_VALUE
66a6250f 1785 will be NULL_TREE to indicate a throw specification of `()', or
3a55fb4c
JM
1786 no exceptions allowed. For a noexcept specification, TREE_VALUE
1787 is NULL_TREE and TREE_PURPOSE is the constant-expression. */
95b4aca6 1788#define TYPE_RAISES_EXCEPTIONS(NODE) TYPE_LANG_SLOT_1 (NODE)
a9aedbc2 1789
3a55fb4c
JM
1790/* For FUNCTION_TYPE or METHOD_TYPE, return 1 iff it is declared `throw()'
1791 or noexcept(true). */
1792#define TYPE_NOTHROW_P(NODE) nothrow_spec_p (TYPE_RAISES_EXCEPTIONS (NODE))
7f477e81 1793
9feb3d6a
JM
1794/* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept. This is the
1795 case for things declared noexcept(true) and, with -fnothrow-opt, for
1796 throw() functions. */
3a55fb4c 1797#define TYPE_NOEXCEPT_P(NODE) type_noexcept_p (NODE)
9feb3d6a 1798
e92cc029 1799/* The binding level associated with the namespace. */
3ebc5c52 1800#define NAMESPACE_LEVEL(NODE) \
b97e8a14 1801 (LANG_DECL_NS_CHECK (NODE)->level)
8d08fdba 1802\f
b97e8a14 1803/* Flags shared by all forms of DECL_LANG_SPECIFIC.
6a629cac 1804
b97e8a14
JM
1805 Some of the flags live here only to make lang_decl_min/fn smaller. Do
1806 not make this struct larger than 32 bits; instead, make sel smaller. */
6a629cac 1807
b97e8a14
JM
1808struct GTY(()) lang_decl_base {
1809 unsigned selector : 16; /* Larger than necessary for faster access. */
4684cd27 1810 ENUM_BITFIELD(languages) language : 4;
b97e8a14
JM
1811 unsigned use_template : 2;
1812 unsigned not_really_extern : 1; /* var or fn */
1813 unsigned initialized_in_class : 1; /* var or fn */
1814 unsigned repo_available_p : 1; /* var or fn */
1815 unsigned threadprivate_or_deleted_p : 1; /* var or fn */
1816 unsigned anticipated_p : 1; /* fn or type */
1817 unsigned friend_attr : 1; /* fn or type */
48326487 1818 unsigned template_conv_p : 1; /* var or template */
3146f36f 1819 unsigned odr_used : 1; /* var or fn */
b97e8a14 1820 unsigned u2sel : 1;
3146f36f 1821 /* 1 spare bit */
b97e8a14
JM
1822};
1823
1824/* True for DECL codes which have template info and access. */
1825#define LANG_DECL_HAS_MIN(NODE) \
1826 (TREE_CODE (NODE) == FUNCTION_DECL \
1827 || TREE_CODE (NODE) == FIELD_DECL \
1828 || TREE_CODE (NODE) == VAR_DECL \
1829 || TREE_CODE (NODE) == CONST_DECL \
1830 || TREE_CODE (NODE) == TYPE_DECL \
1831 || TREE_CODE (NODE) == TEMPLATE_DECL \
1832 || TREE_CODE (NODE) == USING_DECL)
1833
1834/* DECL_LANG_SPECIFIC for the above codes. */
1835
1836struct GTY(()) lang_decl_min {
1837 struct lang_decl_base base;
1838
1839 /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is
1840 THUNK_ALIAS.
1841 In a FUNCTION_DECL for which DECL_THUNK_P does not hold,
1842 VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this is
1843 DECL_TEMPLATE_INFO. */
1844 tree template_info;
1845
1846 union lang_decl_u2 {
1847 /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is
1848 THUNK_VIRTUAL_OFFSET.
1849 Otherwise this is DECL_ACCESS. */
1850 tree GTY ((tag ("0"))) access;
1851
1852 /* For VAR_DECL in function, this is DECL_DISCRIMINATOR. */
1853 int GTY ((tag ("1"))) discriminator;
1854 } GTY ((desc ("%0.u.base.u2sel"))) u2;
1855};
1856
1857/* Additional DECL_LANG_SPECIFIC information for functions. */
1858
1859struct GTY(()) lang_decl_fn {
1860 struct lang_decl_min min;
1861
1862 /* In an overloaded operator, this is the value of
1863 DECL_OVERLOADED_OPERATOR_P. */
1864 ENUM_BITFIELD (tree_code) operator_code : 16;
1865
4684cd27
MM
1866 unsigned global_ctor_p : 1;
1867 unsigned global_dtor_p : 1;
8d08fdba 1868 unsigned constructor_attr : 1;
0d9eb3ba 1869 unsigned destructor_attr : 1;
b97e8a14 1870 unsigned assignment_operator_p : 1;
8d08fdba 1871 unsigned static_function : 1;
fee7654e 1872 unsigned pure_virtual : 1;
b97e8a14
JM
1873 unsigned defaulted_p : 1;
1874
454fa7a7 1875 unsigned has_in_charge_parm_p : 1;
5daf7c0a 1876 unsigned has_vtt_parm_p : 1;
b97e8a14 1877 unsigned pending_inline_p : 1;
db5ae43f 1878 unsigned nonconverting : 1;
ea1763b1 1879 unsigned thunk_p : 1;
4977bab6 1880 unsigned this_thunk_p : 1;
d63d5d0c 1881 unsigned hidden_friend_p : 1;
783a452c 1882 /* 1 spare bit. */
8d08fdba 1883
b97e8a14
JM
1884 /* For a non-thunk function decl, this is a tree list of
1885 friendly classes. For a thunk function decl, it is the
1886 thunked to function decl. */
1887 tree befriending_classes;
3ebc5c52 1888
b97e8a14
JM
1889 /* For a non-virtual FUNCTION_DECL, this is
1890 DECL_FRIEND_CONTEXT. For a virtual FUNCTION_DECL for which
1891 DECL_THIS_THUNK_P does not hold, this is DECL_THUNKS. Both
1892 this pointer and result pointer adjusting thunks are
1893 chained here. This pointer thunks to return pointer thunks
1894 will be chained on the return pointer thunk. */
1895 tree context;
af3b4e59 1896
b97e8a14
JM
1897 union lang_decl_u5
1898 {
1899 /* In a non-thunk FUNCTION_DECL or TEMPLATE_DECL, this is
1900 DECL_CLONED_FUNCTION. */
1901 tree GTY ((tag ("0"))) cloned_function;
af3b4e59 1902
b97e8a14
JM
1903 /* In a FUNCTION_DECL for which THUNK_P holds this is the
1904 THUNK_FIXED_OFFSET. */
1905 HOST_WIDE_INT GTY ((tag ("1"))) fixed_offset;
1906 } GTY ((desc ("%1.thunk_p"))) u5;
1907
1908 union lang_decl_u3
1909 {
1910 struct cp_token_cache * GTY ((tag ("1"))) pending_inline_info;
1911 struct language_function * GTY ((tag ("0")))
1912 saved_language_function;
1913 } GTY ((desc ("%1.pending_inline_p"))) u;
1914
1915};
1916
1917/* DECL_LANG_SPECIFIC for namespaces. */
1918
1919struct GTY(()) lang_decl_ns {
1920 struct lang_decl_base base;
1921 struct cp_binding_level *level;
8d08fdba
MS
1922};
1923
ad909c97
JM
1924/* DECL_LANG_SPECIFIC for parameters. */
1925
1926struct GTY(()) lang_decl_parm {
1927 struct lang_decl_base base;
67e18edb 1928 int level;
ad909c97
JM
1929 int index;
1930};
1931
b97e8a14
JM
1932/* DECL_LANG_SPECIFIC for all types. It would be nice to just make this a
1933 union rather than a struct containing a union as its only field, but
1934 tree.h declares it as a struct. */
17211ab5 1935
a9429e29 1936struct GTY((variable_size)) lang_decl {
b97e8a14
JM
1937 union GTY((desc ("%h.base.selector"))) lang_decl_u {
1938 struct lang_decl_base GTY ((default)) base;
1939 struct lang_decl_min GTY((tag ("0"))) min;
1940 struct lang_decl_fn GTY ((tag ("1"))) fn;
1941 struct lang_decl_ns GTY((tag ("2"))) ns;
ad909c97 1942 struct lang_decl_parm GTY((tag ("3"))) parm;
b97e8a14 1943 } u;
e2500fed 1944};
9188c363 1945
b97e8a14
JM
1946/* Looks through a template (if present) to find what it declares. */
1947#define STRIP_TEMPLATE(NODE) \
1948 (TREE_CODE (NODE) == TEMPLATE_DECL ? DECL_TEMPLATE_RESULT (NODE) : NODE)
1949
e2500fed 1950#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
9188c363 1951
b97e8a14
JM
1952#define LANG_DECL_MIN_CHECK(NODE) __extension__ \
1953({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
1954 if (!LANG_DECL_HAS_MIN (NODE)) \
1955 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1956 &lt->u.min; })
1957
1958/* We want to be able to check DECL_CONSTRUCTOR_P and such on a function
1959 template, not just on a FUNCTION_DECL. So when looking for things in
1960 lang_decl_fn, look down through a TEMPLATE_DECL into its result. */
1961#define LANG_DECL_FN_CHECK(NODE) __extension__ \
1962({ struct lang_decl *lt = DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE)); \
1963 if (!DECL_DECLARES_FUNCTION_P (NODE) || lt->u.base.selector != 1) \
1964 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1965 &lt->u.fn; })
1966
1967#define LANG_DECL_NS_CHECK(NODE) __extension__ \
1968({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
1969 if (TREE_CODE (NODE) != NAMESPACE_DECL || lt->u.base.selector != 2) \
1970 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1971 &lt->u.ns; })
1972
ad909c97
JM
1973#define LANG_DECL_PARM_CHECK(NODE) __extension__ \
1974({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
1975 if (TREE_CODE (NODE) != PARM_DECL) \
1976 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1977 &lt->u.parm; })
1978
de94b46c 1979#define LANG_DECL_U2_CHECK(NODE, TF) __extension__ \
e2500fed 1980({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
bfd6b23c 1981 if (!LANG_DECL_HAS_MIN (NODE) || lt->u.base.u2sel != TF) \
e2500fed 1982 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
b97e8a14 1983 &lt->u.min.u2; })
db9b2174 1984
e2500fed
GK
1985#else
1986
b97e8a14
JM
1987#define LANG_DECL_MIN_CHECK(NODE) \
1988 (&DECL_LANG_SPECIFIC (NODE)->u.min)
1989
1990#define LANG_DECL_FN_CHECK(NODE) \
8885e914 1991 (&DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE))->u.fn)
b97e8a14
JM
1992
1993#define LANG_DECL_NS_CHECK(NODE) \
1994 (&DECL_LANG_SPECIFIC (NODE)->u.ns)
1995
ad909c97
JM
1996#define LANG_DECL_PARM_CHECK(NODE) \
1997 (&DECL_LANG_SPECIFIC (NODE)->u.parm)
1998
e2500fed 1999#define LANG_DECL_U2_CHECK(NODE, TF) \
b97e8a14 2000 (&DECL_LANG_SPECIFIC (NODE)->u.min.u2)
e2500fed
GK
2001
2002#endif /* ENABLE_TREE_CHECKING */
8d08fdba 2003
5d2ed28c
MM
2004/* For a FUNCTION_DECL or a VAR_DECL, the language linkage for the
2005 declaration. Some entities (like a member function in a local
2006 class, or a local variable) do not have linkage at all, and this
2007 macro should not be used in those cases.
19114537 2008
5d2ed28c
MM
2009 Implementation note: A FUNCTION_DECL without DECL_LANG_SPECIFIC was
2010 created by language-independent code, and has C linkage. Most
2011 VAR_DECLs have C++ linkage, and do not have DECL_LANG_SPECIFIC, but
2012 we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage. */
0cbd7506
MS
2013#define DECL_LANGUAGE(NODE) \
2014 (DECL_LANG_SPECIFIC (NODE) \
b97e8a14 2015 ? DECL_LANG_SPECIFIC (NODE)->u.base.language \
5d2ed28c
MM
2016 : (TREE_CODE (NODE) == FUNCTION_DECL \
2017 ? lang_c : lang_cplusplus))
2018
2019/* Set the language linkage for NODE to LANGUAGE. */
2020#define SET_DECL_LANGUAGE(NODE, LANGUAGE) \
b97e8a14 2021 (DECL_LANG_SPECIFIC (NODE)->u.base.language = (LANGUAGE))
8d08fdba
MS
2022
2023/* For FUNCTION_DECLs: nonzero means that this function is a constructor. */
98e40e83 2024#define DECL_CONSTRUCTOR_P(NODE) \
b97e8a14 2025 (LANG_DECL_FN_CHECK (NODE)->constructor_attr)
aa45967f 2026
db9b2174
MM
2027/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete
2028 object. */
2029#define DECL_COMPLETE_CONSTRUCTOR_P(NODE) \
bb20cc46 2030 (DECL_CONSTRUCTOR_P (NODE) \
db9b2174
MM
2031 && DECL_NAME (NODE) == complete_ctor_identifier)
2032
2033/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a base
2034 object. */
2035#define DECL_BASE_CONSTRUCTOR_P(NODE) \
2036 (DECL_CONSTRUCTOR_P (NODE) \
2037 && DECL_NAME (NODE) == base_ctor_identifier)
2038
2039/* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the
2040 specialized in-charge constructor or the specialized not-in-charge
2041 constructor. */
2042#define DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P(NODE) \
b97e8a14
JM
2043 (DECL_DECLARES_FUNCTION_P (NODE) && DECL_CONSTRUCTOR_P (NODE) \
2044 && !DECL_CLONED_FUNCTION_P (NODE))
db9b2174 2045
454fa7a7
MM
2046/* Nonzero if NODE (a FUNCTION_DECL) is a copy constructor. */
2047#define DECL_COPY_CONSTRUCTOR_P(NODE) \
271e6f02 2048 (DECL_CONSTRUCTOR_P (NODE) && copy_fn_p (NODE) > 0)
454fa7a7 2049
8af2fec4
RY
2050/* Nonzero if NODE (a FUNCTION_DECL) is a move constructor. */
2051#define DECL_MOVE_CONSTRUCTOR_P(NODE) \
2052 (DECL_CONSTRUCTOR_P (NODE) && move_fn_p (NODE))
2053
1f6e1acc 2054/* Nonzero if NODE is a destructor. */
aa45967f 2055#define DECL_DESTRUCTOR_P(NODE) \
b97e8a14 2056 (LANG_DECL_FN_CHECK (NODE)->destructor_attr)
aa45967f 2057
db9b2174
MM
2058/* Nonzero if NODE (a FUNCTION_DECL) is a destructor, but not the
2059 specialized in-charge constructor, in-charge deleting constructor,
78dcd41a 2060 or the base destructor. */
db9b2174 2061#define DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P(NODE) \
b97e8a14
JM
2062 (DECL_DECLARES_FUNCTION_P (NODE) && DECL_DESTRUCTOR_P (NODE) \
2063 && !DECL_CLONED_FUNCTION_P (NODE))
db9b2174 2064
298d6f60
MM
2065/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete
2066 object. */
2067#define DECL_COMPLETE_DESTRUCTOR_P(NODE) \
bb20cc46 2068 (DECL_DESTRUCTOR_P (NODE) \
298d6f60
MM
2069 && DECL_NAME (NODE) == complete_dtor_identifier)
2070
2071/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a base
2072 object. */
2073#define DECL_BASE_DESTRUCTOR_P(NODE) \
2074 (DECL_DESTRUCTOR_P (NODE) \
2075 && DECL_NAME (NODE) == base_dtor_identifier)
2076
2077/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete
872f37f9 2078 object that deletes the object after it has been destroyed. */
298d6f60 2079#define DECL_DELETING_DESTRUCTOR_P(NODE) \
bb20cc46 2080 (DECL_DESTRUCTOR_P (NODE) \
298d6f60
MM
2081 && DECL_NAME (NODE) == deleting_dtor_identifier)
2082
db9b2174
MM
2083/* Nonzero if NODE (a FUNCTION_DECL) is a cloned constructor or
2084 destructor. */
b97e8a14 2085#define DECL_CLONED_FUNCTION_P(NODE) (!!decl_cloned_function_p (NODE, true))
db9b2174
MM
2086
2087/* If DECL_CLONED_FUNCTION_P holds, this is the function that was
2088 cloned. */
b97e8a14 2089#define DECL_CLONED_FUNCTION(NODE) (*decl_cloned_function_p (NODE, false))
db9b2174 2090
4684cd27
MM
2091/* Perform an action for each clone of FN, if FN is a function with
2092 clones. This macro should be used like:
19114537 2093
4684cd27 2094 FOR_EACH_CLONE (clone, fn)
0cbd7506 2095 { ... }
4684cd27
MM
2096
2097 */
2098#define FOR_EACH_CLONE(CLONE, FN) \
2099 if (TREE_CODE (FN) == FUNCTION_DECL \
2100 && (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (FN) \
2101 || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (FN))) \
910ad8de 2102 for (CLONE = DECL_CHAIN (FN); \
4684cd27 2103 CLONE && DECL_CLONED_FUNCTION_P (CLONE); \
910ad8de 2104 CLONE = DECL_CHAIN (CLONE))
4684cd27 2105
8e4ce833
JJ
2106/* Nonzero if NODE has DECL_DISCRIMINATOR and not DECL_ACCESS. */
2107#define DECL_DISCRIMINATOR_P(NODE) \
2108 (TREE_CODE (NODE) == VAR_DECL \
2109 && DECL_FUNCTION_SCOPE_P (NODE))
2110
2111/* Discriminator for name mangling. */
e2500fed 2112#define DECL_DISCRIMINATOR(NODE) (LANG_DECL_U2_CHECK (NODE, 1)->discriminator)
8e4ce833 2113
364f9c6b
JM
2114/* True iff DECL_DISCRIMINATOR is set for a DECL_DISCRIMINATOR_P decl. */
2115#define DECL_DISCRIMINATOR_SET_P(NODE) \
2116 (DECL_LANG_SPECIFIC (NODE) && DECL_LANG_SPECIFIC (NODE)->u.base.u2sel == 1)
2117
ad909c97
JM
2118/* The index of a user-declared parameter in its function, starting at 1.
2119 All artificial parameters will have index 0. */
2120#define DECL_PARM_INDEX(NODE) \
2121 (LANG_DECL_PARM_CHECK (NODE)->index)
2122
67e18edb
JM
2123/* The level of a user-declared parameter in its function, starting at 1.
2124 A parameter of the function will have level 1; a parameter of the first
2125 nested function declarator (i.e. t in void f (void (*p)(T t))) will have
2126 level 2. */
2127#define DECL_PARM_LEVEL(NODE) \
2128 (LANG_DECL_PARM_CHECK (NODE)->level)
2129
838dfd8a 2130/* Nonzero if the VTT parm has been added to NODE. */
e0fff4b3 2131#define DECL_HAS_VTT_PARM_P(NODE) \
b97e8a14 2132 (LANG_DECL_FN_CHECK (NODE)->has_vtt_parm_p)
3ec6bad3 2133
838dfd8a 2134/* Nonzero if NODE is a FUNCTION_DECL for which a VTT parameter is
3ec6bad3
MM
2135 required. */
2136#define DECL_NEEDS_VTT_PARM_P(NODE) \
5775a06a 2137 (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (NODE)) \
3ec6bad3
MM
2138 && (DECL_BASE_CONSTRUCTOR_P (NODE) \
2139 || DECL_BASE_DESTRUCTOR_P (NODE)))
2140
838dfd8a 2141/* Nonzero if NODE is a user-defined conversion operator. */
421844e7 2142#define DECL_CONV_FN_P(NODE) \
5838eb91 2143 (DECL_NAME (NODE) && IDENTIFIER_TYPENAME_P (DECL_NAME (NODE)))
711734a9 2144
ca90f3e1
MM
2145/* If FN is a conversion operator, the type to which it converts.
2146 Otherwise, NULL_TREE. */
2147#define DECL_CONV_FN_TYPE(FN) \
2148 (DECL_CONV_FN_P (FN) ? TREE_TYPE (DECL_NAME (FN)) : NULL_TREE)
2149
838dfd8a 2150/* Nonzero if NODE, which is a TEMPLATE_DECL, is a template
5dd236e2
NS
2151 conversion operator to a type dependent on the innermost template
2152 args. */
2153#define DECL_TEMPLATE_CONV_FN_P(NODE) \
b97e8a14 2154 (DECL_LANG_SPECIFIC (TEMPLATE_DECL_CHECK (NODE))->u.base.template_conv_p)
5dd236e2 2155
48326487
JM
2156/* Nonzero if NODE, a static data member, was declared in its class as an
2157 array of unknown bound. */
2158#define VAR_HAD_UNKNOWN_BOUND(NODE) \
2159 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE)) \
2160 ? DECL_LANG_SPECIFIC (NODE)->u.base.template_conv_p \
2161 : false)
2162#define SET_VAR_HAD_UNKNOWN_BOUND(NODE) \
2163 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.template_conv_p = true)
2164
596ea4e5
AS
2165/* Set the overloaded operator code for NODE to CODE. */
2166#define SET_OVERLOADED_OPERATOR_CODE(NODE, CODE) \
b97e8a14 2167 (LANG_DECL_FN_CHECK (NODE)->operator_code = (CODE))
596ea4e5
AS
2168
2169/* If NODE is an overloaded operator, then this returns the TREE_CODE
34cd5ae7 2170 associated with the overloaded operator.
596ea4e5
AS
2171 DECL_ASSIGNMENT_OPERATOR_P must also be checked to determine
2172 whether or not NODE is an assignment operator. If NODE is not an
2173 overloaded operator, ERROR_MARK is returned. Since the numerical
2174 value of ERROR_MARK is zero, this macro can be used as a predicate
2175 to test whether or not NODE is an overloaded operator. */
bb20cc46 2176#define DECL_OVERLOADED_OPERATOR_P(NODE) \
98e40e83 2177 (IDENTIFIER_OPNAME_P (DECL_NAME (NODE)) \
b97e8a14 2178 ? LANG_DECL_FN_CHECK (NODE)->operator_code : ERROR_MARK)
596ea4e5 2179
25614952 2180/* Nonzero if NODE is an assignment operator (including += and such). */
596ea4e5 2181#define DECL_ASSIGNMENT_OPERATOR_P(NODE) \
b97e8a14 2182 (LANG_DECL_FN_CHECK (NODE)->assignment_operator_p)
f71f87f9 2183
454fa7a7
MM
2184/* For FUNCTION_DECLs: nonzero means that this function is a
2185 constructor or a destructor with an extra in-charge parameter to
2186 control whether or not virtual bases are constructed. */
2187#define DECL_HAS_IN_CHARGE_PARM_P(NODE) \
b97e8a14 2188 (LANG_DECL_FN_CHECK (NODE)->has_in_charge_parm_p)
8d08fdba 2189
88a7beb7
MM
2190/* Nonzero if DECL is a declaration of __builtin_constant_p. */
2191#define DECL_IS_BUILTIN_CONSTANT_P(NODE) \
2192 (TREE_CODE (NODE) == FUNCTION_DECL \
2193 && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL \
2194 && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P)
2195
8d08fdba
MS
2196/* Nonzero for _DECL means that this decl appears in (or will appear
2197 in) as a member in a RECORD_TYPE or UNION_TYPE node. It is also for
2198 detecting circularity in case members are multiply defined. In the
2199 case of a VAR_DECL, it is also used to determine how program storage
2200 should be allocated. */
98e40e83 2201#define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3 (NODE))
8d08fdba 2202
6c06fbce
MM
2203/* Nonzero for a VAR_DECL means that the variable's initialization (if
2204 any) has been processed. (In general, DECL_INITIALIZED_P is
2205 !DECL_EXTERN, but static data members may be initialized even if
2206 not defined.) */
17bbb839
MM
2207#define DECL_INITIALIZED_P(NODE) \
2208 (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE)))
2209
6c06fbce
MM
2210/* Nonzero for a VAR_DECL iff an explicit initializer was provided. */
2211#define DECL_NONTRIVIALLY_INITIALIZED_P(NODE) \
2212 (TREE_LANG_FLAG_3 (VAR_DECL_CHECK (NODE)))
2213
39703eb9
MM
2214/* Nonzero for a VAR_DECL that was initialized with a
2215 constant-expression. */
2216#define DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P(NODE) \
2217 (TREE_LANG_FLAG_2 (VAR_DECL_CHECK (NODE)))
2218
3febd123 2219/* Nonzero if the DECL was initialized in the class definition itself,
649fc72d 2220 rather than outside the class. This is used for both static member
39a13be5 2221 VAR_DECLS, and FUNCTION_DECLS that are defined in the class. */
3febd123 2222#define DECL_INITIALIZED_IN_CLASS_P(DECL) \
b97e8a14
JM
2223 (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \
2224 ->u.base.initialized_in_class)
6ba89f8e 2225
3146f36f
JM
2226/* Nonzero if the DECL is used in the sense of 3.2 [basic.def.odr].
2227 Only available for decls with DECL_LANG_SPECIFIC. */
2228#define DECL_ODR_USED(DECL) \
2229 (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \
2230 ->u.base.odr_used)
2231
d63d5d0c
ILT
2232/* Nonzero for DECL means that this decl is just a friend declaration,
2233 and should not be added to the list of members for this class. */
b97e8a14 2234#define DECL_FRIEND_P(NODE) (DECL_LANG_SPECIFIC (NODE)->u.base.friend_attr)
8d08fdba 2235
6a629cac
MM
2236/* A TREE_LIST of the types which have befriended this FUNCTION_DECL. */
2237#define DECL_BEFRIENDING_CLASSES(NODE) \
b97e8a14 2238 (LANG_DECL_FN_CHECK (NODE)->befriending_classes)
6a629cac 2239
8d08fdba
MS
2240/* Nonzero for FUNCTION_DECL means that this decl is a static
2241 member function. */
98e40e83 2242#define DECL_STATIC_FUNCTION_P(NODE) \
b97e8a14 2243 (LANG_DECL_FN_CHECK (NODE)->static_function)
8d08fdba 2244
8857f91e
MM
2245/* Nonzero for FUNCTION_DECL means that this decl is a non-static
2246 member function. */
2247#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \
2248 (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)
2249
8926095f
MS
2250/* Nonzero for FUNCTION_DECL means that this decl is a member function
2251 (static or non-static). */
2252#define DECL_FUNCTION_MEMBER_P(NODE) \
b97e8a14 2253 (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE))
8926095f 2254
8d08fdba
MS
2255/* Nonzero for FUNCTION_DECL means that this member function
2256 has `this' as const X *const. */
0d9eb3ba
MM
2257#define DECL_CONST_MEMFUNC_P(NODE) \
2258 (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) \
bb20cc46 2259 && CP_TYPE_CONST_P (TREE_TYPE (TREE_VALUE \
0d9eb3ba 2260 (TYPE_ARG_TYPES (TREE_TYPE (NODE))))))
8d08fdba 2261
1f6e1acc
AS
2262/* Nonzero for FUNCTION_DECL means that this member function
2263 has `this' as volatile X *const. */
2264#define DECL_VOLATILE_MEMFUNC_P(NODE) \
2265 (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) \
2266 && CP_TYPE_VOLATILE_P (TREE_TYPE (TREE_VALUE \
2267 (TYPE_ARG_TYPES (TREE_TYPE (NODE))))))
2268
d6479fe7 2269/* Nonzero for a DECL means that this member is a non-static member. */
bb20cc46 2270#define DECL_NONSTATIC_MEMBER_P(NODE) \
8df7b2b6 2271 (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) \
d6479fe7
MM
2272 || TREE_CODE (NODE) == FIELD_DECL)
2273
8d08fdba
MS
2274/* Nonzero for _DECL means that this member object type
2275 is mutable. */
721c3b42 2276#define DECL_MUTABLE_P(NODE) (DECL_LANG_FLAG_0 (NODE))
8d08fdba 2277
e57d93c6
JM
2278/* Nonzero for _DECL means that this constructor or conversion function is
2279 non-converting. */
98e40e83 2280#define DECL_NONCONVERTING_P(NODE) \
b97e8a14 2281 (LANG_DECL_FN_CHECK (NODE)->nonconverting)
db5ae43f 2282
fee7654e
MM
2283/* Nonzero for FUNCTION_DECL means that this member function is a pure
2284 virtual function. */
98e40e83 2285#define DECL_PURE_VIRTUAL_P(NODE) \
b97e8a14 2286 (LANG_DECL_FN_CHECK (NODE)->pure_virtual)
8d08fdba 2287
58ec3cc5
MM
2288/* True (in a FUNCTION_DECL) if NODE is a virtual function that is an
2289 invalid overrider for a function from a base class. Once we have
2290 complained about an invalid overrider we avoid complaining about it
2291 again. */
2292#define DECL_INVALID_OVERRIDER_P(NODE) \
2293 (DECL_LANG_FLAG_4 (NODE))
2294
b5da71d4
VV
2295/* True (in a FUNCTION_DECL) if NODE is a function declared with
2296 an override virt-specifier */
2297#define DECL_OVERRIDE_P(NODE) (TREE_LANG_FLAG_0 (NODE))
2298
2299/* True (in a FUNCTION_DECL) if NODE is a function declared with
2300 a final virt-specifier */
2301#define DECL_FINAL_P(NODE) (TREE_LANG_FLAG_1 (NODE))
2302
4977bab6 2303/* The thunks associated with NODE, a FUNCTION_DECL. */
bb5e8a7f 2304#define DECL_THUNKS(NODE) \
b97e8a14 2305 (LANG_DECL_FN_CHECK (NODE)->context)
bb5e8a7f 2306
eb68cb58
MM
2307/* Nonzero if NODE is a thunk, rather than an ordinary function. */
2308#define DECL_THUNK_P(NODE) \
2309 (TREE_CODE (NODE) == FUNCTION_DECL \
ea1763b1 2310 && DECL_LANG_SPECIFIC (NODE) \
b97e8a14 2311 && LANG_DECL_FN_CHECK (NODE)->thunk_p)
c8094d83 2312
ea1763b1
NS
2313/* Set DECL_THUNK_P for node. */
2314#define SET_DECL_THUNK_P(NODE, THIS_ADJUSTING) \
b97e8a14
JM
2315 (LANG_DECL_FN_CHECK (NODE)->thunk_p = 1, \
2316 LANG_DECL_FN_CHECK (NODE)->this_thunk_p = (THIS_ADJUSTING))
eb68cb58 2317
4977bab6
ZW
2318/* Nonzero if NODE is a this pointer adjusting thunk. */
2319#define DECL_THIS_THUNK_P(NODE) \
b97e8a14 2320 (DECL_THUNK_P (NODE) && LANG_DECL_FN_CHECK (NODE)->this_thunk_p)
4977bab6
ZW
2321
2322/* Nonzero if NODE is a result pointer adjusting thunk. */
2323#define DECL_RESULT_THUNK_P(NODE) \
b97e8a14 2324 (DECL_THUNK_P (NODE) && !LANG_DECL_FN_CHECK (NODE)->this_thunk_p)
4977bab6 2325
eb68cb58
MM
2326/* Nonzero if NODE is a FUNCTION_DECL, but not a thunk. */
2327#define DECL_NON_THUNK_FUNCTION_P(NODE) \
2328 (TREE_CODE (NODE) == FUNCTION_DECL && !DECL_THUNK_P (NODE))
2329
2330/* Nonzero if NODE is `extern "C"'. */
2331#define DECL_EXTERN_C_P(NODE) \
2332 (DECL_LANGUAGE (NODE) == lang_c)
2333
2334/* Nonzero if NODE is an `extern "C"' function. */
2335#define DECL_EXTERN_C_FUNCTION_P(NODE) \
2336 (DECL_NON_THUNK_FUNCTION_P (NODE) && DECL_EXTERN_C_P (NODE))
2337
4684cd27
MM
2338/* True iff DECL is an entity with vague linkage whose definition is
2339 available in this translation unit. */
2340#define DECL_REPO_AVAILABLE_P(NODE) \
b97e8a14 2341 (DECL_LANG_SPECIFIC (NODE)->u.base.repo_available_p)
4684cd27 2342
7ecbca9d
GDR
2343/* True if DECL is declared 'constexpr'. */
2344#define DECL_DECLARED_CONSTEXPR_P(DECL) \
3b49d762 2345 DECL_LANG_FLAG_8 (VAR_OR_FUNCTION_DECL_CHECK (STRIP_TEMPLATE (DECL)))
7ecbca9d 2346
f9817201
MM
2347/* Nonzero if this DECL is the __PRETTY_FUNCTION__ variable in a
2348 template function. */
2349#define DECL_PRETTY_FUNCTION_P(NODE) \
39703eb9 2350 (TREE_LANG_FLAG_0 (VAR_DECL_CHECK (NODE)))
f9817201 2351
8926095f 2352/* The _TYPE context in which this _DECL appears. This field holds the
00a17e31 2353 class where a virtual function instance is actually defined. */
4f1c5b7d
MM
2354#define DECL_CLASS_CONTEXT(NODE) \
2355 (DECL_CLASS_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : NULL_TREE)
2356
2357/* For a non-member friend function, the class (if any) in which this
2358 friend was defined. For example, given:
bb20cc46 2359
4f1c5b7d
MM
2360 struct S { friend void f (); };
2361
2362 the DECL_FRIEND_CONTEXT for `f' will be `S'. */
2363#define DECL_FRIEND_CONTEXT(NODE) \
b97e8a14
JM
2364 ((DECL_DECLARES_FUNCTION_P (NODE) \
2365 && DECL_FRIEND_P (NODE) && !DECL_FUNCTION_MEMBER_P (NODE)) \
2366 ? LANG_DECL_FN_CHECK (NODE)->context \
4f1c5b7d
MM
2367 : NULL_TREE)
2368
2369/* Set the DECL_FRIEND_CONTEXT for NODE to CONTEXT. */
2370#define SET_DECL_FRIEND_CONTEXT(NODE, CONTEXT) \
b97e8a14 2371 (LANG_DECL_FN_CHECK (NODE)->context = (CONTEXT))
cb0dbb9a 2372
cb0dbb9a 2373#define CP_DECL_CONTEXT(NODE) \
725214ac 2374 (!DECL_FILE_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : global_namespace)
0ed5edac 2375#define CP_TYPE_CONTEXT(NODE) \
725214ac
RG
2376 (!TYPE_FILE_SCOPE_P (NODE) ? TYPE_CONTEXT (NODE) : global_namespace)
2377#define FROB_CONTEXT(NODE) \
2378 ((NODE) == global_namespace ? DECL_CONTEXT (NODE) : (NODE))
8d08fdba 2379
42c7b807 2380/* 1 iff NODE has namespace scope, including the global namespace. */
4f71f630
MM
2381#define DECL_NAMESPACE_SCOPE_P(NODE) \
2382 (!DECL_TEMPLATE_PARM_P (NODE) \
2383 && TREE_CODE (CP_DECL_CONTEXT (NODE)) == NAMESPACE_DECL)
42c7b807 2384
ecc607fc
JM
2385#define TYPE_NAMESPACE_SCOPE_P(NODE) \
2386 (TREE_CODE (CP_TYPE_CONTEXT (NODE)) == NAMESPACE_DECL)
2387
20c202f3
DS
2388#define NAMESPACE_SCOPE_P(NODE) \
2389 ((DECL_P (NODE) && DECL_NAMESPACE_SCOPE_P (NODE)) \
2390 || (TYPE_P (NODE) && TYPE_NAMESPACE_SCOPE_P (NODE)))
2391
42c7b807 2392/* 1 iff NODE is a class member. */
6eb3bb27 2393#define DECL_CLASS_SCOPE_P(NODE) \
4f1c5b7d 2394 (DECL_CONTEXT (NODE) && TYPE_P (DECL_CONTEXT (NODE)))
42c7b807 2395
0ed5edac
JM
2396#define TYPE_CLASS_SCOPE_P(NODE) \
2397 (TYPE_CONTEXT (NODE) && TYPE_P (TYPE_CONTEXT (NODE)))
2398
2642b9bf
JM
2399/* 1 iff NODE is function-local. */
2400#define DECL_FUNCTION_SCOPE_P(NODE) \
2401 (DECL_CONTEXT (NODE) \
2402 && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL)
1f6e1acc 2403
3930dbe9
JM
2404#define TYPE_FUNCTION_SCOPE_P(NODE) \
2405 (TYPE_CONTEXT (NODE) && TREE_CODE (TYPE_CONTEXT (NODE)) == FUNCTION_DECL)
2406
4684cd27
MM
2407/* 1 iff VAR_DECL node NODE is a type-info decl. This flag is set for
2408 both the primary typeinfo object and the associated NTBS name. */
2409#define DECL_TINFO_P(NODE) TREE_LANG_FLAG_4 (VAR_DECL_CHECK (NODE))
2410
d35543c0
JH
2411/* 1 iff VAR_DECL node NODE is virtual table or VTT. */
2412#define DECL_VTABLE_OR_VTT_P(NODE) TREE_LANG_FLAG_5 (VAR_DECL_CHECK (NODE))
2413
505970fc
MM
2414/* Returns 1 iff VAR_DECL is a construction virtual table.
2415 DECL_VTABLE_OR_VTT_P will be true in this case and must be checked
2416 before using this macro. */
2417#define DECL_CONSTRUCTION_VTABLE_P(NODE) \
2418 TREE_LANG_FLAG_6 (VAR_DECL_CHECK (NODE))
2419
881c6935
JM
2420/* 1 iff NODE is function-local, but for types. */
2421#define LOCAL_CLASS_P(NODE) \
495d26d6 2422 (decl_function_context (TYPE_MAIN_DECL (NODE)) != NULL_TREE)
881c6935 2423
2c73f9f5 2424/* For a NAMESPACE_DECL: the list of using namespace directives
30394414 2425 The PURPOSE is the used namespace, the value is the namespace
00a17e31 2426 that is the common ancestor. */
da8a66fc 2427#define DECL_NAMESPACE_USING(NODE) DECL_VINDEX (NAMESPACE_DECL_CHECK (NODE))
30394414
JM
2428
2429/* In a NAMESPACE_DECL, the DECL_INITIAL is used to record all users
00a17e31 2430 of a namespace, to record the transitive closure of using namespace. */
da8a66fc 2431#define DECL_NAMESPACE_USERS(NODE) DECL_INITIAL (NAMESPACE_DECL_CHECK (NODE))
30394414 2432
86098eb8
JM
2433/* In a NAMESPACE_DECL, the list of namespaces which have associated
2434 themselves with this one. */
2435#define DECL_NAMESPACE_ASSOCIATIONS(NODE) \
820cc88f 2436 (NAMESPACE_DECL_CHECK (NODE)->decl_non_common.saved_tree)
86098eb8 2437
3e3f722c
ML
2438/* In a NAMESPACE_DECL, points to the original namespace if this is
2439 a namespace alias. */
da8a66fc
ML
2440#define DECL_NAMESPACE_ALIAS(NODE) \
2441 DECL_ABSTRACT_ORIGIN (NAMESPACE_DECL_CHECK (NODE))
3e3f722c
ML
2442#define ORIGINAL_NAMESPACE(NODE) \
2443 (DECL_NAMESPACE_ALIAS (NODE) ? DECL_NAMESPACE_ALIAS (NODE) : (NODE))
2444
838dfd8a 2445/* Nonzero if NODE is the std namespace. */
1f6e1acc
AS
2446#define DECL_NAMESPACE_STD_P(NODE) \
2447 (TREE_CODE (NODE) == NAMESPACE_DECL \
2448 && CP_DECL_CONTEXT (NODE) == global_namespace \
2449 && DECL_NAME (NODE) == std_identifier)
2450
9df2c88c 2451/* In a TREE_LIST concatenating using directives, indicate indirect
30394414 2452 directives */
07beea0d 2453#define TREE_INDIRECT_USING(NODE) (TREE_LIST_CHECK (NODE)->base.lang_flag_0)
8d08fdba 2454
a7f6bc8c
JM
2455/* In a TREE_LIST in an attribute list, indicates that the attribute
2456 must be applied at instantiation time. */
2457#define ATTR_IS_DEPENDENT(NODE) (TREE_LIST_CHECK (NODE)->base.lang_flag_0)
2458
820cc88f
DB
2459extern tree decl_shadowed_for_var_lookup (tree);
2460extern void decl_shadowed_for_var_insert (tree, tree);
2461
98ed9dae
NS
2462/* Non zero if this is a using decl for a dependent scope. */
2463#define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE))
2464
2465/* The scope named in a using decl. */
2466#define USING_DECL_SCOPE(NODE) TREE_TYPE (USING_DECL_CHECK (NODE))
2467
2468/* The decls named by a using decl. */
2469#define USING_DECL_DECLS(NODE) DECL_INITIAL (USING_DECL_CHECK (NODE))
2470
820cc88f
DB
2471/* In a VAR_DECL, true if we have a shadowed local variable
2472 in the shadowed var table for this VAR_DECL. */
2473#define DECL_HAS_SHADOWED_FOR_VAR_P(NODE) \
2474 (VAR_DECL_CHECK (NODE)->decl_with_vis.shadowed_for_var_p)
2475
d2ad151f 2476/* In a VAR_DECL for a variable declared in a for statement,
e92cc029 2477 this is the shadowed (local) variable. */
820cc88f
DB
2478#define DECL_SHADOWED_FOR_VAR(NODE) \
2479 (DECL_HAS_SHADOWED_FOR_VAR_P(NODE) ? decl_shadowed_for_var_lookup (NODE) : NULL)
2480
2481#define SET_DECL_SHADOWED_FOR_VAR(NODE, VAL) \
2482 (decl_shadowed_for_var_insert (NODE, VAL))
d2ad151f 2483
59026e79
MM
2484/* In a FUNCTION_DECL, this is nonzero if this function was defined in
2485 the class definition. We have saved away the text of the function,
2486 but have not yet processed it. */
2487#define DECL_PENDING_INLINE_P(NODE) \
b97e8a14 2488 (LANG_DECL_FN_CHECK (NODE)->pending_inline_p)
bb20cc46 2489
59026e79
MM
2490/* If DECL_PENDING_INLINE_P holds, this is the saved text of the
2491 function. */
2492#define DECL_PENDING_INLINE_INFO(NODE) \
b97e8a14 2493 (LANG_DECL_FN_CHECK (NODE)->u.pending_inline_info)
f90cdf34 2494
b97e8a14 2495/* For a class type: if this structure has many fields, we'll sort them
00a17e31 2496 and put them into a TREE_VEC. */
b97e8a14
JM
2497#define CLASSTYPE_SORTED_FIELDS(NODE) \
2498 (LANG_TYPE_CLASS_CHECK (NODE)->sorted_fields)
8d08fdba 2499
4d0839ff 2500/* If non-NULL for a VAR_DECL, FUNCTION_DECL, TYPE_DECL or
4e95268d 2501 TEMPLATE_DECL, the entity is either a template specialization (if
3b426391 2502 DECL_USE_TEMPLATE is nonzero) or the abstract instance of the
4e95268d
MM
2503 template itself.
2504
2505 In either case, DECL_TEMPLATE_INFO is a TREE_LIST, whose
2506 TREE_PURPOSE is the TEMPLATE_DECL of which this entity is a
2507 specialization or abstract instance. The TREE_VALUE is the
2508 template arguments used to specialize the template.
2509
4d0839ff
MM
2510 Consider:
2511
2512 template <typename T> struct S { friend void f(T) {} };
2513
2514 In this case, S<int>::f is, from the point of view of the compiler,
2515 an instantiation of a template -- but, from the point of view of
2516 the language, each instantiation of S results in a wholly unrelated
4e95268d
MM
2517 global function f. In this case, DECL_TEMPLATE_INFO for S<int>::f
2518 will be non-NULL, but DECL_USE_TEMPLATE will be zero. */
3ebc5c52 2519#define DECL_TEMPLATE_INFO(NODE) \
98e40e83 2520 (DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \
b97e8a14 2521 ->u.min.template_info)
ed44da02 2522
555551c2
MM
2523/* For a VAR_DECL, indicates that the variable is actually a
2524 non-static data member of anonymous union that has been promoted to
2525 variable status. */
2526#define DECL_ANON_UNION_VAR_P(NODE) \
772f8889
MM
2527 (DECL_LANG_FLAG_4 (VAR_DECL_CHECK (NODE)))
2528
ed44da02 2529/* Template information for a RECORD_TYPE or UNION_TYPE. */
da8a66fc 2530#define CLASSTYPE_TEMPLATE_INFO(NODE) \
95b4aca6 2531 (LANG_TYPE_CLASS_CHECK (RECORD_OR_UNION_CHECK (NODE))->template_info)
ed44da02
MM
2532
2533/* Template information for an ENUMERAL_TYPE. Although an enumeration may
2534 not be a primary template, it may be declared within the scope of a
2535 primary template and the enumeration constants may depend on
2536 non-type template parameters. */
95b4aca6
NS
2537#define ENUM_TEMPLATE_INFO(NODE) \
2538 (TYPE_LANG_SLOT_1 (ENUMERAL_TYPE_CHECK (NODE)))
ed44da02 2539
11e74ea6
KL
2540/* Template information for a template template parameter. */
2541#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) \
e2500fed 2542 (LANG_TYPE_CLASS_CHECK (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK (NODE)) \
11e74ea6 2543 ->template_info)
7ddedda4 2544
ed44da02 2545/* Template information for an ENUMERAL_, RECORD_, or UNION_TYPE. */
7ddedda4
MM
2546#define TYPE_TEMPLATE_INFO(NODE) \
2547 (TREE_CODE (NODE) == ENUMERAL_TYPE \
9076e292 2548 ? ENUM_TEMPLATE_INFO (NODE) : \
a1281f45 2549 (TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM \
9076e292
JM
2550 ? TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (NODE) : \
2551 (TYPE_LANG_SPECIFIC (NODE) \
2552 ? CLASSTYPE_TEMPLATE_INFO (NODE) \
2553 : NULL_TREE)))
ed44da02
MM
2554
2555/* Set the template information for an ENUMERAL_, RECORD_, or
2556 UNION_TYPE to VAL. */
bb20cc46
AJ
2557#define SET_TYPE_TEMPLATE_INFO(NODE, VAL) \
2558 (TREE_CODE (NODE) == ENUMERAL_TYPE \
98e40e83
GS
2559 ? (ENUM_TEMPLATE_INFO (NODE) = (VAL)) \
2560 : (CLASSTYPE_TEMPLATE_INFO (NODE) = (VAL)))
ed44da02 2561
aa373032
DS
2562#define TI_TEMPLATE(NODE) TREE_TYPE (TEMPLATE_INFO_CHECK (NODE))
2563#define TI_ARGS(NODE) TREE_CHAIN (TEMPLATE_INFO_CHECK (NODE))
824b9a4c 2564#define TI_PENDING_TEMPLATE_FLAG(NODE) TREE_LANG_FLAG_1 (NODE)
1a048f82
DS
2565/* For a given TREE_VEC containing a template argument list,
2566 this property contains the number of arguments that are not
2567 defaulted. */
2568#define NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) TREE_CHAIN (TREE_VEC_CHECK (NODE))
2569/* Below are the setter and getter of the NON_DEFAULT_TEMPLATE_ARGS_COUNT
2570 property. */
2571#define SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE, INT_VALUE) \
2572 NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) = build_int_cst (NULL_TREE, INT_VALUE)
2573#ifdef ENABLE_CHECKING
2574#define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \
2575 int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE))
2576#else
2577#define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \
2578 NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE) \
2579 ? int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE)) \
2580 : TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (NODE))
2581#endif
2eb25c98
DS
2582/* The list of typedefs - used in the template - that need
2583 access checking at template instantiation time. */
aa373032
DS
2584#define TI_TYPEDEFS_NEEDING_ACCESS_CHECKING(NODE) \
2585 ((struct tree_template_info*)TEMPLATE_INFO_CHECK \
2586 (NODE))->typedefs_needing_access_checking
ed44da02 2587
b5ac18ea
MM
2588/* We use TREE_VECs to hold template arguments. If there is only one
2589 level of template arguments, then the TREE_VEC contains the
2590 arguments directly. If there is more than one level of template
2591 arguments, then each entry in the TREE_VEC is itself a TREE_VEC,
2592 containing the template arguments for a single level. The first
2593 entry in the outer TREE_VEC is the outermost level of template
bb20cc46 2594 parameters; the last is the innermost.
b5ac18ea
MM
2595
2596 It is incorrect to ever form a template argument vector containing
2597 only one level of arguments, but which is a TREE_VEC containing as
1a048f82
DS
2598 its only entry the TREE_VEC for that level.
2599
2600 For each TREE_VEC containing the template arguments for a single
2601 level, it's possible to get or set the number of non defaulted
2602 template arguments by using the accessor macros
2603 GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT or
2604 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT. */
b5ac18ea 2605
838dfd8a 2606/* Nonzero if the template arguments is actually a vector of vectors,
b5ac18ea 2607 rather than just a vector. */
da1512ad
PC
2608#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \
2609 (NODE && TREE_VEC_LENGTH (NODE) && TREE_VEC_ELT (NODE, 0) \
b5ac18ea
MM
2610 && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC)
2611
2612/* The depth of a template argument vector. When called directly by
2613 the parser, we use a TREE_LIST rather than a TREE_VEC to represent
2614 template arguments. In fact, we may even see NULL_TREE if there
2615 are no template arguments. In both of those cases, there is only
2616 one level of template arguments. */
2617#define TMPL_ARGS_DEPTH(NODE) \
2618 (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (NODE) ? TREE_VEC_LENGTH (NODE) : 1)
2619
27631dae 2620/* The LEVELth level of the template ARGS. The outermost level of
f9a7ae04 2621 args is level 1, not level 0. */
b5ac18ea 2622#define TMPL_ARGS_LEVEL(ARGS, LEVEL) \
bb20cc46 2623 (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (ARGS) \
98e40e83 2624 ? TREE_VEC_ELT (ARGS, (LEVEL) - 1) : (ARGS))
b5ac18ea
MM
2625
2626/* Set the LEVELth level of the template ARGS to VAL. This macro does
2627 not work with single-level argument vectors. */
2628#define SET_TMPL_ARGS_LEVEL(ARGS, LEVEL, VAL) \
98e40e83 2629 (TREE_VEC_ELT (ARGS, (LEVEL) - 1) = (VAL))
b5ac18ea
MM
2630
2631/* Accesses the IDXth parameter in the LEVELth level of the ARGS. */
2632#define TMPL_ARG(ARGS, LEVEL, IDX) \
2633 (TREE_VEC_ELT (TMPL_ARGS_LEVEL (ARGS, LEVEL), IDX))
2634
b5ac18ea
MM
2635/* Given a single level of template arguments in NODE, return the
2636 number of arguments. */
bb20cc46 2637#define NUM_TMPL_ARGS(NODE) \
bf12d54d 2638 (TREE_VEC_LENGTH (NODE))
b5ac18ea 2639
f9a7ae04
MM
2640/* Returns the innermost level of template arguments in ARGS. */
2641#define INNERMOST_TEMPLATE_ARGS(NODE) \
2642 (get_innermost_template_args ((NODE), 1))
2643
b5ac18ea
MM
2644/* The number of levels of template parameters given by NODE. */
2645#define TMPL_PARMS_DEPTH(NODE) \
ad6b1795 2646 ((HOST_WIDE_INT) TREE_INT_CST_LOW (TREE_PURPOSE (NODE)))
b5ac18ea 2647
36a117a5
MM
2648/* The TEMPLATE_DECL instantiated or specialized by NODE. This
2649 TEMPLATE_DECL will be the immediate parent, not the most general
2650 template. For example, in:
2651
2652 template <class T> struct S { template <class U> void f(U); }
2653
2654 the FUNCTION_DECL for S<int>::f<double> will have, as its
bb20cc46 2655 DECL_TI_TEMPLATE, `template <class U> S<int>::f<U>'.
36a117a5
MM
2656
2657 As a special case, for a member friend template of a template
10b1d5e7
MM
2658 class, this value will not be a TEMPLATE_DECL, but rather an
2659 IDENTIFIER_NODE or OVERLOAD indicating the name of the template and
2660 any explicit template arguments provided. For example, in:
36a117a5
MM
2661
2662 template <class T> struct S { friend void f<int>(int, double); }
2663
10b1d5e7 2664 the DECL_TI_TEMPLATE will be an IDENTIFIER_NODE for `f' and the
bb20cc46 2665 DECL_TI_ARGS will be {int}. */
5566b478 2666#define DECL_TI_TEMPLATE(NODE) TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE))
ed44da02 2667
36a117a5
MM
2668/* The template arguments used to obtain this decl from the most
2669 general form of DECL_TI_TEMPLATE. For the example given for
2670 DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}. These
2671 are always the full set of arguments required to instantiate this
2672 declaration from the most general template specialized here. */
0cbd7506 2673#define DECL_TI_ARGS(NODE) TI_ARGS (DECL_TEMPLATE_INFO (NODE))
4e95268d
MM
2674
2675/* The TEMPLATE_DECL associated with NODE, a class type. Even if NODE
2676 will be generated from a partial specialization, the TEMPLATE_DECL
2677 referred to here will be the original template. For example,
2678 given:
2679
2680 template <typename T> struct S {};
2681 template <typename T> struct S<T*> {};
2682
2683 the CLASSTPYE_TI_TEMPLATE for S<int*> will be S, not the S<T*>. */
5566b478
MS
2684#define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE))
2685#define CLASSTYPE_TI_ARGS(NODE) TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE))
ed44da02 2686
ca099ac8 2687/* For a template instantiation TYPE, returns the TYPE corresponding
353b4fc0 2688 to the primary template. Otherwise returns TYPE itself. */
b54a07e8
NS
2689#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \
2690 ((CLASSTYPE_USE_TEMPLATE ((TYPE)) \
2691 && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE))) \
2692 ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \
2693 (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \
353b4fc0 2694 : (TYPE))
ca099ac8 2695
4e95268d 2696/* Like CLASS_TI_TEMPLATE, but also works for ENUMERAL_TYPEs. */
ed44da02
MM
2697#define TYPE_TI_TEMPLATE(NODE) \
2698 (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE)))
2699
59026e79 2700/* Like DECL_TI_ARGS, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */
ed44da02
MM
2701#define TYPE_TI_ARGS(NODE) \
2702 (TI_ARGS (TYPE_TEMPLATE_INFO (NODE)))
2703
98e40e83 2704#define INNERMOST_TEMPLATE_PARMS(NODE) TREE_VALUE (NODE)
5566b478 2705
c7222c02
MM
2706/* Nonzero if NODE (a TEMPLATE_DECL) is a member template, in the
2707 sense of [temp.mem]. */
2708#define DECL_MEMBER_TEMPLATE_P(NODE) \
2709 (DECL_LANG_FLAG_1 (TEMPLATE_DECL_CHECK (NODE)))
2710
6ba89f8e
MM
2711/* Nonzero if the NODE corresponds to the template parameters for a
2712 member template, whose inline definition is being processed after
2713 the class definition is complete. */
cae40af6
JM
2714#define TEMPLATE_PARMS_FOR_INLINE(NODE) TREE_LANG_FLAG_1 (NODE)
2715
5d80a306
DG
2716/* Determine if a parameter (i.e., a PARM_DECL) is a function
2717 parameter pack. */
2718#define FUNCTION_PARAMETER_PACK_P(NODE) \
2719 (DECL_LANG_FLAG_1 (PARM_DECL_CHECK (NODE)))
2720
2721/* Determines if NODE is an expansion of one or more parameter packs,
2722 e.g., a TYPE_PACK_EXPANSION or EXPR_PACK_EXPANSION. */
2723#define PACK_EXPANSION_P(NODE) \
2724 (TREE_CODE (NODE) == TYPE_PACK_EXPANSION \
2725 || TREE_CODE (NODE) == EXPR_PACK_EXPANSION)
2726
2727/* Extracts the type or expression pattern from a TYPE_PACK_EXPANSION or
2728 EXPR_PACK_EXPANSION. */
2729#define PACK_EXPANSION_PATTERN(NODE) \
2730 (TREE_CODE (NODE) == TYPE_PACK_EXPANSION? TREE_TYPE (NODE) \
2731 : TREE_OPERAND (NODE, 0))
2732
2733/* Sets the type or expression pattern for a TYPE_PACK_EXPANSION or
2734 EXPR_PACK_EXPANSION. */
2735#define SET_PACK_EXPANSION_PATTERN(NODE,VALUE) \
2736 if (TREE_CODE (NODE) == TYPE_PACK_EXPANSION) \
2737 TREE_TYPE (NODE) = VALUE; \
2738 else \
2739 TREE_OPERAND (NODE, 0) = VALUE
2740
2741/* The list of parameter packs used in the PACK_EXPANSION_* node. The
2742 TREE_VALUE of each TREE_LIST contains the parameter packs. */
d26e5986
NF
2743#define PACK_EXPANSION_PARAMETER_PACKS(NODE) \
2744 *(TREE_CODE (NODE) == EXPR_PACK_EXPANSION \
2745 ? &TREE_OPERAND (NODE, 1) \
2746 : &TREE_CHAIN (TYPE_PACK_EXPANSION_CHECK (NODE)))
5d80a306
DG
2747
2748/* Determine if this is an argument pack. */
2749#define ARGUMENT_PACK_P(NODE) \
2750 (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK \
2751 || TREE_CODE (NODE) == NONTYPE_ARGUMENT_PACK)
2752
2753/* The arguments stored in an argument pack. Arguments are stored in a
2754 TREE_VEC, which may have length zero. */
2755#define ARGUMENT_PACK_ARGS(NODE) \
2756 (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK? TREE_TYPE (NODE) \
2757 : TREE_OPERAND (NODE, 0))
2758
2759/* Set the arguments stored in an argument pack. VALUE must be a
2760 TREE_VEC. */
2761#define SET_ARGUMENT_PACK_ARGS(NODE,VALUE) \
2762 if (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK) \
2763 TREE_TYPE (NODE) = VALUE; \
2764 else \
2765 TREE_OPERAND (NODE, 0) = VALUE
2766
2767/* Whether the argument pack is "incomplete", meaning that more
2768 arguments can still be deduced. Incomplete argument packs are only
2769 used when the user has provided an explicit template argument list
2770 for a variadic function template. Some of the explicit template
2771 arguments will be placed into the beginning of the argument pack,
2772 but additional arguments might still be deduced. */
2773#define ARGUMENT_PACK_INCOMPLETE_P(NODE) \
2774 TREE_LANG_FLAG_0 (ARGUMENT_PACK_ARGS (NODE))
2775
2776/* When ARGUMENT_PACK_INCOMPLETE_P, stores the explicit template
2777 arguments used to fill this pack. */
2778#define ARGUMENT_PACK_EXPLICIT_ARGS(NODE) \
2779 TREE_TYPE (ARGUMENT_PACK_ARGS (NODE))
2780
2781/* In an ARGUMENT_PACK_SELECT, the argument pack from which an
2782 argument will be selected. */
2783#define ARGUMENT_PACK_SELECT_FROM_PACK(NODE) \
2784 (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->argument_pack)
2785
2786/* In an ARGUMENT_PACK_SELECT, the index of the argument we want to
2787 select. */
2788#define ARGUMENT_PACK_SELECT_INDEX(NODE) \
2789 (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->index)
2790
2791/* In an ARGUMENT_PACK_SELECT, the actual underlying argument that the
2792 ARGUMENT_PACK_SELECT represents. */
2793#define ARGUMENT_PACK_SELECT_ARG(NODE) \
2794 TREE_VEC_ELT (ARGUMENT_PACK_ARGS (ARGUMENT_PACK_SELECT_FROM_PACK (NODE)), \
2795 ARGUMENT_PACK_SELECT_INDEX (NODE));
2796
59026e79 2797/* In a FUNCTION_DECL, the saved language-specific per-function data. */
e2500fed 2798#define DECL_SAVED_FUNCTION_DATA(NODE) \
b97e8a14
JM
2799 (LANG_DECL_FN_CHECK (FUNCTION_DECL_CHECK (NODE)) \
2800 ->u.saved_language_function)
59026e79 2801
31e292c7
JM
2802/* True if NODE is an implicit INDIRECT_EXPR from convert_from_reference. */
2803#define REFERENCE_REF_P(NODE) \
2804 (TREE_CODE (NODE) == INDIRECT_REF \
2805 && TREE_TYPE (TREE_OPERAND (NODE, 0)) \
2806 && (TREE_CODE (TREE_TYPE (TREE_OPERAND ((NODE), 0))) \
2807 == REFERENCE_TYPE))
db24eb1f 2808
a2982c1b
RK
2809#define NEW_EXPR_USE_GLOBAL(NODE) \
2810 TREE_LANG_FLAG_0 (NEW_EXPR_CHECK (NODE))
2811#define DELETE_EXPR_USE_GLOBAL(NODE) \
2812 TREE_LANG_FLAG_0 (DELETE_EXPR_CHECK (NODE))
2813#define DELETE_EXPR_USE_VEC(NODE) \
2814 TREE_LANG_FLAG_1 (DELETE_EXPR_CHECK (NODE))
8d08fdba 2815
8e1daa34
NS
2816/* Indicates that this is a non-dependent COMPOUND_EXPR which will
2817 resolve to a function call. */
a2982c1b
RK
2818#define COMPOUND_EXPR_OVERLOADED(NODE) \
2819 TREE_LANG_FLAG_0 (COMPOUND_EXPR_CHECK (NODE))
8e1daa34 2820
6d80c4b9
MM
2821/* In a CALL_EXPR appearing in a template, true if Koenig lookup
2822 should be performed at instantiation time. */
a2982c1b 2823#define KOENIG_LOOKUP_P(NODE) TREE_LANG_FLAG_0 (CALL_EXPR_CHECK (NODE))
6d80c4b9 2824
7a8380ae
NS
2825/* Indicates whether a string literal has been parenthesized. Such
2826 usages are disallowed in certain circumstances. */
2827
2828#define PAREN_STRING_LITERAL_P(NODE) \
2829 TREE_LANG_FLAG_0 (STRING_CST_CHECK (NODE))
2830
e1376b00
MM
2831/* Nonzero if this AGGR_INIT_EXPR provides for initialization via a
2832 constructor call, rather than an ordinary function call. */
da8a66fc
ML
2833#define AGGR_INIT_VIA_CTOR_P(NODE) \
2834 TREE_LANG_FLAG_0 (AGGR_INIT_EXPR_CHECK (NODE))
e1376b00 2835
450a927a
JM
2836/* Nonzero if expanding this AGGR_INIT_EXPR should first zero-initialize
2837 the object. */
2838#define AGGR_INIT_ZERO_FIRST(NODE) \
2839 TREE_LANG_FLAG_2 (AGGR_INIT_EXPR_CHECK (NODE))
2840
5039610b
SL
2841/* AGGR_INIT_EXPR accessors. These are equivalent to the CALL_EXPR
2842 accessors, except for AGGR_INIT_EXPR_SLOT (which takes the place of
2843 CALL_EXPR_STATIC_CHAIN). */
2844
2845#define AGGR_INIT_EXPR_FN(NODE) TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 1)
2846#define AGGR_INIT_EXPR_SLOT(NODE) \
2847 TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 2)
2848#define AGGR_INIT_EXPR_ARG(NODE, I) \
2849 TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), (I) + 3)
2850#define aggr_init_expr_nargs(NODE) (VL_EXP_OPERAND_LENGTH(NODE) - 3)
2851
2852/* AGGR_INIT_EXPR_ARGP returns a pointer to the argument vector for NODE.
2853 We can't use &AGGR_INIT_EXPR_ARG (NODE, 0) because that will complain if
2854 the argument count is zero when checking is enabled. Instead, do
2855 the pointer arithmetic to advance past the 3 fixed operands in a
2856 AGGR_INIT_EXPR. That produces a valid pointer to just past the end of
2857 the operand array, even if it's not valid to dereference it. */
2858#define AGGR_INIT_EXPR_ARGP(NODE) \
2859 (&(TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 0)) + 3)
2860
2861/* Abstract iterators for AGGR_INIT_EXPRs. */
2862
2863/* Structure containing iterator state. */
1aa67003 2864typedef struct aggr_init_expr_arg_iterator_d {
5039610b
SL
2865 tree t; /* the aggr_init_expr */
2866 int n; /* argument count */
2867 int i; /* next argument index */
2868} aggr_init_expr_arg_iterator;
2869
2870/* Initialize the abstract argument list iterator object ITER with the
2871 arguments from AGGR_INIT_EXPR node EXP. */
2872static inline void
2873init_aggr_init_expr_arg_iterator (tree exp,
2874 aggr_init_expr_arg_iterator *iter)
2875{
2876 iter->t = exp;
2877 iter->n = aggr_init_expr_nargs (exp);
2878 iter->i = 0;
2879}
2880
2881/* Return the next argument from abstract argument list iterator object ITER,
2882 and advance its state. Return NULL_TREE if there are no more arguments. */
2883static inline tree
2884next_aggr_init_expr_arg (aggr_init_expr_arg_iterator *iter)
2885{
2886 tree result;
2887 if (iter->i >= iter->n)
2888 return NULL_TREE;
2889 result = AGGR_INIT_EXPR_ARG (iter->t, iter->i);
2890 iter->i++;
2891 return result;
2892}
2893
2894/* Initialize the abstract argument list iterator object ITER, then advance
2895 past and return the first argument. Useful in for expressions, e.g.
2896 for (arg = first_aggr_init_expr_arg (exp, &iter); arg;
2897 arg = next_aggr_init_expr_arg (&iter)) */
2898static inline tree
2899first_aggr_init_expr_arg (tree exp, aggr_init_expr_arg_iterator *iter)
2900{
2901 init_aggr_init_expr_arg_iterator (exp, iter);
2902 return next_aggr_init_expr_arg (iter);
2903}
2904
2905/* Test whether there are more arguments in abstract argument list iterator
2906 ITER, without changing its state. */
2907static inline bool
2908more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
2909{
2910 return (iter->i < iter->n);
2911}
2912
2913/* Iterate through each argument ARG of AGGR_INIT_EXPR CALL, using variable
2914 ITER (of type aggr_init_expr_arg_iterator) to hold the iteration state. */
2915#define FOR_EACH_AGGR_INIT_EXPR_ARG(arg, iter, call) \
2916 for ((arg) = first_aggr_init_expr_arg ((call), &(iter)); (arg); \
2917 (arg) = next_aggr_init_expr_arg (&(iter)))
2918
d5f4eddd 2919/* VEC_INIT_EXPR accessors. */
9c69dcea
JM
2920#define VEC_INIT_EXPR_SLOT(NODE) TREE_OPERAND (VEC_INIT_EXPR_CHECK (NODE), 0)
2921#define VEC_INIT_EXPR_INIT(NODE) TREE_OPERAND (VEC_INIT_EXPR_CHECK (NODE), 1)
d5f4eddd 2922
4de2f020
JM
2923/* Indicates that a VEC_INIT_EXPR is a potential constant expression.
2924 Only set when the current function is constexpr. */
2925#define VEC_INIT_EXPR_IS_CONSTEXPR(NODE) \
2926 TREE_LANG_FLAG_0 (VEC_INIT_EXPR_CHECK (NODE))
2927
2928/* Indicates that a VEC_INIT_EXPR is expressing value-initialization. */
2929#define VEC_INIT_EXPR_VALUE_INIT(NODE) \
2930 TREE_LANG_FLAG_1 (VEC_INIT_EXPR_CHECK (NODE))
2931
6757edfe
MM
2932/* The TYPE_MAIN_DECL for a class template type is a TYPE_DECL, not a
2933 TEMPLATE_DECL. This macro determines whether or not a given class
2934 type is really a template type, as opposed to an instantiation or
2935 specialization of one. */
2936#define CLASSTYPE_IS_TEMPLATE(NODE) \
2937 (CLASSTYPE_TEMPLATE_INFO (NODE) \
2938 && !CLASSTYPE_USE_TEMPLATE (NODE) \
2939 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE)))
2940
45869a6c
MM
2941/* The name used by the user to name the typename type. Typically,
2942 this is an IDENTIFIER_NODE, and the same as the DECL_NAME on the
2943 corresponding TYPE_DECL. However, this may also be a
2944 TEMPLATE_ID_EXPR if we had something like `typename X::Y<T>'. */
51545682
NF
2945#define TYPENAME_TYPE_FULLNAME(NODE) \
2946 (TYPE_VALUES_RAW (TYPENAME_TYPE_CHECK (NODE)))
ca40b399 2947
fc6a28d7
MM
2948/* True if a TYPENAME_TYPE was declared as an "enum". */
2949#define TYPENAME_IS_ENUM_P(NODE) \
2950 (TREE_LANG_FLAG_0 (TYPENAME_TYPE_CHECK (NODE)))
2951
2952/* True if a TYPENAME_TYPE was declared as a "class", "struct", or
2953 "union". */
2954#define TYPENAME_IS_CLASS_P(NODE) \
2955 (TREE_LANG_FLAG_1 (TYPENAME_TYPE_CHECK (NODE)))
2956
4195a767
NS
2957/* True if a TYPENAME_TYPE is in the process of being resolved. */
2958#define TYPENAME_IS_RESOLVING_P(NODE) \
2959 (TREE_LANG_FLAG_2 (TYPENAME_TYPE_CHECK (NODE)))
2960
cfdd0551 2961/* Nonzero in INTEGER_CST means that this int is negative by dint of
8d08fdba 2962 using a twos-complement negated operand. */
da8a66fc 2963#define TREE_NEGATED_INT(NODE) TREE_LANG_FLAG_0 (INTEGER_CST_CHECK (NODE))
8d08fdba 2964
4c6b7393 2965/* [class.virtual]
8d08fdba 2966
4c6b7393
MM
2967 A class that declares or inherits a virtual function is called a
2968 polymorphic class. */
2969#define TYPE_POLYMORPHIC_P(NODE) (TREE_LANG_FLAG_2 (NODE))
8d08fdba 2970
bbd15aac 2971/* Nonzero if this class has a virtual function table pointer. */
bb20cc46 2972#define TYPE_CONTAINS_VPTR_P(NODE) \
5775a06a 2973 (TYPE_POLYMORPHIC_P (NODE) || CLASSTYPE_VBASECLASSES (NODE))
bbd15aac 2974
d2ad151f 2975/* This flag is true of a local VAR_DECL if it was declared in a for
e92cc029 2976 statement, but we are no longer in the scope of the for. */
da8a66fc 2977#define DECL_DEAD_FOR_LOCAL(NODE) DECL_LANG_FLAG_7 (VAR_DECL_CHECK (NODE))
d2ad151f
PB
2978
2979/* This flag is set on a VAR_DECL that is a DECL_DEAD_FOR_LOCAL
2980 if we already emitted a warning about using it. */
da8a66fc 2981#define DECL_ERROR_REPORTED(NODE) DECL_LANG_FLAG_0 (VAR_DECL_CHECK (NODE))
d2ad151f 2982
cd9f6678
MM
2983/* Nonzero if NODE is a FUNCTION_DECL (for a function with global
2984 scope) declared in a local scope. */
2985#define DECL_LOCAL_FUNCTION_P(NODE) \
2986 DECL_LANG_FLAG_0 (FUNCTION_DECL_CHECK (NODE))
935d1834 2987
d63d5d0c
ILT
2988/* Nonzero if NODE is a DECL which we know about but which has not
2989 been explicitly declared, such as a built-in function or a friend
2990 declared inside a class. In the latter case DECL_HIDDEN_FRIEND_P
2991 will be set. */
cc057ef3 2992#define DECL_ANTICIPATED(NODE) \
b97e8a14 2993 (DECL_LANG_SPECIFIC (DECL_COMMON_CHECK (NODE))->u.base.anticipated_p)
cd9f6678 2994
d63d5d0c
ILT
2995/* Nonzero if NODE is a FUNCTION_DECL which was declared as a friend
2996 within a class but has not been declared in the surrounding scope.
2997 The function is invisible except via argument dependent lookup. */
2998#define DECL_HIDDEN_FRIEND_P(NODE) \
b97e8a14 2999 (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->hidden_friend_p)
d63d5d0c 3000
1799e5d5
RH
3001/* Nonzero if DECL has been declared threadprivate by
3002 #pragma omp threadprivate. */
3003#define CP_DECL_THREADPRIVATE_P(DECL) \
b97e8a14 3004 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (DECL))->u.base.threadprivate_or_deleted_p)
1799e5d5 3005
b87d79e6
JM
3006/* Nonzero if DECL was declared with '= delete'. */
3007#define DECL_DELETED_FN(DECL) \
b97e8a14 3008 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->u.base.threadprivate_or_deleted_p)
b87d79e6 3009
20f2653e 3010/* Nonzero if DECL was declared with '= default' (maybe implicitly). */
b87d79e6 3011#define DECL_DEFAULTED_FN(DECL) \
b97e8a14 3012 (LANG_DECL_FN_CHECK (DECL)->defaulted_p)
b87d79e6 3013
20f2653e
JM
3014/* Nonzero if DECL is explicitly defaulted in the class body. */
3015#define DECL_DEFAULTED_IN_CLASS_P(DECL) \
3016 (DECL_DEFAULTED_FN (DECL) && DECL_INITIALIZED_IN_CLASS_P (DECL))
3017/* Nonzero if DECL was defaulted outside the class body. */
3018#define DECL_DEFAULTED_OUTSIDE_CLASS_P(DECL) \
3019 (DECL_DEFAULTED_FN (DECL) \
3020 && !(DECL_ARTIFICIAL (DECL) || DECL_INITIALIZED_IN_CLASS_P (DECL)))
3021
8d08fdba 3022/* Record whether a typedef for type `int' was actually `signed int'. */
98e40e83 3023#define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
8d08fdba 3024
838dfd8a 3025/* Returns nonzero if DECL has external linkage, as specified by the
ad50e811
MM
3026 language standard. (This predicate may hold even when the
3027 corresponding entity is not actually given external linkage in the
3028 object file; see decl_linkage for details.) */
3029#define DECL_EXTERNAL_LINKAGE_P(DECL) \
3030 (decl_linkage (DECL) == lk_external)
3031
b38a05d0 3032/* Keep these codes in ascending code order. */
38b3627d 3033
b38a05d0
RS
3034#define INTEGRAL_CODE_P(CODE) \
3035 ((CODE) == ENUMERAL_TYPE \
3036 || (CODE) == BOOLEAN_TYPE \
3037 || (CODE) == INTEGER_TYPE)
a7a64a77
MM
3038
3039/* [basic.fundamental]
3040
3041 Types bool, char, wchar_t, and the signed and unsigned integer types
bb20cc46 3042 are collectively called integral types.
a7a64a77
MM
3043
3044 Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration
38b3627d 3045 types as well, which is incorrect in C++. Keep these checks in
b38a05d0 3046 ascending code order. */
bb20cc46 3047#define CP_INTEGRAL_TYPE_P(TYPE) \
98e40e83
GS
3048 (TREE_CODE (TYPE) == BOOLEAN_TYPE \
3049 || TREE_CODE (TYPE) == INTEGER_TYPE)
a7a64a77 3050
38b3627d
NS
3051/* Returns true if TYPE is an integral or enumeration name. Keep
3052 these checks in ascending code order. */
14d22dd6 3053#define INTEGRAL_OR_ENUMERATION_TYPE_P(TYPE) \
38b3627d 3054 (TREE_CODE (TYPE) == ENUMERAL_TYPE || CP_INTEGRAL_TYPE_P (TYPE))
14d22dd6 3055
adf2edec
DG
3056/* Returns true if TYPE is an integral or unscoped enumeration type. */
3057#define INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P(TYPE) \
3058 (UNSCOPED_ENUM_P (TYPE) || CP_INTEGRAL_TYPE_P (TYPE))
3059
7ecbca9d
GDR
3060/* True if the class type TYPE is a literal type. */
3061#define CLASSTYPE_LITERAL_P(TYPE) \
3062 (LANG_TYPE_CLASS_CHECK (TYPE)->is_literal)
3063
a7a64a77
MM
3064/* [basic.fundamental]
3065
3066 Integral and floating types are collectively called arithmetic
b8063b29
MM
3067 types.
3068
3069 As a GNU extension, we also accept complex types.
3070
3071 Keep these checks in ascending code order. */
a7a64a77 3072#define ARITHMETIC_TYPE_P(TYPE) \
b8063b29
MM
3073 (CP_INTEGRAL_TYPE_P (TYPE) \
3074 || TREE_CODE (TYPE) == REAL_TYPE \
3075 || TREE_CODE (TYPE) == COMPLEX_TYPE)
2986ae00 3076
5116acc6 3077/* True iff TYPE is cv decltype(nullptr). */
1e85e720 3078#define NULLPTR_TYPE_P(TYPE) (TREE_CODE (TYPE) == NULLPTR_TYPE)
5116acc6 3079
5f261ba9
MM
3080/* [basic.types]
3081
14c2101d
JM
3082 Arithmetic types, enumeration types, pointer types,
3083 pointer-to-member types, and std::nullptr_t are collectively called
3084 scalar types.
b8063b29 3085
38b3627d 3086 Keep these checks in ascending code order. */
5f261ba9 3087#define SCALAR_TYPE_P(TYPE) \
38b3627d 3088 (TYPE_PTRMEM_P (TYPE) \
5f261ba9 3089 || TREE_CODE (TYPE) == ENUMERAL_TYPE \
38b3627d 3090 || ARITHMETIC_TYPE_P (TYPE) \
5f261ba9 3091 || TYPE_PTR_P (TYPE) \
14c2101d 3092 || TYPE_PTRMEMFUNC_P (TYPE) \
5116acc6 3093 || NULLPTR_TYPE_P (TYPE))
5f261ba9 3094
adf2edec
DG
3095/* Determines whether this type is a C++0x scoped enumeration
3096 type. Scoped enumerations types are introduced via "enum class" or
3097 "enum struct", e.g.,
3098
3099 enum class Color {
3100 Red, Green, Blue
3101 };
3102
3103 Scoped enumeration types are different from normal (unscoped)
3104 enumeration types in several ways:
3105
3106 - The enumerators of a scoped enumeration type are only available
3107 within the scope of the enumeration type and not in the
3108 enclosing scope. For example, the Red color can be referred to
3109 with "Color::Red" but not "Red".
3110
3111 - Scoped enumerators and enumerations do not implicitly convert
3112 to integers or 'bool'.
3113
3114 - The underlying type of the enum is well-defined. */
3115#define SCOPED_ENUM_P(TYPE) \
5a2fa9e8 3116 (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_SCOPED (TYPE))
adf2edec
DG
3117
3118/* Determine whether this is an unscoped enumeration type. */
3119#define UNSCOPED_ENUM_P(TYPE) \
5a2fa9e8 3120 (TREE_CODE (TYPE) == ENUMERAL_TYPE && !ENUM_IS_SCOPED (TYPE))
adf2edec
DG
3121
3122/* Set the flag indicating whether an ENUMERAL_TYPE is a C++0x scoped
3123 enumeration type (1) or a normal (unscoped) enumeration type
3124 (0). */
3125#define SET_SCOPED_ENUM_P(TYPE, VAL) \
5a2fa9e8 3126 (ENUM_IS_SCOPED (TYPE) = (VAL))
adf2edec 3127
90ecaf87
RRC
3128#define SET_OPAQUE_ENUM_P(TYPE, VAL) \
3129 (ENUM_IS_OPAQUE (TYPE) = (VAL))
3130
3131#define OPAQUE_ENUM_P(TYPE) \
3132 (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_OPAQUE (TYPE))
3133
3134/* Determines whether an ENUMERAL_TYPE has an explicit
3135 underlying type. */
4e3c0a15 3136#define ENUM_FIXED_UNDERLYING_TYPE_P(NODE) (TYPE_LANG_FLAG_5 (NODE))
90ecaf87 3137
adf2edec
DG
3138/* Returns the underlying type of the given enumeration type. The
3139 underlying type is determined in different ways, depending on the
3140 properties of the enum:
3141
3142 - In C++0x, the underlying type can be explicitly specified, e.g.,
3143
3144 enum E1 : char { ... } // underlying type is char
3145
3146 - In a C++0x scoped enumeration, the underlying type is int
3147 unless otherwises specified:
3148
3149 enum class E2 { ... } // underlying type is int
3150
3151 - Otherwise, the underlying type is determined based on the
3152 values of the enumerators. In this case, the
3153 ENUM_UNDERLYING_TYPE will not be set until after the definition
3154 of the enumeration is completed by finish_enum. */
3155#define ENUM_UNDERLYING_TYPE(TYPE) \
3156 TREE_TYPE (ENUMERAL_TYPE_CHECK (TYPE))
3157
8e3df2de
MM
3158/* [dcl.init.aggr]
3159
3160 An aggregate is an array or a class with no user-declared
3161 constructors, no private or protected non-static data members, no
dbe85b80
JM
3162 base classes, and no virtual functions.
3163
38b3627d
NS
3164 As an extension, we also treat vectors as aggregates. Keep these
3165 checks in ascending code order. */
3166#define CP_AGGREGATE_TYPE_P(TYPE) \
3167 (TREE_CODE (TYPE) == VECTOR_TYPE \
3168 ||TREE_CODE (TYPE) == ARRAY_TYPE \
3169 || (CLASS_TYPE_P (TYPE) && !CLASSTYPE_NON_AGGREGATE (TYPE)))
8e3df2de
MM
3170
3171/* Nonzero for a class type means that the class type has a
3172 user-declared constructor. */
0fcedd9c 3173#define TYPE_HAS_USER_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1 (NODE))
8d08fdba
MS
3174
3175/* When appearing in an INDIRECT_REF, it means that the tree structure
3176 underneath is actually a call to a constructor. This is needed
3177 when the constructor must initialize local storage (which can
3178 be automatically destroyed), rather than allowing it to allocate
3179 space from the heap.
3180
3181 When appearing in a SAVE_EXPR, it means that underneath
3182 is a call to a constructor.
3183
92a62aad
MM
3184 When appearing in a CONSTRUCTOR, the expression is a
3185 compound literal.
8d08fdba
MS
3186
3187 When appearing in a FIELD_DECL, it means that this field
3188 has been duly initialized in its constructor. */
98e40e83 3189#define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4 (NODE))
8d08fdba 3190
92a62aad
MM
3191/* True if NODE is a brace-enclosed initializer. */
3192#define BRACE_ENCLOSED_INITIALIZER_P(NODE) \
09357846 3193 (TREE_CODE (NODE) == CONSTRUCTOR && TREE_TYPE (NODE) == init_list_type_node)
92a62aad 3194
3b2db49f
MM
3195/* True if NODE is a compound-literal, i.e., a brace-enclosed
3196 initializer cast to a particular type. */
3197#define COMPOUND_LITERAL_P(NODE) \
3198 (TREE_CODE (NODE) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (NODE))
3199
4038c495
GB
3200#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \
3201 && VEC_empty (constructor_elt, \
3202 CONSTRUCTOR_ELTS (NODE)) \
3203 && !TREE_HAS_CONSTRUCTOR (NODE))
a3203465 3204
09357846
JM
3205/* True if NODE is a init-list used as a direct-initializer, i.e.
3206 B b{1,2}, not B b({1,2}) or B b = {1,2}. */
3207#define CONSTRUCTOR_IS_DIRECT_INIT(NODE) (TREE_LANG_FLAG_0 (CONSTRUCTOR_CHECK (NODE)))
3208
f30432d7
MS
3209/* Nonzero means that an object of this type can not be initialized using
3210 an initializer list. */
3211#define CLASSTYPE_NON_AGGREGATE(NODE) \
e2500fed 3212 (LANG_TYPE_CLASS_CHECK (NODE)->non_aggregate)
f30432d7 3213#define TYPE_NON_AGGREGATE_CLASS(NODE) \
3f50c846 3214 (CLASS_TYPE_P (NODE) && CLASSTYPE_NON_AGGREGATE (NODE))
f30432d7 3215
066ec0a4
JM
3216/* Nonzero if there is a non-trivial X::op=(cv X&) for this class. */
3217#define TYPE_HAS_COMPLEX_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_assign)
cb68ec50 3218
066ec0a4
JM
3219/* Nonzero if there is a non-trivial X::X(cv X&) for this class. */
3220#define TYPE_HAS_COMPLEX_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_ctor)
8d08fdba 3221
ac177431
JM
3222/* Nonzero if there is a non-trivial X::op=(X&&) for this class. */
3223#define TYPE_HAS_COMPLEX_MOVE_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_assign)
3224
3225/* Nonzero if there is a non-trivial X::X(X&&) for this class. */
3226#define TYPE_HAS_COMPLEX_MOVE_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_ctor)
3227
066ec0a4 3228/* Nonzero if there is a non-trivial default constructor for this class. */
cb68ec50
PC
3229#define TYPE_HAS_COMPLEX_DFLT(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_dflt)
3230
834c6dff 3231/* Nonzero if TYPE has a trivial destructor. From [class.dtor]:
bb20cc46 3232
834c6dff
MM
3233 A destructor is trivial if it is an implicitly declared
3234 destructor and if:
3235
3236 - all of the direct base classes of its class have trivial
0cbd7506 3237 destructors,
834c6dff
MM
3238
3239 - for all of the non-static data members of its class that are
0cbd7506 3240 of class type (or array thereof), each such class has a
834c6dff
MM
3241 trivial destructor. */
3242#define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \
3243 (!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE))
3244
3245/* Nonzero for _TYPE node means that this type does not have a trivial
3246 destructor. Therefore, destroying an object of this type will
3247 involve a call to a destructor. This can apply to objects of
3248 ARRAY_TYPE is the type of the elements needs a destructor. */
3249#define TYPE_HAS_NONTRIVIAL_DESTRUCTOR(NODE) \
98e40e83 3250 (TYPE_LANG_FLAG_4 (NODE))
8d08fdba 3251
cb68ec50
PC
3252/* Nonzero for class type means that the default constructor is trivial. */
3253#define TYPE_HAS_TRIVIAL_DFLT(NODE) \
3254 (TYPE_HAS_DEFAULT_CONSTRUCTOR (NODE) && ! TYPE_HAS_COMPLEX_DFLT (NODE))
3255
0830ae44 3256/* Nonzero for class type means that copy initialization of this type can use
e8abc66f 3257 a bitwise copy. */
066ec0a4
JM
3258#define TYPE_HAS_TRIVIAL_COPY_CTOR(NODE) \
3259 (TYPE_HAS_COPY_CTOR (NODE) && ! TYPE_HAS_COMPLEX_COPY_CTOR (NODE))
e8abc66f
MS
3260
3261/* Nonzero for class type means that assignment of this type can use
3262 a bitwise copy. */
066ec0a4
JM
3263#define TYPE_HAS_TRIVIAL_COPY_ASSIGN(NODE) \
3264 (TYPE_HAS_COPY_ASSIGN (NODE) && ! TYPE_HAS_COMPLEX_COPY_ASSIGN (NODE))
e8abc66f 3265
a5ac359a
MM
3266/* Returns true if NODE is a pointer-to-data-member. */
3267#define TYPE_PTRMEM_P(NODE) \
3268 (TREE_CODE (NODE) == OFFSET_TYPE)
b6ab6892 3269/* Returns true if NODE is a pointer. */
a5ac359a
MM
3270#define TYPE_PTR_P(NODE) \
3271 (TREE_CODE (NODE) == POINTER_TYPE)
2b643eda
MM
3272
3273/* Returns true if NODE is an object type:
3274
3275 [basic.types]
3276
3277 An object type is a (possibly cv-qualified) type that is not a
3db45ab5 3278 function type, not a reference type, and not a void type.
2b643eda
MM
3279
3280 Keep these checks in ascending order, for speed. */
3281#define TYPE_OBJ_P(NODE) \
3282 (TREE_CODE (NODE) != REFERENCE_TYPE \
3283 && TREE_CODE (NODE) != VOID_TYPE \
3284 && TREE_CODE (NODE) != FUNCTION_TYPE \
3285 && TREE_CODE (NODE) != METHOD_TYPE)
3286
38b3627d
NS
3287/* Returns true if NODE is a pointer to an object. Keep these checks
3288 in ascending tree code order. */
3289#define TYPE_PTROB_P(NODE) \
2b643eda
MM
3290 (TYPE_PTR_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE)))
3291
38b3627d
NS
3292/* Returns true if NODE is a reference to an object. Keep these checks
3293 in ascending tree code order. */
3294#define TYPE_REF_OBJ_P(NODE) \
2b643eda
MM
3295 (TREE_CODE (NODE) == REFERENCE_TYPE && TYPE_OBJ_P (TREE_TYPE (NODE)))
3296
38b3627d
NS
3297/* Returns true if NODE is a pointer to an object, or a pointer to
3298 void. Keep these checks in ascending tree code order. */
3299#define TYPE_PTROBV_P(NODE) \
0cbd7506 3300 (TYPE_PTR_P (NODE) \
38b3627d 3301 && !(TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE \
0cbd7506 3302 || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
2b643eda 3303
b6ab6892 3304/* Returns true if NODE is a pointer to function. */
c11b6f21
MS
3305#define TYPE_PTRFN_P(NODE) \
3306 (TREE_CODE (NODE) == POINTER_TYPE \
3307 && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
2b643eda 3308
b6ab6892 3309/* Returns true if NODE is a reference to function. */
742a37d5
JM
3310#define TYPE_REFFN_P(NODE) \
3311 (TREE_CODE (NODE) == REFERENCE_TYPE \
3312 && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
c11b6f21 3313
8d08fdba 3314/* Nonzero for _TYPE node means that this type is a pointer to member
e92cc029 3315 function type. */
83e9506e 3316#define TYPE_PTRMEMFUNC_P(NODE) \
98e40e83
GS
3317 (TREE_CODE (NODE) == RECORD_TYPE \
3318 && TYPE_LANG_SPECIFIC (NODE) \
83e9506e
RH
3319 && TYPE_PTRMEMFUNC_FLAG (NODE))
3320
e08a8f45 3321#define TYPE_PTRMEMFUNC_FLAG(NODE) \
e2500fed 3322 (LANG_TYPE_CLASS_CHECK (NODE)->ptrmemfunc_flag)
e08a8f45 3323
a5ac359a
MM
3324/* Returns true if NODE is a pointer-to-member. */
3325#define TYPE_PTR_TO_MEMBER_P(NODE) \
3326 (TYPE_PTRMEM_P (NODE) || TYPE_PTRMEMFUNC_P (NODE))
3327
19420d00
NS
3328/* Indicates when overload resolution may resolve to a pointer to
3329 member function. [expr.unary.op]/3 */
a2982c1b
RK
3330#define PTRMEM_OK_P(NODE) \
3331 TREE_LANG_FLAG_0 (TREE_CHECK2 ((NODE), ADDR_EXPR, OFFSET_REF))
19420d00 3332
8d08fdba
MS
3333/* Get the POINTER_TYPE to the METHOD_TYPE associated with this
3334 pointer to member function. TYPE_PTRMEMFUNC_P _must_ be true,
e92cc029 3335 before using this macro. */
c7e266a6 3336#define TYPE_PTRMEMFUNC_FN_TYPE(NODE) \
1f84ec23 3337 (TREE_TYPE (TYPE_FIELDS (NODE)))
ceab47eb
MM
3338
3339/* Returns `A' for a type like `int (A::*)(double)' */
3340#define TYPE_PTRMEMFUNC_OBJECT_TYPE(NODE) \
3341 TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE)))
3342
38e01259 3343/* These are use to manipulate the canonical RECORD_TYPE from the
e92cc029 3344 hashed POINTER_TYPE, and can only be used on the POINTER_TYPE. */
98e40e83 3345#define TYPE_GET_PTRMEMFUNC_TYPE(NODE) \
e2500fed
GK
3346 (TYPE_LANG_SPECIFIC (NODE) ? LANG_TYPE_PTRMEM_CHECK (NODE)->record : NULL)
3347#define TYPE_SET_PTRMEMFUNC_TYPE(NODE, VALUE) \
3348 do { \
3349 if (TYPE_LANG_SPECIFIC (NODE) == NULL) \
3350 { \
a9429e29
LB
3351 TYPE_LANG_SPECIFIC (NODE) = ggc_alloc_cleared_lang_type \
3352 (sizeof (struct lang_type_ptrmem)); \
e2500fed
GK
3353 TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.h.is_lang_type_class = 0; \
3354 } \
3355 TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.record = (VALUE); \
3356 } while (0)
8d08fdba 3357
24272dc0
MM
3358/* For a pointer-to-member type of the form `T X::*', this is `X'.
3359 For a type like `void (X::*)() const', this type is `X', not `const
3360 X'. To get at the `const X' you have to look at the
3361 TYPE_PTRMEM_POINTED_TO_TYPE; there, the first parameter will have
3362 type `const X*'. */
f71f87f9 3363#define TYPE_PTRMEM_CLASS_TYPE(NODE) \
98e40e83 3364 (TYPE_PTRMEM_P (NODE) \
a5ac359a 3365 ? TYPE_OFFSET_BASETYPE (NODE) \
98e40e83 3366 : TYPE_PTRMEMFUNC_OBJECT_TYPE (NODE))
f71f87f9
MM
3367
3368/* For a pointer-to-member type of the form `T X::*', this is `T'. */
3369#define TYPE_PTRMEM_POINTED_TO_TYPE(NODE) \
98e40e83 3370 (TYPE_PTRMEM_P (NODE) \
a5ac359a 3371 ? TREE_TYPE (NODE) \
98e40e83 3372 : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE)))
f71f87f9 3373
61a127b3
MM
3374/* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for
3375 `X'. */
f71f87f9 3376#define PTRMEM_CST_CLASS(NODE) \
da8a66fc 3377 TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (PTRMEM_CST_CHECK (NODE)))
61a127b3 3378
bb20cc46 3379/* For a pointer-to-member constant `X::Y' this is the _DECL for
61a127b3 3380 `Y'. */
da8a66fc 3381#define PTRMEM_CST_MEMBER(NODE) (((ptrmem_cst_t)PTRMEM_CST_CHECK (NODE))->member)
61a127b3 3382
a2982c1b 3383/* The expression in question for a TYPEOF_TYPE. */
51545682 3384#define TYPEOF_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (TYPEOF_TYPE_CHECK (NODE)))
a2982c1b 3385
a0d260fc
PC
3386/* The type in question for an UNDERLYING_TYPE. */
3387#define UNDERLYING_TYPE_TYPE(NODE) \
51545682 3388 (TYPE_VALUES_RAW (UNDERLYING_TYPE_CHECK (NODE)))
a0d260fc 3389
3ad6a8e1 3390/* The expression in question for a DECLTYPE_TYPE. */
51545682 3391#define DECLTYPE_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (DECLTYPE_TYPE_CHECK (NODE)))
3ad6a8e1
DG
3392
3393/* Whether the DECLTYPE_TYPE_EXPR of NODE was originally parsed as an
3394 id-expression or a member-access expression. When false, it was
3395 parsed as a full expression. */
3396#define DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P(NODE) \
51545682 3397 (DECLTYPE_TYPE_CHECK (NODE))->type_common.string_flag
3ad6a8e1 3398
d5f4eddd
JM
3399/* These flags indicate that we want different semantics from normal
3400 decltype: lambda capture just drops references, lambda return also does
3401 type decay. */
3402#define DECLTYPE_FOR_LAMBDA_CAPTURE(NODE) \
3403 TREE_LANG_FLAG_0 (DECLTYPE_TYPE_CHECK (NODE))
3404#define DECLTYPE_FOR_LAMBDA_RETURN(NODE) \
3405 TREE_LANG_FLAG_1 (DECLTYPE_TYPE_CHECK (NODE))
3406
faae18ab 3407/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `extern' was
07c88314
MM
3408 specified in its declaration. This can also be set for an
3409 erroneously declared PARM_DECL. */
da8a66fc 3410#define DECL_THIS_EXTERN(NODE) \
07c88314 3411 DECL_LANG_FLAG_2 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
8d08fdba 3412
faae18ab 3413/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `static' was
07c88314
MM
3414 specified in its declaration. This can also be set for an
3415 erroneously declared PARM_DECL. */
da8a66fc 3416#define DECL_THIS_STATIC(NODE) \
07c88314 3417 DECL_LANG_FLAG_6 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
faae18ab 3418
642124c6
RH
3419/* Nonzero for FIELD_DECL node means that this field is a base class
3420 of the parent object, as opposed to a member field. */
3421#define DECL_FIELD_IS_BASE(NODE) \
3422 DECL_LANG_FLAG_6 (FIELD_DECL_CHECK (NODE))
3423
37a7519a
JM
3424/* Nonzero for FIELD_DECL node means that this field is a simple (no
3425 explicit initializer) lambda capture field, making it invisible to
3426 name lookup in unevaluated contexts. */
3427#define DECL_NORMAL_CAPTURE_P(NODE) \
3428 DECL_LANG_FLAG_7 (FIELD_DECL_CHECK (NODE))
3429
6bdb8141
JM
3430/* Nonzero if TYPE is an anonymous union or struct type. We have to use a
3431 flag for this because "A union for which objects or pointers are
3432 declared is not an anonymous union" [class.union]. */
3433#define ANON_AGGR_TYPE_P(NODE) \
e2500fed 3434 (CLASS_TYPE_P (NODE) && LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr)
6bdb8141 3435#define SET_ANON_AGGR_TYPE_P(NODE) \
e2500fed 3436 (LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr = 1)
67ffc812 3437
1e30f9b4
MM
3438/* Nonzero if TYPE is an anonymous union type. */
3439#define ANON_UNION_TYPE_P(NODE) \
3440 (TREE_CODE (NODE) == UNION_TYPE && ANON_AGGR_TYPE_P (NODE))
3441
8d08fdba
MS
3442/* Define fields and accessors for nodes representing declared names. */
3443
e2500fed 3444#define TYPE_WAS_ANONYMOUS(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->was_anonymous)
8d08fdba
MS
3445
3446/* C++: all of these are overloaded! These apply only to TYPE_DECLs. */
f84b4be9
JM
3447
3448/* The format of each node in the DECL_FRIENDLIST is as follows:
3449
3450 The TREE_PURPOSE will be the name of a function, i.e., an
436f8a4c
MM
3451 IDENTIFIER_NODE. The TREE_VALUE will be itself a TREE_LIST, whose
3452 TREE_VALUEs are friends with the given name. */
8d08fdba 3453#define DECL_FRIENDLIST(NODE) (DECL_INITIAL (NODE))
6a629cac
MM
3454#define FRIEND_NAME(LIST) (TREE_PURPOSE (LIST))
3455#define FRIEND_DECLS(LIST) (TREE_VALUE (LIST))
8d08fdba 3456
2036a15c
MM
3457/* The DECL_ACCESS, if non-NULL, is a TREE_LIST. The TREE_PURPOSE of
3458 each node is a type; the TREE_VALUE is the access granted for this
3459 DECL in that type. The DECL_ACCESS is set by access declarations.
3460 For example, if a member that would normally be public in a
3461 derived class is made protected, then the derived class and the
3462 protected_access_node will appear in the DECL_ACCESS for the node. */
e2500fed 3463#define DECL_ACCESS(NODE) (LANG_DECL_U2_CHECK (NODE, 0)->access)
af3b4e59
MM
3464
3465/* Nonzero if the FUNCTION_DECL is a global constructor. */
3466#define DECL_GLOBAL_CTOR_P(NODE) \
b97e8a14 3467 (LANG_DECL_FN_CHECK (NODE)->global_ctor_p)
af3b4e59
MM
3468
3469/* Nonzero if the FUNCTION_DECL is a global destructor. */
3470#define DECL_GLOBAL_DTOR_P(NODE) \
b97e8a14 3471 (LANG_DECL_FN_CHECK (NODE)->global_dtor_p)
af3b4e59 3472
8d08fdba 3473/* Accessor macros for C++ template decl nodes. */
f84b4be9
JM
3474
3475/* The DECL_TEMPLATE_PARMS are a list. The TREE_PURPOSE of each node
4890c2f4 3476 is a INT_CST whose TREE_INT_CST_LOW indicates the level of the
36a117a5
MM
3477 template parameters, with 1 being the outermost set of template
3478 parameters. The TREE_VALUE is a vector, whose elements are the
3479 template parameters at each level. Each element in the vector is a
3480 TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a
3481 non-type parameter), or a TYPE_DECL (if the parameter is a type
3482 parameter). The TREE_PURPOSE is the default value, if any. The
34cd5ae7 3483 TEMPLATE_PARM_INDEX for the parameter is available as the
36a117a5
MM
3484 DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a
3485 TYPE_DECL). */
820cc88f 3486#define DECL_TEMPLATE_PARMS(NODE) DECL_NON_COMMON_CHECK (NODE)->decl_non_common.arguments
98c1c668
JM
3487#define DECL_INNERMOST_TEMPLATE_PARMS(NODE) \
3488 INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (NODE))
3489#define DECL_NTPARMS(NODE) \
3490 TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (NODE))
8d08fdba 3491/* For function, method, class-data templates. */
98e40e83 3492#define DECL_TEMPLATE_RESULT(NODE) DECL_RESULT_FLD (NODE)
2b110bfc
JM
3493/* For a function template at namespace scope, DECL_TEMPLATE_INSTANTIATIONS
3494 lists all instantiations and specializations of the function so that
3495 tsubst_friend_function can reassign them to another template if we find
3496 that the namespace-scope template is really a partial instantiation of a
3497 friend template.
36a117a5
MM
3498
3499 For a class template the DECL_TEMPLATE_INSTANTIATIONS lists holds
3500 all instantiations and specializations of the class type, including
2b110bfc
JM
3501 partial instantiations and partial specializations, so that if we
3502 explicitly specialize a partial instantiation we can walk the list
3503 in maybe_process_partial_specialization and reassign them or complain
3504 as appropriate.
36a117a5
MM
3505
3506 In both cases, the TREE_PURPOSE of each node contains the arguments
3507 used; the TREE_VALUE contains the generated variable. The template
3508 arguments are always complete. For example, given:
3509
3510 template <class T> struct S1 {
0cbd7506 3511 template <class U> struct S2 {};
36a117a5
MM
3512 template <class U> struct S2<U*> {};
3513 };
3514
3515 the record for the partial specialization will contain, as its
3516 argument list, { {T}, {U*} }, and will be on the
3517 DECL_TEMPLATE_INSTANTIATIONS list for `template <class T> template
3518 <class U> struct S1<T>::S2'.
3519
2b110bfc 3520 This list is not used for other templates. */
98e40e83 3521#define DECL_TEMPLATE_INSTANTIATIONS(NODE) DECL_VINDEX (NODE)
2b110bfc 3522/* For a class template, this list contains the partial
36a117a5 3523 specializations of this template. (Full specializations are not
916b63c3
MM
3524 recorded on this list.) The TREE_PURPOSE holds the arguments used
3525 in the partial specialization (e.g., for `template <class T> struct
3526 S<T*, int>' this will be `T*'.) The arguments will also include
3527 any outer template arguments. The TREE_VALUE holds the innermost
3528 template parameters for the specialization (e.g., `T' in the
3529 example above.) The TREE_TYPE is the _TYPE node for the partial
3530 specialization.
36a117a5 3531
2b110bfc 3532 This list is not used for other templates. */
98e40e83 3533#define DECL_TEMPLATE_SPECIALIZATIONS(NODE) DECL_SIZE (NODE)
5566b478 3534
38b3627d
NS
3535/* Nonzero for a DECL which is actually a template parameter. Keep
3536 these checks in ascending tree code order. */
bb20cc46 3537#define DECL_TEMPLATE_PARM_P(NODE) \
cd9f6678
MM
3538 (DECL_LANG_FLAG_0 (NODE) \
3539 && (TREE_CODE (NODE) == CONST_DECL \
833aa4c4 3540 || TREE_CODE (NODE) == PARM_DECL \
cd9f6678
MM
3541 || TREE_CODE (NODE) == TYPE_DECL \
3542 || TREE_CODE (NODE) == TEMPLATE_DECL))
3543
3544/* Mark NODE as a template parameter. */
3545#define SET_DECL_TEMPLATE_PARM_P(NODE) \
3546 (DECL_LANG_FLAG_0 (NODE) = 1)
50714e79 3547
cd9f6678 3548/* Nonzero if NODE is a template template parameter. */
73b0fce8 3549#define DECL_TEMPLATE_TEMPLATE_PARM_P(NODE) \
50714e79 3550 (TREE_CODE (NODE) == TEMPLATE_DECL && DECL_TEMPLATE_PARM_P (NODE))
73b0fce8 3551
b0bc6e8e
KL
3552/* Nonzero if NODE is a TEMPLATE_DECL representing an
3553 UNBOUND_CLASS_TEMPLATE tree node. */
3554#define DECL_UNBOUND_CLASS_TEMPLATE_P(NODE) \
3555 (TREE_CODE (NODE) == TEMPLATE_DECL && !DECL_TEMPLATE_RESULT (NODE))
3556
5566b478
MS
3557#define DECL_FUNCTION_TEMPLATE_P(NODE) \
3558 (TREE_CODE (NODE) == TEMPLATE_DECL \
b0bc6e8e 3559 && !DECL_UNBOUND_CLASS_TEMPLATE_P (NODE) \
5566b478
MS
3560 && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == FUNCTION_DECL)
3561
6757edfe 3562/* Nonzero for a DECL that represents a template class. */
c57801d4
JM
3563#define DECL_CLASS_TEMPLATE_P(NODE) \
3564 (TREE_CODE (NODE) == TEMPLATE_DECL \
3565 && DECL_TEMPLATE_RESULT (NODE) != NULL_TREE \
3566 && DECL_IMPLICIT_TYPEDEF_P (DECL_TEMPLATE_RESULT (NODE)))
6757edfe 3567
35acd3f2
MM
3568/* Nonzero if NODE which declares a type. */
3569#define DECL_DECLARES_TYPE_P(NODE) \
3570 (TREE_CODE (NODE) == TYPE_DECL || DECL_CLASS_TEMPLATE_P (NODE))
3571
b97e8a14
JM
3572/* Nonzero if NODE declares a function. */
3573#define DECL_DECLARES_FUNCTION_P(NODE) \
3574 (TREE_CODE (NODE) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (NODE))
3575
9188c363 3576/* Nonzero if NODE is the typedef implicitly generated for a type when
a3d87771
MM
3577 the type is declared. In C++, `struct S {};' is roughly
3578 equivalent to `struct S {}; typedef struct S S;' in C.
3579 DECL_IMPLICIT_TYPEDEF_P will hold for the typedef indicated in this
3580 example. In C++, there is a second implicit typedef for each
3581 class, in the scope of `S' itself, so that you can say `S::S'.
3582 DECL_SELF_REFERENCE_P will hold for that second typedef. */
9188c363 3583#define DECL_IMPLICIT_TYPEDEF_P(NODE) \
98e40e83 3584 (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_2 (NODE))
9188c363 3585#define SET_DECL_IMPLICIT_TYPEDEF_P(NODE) \
98e40e83 3586 (DECL_LANG_FLAG_2 (NODE) = 1)
a3d87771
MM
3587#define DECL_SELF_REFERENCE_P(NODE) \
3588 (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_4 (NODE))
3589#define SET_DECL_SELF_REFERENCE_P(NODE) \
3590 (DECL_LANG_FLAG_4 (NODE) = 1)
9188c363 3591
93cdc044
JM
3592/* A `primary' template is one that has its own template header. A
3593 member function of a class template is a template, but not primary.
6757edfe
MM
3594 A member template is primary. Friend templates are primary, too. */
3595
3596/* Returns the primary template corresponding to these parameters. */
3597#define DECL_PRIMARY_TEMPLATE(NODE) \
3598 (TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (NODE)))
3599
838dfd8a 3600/* Returns nonzero if NODE is a primary template. */
98e40e83 3601#define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == (NODE))
5566b478 3602
3b426391 3603/* Nonzero iff NODE is a specialization of a template. The value
4e95268d
MM
3604 indicates the type of specializations:
3605
3606 1=implicit instantiation
9ba7a2f2
MM
3607
3608 2=partial or explicit specialization, e.g.:
3609
3610 template <> int min<int> (int, int),
3611
3612 3=explicit instantiation, e.g.:
3613
3614 template int min<int> (int, int);
2b1e8a76 3615
4e95268d
MM
3616 Note that NODE will be marked as a specialization even if the
3617 template it is instantiating is not a primary template. For
3618 example, given:
3619
3620 template <typename T> struct O {
3621 void f();
3622 struct I {};
3623 };
3624
3625 both O<int>::f and O<int>::I will be marked as instantiations.
3626
3b426391 3627 If DECL_USE_TEMPLATE is nonzero, then DECL_TEMPLATE_INFO will also
2b1e8a76 3628 be non-NULL. */
b97e8a14 3629#define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC (NODE)->u.base.use_template)
a0a33927 3630
4e95268d
MM
3631/* Like DECL_USE_TEMPLATE, but for class types. */
3632#define CLASSTYPE_USE_TEMPLATE(NODE) \
3633 (LANG_TYPE_CLASS_CHECK (NODE)->use_template)
3634
3635/* True if NODE is a specialization of a primary template. */
3636#define CLASSTYPE_SPECIALIZATION_OF_PRIMARY_TEMPLATE_P(NODE) \
3637 (CLASS_TYPE_P (NODE) \
3638 && CLASSTYPE_USE_TEMPLATE (NODE) \
f9329c35 3639 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE)))
4e95268d 3640
a0a33927
MS
3641#define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1)
3642#define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \
3643 (CLASSTYPE_USE_TEMPLATE (NODE) & 1)
3644
3645#define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2)
3646#define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2)
1ca939e5
MM
3647
3648/* Returns true for an explicit or partial specialization of a class
3649 template. */
370af2d5 3650#define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
a0a33927 3651 (CLASSTYPE_USE_TEMPLATE (NODE) == 2)
370af2d5 3652#define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
a0a33927
MS
3653 (CLASSTYPE_USE_TEMPLATE (NODE) = 2)
3654
3655#define DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 1)
3656#define SET_DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 1)
3657#define CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \
98e40e83 3658 (CLASSTYPE_USE_TEMPLATE (NODE) == 1)
a0a33927 3659#define SET_CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \
98e40e83 3660 (CLASSTYPE_USE_TEMPLATE (NODE) = 1)
a0a33927
MS
3661
3662#define DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 3)
3663#define SET_DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 3)
3664#define CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
98e40e83 3665 (CLASSTYPE_USE_TEMPLATE (NODE) == 3)
a0a33927 3666#define SET_CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
98e40e83 3667 (CLASSTYPE_USE_TEMPLATE (NODE) = 3)
7177d104 3668
838dfd8a 3669/* Nonzero if DECL is a friend function which is an instantiation
61289ca3
MM
3670 from the point of view of the compiler, but not from the point of
3671 view of the language. For example given:
3672 template <class T> struct S { friend void f(T) {}; };
3673 the declaration of `void f(int)' generated when S<int> is
3674 instantiated will not be a DECL_TEMPLATE_INSTANTIATION, but will be
39a13be5 3675 a DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION. */
61289ca3
MM
3676#define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \
3677 (DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (DECL))
3678
838dfd8a 3679/* Nonzero iff we are currently processing a declaration for an
39c01e4c
MM
3680 entity with its own template parameter list, and which is not a
3681 full specialization. */
3682#define PROCESSING_REAL_TEMPLATE_DECL_P() \
f60a10e7 3683 (processing_template_decl > template_class_depth (current_scope ()))
39c01e4c 3684
fbf1c34b
MM
3685/* Nonzero if this VAR_DECL or FUNCTION_DECL has already been
3686 instantiated, i.e. its definition has been generated from the
78dcd41a 3687 pattern given in the template. */
da8a66fc
ML
3688#define DECL_TEMPLATE_INSTANTIATED(NODE) \
3689 DECL_LANG_FLAG_1 (VAR_OR_FUNCTION_DECL_CHECK (NODE))
fbf1c34b 3690
db5ae43f 3691/* We know what we're doing with this decl now. */
e3417fcd 3692#define DECL_INTERFACE_KNOWN(NODE) DECL_LANG_FLAG_5 (NODE)
db5ae43f 3693
faae18ab
MS
3694/* DECL_EXTERNAL must be set on a decl until the decl is actually emitted,
3695 so that assemble_external will work properly. So we have this flag to
dc472c59
JM
3696 tell us whether the decl is really not external.
3697
3698 This flag does not indicate whether or not the decl is defined in the
3699 current translation unit; it indicates whether or not we should emit the
3700 decl at the end of compilation if it is defined and needed. */
faae18ab 3701#define DECL_NOT_REALLY_EXTERN(NODE) \
b97e8a14 3702 (DECL_LANG_SPECIFIC (NODE)->u.base.not_really_extern)
db5ae43f 3703
6b5fbb55
MS
3704#define DECL_REALLY_EXTERN(NODE) \
3705 (DECL_EXTERNAL (NODE) && ! DECL_NOT_REALLY_EXTERN (NODE))
3706
eb68cb58
MM
3707/* A thunk is a stub function.
3708
3709 A thunk is an alternate entry point for an ordinary FUNCTION_DECL.
3710 The address of the ordinary FUNCTION_DECL is given by the
3711 DECL_INITIAL, which is always an ADDR_EXPR whose operand is a
4977bab6
ZW
3712 FUNCTION_DECL. The job of the thunk is to either adjust the this
3713 pointer before transferring control to the FUNCTION_DECL, or call
3714 FUNCTION_DECL and then adjust the result value. Note, the result
3715 pointer adjusting thunk must perform a call to the thunked
3716 function, (or be implemented via passing some invisible parameter
3717 to the thunked function, which is modified to perform the
3718 adjustment just before returning).
19114537 3719
eb68cb58
MM
3720 A thunk may perform either, or both, of the following operations:
3721
4977bab6
ZW
3722 o Adjust the this or result pointer by a constant offset.
3723 o Adjust the this or result pointer by looking up a vcall or vbase offset
eb68cb58
MM
3724 in the vtable.
3725
4977bab6
ZW
3726 A this pointer adjusting thunk converts from a base to a derived
3727 class, and hence adds the offsets. A result pointer adjusting thunk
3728 converts from a derived class to a base, and hence subtracts the
3729 offsets. If both operations are performed, then the constant
34cd5ae7 3730 adjustment is performed first for this pointer adjustment and last
4977bab6 3731 for the result pointer adjustment.
eb68cb58 3732
4977bab6 3733 The constant adjustment is given by THUNK_FIXED_OFFSET. If the
e00853fd
NS
3734 vcall or vbase offset is required, THUNK_VIRTUAL_OFFSET is
3735 used. For this pointer adjusting thunks, it is the vcall offset
3736 into the vtable. For result pointer adjusting thunks it is the
3737 binfo of the virtual base to convert to. Use that binfo's vbase
3738 offset.
3739
3740 It is possible to have equivalent covariant thunks. These are
3741 distinct virtual covariant thunks whose vbase offsets happen to
3742 have the same value. THUNK_ALIAS is used to pick one as the
3743 canonical thunk, which will get all the this pointer adjusting
3744 thunks attached to it. */
eb68cb58 3745
c0bbf652 3746/* An integer indicating how many bytes should be subtracted from the
4977bab6
ZW
3747 this or result pointer when this function is called. */
3748#define THUNK_FIXED_OFFSET(DECL) \
b97e8a14 3749 (DECL_LANG_SPECIFIC (THUNK_FUNCTION_CHECK (DECL))->u.fn.u5.fixed_offset)
07fa4878
NS
3750
3751/* A tree indicating how to perform the virtual adjustment. For a this
3752 adjusting thunk it is the number of bytes to be added to the vtable
3753 to find the vcall offset. For a result adjusting thunk, it is the
3cfabe60
NS
3754 binfo of the relevant virtual base. If NULL, then there is no
3755 virtual adjust. (The vptr is always located at offset zero from
3756 the this or result pointer.) (If the covariant type is within the
bb885938 3757 class hierarchy being laid out, the vbase index is not yet known
3cfabe60
NS
3758 at the point we need to create the thunks, hence the need to use
3759 binfos.) */
3760
4977bab6 3761#define THUNK_VIRTUAL_OFFSET(DECL) \
a6c0a76c 3762 (LANG_DECL_U2_CHECK (FUNCTION_DECL_CHECK (DECL), 0)->access)
07fa4878 3763
f4f206f4 3764/* A thunk which is equivalent to another thunk. */
e00853fd 3765#define THUNK_ALIAS(DECL) \
b97e8a14 3766 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->u.min.template_info)
bb885938 3767
742f25b3
NS
3768/* For thunk NODE, this is the FUNCTION_DECL thunked to. It is
3769 possible for the target to be a thunk too. */
07fa4878 3770#define THUNK_TARGET(NODE) \
b97e8a14 3771 (LANG_DECL_FN_CHECK (NODE)->befriending_classes)
c0bbf652 3772
02ed62dd
MM
3773/* True for a SCOPE_REF iff the "template" keyword was used to
3774 indicate that the qualified name denotes a template. */
3775#define QUALIFIED_NAME_IS_TEMPLATE(NODE) \
3776 (TREE_LANG_FLAG_0 (SCOPE_REF_CHECK (NODE)))
3777
1799e5d5 3778/* True for an OMP_ATOMIC that has dependent parameters. These are stored
4fe70b31 3779 as an expr in operand 1, and integer_zero_node in operand 0. */
1799e5d5 3780#define OMP_ATOMIC_DEPENDENT_P(NODE) \
4fe70b31 3781 (TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == INTEGER_CST)
1799e5d5
RH
3782
3783/* Used while gimplifying continue statements bound to OMP_FOR nodes. */
3784#define OMP_FOR_GIMPLIFYING_P(NODE) \
3785 (TREE_LANG_FLAG_0 (OMP_FOR_CHECK (NODE)))
3786
3db45ab5 3787/* A language-specific token attached to the OpenMP data clauses to
1799e5d5
RH
3788 hold code (or code fragments) related to ctors, dtors, and op=.
3789 See semantics.c for details. */
3790#define CP_OMP_CLAUSE_INFO(NODE) \
3791 TREE_TYPE (OMP_CLAUSE_RANGE_CHECK (NODE, OMP_CLAUSE_PRIVATE, \
3db45ab5 3792 OMP_CLAUSE_COPYPRIVATE))
1799e5d5 3793
ad321293
MM
3794/* These macros provide convenient access to the various _STMT nodes
3795 created when parsing template declarations. */
0cbd7506
MS
3796#define TRY_STMTS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0)
3797#define TRY_HANDLERS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1)
d7e7759d 3798
0cbd7506
MS
3799#define EH_SPEC_STMTS(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0)
3800#define EH_SPEC_RAISES(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1)
52a11cbf 3801
9da99f7d
NS
3802#define USING_STMT_NAMESPACE(NODE) TREE_OPERAND (USING_STMT_CHECK (NODE), 0)
3803
62409b39 3804/* Nonzero if this try block is a function try block. */
0cbd7506
MS
3805#define FN_TRY_BLOCK_P(NODE) TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE))
3806#define HANDLER_PARMS(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 0)
3807#define HANDLER_BODY(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 1)
1a6025b4 3808#define HANDLER_TYPE(NODE) TREE_TYPE (HANDLER_CHECK (NODE))
46e8c075 3809
5a508662
RH
3810/* CLEANUP_STMT accessors. The statement(s) covered, the cleanup to run
3811 and the VAR_DECL for which this cleanup exists. */
3812#define CLEANUP_BODY(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0)
3813#define CLEANUP_EXPR(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1)
3814#define CLEANUP_DECL(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 2)
3815
3816/* IF_STMT accessors. These give access to the condition of the if
3817 statement, the then block of the if statement, and the else block
3818 of the if statement if it exists. */
0cbd7506
MS
3819#define IF_COND(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 0)
3820#define THEN_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 1)
3821#define ELSE_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
545f261b 3822#define IF_SCOPE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 3)
5a508662 3823
fbc315db
ILT
3824/* WHILE_STMT accessors. These give access to the condition of the
3825 while statement and the body of the while statement, respectively. */
0cbd7506
MS
3826#define WHILE_COND(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0)
3827#define WHILE_BODY(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1)
fbc315db
ILT
3828
3829/* DO_STMT accessors. These give access to the condition of the do
3830 statement and the body of the do statement, respectively. */
0cbd7506
MS
3831#define DO_COND(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 0)
3832#define DO_BODY(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 1)
fbc315db
ILT
3833
3834/* FOR_STMT accessors. These give access to the init statement,
3835 condition, update expression, and body of the for statement,
3836 respectively. */
0cbd7506
MS
3837#define FOR_INIT_STMT(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 0)
3838#define FOR_COND(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
3839#define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
3840#define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
40e71fc7 3841#define FOR_SCOPE(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 4)
fbc315db 3842
f9132eb7 3843/* RANGE_FOR_STMT accessors. These give access to the declarator,
40e71fc7 3844 expression, body, and scope of the statement, respectively. */
f9132eb7
RRC
3845#define RANGE_FOR_DECL(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 0)
3846#define RANGE_FOR_EXPR(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 1)
3847#define RANGE_FOR_BODY(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 2)
40e71fc7 3848#define RANGE_FOR_SCOPE(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 3)
f9132eb7 3849
fbc315db
ILT
3850#define SWITCH_STMT_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
3851#define SWITCH_STMT_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
3852#define SWITCH_STMT_TYPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2)
1f18dbc6 3853#define SWITCH_STMT_SCOPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 3)
fbc315db 3854
c3e5898b 3855/* STMT_EXPR accessor. */
0cbd7506 3856#define STMT_EXPR_STMT(NODE) TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
c3e5898b 3857
934790cc
ILT
3858/* EXPR_STMT accessor. This gives the expression associated with an
3859 expression statement. */
0cbd7506 3860#define EXPR_STMT_EXPR(NODE) TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
934790cc 3861
c08cd4c1
JM
3862/* True if this TARGET_EXPR was created by build_cplus_new, and so we can
3863 discard it if it isn't useful. */
3864#define TARGET_EXPR_IMPLICIT_P(NODE) \
3865 TREE_LANG_FLAG_0 (TARGET_EXPR_CHECK (NODE))
3866
3f6079dd
JM
3867/* True if this TARGET_EXPR is the result of list-initialization of a
3868 temporary. */
3869#define TARGET_EXPR_LIST_INIT_P(NODE) \
3870 TREE_LANG_FLAG_1 (TARGET_EXPR_CHECK (NODE))
3871
37a7519a
JM
3872/* True if this TARGET_EXPR expresses direct-initialization of an object
3873 to be named later. */
3874#define TARGET_EXPR_DIRECT_INIT_P(NODE) \
3875 TREE_LANG_FLAG_2 (TARGET_EXPR_CHECK (NODE))
3876
3877/* True if EXPR expresses direct-initialization of a TYPE. */
3878#define DIRECT_INIT_EXPR_P(TYPE,EXPR) \
3879 (TREE_CODE (EXPR) == TARGET_EXPR && TREE_LANG_FLAG_2 (EXPR) \
3880 && same_type_ignoring_top_level_qualifiers_p (TYPE, TREE_TYPE (EXPR)))
3881
8d08fdba 3882/* An enumeration of the kind of tags that C++ accepts. */
19114537 3883enum tag_types {
a723baf1
MM
3884 none_type = 0, /* Not a tag type. */
3885 record_type, /* "struct" types. */
3886 class_type, /* "class" types. */
3887 union_type, /* "union" types. */
3888 enum_type, /* "enum" types. */
3889 typename_type /* "typename" types. */
3890};
8d08fdba 3891
27b8d0cd 3892/* The various kinds of lvalues we distinguish. */
7e5487a2 3893enum cp_lvalue_kind_flags {
27b8d0cd
MM
3894 clk_none = 0, /* Things that are not an lvalue. */
3895 clk_ordinary = 1, /* An ordinary lvalue. */
df5c89cb
JM
3896 clk_rvalueref = 2,/* An rvalue formed using an rvalue reference */
3897 clk_class = 4, /* An rvalue of class-type. */
3898 clk_bitfield = 8, /* An lvalue for a bit-field. */
3899 clk_packed = 16 /* An lvalue for a packed field. */
32e8bb8e
ILT
3900};
3901
3902/* This type is used for parameters and variables which hold
7e5487a2 3903 combinations of the flags in enum cp_lvalue_kind_flags. */
32e8bb8e 3904typedef int cp_lvalue_kind;
27b8d0cd 3905
74b846e0
MM
3906/* Various kinds of template specialization, instantiation, etc. */
3907typedef enum tmpl_spec_kind {
0cbd7506 3908 tsk_none, /* Not a template at all. */
74b846e0
MM
3909 tsk_invalid_member_spec, /* An explicit member template
3910 specialization, but the enclosing
3911 classes have not all been explicitly
3912 specialized. */
3913 tsk_invalid_expl_inst, /* An explicit instantiation containing
3914 template parameter lists. */
0cbd7506 3915 tsk_excessive_parms, /* A template declaration with too many
74b846e0
MM
3916 template parameter lists. */
3917 tsk_insufficient_parms, /* A template declaration with too few
3918 parameter lists. */
0cbd7506
MS
3919 tsk_template, /* A template declaration. */
3920 tsk_expl_spec, /* An explicit specialization. */
3921 tsk_expl_inst /* An explicit instantiation. */
74b846e0
MM
3922} tmpl_spec_kind;
3923
c35cce41
MM
3924/* The various kinds of access. BINFO_ACCESS depends on these being
3925 two bit quantities. The numerical values are important; they are
509fc277 3926 used to initialize RTTI data structures, so changing them changes
9bcb9aae 3927 the ABI. */
c35cce41 3928typedef enum access_kind {
0cbd7506
MS
3929 ak_none = 0, /* Inaccessible. */
3930 ak_public = 1, /* Accessible, as a `public' thing. */
3931 ak_protected = 2, /* Accessible, as a `protected' thing. */
3932 ak_private = 3 /* Accessible, as a `private' thing. */
c35cce41
MM
3933} access_kind;
3934
872f37f9
MM
3935/* The various kinds of special functions. If you add to this list,
3936 you should update special_function_p as well. */
3dbc07b6 3937typedef enum special_function_kind {
0cbd7506 3938 sfk_none = 0, /* Not a special function. This enumeral
872f37f9
MM
3939 must have value zero; see
3940 special_function_p. */
0cbd7506 3941 sfk_constructor, /* A constructor. */
9eb71d8c 3942 sfk_copy_constructor, /* A copy constructor. */
d5f4eddd 3943 sfk_move_constructor, /* A move constructor. */
066ec0a4 3944 sfk_copy_assignment, /* A copy assignment operator. */
ac177431 3945 sfk_move_assignment, /* A move assignment operator. */
0cbd7506 3946 sfk_destructor, /* A destructor. */
872f37f9
MM
3947 sfk_complete_destructor, /* A destructor for complete objects. */
3948 sfk_base_destructor, /* A destructor for base subobjects. */
3949 sfk_deleting_destructor, /* A destructor for complete objects that
3950 deletes the object after it has been
3951 destroyed. */
0cbd7506 3952 sfk_conversion /* A conversion operator. */
3dbc07b6
MM
3953} special_function_kind;
3954
19114537
EC
3955/* The various kinds of linkage. From [basic.link],
3956
ad50e811
MM
3957 A name is said to have linkage when it might denote the same
3958 object, reference, function, type, template, namespace or value
3959 as a name introduced in another scope:
3960
3961 -- When a name has external linkage, the entity it denotes can
0cbd7506 3962 be referred to from scopes of other translation units or from
ad50e811
MM
3963 other scopes of the same translation unit.
3964
3965 -- When a name has internal linkage, the entity it denotes can
0cbd7506 3966 be referred to by names from other scopes in the same
ad50e811
MM
3967 translation unit.
3968
3969 -- When a name has no linkage, the entity it denotes cannot be
0cbd7506 3970 referred to by names from other scopes. */
ad50e811
MM
3971
3972typedef enum linkage_kind {
0cbd7506
MS
3973 lk_none, /* No linkage. */
3974 lk_internal, /* Internal linkage. */
3975 lk_external /* External linkage. */
ad50e811
MM
3976} linkage_kind;
3977
b95ca513
JM
3978typedef enum duration_kind {
3979 dk_static,
3980 dk_thread,
3981 dk_auto,
3982 dk_dynamic
3983} duration_kind;
3984
c2ea3a40 3985/* Bitmask flags to control type substitution. */
f87393f0 3986enum tsubst_flags {
248e1b22
MM
3987 tf_none = 0, /* nothing special */
3988 tf_error = 1 << 0, /* give error messages */
3989 tf_warning = 1 << 1, /* give warnings too */
3990 tf_ignore_bad_quals = 1 << 2, /* ignore bad cvr qualifiers */
3991 tf_keep_type_decl = 1 << 3, /* retain typedef type decls
3992 (make_typename_type use) */
3993 tf_ptrmem_ok = 1 << 4, /* pointers to member ok (internal
3994 instantiate_type use) */
3995 tf_user = 1 << 5, /* found template must be a user template
3996 (lookup_template_class use) */
3997 tf_conv = 1 << 6, /* We are determining what kind of
3998 conversion might be permissible,
3999 not actually performing the
4000 conversion. */
4001 tf_no_access_control = 1 << 7, /* Do not perform access checks, even
4002 when issuing other errors. */
10f3742b 4003 /* Convenient substitution flags combinations. */
23fca1f5 4004 tf_warning_or_error = tf_warning | tf_error
f87393f0
ILT
4005};
4006
4007/* This type is used for parameters and variables which hold
4008 combinations of the flags in enum tsubst_flags. */
4009typedef int tsubst_flags_t;
5e76004e 4010
00a17e31 4011/* The kind of checking we can do looking in a class hierarchy. */
7e5487a2 4012enum base_access_flags {
18e4be85 4013 ba_any = 0, /* Do not check access, allow an ambiguous base,
338d90b8 4014 prefer a non-virtual base */
18e4be85
NS
4015 ba_unique = 1 << 0, /* Must be a unique base. */
4016 ba_check_bit = 1 << 1, /* Check access. */
4017 ba_check = ba_unique | ba_check_bit,
4018 ba_ignore_scope = 1 << 2, /* Ignore access allowed by local scope. */
4019 ba_quiet = 1 << 3 /* Do not issue error messages. */
a916d97f
ILT
4020};
4021
4022/* This type is used for parameters and variables which hold
7e5487a2 4023 combinations of the flags in enum base_access_flags. */
a916d97f 4024typedef int base_access;
338d90b8 4025
8d241e0b
KL
4026/* The various kinds of access check during parsing. */
4027typedef enum deferring_kind {
4028 dk_no_deferred = 0, /* Check access immediately */
4029 dk_deferred = 1, /* Deferred check */
4030 dk_no_check = 2 /* No access check */
4031} deferring_kind;
4032
aba649ba 4033/* The kind of base we can find, looking in a class hierarchy.
00a17e31 4034 Values <0 indicate we failed. */
338d90b8
NS
4035typedef enum base_kind {
4036 bk_inaccessible = -3, /* The base is inaccessible */
0cbd7506
MS
4037 bk_ambig = -2, /* The base is ambiguous */
4038 bk_not_base = -1, /* It is not a base */
4039 bk_same_type = 0, /* It is the same type */
4040 bk_proper_base = 1, /* It is a proper base */
4041 bk_via_virtual = 2 /* It is a proper base, but via a virtual
338d90b8 4042 path. This might not be the canonical
00a17e31 4043 binfo. */
338d90b8
NS
4044} base_kind;
4045
700f8a87 4046/* Node for "pointer to (virtual) function".
e92cc029 4047 This may be distinct from ptr_type_node so gdb can distinguish them. */
c4372ef4 4048#define vfunc_ptr_type_node vtable_entry_type
700f8a87 4049
8d08fdba 4050
8d08fdba 4051/* For building calls to `delete'. */
e2500fed 4052extern GTY(()) tree integer_two_node;
8d08fdba 4053
b2244c65
MM
4054/* The number of function bodies which we are currently processing.
4055 (Zero if we are at namespace scope, one inside the body of a
4056 function, two inside the body of a function in a local class, etc.) */
4057extern int function_depth;
4058
7d882b83
ILT
4059/* In parser.c. */
4060
4061/* Nonzero if we are parsing an unevaluated operand: an operand to
4062 sizeof, typeof, or alignof. This is a count since operands to
4063 sizeof can be nested. */
4064
4065extern int cp_unevaluated_operand;
f9132eb7 4066extern tree cp_convert_range_for (tree, tree, tree);
7d882b83 4067
51c184be 4068/* in pt.c */
5566b478 4069
62e4a758 4070/* These values are used for the `STRICT' parameter to type_unification and
830bfa74
MM
4071 fn_type_unification. Their meanings are described with the
4072 documentation for fn_type_unification. */
4073
4074typedef enum unification_kind_t {
4075 DEDUCE_CALL,
4076 DEDUCE_CONV,
dda04398 4077 DEDUCE_EXACT
830bfa74
MM
4078} unification_kind_t;
4079
51c184be 4080/* in class.c */
61a127b3 4081
b4c4a9ec 4082extern int current_class_depth;
8d08fdba 4083
1f6e1acc
AS
4084/* An array of all local classes present in this translation unit, in
4085 declaration order. */
806aa901 4086extern GTY(()) VEC(tree,gc) *local_classes;
8d08fdba
MS
4087\f
4088/* Here's where we control how name mangling takes place. */
4089
8d08fdba
MS
4090/* Cannot use '$' up front, because this confuses gdb
4091 (names beginning with '$' are gdb-local identifiers).
4092
4093 Note that all forms in which the '$' is significant are long enough
4094 for direct indexing (meaning that if we know there is a '$'
4095 at a particular location, we can index into the string at
4096 any other location that provides distinguishing characters). */
4097
d9781752
L
4098/* Define NO_DOT_IN_LABEL in your favorite tm file if your assembler
4099 doesn't allow '.' in symbol names. */
8d08fdba
MS
4100#ifndef NO_DOT_IN_LABEL
4101
4102#define JOINER '.'
4103
8d08fdba 4104#define AUTO_TEMP_NAME "_.tmp_"
8d08fdba
MS
4105#define VFIELD_BASE ".vf"
4106#define VFIELD_NAME "_vptr."
4107#define VFIELD_NAME_FORMAT "_vptr.%s"
8d08fdba
MS
4108
4109#define ANON_AGGRNAME_FORMAT "._%d"
4110
4111#else /* NO_DOT_IN_LABEL */
4112
d9781752
L
4113#ifndef NO_DOLLAR_IN_LABEL
4114
4115#define JOINER '$'
4116
4117#define AUTO_TEMP_NAME "_$tmp_"
4118#define VFIELD_BASE "$vf"
4119#define VFIELD_NAME "_vptr$"
4120#define VFIELD_NAME_FORMAT "_vptr$%s"
4121#define ANON_AGGRNAME_FORMAT "$_%d"
4122
4123#else /* NO_DOLLAR_IN_LABEL */
4124
8d08fdba 4125#define IN_CHARGE_NAME "__in_chrg"
8d08fdba
MS
4126#define AUTO_TEMP_NAME "__tmp_"
4127#define TEMP_NAME_P(ID_NODE) \
4128 (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, \
4129 sizeof (AUTO_TEMP_NAME) - 1))
8d08fdba 4130#define VTABLE_NAME "__vt_"
8d08fdba
MS
4131#define VTABLE_NAME_P(ID_NODE) \
4132 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \
4133 sizeof (VTABLE_NAME) - 1))
4134#define VFIELD_BASE "__vfb"
4135#define VFIELD_NAME "__vptr_"
4136#define VFIELD_NAME_P(ID_NODE) \
4137 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \
4138 sizeof (VFIELD_NAME) - 1))
dc8ad298 4139#define VFIELD_NAME_FORMAT "__vptr_%s"
8d08fdba
MS
4140
4141#define ANON_AGGRNAME_PREFIX "__anon_"
4142#define ANON_AGGRNAME_P(ID_NODE) \
4143 (!strncmp (IDENTIFIER_POINTER (ID_NODE), ANON_AGGRNAME_PREFIX, \
4144 sizeof (ANON_AGGRNAME_PREFIX) - 1))
4145#define ANON_AGGRNAME_FORMAT "__anon_%d"
8d08fdba 4146
8d08fdba 4147#endif /* NO_DOLLAR_IN_LABEL */
d9781752 4148#endif /* NO_DOT_IN_LABEL */
8d08fdba
MS
4149
4150#define THIS_NAME "this"
8d08fdba
MS
4151
4152#define IN_CHARGE_NAME "__in_chrg"
4153
4154#define VTBL_PTR_TYPE "__vtbl_ptr_type"
4155#define VTABLE_DELTA_NAME "__delta"
8d08fdba 4156#define VTABLE_PFN_NAME "__pfn"
8d08fdba 4157
d5f4eddd
JM
4158#define LAMBDANAME_PREFIX "__lambda"
4159#define LAMBDANAME_FORMAT LAMBDANAME_PREFIX "%d"
4160#define LAMBDANAME_P(ID_NODE) \
4161 (!strncmp (IDENTIFIER_POINTER (ID_NODE), \
4162 LAMBDANAME_PREFIX, \
4163 sizeof (LAMBDANAME_PREFIX) - 1))
4164
8d08fdba
MS
4165#if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL)
4166
8d08fdba
MS
4167#define VTABLE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \
4168 && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \
4169 && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER)
4170
98e40e83
GS
4171#define TEMP_NAME_P(ID_NODE) \
4172 (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, sizeof (AUTO_TEMP_NAME)-1))
4173#define VFIELD_NAME_P(ID_NODE) \
4174 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1))
8d08fdba
MS
4175
4176/* For anonymous aggregate types, we need some sort of name to
4177 hold on to. In practice, this should not appear, but it should
4178 not be harmful if it does. */
4179#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == JOINER \
4180 && IDENTIFIER_POINTER (ID_NODE)[1] == '_')
8d08fdba 4181#endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */
35680744 4182
8d08fdba 4183\f
5566b478
MS
4184/* Nonzero if we're done parsing and into end-of-file activities. */
4185
4186extern int at_eof;
4187
170b020f
MM
4188/* A list of namespace-scope objects which have constructors or
4189 destructors which reside in the global scope. The decl is stored
4190 in the TREE_VALUE slot and the initializer is stored in the
4191 TREE_PURPOSE slot. */
4192extern GTY(()) tree static_aggregates;
4193
ee18fe39 4194enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG };
8d08fdba 4195
105d72c5
MM
4196/* These are uses as bits in flags passed to various functions to
4197 control their behavior. Despite the LOOKUP_ prefix, many of these
4198 do not control name lookup. ??? Functions using these flags should
4199 probably be modified to accept explicit boolean flags for the
4200 behaviors relevant to them. */
4201/* Check for access violations. */
644d1951 4202#define LOOKUP_PROTECT (1 << 0)
105d72c5
MM
4203/* Complain if no suitable member function matching the arguments is
4204 found. */
644d1951
NS
4205#define LOOKUP_COMPLAIN (1 << 1)
4206#define LOOKUP_NORMAL (LOOKUP_PROTECT | LOOKUP_COMPLAIN)
105d72c5
MM
4207/* Even if the function found by lookup is a virtual function, it
4208 should be called directly. */
644d1951 4209#define LOOKUP_NONVIRTUAL (1 << 2)
e57d93c6
JM
4210/* Non-converting (i.e., "explicit") constructors are not tried. This flag
4211 indicates that we are not performing direct-initialization. */
2f358037 4212#define LOOKUP_ONLYCONVERTING (1 << 3)
e57d93c6 4213#define LOOKUP_IMPLICIT (LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING)
105d72c5
MM
4214/* If a temporary is created, it should be created so that it lives
4215 as long as the current variable bindings; otherwise it only lives
4216 until the end of the complete-expression. It also forces
4217 direct-initialization in cases where other parts of the compiler
4218 have already generated a temporary, such as reference
4219 initialization and the catch parameter. */
2f358037 4220#define DIRECT_BIND (1 << 4)
404f08f8
JM
4221/* We're performing a user-defined conversion, so more user-defined
4222 conversions are not permitted (only built-in conversions). */
2f358037 4223#define LOOKUP_NO_CONVERSION (1 << 5)
105d72c5
MM
4224/* The user has explicitly called a destructor. (Therefore, we do
4225 not need to check that the object is non-NULL before calling the
4226 destructor.) */
2f358037 4227#define LOOKUP_DESTRUCTOR (1 << 6)
105d72c5 4228/* Do not permit references to bind to temporaries. */
2f358037 4229#define LOOKUP_NO_TEMP_BIND (1 << 7)
105d72c5 4230/* Do not accept objects, and possibly namespaces. */
2f358037 4231#define LOOKUP_PREFER_TYPES (1 << 8)
105d72c5 4232/* Do not accept objects, and possibly types. */
2f358037 4233#define LOOKUP_PREFER_NAMESPACES (1 << 9)
105d72c5 4234/* Accept types or namespaces. */
644d1951 4235#define LOOKUP_PREFER_BOTH (LOOKUP_PREFER_TYPES | LOOKUP_PREFER_NAMESPACES)
85661c41 4236/* Return friend declarations and un-declared builtin functions.
105d72c5
MM
4237 (Normally, these entities are registered in the symbol table, but
4238 not found by lookup.) */
6f4fd536 4239#define LOOKUP_HIDDEN (LOOKUP_PREFER_NAMESPACES << 1)
8af2fec4
RY
4240/* Prefer that the lvalue be treated as an rvalue. */
4241#define LOOKUP_PREFER_RVALUE (LOOKUP_HIDDEN << 1)
09357846
JM
4242/* We're inside an init-list, so narrowing conversions are ill-formed. */
4243#define LOOKUP_NO_NARROWING (LOOKUP_PREFER_RVALUE << 1)
4244/* Avoid user-defined conversions for the first parameter of a copy
ac177431 4245 constructor (or move constructor). */
09357846 4246#define LOOKUP_NO_COPY_CTOR_CONVERSION (LOOKUP_NO_NARROWING << 1)
e57d93c6
JM
4247/* This is the first parameter of a copy constructor. */
4248#define LOOKUP_COPY_PARM (LOOKUP_NO_COPY_CTOR_CONVERSION << 1)
d451d5b2
JM
4249/* We only want to consider list constructors. */
4250#define LOOKUP_LIST_ONLY (LOOKUP_COPY_PARM << 1)
ac177431
JM
4251/* Return after determining which function to call and checking access.
4252 Used by sythesized_method_walk to determine which functions will
4253 be called to initialize subobjects, in order to determine exception
4254 specification and possible implicit delete.
4255 This is kind of a hack, but since access control doesn't respect SFINAE
4256 we can't just use tf_none to avoid access control errors, we need
4257 another mechanism. Exiting early also avoids problems with trying
4258 to perform argument conversions when the class isn't complete yet. */
4259#define LOOKUP_SPECULATIVE (LOOKUP_LIST_ONLY << 1)
b8bf6ad9
JM
4260/* Used by calls from defaulted functions to limit the overload set to avoid
4261 cycles trying to declare them (core issue 1092). */
4262#define LOOKUP_DEFAULTED (LOOKUP_SPECULATIVE << 1)
fa2200cb
JM
4263/* Used in calls to store_init_value to suppress its usual call to
4264 digest_init. */
b8bf6ad9 4265#define LOOKUP_ALREADY_DIGESTED (LOOKUP_DEFAULTED << 1)
2e1df0f0
DN
4266/* An instantiation with explicit template arguments. */
4267#define LOOKUP_EXPLICIT_TMPL_ARGS (LOOKUP_ALREADY_DIGESTED << 1)
52c11ef6 4268
98e40e83
GS
4269#define LOOKUP_NAMESPACES_ONLY(F) \
4270 (((F) & LOOKUP_PREFER_NAMESPACES) && !((F) & LOOKUP_PREFER_TYPES))
4271#define LOOKUP_TYPES_ONLY(F) \
4272 (!((F) & LOOKUP_PREFER_NAMESPACES) && ((F) & LOOKUP_PREFER_TYPES))
4273#define LOOKUP_QUALIFIERS_ONLY(F) ((F) & LOOKUP_PREFER_BOTH)
bb20cc46 4274
8d08fdba 4275
a4443a08
MS
4276/* These flags are used by the conversion code.
4277 CONV_IMPLICIT : Perform implicit conversions (standard and user-defined).
4278 CONV_STATIC : Perform the explicit conversions for static_cast.
4279 CONV_CONST : Perform the explicit conversions for const_cast.
4280 CONV_REINTERPRET: Perform the explicit conversions for reinterpret_cast.
6060a796 4281 CONV_PRIVATE : Perform upcasts to private bases.
8ccc31eb 4282 CONV_FORCE_TEMP : Require a new temporary when converting to the same
bb20cc46 4283 aggregate type. */
a4443a08
MS
4284
4285#define CONV_IMPLICIT 1
4286#define CONV_STATIC 2
4287#define CONV_CONST 4
4288#define CONV_REINTERPRET 8
4289#define CONV_PRIVATE 16
faf5394a 4290/* #define CONV_NONCONVERTING 32 */
8ccc31eb 4291#define CONV_FORCE_TEMP 64
a4443a08
MS
4292#define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
4293 | CONV_REINTERPRET)
4294#define CONV_C_CAST (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
8ccc31eb 4295 | CONV_REINTERPRET | CONV_PRIVATE | CONV_FORCE_TEMP)
a4443a08 4296
b7484fbe
MS
4297/* Used by build_expr_type_conversion to indicate which types are
4298 acceptable as arguments to the expression under consideration. */
4299
4300#define WANT_INT 1 /* integer types, including bool */
4301#define WANT_FLOAT 2 /* floating point types */
4302#define WANT_ENUM 4 /* enumerated types */
4303#define WANT_POINTER 8 /* pointer types */
4304#define WANT_NULL 16 /* null pointer constant */
1ff6b2c8
JM
4305#define WANT_VECTOR_OR_COMPLEX 32 /* vector or complex types */
4306#define WANT_ARITH (WANT_INT | WANT_FLOAT | WANT_VECTOR_OR_COMPLEX)
b7484fbe 4307
96d84882 4308/* Used with comptypes, and related functions, to guide type
3bfdc719
MM
4309 comparison. */
4310
0cbd7506 4311#define COMPARE_STRICT 0 /* Just check if the types are the
3bfdc719 4312 same. */
0cbd7506 4313#define COMPARE_BASE 1 /* Check to see if the second type is
c8a209ca 4314 derived from the first. */
0cbd7506 4315#define COMPARE_DERIVED 2 /* Like COMPARE_BASE, but in
c8a209ca 4316 reverse. */
34cd5ae7 4317#define COMPARE_REDECLARATION 4 /* The comparison is being done when
3bfdc719
MM
4318 another declaration of an existing
4319 entity is seen. */
06d40de8
DG
4320#define COMPARE_STRUCTURAL 8 /* The comparison is intended to be
4321 structural. The actual comparison
4322 will be identical to
4323 COMPARE_STRICT. */
3bfdc719 4324
7bdbfa05 4325/* Used with push_overloaded_decl. */
0cbd7506 4326#define PUSH_GLOBAL 0 /* Push the DECL into namespace scope,
7bdbfa05 4327 regardless of the current scope. */
0cbd7506 4328#define PUSH_LOCAL 1 /* Push the DECL into the current
7bdbfa05 4329 scope. */
0cbd7506 4330#define PUSH_USING 2 /* We are pushing this DECL as the
7bdbfa05
MM
4331 result of a using declaration. */
4332
a8f73d4b 4333/* Used with start function. */
0cbd7506
MS
4334#define SF_DEFAULT 0 /* No flags. */
4335#define SF_PRE_PARSED 1 /* The function declaration has
a8f73d4b
MM
4336 already been parsed. */
4337#define SF_INCLASS_INLINE 2 /* The function is an inline, defined
4338 in the class body. */
9edc3913 4339
4ad610c9
JM
4340/* Used with start_decl's initialized parameter. */
4341#define SD_UNINITIALIZED 0
4342#define SD_INITIALIZED 1
4343#define SD_DEFAULTED 2
4344#define SD_DELETED 3
4345
3bfdc719
MM
4346/* Returns nonzero iff TYPE1 and TYPE2 are the same type, or if TYPE2
4347 is derived from TYPE1, or if TYPE2 is a pointer (reference) to a
4348 class derived from the type pointed to (referred to) by TYPE1. */
98e40e83 4349#define same_or_base_type_p(TYPE1, TYPE2) \
96d84882 4350 comptypes ((TYPE1), (TYPE2), COMPARE_BASE)
3bfdc719 4351
f84b4be9 4352/* These macros are used to access a TEMPLATE_PARM_INDEX. */
da8a66fc
ML
4353#define TEMPLATE_PARM_INDEX_CAST(NODE) \
4354 ((template_parm_index*)TEMPLATE_PARM_INDEX_CHECK (NODE))
4355#define TEMPLATE_PARM_IDX(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->index)
4356#define TEMPLATE_PARM_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->level)
6f1abb06
DS
4357/* The Number of sibling parms this template parm has. */
4358#define TEMPLATE_PARM_NUM_SIBLINGS(NODE) \
4359 (TEMPLATE_PARM_INDEX_CAST (NODE)->num_siblings)
f84b4be9 4360#define TEMPLATE_PARM_DESCENDANTS(NODE) (TREE_CHAIN (NODE))
da8a66fc
ML
4361#define TEMPLATE_PARM_ORIG_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->orig_level)
4362#define TEMPLATE_PARM_DECL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->decl)
30bcc028
DG
4363#define TEMPLATE_PARM_PARAMETER_PACK(NODE) \
4364 (TREE_LANG_FLAG_0 (TEMPLATE_PARM_INDEX_CHECK (NODE)))
f84b4be9 4365
bb20cc46 4366/* These macros are for accessing the fields of TEMPLATE_TYPE_PARM,
a1281f45 4367 TEMPLATE_TEMPLATE_PARM and BOUND_TEMPLATE_TEMPLATE_PARM nodes. */
51545682
NF
4368#define TEMPLATE_TYPE_PARM_INDEX(NODE) \
4369 (TYPE_VALUES_RAW (TREE_CHECK3 ((NODE), TEMPLATE_TYPE_PARM, \
4370 TEMPLATE_TEMPLATE_PARM, \
4371 BOUND_TEMPLATE_TEMPLATE_PARM)))
f84b4be9
JM
4372#define TEMPLATE_TYPE_IDX(NODE) \
4373 (TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (NODE)))
4374#define TEMPLATE_TYPE_LEVEL(NODE) \
4375 (TEMPLATE_PARM_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
4376#define TEMPLATE_TYPE_ORIG_LEVEL(NODE) \
4377 (TEMPLATE_PARM_ORIG_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
4378#define TEMPLATE_TYPE_DECL(NODE) \
4379 (TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
5d80a306
DG
4380#define TEMPLATE_TYPE_PARAMETER_PACK(NODE) \
4381 (TEMPLATE_PARM_PARAMETER_PACK (TEMPLATE_TYPE_PARM_INDEX (NODE)))
8d08fdba 4382
761f0855
GDR
4383/* These constants can used as bit flags in the process of tree formatting.
4384
4385 TFF_PLAIN_IDENTIFIER: unqualified part of a name.
749ced52 4386 TFF_SCOPE: include the class and namespace scope of the name.
761f0855
GDR
4387 TFF_CHASE_TYPEDEF: print the original type-id instead of the typedef-name.
4388 TFF_DECL_SPECIFIERS: print decl-specifiers.
4389 TFF_CLASS_KEY_OR_ENUM: precede a class-type name (resp. enum name) with
4390 a class-key (resp. `enum').
4391 TFF_RETURN_TYPE: include function return type.
4392 TFF_FUNCTION_DEFAULT_ARGUMENTS: include function default parameter values.
4393 TFF_EXCEPTION_SPECIFICATION: show function exception specification.
aab8454a 4394 TFF_TEMPLATE_HEADER: show the template<...> header in a
761f0855 4395 template-declaration.
761f0855 4396 TFF_TEMPLATE_NAME: show only template-name.
303357a7 4397 TFF_EXPR_IN_PARENS: parenthesize expressions.
a0ad3539
MM
4398 TFF_NO_FUNCTION_ARGUMENTS: don't show function arguments.
4399 TFF_UNQUALIFIED_NAME: do not print the qualifying scope of the
b5b8b0ac
AO
4400 top-level entity.
4401 TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments
4402 identical to their defaults. */
761f0855 4403
0cbd7506
MS
4404#define TFF_PLAIN_IDENTIFIER (0)
4405#define TFF_SCOPE (1)
4406#define TFF_CHASE_TYPEDEF (1 << 1)
4407#define TFF_DECL_SPECIFIERS (1 << 2)
4408#define TFF_CLASS_KEY_OR_ENUM (1 << 3)
4409#define TFF_RETURN_TYPE (1 << 4)
4410#define TFF_FUNCTION_DEFAULT_ARGUMENTS (1 << 5)
4411#define TFF_EXCEPTION_SPECIFICATION (1 << 6)
4412#define TFF_TEMPLATE_HEADER (1 << 7)
4413#define TFF_TEMPLATE_NAME (1 << 8)
4414#define TFF_EXPR_IN_PARENS (1 << 9)
4415#define TFF_NO_FUNCTION_ARGUMENTS (1 << 10)
a0ad3539 4416#define TFF_UNQUALIFIED_NAME (1 << 11)
b5b8b0ac 4417#define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS (1 << 12)
9e93bc9d 4418
1899c3a4
KL
4419/* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM
4420 node. */
bb20cc46 4421#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL(NODE) \
a1281f45 4422 ((TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM) \
bb20cc46 4423 ? TYPE_TI_TEMPLATE (NODE) \
1899c3a4
KL
4424 : TYPE_NAME (NODE))
4425
51c184be 4426/* in lex.c */
f5e99456 4427
b2f29cd9 4428extern void init_reswords (void);
f5e99456 4429
d1b38208 4430typedef struct GTY(()) operator_name_info_t {
596ea4e5
AS
4431 /* The IDENTIFIER_NODE for the operator. */
4432 tree identifier;
4433 /* The name of the operator. */
4434 const char *name;
4435 /* The mangled name of the operator. */
4436 const char *mangled_name;
3fa3c4bd
MM
4437 /* The arity of the operator. */
4438 int arity;
596ea4e5
AS
4439} operator_name_info_t;
4440
4441/* A mapping from tree codes to operator name information. */
17211ab5 4442extern GTY(()) operator_name_info_t operator_name_info
c0ed0531 4443 [(int) MAX_TREE_CODES];
596ea4e5 4444/* Similar, but for assignment operators. */
17211ab5 4445extern GTY(()) operator_name_info_t assignment_operator_name_info
c0ed0531 4446 [(int) MAX_TREE_CODES];
596ea4e5 4447
3c01e5df
MM
4448/* A type-qualifier, or bitmask therefore, using the TYPE_QUAL
4449 constants. */
4450
4451typedef int cp_cv_quals;
4452
b5da71d4
VV
4453/* Non-static member functions have an optional virt-specifier-seq.
4454 There is a VIRT_SPEC value for each virt-specifier.
4455 They can be combined by bitwise-or to form the complete set of
4456 virt-specifiers for a member function. */
4457enum virt_specifier
4458 {
4459 VIRT_SPEC_UNSPECIFIED = 0x0,
4460 VIRT_SPEC_FINAL = 0x1,
4461 VIRT_SPEC_OVERRIDE = 0x2
4462 };
4463
4464/* A type-qualifier, or bitmask therefore, using the VIRT_SPEC
4465 constants. */
4466
4467typedef int cp_virt_specifiers;
4468
62d1db17
MM
4469/* A storage class. */
4470
4471typedef enum cp_storage_class {
4472 /* sc_none must be zero so that zeroing a cp_decl_specifier_seq
4473 sets the storage_class field to sc_none. */
4474 sc_none = 0,
4475 sc_auto,
4476 sc_register,
4477 sc_static,
4478 sc_extern,
5e7752d2 4479 sc_mutable
62d1db17
MM
4480} cp_storage_class;
4481
4482/* An individual decl-specifier. */
4483
4484typedef enum cp_decl_spec {
4485 ds_first,
4486 ds_signed = ds_first,
4487 ds_unsigned,
4488 ds_short,
4489 ds_long,
4490 ds_const,
4491 ds_volatile,
4492 ds_restrict,
4493 ds_inline,
4494 ds_virtual,
4495 ds_explicit,
4496 ds_friend,
4497 ds_typedef,
7ecbca9d 4498 ds_constexpr,
62d1db17
MM
4499 ds_complex,
4500 ds_thread,
4501 ds_last
4502} cp_decl_spec;
4503
4504/* A decl-specifier-seq. */
4505
4506typedef struct cp_decl_specifier_seq {
4507 /* The number of times each of the keywords has been seen. */
4508 unsigned specs[(int) ds_last];
673c6299
NF
4509 /* The location of the primary type. Mainly used for error
4510 reporting. */
4511 location_t type_location;
62d1db17
MM
4512 /* The primary type, if any, given by the decl-specifier-seq.
4513 Modifiers, like "short", "const", and "unsigned" are not
4514 reflected here. This field will be a TYPE, unless a typedef-name
4515 was used, in which case it will be a TYPE_DECL. */
4516 tree type;
4517 /* The attributes, if any, provided with the specifier sequence. */
4518 tree attributes;
4519 /* If non-NULL, a built-in type that the user attempted to redefine
4520 to some other type. */
4521 tree redefined_builtin_type;
4522 /* The storage class specified -- or sc_none if no storage class was
4523 explicitly specified. */
4524 cp_storage_class storage_class;
4525 /* True iff TYPE_SPEC indicates a user-defined type. */
4526 BOOL_BITFIELD user_defined_type_p : 1;
4527 /* True iff multiple types were (erroneously) specified for this
4528 decl-specifier-seq. */
4529 BOOL_BITFIELD multiple_types_p : 1;
4530 /* True iff multiple storage classes were (erroneously) specified
26106542
LM
4531 for this decl-specifier-seq or a combination of a storage class
4532 with a typedef specifier. */
4533 BOOL_BITFIELD conflicting_specifiers_p : 1;
62d1db17
MM
4534 /* True iff at least one decl-specifier was found. */
4535 BOOL_BITFIELD any_specifiers_p : 1;
67dc1f24
JM
4536 /* True iff at least one type-specifier was found. */
4537 BOOL_BITFIELD any_type_specifiers_p : 1;
62d1db17
MM
4538 /* True iff "int" was explicitly provided. */
4539 BOOL_BITFIELD explicit_int_p : 1;
a6766312
KT
4540 /* True iff "__int128" was explicitly provided. */
4541 BOOL_BITFIELD explicit_int128_p : 1;
62d1db17
MM
4542 /* True iff "char" was explicitly provided. */
4543 BOOL_BITFIELD explicit_char_p : 1;
4544} cp_decl_specifier_seq;
4545
058b15c1
MM
4546/* The various kinds of declarators. */
4547
4548typedef enum cp_declarator_kind {
4549 cdk_id,
4550 cdk_function,
4551 cdk_array,
4552 cdk_pointer,
4553 cdk_reference,
4554 cdk_ptrmem,
4555 cdk_error
4556} cp_declarator_kind;
4557
4558/* A declarator. */
4559
4560typedef struct cp_declarator cp_declarator;
4561
4562typedef struct cp_parameter_declarator cp_parameter_declarator;
4563
4564/* A parameter, before it has been semantically analyzed. */
4565struct cp_parameter_declarator {
4566 /* The next parameter, or NULL_TREE if none. */
4567 cp_parameter_declarator *next;
4568 /* The decl-specifiers-seq for the parameter. */
62d1db17 4569 cp_decl_specifier_seq decl_specifiers;
058b15c1
MM
4570 /* The declarator for the parameter. */
4571 cp_declarator *declarator;
4572 /* The default-argument expression, or NULL_TREE, if none. */
4573 tree default_argument;
4574 /* True iff this is the first parameter in the list and the
4575 parameter sequence ends with an ellipsis. */
4576 bool ellipsis_p;
4577};
4578
4579/* A declarator. */
4580struct cp_declarator {
4581 /* The kind of declarator. */
30bcc028
DG
4582 ENUM_BITFIELD (cp_declarator_kind) kind : 4;
4583 /* Whether we parsed an ellipsis (`...') just before the declarator,
4584 to indicate this is a parameter pack. */
4585 BOOL_BITFIELD parameter_pack_p : 1;
673c6299 4586 location_t id_loc; /* Currently only set for cdk_id and cdk_function. */
058b15c1
MM
4587 /* Attributes that apply to this declarator. */
4588 tree attributes;
4589 /* For all but cdk_id and cdk_error, the contained declarator. For
4590 cdk_id and cdk_error, guaranteed to be NULL. */
4591 cp_declarator *declarator;
4592 union {
4593 /* For identifiers. */
4594 struct {
2f2bc524 4595 /* If non-NULL, the qualifying scope (a NAMESPACE_DECL or
0cbd7506 4596 *_TYPE) for this identifier. */
1d786913
MM
4597 tree qualifying_scope;
4598 /* The unqualified name of the entity -- an IDENTIFIER_NODE,
4599 BIT_NOT_EXPR, or TEMPLATE_ID_EXPR. */
4600 tree unqualified_name;
058b15c1
MM
4601 /* If this is the name of a function, what kind of special
4602 function (if any). */
4603 special_function_kind sfk;
4604 } id;
4605 /* For functions. */
4606 struct {
b344d949
JM
4607 /* The parameters to the function as a TREE_LIST of decl/default. */
4608 tree parameters;
058b15c1 4609 /* The cv-qualifiers for the function. */
3c01e5df 4610 cp_cv_quals qualifiers;
b5da71d4
VV
4611 /* The virt-specifiers for the function. */
4612 cp_virt_specifiers virt_specifiers;
058b15c1
MM
4613 /* The exception-specification for the function. */
4614 tree exception_specification;
f57ca1ea
JM
4615 /* The late-specified return type, if any. */
4616 tree late_return_type;
058b15c1
MM
4617 } function;
4618 /* For arrays. */
4619 struct {
4620 /* The bounds to the array. */
4621 tree bounds;
4622 } array;
8af2fec4 4623 /* For cdk_pointer and cdk_ptrmem. */
058b15c1
MM
4624 struct {
4625 /* The cv-qualifiers for the pointer. */
3c01e5df 4626 cp_cv_quals qualifiers;
058b15c1
MM
4627 /* For cdk_ptrmem, the class type containing the member. */
4628 tree class_type;
4629 } pointer;
8af2fec4
RY
4630 /* For cdk_reference */
4631 struct {
4632 /* The cv-qualifiers for the reference. These qualifiers are
4633 only used to diagnose ill-formed code. */
4634 cp_cv_quals qualifiers;
4635 /* Whether this is an rvalue reference */
4636 bool rvalue_ref;
4637 } reference;
058b15c1
MM
4638 } u;
4639};
4640
e2c3721c 4641/* A level of template instantiation. */
d1b38208 4642struct GTY(()) tinst_level {
e2c3721c
PB
4643 /* The immediately deeper level in the chain. */
4644 struct tinst_level *next;
4645
4646 /* The original node. Can be either a DECL (for a function or static
4647 data member) or a TYPE (for a class), depending on what we were
4648 asked to instantiate. */
4649 tree decl;
4650
4651 /* The location where the template is instantiated. */
4652 location_t locus;
4653
4654 /* True if the location is in a system header. */
4655 bool in_system_header_p;
4656};
4657
7e1352fe
NF
4658/* Return the type of the `this' parameter of FNTYPE. */
4659
4660static inline tree
4661type_of_this_parm (const_tree fntype)
4662{
4663 function_args_iterator iter;
4664 gcc_assert (TREE_CODE (fntype) == METHOD_TYPE);
4665 function_args_iter_init (&iter, fntype);
4666 return function_args_iter_cond (&iter);
4667}
4668
4669/* Return the class of the `this' parameter of FNTYPE. */
4670
4671static inline tree
4672class_of_this_parm (const_tree fntype)
4673{
4674 return TREE_TYPE (type_of_this_parm (fntype));
4675}
4676
058b15c1
MM
4677/* A parameter list indicating for a function with no parameters,
4678 e.g "int f(void)". */
4679extern cp_parameter_declarator *no_parameters;
4680
359b8672
AH
4681/* True if we saw "#pragma GCC java_exceptions". */
4682extern bool pragma_java_exceptions;
4683
51c184be 4684/* in call.c */
0cbd7506 4685extern bool check_dtor_name (tree, tree);
158991b7 4686
5ade1ed2
DG
4687extern tree build_conditional_expr (tree, tree, tree,
4688 tsubst_flags_t);
0cbd7506 4689extern tree build_addr_func (tree);
94a0dd7b
SL
4690extern tree build_call_a (tree, int, tree*);
4691extern tree build_call_n (tree, int, ...);
0cbd7506 4692extern bool null_ptr_cst_p (tree);
58f9752a 4693extern bool sufficient_parms_p (const_tree);
0cbd7506
MS
4694extern tree type_decays_to (tree);
4695extern tree build_user_type_conversion (tree, tree, int);
c166b898 4696extern tree build_new_function_call (tree, VEC(tree,gc) **, bool,
5ade1ed2 4697 tsubst_flags_t);
c166b898
ILT
4698extern tree build_operator_new_call (tree, VEC(tree,gc) **, tree *,
4699 tree *, tree *);
4700extern tree build_new_method_call (tree, tree, VEC(tree,gc) **,
4701 tree, int, tree *,
4702 tsubst_flags_t);
4703extern tree build_special_member_call (tree, tree, VEC(tree,gc) **,
4704 tree, int, tsubst_flags_t);
5ade1ed2
DG
4705extern tree build_new_op (enum tree_code, int, tree,
4706 tree, tree, bool *,
4707 tsubst_flags_t);
c166b898
ILT
4708extern tree build_op_call (tree, VEC(tree,gc) **,
4709 tsubst_flags_t);
63c9a190 4710extern tree build_op_delete_call (enum tree_code, tree, tree, bool, tree, tree);
0cbd7506 4711extern bool can_convert (tree, tree);
30f86ec3 4712extern bool can_convert_arg (tree, tree, tree, int);
c5adc427 4713extern bool can_convert_arg_bad (tree, tree, tree, int);
02022f3a 4714extern bool enforce_access (tree, tree, tree);
4c66d85a
JM
4715extern void push_defarg_context (tree);
4716extern void pop_defarg_context (void);
0cbd7506
MS
4717extern tree convert_default_arg (tree, tree, tree, int);
4718extern tree convert_arg_to_ellipsis (tree);
4719extern tree build_x_va_arg (tree, tree);
4720extern tree cxx_type_promotes_to (tree);
4721extern tree type_passed_as (tree);
4722extern tree convert_for_arg_passing (tree, tree);
4723extern bool is_properly_derived_from (tree, tree);
09357846 4724extern tree set_up_extended_ref_temp (tree, tree, tree *, tree *);
60d21717 4725extern tree initialize_reference (tree, tree, tree, tree *, tsubst_flags_t);
0cbd7506
MS
4726extern tree make_temporary_var_for_ref_to_temp (tree, tree);
4727extern tree strip_top_quals (tree);
e7f1930f 4728extern bool reference_related_p (tree, tree);
5ade1ed2 4729extern tree perform_implicit_conversion (tree, tree, tsubst_flags_t);
e57d93c6 4730extern tree perform_implicit_conversion_flags (tree, tree, tsubst_flags_t, int);
61f8d165 4731extern tree build_integral_nontype_arg_conv (tree, tree, tsubst_flags_t);
5ade1ed2
DG
4732extern tree perform_direct_initialization_if_possible (tree, tree, bool,
4733 tsubst_flags_t);
0cbd7506 4734extern tree in_charge_arg_for_name (tree);
94a0dd7b 4735extern tree build_cxx_call (tree, int, tree *);
09357846
JM
4736extern bool is_std_init_list (tree);
4737extern bool is_list_ctor (tree);
5bd61841 4738#ifdef ENABLE_CHECKING
0cbd7506 4739extern void validate_conversion_obstack (void);
5bd61841 4740#endif /* ENABLE_CHECKING */
8d08fdba 4741
51c184be 4742/* in class.c */
2650d9e1 4743extern tree build_vfield_ref (tree, tree);
0cbd7506
MS
4744extern tree build_base_path (enum tree_code, tree,
4745 tree, int);
798ec807
JM
4746extern tree convert_to_base (tree, tree, bool, bool,
4747 tsubst_flags_t);
0cbd7506 4748extern tree convert_to_base_statically (tree, tree);
b2f29cd9
NN
4749extern tree build_vtbl_ref (tree, tree);
4750extern tree build_vfn_ref (tree, tree);
0cbd7506
MS
4751extern tree get_vtable_decl (tree, int);
4752extern void resort_type_method_vec (void *, void *,
4753 gt_pointer_operator, void *);
b77fe7b4 4754extern bool add_method (tree, tree, tree);
fa6098f8 4755extern bool currently_open_class (tree);
b2f29cd9 4756extern tree currently_open_derived_class (tree);
a6846853 4757extern tree current_nonlambda_class_type (void);
b2f29cd9
NN
4758extern tree finish_struct (tree, tree);
4759extern void finish_struct_1 (tree);
4760extern int resolves_to_fixed_type_p (tree, int *);
4761extern void init_class_processing (void);
4762extern int is_empty_class (tree);
2588c9e9 4763extern bool is_really_empty_class (tree);
29370796 4764extern void pushclass (tree);
b2f29cd9 4765extern void popclass (void);
14d22dd6 4766extern void push_nested_class (tree);
b2f29cd9
NN
4767extern void pop_nested_class (void);
4768extern int current_lang_depth (void);
4769extern void push_lang_context (tree);
4770extern void pop_lang_context (void);
4771extern tree instantiate_type (tree, tree, tsubst_flags_t);
0cbd7506 4772extern void print_class_statistics (void);
b2f29cd9 4773extern void build_self_reference (void);
58f9752a 4774extern int same_signature_p (const_tree, const_tree);
b2f29cd9 4775extern void maybe_add_class_template_decl_list (tree, tree, int);
0cbd7506
MS
4776extern void unreverse_member_declarations (tree);
4777extern void invalidate_class_lookup_cache (void);
4778extern void maybe_note_name_used_in_class (tree, tree);
4779extern void note_name_declared_in_class (tree, tree);
4780extern tree get_vtbl_decl_for_binfo (tree);
bb885938 4781extern void debug_class (tree);
0cbd7506 4782extern void debug_thunks (tree);
0cbd7506
MS
4783extern void set_linkage_according_to_type (tree, tree);
4784extern void determine_key_method (tree);
4785extern void check_for_override (tree, tree);
3db45ab5
MS
4786extern void push_class_stack (void);
4787extern void pop_class_stack (void);
8c95264b 4788extern bool type_has_user_nondefault_constructor (tree);
6ad86a5b 4789extern tree in_class_defaulted_default_constructor (tree);
20f2653e 4790extern bool user_provided_p (tree);
b87d79e6
JM
4791extern bool type_has_user_provided_constructor (tree);
4792extern bool type_has_user_provided_default_constructor (tree);
0930cc0e 4793extern bool synthesized_default_constructor_is_constexpr (tree);
91ea6df3 4794extern bool type_has_constexpr_default_constructor (tree);
46408846 4795extern bool type_has_virtual_destructor (tree);
ac177431
JM
4796extern bool type_has_move_constructor (tree);
4797extern bool type_has_move_assign (tree);
95552437 4798extern bool type_build_ctor_call (tree);
20f2653e
JM
4799extern void defaulted_late_check (tree);
4800extern bool defaultable_fn_check (tree);
d0940d56 4801extern void fixup_type_variants (tree);
8943989d 4802extern void fixup_attribute_variants (tree);
b97e8a14 4803extern tree* decl_cloned_function_p (const_tree, bool);
2650d9e1
SZ
4804extern void clone_function_decl (tree, int);
4805extern void adjust_clone_args (tree);
8d08fdba 4806
51c184be 4807/* in cvt.c */
0cbd7506
MS
4808extern tree convert_to_reference (tree, tree, int, int, tree);
4809extern tree convert_from_reference (tree);
574cfaa4 4810extern tree force_rvalue (tree, tsubst_flags_t);
0cbd7506
MS
4811extern tree ocp_convert (tree, tree, int, int);
4812extern tree cp_convert (tree, tree);
07231d4f 4813extern tree cp_convert_and_check (tree, tree);
9771799c 4814extern tree cp_fold_convert (tree, tree);
ebeb2c24
SZ
4815extern tree convert_to_void (tree, impl_conv_void,
4816 tsubst_flags_t);
0cbd7506 4817extern tree convert_force (tree, tree, int);
0cbd7506
MS
4818extern tree build_expr_type_conversion (int, tree, bool);
4819extern tree type_promotes_to (tree);
4820extern tree perform_qualification_conversions (tree, tree);
8d08fdba 4821
2650d9e1 4822/* in name-lookup.c */
b2f29cd9 4823extern tree pushdecl (tree);
d63d5d0c 4824extern tree pushdecl_maybe_friend (tree, bool);
2650d9e1
SZ
4825extern void maybe_push_cleanup_level (tree);
4826extern tree pushtag (tree, tree, tag_scope);
4827extern tree make_anon_name (void);
4828extern tree pushdecl_top_level_maybe_friend (tree, bool);
4829extern tree pushdecl_top_level_and_finish (tree, tree);
4830extern tree check_for_out_of_scope_variable (tree);
4831extern void print_other_binding_stack (struct cp_binding_level *);
4832extern tree maybe_push_decl (tree);
ae099258 4833extern tree current_decl_namespace (void);
2650d9e1
SZ
4834
4835/* decl.c */
4836extern tree poplevel (int, int, int);
b2f29cd9 4837extern void cxx_init_decl_processing (void);
19114537 4838enum cp_tree_node_structure_enum cp_tree_node_structure
0cbd7506 4839 (union lang_tree_node *);
0cbd7506 4840extern void finish_scope (void);
b2f29cd9
NN
4841extern void push_switch (tree);
4842extern void pop_switch (void);
d5f4eddd 4843extern tree make_lambda_name (void);
b2f29cd9 4844extern int decls_match (tree, tree);
d63d5d0c 4845extern tree duplicate_decls (tree, tree, bool);
0cbd7506 4846extern tree declare_local_label (tree);
5b030314 4847extern tree define_label (location_t, tree);
b2f29cd9 4848extern void check_goto (tree);
1799e5d5 4849extern bool check_omp_return (void);
fc6a28d7 4850extern tree make_typename_type (tree, tree, enum tag_types, tsubst_flags_t);
b939a023 4851extern tree make_unbound_class_template (tree, tree, tree, tsubst_flags_t);
b2f29cd9
NN
4852extern tree build_library_fn_ptr (const char *, tree);
4853extern tree build_cp_library_fn_ptr (const char *, tree);
448083e5 4854extern tree push_library_fn (tree, tree, tree);
b2f29cd9
NN
4855extern tree push_void_library_fn (tree, tree);
4856extern tree push_throw_library_fn (tree, tree);
62d1db17
MM
4857extern tree check_tag_decl (cp_decl_specifier_seq *);
4858extern tree shadow_tag (cp_decl_specifier_seq *);
0d9c0892 4859extern tree groktypename (cp_decl_specifier_seq *, const cp_declarator *, bool);
4514aa8c 4860extern tree start_decl (const cp_declarator *, cp_decl_specifier_seq *, int, tree, tree, tree *);
e92fb501 4861extern void start_decl_1 (tree, bool);
23bee8f4 4862extern bool check_array_initializer (tree, tree, tree);
d174af6c 4863extern void cp_finish_decl (tree, tree, bool, tree, int);
aab038d5 4864extern int cp_complete_array_type (tree *, tree, bool);
80c6dcf5 4865extern int cp_complete_array_type_or_error (tree *, tree, bool, tsubst_flags_t);
b2f29cd9 4866extern tree build_ptrmemfunc_type (tree);
0cbd7506 4867extern tree build_ptrmem_type (tree, tree);
f30432d7 4868/* the grokdeclarator prototype is in decl.h */
3db45ab5 4869extern tree build_this_parm (tree, cp_cv_quals);
58f9752a
KG
4870extern int copy_fn_p (const_tree);
4871extern bool move_fn_p (const_tree);
0cbd7506 4872extern tree get_scope_of_declarator (const cp_declarator *);
b2f29cd9 4873extern void grok_special_member_properties (tree);
58f9752a 4874extern int grok_ctor_properties (const_tree, const_tree);
398cd199 4875extern bool grok_op_properties (tree, bool);
29ef83de
KL
4876extern tree xref_tag (enum tag_types, tree, tag_scope, bool);
4877extern tree xref_tag_from_type (tree, tree, tag_scope);
72f8fc59 4878extern bool xref_basetypes (tree, tree);
90ecaf87
RRC
4879extern tree start_enum (tree, tree, tree, bool, bool *);
4880extern void finish_enum_value_list (tree);
b2f29cd9 4881extern void finish_enum (tree);
4cc2a722 4882extern void build_enumerator (tree, tree, tree, location_t);
adf2edec 4883extern tree lookup_enumerator (tree, tree);
0cbd7506 4884extern void start_preparsed_function (tree, tree, int);
62d1db17 4885extern int start_function (cp_decl_specifier_seq *, const cp_declarator *, tree);
b2f29cd9
NN
4886extern tree begin_function_body (void);
4887extern void finish_function_body (tree);
a68ab351 4888extern tree outer_curly_brace_block (tree);
b2f29cd9 4889extern tree finish_function (int);
02c5ff73 4890extern tree grokmethod (cp_decl_specifier_seq *, const cp_declarator *, tree);
0cbd7506 4891extern void maybe_register_incomplete_var (tree);
68017cb4 4892extern void maybe_commonize_var (tree);
b2f29cd9
NN
4893extern void complete_vars (tree);
4894extern void finish_stmt (void);
7bead48f 4895extern tree static_fn_type (tree);
0cbd7506
MS
4896extern void revert_static_member_fn (tree);
4897extern void fixup_anonymous_aggr (tree);
4898extern int check_static_variable_definition (tree, tree);
fa2200cb 4899extern tree compute_array_index_type (tree, tree, tsubst_flags_t);
0cbd7506
MS
4900extern tree check_default_argument (tree, tree);
4901typedef int (*walk_namespaces_fn) (tree, void *);
4902extern int walk_namespaces (walk_namespaces_fn,
4903 void *);
4904extern int wrapup_globals_for_namespace (tree, void *);
4905extern tree create_implicit_typedef (tree, tree);
ac7d7749 4906extern int local_variable_p (const_tree);
0cbd7506
MS
4907extern tree register_dtor_fn (tree);
4908extern tmpl_spec_kind current_tmpl_spec_kind (int);
bb885938 4909extern tree cp_fname_init (const char *, tree *);
c79efc4d 4910extern tree cxx_builtin_function (tree decl);
5779e713 4911extern tree cxx_builtin_function_ext_scope (tree decl);
0cbd7506
MS
4912extern tree check_elaborated_type_specifier (enum tag_types, tree, bool);
4913extern void warn_extern_redeclared_static (tree, tree);
fc26fae3 4914extern tree cxx_comdat_group (tree);
6de9cd9a 4915extern bool cp_missing_noreturn_ok_p (tree);
9d6a019c 4916extern void initialize_artificial_var (tree, VEC(constructor_elt,gc) *);
0cbd7506 4917extern tree check_var_type (tree, tree);
754af126 4918extern tree reshape_init (tree, tree, tsubst_flags_t);
d4b5fb22 4919extern tree next_initializable_field (tree);
47aa0df4 4920
3368cdd3
JJ
4921extern bool defer_mark_used_calls;
4922extern GTY(()) VEC(tree, gc) *deferred_mark_used_calls;
c2255bc4 4923extern tree finish_case_label (location_t, tree, tree);
574cfaa4 4924extern tree cxx_maybe_build_cleanup (tree, tsubst_flags_t);
3368cdd3 4925
51c184be 4926/* in decl2.c */
0cbd7506 4927extern bool check_java_method (tree);
3db45ab5 4928extern tree build_memfn_type (tree, tree, cp_cv_quals);
643d4cd6 4929extern tree change_return_type (tree, tree);
0cbd7506
MS
4930extern void maybe_retrofit_in_chrg (tree);
4931extern void maybe_make_one_only (tree);
d6dcdbd5 4932extern bool vague_linkage_p (tree);
0cbd7506 4933extern void grokclassfn (tree, tree,
e2537f2c 4934 enum overload_flags);
0cbd7506 4935extern tree grok_array_decl (tree, tree);
574cfaa4 4936extern tree delete_sanity (tree, tree, bool, int, tsubst_flags_t);
0cbd7506
MS
4937extern tree check_classfn (tree, tree, tree);
4938extern void check_member_template (tree);
4939extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *,
d174af6c 4940 tree, bool, tree, tree);
0cbd7506 4941extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *,
a6d9bc9d 4942 tree, tree);
5dc11954 4943extern tree cp_reconstruct_complex_type (tree, tree);
0cbd7506
MS
4944extern void cplus_decl_attributes (tree *, tree, int);
4945extern void finish_anon_union (tree);
e4305460 4946extern void cp_write_global_declarations (void);
0cbd7506
MS
4947extern tree coerce_new_type (tree);
4948extern tree coerce_delete_type (tree);
4949extern void comdat_linkage (tree);
4950extern void determine_visibility (tree);
b9e75696 4951extern void constrain_class_visibility (tree);
0cbd7506 4952extern void import_export_decl (tree);
c38e9817 4953extern tree build_cleanup (tree);
c166b898 4954extern tree build_offset_ref_call_from_tree (tree, VEC(tree,gc) **);
aef4a215
JM
4955extern bool decl_constant_var_p (tree);
4956extern bool decl_maybe_constant_var_p (tree);
0cbd7506
MS
4957extern void check_default_args (tree);
4958extern void mark_used (tree);
d174af6c 4959extern void finish_static_data_member_decl (tree, tree, bool, tree, int);
0cbd7506
MS
4960extern tree cp_build_parm_decl (tree, tree);
4961extern tree get_guard (tree);
4962extern tree get_guard_cond (tree);
4963extern tree set_guard (tree);
c4e622b6 4964extern tree cxx_callgraph_analyze_expr (tree *, int *);
0cbd7506
MS
4965extern void mark_needed (tree);
4966extern bool decl_needed_p (tree);
4967extern void note_vague_linkage_fn (tree);
3db45ab5 4968extern tree build_artificial_parm (tree, tree);
4847609e 4969extern bool possibly_inlined_p (tree);
448545cb 4970extern int parm_index (tree);
8d08fdba 4971
824b9a4c 4972/* in error.c */
b2f29cd9
NN
4973extern void init_error (void);
4974extern const char *type_as_string (tree, int);
f41c4af3 4975extern const char *type_as_string_translate (tree, int);
b2f29cd9 4976extern const char *decl_as_string (tree, int);
f41c4af3 4977extern const char *decl_as_string_translate (tree, int);
b2f29cd9 4978extern const char *expr_as_string (tree, int);
f41c4af3 4979extern const char *lang_decl_name (tree, int, bool);
0cbd7506
MS
4980extern const char *language_to_string (enum languages);
4981extern const char *class_key_or_enum_as_string (tree);
4982extern void print_instantiation_context (void);
5d80a306 4983extern void maybe_warn_variadic_templates (void);
848f237b 4984extern void maybe_warn_cpp0x (cpp0x_warn_str str);
59cc9210 4985extern bool pedwarn_cxx98 (location_t, int, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
501c95ff 4986extern location_t location_of (tree);
993acb36
NF
4987extern void qualified_name_lookup_error (tree, tree, tree,
4988 location_t);
824b9a4c 4989
51c184be 4990/* in except.c */
b2f29cd9
NN
4991extern void init_exception_processing (void);
4992extern tree expand_start_catch_block (tree);
4993extern void expand_end_catch_block (void);
b2f29cd9
NN
4994extern tree build_exc_ptr (void);
4995extern tree build_throw (tree);
58f9752a 4996extern int nothrow_libfn_p (const_tree);
b2f29cd9 4997extern void check_handlers (tree);
59f9c2ed 4998extern tree finish_noexcept_expr (tree, tsubst_flags_t);
2c5df20f 4999extern void perform_deferred_noexcept_checks (void);
3a55fb4c
JM
5000extern bool nothrow_spec_p (const_tree);
5001extern bool type_noexcept_p (const_tree);
5002extern bool type_throw_all_p (const_tree);
5003extern tree build_noexcept_spec (tree, int);
b2f29cd9 5004extern void choose_personality_routine (enum languages);
6cad4e17 5005extern tree eh_type_info (tree);
2650d9e1
SZ
5006extern tree begin_eh_spec_block (void);
5007extern void finish_eh_spec_block (tree, tree);
f9417da1 5008extern tree build_eh_type_type (tree);
3b06d379 5009extern tree cp_protect_cleanup_actions (void);
8d08fdba 5010
51c184be 5011/* in expr.c */
0cbd7506 5012extern tree cplus_expand_constant (tree);
03a904b5
JJ
5013extern tree mark_rvalue_use (tree);
5014extern tree mark_lvalue_use (tree);
5015extern tree mark_type_use (tree);
5016extern void mark_exp_read (tree);
8d08fdba 5017
bd6dd845 5018/* friend.c */
b2f29cd9 5019extern int is_friend (tree, tree);
19db77ce 5020extern void make_friend_class (tree, tree, bool);
0cbd7506 5021extern void add_friend (tree, tree, bool);
e2537f2c 5022extern tree do_friend (tree, tree, tree, tree, enum overload_flags, bool);
bd6dd845 5023
51c184be 5024/* in init.c */
1f5a253a 5025extern tree expand_member_init (tree);
2282d28d 5026extern void emit_mem_initializers (tree);
5ade1ed2
DG
5027extern tree build_aggr_init (tree, tree, int,
5028 tsubst_flags_t);
9e1e64ec 5029extern int is_class_type (tree, int);
b2f29cd9 5030extern tree get_type_value (tree);
0cbd7506 5031extern tree build_zero_init (tree, tree, bool);
309714d4
JM
5032extern tree build_value_init (tree, tsubst_flags_t);
5033extern tree build_value_init_noctor (tree, tsubst_flags_t);
a5ac359a 5034extern tree build_offset_ref (tree, tree, bool);
c166b898
ILT
5035extern tree build_new (VEC(tree,gc) **, tree, tree,
5036 VEC(tree,gc) **, int,
5ade1ed2 5037 tsubst_flags_t);
fe5b5c36 5038extern tree get_temp_regvar (tree, tree);
5ade1ed2
DG
5039extern tree build_vec_init (tree, tree, tree, bool, int,
5040 tsubst_flags_t);
0cbd7506
MS
5041extern tree build_delete (tree, tree,
5042 special_function_kind,
574cfaa4 5043 int, int, tsubst_flags_t);
b2f29cd9 5044extern void push_base_cleanups (void);
0cbd7506 5045extern tree build_vec_delete (tree, tree,
574cfaa4
JM
5046 special_function_kind, int,
5047 tsubst_flags_t);
0cbd7506
MS
5048extern tree create_temporary_var (tree);
5049extern void initialize_vtbl_ptrs (tree);
5050extern tree build_java_class_ref (tree);
5051extern tree integral_constant_value (tree);
40bb78ad 5052extern int diagnose_uninitialized_cst_or_ref_member (tree, bool, bool);
8d08fdba 5053
51c184be 5054/* in lex.c */
b2f29cd9 5055extern void cxx_dup_lang_specific_decl (tree);
b2f29cd9 5056extern void yyungetc (int, int);
b2f29cd9 5057
0cbd7506
MS
5058extern tree unqualified_name_lookup_error (tree);
5059extern tree unqualified_fn_lookup_error (tree);
b2f29cd9 5060extern tree build_lang_decl (enum tree_code, tree, tree);
4cc2a722 5061extern tree build_lang_decl_loc (location_t, enum tree_code, tree, tree);
b2f29cd9 5062extern void retrofit_lang_decl (tree);
0cbd7506
MS
5063extern tree copy_decl (tree);
5064extern tree copy_type (tree);
b2f29cd9 5065extern tree cxx_make_type (enum tree_code);
9e1e64ec 5066extern tree make_class_type (enum tree_code);
4bfec483 5067extern bool cxx_init (void);
0cbd7506 5068extern void cxx_finish (void);
61172206 5069extern bool in_main_input_context (void);
8d08fdba 5070
51c184be 5071/* in method.c */
0cbd7506
MS
5072extern void init_method (void);
5073extern tree make_thunk (tree, bool, tree, tree);
5074extern void finish_thunk (tree);
5075extern void use_thunk (tree, bool);
ac177431
JM
5076extern bool trivial_fn_p (tree);
5077extern bool maybe_explain_implicit_delete (tree);
0cbd7506 5078extern void synthesize_method (tree);
0cbd7506
MS
5079extern tree lazily_declare_fn (special_function_kind,
5080 tree);
58f9752a
KG
5081extern tree skip_artificial_parms_for (const_tree, tree);
5082extern int num_artificial_parms_for (const_tree);
0cbd7506 5083extern tree make_alias_for (tree, tree);
4577f730 5084extern tree get_copy_ctor (tree, tsubst_flags_t);
ac177431
JM
5085extern tree get_copy_assign (tree);
5086extern tree get_default_ctor (tree);
4577f730 5087extern tree get_dtor (tree, tsubst_flags_t);
ac177431 5088extern tree locate_ctor (tree);
8d08fdba 5089
46e8c075 5090/* In optimize.c */
0cbd7506 5091extern bool maybe_clone_body (tree);
46e8c075 5092
51c184be 5093/* in pt.c */
157b0647 5094extern bool check_template_shadow (tree);
0cbd7506 5095extern tree get_innermost_template_args (tree, int);
b2f29cd9
NN
5096extern void maybe_begin_member_template_processing (tree);
5097extern void maybe_end_member_template_processing (void);
0cbd7506 5098extern tree finish_member_template_decl (tree);
b2f29cd9 5099extern void begin_template_parm_list (void);
9b910171 5100extern bool begin_specialization (void);
0cbd7506
MS
5101extern void reset_specialization (void);
5102extern void end_specialization (void);
5103extern void begin_explicit_instantiation (void);
5104extern void end_explicit_instantiation (void);
5105extern tree check_explicit_specialization (tree, tree, int, int);
86a09a9e
JM
5106extern tree make_auto (void);
5107extern tree do_auto_deduction (tree, tree, tree);
5108extern tree type_uses_auto (tree);
aa373032
DS
5109extern void append_type_to_template_for_access_check (tree, tree, tree,
5110 location_t);
f57ca1ea 5111extern tree splice_late_return_type (tree, tree);
86a09a9e 5112extern bool is_auto (const_tree);
c2255bc4 5113extern tree process_template_parm (tree, location_t, tree,
6f1abb06 5114 bool, bool, unsigned);
b2f29cd9 5115extern tree end_template_parm_list (tree);
bc44baad 5116void fixup_template_parms (void);
b2f29cd9 5117extern void end_template_decl (void);
04daa92b 5118extern tree maybe_update_decl_type (tree, tree);
9b7dd5e8 5119extern bool check_default_tmpl_args (tree, tree, int, int, int);
b2f29cd9 5120extern tree push_template_decl (tree);
d63d5d0c 5121extern tree push_template_decl_real (tree, bool);
60feef2c 5122extern bool redeclare_class_template (tree, tree);
0cbd7506
MS
5123extern tree lookup_template_class (tree, tree, tree, tree,
5124 int, tsubst_flags_t);
5125extern tree lookup_template_function (tree, tree);
b2f29cd9 5126extern int uses_template_parms (tree);
d43f603d 5127extern int uses_template_parms_level (tree, int);
b2f29cd9 5128extern tree instantiate_class_template (tree);
3e4a3562 5129extern tree instantiate_template (tree, tree, tsubst_flags_t);
c166b898
ILT
5130extern int fn_type_unification (tree, tree, tree,
5131 const tree *, unsigned int,
30f86ec3 5132 tree, unification_kind_t, int);
b2f29cd9 5133extern void mark_decl_instantiated (tree, int);
dda04398 5134extern int more_specialized_fn (tree, tree, int);
eb8845be 5135extern void do_decl_instantiation (tree, tree);
b2f29cd9 5136extern void do_type_instantiation (tree, tree, tsubst_flags_t);
15305a73 5137extern bool always_instantiate_p (tree);
eba839f9 5138extern tree instantiate_decl (tree, int, bool);
58f9752a 5139extern int comp_template_parms (const_tree, const_tree);
5d80a306 5140extern bool uses_parameter_packs (tree);
58f9752a 5141extern bool template_parameter_pack_p (const_tree);
d40a19da
DS
5142extern bool function_parameter_pack_p (const_tree);
5143extern bool function_parameter_expanded_from_pack_p (tree, tree);
5d80a306 5144extern tree make_pack_expansion (tree);
7b3e2d46 5145extern bool check_for_bare_parameter_packs (tree);
aa373032 5146extern tree build_template_info (tree, tree);
f9329c35 5147extern tree get_template_info (const_tree);
aa373032 5148extern VEC(qualified_typedef_usage_t,gc)* get_types_needing_access_check (tree);
0cbd7506
MS
5149extern int template_class_depth (tree);
5150extern int is_specialization_of (tree, tree);
5151extern bool is_specialization_of_friend (tree, tree);
5f5babf1 5152extern tree get_pattern_parm (tree, tree);
0cbd7506 5153extern int comp_template_args (tree, tree);
9ce387d9 5154extern tree maybe_process_partial_specialization (tree);
0cbd7506
MS
5155extern tree most_specialized_instantiation (tree);
5156extern void print_candidates (tree);
5157extern void instantiate_pending_templates (int);
5158extern tree tsubst_default_argument (tree, tree, tree);
d5c8be27 5159extern tree tsubst (tree, tree, tsubst_flags_t, tree);
0cbd7506 5160extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t,
015c2c66 5161 tree, bool, bool);
b2f29cd9
NN
5162extern tree most_general_template (tree);
5163extern tree get_mostly_instantiated_function_type (tree);
0cbd7506 5164extern int problematic_instantiation_changed (void);
b2f29cd9 5165extern void record_last_problematic_instantiation (void);
e2c3721c 5166extern struct tinst_level *current_instantiation(void);
a723baf1 5167extern tree maybe_get_template_decl_from_type_decl (tree);
67ffc812 5168extern int processing_template_parmlist;
0cbd7506 5169extern bool dependent_type_p (tree);
1cb801bc 5170extern bool dependent_scope_p (tree);
58f9752a 5171extern bool any_dependent_template_arguments_p (const_tree);
0cbd7506
MS
5172extern bool dependent_template_p (tree);
5173extern bool dependent_template_id_p (tree, tree);
5174extern bool type_dependent_expression_p (tree);
c166b898 5175extern bool any_type_dependent_arguments_p (const VEC(tree,gc) *);
d95f258e 5176extern bool any_type_dependent_elements_p (const_tree);
5094a795 5177extern bool type_dependent_expression_p_push (tree);
0cbd7506 5178extern bool value_dependent_expression_p (tree);
58f9752a 5179extern bool any_value_dependent_elements_p (const_tree);
a68ab351 5180extern bool dependent_omp_for_p (tree, tree, tree, tree);
0cbd7506
MS
5181extern tree resolve_typename_type (tree, bool);
5182extern tree template_for_substitution (tree);
5183extern tree build_non_dependent_expr (tree);
c166b898 5184extern void make_args_non_dependent (VEC(tree,gc) *);
0cbd7506
MS
5185extern bool reregister_specialization (tree, tree, tree);
5186extern tree fold_non_dependent_expr (tree);
9ba7a2f2 5187extern bool explicit_class_specialization_p (tree);
2a3dbebf
MM
5188extern int push_tinst_level (tree);
5189extern void pop_tinst_level (void);
e2c3721c 5190extern struct tinst_level *outermost_tinst_level(void);
172a4594 5191extern bool parameter_of_template_p (tree, tree);
2b110bfc 5192extern void init_template_processing (void);
7dcfe861 5193extern void print_template_statistics (void);
f9329c35 5194bool template_template_parameter_p (const_tree);
58926110 5195extern bool primary_template_instantiation_p (const_tree);
f9329c35 5196extern tree get_primary_template_innermost_parameters (const_tree);
3910807d 5197extern tree get_template_parms_at_level (tree, int);
f9329c35
DS
5198extern tree get_template_innermost_arguments (const_tree);
5199extern tree get_template_argument_pack_elems (const_tree);
ccb05613
JM
5200extern tree get_function_template_decl (const_tree);
5201extern tree resolve_nondeduced_context (tree);
c41095db 5202extern hashval_t iterative_hash_template_arg (tree arg, hashval_t val);
ccb05613 5203
824b9a4c 5204/* in repo.c */
0cbd7506
MS
5205extern void init_repo (void);
5206extern int repo_emit_p (tree);
58f9752a 5207extern bool repo_export_class_p (const_tree);
0cbd7506 5208extern void finish_repo (void);
824b9a4c
MS
5209
5210/* in rtti.c */
94214953 5211/* A vector of all tinfo decls that haven't been emitted yet. */
d4e6fecb 5212extern GTY(()) VEC(tree,gc) *unemitted_tinfo_decls;
a260bce6 5213
0cbd7506
MS
5214extern void init_rtti_processing (void);
5215extern tree build_typeid (tree);
5216extern tree get_tinfo_decl (tree);
5217extern tree get_typeid (tree);
6f06d231 5218extern tree build_headof (tree);
5ade1ed2 5219extern tree build_dynamic_cast (tree, tree, tsubst_flags_t);
0cbd7506
MS
5220extern void emit_support_tinfos (void);
5221extern bool emit_tinfo_decl (tree);
8d08fdba 5222
51c184be 5223/* in search.c */
0cbd7506
MS
5224extern bool accessible_base_p (tree, tree, bool);
5225extern tree lookup_base (tree, tree, base_access,
5226 base_kind *);
5227extern tree dcast_base_hint (tree, tree);
5228extern int accessible_p (tree, tree, bool);
5229extern tree lookup_field_1 (tree, tree, bool);
86ac0575 5230extern tree lookup_field (tree, tree, int, bool);
0cbd7506 5231extern int lookup_fnfields_1 (tree, tree);
ac177431 5232extern tree lookup_fnfields_slot (tree, tree);
0cbd7506 5233extern int class_method_index_for_fn (tree, tree);
b2f29cd9 5234extern tree lookup_fnfields (tree, tree, int);
86ac0575 5235extern tree lookup_member (tree, tree, int, bool);
b2f29cd9 5236extern int look_for_overrides (tree, tree);
0cbd7506 5237extern void get_pure_virtuals (tree);
b2f29cd9
NN
5238extern void maybe_suppress_debug_info (tree);
5239extern void note_debug_info_needed (tree);
b2f29cd9 5240extern void print_search_statistics (void);
b2f29cd9
NN
5241extern void reinit_search_statistics (void);
5242extern tree current_scope (void);
0cbd7506
MS
5243extern int at_function_scope_p (void);
5244extern bool at_class_scope_p (void);
5245extern bool at_namespace_scope_p (void);
b2f29cd9 5246extern tree context_for_name_lookup (tree);
9c7d5cae 5247extern tree lookup_conversions (tree);
b2f29cd9 5248extern tree binfo_from_vbase (tree);
58c42dc2 5249extern tree binfo_for_vbase (tree, tree);
b2f29cd9 5250extern tree look_for_overrides_here (tree, tree);
5d5a519f
NS
5251#define dfs_skip_bases ((tree)1)
5252extern tree dfs_walk_all (tree, tree (*) (tree, void *),
5253 tree (*) (tree, void *), void *);
5254extern tree dfs_walk_once (tree, tree (*) (tree, void *),
5255 tree (*) (tree, void *), void *);
0cbd7506
MS
5256extern tree binfo_via_virtual (tree, tree);
5257extern tree build_baselink (tree, tree, tree, tree);
9e259dd1 5258extern tree adjust_result_of_qualified_name_lookup
0cbd7506 5259 (tree, tree, tree);
dbbf88d1
NS
5260extern tree copied_binfo (tree, tree);
5261extern tree original_binfo (tree, tree);
0cbd7506 5262extern int shared_member_p (tree);
dbbf88d1 5263
d6b418fa
SM
5264
5265/* The representation of a deferred access check. */
5266
d1b38208 5267typedef struct GTY(()) deferred_access_check {
d6b418fa
SM
5268 /* The base class in which the declaration is referenced. */
5269 tree binfo;
5270 /* The declaration whose access must be checked. */
5271 tree decl;
5272 /* The declaration that should be used in the error message. */
5273 tree diag_decl;
5274} deferred_access_check;
5275DEF_VEC_O(deferred_access_check);
5276DEF_VEC_ALLOC_O(deferred_access_check,gc);
5277
ad321293 5278/* in semantics.c */
8d241e0b 5279extern void push_deferring_access_checks (deferring_kind);
cf22909c
KL
5280extern void resume_deferring_access_checks (void);
5281extern void stop_deferring_access_checks (void);
5282extern void pop_deferring_access_checks (void);
d6b418fa 5283extern VEC (deferred_access_check,gc)* get_deferred_access_checks (void);
0cbd7506 5284extern void pop_to_parent_deferring_access_checks (void);
d6b418fa 5285extern void perform_access_checks (VEC (deferred_access_check,gc)*);
cf22909c 5286extern void perform_deferred_access_checks (void);
02022f3a 5287extern void perform_or_defer_access_check (tree, tree, tree);
f7d042e2 5288extern bool speculative_access_check (tree, tree, tree, bool);
ed3d0b14 5289extern int stmts_are_full_exprs_p (void);
0cbd7506 5290extern void init_cp_semantics (void);
20aff0b3 5291extern tree do_poplevel (tree);
350fae66 5292extern void add_decl_expr (tree);
0cbd7506
MS
5293extern tree finish_expr_stmt (tree);
5294extern tree begin_if_stmt (void);
5295extern void finish_if_stmt_cond (tree, tree);
5296extern tree finish_then_clause (tree);
325c3691 5297extern void begin_else_clause (tree);
0cbd7506
MS
5298extern void finish_else_clause (tree);
5299extern void finish_if_stmt (tree);
5300extern tree begin_while_stmt (void);
5301extern void finish_while_stmt_cond (tree, tree);
5302extern void finish_while_stmt (tree);
5303extern tree begin_do_stmt (void);
5304extern void finish_do_body (tree);
5305extern void finish_do_stmt (tree, tree);
5306extern tree finish_return_stmt (tree);
3f43ac31
RRC
5307extern tree begin_for_scope (tree *);
5308extern tree begin_for_stmt (tree, tree);
0cbd7506
MS
5309extern void finish_for_init_stmt (tree);
5310extern void finish_for_cond (tree, tree);
5311extern void finish_for_expr (tree, tree);
5312extern void finish_for_stmt (tree);
3f43ac31 5313extern tree begin_range_for_stmt (tree, tree);
f9132eb7
RRC
5314extern void finish_range_for_decl (tree, tree, tree);
5315extern void finish_range_for_stmt (tree);
0cbd7506
MS
5316extern tree finish_break_stmt (void);
5317extern tree finish_continue_stmt (void);
5318extern tree begin_switch_stmt (void);
5319extern void finish_switch_cond (tree, tree);
5320extern void finish_switch_stmt (tree);
0cbd7506
MS
5321extern tree finish_goto_stmt (tree);
5322extern tree begin_try_block (void);
5323extern void finish_try_block (tree);
0cbd7506 5324extern void finish_handler_sequence (tree);
eaf6fb90 5325extern tree begin_function_try_block (tree *);
0cbd7506 5326extern void finish_function_try_block (tree);
eaf6fb90 5327extern void finish_function_handler_sequence (tree, tree);
0cbd7506
MS
5328extern void finish_cleanup_try_block (tree);
5329extern tree begin_handler (void);
5330extern void finish_handler_parms (tree, tree);
5331extern void finish_handler (tree);
5332extern void finish_cleanup (tree, tree);
7ecbca9d
GDR
5333extern bool literal_type_p (tree);
5334extern tree validate_constexpr_fundecl (tree);
66e61a34 5335extern tree register_constexpr_fundef (tree, tree);
9b7d0509 5336extern bool check_constexpr_ctor_body (tree, tree);
7ecbca9d 5337extern tree ensure_literal_type_for_constexpr_object (tree);
d6ed1c89 5338extern bool potential_constant_expression (tree);
4be5e5b1 5339extern bool potential_rvalue_constant_expression (tree);
d6ed1c89 5340extern bool require_potential_constant_expression (tree);
4be5e5b1 5341extern bool require_potential_rvalue_constant_expression (tree);
c41095db
GDR
5342extern tree cxx_constant_value (tree);
5343extern tree maybe_constant_value (tree);
5344extern tree maybe_constant_init (tree);
fa2200cb 5345extern bool is_sub_constant_expr (tree);
c41095db 5346extern bool reduced_constant_expression_p (tree);
2bfe0527 5347extern VEC(tree,heap)* cx_error_context (void);
325c3691
RH
5348
5349enum {
5350 BCS_NO_SCOPE = 1,
5351 BCS_TRY_BLOCK = 2,
5352 BCS_FN_BODY = 4
5353};
0cbd7506 5354extern tree begin_compound_stmt (unsigned int);
325c3691 5355
0cbd7506 5356extern void finish_compound_stmt (tree);
1c384bf1
RH
5357extern tree finish_asm_stmt (int, tree, tree, tree, tree,
5358 tree);
0cbd7506
MS
5359extern tree finish_label_stmt (tree);
5360extern void finish_label_decl (tree);
5361extern tree finish_parenthesized_expr (tree);
a3f10e50 5362extern tree finish_non_static_data_member (tree, tree, tree);
0cbd7506
MS
5363extern tree begin_stmt_expr (void);
5364extern tree finish_stmt_expr_expr (tree, tree);
5365extern tree finish_stmt_expr (tree, bool);
c2acde1e 5366extern tree stmt_expr_value_expr (tree);
9af66ed1 5367bool empty_expr_stmt_p (tree);
94df301f
JM
5368extern tree perform_koenig_lookup (tree, VEC(tree,gc) *, bool,
5369 tsubst_flags_t);
c166b898
ILT
5370extern tree finish_call_expr (tree, VEC(tree,gc) **, bool,
5371 bool, tsubst_flags_t);
0cbd7506
MS
5372extern tree finish_increment_expr (tree, enum tree_code);
5373extern tree finish_this_expr (void);
a723baf1 5374extern tree finish_pseudo_destructor_expr (tree, tree, tree);
0cbd7506 5375extern tree finish_unary_op_expr (enum tree_code, tree);
834aa426 5376extern tree finish_compound_literal (tree, tree, tsubst_flags_t);
0cbd7506
MS
5377extern tree finish_fname (tree);
5378extern void finish_translation_unit (void);
5379extern tree finish_template_type_parm (tree, tree);
b2f29cd9 5380extern tree finish_template_template_parm (tree, tree);
b9e75696 5381extern tree begin_class_definition (tree, tree);
0cbd7506
MS
5382extern void finish_template_decl (tree);
5383extern tree finish_template_type (tree, tree, int);
5384extern tree finish_base_specifier (tree, tree, bool);
5385extern void finish_member_declaration (tree);
0cbd7506 5386extern tree finish_id_expression (tree, tree, tree,
02ed62dd 5387 cp_id_kind *,
19114537 5388 bool, bool, bool *,
02ed62dd 5389 bool, bool, bool, bool,
2b7a3abf
DS
5390 const char **,
5391 location_t);
b2f29cd9 5392extern tree finish_typeof (tree);
a0d260fc 5393extern tree finish_underlying_type (tree);
c291f8b1 5394extern tree finish_offsetof (tree);
0cbd7506
MS
5395extern void finish_decl_cleanup (tree, tree);
5396extern void finish_eh_cleanup (tree);
e89d6010 5397extern void emit_associated_thunks (tree);
0cbd7506 5398extern void finish_mem_initializers (tree);
8ba658ee 5399extern tree check_template_template_default_arg (tree);
b2583345 5400extern bool expand_or_defer_fn_1 (tree);
8cd2462c 5401extern void expand_or_defer_fn (tree);
aa373032
DS
5402extern void add_typedef_to_current_template_for_access_check (tree, tree,
5403 location_t);
ee76b931 5404extern void check_accessibility_of_qualified_id (tree, tree, tree);
02ed62dd
MM
5405extern tree finish_qualified_id_expr (tree, tree, bool, bool,
5406 bool, bool);
9eeb200f 5407extern void simplify_aggr_init_expr (tree *);
6de9cd9a 5408extern void finalize_nrv (tree *, tree, tree);
0cbd7506 5409extern void note_decl_for_pch (tree);
1799e5d5
RH
5410extern tree finish_omp_clauses (tree);
5411extern void finish_omp_threadprivate (tree);
5412extern tree begin_omp_structured_block (void);
5413extern tree finish_omp_structured_block (tree);
5414extern tree begin_omp_parallel (void);
5415extern tree finish_omp_parallel (tree, tree);
a68ab351
JJ
5416extern tree begin_omp_task (void);
5417extern tree finish_omp_task (tree, tree);
1799e5d5 5418extern tree finish_omp_for (location_t, tree, tree,
a68ab351 5419 tree, tree, tree, tree, tree);
1799e5d5
RH
5420extern void finish_omp_atomic (enum tree_code, tree, tree);
5421extern void finish_omp_barrier (void);
5422extern void finish_omp_flush (void);
a68ab351 5423extern void finish_omp_taskwait (void);
a68ab351 5424extern bool cxx_omp_create_clause_info (tree, tree, bool, bool, bool);
eff3a276 5425extern tree baselink_for_fns (tree);
55a3debe
DG
5426extern void finish_static_assert (tree, tree, location_t,
5427 bool);
a77f94e2 5428extern tree describable_type (tree);
5b97c77f 5429extern tree finish_decltype_type (tree, bool, tsubst_flags_t);
cb68ec50 5430extern tree finish_trait_expr (enum cp_trait_kind, tree, tree);
d5f4eddd
JM
5431extern tree build_lambda_expr (void);
5432extern tree build_lambda_object (tree);
5433extern tree begin_lambda_type (tree);
5434extern tree lambda_capture_field_type (tree);
5435extern tree lambda_return_type (tree);
5436extern tree lambda_function (tree);
5437extern void apply_lambda_return_type (tree, tree);
37a7519a 5438extern tree add_capture (tree, tree, tree, bool, bool);
d5f4eddd 5439extern tree add_default_capture (tree, tree, tree);
19030d77 5440extern void register_capture_members (tree);
d5f4eddd 5441extern tree lambda_expr_this_capture (tree);
a6846853 5442extern tree nonlambda_method_basetype (void);
b77068f2 5443extern void maybe_add_lambda_conv_op (tree);
35b1567d 5444
51c184be 5445/* in tree.c */
d26e5986 5446extern int cp_tree_operand_length (const_tree);
4537ec0c 5447void cp_free_lang_data (tree t);
574cfaa4
JM
5448extern tree force_target_expr (tree, tree, tsubst_flags_t);
5449extern tree build_target_expr_with_type (tree, tree, tsubst_flags_t);
b2f29cd9 5450extern void lang_check_failed (const char *, int,
82e5a12a 5451 const char *) ATTRIBUTE_NORETURN;
b2f29cd9 5452extern tree stabilize_expr (tree, tree *);
6de9cd9a 5453extern void stabilize_call (tree, tree *);
5039610b 5454extern void stabilize_aggr_init (tree, tree *);
6de9cd9a 5455extern bool stabilize_init (tree, tree *);
40aac948 5456extern tree add_stmt_to_compound (tree, tree);
0cbd7506 5457extern void init_tree (void);
c32097d8
JM
5458extern bool pod_type_p (const_tree);
5459extern bool layout_pod_type_p (const_tree);
5460extern bool std_layout_type_p (const_tree);
5461extern bool trivial_type_p (const_tree);
46408846 5462extern bool trivially_copyable_p (const_tree);
c32097d8
JM
5463extern bool type_has_nontrivial_default_init (const_tree);
5464extern bool type_has_nontrivial_copy_init (const_tree);
ac7d7749 5465extern bool class_tmpl_impl_spec_p (const_tree);
58f9752a 5466extern int zero_init_p (const_tree);
cd41d410 5467extern tree strip_typedefs (tree);
48b45647
NS
5468extern tree copy_binfo (tree, tree, tree,
5469 tree *, int);
58f9752a 5470extern int member_p (const_tree);
4e9ca9b0
JM
5471extern cp_lvalue_kind real_lvalue_p (const_tree);
5472extern cp_lvalue_kind lvalue_kind (const_tree);
df5c89cb 5473extern bool lvalue_or_rvalue_with_address_p (const_tree);
58f9752a 5474extern bool builtin_valid_in_constant_expr_p (const_tree);
8e1daa34 5475extern tree build_min (enum tree_code, tree, ...);
b2f29cd9 5476extern tree build_min_nt (enum tree_code, ...);
8e1daa34 5477extern tree build_min_non_dep (enum tree_code, tree, ...);
c166b898 5478extern tree build_min_non_dep_call_vec (tree, tree, VEC(tree,gc) *);
362115a9
JM
5479extern tree build_cplus_new (tree, tree, tsubst_flags_t);
5480extern tree build_aggr_init_expr (tree, tree, tsubst_flags_t);
b2f29cd9 5481extern tree get_target_expr (tree);
574cfaa4 5482extern tree get_target_expr_sfinae (tree, tsubst_flags_t);
b2f29cd9 5483extern tree build_cplus_array_type (tree, tree);
09357846 5484extern tree build_array_of_n_type (tree, int);
d5f4eddd 5485extern tree build_array_copy (tree);
9c69dcea 5486extern tree build_vec_init_expr (tree, tree, tsubst_flags_t);
262a7d6b 5487extern void diagnose_non_constexpr_vec_init (tree);
b2f29cd9
NN
5488extern tree hash_tree_cons (tree, tree, tree);
5489extern tree hash_tree_chain (tree, tree);
3db45ab5 5490extern tree build_qualified_name (tree, tree, tree, bool);
b2f29cd9 5491extern int is_overloaded_fn (tree);
294e855f 5492extern tree get_fns (tree);
b2f29cd9 5493extern tree get_first_fn (tree);
0cbd7506
MS
5494extern tree ovl_cons (tree, tree);
5495extern tree build_overload (tree, tree);
73452ce7 5496extern bool non_static_member_function_p (tree);
b2f29cd9 5497extern const char *cxx_printable_name (tree, int);
f41c4af3 5498extern const char *cxx_printable_name_translate (tree, int);
b2f29cd9
NN
5499extern tree build_exception_variant (tree, tree);
5500extern tree bind_template_template_parm (tree, tree);
5501extern tree array_type_nelts_total (tree);
5502extern tree array_type_nelts_top (tree);
5503extern tree break_out_target_exprs (tree);
5504extern tree get_type_decl (tree);
b2f29cd9 5505extern tree decl_namespace_context (tree);
58f9752a 5506extern bool decl_anon_ns_mem_p (const_tree);
b2f29cd9
NN
5507extern tree lvalue_type (tree);
5508extern tree error_type (tree);
58f9752a 5509extern int varargs_function_p (const_tree);
eff3a276 5510extern bool really_overloaded_fn (tree);
c8a209ca 5511extern bool cp_tree_equal (tree, tree);
4684cd27 5512extern tree no_linkage_check (tree, bool);
b2f29cd9
NN
5513extern void debug_binfo (tree);
5514extern tree build_dummy_object (tree);
5515extern tree maybe_dummy_object (tree, tree *);
58f9752a 5516extern int is_dummy_object (const_tree);
349ae713 5517extern const struct attribute_spec cxx_attribute_table[];
0cbd7506 5518extern tree make_ptrmem_cst (tree, tree);
e9525111 5519extern tree cp_build_type_attribute_variant (tree, tree);
8af2fec4 5520extern tree cp_build_reference_type (tree, bool);
d5f4eddd 5521extern tree move (tree);
0cbd7506 5522extern tree cp_build_qualified_type_real (tree, int, tsubst_flags_t);
adecb3f4 5523#define cp_build_qualified_type(TYPE, QUALS) \
23fca1f5 5524 cp_build_qualified_type_real ((TYPE), (QUALS), tf_warning_or_error)
36c37128 5525extern bool cv_qualified_p (const_tree);
164247b0 5526extern tree cv_unqualified (tree);
58f9752a 5527extern special_function_kind special_function_p (const_tree);
0cbd7506
MS
5528extern int count_trees (tree);
5529extern int char_type_p (tree);
5530extern void verify_stmt_tree (tree);
0cbd7506 5531extern linkage_kind decl_linkage (tree);
b95ca513 5532extern duration_kind decl_storage_duration (tree);
b2f29cd9 5533extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn,
0cbd7506 5534 void*, struct pointer_set_t*);
14588106
RG
5535#define cp_walk_tree(a,b,c,d) \
5536 walk_tree_1 (a, b, c, d, cp_walk_subtrees)
5537#define cp_walk_tree_without_duplicates(a,b,c) \
5538 walk_tree_without_duplicates_1 (a, b, c, cp_walk_subtrees)
0cbd7506 5539extern tree fold_if_not_in_template (tree);
3db45ab5 5540extern tree rvalue (tree);
e1039697 5541extern tree convert_bitfield_to_declared_type (tree);
3db45ab5 5542extern tree cp_save_expr (tree);
015c2c66 5543extern bool cast_valid_in_integral_constant_expression_p (tree);
2dff8956 5544extern bool cxx_type_hash_eq (const_tree, const_tree);
3db45ab5 5545
2650d9e1
SZ
5546extern void cxx_print_statistics (void);
5547
5548/* in ptree.c */
5549extern void cxx_print_xnode (FILE *, tree, int);
5550extern void cxx_print_decl (FILE *, tree, int);
5551extern void cxx_print_type (FILE *, tree, int);
5552extern void cxx_print_identifier (FILE *, tree, int);
1ebe4b4f 5553extern void cxx_print_error_function (diagnostic_context *,
2650d9e1
SZ
5554 const char *,
5555 struct diagnostic_info *);
5556
51c184be 5557/* in typeck.c */
2650d9e1 5558extern bool cxx_mark_addressable (tree);
58f9752a 5559extern int string_conv_p (const_tree, const_tree, int);
b2f29cd9
NN
5560extern tree cp_truthvalue_conversion (tree);
5561extern tree condition_conversion (tree);
b2f29cd9 5562extern tree require_complete_type (tree);
79fe346e 5563extern tree require_complete_type_sfinae (tree, tsubst_flags_t);
b2f29cd9 5564extern tree complete_type (tree);
be20e673 5565extern tree complete_type_or_else (tree, tree);
309714d4 5566extern tree complete_type_or_maybe_complain (tree, tree, tsubst_flags_t);
58f9752a 5567extern int type_unknown_p (const_tree);
3a55fb4c
JM
5568enum { ce_derived, ce_normal, ce_exact };
5569extern bool comp_except_specs (const_tree, const_tree, int);
96d84882 5570extern bool comptypes (tree, tree, int);
10746f37 5571extern bool same_type_ignoring_top_level_qualifiers_p (tree, tree);
58f9752a
KG
5572extern bool compparms (const_tree, const_tree);
5573extern int comp_cv_qualification (const_tree, const_tree);
0cbd7506 5574extern int comp_cv_qual_signature (tree, tree);
5ade1ed2 5575extern tree cxx_sizeof_or_alignof_expr (tree, enum tree_code, bool);
0cbd7506 5576extern tree cxx_sizeof_or_alignof_type (tree, enum tree_code, bool);
5ade1ed2 5577extern tree cxx_sizeof_nowarn (tree);
58f9752a
KG
5578extern tree is_bitfield_expr_with_lowered_type (const_tree);
5579extern tree unlowered_expr_type (const_tree);
b2f29cd9 5580extern tree decay_conversion (tree);
5ade1ed2
DG
5581extern tree build_class_member_access_expr (tree, tree, tree, bool,
5582 tsubst_flags_t);
5583extern tree finish_class_member_access_expr (tree, tree, bool,
5584 tsubst_flags_t);
dd865ef6 5585extern tree build_x_indirect_ref (tree, ref_operator,
5ade1ed2 5586 tsubst_flags_t);
dd865ef6 5587extern tree cp_build_indirect_ref (tree, ref_operator,
5ade1ed2 5588 tsubst_flags_t);
3a11c665
JM
5589extern tree build_array_ref (location_t, tree, tree);
5590extern tree cp_build_array_ref (location_t, tree, tree,
73647d75 5591 tsubst_flags_t);
b2f29cd9 5592extern tree get_member_function_from_ptrfunc (tree *, tree);
5ade1ed2 5593extern tree cp_build_function_call (tree, tree, tsubst_flags_t);
450f4293
NF
5594extern tree cp_build_function_call_nary (tree, tsubst_flags_t, ...)
5595 ATTRIBUTE_SENTINEL;
c166b898
ILT
5596extern tree cp_build_function_call_vec (tree, VEC(tree,gc) **,
5597 tsubst_flags_t);
2a67bec2
ILT
5598extern tree build_x_binary_op (enum tree_code, tree,
5599 enum tree_code, tree,
5ade1ed2
DG
5600 enum tree_code, bool *,
5601 tsubst_flags_t);
493e377c 5602extern tree build_x_array_ref (tree, tree, tsubst_flags_t);
5ade1ed2
DG
5603extern tree build_x_unary_op (enum tree_code, tree,
5604 tsubst_flags_t);
93c0e0bb
JM
5605extern tree cp_build_addr_expr (tree, tsubst_flags_t);
5606extern tree cp_build_addr_expr_strict (tree, tsubst_flags_t);
5ade1ed2
DG
5607extern tree cp_build_unary_op (enum tree_code, tree, int,
5608 tsubst_flags_t);
b2f29cd9 5609extern tree unary_complex_lvalue (enum tree_code, tree);
5ade1ed2
DG
5610extern tree build_x_conditional_expr (tree, tree, tree,
5611 tsubst_flags_t);
d555b1c7
PC
5612extern tree build_x_compound_expr_from_list (tree, expr_list_kind,
5613 tsubst_flags_t);
c166b898 5614extern tree build_x_compound_expr_from_vec (VEC(tree,gc) *, const char *);
5ade1ed2 5615extern tree build_x_compound_expr (tree, tree, tsubst_flags_t);
c2255bc4 5616extern tree build_compound_expr (location_t, tree, tree);
525521b6 5617extern tree cp_build_compound_expr (tree, tree, tsubst_flags_t);
5ade1ed2
DG
5618extern tree build_static_cast (tree, tree, tsubst_flags_t);
5619extern tree build_reinterpret_cast (tree, tree, tsubst_flags_t);
5620extern tree build_const_cast (tree, tree, tsubst_flags_t);
c2255bc4 5621extern tree build_c_cast (location_t, tree, tree);
525521b6 5622extern tree cp_build_c_cast (tree, tree, tsubst_flags_t);
5ade1ed2
DG
5623extern tree build_x_modify_expr (tree, enum tree_code, tree,
5624 tsubst_flags_t);
5625extern tree cp_build_modify_expr (tree, enum tree_code, tree,
5626 tsubst_flags_t);
0cbd7506 5627extern tree convert_for_initialization (tree, tree, tree, int,
2f5b91f5 5628 impl_conv_rhs, tree, int,
5ade1ed2 5629 tsubst_flags_t);
b2f29cd9 5630extern int comp_ptr_ttypes (tree, tree);
3db45ab5 5631extern bool comp_ptr_ttypes_const (tree, tree);
d4684c00 5632extern bool error_type_p (const_tree);
58f9752a 5633extern int ptr_reasonably_similar (const_tree, const_tree);
135d47df
PC
5634extern tree build_ptrmemfunc (tree, tree, int, bool,
5635 tsubst_flags_t);
ac7d7749 5636extern int cp_type_quals (const_tree);
2872152c
JM
5637extern int type_memfn_quals (const_tree);
5638extern tree apply_memfn_quals (tree, cp_cv_quals);
58f9752a
KG
5639extern bool cp_has_mutable_p (const_tree);
5640extern bool at_least_as_qualified_p (const_tree, const_tree);
0cbd7506
MS
5641extern void cp_apply_type_quals_to_decl (int, tree);
5642extern tree build_ptrmemfunc1 (tree, tree, tree);
5643extern void expand_ptrmemfunc_cst (tree, tree *, tree *);
b2f29cd9 5644extern tree type_after_usual_arithmetic_conversions (tree, tree);
98f2f3a2 5645extern tree common_pointer_type (tree, tree);
0cbd7506 5646extern tree composite_pointer_type (tree, tree, tree, tree,
c86818cf
SZ
5647 composite_pointer_operation,
5648 tsubst_flags_t);
b2f29cd9 5649extern tree merge_types (tree, tree);
48326487 5650extern tree strip_array_domain (tree);
0c9b182b 5651extern tree check_return_expr (tree, bool *);
ba47d38d
AH
5652extern tree cp_build_binary_op (location_t,
5653 enum tree_code, tree, tree,
5ade1ed2 5654 tsubst_flags_t);
ea793912 5655#define cxx_sizeof(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, true)
0cbd7506
MS
5656extern tree build_ptrmemfunc_access_expr (tree, tree);
5657extern tree build_address (tree);
e7f1930f 5658extern tree build_typed_address (tree, tree);
0cbd7506
MS
5659extern tree build_nop (tree, tree);
5660extern tree non_reference (tree);
5661extern tree lookup_anon_field (tree, tree);
5ade1ed2 5662extern bool invalid_nonstatic_memfn_p (const_tree, tsubst_flags_t);
0cbd7506 5663extern tree convert_member_func_to_ptr (tree, tree);
135d47df
PC
5664extern tree convert_ptrmem (tree, tree, bool, bool,
5665 tsubst_flags_t);
4af9e878 5666extern int lvalue_or_else (tree, enum lvalue_use,
5ade1ed2 5667 tsubst_flags_t);
2650d9e1 5668extern void check_template_keyword (tree);
8d08fdba 5669
51c184be 5670/* in typeck2.c */
b2f29cd9 5671extern void require_complete_eh_spec_types (tree, tree);
71205d17 5672extern void cxx_incomplete_type_diagnostic (const_tree, const_tree, diagnostic_t);
23b4deba 5673#undef cxx_incomplete_type_error
ac7d7749 5674extern void cxx_incomplete_type_error (const_tree, const_tree);
23b4deba 5675#define cxx_incomplete_type_error(V,T) \
71205d17 5676 (cxx_incomplete_type_diagnostic ((V), (T), DK_ERROR))
b2f29cd9
NN
5677extern tree error_not_base_type (tree, tree);
5678extern tree binfo_or_else (tree, tree);
4816c593 5679extern void cxx_readonly_error (tree, enum lvalue_use);
7fb213d8 5680extern void complete_type_check_abstract (tree);
b2f29cd9 5681extern int abstract_virtuals_error (tree, tree);
2b8497cd 5682extern int abstract_virtuals_error_sfinae (tree, tree, tsubst_flags_t);
b2f29cd9 5683
e57d93c6 5684extern tree store_init_value (tree, tree, int);
09357846 5685extern void check_narrowing (tree, tree);
754af126 5686extern tree digest_init (tree, tree, tsubst_flags_t);
e57d93c6 5687extern tree digest_init_flags (tree, tree, int);
b2f29cd9
NN
5688extern tree build_scoped_ref (tree, tree, tree *);
5689extern tree build_x_arrow (tree);
5690extern tree build_m_component_ref (tree, tree);
5ade1ed2 5691extern tree build_functional_cast (tree, tree, tsubst_flags_t);
0cbd7506
MS
5692extern tree add_exception_specifier (tree, tree, int);
5693extern tree merge_exception_specifiers (tree, tree);
8d08fdba 5694
1f6e1acc 5695/* in mangle.c */
0cbd7506
MS
5696extern void init_mangle (void);
5697extern void mangle_decl (tree);
52669d59 5698extern const char *mangle_type_string (tree);
0cbd7506
MS
5699extern tree mangle_typeinfo_for_type (tree);
5700extern tree mangle_typeinfo_string_for_type (tree);
5701extern tree mangle_vtbl_for_type (tree);
5702extern tree mangle_vtt_for_type (tree);
5703extern tree mangle_ctor_vtbl_for_type (tree, tree);
5704extern tree mangle_thunk (tree, int, tree, tree);
5705extern tree mangle_conv_op_name_for_type (tree);
5706extern tree mangle_guard_variable (tree);
5707extern tree mangle_ref_init_variable (tree);
1f6e1acc 5708
0a7394bc 5709/* in dump.c */
0cbd7506 5710extern bool cp_dump_tree (void *, tree);
0a7394bc 5711
e58a9aa1
ZL
5712/* In cp/cp-objcp-common.c. */
5713
4862826d 5714extern alias_set_type cxx_get_alias_set (tree);
ac7d7749 5715extern bool cxx_warn_unused_global_decl (const_tree);
0cbd7506
MS
5716extern size_t cp_tree_size (enum tree_code);
5717extern bool cp_var_mod_type_p (tree, tree);
1ebe4b4f 5718extern void cxx_initialize_diagnostics (diagnostic_context *);
0cbd7506 5719extern int cxx_types_compatible_p (tree, tree);
3ed8593d 5720extern void init_shadowed_var_for_decl (void);
e58a9aa1 5721
78dcd41a 5722/* in cp-gimplify.c */
726a989a
RB
5723extern int cp_gimplify_expr (tree *, gimple_seq *,
5724 gimple_seq *);
5a508662 5725extern void cp_genericize (tree);
2650d9e1
SZ
5726extern enum omp_clause_default_kind cxx_omp_predetermined_sharing (tree);
5727extern tree cxx_omp_clause_default_ctor (tree, tree, tree);
5728extern tree cxx_omp_clause_copy_ctor (tree, tree, tree);
5729extern tree cxx_omp_clause_assign_op (tree, tree, tree);
5730extern tree cxx_omp_clause_dtor (tree, tree);
5731extern void cxx_omp_finish_clause (tree);
5732extern bool cxx_omp_privatize_by_reference (const_tree);
6de9cd9a 5733
501c95ff 5734/* in name-lookup.c */
993acb36 5735extern void suggest_alternatives_for (location_t, tree);
501c95ff 5736
8d08fdba
MS
5737/* -- end of C++ */
5738
88657302 5739#endif /* ! GCC_CP_TREE_H */