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