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