1/* Definitions for -*- C++ -*- parsing and type checking.
2 Copyright (C) 1987-2025 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com)
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
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
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef GCC_CP_TREE_H
22#define GCC_CP_TREE_H
23
24#include "tm.h"
25#include "hard-reg-set.h"
26#include "function.h"
27#include "tristate.h"
28#include "contracts.h"
29
30/* In order for the format checking to accept the C++ front end
31 diagnostic framework extensions, you must include this file before
32 diagnostic-core.h, not after. We override the definition of GCC_DIAG_STYLE
33 in c-common.h. */
34#undef GCC_DIAG_STYLE
35#define GCC_DIAG_STYLE __gcc_cxxdiag__
36#if defined(GCC_DIAGNOSTIC_CORE_H) || defined (GCC_C_COMMON_H)
37#error \
38In order for the format checking to accept the C++ front end diagnostic \
39framework extensions, you must include this file before diagnostic-core.h and \
40c-common.h, not after.
41#endif
42#include "c-family/c-common.h"
43#include "diagnostic.h"
44
45/* A tree node, together with a location, so that we can track locations
46 (and ranges) during parsing.
47
48 The location is redundant for node kinds that have locations,
49 but not all node kinds do (e.g. constants, and references to
50 params, locals, etc), so we stash a copy here. */
51
52inline location_t cp_expr_location (const_tree);
53
54class cp_expr
55{
56public:
57 cp_expr () :
58 m_value (NULL), m_loc (UNKNOWN_LOCATION),
59 m_decimal (false)
60 {}
61
62 cp_expr (tree value) :
63 m_value (value), m_loc (cp_expr_location (m_value)),
64 m_decimal (false)
65 {}
66
67 cp_expr (tree value, location_t loc):
68 m_value (value), m_loc (loc), m_decimal (false)
69 {
70 protected_set_expr_location (value, loc);
71 }
72
73 cp_expr (tree value, location_t loc, bool decimal):
74 m_value (value), m_loc (loc), m_decimal (decimal)
75 {
76 protected_set_expr_location (value, loc);
77 }
78
79 /* Implicit conversions to tree. */
80 operator tree () const { return m_value; }
81 tree & operator* () { return m_value; }
82 tree operator* () const { return m_value; }
83 tree & operator-> () { return m_value; }
84 tree operator-> () const { return m_value; }
85
86 tree get_value () const { return m_value; }
87 location_t get_location () const { return m_loc; }
88 location_t get_start () const
89 {
90 source_range src_range = get_range_from_loc (set: line_table, loc: m_loc);
91 return src_range.m_start;
92 }
93 location_t get_finish () const
94 {
95 source_range src_range = get_range_from_loc (set: line_table, loc: m_loc);
96 return src_range.m_finish;
97 }
98
99 void set_location (location_t loc)
100 {
101 protected_set_expr_location (m_value, loc);
102 m_loc = loc;
103 }
104
105 void set_range (location_t start, location_t finish)
106 {
107 set_location (make_location (caret: m_loc, start, finish));
108 }
109
110 cp_expr& maybe_add_location_wrapper ()
111 {
112 m_value = maybe_wrap_with_location (m_value, m_loc);
113 return *this;
114 }
115
116 bool decimal_p () const { return m_decimal; }
117
118 private:
119 tree m_value;
120 location_t m_loc;
121 bool m_decimal : 1;
122};
123
124inline bool
125operator == (const cp_expr &lhs, tree rhs)
126{
127 return lhs.get_value () == rhs;
128}
129
130
131enum cp_tree_index
132{
133 CPTI_WCHAR_DECL,
134 CPTI_VTABLE_ENTRY_TYPE,
135 CPTI_DELTA_TYPE,
136 CPTI_VTABLE_INDEX_TYPE,
137 CPTI_CLEANUP_TYPE,
138 CPTI_VTT_PARM_TYPE,
139
140 CPTI_CLASS_TYPE,
141 CPTI_UNKNOWN_TYPE,
142 CPTI_INIT_LIST_TYPE,
143 CPTI_EXPLICIT_VOID_LIST,
144 CPTI_VTBL_TYPE,
145 CPTI_VTBL_PTR_TYPE,
146 CPTI_GLOBAL,
147 CPTI_ABORT_FNDECL,
148 CPTI_AGGR_TAG,
149 CPTI_CONV_OP_MARKER,
150
151 CPTI_CTOR_IDENTIFIER,
152 CPTI_COMPLETE_CTOR_IDENTIFIER,
153 CPTI_BASE_CTOR_IDENTIFIER,
154 CPTI_DTOR_IDENTIFIER,
155 CPTI_COMPLETE_DTOR_IDENTIFIER,
156 CPTI_BASE_DTOR_IDENTIFIER,
157 CPTI_DELETING_DTOR_IDENTIFIER,
158 CPTI_CONV_OP_IDENTIFIER,
159 CPTI_DELTA_IDENTIFIER,
160 CPTI_IN_CHARGE_IDENTIFIER,
161 CPTI_VTT_PARM_IDENTIFIER,
162 CPTI_AS_BASE_IDENTIFIER,
163 CPTI_THIS_IDENTIFIER,
164 CPTI_PFN_IDENTIFIER,
165 CPTI_VPTR_IDENTIFIER,
166 CPTI_GLOBAL_IDENTIFIER,
167 CPTI_ANON_IDENTIFIER,
168 CPTI_AUTO_IDENTIFIER,
169 CPTI_DECLTYPE_AUTO_IDENTIFIER,
170 CPTI_INIT_LIST_IDENTIFIER,
171 CPTI_FOR_RANGE__IDENTIFIER,
172 CPTI_FOR_BEGIN__IDENTIFIER,
173 CPTI_FOR_END__IDENTIFIER,
174 CPTI_FOR_RANGE_IDENTIFIER,
175 CPTI_FOR_BEGIN_IDENTIFIER,
176 CPTI_FOR_END_IDENTIFIER,
177 CPTI_ABI_TAG_IDENTIFIER,
178 CPTI_ALIGNED_IDENTIFIER,
179 CPTI_BEGIN_IDENTIFIER,
180 CPTI_END_IDENTIFIER,
181 CPTI_GET_IDENTIFIER,
182 CPTI_GNU_IDENTIFIER,
183 CPTI_TUPLE_ELEMENT_IDENTIFIER,
184 CPTI_TUPLE_SIZE_IDENTIFIER,
185 CPTI_TYPE_IDENTIFIER,
186 CPTI_VALUE_IDENTIFIER,
187 CPTI_FUN_IDENTIFIER,
188 CPTI_CLOSURE_IDENTIFIER,
189 CPTI_HEAP_UNINIT_IDENTIFIER,
190 CPTI_HEAP_IDENTIFIER,
191 CPTI_HEAP_DELETED_IDENTIFIER,
192 CPTI_HEAP_VEC_UNINIT_IDENTIFIER,
193 CPTI_HEAP_VEC_IDENTIFIER,
194 CPTI_OMP_IDENTIFIER,
195 CPTI_INTERNAL_IDENTIFIER,
196
197 CPTI_LANG_NAME_C,
198 CPTI_LANG_NAME_CPLUSPLUS,
199
200 CPTI_EMPTY_EXCEPT_SPEC,
201 CPTI_NOEXCEPT_TRUE_SPEC,
202 CPTI_NOEXCEPT_FALSE_SPEC,
203 CPTI_NOEXCEPT_DEFERRED_SPEC,
204
205 CPTI_ANY_TARG,
206
207 CPTI_MODULE_HWM,
208 /* Nodes after here change during compilation, or should not be in
209 the module's global tree table. Such nodes must be locatable
210 via name lookup or type-construction, as those are the only
211 cross-TU matching capabilities remaining. */
212
213 /* We must find these via the global namespace. */
214 CPTI_STD,
215 CPTI_ABI,
216
217 /* These are created at init time, but the library/headers provide
218 definitions. */
219 CPTI_ALIGN_TYPE,
220 CPTI_TERMINATE_FN,
221 CPTI_CALL_TERMINATE_FN,
222 CPTI_CALL_UNEXPECTED_FN,
223
224 /* These are lazily inited. */
225 CPTI_CONST_TYPE_INFO_TYPE,
226 CPTI_GET_EXCEPTION_PTR_FN,
227 CPTI_BEGIN_CATCH_FN,
228 CPTI_END_CATCH_FN,
229 CPTI_ALLOCATE_EXCEPTION_FN,
230 CPTI_FREE_EXCEPTION_FN,
231 CPTI_THROW_FN,
232 CPTI_RETHROW_FN,
233 CPTI_ATEXIT_FN_PTR_TYPE,
234 CPTI_ATEXIT,
235 CPTI_THREAD_ATEXIT,
236 CPTI_DSO_HANDLE,
237 CPTI_DCAST,
238
239 CPTI_PSEUDO_CONTRACT_VIOLATION,
240
241 CPTI_MAX
242};
243
244extern GTY(()) tree cp_global_trees[CPTI_MAX];
245
246#define wchar_decl_node cp_global_trees[CPTI_WCHAR_DECL]
247#define vtable_entry_type cp_global_trees[CPTI_VTABLE_ENTRY_TYPE]
248/* The type used to represent an offset by which to adjust the `this'
249 pointer in pointer-to-member types. */
250#define delta_type_node cp_global_trees[CPTI_DELTA_TYPE]
251/* The type used to represent an index into the vtable. */
252#define vtable_index_type cp_global_trees[CPTI_VTABLE_INDEX_TYPE]
253
254#define class_type_node cp_global_trees[CPTI_CLASS_TYPE]
255#define unknown_type_node cp_global_trees[CPTI_UNKNOWN_TYPE]
256#define init_list_type_node cp_global_trees[CPTI_INIT_LIST_TYPE]
257#define explicit_void_list_node cp_global_trees[CPTI_EXPLICIT_VOID_LIST]
258#define vtbl_type_node cp_global_trees[CPTI_VTBL_TYPE]
259#define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE]
260#define std_node cp_global_trees[CPTI_STD]
261#define abi_node cp_global_trees[CPTI_ABI]
262#define global_namespace cp_global_trees[CPTI_GLOBAL]
263#define const_type_info_type_node cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE]
264#define conv_op_marker cp_global_trees[CPTI_CONV_OP_MARKER]
265#define abort_fndecl cp_global_trees[CPTI_ABORT_FNDECL]
266#define current_aggr cp_global_trees[CPTI_AGGR_TAG]
267/* std::align_val_t */
268#define align_type_node cp_global_trees[CPTI_ALIGN_TYPE]
269#define pseudo_contract_violation_type cp_global_trees[CPTI_PSEUDO_CONTRACT_VIOLATION]
270
271/* We cache these tree nodes so as to call get_identifier less frequently.
272 For identifiers for functions, including special member functions such
273 as ctors and assignment operators, the nodes can be used (among other
274 things) to iterate over their overloads defined by/for a type. For
275 example:
276
277 tree ovlid = assign_op_identifier;
278 tree overloads = get_class_binding (type, ovlid);
279 for (ovl_iterator it (overloads); it; ++it) { ... }
280
281 iterates over the set of implicitly and explicitly defined overloads
282 of the assignment operator for type (including the copy and move
283 assignment operators, whether deleted or not). */
284
285/* The name of a constructor that takes an in-charge parameter to
286 decide whether or not to construct virtual base classes. */
287#define ctor_identifier cp_global_trees[CPTI_CTOR_IDENTIFIER]
288/* The name of a constructor that constructs virtual base classes. */
289#define complete_ctor_identifier cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER]
290/* The name of a constructor that does not construct virtual base classes. */
291#define base_ctor_identifier cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER]
292/* The name of a destructor that takes an in-charge parameter to
293 decide whether or not to destroy virtual base classes. */
294#define dtor_identifier cp_global_trees[CPTI_DTOR_IDENTIFIER]
295/* The name of a destructor that destroys virtual base classes. */
296#define complete_dtor_identifier cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER]
297/* The name of a destructor that does not destroy virtual base
298 classes. */
299#define base_dtor_identifier cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
300/* The name of a destructor that destroys virtual base classes, and
301 then deletes the entire object. */
302#define deleting_dtor_identifier cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
303
304/* The name used for conversion operators -- but note that actual
305 conversion functions use special identifiers outside the identifier
306 table. */
307#define conv_op_identifier cp_global_trees[CPTI_CONV_OP_IDENTIFIER]
308
309#define delta_identifier cp_global_trees[CPTI_DELTA_IDENTIFIER]
310#define in_charge_identifier cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
311/* The name of the parameter that contains a pointer to the VTT to use
312 for this subobject constructor or destructor. */
313#define vtt_parm_identifier cp_global_trees[CPTI_VTT_PARM_IDENTIFIER]
314#define as_base_identifier cp_global_trees[CPTI_AS_BASE_IDENTIFIER]
315#define this_identifier cp_global_trees[CPTI_THIS_IDENTIFIER]
316#define pfn_identifier cp_global_trees[CPTI_PFN_IDENTIFIER]
317#define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER]
318/* The name of the ::, std & anon namespaces. */
319#define global_identifier cp_global_trees[CPTI_GLOBAL_IDENTIFIER]
320#define anon_identifier cp_global_trees[CPTI_ANON_IDENTIFIER]
321/* auto and declspec(auto) identifiers. */
322#define auto_identifier cp_global_trees[CPTI_AUTO_IDENTIFIER]
323#define decltype_auto_identifier cp_global_trees[CPTI_DECLTYPE_AUTO_IDENTIFIER]
324#define init_list_identifier cp_global_trees[CPTI_INIT_LIST_IDENTIFIER]
325#define for_range__identifier cp_global_trees[CPTI_FOR_RANGE__IDENTIFIER]
326#define for_begin__identifier cp_global_trees[CPTI_FOR_BEGIN__IDENTIFIER]
327#define for_end__identifier cp_global_trees[CPTI_FOR_END__IDENTIFIER]
328#define for_range_identifier cp_global_trees[CPTI_FOR_RANGE_IDENTIFIER]
329#define for_begin_identifier cp_global_trees[CPTI_FOR_BEGIN_IDENTIFIER]
330#define for_end_identifier cp_global_trees[CPTI_FOR_END_IDENTIFIER]
331#define abi_tag_identifier cp_global_trees[CPTI_ABI_TAG_IDENTIFIER]
332#define aligned_identifier cp_global_trees[CPTI_ALIGNED_IDENTIFIER]
333#define begin_identifier cp_global_trees[CPTI_BEGIN_IDENTIFIER]
334#define end_identifier cp_global_trees[CPTI_END_IDENTIFIER]
335#define get__identifier cp_global_trees[CPTI_GET_IDENTIFIER]
336#define gnu_identifier cp_global_trees[CPTI_GNU_IDENTIFIER]
337#define tuple_element_identifier cp_global_trees[CPTI_TUPLE_ELEMENT_IDENTIFIER]
338#define tuple_size_identifier cp_global_trees[CPTI_TUPLE_SIZE_IDENTIFIER]
339#define type_identifier cp_global_trees[CPTI_TYPE_IDENTIFIER]
340#define value_identifier cp_global_trees[CPTI_VALUE_IDENTIFIER]
341#define fun_identifier cp_global_trees[CPTI_FUN_IDENTIFIER]
342#define closure_identifier cp_global_trees[CPTI_CLOSURE_IDENTIFIER]
343#define heap_uninit_identifier cp_global_trees[CPTI_HEAP_UNINIT_IDENTIFIER]
344#define heap_identifier cp_global_trees[CPTI_HEAP_IDENTIFIER]
345#define heap_deleted_identifier cp_global_trees[CPTI_HEAP_DELETED_IDENTIFIER]
346#define heap_vec_uninit_identifier cp_global_trees[CPTI_HEAP_VEC_UNINIT_IDENTIFIER]
347#define heap_vec_identifier cp_global_trees[CPTI_HEAP_VEC_IDENTIFIER]
348#define omp_identifier cp_global_trees[CPTI_OMP_IDENTIFIER]
349#define internal_identifier cp_global_trees[CPTI_INTERNAL_IDENTIFIER]
350#define lang_name_c cp_global_trees[CPTI_LANG_NAME_C]
351#define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
352
353/* Exception specifiers used for throw(), noexcept(true),
354 noexcept(false) and deferred noexcept. We rely on these being
355 uncloned. */
356#define empty_except_spec cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
357#define noexcept_true_spec cp_global_trees[CPTI_NOEXCEPT_TRUE_SPEC]
358#define noexcept_false_spec cp_global_trees[CPTI_NOEXCEPT_FALSE_SPEC]
359#define noexcept_deferred_spec cp_global_trees[CPTI_NOEXCEPT_DEFERRED_SPEC]
360
361/* Exception handling function declarations. */
362#define terminate_fn cp_global_trees[CPTI_TERMINATE_FN]
363#define call_unexpected_fn cp_global_trees[CPTI_CALL_UNEXPECTED_FN]
364#define call_terminate_fn cp_global_trees[CPTI_CALL_TERMINATE_FN]
365#define get_exception_ptr_fn cp_global_trees[CPTI_GET_EXCEPTION_PTR_FN]
366#define begin_catch_fn cp_global_trees[CPTI_BEGIN_CATCH_FN]
367#define end_catch_fn cp_global_trees[CPTI_END_CATCH_FN]
368#define allocate_exception_fn cp_global_trees[CPTI_ALLOCATE_EXCEPTION_FN]
369#define free_exception_fn cp_global_trees[CPTI_FREE_EXCEPTION_FN]
370#define throw_fn cp_global_trees[CPTI_THROW_FN]
371#define rethrow_fn cp_global_trees[CPTI_RETHROW_FN]
372
373/* The type of the function-pointer argument to "std::atexit". */
374#define atexit_fn_ptr_type_node cp_global_trees[CPTI_ATEXIT_FN_PTR_TYPE]
375
376/* A pointer to `std::atexit'. */
377#define atexit_node cp_global_trees[CPTI_ATEXIT]
378
379/* A pointer to `__cxa_thread_atexit'. */
380#define thread_atexit_node cp_global_trees[CPTI_THREAD_ATEXIT]
381
382/* A pointer to `__dso_handle'. */
383#define dso_handle_node cp_global_trees[CPTI_DSO_HANDLE]
384
385/* The declaration of the dynamic_cast runtime. */
386#define dynamic_cast_node cp_global_trees[CPTI_DCAST]
387
388/* The type of a destructor, passed to __cxa_atexit, __cxa_thread_atexit
389 or __cxa_throw. */
390#define cleanup_type cp_global_trees[CPTI_CLEANUP_TYPE]
391
392/* The type of the vtt parameter passed to subobject constructors and
393 destructors. */
394#define vtt_parm_type cp_global_trees[CPTI_VTT_PARM_TYPE]
395
396/* A node which matches any template argument. */
397#define any_targ_node cp_global_trees[CPTI_ANY_TARG]
398
399/* Node to indicate default access. This must be distinct from the
400 access nodes in tree.h. */
401
402#define access_default_node null_node
403
404#include "name-lookup.h"
405
406/* Usage of TREE_LANG_FLAG_?:
407 0: IDENTIFIER_KIND_BIT_0 (in IDENTIFIER_NODE)
408 NEW_EXPR_USE_GLOBAL (in NEW_EXPR).
409 COND_EXPR_IS_VEC_DELETE (in COND_EXPR).
410 DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR).
411 CLEANUP_P (in TRY_BLOCK)
412 AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR)
413 PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF, SCOPE_REF)
414 PAREN_STRING_LITERAL_P (in STRING_CST)
415 CP_DECL_THREAD_LOCAL_P (in VAR_DECL)
416 KOENIG_LOOKUP_P (in CALL_EXPR)
417 STATEMENT_LIST_NO_SCOPE (in STATEMENT_LIST).
418 EXPR_STMT_STMT_EXPR_RESULT (in EXPR_STMT)
419 STMT_EXPR_NO_SCOPE (in STMT_EXPR)
420 BIND_EXPR_TRY_BLOCK (in BIND_EXPR)
421 TYPENAME_IS_ENUM_P (in TYPENAME_TYPE)
422 OMP_FOR_GIMPLIFYING_P (in OMP_FOR, OMP_SIMD, OMP_DISTRIBUTE,
423 and OMP_TASKLOOP)
424 BASELINK_QUALIFIED_P (in BASELINK)
425 TARGET_EXPR_IMPLICIT_P (in TARGET_EXPR)
426 TEMPLATE_PARM_PARAMETER_PACK (in TEMPLATE_PARM_INDEX)
427 ATTR_IS_DEPENDENT (in the TREE_LIST for an attribute)
428 ABI_TAG_IMPLICIT (in the TREE_LIST for the argument of abi_tag)
429 LAMBDA_CAPTURE_EXPLICIT_P (in a TREE_LIST in LAMBDA_EXPR_CAPTURE_LIST)
430 PARENTHESIZED_LIST_P (in the TREE_LIST for a parameter-declaration-list)
431 CONSTRUCTOR_IS_DIRECT_INIT (in CONSTRUCTOR)
432 DECLTYPE_FOR_LAMBDA_CAPTURE (in DECLTYPE_TYPE)
433 VEC_INIT_EXPR_IS_CONSTEXPR (in VEC_INIT_EXPR)
434 DECL_OVERRIDE_P (in FUNCTION_DECL)
435 IMPLICIT_CONV_EXPR_DIRECT_INIT (in IMPLICIT_CONV_EXPR)
436 TRANSACTION_EXPR_IS_STMT (in TRANSACTION_EXPR)
437 CONVERT_EXPR_VBASE_PATH (in CONVERT_EXPR)
438 PACK_EXPANSION_LOCAL_P (in *_PACK_EXPANSION)
439 TINFO_HAS_ACCESS_ERRORS (in TEMPLATE_INFO)
440 SIZEOF_EXPR_TYPE_P (in SIZEOF_EXPR)
441 COMPOUND_REQ_NOEXCEPT_P (in COMPOUND_REQ)
442 BLOCK_OUTER_CURLY_BRACE_P (in BLOCK)
443 FOLD_EXPR_MODIFY_P (*_FOLD_EXPR)
444 IF_STMT_CONSTEXPR_P (IF_STMT)
445 DECL_NAMESPACE_INLINE_P (in NAMESPACE_DECL)
446 SWITCH_STMT_ALL_CASES_P (in SWITCH_STMT)
447 REINTERPRET_CAST_P (in NOP_EXPR)
448 ALIGNOF_EXPR_STD_P (in ALIGNOF_EXPR)
449 OVL_DEDUP_P (in OVERLOAD)
450 INIT_EXPR_NRV_P (in INIT_EXPR)
451 ATOMIC_CONSTR_MAP_INSTANTIATED_P (in ATOMIC_CONSTR)
452 contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT)
453 RETURN_EXPR_LOCAL_ADDR_P (in RETURN_EXPR)
454 PACK_INDEX_PARENTHESIZED_P (in PACK_INDEX_*)
455 1: IDENTIFIER_KIND_BIT_1 (in IDENTIFIER_NODE)
456 TI_PENDING_TEMPLATE_FLAG.
457 TEMPLATE_PARMS_FOR_INLINE.
458 DELETE_EXPR_USE_VEC (in DELETE_EXPR).
459 ICS_ELLIPSIS_FLAG (in _CONV)
460 DECL_INITIALIZED_P (in VAR_DECL)
461 TYPENAME_IS_CLASS_P (in TYPENAME_TYPE)
462 STMT_IS_FULL_EXPR_P (in _STMT)
463 TARGET_EXPR_LIST_INIT_P (in TARGET_EXPR)
464 DECL_FINAL_P (in FUNCTION_DECL)
465 QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF)
466 CONSTRUCTOR_IS_DEPENDENT (in CONSTRUCTOR)
467 TINFO_USED_TEMPLATE_ID (in TEMPLATE_INFO)
468 PACK_EXPANSION_SIZEOF_P (in *_PACK_EXPANSION)
469 OVL_USING_P (in OVERLOAD)
470 IMPLICIT_CONV_EXPR_NONTYPE_ARG (in IMPLICIT_CONV_EXPR)
471 BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P (in BASELINK)
472 BIND_EXPR_VEC_DTOR (in BIND_EXPR)
473 ATOMIC_CONSTR_EXPR_FROM_CONCEPT_P (in ATOMIC_CONSTR)
474 STATIC_INIT_DECOMP_BASE_P (in the TREE_LIST for {static,tls}_aggregates)
475 2: IDENTIFIER_KIND_BIT_2 (in IDENTIFIER_NODE)
476 ICS_THIS_FLAG (in _CONV)
477 DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL)
478 STATEMENT_LIST_TRY_BLOCK (in STATEMENT_LIST)
479 TYPENAME_IS_RESOLVING_P (in TYPENAME_TYPE)
480 TARGET_EXPR_DIRECT_INIT_P (in TARGET_EXPR)
481 FNDECL_USED_AUTO (in FUNCTION_DECL)
482 DECLTYPE_FOR_LAMBDA_PROXY (in DECLTYPE_TYPE)
483 REF_PARENTHESIZED_P (in COMPONENT_REF, INDIRECT_REF, SCOPE_REF,
484 VIEW_CONVERT_EXPR, PAREN_EXPR)
485 AGGR_INIT_ZERO_FIRST (in AGGR_INIT_EXPR)
486 CONSTRUCTOR_MUTABLE_POISON (in CONSTRUCTOR)
487 OVL_HIDDEN_P (in OVERLOAD)
488 IF_STMT_CONSTEVAL_P (in IF_STMT)
489 SWITCH_STMT_NO_BREAK_P (in SWITCH_STMT)
490 LAMBDA_EXPR_CAPTURE_OPTIMIZED (in LAMBDA_EXPR)
491 IMPLICIT_CONV_EXPR_BRACED_INIT (in IMPLICIT_CONV_EXPR)
492 PACK_EXPANSION_AUTO_P (in *_PACK_EXPANSION)
493 contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT)
494 STATIC_INIT_DECOMP_NONBASE_P (in the TREE_LIST
495 for {static,tls}_aggregates)
496 3: IMPLICIT_RVALUE_P (in NON_LVALUE_EXPR or STATIC_CAST_EXPR)
497 ICS_BAD_FLAG (in _CONV)
498 FN_TRY_BLOCK_P (in TRY_BLOCK)
499 BIND_EXPR_BODY_BLOCK (in BIND_EXPR)
500 CALL_EXPR_ORDERED_ARGS (in CALL_EXPR, AGGR_INIT_EXPR)
501 DECLTYPE_FOR_REF_CAPTURE (in DECLTYPE_TYPE)
502 CONSTRUCTOR_C99_COMPOUND_LITERAL (in CONSTRUCTOR)
503 OVL_NESTED_P (in OVERLOAD)
504 DECL_MODULE_EXPORT_P (in _DECL)
505 PACK_EXPANSION_FORCE_EXTRA_ARGS_P (in *_PACK_EXPANSION)
506 LAMBDA_EXPR_STATIC_P (in LAMBDA_EXPR)
507 TARGET_EXPR_ELIDING_P (in TARGET_EXPR)
508 contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT)
509 4: IDENTIFIER_MARKED (IDENTIFIER_NODEs)
510 TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
511 CALL_EXPR, or FIELD_DECL).
512 DECL_TINFO_P (in VAR_DECL, TYPE_DECL)
513 FUNCTION_REF_QUALIFIED (in FUNCTION_TYPE, METHOD_TYPE)
514 OVL_LOOKUP_P (in OVERLOAD)
515 LOOKUP_FOUND_P (in RECORD_TYPE, UNION_TYPE, ENUMERAL_TYPE, NAMESPACE_DECL)
516 FNDECL_MANIFESTLY_CONST_EVALUATED (in FUNCTION_DECL)
517 TARGET_EXPR_INTERNAL_P (in TARGET_EXPR)
518 5: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE)
519 FUNCTION_RVALUE_QUALIFIED (in FUNCTION_TYPE, METHOD_TYPE)
520 CALL_EXPR_REVERSE_ARGS (in CALL_EXPR, AGGR_INIT_EXPR)
521 CONSTRUCTOR_PLACEHOLDER_BOUNDARY (in CONSTRUCTOR)
522 OVL_EXPORT_P (in OVERLOAD)
523 DECL_NTTP_OBJECT_P (in VAR_DECL)
524 6: TYPE_MARKED_P (in _TYPE)
525 DECL_NONTRIVIALLY_INITIALIZED_P (in VAR_DECL)
526 RANGE_FOR_IVDEP (in RANGE_FOR_STMT)
527 CALL_EXPR_OPERATOR_SYNTAX (in CALL_EXPR, AGGR_INIT_EXPR)
528 CONSTRUCTOR_IS_DESIGNATED_INIT (in CONSTRUCTOR)
529 OVL_NAME_INDEPENDENT_DECL_P (in OVERLOAD)
530
531 Usage of TYPE_LANG_FLAG_?:
532 0: TYPE_DEPENDENT_P
533 1: TYPE_HAS_USER_CONSTRUCTOR.
534 2: TYPE_HAS_LATE_RETURN_TYPE (in FUNCTION_TYPE, METHOD_TYPE)
535 TYPE_PTRMEMFUNC_FLAG (in RECORD_TYPE)
536 4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR
537 5: CLASS_TYPE_P (in RECORD_TYPE and UNION_TYPE)
538 ENUM_FIXED_UNDERLYING_TYPE_P (in ENUMERAL_TYPE)
539 AUTO_IS_DECLTYPE (in TEMPLATE_TYPE_PARM)
540 TEMPLATE_TEMPLATE_PARM_SIMPLE_P (in TEMPLATE_TEMPLATE_PARM)
541 6: TYPE_DEPENDENT_P_VALID
542
543 Usage of DECL_LANG_FLAG_?:
544 0: DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL)
545 DECL_LOCAL_DECL_P (in FUNCTION_DECL, VAR_DECL)
546 DECL_MUTABLE_P (in FIELD_DECL)
547 DECL_DEPENDENT_P (in USING_DECL)
548 LABEL_DECL_BREAK (in LABEL_DECL)
549 1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL).
550 DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL)
551 DECL_MEMBER_TEMPLATE_P (in TEMPLATE_DECL)
552 USING_DECL_TYPENAME_P (in USING_DECL)
553 DECL_VLA_CAPTURE_P (in FIELD_DECL)
554 DECL_ARRAY_PARAMETER_P (in PARM_DECL)
555 LABEL_DECL_CONTINUE (in LABEL_DECL)
556 2: DECL_THIS_EXTERN (in VAR_DECL, FUNCTION_DECL or PARM_DECL)
557 DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL)
558 DECL_CONSTRAINT_VAR_P (in a PARM_DECL)
559 DECL_INSTANTIATING_NSDMI_P (in a FIELD_DECL)
560 USING_DECL_UNRELATED_P (in USING_DECL)
561 3: DECL_IN_AGGR_P.
562 4: DECL_C_BIT_FIELD (in a FIELD_DECL)
563 DECL_ANON_UNION_VAR_P (in a VAR_DECL)
564 DECL_SELF_REFERENCE_P (in a TYPE_DECL)
565 DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL)
566 DECL_UNINSTANIATED_TEMPLATE_FRIEND_P (in TEMPLATE_DECL)
567 5: DECL_INTERFACE_KNOWN.
568 6: DECL_THIS_STATIC (in VAR_DECL, FUNCTION_DECL or PARM_DECL)
569 DECL_FIELD_IS_BASE (in FIELD_DECL)
570 TYPE_DECL_ALIAS_P (in TYPE_DECL)
571 7: DECL_THUNK_P (in a member FUNCTION_DECL)
572 DECL_NORMAL_CAPTURE_P (in FIELD_DECL)
573 DECL_DECLARED_CONSTINIT_P (in VAR_DECL)
574 8: DECL_DECLARED_CONSTEXPR_P (in VAR_DECL, FUNCTION_DECL)
575
576 Usage of language-independent fields in a language-dependent manner:
577
578 TYPE_ALIAS_SET
579 This field is used by TYPENAME_TYPEs, TEMPLATE_TYPE_PARMs, and so
580 forth as a substitute for the mark bits provided in `lang_type'.
581 At present, only the six low-order bits are used.
582
583 TYPE_LANG_SLOT_1
584 For a FUNCTION_TYPE or METHOD_TYPE, this is TYPE_RAISES_EXCEPTIONS.
585 For a POINTER_TYPE (to a METHOD_TYPE), this is TYPE_PTRMEMFUNC_TYPE.
586 For an ENUMERAL_TYPE, BOUND_TEMPLATE_TEMPLATE_PARM_TYPE,
587 RECORD_TYPE or UNION_TYPE this is TYPE_TEMPLATE_INFO,
588
589 BINFO_VIRTUALS
590 For a binfo, this is a TREE_LIST. There is an entry for each
591 virtual function declared either in BINFO or its direct and
592 indirect primary bases.
593
594 The BV_DELTA of each node gives the amount by which to adjust the
595 `this' pointer when calling the function. If the method is an
596 overridden version of a base class method, then it is assumed
597 that, prior to adjustment, the this pointer points to an object
598 of the base class.
599
600 The BV_VCALL_INDEX of each node, if non-NULL, gives the vtable
601 index of the vcall offset for this entry.
602
603 The BV_FN is the declaration for the virtual function itself.
604
605 If BV_LOST_PRIMARY is set, it means that this entry is for a lost
606 primary virtual base and can be left null in the vtable.
607
608 BINFO_VTABLE
609 This is an expression with POINTER_TYPE that gives the value
610 to which the vptr should be initialized. Use get_vtbl_decl_for_binfo
611 to extract the VAR_DECL for the complete vtable.
612
613 DECL_VINDEX
614 This field is NULL for a non-virtual function. For a virtual
615 function, it is eventually set to an INTEGER_CST indicating the
616 index in the vtable at which this function can be found. When
617 a virtual function is declared, but before it is known what
618 function is overridden, this field is the error_mark_node.
619
620 Temporarily, it may be set to a TREE_LIST whose TREE_VALUE is
621 the virtual function this one overrides, and whose TREE_CHAIN is
622 the old DECL_VINDEX. */
623
624/* Language-specific tree checkers. */
625
626#define VAR_OR_FUNCTION_DECL_CHECK(NODE) \
627 TREE_CHECK2(NODE,VAR_DECL,FUNCTION_DECL)
628
629#define TYPE_FUNCTION_OR_TEMPLATE_DECL_CHECK(NODE) \
630 TREE_CHECK3(NODE,TYPE_DECL,TEMPLATE_DECL,FUNCTION_DECL)
631
632#define TYPE_FUNCTION_OR_TEMPLATE_DECL_P(NODE) \
633 (TREE_CODE (NODE) == TYPE_DECL || TREE_CODE (NODE) == TEMPLATE_DECL \
634 || TREE_CODE (NODE) == FUNCTION_DECL)
635
636#define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \
637 TREE_CHECK3(NODE,VAR_DECL,FUNCTION_DECL,PARM_DECL)
638
639#define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \
640 TREE_CHECK4(NODE,VAR_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL)
641
642#define VAR_TEMPL_TYPE_FIELD_OR_FUNCTION_DECL_CHECK(NODE) \
643 TREE_CHECK5(NODE,VAR_DECL,FIELD_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL)
644
645#define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \
646 TREE_CHECK(NODE,BOUND_TEMPLATE_TEMPLATE_PARM)
647
648#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
649
650/* Returns t iff the node can have a TEMPLATE_INFO field. */
651
652inline tree
653template_info_decl_check (const_tree t, const char* f, int l, const char* fn)
654{
655 switch (TREE_CODE (t))
656 {
657 case VAR_DECL:
658 case FUNCTION_DECL:
659 case FIELD_DECL:
660 case TYPE_DECL:
661 case CONCEPT_DECL:
662 case TEMPLATE_DECL:
663 return const_cast<tree>(t);
664 default:
665 break;
666 }
667 tree_check_failed (t, f, l, fn,
668 VAR_DECL, FUNCTION_DECL, FIELD_DECL, TYPE_DECL,
669 CONCEPT_DECL, TEMPLATE_DECL, 0);
670 gcc_unreachable ();
671}
672
673#define TEMPLATE_INFO_DECL_CHECK(NODE) \
674 template_info_decl_check ((NODE), __FILE__, __LINE__, __FUNCTION__)
675
676#define THUNK_FUNCTION_CHECK(NODE) __extension__ \
677({ __typeof (NODE) const __t = (NODE); \
678 if (TREE_CODE (__t) != FUNCTION_DECL || !__t->decl_common.lang_specific \
679 || !__t->decl_common.lang_specific->u.fn.thunk_p) \
680 tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0); \
681 __t; })
682
683#define DECL_TEMPLATE_PARM_CHECK(NODE) \
684 decl_template_parm_check ((NODE), __FILE__, __LINE__, __FUNCTION__)
685
686#else /* ENABLE_TREE_CHECKING */
687
688#define TEMPLATE_INFO_DECL_CHECK(NODE) (NODE)
689#define THUNK_FUNCTION_CHECK(NODE) (NODE)
690#define DECL_TEMPLATE_PARM_CHECK(NODE) (NODE)
691
692#endif /* ENABLE_TREE_CHECKING */
693
694/* Language-dependent contents of an identifier. */
695
696struct GTY(()) lang_identifier {
697 struct c_common_identifier c_common;
698 cxx_binding *bindings;
699};
700
701/* Return a typed pointer version of T if it designates a
702 C++ front-end identifier. */
703inline lang_identifier*
704identifier_p (tree t)
705{
706 if (TREE_CODE (t) == IDENTIFIER_NODE)
707 return (lang_identifier*) t;
708 return NULL;
709}
710
711#define LANG_IDENTIFIER_CAST(NODE) \
712 ((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE))
713
714struct GTY(()) template_parm_index {
715 struct tree_common common;
716 int index;
717 int level;
718 int orig_level;
719 tree decl;
720};
721
722struct GTY(()) ptrmem_cst {
723 struct tree_typed typed;
724 tree member;
725 location_t locus;
726};
727typedef struct ptrmem_cst * ptrmem_cst_t;
728
729#define CLEANUP_P(NODE) TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
730
731#define BIND_EXPR_TRY_BLOCK(NODE) \
732 TREE_LANG_FLAG_0 (BIND_EXPR_CHECK (NODE))
733
734/* This BIND_EXPR is from build_vec_delete_1. */
735#define BIND_EXPR_VEC_DTOR(NODE) \
736 TREE_LANG_FLAG_1 (BIND_EXPR_CHECK (NODE))
737
738/* Used to mark the block around the member initializers and cleanups. */
739#define BIND_EXPR_BODY_BLOCK(NODE) \
740 TREE_LANG_FLAG_3 (BIND_EXPR_CHECK (NODE))
741#define FUNCTION_NEEDS_BODY_BLOCK(NODE) \
742 (DECL_CONSTRUCTOR_P (NODE) || DECL_DESTRUCTOR_P (NODE) \
743 || LAMBDA_FUNCTION_P (NODE))
744
745#define STATEMENT_LIST_NO_SCOPE(NODE) \
746 TREE_LANG_FLAG_0 (STATEMENT_LIST_CHECK (NODE))
747#define STATEMENT_LIST_TRY_BLOCK(NODE) \
748 TREE_LANG_FLAG_2 (STATEMENT_LIST_CHECK (NODE))
749
750/* Mark the outer curly brace BLOCK. */
751#define BLOCK_OUTER_CURLY_BRACE_P(NODE) TREE_LANG_FLAG_0 (BLOCK_CHECK (NODE))
752
753/* Nonzero if this statement should be considered a full-expression,
754 i.e., if temporaries created during this statement should have
755 their destructors run at the end of this statement. */
756#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE))
757
758/* Marks the result of a statement expression. */
759#define EXPR_STMT_STMT_EXPR_RESULT(NODE) \
760 TREE_LANG_FLAG_0 (EXPR_STMT_CHECK (NODE))
761
762/* Nonzero if this statement-expression does not have an associated scope. */
763#define STMT_EXPR_NO_SCOPE(NODE) \
764 TREE_LANG_FLAG_0 (STMT_EXPR_CHECK (NODE))
765
766#define COND_EXPR_IS_VEC_DELETE(NODE) \
767 TREE_LANG_FLAG_0 (COND_EXPR_CHECK (NODE))
768
769/* Nonzero if this NOP_EXPR is a reinterpret_cast. Such conversions
770 are not constexprs. Other NOP_EXPRs are. */
771#define REINTERPRET_CAST_P(NODE) \
772 TREE_LANG_FLAG_0 (NOP_EXPR_CHECK (NODE))
773
774/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
775 sense of `same'. */
776#define same_type_p(TYPE1, TYPE2) \
777 comptypes ((TYPE1), (TYPE2), COMPARE_STRICT)
778
779/* Returns nonzero iff NODE is a declaration for the global function
780 `main'. */
781#define DECL_MAIN_ANY_P(NODE) \
782 (DECL_EXTERN_C_FUNCTION_P (NODE) \
783 && DECL_NAME (NODE) != NULL_TREE \
784 && MAIN_NAME_P (DECL_NAME (NODE)))
785
786/* Nonzero iff NODE is a declaration for `int main', or we are hosted. */
787#define DECL_MAIN_FREESTANDING_P(NODE) \
788 (DECL_MAIN_ANY_P(NODE) \
789 && (flag_hosted \
790 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (NODE))) \
791 == integer_type_node))
792
793/* Nonzero iff NODE is a declaration for `main', and we are hosted. */
794#define DECL_MAIN_P(NODE) (DECL_MAIN_ANY_P(NODE) && flag_hosted)
795
796/* Lookup walker marking. */
797#define LOOKUP_SEEN_P(NODE) TREE_VISITED (NODE)
798#define LOOKUP_FOUND_P(NODE) \
799 TREE_LANG_FLAG_4 (TREE_CHECK4 (NODE,RECORD_TYPE,UNION_TYPE,ENUMERAL_TYPE,\
800 NAMESPACE_DECL))
801
802/* These two accessors should only be used by OVL manipulators.
803 Other users should use iterators and convenience functions. */
804#define OVL_FUNCTION(NODE) \
805 (((struct tree_overload*)OVERLOAD_CHECK (NODE))->function)
806#define OVL_CHAIN(NODE) \
807 (((struct tree_overload*)OVERLOAD_CHECK (NODE))->common.chain)
808
809/* If set, this or a subsequent overload contains decls that need deduping. */
810#define OVL_DEDUP_P(NODE) TREE_LANG_FLAG_0 (OVERLOAD_CHECK (NODE))
811/* If set, this was imported in a using declaration. */
812#define OVL_USING_P(NODE) TREE_LANG_FLAG_1 (OVERLOAD_CHECK (NODE))
813/* If set, this overload is a hidden decl. */
814#define OVL_HIDDEN_P(NODE) TREE_LANG_FLAG_2 (OVERLOAD_CHECK (NODE))
815/* If set, this overload contains a nested overload. */
816#define OVL_NESTED_P(NODE) TREE_LANG_FLAG_3 (OVERLOAD_CHECK (NODE))
817/* If set, this overload was constructed during lookup. */
818#define OVL_LOOKUP_P(NODE) TREE_LANG_FLAG_4 (OVERLOAD_CHECK (NODE))
819/* If set, this OVL_USING_P overload is exported. */
820#define OVL_EXPORT_P(NODE) TREE_LANG_FLAG_5 (OVERLOAD_CHECK (NODE))
821/* If set, this OVL_USING_P overload is in the module purview. */
822#define OVL_PURVIEW_P(NODE) (OVERLOAD_CHECK (NODE)->base.public_flag)
823/* If set, this overload includes name-independent declarations. */
824#define OVL_NAME_INDEPENDENT_DECL_P(NODE) \
825 TREE_LANG_FLAG_6 (OVERLOAD_CHECK (NODE))
826
827/* The first decl of an overload. */
828#define OVL_FIRST(NODE) ovl_first (NODE)
829/* The name of the overload set. */
830#define OVL_NAME(NODE) DECL_NAME (OVL_FIRST (NODE))
831
832/* Whether this is a set of overloaded functions. TEMPLATE_DECLS are
833 always wrapped in an OVERLOAD, so we don't need to check them
834 here. */
835#define OVL_P(NODE) \
836 (TREE_CODE (NODE) == FUNCTION_DECL || TREE_CODE (NODE) == OVERLOAD)
837/* Whether this is a single member overload. */
838#define OVL_SINGLE_P(NODE) \
839 (TREE_CODE (NODE) != OVERLOAD || !OVL_CHAIN (NODE))
840
841/* OVL_HIDDEN_P nodes come before other nodes. */
842
843struct GTY(()) tree_overload {
844 struct tree_common common;
845 tree function;
846};
847
848/* Iterator for a 1 dimensional overload. Permits iterating over the
849 outer level of a 2-d overload when explicitly enabled. */
850
851class ovl_iterator {
852 tree ovl;
853 const bool allow_inner; /* Only used when checking. */
854
855 public:
856 explicit ovl_iterator (tree o, bool allow = false)
857 : ovl (o), allow_inner (allow)
858 {
859 }
860
861 public:
862 operator bool () const
863 {
864 return ovl;
865 }
866 ovl_iterator &operator++ ()
867 {
868 ovl = TREE_CODE (ovl) != OVERLOAD ? NULL_TREE : OVL_CHAIN (ovl);
869 return *this;
870 }
871 tree operator* () const
872 {
873 tree fn = TREE_CODE (ovl) != OVERLOAD ? ovl : OVL_FUNCTION (ovl);
874
875 /* Check this is not an unexpected 2-dimensional overload. */
876 gcc_checking_assert (allow_inner || TREE_CODE (fn) != OVERLOAD);
877
878 return fn;
879 }
880 bool operator== (const ovl_iterator &o) const
881 {
882 return ovl == o.ovl;
883 }
884 tree get_using () const
885 {
886 gcc_checking_assert (using_p ());
887 return ovl;
888 }
889
890 public:
891 /* Whether this overload was introduced by a using decl. */
892 bool using_p () const
893 {
894 return (TREE_CODE (ovl) == USING_DECL
895 || (TREE_CODE (ovl) == OVERLOAD && OVL_USING_P (ovl)));
896 }
897 bool hidden_p () const
898 {
899 return TREE_CODE (ovl) == OVERLOAD && OVL_HIDDEN_P (ovl);
900 }
901 bool purview_p () const;
902 bool exporting_p () const;
903
904 public:
905 tree remove_node (tree head)
906 {
907 return remove_node (head, node: ovl);
908 }
909 tree reveal_node (tree head)
910 {
911 return reveal_node (ovl: head, node: ovl);
912 }
913
914 protected:
915 /* If we have a nested overload, point at the inner overload and
916 return the next link on the outer one. */
917 tree maybe_push ()
918 {
919 tree r = NULL_TREE;
920
921 if (ovl && TREE_CODE (ovl) == OVERLOAD && OVL_NESTED_P (ovl))
922 {
923 r = OVL_CHAIN (ovl);
924 ovl = OVL_FUNCTION (ovl);
925 }
926 return r;
927 }
928 /* Restore an outer nested overload. */
929 void pop (tree outer)
930 {
931 gcc_checking_assert (!ovl);
932 ovl = outer;
933 }
934
935 private:
936 /* We make these static functions to avoid the address of the
937 iterator escaping the local context. */
938 static tree remove_node (tree head, tree node);
939 static tree reveal_node (tree ovl, tree node);
940};
941
942/* Treat a tree as a range of ovl_iterator, e.g.
943 for (tree f : ovl_range (fns)) { ... } */
944
945class ovl_range
946{
947 tree t;
948 bool allow;
949public:
950 explicit ovl_range (tree t, bool allow = false): t(t), allow(allow) { }
951 ovl_iterator begin() { return ovl_iterator (t, allow); }
952 ovl_iterator end() { return ovl_iterator (NULL_TREE, allow); }
953};
954
955/* Iterator over a (potentially) 2 dimensional overload, which is
956 produced by name lookup. */
957
958class lkp_iterator : public ovl_iterator {
959 typedef ovl_iterator parent;
960
961 tree outer;
962
963 public:
964 explicit lkp_iterator (tree o)
965 : parent (o, true), outer (maybe_push ())
966 {
967 }
968
969 public:
970 lkp_iterator &operator++ ()
971 {
972 bool repush = !outer;
973
974 if (!parent::operator++ () && !repush)
975 {
976 pop (outer);
977 repush = true;
978 }
979
980 if (repush)
981 outer = maybe_push ();
982
983 return *this;
984 }
985};
986
987/* Treat a tree as a range of lkp_iterator, e.g.
988 for (tree f : lkp_range (fns)) { ... } */
989
990class lkp_range
991{
992 tree t;
993public:
994 lkp_range (tree t): t(t) { }
995 lkp_iterator begin() { return lkp_iterator (t); }
996 lkp_iterator end() { return lkp_iterator (NULL_TREE); }
997};
998
999/* Iterator for a RAW_DATA_CST. */
1000
1001class raw_data_iterator {
1002 tree t;
1003 unsigned int n;
1004
1005 public:
1006 explicit raw_data_iterator (tree t, unsigned int n)
1007 : t (t), n (n)
1008 {
1009 }
1010
1011 operator bool () const
1012 {
1013 return n < (unsigned) RAW_DATA_LENGTH (t);
1014 }
1015
1016 raw_data_iterator &operator++ ()
1017 {
1018 ++n;
1019 return *this;
1020 }
1021
1022 tree operator* () const
1023 {
1024 return build_int_cst (TREE_TYPE (t), RAW_DATA_UCHAR_ELT (t, n));
1025 }
1026
1027 bool operator== (const raw_data_iterator &o) const
1028 {
1029 return t == o.t && n == o.n;
1030 }
1031};
1032
1033/* Treat a tree as a range of raw_data_iterator, e.g.
1034 for (tree f : raw_data_range (d)) { ... } */
1035
1036class raw_data_range
1037{
1038 tree t;
1039public:
1040 raw_data_range (tree t) : t (t) { }
1041 raw_data_iterator begin () { return raw_data_iterator (t, 0); }
1042 raw_data_iterator end ()
1043 { return raw_data_iterator (t, RAW_DATA_LENGTH (t)); }
1044};
1045
1046/* hash traits for declarations. Hashes potential overload sets via
1047 DECL_NAME. */
1048
1049struct named_decl_hash : ggc_remove <tree> {
1050 typedef tree value_type; /* A DECL or OVERLOAD */
1051 typedef tree compare_type; /* An identifier. */
1052
1053 inline static hashval_t hash (const value_type decl);
1054 inline static bool equal (const value_type existing, compare_type candidate);
1055
1056 static const bool empty_zero_p = true;
1057 static inline void mark_empty (value_type &p) {p = NULL_TREE;}
1058 static inline bool is_empty (value_type p) {return !p;}
1059
1060 /* Nothing is deletable. Everything is insertable. */
1061 static bool is_deleted (value_type) { return false; }
1062 static void mark_deleted (value_type) { gcc_unreachable (); }
1063};
1064
1065/* Simplified unique_ptr clone to release a tree vec on exit. */
1066
1067class releasing_vec
1068{
1069public:
1070 typedef vec<tree, va_gc> vec_t;
1071
1072 releasing_vec (vec_t *v): v(v) { }
1073 releasing_vec (): v(make_tree_vector ()) { }
1074
1075 /* Copy ops are deliberately declared but not defined,
1076 copies must always be elided. */
1077 releasing_vec (const releasing_vec &);
1078 releasing_vec &operator= (const releasing_vec &);
1079
1080 vec_t &operator* () const { return *v; }
1081 vec_t *operator-> () const { return v; }
1082 vec_t *get() const { return v; }
1083 operator vec_t *() const { return v; }
1084 vec_t ** operator& () { return &v; }
1085
1086 /* Breaks pointer/value consistency for convenience. This takes ptrdiff_t
1087 rather than unsigned to avoid ambiguity with the built-in operator[]
1088 (bootstrap/91828). */
1089 tree& operator[] (ptrdiff_t i) const { return (*v)[i]; }
1090
1091 tree *begin() { return ::begin (v); }
1092 tree *end() { return ::end (v); }
1093
1094 void release () { release_tree_vector (v); v = NULL; }
1095
1096 ~releasing_vec () { release_tree_vector (v); }
1097private:
1098 vec_t *v;
1099};
1100/* Forwarding functions for vec_safe_* that might reallocate. */
1101inline tree* vec_safe_push (releasing_vec& r, const tree &t CXX_MEM_STAT_INFO)
1102{ return vec_safe_push (v&: *&r, obj: t PASS_MEM_STAT); }
1103inline bool vec_safe_reserve (releasing_vec& r, unsigned n, bool e = false CXX_MEM_STAT_INFO)
1104{ return vec_safe_reserve (v&: *&r, nelems: n, exact: e PASS_MEM_STAT); }
1105inline unsigned vec_safe_length (releasing_vec &r)
1106{ return r->length(); }
1107inline void vec_safe_splice (releasing_vec &r, vec<tree, va_gc> *p CXX_MEM_STAT_INFO)
1108{ vec_safe_splice (dst&: *&r, src: p PASS_MEM_STAT); }
1109void release_tree_vector (releasing_vec &); // cause link error
1110
1111struct GTY(()) tree_template_decl {
1112 struct tree_decl_common common;
1113 tree arguments;
1114 tree result;
1115};
1116
1117/* Returns true iff NODE is a BASELINK. */
1118#define BASELINK_P(NODE) \
1119 (TREE_CODE (NODE) == BASELINK)
1120/* The BINFO indicating the base in which lookup found the
1121 BASELINK_FUNCTIONS. */
1122#define BASELINK_BINFO(NODE) \
1123 (((struct tree_baselink*) BASELINK_CHECK (NODE))->binfo)
1124/* The functions referred to by the BASELINK; either a FUNCTION_DECL,
1125 a TEMPLATE_DECL, an OVERLOAD, or a TEMPLATE_ID_EXPR. */
1126#define BASELINK_FUNCTIONS(NODE) \
1127 (((struct tree_baselink*) BASELINK_CHECK (NODE))->functions)
1128/* If T is a BASELINK, grab the functions, otherwise just T, which is
1129 expected to already be a (list of) functions. */
1130#define MAYBE_BASELINK_FUNCTIONS(T) \
1131 (BASELINK_P (T) ? BASELINK_FUNCTIONS (T) : T)
1132/* The BINFO in which the search for the functions indicated by this baselink
1133 began. This base is used to determine the accessibility of functions
1134 selected by overload resolution. */
1135#define BASELINK_ACCESS_BINFO(NODE) \
1136 (((struct tree_baselink*) BASELINK_CHECK (NODE))->access_binfo)
1137/* For a type-conversion operator, the BASELINK_OPTYPE indicates the type
1138 to which the conversion should occur. This value is important if
1139 the BASELINK_FUNCTIONS include a template conversion operator --
1140 the BASELINK_OPTYPE can be used to determine what type the user
1141 requested. */
1142#define BASELINK_OPTYPE(NODE) \
1143 (TREE_CHAIN (BASELINK_CHECK (NODE)))
1144/* Nonzero if this baselink was from a qualified lookup. */
1145#define BASELINK_QUALIFIED_P(NODE) \
1146 TREE_LANG_FLAG_0 (BASELINK_CHECK (NODE))
1147/* Nonzero if the overload set for this baselink might be incomplete due
1148 to the lookup being performed from an incomplete-class context. */
1149#define BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P(NODE) \
1150 TREE_LANG_FLAG_1 (BASELINK_CHECK (NODE))
1151
1152struct GTY(()) tree_baselink {
1153 struct tree_common common;
1154 tree binfo;
1155 tree functions;
1156 tree access_binfo;
1157};
1158
1159/* The different kinds of ids that we encounter. */
1160
1161enum cp_id_kind
1162{
1163 /* Not an id at all. */
1164 CP_ID_KIND_NONE,
1165 /* An unqualified-id that is not a template-id. */
1166 CP_ID_KIND_UNQUALIFIED,
1167 /* An unqualified-id that is a dependent name. */
1168 CP_ID_KIND_UNQUALIFIED_DEPENDENT,
1169 /* An unqualified template-id. */
1170 CP_ID_KIND_TEMPLATE_ID,
1171 /* A qualified-id. */
1172 CP_ID_KIND_QUALIFIED
1173};
1174
1175
1176/* The various kinds of C++0x warnings we encounter. */
1177
1178enum cpp0x_warn_str
1179{
1180 /* extended initializer lists */
1181 CPP0X_INITIALIZER_LISTS,
1182 /* explicit conversion operators */
1183 CPP0X_EXPLICIT_CONVERSION,
1184 /* variadic templates */
1185 CPP0X_VARIADIC_TEMPLATES,
1186 /* lambda expressions */
1187 CPP0X_LAMBDA_EXPR,
1188 /* C++0x auto */
1189 CPP0X_AUTO,
1190 /* scoped enums */
1191 CPP0X_SCOPED_ENUMS,
1192 /* defaulted and deleted functions */
1193 CPP0X_DEFAULTED_DELETED,
1194 /* inline namespaces */
1195 CPP0X_INLINE_NAMESPACES,
1196 /* override controls, override/final */
1197 CPP0X_OVERRIDE_CONTROLS,
1198 /* non-static data member initializers */
1199 CPP0X_NSDMI,
1200 /* user defined literals */
1201 CPP0X_USER_DEFINED_LITERALS,
1202 /* delegating constructors */
1203 CPP0X_DELEGATING_CTORS,
1204 /* inheriting constructors */
1205 CPP0X_INHERITING_CTORS,
1206 /* C++11 attributes */
1207 CPP0X_ATTRIBUTES,
1208 /* ref-qualified member functions */
1209 CPP0X_REF_QUALIFIER
1210};
1211
1212/* The various kinds of operation used by composite_pointer_type. */
1213
1214enum composite_pointer_operation
1215{
1216 /* comparison */
1217 CPO_COMPARISON,
1218 /* conversion */
1219 CPO_CONVERSION,
1220 /* conditional expression */
1221 CPO_CONDITIONAL_EXPR
1222};
1223
1224/* Possible cases of expression list used by
1225 build_x_compound_expr_from_list. */
1226enum expr_list_kind {
1227 ELK_INIT, /* initializer */
1228 ELK_MEM_INIT, /* member initializer */
1229 ELK_FUNC_CAST /* functional cast */
1230};
1231
1232/* Possible cases of implicit bad rhs conversions. */
1233enum impl_conv_rhs {
1234 ICR_DEFAULT_ARGUMENT, /* default argument */
1235 ICR_CONVERTING, /* converting */
1236 ICR_INIT, /* initialization */
1237 ICR_ARGPASS, /* argument passing */
1238 ICR_RETURN, /* return */
1239 ICR_ASSIGN /* assignment */
1240};
1241
1242/* Possible cases of implicit or explicit bad conversions to void. */
1243enum impl_conv_void {
1244 ICV_CAST, /* (explicit) conversion to void */
1245 ICV_SECOND_OF_COND, /* second operand of conditional expression */
1246 ICV_THIRD_OF_COND, /* third operand of conditional expression */
1247 ICV_RIGHT_OF_COMMA, /* right operand of comma operator */
1248 ICV_LEFT_OF_COMMA, /* left operand of comma operator */
1249 ICV_STATEMENT, /* statement */
1250 ICV_THIRD_IN_FOR /* for increment expression */
1251};
1252
1253/* Possible invalid uses of an abstract class that might not have a
1254 specific associated declaration. */
1255enum GTY(()) abstract_class_use {
1256 ACU_UNKNOWN, /* unknown or decl provided */
1257 ACU_CAST, /* cast to abstract class */
1258 ACU_NEW, /* new-expression of abstract class */
1259 ACU_THROW, /* throw-expression of abstract class */
1260 ACU_CATCH, /* catch-parameter of abstract class */
1261 ACU_ARRAY, /* array of abstract class */
1262 ACU_RETURN, /* return type of abstract class */
1263 ACU_PARM /* parameter type of abstract class */
1264};
1265
1266/* Macros for access to language-specific slots in an identifier. */
1267
1268/* Identifiers map directly to block or class-scope bindings.
1269 Namespace-scope bindings are held in hash tables on the respective
1270 namespaces. The identifier bindings are the innermost active
1271 binding, from whence you can get the decl and/or implicit-typedef
1272 of an elaborated type. When not bound to a local entity the
1273 values are NULL. */
1274#define IDENTIFIER_BINDING(NODE) \
1275 (LANG_IDENTIFIER_CAST (NODE)->bindings)
1276#define REAL_IDENTIFIER_TYPE_VALUE(NODE) TREE_TYPE (NODE)
1277#define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = (TYPE))
1278
1279/* Kinds of identifiers. Values are carefully chosen. */
1280enum cp_identifier_kind {
1281 cik_normal = 0, /* Not a special identifier. */
1282 cik_keyword = 1, /* A keyword. */
1283 cik_ctor = 2, /* Constructor (in-chg, complete or base). */
1284 cik_dtor = 3, /* Destructor (in-chg, deleting, complete or
1285 base). */
1286 cik_simple_op = 4, /* Non-assignment operator name. */
1287 cik_assign_op = 5, /* An assignment operator name. */
1288 cik_conv_op = 6, /* Conversion operator name. */
1289 cik_trait = 7, /* Built-in trait name. */
1290 cik_max
1291};
1292
1293/* Kind bits. */
1294#define IDENTIFIER_KIND_BIT_0(NODE) \
1295 TREE_LANG_FLAG_0 (IDENTIFIER_NODE_CHECK (NODE))
1296#define IDENTIFIER_KIND_BIT_1(NODE) \
1297 TREE_LANG_FLAG_1 (IDENTIFIER_NODE_CHECK (NODE))
1298#define IDENTIFIER_KIND_BIT_2(NODE) \
1299 TREE_LANG_FLAG_2 (IDENTIFIER_NODE_CHECK (NODE))
1300
1301/* Used by various search routines. */
1302#define IDENTIFIER_MARKED(NODE) \
1303 TREE_LANG_FLAG_4 (IDENTIFIER_NODE_CHECK (NODE))
1304
1305/* Nonzero if this identifier is used as a virtual function name somewhere
1306 (optimizes searches). */
1307#define IDENTIFIER_VIRTUAL_P(NODE) \
1308 TREE_LANG_FLAG_5 (IDENTIFIER_NODE_CHECK (NODE))
1309
1310/* Return the cp_identifier_kind of the given IDENTIFIER node ID. */
1311
1312ATTRIBUTE_PURE inline cp_identifier_kind
1313get_identifier_kind (tree id)
1314{
1315 unsigned bit0 = IDENTIFIER_KIND_BIT_0 (id);
1316 unsigned bit1 = IDENTIFIER_KIND_BIT_1 (id);
1317 unsigned bit2 = IDENTIFIER_KIND_BIT_2 (id);
1318 return cp_identifier_kind ((bit2 << 2) | (bit1 << 1) | bit0);
1319}
1320
1321/* True if this identifier is a reserved word. C_RID_CODE (node) is
1322 then the RID_* value of the keyword. Value 1. */
1323#define IDENTIFIER_KEYWORD_P(NODE) \
1324 (get_identifier_kind (NODE) == cik_keyword)
1325
1326/* True if this identifier is the name of a constructor or
1327 destructor. Value 2 or 3. */
1328#define IDENTIFIER_CDTOR_P(NODE) \
1329 (IDENTIFIER_CTOR_P (NODE) || IDENTIFIER_DTOR_P (NODE))
1330
1331/* True if this identifier is the name of a constructor. Value 2. */
1332#define IDENTIFIER_CTOR_P(NODE) \
1333 (get_identifier_kind (NODE) == cik_ctor)
1334
1335/* True if this identifier is the name of a destructor. Value 3. */
1336#define IDENTIFIER_DTOR_P(NODE) \
1337 (get_identifier_kind (NODE) == cik_dtor)
1338
1339/* True if this identifier is for any operator name (including
1340 conversions). Value 4, 5, or 6. */
1341#define IDENTIFIER_ANY_OP_P(NODE) \
1342 (IDENTIFIER_OVL_OP_P (NODE) || IDENTIFIER_CONV_OP_P (NODE))
1343
1344/* True if this identifier is for an overloaded operator. Values 4, 5. */
1345#define IDENTIFIER_OVL_OP_P(NODE) \
1346 (get_identifier_kind (NODE) == cik_simple_op \
1347 || get_identifier_kind (NODE) == cik_assign_op)
1348
1349/* True if this identifier is for any assignment. Values 5. */
1350#define IDENTIFIER_ASSIGN_OP_P(NODE) \
1351 (get_identifier_kind (NODE) == cik_assign_op)
1352
1353/* True if this identifier is the name of a type-conversion
1354 operator. Value 6. */
1355#define IDENTIFIER_CONV_OP_P(NODE) \
1356 (get_identifier_kind (NODE) == cik_conv_op)
1357
1358/* True if this identifier is the name of a built-in trait. */
1359#define IDENTIFIER_TRAIT_P(NODE) \
1360 (get_identifier_kind (NODE) == cik_trait)
1361
1362/* True if this identifier is a new or delete operator. */
1363#define IDENTIFIER_NEWDEL_OP_P(NODE) \
1364 (IDENTIFIER_OVL_OP_P (NODE) \
1365 && IDENTIFIER_OVL_OP_FLAGS (NODE) & OVL_OP_FLAG_ALLOC)
1366
1367/* True if this identifier is a new operator. */
1368#define IDENTIFIER_NEW_OP_P(NODE) \
1369 (IDENTIFIER_OVL_OP_P (NODE) \
1370 && (IDENTIFIER_OVL_OP_FLAGS (NODE) \
1371 & (OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE)) == OVL_OP_FLAG_ALLOC)
1372
1373/* Access a C++-specific index for identifier NODE.
1374 Used to optimize operator mappings etc. */
1375#define IDENTIFIER_CP_INDEX(NODE) \
1376 (IDENTIFIER_NODE_CHECK(NODE)->base.u.bits.address_space)
1377
1378/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */
1379#define C_TYPE_FIELDS_READONLY(TYPE) \
1380 (LANG_TYPE_CLASS_CHECK (TYPE)->fields_readonly)
1381
1382/* The tokens stored in the unparsed operand. */
1383
1384#define DEFPARSE_TOKENS(NODE) \
1385 (((struct tree_deferred_parse *)DEFERRED_PARSE_CHECK (NODE))->tokens)
1386#define DEFPARSE_INSTANTIATIONS(NODE) \
1387 (((struct tree_deferred_parse *)DEFERRED_PARSE_CHECK (NODE))->instantiations)
1388
1389struct GTY (()) tree_deferred_parse {
1390 struct tree_base base;
1391 struct cp_token_cache *tokens;
1392 vec<tree, va_gc> *instantiations;
1393};
1394
1395
1396#define DEFERRED_NOEXCEPT_PATTERN(NODE) \
1397 (((struct tree_deferred_noexcept *)DEFERRED_NOEXCEPT_CHECK (NODE))->pattern)
1398#define DEFERRED_NOEXCEPT_ARGS(NODE) \
1399 (((struct tree_deferred_noexcept *)DEFERRED_NOEXCEPT_CHECK (NODE))->args)
1400#define DEFERRED_NOEXCEPT_SPEC_P(NODE) \
1401 ((NODE) && (TREE_PURPOSE (NODE)) \
1402 && (TREE_CODE (TREE_PURPOSE (NODE)) == DEFERRED_NOEXCEPT))
1403#define UNEVALUATED_NOEXCEPT_SPEC_P(NODE) \
1404 (DEFERRED_NOEXCEPT_SPEC_P (NODE) \
1405 && DEFERRED_NOEXCEPT_PATTERN (TREE_PURPOSE (NODE)) == NULL_TREE)
1406#define UNPARSED_NOEXCEPT_SPEC_P(NODE) \
1407 ((NODE) && (TREE_PURPOSE (NODE)) \
1408 && (TREE_CODE (TREE_PURPOSE (NODE)) == DEFERRED_PARSE))
1409
1410struct GTY (()) tree_deferred_noexcept {
1411 struct tree_base base;
1412 tree pattern;
1413 tree args;
1414};
1415
1416
1417/* The condition associated with the static assertion. This must be
1418 an integral constant expression. */
1419#define STATIC_ASSERT_CONDITION(NODE) \
1420 (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->condition)
1421
1422/* The message associated with the static assertion. This must be a
1423 string constant, which will be emitted as an error message when the
1424 static assert condition is false. */
1425#define STATIC_ASSERT_MESSAGE(NODE) \
1426 (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->message)
1427
1428/* Source location information for a static assertion. */
1429#define STATIC_ASSERT_SOURCE_LOCATION(NODE) \
1430 (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->location)
1431
1432struct GTY (()) tree_static_assert {
1433 struct tree_base base;
1434 tree condition;
1435 tree message;
1436 location_t location;
1437};
1438
1439struct GTY (()) tree_argument_pack_select {
1440 struct tree_base base;
1441 tree argument_pack;
1442 int index;
1443};
1444
1445/* The different kinds of traits that we encounter. The size is limited to
1446 addr_space_t since a trait is looked up by IDENTIFIER_CP_INDEX. */
1447enum cp_trait_kind : addr_space_t {
1448#define DEFTRAIT(TCC, CODE, NAME, ARITY) \
1449 CPTK_##CODE,
1450#include "cp-trait.def"
1451#undef DEFTRAIT
1452};
1453
1454/* The trait type. */
1455struct cp_trait {
1456 const char *name;
1457 cp_trait_kind kind;
1458 short arity;
1459 bool type;
1460};
1461
1462/* The trait table indexed by cp_trait_kind. */
1463extern const struct cp_trait cp_traits[];
1464
1465/* The types that we are processing. */
1466#define TRAIT_EXPR_TYPE1(NODE) \
1467 (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type1)
1468
1469#define TRAIT_EXPR_TYPE2(NODE) \
1470 (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type2)
1471
1472/* The specific trait that we are processing. */
1473#define TRAIT_EXPR_KIND(NODE) \
1474 (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->kind)
1475
1476#define TRAIT_EXPR_LOCATION(NODE) \
1477 (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->locus)
1478
1479struct GTY (()) tree_trait_expr {
1480 struct tree_typed typed;
1481 tree type1;
1482 tree type2;
1483 location_t locus;
1484 enum cp_trait_kind kind;
1485};
1486
1487/* An INTEGER_CST containing the kind of the trait type NODE. */
1488#define TRAIT_TYPE_KIND_RAW(NODE) \
1489 TYPE_VALUES_RAW (TRAIT_TYPE_CHECK (NODE))
1490
1491/* The kind of the trait type NODE. */
1492#define TRAIT_TYPE_KIND(NODE) \
1493 ((enum cp_trait_kind) TREE_INT_CST_LOW (TRAIT_TYPE_KIND_RAW (NODE)))
1494
1495/* The first argument of the trait type NODE. */
1496#define TRAIT_TYPE_TYPE1(NODE) \
1497 TYPE_MIN_VALUE_RAW (TRAIT_TYPE_CHECK (NODE))
1498
1499/* The rest of the arguments of the trait type NODE. */
1500#define TRAIT_TYPE_TYPE2(NODE) \
1501 TYPE_MAX_VALUE_RAW (TRAIT_TYPE_CHECK (NODE))
1502
1503/* Identifiers used for lambda types are almost anonymous. Use this
1504 spare flag to distinguish them (they also have the anonymous flag). */
1505#define IDENTIFIER_LAMBDA_P(NODE) \
1506 (IDENTIFIER_NODE_CHECK(NODE)->base.protected_flag)
1507
1508/* Based off of TYPE_UNNAMED_P. */
1509#define LAMBDA_TYPE_P(NODE) \
1510 (TREE_CODE (NODE) == RECORD_TYPE \
1511 && TYPE_LINKAGE_IDENTIFIER (NODE) \
1512 && IDENTIFIER_LAMBDA_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
1513
1514/* Test if FUNCTION_DECL is a lambda function. */
1515#define LAMBDA_FUNCTION_P(FNDECL) \
1516 (DECL_DECLARES_FUNCTION_P (FNDECL) \
1517 && DECL_OVERLOADED_OPERATOR_P (FNDECL) \
1518 && DECL_OVERLOADED_OPERATOR_IS (FNDECL, CALL_EXPR) \
1519 && LAMBDA_TYPE_P (CP_DECL_CONTEXT (FNDECL)))
1520
1521enum cp_lambda_default_capture_mode_type {
1522 CPLD_NONE,
1523 CPLD_COPY,
1524 CPLD_REFERENCE
1525};
1526
1527/* The method of default capture, if any. */
1528#define LAMBDA_EXPR_DEFAULT_CAPTURE_MODE(NODE) \
1529 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->default_capture_mode)
1530
1531/* The capture-list, including `this'. Each capture is stored as a FIELD_DECL
1532 * so that the name, type, and field are all together, whether or not it has
1533 * been added to the lambda's class type.
1534 TREE_LIST:
1535 TREE_PURPOSE: The FIELD_DECL for this capture.
1536 TREE_VALUE: The initializer. This is part of a GNU extension. */
1537#define LAMBDA_EXPR_CAPTURE_LIST(NODE) \
1538 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->capture_list)
1539
1540/* During parsing of the lambda-introducer, the node in the capture-list
1541 that holds the 'this' capture. During parsing of the body, the
1542 capture proxy for that node. */
1543#define LAMBDA_EXPR_THIS_CAPTURE(NODE) \
1544 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->this_capture)
1545
1546/* True iff uses of a const variable capture were optimized away. */
1547#define LAMBDA_EXPR_CAPTURE_OPTIMIZED(NODE) \
1548 TREE_LANG_FLAG_2 (LAMBDA_EXPR_CHECK (NODE))
1549
1550/* Predicate tracking whether the lambda was declared 'static'. */
1551#define LAMBDA_EXPR_STATIC_P(NODE) \
1552 TREE_LANG_FLAG_3 (LAMBDA_EXPR_CHECK (NODE))
1553
1554/* True if this TREE_LIST in LAMBDA_EXPR_CAPTURE_LIST is for an explicit
1555 capture. */
1556#define LAMBDA_CAPTURE_EXPLICIT_P(NODE) \
1557 TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
1558
1559/* The source location of the lambda. */
1560#define LAMBDA_EXPR_LOCATION(NODE) \
1561 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->locus)
1562
1563/* The mangling scope for the lambda: FUNCTION_DECL, PARM_DECL, VAR_DECL,
1564 FIELD_DECL, TYPE_DECL, or NULL_TREE. If this is NULL_TREE, we have no
1565 linkage. */
1566#define LAMBDA_EXPR_EXTRA_SCOPE(NODE) \
1567 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->extra_scope)
1568
1569/* Lambdas in the same extra scope might need a discriminating count.
1570 For ABI 17, we have single per-scope count, for ABI 18, we have
1571 per-scope, per-signature numbering. */
1572#define LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR(NODE) \
1573 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->discriminator_scope)
1574#define LAMBDA_EXPR_SCOPE_SIG_DISCRIMINATOR(NODE) \
1575 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->discriminator_sig)
1576
1577/* During parsing of the lambda, a vector of capture proxies which need
1578 to be pushed once we're done processing a nested lambda. */
1579#define LAMBDA_EXPR_PENDING_PROXIES(NODE) \
1580 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->pending_proxies)
1581
1582/* If NODE was regenerated via tsubst_lambda_expr, this is a TEMPLATE_INFO
1583 whose TI_TEMPLATE is the immediate LAMBDA_EXPR from which NODE was
1584 regenerated, and TI_ARGS is the full set of template arguments used
1585 to regenerate NODE from the most general lambda. */
1586#define LAMBDA_EXPR_REGEN_INFO(NODE) \
1587 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->regen_info)
1588
1589/* Like PACK_EXPANSION_EXTRA_ARGS, for lambda-expressions. */
1590#define LAMBDA_EXPR_EXTRA_ARGS(NODE) \
1591 (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->extra_args)
1592
1593/* The closure type of the lambda, which is also the type of the
1594 LAMBDA_EXPR. */
1595#define LAMBDA_EXPR_CLOSURE(NODE) \
1596 (TREE_TYPE (LAMBDA_EXPR_CHECK (NODE)))
1597
1598struct GTY (()) tree_lambda_expr
1599{
1600 struct tree_typed typed;
1601 tree capture_list;
1602 tree this_capture;
1603 tree extra_scope;
1604 tree regen_info;
1605 tree extra_args;
1606 vec<tree, va_gc> *pending_proxies;
1607 location_t locus;
1608 enum cp_lambda_default_capture_mode_type default_capture_mode : 2;
1609 unsigned discriminator_scope : 15; // Per-scope discriminator
1610 unsigned discriminator_sig : 15; // Per-scope, per-signature discriminator
1611};
1612
1613/* Non-zero if this template specialization has access violations that
1614 should be rechecked when the function is instantiated outside argument
1615 deduction. */
1616#define TINFO_HAS_ACCESS_ERRORS(NODE) \
1617 (TREE_LANG_FLAG_0 (TEMPLATE_INFO_CHECK (NODE)))
1618#define FNDECL_HAS_ACCESS_ERRORS(NODE) \
1619 (TINFO_HAS_ACCESS_ERRORS (DECL_TEMPLATE_INFO (NODE)))
1620
1621/* Non-zero if this variable template specialization was specified using a
1622 template-id, so it's a partial or full specialization and not a definition
1623 of the member template of a particular class specialization. */
1624#define TINFO_USED_TEMPLATE_ID(NODE) \
1625 (TREE_LANG_FLAG_1 (TEMPLATE_INFO_CHECK (NODE)))
1626
1627/* The representation of a deferred access check. */
1628
1629struct GTY(()) deferred_access_check {
1630 /* The base class in which the declaration is referenced. */
1631 tree binfo;
1632 /* The declaration whose access must be checked. */
1633 tree decl;
1634 /* The declaration that should be used in the error message. */
1635 tree diag_decl;
1636 /* The location of this access. */
1637 location_t loc;
1638};
1639
1640struct GTY(()) tree_template_info {
1641 struct tree_base base;
1642 tree tmpl;
1643 tree args;
1644 tree partial;
1645 vec<deferred_access_check, va_gc> *deferred_access_checks;
1646};
1647
1648// Constraint information for a C++ declaration. Constraint information is
1649// comprised of:
1650//
1651// - a constraint expression introduced by the template header
1652// - a constraint expression introduced by a function declarator
1653// - the associated constraints, which are the conjunction of those,
1654// and used for declaration matching
1655//
1656// The template and declarator requirements are kept to support pretty
1657// printing constrained declarations.
1658struct GTY(()) tree_constraint_info {
1659 struct tree_base base;
1660 tree template_reqs;
1661 tree declarator_reqs;
1662 tree associated_constr;
1663};
1664
1665// Require that pointer P is non-null before returning.
1666template<typename T>
1667inline T*
1668check_nonnull (T* p)
1669{
1670 gcc_assert (p);
1671 return p;
1672}
1673
1674/* Returns true iff T is non-null and represents constraint info. */
1675inline tree_constraint_info *
1676check_constraint_info (tree t)
1677{
1678 if (t && TREE_CODE (t) == CONSTRAINT_INFO)
1679 return (tree_constraint_info *)t;
1680 return NULL;
1681}
1682
1683/* Access the expression describing the template constraints. This may be
1684 null if no constraints were introduced in the template parameter list,
1685 a requirements clause after the template parameter list, or constraints
1686 through a constrained-type-specifier. */
1687#define CI_TEMPLATE_REQS(NODE) \
1688 check_constraint_info (check_nonnull (NODE))->template_reqs
1689
1690/* Access the expression describing the trailing constraints. This is non-null
1691 for any implicit instantiation of a constrained declaration. For a
1692 templated declaration it is non-null only when a trailing requires-clause
1693 was specified. */
1694#define CI_DECLARATOR_REQS(NODE) \
1695 check_constraint_info (check_nonnull (NODE))->declarator_reqs
1696
1697/* The computed associated constraint expression for a declaration. */
1698#define CI_ASSOCIATED_CONSTRAINTS(NODE) \
1699 check_constraint_info (check_nonnull (NODE))->associated_constr
1700
1701/* Access the constraint-expression introduced by the requires-clause
1702 associate the template parameter list NODE. */
1703#define TEMPLATE_PARMS_CONSTRAINTS(NODE) \
1704 TREE_TYPE (TREE_LIST_CHECK (NODE))
1705
1706/* Access the logical constraints on the template parameter declaration
1707 indicated by NODE. */
1708#define TEMPLATE_PARM_CONSTRAINTS(NODE) \
1709 TREE_TYPE (TREE_LIST_CHECK (NODE))
1710
1711/* Non-zero if the noexcept is present in a compound requirement. */
1712#define COMPOUND_REQ_NOEXCEPT_P(NODE) \
1713 TREE_LANG_FLAG_0 (TREE_CHECK (NODE, COMPOUND_REQ))
1714
1715/* A TREE_LIST whose TREE_VALUE is the constraints on the 'auto' placeholder
1716 type NODE, used in an argument deduction constraint. The TREE_PURPOSE
1717 holds the set of template parameters that were in-scope when this 'auto'
1718 was formed. */
1719#define PLACEHOLDER_TYPE_CONSTRAINTS_INFO(NODE) \
1720 DECL_SIZE_UNIT (TYPE_NAME (TEMPLATE_TYPE_PARM_CHECK (NODE)))
1721
1722/* The constraints on the 'auto' placeholder type NODE. */
1723#define PLACEHOLDER_TYPE_CONSTRAINTS(NODE) \
1724 (PLACEHOLDER_TYPE_CONSTRAINTS_INFO (NODE) \
1725 ? TREE_VALUE (PLACEHOLDER_TYPE_CONSTRAINTS_INFO (NODE)) \
1726 : NULL_TREE)
1727
1728/* True if NODE is a constraint. */
1729#define CONSTR_P(NODE) \
1730 (TREE_CODE (NODE) == ATOMIC_CONSTR \
1731 || TREE_CODE (NODE) == CONJ_CONSTR \
1732 || TREE_CODE (NODE) == DISJ_CONSTR)
1733
1734/* Valid for any normalized constraint. */
1735#define CONSTR_CHECK(NODE) \
1736 TREE_CHECK3 (NODE, ATOMIC_CONSTR, CONJ_CONSTR, DISJ_CONSTR)
1737
1738/* The CONSTR_INFO stores normalization data for a constraint. It refers to
1739 the original expression and the expression or declaration
1740 from which the constraint was normalized.
1741
1742 This is TREE_LIST whose TREE_PURPOSE is the original expression and whose
1743 TREE_VALUE is a list of contexts. */
1744#define CONSTR_INFO(NODE) \
1745 TREE_TYPE (CONSTR_CHECK (NODE))
1746
1747/* The expression evaluated by the constraint. */
1748#define CONSTR_EXPR(NODE) \
1749 TREE_PURPOSE (CONSTR_INFO (NODE))
1750
1751/* The expression or declaration from which this constraint was normalized.
1752 This is a TREE_LIST whose TREE_VALUE is either a template-id expression
1753 denoting a concept check or the declaration introducing the constraint.
1754 These are chained to other context objects. */
1755#define CONSTR_CONTEXT(NODE) \
1756 TREE_VALUE (CONSTR_INFO (NODE))
1757
1758/* The parameter mapping for an atomic constraint. */
1759#define ATOMIC_CONSTR_MAP(NODE) \
1760 TREE_OPERAND (TREE_CHECK (NODE, ATOMIC_CONSTR), 0)
1761
1762/* Whether the parameter mapping of this atomic constraint
1763 is already instantiated with concrete template arguments.
1764 Used only in satisfy_atom and in the satisfaction cache. */
1765#define ATOMIC_CONSTR_MAP_INSTANTIATED_P(NODE) \
1766 TREE_LANG_FLAG_0 (ATOMIC_CONSTR_CHECK (NODE))
1767
1768/* Whether the expression for this atomic constraint belongs to a
1769 concept definition. */
1770#define ATOMIC_CONSTR_EXPR_FROM_CONCEPT_P(NODE) \
1771 TREE_LANG_FLAG_1 (ATOMIC_CONSTR_CHECK (NODE))
1772
1773/* The expression of an atomic constraint. */
1774#define ATOMIC_CONSTR_EXPR(NODE) \
1775 CONSTR_EXPR (ATOMIC_CONSTR_CHECK (NODE))
1776
1777/* Whether a PARM_DECL represents a local parameter in a
1778 requires-expression. */
1779#define CONSTRAINT_VAR_P(NODE) \
1780 DECL_LANG_FLAG_2 (TREE_CHECK (NODE, PARM_DECL))
1781
1782/* The concept constraining this constrained template-parameter. */
1783#define CONSTRAINED_PARM_CONCEPT(NODE) \
1784 DECL_SIZE_UNIT (TYPE_DECL_CHECK (NODE))
1785/* Any extra template arguments specified for a constrained
1786 template-parameter. */
1787#define CONSTRAINED_PARM_EXTRA_ARGS(NODE) \
1788 DECL_SIZE (TYPE_DECL_CHECK (NODE))
1789/* The first template parameter of CONSTRAINED_PARM_CONCEPT to be used as a
1790 prototype for the constrained parameter in finish_shorthand_constraint,
1791 attached for convenience. */
1792#define CONSTRAINED_PARM_PROTOTYPE(NODE) \
1793 DECL_INITIAL (TYPE_DECL_CHECK (NODE))
1794
1795/* Module flags on FUNCTION,VAR,TYPE,CONCEPT or NAMESPACE
1796 A TEMPLATE_DECL holds them on the DECL_TEMPLATE_RESULT object --
1797 it's just not practical to keep them consistent. */
1798#define DECL_MODULE_CHECK(NODE) \
1799 TREE_NOT_CHECK (NODE, TEMPLATE_DECL)
1800
1801/* In the purview of a named module (or in the purview of the
1802 header-unit being compiled). */
1803#define DECL_MODULE_PURVIEW_P(N) \
1804 (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (N))->u.base.module_purview_p)
1805
1806/* Attached to the named module it is in the purview of. Decls
1807 attached to the global module will have this false. */
1808#define DECL_MODULE_ATTACH_P(N) \
1809 (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (N))->u.base.module_attach_p)
1810
1811/* True if the live version of the decl was imported. */
1812#define DECL_MODULE_IMPORT_P(NODE) \
1813 (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (NODE))->u.base.module_import_p)
1814
1815/* True if this decl is in the entity hash & array. This means that
1816 some variant was imported, even if DECL_MODULE_IMPORT_P is false. */
1817#define DECL_MODULE_ENTITY_P(NODE) \
1818 (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (NODE))->u.base.module_entity_p)
1819
1820/* DECL that has attached decls for ODR-relatedness. */
1821#define DECL_MODULE_KEYED_DECLS_P(NODE) \
1822 (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (NODE))->u.base.module_keyed_decls_p)
1823
1824/* Whether this is an exported DECL. Held on any decl that can appear
1825 at namespace scope (function, var, type, template, const or
1826 namespace). templates copy from their template_result, consts have
1827 it for unscoped enums. */
1828#define DECL_MODULE_EXPORT_P(NODE) TREE_LANG_FLAG_3 (NODE)
1829
1830/* Represents a streamed-in translation-unit-local entity. Any use of
1831 this node when instantiating a template should emit an error. */
1832struct GTY(()) tree_tu_local_entity {
1833 struct tree_base base;
1834 tree name;
1835 location_t loc;
1836};
1837
1838/* The name of a translation-unit-local entity. */
1839#define TU_LOCAL_ENTITY_NAME(NODE) \
1840 (((struct tree_tu_local_entity *)TU_LOCAL_ENTITY_CHECK (NODE))->name)
1841
1842/* The source location of the translation-unit-local entity. */
1843#define TU_LOCAL_ENTITY_LOCATION(NODE) \
1844 (((struct tree_tu_local_entity *)TU_LOCAL_ENTITY_CHECK (NODE))->loc)
1845
1846
1847/* The list of local parameters introduced by this requires-expression,
1848 in the form of a chain of PARM_DECLs. */
1849#define REQUIRES_EXPR_PARMS(NODE) \
1850 TREE_OPERAND (TREE_CHECK (NODE, REQUIRES_EXPR), 0)
1851
1852/* A TREE_LIST of the requirements for this requires-expression.
1853 The requirements are stored in lexical order within the TREE_VALUE
1854 of each TREE_LIST node. The TREE_PURPOSE of each node is unused. */
1855#define REQUIRES_EXPR_REQS(NODE) \
1856 TREE_OPERAND (TREE_CHECK (NODE, REQUIRES_EXPR), 1)
1857
1858/* Like PACK_EXPANSION_EXTRA_ARGS, for requires-expressions. */
1859#define REQUIRES_EXPR_EXTRA_ARGS(NODE) \
1860 TREE_OPERAND (TREE_CHECK (NODE, REQUIRES_EXPR), 2)
1861
1862enum cp_tree_node_structure_enum {
1863 TS_CP_GENERIC,
1864 TS_CP_IDENTIFIER,
1865 TS_CP_TPI,
1866 TS_CP_PTRMEM,
1867 TS_CP_OVERLOAD,
1868 TS_CP_BINDING_VECTOR,
1869 TS_CP_BASELINK,
1870 TS_CP_TEMPLATE_DECL,
1871 TS_CP_DEFERRED_PARSE,
1872 TS_CP_DEFERRED_NOEXCEPT,
1873 TS_CP_STATIC_ASSERT,
1874 TS_CP_ARGUMENT_PACK_SELECT,
1875 TS_CP_TRAIT_EXPR,
1876 TS_CP_LAMBDA_EXPR,
1877 TS_CP_TEMPLATE_INFO,
1878 TS_CP_CONSTRAINT_INFO,
1879 TS_CP_USERDEF_LITERAL,
1880 TS_CP_TU_LOCAL_ENTITY
1881};
1882
1883/* The resulting tree type. */
1884union GTY((desc ("cp_tree_node_structure (&%h)"),
1885 chain_next ("(union lang_tree_node *) c_tree_chain_next (&%h.generic)"))) lang_tree_node {
1886 union tree_node GTY ((tag ("TS_CP_GENERIC"),
1887 desc ("tree_node_structure (&%h)"))) generic;
1888 struct template_parm_index GTY ((tag ("TS_CP_TPI"))) tpi;
1889 struct ptrmem_cst GTY ((tag ("TS_CP_PTRMEM"))) ptrmem;
1890 struct tree_overload GTY ((tag ("TS_CP_OVERLOAD"))) overload;
1891 struct tree_binding_vec GTY ((tag ("TS_CP_BINDING_VECTOR"))) binding_vec;
1892 struct tree_baselink GTY ((tag ("TS_CP_BASELINK"))) baselink;
1893 struct tree_template_decl GTY ((tag ("TS_CP_TEMPLATE_DECL"))) template_decl;
1894 struct tree_deferred_parse GTY ((tag ("TS_CP_DEFERRED_PARSE"))) deferred_parse;
1895 struct tree_deferred_noexcept GTY ((tag ("TS_CP_DEFERRED_NOEXCEPT"))) deferred_noexcept;
1896 struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier;
1897 struct tree_static_assert GTY ((tag ("TS_CP_STATIC_ASSERT")))
1898 static_assertion;
1899 struct tree_argument_pack_select GTY ((tag ("TS_CP_ARGUMENT_PACK_SELECT")))
1900 argument_pack_select;
1901 struct tree_trait_expr GTY ((tag ("TS_CP_TRAIT_EXPR")))
1902 trait_expression;
1903 struct tree_lambda_expr GTY ((tag ("TS_CP_LAMBDA_EXPR")))
1904 lambda_expression;
1905 struct tree_template_info GTY ((tag ("TS_CP_TEMPLATE_INFO")))
1906 template_info;
1907 struct tree_constraint_info GTY ((tag ("TS_CP_CONSTRAINT_INFO")))
1908 constraint_info;
1909 struct tree_userdef_literal GTY ((tag ("TS_CP_USERDEF_LITERAL")))
1910 userdef_literal;
1911 struct tree_tu_local_entity GTY ((tag ("TS_CP_TU_LOCAL_ENTITY")))
1912 tu_local_entity;
1913};
1914
1915
1916struct GTY(()) cp_omp_declare_target_attr {
1917 bool attr_syntax;
1918 int device_type;
1919 bool indirect;
1920};
1921
1922struct GTY(()) cp_omp_begin_assumes_data {
1923 bool attr_syntax;
1924};
1925
1926/* Global state. */
1927
1928struct GTY(()) saved_scope {
1929 vec<cxx_saved_binding, va_gc> *old_bindings;
1930 tree old_namespace;
1931 vec<tree, va_gc> *decl_ns_list;
1932 tree class_name;
1933 tree class_type;
1934 tree access_specifier;
1935 tree function_decl;
1936 vec<tree, va_gc> *lang_base;
1937 tree lang_name;
1938 tree template_parms;
1939 cp_binding_level *x_previous_class_level;
1940 tree x_saved_tree;
1941
1942 /* Only used for uses of this in trailing return type. */
1943 tree x_current_class_ptr;
1944 tree x_current_class_ref;
1945
1946 int x_processing_template_decl;
1947 int x_processing_specialization;
1948 int x_processing_constraint;
1949 int x_processing_contract_condition;
1950 int suppress_location_wrappers;
1951 BOOL_BITFIELD x_processing_explicit_instantiation : 1;
1952 BOOL_BITFIELD need_pop_function_context : 1;
1953 BOOL_BITFIELD x_processing_omp_trait_property_expr : 1;
1954
1955 /* Nonzero if we are parsing the discarded statement of a constexpr
1956 if-statement. */
1957 BOOL_BITFIELD discarded_stmt : 1;
1958 /* Nonzero if we are parsing or instantiating the compound-statement
1959 of consteval if statement. Also set while processing an immediate
1960 invocation. */
1961 BOOL_BITFIELD consteval_if_p : 1;
1962
1963 int unevaluated_operand;
1964 int inhibit_evaluation_warnings;
1965 int noexcept_operand;
1966 int ref_temp_count;
1967
1968 struct stmt_tree_s x_stmt_tree;
1969
1970 cp_binding_level *class_bindings;
1971 cp_binding_level *bindings;
1972
1973 hash_map<tree, tree> *GTY((skip)) x_local_specializations;
1974 vec<cp_omp_declare_target_attr, va_gc> *omp_declare_target_attribute;
1975 vec<cp_omp_begin_assumes_data, va_gc> *omp_begin_assumes;
1976
1977 struct saved_scope *prev;
1978};
1979
1980extern GTY(()) struct saved_scope *scope_chain;
1981
1982/* The current open namespace. */
1983
1984#define current_namespace scope_chain->old_namespace
1985
1986/* The stack for namespaces of current declarations. */
1987
1988#define decl_namespace_list scope_chain->decl_ns_list
1989
1990/* IDENTIFIER_NODE: name of current class */
1991
1992#define current_class_name scope_chain->class_name
1993
1994/* _TYPE: the type of the current class */
1995
1996#define current_class_type scope_chain->class_type
1997
1998/* When parsing a class definition, the access specifier most recently
1999 given by the user, or, if no access specifier was given, the
2000 default value appropriate for the kind of class (i.e., struct,
2001 class, or union). */
2002
2003#define current_access_specifier scope_chain->access_specifier
2004
2005/* Pointer to the top of the language name stack. */
2006
2007#define current_lang_base scope_chain->lang_base
2008#define current_lang_name scope_chain->lang_name
2009
2010/* When parsing a template declaration, a TREE_LIST represents the
2011 active template parameters. Each node in the list represents one
2012 level of template parameters. The innermost level is first in the
2013 list. The depth of each level is stored as an INTEGER_CST in the
2014 TREE_PURPOSE of each node. The parameters for that level are
2015 stored in the TREE_VALUE. */
2016
2017#define current_template_parms scope_chain->template_parms
2018#define current_template_depth \
2019 (current_template_parms ? TMPL_PARMS_DEPTH (current_template_parms) : 0)
2020#define in_template_context (current_template_parms != NULL_TREE)
2021
2022#define processing_template_decl scope_chain->x_processing_template_decl
2023#define processing_specialization scope_chain->x_processing_specialization
2024#define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation
2025#define processing_omp_trait_property_expr scope_chain->x_processing_omp_trait_property_expr
2026
2027/* Nonzero if we are parsing the conditional expression of a contract
2028 condition. These expressions appear outside the parameter list (like a
2029 trailing return type), but are potentially evaluated. */
2030
2031#define processing_contract_condition scope_chain->x_processing_contract_condition
2032
2033#define in_discarded_stmt scope_chain->discarded_stmt
2034#define in_consteval_if_p scope_chain->consteval_if_p
2035
2036#define current_ref_temp_count scope_chain->ref_temp_count
2037
2038/* RAII sentinel to handle clearing processing_template_decl and restoring
2039 it when done. */
2040
2041class processing_template_decl_sentinel
2042{
2043public:
2044 int saved;
2045 processing_template_decl_sentinel (bool reset = true)
2046 : saved (processing_template_decl)
2047 {
2048 if (reset)
2049 processing_template_decl = 0;
2050 }
2051 ~processing_template_decl_sentinel()
2052 {
2053 processing_template_decl = saved;
2054 }
2055};
2056
2057/* RAII sentinel to disable certain warnings during template substitution
2058 and elsewhere. */
2059
2060class warning_sentinel
2061{
2062public:
2063 int &flag;
2064 int val;
2065 warning_sentinel(int& flag, bool suppress=true)
2066 : flag(flag), val(flag) { if (suppress) flag = 0; }
2067 ~warning_sentinel() { flag = val; }
2068};
2069
2070/* RAII sentinel to temporarily override input_location. This will not set
2071 input_location to UNKNOWN_LOCATION or BUILTINS_LOCATION. */
2072
2073class iloc_sentinel
2074{
2075 location_t saved_loc;
2076public:
2077 iloc_sentinel (location_t loc): saved_loc (input_location)
2078 {
2079 if (loc >= RESERVED_LOCATION_COUNT)
2080 input_location = loc;
2081 }
2082 ~iloc_sentinel ()
2083 {
2084 input_location = saved_loc;
2085 }
2086};
2087
2088/* RAII sentinel that saves the value of a variable, optionally
2089 overrides it right away, and restores its value when the sentinel
2090 id destructed. */
2091
2092template <typename T>
2093class temp_override
2094{
2095 T& overridden_variable;
2096 T saved_value;
2097public:
2098 temp_override(T& var) : overridden_variable (var), saved_value (var) {}
2099 temp_override(T& var, T overrider)
2100 : overridden_variable (var), saved_value (var)
2101 {
2102 overridden_variable = overrider;
2103 }
2104 ~temp_override() { overridden_variable = saved_value; }
2105};
2106
2107/* Wrapping a template parameter in type_identity_t hides it from template
2108 argument deduction. */
2109#if __cpp_lib_type_identity
2110using std::type_identity_t;
2111#else
2112template <typename T>
2113struct type_identity { typedef T type; };
2114template <typename T>
2115using type_identity_t = typename type_identity<T>::type;
2116#endif
2117
2118/* Object generator function for temp_override, so you don't need to write the
2119 type of the object as a template argument.
2120
2121 Use as auto x = make_temp_override (flag); */
2122
2123template <typename T>
2124inline temp_override<T>
2125make_temp_override (T& var)
2126{
2127 return { var };
2128}
2129
2130/* Likewise, but use as auto x = make_temp_override (flag, value); */
2131
2132template <typename T>
2133inline temp_override<T>
2134make_temp_override (T& var, type_identity_t<T> overrider)
2135{
2136 return { var, overrider };
2137}
2138
2139/* temp_override for in_consteval_if_p, which can't use make_temp_override
2140 because it is a bitfield. */
2141
2142struct in_consteval_if_p_temp_override {
2143 bool save_in_consteval_if_p;
2144 in_consteval_if_p_temp_override ()
2145 : save_in_consteval_if_p (in_consteval_if_p) {}
2146 void reset () { in_consteval_if_p = save_in_consteval_if_p; }
2147 ~in_consteval_if_p_temp_override ()
2148 { reset (); }
2149};
2150
2151/* The cached class binding level, from the most recently exited
2152 class, or NULL if none. */
2153
2154#define previous_class_level scope_chain->x_previous_class_level
2155
2156/* A map from local variable declarations in the body of the template
2157 presently being instantiated to the corresponding instantiated
2158 local variables. */
2159
2160#define local_specializations scope_chain->x_local_specializations
2161
2162/* Nonzero if we are parsing the operand of a noexcept operator. */
2163
2164#define cp_noexcept_operand scope_chain->noexcept_operand
2165
2166struct named_label_entry; /* Defined in decl.cc. */
2167
2168struct named_label_hash : ggc_remove <named_label_entry *>
2169{
2170 typedef named_label_entry *value_type;
2171 typedef tree compare_type; /* An identifier. */
2172
2173 inline static hashval_t hash (value_type);
2174 inline static bool equal (const value_type, compare_type);
2175
2176 static const bool empty_zero_p = true;
2177 inline static void mark_empty (value_type &p) {p = NULL;}
2178 inline static bool is_empty (value_type p) {return !p;}
2179
2180 /* Nothing is deletable. Everything is insertable. */
2181 inline static bool is_deleted (value_type) { return false; }
2182 inline static void mark_deleted (value_type) { gcc_unreachable (); }
2183};
2184
2185/* Global state pertinent to the current function. */
2186
2187struct GTY(()) language_function {
2188 struct c_language_function base;
2189
2190 tree x_current_class_ptr;
2191 tree x_current_class_ref;
2192 tree x_eh_spec_block;
2193 tree x_in_charge_parm;
2194 tree x_vtt_parm;
2195 tree x_return_value;
2196
2197 BOOL_BITFIELD returns_value : 1;
2198 BOOL_BITFIELD returns_null : 1;
2199 BOOL_BITFIELD returns_abnormally : 1;
2200 BOOL_BITFIELD infinite_loop: 1;
2201 BOOL_BITFIELD x_in_function_try_handler : 1;
2202 BOOL_BITFIELD x_in_base_initializer : 1;
2203
2204 /* True if this function can throw an exception. */
2205 BOOL_BITFIELD can_throw : 1;
2206
2207 BOOL_BITFIELD invalid_constexpr : 1;
2208 BOOL_BITFIELD throwing_cleanup : 1;
2209 /* True if we gave any errors in this function. */
2210 BOOL_BITFIELD erroneous : 1;
2211
2212 hash_table<named_label_hash> *x_named_labels;
2213
2214 cp_binding_level *bindings;
2215
2216 /* Tracking possibly infinite loops. This is a vec<tree> only because
2217 vec<bool> doesn't work with gtype. */
2218 vec<tree, va_gc> *infinite_loops;
2219};
2220
2221/* The current C++-specific per-function global variables. */
2222
2223#define cp_function_chain (cfun->language)
2224
2225/* When we're processing a member function, current_class_ptr is the
2226 PARM_DECL for the `this' pointer. The current_class_ref is an
2227 expression for `*this'. */
2228
2229#define current_class_ptr \
2230 (*(cfun && cp_function_chain \
2231 ? &cp_function_chain->x_current_class_ptr \
2232 : &scope_chain->x_current_class_ptr))
2233#define current_class_ref \
2234 (*(cfun && cp_function_chain \
2235 ? &cp_function_chain->x_current_class_ref \
2236 : &scope_chain->x_current_class_ref))
2237
2238/* The EH_SPEC_BLOCK for the exception-specifiers for the current
2239 function, if any. */
2240
2241#define current_eh_spec_block cp_function_chain->x_eh_spec_block
2242
2243/* The `__in_chrg' parameter for the current function. Only used for
2244 constructors and destructors. */
2245
2246#define current_in_charge_parm cp_function_chain->x_in_charge_parm
2247
2248/* The `__vtt_parm' parameter for the current function. Only used for
2249 constructors and destructors. */
2250
2251#define current_vtt_parm cp_function_chain->x_vtt_parm
2252
2253/* A boolean flag to control whether we need to clean up the return value if a
2254 local destructor throws. Only used in functions that return by value a
2255 class with a destructor. Which 'tors don't, so we can use the same
2256 field as current_vtt_parm. */
2257
2258#define current_retval_sentinel current_vtt_parm
2259
2260/* Set to 0 at beginning of a function definition, set to 1 if
2261 a return statement that specifies a return value is seen. */
2262
2263#define current_function_returns_value cp_function_chain->returns_value
2264
2265/* Set to 0 at beginning of a function definition, set to 1 if
2266 a return statement with no argument is seen. */
2267
2268#define current_function_returns_null cp_function_chain->returns_null
2269
2270/* Set to 0 at beginning of a function definition, set to 1 if
2271 a call to a noreturn function is seen. */
2272
2273#define current_function_returns_abnormally \
2274 cp_function_chain->returns_abnormally
2275
2276/* Set to 0 at beginning of a function definition, set to 1 if we see an
2277 obvious infinite loop. This can have false positives and false
2278 negatives, so it should only be used as a heuristic. */
2279
2280#define current_function_infinite_loop cp_function_chain->infinite_loop
2281
2282/* Nonzero if we are processing a base initializer. Zero elsewhere. */
2283#define in_base_initializer cp_function_chain->x_in_base_initializer
2284
2285#define in_function_try_handler cp_function_chain->x_in_function_try_handler
2286
2287/* Expression always returned from function, or error_mark_node
2288 otherwise, for use by the automatic named return value optimization. */
2289
2290#define current_function_return_value \
2291 (cp_function_chain->x_return_value)
2292
2293/* In parser.cc. */
2294extern tree cp_literal_operator_id (const char *);
2295
2296#define NON_ERROR(NODE) ((NODE) == error_mark_node ? NULL_TREE : (NODE))
2297
2298/* TRUE if a tree code represents a statement. */
2299extern bool statement_code_p[MAX_TREE_CODES];
2300
2301#define STATEMENT_CODE_P(CODE) statement_code_p[(int) (CODE)]
2302
2303enum languages { lang_c, lang_cplusplus };
2304
2305/* Macros to make error reporting functions' lives easier. */
2306#define TYPE_LINKAGE_IDENTIFIER(NODE) \
2307 (TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (NODE)))
2308#define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE)))
2309#define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE)))
2310
2311/* Any kind of anonymous type. */
2312#define TYPE_ANON_P(NODE) \
2313 (TYPE_LINKAGE_IDENTIFIER (NODE) \
2314 && IDENTIFIER_ANON_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
2315
2316/* Nonzero if NODE, a TYPE, has no name for linkage purposes. */
2317#define TYPE_UNNAMED_P(NODE) \
2318 (TYPE_ANON_P (NODE) \
2319 && !IDENTIFIER_LAMBDA_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
2320
2321/* The _DECL for this _TYPE. */
2322#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
2323
2324/* Nonzero if T is a type that could resolve to any kind of concrete type
2325 at instantiation time. */
2326#define WILDCARD_TYPE_P(T) \
2327 (TREE_CODE (T) == TEMPLATE_TYPE_PARM \
2328 || TREE_CODE (T) == TYPENAME_TYPE \
2329 || TREE_CODE (T) == TYPEOF_TYPE \
2330 || TREE_CODE (T) == BOUND_TEMPLATE_TEMPLATE_PARM \
2331 || TREE_CODE (T) == UNBOUND_CLASS_TEMPLATE \
2332 || TREE_CODE (T) == DECLTYPE_TYPE \
2333 || TREE_CODE (T) == TRAIT_TYPE \
2334 || TREE_CODE (T) == DEPENDENT_OPERATOR_TYPE \
2335 || TREE_CODE (T) == PACK_INDEX_TYPE)
2336
2337/* Nonzero if T is a class (or struct or union) type. Also nonzero
2338 for template type parameters, typename types, and instantiated
2339 template template parameters. Keep these checks in ascending code
2340 order. */
2341#define MAYBE_CLASS_TYPE_P(T) (WILDCARD_TYPE_P (T) || CLASS_TYPE_P (T))
2342
2343/* Set CLASS_TYPE_P for T to VAL. T must be a class, struct, or
2344 union type. */
2345#define SET_CLASS_TYPE_P(T, VAL) \
2346 (TYPE_LANG_FLAG_5 (RECORD_OR_UNION_CHECK (T)) = (VAL))
2347
2348/* Nonzero if T is a class type. Zero for template type parameters,
2349 typename types, and so forth. */
2350#define CLASS_TYPE_P(T) \
2351 (RECORD_OR_UNION_CODE_P (TREE_CODE (T)) && TYPE_LANG_FLAG_5 (T))
2352
2353/* Nonzero if T is a class type but not a union. */
2354#define NON_UNION_CLASS_TYPE_P(T) \
2355 (TREE_CODE (T) == RECORD_TYPE && TYPE_LANG_FLAG_5 (T))
2356
2357/* Keep these checks in ascending code order. */
2358#define RECORD_OR_UNION_CODE_P(T) \
2359 ((T) == RECORD_TYPE || (T) == UNION_TYPE)
2360#define OVERLOAD_TYPE_P(T) \
2361 (CLASS_TYPE_P (T) || TREE_CODE (T) == ENUMERAL_TYPE)
2362
2363/* True if this type is dependent. This predicate is only valid if
2364 TYPE_DEPENDENT_P_VALID is true. */
2365#define TYPE_DEPENDENT_P(NODE) TYPE_LANG_FLAG_0 (NODE)
2366
2367/* True if dependent_type_p has been called for this type, with the
2368 result that TYPE_DEPENDENT_P is valid. */
2369#define TYPE_DEPENDENT_P_VALID(NODE) TYPE_LANG_FLAG_6(NODE)
2370
2371/* Nonzero if this type is const-qualified. */
2372#define CP_TYPE_CONST_P(NODE) \
2373 ((cp_type_quals (NODE) & TYPE_QUAL_CONST) != 0)
2374
2375/* Nonzero if this type is volatile-qualified. */
2376#define CP_TYPE_VOLATILE_P(NODE) \
2377 ((cp_type_quals (NODE) & TYPE_QUAL_VOLATILE) != 0)
2378
2379/* Nonzero if this type is restrict-qualified. */
2380#define CP_TYPE_RESTRICT_P(NODE) \
2381 ((cp_type_quals (NODE) & TYPE_QUAL_RESTRICT) != 0)
2382
2383/* Nonzero if this type is const-qualified, but not
2384 volatile-qualified. Other qualifiers are ignored. This macro is
2385 used to test whether or not it is OK to bind an rvalue to a
2386 reference. */
2387#define CP_TYPE_CONST_NON_VOLATILE_P(NODE) \
2388 ((cp_type_quals (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) \
2389 == TYPE_QUAL_CONST)
2390
2391#define FUNCTION_ARG_CHAIN(NODE) \
2392 TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE)))
2393
2394/* Given a FUNCTION_DECL, returns the first TREE_LIST out of TYPE_ARG_TYPES
2395 which refers to a user-written parameter. */
2396#define FUNCTION_FIRST_USER_PARMTYPE(NODE) \
2397 skip_artificial_parms_for ((NODE), TYPE_ARG_TYPES (TREE_TYPE (NODE)))
2398
2399/* Similarly, but for DECL_ARGUMENTS. */
2400#define FUNCTION_FIRST_USER_PARM(NODE) \
2401 skip_artificial_parms_for ((NODE), DECL_ARGUMENTS (NODE))
2402
2403/* Nonzero iff TYPE is derived from PARENT. Ignores accessibility and
2404 ambiguity issues. */
2405#define DERIVED_FROM_P(PARENT, TYPE) \
2406 (lookup_base ((TYPE), (PARENT), ba_any, NULL, tf_none) != NULL_TREE)
2407
2408/* Gives the visibility specification for a class type. */
2409#define CLASSTYPE_VISIBILITY(TYPE) \
2410 DECL_VISIBILITY (TYPE_MAIN_DECL (TYPE))
2411#define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE) \
2412 DECL_VISIBILITY_SPECIFIED (TYPE_MAIN_DECL (TYPE))
2413
2414struct GTY (()) tree_pair_s {
2415 tree purpose;
2416 tree value;
2417};
2418typedef tree_pair_s *tree_pair_p;
2419
2420/* This structure provides additional information above and beyond
2421 what is provide in the ordinary tree_type. In the past, we used it
2422 for the types of class types, template parameters types, typename
2423 types, and so forth. However, there can be many (tens to hundreds
2424 of thousands) of template parameter types in a compilation, and
2425 there's no need for this additional information in that case.
2426 Therefore, we now use this data structure only for class types.
2427
2428 In the past, it was thought that there would be relatively few
2429 class types. However, in the presence of heavy use of templates,
2430 many (i.e., thousands) of classes can easily be generated.
2431 Therefore, we should endeavor to keep the size of this structure to
2432 a minimum. */
2433struct GTY(()) lang_type {
2434 unsigned char align;
2435
2436 unsigned has_type_conversion : 1;
2437 unsigned has_copy_ctor : 1;
2438 unsigned has_default_ctor : 1;
2439 unsigned const_needs_init : 1;
2440 unsigned ref_needs_init : 1;
2441 unsigned has_const_copy_assign : 1;
2442 unsigned use_template : 2;
2443
2444 unsigned has_mutable : 1;
2445 unsigned com_interface : 1;
2446 unsigned non_pod_class : 1;
2447 unsigned nearly_empty_p : 1;
2448 unsigned user_align : 1;
2449 unsigned has_copy_assign : 1;
2450 unsigned has_new : 1;
2451 unsigned has_array_new : 1;
2452
2453 unsigned gets_delete : 2;
2454 unsigned interface_only : 1;
2455 unsigned interface_unknown : 1;
2456 unsigned contains_empty_class_p : 1;
2457 unsigned anon_aggr : 1;
2458 unsigned non_zero_init : 1;
2459 unsigned empty_p : 1;
2460 /* 32 bits allocated. */
2461
2462 unsigned vec_new_uses_cookie : 1;
2463 unsigned declared_class : 1;
2464 unsigned diamond_shaped : 1;
2465 unsigned repeated_base : 1;
2466 unsigned being_defined : 1;
2467 unsigned debug_requested : 1;
2468 unsigned fields_readonly : 1;
2469 unsigned ptrmemfunc_flag : 1;
2470
2471 unsigned lazy_default_ctor : 1;
2472 unsigned lazy_copy_ctor : 1;
2473 unsigned lazy_copy_assign : 1;
2474 unsigned lazy_destructor : 1;
2475 unsigned has_const_copy_ctor : 1;
2476 unsigned has_complex_copy_ctor : 1;
2477 unsigned has_complex_copy_assign : 1;
2478 unsigned non_aggregate : 1;
2479
2480 unsigned has_complex_dflt : 1;
2481 unsigned has_list_ctor : 1;
2482 unsigned non_std_layout : 1;
2483 unsigned is_literal : 1;
2484 unsigned lazy_move_ctor : 1;
2485 unsigned lazy_move_assign : 1;
2486 unsigned has_complex_move_ctor : 1;
2487 unsigned has_complex_move_assign : 1;
2488
2489 unsigned has_constexpr_ctor : 1;
2490 unsigned unique_obj_representations : 1;
2491 unsigned unique_obj_representations_set : 1;
2492 bool erroneous : 1;
2493 bool non_pod_aggregate : 1;
2494 bool non_aggregate_pod : 1;
2495
2496 /* When adding a flag here, consider whether or not it ought to
2497 apply to a template instance if it applies to the template. If
2498 so, make sure to copy it in instantiate_class_template! */
2499
2500 /* There are some bits left to fill out a 32-bit word. Keep track
2501 of this by updating the size of this bitfield whenever you add or
2502 remove a flag. */
2503 unsigned dummy : 2;
2504
2505 tree primary_base;
2506 vec<tree_pair_s, va_gc> *vcall_indices;
2507 tree vtables;
2508 tree typeinfo_var;
2509 vec<tree, va_gc> *vbases;
2510 tree as_base;
2511 vec<tree, va_gc> *pure_virtuals;
2512 tree friend_classes;
2513 vec<tree, va_gc> * GTY((reorder ("resort_type_member_vec"))) members;
2514 tree key_method;
2515 tree decl_list;
2516 tree befriending_classes;
2517 /* In a RECORD_TYPE, information specific to Objective-C++, such
2518 as a list of adopted protocols or a pointer to a corresponding
2519 @interface. See objc/objc-act.h for details. */
2520 tree objc_info;
2521 /* FIXME reuse another field? */
2522 tree lambda_expr;
2523};
2524
2525/* We used to have a variant type for lang_type. Keep the name of the
2526 checking accessor for the sole survivor. */
2527#define LANG_TYPE_CLASS_CHECK(NODE) (TYPE_LANG_SPECIFIC (NODE))
2528
2529/* Nonzero for _CLASSTYPE means that operator delete is defined. */
2530#define TYPE_GETS_DELETE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->gets_delete)
2531#define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1)
2532#define TYPE_GETS_VEC_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 2)
2533
2534/* Nonzero if `new NODE[x]' should cause the allocation of extra
2535 storage to indicate how many array elements are in use. */
2536#define TYPE_VEC_NEW_USES_COOKIE(NODE) \
2537 (CLASS_TYPE_P (NODE) \
2538 && LANG_TYPE_CLASS_CHECK (NODE)->vec_new_uses_cookie)
2539
2540/* Nonzero means that this _CLASSTYPE node defines ways of converting
2541 itself to other types. */
2542#define TYPE_HAS_CONVERSION(NODE) \
2543 (LANG_TYPE_CLASS_CHECK (NODE)->has_type_conversion)
2544
2545/* Nonzero means that NODE (a class type) has a default constructor --
2546 but that it has not yet been declared. */
2547#define CLASSTYPE_LAZY_DEFAULT_CTOR(NODE) \
2548 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_default_ctor)
2549
2550/* Nonzero means that NODE (a class type) has a copy constructor --
2551 but that it has not yet been declared. */
2552#define CLASSTYPE_LAZY_COPY_CTOR(NODE) \
2553 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_ctor)
2554
2555/* Nonzero means that NODE (a class type) has a move constructor --
2556 but that it has not yet been declared. */
2557#define CLASSTYPE_LAZY_MOVE_CTOR(NODE) \
2558 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_ctor)
2559
2560/* Nonzero means that NODE (a class type) has an assignment operator
2561 -- but that it has not yet been declared. */
2562#define CLASSTYPE_LAZY_COPY_ASSIGN(NODE) \
2563 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_assign)
2564
2565/* Nonzero means that NODE (a class type) has an assignment operator
2566 -- but that it has not yet been declared. */
2567#define CLASSTYPE_LAZY_MOVE_ASSIGN(NODE) \
2568 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_assign)
2569
2570/* Nonzero means that NODE (a class type) has a destructor -- but that
2571 it has not yet been declared. */
2572#define CLASSTYPE_LAZY_DESTRUCTOR(NODE) \
2573 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_destructor)
2574
2575/* Nonzero means that NODE (a class type) is final */
2576#define CLASSTYPE_FINAL(NODE) \
2577 TYPE_FINAL_P (NODE)
2578
2579
2580/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */
2581#define TYPE_HAS_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_copy_assign)
2582
2583/* True iff the class type NODE has an "operator =" whose parameter
2584 has a parameter of type "const X&". */
2585#define TYPE_HAS_CONST_COPY_ASSIGN(NODE) \
2586 (LANG_TYPE_CLASS_CHECK (NODE)->has_const_copy_assign)
2587
2588/* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */
2589#define TYPE_HAS_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_copy_ctor)
2590#define TYPE_HAS_CONST_COPY_CTOR(NODE) \
2591 (LANG_TYPE_CLASS_CHECK (NODE)->has_const_copy_ctor)
2592
2593/* Nonzero if this class has an X(initializer_list<T>) constructor. */
2594#define TYPE_HAS_LIST_CTOR(NODE) \
2595 (LANG_TYPE_CLASS_CHECK (NODE)->has_list_ctor)
2596
2597/* Nonzero if this class has a constexpr constructor other than a copy/move
2598 constructor. Note that a class can have constexpr constructors for
2599 static initialization even if it isn't a literal class. */
2600#define TYPE_HAS_CONSTEXPR_CTOR(NODE) \
2601 (LANG_TYPE_CLASS_CHECK (NODE)->has_constexpr_ctor)
2602
2603/* Nonzero if this class defines an overloaded operator new. (An
2604 operator new [] doesn't count.) */
2605#define TYPE_HAS_NEW_OPERATOR(NODE) \
2606 (LANG_TYPE_CLASS_CHECK (NODE)->has_new)
2607
2608/* Nonzero if this class defines an overloaded operator new[]. */
2609#define TYPE_HAS_ARRAY_NEW_OPERATOR(NODE) \
2610 (LANG_TYPE_CLASS_CHECK (NODE)->has_array_new)
2611
2612/* Nonzero means that this type is being defined. I.e., the left brace
2613 starting the definition of this type has been seen. */
2614#define TYPE_BEING_DEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->being_defined)
2615
2616/* Nonzero means that this type is either complete or being defined, so we
2617 can do lookup in it. */
2618#define COMPLETE_OR_OPEN_TYPE_P(NODE) \
2619 (COMPLETE_TYPE_P (NODE) || (CLASS_TYPE_P (NODE) && TYPE_BEING_DEFINED (NODE)))
2620
2621/* Mark bits for repeated base checks. */
2622#define TYPE_MARKED_P(NODE) TREE_LANG_FLAG_6 (TYPE_CHECK (NODE))
2623
2624/* Nonzero if the class NODE has multiple paths to the same (virtual)
2625 base object. */
2626#define CLASSTYPE_DIAMOND_SHAPED_P(NODE) \
2627 (LANG_TYPE_CLASS_CHECK(NODE)->diamond_shaped)
2628
2629/* Nonzero if the class NODE has multiple instances of the same base
2630 type. */
2631#define CLASSTYPE_REPEATED_BASE_P(NODE) \
2632 (LANG_TYPE_CLASS_CHECK(NODE)->repeated_base)
2633
2634/* The member function with which the vtable will be emitted:
2635 the first noninline non-pure-virtual member function. NULL_TREE
2636 if there is no key function or if this is a class template */
2637#define CLASSTYPE_KEY_METHOD(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->key_method)
2638
2639/* Vector of members. During definition, it is unordered and only
2640 member functions are present. After completion it is sorted and
2641 contains both member functions and non-functions. STAT_HACK is
2642 involved to preserve oneslot per name invariant. */
2643#define CLASSTYPE_MEMBER_VEC(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->members)
2644
2645/* For class templates, this is a TREE_LIST of all member data,
2646 functions, types, and friends in the order of declaration.
2647 The TREE_PURPOSE of each TREE_LIST is NULL_TREE for a friend,
2648 and the RECORD_TYPE for the class template otherwise. */
2649#define CLASSTYPE_DECL_LIST(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->decl_list)
2650
2651/* A FUNCTION_DECL or OVERLOAD for the constructors for NODE. These
2652 are the constructors that take an in-charge parameter. */
2653#define CLASSTYPE_CONSTRUCTORS(NODE) \
2654 (get_class_binding_direct (NODE, ctor_identifier))
2655
2656/* A FUNCTION_DECL for the destructor for NODE. This is the
2657 destructors that take an in-charge parameter. If
2658 CLASSTYPE_LAZY_DESTRUCTOR is true, then this entry will be NULL
2659 until the destructor is created with lazily_declare_fn. */
2660#define CLASSTYPE_DESTRUCTOR(NODE) \
2661 (get_class_binding_direct (NODE, dtor_identifier))
2662
2663/* Nonzero if NODE has a primary base class, i.e., a base class with
2664 which it shares the virtual function table pointer. */
2665#define CLASSTYPE_HAS_PRIMARY_BASE_P(NODE) \
2666 (CLASSTYPE_PRIMARY_BINFO (NODE) != NULL_TREE)
2667
2668/* If non-NULL, this is the binfo for the primary base class, i.e.,
2669 the base class which contains the virtual function table pointer
2670 for this class. */
2671#define CLASSTYPE_PRIMARY_BINFO(NODE) \
2672 (LANG_TYPE_CLASS_CHECK (NODE)->primary_base)
2673
2674/* A vector of BINFOs for the direct and indirect virtual base classes
2675 that this type uses in a post-order depth-first left-to-right
2676 order. (In other words, these bases appear in the order that they
2677 should be initialized.) */
2678#define CLASSTYPE_VBASECLASSES(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->vbases)
2679
2680/* The type corresponding to NODE when NODE is used as a base class,
2681 i.e., NODE without virtual base classes or tail padding. */
2682#define CLASSTYPE_AS_BASE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->as_base)
2683
2684/* True iff NODE is the CLASSTYPE_AS_BASE version of some type. */
2685#define IS_FAKE_BASE_TYPE(NODE) \
2686 (RECORD_OR_UNION_TYPE_P (NODE) \
2687 && TYPE_CONTEXT (NODE) && CLASS_TYPE_P (TYPE_CONTEXT (NODE)) \
2688 && CLASSTYPE_AS_BASE (TYPE_CONTEXT (NODE)) == (NODE))
2689
2690/* These are the size and alignment of the type without its virtual
2691 base classes, for when we use this type as a base itself. */
2692#define CLASSTYPE_SIZE(NODE) TYPE_SIZE (CLASSTYPE_AS_BASE (NODE))
2693#define CLASSTYPE_SIZE_UNIT(NODE) TYPE_SIZE_UNIT (CLASSTYPE_AS_BASE (NODE))
2694#define CLASSTYPE_ALIGN(NODE) TYPE_ALIGN (CLASSTYPE_AS_BASE (NODE))
2695#define CLASSTYPE_USER_ALIGN(NODE) TYPE_USER_ALIGN (CLASSTYPE_AS_BASE (NODE))
2696
2697/* The alignment of NODE, without its virtual bases, in bytes. */
2698#define CLASSTYPE_ALIGN_UNIT(NODE) \
2699 (CLASSTYPE_ALIGN (NODE) / BITS_PER_UNIT)
2700
2701/* A vec<tree> of virtual functions which cannot be inherited by
2702 derived classes. When deriving from this type, the derived
2703 class must provide its own definition for each of these functions. */
2704#define CLASSTYPE_PURE_VIRTUALS(NODE) \
2705 (LANG_TYPE_CLASS_CHECK (NODE)->pure_virtuals)
2706
2707/* Nonzero means that this type is an abstract class type. */
2708#define ABSTRACT_CLASS_TYPE_P(NODE) \
2709 (CLASS_TYPE_P (NODE) && CLASSTYPE_PURE_VIRTUALS(NODE))
2710
2711/* Nonzero means that this type has an X() constructor. */
2712#define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) \
2713 (LANG_TYPE_CLASS_CHECK (NODE)->has_default_ctor)
2714
2715/* Nonzero means that this type contains a mutable member. */
2716#define CLASSTYPE_HAS_MUTABLE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_mutable)
2717#define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE))
2718
2719/* Nonzero means that this class type is not POD for the purpose of layout
2720 (as defined in the ABI). This is different from the language's POD. */
2721#define CLASSTYPE_NON_LAYOUT_POD_P(NODE) \
2722 (LANG_TYPE_CLASS_CHECK (NODE)->non_pod_class)
2723
2724/* Nonzero means that this class type is a non-standard-layout class. */
2725#define CLASSTYPE_NON_STD_LAYOUT(NODE) \
2726 (LANG_TYPE_CLASS_CHECK (NODE)->non_std_layout)
2727
2728/* Nonzero means that this class type does have unique object
2729 representations. */
2730#define CLASSTYPE_UNIQUE_OBJ_REPRESENTATIONS(NODE) \
2731 (LANG_TYPE_CLASS_CHECK (NODE)->unique_obj_representations)
2732
2733/* Nonzero means that this class type has
2734 CLASSTYPE_UNIQUE_OBJ_REPRESENTATIONS computed. */
2735#define CLASSTYPE_UNIQUE_OBJ_REPRESENTATIONS_SET(NODE) \
2736 (LANG_TYPE_CLASS_CHECK (NODE)->unique_obj_representations_set)
2737
2738/* Nonzero means that this class contains pod types whose default
2739 initialization is not a zero initialization (namely, pointers to
2740 data members). */
2741#define CLASSTYPE_NON_ZERO_INIT_P(NODE) \
2742 (LANG_TYPE_CLASS_CHECK (NODE)->non_zero_init)
2743
2744/* Nonzero if this class is "empty" in the sense of the C++ ABI. */
2745#define CLASSTYPE_EMPTY_P(NODE) \
2746 (LANG_TYPE_CLASS_CHECK (NODE)->empty_p)
2747
2748/* Nonzero if this class is "nearly empty", i.e., contains only a
2749 virtual function table pointer. */
2750#define CLASSTYPE_NEARLY_EMPTY_P(NODE) \
2751 (LANG_TYPE_CLASS_CHECK (NODE)->nearly_empty_p)
2752
2753/* Nonzero if this class contains an empty subobject. */
2754#define CLASSTYPE_CONTAINS_EMPTY_CLASS_P(NODE) \
2755 (LANG_TYPE_CLASS_CHECK (NODE)->contains_empty_class_p)
2756
2757/* A list of class types of which this type is a friend. The
2758 TREE_VALUE is normally a TYPE, but will be a TEMPLATE_DECL in the
2759 case of a template friend. */
2760#define CLASSTYPE_FRIEND_CLASSES(NODE) \
2761 (LANG_TYPE_CLASS_CHECK (NODE)->friend_classes)
2762
2763/* A list of the classes which grant friendship to this class. */
2764#define CLASSTYPE_BEFRIENDING_CLASSES(NODE) \
2765 (LANG_TYPE_CLASS_CHECK (NODE)->befriending_classes)
2766
2767/* The associated LAMBDA_EXPR that made this class. */
2768#define CLASSTYPE_LAMBDA_EXPR(NODE) \
2769 (LANG_TYPE_CLASS_CHECK (NODE)->lambda_expr)
2770/* The extra mangling scope for this closure type. */
2771#define LAMBDA_TYPE_EXTRA_SCOPE(NODE) \
2772 (LAMBDA_EXPR_EXTRA_SCOPE (CLASSTYPE_LAMBDA_EXPR (NODE)))
2773
2774/* Say whether this node was declared as a "class" or a "struct". */
2775#define CLASSTYPE_DECLARED_CLASS(NODE) \
2776 (LANG_TYPE_CLASS_CHECK (NODE)->declared_class)
2777
2778/* Nonzero if this class has const members
2779 which have no specified initialization. */
2780#define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE) \
2781 (TYPE_LANG_SPECIFIC (NODE) \
2782 ? LANG_TYPE_CLASS_CHECK (NODE)->const_needs_init : 0)
2783#define SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE, VALUE) \
2784 (LANG_TYPE_CLASS_CHECK (NODE)->const_needs_init = (VALUE))
2785
2786/* Nonzero if this class has ref members
2787 which have no specified initialization. */
2788#define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) \
2789 (TYPE_LANG_SPECIFIC (NODE) \
2790 ? LANG_TYPE_CLASS_CHECK (NODE)->ref_needs_init : 0)
2791#define SET_CLASSTYPE_REF_FIELDS_NEED_INIT(NODE, VALUE) \
2792 (LANG_TYPE_CLASS_CHECK (NODE)->ref_needs_init = (VALUE))
2793
2794/* Nonzero if this class is included from a header file which employs
2795 `#pragma interface', and it is not included in its implementation file. */
2796#define CLASSTYPE_INTERFACE_ONLY(NODE) \
2797 (LANG_TYPE_CLASS_CHECK (NODE)->interface_only)
2798
2799/* True if we have already determined whether or not vtables, VTTs,
2800 typeinfo, and other similar per-class data should be emitted in
2801 this translation unit. This flag does not indicate whether or not
2802 these items should be emitted; it only indicates that we know one
2803 way or the other. */
2804#define CLASSTYPE_INTERFACE_KNOWN(NODE) \
2805 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown == 0)
2806/* The opposite of CLASSTYPE_INTERFACE_KNOWN. */
2807#define CLASSTYPE_INTERFACE_UNKNOWN(NODE) \
2808 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown)
2809
2810#define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) \
2811 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = !!(X))
2812#define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) \
2813 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 1)
2814#define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) \
2815 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 0)
2816
2817/* Nonzero if a _DECL node requires us to output debug info for this class. */
2818#define CLASSTYPE_DEBUG_REQUESTED(NODE) \
2819 (LANG_TYPE_CLASS_CHECK (NODE)->debug_requested)
2820
2821/* True if we saw errors while instantiating this class. */
2822#define CLASSTYPE_ERRONEOUS(NODE) \
2823 (LANG_TYPE_CLASS_CHECK (NODE)->erroneous)
2824
2825/* True if this class is non-layout-POD only because it was not an aggregate
2826 before C++14. If we run out of bits in lang_type, this could be replaced
2827 with a hash_set only filled in when abi_version_crosses (17). */
2828#define CLASSTYPE_NON_POD_AGGREGATE(NODE) \
2829 (LANG_TYPE_CLASS_CHECK (NODE)->non_pod_aggregate)
2830
2831/* True if this class is layout-POD though it's not an aggregate in C++20 and
2832 above (c++/120012). This could also be a hash_set. */
2833#define CLASSTYPE_NON_AGGREGATE_POD(NODE) \
2834 (LANG_TYPE_CLASS_CHECK (NODE)->non_aggregate_pod)
2835
2836/* Additional macros for inheritance information. */
2837
2838/* Nonzero means that this class is on a path leading to a new vtable. */
2839#define BINFO_VTABLE_PATH_MARKED(NODE) BINFO_FLAG_1 (NODE)
2840
2841/* Nonzero means B (a BINFO) has its own vtable. Any copies will not
2842 have this flag set. */
2843#define BINFO_NEW_VTABLE_MARKED(B) (BINFO_FLAG_2 (B))
2844
2845/* Compare a BINFO_TYPE with another type for equality. For a binfo,
2846 this is functionally equivalent to using same_type_p, but
2847 measurably faster. At least one of the arguments must be a
2848 BINFO_TYPE. The other can be a BINFO_TYPE or a regular type. If
2849 BINFO_TYPE(T) ever stops being the main variant of the class the
2850 binfo is for, this macro must change. */
2851#define SAME_BINFO_TYPE_P(A, B) ((A) == (B))
2852
2853/* Any subobject that needs a new vtable must have a vptr and must not
2854 be a non-virtual primary base (since it would then use the vtable from a
2855 derived class and never become non-primary.) */
2856#define SET_BINFO_NEW_VTABLE_MARKED(B) \
2857 (BINFO_NEW_VTABLE_MARKED (B) = 1, \
2858 gcc_assert (!BINFO_PRIMARY_P (B) || BINFO_VIRTUAL_P (B)), \
2859 gcc_assert (TYPE_VFIELD (BINFO_TYPE (B))))
2860
2861/* Nonzero if this binfo is for a dependent base - one that should not
2862 be searched. */
2863#define BINFO_DEPENDENT_BASE_P(NODE) BINFO_FLAG_3 (NODE)
2864
2865/* Nonzero if this binfo has lost its primary base binfo (because that
2866 is a nearly-empty virtual base that has been taken by some other
2867 base in the complete hierarchy. */
2868#define BINFO_LOST_PRIMARY_P(NODE) BINFO_FLAG_4 (NODE)
2869
2870/* Nonzero if this BINFO is a primary base class. */
2871#define BINFO_PRIMARY_P(NODE) BINFO_FLAG_5(NODE)
2872
2873/* A vec<tree_pair_s> of the vcall indices associated with the class
2874 NODE. The PURPOSE of each element is a FUNCTION_DECL for a virtual
2875 function. The VALUE is the index into the virtual table where the
2876 vcall offset for that function is stored, when NODE is a virtual
2877 base. */
2878#define CLASSTYPE_VCALL_INDICES(NODE) \
2879 (LANG_TYPE_CLASS_CHECK (NODE)->vcall_indices)
2880
2881/* The various vtables for the class NODE. The primary vtable will be
2882 first, followed by the construction vtables and VTT, if any. */
2883#define CLASSTYPE_VTABLES(NODE) \
2884 (LANG_TYPE_CLASS_CHECK (NODE)->vtables)
2885
2886/* The std::type_info variable representing this class, or NULL if no
2887 such variable has been created. This field is only set for the
2888 TYPE_MAIN_VARIANT of the class. */
2889#define CLASSTYPE_TYPEINFO_VAR(NODE) \
2890 (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var)
2891
2892/* Accessor macros for the BINFO_VIRTUALS list. */
2893
2894/* The number of bytes by which to adjust the `this' pointer when
2895 calling this virtual function. Subtract this value from the this
2896 pointer. Always non-NULL, might be constant zero though. */
2897#define BV_DELTA(NODE) (TREE_PURPOSE (NODE))
2898
2899/* If non-NULL, the vtable index at which to find the vcall offset
2900 when calling this virtual function. Add the value at that vtable
2901 index to the this pointer. */
2902#define BV_VCALL_INDEX(NODE) (TREE_TYPE (NODE))
2903
2904/* The function to call. */
2905#define BV_FN(NODE) (TREE_VALUE (NODE))
2906
2907/* Whether or not this entry is for a lost primary virtual base. */
2908#define BV_LOST_PRIMARY(NODE) (TREE_LANG_FLAG_0 (NODE))
2909
2910/* For FUNCTION_TYPE or METHOD_TYPE, a list of the exceptions that
2911 this type can raise. Each TREE_VALUE is a _TYPE. The TREE_VALUE
2912 will be NULL_TREE to indicate a throw specification of `()', or
2913 no exceptions allowed. For a noexcept specification, TREE_VALUE
2914 is NULL_TREE and TREE_PURPOSE is the constant-expression. For
2915 a deferred noexcept-specification, TREE_PURPOSE is a DEFERRED_NOEXCEPT
2916 (for templates) or an OVERLOAD list of functions (for implicitly
2917 declared functions). */
2918#define TYPE_RAISES_EXCEPTIONS(NODE) \
2919 TYPE_LANG_SLOT_1 (FUNC_OR_METHOD_CHECK (NODE))
2920
2921/* For FUNCTION_TYPE or METHOD_TYPE, return 1 iff it is declared `throw()'
2922 or noexcept(true). */
2923#define TYPE_NOTHROW_P(NODE) nothrow_spec_p (TYPE_RAISES_EXCEPTIONS (NODE))
2924
2925/* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept. This is the
2926 case for things declared noexcept(true) and, with -fnothrow-opt, for
2927 throw() functions. */
2928#define TYPE_NOEXCEPT_P(NODE) type_noexcept_p (NODE)
2929
2930/* The binding level associated with the namespace. */
2931#define NAMESPACE_LEVEL(NODE) \
2932 (LANG_DECL_NS_CHECK (NODE)->level)
2933
2934/* Discriminator values for lang_decl. */
2935
2936enum lang_decl_selector
2937{
2938 lds_min,
2939 lds_fn,
2940 lds_ns,
2941 lds_parm,
2942 lds_decomp
2943};
2944
2945/* Flags shared by all forms of DECL_LANG_SPECIFIC.
2946
2947 Some of the flags live here only to make lang_decl_min/fn smaller. Do
2948 not make this struct larger than 32 bits. */
2949
2950struct GTY(()) lang_decl_base {
2951 ENUM_BITFIELD(lang_decl_selector) selector : 3;
2952 ENUM_BITFIELD(languages) language : 1;
2953 unsigned use_template : 2;
2954 unsigned not_really_extern : 1; /* var or fn */
2955 unsigned initialized_in_class : 1; /* var or fn */
2956
2957 unsigned threadprivate_or_deleted_p : 1; /* var or fn */
2958 /* anticipated_p is no longer used for anticipated_decls (fn, type
2959 or template). It is used as DECL_OMP_PRIVATIZED_MEMBER in
2960 var. */
2961 unsigned anticipated_p : 1;
2962 unsigned friend_or_tls : 1; /* var, fn, type or template */
2963 unsigned unknown_bound_p : 1; /* var */
2964 unsigned odr_used : 1; /* var or fn */
2965 unsigned concept_p : 1; /* applies to vars and functions */
2966 unsigned var_declared_inline_p : 1; /* var */
2967 unsigned dependent_init_p : 1; /* var */
2968
2969 /* The following four apply to VAR, FUNCTION, TYPE, CONCEPT, & NAMESPACE
2970 decls. */
2971 unsigned module_purview_p : 1; /* in named-module purview */
2972 unsigned module_attach_p : 1; /* attached to named module */
2973 unsigned module_import_p : 1; /* from an import */
2974 unsigned module_entity_p : 1; /* is in the entitity ary & hash */
2975
2976 unsigned module_keyed_decls_p : 1; /* has keys, applies to all decls */
2977
2978 /* VAR_DECL being used to represent an OpenMP declared mapper. */
2979 unsigned omp_declare_mapper_p : 1;
2980
2981 /* 10 spare bits. */
2982};
2983
2984/* True for DECL codes which have template info and access. */
2985#define LANG_DECL_HAS_MIN(NODE) \
2986 (VAR_OR_FUNCTION_DECL_P (NODE) \
2987 || TREE_CODE (NODE) == FIELD_DECL \
2988 || TREE_CODE (NODE) == CONST_DECL \
2989 || TREE_CODE (NODE) == TYPE_DECL \
2990 || TREE_CODE (NODE) == TEMPLATE_DECL \
2991 || TREE_CODE (NODE) == USING_DECL \
2992 || TREE_CODE (NODE) == CONCEPT_DECL)
2993
2994/* DECL_LANG_SPECIFIC for the above codes. */
2995
2996struct GTY(()) lang_decl_min {
2997 struct lang_decl_base base; /* 32-bits. */
2998
2999 /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is
3000 THUNK_ALIAS.
3001 In a FUNCTION_DECL for which DECL_THUNK_P does not hold,
3002 VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this is
3003 DECL_TEMPLATE_INFO. */
3004 tree template_info;
3005
3006 /* In a DECL_THUNK_P FUNCTION_DECL, this is THUNK_VIRTUAL_OFFSET.
3007 In a lambda-capture proxy VAR_DECL, this is DECL_CAPTURED_VARIABLE.
3008 In a function-scope TREE_STATIC VAR_DECL or IMPLICIT_TYPEDEF_P TYPE_DECL,
3009 this is DECL_DISCRIMINATOR.
3010 In a DECL_LOCAL_DECL_P decl, this is the namespace decl it aliases.
3011 Otherwise, in a class-scope DECL, this is DECL_ACCESS. */
3012 tree access;
3013};
3014
3015/* Additional DECL_LANG_SPECIFIC information for functions. */
3016
3017struct GTY(()) lang_decl_fn {
3018 struct lang_decl_min min;
3019
3020 /* In a overloaded operator, this is the compressed operator code. */
3021 unsigned ovl_op_code : 6;
3022 unsigned global_ctor_p : 1;
3023 unsigned global_dtor_p : 1;
3024
3025 unsigned static_function : 1;
3026 unsigned pure_virtual : 1;
3027 unsigned defaulted_p : 1;
3028 unsigned has_in_charge_parm_p : 1;
3029 unsigned has_vtt_parm_p : 1;
3030 unsigned pending_inline_p : 1;
3031 unsigned nonconverting : 1;
3032 unsigned thunk_p : 1;
3033
3034 unsigned this_thunk_p : 1;
3035 unsigned omp_declare_reduction_p : 1;
3036 unsigned has_dependent_explicit_spec_p : 1;
3037 unsigned immediate_fn_p : 1;
3038 unsigned maybe_deleted : 1;
3039 unsigned coroutine_p : 1;
3040 unsigned implicit_constexpr : 1;
3041 unsigned escalated_p : 1;
3042 unsigned xobj_func : 1;
3043
3044 unsigned spare : 7;
3045
3046 /* 32-bits padding on 64-bit host. */
3047
3048 /* For a non-thunk function decl, this is a tree list of
3049 friendly classes. For a thunk function decl, it is the
3050 thunked to function decl. */
3051 tree befriending_classes;
3052
3053 /* For a virtual FUNCTION_DECL for which
3054 DECL_THIS_THUNK_P does not hold, this is DECL_THUNKS. Both
3055 this pointer and result pointer adjusting thunks are
3056 chained here. This pointer thunks to return pointer thunks
3057 will be chained on the return pointer thunk.
3058 For a DECL_CONSTRUCTOR_P or deduction_guide_p FUNCTION_DECL,
3059 this is the base from whence we inherit.
3060 Otherwise, it is the class in which a (namespace-scope) friend
3061 is defined (if any). */
3062 tree context;
3063
3064 union lang_decl_u5
3065 {
3066 /* In a non-thunk FUNCTION_DECL, this is DECL_CLONED_FUNCTION. */
3067 tree GTY ((tag ("0"))) cloned_function;
3068
3069 /* In a FUNCTION_DECL for which THUNK_P holds this is the
3070 THUNK_FIXED_OFFSET. */
3071 HOST_WIDE_INT GTY ((tag ("1"))) fixed_offset;
3072 } GTY ((desc ("%1.thunk_p"))) u5;
3073
3074 union lang_decl_u3
3075 {
3076 struct cp_token_cache * GTY ((tag ("1"))) pending_inline_info;
3077 tree GTY ((tag ("0"))) saved_auto_return_type;
3078 } GTY ((desc ("%1.pending_inline_p"))) u;
3079
3080};
3081
3082/* DECL_LANG_SPECIFIC for namespaces. */
3083
3084struct GTY(()) lang_decl_ns {
3085 struct lang_decl_base base; /* 32 bits. */
3086 cp_binding_level *level;
3087
3088 /* Inline children. Needs to be va_gc, because of PCH. */
3089 vec<tree, va_gc> *inlinees;
3090
3091 /* Hash table of bound decls. It'd be nice to have this inline, but
3092 as the hash_map has a dtor, we can't then put this struct into a
3093 union (until moving to c++11). */
3094 hash_table<named_decl_hash> *bindings;
3095};
3096
3097/* DECL_LANG_SPECIFIC for parameters. */
3098
3099struct GTY(()) lang_decl_parm {
3100 struct lang_decl_base base; /* 32 bits. */
3101 int level;
3102 int index;
3103};
3104
3105/* Additional DECL_LANG_SPECIFIC information for structured bindings. */
3106
3107struct GTY(()) lang_decl_decomp {
3108 struct lang_decl_min min;
3109 /* The artificial underlying "e" variable of the structured binding
3110 variable. */
3111 tree base;
3112};
3113
3114/* DECL_LANG_SPECIFIC for all types. It would be nice to just make this a
3115 union rather than a struct containing a union as its only field, but
3116 tree.h declares it as a struct. */
3117
3118struct GTY(()) lang_decl {
3119 union GTY((desc ("%h.base.selector"))) lang_decl_u {
3120 /* Nothing of only the base type exists. */
3121 struct lang_decl_base GTY ((default)) base;
3122 struct lang_decl_min GTY((tag ("lds_min"))) min;
3123 struct lang_decl_fn GTY ((tag ("lds_fn"))) fn;
3124 struct lang_decl_ns GTY((tag ("lds_ns"))) ns;
3125 struct lang_decl_parm GTY((tag ("lds_parm"))) parm;
3126 struct lang_decl_decomp GTY((tag ("lds_decomp"))) decomp;
3127 } u;
3128};
3129
3130/* Looks through a template (if present) to find what it declares. */
3131#define STRIP_TEMPLATE(NODE) \
3132 (TREE_CODE (NODE) == TEMPLATE_DECL ? DECL_TEMPLATE_RESULT (NODE) : NODE)
3133
3134#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
3135
3136#define LANG_DECL_MIN_CHECK(NODE) __extension__ \
3137({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
3138 if (!LANG_DECL_HAS_MIN (NODE)) \
3139 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
3140 &lt->u.min; })
3141
3142/* We want to be able to check DECL_CONSTRUCTOR_P and such on a function
3143 template, not just on a FUNCTION_DECL. So when looking for things in
3144 lang_decl_fn, look down through a TEMPLATE_DECL into its result. */
3145#define LANG_DECL_FN_CHECK(NODE) __extension__ \
3146({ struct lang_decl *lt = DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE)); \
3147 if (!DECL_DECLARES_FUNCTION_P (NODE) \
3148 || lt->u.base.selector != lds_fn) \
3149 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
3150 &lt->u.fn; })
3151
3152#define LANG_DECL_NS_CHECK(NODE) __extension__ \
3153({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
3154 if (TREE_CODE (NODE) != NAMESPACE_DECL \
3155 || lt->u.base.selector != lds_ns) \
3156 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
3157 &lt->u.ns; })
3158
3159#define LANG_DECL_PARM_CHECK(NODE) __extension__ \
3160({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
3161 if (TREE_CODE (NODE) != PARM_DECL \
3162 || lt->u.base.selector != lds_parm) \
3163 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
3164 &lt->u.parm; })
3165
3166#define LANG_DECL_DECOMP_CHECK(NODE) __extension__ \
3167({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
3168 if (!VAR_P (NODE) \
3169 || lt->u.base.selector != lds_decomp) \
3170 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
3171 &lt->u.decomp; })
3172
3173#else
3174
3175#define LANG_DECL_MIN_CHECK(NODE) \
3176 (&DECL_LANG_SPECIFIC (NODE)->u.min)
3177
3178#define LANG_DECL_FN_CHECK(NODE) \
3179 (&DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE))->u.fn)
3180
3181#define LANG_DECL_NS_CHECK(NODE) \
3182 (&DECL_LANG_SPECIFIC (NODE)->u.ns)
3183
3184#define LANG_DECL_PARM_CHECK(NODE) \
3185 (&DECL_LANG_SPECIFIC (NODE)->u.parm)
3186
3187#define LANG_DECL_DECOMP_CHECK(NODE) \
3188 (&DECL_LANG_SPECIFIC (NODE)->u.decomp)
3189
3190#endif /* ENABLE_TREE_CHECKING */
3191
3192/* For a FUNCTION_DECL or a VAR_DECL, the language linkage for the
3193 declaration. Some entities (like a member function in a local
3194 class, or a local variable) do not have linkage at all, and this
3195 macro should not be used in those cases.
3196
3197 Implementation note: A FUNCTION_DECL without DECL_LANG_SPECIFIC was
3198 created by language-independent code, and has C linkage. Most
3199 VAR_DECLs have C++ linkage, and do not have DECL_LANG_SPECIFIC, but
3200 we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage. */
3201#define DECL_LANGUAGE(NODE) \
3202 (DECL_LANG_SPECIFIC (NODE) \
3203 ? DECL_LANG_SPECIFIC (NODE)->u.base.language \
3204 : (TREE_CODE (NODE) == FUNCTION_DECL \
3205 ? lang_c : lang_cplusplus))
3206
3207/* Set the language linkage for NODE to LANGUAGE. */
3208#define SET_DECL_LANGUAGE(NODE, LANGUAGE) \
3209 (DECL_LANG_SPECIFIC (NODE)->u.base.language = (LANGUAGE))
3210
3211/* For FUNCTION_DECLs and TEMPLATE_DECLs: nonzero means that this function
3212 is a constructor. */
3213#define DECL_CONSTRUCTOR_P(NODE) \
3214 DECL_CXX_CONSTRUCTOR_P (STRIP_TEMPLATE (NODE))
3215
3216/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete
3217 object. */
3218#define DECL_COMPLETE_CONSTRUCTOR_P(NODE) \
3219 (DECL_NAME (NODE) == complete_ctor_identifier)
3220
3221/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a base
3222 object. */
3223#define DECL_BASE_CONSTRUCTOR_P(NODE) \
3224 (DECL_NAME (NODE) == base_ctor_identifier)
3225
3226/* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the
3227 specialized in-charge constructor or the specialized not-in-charge
3228 constructor. */
3229#define DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P(NODE) \
3230 (DECL_NAME (NODE) == ctor_identifier)
3231
3232/* Nonzero if NODE (a FUNCTION_DECL) is a copy constructor. */
3233#define DECL_COPY_CONSTRUCTOR_P(NODE) \
3234 (DECL_CONSTRUCTOR_P (NODE) && copy_fn_p (NODE) > 0)
3235
3236/* Nonzero if NODE (a FUNCTION_DECL) is a move constructor. */
3237#define DECL_MOVE_CONSTRUCTOR_P(NODE) \
3238 (DECL_CONSTRUCTOR_P (NODE) && move_fn_p (NODE))
3239
3240/* Nonzero if NODE (a FUNCTION_DECL or TEMPLATE_DECL)
3241 is a destructor. */
3242#define DECL_DESTRUCTOR_P(NODE) \
3243 DECL_CXX_DESTRUCTOR_P (STRIP_TEMPLATE (NODE))
3244
3245/* Nonzero if NODE (a FUNCTION_DECL) is a destructor, but not the
3246 specialized in-charge constructor, in-charge deleting constructor,
3247 or the base destructor. */
3248#define DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P(NODE) \
3249 (DECL_NAME (NODE) == dtor_identifier)
3250
3251/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete
3252 object. */
3253#define DECL_COMPLETE_DESTRUCTOR_P(NODE) \
3254 (DECL_NAME (NODE) == complete_dtor_identifier)
3255
3256/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a base
3257 object. */
3258#define DECL_BASE_DESTRUCTOR_P(NODE) \
3259 (DECL_NAME (NODE) == base_dtor_identifier)
3260
3261/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete
3262 object that deletes the object after it has been destroyed. */
3263#define DECL_DELETING_DESTRUCTOR_P(NODE) \
3264 (DECL_NAME (NODE) == deleting_dtor_identifier)
3265
3266/* Nonzero if either DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P or
3267 DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P is true of NODE. */
3268#define DECL_MAYBE_IN_CHARGE_CDTOR_P(NODE) \
3269 (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (NODE) \
3270 || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (NODE))
3271
3272/* Nonzero if NODE (a _DECL) is a cloned constructor or
3273 destructor. */
3274#define DECL_CLONED_FUNCTION_P(NODE) \
3275 (DECL_NAME (NODE) \
3276 && IDENTIFIER_CDTOR_P (DECL_NAME (NODE)) \
3277 && !DECL_MAYBE_IN_CHARGE_CDTOR_P (NODE))
3278
3279/* If DECL_CLONED_FUNCTION_P holds, this is the function that was
3280 cloned. */
3281#define DECL_CLONED_FUNCTION(NODE) \
3282 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE))->u.fn.u5.cloned_function)
3283
3284/* Perform an action for each clone of FN, if FN is a function with
3285 clones. This macro should be used like:
3286
3287 FOR_EACH_CLONE (clone, fn)
3288 { ... }
3289
3290 */
3291#define FOR_EACH_CLONE(CLONE, FN) \
3292 if (!(TREE_CODE (FN) == FUNCTION_DECL \
3293 && DECL_MAYBE_IN_CHARGE_CDTOR_P (FN))) \
3294 ; \
3295 else \
3296 for (CLONE = DECL_CHAIN (FN); \
3297 CLONE && DECL_CLONED_FUNCTION_P (CLONE); \
3298 CLONE = DECL_CHAIN (CLONE))
3299
3300/* Nonzero if NODE has DECL_DISCRIMINATOR and not DECL_ACCESS. */
3301#define DECL_DISCRIMINATOR_P(NODE) \
3302 (((VAR_P (NODE) && TREE_STATIC (NODE)) \
3303 || DECL_IMPLICIT_TYPEDEF_P (NODE)) \
3304 && DECL_FUNCTION_SCOPE_P (NODE))
3305
3306/* Discriminator for name mangling. */
3307#define DECL_DISCRIMINATOR(NODE) (LANG_DECL_MIN_CHECK (NODE)->access)
3308
3309/* The index of a user-declared parameter in its function, starting at 1.
3310 All artificial parameters will have index 0. */
3311#define DECL_PARM_INDEX(NODE) \
3312 (LANG_DECL_PARM_CHECK (NODE)->index)
3313
3314/* The level of a user-declared parameter in its function, starting at 1.
3315 A parameter of the function will have level 1; a parameter of the first
3316 nested function declarator (i.e. t in void f (void (*p)(T t))) will have
3317 level 2. */
3318#define DECL_PARM_LEVEL(NODE) \
3319 (LANG_DECL_PARM_CHECK (NODE)->level)
3320
3321/* Nonzero if the VTT parm has been added to NODE. */
3322#define DECL_HAS_VTT_PARM_P(NODE) \
3323 (LANG_DECL_FN_CHECK (NODE)->has_vtt_parm_p)
3324
3325/* Nonzero if NODE is a user-defined conversion operator. */
3326#define DECL_CONV_FN_P(NODE) IDENTIFIER_CONV_OP_P (DECL_NAME (NODE))
3327
3328/* The type to which conversion operator FN converts to. */
3329#define DECL_CONV_FN_TYPE(FN) \
3330 TREE_TYPE ((gcc_checking_assert (DECL_CONV_FN_P (FN)), DECL_NAME (FN)))
3331
3332/* Nonzero if NODE, a templated variable, was declared as an
3333 array of unknown bound. */
3334#define VAR_HAD_UNKNOWN_BOUND(NODE) \
3335 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE)) \
3336 ? DECL_LANG_SPECIFIC (NODE)->u.base.unknown_bound_p \
3337 : false)
3338#define SET_VAR_HAD_UNKNOWN_BOUND(NODE) \
3339 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.unknown_bound_p = true)
3340
3341/* True iff decl NODE is for an overloaded operator. */
3342#define DECL_OVERLOADED_OPERATOR_P(NODE) \
3343 IDENTIFIER_ANY_OP_P (DECL_NAME (NODE))
3344
3345/* Nonzero if NODE is an assignment operator (including += and such). */
3346#define DECL_ASSIGNMENT_OPERATOR_P(NODE) \
3347 IDENTIFIER_ASSIGN_OP_P (DECL_NAME (NODE))
3348
3349/* NODE is a function_decl for an overloaded operator. Return its
3350 compressed (raw) operator code. Note that this is not a TREE_CODE. */
3351#define DECL_OVERLOADED_OPERATOR_CODE_RAW(NODE) \
3352 (LANG_DECL_FN_CHECK (NODE)->ovl_op_code)
3353
3354/* DECL is an overloaded operator. Test whether it is for TREE_CODE
3355 (a literal constant). */
3356#define DECL_OVERLOADED_OPERATOR_IS(DECL, CODE) \
3357 (DECL_OVERLOADED_OPERATOR_CODE_RAW (DECL) == OVL_OP_##CODE)
3358
3359/* For FUNCTION_DECLs: nonzero means that this function is a
3360 constructor or a destructor with an extra in-charge parameter to
3361 control whether or not virtual bases are constructed. */
3362#define DECL_HAS_IN_CHARGE_PARM_P(NODE) \
3363 (LANG_DECL_FN_CHECK (NODE)->has_in_charge_parm_p)
3364
3365/* Nonzero if DECL is a declaration of __builtin_constant_p. */
3366#define DECL_IS_BUILTIN_CONSTANT_P(NODE) \
3367 (TREE_CODE (NODE) == FUNCTION_DECL \
3368 && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL \
3369 && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P)
3370
3371/* Nonzero for _DECL means that this decl appears in (or will appear
3372 in) as a member in a RECORD_TYPE or UNION_TYPE node. It is also for
3373 detecting circularity in case members are multiply defined. In the
3374 case of a VAR_DECL, it means that no definition has been seen, even
3375 if an initializer has been. */
3376#define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3 (NODE))
3377
3378/* Nonzero for a VAR_DECL means that the variable's initialization (if
3379 any) has been processed. (In general, DECL_INITIALIZED_P is
3380 !DECL_EXTERNAL, but static data members may be initialized even if
3381 not defined.) */
3382#define DECL_INITIALIZED_P(NODE) \
3383 (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE)))
3384
3385/* Nonzero for a VAR_DECL iff an explicit initializer was provided
3386 or a non-trivial constructor is called. */
3387#define DECL_NONTRIVIALLY_INITIALIZED_P(NODE) \
3388 (TREE_LANG_FLAG_6 (VAR_DECL_CHECK (NODE)))
3389
3390/* Nonzero for a VAR_DECL that was initialized with a
3391 constant-expression. */
3392#define DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P(NODE) \
3393 (TREE_LANG_FLAG_2 (VAR_DECL_CHECK (NODE)))
3394
3395/* Nonzero if the DECL was initialized in the class definition itself,
3396 rather than outside the class. This is used for both static member
3397 VAR_DECLS, and FUNCTION_DECLS that are defined in the class. */
3398#define DECL_INITIALIZED_IN_CLASS_P(DECL) \
3399 (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \
3400 ->u.base.initialized_in_class)
3401
3402/* Nonzero if the DECL is used in the sense of 3.2 [basic.def.odr].
3403 Only available for decls with DECL_LANG_SPECIFIC. */
3404#define DECL_ODR_USED(DECL) \
3405 (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \
3406 ->u.base.odr_used)
3407
3408/* Nonzero for FUNCTION_DECL means that this is a friend that is
3409 either not pushed into a namespace/looked up in a class (because it
3410 is a dependent type, in an uninstantiated template), or it has
3411 /only/ been subject to hidden friend injection from one or more
3412 befriending classes. Once another decl matches, the flag is
3413 cleared. There are requirements on its default parms. */
3414#define DECL_UNIQUE_FRIEND_P(NODE) \
3415 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE)) \
3416 ->u.base.friend_or_tls)
3417
3418/* True of a TEMPLATE_DECL that is a template class friend. Such
3419 decls are not pushed until instantiated (as they may depend on
3420 parameters of the befriending class). DECL_CHAIN is the
3421 befriending class. */
3422#define DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P(NODE) \
3423 (DECL_LANG_FLAG_4 (TEMPLATE_DECL_CHECK (NODE)))
3424
3425/* Nonzero if the thread-local variable was declared with __thread as
3426 opposed to thread_local. */
3427#define DECL_GNU_TLS_P(NODE) \
3428 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE)) \
3429 && DECL_LANG_SPECIFIC (NODE)->u.base.friend_or_tls)
3430#define SET_DECL_GNU_TLS_P(NODE) \
3431 (retrofit_lang_decl (VAR_DECL_CHECK (NODE)), \
3432 DECL_LANG_SPECIFIC (NODE)->u.base.friend_or_tls = true)
3433
3434/* A TREE_LIST of the types which have befriended this FUNCTION_DECL. */
3435#define DECL_BEFRIENDING_CLASSES(NODE) \
3436 (LANG_DECL_FN_CHECK (NODE)->befriending_classes)
3437
3438/* Nonzero for FUNCTION_DECL means that this decl is a static
3439 member function. */
3440#define DECL_STATIC_FUNCTION_P(NODE) \
3441 (LANG_DECL_FN_CHECK (NODE)->static_function)
3442
3443/* Nonzero for FUNCTION_DECL means that this decl is a non-static member
3444 function. C++23 explicit object member functions are also considered
3445 non-static, but most former uses of this macro meant implicit object member
3446 function. Instead of this macro, use DECL_IOBJ_MEMBER_FUNCTION_P or
3447 DECL_OBJECT_MEMBER_FUNCTION_P. */
3448#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) did_you_mean_object_or_iobj
3449
3450/* Nonzero for FUNCTION_DECL means that this decl is an implicit object
3451 member function. */
3452#define DECL_IOBJ_MEMBER_FUNCTION_P(NODE) \
3453 (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)
3454
3455/* Simple member access, only valid for FUNCTION_DECL nodes. */
3456#define DECL_FUNCTION_XOBJ_FLAG(NODE) \
3457 (LANG_DECL_FN_CHECK (NODE)->xobj_func)
3458
3459/* Nonzero if NODE is an xobj member function,
3460 safely evaluates to false for all non FUNCTION_DECL nodes. */
3461#define DECL_XOBJ_MEMBER_FUNCTION_P(NODE) \
3462 (TREE_CODE (STRIP_TEMPLATE (NODE)) == FUNCTION_DECL \
3463 && DECL_FUNCTION_XOBJ_FLAG (NODE) == 1)
3464
3465/* Nonzero if NODE is a member function with an object argument,
3466 in other words, a non-static member function. */
3467#define DECL_OBJECT_MEMBER_FUNCTION_P(NODE) \
3468 (DECL_IOBJ_MEMBER_FUNCTION_P (NODE) || DECL_XOBJ_MEMBER_FUNCTION_P (NODE))
3469
3470/* Nonzero for FUNCTION_DECL means that this decl is a member function
3471 (static or non-static). */
3472#define DECL_FUNCTION_MEMBER_P(NODE) \
3473 (DECL_OBJECT_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE)) \
3474
3475/* Nonzero for FUNCTION_DECL means that this member function
3476 has `this' as const X *const. */
3477#define DECL_CONST_MEMFUNC_P(NODE) \
3478 (DECL_IOBJ_MEMBER_FUNCTION_P (NODE) \
3479 && CP_TYPE_CONST_P (TREE_TYPE (TREE_VALUE \
3480 (TYPE_ARG_TYPES (TREE_TYPE (NODE))))))
3481
3482/* Nonzero for FUNCTION_DECL means that this member function
3483 has `this' as volatile X *const. */
3484#define DECL_VOLATILE_MEMFUNC_P(NODE) \
3485 (DECL_IOBJ_MEMBER_FUNCTION_P (NODE) \
3486 && CP_TYPE_VOLATILE_P (TREE_TYPE (TREE_VALUE \
3487 (TYPE_ARG_TYPES (TREE_TYPE (NODE))))))
3488
3489/* Nonzero for a DECL means that this member is a non-static member. */
3490#define DECL_NONSTATIC_MEMBER_P(NODE) \
3491 (DECL_OBJECT_MEMBER_FUNCTION_P (NODE) \
3492 || TREE_CODE (NODE) == FIELD_DECL)
3493
3494/* Nonzero for a FIELD_DECL means that this member object type
3495 is mutable. */
3496#define DECL_MUTABLE_P(NODE) (DECL_LANG_FLAG_0 (FIELD_DECL_CHECK (NODE)))
3497
3498/* Nonzero for _DECL means that this constructor or conversion function is
3499 non-converting. */
3500#define DECL_NONCONVERTING_P(NODE) \
3501 (LANG_DECL_FN_CHECK (NODE)->nonconverting)
3502
3503/* Nonzero for FUNCTION_DECL means that this member function is a pure
3504 virtual function. */
3505#define DECL_PURE_VIRTUAL_P(NODE) \
3506 (LANG_DECL_FN_CHECK (NODE)->pure_virtual)
3507
3508/* Nonzero for FUNCTION_DECL means that this member function (either
3509 a constructor or a conversion function) has an explicit specifier
3510 with a value-dependent expression. */
3511#define DECL_HAS_DEPENDENT_EXPLICIT_SPEC_P(NODE) \
3512 (LANG_DECL_FN_CHECK (NODE)->has_dependent_explicit_spec_p)
3513
3514/* Nonzero for a defaulted FUNCTION_DECL for which we haven't decided yet if
3515 it's deleted; we will decide in synthesize_method. */
3516#define DECL_MAYBE_DELETED(NODE) \
3517 (LANG_DECL_FN_CHECK (NODE)->maybe_deleted)
3518
3519/* Nonzero for FUNCTION_DECL means that this function's body has been
3520 checked for immediate-escalating expressions and maybe promoted. It
3521 does *not* mean the function is consteval. It must not be set in
3522 a function that was marked consteval by the user, so that we can
3523 distinguish between explicitly consteval functions and promoted consteval
3524 functions. */
3525#define DECL_ESCALATION_CHECKED_P(NODE) (LANG_DECL_FN_CHECK (NODE)->escalated_p)
3526
3527/* True (in a FUNCTION_DECL) if NODE is a virtual function that is an
3528 invalid overrider for a function from a base class. Once we have
3529 complained about an invalid overrider we avoid complaining about it
3530 again. */
3531#define DECL_INVALID_OVERRIDER_P(NODE) \
3532 (DECL_LANG_FLAG_4 (NODE))
3533
3534/* True (in a FUNCTION_DECL) if NODE is a function declared with
3535 an override virt-specifier */
3536#define DECL_OVERRIDE_P(NODE) (TREE_LANG_FLAG_0 (NODE))
3537
3538/* The thunks associated with NODE, a FUNCTION_DECL. */
3539#define DECL_THUNKS(NODE) \
3540 (DECL_VIRTUAL_P (NODE) ? LANG_DECL_FN_CHECK (NODE)->context : NULL_TREE)
3541
3542/* Set DECL_THUNKS. */
3543#define SET_DECL_THUNKS(NODE,THUNKS) \
3544 (LANG_DECL_FN_CHECK (NODE)->context = (THUNKS))
3545
3546/* If NODE, a FUNCTION_DECL, is a C++11 inheriting constructor, then this
3547 is the constructor it inherits from. */
3548#define DECL_INHERITED_CTOR(NODE) \
3549 (DECL_DECLARES_FUNCTION_P (NODE) && DECL_CONSTRUCTOR_P (NODE) \
3550 ? LANG_DECL_FN_CHECK (NODE)->context : NULL_TREE)
3551
3552/* And this is the base that constructor comes from. */
3553#define DECL_INHERITED_CTOR_BASE(NODE) \
3554 (DECL_INHERITED_CTOR (NODE) \
3555 ? DECL_CONTEXT (flag_new_inheriting_ctors \
3556 ? strip_inheriting_ctors (NODE) \
3557 : DECL_INHERITED_CTOR (NODE)) \
3558 : NULL_TREE)
3559
3560/* Set the inherited base. */
3561#define SET_DECL_INHERITED_CTOR(NODE,INH) \
3562 (LANG_DECL_FN_CHECK (NODE)->context = (INH))
3563
3564/* Nonzero if NODE is a thunk, rather than an ordinary function. */
3565#define DECL_THUNK_P(NODE) \
3566 (TREE_CODE (NODE) == FUNCTION_DECL \
3567 && DECL_LANG_SPECIFIC (NODE) \
3568 && LANG_DECL_FN_CHECK (NODE)->thunk_p)
3569
3570/* Set DECL_THUNK_P for node. */
3571#define SET_DECL_THUNK_P(NODE, THIS_ADJUSTING) \
3572 (LANG_DECL_FN_CHECK (NODE)->thunk_p = 1, \
3573 LANG_DECL_FN_CHECK (NODE)->this_thunk_p = (THIS_ADJUSTING))
3574
3575/* Nonzero if NODE is a this pointer adjusting thunk. */
3576#define DECL_THIS_THUNK_P(NODE) \
3577 (DECL_THUNK_P (NODE) && LANG_DECL_FN_CHECK (NODE)->this_thunk_p)
3578
3579/* Nonzero if NODE is a result pointer adjusting thunk. */
3580#define DECL_RESULT_THUNK_P(NODE) \
3581 (DECL_THUNK_P (NODE) && !LANG_DECL_FN_CHECK (NODE)->this_thunk_p)
3582
3583/* Nonzero if NODE is a FUNCTION_DECL, but not a thunk. */
3584#define DECL_NON_THUNK_FUNCTION_P(NODE) \
3585 (TREE_CODE (NODE) == FUNCTION_DECL && !DECL_THUNK_P (NODE))
3586
3587/* Nonzero if NODE is `extern "C"'. */
3588#define DECL_EXTERN_C_P(NODE) \
3589 (DECL_LANGUAGE (NODE) == lang_c)
3590
3591/* Nonzero if NODE is an `extern "C"' function. */
3592#define DECL_EXTERN_C_FUNCTION_P(NODE) \
3593 (DECL_NON_THUNK_FUNCTION_P (NODE) && DECL_EXTERN_C_P (NODE))
3594
3595/* Non-zero if this variable is declared `constinit' specifier. */
3596#define DECL_DECLARED_CONSTINIT_P(NODE) \
3597 (DECL_LANG_FLAG_7 (VAR_DECL_CHECK (NODE)))
3598
3599/* True if DECL is declared 'constexpr'. */
3600#define DECL_DECLARED_CONSTEXPR_P(DECL) \
3601 DECL_LANG_FLAG_8 (VAR_OR_FUNCTION_DECL_CHECK (STRIP_TEMPLATE (DECL)))
3602
3603/* True if FNDECL is an immediate function. */
3604#define DECL_IMMEDIATE_FUNCTION_P(NODE) \
3605 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (STRIP_TEMPLATE (NODE))) \
3606 ? LANG_DECL_FN_CHECK (NODE)->immediate_fn_p \
3607 : false)
3608#define SET_DECL_IMMEDIATE_FUNCTION_P(NODE) \
3609 (retrofit_lang_decl (FUNCTION_DECL_CHECK (NODE)), \
3610 LANG_DECL_FN_CHECK (NODE)->immediate_fn_p = true)
3611
3612/* Nonzero if this DECL is the __PRETTY_FUNCTION__ variable in a
3613 template function. */
3614#define DECL_PRETTY_FUNCTION_P(NODE) \
3615 (DECL_NAME (NODE) \
3616 && id_equal (DECL_NAME (NODE), "__PRETTY_FUNCTION__"))
3617
3618/* For a DECL, true if it is __func__ or similar. */
3619#define DECL_FNAME_P(NODE) \
3620 (VAR_P (NODE) && DECL_NAME (NODE) && DECL_ARTIFICIAL (NODE) \
3621 && DECL_HAS_VALUE_EXPR_P (NODE) \
3622 && (id_equal (DECL_NAME (NODE), "__PRETTY_FUNCTION__") \
3623 || id_equal (DECL_NAME (NODE), "__FUNCTION__") \
3624 || id_equal (DECL_NAME (NODE), "__func__")))
3625
3626/* Nonzero if the variable was declared to be thread-local.
3627 We need a special C++ version of this test because the middle-end
3628 DECL_THREAD_LOCAL_P uses the symtab, so we can't use it for
3629 templates. */
3630#define CP_DECL_THREAD_LOCAL_P(NODE) \
3631 (TREE_LANG_FLAG_0 (VAR_DECL_CHECK (NODE)))
3632
3633/* The _TYPE context in which this _DECL appears. This field holds the
3634 class where a virtual function instance is actually defined. */
3635#define DECL_CLASS_CONTEXT(NODE) \
3636 (DECL_CLASS_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : NULL_TREE)
3637
3638/* For a non-member friend function, the class (if any) in which this
3639 friend was defined. For example, given:
3640
3641 struct S { friend void f () { ... } };
3642
3643 the DECL_FRIEND_CONTEXT for `f' will be `S'. */
3644#define DECL_FRIEND_CONTEXT(NODE) \
3645 ((DECL_DECLARES_FUNCTION_P (NODE) && !DECL_VIRTUAL_P (NODE) \
3646 && !DECL_CONSTRUCTOR_P (NODE) \
3647 && (cxx_dialect < cxx23 || !deduction_guide_p (NODE))) \
3648 ? LANG_DECL_FN_CHECK (NODE)->context \
3649 : NULL_TREE)
3650
3651/* Set the DECL_FRIEND_CONTEXT for NODE to CONTEXT. */
3652#define SET_DECL_FRIEND_CONTEXT(NODE, CONTEXT) \
3653 (LANG_DECL_FN_CHECK (NODE)->context = (CONTEXT))
3654
3655#define CP_DECL_CONTEXT(NODE) \
3656 (!DECL_FILE_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : global_namespace)
3657#define CP_TYPE_CONTEXT(NODE) \
3658 (!TYPE_FILE_SCOPE_P (NODE) ? TYPE_CONTEXT (NODE) : global_namespace)
3659#define FROB_CONTEXT(NODE) \
3660 ((NODE) == global_namespace ? DECL_CONTEXT (NODE) : (NODE))
3661
3662/* 1 iff NODE has namespace scope, including the global namespace. */
3663#define DECL_NAMESPACE_SCOPE_P(NODE) \
3664 (!DECL_TEMPLATE_PARM_P (NODE) \
3665 && TREE_CODE (CP_DECL_CONTEXT (NODE)) == NAMESPACE_DECL)
3666
3667#define TYPE_NAMESPACE_SCOPE_P(NODE) \
3668 (TREE_CODE (CP_TYPE_CONTEXT (NODE)) == NAMESPACE_DECL)
3669
3670#define NAMESPACE_SCOPE_P(NODE) \
3671 ((DECL_P (NODE) && DECL_NAMESPACE_SCOPE_P (NODE)) \
3672 || (TYPE_P (NODE) && TYPE_NAMESPACE_SCOPE_P (NODE)))
3673
3674/* 1 iff NODE is a class member. */
3675#define DECL_CLASS_SCOPE_P(NODE) \
3676 (DECL_CONTEXT (NODE) && TYPE_P (DECL_CONTEXT (NODE)))
3677
3678#define TYPE_CLASS_SCOPE_P(NODE) \
3679 (TYPE_CONTEXT (NODE) && TYPE_P (TYPE_CONTEXT (NODE)))
3680
3681/* 1 iff NODE is function-local. */
3682#define DECL_FUNCTION_SCOPE_P(NODE) \
3683 (DECL_CONTEXT (NODE) \
3684 && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL)
3685
3686#define TYPE_FUNCTION_SCOPE_P(NODE) \
3687 (TYPE_CONTEXT (NODE) && TREE_CODE (TYPE_CONTEXT (NODE)) == FUNCTION_DECL)
3688
3689/* 1 iff VAR_DECL node NODE is a type-info decl. This flag is set for
3690 both the primary typeinfo object and the associated NTBS name. */
3691#define DECL_TINFO_P(NODE) \
3692 TREE_LANG_FLAG_4 (TREE_CHECK2 (NODE,VAR_DECL,TYPE_DECL))
3693
3694/* true iff VAR_DECL node NODE is a NTTP object decl. */
3695#define DECL_NTTP_OBJECT_P(NODE) \
3696 TREE_LANG_FLAG_5 (TREE_CHECK (NODE,VAR_DECL))
3697
3698/* 1 iff VAR_DECL node NODE is virtual table or VTT. We forward to
3699 DECL_VIRTUAL_P from the common code, as that has the semantics we
3700 need. But we want a more descriptive name. */
3701#define DECL_VTABLE_OR_VTT_P(NODE) DECL_VIRTUAL_P (VAR_DECL_CHECK (NODE))
3702
3703/* 1 iff a _DECL for a template parameter came from
3704 synthesize_implicit_template_parm. */
3705#define DECL_IMPLICIT_TEMPLATE_PARM_P(NODE) \
3706 DECL_VIRTUAL_P (DECL_TEMPLATE_PARM_CHECK (NODE))
3707
3708/* 1 iff FUNCTION_TYPE or METHOD_TYPE has a ref-qualifier (either & or &&). */
3709#define FUNCTION_REF_QUALIFIED(NODE) \
3710 TREE_LANG_FLAG_4 (FUNC_OR_METHOD_CHECK (NODE))
3711
3712/* 1 iff FUNCTION_TYPE or METHOD_TYPE has &&-ref-qualifier. */
3713#define FUNCTION_RVALUE_QUALIFIED(NODE) \
3714 TREE_LANG_FLAG_5 (FUNC_OR_METHOD_CHECK (NODE))
3715
3716/* 1 iff NODE is function-local, but for types. */
3717#define LOCAL_CLASS_P(NODE) \
3718 (decl_function_context (TYPE_MAIN_DECL (NODE)) != NULL_TREE)
3719
3720/* The nesting depth of namespace, class or function. Makes is_ancestor much
3721 simpler. Only 8 bits available. */
3722#define SCOPE_DEPTH(NODE) \
3723 (NAMESPACE_DECL_CHECK (NODE)->base.u.bits.address_space)
3724
3725/* Whether the namepace is an inline namespace. */
3726#define DECL_NAMESPACE_INLINE_P(NODE) \
3727 TREE_LANG_FLAG_0 (NAMESPACE_DECL_CHECK (NODE))
3728
3729/* In a NAMESPACE_DECL, a vector of inline namespaces. */
3730#define DECL_NAMESPACE_INLINEES(NODE) \
3731 (LANG_DECL_NS_CHECK (NODE)->inlinees)
3732
3733/* Pointer to hash_map from IDENTIFIERS to DECLS */
3734#define DECL_NAMESPACE_BINDINGS(NODE) \
3735 (LANG_DECL_NS_CHECK (NODE)->bindings)
3736
3737/* In a NAMESPACE_DECL, points to the original namespace if this is
3738 a namespace alias. */
3739#define DECL_NAMESPACE_ALIAS(NODE) \
3740 DECL_ABSTRACT_ORIGIN (NAMESPACE_DECL_CHECK (NODE))
3741#define ORIGINAL_NAMESPACE(NODE) \
3742 (DECL_NAMESPACE_ALIAS (NODE) ? DECL_NAMESPACE_ALIAS (NODE) : (NODE))
3743
3744/* Nonzero if NODE is the std namespace. */
3745#define DECL_NAMESPACE_STD_P(NODE) \
3746 ((NODE) == std_node)
3747
3748/* In a TREE_LIST in an attribute list, indicates that the attribute
3749 must be applied at instantiation time. */
3750#define ATTR_IS_DEPENDENT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
3751
3752/* In a TREE_LIST in the argument of attribute abi_tag, indicates that the tag
3753 was inherited from a template parameter, not explicitly indicated. */
3754#define ABI_TAG_IMPLICIT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
3755
3756/* In a TREE_LIST for a parameter-declaration-list, indicates that all the
3757 parameters in the list have declarators enclosed in (). */
3758#define PARENTHESIZED_LIST_P(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
3759
3760/* Non zero if this is a using decl for a dependent scope. */
3761#define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE))
3762
3763/* The scope named in a using decl. */
3764#define USING_DECL_SCOPE(NODE) DECL_RESULT_FLD (USING_DECL_CHECK (NODE))
3765
3766/* The decls named by a using decl. */
3767#define USING_DECL_DECLS(NODE) DECL_INITIAL (USING_DECL_CHECK (NODE))
3768
3769/* Non zero if the using decl refers to a dependent type. */
3770#define USING_DECL_TYPENAME_P(NODE) DECL_LANG_FLAG_1 (USING_DECL_CHECK (NODE))
3771
3772/* True if member using decl NODE refers to a non-inherited NODE. */
3773#define USING_DECL_UNRELATED_P(NODE) DECL_LANG_FLAG_2 (USING_DECL_CHECK (NODE))
3774
3775/* True iff the CONST_DECL is a class-scope clone from C++20 using enum,
3776 created by handle_using_decl. */
3777#define CONST_DECL_USING_P(NODE) \
3778 (TREE_CODE (NODE) == CONST_DECL \
3779 && TREE_TYPE (NODE) \
3780 && TREE_CODE (TREE_TYPE (NODE)) == ENUMERAL_TYPE \
3781 && DECL_CONTEXT (NODE) != TREE_TYPE (NODE))
3782
3783/* In a FUNCTION_DECL, this is nonzero if this function was defined in
3784 the class definition. We have saved away the text of the function,
3785 but have not yet processed it. */
3786#define DECL_PENDING_INLINE_P(NODE) \
3787 (LANG_DECL_FN_CHECK (NODE)->pending_inline_p)
3788
3789/* If DECL_PENDING_INLINE_P holds, this is the saved text of the
3790 function. */
3791#define DECL_PENDING_INLINE_INFO(NODE) \
3792 (LANG_DECL_FN_CHECK (NODE)->u.pending_inline_info)
3793
3794/* Nonzero for TYPE_DECL means that it was written 'using name = type'. */
3795#define TYPE_DECL_ALIAS_P(NODE) \
3796 DECL_LANG_FLAG_6 (TYPE_DECL_CHECK (NODE))
3797
3798/* Nonzero for a type which is an alias for another type; i.e, a type
3799 which declaration was written 'using name-of-type =
3800 another-type'. */
3801#define TYPE_ALIAS_P(NODE) \
3802 (TYPE_P (NODE) \
3803 && TYPE_NAME (NODE) \
3804 && TREE_CODE (TYPE_NAME (NODE)) == TYPE_DECL \
3805 && TYPE_DECL_ALIAS_P (TYPE_NAME (NODE)))
3806
3807/* If non-NULL for a VAR_DECL, FUNCTION_DECL, TYPE_DECL, TEMPLATE_DECL,
3808 or CONCEPT_DECL, the entity is either a template specialization (if
3809 DECL_USE_TEMPLATE is nonzero) or the abstract instance of the
3810 template itself.
3811
3812 In either case, DECL_TEMPLATE_INFO is a TEMPLATE_INFO, whose
3813 TI_TEMPLATE is the TEMPLATE_DECL of which this entity is a
3814 specialization or abstract instance. The TI_ARGS is the
3815 template arguments used to specialize the template.
3816
3817 Consider:
3818
3819 template <typename T> struct S { friend void f(T) {} };
3820
3821 In this case, S<int>::f is, from the point of view of the compiler,
3822 an instantiation of a template -- but, from the point of view of
3823 the language, each instantiation of S results in a wholly unrelated
3824 global function f. In this case, DECL_TEMPLATE_INFO for S<int>::f
3825 will be non-NULL, but DECL_USE_TEMPLATE will be zero.
3826
3827 In a friend declaration, TI_TEMPLATE can be an overload set, or
3828 identifier. */
3829#define DECL_TEMPLATE_INFO(NODE) \
3830 (DECL_LANG_SPECIFIC (TEMPLATE_INFO_DECL_CHECK (NODE)) \
3831 ->u.min.template_info)
3832
3833/* For a lambda capture proxy, its captured variable. */
3834#define DECL_CAPTURED_VARIABLE(NODE) \
3835 (LANG_DECL_MIN_CHECK (NODE)->access)
3836
3837/* For a VAR_DECL, indicates that the variable is actually a
3838 non-static data member of anonymous union that has been promoted to
3839 variable status. */
3840#define DECL_ANON_UNION_VAR_P(NODE) \
3841 (DECL_LANG_FLAG_4 (VAR_DECL_CHECK (NODE)))
3842
3843/* Template information for a RECORD_TYPE or UNION_TYPE. */
3844#define CLASSTYPE_TEMPLATE_INFO(NODE) \
3845 (TYPE_LANG_SLOT_1 (RECORD_OR_UNION_CHECK (NODE)))
3846
3847/* Template information for a template template parameter. */
3848#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) \
3849 (TYPE_LANG_SLOT_1 (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK (NODE)))
3850
3851/* Template information for an ENUMERAL_, RECORD_, UNION_TYPE, or
3852 BOUND_TEMPLATE_TEMPLATE_PARM type. This ignores any alias
3853 templateness of NODE. It'd be nice if this could unconditionally
3854 access the slot, rather than return NULL if given a
3855 non-templatable type. */
3856#define TYPE_TEMPLATE_INFO(NODE) \
3857 (TREE_CODE (NODE) == ENUMERAL_TYPE \
3858 || TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM \
3859 || RECORD_OR_UNION_TYPE_P (NODE) \
3860 ? TYPE_LANG_SLOT_1 (NODE) : NULL_TREE)
3861
3862/* Template information (if any) for an alias type. */
3863#define TYPE_ALIAS_TEMPLATE_INFO(NODE) \
3864 (DECL_LANG_SPECIFIC (TYPE_NAME (NODE)) \
3865 ? DECL_TEMPLATE_INFO (TYPE_NAME (NODE)) \
3866 : NULL_TREE)
3867
3868/* If NODE is a type alias, this accessor returns the template info
3869 for the alias template (if any). Otherwise behave as
3870 TYPE_TEMPLATE_INFO. */
3871#define TYPE_TEMPLATE_INFO_MAYBE_ALIAS(NODE) \
3872 (typedef_variant_p (NODE) \
3873 ? TYPE_ALIAS_TEMPLATE_INFO (NODE) \
3874 : TYPE_TEMPLATE_INFO (NODE))
3875
3876/* Set the template information for a non-alias n ENUMERAL_, RECORD_,
3877 or UNION_TYPE to VAL. ALIAS's are dealt with separately. */
3878#define SET_TYPE_TEMPLATE_INFO(NODE, VAL) \
3879 (TREE_CODE (NODE) == ENUMERAL_TYPE \
3880 || (CLASS_TYPE_P (NODE) && !TYPE_ALIAS_P (NODE)) \
3881 ? (TYPE_LANG_SLOT_1 (NODE) = (VAL)) \
3882 : (DECL_TEMPLATE_INFO (TYPE_NAME (NODE)) = (VAL))) \
3883
3884#define TI_TEMPLATE(NODE) \
3885 ((struct tree_template_info*)TEMPLATE_INFO_CHECK (NODE))->tmpl
3886#define TI_ARGS(NODE) \
3887 ((struct tree_template_info*)TEMPLATE_INFO_CHECK (NODE))->args
3888#define TI_PENDING_TEMPLATE_FLAG(NODE) \
3889 TREE_LANG_FLAG_1 (TEMPLATE_INFO_CHECK (NODE))
3890
3891/* For a class or variable template specialization, this contains the
3892 TEMPLATE_INFO result of most_specialized_partial_spec, i.e. the selected
3893 partial template specialization and arguments relative to it. */
3894#define TI_PARTIAL_INFO(NODE) \
3895 (gcc_checking_assert (PRIMARY_TEMPLATE_P (TI_TEMPLATE (NODE))), \
3896 ((struct tree_template_info*)NODE)->partial)
3897
3898/* For a given TREE_VEC containing a template argument list,
3899 this property contains the number of arguments that are not
3900 defaulted. */
3901#define NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \
3902 TREE_CHAIN (TREE_VEC_CHECK (NODE))
3903
3904/* Below are the setter and getter of the NON_DEFAULT_TEMPLATE_ARGS_COUNT
3905 property. */
3906#define SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE, INT_VALUE) \
3907 NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) = build_int_cst (NULL_TREE, INT_VALUE)
3908#if CHECKING_P
3909#define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \
3910 int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE))
3911#else
3912#define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \
3913 NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE) \
3914 ? int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE)) \
3915 : TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (NODE))
3916#endif
3917
3918/* True iff NODE represents the template args for a type-constraint,
3919 in which case the first one represents the constrained type.
3920 Currently only set during mangling. */
3921#define TEMPLATE_ARGS_TYPE_CONSTRAINT_P(NODE) \
3922 TREE_PRIVATE (TREE_VEC_CHECK (NODE))
3923
3924/* The list of access checks that were deferred during parsing
3925 which need to be performed at template instantiation time.
3926
3927 FIXME this should be associated with the TEMPLATE_DECL, not the
3928 TEMPLATE_INFO. */
3929#define TI_DEFERRED_ACCESS_CHECKS(NODE) \
3930 ((struct tree_template_info*)TEMPLATE_INFO_CHECK \
3931 (NODE))->deferred_access_checks
3932
3933/* We use TREE_VECs to hold template arguments. If there is only one
3934 level of template arguments, then the TREE_VEC contains the
3935 arguments directly. If there is more than one level of template
3936 arguments, then each entry in the TREE_VEC is itself a TREE_VEC,
3937 containing the template arguments for a single level. The first
3938 entry in the outer TREE_VEC is the outermost level of template
3939 parameters; the last is the innermost.
3940
3941 It is incorrect to ever form a template argument vector containing
3942 only one level of arguments, but which is a TREE_VEC containing as
3943 its only entry the TREE_VEC for that level.
3944
3945 For each TREE_VEC containing the template arguments for a single
3946 level, it's possible to get or set the number of non defaulted
3947 template arguments by using the accessor macros
3948 GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT or
3949 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT. */
3950
3951/* Nonzero if the template arguments is actually a vector of vectors,
3952 rather than just a vector. */
3953#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \
3954 (NODE && TREE_VEC_LENGTH (NODE) && TREE_VEC_ELT (NODE, 0) \
3955 && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC)
3956
3957/* The depth of a template argument vector. When called directly by
3958 the parser, we use a TREE_LIST rather than a TREE_VEC to represent
3959 template arguments. In that case, there is only one level of template
3960 arguments. We may even see NULL_TREE if there are 0 levels of
3961 template arguments, as in cp_parser_requires_expression. */
3962#define TMPL_ARGS_DEPTH(NODE) \
3963 ((NODE) == NULL_TREE ? 0 \
3964 : TMPL_ARGS_HAVE_MULTIPLE_LEVELS (NODE) ? TREE_VEC_LENGTH (NODE) \
3965 : 1)
3966
3967/* The LEVELth level of the template ARGS. The outermost level of
3968 args is level 1, not level 0. */
3969#define TMPL_ARGS_LEVEL(ARGS, LEVEL) \
3970 (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (ARGS) \
3971 ? TREE_VEC_ELT (ARGS, (LEVEL) - 1) \
3972 : (gcc_checking_assert ((LEVEL) == 1), (ARGS)))
3973
3974/* Set the LEVELth level of the template ARGS to VAL. This macro does
3975 not work with single-level argument vectors. */
3976#define SET_TMPL_ARGS_LEVEL(ARGS, LEVEL, VAL) \
3977 (TREE_VEC_ELT (ARGS, (LEVEL) - 1) = (VAL))
3978
3979/* Accesses the IDXth parameter in the LEVELth level of the ARGS. */
3980#define TMPL_ARG(ARGS, LEVEL, IDX) \
3981 (TREE_VEC_ELT (TMPL_ARGS_LEVEL (ARGS, LEVEL), IDX))
3982
3983/* Given a single level of template arguments in NODE, return the
3984 number of arguments. */
3985#define NUM_TMPL_ARGS(NODE) \
3986 (TREE_VEC_LENGTH (NODE))
3987
3988/* Returns the innermost level of template arguments in ARGS. */
3989#define INNERMOST_TEMPLATE_ARGS(NODE) \
3990 (get_innermost_template_args ((NODE), 1))
3991
3992/* The number of levels of template parameters given by NODE. */
3993#define TMPL_PARMS_DEPTH(NODE) \
3994 ((HOST_WIDE_INT) TREE_INT_CST_LOW (TREE_PURPOSE (NODE)))
3995
3996/* The TEMPLATE_DECL instantiated or specialized by NODE. This
3997 TEMPLATE_DECL will be the immediate parent, not the most general
3998 template. For example, in:
3999
4000 template <class T> struct S { template <class U> void f(U); }
4001
4002 the FUNCTION_DECL for S<int>::f<double> will have, as its
4003 DECL_TI_TEMPLATE, `template <class U> S<int>::f<U>'.
4004
4005 As a special case, for a member friend template of a template
4006 class, this value will not be a TEMPLATE_DECL, but rather an
4007 IDENTIFIER_NODE or OVERLOAD indicating the name of the template and
4008 any explicit template arguments provided. For example, in:
4009
4010 template <class T> struct S { friend void f<int>(int, double); }
4011
4012 the DECL_TI_TEMPLATE will be an IDENTIFIER_NODE for `f' and the
4013 DECL_TI_ARGS will be {int}.
4014
4015 For a FIELD_DECL with a non-static data member initializer, this value
4016 is the FIELD_DECL it was instantiated from. */
4017#define DECL_TI_TEMPLATE(NODE) TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE))
4018
4019/* The template arguments used to obtain this decl from the most
4020 general form of DECL_TI_TEMPLATE. For the example given for
4021 DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}. These
4022 are always the full set of arguments required to instantiate this
4023 declaration from the most general template specialized here. */
4024#define DECL_TI_ARGS(NODE) TI_ARGS (DECL_TEMPLATE_INFO (NODE))
4025
4026/* The TEMPLATE_DECL associated with NODE, a class type. Even if NODE
4027 will be generated from a partial specialization, the TEMPLATE_DECL
4028 referred to here will be the original template. For example,
4029 given:
4030
4031 template <typename T> struct S {};
4032 template <typename T> struct S<T*> {};
4033
4034 the CLASSTYPE_TI_TEMPLATE for S<int*> will be S, not the S<T*>.
4035
4036 For a member class template, CLASSTYPE_TI_TEMPLATE always refers to the
4037 partial instantiation rather than the primary template. CLASSTYPE_TI_ARGS
4038 are for the primary template if the partial instantiation isn't
4039 specialized, or for the explicit specialization if it is, e.g.
4040
4041 template <class T> class C { template <class U> class D; }
4042 template <> template <class U> class C<int>::D; */
4043#define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE))
4044#define CLASSTYPE_TI_ARGS(NODE) TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE))
4045
4046/* For a template instantiation TYPE, returns the TYPE corresponding
4047 to the primary template. Otherwise returns TYPE itself. */
4048#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \
4049 ((CLASSTYPE_USE_TEMPLATE ((TYPE)) \
4050 && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE))) \
4051 ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \
4052 (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \
4053 : (TYPE))
4054
4055/* Like CLASS_TI_TEMPLATE, but also works for ENUMERAL_TYPEs. */
4056#define TYPE_TI_TEMPLATE(NODE) \
4057 (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE)))
4058
4059/* Like DECL_TI_ARGS, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */
4060#define TYPE_TI_ARGS(NODE) \
4061 (TI_ARGS (TYPE_TEMPLATE_INFO (NODE)))
4062
4063#define INNERMOST_TEMPLATE_PARMS(NODE) TREE_VALUE (NODE)
4064
4065/* Nonzero if NODE (a TEMPLATE_DECL) is a member template, in the
4066 sense of [temp.mem]. */
4067#define DECL_MEMBER_TEMPLATE_P(NODE) \
4068 (DECL_LANG_FLAG_1 (TEMPLATE_DECL_CHECK (NODE)))
4069
4070/* Nonzero if the NODE corresponds to the template parameters for a
4071 member template, whose inline definition is being processed after
4072 the class definition is complete. */
4073#define TEMPLATE_PARMS_FOR_INLINE(NODE) TREE_LANG_FLAG_1 (NODE)
4074
4075/* Determine if a declaration (PARM_DECL or FIELD_DECL) is a pack. */
4076#define DECL_PACK_P(NODE) \
4077 (DECL_P (NODE) && PACK_EXPANSION_P (TREE_TYPE (NODE)))
4078
4079/* Determines if NODE is an expansion of one or more parameter packs,
4080 e.g., a TYPE_PACK_EXPANSION or EXPR_PACK_EXPANSION. */
4081#define PACK_EXPANSION_P(NODE) \
4082 (TREE_CODE (NODE) == TYPE_PACK_EXPANSION \
4083 || TREE_CODE (NODE) == EXPR_PACK_EXPANSION)
4084
4085#define PACK_EXPANSION_CHECK(NODE) \
4086 TREE_CHECK2 (NODE, TYPE_PACK_EXPANSION, EXPR_PACK_EXPANSION)
4087
4088#define PACK_INDEX_CHECK(NODE) \
4089 TREE_CHECK2 (NODE, PACK_INDEX_TYPE, PACK_INDEX_EXPR)
4090
4091/* Extracts the type or expression pattern from a TYPE_PACK_EXPANSION or
4092 EXPR_PACK_EXPANSION. */
4093#define PACK_EXPANSION_PATTERN(NODE) \
4094 (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
4095 ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
4096
4097/* The list of parameter packs used in the PACK_EXPANSION_* node. The
4098 TREE_VALUE of each TREE_LIST contains the parameter packs. */
4099#define PACK_EXPANSION_PARAMETER_PACKS(NODE) \
4100 *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == EXPR_PACK_EXPANSION \
4101 ? &TREE_OPERAND (NODE, 1) \
4102 : &TYPE_MIN_VALUE_RAW (TYPE_PACK_EXPANSION_CHECK (NODE)))
4103
4104/* Any additional template args to be applied when substituting into
4105 the pattern, set by tsubst_pack_expansion for partial instantiations.
4106 If this is a TREE_LIST, the TREE_VALUE of the first element is the
4107 usual template argument TREE_VEC, and the TREE_PURPOSE of later elements
4108 are enclosing functions that provided function parameter packs we'll need
4109 to map appropriately. */
4110#define PACK_EXPANSION_EXTRA_ARGS(NODE) \
4111 *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
4112 ? &TYPE_MAX_VALUE_RAW (NODE) \
4113 : &TREE_OPERAND ((NODE), 2))
4114
4115/* True if NODE is a pack index. */
4116#define PACK_INDEX_P(NODE) \
4117 (TREE_CODE (NODE) == PACK_INDEX_TYPE \
4118 || TREE_CODE (NODE) == PACK_INDEX_EXPR)
4119
4120/* For a pack index T...[N], the pack expansion 'T...'. */
4121#define PACK_INDEX_PACK(NODE) \
4122 (TREE_CODE (PACK_INDEX_CHECK (NODE)) == PACK_INDEX_TYPE \
4123 ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
4124
4125/* For a pack index T...[N], the index N. */
4126#define PACK_INDEX_INDEX(NODE) \
4127 *(TREE_CODE (PACK_INDEX_CHECK (NODE)) == PACK_INDEX_TYPE \
4128 ? &TYPE_MAX_VALUE_RAW (NODE) \
4129 : &TREE_OPERAND ((NODE), 1))
4130
4131/* True iff this pack expansion is within a function context. */
4132#define PACK_EXPANSION_LOCAL_P(NODE) \
4133 TREE_LANG_FLAG_0 (PACK_EXPANSION_CHECK (NODE))
4134
4135/* True iff this pack expansion is for sizeof.... */
4136#define PACK_EXPANSION_SIZEOF_P(NODE) \
4137 TREE_LANG_FLAG_1 (PACK_EXPANSION_CHECK (NODE))
4138
4139/* True iff this pack expansion is for auto... in lambda init-capture. */
4140#define PACK_EXPANSION_AUTO_P(NODE) \
4141 TREE_LANG_FLAG_2 (PACK_EXPANSION_CHECK (NODE))
4142
4143/* True if we must use PACK_EXPANSION_EXTRA_ARGS and avoid partial
4144 instantiation of this pack expansion. */
4145#define PACK_EXPANSION_FORCE_EXTRA_ARGS_P(NODE) \
4146 TREE_LANG_FLAG_3 (PACK_EXPANSION_CHECK (NODE))
4147
4148/* Indicates whether a pack expansion has been parenthesized. Used for
4149 a pack expansion in a decltype. */
4150#define PACK_INDEX_PARENTHESIZED_P(NODE) \
4151 TREE_LANG_FLAG_1 (TREE_CHECK (NODE, PACK_INDEX_EXPR))
4152
4153/* Determine if this is an argument pack. */
4154#define ARGUMENT_PACK_P(NODE) \
4155 (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK \
4156 || TREE_CODE (NODE) == NONTYPE_ARGUMENT_PACK)
4157
4158#define ARGUMENT_PACK_CHECK(NODE) \
4159 TREE_CHECK2 (NODE, TYPE_ARGUMENT_PACK, NONTYPE_ARGUMENT_PACK)
4160
4161/* The arguments stored in an argument pack. Arguments are stored in a
4162 TREE_VEC, which may have length zero. */
4163#define ARGUMENT_PACK_ARGS(NODE) \
4164 (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK \
4165 ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
4166
4167/* Whether the argument pack is "incomplete", meaning that more
4168 arguments can still be deduced. Incomplete argument packs are only
4169 used when the user has provided an explicit template argument list
4170 for a variadic function template. Some of the explicit template
4171 arguments will be placed into the beginning of the argument pack,
4172 but additional arguments might still be deduced. */
4173#define ARGUMENT_PACK_INCOMPLETE_P(NODE) \
4174 TREE_ADDRESSABLE (ARGUMENT_PACK_ARGS (NODE))
4175
4176/* When ARGUMENT_PACK_INCOMPLETE_P, stores the explicit template
4177 arguments used to fill this pack. */
4178#define ARGUMENT_PACK_EXPLICIT_ARGS(NODE) \
4179 TREE_TYPE (ARGUMENT_PACK_ARGS (NODE))
4180
4181/* In an ARGUMENT_PACK_SELECT, the argument pack from which an
4182 argument will be selected. */
4183#define ARGUMENT_PACK_SELECT_FROM_PACK(NODE) \
4184 (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->argument_pack)
4185
4186/* In an ARGUMENT_PACK_SELECT, the index of the argument we want to
4187 select. */
4188#define ARGUMENT_PACK_SELECT_INDEX(NODE) \
4189 (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->index)
4190
4191#define FOLD_EXPR_CHECK(NODE) \
4192 TREE_CHECK4 (NODE, UNARY_LEFT_FOLD_EXPR, UNARY_RIGHT_FOLD_EXPR, \
4193 BINARY_LEFT_FOLD_EXPR, BINARY_RIGHT_FOLD_EXPR)
4194
4195#define BINARY_FOLD_EXPR_CHECK(NODE) \
4196 TREE_CHECK2 (NODE, BINARY_LEFT_FOLD_EXPR, BINARY_RIGHT_FOLD_EXPR)
4197
4198/* True if NODE is UNARY_FOLD_EXPR or a BINARY_FOLD_EXPR */
4199#define FOLD_EXPR_P(NODE) \
4200 (TREE_CODE (NODE) == UNARY_LEFT_FOLD_EXPR \
4201 || TREE_CODE (NODE) == UNARY_RIGHT_FOLD_EXPR \
4202 || TREE_CODE (NODE) == BINARY_LEFT_FOLD_EXPR \
4203 || TREE_CODE (NODE) == BINARY_RIGHT_FOLD_EXPR)
4204
4205/* True when NODE is a fold over a compound assignment operator. */
4206#define FOLD_EXPR_MODIFY_P(NODE) \
4207 TREE_LANG_FLAG_0 (FOLD_EXPR_CHECK (NODE))
4208
4209/* An INTEGER_CST containing the tree code of the folded operator. */
4210#define FOLD_EXPR_OP_RAW(NODE) \
4211 TREE_OPERAND (FOLD_EXPR_CHECK (NODE), 0)
4212
4213/* The tree code of the folded operator. */
4214#define FOLD_EXPR_OP(NODE) \
4215 ((enum tree_code) TREE_INT_CST_LOW (FOLD_EXPR_OP_RAW (NODE)))
4216
4217/* The expression containing an unexpanded parameter pack. */
4218#define FOLD_EXPR_PACK(NODE) \
4219 TREE_OPERAND (FOLD_EXPR_CHECK (NODE), 1)
4220
4221/* In a binary fold expression, the argument with no unexpanded
4222 parameter packs. */
4223#define FOLD_EXPR_INIT(NODE) \
4224 TREE_OPERAND (BINARY_FOLD_EXPR_CHECK (NODE), 2)
4225
4226/* In a FUNCTION_DECL, the saved auto-return pattern. */
4227#define DECL_SAVED_AUTO_RETURN_TYPE(NODE) \
4228 (LANG_DECL_FN_CHECK (FUNCTION_DECL_CHECK (NODE)) \
4229 ->u.saved_auto_return_type)
4230
4231/* In a RETURN_EXPR, whether the expression refers to the address
4232 of a local variable. */
4233#define RETURN_EXPR_LOCAL_ADDR_P(NODE) \
4234 TREE_LANG_FLAG_0 (RETURN_EXPR_CHECK (NODE))
4235
4236/* True if NODE is an implicit INDIRECT_REF from convert_from_reference. */
4237#define REFERENCE_REF_P(NODE) \
4238 (INDIRECT_REF_P (NODE) \
4239 && TREE_TYPE (TREE_OPERAND (NODE, 0)) \
4240 && TYPE_REF_P (TREE_TYPE (TREE_OPERAND ((NODE), 0))))
4241
4242/* Look through an implicit INDIRECT_REF from convert_from_reference. */
4243#define STRIP_REFERENCE_REF(NODE) \
4244 (REFERENCE_REF_P (NODE) ? TREE_OPERAND (NODE, 0) : NODE)
4245
4246/* True iff this represents an lvalue being treated as an rvalue during return
4247 or throw as per [class.copy.elision]. */
4248#define IMPLICIT_RVALUE_P(NODE) \
4249 TREE_LANG_FLAG_3 (TREE_CHECK2 ((NODE), NON_LVALUE_EXPR, STATIC_CAST_EXPR))
4250
4251#define NEW_EXPR_USE_GLOBAL(NODE) \
4252 TREE_LANG_FLAG_0 (NEW_EXPR_CHECK (NODE))
4253#define DELETE_EXPR_USE_GLOBAL(NODE) \
4254 TREE_LANG_FLAG_0 (DELETE_EXPR_CHECK (NODE))
4255#define DELETE_EXPR_USE_VEC(NODE) \
4256 TREE_LANG_FLAG_1 (DELETE_EXPR_CHECK (NODE))
4257
4258/* True iff this represents returning a potential named return value. */
4259#define INIT_EXPR_NRV_P(NODE) \
4260 TREE_LANG_FLAG_0 (INIT_EXPR_CHECK (NODE))
4261
4262#define CALL_OR_AGGR_INIT_CHECK(NODE) \
4263 TREE_CHECK2 ((NODE), CALL_EXPR, AGGR_INIT_EXPR)
4264
4265/* In a CALL_EXPR appearing in a template, true if Koenig lookup
4266 should be performed at instantiation time. */
4267#define KOENIG_LOOKUP_P(NODE) TREE_LANG_FLAG_0 (CALL_EXPR_CHECK (NODE))
4268
4269/* True if the arguments to NODE should be evaluated in left-to-right
4270 order regardless of PUSH_ARGS_REVERSED. */
4271#define CALL_EXPR_ORDERED_ARGS(NODE) \
4272 TREE_LANG_FLAG_3 (CALL_OR_AGGR_INIT_CHECK (NODE))
4273
4274/* True if the arguments to NODE should be evaluated in right-to-left
4275 order regardless of PUSH_ARGS_REVERSED. */
4276#define CALL_EXPR_REVERSE_ARGS(NODE) \
4277 TREE_LANG_FLAG_5 (CALL_OR_AGGR_INIT_CHECK (NODE))
4278
4279/* True if CALL_EXPR was written as an operator expression, not a function
4280 call. */
4281#define CALL_EXPR_OPERATOR_SYNTAX(NODE) \
4282 TREE_LANG_FLAG_6 (CALL_OR_AGGR_INIT_CHECK (NODE))
4283
4284/* A TREE_LIST containing the result of phase 1 name lookup of the operator
4285 overloads that are pertinent to the dependent operator expression whose
4286 type is NODE. Each TREE_PURPOSE is an IDENTIFIER_NODE and TREE_VALUE is
4287 the corresponding (possibly empty) lookup result. The TREE_TYPE of the
4288 first TREE_LIST node points back to NODE. */
4289#define DEPENDENT_OPERATOR_TYPE_SAVED_LOOKUPS(NODE) \
4290 TYPE_VALUES_RAW (DEPENDENT_OPERATOR_TYPE_CHECK (NODE))
4291
4292/* Guarded helper for the above accessor macro that takes a (templated)
4293 operator expression instead of the type thereof. */
4294inline tree
4295templated_operator_saved_lookups (tree t)
4296{
4297 tree type = TREE_TYPE (EXPR_CHECK (t));
4298 if (type && TREE_CODE (type) == DEPENDENT_OPERATOR_TYPE)
4299 return DEPENDENT_OPERATOR_TYPE_SAVED_LOOKUPS (type);
4300 else
4301 return NULL_TREE;
4302}
4303
4304/* Indicates whether a string literal has been parenthesized. Such
4305 usages are disallowed in certain circumstances. */
4306
4307#define PAREN_STRING_LITERAL_P(NODE) \
4308 TREE_LANG_FLAG_0 (STRING_CST_CHECK (NODE))
4309
4310/* Indicates whether a COMPONENT_REF or a SCOPE_REF has been parenthesized, an
4311 INDIRECT_REF comes from parenthesizing a _DECL, or a PAREN_EXPR identifies a
4312 parenthesized initializer relevant for decltype(auto). Currently only set
4313 some of the time in C++14 mode. */
4314
4315#define REF_PARENTHESIZED_P(NODE) \
4316 TREE_LANG_FLAG_2 (TREE_CHECK5 ((NODE), COMPONENT_REF, INDIRECT_REF, SCOPE_REF, VIEW_CONVERT_EXPR, PAREN_EXPR))
4317
4318/* Nonzero if this AGGR_INIT_EXPR provides for initialization via a
4319 constructor call, rather than an ordinary function call. */
4320#define AGGR_INIT_VIA_CTOR_P(NODE) \
4321 TREE_LANG_FLAG_0 (AGGR_INIT_EXPR_CHECK (NODE))
4322
4323/* Nonzero if expanding this AGGR_INIT_EXPR should first zero-initialize
4324 the object. */
4325#define AGGR_INIT_ZERO_FIRST(NODE) \
4326 TREE_LANG_FLAG_2 (AGGR_INIT_EXPR_CHECK (NODE))
4327
4328/* Nonzero means that the call is the jump from a thunk to the
4329 thunked-to function. */
4330#define AGGR_INIT_FROM_THUNK_P(NODE) \
4331 (AGGR_INIT_EXPR_CHECK (NODE)->base.protected_flag)
4332
4333/* Nonzero means that the call was marked musttail. */
4334#define AGGR_INIT_EXPR_MUST_TAIL(NODE) \
4335 (AGGR_INIT_EXPR_CHECK (NODE)->base.static_flag)
4336
4337/* AGGR_INIT_EXPR accessors. These are equivalent to the CALL_EXPR
4338 accessors, except for AGGR_INIT_EXPR_SLOT (which takes the place of
4339 CALL_EXPR_STATIC_CHAIN). */
4340
4341#define AGGR_INIT_EXPR_FN(NODE) TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 1)
4342#define AGGR_INIT_EXPR_SLOT(NODE) \
4343 TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 2)
4344#define AGGR_INIT_EXPR_ARG(NODE, I) \
4345 TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), (I) + 3)
4346#define aggr_init_expr_nargs(NODE) (VL_EXP_OPERAND_LENGTH(NODE) - 3)
4347
4348/* AGGR_INIT_EXPR_ARGP returns a pointer to the argument vector for NODE.
4349 We can't use &AGGR_INIT_EXPR_ARG (NODE, 0) because that will complain if
4350 the argument count is zero when checking is enabled. Instead, do
4351 the pointer arithmetic to advance past the 3 fixed operands in a
4352 AGGR_INIT_EXPR. That produces a valid pointer to just past the end of
4353 the operand array, even if it's not valid to dereference it. */
4354#define AGGR_INIT_EXPR_ARGP(NODE) \
4355 (&(TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 0)) + 3)
4356
4357/* Abstract iterators for AGGR_INIT_EXPRs. */
4358
4359/* Structure containing iterator state. */
4360struct aggr_init_expr_arg_iterator {
4361 tree t; /* the aggr_init_expr */
4362 int n; /* argument count */
4363 int i; /* next argument index */
4364};
4365
4366/* Initialize the abstract argument list iterator object ITER with the
4367 arguments from AGGR_INIT_EXPR node EXP. */
4368inline void
4369init_aggr_init_expr_arg_iterator (tree exp,
4370 aggr_init_expr_arg_iterator *iter)
4371{
4372 iter->t = exp;
4373 iter->n = aggr_init_expr_nargs (exp);
4374 iter->i = 0;
4375}
4376
4377/* Return the next argument from abstract argument list iterator object ITER,
4378 and advance its state. Return NULL_TREE if there are no more arguments. */
4379inline tree
4380next_aggr_init_expr_arg (aggr_init_expr_arg_iterator *iter)
4381{
4382 tree result;
4383 if (iter->i >= iter->n)
4384 return NULL_TREE;
4385 result = AGGR_INIT_EXPR_ARG (iter->t, iter->i);
4386 iter->i++;
4387 return result;
4388}
4389
4390/* Initialize the abstract argument list iterator object ITER, then advance
4391 past and return the first argument. Useful in for expressions, e.g.
4392 for (arg = first_aggr_init_expr_arg (exp, &iter); arg;
4393 arg = next_aggr_init_expr_arg (&iter)) */
4394inline tree
4395first_aggr_init_expr_arg (tree exp, aggr_init_expr_arg_iterator *iter)
4396{
4397 init_aggr_init_expr_arg_iterator (exp, iter);
4398 return next_aggr_init_expr_arg (iter);
4399}
4400
4401/* Test whether there are more arguments in abstract argument list iterator
4402 ITER, without changing its state. */
4403inline bool
4404more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
4405{
4406 return (iter->i < iter->n);
4407}
4408
4409/* Iterate through each argument ARG of AGGR_INIT_EXPR CALL, using variable
4410 ITER (of type aggr_init_expr_arg_iterator) to hold the iteration state. */
4411#define FOR_EACH_AGGR_INIT_EXPR_ARG(arg, iter, call) \
4412 for ((arg) = first_aggr_init_expr_arg ((call), &(iter)); (arg); \
4413 (arg) = next_aggr_init_expr_arg (&(iter)))
4414
4415/* We have an expression tree T that represents a call, either CALL_EXPR
4416 or AGGR_INIT_EXPR. Return a reference to the Nth argument. */
4417
4418inline tree&
4419get_nth_callarg (tree t, int n)
4420{
4421 switch (TREE_CODE (t))
4422 {
4423 case CALL_EXPR:
4424 return CALL_EXPR_ARG (t, n);
4425
4426 case AGGR_INIT_EXPR:
4427 return AGGR_INIT_EXPR_ARG (t, n);
4428
4429 default:
4430 gcc_unreachable ();
4431 }
4432}
4433
4434/* VEC_INIT_EXPR accessors. */
4435#define VEC_INIT_EXPR_SLOT(NODE) TREE_OPERAND (VEC_INIT_EXPR_CHECK (NODE), 0)
4436#define VEC_INIT_EXPR_INIT(NODE) TREE_OPERAND (VEC_INIT_EXPR_CHECK (NODE), 1)
4437
4438/* Indicates that a VEC_INIT_EXPR is a potential constant expression.
4439 Only set when the current function is constexpr. */
4440#define VEC_INIT_EXPR_IS_CONSTEXPR(NODE) \
4441 TREE_LANG_FLAG_0 (VEC_INIT_EXPR_CHECK (NODE))
4442
4443/* Indicates that a VEC_INIT_EXPR is expressing value-initialization. */
4444#define VEC_INIT_EXPR_VALUE_INIT(NODE) \
4445 TREE_LANG_FLAG_1 (VEC_INIT_EXPR_CHECK (NODE))
4446
4447/* If T is a VEC_INIT_EXPR, return it, possibly stripping a TARGET_EXPR
4448 wrapper. Otherwise, return null. */
4449inline tree
4450get_vec_init_expr (tree t)
4451{
4452 if (t && TREE_CODE (t) == TARGET_EXPR)
4453 t = TARGET_EXPR_INITIAL (t);
4454 if (t && TREE_CODE (t) == VEC_INIT_EXPR)
4455 return t;
4456 return NULL_TREE;
4457}
4458
4459/* The condition under which this MUST_NOT_THROW_EXPR actually blocks
4460 exceptions. NULL_TREE means 'true'. */
4461#define MUST_NOT_THROW_COND(NODE) \
4462 TREE_OPERAND (MUST_NOT_THROW_EXPR_CHECK (NODE), 1)
4463
4464/* The TYPE_MAIN_DECL for a class template type is a TYPE_DECL, not a
4465 TEMPLATE_DECL. This macro determines whether or not a given class
4466 type is really a template type, as opposed to an instantiation or
4467 specialization of one. */
4468#define CLASSTYPE_IS_TEMPLATE(NODE) \
4469 (CLASSTYPE_TEMPLATE_INFO (NODE) \
4470 && !CLASSTYPE_USE_TEMPLATE (NODE) \
4471 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE)))
4472
4473/* The name used by the user to name the typename type. Typically,
4474 this is an IDENTIFIER_NODE, and the same as the DECL_NAME on the
4475 corresponding TYPE_DECL. However, this may also be a
4476 TEMPLATE_ID_EXPR if we had something like `typename X::Y<T>'. */
4477#define TYPENAME_TYPE_FULLNAME(NODE) \
4478 (TYPE_VALUES_RAW (TYPENAME_TYPE_CHECK (NODE)))
4479
4480/* True if a TYPENAME_TYPE was declared as an "enum". */
4481#define TYPENAME_IS_ENUM_P(NODE) \
4482 (TREE_LANG_FLAG_0 (TYPENAME_TYPE_CHECK (NODE)))
4483
4484/* True if a TYPENAME_TYPE was declared as a "class", "struct", or
4485 "union". */
4486#define TYPENAME_IS_CLASS_P(NODE) \
4487 (TREE_LANG_FLAG_1 (TYPENAME_TYPE_CHECK (NODE)))
4488
4489/* True if a TYPENAME_TYPE is in the process of being resolved. */
4490#define TYPENAME_IS_RESOLVING_P(NODE) \
4491 (TREE_LANG_FLAG_2 (TYPENAME_TYPE_CHECK (NODE)))
4492
4493/* [class.virtual]
4494
4495 A class that declares or inherits a virtual function is called a
4496 polymorphic class. */
4497#define TYPE_POLYMORPHIC_P(NODE) (TREE_LANG_FLAG_2 (NODE))
4498
4499/* Nonzero if this class has a virtual function table pointer. */
4500#define TYPE_CONTAINS_VPTR_P(NODE) \
4501 (TYPE_POLYMORPHIC_P (NODE) || CLASSTYPE_VBASECLASSES (NODE))
4502
4503/* Nonzero if NODE is a FUNCTION_DECL or VARIABLE_DECL (for a decl
4504 with namespace scope) declared in a local scope. */
4505#define DECL_LOCAL_DECL_P(NODE) \
4506 DECL_LANG_FLAG_0 (VAR_OR_FUNCTION_DECL_CHECK (NODE))
4507
4508/* The namespace-scope decl a DECL_LOCAL_DECL_P aliases. */
4509#define DECL_LOCAL_DECL_ALIAS(NODE) \
4510 DECL_ACCESS ((gcc_checking_assert (DECL_LOCAL_DECL_P (NODE)), NODE))
4511
4512/* True if NODE was declared with auto in its return type, but it has
4513 started compilation and so the return type might have been changed by
4514 return type deduction; its declared return type should be found in
4515 DECL_SAVED_AUTO_RETURN_TYPE (NODE). */
4516#define FNDECL_USED_AUTO(NODE) \
4517 TREE_LANG_FLAG_2 (FUNCTION_DECL_CHECK (NODE))
4518
4519/* True if NODE is needed for a manifestly constant-evaluated expression.
4520 This doesn't especially need to be a flag, since currently it's only
4521 used for error recovery; if we run out of function flags it could move
4522 to an attribute. */
4523#define FNDECL_MANIFESTLY_CONST_EVALUATED(NODE) \
4524 TREE_LANG_FLAG_4 (FUNCTION_DECL_CHECK (NODE))
4525
4526/* True for artificial decls added for OpenMP privatized non-static
4527 data members. */
4528#define DECL_OMP_PRIVATIZED_MEMBER(NODE) \
4529 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.anticipated_p)
4530
4531/* Nonzero if NODE is an artificial FUNCTION_DECL for
4532 #pragma omp declare reduction. */
4533#define DECL_OMP_DECLARE_REDUCTION_P(NODE) \
4534 (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->omp_declare_reduction_p)
4535
4536/* Nonzero if NODE is an artificial FUNCTION_DECL for
4537 #pragma omp declare mapper. */
4538#define DECL_OMP_DECLARE_MAPPER_P(NODE) \
4539 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.omp_declare_mapper_p)
4540
4541/* Nonzero if DECL has been declared threadprivate by
4542 #pragma omp threadprivate. */
4543#define CP_DECL_THREADPRIVATE_P(DECL) \
4544 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (DECL))->u.base.threadprivate_or_deleted_p)
4545
4546/* Nonzero if NODE is a VAR_DECL which has been declared inline. */
4547#define DECL_VAR_DECLARED_INLINE_P(NODE) \
4548 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE)) \
4549 ? DECL_LANG_SPECIFIC (NODE)->u.base.var_declared_inline_p \
4550 : false)
4551#define SET_DECL_VAR_DECLARED_INLINE_P(NODE) \
4552 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.var_declared_inline_p \
4553 = true)
4554
4555/* True if NODE is a constant variable with a value-dependent initializer. */
4556#define DECL_DEPENDENT_INIT_P(NODE) \
4557 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE)) \
4558 && DECL_LANG_SPECIFIC (NODE)->u.base.dependent_init_p)
4559#define SET_DECL_DEPENDENT_INIT_P(NODE, X) \
4560 (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.dependent_init_p = (X))
4561
4562/* Nonzero if NODE is an artificial VAR_DECL for a C++17 structured binding
4563 declaration or one of VAR_DECLs for the user identifiers in it. */
4564#define DECL_DECOMPOSITION_P(NODE) \
4565 (VAR_P (NODE) && DECL_LANG_SPECIFIC (NODE) \
4566 ? DECL_LANG_SPECIFIC (NODE)->u.base.selector == lds_decomp \
4567 : false)
4568
4569/* The underlying artificial VAR_DECL for structured binding. On the
4570 artificial base VAR_DECL this can be NULL, or integer_{zero,one}_node
4571 for structured binding used in if/while/for resp. switch conditions,
4572 or a TARGET_EXPR with the condition value after cp_finish_decomp in
4573 those cases. */
4574#define DECL_DECOMP_BASE(NODE) \
4575 (LANG_DECL_DECOMP_CHECK (NODE)->base)
4576
4577/* True for the artificial VAR_DECL for structured binding. */
4578#define DECL_DECOMP_IS_BASE(NODE) \
4579 (!DECL_DECOMP_BASE (NODE) || !VAR_P (DECL_DECOMP_BASE (NODE)))
4580
4581/* Nonzero if NODE is an inline VAR_DECL. In C++17, static data members
4582 declared with constexpr specifier are implicitly inline variables. */
4583#define DECL_INLINE_VAR_P(NODE) \
4584 (DECL_VAR_DECLARED_INLINE_P (NODE) \
4585 || (cxx_dialect >= cxx17 \
4586 && DECL_DECLARED_CONSTEXPR_P (NODE) \
4587 && DECL_CLASS_SCOPE_P (NODE)))
4588
4589/* Nonzero if DECL was declared with '= delete'.
4590 = delete("reason") is represented in addition to this flag by DECL_INITIAL
4591 being STRING_CST with the reason and TREE_TYPE of the STRING_CST the
4592 RID_DELETE IDENTIFIER_NODE. */
4593#define DECL_DELETED_FN(DECL) \
4594 (LANG_DECL_FN_CHECK (DECL)->min.base.threadprivate_or_deleted_p)
4595
4596/* Nonzero if DECL was declared with '= default' (maybe implicitly). */
4597#define DECL_DEFAULTED_FN(DECL) \
4598 (LANG_DECL_FN_CHECK (DECL)->defaulted_p)
4599
4600/* Nonzero if DECL is explicitly defaulted in the class body. */
4601#define DECL_DEFAULTED_IN_CLASS_P(DECL) \
4602 (DECL_DEFAULTED_FN (DECL) && DECL_INITIALIZED_IN_CLASS_P (DECL))
4603/* Nonzero if DECL was defaulted outside the class body. */
4604#define DECL_DEFAULTED_OUTSIDE_CLASS_P(DECL) \
4605 (DECL_DEFAULTED_FN (DECL) \
4606 && !(DECL_ARTIFICIAL (DECL) || DECL_INITIALIZED_IN_CLASS_P (DECL)))
4607
4608/* Record whether a typedef for type `int' was actually `signed int'. */
4609#define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
4610
4611/* Returns nonzero if DECL has external linkage, as specified by the
4612 language standard. (This predicate may hold even when the
4613 corresponding entity is not actually given external linkage in the
4614 object file; see decl_linkage for details.) */
4615#define DECL_EXTERNAL_LINKAGE_P(DECL) \
4616 (decl_linkage (DECL) == lk_external)
4617
4618/* Keep these codes in ascending code order. */
4619
4620#define INTEGRAL_CODE_P(CODE) \
4621 ((CODE) == ENUMERAL_TYPE \
4622 || (CODE) == BOOLEAN_TYPE \
4623 || (CODE) == INTEGER_TYPE)
4624
4625/* [basic.fundamental]
4626
4627 Types bool, char, wchar_t, and the signed and unsigned integer types
4628 are collectively called integral types.
4629
4630 Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration
4631 types as well, which is incorrect in C++. Keep these checks in
4632 ascending code order. */
4633#define CP_INTEGRAL_TYPE_P(TYPE) \
4634 (TREE_CODE (TYPE) == BOOLEAN_TYPE \
4635 || TREE_CODE (TYPE) == INTEGER_TYPE)
4636
4637/* Returns true if TYPE is an integral or enumeration name. Keep
4638 these checks in ascending code order. */
4639#define INTEGRAL_OR_ENUMERATION_TYPE_P(TYPE) \
4640 (TREE_CODE (TYPE) == ENUMERAL_TYPE || CP_INTEGRAL_TYPE_P (TYPE))
4641
4642/* Returns true if TYPE is an integral or unscoped enumeration type. */
4643#define INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P(TYPE) \
4644 (UNSCOPED_ENUM_P (TYPE) || CP_INTEGRAL_TYPE_P (TYPE))
4645
4646/* True if the class type TYPE is a literal type. */
4647#define CLASSTYPE_LITERAL_P(TYPE) \
4648 (LANG_TYPE_CLASS_CHECK (TYPE)->is_literal)
4649
4650/* [basic.fundamental]
4651
4652 Integral and floating types are collectively called arithmetic
4653 types.
4654
4655 As a GNU extension, we also accept complex types.
4656
4657 Keep these checks in ascending code order. */
4658#define ARITHMETIC_TYPE_P(TYPE) \
4659 (CP_INTEGRAL_TYPE_P (TYPE) \
4660 || SCALAR_FLOAT_TYPE_P (TYPE) \
4661 || TREE_CODE (TYPE) == COMPLEX_TYPE)
4662
4663/* [basic.types]
4664
4665 Arithmetic types, enumeration types, pointer types,
4666 pointer-to-member types, and std::nullptr_t are collectively called
4667 scalar types.
4668
4669 Keep these checks in ascending code order. */
4670#define SCALAR_TYPE_P(TYPE) \
4671 (TYPE_PTRDATAMEM_P (TYPE) \
4672 || TREE_CODE (TYPE) == ENUMERAL_TYPE \
4673 || ARITHMETIC_TYPE_P (TYPE) \
4674 || TYPE_PTR_P (TYPE) \
4675 || TYPE_PTRMEMFUNC_P (TYPE) \
4676 || NULLPTR_TYPE_P (TYPE))
4677
4678/* Determines whether this type is a C++0x scoped enumeration
4679 type. Scoped enumerations types are introduced via "enum class" or
4680 "enum struct", e.g.,
4681
4682 enum class Color {
4683 Red, Green, Blue
4684 };
4685
4686 Scoped enumeration types are different from normal (unscoped)
4687 enumeration types in several ways:
4688
4689 - The enumerators of a scoped enumeration type are only available
4690 within the scope of the enumeration type and not in the
4691 enclosing scope. For example, the Red color can be referred to
4692 with "Color::Red" but not "Red".
4693
4694 - Scoped enumerators and enumerations do not implicitly convert
4695 to integers or 'bool'.
4696
4697 - The underlying type of the enum is well-defined. */
4698#define SCOPED_ENUM_P(TYPE) \
4699 (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_SCOPED (TYPE))
4700
4701/* Determine whether this is an unscoped enumeration type. */
4702#define UNSCOPED_ENUM_P(TYPE) \
4703 (TREE_CODE (TYPE) == ENUMERAL_TYPE && !ENUM_IS_SCOPED (TYPE))
4704
4705/* Set the flag indicating whether an ENUMERAL_TYPE is a C++0x scoped
4706 enumeration type (1) or a normal (unscoped) enumeration type
4707 (0). */
4708#define SET_SCOPED_ENUM_P(TYPE, VAL) \
4709 (ENUM_IS_SCOPED (TYPE) = (VAL))
4710
4711#define SET_OPAQUE_ENUM_P(TYPE, VAL) \
4712 (ENUM_IS_OPAQUE (TYPE) = (VAL))
4713
4714#define OPAQUE_ENUM_P(TYPE) \
4715 (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_OPAQUE (TYPE))
4716
4717/* [dcl.init.aggr]
4718
4719 An aggregate is an array or a class with no user-provided
4720 constructors, no brace-or-equal-initializers for non-static data
4721 members, no private or protected non-static data members, no
4722 base classes, and no virtual functions.
4723
4724 As an extension, we also treat vectors as aggregates. Keep these
4725 checks in ascending code order. */
4726#define CP_AGGREGATE_TYPE_P(TYPE) \
4727 (gnu_vector_type_p (TYPE) \
4728 || TREE_CODE (TYPE) == ARRAY_TYPE \
4729 || (CLASS_TYPE_P (TYPE) && COMPLETE_TYPE_P (TYPE) && !CLASSTYPE_NON_AGGREGATE (TYPE)))
4730
4731/* Nonzero for a class type means that the class type has a
4732 user-declared constructor. */
4733#define TYPE_HAS_USER_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1 (NODE))
4734
4735/* Nonzero means that the FUNCTION_TYPE or METHOD_TYPE has a
4736 late-specified return type. */
4737#define TYPE_HAS_LATE_RETURN_TYPE(NODE) \
4738 (TYPE_LANG_FLAG_2 (FUNC_OR_METHOD_CHECK (NODE)))
4739
4740/* When appearing in an INDIRECT_REF, it means that the tree structure
4741 underneath is actually a call to a constructor. This is needed
4742 when the constructor must initialize local storage (which can
4743 be automatically destroyed), rather than allowing it to allocate
4744 space from the heap.
4745
4746 When appearing in a SAVE_EXPR, it means that underneath
4747 is a call to a constructor.
4748
4749 When appearing in a CONSTRUCTOR, the expression is an unconverted
4750 compound literal.
4751
4752 When appearing in a CALL_EXPR, it means that it is a call to
4753 a constructor.
4754
4755 When appearing in a FIELD_DECL, it means that this field
4756 has been duly initialized in its constructor. */
4757#define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4 (NODE))
4758
4759/* True if NODE is a brace-enclosed initializer. */
4760#define BRACE_ENCLOSED_INITIALIZER_P(NODE) \
4761 (TREE_CODE (NODE) == CONSTRUCTOR && TREE_TYPE (NODE) == init_list_type_node)
4762
4763/* True if NODE is a compound-literal, i.e., a brace-enclosed
4764 initializer cast to a particular type. This is mostly only set during
4765 template parsing; once the initializer has been digested into an actual
4766 value of the type, the expression is represented by a TARGET_EXPR. */
4767#define COMPOUND_LITERAL_P(NODE) \
4768 (TREE_CODE (NODE) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (NODE))
4769
4770#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \
4771 && vec_safe_is_empty(CONSTRUCTOR_ELTS(NODE))\
4772 && !TREE_HAS_CONSTRUCTOR (NODE))
4773
4774/* True if NODE is a init-list used as a direct-initializer, i.e.
4775 B b{1,2}, not B b({1,2}) or B b = {1,2}. */
4776#define CONSTRUCTOR_IS_DIRECT_INIT(NODE) (TREE_LANG_FLAG_0 (CONSTRUCTOR_CHECK (NODE)))
4777
4778/* True if this CONSTRUCTOR is instantiation-dependent and needs to be
4779 substituted. */
4780#define CONSTRUCTOR_IS_DEPENDENT(NODE) \
4781 (TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK (NODE)))
4782
4783/* True if this CONSTRUCTOR should not be used as a variable initializer
4784 because it was loaded from a constexpr variable with mutable fields. */
4785#define CONSTRUCTOR_MUTABLE_POISON(NODE) \
4786 (TREE_LANG_FLAG_2 (CONSTRUCTOR_CHECK (NODE)))
4787
4788/* True if this typed CONSTRUCTOR represents C99 compound-literal syntax rather
4789 than C++11 functional cast syntax. */
4790#define CONSTRUCTOR_C99_COMPOUND_LITERAL(NODE) \
4791 (TREE_LANG_FLAG_3 (CONSTRUCTOR_CHECK (NODE)))
4792
4793/* True if this CONSTRUCTOR contains PLACEHOLDER_EXPRs referencing the
4794 CONSTRUCTOR's type not nested inside another CONSTRUCTOR marked with
4795 CONSTRUCTOR_PLACEHOLDER_BOUNDARY. */
4796#define CONSTRUCTOR_PLACEHOLDER_BOUNDARY(NODE) \
4797 (TREE_LANG_FLAG_5 (CONSTRUCTOR_CHECK (NODE)))
4798
4799#define DIRECT_LIST_INIT_P(NODE) \
4800 (BRACE_ENCLOSED_INITIALIZER_P (NODE) && CONSTRUCTOR_IS_DIRECT_INIT (NODE))
4801
4802/* True if this is a designated initializer (when we allow initializer-clauses
4803 mixed with designated-initializer-clauses set whenever there is at least
4804 one designated-initializer-clause), or a C99 designator. */
4805#define CONSTRUCTOR_IS_DESIGNATED_INIT(NODE) \
4806 (TREE_LANG_FLAG_6 (CONSTRUCTOR_CHECK (NODE)))
4807
4808/* True if this CONSTRUCTOR comes from a parenthesized list of values, e.g.
4809 A(1, 2, 3). */
4810#define CONSTRUCTOR_IS_PAREN_INIT(NODE) \
4811 (CONSTRUCTOR_CHECK(NODE)->base.private_flag)
4812
4813/* True if reshape_init built this sub-CONSTRUCTOR to undo the brace elision
4814 of the original CONSTRUCTOR. This flag is used during C++20 aggregate
4815 CTAD. */
4816#define CONSTRUCTOR_BRACES_ELIDED_P(NODE) \
4817 (CONSTRUCTOR_CHECK (NODE)->base.protected_flag)
4818
4819/* True if NODE represents a conversion for direct-initialization in a
4820 template. Set by perform_implicit_conversion_flags. */
4821#define IMPLICIT_CONV_EXPR_DIRECT_INIT(NODE) \
4822 (TREE_LANG_FLAG_0 (IMPLICIT_CONV_EXPR_CHECK (NODE)))
4823
4824/* True if NODE represents a dependent conversion of a non-type template
4825 argument. Set by maybe_convert_nontype_argument. */
4826#define IMPLICIT_CONV_EXPR_NONTYPE_ARG(NODE) \
4827 (TREE_LANG_FLAG_1 (IMPLICIT_CONV_EXPR_CHECK (NODE)))
4828
4829/* True if NODE represents a conversion for braced-init-list in a
4830 template. Set by perform_implicit_conversion_flags. */
4831#define IMPLICIT_CONV_EXPR_BRACED_INIT(NODE) \
4832 (TREE_LANG_FLAG_2 (IMPLICIT_CONV_EXPR_CHECK (NODE)))
4833
4834/* True if NODE represents a conversion forced to be represented in
4835 maybe_convert_nontype_argument, i.e. for an alias template. */
4836#define IMPLICIT_CONV_EXPR_FORCED(NODE) \
4837 (TREE_LANG_FLAG_3 (IMPLICIT_CONV_EXPR_CHECK (NODE)))
4838
4839/* Nonzero means that an object of this type cannot be initialized using
4840 an initializer list. */
4841#define CLASSTYPE_NON_AGGREGATE(NODE) \
4842 (LANG_TYPE_CLASS_CHECK (NODE)->non_aggregate)
4843#define TYPE_NON_AGGREGATE_CLASS(NODE) \
4844 (CLASS_TYPE_P (NODE) && CLASSTYPE_NON_AGGREGATE (NODE))
4845
4846/* Nonzero if there is a non-trivial X::op=(cv X&) for this class. */
4847#define TYPE_HAS_COMPLEX_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_assign)
4848
4849/* Nonzero if there is a non-trivial X::X(cv X&) for this class. */
4850#define TYPE_HAS_COMPLEX_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_ctor)
4851
4852/* Nonzero if there is a non-trivial X::op=(X&&) for this class. */
4853#define TYPE_HAS_COMPLEX_MOVE_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_assign)
4854
4855/* Nonzero if there is a non-trivial X::X(X&&) for this class. */
4856#define TYPE_HAS_COMPLEX_MOVE_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_ctor)
4857
4858/* Nonzero if there is no trivial default constructor for this class. */
4859#define TYPE_HAS_COMPLEX_DFLT(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_dflt)
4860
4861/* Nonzero if TYPE has a trivial destructor. From [class.dtor]:
4862
4863 A destructor is trivial if it is an implicitly declared
4864 destructor and if:
4865
4866 - all of the direct base classes of its class have trivial
4867 destructors,
4868
4869 - for all of the non-static data members of its class that are
4870 of class type (or array thereof), each such class has a
4871 trivial destructor. */
4872#define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \
4873 (!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE))
4874
4875/* Nonzero for _TYPE node means that this type does not have a trivial
4876 destructor. Therefore, destroying an object of this type will
4877 involve a call to a destructor. This can apply to objects of
4878 ARRAY_TYPE if the type of the elements needs a destructor. */
4879#define TYPE_HAS_NONTRIVIAL_DESTRUCTOR(NODE) \
4880 (TYPE_LANG_FLAG_4 (NODE))
4881
4882/* Nonzero for class type means that the default constructor is trivial. */
4883#define TYPE_HAS_TRIVIAL_DFLT(NODE) \
4884 (TYPE_HAS_DEFAULT_CONSTRUCTOR (NODE) && ! TYPE_HAS_COMPLEX_DFLT (NODE))
4885
4886/* Nonzero for class type means that copy initialization of this type can use
4887 a bitwise copy. */
4888#define TYPE_HAS_TRIVIAL_COPY_CTOR(NODE) \
4889 (TYPE_HAS_COPY_CTOR (NODE) && ! TYPE_HAS_COMPLEX_COPY_CTOR (NODE))
4890
4891/* Nonzero for class type means that assignment of this type can use
4892 a bitwise copy. */
4893#define TYPE_HAS_TRIVIAL_COPY_ASSIGN(NODE) \
4894 (TYPE_HAS_COPY_ASSIGN (NODE) && ! TYPE_HAS_COMPLEX_COPY_ASSIGN (NODE))
4895
4896/* Returns true if NODE is a pointer-to-data-member. */
4897#define TYPE_PTRDATAMEM_P(NODE) \
4898 (TREE_CODE (NODE) == OFFSET_TYPE)
4899
4900/* Returns true if NODE is a pointer. */
4901#define TYPE_PTR_P(NODE) \
4902 (TREE_CODE (NODE) == POINTER_TYPE)
4903
4904/* Returns true if NODE is a reference. */
4905#define TYPE_REF_P(NODE) \
4906 (TREE_CODE (NODE) == REFERENCE_TYPE)
4907
4908/* Returns true if NODE is a pointer or a reference. */
4909#define INDIRECT_TYPE_P(NODE) \
4910 (TYPE_PTR_P (NODE) || TYPE_REF_P (NODE))
4911
4912/* Returns true if NODE is an object type:
4913
4914 [basic.types]
4915
4916 An object type is a (possibly cv-qualified) type that is not a
4917 function type, not a reference type, and not a void type.
4918
4919 Keep these checks in ascending order, for speed. */
4920#define TYPE_OBJ_P(NODE) \
4921 (!TYPE_REF_P (NODE) \
4922 && !VOID_TYPE_P (NODE) \
4923 && !FUNC_OR_METHOD_TYPE_P (NODE))
4924
4925/* Returns true if NODE is a pointer to an object. Keep these checks
4926 in ascending tree code order. */
4927#define TYPE_PTROB_P(NODE) \
4928 (TYPE_PTR_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE)))
4929
4930/* Returns true if NODE is a reference to an object. Keep these checks
4931 in ascending tree code order. */
4932#define TYPE_REF_OBJ_P(NODE) \
4933 (TYPE_REF_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE)))
4934
4935/* Returns true if NODE is a pointer to an object, or a pointer to
4936 void. Keep these checks in ascending tree code order. */
4937#define TYPE_PTROBV_P(NODE) \
4938 (TYPE_PTR_P (NODE) \
4939 && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (NODE)))
4940
4941/* Returns true if NODE is a pointer to function type. */
4942#define TYPE_PTRFN_P(NODE) \
4943 (TYPE_PTR_P (NODE) \
4944 && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
4945
4946/* Returns true if NODE is a reference to function type. */
4947#define TYPE_REFFN_P(NODE) \
4948 (TYPE_REF_P (NODE) \
4949 && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
4950
4951/* Returns true if NODE is a pointer to member function type. */
4952#define TYPE_PTRMEMFUNC_P(NODE) \
4953 (TREE_CODE (NODE) == RECORD_TYPE \
4954 && TYPE_PTRMEMFUNC_FLAG (NODE))
4955
4956#define TYPE_PTRMEMFUNC_FLAG(NODE) \
4957 (TYPE_LANG_FLAG_2 (RECORD_TYPE_CHECK (NODE)))
4958
4959/* Returns true if NODE is a pointer-to-member. */
4960#define TYPE_PTRMEM_P(NODE) \
4961 (TYPE_PTRDATAMEM_P (NODE) || TYPE_PTRMEMFUNC_P (NODE))
4962
4963/* Returns true if NODE is a pointer or a pointer-to-member. */
4964#define TYPE_PTR_OR_PTRMEM_P(NODE) \
4965 (TYPE_PTR_P (NODE) || TYPE_PTRMEM_P (NODE))
4966
4967/* Indicates when overload resolution may resolve to a pointer to
4968 member function. [expr.unary.op]/3 */
4969#define PTRMEM_OK_P(NODE) \
4970 TREE_LANG_FLAG_0 (TREE_CHECK3 ((NODE), ADDR_EXPR, OFFSET_REF, SCOPE_REF))
4971
4972/* True if this ADDR_EXPR denotes a function call; that is, it's
4973 fn() rather than &fn. */
4974#define ADDR_EXPR_DENOTES_CALL_P(NODE) \
4975 (ADDR_EXPR_CHECK(NODE)->base.protected_flag)
4976
4977/* Get the POINTER_TYPE to the METHOD_TYPE associated with this
4978 pointer to member function. TYPE_PTRMEMFUNC_P _must_ be true,
4979 before using this macro. */
4980#define TYPE_PTRMEMFUNC_FN_TYPE(NODE) \
4981 (cp_build_qualified_type (TREE_TYPE (TYPE_FIELDS (NODE)),\
4982 cp_type_quals (NODE)))
4983
4984/* As above, but can be used in places that want an lvalue at the expense
4985 of not necessarily having the correct cv-qualifiers. */
4986#define TYPE_PTRMEMFUNC_FN_TYPE_RAW(NODE) \
4987 (TREE_TYPE (TYPE_FIELDS (NODE)))
4988
4989/* Returns `A' for a type like `int (A::*)(double)' */
4990#define TYPE_PTRMEMFUNC_OBJECT_TYPE(NODE) \
4991 TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE)))
4992
4993/* The canonical internal RECORD_TYPE from the POINTER_TYPE to
4994 METHOD_TYPE. */
4995#define TYPE_PTRMEMFUNC_TYPE(NODE) \
4996 TYPE_LANG_SLOT_1 (NODE)
4997
4998/* For a pointer-to-member type of the form `T X::*', this is `X'.
4999 For a type like `void (X::*)() const', this type is `X', not `const
5000 X'. To get at the `const X' you have to look at the
5001 TYPE_PTRMEM_POINTED_TO_TYPE; there, the first parameter will have
5002 type `const X*'. */
5003#define TYPE_PTRMEM_CLASS_TYPE(NODE) \
5004 (TYPE_PTRDATAMEM_P (NODE) \
5005 ? TYPE_OFFSET_BASETYPE (NODE) \
5006 : TYPE_PTRMEMFUNC_OBJECT_TYPE (NODE))
5007
5008/* For a pointer-to-member type of the form `T X::*', this is `T'. */
5009#define TYPE_PTRMEM_POINTED_TO_TYPE(NODE) \
5010 (TYPE_PTRDATAMEM_P (NODE) \
5011 ? TREE_TYPE (NODE) \
5012 : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE)))
5013
5014/* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for
5015 `X'. */
5016#define PTRMEM_CST_CLASS(NODE) \
5017 TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (PTRMEM_CST_CHECK (NODE)))
5018
5019/* For a pointer-to-member constant `X::Y' this is the _DECL for
5020 `Y'. */
5021#define PTRMEM_CST_MEMBER(NODE) \
5022 (((ptrmem_cst_t)PTRMEM_CST_CHECK (NODE))->member)
5023
5024/* For a pointer-to-member constant `X::Y' this is a location where
5025 the address of the member has been taken. */
5026#define PTRMEM_CST_LOCATION(NODE) \
5027 (((ptrmem_cst_t)PTRMEM_CST_CHECK (NODE))->locus)
5028
5029/* The expression in question for a TYPEOF_TYPE. */
5030#define TYPEOF_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (TYPEOF_TYPE_CHECK (NODE)))
5031
5032/* The type in question for an UNDERLYING_TYPE. */
5033#define UNDERLYING_TYPE_TYPE(NODE) \
5034 (TYPE_VALUES_RAW (UNDERLYING_TYPE_CHECK (NODE)))
5035
5036/* The type in question for BASES. */
5037#define BASES_TYPE(NODE) \
5038 (TYPE_VALUES_RAW (BASES_CHECK (NODE)))
5039
5040#define BASES_DIRECT(NODE) \
5041 TREE_LANG_FLAG_0 (BASES_CHECK (NODE))
5042
5043/* The expression in question for a DECLTYPE_TYPE. */
5044#define DECLTYPE_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (DECLTYPE_TYPE_CHECK (NODE)))
5045
5046/* Whether the DECLTYPE_TYPE_EXPR of NODE was originally parsed as an
5047 id-expression or a member-access expression. When false, it was
5048 parsed as a full expression. */
5049#define DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P(NODE) \
5050 (DECLTYPE_TYPE_CHECK (NODE))->type_common.string_flag
5051
5052/* These flags indicate that we want different semantics from normal
5053 decltype: lambda capture just drops references,
5054 lambda proxies look through implicit dereference. */
5055#define DECLTYPE_FOR_LAMBDA_CAPTURE(NODE) \
5056 TREE_LANG_FLAG_0 (DECLTYPE_TYPE_CHECK (NODE))
5057#define DECLTYPE_FOR_LAMBDA_PROXY(NODE) \
5058 TREE_LANG_FLAG_2 (DECLTYPE_TYPE_CHECK (NODE))
5059#define DECLTYPE_FOR_REF_CAPTURE(NODE) \
5060 TREE_LANG_FLAG_3 (DECLTYPE_TYPE_CHECK (NODE))
5061
5062/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `extern' was
5063 specified in its declaration. This can also be set for an
5064 erroneously declared PARM_DECL. */
5065#define DECL_THIS_EXTERN(NODE) \
5066 DECL_LANG_FLAG_2 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
5067
5068/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `static' was
5069 specified in its declaration. This can also be set for an
5070 erroneously declared PARM_DECL. */
5071#define DECL_THIS_STATIC(NODE) \
5072 DECL_LANG_FLAG_6 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
5073
5074/* Nonzero for FIELD_DECL node means that this field is a lambda capture
5075 field for an array of runtime bound. */
5076#define DECL_VLA_CAPTURE_P(NODE) \
5077 DECL_LANG_FLAG_1 (FIELD_DECL_CHECK (NODE))
5078
5079/* Nonzero for PARM_DECL node means that this is an array function
5080 parameter, i.e, a[] rather than *a. */
5081#define DECL_ARRAY_PARAMETER_P(NODE) \
5082 DECL_LANG_FLAG_1 (PARM_DECL_CHECK (NODE))
5083
5084/* Nonzero for a FIELD_DECL who's NSMDI is currently being
5085 instantiated. */
5086#define DECL_INSTANTIATING_NSDMI_P(NODE) \
5087 DECL_LANG_FLAG_2 (FIELD_DECL_CHECK (NODE))
5088
5089/* Nonzero for FIELD_DECL node means that this field is a base class
5090 of the parent object, as opposed to a member field. */
5091#define DECL_FIELD_IS_BASE(NODE) \
5092 DECL_LANG_FLAG_6 (FIELD_DECL_CHECK (NODE))
5093
5094/* Nonzero for FIELD_DECL node means that this field is a simple (no
5095 explicit initializer) lambda capture field, making it invisible to
5096 name lookup in unevaluated contexts. */
5097#define DECL_NORMAL_CAPTURE_P(NODE) \
5098 DECL_LANG_FLAG_7 (FIELD_DECL_CHECK (NODE))
5099
5100/* Nonzero if TYPE is an anonymous union or struct type. We have to use a
5101 flag for this because "A union for which objects or pointers are
5102 declared is not an anonymous union" [class.union]. */
5103#define ANON_AGGR_TYPE_P(NODE) \
5104 (CLASS_TYPE_P (NODE) && LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr)
5105#define SET_ANON_AGGR_TYPE_P(NODE) \
5106 (LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr = 1)
5107
5108/* Nonzero if TYPE is an anonymous union type. */
5109#define ANON_UNION_TYPE_P(NODE) \
5110 (TREE_CODE (NODE) == UNION_TYPE && ANON_AGGR_TYPE_P (NODE))
5111
5112/* For an ANON_AGGR_TYPE_P the single FIELD_DECL it is used with. */
5113#define ANON_AGGR_TYPE_FIELD(NODE) \
5114 (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var)
5115
5116/* Define fields and accessors for nodes representing declared names. */
5117
5118/* True if TYPE is an unnamed structured type with a typedef for
5119 linkage purposes. In that case TYPE_NAME and TYPE_STUB_DECL of the
5120 MAIN-VARIANT are different. */
5121#define TYPE_WAS_UNNAMED(NODE) \
5122 (TYPE_NAME (TYPE_MAIN_VARIANT (NODE)) \
5123 != TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
5124
5125/* C++: all of these are overloaded! These apply only to TYPE_DECLs. */
5126
5127/* The format of each node in the DECL_FRIENDLIST is as follows:
5128
5129 The TREE_PURPOSE will be the name of a function, i.e., an
5130 IDENTIFIER_NODE. The TREE_VALUE will be itself a TREE_LIST, whose
5131 TREE_VALUEs are friends with the given name. */
5132#define DECL_FRIENDLIST(NODE) (DECL_INITIAL (NODE))
5133#define FRIEND_NAME(LIST) (TREE_PURPOSE (LIST))
5134#define FRIEND_DECLS(LIST) (TREE_VALUE (LIST))
5135
5136/* The DECL_ACCESS, if non-NULL, is a TREE_LIST. The TREE_PURPOSE of
5137 each node is a type; the TREE_VALUE is the access granted for this
5138 DECL in that type. The DECL_ACCESS is set by access declarations.
5139 For example, if a member that would normally be public in a
5140 derived class is made protected, then the derived class and the
5141 protected_access_node will appear in the DECL_ACCESS for the node. */
5142#define DECL_ACCESS(NODE) (LANG_DECL_MIN_CHECK (NODE)->access)
5143
5144/* Nonzero if the FUNCTION_DECL is a global constructor. */
5145#define DECL_GLOBAL_CTOR_P(NODE) \
5146 (LANG_DECL_FN_CHECK (NODE)->global_ctor_p)
5147
5148/* Nonzero if the FUNCTION_DECL is a global destructor. */
5149#define DECL_GLOBAL_DTOR_P(NODE) \
5150 (LANG_DECL_FN_CHECK (NODE)->global_dtor_p)
5151
5152/* Accessor macros for C++ template decl nodes. */
5153
5154/* The DECL_TEMPLATE_PARMS are a list. The TREE_PURPOSE of each node
5155 is a INT_CST whose TREE_INT_CST_LOW indicates the level of the
5156 template parameters, with 1 being the outermost set of template
5157 parameters. The TREE_TYPE is TEMPLATE_PARMS_CONSTRAINTS.
5158 The TREE_VALUE is a vector, whose elements are the
5159 template parameters at each level. Each element in the vector is a
5160 TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a
5161 non-type parameter), or a TYPE_DECL (if the parameter is a type
5162 parameter) or a TEMPLATE_DECL (if the parameter is a template
5163 parameter). The TREE_PURPOSE is the default value, if any.
5164 The TREE_TYPE is TEMPLATE_PARM_CONSTRAINTS. The
5165 TEMPLATE_PARM_INDEX for the parameter is available as the
5166 DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a
5167 TYPE_DECL).
5168
5169 FIXME: CONST_CAST_TREE is a hack that hopefully will go away after
5170 tree is converted to C++ class hiearchy. */
5171#define DECL_TEMPLATE_PARMS(NODE) \
5172 ((struct tree_template_decl *)CONST_CAST_TREE (TEMPLATE_DECL_CHECK (NODE)))->arguments
5173#define DECL_INNERMOST_TEMPLATE_PARMS(NODE) \
5174 INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (NODE))
5175#define DECL_NTPARMS(NODE) \
5176 TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (NODE))
5177/* For function, method, class-data templates.
5178
5179 FIXME: CONST_CAST_TREE is a hack that hopefully will go away after
5180 tree is converted to C++ class hiearchy. */
5181#define DECL_TEMPLATE_RESULT(NODE) \
5182 ((struct tree_template_decl *)CONST_CAST_TREE(TEMPLATE_DECL_CHECK (NODE)))->result
5183/* For a forward-declared function template at namespace scope, or for any
5184 function template in an exporting module, DECL_TEMPLATE_INSTANTIATIONS lists
5185 all instantiations and specializations of the function so that
5186 tsubst_friend_function can reassign them to another template if we find that
5187 the namespace-scope template is really a partial instantiation of a friend
5188 template.
5189
5190 For a class or variable template the DECL_TEMPLATE_INSTANTIATIONS lists
5191 holds all instantiations and specializations, including partial
5192 instantiations and partial specializations, so that if we explicitly
5193 specialize a partial instantiation we can walk the list in
5194 maybe_process_partial_specialization and reassign them or complain as
5195 appropriate.
5196
5197 In both cases, the TREE_PURPOSE of each node contains the arguments
5198 used; the TREE_VALUE contains the generated variable. The template
5199 arguments are always complete. For example, given:
5200
5201 template <class T> struct S1 {
5202 template <class U> struct S2 {};
5203 template <class U> struct S2<U*> {};
5204 };
5205
5206 the record for the partial specialization will contain, as its
5207 argument list, { {T}, {U*} }, and will be on the
5208 DECL_TEMPLATE_INSTANTIATIONS list for `template <class T> template
5209 <class U> struct S1<T>::S2'.
5210
5211 This list is not used for other templates. */
5212#define DECL_TEMPLATE_INSTANTIATIONS(NODE) \
5213 DECL_SIZE_UNIT (TEMPLATE_DECL_CHECK (NODE))
5214
5215/* For a class template, this list contains the partial
5216 specializations of this template. (Full specializations are not
5217 recorded on this list.) The TREE_PURPOSE holds the arguments used
5218 in the partial specialization (e.g., for `template <class T> struct
5219 S<T*, int>' this will be `T*, int'.) The arguments will also include
5220 any outer template arguments. The TREE_VALUE holds the TEMPLATE_DECL
5221 for the partial specialization. The TREE_TYPE is the _TYPE node for
5222 the partial specialization.
5223
5224 This list is not used for other templates. */
5225#define DECL_TEMPLATE_SPECIALIZATIONS(NODE) \
5226 DECL_SIZE (TEMPLATE_DECL_CHECK (NODE))
5227
5228/* Nonzero for a DECL which is actually a template parameter. Keep
5229 these checks in ascending tree code order. */
5230#define DECL_TEMPLATE_PARM_P(NODE) \
5231 (DECL_LANG_FLAG_0 (NODE) \
5232 && (TREE_CODE (NODE) == CONST_DECL \
5233 || TREE_CODE (NODE) == PARM_DECL \
5234 || TREE_CODE (NODE) == TYPE_DECL \
5235 || TREE_CODE (NODE) == TEMPLATE_DECL))
5236
5237#if ENABLE_TREE_CHECKING
5238inline tree
5239decl_template_parm_check (const_tree t, const char *f, int l, const char *fn)
5240{
5241 if (!DECL_TEMPLATE_PARM_P (t))
5242 tree_check_failed (t, f, l, fn, 0);
5243 return const_cast<tree>(t);
5244}
5245#endif
5246
5247/* Nonzero for a raw template parameter node. */
5248#define TEMPLATE_PARM_P(NODE) \
5249 (TREE_CODE (NODE) == TEMPLATE_TYPE_PARM \
5250 || TREE_CODE (NODE) == TEMPLATE_TEMPLATE_PARM \
5251 || TREE_CODE (NODE) == TEMPLATE_PARM_INDEX)
5252
5253/* Mark NODE as a template parameter. */
5254#define SET_DECL_TEMPLATE_PARM_P(NODE) \
5255 (DECL_LANG_FLAG_0 (NODE) = 1)
5256
5257/* Nonzero if NODE is a template template parameter. */
5258#define DECL_TEMPLATE_TEMPLATE_PARM_P(NODE) \
5259 (TREE_CODE (NODE) == TEMPLATE_DECL && DECL_TEMPLATE_PARM_P (NODE))
5260
5261/* Nonzero for a DECL that represents a function template. */
5262#define DECL_FUNCTION_TEMPLATE_P(NODE) \
5263 (TREE_CODE (NODE) == TEMPLATE_DECL \
5264 && DECL_TEMPLATE_RESULT (NODE) != NULL_TREE \
5265 && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == FUNCTION_DECL)
5266
5267/* Nonzero for a DECL that represents a class template or alias
5268 template. */
5269#define DECL_TYPE_TEMPLATE_P(NODE) \
5270 (TREE_CODE (NODE) == TEMPLATE_DECL \
5271 && DECL_TEMPLATE_RESULT (NODE) != NULL_TREE \
5272 && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == TYPE_DECL)
5273
5274/* Nonzero for a DECL that represents a class template. */
5275#define DECL_CLASS_TEMPLATE_P(NODE) \
5276 (DECL_TYPE_TEMPLATE_P (NODE) \
5277 && DECL_IMPLICIT_TYPEDEF_P (DECL_TEMPLATE_RESULT (NODE)))
5278
5279/* Nonzero for a TEMPLATE_DECL that represents an alias template. */
5280#define DECL_ALIAS_TEMPLATE_P(NODE) \
5281 (DECL_TYPE_TEMPLATE_P (NODE) \
5282 && !DECL_ARTIFICIAL (DECL_TEMPLATE_RESULT (NODE)))
5283
5284/* Nonzero for a NODE which declares a type. */
5285#define DECL_DECLARES_TYPE_P(NODE) \
5286 (TREE_CODE (NODE) == TYPE_DECL || DECL_TYPE_TEMPLATE_P (NODE))
5287
5288/* Nonzero if NODE declares a function. */
5289#define DECL_DECLARES_FUNCTION_P(NODE) \
5290 (TREE_CODE (NODE) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (NODE))
5291
5292/* Nonzero if NODE is the typedef implicitly generated for a type when
5293 the type is declared. In C++, `struct S {};' is roughly
5294 equivalent to `struct S {}; typedef struct S S;' in C.
5295 DECL_IMPLICIT_TYPEDEF_P will hold for the typedef indicated in this
5296 example. In C++, there is a second implicit typedef for each
5297 class, called the injected-class-name, in the scope of `S' itself, so that
5298 you can say `S::S'. DECL_SELF_REFERENCE_P will hold for that typedef. */
5299#define DECL_IMPLICIT_TYPEDEF_P(NODE) \
5300 (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_2 (NODE))
5301#define SET_DECL_IMPLICIT_TYPEDEF_P(NODE) \
5302 (DECL_LANG_FLAG_2 (NODE) = 1)
5303#define DECL_SELF_REFERENCE_P(NODE) \
5304 (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_4 (NODE))
5305#define SET_DECL_SELF_REFERENCE_P(NODE) \
5306 (DECL_LANG_FLAG_4 (NODE) = 1)
5307
5308/* A `primary' template is one that has its own template header and is not
5309 a partial specialization. A member function of a class template is a
5310 template, but not primary. A member template is primary. Friend
5311 templates are primary, too. */
5312
5313/* Returns the primary template corresponding to these parameters. */
5314#define TPARMS_PRIMARY_TEMPLATE(NODE) (TREE_TYPE (TREE_VEC_CHECK (NODE)))
5315
5316#define DECL_PRIMARY_TEMPLATE(NODE) \
5317 (TPARMS_PRIMARY_TEMPLATE (DECL_INNERMOST_TEMPLATE_PARMS (NODE)))
5318
5319/* Returns nonzero if NODE is a primary template. */
5320#define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == (NODE))
5321
5322/* Nonzero iff NODE is a specialization of a template. The value
5323 indicates the type of specializations:
5324
5325 1=implicit instantiation
5326
5327 2=partial or explicit specialization, e.g.:
5328
5329 template <> int min<int> (int, int),
5330
5331 3=explicit instantiation, e.g.:
5332
5333 template int min<int> (int, int);
5334
5335 Note that NODE will be marked as a specialization even if the
5336 template it is instantiating is not a primary template. For
5337 example, given:
5338
5339 template <typename T> struct O {
5340 void f();
5341 struct I {};
5342 };
5343
5344 both O<int>::f and O<int>::I will be marked as instantiations.
5345
5346 If DECL_USE_TEMPLATE is nonzero, then DECL_TEMPLATE_INFO will also
5347 be non-NULL. */
5348#define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC (NODE)->u.base.use_template)
5349
5350/* Like DECL_USE_TEMPLATE, but for class types. */
5351#define CLASSTYPE_USE_TEMPLATE(NODE) \
5352 (LANG_TYPE_CLASS_CHECK (NODE)->use_template)
5353
5354/* True if NODE is a specialization of a primary template. */
5355#define CLASSTYPE_SPECIALIZATION_OF_PRIMARY_TEMPLATE_P(NODE) \
5356 (CLASS_TYPE_P (NODE) \
5357 && CLASSTYPE_USE_TEMPLATE (NODE) \
5358 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE)))
5359
5360#define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1)
5361#define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \
5362 (CLASSTYPE_USE_TEMPLATE (NODE) & 1)
5363
5364#define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2)
5365#define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2)
5366
5367/* Returns true for an explicit or partial specialization of a class
5368 template. */
5369#define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
5370 (CLASSTYPE_USE_TEMPLATE (NODE) == 2)
5371#define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
5372 (CLASSTYPE_USE_TEMPLATE (NODE) = 2)
5373
5374#define DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 1)
5375#define SET_DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 1)
5376#define CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \
5377 (CLASSTYPE_USE_TEMPLATE (NODE) == 1)
5378#define SET_CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \
5379 (CLASSTYPE_USE_TEMPLATE (NODE) = 1)
5380
5381#define DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 3)
5382#define SET_DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 3)
5383#define CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
5384 (CLASSTYPE_USE_TEMPLATE (NODE) == 3)
5385#define SET_CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
5386 (CLASSTYPE_USE_TEMPLATE (NODE) = 3)
5387
5388/* Nonzero if DECL is a friend function which is an instantiation
5389 from the point of view of the compiler, but not from the point of
5390 view of the language. For example given:
5391 template <class T> struct S { friend void f(T) {}; };
5392 the declaration of `void f(int)' generated when S<int> is
5393 instantiated will not be a DECL_TEMPLATE_INSTANTIATION, but will be
5394 a DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION. */
5395#define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \
5396 (DECL_LANG_SPECIFIC (DECL) && DECL_TEMPLATE_INFO (DECL) \
5397 && !DECL_USE_TEMPLATE (DECL))
5398
5399/* Nonzero if DECL is a function generated from a function 'temploid',
5400 i.e. template, member of class template, or dependent friend. */
5401#define DECL_TEMPLOID_INSTANTIATION(DECL) \
5402 (DECL_TEMPLATE_INSTANTIATION (DECL) \
5403 || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (DECL))
5404
5405/* Nonzero if DECL is either defined implicitly by the compiler or
5406 generated from a temploid. */
5407#define DECL_GENERATED_P(DECL) \
5408 (DECL_TEMPLOID_INSTANTIATION (DECL) || DECL_DEFAULTED_FN (DECL))
5409
5410/* Nonzero iff we are currently processing a declaration for an
5411 entity with its own template parameter list, and which is not a
5412 full specialization. */
5413#define PROCESSING_REAL_TEMPLATE_DECL_P() \
5414 (!processing_template_parmlist \
5415 && current_template_depth > template_class_depth (current_scope ()))
5416
5417/* Nonzero if this VAR_DECL or FUNCTION_DECL has already been
5418 instantiated, i.e. its definition has been generated from the
5419 pattern given in the template. */
5420#define DECL_TEMPLATE_INSTANTIATED(NODE) \
5421 DECL_LANG_FLAG_1 (VAR_OR_FUNCTION_DECL_CHECK (NODE))
5422
5423/* We know what we're doing with this decl now. */
5424#define DECL_INTERFACE_KNOWN(NODE) DECL_LANG_FLAG_5 (NODE)
5425
5426/* DECL_EXTERNAL must be set on a decl until the decl is actually emitted,
5427 so that assemble_external will work properly. So we have this flag to
5428 tell us whether the decl is really not external.
5429
5430 This flag does not indicate whether or not the decl is defined in the
5431 current translation unit; it indicates whether or not we should emit the
5432 decl at the end of compilation if it is defined and needed. */
5433#define DECL_NOT_REALLY_EXTERN(NODE) \
5434 (DECL_LANG_SPECIFIC (NODE)->u.base.not_really_extern)
5435
5436#define DECL_REALLY_EXTERN(NODE) \
5437 (DECL_EXTERNAL (NODE) \
5438 && (!DECL_LANG_SPECIFIC (NODE) || !DECL_NOT_REALLY_EXTERN (NODE)))
5439
5440/* A thunk is a stub function.
5441
5442 A thunk is an alternate entry point for an ordinary FUNCTION_DECL.
5443 The address of the ordinary FUNCTION_DECL is given by the
5444 DECL_INITIAL, which is always an ADDR_EXPR whose operand is a
5445 FUNCTION_DECL. The job of the thunk is to either adjust the this
5446 pointer before transferring control to the FUNCTION_DECL, or call
5447 FUNCTION_DECL and then adjust the result value. Note, the result
5448 pointer adjusting thunk must perform a call to the thunked
5449 function, (or be implemented via passing some invisible parameter
5450 to the thunked function, which is modified to perform the
5451 adjustment just before returning).
5452
5453 A thunk may perform either, or both, of the following operations:
5454
5455 o Adjust the this or result pointer by a constant offset.
5456 o Adjust the this or result pointer by looking up a vcall or vbase offset
5457 in the vtable.
5458
5459 A this pointer adjusting thunk converts from a base to a derived
5460 class, and hence adds the offsets. A result pointer adjusting thunk
5461 converts from a derived class to a base, and hence subtracts the
5462 offsets. If both operations are performed, then the constant
5463 adjustment is performed first for this pointer adjustment and last
5464 for the result pointer adjustment.
5465
5466 The constant adjustment is given by THUNK_FIXED_OFFSET. If the
5467 vcall or vbase offset is required, THUNK_VIRTUAL_OFFSET is
5468 used. For this pointer adjusting thunks, it is the vcall offset
5469 into the vtable. For result pointer adjusting thunks it is the
5470 binfo of the virtual base to convert to. Use that binfo's vbase
5471 offset.
5472
5473 It is possible to have equivalent covariant thunks. These are
5474 distinct virtual covariant thunks whose vbase offsets happen to
5475 have the same value. THUNK_ALIAS is used to pick one as the
5476 canonical thunk, which will get all the this pointer adjusting
5477 thunks attached to it. */
5478
5479/* An integer indicating how many bytes should be subtracted from the
5480 this or result pointer when this function is called. */
5481#define THUNK_FIXED_OFFSET(DECL) \
5482 (DECL_LANG_SPECIFIC (THUNK_FUNCTION_CHECK (DECL))->u.fn.u5.fixed_offset)
5483
5484/* A tree indicating how to perform the virtual adjustment. For a this
5485 adjusting thunk it is the number of bytes to be added to the vtable
5486 to find the vcall offset. For a result adjusting thunk, it is the
5487 binfo of the relevant virtual base. If NULL, then there is no
5488 virtual adjust. (The vptr is always located at offset zero from
5489 the this or result pointer.) (If the covariant type is within the
5490 class hierarchy being laid out, the vbase index is not yet known
5491 at the point we need to create the thunks, hence the need to use
5492 binfos.) */
5493
5494#define THUNK_VIRTUAL_OFFSET(DECL) \
5495 (LANG_DECL_MIN_CHECK (FUNCTION_DECL_CHECK (DECL))->access)
5496
5497/* A thunk which is equivalent to another thunk. */
5498#define THUNK_ALIAS(DECL) \
5499 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->u.min.template_info)
5500
5501/* For thunk NODE, this is the FUNCTION_DECL thunked to. It is
5502 possible for the target to be a thunk too. */
5503#define THUNK_TARGET(NODE) \
5504 (LANG_DECL_FN_CHECK (NODE)->befriending_classes)
5505
5506/* True for a SCOPE_REF iff the "template" keyword was used to
5507 indicate that the qualified name denotes a template. */
5508#define QUALIFIED_NAME_IS_TEMPLATE(NODE) \
5509 (TREE_LANG_FLAG_1 (SCOPE_REF_CHECK (NODE)))
5510
5511/* [coroutines]
5512*/
5513
5514/* True if NODE is a co-routine FUNCTION_DECL. */
5515#define DECL_COROUTINE_P(NODE) \
5516 (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->coroutine_p)
5517
5518/* For a FUNCTION_DECL of a coroutine, this holds the ACTOR helper function
5519 decl. */
5520#define DECL_ACTOR_FN(NODE) \
5521 (coro_get_actor_function ((NODE)))
5522
5523/* For a FUNCTION_DECL of a coroutine, this holds the DESTROY helper function
5524 decl. */
5525#define DECL_DESTROY_FN(NODE) \
5526 (coro_get_destroy_function ((NODE)))
5527
5528/* For a FUNCTION_DECL of a coroutine helper (ACTOR or DESTROY), this points
5529 back to the original (ramp) function. */
5530#define DECL_RAMP_FN(NODE) \
5531 (coro_get_ramp_function (NODE))
5532
5533/* For a FUNCTION_DECL this is true if it is a coroutine ramp. */
5534#define DECL_RAMP_P(NODE) \
5535 DECL_COROUTINE_P (NODE) && !DECL_RAMP_FN (NODE)
5536
5537/* True for an OMP_ATOMIC that has dependent parameters. These are stored
5538 as an expr in operand 1, and integer_zero_node or clauses in operand 0. */
5539#define OMP_ATOMIC_DEPENDENT_P(NODE) \
5540 (TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == INTEGER_CST \
5541 || TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == OMP_CLAUSE)
5542
5543/* Used while gimplifying continue statements bound to OMP_FOR nodes. */
5544#define OMP_FOR_GIMPLIFYING_P(NODE) \
5545 (TREE_LANG_FLAG_0 (OMP_LOOPING_CHECK (NODE)))
5546
5547/* A language-specific token attached to the OpenMP data clauses to
5548 hold code (or code fragments) related to ctors, dtors, and op=.
5549 See semantics.cc for details. */
5550#define CP_OMP_CLAUSE_INFO(NODE) \
5551 TREE_TYPE (OMP_CLAUSE_RANGE_CHECK (NODE, OMP_CLAUSE_PRIVATE, \
5552 OMP_CLAUSE__CONDTEMP_))
5553
5554/* Nonzero if this transaction expression's body contains statements. */
5555#define TRANSACTION_EXPR_IS_STMT(NODE) \
5556 TREE_LANG_FLAG_0 (TRANSACTION_EXPR_CHECK (NODE))
5557
5558/* These macros provide convenient access to the various _STMT nodes
5559 created when parsing template declarations. */
5560#define TRY_STMTS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0)
5561#define TRY_HANDLERS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1)
5562
5563#define EH_SPEC_STMTS(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0)
5564#define EH_SPEC_RAISES(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1)
5565
5566#define USING_STMT_NAMESPACE(NODE) TREE_OPERAND (USING_STMT_CHECK (NODE), 0)
5567
5568/* Nonzero if this try block is a function try block. */
5569#define FN_TRY_BLOCK_P(NODE) TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE))
5570#define HANDLER_PARMS(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 0)
5571#define HANDLER_BODY(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 1)
5572#define HANDLER_TYPE(NODE) TREE_TYPE (HANDLER_CHECK (NODE))
5573
5574/* CLEANUP_STMT accessors. The statement(s) covered, the cleanup to run
5575 and the VAR_DECL for which this cleanup exists. */
5576#define CLEANUP_BODY(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0)
5577#define CLEANUP_EXPR(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1)
5578#define CLEANUP_DECL(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 2)
5579
5580/* IF_STMT accessors. These give access to the condition of the if
5581 statement, the then block of the if statement, and the else block
5582 of the if statement if it exists. */
5583#define IF_COND(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 0)
5584#define THEN_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 1)
5585#define ELSE_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
5586#define IF_SCOPE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 3)
5587#define IF_STMT_CONSTEXPR_P(NODE) TREE_LANG_FLAG_0 (IF_STMT_CHECK (NODE))
5588#define IF_STMT_CONSTEVAL_P(NODE) TREE_LANG_FLAG_2 (IF_STMT_CHECK (NODE))
5589
5590/* Like PACK_EXPANSION_EXTRA_ARGS, for constexpr if. IF_SCOPE is used while
5591 building an IF_STMT; IF_STMT_EXTRA_ARGS is used after it is complete. */
5592#define IF_STMT_EXTRA_ARGS(NODE) IF_SCOPE (NODE)
5593
5594/* RANGE_FOR_STMT accessors. These give access to the declarator,
5595 expression, body, and scope of the statement, respectively. */
5596#define RANGE_FOR_DECL(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 0)
5597#define RANGE_FOR_EXPR(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 1)
5598#define RANGE_FOR_BODY(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 2)
5599#define RANGE_FOR_SCOPE(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 3)
5600#define RANGE_FOR_UNROLL(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 4)
5601#define RANGE_FOR_INIT_STMT(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 5)
5602#define RANGE_FOR_IVDEP(NODE) TREE_LANG_FLAG_6 (RANGE_FOR_STMT_CHECK (NODE))
5603#define RANGE_FOR_NOVECTOR(NODE) TREE_LANG_FLAG_5 (RANGE_FOR_STMT_CHECK (NODE))
5604
5605/* STMT_EXPR accessor. */
5606#define STMT_EXPR_STMT(NODE) TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
5607
5608/* EXPR_STMT accessor. This gives the expression associated with an
5609 expression statement. */
5610#define EXPR_STMT_EXPR(NODE) TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
5611
5612/* True if this TARGET_EXPR was created by build_cplus_new, and so we can
5613 discard it if it isn't useful. */
5614#define TARGET_EXPR_IMPLICIT_P(NODE) \
5615 TREE_LANG_FLAG_0 (TARGET_EXPR_CHECK (NODE))
5616
5617/* True if this TARGET_EXPR is the result of list-initialization of a
5618 temporary. */
5619#define TARGET_EXPR_LIST_INIT_P(NODE) \
5620 TREE_LANG_FLAG_1 (TARGET_EXPR_CHECK (NODE))
5621
5622/* True if this TARGET_EXPR expresses direct-initialization of an object
5623 to be named later. */
5624#define TARGET_EXPR_DIRECT_INIT_P(NODE) \
5625 TREE_LANG_FLAG_2 (TARGET_EXPR_CHECK (NODE))
5626
5627/* True if we expect this TARGET_EXPR to be used as an initializer, not to
5628 materialize as a temporary. */
5629#define TARGET_EXPR_ELIDING_P(NODE) \
5630 TREE_LANG_FLAG_3 (TARGET_EXPR_CHECK (NODE))
5631
5632/* True if this TARGET_EXPR is for holding an implementation detail like a
5633 cleanup flag or loop index, and should be ignored by extend_all_temps. */
5634#define TARGET_EXPR_INTERNAL_P(NODE) \
5635 TREE_LANG_FLAG_4 (TARGET_EXPR_CHECK (NODE))
5636
5637/* True if NODE is a TARGET_EXPR that just expresses a copy of its INITIAL; if
5638 the initializer has void type, it's doing something more complicated. */
5639#define SIMPLE_TARGET_EXPR_P(NODE) \
5640 (TREE_CODE (NODE) == TARGET_EXPR \
5641 && TARGET_EXPR_INITIAL (NODE) \
5642 && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (NODE))))
5643
5644/* True if T is a TARGET_EXPR for which we'll need to replace_decl to use it as
5645 an initializer. */
5646inline bool
5647target_expr_needs_replace (tree t)
5648{
5649 if (!t || TREE_CODE (t) != TARGET_EXPR)
5650 return false;
5651 tree init = TARGET_EXPR_INITIAL (t);
5652 if (!init || !VOID_TYPE_P (TREE_TYPE (init)))
5653 return false;
5654 while (TREE_CODE (init) == COMPOUND_EXPR)
5655 init = TREE_OPERAND (init, 1);
5656 return (TREE_CODE (init) != AGGR_INIT_EXPR
5657 && TREE_CODE (init) != VEC_INIT_EXPR);
5658}
5659
5660/* True if EXPR expresses direct-initialization of a TYPE. */
5661#define DIRECT_INIT_EXPR_P(TYPE,EXPR) \
5662 (TREE_CODE (EXPR) == TARGET_EXPR && TREE_LANG_FLAG_2 (EXPR) \
5663 && same_type_ignoring_top_level_qualifiers_p (TYPE, TREE_TYPE (EXPR)))
5664
5665/* True if this CONVERT_EXPR is for a conversion to virtual base in
5666 an NSDMI, and should be re-evaluated when used in a constructor. */
5667#define CONVERT_EXPR_VBASE_PATH(NODE) \
5668 TREE_LANG_FLAG_0 (CONVERT_EXPR_CHECK (NODE))
5669
5670/* True if SIZEOF_EXPR argument is type. */
5671#define SIZEOF_EXPR_TYPE_P(NODE) \
5672 TREE_LANG_FLAG_0 (SIZEOF_EXPR_CHECK (NODE))
5673
5674/* True if the ALIGNOF_EXPR was spelled "alignof". */
5675#define ALIGNOF_EXPR_STD_P(NODE) \
5676 TREE_LANG_FLAG_0 (ALIGNOF_EXPR_CHECK (NODE))
5677
5678/* OMP_DEPOBJ accessors. These give access to the depobj expression of the
5679 #pragma omp depobj directive and the clauses, respectively. If
5680 OMP_DEPOBJ_CLAUSES is INTEGER_CST, it is instead the update clause kind
5681 or OMP_CLAUSE_DEPEND_LAST for destroy clause. */
5682#define OMP_DEPOBJ_DEPOBJ(NODE) TREE_OPERAND (OMP_DEPOBJ_CHECK (NODE), 0)
5683#define OMP_DEPOBJ_CLAUSES(NODE) TREE_OPERAND (OMP_DEPOBJ_CHECK (NODE), 1)
5684
5685/* An enumeration of the kind of tags that C++ accepts. */
5686enum tag_types {
5687 none_type = 0, /* Not a tag type. */
5688 record_type, /* "struct" types. */
5689 class_type, /* "class" types. */
5690 union_type, /* "union" types. */
5691 enum_type, /* "enum" types. */
5692 typename_type, /* "typename" types. */
5693 scope_type /* namespace or tagged type name followed by :: */
5694};
5695
5696/* The various kinds of lvalues we distinguish. */
5697enum cp_lvalue_kind_flags {
5698 clk_none = 0, /* Things that are not an lvalue. */
5699 clk_ordinary = 1, /* An ordinary lvalue. */
5700 clk_rvalueref = 2,/* An xvalue (rvalue formed using an rvalue reference) */
5701 clk_class = 4, /* A prvalue of class or array type. */
5702 clk_bitfield = 8, /* An lvalue for a bit-field. */
5703 clk_packed = 16, /* An lvalue for a packed field. */
5704 clk_implicit_rval = 1<<5, /* An lvalue being treated as an xvalue. */
5705 clk_mergeable = 1<<6
5706};
5707
5708/* This type is used for parameters and variables which hold
5709 combinations of the flags in enum cp_lvalue_kind_flags. */
5710typedef int cp_lvalue_kind;
5711
5712/* Various kinds of template specialization, instantiation, etc. */
5713enum tmpl_spec_kind {
5714 tsk_none, /* Not a template at all. */
5715 tsk_invalid_member_spec, /* An explicit member template
5716 specialization, but the enclosing
5717 classes have not all been explicitly
5718 specialized. */
5719 tsk_invalid_expl_inst, /* An explicit instantiation containing
5720 template parameter lists. */
5721 tsk_excessive_parms, /* A template declaration with too many
5722 template parameter lists. */
5723 tsk_insufficient_parms, /* A template declaration with too few
5724 parameter lists. */
5725 tsk_template, /* A template declaration. */
5726 tsk_expl_spec, /* An explicit specialization. */
5727 tsk_expl_inst /* An explicit instantiation. */
5728};
5729
5730/* The various kinds of access. BINFO_ACCESS depends on these being
5731 two bit quantities. The numerical values are important; they are
5732 used to initialize RTTI data structures, so changing them changes
5733 the ABI. */
5734enum access_kind {
5735 ak_none = 0, /* Inaccessible. */
5736 ak_public = 1, /* Accessible, as a `public' thing. */
5737 ak_protected = 2, /* Accessible, as a `protected' thing. */
5738 ak_private = 3 /* Accessible, as a `private' thing. */
5739};
5740
5741/* The various kinds of special functions. If you add to this list,
5742 you should update special_function_p as well. */
5743enum special_function_kind {
5744 sfk_none = 0, /* Not a special function. This enumeral
5745 must have value zero; see
5746 special_function_p. */
5747 /* The following are ordered, for use by member synthesis fns. */
5748 sfk_destructor, /* A destructor. */
5749 sfk_constructor, /* A constructor. */
5750 sfk_inheriting_constructor, /* An inheriting constructor */
5751 sfk_copy_constructor, /* A copy constructor. */
5752 sfk_move_constructor, /* A move constructor. */
5753 sfk_copy_assignment, /* A copy assignment operator. */
5754 sfk_move_assignment, /* A move assignment operator. */
5755 /* The following are unordered. */
5756 sfk_complete_destructor, /* A destructor for complete objects. */
5757 sfk_base_destructor, /* A destructor for base subobjects. */
5758 sfk_deleting_destructor, /* A destructor for complete objects that
5759 deletes the object after it has been
5760 destroyed. */
5761 sfk_conversion, /* A conversion operator. */
5762 sfk_deduction_guide, /* A class template deduction guide. */
5763 sfk_comparison, /* A comparison operator (e.g. ==, <, <=>). */
5764 sfk_virtual_destructor /* Used by member synthesis fns. */
5765};
5766
5767/* The various kinds of linkage. From [basic.link],
5768
5769 A name is said to have linkage when it might denote the same
5770 object, reference, function, type, template, namespace or value
5771 as a name introduced in another scope:
5772
5773 -- When a name has external linkage, the entity it denotes can
5774 be referred to from scopes of other translation units or from
5775 other scopes of the same translation unit.
5776
5777 -- When a name has internal linkage, the entity it denotes can
5778 be referred to by names from other scopes in the same
5779 translation unit.
5780
5781 -- When a name has no linkage, the entity it denotes cannot be
5782 referred to by names from other scopes. */
5783
5784enum linkage_kind {
5785 lk_none, /* No linkage. */
5786 lk_internal, /* Internal linkage. */
5787 lk_external /* External linkage. */
5788};
5789
5790enum duration_kind {
5791 dk_static,
5792 dk_thread,
5793 dk_auto,
5794 dk_dynamic
5795};
5796
5797/* Bitmask flags to control type substitution. */
5798enum tsubst_flags {
5799 tf_none = 0, /* nothing special */
5800 tf_error = 1 << 0, /* give error messages */
5801 tf_warning = 1 << 1, /* give warnings too */
5802 tf_ignore_bad_quals = 1 << 2, /* ignore bad cvr qualifiers */
5803 tf_keep_type_decl = 1 << 3, /* retain typedef type decls
5804 (make_typename_type use) */
5805 tf_ptrmem_ok = 1 << 4, /* pointers to member ok (internal
5806 instantiate_type use) */
5807 tf_user = 1 << 5, /* found template must be a user template
5808 (lookup_template_class use) */
5809 tf_conv = 1 << 6, /* We are determining what kind of
5810 conversion might be permissible,
5811 not actually performing the
5812 conversion. */
5813 tf_decltype = 1 << 7, /* We are the operand of decltype.
5814 Used to implement the special rules
5815 for calls in decltype (5.2.2/11). */
5816 tf_partial = 1 << 8, /* Doing initial explicit argument
5817 substitution in fn_type_unification. */
5818 tf_fndecl_type = 1 << 9, /* Substituting the type of a function
5819 declaration. */
5820 tf_no_cleanup = 1 << 10, /* Do not build a cleanup
5821 (build_target_expr and friends) */
5822 /* 1 << 11 is available. */
5823 tf_tst_ok = 1 << 12, /* Allow a typename-specifier to name
5824 a template (C++17 or later). */
5825 tf_dguide = 1 << 13, /* Building a deduction guide from a ctor. */
5826 tf_qualifying_scope = 1 << 14, /* Substituting the LHS of the :: operator.
5827 Affects TYPENAME_TYPE resolution from
5828 make_typename_type. */
5829 tf_no_name_lookup = 1 << 15, /* Don't look up the terminal name of an
5830 outermost id-expression, or resolve its
5831 constituent template-ids or qualified-ids. */
5832 /* Convenient substitution flags combinations. */
5833 tf_warning_or_error = tf_warning | tf_error
5834};
5835
5836/* This type is used for parameters and variables which hold
5837 combinations of the flags in enum tsubst_flags. */
5838typedef int tsubst_flags_t;
5839
5840/* The kind of checking we can do looking in a class hierarchy. */
5841enum base_access_flags {
5842 ba_any = 0, /* Do not check access, allow an ambiguous base,
5843 prefer a non-virtual base */
5844 ba_unique = 1 << 0, /* Must be a unique base. */
5845 ba_check_bit = 1 << 1, /* Check access. */
5846 ba_check = ba_unique | ba_check_bit,
5847 ba_ignore_scope = 1 << 2, /* Ignore access allowed by local scope. */
5848 ba_require_virtual = 1 << 3 /* Require a virtual base. */
5849};
5850
5851/* This type is used for parameters and variables which hold
5852 combinations of the flags in enum base_access_flags. */
5853typedef int base_access;
5854
5855/* The various kinds of access check during parsing. */
5856enum deferring_kind {
5857 dk_no_deferred = 0, /* Check access immediately */
5858 dk_deferred = 1, /* Deferred check */
5859 dk_no_check = 2 /* No access check */
5860};
5861
5862/* The kind of base we can find, looking in a class hierarchy.
5863 Values <0 indicate we failed. */
5864enum base_kind {
5865 bk_inaccessible = -3, /* The base is inaccessible */
5866 bk_ambig = -2, /* The base is ambiguous */
5867 bk_not_base = -1, /* It is not a base */
5868 bk_same_type = 0, /* It is the same type */
5869 bk_proper_base = 1, /* It is a proper base */
5870 bk_via_virtual = 2 /* It is a proper base, but via a virtual
5871 path. This might not be the canonical
5872 binfo. */
5873};
5874
5875/* Node for "pointer to (virtual) function".
5876 This may be distinct from ptr_type_node so gdb can distinguish them. */
5877#define vfunc_ptr_type_node vtable_entry_type
5878
5879
5880/* For building calls to `delete'. */
5881extern GTY(()) tree integer_two_node;
5882
5883/* The number of function bodies which we are currently processing.
5884 (Zero if we are at namespace scope, one inside the body of a
5885 function, two inside the body of a function in a local class, etc.) */
5886extern int function_depth;
5887
5888/* Nonzero if we are inside spec_hasher::equal, which affects
5889 comparison of PARM_DECLs in cp_tree_equal. */
5890extern int comparing_specializations;
5891
5892/* Nonzero if we want different dependent aliases to compare as unequal.
5893 FIXME we should always do this except during deduction/ordering. */
5894extern int comparing_dependent_aliases;
5895
5896/* Nonzero if we want to consider different member expressions to compare
5897 equal if they designate the same entity. This is set when comparing
5898 contract conditions of overrides. */
5899extern bool comparing_override_contracts;
5900
5901/* In parser.cc. */
5902
5903/* Nonzero if we are parsing an unevaluated operand: an operand to
5904 sizeof, typeof, or alignof. This is a count since operands to
5905 sizeof can be nested. */
5906
5907extern int cp_unevaluated_operand;
5908
5909/* RAII class used to inhibit the evaluation of operands during parsing
5910 and template instantiation. Evaluation warnings are also inhibited. */
5911
5912class cp_unevaluated
5913{
5914public:
5915 cp_unevaluated ();
5916 ~cp_unevaluated ();
5917};
5918
5919/* The reverse: an RAII class used for nested contexts that are evaluated even
5920 if the enclosing context is not. */
5921
5922class cp_evaluated
5923{
5924public:
5925 int uneval;
5926 int inhibit;
5927 cp_evaluated (bool reset = true)
5928 : uneval(cp_unevaluated_operand), inhibit(c_inhibit_evaluation_warnings)
5929 { if (reset)
5930 cp_unevaluated_operand = c_inhibit_evaluation_warnings = 0; }
5931 ~cp_evaluated ()
5932 { cp_unevaluated_operand = uneval;
5933 c_inhibit_evaluation_warnings = inhibit; }
5934};
5935
5936/* in pt.cc */
5937
5938/* These values are used for the `STRICT' parameter to type_unification and
5939 fn_type_unification. Their meanings are described with the
5940 documentation for fn_type_unification. */
5941
5942enum unification_kind_t {
5943 DEDUCE_CALL,
5944 DEDUCE_CONV,
5945 DEDUCE_EXACT
5946};
5947
5948// An RAII class used to create a new pointer map for local
5949// specializations. When the stack goes out of scope, the
5950// previous pointer map is restored.
5951enum lss_policy { lss_blank, lss_copy, lss_nop };
5952class local_specialization_stack
5953{
5954public:
5955 local_specialization_stack (lss_policy = lss_blank);
5956 ~local_specialization_stack ();
5957
5958 hash_map<tree, tree> *saved;
5959};
5960
5961/* Entry in the specialization hash table. */
5962struct GTY((for_user)) spec_entry
5963{
5964 /* The general template this is a specialization of. */
5965 tree tmpl;
5966 /* The args for this (maybe-partial) specialization. */
5967 tree args;
5968 /* The specialization itself. */
5969 tree spec = NULL_TREE;
5970 /* The cached result of hash_tmpl_and_args (tmpl, args). */
5971 hashval_t hash = 0;
5972};
5973
5974/* in class.cc */
5975
5976extern int current_class_depth;
5977
5978/* in decl.cc */
5979
5980/* An array of static vars & fns. */
5981extern GTY(()) vec<tree, va_gc> *static_decls;
5982
5983/* An array of vtable-needing types that have no key function, or have
5984 an emitted key function. */
5985extern GTY(()) vec<tree, va_gc> *keyed_classes;
5986
5987/* Here's where we control how name mangling takes place. */
5988
5989/* Cannot use '$' up front, because this confuses gdb
5990 (names beginning with '$' are gdb-local identifiers).
5991
5992 Note that all forms in which the '$' is significant are long enough
5993 for direct indexing (meaning that if we know there is a '$'
5994 at a particular location, we can index into the string at
5995 any other location that provides distinguishing characters). */
5996
5997/* Define NO_DOT_IN_LABEL in your favorite tm file if your assembler
5998 doesn't allow '.' in symbol names. */
5999#ifndef NO_DOT_IN_LABEL
6000
6001#define JOINER '.'
6002#define JOIN_STR "."
6003
6004#define AUTO_TEMP_NAME "_.tmp_"
6005#define VFIELD_BASE ".vf"
6006#define VFIELD_NAME "_vptr."
6007#define VFIELD_NAME_FORMAT "_vptr.%s"
6008
6009#else /* NO_DOT_IN_LABEL */
6010
6011#ifndef NO_DOLLAR_IN_LABEL
6012
6013#define JOINER '$'
6014#define JOIN_STR "$"
6015
6016#define AUTO_TEMP_NAME "_$tmp_"
6017#define VFIELD_BASE "$vf"
6018#define VFIELD_NAME "_vptr$"
6019#define VFIELD_NAME_FORMAT "_vptr$%s"
6020
6021#else /* NO_DOLLAR_IN_LABEL */
6022
6023#define JOIN_STR "_"
6024
6025#define VTABLE_NAME "__vt_"
6026#define VTABLE_NAME_P(ID_NODE) \
6027 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \
6028 sizeof (VTABLE_NAME) - 1))
6029#define VFIELD_BASE "__vfb"
6030#define VFIELD_NAME "__vptr_"
6031#define VFIELD_NAME_P(ID_NODE) \
6032 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \
6033 sizeof (VFIELD_NAME) - 1))
6034#define VFIELD_NAME_FORMAT "__vptr_%s"
6035
6036#endif /* NO_DOLLAR_IN_LABEL */
6037#endif /* NO_DOT_IN_LABEL */
6038
6039#define UDLIT_OP_ANSI_PREFIX "operator\"\""
6040#define UDLIT_OP_ANSI_FORMAT UDLIT_OP_ANSI_PREFIX "%s"
6041#define UDLIT_OP_MANGLED_PREFIX "li"
6042#define UDLIT_OP_MANGLED_FORMAT UDLIT_OP_MANGLED_PREFIX "%s"
6043#define UDLIT_OPER_P(ID_NODE) \
6044 (!strncmp (IDENTIFIER_POINTER (ID_NODE), \
6045 UDLIT_OP_ANSI_PREFIX, \
6046 sizeof (UDLIT_OP_ANSI_PREFIX) - 1))
6047#define UDLIT_OP_SUFFIX(ID_NODE) \
6048 (IDENTIFIER_POINTER (ID_NODE) + sizeof (UDLIT_OP_ANSI_PREFIX) - 1)
6049
6050#if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL)
6051
6052#define VTABLE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \
6053 && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \
6054 && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER)
6055
6056#define VFIELD_NAME_P(ID_NODE) \
6057 (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1))
6058
6059#endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */
6060
6061
6062/* Nonzero if we're done parsing and into end-of-file activities.
6063 2 if all templates have been instantiated.
6064 3 if we're done with front-end processing. */
6065
6066extern int at_eof;
6067
6068/* True if note_mangling_alias should enqueue mangling aliases for
6069 later generation, rather than emitting them right away. */
6070
6071extern bool defer_mangling_aliases;
6072
6073/* True if noexcept is part of the type (i.e. in C++17). */
6074
6075extern bool flag_noexcept_type;
6076
6077/* True if this TREE_LIST in {static,tls}_aggregates is a for dynamic
6078 initialization of namespace scope structured binding base or related
6079 extended ref init temps. Temporaries from the initialization of
6080 STATIC_INIT_DECOMP_BASE_P dynamic initializers should be destroyed only
6081 after the last STATIC_INIT_DECOMP_NONBASE_P dynamic initializer following
6082 it. */
6083#define STATIC_INIT_DECOMP_BASE_P(NODE) \
6084 TREE_LANG_FLAG_1 (TREE_LIST_CHECK (NODE))
6085
6086/* True if this TREE_LIST in {static,tls}_aggregates is a for dynamic
6087 initialization of namespace scope structured binding non-base
6088 variable using get. */
6089#define STATIC_INIT_DECOMP_NONBASE_P(NODE) \
6090 TREE_LANG_FLAG_2 (TREE_LIST_CHECK (NODE))
6091
6092/* A list of namespace-scope objects which have constructors or
6093 destructors which reside in the global scope. The decl is stored
6094 in the TREE_VALUE slot and the initializer is stored in the
6095 TREE_PURPOSE slot. */
6096extern GTY(()) tree static_aggregates;
6097/* Likewise, for thread local storage. */
6098extern GTY(()) tree tls_aggregates;
6099
6100/* A hash-map mapping from variable decls to the dynamic initializer for
6101 the decl. This is currently only used by OpenMP. */
6102extern GTY(()) decl_tree_map *dynamic_initializers;
6103
6104enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG };
6105
6106/* These are uses as bits in flags passed to various functions to
6107 control their behavior. Despite the LOOKUP_ prefix, many of these
6108 do not control name lookup. ??? Functions using these flags should
6109 probably be modified to accept explicit boolean flags for the
6110 behaviors relevant to them. */
6111/* Check for access violations. */
6112#define LOOKUP_PROTECT (1 << 0)
6113#define LOOKUP_NORMAL (LOOKUP_PROTECT)
6114/* Even if the function found by lookup is a virtual function, it
6115 should be called directly. */
6116#define LOOKUP_NONVIRTUAL (1 << 1)
6117/* Non-converting (i.e., "explicit") constructors are not tried. This flag
6118 indicates that we are not performing direct-initialization. */
6119#define LOOKUP_ONLYCONVERTING (1 << 2)
6120#define LOOKUP_IMPLICIT (LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING)
6121/* If a temporary is created, it should be created so that it lives
6122 as long as the current variable bindings; otherwise it only lives
6123 until the end of the complete-expression. It also forces
6124 direct-initialization in cases where other parts of the compiler
6125 have already generated a temporary, such as reference
6126 initialization and the catch parameter. */
6127#define DIRECT_BIND (1 << 3)
6128/* We're performing a user-defined conversion, so more user-defined
6129 conversions are not permitted (only built-in conversions). */
6130#define LOOKUP_NO_CONVERSION (1 << 4)
6131/* The user has explicitly called a destructor. (Therefore, we do
6132 not need to check that the object is non-NULL before calling the
6133 destructor.) */
6134#define LOOKUP_DESTRUCTOR (1 << 5)
6135/* Do not permit references to bind to temporaries. */
6136#define LOOKUP_NO_TEMP_BIND (1 << 6)
6137/* We're inside an init-list, so narrowing conversions are ill-formed. */
6138#define LOOKUP_NO_NARROWING (LOOKUP_NO_TEMP_BIND << 1)
6139/* We're looking up a constructor for list-initialization. */
6140#define LOOKUP_LIST_INIT_CTOR (LOOKUP_NO_NARROWING << 1)
6141/* This is the first parameter of a copy constructor. */
6142#define LOOKUP_COPY_PARM (LOOKUP_LIST_INIT_CTOR << 1)
6143/* We only want to consider list constructors. */
6144#define LOOKUP_LIST_ONLY (LOOKUP_COPY_PARM << 1)
6145/* Return after determining which function to call and checking access.
6146 Used by sythesized_method_walk to determine which functions will
6147 be called to initialize subobjects, in order to determine exception
6148 specification and possible implicit delete.
6149 This is kind of a hack, but exiting early avoids problems with trying
6150 to perform argument conversions when the class isn't complete yet. */
6151#define LOOKUP_SPECULATIVE (LOOKUP_LIST_ONLY << 1)
6152/* Used by calls from defaulted functions to limit the overload set to avoid
6153 cycles trying to declare them (core issue 1092). */
6154#define LOOKUP_DEFAULTED (LOOKUP_SPECULATIVE << 1)
6155/* Used in calls to store_init_value to suppress its usual call to
6156 digest_init. */
6157#define LOOKUP_ALREADY_DIGESTED (LOOKUP_DEFAULTED << 1)
6158/* Like LOOKUP_NO_TEMP_BIND, but also prevent binding to xvalues. */
6159#define LOOKUP_NO_RVAL_BIND (LOOKUP_ALREADY_DIGESTED << 1)
6160/* Used by case_conversion to disregard non-integral conversions. */
6161#define LOOKUP_NO_NON_INTEGRAL (LOOKUP_NO_RVAL_BIND << 1)
6162/* Used for delegating constructors in order to diagnose self-delegation. */
6163#define LOOKUP_DELEGATING_CONS (LOOKUP_NO_NON_INTEGRAL << 1)
6164/* Allow initialization of a flexible array members. */
6165#define LOOKUP_ALLOW_FLEXARRAY_INIT (LOOKUP_DELEGATING_CONS << 1)
6166/* We're looking for either a rewritten comparison operator candidate or the
6167 operator to use on the former's result. We distinguish between the two by
6168 knowing that comparisons other than == and <=> must be the latter, as must
6169 a <=> expression trying to rewrite to <=> without reversing. */
6170#define LOOKUP_REWRITTEN (LOOKUP_ALLOW_FLEXARRAY_INIT << 1)
6171/* Reverse the order of the two arguments for comparison rewriting. First we
6172 swap the arguments in add_operator_candidates, then we swap the conversions
6173 in add_candidate (so that they correspond to the original order of the
6174 args), then we swap the conversions back in build_new_op_1 (so they
6175 correspond to the order of the args in the candidate). */
6176#define LOOKUP_REVERSED (LOOKUP_REWRITTEN << 1)
6177/* We're initializing an aggregate from a parenthesized list of values. */
6178#define LOOKUP_AGGREGATE_PAREN_INIT (LOOKUP_REVERSED << 1)
6179/* We're computing conversions as part of a first pass of overload resolution
6180 wherein we don't try to distinguish an unviable candidate from a
6181 non-strictly viable candidate and thus can avoid computing unnecessary
6182 bad conversions. */
6183#define LOOKUP_SHORTCUT_BAD_CONVS (LOOKUP_AGGREGATE_PAREN_INIT << 1)
6184
6185/* These flags are used by the conversion code.
6186 CONV_IMPLICIT : Perform implicit conversions (standard and user-defined).
6187 CONV_STATIC : Perform the explicit conversions for static_cast.
6188 CONV_CONST : Perform the explicit conversions for const_cast.
6189 CONV_REINTERPRET: Perform the explicit conversions for reinterpret_cast.
6190 CONV_PRIVATE : Perform upcasts to private bases.
6191 CONV_FORCE_TEMP : Require a new temporary when converting to the same
6192 aggregate type. */
6193
6194#define CONV_IMPLICIT 1
6195#define CONV_STATIC 2
6196#define CONV_CONST 4
6197#define CONV_REINTERPRET 8
6198#define CONV_PRIVATE 16
6199#define CONV_FORCE_TEMP 32
6200#define CONV_FOLD 64
6201#define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
6202 | CONV_REINTERPRET)
6203#define CONV_C_CAST (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
6204 | CONV_REINTERPRET | CONV_PRIVATE | CONV_FORCE_TEMP)
6205#define CONV_BACKEND_CONVERT (CONV_OLD_CONVERT | CONV_FOLD)
6206
6207/* Used by build_expr_type_conversion to indicate which types are
6208 acceptable as arguments to the expression under consideration. */
6209
6210#define WANT_INT 1 /* integer types, including bool */
6211#define WANT_FLOAT 2 /* floating point types */
6212#define WANT_ENUM 4 /* enumerated types */
6213#define WANT_POINTER 8 /* pointer types */
6214#define WANT_NULL 16 /* null pointer constant */
6215#define WANT_VECTOR_OR_COMPLEX 32 /* vector or complex types */
6216#define WANT_ARITH (WANT_INT | WANT_FLOAT | WANT_VECTOR_OR_COMPLEX)
6217
6218/* Used with comptypes, and related functions, to guide type
6219 comparison. */
6220
6221#define COMPARE_STRICT 0 /* Just check if the types are the
6222 same. */
6223#define COMPARE_BASE 1 /* Check to see if the second type is
6224 derived from the first. */
6225#define COMPARE_DERIVED 2 /* Like COMPARE_BASE, but in
6226 reverse. */
6227#define COMPARE_REDECLARATION 4 /* The comparison is being done when
6228 another declaration of an existing
6229 entity is seen. */
6230#define COMPARE_STRUCTURAL 8 /* The comparison is intended to be
6231 structural. The actual comparison
6232 will be identical to
6233 COMPARE_STRICT. */
6234
6235/* Used with start function. */
6236#define SF_DEFAULT 0 /* No flags. */
6237#define SF_PRE_PARSED 1 /* The function declaration has
6238 already been parsed. */
6239#define SF_INCLASS_INLINE 2 /* The function is an inline, defined
6240 in the class body. */
6241
6242/* Used with start_decl's initialized parameter. */
6243#define SD_UNINITIALIZED 0
6244#define SD_INITIALIZED 1
6245/* Like SD_INITIALIZED, but also mark the new decl as DECL_DECOMPOSITION_P. */
6246#define SD_DECOMPOSITION 2
6247#define SD_DEFAULTED 3
6248#define SD_DELETED 4
6249
6250/* Returns nonzero iff TYPE1 and TYPE2 are the same type, or if TYPE2
6251 is derived from TYPE1, or if TYPE2 is a pointer (reference) to a
6252 class derived from the type pointed to (referred to) by TYPE1. */
6253#define same_or_base_type_p(TYPE1, TYPE2) \
6254 comptypes ((TYPE1), (TYPE2), COMPARE_BASE)
6255
6256/* These macros are used to access a TEMPLATE_PARM_INDEX. */
6257#define TEMPLATE_PARM_INDEX_CAST(NODE) \
6258 ((template_parm_index*)TEMPLATE_PARM_INDEX_CHECK (NODE))
6259#define TEMPLATE_PARM_IDX(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->index)
6260#define TEMPLATE_PARM_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->level)
6261#define TEMPLATE_PARM_DESCENDANTS(NODE) (TREE_CHAIN (TEMPLATE_PARM_INDEX_CHECK (NODE)))
6262#define TEMPLATE_PARM_ORIG_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->orig_level)
6263#define TEMPLATE_PARM_DECL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->decl)
6264#define TEMPLATE_PARM_PARAMETER_PACK(NODE) \
6265 (TREE_LANG_FLAG_0 (TEMPLATE_PARM_INDEX_CHECK (NODE)))
6266
6267/* These macros are for accessing the fields of TEMPLATE_TYPE_PARM,
6268 TEMPLATE_TEMPLATE_PARM and BOUND_TEMPLATE_TEMPLATE_PARM nodes. */
6269#define TEMPLATE_TYPE_PARM_INDEX(NODE) \
6270 (TYPE_VALUES_RAW (TREE_CHECK3 ((NODE), TEMPLATE_TYPE_PARM, \
6271 TEMPLATE_TEMPLATE_PARM, \
6272 BOUND_TEMPLATE_TEMPLATE_PARM)))
6273#define TEMPLATE_TYPE_IDX(NODE) \
6274 (TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (NODE)))
6275#define TEMPLATE_TYPE_LEVEL(NODE) \
6276 (TEMPLATE_PARM_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
6277#define TEMPLATE_TYPE_ORIG_LEVEL(NODE) \
6278 (TEMPLATE_PARM_ORIG_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
6279#define TEMPLATE_TYPE_DESCENDANTS(NODE) \
6280 (TEMPLATE_PARM_DESCENDANTS (TEMPLATE_TYPE_PARM_INDEX (NODE)))
6281#define TEMPLATE_TYPE_DECL(NODE) \
6282 (TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
6283#define TEMPLATE_TYPE_PARAMETER_PACK(NODE) \
6284 (TEMPLATE_PARM_PARAMETER_PACK (TEMPLATE_TYPE_PARM_INDEX (NODE)))
6285
6286/* For a C++17 class deduction placeholder, the template it represents. */
6287#define CLASS_PLACEHOLDER_TEMPLATE(NODE) \
6288 (DECL_INITIAL (TYPE_NAME (TEMPLATE_TYPE_PARM_CHECK (NODE))))
6289
6290/* True iff the template parameters of this TEMPLATE_TEMPLATE_PARM don't
6291 use any outer template parameters. */
6292#define TEMPLATE_TEMPLATE_PARM_SIMPLE_P(NODE) \
6293 (TYPE_LANG_FLAG_5 (TEMPLATE_TEMPLATE_PARM_CHECK (NODE)))
6294
6295/* Contexts in which auto deduction occurs. These flags are
6296 used to control diagnostics in do_auto_deduction. */
6297
6298enum auto_deduction_context
6299{
6300 adc_unspecified, /* Not given */
6301 adc_variable_type, /* Variable initializer deduction */
6302 adc_return_type, /* Return type deduction */
6303 adc_unify, /* Template argument deduction */
6304 adc_requirement, /* Argument deduction constraint */
6305 adc_decomp_type /* Decomposition declaration initializer deduction */
6306};
6307
6308/* True iff this TEMPLATE_TYPE_PARM represents decltype(auto). */
6309#define AUTO_IS_DECLTYPE(NODE) \
6310 (TYPE_LANG_FLAG_5 (TEMPLATE_TYPE_PARM_CHECK (NODE)))
6311
6312/* These constants can used as bit flags in the process of tree formatting.
6313
6314 TFF_PLAIN_IDENTIFIER: unqualified part of a name.
6315 TFF_SCOPE: include the class and namespace scope of the name.
6316 TFF_CHASE_TYPEDEF: print the original type-id instead of the typedef-name.
6317 TFF_DECL_SPECIFIERS: print decl-specifiers.
6318 TFF_CLASS_KEY_OR_ENUM: precede a class-type name (resp. enum name) with
6319 a class-key (resp. `enum').
6320 TFF_RETURN_TYPE: include function return type.
6321 TFF_FUNCTION_DEFAULT_ARGUMENTS: include function default parameter values.
6322 TFF_EXCEPTION_SPECIFICATION: show function exception specification.
6323 TFF_TEMPLATE_HEADER: show the template<...> header in a
6324 template-declaration.
6325 TFF_TEMPLATE_NAME: show only template-name.
6326 TFF_EXPR_IN_PARENS: parenthesize expressions.
6327 TFF_NO_FUNCTION_ARGUMENTS: don't show function arguments.
6328 TFF_UNQUALIFIED_NAME: do not print the qualifying scope of the
6329 top-level entity.
6330 TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments
6331 identical to their defaults.
6332 TFF_NO_TEMPLATE_BINDINGS: do not print information about the template
6333 arguments for a function template specialization.
6334 TFF_POINTER: we are printing a pointer type.
6335 TFF_XOBJ_FUNC: we are printing an explicit object member function's
6336 parameters. */
6337
6338#define TFF_PLAIN_IDENTIFIER (0)
6339#define TFF_SCOPE (1)
6340#define TFF_CHASE_TYPEDEF (1 << 1)
6341#define TFF_DECL_SPECIFIERS (1 << 2)
6342#define TFF_CLASS_KEY_OR_ENUM (1 << 3)
6343#define TFF_RETURN_TYPE (1 << 4)
6344#define TFF_FUNCTION_DEFAULT_ARGUMENTS (1 << 5)
6345#define TFF_EXCEPTION_SPECIFICATION (1 << 6)
6346#define TFF_TEMPLATE_HEADER (1 << 7)
6347#define TFF_TEMPLATE_NAME (1 << 8)
6348#define TFF_EXPR_IN_PARENS (1 << 9)
6349#define TFF_NO_FUNCTION_ARGUMENTS (1 << 10)
6350#define TFF_UNQUALIFIED_NAME (1 << 11)
6351#define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS (1 << 12)
6352#define TFF_NO_TEMPLATE_BINDINGS (1 << 13)
6353#define TFF_POINTER (1 << 14)
6354#define TFF_XOBJ_FUNC (1 << 15)
6355
6356/* These constants can be used as bit flags to control strip_typedefs.
6357
6358 STF_USER_VISIBLE: use heuristics to try to avoid stripping user-facing
6359 aliases of internal details. This is intended for diagnostics,
6360 where it should (for example) give more useful "aka" types.
6361
6362 STF_STRIP_DEPENDENT: allow the stripping of aliases with dependent
6363 template parameters, relying on code elsewhere to report any
6364 appropriate diagnostics.
6365
6366 STF_KEEP_INJ_CLASS_NAME: don't strip injected-class-name typedefs
6367 because we're dealing with a non-coerced template argument.
6368*/
6369const unsigned int STF_USER_VISIBLE = 1U;
6370const unsigned int STF_STRIP_DEPENDENT = 1U << 1;
6371const unsigned int STF_KEEP_INJ_CLASS_NAME = 1U << 2;
6372
6373/* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM
6374 node. */
6375#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL(NODE) \
6376 ((TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM) \
6377 ? TYPE_TI_TEMPLATE (NODE) \
6378 : TYPE_NAME (TEMPLATE_TEMPLATE_PARM_CHECK (NODE)))
6379
6380/* in lex.cc */
6381
6382extern void init_reswords (void);
6383
6384/* Various flags for the overloaded operator information. */
6385enum ovl_op_flags {
6386 OVL_OP_FLAG_NONE = 0, /* Don't care. */
6387 OVL_OP_FLAG_UNARY = 1, /* Is unary. */
6388 OVL_OP_FLAG_BINARY = 2, /* Is binary. */
6389 OVL_OP_FLAG_AMBIARY = 3, /* May be unary or binary. */
6390 OVL_OP_FLAG_ALLOC = 4, /* operator new or delete. */
6391 OVL_OP_FLAG_DELETE = 1, /* operator delete. */
6392 OVL_OP_FLAG_VEC = 2 /* vector new or delete. */
6393};
6394
6395/* Compressed operator codes. Order is determined by operators.def
6396 and does not match that of tree_codes. */
6397enum ovl_op_code {
6398 OVL_OP_ERROR_MARK,
6399 OVL_OP_NOP_EXPR,
6400#define DEF_OPERATOR(NAME, CODE, MANGLING, FLAGS) OVL_OP_##CODE,
6401#define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING) /* NOTHING */
6402#include "operators.def"
6403 OVL_OP_MAX
6404};
6405
6406/* Make sure it fits in lang_decl_fn::ovl_op_code. */
6407STATIC_ASSERT (OVL_OP_MAX < (1 << 6));
6408
6409struct GTY(()) ovl_op_info_t {
6410 /* The IDENTIFIER_NODE for the operator. */
6411 tree identifier;
6412 /* The name of the operator. */
6413 const char *name;
6414 /* The mangled name of the operator. */
6415 const char *mangled_name;
6416 /* The (regular) tree code. */
6417 enum tree_code tree_code : 16;
6418 /* The (compressed) operator code. */
6419 enum ovl_op_code ovl_op_code : 8;
6420 /* The ovl_op_flags of the operator */
6421 unsigned flags : 8;
6422};
6423
6424/* Overloaded operator info indexed by ass_op_p & ovl_op_code. */
6425extern GTY(()) ovl_op_info_t ovl_op_info[2][OVL_OP_MAX];
6426/* Mapping from tree_codes to ovl_op_codes. */
6427extern GTY(()) unsigned char ovl_op_mapping[MAX_TREE_CODES];
6428/* Mapping for ambi-ary operators from the binary to the unary. */
6429extern GTY(()) unsigned char ovl_op_alternate[OVL_OP_MAX];
6430
6431/* Given an ass_op_p boolean and a tree code, return a pointer to its
6432 overloaded operator info. Tree codes for non-overloaded operators
6433 map to the error-operator. */
6434#define OVL_OP_INFO(IS_ASS_P, TREE_CODE) \
6435 (&ovl_op_info[(IS_ASS_P) != 0][ovl_op_mapping[(TREE_CODE)]])
6436/* Overloaded operator info for an identifier for which
6437 IDENTIFIER_OVL_OP_P is true. */
6438#define IDENTIFIER_OVL_OP_INFO(NODE) \
6439 (&ovl_op_info[IDENTIFIER_KIND_BIT_0 (NODE)][IDENTIFIER_CP_INDEX (NODE)])
6440#define IDENTIFIER_OVL_OP_FLAGS(NODE) \
6441 (IDENTIFIER_OVL_OP_INFO (NODE)->flags)
6442
6443inline tree ovl_op_identifier (bool isass, tree_code code)
6444{ return OVL_OP_INFO(isass, code)->identifier; }
6445inline tree ovl_op_identifier (tree_code code) { return ovl_op_identifier (isass: false, code); }
6446#define assign_op_identifier (ovl_op_info[true][OVL_OP_NOP_EXPR].identifier)
6447#define call_op_identifier (ovl_op_info[false][OVL_OP_CALL_EXPR].identifier)
6448
6449/* A type-qualifier, or bitmask therefore, using the TYPE_QUAL
6450 constants. */
6451
6452typedef int cp_cv_quals;
6453
6454/* Non-static member functions have an optional virt-specifier-seq.
6455 There is a VIRT_SPEC value for each virt-specifier.
6456 They can be combined by bitwise-or to form the complete set of
6457 virt-specifiers for a member function. */
6458enum virt_specifier
6459 {
6460 VIRT_SPEC_UNSPECIFIED = 0x0,
6461 VIRT_SPEC_FINAL = 0x1,
6462 VIRT_SPEC_OVERRIDE = 0x2
6463 };
6464
6465/* A type-qualifier, or bitmask therefore, using the VIRT_SPEC
6466 constants. */
6467
6468typedef int cp_virt_specifiers;
6469
6470/* Wherever there is a function-cv-qual, there could also be a ref-qualifier:
6471
6472 [dcl.fct]
6473 The return type, the parameter-type-list, the ref-qualifier, and
6474 the cv-qualifier-seq, but not the default arguments or the exception
6475 specification, are part of the function type.
6476
6477 REF_QUAL_NONE Ordinary member function with no ref-qualifier
6478 REF_QUAL_LVALUE Member function with the &-ref-qualifier
6479 REF_QUAL_RVALUE Member function with the &&-ref-qualifier */
6480
6481enum cp_ref_qualifier {
6482 REF_QUAL_NONE = 0,
6483 REF_QUAL_LVALUE = 1,
6484 REF_QUAL_RVALUE = 2
6485};
6486
6487/* A storage class. */
6488
6489enum cp_storage_class {
6490 /* sc_none must be zero so that zeroing a cp_decl_specifier_seq
6491 sets the storage_class field to sc_none. */
6492 sc_none = 0,
6493 sc_auto,
6494 sc_register,
6495 sc_static,
6496 sc_extern,
6497 sc_mutable
6498};
6499
6500/* An individual decl-specifier. This is used to index the array of
6501 locations for the declspecs in struct cp_decl_specifier_seq
6502 below.
6503 A subset of these enums also corresponds to elements of
6504 cp_parser_set_decl_spec_type:decl_spec_names in parser.cc. */
6505
6506enum cp_decl_spec {
6507 ds_first,
6508 ds_signed = ds_first, /* Index of first element of decl_spec_names. */
6509 ds_unsigned,
6510 ds_short,
6511 ds_long,
6512 ds_const,
6513 ds_volatile,
6514 ds_restrict,
6515 ds_inline,
6516 ds_virtual,
6517 ds_explicit,
6518 ds_friend,
6519 ds_typedef,
6520 ds_alias,
6521 ds_constexpr,
6522 ds_complex,
6523 ds_constinit,
6524 ds_consteval,
6525 ds_this, /* Index of last element of decl_spec_names. */
6526 ds_thread,
6527 ds_type_spec,
6528 ds_redefined_builtin_type_spec,
6529 ds_attribute,
6530 ds_std_attribute,
6531 ds_storage_class,
6532 ds_long_long,
6533 ds_concept,
6534 ds_last /* This enumerator must always be the last one. */
6535};
6536
6537/* A decl-specifier-seq. */
6538
6539struct cp_decl_specifier_seq {
6540 /* An array of locations for the declaration sepecifiers, indexed by
6541 enum cp_decl_spec_word. */
6542 location_t locations[ds_last];
6543 /* The primary type, if any, given by the decl-specifier-seq.
6544 Modifiers, like "short", "const", and "unsigned" are not
6545 reflected here. This field will be a TYPE, unless a typedef-name
6546 was used, in which case it will be a TYPE_DECL. */
6547 tree type;
6548 /* The attributes, if any, provided with the specifier sequence. */
6549 tree attributes;
6550 /* The c++11 attributes that follows the type specifier. */
6551 tree std_attributes;
6552 /* If non-NULL, a built-in type that the user attempted to redefine
6553 to some other type. */
6554 tree redefined_builtin_type;
6555 /* The explicit-specifier, if any. */
6556 tree explicit_specifier;
6557 /* The storage class specified -- or sc_none if no storage class was
6558 explicitly specified. */
6559 cp_storage_class storage_class;
6560 /* For the __intN declspec, this stores the index into the int_n_* arrays. */
6561 int int_n_idx;
6562 /* True iff TYPE_SPEC defines a class or enum. */
6563 BOOL_BITFIELD type_definition_p : 1;
6564 /* True iff multiple types were (erroneously) specified for this
6565 decl-specifier-seq. */
6566 BOOL_BITFIELD multiple_types_p : 1;
6567 /* True iff multiple storage classes were (erroneously) specified
6568 for this decl-specifier-seq or a combination of a storage class
6569 with a typedef specifier. */
6570 BOOL_BITFIELD conflicting_specifiers_p : 1;
6571 /* True iff at least one decl-specifier was found. */
6572 BOOL_BITFIELD any_specifiers_p : 1;
6573 /* True iff at least one type-specifier was found. */
6574 BOOL_BITFIELD any_type_specifiers_p : 1;
6575 /* True iff "int" was explicitly provided. */
6576 BOOL_BITFIELD explicit_int_p : 1;
6577 /* True iff "__intN" was explicitly provided. */
6578 BOOL_BITFIELD explicit_intN_p : 1;
6579 /* True iff "char" was explicitly provided. */
6580 BOOL_BITFIELD explicit_char_p : 1;
6581 /* True iff ds_thread is set for __thread, not thread_local. */
6582 BOOL_BITFIELD gnu_thread_keyword_p : 1;
6583 /* True iff the type is a decltype. */
6584 BOOL_BITFIELD decltype_p : 1;
6585 /* True iff the alternate "__intN__" form of the __intN type has been
6586 used. */
6587 BOOL_BITFIELD int_n_alt: 1;
6588};
6589
6590/* The various kinds of declarators. */
6591
6592enum cp_declarator_kind {
6593 cdk_id,
6594 cdk_function,
6595 cdk_array,
6596 cdk_pointer,
6597 cdk_reference,
6598 cdk_ptrmem,
6599 cdk_decomp,
6600 cdk_error
6601};
6602
6603/* A declarator. */
6604
6605typedef struct cp_declarator cp_declarator;
6606
6607typedef struct cp_parameter_declarator cp_parameter_declarator;
6608
6609/* A parameter, before it has been semantically analyzed. */
6610struct cp_parameter_declarator {
6611 /* The next parameter, or NULL_TREE if none. */
6612 cp_parameter_declarator *next;
6613 /* The decl-specifiers-seq for the parameter. */
6614 cp_decl_specifier_seq decl_specifiers;
6615 /* The declarator for the parameter. */
6616 cp_declarator *declarator;
6617 /* The default-argument expression, or NULL_TREE, if none. */
6618 tree default_argument;
6619 /* True iff this is a template parameter pack. */
6620 bool template_parameter_pack_p;
6621 /* Location within source. */
6622 location_t loc;
6623};
6624
6625/* A declarator. */
6626struct cp_declarator {
6627 /* The kind of declarator. */
6628 ENUM_BITFIELD (cp_declarator_kind) kind : 4;
6629 /* Whether we parsed an ellipsis (`...') just before the declarator,
6630 to indicate this is a parameter pack. */
6631 BOOL_BITFIELD parameter_pack_p : 1;
6632 /* If this declarator is parenthesized, this the open-paren. It is
6633 UNKNOWN_LOCATION when not parenthesized. */
6634 location_t parenthesized;
6635 /* Currently only set for cdk_id, cdk_decomp and cdk_function. */
6636 location_t id_loc;
6637 /* If this declarator is part of an init-declarator, the location of the
6638 initializer. */
6639 location_t init_loc;
6640 /* GNU Attributes that apply to this declarator. If the declarator
6641 is a pointer or a reference, these attribute apply to the type
6642 pointed to. */
6643 tree attributes;
6644 /* Standard C++11 attributes that apply to this declarator. If the
6645 declarator is a pointer or a reference, these attributes apply
6646 to the pointer, rather than to the type pointed to. */
6647 tree std_attributes;
6648 /* For all but cdk_id, cdk_decomp and cdk_error, the contained declarator.
6649 For cdk_id, cdk_decomp and cdk_error, guaranteed to be NULL. */
6650 cp_declarator *declarator;
6651 union {
6652 /* For identifiers. */
6653 struct {
6654 /* If non-NULL, the qualifying scope (a NAMESPACE_DECL or
6655 *_TYPE) for this identifier. */
6656 tree qualifying_scope;
6657 /* The unqualified name of the entity -- an IDENTIFIER_NODE,
6658 BIT_NOT_EXPR, or TEMPLATE_ID_EXPR. */
6659 tree unqualified_name;
6660 /* If this is the name of a function, what kind of special
6661 function (if any). */
6662 special_function_kind sfk;
6663 } id;
6664 /* For functions. */
6665 struct {
6666 /* The parameters to the function as a TREE_LIST of decl/default. */
6667 tree parameters;
6668 /* The cv-qualifiers for the function. */
6669 cp_cv_quals qualifiers;
6670 /* The virt-specifiers for the function. */
6671 cp_virt_specifiers virt_specifiers;
6672 /* The ref-qualifier for the function. */
6673 cp_ref_qualifier ref_qualifier;
6674 /* The transaction-safety qualifier for the function. */
6675 tree tx_qualifier;
6676 /* The exception-specification for the function. */
6677 tree exception_specification;
6678 /* The late-specified return type, if any. */
6679 tree late_return_type;
6680 /* The trailing requires-clause, if any. */
6681 tree requires_clause;
6682 location_t parens_loc;
6683 } function;
6684 /* For arrays. */
6685 struct {
6686 /* The bounds to the array. */
6687 tree bounds;
6688 } array;
6689 /* For cdk_pointer and cdk_ptrmem. */
6690 struct {
6691 /* The cv-qualifiers for the pointer. */
6692 cp_cv_quals qualifiers;
6693 /* For cdk_ptrmem, the class type containing the member. */
6694 tree class_type;
6695 } pointer;
6696 /* For cdk_reference */
6697 struct {
6698 /* The cv-qualifiers for the reference. These qualifiers are
6699 only used to diagnose ill-formed code. */
6700 cp_cv_quals qualifiers;
6701 /* Whether this is an rvalue reference */
6702 bool rvalue_ref;
6703 } reference;
6704 } u;
6705};
6706
6707/* A level of template instantiation. */
6708struct GTY((chain_next ("%h.next"))) tinst_level {
6709 /* The immediately deeper level in the chain. */
6710 struct tinst_level *next;
6711
6712 /* The original node. TLDCL can be a DECL (for a function or static
6713 data member), a TYPE (for a class), depending on what we were
6714 asked to instantiate, or a TREE_LIST with the template as PURPOSE
6715 and the template args as VALUE, if we are substituting for
6716 overload resolution. In all these cases, TARGS is NULL.
6717 However, to avoid creating TREE_LIST objects for substitutions if
6718 we can help, we store PURPOSE and VALUE in TLDCL and TARGS,
6719 respectively. So TLDCL stands for TREE_LIST or DECL (the
6720 template is a DECL too), whereas TARGS stands for the template
6721 arguments. */
6722 tree tldcl, targs;
6723
6724 /* For modules we need to know (a) the modules on the path of
6725 instantiation and (b) the transitive imports along that path.
6726 Note that these two bitmaps may be inherited from NEXT, if this
6727 decl is in the same module as NEXT (or has no new information). */
6728 bitmap path;
6729 bitmap visible;
6730
6731 private:
6732 /* Return TRUE iff the original node is a split list. */
6733 bool split_list_p () const { return targs; }
6734
6735 /* Return TRUE iff the original node is a TREE_LIST object. */
6736 bool tree_list_p () const
6737 {
6738 return !split_list_p () && TREE_CODE (tldcl) == TREE_LIST;
6739 }
6740
6741 /* Return TRUE iff the original node is not a list, split or not. */
6742 bool not_list_p () const
6743 {
6744 return !split_list_p () && !tree_list_p ();
6745 }
6746
6747 /* Convert (in place) the original node from a split list to a
6748 TREE_LIST. */
6749 tree to_list ();
6750
6751 public:
6752 /* Release storage for OBJ and node, if it's a TREE_LIST. */
6753 static void free (tinst_level *obj);
6754
6755 /* Return TRUE iff the original node is a list, split or not. */
6756 bool list_p () const { return !not_list_p (); }
6757
6758 /* Return the original node; if it's a split list, make it a
6759 TREE_LIST first, so that it can be returned as a single tree
6760 object. */
6761 tree get_node () {
6762 if (!split_list_p ()) return tldcl;
6763 else return to_list ();
6764 }
6765
6766 /* Return the original node if it's a DECL or a TREE_LIST, but do
6767 NOT convert a split list to a TREE_LIST: return NULL instead. */
6768 tree maybe_get_node () const {
6769 if (!split_list_p ()) return tldcl;
6770 else return NULL_TREE;
6771 }
6772
6773 /* The location where the template is instantiated. */
6774 location_t locus;
6775
6776 /* errorcount + sorrycount when we pushed this level. If the value
6777 overflows, it will always seem like we currently have more errors, so we
6778 will limit template recursion even from non-erroneous templates. In a TU
6779 with over 32k errors, that's fine. */
6780 unsigned short errors : 15;
6781
6782 /* set in pop_tinst_level if there have been errors since we pushed. */
6783 bool had_errors : 1;
6784
6785 /* Count references to this object. If refcount reaches
6786 refcount_infinity value, we don't increment or decrement the
6787 refcount anymore, as the refcount isn't accurate anymore.
6788 The object can be still garbage collected if unreferenced from
6789 anywhere, which might keep referenced objects referenced longer than
6790 otherwise necessary. Hitting the infinity is rare though. */
6791 unsigned short refcount;
6792
6793 /* Infinity value for the above refcount. */
6794 static const unsigned short refcount_infinity = (unsigned short) ~0;
6795};
6796
6797/* BUILT_IN_FRONTEND function codes. */
6798enum cp_built_in_function {
6799 CP_BUILT_IN_IS_CONSTANT_EVALUATED,
6800 CP_BUILT_IN_INTEGER_PACK,
6801 CP_BUILT_IN_IS_CORRESPONDING_MEMBER,
6802 CP_BUILT_IN_IS_POINTER_INTERCONVERTIBLE_WITH_CLASS,
6803 CP_BUILT_IN_SOURCE_LOCATION,
6804 CP_BUILT_IN_LAST
6805};
6806
6807bool decl_spec_seq_has_spec_p (const cp_decl_specifier_seq *, cp_decl_spec);
6808
6809/* Return the type of the `this' parameter of FNTYPE. */
6810
6811inline tree
6812type_of_this_parm (const_tree fntype)
6813{
6814 function_args_iterator iter;
6815 gcc_assert (TREE_CODE (fntype) == METHOD_TYPE);
6816 function_args_iter_init (i: &iter, fntype);
6817 return function_args_iter_cond (i: &iter);
6818}
6819
6820/* Return the class of the `this' parameter of FNTYPE. */
6821
6822inline tree
6823class_of_this_parm (const_tree fntype)
6824{
6825 return TREE_TYPE (type_of_this_parm (fntype));
6826}
6827
6828/* A parameter list indicating for a function with no parameters,
6829 e.g "int f(void)". */
6830extern cp_parameter_declarator *no_parameters;
6831
6832/* Various dump ids. */
6833extern int class_dump_id;
6834extern int module_dump_id;
6835extern int raw_dump_id;
6836extern int coro_dump_id;
6837extern int tinst_dump_id;
6838
6839/* Whether the current context is manifestly constant-evaluated.
6840 Used by the constexpr machinery to control folding of
6841 __builtin_is_constant_evaluated. */
6842
6843enum class mce_value
6844{
6845 /* Unknown, so treat __builtin_is_constant_evaluated as non-constant. */
6846 mce_unknown = 0,
6847 /* Fold it to true. */
6848 mce_true = 1,
6849 /* Fold it to false. Primarily used during cp_fold_function and
6850 cp_fully_fold_init. */
6851 mce_false = -1,
6852};
6853constexpr mce_value mce_unknown = mce_value::mce_unknown;
6854constexpr mce_value mce_true = mce_value::mce_true;
6855constexpr mce_value mce_false = mce_value::mce_false;
6856
6857/* in call.cc */
6858extern bool check_dtor_name (tree, tree);
6859int magic_varargs_p (tree);
6860
6861extern tree build_conditional_expr (const op_location_t &,
6862 tree, tree, tree,
6863 tsubst_flags_t);
6864extern tree build_addr_func (tree, tsubst_flags_t);
6865extern void set_flags_from_callee (tree);
6866extern tree build_call_a (tree, int, tree*);
6867extern tree build_call_n (tree, int, ...);
6868extern bool null_ptr_cst_p (tree);
6869extern bool null_member_pointer_value_p (tree);
6870extern bool sufficient_parms_p (const_tree);
6871extern tree type_decays_to (tree);
6872extern tree extract_call_expr (tree);
6873extern tree build_trivial_dtor_call (tree, bool = false);
6874extern tristate ref_conv_binds_to_temporary (tree, tree, bool = false);
6875extern unsigned HOST_WIDE_INT count_ctor_elements (tree);
6876extern tree build_user_type_conversion (tree, tree, int,
6877 tsubst_flags_t);
6878extern tree build_new_function_call (tree, vec<tree, va_gc> **,
6879 tsubst_flags_t);
6880extern tree build_operator_new_call (tree, vec<tree, va_gc> **,
6881 tree *, tree *, tree, tree,
6882 tree *, tsubst_flags_t);
6883extern tree build_new_method_call (tree, tree,
6884 vec<tree, va_gc> **, tree,
6885 int, tree *, tsubst_flags_t);
6886extern tree build_special_member_call (tree, tree,
6887 vec<tree, va_gc> **,
6888 tree, int, tsubst_flags_t);
6889extern tree build_new_op (const op_location_t &,
6890 enum tree_code,
6891 int, tree, tree, tree, tree,
6892 tree *, tsubst_flags_t);
6893/* Wrapper that leaves out the usually-null op3 and overload parms. */
6894inline tree build_new_op (const op_location_t &loc, enum tree_code code,
6895 int flags, tree arg1, tree arg2,
6896 tsubst_flags_t complain)
6897{
6898 return build_new_op (loc, code, flags, arg1, arg2, NULL_TREE, NULL_TREE,
6899 NULL, complain);
6900}
6901extern tree keep_unused_object_arg (tree, tree, tree);
6902extern tree build_op_call (tree, vec<tree, va_gc> **,
6903 tsubst_flags_t);
6904extern tree build_op_subscript (const op_location_t &, tree,
6905 vec<tree, va_gc> **, tree *,
6906 tsubst_flags_t);
6907extern bool aligned_allocation_fn_p (tree);
6908extern tree destroying_delete_p (tree);
6909extern bool usual_deallocation_fn_p (tree);
6910extern tree build_op_delete_call (enum tree_code, tree, tree,
6911 bool, tree, tree,
6912 tsubst_flags_t);
6913extern tree build_coroutine_op_delete_call (enum tree_code, tree, tree,
6914 bool, tree, tree,
6915 tsubst_flags_t complain);
6916extern bool can_convert (tree, tree, tsubst_flags_t);
6917extern bool can_convert_standard (tree, tree, tsubst_flags_t);
6918extern bool can_convert_arg (tree, tree, tree, int,
6919 tsubst_flags_t);
6920extern bool can_convert_arg_bad (tree, tree, tree, int,
6921 tsubst_flags_t);
6922extern int conv_flags (int, int, tree, tree, int);
6923extern struct conversion * good_conversion (tree, tree, tree, int, tsubst_flags_t);
6924extern location_t get_fndecl_argument_location (tree, int);
6925extern void complain_about_bad_argument (location_t arg_loc,
6926 tree from_type, tree to_type,
6927 tree fndecl, int parmnum);
6928extern void maybe_inform_about_fndecl_for_bogus_argument_init (tree, int,
6929 const char * = nullptr);
6930extern tree perform_dguide_overload_resolution (tree, const vec<tree, va_gc> *,
6931 tsubst_flags_t);
6932
6933
6934/* A class for recording information about access failures (e.g. private
6935 fields), so that we can potentially supply a fix-it hint about
6936 an accessor (from a context in which the constness of the object
6937 is known). */
6938
6939class access_failure_info
6940{
6941 public:
6942 access_failure_info () : m_was_inaccessible (false),
6943 m_basetype_path (NULL_TREE),
6944 m_decl (NULL_TREE), m_diag_decl (NULL_TREE) {}
6945
6946 void record_access_failure (tree basetype_path, tree decl, tree diag_decl);
6947
6948 bool was_inaccessible_p () const { return m_was_inaccessible; }
6949 tree get_decl () const { return m_decl; }
6950 tree get_diag_decl () const { return m_diag_decl; }
6951 tree get_any_accessor (bool const_p) const;
6952 void maybe_suggest_accessor (bool const_p) const;
6953 static void add_fixit_hint (rich_location *richloc, tree accessor);
6954
6955 private:
6956 bool m_was_inaccessible;
6957 tree m_basetype_path;
6958 tree m_decl;
6959 tree m_diag_decl;
6960};
6961
6962extern void complain_about_access (tree, tree, tree, bool,
6963 access_kind);
6964extern void push_defarg_context (tree);
6965extern void pop_defarg_context (void);
6966extern tree convert_default_arg (tree, tree, tree, int,
6967 tsubst_flags_t);
6968extern tree convert_arg_to_ellipsis (tree, tsubst_flags_t);
6969extern tree build_x_va_arg (location_t, tree, tree);
6970extern tree cxx_type_promotes_to (tree);
6971extern tree type_passed_as (tree);
6972extern tree convert_for_arg_passing (tree, tree, tsubst_flags_t);
6973extern bool is_properly_derived_from (tree, tree);
6974extern tree initialize_reference (tree, tree, int,
6975 tsubst_flags_t);
6976extern tree extend_ref_init_temps (tree, tree,
6977 vec<tree, va_gc>**,
6978 tree * = NULL);
6979extern tree make_temporary_var_for_ref_to_temp (tree, tree);
6980extern bool type_has_extended_temps (tree);
6981extern tree strip_top_quals (tree);
6982extern bool reference_related_p (tree, tree);
6983extern bool reference_compatible_p (tree, tree);
6984extern int remaining_arguments (tree);
6985extern tree build_implicit_conv_flags (tree, tree, int);
6986extern tree perform_implicit_conversion (tree, tree, tsubst_flags_t);
6987extern tree perform_implicit_conversion_flags (tree, tree, tsubst_flags_t, int);
6988extern tree build_converted_constant_expr (tree, tree, tsubst_flags_t);
6989extern tree build_converted_constant_bool_expr (tree, tsubst_flags_t);
6990extern tree perform_direct_initialization_if_possible (tree, tree, bool,
6991 tsubst_flags_t);
6992extern vec<tree,va_gc> *resolve_args (vec<tree,va_gc>*, tsubst_flags_t);
6993extern tree in_charge_arg_for_name (tree);
6994extern bool in_immediate_context ();
6995extern bool immediate_invocation_p (tree);
6996extern tree build_cxx_call (tree, int, tree *,
6997 tsubst_flags_t,
6998 tree = NULL_TREE);
6999extern bool is_std_init_list (tree);
7000extern bool is_list_ctor (tree);
7001extern void validate_conversion_obstack (void);
7002extern void mark_versions_used (tree);
7003extern int unsafe_return_slot_p (tree);
7004extern bool unsafe_copy_elision_p (tree, tree);
7005extern bool make_safe_copy_elision (tree, tree);
7006extern bool cp_handle_deprecated_or_unavailable (tree, tsubst_flags_t = tf_warning_or_error);
7007extern void cp_warn_deprecated_use_scopes (tree);
7008extern tree get_function_version_dispatcher (tree);
7009extern bool any_template_arguments_need_structural_equality_p (tree);
7010extern void maybe_show_nonconverting_candidate (tree, tree, tree, int);
7011extern bool conv_binds_to_reference_parm_p (tree, tree);
7012
7013/* in class.cc */
7014extern tree build_vfield_ref (tree, tree);
7015extern tree build_if_in_charge (tree true_stmt, tree false_stmt = void_node);
7016extern tree build_base_path (enum tree_code, tree,
7017 tree, int, tsubst_flags_t);
7018extern tree convert_to_base (tree, tree, bool, bool,
7019 tsubst_flags_t);
7020extern tree convert_to_base_statically (tree, tree);
7021extern bool is_empty_base_ref (tree);
7022extern tree build_vtbl_ref (tree, tree);
7023extern tree build_vfn_ref (tree, tree);
7024extern tree get_vtable_decl (tree, int);
7025extern bool object_parms_correspond (tree, tree, tree);
7026extern bool iobj_parm_corresponds_to (tree, tree, tree);
7027extern bool add_method (tree, tree, bool);
7028extern tree declared_access (tree);
7029extern bool maybe_push_used_methods (tree);
7030extern tree currently_open_class (tree);
7031extern tree currently_open_derived_class (tree);
7032extern tree outermost_open_class (void);
7033extern tree current_nonlambda_class_type (void);
7034extern tree finish_struct (tree, tree);
7035extern void finish_struct_1 (tree);
7036extern int resolves_to_fixed_type_p (tree, int * = NULL);
7037extern void init_class_processing (void);
7038extern int is_empty_class (tree);
7039extern bool is_really_empty_class (tree, bool);
7040extern void pushclass (tree);
7041extern void popclass (void);
7042extern void push_nested_class (tree);
7043extern void pop_nested_class (void);
7044extern int current_lang_depth (void);
7045extern void push_lang_context (tree);
7046extern void pop_lang_context (void);
7047extern tree instantiate_type (tree, tree, tsubst_flags_t);
7048extern void build_self_reference (void);
7049extern int same_signature_p (const_tree, const_tree);
7050extern tree lookup_vfn_in_binfo (tree, tree);
7051extern void maybe_add_class_template_decl_list (tree, tree, int);
7052extern void unreverse_member_declarations (tree);
7053extern bool is_empty_field (tree);
7054extern void invalidate_class_lookup_cache (void);
7055extern void maybe_note_name_used_in_class (tree, tree);
7056extern void note_name_declared_in_class (tree, tree);
7057extern tree get_vtbl_decl_for_binfo (tree);
7058extern bool vptr_via_virtual_p (tree);
7059extern void debug_class (tree);
7060extern void debug_thunks (tree);
7061extern void set_linkage_according_to_type (tree, tree);
7062extern void determine_key_method (tree);
7063extern void check_for_override (tree, tree);
7064extern void push_class_stack (void);
7065extern void pop_class_stack (void);
7066extern bool default_ctor_p (const_tree);
7067extern bool type_has_user_nondefault_constructor (tree);
7068extern tree in_class_defaulted_default_constructor (tree);
7069extern bool user_provided_p (tree);
7070extern bool type_has_user_provided_constructor (tree);
7071extern bool type_has_non_user_provided_default_constructor (tree);
7072extern bool type_has_converting_constructor (tree);
7073extern bool vbase_has_user_provided_move_assign (tree);
7074extern tree default_init_uninitialized_part (tree);
7075extern bool trivial_default_constructor_is_constexpr (tree);
7076extern bool type_has_constexpr_default_constructor (tree);
7077extern bool type_has_constexpr_destructor (tree);
7078extern bool type_has_virtual_destructor (tree);
7079extern bool type_has_non_deleted_trivial_default_ctor (tree);
7080extern bool classtype_has_move_assign_or_move_ctor_p (tree, bool user_declared);
7081extern bool classtype_has_non_deleted_move_ctor (tree);
7082extern tree classtype_has_depr_implicit_copy (tree);
7083extern bool classtype_has_op (tree, tree_code);
7084extern tree classtype_has_defaulted_op (tree, tree_code);
7085extern bool type_build_ctor_call (tree);
7086extern bool type_build_dtor_call (tree);
7087extern void explain_non_literal_class (tree);
7088extern void inherit_targ_abi_tags (tree);
7089extern void maybe_delete_defaulted_fn (tree, tree);
7090extern void defaulted_late_check (tree, tristate = tristate::unknown ());
7091extern bool defaultable_fn_check (tree);
7092extern void check_abi_tags (tree);
7093extern tree missing_abi_tags (tree);
7094extern void fixup_type_variants (tree);
7095extern void fixup_attribute_variants (tree);
7096extern void build_cdtor_clones (tree, bool, bool, bool);
7097extern void clone_cdtor (tree, bool);
7098extern tree copy_operator_fn (tree, tree_code code);
7099extern void adjust_clone_args (tree);
7100extern void deduce_noexcept_on_destructor (tree);
7101extern bool uniquely_derived_from_p (tree, tree);
7102extern bool publicly_uniquely_derived_p (tree, tree);
7103extern tree common_enclosing_class (tree, tree);
7104
7105/* in cvt.cc */
7106extern tree convert_to_reference (tree, tree, int, int, tree,
7107 tsubst_flags_t);
7108extern tree convert_from_reference (tree);
7109extern tree force_rvalue (tree, tsubst_flags_t);
7110extern tree force_lvalue (tree, tsubst_flags_t);
7111extern tree ocp_convert (tree, tree, int, int,
7112 tsubst_flags_t);
7113extern tree cp_convert (tree, tree, tsubst_flags_t);
7114extern tree cp_convert_and_check (tree, tree, tsubst_flags_t);
7115extern tree cp_fold_convert (tree, tree);
7116extern tree cp_get_callee (tree);
7117extern tree cp_get_callee_fndecl (tree);
7118extern tree cp_get_callee_fndecl_nofold (tree);
7119extern tree cp_get_fndecl_from_callee (tree, bool fold = true);
7120extern tree convert_to_void (tree, impl_conv_void,
7121 tsubst_flags_t);
7122extern tree convert_force (tree, tree, int,
7123 tsubst_flags_t);
7124extern tree build_expr_type_conversion (int, tree, bool);
7125extern tree type_promotes_to (tree);
7126extern bool can_convert_qual (tree, tree);
7127extern tree perform_qualification_conversions (tree, tree);
7128extern bool tx_safe_fn_type_p (tree);
7129extern tree tx_unsafe_fn_variant (tree);
7130extern bool fnptr_conv_p (tree, tree);
7131extern tree strip_fnptr_conv (tree);
7132
7133/* in name-lookup.cc */
7134extern void maybe_push_cleanup_level (tree);
7135extern tree maybe_push_decl (tree);
7136extern tree current_decl_namespace (void);
7137
7138/* decl.cc */
7139extern tree poplevel (int, int, int);
7140extern void cxx_init_decl_processing (void);
7141enum cp_tree_node_structure_enum cp_tree_node_structure
7142 (union lang_tree_node *);
7143extern void finish_scope (void);
7144extern void push_switch (tree);
7145extern void pop_switch (void);
7146extern void note_break_stmt (void);
7147extern bool note_iteration_stmt_body_start (void);
7148extern void note_iteration_stmt_body_end (bool);
7149extern void determine_local_discriminator (tree, tree = NULL_TREE);
7150extern bool member_like_constrained_friend_p (tree);
7151extern bool fns_correspond (tree, tree);
7152extern int decls_match (tree, tree, bool = true);
7153extern bool maybe_version_functions (tree, tree, bool);
7154extern bool validate_constexpr_redeclaration (tree, tree);
7155extern bool merge_default_template_args (tree, tree, bool);
7156extern tree duplicate_decls (tree, tree,
7157 bool hiding = false,
7158 bool was_hidden = false);
7159extern void mark_label_addressed (tree);
7160extern tree declare_local_label (tree);
7161extern tree define_label (location_t, tree);
7162extern void check_goto (tree);
7163extern bool check_omp_return (void);
7164extern tree make_typename_type (tree, tree, enum tag_types, tsubst_flags_t);
7165extern tree build_typename_type (tree, tree, tree, tag_types);
7166extern tree make_unbound_class_template (tree, tree, tree, tsubst_flags_t);
7167extern tree make_unbound_class_template_raw (tree, tree, tree);
7168extern unsigned push_abi_namespace (tree node = abi_node);
7169extern void pop_abi_namespace (unsigned flags,
7170 tree node = abi_node);
7171extern tree build_library_fn_ptr (const char *, tree, int);
7172extern tree build_cp_library_fn_ptr (const char *, tree, int);
7173extern tree push_library_fn (tree, tree, tree, int);
7174extern tree push_throw_library_fn (tree, tree);
7175extern void warn_misplaced_attr_for_class_type (location_t location,
7176 tree class_type);
7177extern tree check_tag_decl (cp_decl_specifier_seq *, bool);
7178extern tree shadow_tag (cp_decl_specifier_seq *);
7179extern tree groktypename (cp_decl_specifier_seq *, const cp_declarator *, bool);
7180extern tree start_decl (const cp_declarator *, cp_decl_specifier_seq *, int, tree, tree, tree *);
7181extern void start_decl_1 (tree, bool);
7182extern bool check_array_initializer (tree, tree, tree);
7183extern void omp_declare_variant_finalize (tree, tree);
7184struct cp_decomp { tree decl; unsigned int count; };
7185extern void cp_finish_decl (tree, tree, bool, tree, int, cp_decomp * = nullptr);
7186extern tree lookup_decomp_type (tree);
7187extern bool cp_finish_decomp (tree, cp_decomp *, bool = false);
7188extern int cp_complete_array_type (tree *, tree, bool);
7189extern int cp_complete_array_type_or_error (tree *, tree, bool, tsubst_flags_t);
7190extern tree build_ptrmemfunc_type (tree);
7191extern tree build_ptrmem_type (tree, tree);
7192/* the grokdeclarator prototype is in decl.h */
7193extern tree build_this_parm (tree, tree, cp_cv_quals);
7194extern tree grokparms (tree, tree *);
7195extern int copy_fn_p (const_tree);
7196extern bool move_fn_p (const_tree);
7197extern bool move_signature_fn_p (const_tree);
7198extern tree get_scope_of_declarator (const cp_declarator *);
7199extern void grok_special_member_properties (tree);
7200extern bool grok_ctor_properties (const_tree, const_tree);
7201extern bool grok_op_properties (tree, bool);
7202extern tree xref_tag (tag_types, tree,
7203 TAG_how = TAG_how::CURRENT_ONLY,
7204 bool tpl_header_p = false);
7205extern void xref_basetypes (tree, tree);
7206extern tree start_enum (tree, tree, tree, tree, bool, bool *);
7207extern void finish_enum_value_list (tree);
7208extern void finish_enum (tree);
7209extern tree build_enumerator (tree, tree, tree, tree, location_t);
7210extern tree lookup_enumerator (tree, tree);
7211extern bool start_preparsed_function (tree, tree, int);
7212extern bool start_function (cp_decl_specifier_seq *,
7213 const cp_declarator *, tree);
7214extern tree maybe_prepare_return_this (tree);
7215extern void maybe_return_this (void);
7216extern tree begin_function_body (void);
7217extern void finish_function_body (tree);
7218extern tree outer_curly_brace_block (tree);
7219extern tree finish_function (bool);
7220extern tree grokmethod (cp_decl_specifier_seq *, const cp_declarator *, tree);
7221extern void maybe_register_incomplete_var (tree);
7222extern void maybe_commonize_var (tree);
7223extern void complete_vars (tree);
7224extern tree static_fn_type (tree);
7225extern void revert_static_member_fn (tree);
7226extern void fixup_anonymous_aggr (tree);
7227extern tree compute_array_index_type (tree, tree, tsubst_flags_t);
7228extern tree check_default_argument (tree, tree, tsubst_flags_t);
7229extern int wrapup_namespace_globals ();
7230extern tree create_implicit_typedef (tree, tree);
7231extern int local_variable_p (const_tree);
7232extern tree get_cxa_atexit_fn_ptr_type ();
7233extern tree register_dtor_fn (tree, bool = false);
7234extern tmpl_spec_kind current_tmpl_spec_kind (int);
7235extern tree cxx_builtin_function (tree decl);
7236extern tree cxx_builtin_function_ext_scope (tree decl);
7237extern tree cxx_simulate_builtin_function_decl (tree);
7238extern tree check_elaborated_type_specifier (enum tag_types, tree, bool);
7239extern void warn_extern_redeclared_static (tree, tree);
7240extern tree cxx_comdat_group (tree);
7241extern bool cp_missing_noreturn_ok_p (tree);
7242extern bool is_direct_enum_init (tree, tree);
7243extern void initialize_artificial_var (tree, vec<constructor_elt, va_gc> *);
7244extern tree check_var_type (tree, tree, location_t);
7245extern tree reshape_init (tree, tree, tsubst_flags_t);
7246extern tree next_aggregate_field (tree);
7247extern tree next_subobject_field (tree);
7248extern tree first_field (const_tree);
7249extern tree fndecl_declared_return_type (tree);
7250extern bool undeduced_auto_decl (tree);
7251extern bool require_deduced_type (tree, tsubst_flags_t = tf_warning_or_error);
7252
7253extern tree finish_case_label (location_t, tree, tree);
7254extern tree cxx_maybe_build_cleanup (tree, tsubst_flags_t);
7255extern bool check_array_designated_initializer (constructor_elt *,
7256 unsigned HOST_WIDE_INT);
7257extern bool check_for_uninitialized_const_var (tree, bool, tsubst_flags_t);
7258extern tree build_explicit_specifier (tree, tsubst_flags_t);
7259extern bool use_eh_spec_block (tree);
7260extern void do_push_parm_decls (tree, tree, tree *);
7261extern tree do_aggregate_paren_init (tree, tree);
7262
7263/* in decl2.cc */
7264extern void record_mangling (tree, bool);
7265extern void overwrite_mangling (tree, tree);
7266extern void note_mangling_alias (tree, tree);
7267extern void generate_mangling_aliases (void);
7268extern tree build_memfn_type (tree, tree, cp_cv_quals, cp_ref_qualifier);
7269extern tree build_pointer_ptrmemfn_type (tree);
7270extern tree change_return_type (tree, tree);
7271extern void maybe_retrofit_in_chrg (tree);
7272extern void maybe_make_one_only (tree);
7273extern bool vague_linkage_p (tree);
7274extern void grokclassfn (tree, tree,
7275 enum overload_flags);
7276extern tree grok_array_decl (location_t, tree, tree,
7277 vec<tree, va_gc> **, tsubst_flags_t);
7278extern tree grok_omp_array_section (location_t, tree, tree, tree);
7279extern tree delete_sanity (location_t, tree, tree, bool,
7280 int, tsubst_flags_t);
7281extern tree check_classfn (tree, tree, tree);
7282extern void check_member_template (tree);
7283extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *,
7284 tree, bool, tree, tree);
7285extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *,
7286 tree, tree, tree);
7287extern tree start_initialized_static_member (const cp_declarator *,
7288 cp_decl_specifier_seq *, tree);
7289extern bool is_static_data_member_initialized_in_class (tree decl);
7290extern void finish_initialized_static_member (tree, tree, tree);
7291extern tree splice_template_attributes (tree *, tree);
7292extern bool any_dependent_type_attributes_p (tree);
7293extern tree cp_reconstruct_complex_type (tree, tree);
7294extern bool attributes_naming_typedef_ok (tree);
7295extern void cplus_decl_attributes (tree *, tree, int);
7296extern void finish_anon_union (tree);
7297extern void cxx_post_compilation_parsing_cleanups (void);
7298extern tree coerce_new_type (tree, location_t);
7299extern void coerce_delete_type (tree, location_t);
7300extern void comdat_linkage (tree);
7301extern void determine_visibility (tree);
7302extern void constrain_class_visibility (tree);
7303extern void reset_type_linkage (tree);
7304extern void tentative_decl_linkage (tree);
7305extern void import_export_decl (tree);
7306extern tree build_cleanup (tree);
7307extern tree build_offset_ref_call_from_tree (tree, vec<tree, va_gc> **,
7308 tsubst_flags_t);
7309extern bool decl_defined_p (tree);
7310extern bool decl_constant_var_p (tree);
7311extern bool decl_maybe_constant_var_p (tree);
7312extern void no_linkage_error (tree);
7313extern void check_default_args (tree);
7314extern bool mark_used (tree,
7315 tsubst_flags_t = tf_warning_or_error);
7316extern bool mark_single_function (tree, tsubst_flags_t);
7317extern void finish_static_data_member_decl (tree, tree, bool, tree, int);
7318extern tree cp_build_parm_decl (tree, tree, tree);
7319extern void copy_linkage (tree, tree);
7320extern tree get_guard (tree);
7321extern tree get_guard_cond (tree, bool);
7322extern tree set_guard (tree);
7323extern bool var_needs_tls_wrapper (tree);
7324extern tree maybe_get_tls_wrapper_call (tree);
7325extern void mark_needed (tree);
7326extern bool decl_needed_p (tree);
7327extern void note_vague_linkage_fn (tree);
7328extern void note_vague_linkage_variable (tree);
7329extern tree build_artificial_parm (tree, tree, tree);
7330extern bool possibly_inlined_p (tree);
7331extern int parm_index (tree);
7332extern tree vtv_start_verification_constructor_init_function (void);
7333extern tree vtv_finish_verification_constructor_init_function (tree);
7334extern void cp_check_const_attributes (tree);
7335extern void maybe_propagate_warmth_attributes (tree, tree);
7336
7337/* in error.cc */
7338/* A class for pretty-printing to -flang-dump-XXX files. Used like
7339
7340 if (cxx_dump_pretty_printer pp {foo_dump_id})
7341 {
7342 pp_printf (&pp, ...);
7343 }
7344
7345 If the dump is enabled, the pretty printer will open the dump file and
7346 attach to it, and flush and close the file on destruction. */
7347
7348class cxx_dump_pretty_printer: public pretty_printer
7349{
7350 int phase;
7351 FILE *outf;
7352 dump_flags_t flags;
7353
7354public:
7355 cxx_dump_pretty_printer (int phase);
7356 operator bool() { return outf != nullptr; }
7357 bool has_flag (dump_flags_t f) { return (flags & f); }
7358 ~cxx_dump_pretty_printer ();
7359};
7360
7361extern const char *type_as_string (tree, int);
7362extern const char *type_as_string_translate (tree, int);
7363extern const char *decl_as_string (tree, int);
7364extern const char *decl_as_string_translate (tree, int);
7365extern const char *decl_as_dwarf_string (tree, int);
7366extern const char *expr_as_string (tree, int);
7367extern const char *expr_to_string (tree);
7368extern const char *lang_decl_name (tree, int, bool);
7369extern const char *lang_decl_dwarf_name (tree, int, bool);
7370extern const char *language_to_string (enum languages);
7371extern const char *class_key_or_enum_as_string (tree);
7372extern void maybe_warn_variadic_templates (void);
7373extern void maybe_warn_cpp0x (cpp0x_warn_str str,
7374 location_t = input_location);
7375extern bool pedwarn_cxx98 (location_t,
7376 diagnostic_option_id option_id,
7377 const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
7378extern location_t location_of (tree);
7379extern void qualified_name_lookup_error (tree, tree, tree,
7380 location_t);
7381
7382struct decl_location_traits
7383 : simple_cache_map_traits<tree_decl_hash, location_t> { };
7384typedef hash_map<tree, location_t, decl_location_traits> erroneous_templates_t;
7385extern GTY((cache)) erroneous_templates_t *erroneous_templates;
7386
7387extern bool cp_seen_error ();
7388#define seen_error() cp_seen_error ()
7389
7390/* in except.cc */
7391extern void init_terminate_fn (void);
7392extern void init_exception_processing (void);
7393extern tree expand_start_catch_block (tree);
7394extern void expand_end_catch_block (void);
7395extern tree build_exc_ptr (void);
7396extern tree build_throw (location_t, tree,
7397 tsubst_flags_t);
7398extern int nothrow_libfn_p (const_tree);
7399extern void check_handlers (tree);
7400extern tree finish_noexcept_expr (tree, tsubst_flags_t);
7401extern bool expr_noexcept_p (tree, tsubst_flags_t);
7402extern void perform_deferred_noexcept_checks (void);
7403extern bool nothrow_spec_p (const_tree);
7404extern bool type_noexcept_p (const_tree);
7405extern bool type_throw_all_p (const_tree);
7406extern tree build_noexcept_spec (tree, tsubst_flags_t);
7407extern void choose_personality_routine (enum languages);
7408extern tree build_must_not_throw_expr (tree,tree);
7409extern tree eh_type_info (tree);
7410extern tree begin_eh_spec_block (void);
7411extern void finish_eh_spec_block (tree, tree);
7412extern tree build_eh_type_type (tree);
7413extern tree cp_protect_cleanup_actions (void);
7414extern void maybe_splice_retval_cleanup (tree, bool);
7415extern tree maybe_set_retval_sentinel (void);
7416
7417extern tree template_parms_to_args (tree);
7418extern tree template_parms_level_to_args (tree);
7419extern tree generic_targs_for (tree);
7420extern tree outer_template_args (const_tree);
7421
7422/* in expr.cc */
7423extern tree cplus_expand_constant (tree);
7424extern tree mark_use (tree expr, bool rvalue_p, bool read_p,
7425 location_t = UNKNOWN_LOCATION,
7426 bool reject_builtin = true);
7427extern tree mark_rvalue_use (tree,
7428 location_t = UNKNOWN_LOCATION,
7429 bool reject_builtin = true);
7430extern tree mark_lvalue_use (tree);
7431extern tree mark_lvalue_use_nonread (tree);
7432extern tree mark_type_use (tree);
7433extern tree mark_discarded_use (tree);
7434extern void mark_exp_read (tree);
7435
7436/* friend.cc */
7437extern int is_friend (tree, tree);
7438extern void make_friend_class (tree, tree, bool);
7439extern void add_friend (tree, tree, bool);
7440extern tree do_friend (tree, tree, tree,
7441 enum overload_flags, bool);
7442
7443extern void set_global_friend (tree);
7444extern bool is_global_friend (tree);
7445
7446/* in init.cc */
7447extern tree find_temps_r (tree *, int *, void *);
7448extern tree expand_member_init (tree);
7449extern void emit_mem_initializers (tree);
7450extern tree build_aggr_init (tree, tree, int,
7451 tsubst_flags_t);
7452extern int is_class_type (tree, int);
7453extern bool is_copy_initialization (tree);
7454extern tree build_zero_init (tree, tree, bool);
7455extern tree build_value_init (tree, tsubst_flags_t);
7456extern tree build_value_init_noctor (tree, tsubst_flags_t);
7457extern tree maybe_instantiate_nsdmi_init (tree, tsubst_flags_t);
7458extern tree get_nsdmi (tree, bool, tsubst_flags_t);
7459extern tree build_offset_ref (tree, tree, bool,
7460 tsubst_flags_t);
7461extern tree throw_bad_array_new_length (void);
7462extern bool type_has_new_extended_alignment (tree);
7463extern unsigned malloc_alignment (void);
7464extern bool std_placement_new_fn_p (tree);
7465extern tree build_new_constexpr_heap_type (tree, tree, tree);
7466extern tree build_new (location_t,
7467 vec<tree, va_gc> **, tree,
7468 tree, vec<tree, va_gc> **,
7469 int, tsubst_flags_t);
7470extern tree get_temp_regvar (tree, tree);
7471extern tree build_vec_init (tree, tree, tree, bool, int,
7472 tsubst_flags_t,
7473 vec<tree, va_gc> ** = nullptr);
7474extern tree build_delete (location_t, tree, tree,
7475 special_function_kind,
7476 int, int, tsubst_flags_t);
7477extern void push_base_cleanups (void);
7478extern tree build_vec_delete (location_t, tree, tree,
7479 special_function_kind, int,
7480 tsubst_flags_t);
7481extern tree create_temporary_var (tree);
7482extern void initialize_vtbl_ptrs (tree);
7483extern tree scalar_constant_value (tree);
7484extern tree decl_constant_value (tree, bool);
7485extern tree decl_really_constant_value (tree, bool = true);
7486extern int diagnose_uninitialized_cst_or_ref_member (tree, bool, bool);
7487extern tree build_vtbl_address (tree);
7488extern bool maybe_reject_flexarray_init (tree, tree);
7489
7490/* in lex.cc */
7491extern void cxx_dup_lang_specific_decl (tree);
7492extern tree unqualified_name_lookup_error (tree,
7493 location_t = UNKNOWN_LOCATION);
7494extern tree unqualified_fn_lookup_error (cp_expr);
7495extern tree make_conv_op_name (tree);
7496extern tree build_lang_decl (enum tree_code, tree, tree);
7497extern tree build_lang_decl_loc (location_t, enum tree_code, tree, tree);
7498extern bool maybe_add_lang_decl_raw (tree, bool decomp_p);
7499extern bool maybe_add_lang_type_raw (tree);
7500extern void retrofit_lang_decl (tree);
7501extern void fit_decomposition_lang_decl (tree, tree);
7502extern tree copy_decl (tree CXX_MEM_STAT_INFO);
7503extern tree copy_type (tree CXX_MEM_STAT_INFO);
7504extern tree cxx_make_type (enum tree_code CXX_MEM_STAT_INFO);
7505extern tree make_class_type (enum tree_code CXX_MEM_STAT_INFO);
7506extern const char *get_identifier_kind_name (tree);
7507extern void set_identifier_kind (tree, cp_identifier_kind);
7508extern bool cxx_init (void);
7509extern void cxx_finish (void);
7510extern bool in_main_input_context (void);
7511extern uintptr_t module_token_pre (cpp_reader *, const cpp_token *, uintptr_t);
7512extern uintptr_t module_token_cdtor (cpp_reader *, uintptr_t);
7513extern uintptr_t module_token_lang (int type, int keyword, tree value,
7514 location_t, uintptr_t);
7515
7516/* in method.cc */
7517extern void init_method (void);
7518extern tree make_thunk (tree, bool, tree, tree);
7519extern void finish_thunk (tree);
7520extern void use_thunk (tree, bool);
7521extern bool trivial_fn_p (tree);
7522extern tree forward_parm (tree);
7523extern bool is_trivially_xible (enum tree_code, tree, tree);
7524extern bool is_nothrow_xible (enum tree_code, tree, tree);
7525extern bool is_xible (enum tree_code, tree, tree);
7526extern bool is_convertible (tree, tree);
7527extern bool is_nothrow_convertible (tree, tree);
7528extern bool ref_xes_from_temporary (tree, tree, bool);
7529extern tree get_defaulted_eh_spec (tree, tsubst_flags_t = tf_warning_or_error);
7530extern bool maybe_explain_implicit_delete (tree);
7531extern void explain_implicit_non_constexpr (tree);
7532extern bool deduce_inheriting_ctor (tree);
7533extern bool decl_remember_implicit_trigger_p (tree);
7534extern void synthesize_method (tree);
7535extern void maybe_synthesize_method (tree);
7536extern tree lazily_declare_fn (special_function_kind,
7537 tree);
7538extern tree skip_artificial_parms_for (const_tree, tree);
7539extern int num_artificial_parms_for (const_tree);
7540extern tree make_alias_for (tree, tree);
7541extern tree get_copy_ctor (tree, tsubst_flags_t);
7542extern tree get_copy_assign (tree);
7543extern tree get_default_ctor (tree);
7544extern tree get_dtor (tree, tsubst_flags_t);
7545extern tree build_stub_object (tree);
7546extern bool is_stub_object (tree);
7547extern tree build_invoke (tree, const_tree,
7548 tsubst_flags_t);
7549extern tree strip_inheriting_ctors (tree);
7550extern tree inherited_ctor_binfo (tree);
7551extern bool base_ctor_omit_inherited_parms (tree);
7552extern bool ctor_omit_inherited_parms (tree);
7553extern tree locate_ctor (tree);
7554extern tree implicitly_declare_fn (special_function_kind, tree,
7555 bool, tree, tree);
7556/* In module.cc */
7557class module_state; /* Forward declare. */
7558inline bool modules_p () { return flag_modules != 0; }
7559
7560/* The kind of module or part thereof that we're in. */
7561enum module_kind_bits
7562{
7563 MK_NAMED = 1 << 0, // TU is a named module
7564 MK_HEADER = 1 << 1, // TU is a header unit
7565 MK_INTERFACE = 1 << 2, // TU is an interface
7566 MK_PARTITION = 1 << 3, // TU is a partition
7567
7568 MK_PURVIEW = 1 << 4, // In purview of current module
7569 MK_ATTACH = 1 << 5, // Attaching to named module
7570
7571 MK_EXPORTING = 1 << 6, /* We are in an export region. */
7572};
7573
7574/* We do lots of bit-manipulation, so an unsigned is easier. */
7575extern unsigned module_kind;
7576
7577inline bool module_p ()
7578{ return module_kind & (MK_NAMED | MK_HEADER); }
7579inline bool named_module_p ()
7580{ return module_kind & MK_NAMED; }
7581inline bool header_module_p ()
7582{ return module_kind & MK_HEADER; }
7583inline bool module_interface_p ()
7584{ return module_kind & MK_INTERFACE; }
7585inline bool module_partition_p ()
7586{ return module_kind & MK_PARTITION; }
7587inline bool module_has_cmi_p ()
7588{ return module_kind & (MK_INTERFACE | MK_PARTITION | MK_HEADER); }
7589
7590inline bool module_purview_p ()
7591{ return module_kind & MK_PURVIEW; }
7592inline bool module_attach_p ()
7593{ return module_kind & MK_ATTACH; }
7594
7595inline bool named_module_purview_p ()
7596{ return named_module_p () && module_purview_p (); }
7597inline bool named_module_attach_p ()
7598{ return named_module_p () && module_attach_p (); }
7599
7600/* Like module_has_cmi_p, but tentatively assumes that this TU may have a
7601 CMI if we haven't seen the module-declaration yet. */
7602inline bool module_maybe_has_cmi_p ()
7603{ return module_has_cmi_p () || (named_module_p () && !module_purview_p ()); }
7604
7605/* We're currently exporting declarations. */
7606inline bool module_exporting_p ()
7607{ return module_kind & MK_EXPORTING; }
7608
7609extern module_state *get_module (tree name, module_state *parent = NULL,
7610 bool partition = false);
7611extern bool module_may_redeclare (tree olddecl, tree newdecl = NULL);
7612
7613extern bool module_global_init_needed ();
7614extern bool module_determine_import_inits ();
7615extern void module_add_import_initializers ();
7616
7617/* Where the namespace-scope decl was originally declared. */
7618extern void set_originating_module (tree, bool friend_p = false);
7619extern tree get_originating_module_decl (tree) ATTRIBUTE_PURE;
7620extern int get_originating_module (tree, bool for_mangle = false) ATTRIBUTE_PURE;
7621extern unsigned get_importing_module (tree, bool = false) ATTRIBUTE_PURE;
7622extern void check_module_decl_linkage (tree);
7623
7624/* Where current instance of the decl got declared/defined/instantiated. */
7625extern void set_instantiating_module (tree);
7626extern void set_defining_module (tree);
7627extern void set_defining_module_for_partial_spec (tree);
7628extern void maybe_key_decl (tree ctx, tree decl);
7629extern void propagate_defining_module (tree decl, tree orig);
7630extern void remove_defining_module (tree decl);
7631
7632extern void mangle_module (int m, bool include_partition);
7633extern void mangle_module_fini ();
7634extern void lazy_load_binding (unsigned mod, tree ns, tree id,
7635 binding_slot *bslot);
7636extern void lazy_load_pendings (tree decl);
7637extern module_state *preprocess_module (module_state *, location_t,
7638 bool in_purview,
7639 bool is_import, bool export_p,
7640 cpp_reader *reader);
7641extern void preprocessed_module (cpp_reader *reader);
7642extern void import_module (module_state *, location_t, bool export_p,
7643 tree attr, cpp_reader *);
7644extern void declare_module (module_state *, location_t, bool export_p,
7645 tree attr, cpp_reader *);
7646extern void init_modules (cpp_reader *);
7647extern void fini_modules (cpp_reader *, void *cookie, bool);
7648extern void maybe_check_all_macros (cpp_reader *);
7649extern void *finish_module_processing (cpp_reader *);
7650extern char const *module_name (unsigned, bool header_ok);
7651extern bitmap get_import_bitmap ();
7652extern bitmap visible_instantiation_path (bitmap *);
7653extern void module_begin_main_file (cpp_reader *, line_maps *,
7654 const line_map_ordinary *);
7655extern void module_preprocess_options (cpp_reader *);
7656extern bool handle_module_option (unsigned opt, const char *arg, int value);
7657
7658/* In optimize.cc */
7659extern tree clone_attrs (tree);
7660extern bool maybe_clone_body (tree);
7661
7662/* In parser.cc */
7663extern tree cp_convert_range_for (tree, tree, tree, cp_decomp *, bool,
7664 tree, bool);
7665extern void cp_convert_omp_range_for (tree &, tree &, tree &,
7666 tree &, tree &, tree &, tree &, tree &,
7667 bool);
7668extern void cp_finish_omp_range_for (tree, tree);
7669extern bool cp_maybe_parse_omp_decl (tree, tree);
7670extern bool parsing_nsdmi (void);
7671extern bool parsing_function_declarator ();
7672extern void inject_this_parameter (tree, cp_cv_quals);
7673extern location_t defparse_location (tree);
7674extern void maybe_show_extern_c_location (void);
7675extern bool literal_integer_zerop (const_tree);
7676extern tree attr_chainon (tree, tree);
7677
7678/* in pt.cc */
7679extern tree canonical_type_parameter (tree);
7680extern void push_access_scope (tree);
7681extern void pop_access_scope (tree);
7682extern bool check_template_shadow (tree);
7683extern tree get_innermost_template_args (tree, int);
7684extern void maybe_begin_member_template_processing (tree);
7685extern void maybe_end_member_template_processing (void);
7686extern tree finish_member_template_decl (tree);
7687extern void begin_template_parm_list (void);
7688extern bool begin_specialization (void);
7689extern void reset_specialization (void);
7690extern void end_specialization (void);
7691extern void begin_explicit_instantiation (void);
7692extern void end_explicit_instantiation (void);
7693extern void check_unqualified_spec_or_inst (tree, location_t);
7694extern tree check_explicit_specialization (tree, tree, int, int,
7695 tree = NULL_TREE);
7696extern int num_template_headers_for_class (tree);
7697extern void check_template_variable (tree);
7698extern tree make_auto (void);
7699extern tree make_decltype_auto (void);
7700extern tree make_constrained_auto (tree, tree);
7701extern tree make_constrained_decltype_auto (tree, tree);
7702extern tree make_template_placeholder (tree);
7703extern tree make_cast_auto (void);
7704extern bool template_placeholder_p (tree);
7705extern bool ctad_template_p (tree);
7706extern bool unparenthesized_id_or_class_member_access_p (tree);
7707extern tree do_auto_deduction (tree, tree, tree,
7708 tsubst_flags_t
7709 = tf_warning_or_error,
7710 auto_deduction_context
7711 = adc_unspecified,
7712 tree = NULL_TREE,
7713 int = LOOKUP_NORMAL,
7714 tree = NULL_TREE);
7715extern tree type_uses_auto (tree);
7716extern tree convert_generic_types_to_packs (tree, int, int);
7717extern tree splice_late_return_type (tree, tree);
7718extern bool is_auto (const_tree);
7719extern tree process_template_parm (tree, location_t, tree,
7720 bool, bool);
7721extern tree end_template_parm_list (tree);
7722extern void end_template_parm_list (void);
7723extern void end_template_decl (void);
7724extern tree maybe_update_decl_type (tree, tree);
7725extern bool check_default_tmpl_args (tree, tree, bool, bool, int);
7726extern tree push_template_decl (tree, bool is_friend = false);
7727extern tree add_inherited_template_parms (tree, tree);
7728extern void template_parm_level_and_index (tree, int*, int*);
7729extern bool redeclare_class_template (tree, tree, tree);
7730extern tree adjust_type_for_entering_scope (tree);
7731extern tree lookup_template_class (tree, tree, tree, tree,
7732 tsubst_flags_t);
7733extern tree lookup_template_function (tree, tree);
7734extern tree lookup_template_variable (tree, tree, tsubst_flags_t);
7735extern bool uses_template_parms (tree);
7736extern bool uses_template_parms_level (tree, int);
7737extern bool uses_outer_template_parms_in_constraints (tree, tree = NULL_TREE);
7738extern bool need_generic_capture (void);
7739extern tree instantiate_class_template (tree);
7740extern tree instantiate_template (tree, tree, tsubst_flags_t);
7741extern tree fn_type_unification (tree, tree, tree,
7742 const tree *, unsigned int,
7743 tree, unification_kind_t, int,
7744 struct conversion **,
7745 bool, bool);
7746extern void setup_explicit_instantiation_definition_linkage (tree);
7747extern void mark_decl_instantiated (tree, int);
7748extern int more_specialized_fn (tree, tree, int);
7749extern tree type_targs_deducible_from (tree, tree);
7750extern void do_decl_instantiation (tree, tree);
7751extern void do_type_instantiation (tree, tree, tsubst_flags_t);
7752extern bool always_instantiate_p (tree);
7753extern bool maybe_instantiate_noexcept (tree, tsubst_flags_t = tf_warning_or_error);
7754extern tree instantiate_decl (tree, bool, bool);
7755extern void maybe_instantiate_decl (tree);
7756extern int comp_template_parms (const_tree, const_tree);
7757extern bool template_heads_equivalent_p (const_tree, const_tree);
7758extern bool builtin_pack_fn_p (tree);
7759extern tree uses_parameter_packs (tree);
7760extern bool template_parameter_pack_p (const_tree);
7761extern bool function_parameter_pack_p (const_tree);
7762extern bool function_parameter_expanded_from_pack_p (tree, tree);
7763extern tree make_pack_expansion (tree, tsubst_flags_t = tf_warning_or_error);
7764extern tree make_pack_index (tree, tree);
7765extern bool check_for_bare_parameter_packs (tree, location_t = UNKNOWN_LOCATION);
7766extern tree build_template_info (tree, tree);
7767extern tree get_template_info (const_tree);
7768extern int template_class_depth (tree);
7769extern int is_specialization_of (tree, tree);
7770extern bool is_specialization_of_friend (tree, tree);
7771extern bool comp_template_args (tree, tree, tree * = NULL,
7772 tree * = NULL);
7773extern int template_args_equal (tree, tree);
7774extern tree maybe_process_partial_specialization (tree);
7775extern tree most_specialized_instantiation (tree);
7776extern tree most_specialized_partial_spec (tree, tsubst_flags_t, bool = false);
7777extern tree most_constrained_function (tree);
7778extern void print_candidates (tree);
7779extern void instantiate_pending_templates (int);
7780extern tree tsubst_default_argument (tree, int, tree, tree,
7781 tsubst_flags_t);
7782extern tree tsubst (tree, tree, tsubst_flags_t, tree);
7783extern tree tsubst_expr (tree, tree, tsubst_flags_t, tree);
7784extern tree tsubst_pack_expansion (tree, tree, tsubst_flags_t, tree);
7785extern tree tsubst_argument_pack (tree, tree, tsubst_flags_t, tree);
7786extern tree tsubst_template_args (tree, tree, tsubst_flags_t, tree);
7787extern tree tsubst_template_arg (tree, tree, tsubst_flags_t, tree);
7788extern tree tsubst_function_parms (tree, tree, tsubst_flags_t, tree);
7789extern tree most_general_template (const_tree);
7790extern tree get_mostly_instantiated_function_type (tree);
7791extern bool problematic_instantiation_changed (void);
7792extern void record_last_problematic_instantiation (void);
7793extern struct tinst_level *current_instantiation(void);
7794extern bool instantiating_current_function_p (void);
7795extern tree maybe_get_template_decl_from_type_decl (tree);
7796extern int processing_template_parmlist;
7797extern bool dependent_type_p (tree);
7798extern bool dependent_scope_p (tree);
7799extern bool dependentish_scope_p (tree);
7800extern bool any_dependent_template_arguments_p (const_tree);
7801extern bool any_erroneous_template_args_p (const_tree);
7802extern bool dependent_template_p (tree);
7803extern bool dependent_template_id_p (tree, tree);
7804extern bool type_dependent_expression_p (tree);
7805extern bool type_dependent_object_expression_p (tree);
7806extern bool any_type_dependent_arguments_p (const vec<tree, va_gc> *);
7807extern bool any_type_dependent_elements_p (const_tree);
7808extern bool type_dependent_expression_p_push (tree);
7809extern bool value_dependent_expression_p (tree);
7810extern bool instantiation_dependent_uneval_expression_p (tree);
7811extern bool any_value_dependent_elements_p (const_tree);
7812extern bool dependent_omp_for_p (tree, tree, tree, tree, tree);
7813extern tree resolve_typename_type (tree, bool);
7814extern tree template_for_substitution (tree);
7815extern bool reregister_specialization (tree, tree, tree);
7816extern tree instantiate_non_dependent_expr (tree, tsubst_flags_t = tf_error);
7817extern tree instantiate_non_dependent_expr_internal (tree, tsubst_flags_t);
7818extern tree instantiate_non_dependent_or_null (tree);
7819extern bool variable_template_specialization_p (tree);
7820extern bool alias_type_or_template_p (tree);
7821enum { nt_opaque = false, nt_transparent = true };
7822extern tree alias_template_specialization_p (const_tree, bool);
7823extern tree dependent_alias_template_spec_p (const_tree, bool);
7824extern bool dependent_opaque_alias_p (const_tree);
7825extern tree get_template_parm_object (tree expr, tree mangle,
7826 bool check_init = true);
7827extern tree tparm_object_argument (tree);
7828extern bool explicit_class_specialization_p (tree);
7829extern bool push_tinst_level (tree);
7830extern bool push_tinst_level (tree, tree);
7831extern bool push_tinst_level_loc (tree, location_t);
7832extern bool push_tinst_level_loc (tree, tree, location_t);
7833extern void pop_tinst_level (void);
7834extern struct tinst_level *outermost_tinst_level(void);
7835extern bool non_templated_friend_p (tree);
7836extern void init_template_processing (void);
7837extern void print_template_statistics (void);
7838bool template_template_parameter_p (const_tree);
7839bool template_type_parameter_p (const_tree);
7840extern bool primary_template_specialization_p (const_tree);
7841extern tree get_primary_template_innermost_parameters (const_tree);
7842extern tree get_template_innermost_arguments (const_tree);
7843extern tree get_template_argument_pack_elems (const_tree);
7844extern tree get_function_template_decl (const_tree);
7845extern tree resolve_nondeduced_context (tree, tsubst_flags_t);
7846extern tree resolve_nondeduced_context_or_error (tree, tsubst_flags_t);
7847extern hashval_t iterative_hash_template_arg (tree arg, hashval_t val);
7848extern tree coerce_template_parms (tree, tree, tree, tsubst_flags_t,
7849 bool = true);
7850extern tree canonicalize_type_argument (tree, tsubst_flags_t);
7851extern void register_local_identity (tree);
7852extern void register_local_specialization (tree, tree);
7853extern tree retrieve_local_specialization (tree);
7854extern void register_parameter_specializations (tree, tree);
7855extern tree extract_fnparm_pack (tree, tree *);
7856extern tree template_parm_to_arg (tree);
7857extern tree dguide_name (tree);
7858extern bool dguide_name_p (tree);
7859extern bool deduction_guide_p (const_tree);
7860extern bool copy_guide_p (const_tree);
7861extern bool template_guide_p (const_tree);
7862extern bool builtin_guide_p (const_tree);
7863extern bool inherited_guide_p (const_tree);
7864extern void store_explicit_specifier (tree, tree);
7865extern tree lookup_explicit_specifier (tree);
7866extern tree lookup_imported_hidden_friend (tree);
7867extern void walk_specializations (bool,
7868 void (*)(bool, spec_entry *,
7869 void *),
7870 void *);
7871extern tree match_mergeable_specialization (bool is_decl, spec_entry *);
7872extern unsigned get_mergeable_specialization_flags (bool is_decl, tree tmpl,
7873 tree spec);
7874extern void add_mergeable_specialization (bool is_decl, spec_entry *,
7875 tree outer, unsigned);
7876extern tree add_to_template_args (tree, tree);
7877extern tree add_outermost_template_args (tree, tree);
7878extern tree add_extra_args (tree, tree, tsubst_flags_t, tree);
7879extern tree build_extra_args (tree, tree, tsubst_flags_t);
7880
7881/* in rtti.cc */
7882/* A vector of all tinfo decls that haven't been emitted yet. */
7883extern GTY(()) vec<tree, va_gc> *unemitted_tinfo_decls;
7884
7885extern void init_rtti_processing (void);
7886extern tree build_typeid (tree, tsubst_flags_t);
7887extern tree get_tinfo_decl_direct (tree, tree, int);
7888extern tree get_tinfo_decl (tree);
7889extern tree get_typeid (tree, tsubst_flags_t);
7890extern tree build_headof (tree);
7891extern tree build_dynamic_cast (location_t, tree, tree,
7892 tsubst_flags_t);
7893extern void emit_support_tinfos (void);
7894extern bool emit_tinfo_decl (tree);
7895extern unsigned get_pseudo_tinfo_index (tree);
7896extern tree get_pseudo_tinfo_type (unsigned);
7897extern tree build_if_nonnull (tree, tree, tsubst_flags_t);
7898
7899/* in search.cc */
7900extern tree get_parent_with_private_access (tree decl, tree binfo);
7901extern bool accessible_base_p (tree, tree, bool);
7902extern tree lookup_base (tree, tree, base_access,
7903 base_kind *, tsubst_flags_t,
7904 HOST_WIDE_INT = -1);
7905extern tree dcast_base_hint (tree, tree);
7906extern int accessible_p (tree, tree, bool);
7907extern int accessible_in_template_p (tree, tree);
7908extern tree lookup_field (tree, tree, int, bool);
7909extern tree lookup_fnfields (tree, tree, int, tsubst_flags_t);
7910extern tree lookup_member (tree, tree, int, bool,
7911 tsubst_flags_t,
7912 access_failure_info *afi = NULL);
7913extern tree lookup_member_fuzzy (tree, tree, bool);
7914extern tree locate_field_accessor (tree, tree, bool);
7915extern int look_for_overrides (tree, tree);
7916extern void get_pure_virtuals (tree);
7917extern void maybe_suppress_debug_info (tree);
7918extern void note_debug_info_needed (tree);
7919extern tree current_scope (void);
7920extern int at_function_scope_p (void);
7921extern bool at_class_scope_p (void);
7922extern bool at_namespace_scope_p (void);
7923extern tree context_for_name_lookup (tree);
7924extern tree type_context_for_name_lookup (tree);
7925extern tree lookup_conversions (tree);
7926extern tree binfo_from_vbase (tree);
7927extern tree binfo_for_vbase (tree, tree);
7928extern tree look_for_overrides_here (tree, tree);
7929#define dfs_skip_bases ((tree)1)
7930extern tree dfs_walk_all (tree, tree (*) (tree, void *),
7931 tree (*) (tree, void *), void *);
7932extern tree dfs_walk_once (tree, tree (*) (tree, void *),
7933 tree (*) (tree, void *), void *);
7934extern tree binfo_via_virtual (tree, tree);
7935extern bool binfo_direct_p (tree);
7936extern tree build_baselink (tree, tree, tree, tree);
7937extern tree adjust_result_of_qualified_name_lookup
7938 (tree, tree, tree);
7939extern tree copied_binfo (tree, tree);
7940extern tree original_binfo (tree, tree);
7941extern bool shared_member_p (tree);
7942extern bool any_dependent_bases_p (tree = current_nonlambda_class_type ());
7943extern bool maybe_check_overriding_exception_spec (tree, tree);
7944
7945/* in semantics.cc */
7946extern void push_deferring_access_checks (deferring_kind);
7947extern void resume_deferring_access_checks (void);
7948extern void stop_deferring_access_checks (void);
7949extern void pop_deferring_access_checks (void);
7950extern vec<deferred_access_check, va_gc> *get_deferred_access_checks (void);
7951extern void reopen_deferring_access_checks (vec<deferred_access_check, va_gc> *);
7952extern void pop_to_parent_deferring_access_checks (void);
7953extern bool perform_access_checks (vec<deferred_access_check, va_gc> *,
7954 tsubst_flags_t);
7955extern bool perform_deferred_access_checks (tsubst_flags_t);
7956extern bool perform_or_defer_access_check (tree, tree, tree,
7957 tsubst_flags_t,
7958 access_failure_info *afi = NULL);
7959extern tree maybe_convert_cond (tree);
7960
7961/* RAII sentinel to ensures that deferred access checks are popped before
7962 a function returns. */
7963
7964class deferring_access_check_sentinel
7965{
7966public:
7967 deferring_access_check_sentinel (enum deferring_kind kind = dk_deferred)
7968 {
7969 push_deferring_access_checks (kind);
7970 }
7971 ~deferring_access_check_sentinel ()
7972 {
7973 pop_deferring_access_checks ();
7974 }
7975};
7976
7977extern int stmts_are_full_exprs_p (void);
7978extern void init_cp_semantics (void);
7979extern tree do_poplevel (tree);
7980extern void break_maybe_infinite_loop (void);
7981extern void add_decl_expr (tree);
7982extern tree maybe_cleanup_point_expr_void (tree);
7983extern tree finish_expr_stmt (tree);
7984extern tree begin_if_stmt (void);
7985extern tree finish_if_stmt_cond (tree, tree);
7986extern tree finish_then_clause (tree);
7987extern void begin_else_clause (tree);
7988extern void finish_else_clause (tree);
7989extern void finish_if_stmt (tree);
7990extern tree begin_while_stmt (void);
7991extern void finish_while_stmt_cond (tree, tree, bool, tree, bool);
7992extern void finish_while_stmt (tree);
7993extern tree begin_do_stmt (void);
7994extern void finish_do_body (tree);
7995extern void finish_do_stmt (tree, tree, bool, tree, bool);
7996extern tree finish_return_stmt (tree);
7997extern tree begin_for_scope (tree *);
7998extern tree begin_for_stmt (tree, tree);
7999extern void finish_init_stmt (tree);
8000extern void finish_for_cond (tree, tree, bool, tree, bool);
8001extern void finish_for_expr (tree, tree);
8002extern void find_range_for_decls (tree[3]);
8003extern void finish_for_stmt (tree);
8004extern tree begin_range_for_stmt (tree, tree);
8005extern void finish_range_for_decl (tree, tree, tree);
8006extern void finish_range_for_stmt (tree);
8007extern tree finish_break_stmt (void);
8008extern tree finish_continue_stmt (void);
8009extern tree begin_switch_stmt (void);
8010extern void finish_switch_cond (tree, tree);
8011extern void finish_switch_stmt (tree);
8012extern tree finish_goto_stmt (tree);
8013extern tree begin_try_block (void);
8014extern void finish_try_block (tree);
8015extern void finish_handler_sequence (tree);
8016extern tree begin_function_try_block (tree *);
8017extern void finish_function_try_block (tree);
8018extern void finish_function_handler_sequence (tree, tree);
8019extern void finish_cleanup_try_block (tree);
8020extern tree begin_handler (void);
8021extern void finish_handler_parms (tree, tree);
8022extern void finish_handler (tree);
8023extern void finish_cleanup (tree, tree);
8024extern bool is_this_parameter (tree);
8025extern bool is_object_parameter (tree);
8026
8027enum {
8028 BCS_NORMAL = 0,
8029 BCS_NO_SCOPE = 1,
8030 BCS_TRY_BLOCK = 2,
8031 BCS_FN_BODY = 4,
8032 BCS_TRANSACTION = 8,
8033 BCS_STMT_EXPR = 16
8034};
8035extern tree begin_compound_stmt (unsigned int);
8036
8037extern void finish_compound_stmt (tree);
8038extern tree finish_asm_string_expression (location_t, tree);
8039extern tree finish_asm_stmt (location_t, int, tree, tree,
8040 tree, tree, tree, bool, bool);
8041extern tree finish_label_stmt (tree);
8042extern void finish_label_decl (tree);
8043extern cp_expr finish_parenthesized_expr (cp_expr);
8044extern tree force_paren_expr (tree, bool = false);
8045inline tree force_paren_expr_uneval (tree t)
8046{ return force_paren_expr (t, true); }
8047extern tree maybe_undo_parenthesized_ref (tree);
8048extern tree finish_non_static_data_member (tree, tree, tree,
8049 tsubst_flags_t = tf_warning_or_error);
8050extern tree begin_stmt_expr (void);
8051extern tree finish_stmt_expr_expr (tree, tree);
8052extern tree finish_stmt_expr (tree, bool);
8053extern tree stmt_expr_value_expr (tree);
8054bool empty_expr_stmt_p (tree);
8055extern cp_expr perform_koenig_lookup (cp_expr, vec<tree, va_gc> *,
8056 tsubst_flags_t);
8057extern tree finish_call_expr (tree, vec<tree, va_gc> **, bool,
8058 bool, tsubst_flags_t);
8059extern tree lookup_and_finish_template_variable (tree, tree, tsubst_flags_t = tf_warning_or_error);
8060extern tree finish_template_variable (tree, tsubst_flags_t = tf_warning_or_error);
8061extern cp_expr finish_increment_expr (cp_expr, enum tree_code);
8062extern tree finish_this_expr (void);
8063extern tree finish_pseudo_destructor_expr (tree, tree, tree, location_t, tsubst_flags_t);
8064extern cp_expr finish_unary_op_expr (location_t, enum tree_code, cp_expr,
8065 tsubst_flags_t);
8066/* Whether this call to finish_compound_literal represents a C++11 functional
8067 cast or a C99 compound literal. */
8068enum fcl_t { fcl_functional, fcl_c99 };
8069extern tree finish_compound_literal (tree, tree, tsubst_flags_t, fcl_t = fcl_functional);
8070extern tree finish_fname (tree);
8071extern void finish_translation_unit (void);
8072extern tree finish_template_type_parm (tree, tree);
8073extern tree finish_template_template_parm (tree, tree);
8074extern tree begin_class_definition (tree);
8075extern void finish_template_decl (tree);
8076extern tree finish_template_type (tree, tree, int);
8077extern tree finish_base_specifier (tree, tree, bool);
8078extern void finish_member_declaration (tree);
8079extern bool outer_automatic_var_p (tree);
8080extern tree process_outer_var_ref (tree, tsubst_flags_t, bool force_use = false);
8081extern cp_expr finish_id_expression (tree, tree, tree,
8082 cp_id_kind *,
8083 bool, bool, bool *,
8084 bool, bool, bool, bool,
8085 const char **,
8086 location_t);
8087extern tree finish_typeof (tree);
8088extern tree finish_underlying_type (tree);
8089extern tree calculate_bases (tree, tsubst_flags_t);
8090extern tree finish_bases (tree, bool);
8091extern tree calculate_direct_bases (tree, tsubst_flags_t);
8092extern tree pack_index_element (tree, tree, bool,
8093 tsubst_flags_t);
8094extern tree finish_offsetof (tree, tree, location_t);
8095extern void finish_decl_cleanup (tree, tree);
8096extern void finish_eh_cleanup (tree);
8097extern void emit_associated_thunks (tree);
8098extern void finish_mem_initializers (tree);
8099extern tree check_template_template_default_arg (tree);
8100extern bool expand_or_defer_fn_1 (tree);
8101extern void expand_or_defer_fn (tree);
8102extern bool check_accessibility_of_qualified_id (tree, tree, tree, tsubst_flags_t);
8103extern tree finish_qualified_id_expr (tree, tree, bool, bool,
8104 bool, bool, tsubst_flags_t);
8105extern void simplify_aggr_init_expr (tree *);
8106extern void finalize_nrv (tree, tree);
8107extern tree omp_reduction_id (enum tree_code, tree, tree);
8108extern tree omp_mapper_id (tree, tree);
8109extern tree cp_remove_omp_priv_cleanup_stmt (tree *, int *, void *);
8110extern bool cp_check_omp_declare_reduction (tree);
8111extern bool cp_check_omp_declare_mapper (tree);
8112extern void finish_omp_declare_simd_methods (tree);
8113extern tree cp_finish_omp_init_prefer_type (tree);
8114extern tree finish_omp_clauses (tree, enum c_omp_region_type);
8115extern tree omp_instantiate_mappers (tree);
8116extern tree push_omp_privatization_clauses (bool);
8117extern void pop_omp_privatization_clauses (tree);
8118extern void save_omp_privatization_clauses (vec<tree> &);
8119extern void restore_omp_privatization_clauses (vec<tree> &);
8120extern void finish_omp_threadprivate (tree);
8121extern tree begin_omp_structured_block (void);
8122extern tree finish_omp_structured_block (tree);
8123extern tree finish_oacc_data (tree, tree);
8124extern tree finish_oacc_host_data (tree, tree);
8125extern tree finish_omp_construct (enum tree_code, tree, tree);
8126extern tree begin_omp_parallel (void);
8127extern tree finish_omp_parallel (tree, tree);
8128extern tree begin_omp_task (void);
8129extern tree finish_omp_task (tree, tree);
8130extern tree finish_omp_for (location_t, enum tree_code,
8131 tree, tree, tree, tree, tree,
8132 tree, tree, vec<tree> *, tree);
8133extern tree finish_omp_for_block (tree, tree);
8134extern void finish_omp_atomic (location_t, enum tree_code,
8135 enum tree_code, tree, tree,
8136 tree, tree, tree, tree, tree,
8137 enum omp_memory_order, bool);
8138extern void finish_omp_barrier (void);
8139extern void finish_omp_depobj (location_t, tree,
8140 enum omp_clause_depend_kind,
8141 tree);
8142extern void finish_omp_flush (int);
8143extern void finish_omp_taskwait (void);
8144extern void finish_omp_taskyield (void);
8145extern void finish_omp_cancel (tree);
8146extern void finish_omp_cancellation_point (tree);
8147extern tree omp_privatize_field (tree, bool);
8148extern tree begin_transaction_stmt (location_t, tree *, int);
8149extern void finish_transaction_stmt (tree, tree, int, tree);
8150extern tree build_transaction_expr (location_t, tree, int, tree);
8151extern bool cxx_omp_create_clause_info (tree, tree, bool, bool,
8152 bool, bool);
8153extern tree baselink_for_fns (tree);
8154extern void finish_static_assert (tree, tree, location_t,
8155 bool, bool);
8156extern tree finish_decltype_type (tree, bool, tsubst_flags_t);
8157extern tree fold_builtin_is_corresponding_member (location_t, int, tree *);
8158extern tree fold_builtin_is_pointer_inverconvertible_with_class (location_t, int, tree *);
8159extern tree finish_trait_expr (location_t, enum cp_trait_kind, tree, tree);
8160extern tree finish_trait_type (enum cp_trait_kind, tree, tree, tsubst_flags_t);
8161extern tree build_lambda_expr (void);
8162extern tree build_lambda_object (tree);
8163extern tree begin_lambda_type (tree);
8164extern tree lambda_capture_field_type (tree, bool, bool);
8165extern tree lambda_proxy_type (tree);
8166extern tree lambda_function (tree);
8167extern void apply_deduced_return_type (tree, tree);
8168extern tree add_capture (tree, tree, tree, bool, bool, unsigned *);
8169extern tree add_default_capture (tree, tree, tree);
8170extern void insert_capture_proxy (tree);
8171extern void insert_pending_capture_proxies (void);
8172extern bool is_capture_proxy (tree);
8173extern bool is_normal_capture_proxy (tree);
8174extern tree strip_normal_capture_proxy (tree);
8175extern bool is_constant_capture_proxy (tree);
8176extern void register_capture_members (tree);
8177extern tree lambda_expr_this_capture (tree, int);
8178extern void maybe_generic_this_capture (tree, tree);
8179extern tree maybe_resolve_dummy (tree, bool);
8180extern tree current_nonlambda_function (void);
8181extern tree nonlambda_method_basetype (void);
8182extern tree current_nonlambda_scope (bool = false);
8183extern tree current_lambda_expr (void);
8184extern bool generic_lambda_fn_p (tree);
8185extern tree do_dependent_capture (tree, bool = false);
8186extern bool lambda_fn_in_template_p (tree);
8187extern void maybe_add_lambda_conv_op (tree);
8188extern bool is_lambda_ignored_entity (tree);
8189extern bool lambda_static_thunk_p (tree);
8190extern bool call_from_lambda_thunk_p (tree);
8191extern tree finish_builtin_launder (location_t, tree,
8192 tsubst_flags_t);
8193extern tree cp_build_vec_convert (tree, location_t, tree,
8194 tsubst_flags_t);
8195extern tree cp_build_bit_cast (location_t, tree, tree,
8196 tsubst_flags_t);
8197extern void start_lambda_scope (tree decl);
8198extern void finish_lambda_scope (void);
8199extern void record_lambda_scope (tree lambda);
8200extern void record_lambda_scope_discriminator (tree lambda);
8201extern void record_lambda_scope_sig_discriminator (tree lambda, tree fn);
8202extern tree start_lambda_function (tree fn, tree lambda_expr);
8203extern void finish_lambda_function (tree body);
8204extern bool regenerated_lambda_fn_p (tree);
8205extern tree lambda_regenerating_args (tree);
8206extern tree most_general_lambda (tree);
8207extern tree finish_omp_target (location_t, tree, tree, bool);
8208extern void finish_omp_target_clauses (location_t, tree, tree *);
8209extern void maybe_warn_unparenthesized_assignment (tree, bool, tsubst_flags_t);
8210extern tree cp_check_pragma_unroll (location_t, tree);
8211
8212/* in tree.cc */
8213extern int cp_tree_operand_length (const_tree);
8214extern int cp_tree_code_length (enum tree_code);
8215extern void cp_free_lang_data (tree t);
8216extern tree force_target_expr (tree, tree, tsubst_flags_t);
8217extern tree build_target_expr_with_type (tree, tree, tsubst_flags_t);
8218extern void lang_check_failed (const char *, int,
8219 const char *) ATTRIBUTE_NORETURN
8220 ATTRIBUTE_COLD;
8221extern tree stabilize_expr (tree, tree *);
8222extern void stabilize_call (tree, tree *);
8223extern bool stabilize_init (tree, tree *);
8224extern tree add_stmt_to_compound (tree, tree);
8225extern void init_tree (void);
8226extern bool pod_type_p (const_tree);
8227extern bool layout_pod_type_p (const_tree);
8228extern bool std_layout_type_p (const_tree);
8229extern bool trivial_type_p (const_tree);
8230extern bool trivially_copyable_p (const_tree);
8231extern bool type_has_unique_obj_representations (const_tree);
8232extern bool scalarish_type_p (const_tree);
8233extern bool structural_type_p (tree, bool = false);
8234extern bool type_has_nontrivial_default_init (const_tree);
8235extern bool type_has_nontrivial_copy_init (const_tree);
8236extern void maybe_warn_parm_abi (tree, location_t);
8237extern bool class_tmpl_impl_spec_p (const_tree);
8238extern int zero_init_p (const_tree);
8239extern bool zero_init_expr_p (tree);
8240extern bool check_abi_tag_redeclaration (const_tree, const_tree,
8241 const_tree);
8242extern bool check_abi_tag_args (tree, tree);
8243extern tree strip_typedefs (tree, bool * = NULL,
8244 unsigned int = 0);
8245extern tree strip_typedefs_expr (tree, bool * = NULL,
8246 unsigned int = 0);
8247extern tree copy_binfo (tree, tree, tree,
8248 tree *, int);
8249extern int member_p (const_tree);
8250extern cp_lvalue_kind real_lvalue_p (const_tree);
8251extern cp_lvalue_kind lvalue_kind (const_tree);
8252extern bool glvalue_p (const_tree);
8253extern bool obvalue_p (const_tree);
8254extern bool xvalue_p (const_tree);
8255extern bool bitfield_p (const_tree);
8256extern bool non_mergeable_glvalue_p (const_tree);
8257extern tree cp_stabilize_reference (tree);
8258extern bool builtin_valid_in_constant_expr_p (const_tree);
8259extern tree build_min (enum tree_code, tree, ...);
8260extern tree build_min_nt_loc (location_t, enum tree_code,
8261 ...);
8262extern tree build_min_non_dep (enum tree_code, tree, ...);
8263extern tree build_min_non_dep_op_overload (enum tree_code, tree, tree, ...);
8264extern tree build_min_non_dep_op_overload (tree, tree, tree,
8265 vec<tree, va_gc> *);
8266extern tree build_min_nt_call_vec (tree, vec<tree, va_gc> *);
8267extern tree build_min_non_dep_call_vec (tree, tree, vec<tree, va_gc> *);
8268extern vec<tree, va_gc>* vec_copy_and_insert (vec<tree, va_gc>*, tree, unsigned);
8269extern tree build_cplus_new (tree, tree, tsubst_flags_t);
8270extern tree build_local_temp (tree);
8271extern bool is_local_temp (tree);
8272extern tree build_aggr_init_expr (tree, tree);
8273extern tree get_target_expr (tree,
8274 tsubst_flags_t = tf_warning_or_error);
8275extern tree get_internal_target_expr (tree);
8276extern tree build_cplus_array_type (tree, tree, int is_dep = -1);
8277extern tree build_array_of_n_type (tree, unsigned HOST_WIDE_INT);
8278extern bool array_of_runtime_bound_p (tree);
8279extern bool vla_type_p (tree);
8280extern tree build_array_copy (tree);
8281extern tree build_vec_init_expr (tree, tree, tsubst_flags_t);
8282extern tree expand_vec_init_expr (tree, tree, tsubst_flags_t,
8283 vec<tree,va_gc>** = nullptr);
8284extern void diagnose_non_constexpr_vec_init (tree);
8285extern tree hash_tree_cons (tree, tree, tree);
8286extern tree hash_tree_chain (tree, tree);
8287extern tree build_qualified_name (tree, tree, tree, bool);
8288extern tree build_ref_qualified_type (tree, cp_ref_qualifier);
8289extern tree make_binding_vec (tree, unsigned clusters CXX_MEM_STAT_INFO);
8290inline tree ovl_first (tree) ATTRIBUTE_PURE;
8291extern tree ovl_make (tree fn,
8292 tree next = NULL_TREE);
8293extern tree ovl_insert (tree fn, tree maybe_ovl,
8294 int using_or_hidden = 0);
8295extern tree ovl_skip_hidden (tree) ATTRIBUTE_PURE;
8296extern void lookup_mark (tree lookup, bool val);
8297extern tree lookup_add (tree fns, tree lookup);
8298extern tree lookup_maybe_add (tree fns, tree lookup,
8299 bool deduping);
8300extern int is_overloaded_fn (tree) ATTRIBUTE_PURE;
8301extern bool really_overloaded_fn (tree) ATTRIBUTE_PURE;
8302extern tree dependent_name (tree);
8303extern tree call_expr_dependent_name (tree);
8304extern tree maybe_get_fns (tree) ATTRIBUTE_PURE;
8305extern tree get_fns (tree) ATTRIBUTE_PURE;
8306extern tree get_first_fn (tree) ATTRIBUTE_PURE;
8307extern tree ovl_scope (tree);
8308extern const char *cxx_printable_name (tree, int);
8309extern const char *cxx_printable_name_translate (tree, int);
8310extern tree canonical_eh_spec (tree);
8311extern tree build_cp_fntype_variant (tree, cp_ref_qualifier, tree, bool);
8312extern tree build_exception_variant (tree, tree);
8313extern void fixup_deferred_exception_variants (tree, tree);
8314extern tree bind_template_template_parm (tree, tree);
8315extern tree array_type_nelts_total (tree);
8316extern bool array_of_unknown_bound_p (const_tree);
8317extern tree break_out_target_exprs (tree, bool = false);
8318extern tree build_ctor_subob_ref (tree, tree, tree);
8319extern tree replace_placeholders (tree, tree, bool * = NULL);
8320extern bool find_placeholders (tree);
8321extern tree get_type_decl (tree);
8322extern tree decl_namespace_context (tree);
8323extern bool decl_anon_ns_mem_p (tree);
8324extern bool decl_internal_context_p (const_tree);
8325extern tree lvalue_type (tree);
8326extern tree error_type (tree);
8327extern int varargs_function_p (const_tree);
8328extern bool cp_tree_equal (tree, tree);
8329extern tree no_linkage_check (tree, bool);
8330extern void debug_binfo (tree);
8331extern tree build_dummy_object (tree);
8332extern tree maybe_dummy_object (tree, tree *);
8333extern bool is_dummy_object (const_tree);
8334extern bool is_byte_access_type (tree);
8335extern bool is_byte_access_type_not_plain_char (tree);
8336extern const struct scoped_attribute_specs cxx_gnu_attribute_table;
8337extern const struct scoped_attribute_specs std_attribute_table;
8338extern const struct scoped_attribute_specs internal_attribute_table;
8339extern tree make_ptrmem_cst (tree, tree);
8340extern tree cp_build_type_attribute_variant (tree, tree);
8341extern tree cp_build_reference_type (tree, bool);
8342extern tree move (tree);
8343extern tree cp_build_qualified_type (tree, int,
8344 tsubst_flags_t = tf_warning_or_error);
8345extern bool cv_qualified_p (const_tree);
8346extern tree cv_unqualified (tree);
8347extern special_function_kind special_function_p (const_tree);
8348extern special_function_kind special_memfn_p (const_tree);
8349extern int count_trees (tree);
8350extern int char_type_p (tree);
8351extern void verify_stmt_tree (tree);
8352extern linkage_kind decl_linkage (tree);
8353extern duration_kind decl_storage_duration (tree);
8354extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn,
8355 void*, hash_set<tree> *);
8356#define cp_walk_tree(tp,func,data,pset) \
8357 walk_tree_1 (tp, func, data, pset, cp_walk_subtrees)
8358#define cp_walk_tree_without_duplicates(tp,func,data) \
8359 walk_tree_without_duplicates_1 (tp, func, data, cp_walk_subtrees)
8360extern tree rvalue (tree);
8361extern tree convert_bitfield_to_declared_type (tree);
8362extern tree cp_save_expr (tree);
8363extern bool cast_valid_in_integral_constant_expression_p (tree);
8364extern bool cxx_type_hash_eq (const_tree, const_tree);
8365extern tree cxx_copy_lang_qualifiers (const_tree, const_tree);
8366
8367extern void cxx_print_statistics (void);
8368extern bool maybe_warn_zero_as_null_pointer_constant (tree, location_t);
8369
8370/* in ptree.cc */
8371extern void cxx_print_xnode (FILE *, tree, int);
8372extern void cxx_print_decl (FILE *, tree, int);
8373extern void cxx_print_type (FILE *, tree, int);
8374extern void cxx_print_identifier (FILE *, tree, int);
8375extern void cxx_print_error_function (diagnostic_text_output_format &,
8376 const char *,
8377 const diagnostic_info *);
8378
8379/* in typeck.cc */
8380/* Says how we should behave when comparing two arrays one of which
8381 has unknown bounds. */
8382enum compare_bounds_t { bounds_none, bounds_either, bounds_first };
8383
8384extern bool cxx_mark_addressable (tree, bool = false);
8385extern int string_conv_p (const_tree, const_tree, int);
8386extern tree cp_truthvalue_conversion (tree, tsubst_flags_t);
8387extern tree contextual_conv_bool (tree, tsubst_flags_t);
8388extern tree condition_conversion (tree);
8389extern tree require_complete_type (tree,
8390 tsubst_flags_t = tf_warning_or_error);
8391extern tree complete_type (tree);
8392extern tree complete_type_or_else (tree, tree);
8393extern tree complete_type_or_maybe_complain (tree, tree, tsubst_flags_t);
8394extern int cp_compare_floating_point_conversion_ranks (tree, tree);
8395inline bool type_unknown_p (const_tree);
8396enum { ce_derived, ce_type, ce_normal, ce_exact };
8397extern bool comp_except_specs (const_tree, const_tree, int);
8398extern bool comptypes (tree, tree, int);
8399extern bool same_type_ignoring_top_level_qualifiers_p (tree, tree);
8400extern bool similar_type_p (tree, tree);
8401extern bool cp_comp_parm_types (tree, tree);
8402extern bool next_common_initial_sequence (tree &, tree &);
8403extern bool layout_compatible_type_p (tree, tree);
8404extern bool compparms (const_tree, const_tree);
8405extern int comp_cv_qualification (const_tree, const_tree);
8406extern int comp_cv_qualification (int, int);
8407extern int comp_cv_qual_signature (tree, tree);
8408extern tree cxx_sizeof_or_alignof_expr (location_t, tree,
8409 enum tree_code, bool, bool);
8410extern tree cxx_sizeof_or_alignof_type (location_t, tree,
8411 enum tree_code, bool, bool);
8412extern tree cxx_alignas_expr (tree);
8413extern tree cxx_sizeof_nowarn (tree);
8414extern tree is_bitfield_expr_with_lowered_type (const_tree);
8415extern tree unlowered_expr_type (const_tree);
8416extern tree decay_conversion (tree,
8417 tsubst_flags_t,
8418 bool = true);
8419extern tree build_class_member_access_expr (cp_expr, tree, tree, bool,
8420 tsubst_flags_t);
8421extern tree finish_class_member_access_expr (cp_expr, tree, bool,
8422 tsubst_flags_t);
8423extern tree lookup_destructor (tree, tree, tree, tsubst_flags_t);
8424extern tree build_dependent_operator_type (tree, enum tree_code, bool);
8425extern tree build_x_indirect_ref (location_t, tree,
8426 ref_operator, tree,
8427 tsubst_flags_t);
8428extern tree cp_build_indirect_ref (location_t, tree,
8429 ref_operator,
8430 tsubst_flags_t);
8431extern tree cp_build_fold_indirect_ref (tree);
8432extern tree build_array_ref (location_t, tree, tree);
8433extern tree cp_build_array_ref (location_t, tree, tree,
8434 tsubst_flags_t);
8435extern tree get_member_function_from_ptrfunc (tree *, tree, tsubst_flags_t);
8436extern tree cp_build_function_call_nary (tree, tsubst_flags_t, ...)
8437 ATTRIBUTE_SENTINEL;
8438extern tree cp_build_function_call_vec (tree, vec<tree, va_gc> **,
8439 tsubst_flags_t,
8440 tree = NULL_TREE);
8441extern tree build_x_binary_op (const op_location_t &,
8442 enum tree_code, tree,
8443 enum tree_code, tree,
8444 enum tree_code, tree,
8445 tree *, tsubst_flags_t);
8446inline tree build_x_binary_op (const op_location_t &loc,
8447 enum tree_code code, tree arg1, tree arg2,
8448 tsubst_flags_t complain)
8449{
8450 return build_x_binary_op (loc, code, arg1, TREE_CODE (arg1), arg2,
8451 TREE_CODE (arg2), NULL_TREE, NULL, complain);
8452}
8453extern tree build_x_array_ref (location_t, tree, tree,
8454 tsubst_flags_t);
8455extern tree build_omp_array_section (location_t, tree, tree, tree);
8456extern tree build_x_unary_op (location_t,
8457 enum tree_code, cp_expr,
8458 tree, tsubst_flags_t);
8459extern tree cp_build_addressof (location_t, tree,
8460 tsubst_flags_t);
8461extern tree cp_build_addr_expr (tree, tsubst_flags_t);
8462extern tree cp_build_unary_op (enum tree_code, tree, bool,
8463 tsubst_flags_t);
8464extern tree genericize_compound_lvalue (tree);
8465extern tree unary_complex_lvalue (enum tree_code, tree);
8466extern tree build_x_conditional_expr (location_t, tree, tree, tree,
8467 tsubst_flags_t);
8468extern tree build_x_compound_expr_from_list (tree, expr_list_kind,
8469 tsubst_flags_t);
8470extern tree build_x_compound_expr_from_vec (vec<tree, va_gc> *,
8471 const char *, tsubst_flags_t);
8472extern tree build_x_compound_expr (location_t, tree, tree,
8473 tree, tsubst_flags_t);
8474extern tree build_compound_expr (location_t, tree, tree);
8475extern tree cp_build_compound_expr (tree, tree, tsubst_flags_t);
8476extern tree build_static_cast (location_t, tree, tree,
8477 tsubst_flags_t);
8478extern tree build_reinterpret_cast (location_t, tree, tree,
8479 tsubst_flags_t);
8480extern tree build_const_cast (location_t, tree, tree,
8481 tsubst_flags_t);
8482extern tree build_c_cast (location_t, tree, tree);
8483extern cp_expr build_c_cast (location_t loc, tree type,
8484 cp_expr expr);
8485extern tree cp_build_c_cast (location_t, tree, tree,
8486 tsubst_flags_t);
8487extern bool maybe_warn_self_move (location_t, tree, tree);
8488extern cp_expr build_x_modify_expr (location_t, tree,
8489 enum tree_code, tree,
8490 tree, tsubst_flags_t);
8491extern tree cp_build_modify_expr (location_t, tree,
8492 enum tree_code, tree,
8493 tsubst_flags_t);
8494extern tree convert_for_initialization (tree, tree, tree, int,
8495 impl_conv_rhs, tree, int,
8496 tsubst_flags_t);
8497extern int comp_ptr_ttypes (tree, tree);
8498extern bool comp_ptr_ttypes_const (tree, tree, compare_bounds_t);
8499extern bool error_type_p (const_tree);
8500extern bool ptr_reasonably_similar (const_tree, const_tree);
8501extern tree build_ptrmemfunc (tree, tree, int, bool,
8502 tsubst_flags_t);
8503extern int cp_type_quals (const_tree);
8504extern int type_memfn_quals (const_tree);
8505extern cp_ref_qualifier type_memfn_rqual (const_tree);
8506extern tree apply_memfn_quals (tree, cp_cv_quals,
8507 cp_ref_qualifier = REF_QUAL_NONE);
8508extern bool cp_has_mutable_p (const_tree);
8509extern bool at_least_as_qualified_p (const_tree, const_tree);
8510extern void cp_apply_type_quals_to_decl (int, tree);
8511extern tree build_ptrmemfunc1 (tree, tree, tree);
8512extern void expand_ptrmemfunc_cst (tree, tree *, tree *);
8513extern tree type_after_usual_arithmetic_conversions (tree, tree);
8514extern tree common_pointer_type (tree, tree);
8515extern tree composite_pointer_type (const op_location_t &,
8516 tree, tree, tree, tree,
8517 composite_pointer_operation,
8518 tsubst_flags_t);
8519extern tree merge_types (tree, tree);
8520extern tree strip_array_domain (tree);
8521extern tree check_return_expr (tree, bool *, bool *);
8522extern tree spaceship_type (tree, tsubst_flags_t = tf_warning_or_error);
8523extern tree genericize_spaceship (location_t, tree, tree, tree);
8524extern tree cp_build_binary_op (const op_location_t &,
8525 enum tree_code, tree, tree,
8526 tsubst_flags_t);
8527extern tree build_x_vec_perm_expr (location_t,
8528 tree, tree, tree,
8529 tsubst_flags_t);
8530extern tree build_x_shufflevector (location_t,
8531 vec<tree, va_gc> *,
8532 tsubst_flags_t);
8533#define cxx_sizeof(T) cxx_sizeof_or_alignof_type (input_location, T, SIZEOF_EXPR, false, true)
8534extern tree build_simple_component_ref (tree, tree);
8535extern tree build_ptrmemfunc_access_expr (tree, tree);
8536extern tree build_address (tree);
8537extern tree build_nop (tree, tree CXX_MEM_STAT_INFO);
8538extern tree non_reference (tree);
8539extern tree lookup_anon_field (tree, tree);
8540extern bool invalid_nonstatic_memfn_p (location_t, tree,
8541 tsubst_flags_t);
8542extern tree convert_member_func_to_ptr (tree, tree, tsubst_flags_t);
8543extern tree convert_ptrmem (tree, tree, bool, bool,
8544 tsubst_flags_t);
8545extern int lvalue_or_else (tree, enum lvalue_use,
8546 tsubst_flags_t);
8547extern void check_template_keyword (tree);
8548extern bool check_raw_literal_operator (const_tree decl);
8549extern bool check_literal_operator_args (const_tree, bool *, bool *);
8550extern void maybe_warn_about_useless_cast (location_t, tree, tree,
8551 tsubst_flags_t);
8552extern tree cp_perform_integral_promotions (tree, tsubst_flags_t);
8553
8554extern tree finish_left_unary_fold_expr (location_t, tree, int);
8555extern tree finish_right_unary_fold_expr (location_t, tree, int);
8556extern tree finish_binary_fold_expr (location_t, tree, tree, int);
8557extern tree treat_lvalue_as_rvalue_p (tree, bool);
8558extern bool decl_in_std_namespace_p (tree);
8559extern void maybe_warn_pessimizing_move (tree, tree, bool);
8560
8561/* in typeck2.cc */
8562extern void require_complete_eh_spec_types (tree, tree);
8563extern bool cxx_incomplete_type_diagnostic (location_t, const_tree,
8564 const_tree, diagnostic_t);
8565inline location_t
8566loc_or_input_loc (location_t loc)
8567{
8568 return loc == UNKNOWN_LOCATION ? input_location : loc;
8569}
8570
8571/* Like EXPR_LOCATION, but also handle some tcc_exceptional that have
8572 locations. */
8573
8574inline location_t
8575cp_expr_location (const_tree t_)
8576{
8577 tree t = CONST_CAST_TREE (t_);
8578 if (t == NULL_TREE)
8579 return UNKNOWN_LOCATION;
8580 switch (TREE_CODE (t))
8581 {
8582 case LAMBDA_EXPR:
8583 return LAMBDA_EXPR_LOCATION (t);
8584 case STATIC_ASSERT:
8585 return STATIC_ASSERT_SOURCE_LOCATION (t);
8586 case TRAIT_EXPR:
8587 return TRAIT_EXPR_LOCATION (t);
8588 case PTRMEM_CST:
8589 return PTRMEM_CST_LOCATION (t);
8590 default:
8591 return EXPR_LOCATION (t);
8592 }
8593}
8594
8595inline location_t
8596cp_expr_loc_or_loc (const_tree t, location_t or_loc)
8597{
8598 location_t loc = cp_expr_location (t_: t);
8599 if (loc == UNKNOWN_LOCATION)
8600 loc = or_loc;
8601 return loc;
8602}
8603
8604inline location_t
8605cp_expr_loc_or_input_loc (const_tree t)
8606{
8607 return cp_expr_loc_or_loc (t, or_loc: input_location);
8608}
8609
8610inline bool
8611cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
8612 diagnostic_t diag_kind)
8613{
8614 return cxx_incomplete_type_diagnostic (cp_expr_loc_or_input_loc (t: value),
8615 value, type, diag_kind);
8616}
8617
8618extern void cxx_incomplete_type_error (location_t, const_tree,
8619 const_tree);
8620inline void
8621cxx_incomplete_type_error (const_tree value, const_tree type)
8622{
8623 cxx_incomplete_type_diagnostic (value, type, diag_kind: DK_ERROR);
8624}
8625
8626extern void cxx_incomplete_type_inform (const_tree);
8627extern tree error_not_base_type (tree, tree);
8628extern tree binfo_or_else (tree, tree);
8629extern void cxx_readonly_error (location_t, tree,
8630 enum lvalue_use);
8631extern void complete_type_check_abstract (tree);
8632extern int abstract_virtuals_error (tree, tree,
8633 tsubst_flags_t = tf_warning_or_error);
8634extern int abstract_virtuals_error (abstract_class_use, tree,
8635 tsubst_flags_t = tf_warning_or_error);
8636
8637extern tree store_init_value (tree, tree, vec<tree, va_gc>**, int);
8638extern tree build_disable_temp_cleanup (tree);
8639extern tree split_nonconstant_init (tree, tree);
8640extern bool check_narrowing (tree, tree, tsubst_flags_t,
8641 bool = false);
8642extern bool ordinary_char_type_p (tree);
8643extern bool array_string_literal_compatible_p (tree, tree);
8644extern tree digest_init (tree, tree, tsubst_flags_t);
8645extern tree digest_init_flags (tree, tree, int, tsubst_flags_t);
8646extern tree digest_nsdmi_init (tree, tree, tsubst_flags_t);
8647extern tree build_scoped_ref (tree, tree, tree *);
8648extern tree build_x_arrow (location_t, tree,
8649 tsubst_flags_t);
8650extern tree build_m_component_ref (tree, tree, tsubst_flags_t);
8651extern tree build_functional_cast (location_t, tree, tree,
8652 tsubst_flags_t);
8653extern tree add_exception_specifier (tree, tree, tsubst_flags_t);
8654extern tree merge_exception_specifiers (tree, tree);
8655extern void set_target_expr_eliding (tree);
8656extern tree cp_build_init_expr (location_t, tree, tree);
8657inline tree cp_build_init_expr (tree t, tree i)
8658{ return cp_build_init_expr (input_location, t, i); }
8659
8660/* in mangle.cc */
8661extern void init_mangle (void);
8662extern void mangle_decl (tree);
8663extern const char *mangle_type_string (tree);
8664extern tree mangle_typeinfo_for_type (tree);
8665extern tree mangle_typeinfo_string_for_type (tree);
8666extern tree mangle_vtbl_for_type (tree);
8667extern tree mangle_vtt_for_type (tree);
8668extern tree mangle_ctor_vtbl_for_type (tree, tree);
8669extern tree mangle_thunk (tree, int, tree, tree, tree);
8670extern tree mangle_guard_variable (tree);
8671extern tree mangle_tls_init_fn (tree);
8672extern tree mangle_tls_wrapper_fn (tree);
8673extern bool decl_tls_wrapper_p (tree);
8674extern tree mangle_ref_init_variable (tree);
8675extern tree mangle_template_parm_object (tree);
8676extern char *get_mangled_vtable_map_var_name (tree);
8677extern bool mangle_return_type_p (tree);
8678extern tree mangle_decomp (tree, vec<tree> &);
8679extern void mangle_module_substitution (int);
8680extern int mangle_module_component (tree id, bool partition);
8681extern tree mangle_module_global_init (int);
8682extern unsigned HOST_WIDE_INT range_expr_nelts (tree);
8683extern bool equal_abi_tags (tree, tree);
8684
8685/* in dump.cc */
8686extern bool cp_dump_tree (void *, tree);
8687
8688/* In cp/cp-objcp-common.cc. */
8689
8690extern alias_set_type cxx_get_alias_set (tree);
8691extern bool cxx_warn_unused_global_decl (const_tree);
8692extern size_t cp_tree_size (enum tree_code);
8693extern bool cp_var_mod_type_p (tree, tree);
8694extern void cxx_initialize_diagnostics (diagnostic_context *);
8695extern int cxx_types_compatible_p (tree, tree);
8696extern bool cxx_block_may_fallthru (const_tree);
8697
8698/* in cp-gimplify.cc */
8699extern int cp_gimplify_expr (tree *, gimple_seq *,
8700 gimple_seq *);
8701extern void cp_genericize (tree);
8702extern bool cxx_omp_const_qual_no_mutable (tree);
8703extern enum omp_clause_default_kind cxx_omp_predetermined_sharing_1 (tree);
8704extern enum omp_clause_default_kind cxx_omp_predetermined_sharing (tree);
8705extern enum omp_clause_defaultmap_kind cxx_omp_predetermined_mapping (tree);
8706extern tree cxx_omp_clause_default_ctor (tree, tree, tree);
8707extern tree cxx_omp_clause_copy_ctor (tree, tree, tree);
8708extern tree cxx_omp_clause_assign_op (tree, tree, tree);
8709extern tree cxx_omp_clause_dtor (tree, tree);
8710extern void cxx_omp_finish_clause (tree, gimple_seq *, bool);
8711extern tree cxx_omp_finish_mapper_clauses (tree);
8712extern tree cxx_omp_mapper_lookup (tree, tree);
8713extern tree cxx_omp_extract_mapper_directive (tree);
8714extern tree cxx_omp_map_array_section (location_t, tree);
8715extern bool cxx_omp_privatize_by_reference (const_tree);
8716extern bool cxx_omp_disregard_value_expr (tree, bool);
8717extern void cp_fold_function (tree);
8718extern tree cp_fold_maybe_rvalue (tree, bool);
8719extern tree cp_fold_rvalue (tree);
8720extern tree cp_fully_fold (tree);
8721extern tree cp_fully_fold_init (tree);
8722extern tree predeclare_vla (tree);
8723extern void clear_fold_cache (void);
8724extern tree lookup_hotness_attribute (tree);
8725extern tree process_stmt_hotness_attribute (tree, location_t);
8726extern tree build_assume_call (location_t, tree);
8727extern tree process_stmt_assume_attribute (tree, tree, location_t);
8728extern bool simple_empty_class_p (tree, tree, tree_code);
8729extern tree fold_builtin_source_location (const_tree);
8730extern tree get_source_location_impl_type ();
8731extern tree cp_fold_immediate (tree *, mce_value,
8732 tree = current_function_decl);
8733extern void process_and_check_pending_immediate_escalating_fns ();
8734
8735/* in name-lookup.cc */
8736extern tree strip_using_decl (tree);
8737extern void diagnose_name_conflict (tree, tree);
8738extern bool dependent_local_decl_p (tree);
8739
8740/* Tell the binding oracle what kind of binding we are looking for. */
8741
8742enum cp_oracle_request
8743{
8744 CP_ORACLE_IDENTIFIER
8745};
8746
8747/* If this is non-NULL, then it is a "binding oracle" which can lazily
8748 create bindings when needed by the C compiler. The oracle is told
8749 the name and type of the binding to create. It can call pushdecl
8750 or the like to ensure the binding is visible; or do nothing,
8751 leaving the binding untouched. c-decl.cc takes note of when the
8752 oracle has been called and will not call it again if it fails to
8753 create a given binding. */
8754
8755typedef void cp_binding_oracle_function (enum cp_oracle_request, tree identifier);
8756
8757extern cp_binding_oracle_function *cp_binding_oracle;
8758
8759/* Set during diagnostics to record the failed constraint. This is a
8760 TREE_LIST whose VALUE is the constraint and whose PURPOSE are the
8761 instantiation arguments Defined in pt.cc. */
8762
8763extern tree current_failed_constraint;
8764
8765/* An RAII class to manage the failed constraint. */
8766
8767struct diagnosing_failed_constraint
8768{
8769 diagnosing_failed_constraint (tree, tree, bool);
8770 ~diagnosing_failed_constraint ();
8771 static bool replay_errors_p ();
8772
8773 bool diagnosing_error;
8774};
8775
8776/* in constraint.cc */
8777
8778extern cp_expr finish_constraint_or_expr (location_t, cp_expr, cp_expr);
8779extern cp_expr finish_constraint_and_expr (location_t, cp_expr, cp_expr);
8780extern cp_expr finish_constraint_primary_expr (cp_expr);
8781extern tree start_concept_definition (cp_expr);
8782extern tree finish_concept_definition (tree, tree, tree);
8783extern tree combine_constraint_expressions (tree, tree);
8784extern tree append_constraint (tree, tree);
8785extern tree get_constraints (const_tree);
8786extern void set_constraints (tree, tree);
8787extern void remove_constraints (tree);
8788extern tree current_template_constraints (void);
8789extern tree associate_classtype_constraints (tree);
8790extern tree build_constraints (tree, tree);
8791extern tree maybe_substitute_reqs_for (tree, const_tree);
8792extern tree get_trailing_function_requirements (tree);
8793extern tree get_shorthand_constraints (tree);
8794
8795extern tree build_concept_id (tree);
8796extern tree build_type_constraint (tree, tree, tsubst_flags_t);
8797extern tree build_concept_check (tree, tree, tsubst_flags_t);
8798extern tree build_concept_check (tree, tree, tree, tsubst_flags_t);
8799
8800extern tree build_constrained_parameter (tree, tree, tree = NULL_TREE);
8801extern bool equivalent_placeholder_constraints (tree, tree);
8802extern hashval_t iterative_hash_placeholder_constraint (tree, hashval_t);
8803extern tree finish_shorthand_constraint (tree, tree);
8804extern tree finish_requires_expr (location_t, tree, tree);
8805extern tree finish_simple_requirement (location_t, tree);
8806extern tree finish_type_requirement (location_t, tree);
8807extern tree finish_compound_requirement (location_t, tree, tree, bool);
8808extern tree finish_nested_requirement (location_t, tree);
8809extern tree tsubst_requires_expr (tree, tree, tsubst_flags_t, tree);
8810extern tree evaluate_requires_expr (tree);
8811extern tree tsubst_constraint (tree, tree, tsubst_flags_t, tree);
8812extern tree tsubst_constraint_info (tree, tree, tsubst_flags_t, tree);
8813extern tree tsubst_parameter_mapping (tree, tree, tsubst_flags_t, tree);
8814
8815struct processing_constraint_expression_sentinel
8816{
8817 processing_constraint_expression_sentinel ();
8818 ~processing_constraint_expression_sentinel ();
8819};
8820
8821extern bool processing_constraint_expression_p ();
8822
8823extern tree get_concept_check_template (tree);
8824extern tree evaluate_concept_check (tree);
8825extern bool constraints_satisfied_p (tree, tree = NULL_TREE);
8826extern bool* lookup_subsumption_result (tree, tree);
8827extern bool save_subsumption_result (tree, tree, bool);
8828extern tree find_template_parameters (tree, tree);
8829extern bool equivalent_constraints (tree, tree);
8830extern bool equivalently_constrained (tree, tree);
8831extern bool strictly_subsumes (tree, tree);
8832extern bool ttp_subsumes (tree, tree);
8833extern int more_constrained (tree, tree);
8834extern bool at_least_as_constrained (tree, tree);
8835extern bool constraints_equivalent_p (tree, tree);
8836extern bool atomic_constraints_identical_p (tree, tree);
8837extern hashval_t iterative_hash_constraint (tree, hashval_t);
8838extern hashval_t hash_atomic_constraint (tree);
8839extern void diagnose_constraints (location_t, tree, tree);
8840
8841extern void note_failed_type_completion_for_satisfaction (tree);
8842
8843/* in logic.cc */
8844extern bool subsumes (tree, tree);
8845
8846/* In class.cc */
8847extern void set_current_access_from_decl (tree);
8848extern void cp_finish_injected_record_type (tree);
8849
8850/* in vtable-class-hierarchy.cc */
8851extern void vtv_compute_class_hierarchy_transitive_closure (void);
8852extern void vtv_generate_init_routine (void);
8853extern void vtv_save_class_info (tree);
8854extern void vtv_recover_class_info (void);
8855extern void vtv_build_vtable_verify_fndecl (void);
8856
8857/* In constexpr.cc */
8858/* Representation of entries in the constexpr function definition table. */
8859
8860struct GTY((for_user)) constexpr_fundef {
8861 tree decl;
8862 tree body;
8863 tree parms;
8864 tree result;
8865};
8866
8867extern void fini_constexpr (void);
8868extern bool literal_type_p (tree);
8869extern void maybe_save_constexpr_fundef (tree);
8870extern void register_constexpr_fundef (const constexpr_fundef &);
8871extern constexpr_fundef *retrieve_constexpr_fundef (tree);
8872extern bool is_valid_constexpr_fn (tree, bool);
8873extern bool check_constexpr_ctor_body (tree, tree, bool);
8874extern tree constexpr_fn_retval (tree);
8875extern tree ensure_literal_type_for_constexpr_object (tree);
8876extern bool potential_constant_expression (tree);
8877extern bool is_constant_expression (tree);
8878extern bool is_rvalue_constant_expression (tree);
8879extern bool is_nondependent_constant_expression (tree);
8880extern bool is_nondependent_static_init_expression (tree);
8881extern bool is_static_init_expression (tree);
8882extern bool is_std_class (tree, const char *);
8883extern bool is_std_allocator (tree);
8884extern bool potential_rvalue_constant_expression (tree);
8885extern bool require_potential_constant_expression (tree);
8886extern bool require_constant_expression (tree);
8887extern bool require_rvalue_constant_expression (tree);
8888extern bool require_potential_rvalue_constant_expression (tree);
8889extern bool require_potential_rvalue_constant_expression_fncheck (tree);
8890extern tree cxx_constant_value (tree, tree = NULL_TREE,
8891 tsubst_flags_t = tf_error);
8892inline tree cxx_constant_value (tree t, tsubst_flags_t complain)
8893{ return cxx_constant_value (t, NULL_TREE, complain); }
8894extern void cxx_constant_dtor (tree, tree);
8895extern tree cxx_constant_init (tree, tree = NULL_TREE);
8896extern tree maybe_constant_value (tree, tree = NULL_TREE, mce_value = mce_unknown);
8897extern tree maybe_constant_init (tree, tree = NULL_TREE, bool = false);
8898extern tree maybe_constant_init (tree, tree, mce_value);
8899extern tree fold_non_dependent_expr (tree,
8900 tsubst_flags_t = tf_warning_or_error,
8901 bool = false, tree = NULL_TREE);
8902extern tree maybe_fold_non_dependent_expr (tree,
8903 tsubst_flags_t = tf_warning_or_error);
8904extern tree fold_non_dependent_init (tree,
8905 tsubst_flags_t = tf_warning_or_error,
8906 bool = false, tree = NULL_TREE);
8907extern tree fold_simple (tree);
8908extern tree fold_to_constant (tree);
8909extern bool reduced_constant_expression_p (tree);
8910extern bool is_instantiation_of_constexpr (tree);
8911extern bool var_in_constexpr_fn (tree);
8912extern bool var_in_maybe_constexpr_fn (tree);
8913extern bool maybe_constexpr_fn (tree);
8914extern void explain_invalid_constexpr_fn (tree);
8915extern vec<tree> cx_error_context (void);
8916extern tree fold_sizeof_expr (tree);
8917extern void clear_cv_and_fold_caches (void);
8918extern tree unshare_constructor (tree CXX_MEM_STAT_INFO);
8919extern bool decl_implicit_constexpr_p (tree);
8920struct constexpr_ctx;
8921extern tree find_failing_clause (const constexpr_ctx *ctx, tree);
8922extern void diagnose_failing_condition (tree, location_t, bool,
8923 const constexpr_ctx * = nullptr);
8924extern bool replace_decl (tree *, tree, tree);
8925
8926/* An RAII sentinel used to restrict constexpr evaluation so that it
8927 doesn't do anything that causes extra DECL_UID generation. */
8928
8929struct uid_sensitive_constexpr_evaluation_sentinel
8930{
8931 temp_override<bool> ovr;
8932 uid_sensitive_constexpr_evaluation_sentinel ();
8933};
8934
8935/* Used to determine whether uid_sensitive_constexpr_evaluation_p was
8936 called and returned true, indicating that we've restricted constexpr
8937 evaluation in order to avoid UID generation. We use this to control
8938 updates to the fold_cache and cv_cache. */
8939
8940struct uid_sensitive_constexpr_evaluation_checker
8941{
8942 const unsigned saved_counter;
8943 uid_sensitive_constexpr_evaluation_checker ();
8944 bool evaluation_restricted_p () const;
8945};
8946
8947void cp_tree_c_finish_parsing ();
8948
8949/* In cp-ubsan.cc */
8950extern void cp_ubsan_maybe_instrument_member_call (tree);
8951extern void cp_ubsan_instrument_member_accesses (tree *);
8952extern tree cp_ubsan_maybe_instrument_downcast (location_t, tree, tree, tree);
8953extern tree cp_ubsan_maybe_instrument_cast_to_vbase (location_t, tree, tree);
8954extern void cp_ubsan_maybe_initialize_vtbl_ptrs (tree);
8955
8956/* In coroutines.cc */
8957extern tree finish_co_return_stmt (location_t, tree);
8958extern tree finish_co_await_expr (location_t, tree);
8959extern tree finish_co_yield_expr (location_t, tree);
8960extern tree coro_validate_builtin_call (tree,
8961 tsubst_flags_t = tf_warning_or_error);
8962extern tree coro_get_actor_function (tree);
8963extern tree coro_get_destroy_function (tree);
8964extern tree coro_get_ramp_function (tree);
8965
8966extern tree co_await_get_resume_call (tree await_expr);
8967
8968
8969/* contracts.cc */
8970extern tree make_postcondition_variable (cp_expr);
8971extern tree make_postcondition_variable (cp_expr, tree);
8972extern tree grok_contract (tree, tree, tree, cp_expr, location_t);
8973extern tree finish_contract_condition (cp_expr);
8974
8975/* Return the first contract in ATTRS, or NULL_TREE if there are none. */
8976
8977inline tree
8978find_contract (tree attrs)
8979{
8980 while (attrs && !cxx_contract_attribute_p (attrs))
8981 attrs = TREE_CHAIN (attrs);
8982 return attrs;
8983}
8984
8985inline void
8986set_decl_contracts (tree decl, tree contract_attrs)
8987{
8988 remove_contract_attributes (decl);
8989 DECL_ATTRIBUTES (decl) = chainon (DECL_ATTRIBUTES (decl), contract_attrs);
8990}
8991
8992/* Returns the computed semantic of the node. */
8993
8994inline contract_semantic
8995get_contract_semantic (const_tree t)
8996{
8997 return (contract_semantic) (TREE_LANG_FLAG_3 (CONTRACT_CHECK (t))
8998 | (TREE_LANG_FLAG_2 (t) << 1)
8999 | (TREE_LANG_FLAG_0 ((t)) << 2));
9000}
9001
9002/* Sets the computed semantic of the node. */
9003
9004inline void
9005set_contract_semantic (tree t, contract_semantic semantic)
9006{
9007 TREE_LANG_FLAG_3 (CONTRACT_CHECK (t)) = semantic & 0x01;
9008 TREE_LANG_FLAG_2 (t) = (semantic & 0x02) >> 1;
9009 TREE_LANG_FLAG_0 (t) = (semantic & 0x04) >> 2;
9010}
9011
9012/* Inline bodies. */
9013
9014inline tree
9015ovl_first (tree node)
9016{
9017 while (TREE_CODE (node) == OVERLOAD)
9018 node = OVL_FUNCTION (node);
9019 return node;
9020}
9021
9022inline bool
9023type_unknown_p (const_tree expr)
9024{
9025 return TREE_TYPE (expr) == unknown_type_node;
9026}
9027
9028inline hashval_t
9029named_decl_hash::hash (const value_type decl)
9030{
9031 tree name = (TREE_CODE (decl) == BINDING_VECTOR
9032 ? BINDING_VECTOR_NAME (decl) : OVL_NAME (decl));
9033 return name ? IDENTIFIER_HASH_VALUE (name) : 0;
9034}
9035
9036inline bool
9037named_decl_hash::equal (const value_type existing, compare_type candidate)
9038{
9039 tree name = (TREE_CODE (existing) == BINDING_VECTOR
9040 ? BINDING_VECTOR_NAME (existing) : OVL_NAME (existing));
9041 return candidate == name;
9042}
9043
9044inline bool
9045null_node_p (const_tree expr)
9046{
9047 STRIP_ANY_LOCATION_WRAPPER (expr);
9048 return expr == null_node;
9049}
9050
9051/* True iff T is a variable template declaration. */
9052inline bool
9053variable_template_p (tree t)
9054{
9055 if (TREE_CODE (t) != TEMPLATE_DECL)
9056 return false;
9057 if (!PRIMARY_TEMPLATE_P (t))
9058 return false;
9059 if (tree r = DECL_TEMPLATE_RESULT (t))
9060 return VAR_P (r);
9061 return false;
9062}
9063
9064/* True iff T is a concept. */
9065
9066inline bool
9067concept_definition_p (const_tree t)
9068{
9069 return TREE_CODE (STRIP_TEMPLATE (t)) == CONCEPT_DECL;
9070}
9071
9072/* True if t is an expression that checks a concept. */
9073
9074inline bool
9075concept_check_p (const_tree t)
9076{
9077 if (t && TREE_CODE (t) == TEMPLATE_ID_EXPR)
9078 return concept_definition_p (TREE_OPERAND (t, 0));
9079 return false;
9080}
9081
9082/* Return the prototype parameter of the concept T,
9083 i.e. its first declared template parameter. */
9084
9085inline tree
9086concept_prototype_parameter (const_tree t)
9087{
9088 gcc_checking_assert (concept_definition_p (t));
9089 if (TREE_CODE (t) == CONCEPT_DECL)
9090 t = DECL_TI_TEMPLATE (t);
9091 tree parms = DECL_INNERMOST_TEMPLATE_PARMS (t);
9092 return TREE_VALUE (TREE_VEC_ELT (parms, 0));
9093}
9094
9095/* Helpers for IMPLICIT_RVALUE_P to look through automatic dereference. */
9096
9097inline bool
9098implicit_rvalue_p (const_tree t)
9099{
9100 if (REFERENCE_REF_P (t))
9101 t = TREE_OPERAND (t, 0);
9102 return ((TREE_CODE (t) == NON_LVALUE_EXPR
9103 || TREE_CODE (t) == STATIC_CAST_EXPR)
9104 && IMPLICIT_RVALUE_P (t));
9105}
9106inline tree
9107set_implicit_rvalue_p (tree ot)
9108{
9109 tree t = ot;
9110 if (REFERENCE_REF_P (t))
9111 t = TREE_OPERAND (t, 0);
9112 IMPLICIT_RVALUE_P (t) = 1;
9113 return ot;
9114}
9115
9116/* True if t is a "constrained auto" type-specifier. */
9117
9118inline bool
9119is_constrained_auto (const_tree t)
9120{
9121 return is_auto (t) && PLACEHOLDER_TYPE_CONSTRAINTS_INFO (t);
9122}
9123
9124/* True if CODE, a tree code, denotes a tree whose operand is not evaluated
9125 as per [expr.context], i.e., an operand to sizeof, typeof, decltype, or
9126 alignof. */
9127
9128inline bool
9129unevaluated_p (tree_code code)
9130{
9131 return (code == DECLTYPE_TYPE
9132 || code == ALIGNOF_EXPR
9133 || code == SIZEOF_EXPR
9134 || code == NOEXCEPT_EXPR
9135 || code == REQUIRES_EXPR);
9136}
9137
9138/* RAII class to push/pop the access scope for T. */
9139
9140struct push_access_scope_guard
9141{
9142 tree decl;
9143 push_access_scope_guard (tree t)
9144 : decl (t)
9145 {
9146 if (VAR_OR_FUNCTION_DECL_P (decl)
9147 || TREE_CODE (decl) == TYPE_DECL)
9148 push_access_scope (decl);
9149 else
9150 decl = NULL_TREE;
9151 }
9152 ~push_access_scope_guard ()
9153 {
9154 if (decl)
9155 pop_access_scope (decl);
9156 }
9157};
9158
9159/* Extracting strings from constexpr. */
9160
9161class cexpr_str
9162{
9163public:
9164 cexpr_str (tree message) : message (message) {}
9165 cexpr_str (const cexpr_str &) = delete;
9166 ~cexpr_str () { XDELETEVEC (buf); }
9167
9168 bool type_check (location_t location);
9169 bool extract (location_t location, const char * & msg, int &len);
9170 bool extract (location_t location, tree &str);
9171 tree message;
9172private:
9173 tree message_data = NULL_TREE;
9174 tree message_sz = NULL_TREE;
9175 char *buf = nullptr;
9176};
9177
9178/* True if TYPE is an extended floating-point type. */
9179
9180inline bool
9181extended_float_type_p (tree type)
9182{
9183 type = TYPE_MAIN_VARIANT (type);
9184 for (int i = 0; i < NUM_FLOATN_NX_TYPES; ++i)
9185 if (type == FLOATN_TYPE_NODE (i))
9186 return true;
9187 if (type == bfloat16_type_node)
9188 return true;
9189 return false;
9190}
9191
9192/* True if DECL is name-independent declaration. */
9193
9194inline bool
9195name_independent_decl_p (tree decl)
9196{
9197 return ((VAR_P (decl) || TREE_CODE (decl) == FIELD_DECL)
9198 && DECL_NAME (decl)
9199 && id_equal (DECL_NAME (decl), str: "_")
9200 && !TREE_STATIC (decl)
9201 && !DECL_EXTERNAL (decl));
9202}
9203
9204namespace highlight_colors {
9205
9206/* Color names for highlighting "%qH" vs "%qI" values,
9207 and ranges corresponding to them. */
9208extern const char *const percent_h;
9209extern const char *const percent_i;
9210
9211} // namespace highlight_colors
9212
9213#if CHECKING_P
9214namespace selftest {
9215 extern void run_cp_tests (void);
9216
9217 /* Declarations for specific families of tests within cp,
9218 by source file, in alphabetical order. */
9219 extern void cp_pt_cc_tests ();
9220 extern void cp_tree_cc_tests (void);
9221} // namespace selftest
9222#endif /* #if CHECKING_P */
9223
9224/* -- end of C++ */
9225
9226#endif /* ! GCC_CP_TREE_H */
9227

source code of gcc/cp/cp-tree.h