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