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