]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/rust/backend/rust-tree.h
i386: Robustify MMX move patterns
[thirdparty/gcc.git] / gcc / rust / backend / rust-tree.h
1 // Copyright (C) 2020-2025 Free Software Foundation, Inc.
2
3 // This file is part of GCC.
4
5 // GCC is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free
7 // Software Foundation; either version 3, or (at your option) any later
8 // version.
9
10 // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 // for more details.
14
15 // You should have received a copy of the GNU General Public License
16 // along with GCC; see the file COPYING3. If not see
17 // <http://www.gnu.org/licenses/>.
18
19 #ifndef RUST_TREE
20 #define RUST_TREE
21
22 #include "rust-system.h"
23 #include "coretypes.h"
24 #include "tree.h"
25 #include "cpplib.h"
26 #include "splay-tree.h"
27
28 /* Returns true if NODE is a pointer. */
29 #define TYPE_PTR_P(NODE) (TREE_CODE (NODE) == POINTER_TYPE)
30
31 /* Returns true if NODE is a reference. */
32 #define TYPE_REF_P(NODE) (TREE_CODE (NODE) == REFERENCE_TYPE)
33
34 /* Returns true if NODE is a pointer or a reference. */
35 #define INDIRECT_TYPE_P(NODE) (TYPE_PTR_P (NODE) || TYPE_REF_P (NODE))
36
37 /* [basic.fundamental]
38
39 Types bool, char, wchar_t, and the signed and unsigned integer types
40 are collectively called integral types.
41
42 Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration
43 types as well, which is incorrect in C++. Keep these checks in
44 ascending code order. */
45 #define RS_INTEGRAL_TYPE_P(TYPE) \
46 (TREE_CODE (TYPE) == BOOLEAN_TYPE || TREE_CODE (TYPE) == INTEGER_TYPE)
47
48 /* [basic.fundamental]
49
50 Integral and floating types are collectively called arithmetic
51 types.
52
53 As a GNU extension, we also accept complex types.
54
55 Keep these checks in ascending code order. */
56 #define ARITHMETIC_TYPE_P(TYPE) \
57 (RS_INTEGRAL_TYPE_P (TYPE) || TREE_CODE (TYPE) == REAL_TYPE \
58 || TREE_CODE (TYPE) == COMPLEX_TYPE)
59
60 /* True iff TYPE is cv decltype(nullptr). */
61 #define NULLPTR_TYPE_P(TYPE) (TREE_CODE (TYPE) == NULLPTR_TYPE)
62
63 /* [basic.types]
64
65 Arithmetic types, enumeration types, pointer types,
66 pointer-to-member types, and std::nullptr_t are collectively called
67 scalar types.
68
69 Keep these checks in ascending code order. */
70 #define SCALAR_TYPE_P(TYPE) \
71 (TREE_CODE (TYPE) == ENUMERAL_TYPE || ARITHMETIC_TYPE_P (TYPE) \
72 || TYPE_PTR_P (TYPE) || NULLPTR_TYPE_P (TYPE))
73
74 /* True if NODE is an implicit INDIRECT_REF from convert_from_reference. */
75 #define REFERENCE_REF_P(NODE) \
76 (INDIRECT_REF_P (NODE) && TREE_TYPE (TREE_OPERAND (NODE, 0)) \
77 && TYPE_REF_P (TREE_TYPE (TREE_OPERAND ((NODE), 0))))
78
79 // this is a helper to differentiate RECORD types between actual records and
80 // slices
81 #define RS_DST_FLAG TREE_LANG_FLAG_0
82 #define RS_DST_FLAG_P(TYPE) \
83 (TREE_CODE (TYPE) == RECORD_TYPE && TREE_LANG_FLAG_0 (TYPE))
84
85 // lambda?
86 #define RS_CLOSURE_FLAG TREE_LANG_FLAG_1
87 #define RS_CLOSURE_TYPE_P(TYPE) \
88 (TREE_CODE (TYPE) == RECORD_TYPE && TREE_LANG_FLAG_1 (TYPE))
89
90 /* Returns true if NODE is a pointer to member function type. */
91 #define TYPE_PTRMEMFUNC_P(NODE) \
92 (TREE_CODE (NODE) == RECORD_TYPE && TYPE_PTRMEMFUNC_FLAG (NODE))
93
94 #define TYPE_PTRMEMFUNC_FLAG(NODE) (TYPE_LANG_FLAG_2 (RECORD_TYPE_CHECK (NODE)))
95
96 #define TYPE_PTRMEMFUNC_FN_TYPE_RAW(NODE) (TREE_TYPE (TYPE_FIELDS (NODE)))
97
98 /* True if NODE is a compound-literal, i.e., a brace-enclosed
99 initializer cast to a particular type. This is mostly only set during
100 template parsing; once the initializer has been digested into an actual
101 value of the type, the expression is represented by a TARGET_EXPR. */
102 #define COMPOUND_LITERAL_P(NODE) \
103 (TREE_CODE (NODE) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (NODE))
104
105 /* When appearing in an INDIRECT_REF, it means that the tree structure
106 underneath is actually a call to a constructor. This is needed
107 when the constructor must initialize local storage (which can
108 be automatically destroyed), rather than allowing it to allocate
109 space from the heap.
110
111 When appearing in a SAVE_EXPR, it means that underneath
112 is a call to a constructor.
113
114 When appearing in a CONSTRUCTOR, the expression is an unconverted
115 compound literal.
116
117 When appearing in a FIELD_DECL, it means that this field
118 has been duly initialized in its constructor. */
119 #define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4 (NODE))
120
121 /* Nonzero if T is a class type. Zero for template type parameters,
122 typename types, and so forth. */
123 #define CLASS_TYPE_P(T) \
124 (RECORD_OR_UNION_CODE_P (TREE_CODE (T)) && TYPE_LANG_FLAG_5 (T))
125
126 /* [class.virtual]
127
128 A class that declares or inherits a virtual function is called a
129 polymorphic class. */
130 #define TYPE_POLYMORPHIC_P(NODE) (TREE_LANG_FLAG_2 (NODE))
131
132 /* Nonzero if this class has a virtual function table pointer. */
133 #define TYPE_CONTAINS_VPTR_P(NODE) \
134 (TYPE_POLYMORPHIC_P (NODE) || CLASSTYPE_VBASECLASSES (NODE))
135
136 /* A vector of BINFOs for the direct and indirect virtual base classes
137 that this type uses in a post-order depth-first left-to-right
138 order. (In other words, these bases appear in the order that they
139 should be initialized.) */
140 #define CLASSTYPE_VBASECLASSES(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->vbases)
141
142 /* We used to have a variant type for lang_type. Keep the name of the
143 checking accessor for the sole survivor. */
144 #define LANG_TYPE_CLASS_CHECK(NODE) (TYPE_LANG_SPECIFIC (NODE))
145
146 /* Keep these checks in ascending code order. */
147 #define RECORD_OR_UNION_CODE_P(T) ((T) == RECORD_TYPE || (T) == UNION_TYPE)
148 #define OVERLOAD_TYPE_P(T) (CLASS_TYPE_P (T) || TREE_CODE (T) == ENUMERAL_TYPE)
149
150 /* Nonzero if this class is "empty" in the sense of the C++ ABI. */
151 #define CLASSTYPE_EMPTY_P(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->empty_p)
152
153 /* True if DECL is declared 'constexpr'. */
154 #define DECL_DECLARED_CONSTEXPR_P(DECL) \
155 DECL_LANG_FLAG_8 (VAR_OR_FUNCTION_DECL_CHECK (DECL))
156
157 #define VAR_OR_FUNCTION_DECL_CHECK(NODE) \
158 TREE_CHECK2 (NODE, VAR_DECL, FUNCTION_DECL)
159
160 // forked from gcc/cp/c-common.h c_tree_index
161
162 /* Standard named or nameless data types of the C compiler. */
163
164 enum c_tree_index
165 {
166 CTI_CHAR8_TYPE,
167 CTI_CHAR16_TYPE,
168 CTI_CHAR32_TYPE,
169 CTI_WCHAR_TYPE,
170 CTI_UNDERLYING_WCHAR_TYPE,
171 CTI_WINT_TYPE,
172 CTI_SIGNED_SIZE_TYPE, /* For format checking only. */
173 CTI_UNSIGNED_PTRDIFF_TYPE, /* For format checking only. */
174 CTI_INTMAX_TYPE,
175 CTI_UINTMAX_TYPE,
176 CTI_WIDEST_INT_LIT_TYPE,
177 CTI_WIDEST_UINT_LIT_TYPE,
178
179 /* Types for <stdint.h>, that may not be defined on all
180 targets. */
181 CTI_SIG_ATOMIC_TYPE,
182 CTI_INT8_TYPE,
183 CTI_INT16_TYPE,
184 CTI_INT32_TYPE,
185 CTI_INT64_TYPE,
186 CTI_UINT8_TYPE,
187 CTI_UINT16_TYPE,
188 CTI_UINT32_TYPE,
189 CTI_UINT64_TYPE,
190 CTI_INT_LEAST8_TYPE,
191 CTI_INT_LEAST16_TYPE,
192 CTI_INT_LEAST32_TYPE,
193 CTI_INT_LEAST64_TYPE,
194 CTI_UINT_LEAST8_TYPE,
195 CTI_UINT_LEAST16_TYPE,
196 CTI_UINT_LEAST32_TYPE,
197 CTI_UINT_LEAST64_TYPE,
198 CTI_INT_FAST8_TYPE,
199 CTI_INT_FAST16_TYPE,
200 CTI_INT_FAST32_TYPE,
201 CTI_INT_FAST64_TYPE,
202 CTI_UINT_FAST8_TYPE,
203 CTI_UINT_FAST16_TYPE,
204 CTI_UINT_FAST32_TYPE,
205 CTI_UINT_FAST64_TYPE,
206 CTI_INTPTR_TYPE,
207 CTI_UINTPTR_TYPE,
208
209 CTI_CHAR_ARRAY_TYPE,
210 CTI_CHAR8_ARRAY_TYPE,
211 CTI_CHAR16_ARRAY_TYPE,
212 CTI_CHAR32_ARRAY_TYPE,
213 CTI_WCHAR_ARRAY_TYPE,
214 CTI_STRING_TYPE,
215 CTI_CONST_STRING_TYPE,
216
217 /* Type for boolean expressions (bool in C++, int in C). */
218 CTI_TRUTHVALUE_TYPE,
219 CTI_TRUTHVALUE_TRUE,
220 CTI_TRUTHVALUE_FALSE,
221
222 CTI_DEFAULT_FUNCTION_TYPE,
223
224 CTI_NULL,
225
226 /* These are not types, but we have to look them up all the time. */
227 CTI_FUNCTION_NAME_DECL,
228 CTI_PRETTY_FUNCTION_NAME_DECL,
229 CTI_C99_FUNCTION_NAME_DECL,
230
231 CTI_MODULE_HWM,
232 /* Below here entities change during compilation. */
233
234 CTI_SAVED_FUNCTION_NAME_DECLS,
235
236 CTI_MAX
237 };
238
239 // forked from gcc/c-family/c-common.h c_tree_index
240
241 extern GTY (()) tree c_global_trees[CTI_MAX];
242
243 // forked from gcc/cp/cp-tree.h cp_tree_index
244
245 enum cp_tree_index
246 {
247 CPTI_WCHAR_DECL,
248 CPTI_VTABLE_ENTRY_TYPE,
249 CPTI_DELTA_TYPE,
250 CPTI_VTABLE_INDEX_TYPE,
251 CPTI_CLEANUP_TYPE,
252 CPTI_VTT_PARM_TYPE,
253
254 CPTI_CLASS_TYPE,
255 CPTI_UNKNOWN_TYPE,
256 CPTI_INIT_LIST_TYPE,
257 CPTI_EXPLICIT_VOID_LIST,
258 CPTI_VTBL_TYPE,
259 CPTI_VTBL_PTR_TYPE,
260 CPTI_GLOBAL,
261 CPTI_ABORT_FNDECL,
262 CPTI_AGGR_TAG,
263 CPTI_CONV_OP_MARKER,
264
265 CPTI_CTOR_IDENTIFIER,
266 CPTI_COMPLETE_CTOR_IDENTIFIER,
267 CPTI_BASE_CTOR_IDENTIFIER,
268 CPTI_DTOR_IDENTIFIER,
269 CPTI_COMPLETE_DTOR_IDENTIFIER,
270 CPTI_BASE_DTOR_IDENTIFIER,
271 CPTI_DELETING_DTOR_IDENTIFIER,
272 CPTI_CONV_OP_IDENTIFIER,
273 CPTI_DELTA_IDENTIFIER,
274 CPTI_IN_CHARGE_IDENTIFIER,
275 CPTI_VTT_PARM_IDENTIFIER,
276 CPTI_AS_BASE_IDENTIFIER,
277 CPTI_THIS_IDENTIFIER,
278 CPTI_PFN_IDENTIFIER,
279 CPTI_VPTR_IDENTIFIER,
280 CPTI_GLOBAL_IDENTIFIER,
281 CPTI_ANON_IDENTIFIER,
282 CPTI_AUTO_IDENTIFIER,
283 CPTI_DECLTYPE_AUTO_IDENTIFIER,
284 CPTI_INIT_LIST_IDENTIFIER,
285 CPTI_FOR_RANGE__IDENTIFIER,
286 CPTI_FOR_BEGIN__IDENTIFIER,
287 CPTI_FOR_END__IDENTIFIER,
288 CPTI_FOR_RANGE_IDENTIFIER,
289 CPTI_FOR_BEGIN_IDENTIFIER,
290 CPTI_FOR_END_IDENTIFIER,
291 CPTI_ABI_TAG_IDENTIFIER,
292 CPTI_ALIGNED_IDENTIFIER,
293 CPTI_BEGIN_IDENTIFIER,
294 CPTI_END_IDENTIFIER,
295 CPTI_GET_IDENTIFIER,
296 CPTI_GNU_IDENTIFIER,
297 CPTI_TUPLE_ELEMENT_IDENTIFIER,
298 CPTI_TUPLE_SIZE_IDENTIFIER,
299 CPTI_TYPE_IDENTIFIER,
300 CPTI_VALUE_IDENTIFIER,
301 CPTI_FUN_IDENTIFIER,
302 CPTI_CLOSURE_IDENTIFIER,
303 CPTI_HEAP_UNINIT_IDENTIFIER,
304 CPTI_HEAP_IDENTIFIER,
305 CPTI_HEAP_DELETED_IDENTIFIER,
306 CPTI_HEAP_VEC_UNINIT_IDENTIFIER,
307 CPTI_HEAP_VEC_IDENTIFIER,
308 CPTI_OMP_IDENTIFIER,
309
310 CPTI_LANG_NAME_C,
311 CPTI_LANG_NAME_CPLUSPLUS,
312
313 CPTI_EMPTY_EXCEPT_SPEC,
314 CPTI_NOEXCEPT_TRUE_SPEC,
315 CPTI_NOEXCEPT_FALSE_SPEC,
316 CPTI_NOEXCEPT_DEFERRED_SPEC,
317
318 CPTI_NULLPTR,
319 CPTI_NULLPTR_TYPE,
320
321 CPTI_ANY_TARG,
322
323 CPTI_MODULE_HWM,
324 /* Nodes after here change during compilation, or should not be in
325 the module's global tree table. Such nodes must be locatable
326 via name lookup or type-construction, as those are the only
327 cross-TU matching capabilities remaining. */
328
329 /* We must find these via the global namespace. */
330 CPTI_STD,
331 CPTI_ABI,
332
333 /* These are created at init time, but the library/headers provide
334 definitions. */
335 CPTI_ALIGN_TYPE,
336 CPTI_TERMINATE_FN,
337 CPTI_CALL_UNEXPECTED_FN,
338
339 /* These are lazily inited. */
340 CPTI_CONST_TYPE_INFO_TYPE,
341 CPTI_GET_EXCEPTION_PTR_FN,
342 CPTI_BEGIN_CATCH_FN,
343 CPTI_END_CATCH_FN,
344 CPTI_ALLOCATE_EXCEPTION_FN,
345 CPTI_FREE_EXCEPTION_FN,
346 CPTI_THROW_FN,
347 CPTI_RETHROW_FN,
348 CPTI_ATEXIT_FN_PTR_TYPE,
349 CPTI_ATEXIT,
350 CPTI_DSO_HANDLE,
351 CPTI_DCAST,
352
353 CPTI_SOURCE_LOCATION_IMPL,
354
355 CPTI_FALLBACK_DFLOAT32_TYPE,
356 CPTI_FALLBACK_DFLOAT64_TYPE,
357 CPTI_FALLBACK_DFLOAT128_TYPE,
358
359 CPTI_MAX
360 };
361
362 // forked from gcc/cp/cp-tree.h cp_global_trees
363
364 extern GTY (()) tree cp_global_trees[CPTI_MAX];
365
366 #define wchar_decl_node cp_global_trees[CPTI_WCHAR_DECL]
367 #define vtable_entry_type cp_global_trees[CPTI_VTABLE_ENTRY_TYPE]
368 /* The type used to represent an offset by which to adjust the `this'
369 pointer in pointer-to-member types. */
370 #define delta_type_node cp_global_trees[CPTI_DELTA_TYPE]
371 /* The type used to represent an index into the vtable. */
372 #define vtable_index_type cp_global_trees[CPTI_VTABLE_INDEX_TYPE]
373
374 #define class_type_node cp_global_trees[CPTI_CLASS_TYPE]
375 #define unknown_type_node cp_global_trees[CPTI_UNKNOWN_TYPE]
376 #define init_list_type_node cp_global_trees[CPTI_INIT_LIST_TYPE]
377 #define explicit_void_list_node cp_global_trees[CPTI_EXPLICIT_VOID_LIST]
378 #define vtbl_type_node cp_global_trees[CPTI_VTBL_TYPE]
379 #define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE]
380 #define std_node cp_global_trees[CPTI_STD]
381 #define abi_node cp_global_trees[CPTI_ABI]
382 #define global_namespace cp_global_trees[CPTI_GLOBAL]
383 #define const_type_info_type_node cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE]
384 #define conv_op_marker cp_global_trees[CPTI_CONV_OP_MARKER]
385 #define abort_fndecl cp_global_trees[CPTI_ABORT_FNDECL]
386 #define current_aggr cp_global_trees[CPTI_AGGR_TAG]
387 #define nullptr_node cp_global_trees[CPTI_NULLPTR]
388 #define nullptr_type_node cp_global_trees[CPTI_NULLPTR_TYPE]
389 /* std::align_val_t */
390 #define align_type_node cp_global_trees[CPTI_ALIGN_TYPE]
391
392 #define char8_type_node c_global_trees[CTI_CHAR8_TYPE]
393 #define char16_type_node c_global_trees[CTI_CHAR16_TYPE]
394 #define char32_type_node c_global_trees[CTI_CHAR32_TYPE]
395 #define wchar_type_node c_global_trees[CTI_WCHAR_TYPE]
396 #define underlying_wchar_type_node c_global_trees[CTI_UNDERLYING_WCHAR_TYPE]
397 #define wint_type_node c_global_trees[CTI_WINT_TYPE]
398 #define signed_size_type_node c_global_trees[CTI_SIGNED_SIZE_TYPE]
399 #define unsigned_ptrdiff_type_node c_global_trees[CTI_UNSIGNED_PTRDIFF_TYPE]
400 #define intmax_type_node c_global_trees[CTI_INTMAX_TYPE]
401 #define uintmax_type_node c_global_trees[CTI_UINTMAX_TYPE]
402 #define widest_integer_literal_type_node c_global_trees[CTI_WIDEST_INT_LIT_TYPE]
403 #define widest_unsigned_literal_type_node \
404 c_global_trees[CTI_WIDEST_UINT_LIT_TYPE]
405
406 #define sig_atomic_type_node c_global_trees[CTI_SIG_ATOMIC_TYPE]
407 #define int8_type_node c_global_trees[CTI_INT8_TYPE]
408 #define int16_type_node c_global_trees[CTI_INT16_TYPE]
409 #define int32_type_node c_global_trees[CTI_INT32_TYPE]
410 #define int64_type_node c_global_trees[CTI_INT64_TYPE]
411 #define uint8_type_node c_global_trees[CTI_UINT8_TYPE]
412 #define c_uint16_type_node c_global_trees[CTI_UINT16_TYPE]
413 #define c_uint32_type_node c_global_trees[CTI_UINT32_TYPE]
414 #define c_uint64_type_node c_global_trees[CTI_UINT64_TYPE]
415 #define int_least8_type_node c_global_trees[CTI_INT_LEAST8_TYPE]
416 #define int_least16_type_node c_global_trees[CTI_INT_LEAST16_TYPE]
417 #define int_least32_type_node c_global_trees[CTI_INT_LEAST32_TYPE]
418 #define int_least64_type_node c_global_trees[CTI_INT_LEAST64_TYPE]
419 #define uint_least8_type_node c_global_trees[CTI_UINT_LEAST8_TYPE]
420 #define uint_least16_type_node c_global_trees[CTI_UINT_LEAST16_TYPE]
421 #define uint_least32_type_node c_global_trees[CTI_UINT_LEAST32_TYPE]
422 #define uint_least64_type_node c_global_trees[CTI_UINT_LEAST64_TYPE]
423 #define int_fast8_type_node c_global_trees[CTI_INT_FAST8_TYPE]
424 #define int_fast16_type_node c_global_trees[CTI_INT_FAST16_TYPE]
425 #define int_fast32_type_node c_global_trees[CTI_INT_FAST32_TYPE]
426 #define int_fast64_type_node c_global_trees[CTI_INT_FAST64_TYPE]
427 #define uint_fast8_type_node c_global_trees[CTI_UINT_FAST8_TYPE]
428 #define uint_fast16_type_node c_global_trees[CTI_UINT_FAST16_TYPE]
429 #define uint_fast32_type_node c_global_trees[CTI_UINT_FAST32_TYPE]
430 #define uint_fast64_type_node c_global_trees[CTI_UINT_FAST64_TYPE]
431 #define intptr_type_node c_global_trees[CTI_INTPTR_TYPE]
432 #define uintptr_type_node c_global_trees[CTI_UINTPTR_TYPE]
433
434 #define truthvalue_type_node c_global_trees[CTI_TRUTHVALUE_TYPE]
435 #define truthvalue_true_node c_global_trees[CTI_TRUTHVALUE_TRUE]
436 #define truthvalue_false_node c_global_trees[CTI_TRUTHVALUE_FALSE]
437
438 #define char_array_type_node c_global_trees[CTI_CHAR_ARRAY_TYPE]
439 #define char8_array_type_node c_global_trees[CTI_CHAR8_ARRAY_TYPE]
440 #define char16_array_type_node c_global_trees[CTI_CHAR16_ARRAY_TYPE]
441 #define char32_array_type_node c_global_trees[CTI_CHAR32_ARRAY_TYPE]
442 #define wchar_array_type_node c_global_trees[CTI_WCHAR_ARRAY_TYPE]
443 #define string_type_node c_global_trees[CTI_STRING_TYPE]
444 #define const_string_type_node c_global_trees[CTI_CONST_STRING_TYPE]
445
446 #define default_function_type c_global_trees[CTI_DEFAULT_FUNCTION_TYPE]
447
448 #define function_name_decl_node c_global_trees[CTI_FUNCTION_NAME_DECL]
449 #define pretty_function_name_decl_node \
450 c_global_trees[CTI_PRETTY_FUNCTION_NAME_DECL]
451 #define c99_function_name_decl_node c_global_trees[CTI_C99_FUNCTION_NAME_DECL]
452 #define saved_function_name_decls c_global_trees[CTI_SAVED_FUNCTION_NAME_DECLS]
453
454 /* The node for C++ `__null'. */
455 #define null_node c_global_trees[CTI_NULL]
456
457 /* We cache these tree nodes so as to call get_identifier less frequently.
458 For identifiers for functions, including special member functions such
459 as ctors and assignment operators, the nodes can be used (among other
460 things) to iterate over their overloads defined by/for a type. For
461 example:
462
463 tree ovlid = assign_op_identifier;
464 tree overloads = get_class_binding (type, ovlid);
465 for (ovl_iterator it (overloads); it; ++it) { ... }
466
467 iterates over the set of implicitly and explicitly defined overloads
468 of the assignment operator for type (including the copy and move
469 assignment operators, whether deleted or not). */
470
471 /* The name of a constructor that takes an in-charge parameter to
472 decide whether or not to construct virtual base classes. */
473 #define ctor_identifier cp_global_trees[CPTI_CTOR_IDENTIFIER]
474 /* The name of a constructor that constructs virtual base classes. */
475 #define complete_ctor_identifier cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER]
476 /* The name of a constructor that does not construct virtual base classes. */
477 #define base_ctor_identifier cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER]
478 /* The name of a destructor that takes an in-charge parameter to
479 decide whether or not to destroy virtual base classes and whether
480 or not to delete the object. */
481 #define dtor_identifier cp_global_trees[CPTI_DTOR_IDENTIFIER]
482 /* The name of a destructor that destroys virtual base classes. */
483 #define complete_dtor_identifier cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER]
484 /* The name of a destructor that does not destroy virtual base
485 classes. */
486 #define base_dtor_identifier cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
487 /* The name of a destructor that destroys virtual base classes, and
488 then deletes the entire object. */
489 #define deleting_dtor_identifier cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
490
491 /* The name used for conversion operators -- but note that actual
492 conversion functions use special identifiers outside the identifier
493 table. */
494 #define conv_op_identifier cp_global_trees[CPTI_CONV_OP_IDENTIFIER]
495
496 #define delta_identifier cp_global_trees[CPTI_DELTA_IDENTIFIER]
497 #define in_charge_identifier cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
498 /* The name of the parameter that contains a pointer to the VTT to use
499 for this subobject constructor or destructor. */
500 #define vtt_parm_identifier cp_global_trees[CPTI_VTT_PARM_IDENTIFIER]
501 #define as_base_identifier cp_global_trees[CPTI_AS_BASE_IDENTIFIER]
502 #define this_identifier cp_global_trees[CPTI_THIS_IDENTIFIER]
503 #define pfn_identifier cp_global_trees[CPTI_PFN_IDENTIFIER]
504 #define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER]
505 /* The name of the ::, std & anon namespaces. */
506 #define global_identifier cp_global_trees[CPTI_GLOBAL_IDENTIFIER]
507 #define anon_identifier cp_global_trees[CPTI_ANON_IDENTIFIER]
508 /* auto and declspec(auto) identifiers. */
509 #define auto_identifier cp_global_trees[CPTI_AUTO_IDENTIFIER]
510 #define decltype_auto_identifier cp_global_trees[CPTI_DECLTYPE_AUTO_IDENTIFIER]
511 #define init_list_identifier cp_global_trees[CPTI_INIT_LIST_IDENTIFIER]
512 #define for_range__identifier cp_global_trees[CPTI_FOR_RANGE__IDENTIFIER]
513 #define for_begin__identifier cp_global_trees[CPTI_FOR_BEGIN__IDENTIFIER]
514 #define for_end__identifier cp_global_trees[CPTI_FOR_END__IDENTIFIER]
515 #define for_range_identifier cp_global_trees[CPTI_FOR_RANGE_IDENTIFIER]
516 #define for_begin_identifier cp_global_trees[CPTI_FOR_BEGIN_IDENTIFIER]
517 #define for_end_identifier cp_global_trees[CPTI_FOR_END_IDENTIFIER]
518 #define abi_tag_identifier cp_global_trees[CPTI_ABI_TAG_IDENTIFIER]
519 #define aligned_identifier cp_global_trees[CPTI_ALIGNED_IDENTIFIER]
520 #define begin_identifier cp_global_trees[CPTI_BEGIN_IDENTIFIER]
521 #define end_identifier cp_global_trees[CPTI_END_IDENTIFIER]
522 #define get__identifier cp_global_trees[CPTI_GET_IDENTIFIER]
523 #define gnu_identifier cp_global_trees[CPTI_GNU_IDENTIFIER]
524 #define tuple_element_identifier cp_global_trees[CPTI_TUPLE_ELEMENT_IDENTIFIER]
525 #define tuple_size_identifier cp_global_trees[CPTI_TUPLE_SIZE_IDENTIFIER]
526 #define type_identifier cp_global_trees[CPTI_TYPE_IDENTIFIER]
527 #define value_identifier cp_global_trees[CPTI_VALUE_IDENTIFIER]
528 #define fun_identifier cp_global_trees[CPTI_FUN_IDENTIFIER]
529 #define closure_identifier cp_global_trees[CPTI_CLOSURE_IDENTIFIER]
530 #define heap_uninit_identifier cp_global_trees[CPTI_HEAP_UNINIT_IDENTIFIER]
531 #define heap_identifier cp_global_trees[CPTI_HEAP_IDENTIFIER]
532 #define heap_deleted_identifier cp_global_trees[CPTI_HEAP_DELETED_IDENTIFIER]
533 #define heap_vec_uninit_identifier \
534 cp_global_trees[CPTI_HEAP_VEC_UNINIT_IDENTIFIER]
535 #define heap_vec_identifier cp_global_trees[CPTI_HEAP_VEC_IDENTIFIER]
536 #define omp_identifier cp_global_trees[CPTI_OMP_IDENTIFIER]
537 #define lang_name_c cp_global_trees[CPTI_LANG_NAME_C]
538 #define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
539
540 /* Exception specifiers used for throw(), noexcept(true),
541 noexcept(false) and deferred noexcept. We rely on these being
542 uncloned. */
543 #define empty_except_spec cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
544 #define noexcept_true_spec cp_global_trees[CPTI_NOEXCEPT_TRUE_SPEC]
545 #define noexcept_false_spec cp_global_trees[CPTI_NOEXCEPT_FALSE_SPEC]
546 #define noexcept_deferred_spec cp_global_trees[CPTI_NOEXCEPT_DEFERRED_SPEC]
547
548 /* Exception handling function declarations. */
549 #define terminate_fn cp_global_trees[CPTI_TERMINATE_FN]
550 #define call_unexpected_fn cp_global_trees[CPTI_CALL_UNEXPECTED_FN]
551 #define get_exception_ptr_fn cp_global_trees[CPTI_GET_EXCEPTION_PTR_FN]
552 #define begin_catch_fn cp_global_trees[CPTI_BEGIN_CATCH_FN]
553 #define end_catch_fn cp_global_trees[CPTI_END_CATCH_FN]
554 #define allocate_exception_fn cp_global_trees[CPTI_ALLOCATE_EXCEPTION_FN]
555 #define free_exception_fn cp_global_trees[CPTI_FREE_EXCEPTION_FN]
556 #define throw_fn cp_global_trees[CPTI_THROW_FN]
557 #define rethrow_fn cp_global_trees[CPTI_RETHROW_FN]
558
559 /* The type of the function-pointer argument to "__cxa_atexit" (or
560 "std::atexit", if "__cxa_atexit" is not being used). */
561 #define atexit_fn_ptr_type_node cp_global_trees[CPTI_ATEXIT_FN_PTR_TYPE]
562
563 /* A pointer to `std::atexit'. */
564 #define atexit_node cp_global_trees[CPTI_ATEXIT]
565
566 /* A pointer to `__dso_handle'. */
567 #define dso_handle_node cp_global_trees[CPTI_DSO_HANDLE]
568
569 /* The declaration of the dynamic_cast runtime. */
570 #define dynamic_cast_node cp_global_trees[CPTI_DCAST]
571
572 /* The type of a destructor. */
573 #define cleanup_type cp_global_trees[CPTI_CLEANUP_TYPE]
574
575 /* The type of the vtt parameter passed to subobject constructors and
576 destructors. */
577 #define vtt_parm_type cp_global_trees[CPTI_VTT_PARM_TYPE]
578
579 /* A node which matches any template argument. */
580 #define any_targ_node cp_global_trees[CPTI_ANY_TARG]
581
582 /* std::source_location::__impl class. */
583 #define source_location_impl cp_global_trees[CPTI_SOURCE_LOCATION_IMPL]
584
585 /* These two accessors should only be used by OVL manipulators.
586 Other users should use iterators and convenience functions. */
587 #define OVL_FUNCTION(NODE) \
588 (((struct tree_overload *) OVERLOAD_CHECK (NODE))->function)
589 #define OVL_CHAIN(NODE) \
590 (((struct tree_overload *) OVERLOAD_CHECK (NODE))->common.chain)
591
592 /* If set, this or a subsequent overload contains decls that need deduping. */
593 #define OVL_DEDUP_P(NODE) TREE_LANG_FLAG_0 (OVERLOAD_CHECK (NODE))
594 /* If set, this was imported in a using declaration. */
595 #define OVL_USING_P(NODE) TREE_LANG_FLAG_1 (OVERLOAD_CHECK (NODE))
596 /* If set, this overload is a hidden decl. */
597 #define OVL_HIDDEN_P(NODE) TREE_LANG_FLAG_2 (OVERLOAD_CHECK (NODE))
598 /* If set, this overload contains a nested overload. */
599 #define OVL_NESTED_P(NODE) TREE_LANG_FLAG_3 (OVERLOAD_CHECK (NODE))
600 /* If set, this overload was constructed during lookup. */
601 #define OVL_LOOKUP_P(NODE) TREE_LANG_FLAG_4 (OVERLOAD_CHECK (NODE))
602 /* If set, this OVL_USING_P overload is exported. */
603 #define OVL_EXPORT_P(NODE) TREE_LANG_FLAG_5 (OVERLOAD_CHECK (NODE))
604
605 /* The first decl of an overload. */
606 #define OVL_FIRST(NODE) Rust::ovl_first (NODE)
607 /* The name of the overload set. */
608 #define OVL_NAME(NODE) DECL_NAME (OVL_FIRST (NODE))
609
610 /* Whether this is a set of overloaded functions. TEMPLATE_DECLS are
611 always wrapped in an OVERLOAD, so we don't need to check them
612 here. */
613 #define OVL_P(NODE) \
614 (TREE_CODE (NODE) == FUNCTION_DECL || TREE_CODE (NODE) == OVERLOAD)
615 /* Whether this is a single member overload. */
616 #define OVL_SINGLE_P(NODE) (TREE_CODE (NODE) != OVERLOAD || !OVL_CHAIN (NODE))
617
618 /* Nonzero means that this type has an X() constructor. */
619 #define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) \
620 (LANG_TYPE_CLASS_CHECK (NODE)->has_default_ctor)
621
622 /* Nonzero means that NODE (a class type) has a default constructor --
623 but that it has not yet been declared. */
624 #define CLASSTYPE_LAZY_DEFAULT_CTOR(NODE) \
625 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_default_ctor)
626
627 /* A FUNCTION_DECL or OVERLOAD for the constructors for NODE. These
628 are the constructors that take an in-charge parameter. */
629 #define CLASSTYPE_CONSTRUCTORS(NODE) \
630 (get_class_binding_direct (NODE, ctor_identifier))
631
632 /* In a TREE_LIST in an attribute list, indicates that the attribute
633 must be applied at instantiation time. */
634 #define ATTR_IS_DEPENDENT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
635
636 /* In a TREE_LIST in the argument of attribute abi_tag, indicates that the tag
637 was inherited from a template parameter, not explicitly indicated. */
638 #define ABI_TAG_IMPLICIT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
639
640 /* In a TREE_LIST for a parameter-declaration-list, indicates that all the
641 parameters in the list have declarators enclosed in (). */
642 #define PARENTHESIZED_LIST_P(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
643
644 /* Non zero if this is a using decl for a dependent scope. */
645 #define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE))
646
647 /* The scope named in a using decl. */
648 #define USING_DECL_SCOPE(NODE) DECL_RESULT_FLD (USING_DECL_CHECK (NODE))
649
650 /* The decls named by a using decl. */
651 #define USING_DECL_DECLS(NODE) DECL_INITIAL (USING_DECL_CHECK (NODE))
652
653 /* Non zero if the using decl refers to a dependent type. */
654 #define USING_DECL_TYPENAME_P(NODE) DECL_LANG_FLAG_1 (USING_DECL_CHECK (NODE))
655
656 /* True if member using decl NODE refers to a non-inherited NODE. */
657 #define USING_DECL_UNRELATED_P(NODE) DECL_LANG_FLAG_2 (USING_DECL_CHECK (NODE))
658
659 /* Nonzero if NODE declares a function. */
660 #define DECL_DECLARES_FUNCTION_P(NODE) (TREE_CODE (NODE) == FUNCTION_DECL)
661
662 /* Nonzero for a NODE which declares a type. */
663 #define DECL_DECLARES_TYPE_P(NODE) (TREE_CODE (NODE) == TYPE_DECL)
664
665 /* Kind bits. */
666 #define IDENTIFIER_KIND_BIT_0(NODE) \
667 TREE_LANG_FLAG_0 (IDENTIFIER_NODE_CHECK (NODE))
668 #define IDENTIFIER_KIND_BIT_1(NODE) \
669 TREE_LANG_FLAG_1 (IDENTIFIER_NODE_CHECK (NODE))
670 #define IDENTIFIER_KIND_BIT_2(NODE) \
671 TREE_LANG_FLAG_2 (IDENTIFIER_NODE_CHECK (NODE))
672
673 /* Used by various search routines. */
674 #define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_4 (IDENTIFIER_NODE_CHECK (NODE))
675
676 /* Nonzero if this identifier is used as a virtual function name somewhere
677 (optimizes searches). */
678 #define IDENTIFIER_VIRTUAL_P(NODE) \
679 TREE_LANG_FLAG_5 (IDENTIFIER_NODE_CHECK (NODE))
680
681 /* True if this identifier is a reserved word. C_RID_CODE (node) is
682 then the RID_* value of the keyword. Value 1. */
683 #define IDENTIFIER_KEYWORD_P(NODE) \
684 ((!IDENTIFIER_KIND_BIT_2 (NODE)) & (!IDENTIFIER_KIND_BIT_1 (NODE)) \
685 & IDENTIFIER_KIND_BIT_0 (NODE))
686
687 /* True if this identifier is the name of a constructor or
688 destructor. Value 2 or 3. */
689 #define IDENTIFIER_CDTOR_P(NODE) \
690 ((!IDENTIFIER_KIND_BIT_2 (NODE)) & IDENTIFIER_KIND_BIT_1 (NODE))
691
692 /* True if this identifier is the name of a constructor. Value 2. */
693 #define IDENTIFIER_CTOR_P(NODE) \
694 (IDENTIFIER_CDTOR_P (NODE) & (!IDENTIFIER_KIND_BIT_0 (NODE)))
695
696 /* True if this identifier is the name of a destructor. Value 3. */
697 #define IDENTIFIER_DTOR_P(NODE) \
698 (IDENTIFIER_CDTOR_P (NODE) & IDENTIFIER_KIND_BIT_0 (NODE))
699
700 /* True if this identifier is for any operator name (including
701 conversions). Value 4, 5, 6 or 7. */
702 #define IDENTIFIER_ANY_OP_P(NODE) (IDENTIFIER_KIND_BIT_2 (NODE))
703
704 /* True if this identifier is for an overloaded operator. Values 4, 5. */
705 #define IDENTIFIER_OVL_OP_P(NODE) \
706 (IDENTIFIER_ANY_OP_P (NODE) & (!IDENTIFIER_KIND_BIT_1 (NODE)))
707
708 /* True if this identifier is for any assignment. Values 5. */
709 #define IDENTIFIER_ASSIGN_OP_P(NODE) \
710 (IDENTIFIER_OVL_OP_P (NODE) & IDENTIFIER_KIND_BIT_0 (NODE))
711
712 /* True if this identifier is the name of a type-conversion
713 operator. Value 7. */
714 #define IDENTIFIER_CONV_OP_P(NODE) \
715 (IDENTIFIER_ANY_OP_P (NODE) & IDENTIFIER_KIND_BIT_1 (NODE) \
716 & (!IDENTIFIER_KIND_BIT_0 (NODE)))
717
718 /* True if this identifier is a new or delete operator. */
719 #define IDENTIFIER_NEWDEL_OP_P(NODE) \
720 (IDENTIFIER_OVL_OP_P (NODE) \
721 && IDENTIFIER_OVL_OP_FLAGS (NODE) & OVL_OP_FLAG_ALLOC)
722
723 /* True if this identifier is a new operator. */
724 #define IDENTIFIER_NEW_OP_P(NODE) \
725 (IDENTIFIER_OVL_OP_P (NODE) \
726 && (IDENTIFIER_OVL_OP_FLAGS (NODE) \
727 & (OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE)) \
728 == OVL_OP_FLAG_ALLOC)
729
730 /* Nonzero if the class NODE has multiple paths to the same (virtual)
731 base object. */
732 #define CLASSTYPE_DIAMOND_SHAPED_P(NODE) \
733 (LANG_TYPE_CLASS_CHECK (NODE)->diamond_shaped)
734
735 /* Nonzero if the class NODE has multiple instances of the same base
736 type. */
737 #define CLASSTYPE_REPEATED_BASE_P(NODE) \
738 (LANG_TYPE_CLASS_CHECK (NODE)->repeated_base)
739
740 /* The member function with which the vtable will be emitted:
741 the first noninline non-pure-virtual member function. NULL_TREE
742 if there is no key function or if this is a class template */
743 #define CLASSTYPE_KEY_METHOD(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->key_method)
744
745 /* Vector of members. During definition, it is unordered and only
746 member functions are present. After completion it is sorted and
747 contains both member functions and non-functions. STAT_HACK is
748 involved to preserve oneslot per name invariant. */
749 #define CLASSTYPE_MEMBER_VEC(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->members)
750
751 /* For class templates, this is a TREE_LIST of all member data,
752 functions, types, and friends in the order of declaration.
753 The TREE_PURPOSE of each TREE_LIST is NULL_TREE for a friend,
754 and the RECORD_TYPE for the class template otherwise. */
755 #define CLASSTYPE_DECL_LIST(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->decl_list)
756
757 /* A FUNCTION_DECL or OVERLOAD for the constructors for NODE. These
758 are the constructors that take an in-charge parameter. */
759 #define CLASSTYPE_CONSTRUCTORS(NODE) \
760 (get_class_binding_direct (NODE, ctor_identifier))
761
762 /* A FUNCTION_DECL for the destructor for NODE. This is the
763 destructors that take an in-charge parameter. If
764 CLASSTYPE_LAZY_DESTRUCTOR is true, then this entry will be NULL
765 until the destructor is created with lazily_declare_fn. */
766 #define CLASSTYPE_DESTRUCTOR(NODE) \
767 (get_class_binding_direct (NODE, dtor_identifier))
768
769 /* Nonzero if NODE has a primary base class, i.e., a base class with
770 which it shares the virtual function table pointer. */
771 #define CLASSTYPE_HAS_PRIMARY_BASE_P(NODE) \
772 (CLASSTYPE_PRIMARY_BINFO (NODE) != NULL_TREE)
773
774 /* If non-NULL, this is the binfo for the primary base class, i.e.,
775 the base class which contains the virtual function table pointer
776 for this class. */
777 #define CLASSTYPE_PRIMARY_BINFO(NODE) \
778 (LANG_TYPE_CLASS_CHECK (NODE)->primary_base)
779
780 /* The type corresponding to NODE when NODE is used as a base class,
781 i.e., NODE without virtual base classes or tail padding. */
782 #define CLASSTYPE_AS_BASE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->as_base)
783
784 /* Nonzero if NODE is a user-defined conversion operator. */
785 #define DECL_CONV_FN_P(NODE) IDENTIFIER_CONV_OP_P (DECL_NAME (NODE))
786
787 /* The type to which conversion operator FN converts to. */
788 #define DECL_CONV_FN_TYPE(FN) \
789 TREE_TYPE ((gcc_checking_assert (DECL_CONV_FN_P (FN)), DECL_NAME (FN)))
790
791 /* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
792 sense of `same'. */
793 #define same_type_p(TYPE1, TYPE2) comptypes ((TYPE1), (TYPE2), COMPARE_STRICT)
794
795 /* Nonzero if T is a type that could resolve to any kind of concrete type
796 at instantiation time. */
797 #define WILDCARD_TYPE_P(T) \
798 (TREE_CODE (T) == TEMPLATE_TYPE_PARM || TREE_CODE (T) == TYPENAME_TYPE \
799 || TREE_CODE (T) == TYPEOF_TYPE \
800 || TREE_CODE (T) == BOUND_TEMPLATE_TEMPLATE_PARM \
801 || TREE_CODE (T) == DECLTYPE_TYPE \
802 || TREE_CODE (T) == DEPENDENT_OPERATOR_TYPE)
803
804 /* Nonzero if T is a class (or struct or union) type. Also nonzero
805 for template type parameters, typename types, and instantiated
806 template template parameters. Keep these checks in ascending code
807 order. */
808 #define MAYBE_CLASS_TYPE_P(T) (WILDCARD_TYPE_P (T) || CLASS_TYPE_P (T))
809
810 /* 1 iff FUNCTION_TYPE or METHOD_TYPE has a ref-qualifier (either & or &&). */
811 #define FUNCTION_REF_QUALIFIED(NODE) \
812 TREE_LANG_FLAG_4 (FUNC_OR_METHOD_CHECK (NODE))
813
814 /* 1 iff FUNCTION_TYPE or METHOD_TYPE has &&-ref-qualifier. */
815 #define FUNCTION_RVALUE_QUALIFIED(NODE) \
816 TREE_LANG_FLAG_5 (FUNC_OR_METHOD_CHECK (NODE))
817
818 /* Get the POINTER_TYPE to the METHOD_TYPE associated with this
819 pointer to member function. TYPE_PTRMEMFUNC_P _must_ be true,
820 before using this macro. */
821 #define TYPE_PTRMEMFUNC_FN_TYPE(NODE) \
822 (rs_build_qualified_type (TREE_TYPE (TYPE_FIELDS (NODE)), \
823 rs_type_quals (NODE)))
824
825 /* As above, but can be used in places that want an lvalue at the expense
826 of not necessarily having the correct cv-qualifiers. */
827 #define TYPE_PTRMEMFUNC_FN_TYPE_RAW(NODE) (TREE_TYPE (TYPE_FIELDS (NODE)))
828
829 /* True if this type is dependent. This predicate is only valid if
830 TYPE_DEPENDENT_P_VALID is true. */
831 #define TYPE_DEPENDENT_P(NODE) TYPE_LANG_FLAG_0 (NODE)
832
833 /* True if dependent_type_p has been called for this type, with the
834 result that TYPE_DEPENDENT_P is valid. */
835 #define TYPE_DEPENDENT_P_VALID(NODE) TYPE_LANG_FLAG_6 (NODE)
836
837 /* Nonzero for _TYPE node means that this type does not have a trivial
838 destructor. Therefore, destroying an object of this type will
839 involve a call to a destructor. This can apply to objects of
840 ARRAY_TYPE if the type of the elements needs a destructor. */
841 #define TYPE_HAS_NONTRIVIAL_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_4 (NODE))
842
843 /* For FUNCTION_TYPE or METHOD_TYPE, a list of the exceptions that
844 this type can raise. Each TREE_VALUE is a _TYPE. The TREE_VALUE
845 will be NULL_TREE to indicate a throw specification of `()', or
846 no exceptions allowed. For a noexcept specification, TREE_VALUE
847 is NULL_TREE and TREE_PURPOSE is the constant-expression. For
848 a deferred noexcept-specification, TREE_PURPOSE is a DEFERRED_NOEXCEPT
849 (for templates) or an OVERLOAD list of functions (for implicitly
850 declared functions). */
851 #define TYPE_RAISES_EXCEPTIONS(NODE) \
852 TYPE_LANG_SLOT_1 (FUNC_OR_METHOD_CHECK (NODE))
853
854 /* Identifiers map directly to block or class-scope bindings.
855 Namespace-scope bindings are held in hash tables on the respective
856 namespaces. The identifier bindings are the innermost active
857 binding, from whence you can get the decl and/or implicit-typedef
858 of an elaborated type. When not bound to a local entity the
859 values are NULL. */
860 #define IDENTIFIER_BINDING(NODE) (LANG_IDENTIFIER_CAST (NODE)->bindings)
861
862 #define LANG_IDENTIFIER_CAST(NODE) \
863 ((struct lang_identifier *) IDENTIFIER_NODE_CHECK (NODE))
864
865 /* IF_STMT accessors. These give access to the condition of the if
866 statement, the then block of the if statement, and the else block
867 of the if statement if it exists. */
868 #define IF_COND(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 0)
869 #define THEN_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 1)
870 #define ELSE_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
871 #define IF_SCOPE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 3)
872 #define IF_STMT_CONSTEXPR_P(NODE) TREE_LANG_FLAG_0 (IF_STMT_CHECK (NODE))
873 #define IF_STMT_CONSTEVAL_P(NODE) TREE_LANG_FLAG_2 (IF_STMT_CHECK (NODE))
874
875 /* The expression in question for a DECLTYPE_TYPE. */
876 #define DECLTYPE_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (DECLTYPE_TYPE_CHECK (NODE)))
877
878 #define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE, X) \
879 (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = !!(X))
880
881 /* Nonzero if this class is included from a header file which employs
882 `#pragma interface', and it is not included in its implementation file. */
883 #define CLASSTYPE_INTERFACE_ONLY(NODE) \
884 (LANG_TYPE_CLASS_CHECK (NODE)->interface_only)
885
886 #define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE)))
887 #define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE)))
888
889 /* Whether a PARM_DECL represents a local parameter in a
890 requires-expression. */
891 #define CONSTRAINT_VAR_P(NODE) DECL_LANG_FLAG_2 (TREE_CHECK (NODE, PARM_DECL))
892
893 /* In a CALL_EXPR appearing in a template, true if Koenig lookup
894 should be performed at instantiation time. */
895 #define KOENIG_LOOKUP_P(NODE) TREE_LANG_FLAG_0 (CALL_EXPR_CHECK (NODE))
896
897 /* The index of a user-declared parameter in its function, starting at 1.
898 All artificial parameters will have index 0. */
899 #define DECL_PARM_INDEX(NODE) (LANG_DECL_PARM_CHECK (NODE)->index)
900
901 /* The level of a user-declared parameter in its function, starting at 1.
902 A parameter of the function will have level 1; a parameter of the first
903 nested function declarator (i.e. t in void f (void (*p)(T t))) will have
904 level 2. */
905 #define DECL_PARM_LEVEL(NODE) (LANG_DECL_PARM_CHECK (NODE)->level)
906
907 /* These flags are used by the conversion code.
908 CONV_IMPLICIT : Perform implicit conversions (standard and user-defined).
909 CONV_STATIC : Perform the explicit conversions for static_cast.
910 CONV_CONST : Perform the explicit conversions for const_cast.
911 CONV_REINTERPRET: Perform the explicit conversions for reinterpret_cast.
912 CONV_PRIVATE : Perform upcasts to private bases.
913 CONV_FORCE_TEMP : Require a new temporary when converting to the same
914 aggregate type. */
915
916 #define CONV_IMPLICIT 1
917 #define CONV_STATIC 2
918 #define CONV_CONST 4
919 #define CONV_REINTERPRET 8
920 #define CONV_PRIVATE 16
921 #define CONV_FORCE_TEMP 32
922 #define CONV_FOLD 64
923 #define CONV_OLD_CONVERT \
924 (CONV_IMPLICIT | CONV_STATIC | CONV_CONST | CONV_REINTERPRET)
925 #define CONV_C_CAST \
926 (CONV_IMPLICIT | CONV_STATIC | CONV_CONST | CONV_REINTERPRET | CONV_PRIVATE \
927 | CONV_FORCE_TEMP)
928 #define CONV_BACKEND_CONVERT (CONV_OLD_CONVERT | CONV_FOLD)
929
930 /* Used by build_expr_type_conversion to indicate which types are
931 acceptable as arguments to the expression under consideration. */
932
933 #define WANT_INT 1 /* integer types, including bool */
934 #define WANT_FLOAT 2 /* floating point types */
935 #define WANT_ENUM 4 /* enumerated types */
936 #define WANT_POINTER 8 /* pointer types */
937 #define WANT_NULL 16 /* null pointer constant */
938 #define WANT_VECTOR_OR_COMPLEX 32 /* vector or complex types */
939 #define WANT_ARITH (WANT_INT | WANT_FLOAT | WANT_VECTOR_OR_COMPLEX)
940
941 /* Used with comptypes, and related functions, to guide type
942 comparison. */
943
944 #define COMPARE_STRICT \
945 0 /* Just check if the types are the \
946 same. */
947 #define COMPARE_BASE \
948 1 /* Check to see if the second type is \
949 derived from the first. */
950 #define COMPARE_DERIVED \
951 2 /* Like COMPARE_BASE, but in \
952 reverse. */
953 #define COMPARE_REDECLARATION \
954 4 /* The comparison is being done when \
955 another declaration of an existing \
956 entity is seen. */
957 #define COMPARE_STRUCTURAL \
958 8 /* The comparison is intended to be \
959 structural. The actual comparison \
960 will be identical to \
961 COMPARE_STRICT. */
962
963 /* Used with start function. */
964 #define SF_DEFAULT 0 /* No flags. */
965 #define SF_PRE_PARSED \
966 1 /* The function declaration has \
967 already been parsed. */
968 #define SF_INCLASS_INLINE \
969 2 /* The function is an inline, defined \
970 in the class body. */
971
972 /* Used with start_decl's initialized parameter. */
973 #define SD_UNINITIALIZED 0
974 #define SD_INITIALIZED 1
975 /* Like SD_INITIALIZED, but also mark the new decl as DECL_DECOMPOSITION_P. */
976 #define SD_DECOMPOSITION 2
977 #define SD_DEFAULTED 3
978 #define SD_DELETED 4
979
980 /* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
981 sense of `same'. */
982 #define same_type_p(TYPE1, TYPE2) comptypes ((TYPE1), (TYPE2), COMPARE_STRICT)
983
984 /* Returns true if NODE is a pointer-to-data-member. */
985 #define TYPE_PTRDATAMEM_P(NODE) (TREE_CODE (NODE) == OFFSET_TYPE)
986
987 /* Nonzero if this type is const-qualified. */
988 #define RS_TYPE_CONST_P(NODE) ((rs_type_quals (NODE) & TYPE_QUAL_CONST) != 0)
989
990 /* The _DECL for this _TYPE. */
991 #define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
992
993 /* Nonzero for a VAR_DECL iff an explicit initializer was provided
994 or a non-trivial constructor is called. */
995 #define DECL_NONTRIVIALLY_INITIALIZED_P(NODE) \
996 (TREE_LANG_FLAG_6 (VAR_DECL_CHECK (NODE)))
997
998 /* Nonzero if DECL was declared with '= default' (maybe implicitly). */
999 #define DECL_DEFAULTED_FN(DECL) (LANG_DECL_FN_CHECK (DECL)->defaulted_p)
1000
1001 /* Nonzero for a class type means that the class type has a
1002 user-declared constructor. */
1003 #define TYPE_HAS_USER_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1 (NODE))
1004
1005 /* A FUNCTION_DECL or OVERLOAD for the constructors for NODE. These
1006 are the constructors that take an in-charge parameter. */
1007 #define CLASSTYPE_CONSTRUCTORS(NODE) \
1008 (get_class_binding_direct (NODE, ctor_identifier))
1009
1010 /* Nonzero if the DECL was initialized in the class definition itself,
1011 rather than outside the class. This is used for both static member
1012 VAR_DECLS, and FUNCTION_DECLS that are defined in the class. */
1013 #define DECL_INITIALIZED_IN_CLASS_P(DECL) \
1014 (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \
1015 ->u.base.initialized_in_class)
1016
1017 /* Nonzero if DECL is explicitly defaulted in the class body. */
1018 #define DECL_DEFAULTED_IN_CLASS_P(DECL) \
1019 (DECL_DEFAULTED_FN (DECL) && DECL_INITIALIZED_IN_CLASS_P (DECL))
1020
1021 /* Nonzero for FUNCTION_DECL means that this decl is a non-static
1022 member function. */
1023 #define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \
1024 (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)
1025
1026 /* For FUNCTION_DECLs: nonzero means that this function is a
1027 constructor or a destructor with an extra in-charge parameter to
1028 control whether or not virtual bases are constructed. */
1029 #define DECL_HAS_IN_CHARGE_PARM_P(NODE) \
1030 (LANG_DECL_FN_CHECK (NODE)->has_in_charge_parm_p)
1031
1032 /* Nonzero if the VTT parm has been added to NODE. */
1033 #define DECL_HAS_VTT_PARM_P(NODE) (LANG_DECL_FN_CHECK (NODE)->has_vtt_parm_p)
1034
1035 /* Given a FUNCTION_DECL, returns the first TREE_LIST out of TYPE_ARG_TYPES
1036 which refers to a user-written parameter. */
1037 #define FUNCTION_FIRST_USER_PARMTYPE(NODE) \
1038 skip_artificial_parms_for ((NODE), TYPE_ARG_TYPES (TREE_TYPE (NODE)))
1039
1040 /* Similarly, but for DECL_ARGUMENTS. */
1041 #define FUNCTION_FIRST_USER_PARM(NODE) \
1042 skip_artificial_parms_for ((NODE), DECL_ARGUMENTS (NODE))
1043
1044 /* For FUNCTION_DECLs and TEMPLATE_DECLs: nonzero means that this function
1045 is a constructor. */
1046 #define DECL_CONSTRUCTOR_P(NODE) DECL_CXX_CONSTRUCTOR_P (NODE)
1047
1048 /* Nonzero if DECL was declared with '= delete'. */
1049 #define DECL_DELETED_FN(DECL) \
1050 (LANG_DECL_FN_CHECK (DECL)->min.base.threadprivate_or_deleted_p)
1051
1052 /* Nonzero if DECL was declared with '= default' (maybe implicitly). */
1053 #define DECL_DEFAULTED_FN(DECL) (LANG_DECL_FN_CHECK (DECL)->defaulted_p)
1054
1055 /* True if NODE is a brace-enclosed initializer. */
1056 #define BRACE_ENCLOSED_INITIALIZER_P(NODE) \
1057 (TREE_CODE (NODE) == CONSTRUCTOR && TREE_TYPE (NODE) == init_list_type_node)
1058
1059 /* True if FNDECL is an immediate function. */
1060 #define DECL_IMMEDIATE_FUNCTION_P(NODE) \
1061 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE)) \
1062 ? LANG_DECL_FN_CHECK (NODE)->immediate_fn_p \
1063 : false)
1064 #define SET_DECL_IMMEDIATE_FUNCTION_P(NODE) \
1065 (retrofit_lang_decl (FUNCTION_DECL_CHECK (NODE)), \
1066 LANG_DECL_FN_CHECK (NODE)->immediate_fn_p = true)
1067
1068 /* True if this CONSTRUCTOR should not be used as a variable initializer
1069 because it was loaded from a constexpr variable with mutable fields. */
1070 #define CONSTRUCTOR_MUTABLE_POISON(NODE) \
1071 (TREE_LANG_FLAG_2 (CONSTRUCTOR_CHECK (NODE)))
1072
1073 /* For a pointer-to-member constant `X::Y' this is the _DECL for
1074 `Y'. */
1075 #define PTRMEM_CST_MEMBER(NODE) \
1076 (((ptrmem_cst_t) PTRMEM_CST_CHECK (NODE))->member)
1077
1078 /* Indicates whether a COMPONENT_REF or a SCOPE_REF has been parenthesized, an
1079 INDIRECT_REF comes from parenthesizing a _DECL, or a PAREN_EXPR identifies a
1080 parenthesized initializer relevant for decltype(auto). Currently only set
1081 some of the time in C++14 mode. */
1082
1083 #define REF_PARENTHESIZED_P(NODE) \
1084 TREE_LANG_FLAG_2 (TREE_CHECK5 ((NODE), COMPONENT_REF, INDIRECT_REF, \
1085 SCOPE_REF, VIEW_CONVERT_EXPR, PAREN_EXPR))
1086
1087 /* Returns true if NODE is a pointer-to-member. */
1088 #define TYPE_PTRMEM_P(NODE) \
1089 (TYPE_PTRDATAMEM_P (NODE) || TYPE_PTRMEMFUNC_P (NODE))
1090
1091 /* Returns true if NODE is a pointer or a pointer-to-member. */
1092 #define TYPE_PTR_OR_PTRMEM_P(NODE) (TYPE_PTR_P (NODE) || TYPE_PTRMEM_P (NODE))
1093
1094 /* Nonzero if NODE is an artificial VAR_DECL for a C++17 structured binding
1095 declaration or one of VAR_DECLs for the user identifiers in it. */
1096 #define DECL_DECOMPOSITION_P(NODE) \
1097 (VAR_P (NODE) && DECL_LANG_SPECIFIC (NODE) \
1098 ? DECL_LANG_SPECIFIC (NODE)->u.base.selector == lds_decomp \
1099 : false)
1100
1101 /* The underlying artificial VAR_DECL for structured binding. */
1102 #define DECL_DECOMP_BASE(NODE) (LANG_DECL_DECOMP_CHECK (NODE)->base)
1103
1104 /* Nonzero if either DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P or
1105 DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P is true of NODE. */
1106 #define DECL_MAYBE_IN_CHARGE_CDTOR_P(NODE) \
1107 (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (NODE) \
1108 || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (NODE))
1109
1110 /* Nonzero if NODE (a FUNCTION_DECL) is a destructor, but not the
1111 specialized in-charge constructor, in-charge deleting constructor,
1112 or the base destructor. */
1113 #define DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P(NODE) \
1114 (DECL_NAME (NODE) == dtor_identifier)
1115
1116 /* Nonzero if NODE (a _DECL) is a cloned constructor or
1117 destructor. */
1118 #define DECL_CLONED_FUNCTION_P(NODE) \
1119 (DECL_NAME (NODE) && IDENTIFIER_CDTOR_P (DECL_NAME (NODE)) \
1120 && !DECL_MAYBE_IN_CHARGE_CDTOR_P (NODE))
1121
1122 /* If DECL_CLONED_FUNCTION_P holds, this is the function that was
1123 cloned. */
1124 #define DECL_CLONED_FUNCTION(NODE) \
1125 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE))->u.fn.u5.cloned_function)
1126
1127 /* Nonzero if NODE (a _DECL) is a cloned constructor or
1128 destructor. */
1129 #define DECL_CLONED_FUNCTION_P(NODE) \
1130 (DECL_NAME (NODE) && IDENTIFIER_CDTOR_P (DECL_NAME (NODE)) \
1131 && !DECL_MAYBE_IN_CHARGE_CDTOR_P (NODE))
1132
1133 /* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the
1134 specialized in-charge constructor or the specialized not-in-charge
1135 constructor. */
1136 #define DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P(NODE) \
1137 (DECL_NAME (NODE) == ctor_identifier)
1138
1139 /* The current C++-specific per-function global variables. */
1140
1141 #define cp_function_chain (cfun->language)
1142
1143 /* In a constructor destructor, the point at which all derived class
1144 destroying/construction has been done. I.e., just before a
1145 constructor returns, or before any base class destroying will be done
1146 in a destructor. */
1147
1148 #define cdtor_label cp_function_chain->x_cdtor_label
1149
1150 /* When we're processing a member function, current_class_ptr is the
1151 PARM_DECL for the `this' pointer. The current_class_ref is an
1152 expression for `*this'. */
1153
1154 #define current_class_ptr \
1155 (*(cfun && cp_function_chain ? &cp_function_chain->x_current_class_ptr \
1156 : &scope_chain->x_current_class_ptr))
1157 #define current_class_ref \
1158 (*(cfun && cp_function_chain ? &cp_function_chain->x_current_class_ref \
1159 : &scope_chain->x_current_class_ref))
1160
1161 /* The EH_SPEC_BLOCK for the exception-specifiers for the current
1162 function, if any. */
1163
1164 #define current_eh_spec_block cp_function_chain->x_eh_spec_block
1165
1166 /* The `__in_chrg' parameter for the current function. Only used for
1167 constructors and destructors. */
1168
1169 #define current_in_charge_parm cp_function_chain->x_in_charge_parm
1170
1171 /* The `__vtt_parm' parameter for the current function. Only used for
1172 constructors and destructors. */
1173
1174 #define current_vtt_parm cp_function_chain->x_vtt_parm
1175
1176 /* A boolean flag to control whether we need to clean up the return value if a
1177 local destructor throws. Only used in functions that return by value a
1178 class with a destructor. Which 'tors don't, so we can use the same
1179 field as current_vtt_parm. */
1180
1181 #define current_retval_sentinel current_vtt_parm
1182
1183 /* Set to 0 at beginning of a function definition, set to 1 if
1184 a return statement that specifies a return value is seen. */
1185
1186 #define current_function_returns_value cp_function_chain->returns_value
1187
1188 /* Set to 0 at beginning of a function definition, set to 1 if
1189 a return statement with no argument is seen. */
1190
1191 #define current_function_returns_null cp_function_chain->returns_null
1192
1193 /* Set to 0 at beginning of a function definition, set to 1 if
1194 a call to a noreturn function is seen. */
1195
1196 #define current_function_returns_abnormally \
1197 cp_function_chain->returns_abnormally
1198
1199 /* Set to 0 at beginning of a function definition, set to 1 if we see an
1200 obvious infinite loop. This can have false positives and false
1201 negatives, so it should only be used as a heuristic. */
1202
1203 #define current_function_infinite_loop cp_function_chain->infinite_loop
1204
1205 /* Nonzero if we are processing a base initializer. Zero elsewhere. */
1206 #define in_base_initializer cp_function_chain->x_in_base_initializer
1207
1208 #define in_function_try_handler cp_function_chain->x_in_function_try_handler
1209
1210 /* Expression always returned from function, or error_mark_node
1211 otherwise, for use by the automatic named return value optimization. */
1212
1213 #define current_function_return_value (cp_function_chain->x_return_value)
1214
1215 #define current_class_type scope_chain->class_type
1216
1217 #define in_discarded_stmt scope_chain->discarded_stmt
1218 #define in_consteval_if_p scope_chain->consteval_if_p
1219
1220 /* Nonzero means that this type is being defined. I.e., the left brace
1221 starting the definition of this type has been seen. */
1222 #define TYPE_BEING_DEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->being_defined)
1223
1224 /* Nonzero for FUNCTION_DECL means that this decl is a static
1225 member function. */
1226 #define DECL_STATIC_FUNCTION_P(NODE) \
1227 (LANG_DECL_FN_CHECK (NODE)->static_function)
1228
1229 /* Nonzero for FUNCTION_DECL means that this decl is a non-static
1230 member function. */
1231 #define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \
1232 (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)
1233
1234 /* Nonzero for FUNCTION_DECL means that this decl is a member function
1235 (static or non-static). */
1236 #define DECL_FUNCTION_MEMBER_P(NODE) \
1237 (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE))
1238
1239 /* Nonzero if NODE is the target for genericization of 'return' stmts
1240 in constructors/destructors of targetm.cxx.cdtor_returns_this targets. */
1241 #define LABEL_DECL_CDTOR(NODE) DECL_LANG_FLAG_2 (LABEL_DECL_CHECK (NODE))
1242
1243 /* Nonzero if this NOP_EXPR is a reinterpret_cast. Such conversions
1244 are not constexprs. Other NOP_EXPRs are. */
1245 #define REINTERPRET_CAST_P(NODE) TREE_LANG_FLAG_0 (NOP_EXPR_CHECK (NODE))
1246
1247 /* Returns true if NODE is an object type:
1248
1249 [basic.types]
1250
1251 An object type is a (possibly cv-qualified) type that is not a
1252 function type, not a reference type, and not a void type.
1253
1254 Keep these checks in ascending order, for speed. */
1255 #define TYPE_OBJ_P(NODE) \
1256 (!TYPE_REF_P (NODE) && !VOID_TYPE_P (NODE) && !FUNC_OR_METHOD_TYPE_P (NODE))
1257
1258 /* Returns true if NODE is a pointer to an object. Keep these checks
1259 in ascending tree code order. */
1260 #define TYPE_PTROB_P(NODE) (TYPE_PTR_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE)))
1261
1262 /* True if this CONSTRUCTOR contains PLACEHOLDER_EXPRs referencing the
1263 CONSTRUCTOR's type not nested inside another CONSTRUCTOR marked with
1264 CONSTRUCTOR_PLACEHOLDER_BOUNDARY. */
1265 #define CONSTRUCTOR_PLACEHOLDER_BOUNDARY(NODE) \
1266 (TREE_LANG_FLAG_5 (CONSTRUCTOR_CHECK (NODE)))
1267
1268 #define AGGR_INIT_EXPR_SLOT(NODE) TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 2)
1269
1270 /* True if this TARGET_EXPR expresses direct-initialization of an object
1271 to be named later. */
1272 #define TARGET_EXPR_DIRECT_INIT_P(NODE) \
1273 TREE_LANG_FLAG_2 (TARGET_EXPR_CHECK (NODE))
1274
1275 /* Nonzero if DECL is a declaration of __builtin_constant_p. */
1276 #define DECL_IS_BUILTIN_CONSTANT_P(NODE) \
1277 (TREE_CODE (NODE) == FUNCTION_DECL \
1278 && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL \
1279 && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P)
1280
1281 /* True iff this represents an lvalue being treated as an rvalue during return
1282 or throw as per [class.copy.elision]. */
1283 #define IMPLICIT_RVALUE_P(NODE) \
1284 TREE_LANG_FLAG_3 (TREE_CHECK2 ((NODE), NON_LVALUE_EXPR, STATIC_CAST_EXPR))
1285
1286 /* Nonzero for _DECL means that this decl appears in (or will appear
1287 in) as a member in a RECORD_TYPE or UNION_TYPE node. It is also for
1288 detecting circularity in case members are multiply defined. In the
1289 case of a VAR_DECL, it means that no definition has been seen, even
1290 if an initializer has been. */
1291 #define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3 (NODE))
1292
1293 /* Nonzero means that this class type is a non-standard-layout class. */
1294 #define CLASSTYPE_NON_STD_LAYOUT(NODE) \
1295 (LANG_TYPE_CLASS_CHECK (NODE)->non_std_layout)
1296
1297 /* Nonzero for FIELD_DECL node means that this field is a base class
1298 of the parent object, as opposed to a member field. */
1299 #define DECL_FIELD_IS_BASE(NODE) DECL_LANG_FLAG_6 (FIELD_DECL_CHECK (NODE))
1300
1301 /* Nonzero if TYPE is an anonymous union type. */
1302 #define ANON_UNION_TYPE_P(NODE) \
1303 (TREE_CODE (NODE) == UNION_TYPE && ANON_AGGR_TYPE_P (NODE))
1304
1305 /* For an ANON_AGGR_TYPE_P the single FIELD_DECL it is used with. */
1306 #define ANON_AGGR_TYPE_FIELD(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var)
1307
1308 /* Nonzero if TYPE is an anonymous union or struct type. We have to use a
1309 flag for this because "A union for which objects or pointers are
1310 declared is not an anonymous union" [class.union]. */
1311 #define ANON_AGGR_TYPE_P(NODE) \
1312 (CLASS_TYPE_P (NODE) && LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr)
1313 #define SET_ANON_AGGR_TYPE_P(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr = 1)
1314
1315 /* Nonzero if T is a class type but not a union. */
1316 #define NON_UNION_CLASS_TYPE_P(T) \
1317 (TREE_CODE (T) == RECORD_TYPE && TYPE_LANG_FLAG_5 (T))
1318
1319 /* Determines whether an ENUMERAL_TYPE has an explicit
1320 underlying type. */
1321 #define ENUM_FIXED_UNDERLYING_TYPE_P(NODE) (TYPE_LANG_FLAG_5 (NODE))
1322
1323 /* Returns the underlying type of the given enumeration type. The
1324 underlying type is determined in different ways, depending on the
1325 properties of the enum:
1326
1327 - In C++0x, the underlying type can be explicitly specified, e.g.,
1328
1329 enum E1 : char { ... } // underlying type is char
1330
1331 - In a C++0x scoped enumeration, the underlying type is int
1332 unless otherwises specified:
1333
1334 enum class E2 { ... } // underlying type is int
1335
1336 - Otherwise, the underlying type is determined based on the
1337 values of the enumerators. In this case, the
1338 ENUM_UNDERLYING_TYPE will not be set until after the definition
1339 of the enumeration is completed by finish_enum. */
1340 #define ENUM_UNDERLYING_TYPE(TYPE) TREE_TYPE (ENUMERAL_TYPE_CHECK (TYPE))
1341
1342 /* Nonzero if this type is volatile-qualified. */
1343 #define RS_TYPE_VOLATILE_P(NODE) \
1344 ((rs_type_quals (NODE) & TYPE_QUAL_VOLATILE) != 0)
1345
1346 /* Nonzero means that this type is either complete or being defined, so we
1347 can do lookup in it. */
1348 #define COMPLETE_OR_OPEN_TYPE_P(NODE) \
1349 (COMPLETE_TYPE_P (NODE) || (CLASS_TYPE_P (NODE) && TYPE_BEING_DEFINED (NODE)))
1350
1351 /* Indicates when overload resolution may resolve to a pointer to
1352 member function. [expr.unary.op]/3 */
1353 #define PTRMEM_OK_P(NODE) \
1354 TREE_LANG_FLAG_0 (TREE_CHECK3 ((NODE), ADDR_EXPR, OFFSET_REF, SCOPE_REF))
1355
1356 /* Returns nonzero iff NODE is a declaration for the global function
1357 `main'. */
1358 #define DECL_MAIN_P(NODE) \
1359 (DECL_NAME (NODE) != NULL_TREE && MAIN_NAME_P (DECL_NAME (NODE)) \
1360 && flag_hosted)
1361
1362 /* Nonzero if the variable was declared to be thread-local.
1363 We need a special C++ version of this test because the middle-end
1364 DECL_THREAD_LOCAL_P uses the symtab, so we can't use it for
1365 templates. */
1366 #define RS_DECL_THREAD_LOCAL_P(NODE) (TREE_LANG_FLAG_0 (VAR_DECL_CHECK (NODE)))
1367
1368 #define COND_EXPR_IS_VEC_DELETE(NODE) TREE_LANG_FLAG_0 (COND_EXPR_CHECK (NODE))
1369
1370 /* RANGE_FOR_STMT accessors. These give access to the declarator,
1371 expression, body, and scope of the statement, respectively. */
1372 #define RANGE_FOR_DECL(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 0)
1373 #define RANGE_FOR_EXPR(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 1)
1374 #define RANGE_FOR_BODY(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 2)
1375 #define RANGE_FOR_SCOPE(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 3)
1376 #define RANGE_FOR_UNROLL(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 4)
1377 #define RANGE_FOR_INIT_STMT(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 5)
1378 #define RANGE_FOR_IVDEP(NODE) TREE_LANG_FLAG_6 (RANGE_FOR_STMT_CHECK (NODE))
1379
1380 #define CP_DECL_CONTEXT(NODE) \
1381 (!DECL_FILE_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : global_namespace)
1382 #define CP_TYPE_CONTEXT(NODE) \
1383 (!TYPE_FILE_SCOPE_P (NODE) ? TYPE_CONTEXT (NODE) : global_namespace)
1384 #define FROB_CONTEXT(NODE) \
1385 ((NODE) == global_namespace ? DECL_CONTEXT (NODE) : (NODE))
1386
1387 /* Nonzero if NODE is the std namespace. */
1388 #define DECL_NAMESPACE_STD_P(NODE) ((NODE) == std_node)
1389
1390 /* Whether the namepace is an inline namespace. */
1391 #define DECL_NAMESPACE_INLINE_P(NODE) \
1392 TREE_LANG_FLAG_0 (NAMESPACE_DECL_CHECK (NODE))
1393
1394 #define CP_DECL_CONTEXT(NODE) \
1395 (!DECL_FILE_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : global_namespace)
1396
1397 /* Based off of TYPE_UNNAMED_P. */
1398 #define LAMBDA_TYPE_P(NODE) \
1399 (TREE_CODE (NODE) == RECORD_TYPE && TYPE_LINKAGE_IDENTIFIER (NODE) \
1400 && IDENTIFIER_LAMBDA_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
1401
1402 /* Macros to make error reporting functions' lives easier. */
1403 #define TYPE_LINKAGE_IDENTIFIER(NODE) \
1404 (TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (NODE)))
1405
1406 /* Identifiers used for lambda types are almost anonymous. Use this
1407 spare flag to distinguish them (they also have the anonymous flag). */
1408 #define IDENTIFIER_LAMBDA_P(NODE) \
1409 (IDENTIFIER_NODE_CHECK (NODE)->base.protected_flag)
1410
1411 /* If NODE, a FUNCTION_DECL, is a C++11 inheriting constructor, then this
1412 is the constructor it inherits from. */
1413 #define DECL_INHERITED_CTOR(NODE) \
1414 (DECL_DECLARES_FUNCTION_P (NODE) && DECL_CONSTRUCTOR_P (NODE) \
1415 ? LANG_DECL_FN_CHECK (NODE)->context \
1416 : NULL_TREE)
1417
1418 /* True if the class type TYPE is a literal type. */
1419 #define CLASSTYPE_LITERAL_P(TYPE) (LANG_TYPE_CLASS_CHECK (TYPE)->is_literal)
1420
1421 /* Nonzero if NODE (a FUNCTION_DECL or TEMPLATE_DECL)
1422 is a destructor. */
1423 #define DECL_DESTRUCTOR_P(NODE) DECL_CXX_DESTRUCTOR_P (NODE)
1424
1425 /* Nonzero if TYPE has a trivial destructor. From [class.dtor]:
1426
1427 A destructor is trivial if it is an implicitly declared
1428 destructor and if:
1429
1430 - all of the direct base classes of its class have trivial
1431 destructors,
1432
1433 - for all of the non-static data members of its class that are
1434 of class type (or array thereof), each such class has a
1435 trivial destructor. */
1436 #define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \
1437 (!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE))
1438
1439 /* Nonzero means that NODE (a class type) has a destructor -- but that
1440 it has not yet been declared. */
1441 #define CLASSTYPE_LAZY_DESTRUCTOR(NODE) \
1442 (LANG_TYPE_CLASS_CHECK (NODE)->lazy_destructor)
1443
1444 /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete
1445 object. */
1446 #define DECL_COMPLETE_CONSTRUCTOR_P(NODE) \
1447 (DECL_NAME (NODE) == complete_ctor_identifier)
1448
1449 /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a base
1450 object. */
1451 #define DECL_BASE_CONSTRUCTOR_P(NODE) (DECL_NAME (NODE) == base_ctor_identifier)
1452
1453 /* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the
1454 specialized in-charge constructor or the specialized not-in-charge
1455 constructor. */
1456 #define DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P(NODE) \
1457 (DECL_NAME (NODE) == ctor_identifier)
1458
1459 /* Nonzero if NODE (a FUNCTION_DECL) is a copy constructor. */
1460 #define DECL_COPY_CONSTRUCTOR_P(NODE) \
1461 (DECL_CONSTRUCTOR_P (NODE) && copy_fn_p (NODE) > 0)
1462
1463 /* Nonzero if NODE (a FUNCTION_DECL) is a move constructor. */
1464 #define DECL_MOVE_CONSTRUCTOR_P(NODE) \
1465 (DECL_CONSTRUCTOR_P (NODE) && move_fn_p (NODE))
1466
1467 /* Nonzero if NODE (a FUNCTION_DECL) is a destructor, but not the
1468 specialized in-charge constructor, in-charge deleting constructor,
1469 or the base destructor. */
1470 #define DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P(NODE) \
1471 (DECL_NAME (NODE) == dtor_identifier)
1472
1473 /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete
1474 object. */
1475 #define DECL_COMPLETE_DESTRUCTOR_P(NODE) \
1476 (DECL_NAME (NODE) == complete_dtor_identifier)
1477
1478 /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a base
1479 object. */
1480 #define DECL_BASE_DESTRUCTOR_P(NODE) (DECL_NAME (NODE) == base_dtor_identifier)
1481
1482 /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete
1483 object that deletes the object after it has been destroyed. */
1484 #define DECL_DELETING_DESTRUCTOR_P(NODE) \
1485 (DECL_NAME (NODE) == deleting_dtor_identifier)
1486
1487 /* Nonzero if either DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P or
1488 DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P is true of NODE. */
1489 #define DECL_MAYBE_IN_CHARGE_CDTOR_P(NODE) \
1490 (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (NODE) \
1491 || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (NODE))
1492
1493 /* Nonzero if NODE (a _DECL) is a cloned constructor or
1494 destructor. */
1495 #define DECL_CLONED_FUNCTION_P(NODE) \
1496 (DECL_NAME (NODE) && IDENTIFIER_CDTOR_P (DECL_NAME (NODE)) \
1497 && !DECL_MAYBE_IN_CHARGE_CDTOR_P (NODE))
1498
1499 /* If DECL_CLONED_FUNCTION_P holds, this is the function that was
1500 cloned. */
1501 #define DECL_CLONED_FUNCTION(NODE) \
1502 (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE))->u.fn.u5.cloned_function)
1503
1504 /* Nonzero means that an object of this type cannot be initialized using
1505 an initializer list. */
1506 #define CLASSTYPE_NON_AGGREGATE(NODE) \
1507 (LANG_TYPE_CLASS_CHECK (NODE)->non_aggregate)
1508 #define TYPE_NON_AGGREGATE_CLASS(NODE) \
1509 (CLASS_TYPE_P (NODE) && CLASSTYPE_NON_AGGREGATE (NODE))
1510
1511 /* Nonzero for class type means that the default constructor is trivial. */
1512 #define TYPE_HAS_TRIVIAL_DFLT(NODE) \
1513 (TYPE_HAS_DEFAULT_CONSTRUCTOR (NODE) && !TYPE_HAS_COMPLEX_DFLT (NODE))
1514
1515 /* Nonzero if this class has a constexpr constructor other than a copy/move
1516 constructor. Note that a class can have constexpr constructors for
1517 static initialization even if it isn't a literal class. */
1518 #define TYPE_HAS_CONSTEXPR_CTOR(NODE) \
1519 (LANG_TYPE_CLASS_CHECK (NODE)->has_constexpr_ctor)
1520
1521 /* Nonzero if there is no trivial default constructor for this class. */
1522 #define TYPE_HAS_COMPLEX_DFLT(NODE) \
1523 (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_dflt)
1524
1525 /* [dcl.init.aggr]
1526
1527 An aggregate is an array or a class with no user-provided
1528 constructors, no brace-or-equal-initializers for non-static data
1529 members, no private or protected non-static data members, no
1530 base classes, and no virtual functions.
1531
1532 As an extension, we also treat vectors as aggregates. Keep these
1533 checks in ascending code order. */
1534 #define CP_AGGREGATE_TYPE_P(TYPE) \
1535 (gnu_vector_type_p (TYPE) || TREE_CODE (TYPE) == ARRAY_TYPE \
1536 || (CLASS_TYPE_P (TYPE) && COMPLETE_TYPE_P (TYPE) \
1537 && !CLASSTYPE_NON_AGGREGATE (TYPE)))
1538
1539 /* Nonzero for a FIELD_DECL means that this member object type
1540 is mutable. */
1541 #define DECL_MUTABLE_P(NODE) (DECL_LANG_FLAG_0 (FIELD_DECL_CHECK (NODE)))
1542
1543 #if defined ENABLE_TREE_CHECKING
1544
1545 #define LANG_DECL_MIN_CHECK(NODE) \
1546 __extension__({ \
1547 struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
1548 if (!LANG_DECL_HAS_MIN (NODE)) \
1549 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1550 &lt->u.min; \
1551 })
1552
1553 /* We want to be able to check DECL_CONSTRUCTOR_P and such on a function
1554 template, not just on a FUNCTION_DECL. So when looking for things in
1555 lang_decl_fn, look down through a TEMPLATE_DECL into its result. */
1556 #define LANG_DECL_FN_CHECK(NODE) \
1557 __extension__({ \
1558 struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
1559 if (!DECL_DECLARES_FUNCTION_P (NODE) || lt->u.base.selector != lds_fn) \
1560 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1561 &lt->u.fn; \
1562 })
1563
1564 #define LANG_DECL_NS_CHECK(NODE) \
1565 __extension__({ \
1566 struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
1567 if (TREE_CODE (NODE) != NAMESPACE_DECL || lt->u.base.selector != lds_ns) \
1568 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1569 &lt->u.ns; \
1570 })
1571
1572 #define LANG_DECL_PARM_CHECK(NODE) \
1573 __extension__({ \
1574 struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
1575 if (TREE_CODE (NODE) != PARM_DECL || lt->u.base.selector != lds_parm) \
1576 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1577 &lt->u.parm; \
1578 })
1579
1580 #define LANG_DECL_DECOMP_CHECK(NODE) \
1581 __extension__({ \
1582 struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
1583 if (!VAR_P (NODE) || lt->u.base.selector != lds_decomp) \
1584 lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
1585 &lt->u.decomp; \
1586 })
1587
1588 #else
1589
1590 #define LANG_DECL_MIN_CHECK(NODE) (&DECL_LANG_SPECIFIC (NODE)->u.min)
1591
1592 #define LANG_DECL_FN_CHECK(NODE) (&DECL_LANG_SPECIFIC (NODE)->u.fn)
1593
1594 #define LANG_DECL_NS_CHECK(NODE) (&DECL_LANG_SPECIFIC (NODE)->u.ns)
1595
1596 #define LANG_DECL_PARM_CHECK(NODE) (&DECL_LANG_SPECIFIC (NODE)->u.parm)
1597
1598 #define LANG_DECL_DECOMP_CHECK(NODE) (&DECL_LANG_SPECIFIC (NODE)->u.decomp)
1599
1600 #endif /* ENABLE_TREE_CHECKING */
1601
1602 // Below macros are copied from gcc/c-family/c-common.h
1603
1604 /* In a FIELD_DECL, nonzero if the decl was originally a bitfield. */
1605 #define DECL_C_BIT_FIELD(NODE) (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) == 1)
1606 #define SET_DECL_C_BIT_FIELD(NODE) \
1607 (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 1)
1608 #define CLEAR_DECL_C_BIT_FIELD(NODE) \
1609 (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 0)
1610
1611 /* True if the decl was an unnamed bitfield. */
1612 #define DECL_UNNAMED_BIT_FIELD(NODE) \
1613 (DECL_C_BIT_FIELD (NODE) && !DECL_NAME (NODE))
1614
1615 /* 1 iff NODE is function-local. */
1616 #define DECL_FUNCTION_SCOPE_P(NODE) \
1617 (DECL_CONTEXT (NODE) && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL)
1618
1619 /* Nonzero if this type is const-qualified, but not
1620 volatile-qualified. Other qualifiers are ignored. This macro is
1621 used to test whether or not it is OK to bind an rvalue to a
1622 reference. */
1623 #define RS_TYPE_CONST_NON_VOLATILE_P(NODE) \
1624 ((rs_type_quals (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) \
1625 == TYPE_QUAL_CONST)
1626
1627 /* Returns true if TYPE is an integral or enumeration name. Keep
1628 these checks in ascending code order. */
1629 #define INTEGRAL_OR_ENUMERATION_TYPE_P(TYPE) \
1630 (TREE_CODE (TYPE) == ENUMERAL_TYPE || RS_INTEGRAL_TYPE_P (TYPE))
1631
1632 /* Nonzero for a VAR_DECL that was initialized with a
1633 constant-expression. */
1634 #define DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P(NODE) \
1635 (TREE_LANG_FLAG_2 (VAR_DECL_CHECK (NODE)))
1636
1637 /* WHILE_STMT accessors. These give access to the condition of the
1638 while statement and the body of the while statement, respectively. */
1639 #define WHILE_COND(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0)
1640 #define WHILE_BODY(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1)
1641
1642 /* FOR_STMT accessors. These give access to the init statement,
1643 condition, update expression, and body of the for statement,
1644 respectively. */
1645 #define FOR_INIT_STMT(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 0)
1646 #define FOR_COND(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
1647 #define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
1648 #define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
1649 #define FOR_SCOPE(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 4)
1650
1651 #define SWITCH_STMT_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
1652 #define SWITCH_STMT_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
1653 #define SWITCH_STMT_TYPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2)
1654 #define SWITCH_STMT_SCOPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 3)
1655
1656 /* Nonzero if NODE is the target for genericization of 'break' stmts. */
1657 #define LABEL_DECL_BREAK(NODE) DECL_LANG_FLAG_0 (LABEL_DECL_CHECK (NODE))
1658
1659 /* Nonzero if NODE is the target for genericization of 'continue' stmts. */
1660 #define LABEL_DECL_CONTINUE(NODE) DECL_LANG_FLAG_1 (LABEL_DECL_CHECK (NODE))
1661
1662 // Above macros are copied from gcc/c-family/c-common.h
1663
1664 // Below macros are copied from gcc/cp/name-lookup.h
1665
1666 /* Lookup walker marking. */
1667 #define LOOKUP_SEEN_P(NODE) TREE_VISITED (NODE)
1668 #define LOOKUP_FOUND_P(NODE) \
1669 TREE_LANG_FLAG_4 (TREE_CHECK4 (NODE, RECORD_TYPE, UNION_TYPE, ENUMERAL_TYPE, \
1670 NAMESPACE_DECL))
1671
1672 // Above macros are copied from gcc/cp/name-lookup.h
1673
1674 // Below macros are copied from gcc/cp/name-lookup.cc
1675
1676 /* Create an overload suitable for recording an artificial TYPE_DECL
1677 and another decl. We use this machanism to implement the struct
1678 stat hack. */
1679
1680 #define STAT_HACK_P(N) ((N) && TREE_CODE (N) == OVERLOAD && OVL_LOOKUP_P (N))
1681 #define STAT_TYPE_VISIBLE_P(N) TREE_USED (OVERLOAD_CHECK (N))
1682 #define STAT_TYPE(N) TREE_TYPE (N)
1683 #define STAT_DECL(N) OVL_FUNCTION (N)
1684 #define STAT_VISIBLE(N) OVL_CHAIN (N)
1685 #define MAYBE_STAT_DECL(N) (STAT_HACK_P (N) ? STAT_DECL (N) : N)
1686 #define MAYBE_STAT_TYPE(N) (STAT_HACK_P (N) ? STAT_TYPE (N) : NULL_TREE)
1687
1688 /* When a STAT_HACK_P is true, OVL_USING_P and OVL_EXPORT_P are valid
1689 and apply to the hacked type. */
1690
1691 /* For regular (maybe) overloaded functions, we have OVL_HIDDEN_P.
1692 But we also need to indicate hiddenness on implicit type decls
1693 (injected friend classes), and (coming soon) decls injected from
1694 block-scope externs. It is too awkward to press the existing
1695 overload marking for that. If we have a hidden non-function, we
1696 always create a STAT_HACK, and use these two markers as needed. */
1697 #define STAT_TYPE_HIDDEN_P(N) OVL_HIDDEN_P (N)
1698 #define STAT_DECL_HIDDEN_P(N) OVL_DEDUP_P (N)
1699
1700 /* The binding level currently in effect. */
1701
1702 #define current_binding_level \
1703 (*(cfun && cp_function_chain && cp_function_chain->bindings \
1704 ? &cp_function_chain->bindings \
1705 : &scope_chain->bindings))
1706
1707 // Above macros are copied from gcc/cp/name-lookup.cc
1708
1709 /* The various kinds of special functions. If you add to this list,
1710 you should update special_function_p as well. */
1711 enum special_function_kind
1712 {
1713 sfk_none = 0, /* Not a special function. This enumeral
1714 must have value zero; see
1715 special_function_p. */
1716 /* The following are ordered, for use by member synthesis fns. */
1717 sfk_destructor, /* A destructor. */
1718 sfk_constructor, /* A constructor. */
1719 sfk_inheriting_constructor, /* An inheriting constructor */
1720 sfk_copy_constructor, /* A copy constructor. */
1721 sfk_move_constructor, /* A move constructor. */
1722 sfk_copy_assignment, /* A copy assignment operator. */
1723 sfk_move_assignment, /* A move assignment operator. */
1724 /* The following are unordered. */
1725 sfk_complete_destructor, /* A destructor for complete objects. */
1726 sfk_base_destructor, /* A destructor for base subobjects. */
1727 sfk_deleting_destructor, /* A destructor for complete objects that
1728 deletes the object after it has been
1729 destroyed. */
1730 sfk_conversion, /* A conversion operator. */
1731 sfk_deduction_guide, /* A class template deduction guide. */
1732 sfk_comparison, /* A comparison operator (e.g. ==, <, <=>). */
1733 sfk_virtual_destructor /* Used by member synthesis fns. */
1734 };
1735
1736 /* Places where an lvalue, or modifiable lvalue, may be required.
1737 Used to select diagnostic messages in lvalue_error and
1738 readonly_error. */
1739 enum lvalue_use
1740 {
1741 lv_assign,
1742 lv_increment,
1743 lv_decrement,
1744 lv_addressof,
1745 lv_asm
1746 };
1747
1748 /* A class for recording information about access failures (e.g. private
1749 fields), so that we can potentially supply a fix-it hint about
1750 an accessor (from a context in which the constness of the object
1751 is known). */
1752
1753 class access_failure_info
1754 {
1755 public:
1756 access_failure_info ()
1757 : m_was_inaccessible (false), m_basetype_path (NULL_TREE),
1758 m_decl (NULL_TREE), m_diag_decl (NULL_TREE)
1759 {}
1760
1761 void record_access_failure (tree basetype_path, tree decl, tree diag_decl);
1762
1763 bool was_inaccessible_p () const { return m_was_inaccessible; }
1764 tree get_decl () const { return m_decl; }
1765 tree get_diag_decl () const { return m_diag_decl; }
1766 tree get_any_accessor (bool const_p) const;
1767 void maybe_suggest_accessor (bool const_p) const;
1768 static void add_fixit_hint (rich_location *richloc, tree accessor);
1769
1770 private:
1771 bool m_was_inaccessible;
1772 tree m_basetype_path;
1773 tree m_decl;
1774 tree m_diag_decl;
1775 };
1776
1777 /* The various kinds of access check during parsing. */
1778 enum deferring_kind
1779 {
1780 dk_no_deferred = 0, /* Check access immediately */
1781 dk_deferred = 1, /* Deferred check */
1782 dk_no_check = 2 /* No access check */
1783 };
1784
1785 /* The representation of a deferred access check. */
1786
1787 struct GTY (()) deferred_access_check
1788 {
1789 /* The base class in which the declaration is referenced. */
1790 tree binfo;
1791 /* The declaration whose access must be checked. */
1792 tree decl;
1793 /* The declaration that should be used in the error message. */
1794 tree diag_decl;
1795 /* The location of this access. */
1796 location_t loc;
1797 };
1798
1799 struct GTY (()) tree_template_info
1800 {
1801 struct tree_base base;
1802 tree tmpl;
1803 tree args;
1804 vec<deferred_access_check, va_gc> *deferred_access_checks;
1805 };
1806
1807 /* The various kinds of lvalues we distinguish. */
1808 enum cp_lvalue_kind_flags
1809 {
1810 clk_none = 0, /* Things that are not an lvalue. */
1811 clk_ordinary = 1, /* An ordinary lvalue. */
1812 clk_rvalueref = 2, /* An xvalue (rvalue formed using an rvalue reference) */
1813 clk_class = 4, /* A prvalue of class or array type. */
1814 clk_bitfield = 8, /* An lvalue for a bit-field. */
1815 clk_packed = 16, /* An lvalue for a packed field. */
1816 clk_implicit_rval = 1 << 5 /* An lvalue being treated as an xvalue. */
1817 };
1818
1819 /* This type is used for parameters and variables which hold
1820 combinations of the flags in enum cp_lvalue_kind_flags. */
1821 typedef int cp_lvalue_kind;
1822
1823 // forked from gcc/cp/name_lookup.h scope_kind
1824
1825 /* The kinds of scopes we recognize. */
1826 enum scope_kind
1827 {
1828 sk_block = 0, /* An ordinary block scope. This enumerator must
1829 have the value zero because "cp_binding_level"
1830 is initialized by using "memset" to set the
1831 contents to zero, and the default scope kind
1832 is "sk_block". */
1833 sk_cleanup, /* A scope for (pseudo-)scope for cleanup. It is
1834 pseudo in that it is transparent to name lookup
1835 activities. */
1836 sk_try, /* A try-block. */
1837 sk_catch, /* A catch-block. */
1838 sk_for, /* The scope of the variable declared in a
1839 init-statement. */
1840 sk_cond, /* The scope of the variable declared in the condition
1841 of an if or switch statement. */
1842 sk_function_parms, /* The scope containing function parameters. */
1843 sk_class, /* The scope containing the members of a class. */
1844 sk_scoped_enum, /* The scope containing the enumerators of a C++11
1845 scoped enumeration. */
1846 sk_namespace, /* The scope containing the members of a
1847 namespace, including the global scope. */
1848 sk_template_parms, /* A scope for template parameters. */
1849 sk_template_spec, /* Like sk_template_parms, but for an explicit
1850 specialization. Since, by definition, an
1851 explicit specialization is introduced by
1852 "template <>", this scope is always empty. */
1853 sk_transaction, /* A synchronized or atomic statement. */
1854 sk_omp /* An OpenMP structured block. */
1855 };
1856
1857 // forked from gcc/cp/cp-tree.h cp_built_in_function
1858
1859 /* BUILT_IN_FRONTEND function codes. */
1860 enum cp_built_in_function
1861 {
1862 CP_BUILT_IN_IS_CONSTANT_EVALUATED,
1863 CP_BUILT_IN_INTEGER_PACK,
1864 CP_BUILT_IN_IS_CORRESPONDING_MEMBER,
1865 CP_BUILT_IN_IS_POINTER_INTERCONVERTIBLE_WITH_CLASS,
1866 CP_BUILT_IN_SOURCE_LOCATION,
1867 CP_BUILT_IN_LAST
1868 };
1869
1870 // forked from gcc/cp/cp-tree.h warning_sentinel
1871
1872 /* RAII sentinel to disable certain warnings during template substitution
1873 and elsewhere. */
1874
1875 class warning_sentinel
1876 {
1877 public:
1878 int &flag;
1879 int val;
1880 warning_sentinel (int &flag, bool suppress = true) : flag (flag), val (flag)
1881 {
1882 if (suppress)
1883 flag = 0;
1884 }
1885 ~warning_sentinel () { flag = val; }
1886 };
1887
1888 // forked from gcc/cp/cp-tree.h uid_sensitive_constexpr_evaluation_checker
1889
1890 /* Used to determine whether uid_sensitive_constexpr_evaluation_p was
1891 called and returned true, indicating that we've restricted constexpr
1892 evaluation in order to avoid UID generation. We use this to control
1893 updates to the fold_cache and cv_cache. */
1894
1895 struct uid_sensitive_constexpr_evaluation_checker
1896 {
1897 const unsigned saved_counter;
1898 uid_sensitive_constexpr_evaluation_checker ();
1899 bool evaluation_restricted_p () const;
1900 };
1901
1902 // forked from gcc/cp/cp-tree.h iloc_sentinel
1903
1904 /* RAII sentinel to temporarily override input_location. This will not set
1905 input_location to UNKNOWN_LOCATION or BUILTINS_LOCATION. */
1906
1907 class iloc_sentinel
1908 {
1909 location_t saved_loc;
1910
1911 public:
1912 iloc_sentinel (location_t loc) : saved_loc (input_location)
1913 {
1914 if (loc >= RESERVED_LOCATION_COUNT)
1915 input_location = loc;
1916 }
1917 ~iloc_sentinel () { input_location = saved_loc; }
1918 };
1919
1920 // forked from gcc/cp/cp-tree.h ptrmem_cst
1921
1922 struct GTY (()) ptrmem_cst
1923 {
1924 struct tree_common common;
1925 tree member;
1926 location_t locus;
1927 };
1928 typedef struct ptrmem_cst *ptrmem_cst_t;
1929
1930 // forked from gcc/cp/cp-tree.h named_decl_hash
1931
1932 /* hash traits for declarations. Hashes potential overload sets via
1933 DECL_NAME. */
1934
1935 struct rust_named_decl_hash : ggc_remove<tree>
1936 {
1937 typedef tree value_type; /* A DECL or OVERLOAD */
1938 typedef tree compare_type; /* An identifier. */
1939
1940 inline static hashval_t hash (const value_type decl);
1941 inline static bool equal (const value_type existing, compare_type candidate);
1942
1943 static const bool empty_zero_p = true;
1944 static inline void mark_empty (value_type &p) { p = NULL_TREE; }
1945 static inline bool is_empty (value_type p) { return !p; }
1946
1947 /* Nothing is deletable. Everything is insertable. */
1948 static bool is_deleted (value_type) { return false; }
1949 static void mark_deleted (value_type) { rust_unreachable (); }
1950 };
1951
1952 // forked from gcc/cp/cp-tree.h lang_decl_selector
1953
1954 /* Discriminator values for lang_decl. */
1955
1956 enum lang_decl_selector
1957 {
1958 lds_min,
1959 lds_fn,
1960 lds_ns,
1961 lds_parm,
1962 lds_decomp
1963 };
1964
1965 // forked from gcc/cp/cp-tree.h lang_decl_base
1966
1967 /* Flags shared by all forms of DECL_LANG_SPECIFIC.
1968
1969 Some of the flags live here only to make lang_decl_min/fn smaller. Do
1970 not make this struct larger than 32 bits. */
1971
1972 struct GTY (()) lang_decl_base
1973 {
1974 ENUM_BITFIELD (lang_decl_selector) selector : 3;
1975 unsigned use_template : 2;
1976 unsigned not_really_extern : 1; /* var or fn */
1977 unsigned initialized_in_class : 1; /* var or fn */
1978
1979 unsigned threadprivate_or_deleted_p : 1; /* var or fn */
1980 /* anticipated_p is no longer used for anticipated_decls (fn, type
1981 or template). It is used as DECL_OMP_PRIVATIZED_MEMBER in
1982 var. */
1983 unsigned anticipated_p : 1;
1984 unsigned friend_or_tls : 1; /* var, fn, type or template */
1985 unsigned unknown_bound_p : 1; /* var */
1986 unsigned odr_used : 1; /* var or fn */
1987 unsigned concept_p : 1; /* applies to vars and functions */
1988 unsigned var_declared_inline_p : 1; /* var */
1989 unsigned dependent_init_p : 1; /* var */
1990
1991 /* The following apply to VAR, FUNCTION, TYPE, CONCEPT, & NAMESPACE
1992 decls. */
1993 unsigned module_purview_p : 1; /* in module purview (not GMF) */
1994 unsigned module_import_p : 1; /* from an import */
1995 unsigned module_entity_p : 1; /* is in the entitity ary &
1996 hash. */
1997 /* VAR_DECL or FUNCTION_DECL has attached decls. */
1998 unsigned module_attached_p : 1;
1999
2000 /* 12 spare bits. */
2001 };
2002
2003 /* True for DECL codes which have template info and access. */
2004 #define LANG_DECL_HAS_MIN(NODE) \
2005 (VAR_OR_FUNCTION_DECL_P (NODE) || TREE_CODE (NODE) == FIELD_DECL \
2006 || TREE_CODE (NODE) == CONST_DECL || TREE_CODE (NODE) == TYPE_DECL \
2007 || TREE_CODE (NODE) == TEMPLATE_DECL || TREE_CODE (NODE) == USING_DECL \
2008 || TREE_CODE (NODE) == CONCEPT_DECL)
2009
2010 // forked from gcc/c-family-common.h c_language_function
2011
2012 /* Global state pertinent to the current function. Some C dialects
2013 extend this structure with additional fields. */
2014
2015 struct GTY (()) c_language_function
2016 {
2017 /* Vector of locally defined typedefs, for
2018 -Wunused-local-typedefs. */
2019 vec<tree, va_gc> *local_typedefs;
2020 };
2021
2022 // forked from gcc/cp/cp-tree.h omp_declare_target_attr
2023
2024 struct GTY (()) omp_declare_target_attr
2025 {
2026 bool attr_syntax;
2027 };
2028
2029 // forked from gcc/cp/name-lookup.h cxx_binding
2030
2031 /* Datatype that represents binding established by a declaration between
2032 a name and a C++ entity. */
2033 struct GTY (()) cxx_binding
2034 {
2035 /* Link to chain together various bindings for this name. */
2036 cxx_binding *previous;
2037 /* The non-type entity this name is bound to. */
2038 tree value;
2039 /* The type entity this name is bound to. */
2040 tree type;
2041
2042 bool value_is_inherited : 1;
2043 bool is_local : 1;
2044 bool type_is_hidden : 1;
2045 };
2046
2047 // forked from gcc/cp/name-lookup.h cxx_saved_binding
2048
2049 /* Datatype used to temporarily save C++ bindings (for implicit
2050 instantiations purposes and like). Implemented in decl.cc. */
2051 struct GTY (()) rust_cxx_saved_binding
2052 {
2053 /* The name of the current binding. */
2054 tree identifier;
2055 /* The binding we're saving. */
2056 cxx_binding *binding;
2057 tree real_type_value;
2058 };
2059
2060 // forked from gcc/cp/name-lookup.h resort_type_member_vec
2061
2062 /* needed for GTY annotation */
2063 extern void
2064 resort_type_member_vec (void *, void *, gt_pointer_operator, void *);
2065
2066 // forked from gcc/cp/cp-tree.h saved_scope
2067
2068 /* Global state. */
2069
2070 struct GTY (()) saved_scope
2071 {
2072 vec<rust_cxx_saved_binding, va_gc> *old_bindings;
2073 tree old_namespace;
2074 vec<tree, va_gc> *decl_ns_list;
2075 tree class_name;
2076 tree class_type;
2077 tree access_specifier;
2078 tree function_decl;
2079 vec<tree, va_gc> *lang_base;
2080 tree lang_name;
2081 tree template_parms;
2082 tree x_saved_tree;
2083
2084 /* Only used for uses of this in trailing return type. */
2085 tree x_current_class_ptr;
2086 tree x_current_class_ref;
2087
2088 int x_processing_template_decl;
2089 int x_processing_specialization;
2090 int x_processing_constraint;
2091 int suppress_location_wrappers;
2092 BOOL_BITFIELD x_processing_explicit_instantiation : 1;
2093 BOOL_BITFIELD need_pop_function_context : 1;
2094
2095 /* Nonzero if we are parsing the discarded statement of a constexpr
2096 if-statement. */
2097 BOOL_BITFIELD discarded_stmt : 1;
2098 /* Nonzero if we are parsing or instantiating the compound-statement
2099 of consteval if statement. Also set while processing an immediate
2100 invocation. */
2101 BOOL_BITFIELD consteval_if_p : 1;
2102
2103 int unevaluated_operand;
2104 int inhibit_evaluation_warnings;
2105 int noexcept_operand;
2106 int ref_temp_count;
2107
2108 hash_map<tree, tree> *GTY ((skip)) x_local_specializations;
2109 vec<omp_declare_target_attr, va_gc> *omp_declare_target_attribute;
2110
2111 struct saved_scope *prev;
2112 };
2113
2114 extern GTY (()) struct saved_scope *scope_chain;
2115
2116 // forked from gcc/cp/name_lookup.h cp_class_binding
2117
2118 struct GTY (()) rust_cp_class_binding
2119 {
2120 cxx_binding *base;
2121 /* The bound name. */
2122 tree identifier;
2123 };
2124
2125 // forked from gcc/cp/name_lookup.h cp_binding_level
2126
2127 /* For each binding contour we allocate a binding_level structure
2128 which records the names defined in that contour.
2129 Contours include:
2130 0) the global one
2131 1) one for each function definition,
2132 where internal declarations of the parameters appear.
2133 2) one for each compound statement,
2134 to record its declarations.
2135
2136 The current meaning of a name can be found by searching the levels
2137 from the current one out to the global one.
2138
2139 Off to the side, may be the class_binding_level. This exists only
2140 to catch class-local declarations. It is otherwise nonexistent.
2141
2142 Also there may be binding levels that catch cleanups that must be
2143 run when exceptions occur. Thus, to see whether a name is bound in
2144 the current scope, it is not enough to look in the
2145 CURRENT_BINDING_LEVEL. You should use lookup_name_current_level
2146 instead. */
2147
2148 struct GTY (()) rust_cp_binding_level
2149 {
2150 /* A chain of _DECL nodes for all variables, constants, functions,
2151 and typedef types. These are in the reverse of the order
2152 supplied. There may be OVERLOADs on this list, too, but they
2153 are wrapped in TREE_LISTs; the TREE_VALUE is the OVERLOAD. */
2154 tree names;
2155
2156 /* Using directives. */
2157 vec<tree, va_gc> *using_directives;
2158
2159 /* For the binding level corresponding to a class, the entities
2160 declared in the class or its base classes. */
2161 vec<rust_cp_class_binding, va_gc> *class_shadowed;
2162
2163 /* Similar to class_shadowed, but for IDENTIFIER_TYPE_VALUE, and
2164 is used for all binding levels. The TREE_PURPOSE is the name of
2165 the entity, the TREE_TYPE is the associated type. In addition
2166 the TREE_VALUE is the IDENTIFIER_TYPE_VALUE before we entered
2167 the class. */
2168 tree type_shadowed;
2169
2170 /* For each level (except not the global one),
2171 a chain of BLOCK nodes for all the levels
2172 that were entered and exited one level down. */
2173 tree blocks;
2174
2175 /* The entity (namespace, class, function) the scope of which this
2176 binding contour corresponds to. Otherwise NULL. */
2177 tree this_entity;
2178
2179 /* The binding level which this one is contained in (inherits from). */
2180 rust_cp_binding_level *level_chain;
2181
2182 /* STATEMENT_LIST for statements in this binding contour.
2183 Only used at present for SK_CLEANUP temporary bindings. */
2184 tree statement_list;
2185
2186 /* Binding depth at which this level began. */
2187 int binding_depth;
2188
2189 /* The kind of scope that this object represents. However, a
2190 SK_TEMPLATE_SPEC scope is represented with KIND set to
2191 SK_TEMPLATE_PARMS and EXPLICIT_SPEC_P set to true. */
2192 ENUM_BITFIELD (scope_kind) kind : 4;
2193
2194 /* True if this scope is an SK_TEMPLATE_SPEC scope. This field is
2195 only valid if KIND == SK_TEMPLATE_PARMS. */
2196 BOOL_BITFIELD explicit_spec_p : 1;
2197
2198 /* true means make a BLOCK for this level regardless of all else. */
2199 unsigned keep : 1;
2200
2201 /* Nonzero if this level can safely have additional
2202 cleanup-needing variables added to it. */
2203 unsigned more_cleanups_ok : 1;
2204 unsigned have_cleanups : 1;
2205
2206 /* Transient state set if this scope is of sk_class kind
2207 and is in the process of defining 'this_entity'. Reset
2208 on leaving the class definition to allow for the scope
2209 to be subsequently re-used as a non-defining scope for
2210 'this_entity'. */
2211 unsigned defining_class_p : 1;
2212
2213 /* True for SK_FUNCTION_PARMS of a requires-expression. */
2214 unsigned requires_expression : 1;
2215
2216 /* 22 bits left to fill a 32-bit word. */
2217 };
2218
2219 // forked from gcc/cp/decl.cc named_label_entry
2220
2221 /* A list of all LABEL_DECLs in the function that have names. Here so
2222 we can clear out their names' definitions at the end of the
2223 function, and so we can check the validity of jumps to these labels. */
2224
2225 struct GTY ((for_user)) rust_named_label_entry
2226 {
2227 tree name; /* Name of decl. */
2228
2229 tree label_decl; /* LABEL_DECL, unless deleted local label. */
2230
2231 rust_named_label_entry *outer; /* Outer shadowed chain. */
2232
2233 /* The binding level to which the label is *currently* attached.
2234 This is initially set to the binding level in which the label
2235 is defined, but is modified as scopes are closed. */
2236 rust_cp_binding_level *binding_level;
2237
2238 /* The head of the names list that was current when the label was
2239 defined, or the inner scope popped. These are the decls that will
2240 be skipped when jumping to the label. */
2241 tree names_in_scope;
2242
2243 /* A vector of all decls from all binding levels that would be
2244 crossed by a backward branch to the label. */
2245 vec<tree, va_gc> *bad_decls;
2246
2247 /* The following bits are set after the label is defined, and are
2248 updated as scopes are popped. They indicate that a jump to the
2249 label will illegally enter a scope of the given flavor. */
2250 bool in_try_scope;
2251 bool in_catch_scope;
2252 bool in_omp_scope;
2253 bool in_transaction_scope;
2254 bool in_constexpr_if;
2255 bool in_consteval_if;
2256 bool in_stmt_expr;
2257 };
2258
2259 // forked from gcc/cp/cp-tree.h named_label_hash
2260
2261 struct rust_named_label_hash : ggc_remove<rust_named_label_entry *>
2262 {
2263 typedef rust_named_label_entry *value_type;
2264 typedef tree compare_type; /* An identifier. */
2265
2266 inline static hashval_t hash (value_type);
2267 inline static bool equal (const value_type, compare_type);
2268
2269 static const bool empty_zero_p = true;
2270 inline static void mark_empty (value_type &p) { p = NULL; }
2271 inline static bool is_empty (value_type p) { return !p; }
2272
2273 /* Nothing is deletable. Everything is insertable. */
2274 inline static bool is_deleted (value_type) { return false; }
2275 inline static void mark_deleted (value_type) { rust_unreachable (); }
2276 };
2277
2278 // forked from gcc/cp/cp-tree.h
2279
2280 /* Global state pertinent to the current function.
2281 TODO: remove vestigial fields */
2282
2283 struct GTY (()) language_function
2284 {
2285 struct c_language_function base;
2286
2287 tree x_cdtor_label;
2288 tree x_current_class_ptr;
2289 tree x_current_class_ref;
2290 tree x_eh_spec_block;
2291 tree x_in_charge_parm;
2292 tree x_vtt_parm;
2293 tree x_return_value;
2294
2295 BOOL_BITFIELD returns_value : 1;
2296 BOOL_BITFIELD returns_null : 1;
2297 BOOL_BITFIELD returns_abnormally : 1;
2298 BOOL_BITFIELD infinite_loop : 1;
2299 BOOL_BITFIELD x_in_function_try_handler : 1;
2300 BOOL_BITFIELD x_in_base_initializer : 1;
2301
2302 /* True if this function can throw an exception. */
2303 BOOL_BITFIELD can_throw : 1;
2304
2305 BOOL_BITFIELD invalid_constexpr : 1;
2306 BOOL_BITFIELD throwing_cleanup : 1;
2307
2308 hash_table<rust_named_label_hash> *x_named_labels;
2309
2310 /* Tracking possibly infinite loops. This is a vec<tree> only because
2311 vec<bool> doesn't work with gtype. */
2312 vec<tree, va_gc> *infinite_loops;
2313 };
2314
2315 // forked from gcc/c-family/c-common.h ref_operator
2316
2317 /* The various name of operator that appears in error messages. */
2318 enum ref_operator
2319 {
2320 /* NULL */
2321 RO_NULL,
2322 /* array indexing */
2323 RO_ARRAY_INDEXING,
2324 /* unary * */
2325 RO_UNARY_STAR,
2326 /* -> */
2327 RO_ARROW,
2328 /* implicit conversion */
2329 RO_IMPLICIT_CONVERSION,
2330 /* ->* */
2331 RO_ARROW_STAR
2332 };
2333
2334 // forked from gcc/cp/cp-tree.h lang_decl_min
2335
2336 /* DECL_LANG_SPECIFIC for the above codes. */
2337
2338 struct GTY (()) lang_decl_min
2339 {
2340 struct lang_decl_base base; /* 32-bits. */
2341
2342 /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is
2343 THUNK_ALIAS.
2344 In a FUNCTION_DECL for which DECL_THUNK_P does not hold,
2345 VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this is
2346 DECL_TEMPLATE_INFO. */
2347 tree template_info;
2348
2349 /* In a DECL_THUNK_P FUNCTION_DECL, this is THUNK_VIRTUAL_OFFSET.
2350 In a lambda-capture proxy VAR_DECL, this is DECL_CAPTURED_VARIABLE.
2351 In a function-scope TREE_STATIC VAR_DECL or IMPLICIT_TYPEDEF_P TYPE_DECL,
2352 this is DECL_DISCRIMINATOR.
2353 In a DECL_LOCAL_DECL_P decl, this is the namespace decl it aliases.
2354 Otherwise, in a class-scope DECL, this is DECL_ACCESS. */
2355 tree access;
2356 };
2357
2358 // forked from gcc/cp/cp-tree.h lang_decl_fn
2359
2360 /* Additional DECL_LANG_SPECIFIC information for functions. */
2361
2362 struct GTY (()) lang_decl_fn
2363 {
2364 struct lang_decl_min min;
2365
2366 /* In a overloaded operator, this is the compressed operator code. */
2367 unsigned ovl_op_code : 6;
2368 unsigned global_ctor_p : 1;
2369 unsigned global_dtor_p : 1;
2370
2371 unsigned static_function : 1;
2372 unsigned pure_virtual : 1;
2373 unsigned defaulted_p : 1;
2374 unsigned has_in_charge_parm_p : 1;
2375 unsigned has_vtt_parm_p : 1;
2376 unsigned nonconverting : 1;
2377 unsigned thunk_p : 1;
2378
2379 unsigned this_thunk_p : 1;
2380 unsigned omp_declare_reduction_p : 1;
2381 unsigned has_dependent_explicit_spec_p : 1;
2382 unsigned immediate_fn_p : 1;
2383 unsigned maybe_deleted : 1;
2384 unsigned coroutine_p : 1;
2385 unsigned implicit_constexpr : 1;
2386
2387 unsigned spare : 10;
2388
2389 /* 32-bits padding on 64-bit host. */
2390
2391 /* For a non-thunk function decl, this is a tree list of
2392 friendly classes. For a thunk function decl, it is the
2393 thunked to function decl. */
2394 tree befriending_classes;
2395
2396 /* For a virtual FUNCTION_DECL for which
2397 DECL_THIS_THUNK_P does not hold, this is DECL_THUNKS. Both
2398 this pointer and result pointer adjusting thunks are
2399 chained here. This pointer thunks to return pointer thunks
2400 will be chained on the return pointer thunk.
2401 For a DECL_CONSTUCTOR_P FUNCTION_DECL, this is the base from
2402 whence we inherit. Otherwise, it is the class in which a
2403 (namespace-scope) friend is defined (if any). */
2404 tree context;
2405
2406 union lang_decl_u5
2407 {
2408 /* In a non-thunk FUNCTION_DECL, this is DECL_CLONED_FUNCTION. */
2409 tree GTY ((tag ("0"))) cloned_function;
2410
2411 /* In a FUNCTION_DECL for which THUNK_P holds this is the
2412 THUNK_FIXED_OFFSET. */
2413 HOST_WIDE_INT GTY ((tag ("1"))) fixed_offset;
2414 } GTY ((desc ("%1.thunk_p"))) u5;
2415
2416 tree GTY (()) saved_auto_return_type;
2417 };
2418
2419 // forked from gcc/cp/cp-tree.h lang_decl_ns
2420
2421 /* DECL_LANG_SPECIFIC for namespaces. */
2422
2423 struct GTY (()) lang_decl_ns
2424 {
2425 struct lang_decl_base base; /* 32 bits. */
2426
2427 /* Inline children. Needs to be va_gc, because of PCH. */
2428 vec<tree, va_gc> *inlinees;
2429
2430 /* Hash table of bound decls. It'd be nice to have this inline, but
2431 as the hash_map has a dtor, we can't then put this struct into a
2432 union (until moving to c++11). */
2433 hash_table<rust_named_decl_hash> *bindings;
2434 };
2435
2436 // forked from gcc/cp/cp-tree.h lang_decl_parm
2437
2438 /* DECL_LANG_SPECIFIC for parameters. */
2439
2440 struct GTY (()) lang_decl_parm
2441 {
2442 struct lang_decl_base base; /* 32 bits. */
2443 int level;
2444 int index;
2445 };
2446
2447 // forked from gcc/cp/cp-tree.h lang_decl_decomp
2448
2449 /* Additional DECL_LANG_SPECIFIC information for structured bindings. */
2450
2451 struct GTY (()) lang_decl_decomp
2452 {
2453 struct lang_decl_min min;
2454 /* The artificial underlying "e" variable of the structured binding
2455 variable. */
2456 tree base;
2457 };
2458
2459 // forked from gcc/cp/cp-tree.h lang_decl
2460
2461 /* DECL_LANG_SPECIFIC for all types. It would be nice to just make this a
2462 union rather than a struct containing a union as its only field, but
2463 tree.h declares it as a struct. */
2464
2465 struct GTY (()) lang_decl
2466 {
2467 union GTY ((desc ("%h.base.selector"))) lang_decl_u
2468 {
2469 /* Nothing of only the base type exists. */
2470 struct lang_decl_base GTY ((default)) base;
2471 struct lang_decl_min GTY ((tag ("lds_min"))) min;
2472 struct lang_decl_fn GTY ((tag ("lds_fn"))) fn;
2473 struct lang_decl_ns GTY ((tag ("lds_ns"))) ns;
2474 struct lang_decl_parm GTY ((tag ("lds_parm"))) parm;
2475 struct lang_decl_decomp GTY ((tag ("lds_decomp"))) decomp;
2476 } u;
2477 };
2478
2479 // forked from gcc/c-family/c-common.h c_fileinfo
2480
2481 /* Information recorded about each file examined during compilation. */
2482
2483 struct c_fileinfo
2484 {
2485 int time; /* Time spent in the file. */
2486
2487 /* Flags used only by C++.
2488 INTERFACE_ONLY nonzero means that we are in an "interface" section
2489 of the compiler. INTERFACE_UNKNOWN nonzero means we cannot trust
2490 the value of INTERFACE_ONLY. If INTERFACE_UNKNOWN is zero and
2491 INTERFACE_ONLY is zero, it means that we are responsible for
2492 exporting definitions that others might need. */
2493 short interface_only;
2494 short interface_unknown;
2495 };
2496
2497 // forked from gcc/c-family/c-common.h c_common_identifier
2498
2499 /* Identifier part common to the C front ends. Inherits from
2500 tree_identifier, despite appearances. */
2501 struct GTY (()) c_common_identifier
2502 {
2503 struct tree_common common;
2504 struct cpp_hashnode node; // from cpplib.h
2505 };
2506
2507 // forked from gcc/cp/cp-tree.h lang_identifier
2508
2509 /* Language-dependent contents of an identifier. */
2510
2511 struct GTY (()) lang_identifier
2512 {
2513 struct c_common_identifier c_common;
2514 cxx_binding *bindings;
2515 };
2516
2517 // forked from gcc/cp/cp-tree.h tree_overload
2518
2519 /* OVL_HIDDEN_P nodes come before other nodes. */
2520
2521 struct GTY (()) tree_overload
2522 {
2523 struct tree_common common;
2524 tree function;
2525 };
2526
2527 // forked from gcc/cp/cp-tree.h ovl_iterator
2528
2529 class ovl_iterator
2530 {
2531 tree ovl;
2532 const bool allow_inner; /* Only used when checking. */
2533
2534 public:
2535 explicit ovl_iterator (tree o, bool allow = false)
2536 : ovl (o), allow_inner (allow)
2537 {}
2538
2539 public:
2540 operator bool () const { return ovl; }
2541 ovl_iterator &operator++ ()
2542 {
2543 ovl = TREE_CODE (ovl) != OVERLOAD ? NULL_TREE : OVL_CHAIN (ovl);
2544 return *this;
2545 }
2546 tree operator* () const
2547 {
2548 tree fn = TREE_CODE (ovl) != OVERLOAD ? ovl : OVL_FUNCTION (ovl);
2549
2550 /* Check this is not an unexpected 2-dimensional overload. */
2551 gcc_checking_assert (allow_inner || TREE_CODE (fn) != OVERLOAD);
2552
2553 return fn;
2554 }
2555 bool operator== (const ovl_iterator &o) const { return ovl == o.ovl; }
2556 tree get_using () const
2557 {
2558 gcc_checking_assert (using_p ());
2559 return ovl;
2560 }
2561
2562 public:
2563 /* Whether this overload was introduced by a using decl. */
2564 bool using_p () const
2565 {
2566 return (TREE_CODE (ovl) == USING_DECL
2567 || (TREE_CODE (ovl) == OVERLOAD && OVL_USING_P (ovl)));
2568 }
2569 /* Whether this using is being exported. */
2570 bool exporting_p () const { return OVL_EXPORT_P (get_using ()); }
2571
2572 bool hidden_p () const
2573 {
2574 return TREE_CODE (ovl) == OVERLOAD && OVL_HIDDEN_P (ovl);
2575 }
2576
2577 public:
2578 tree remove_node (tree head) { return remove_node (head, ovl); }
2579 tree reveal_node (tree head) { return reveal_node (head, ovl); }
2580
2581 protected:
2582 /* If we have a nested overload, point at the inner overload and
2583 return the next link on the outer one. */
2584 tree maybe_push ()
2585 {
2586 tree r = NULL_TREE;
2587
2588 if (ovl && TREE_CODE (ovl) == OVERLOAD && OVL_NESTED_P (ovl))
2589 {
2590 r = OVL_CHAIN (ovl);
2591 ovl = OVL_FUNCTION (ovl);
2592 }
2593 return r;
2594 }
2595 /* Restore an outer nested overload. */
2596 void pop (tree outer)
2597 {
2598 gcc_checking_assert (!ovl);
2599 ovl = outer;
2600 }
2601
2602 private:
2603 /* We make these static functions to avoid the address of the
2604 iterator escaping the local context. */
2605 static tree remove_node (tree head, tree node);
2606 static tree reveal_node (tree ovl, tree node);
2607 };
2608
2609 // forked from gcc/cp/cp-tree.h lkp_iterator
2610
2611 /* Iterator over a (potentially) 2 dimensional overload, which is
2612 produced by name lookup. */
2613
2614 class lkp_iterator : public ovl_iterator
2615 {
2616 typedef ovl_iterator parent;
2617
2618 tree outer;
2619
2620 public:
2621 explicit lkp_iterator (tree o) : parent (o, true), outer (maybe_push ()) {}
2622
2623 public:
2624 lkp_iterator &operator++ ()
2625 {
2626 bool repush = !outer;
2627
2628 if (!parent::operator++ () && !repush)
2629 {
2630 pop (outer);
2631 repush = true;
2632 }
2633
2634 if (repush)
2635 outer = maybe_push ();
2636
2637 return *this;
2638 }
2639 };
2640
2641 // forked from gcc/cp/cp-tree.h treee_pair_s
2642
2643 struct GTY (()) rust_tree_pair_s
2644 {
2645 tree purpose;
2646 tree value;
2647 };
2648
2649 // forked from gcc/cp/cp-tree.h tree_pair_p
2650
2651 typedef rust_tree_pair_s *rust_tree_pair_p;
2652
2653 // forked from gcc/cp/cp-tree.h lang_type
2654
2655 /* This structure provides additional information above and beyond
2656 what is provide in the ordinary tree_type. In the past, we used it
2657 for the types of class types, template parameters types, typename
2658 types, and so forth. However, there can be many (tens to hundreds
2659 of thousands) of template parameter types in a compilation, and
2660 there's no need for this additional information in that case.
2661 Therefore, we now use this data structure only for class types.
2662
2663 In the past, it was thought that there would be relatively few
2664 class types. However, in the presence of heavy use of templates,
2665 many (i.e., thousands) of classes can easily be generated.
2666 Therefore, we should endeavor to keep the size of this structure to
2667 a minimum. */
2668 struct GTY (()) lang_type
2669 {
2670 unsigned char align;
2671
2672 unsigned has_type_conversion : 1;
2673 unsigned has_copy_ctor : 1;
2674 unsigned has_default_ctor : 1;
2675 unsigned const_needs_init : 1;
2676 unsigned ref_needs_init : 1;
2677 unsigned has_const_copy_assign : 1;
2678 unsigned use_template : 2;
2679
2680 unsigned has_mutable : 1;
2681 unsigned com_interface : 1;
2682 unsigned non_pod_class : 1;
2683 unsigned nearly_empty_p : 1;
2684 unsigned user_align : 1;
2685 unsigned has_copy_assign : 1;
2686 unsigned has_new : 1;
2687 unsigned has_array_new : 1;
2688
2689 unsigned gets_delete : 2;
2690 unsigned interface_only : 1;
2691 unsigned interface_unknown : 1;
2692 unsigned contains_empty_class_p : 1;
2693 unsigned anon_aggr : 1;
2694 unsigned non_zero_init : 1;
2695 unsigned empty_p : 1;
2696 /* 32 bits allocated. */
2697
2698 unsigned vec_new_uses_cookie : 1;
2699 unsigned declared_class : 1;
2700 unsigned diamond_shaped : 1;
2701 unsigned repeated_base : 1;
2702 unsigned being_defined : 1;
2703 unsigned debug_requested : 1;
2704 unsigned fields_readonly : 1;
2705 unsigned ptrmemfunc_flag : 1;
2706
2707 unsigned lazy_default_ctor : 1;
2708 unsigned lazy_copy_ctor : 1;
2709 unsigned lazy_copy_assign : 1;
2710 unsigned lazy_destructor : 1;
2711 unsigned has_const_copy_ctor : 1;
2712 unsigned has_complex_copy_ctor : 1;
2713 unsigned has_complex_copy_assign : 1;
2714 unsigned non_aggregate : 1;
2715
2716 unsigned has_complex_dflt : 1;
2717 unsigned has_list_ctor : 1;
2718 unsigned non_std_layout : 1;
2719 unsigned is_literal : 1;
2720 unsigned lazy_move_ctor : 1;
2721 unsigned lazy_move_assign : 1;
2722 unsigned has_complex_move_ctor : 1;
2723 unsigned has_complex_move_assign : 1;
2724
2725 unsigned has_constexpr_ctor : 1;
2726 unsigned unique_obj_representations : 1;
2727 unsigned unique_obj_representations_set : 1;
2728 bool erroneous : 1;
2729 bool non_pod_aggregate : 1;
2730
2731 /* When adding a flag here, consider whether or not it ought to
2732 apply to a template instance if it applies to the template. If
2733 so, make sure to copy it in instantiate_class_template! */
2734
2735 /* There are some bits left to fill out a 32-bit word. Keep track
2736 of this by updating the size of this bitfield whenever you add or
2737 remove a flag. */
2738 unsigned dummy : 3;
2739
2740 tree primary_base;
2741 vec<rust_tree_pair_s, va_gc> *vcall_indices;
2742 tree vtables;
2743 tree typeinfo_var;
2744 vec<tree, va_gc> *vbases;
2745 tree as_base;
2746 vec<tree, va_gc> *pure_virtuals;
2747 tree friend_classes;
2748 vec<tree, va_gc> *GTY ((reorder ("resort_type_member_vec"))) members;
2749 tree key_method;
2750 tree decl_list;
2751 tree befriending_classes;
2752 /* In a RECORD_TYPE, information specific to Objective-C++, such
2753 as a list of adopted protocols or a pointer to a corresponding
2754 @interface. See objc/objc-act.h for details. */
2755 tree objc_info;
2756 /* FIXME reuse another field? */
2757 tree lambda_expr;
2758 };
2759
2760 namespace Rust {
2761
2762 // forked from gcc/cp/cp-tree.h cp_ref_qualifier
2763
2764 enum rs_ref_qualifier
2765 {
2766 REF_QUAL_NONE = 0,
2767 REF_QUAL_LVALUE = 1,
2768 REF_QUAL_RVALUE = 2
2769 };
2770
2771 // forked from gcc/cp/cp-tree.h tsubst_flags
2772
2773 /* Bitmask flags to control type substitution. */
2774 enum tsubst_flags
2775 {
2776 tf_none = 0, /* nothing special */
2777 tf_error = 1 << 0, /* give error messages */
2778 tf_warning = 1 << 1, /* give warnings too */
2779 tf_ignore_bad_quals = 1 << 2, /* ignore bad cvr qualifiers */
2780 tf_keep_type_decl = 1 << 3, /* retain typedef type decls
2781 (make_typename_type use) */
2782 tf_ptrmem_ok = 1 << 4, /* pointers to member ok (internal
2783 instantiate_type use) */
2784 tf_user = 1 << 5, /* found template must be a user template
2785 (lookup_template_class use) */
2786 tf_conv = 1 << 6, /* We are determining what kind of
2787 conversion might be permissible,
2788 not actually performing the
2789 conversion. */
2790 tf_decltype = 1 << 7, /* We are the operand of decltype.
2791 Used to implement the special rules
2792 for calls in decltype (5.2.2/11). */
2793 tf_partial = 1 << 8, /* Doing initial explicit argument
2794 substitution in fn_type_unification. */
2795 tf_fndecl_type = 1 << 9, /* Substituting the type of a function
2796 declaration. */
2797 tf_no_cleanup = 1 << 10, /* Do not build a cleanup
2798 (build_target_expr and friends) */
2799 tf_norm = 1 << 11, /* Build diagnostic information during
2800 constraint normalization. */
2801 /* Convenient substitution flags combinations. */
2802 tf_warning_or_error = tf_warning | tf_error
2803 };
2804
2805 // forked from gcc/cp/cp-tree.h cp_identifier_kind
2806
2807 /* Kinds of identifiers. Values are carefully chosen. */
2808 enum cp_identifier_kind
2809 {
2810 cik_normal = 0, /* Not a special identifier. */
2811 cik_keyword = 1, /* A keyword. */
2812 cik_ctor = 2, /* Constructor (in-chg, complete or base). */
2813 cik_dtor = 3, /* Destructor (in-chg, deleting, complete or
2814 base). */
2815 cik_simple_op = 4, /* Non-assignment operator name. */
2816 cik_assign_op = 5, /* An assignment operator name. */
2817 cik_conv_op = 6, /* Conversion operator name. */
2818 cik_reserved_for_udlit = 7, /* Not yet in use */
2819 cik_max
2820 };
2821
2822 // forked from gcc/cp/cp-tree.h tag_types
2823
2824 /* An enumeration of the kind of tags that C++ accepts. */
2825 enum tag_types
2826 {
2827 none_type = 0, /* Not a tag type. */
2828 record_type, /* "struct" types. */
2829 class_type, /* "class" types. */
2830 union_type, /* "union" types. */
2831 enum_type, /* "enum" types. */
2832 typename_type, /* "typename" types. */
2833 scope_type /* namespace or tagged type name followed by :: */
2834 };
2835
2836 // forked from gcc/cp/cp-tree.h tsubst_flags_t
2837
2838 /* This type is used for parameters and variables which hold
2839 combinations of the flags in enum tsubst_flags. */
2840 typedef int tsubst_flags_t;
2841
2842 // forked from gcc/cp/cvt.cc convert_to_void
2843 //
2844 // When an expression is used in a void context, its value is discarded and
2845 // no lvalue-rvalue and similar conversions happen [expr.static.cast/4,
2846 // stmt.expr/1, expr.comma/1]. This permits dereferencing an incomplete type
2847 // in a void context. The C++ standard does not define what an `access' to an
2848 // object is, but there is reason to believe that it is the lvalue to rvalue
2849 // conversion -- if it were not, `*&*p = 1' would violate [expr]/4 in that it
2850 // accesses `*p' not to calculate the value to be stored. But, dcl.type.cv/8
2851 // indicates that volatile semantics should be the same between C and C++
2852 // where ever possible. C leaves it implementation defined as to what
2853 // constitutes an access to a volatile. So, we interpret `*vp' as a read of
2854 // the volatile object `vp' points to, unless that is an incomplete type. For
2855 // volatile references we do not do this interpretation, because that would
2856 // make it impossible to ignore the reference return value from functions. We
2857 // issue warnings in the confusing cases.
2858 //
2859 // The IMPLICIT is ICV_CAST when the user is explicitly converting an
2860 // expression to void via a cast. If an expression is being implicitly
2861 // converted, IMPLICIT indicates the context of the implicit conversion.
2862
2863 /* Possible cases of implicit or explicit bad conversions to void. */
2864 enum impl_conv_void
2865 {
2866 ICV_CAST, /* (explicit) conversion to void */
2867 ICV_SECOND_OF_COND, /* second operand of conditional expression */
2868 ICV_THIRD_OF_COND, /* third operand of conditional expression */
2869 ICV_RIGHT_OF_COMMA, /* right operand of comma operator */
2870 ICV_LEFT_OF_COMMA, /* left operand of comma operator */
2871 ICV_STATEMENT, /* statement */
2872 ICV_THIRD_IN_FOR /* for increment expression */
2873 };
2874
2875 /* BUILT_IN_FRONTEND function codes. */
2876 enum rs_built_in_function
2877 {
2878 RS_BUILT_IN_IS_CONSTANT_EVALUATED,
2879 RS_BUILT_IN_INTEGER_PACK,
2880 RS_BUILT_IN_IS_CORRESPONDING_MEMBER,
2881 RS_BUILT_IN_IS_POINTER_INTERCONVERTIBLE_WITH_CLASS,
2882 RS_BUILT_IN_SOURCE_LOCATION,
2883 RS_BUILT_IN_LAST
2884 };
2885
2886 // forked from gcc/cp/cp-tree.h compare_bounds_t
2887
2888 /* in typeck.cc */
2889 /* Says how we should behave when comparing two arrays one of which
2890 has unknown bounds. */
2891 enum compare_bounds_t
2892 {
2893 bounds_none,
2894 bounds_either,
2895 bounds_first
2896 };
2897
2898 extern tree
2899 convert_to_void (tree expr, impl_conv_void implicit);
2900
2901 // The lvalue-to-rvalue conversion (7.1) is applied if and only if the
2902 // expression is a glvalue of volatile-qualified type and it is one of the
2903 // following:
2904 // * ( expression ), where expression is one of these expressions,
2905 // * id-expression (8.1.4),
2906 // * subscripting (8.2.1),
2907 // * class member access (8.2.5),
2908 // * indirection (8.3.1),
2909 // * pointer-to-member operation (8.5),
2910 // * conditional expression (8.16) where both the second and the third
2911 // operands are one of these expressions, or
2912 // * comma expression (8.19) where the right operand is one of these
2913 // expressions.
2914 extern tree
2915 mark_discarded_use (tree expr);
2916
2917 // Mark EXP as read, not just set, for set but not used -Wunused warning
2918 // purposes.
2919 extern void
2920 mark_exp_read (tree exp);
2921
2922 // We've seen an actual use of EXPR. Possibly replace an outer variable
2923 // reference inside with its constant value or a lambda capture.
2924 extern tree
2925 mark_use (tree expr, bool rvalue_p, bool read_p, location_t loc,
2926 bool reject_builtin);
2927
2928 // Called whenever the expression EXPR is used in an rvalue context.
2929 // When REJECT_BUILTIN is true the expression is checked to make sure
2930 // it doesn't make it possible to obtain the address of a GCC built-in
2931 // function with no library fallback (or any of its bits, such as in
2932 // a conversion to bool).
2933 extern tree
2934 mark_rvalue_use (tree, location_t = UNKNOWN_LOCATION,
2935 bool reject_builtin = true);
2936
2937 // Called whenever an expression is used in an lvalue context.
2938 extern tree
2939 mark_lvalue_use (tree expr);
2940
2941 // As above, but don't consider this use a read.
2942 extern tree
2943 mark_lvalue_use_nonread (tree expr);
2944
2945 // We are using a reference VAL for its value. Bash that reference all the way
2946 // down to its lowest form.
2947 extern tree
2948 convert_from_reference (tree val);
2949
2950 // Subroutine of convert_to_void. Warn if we're discarding something with
2951 // attribute [[nodiscard]].
2952 extern void
2953 maybe_warn_nodiscard (tree expr, impl_conv_void implicit);
2954
2955 extern location_t
2956 expr_loc_or_loc (const_tree t, location_t or_loc);
2957
2958 extern location_t
2959 expr_loc_or_input_loc (const_tree t);
2960
2961 // FN is the callee of a CALL_EXPR or AGGR_INIT_EXPR; return the FUNCTION_DECL
2962 // if we can.
2963 extern tree
2964 get_fndecl_from_callee (tree fn);
2965
2966 // FIXME some helpers from HIRCompileBase could probably be moved here over time
2967
2968 // Return an expression for the address of BASE[INDEX], used in offset intrinsic
2969 extern tree
2970 pointer_offset_expression (tree base_tree, tree index_tree, location_t locus);
2971
2972 /* A tree node, together with a location, so that we can track locations
2973 (and ranges) during parsing.
2974
2975 The location is redundant for node kinds that have locations,
2976 but not all node kinds do (e.g. constants, and references to
2977 params, locals, etc), so we stash a copy here. */
2978
2979 extern location_t rs_expr_location (const_tree);
2980
2981 extern int
2982 is_empty_class (tree type);
2983
2984 extern bool
2985 is_really_empty_class (tree, bool);
2986
2987 extern bool builtin_valid_in_constant_expr_p (const_tree);
2988
2989 extern bool maybe_constexpr_fn (tree);
2990
2991 extern bool var_in_maybe_constexpr_fn (tree);
2992
2993 extern int
2994 rs_type_quals (const_tree type);
2995
2996 inline bool type_unknown_p (const_tree);
2997
2998 extern bool decl_maybe_constant_var_p (tree);
2999
3000 extern void
3001 init_modules ();
3002
3003 extern bool var_in_constexpr_fn (tree);
3004
3005 inline tree ovl_first (tree) ATTRIBUTE_PURE;
3006
3007 inline bool type_unknown_p (const_tree);
3008
3009 extern tree
3010 lookup_add (tree fns, tree lookup);
3011
3012 extern tree
3013 ovl_make (tree fn, tree next = NULL_TREE);
3014
3015 extern int is_overloaded_fn (tree) ATTRIBUTE_PURE;
3016
3017 extern bool maybe_add_lang_type_raw (tree);
3018
3019 extern rs_ref_qualifier type_memfn_rqual (const_tree);
3020
3021 extern bool builtin_pack_fn_p (tree);
3022
3023 extern tree make_conv_op_name (tree);
3024
3025 extern int type_memfn_quals (const_tree);
3026
3027 struct c_fileinfo *
3028 get_fileinfo (const char *);
3029
3030 extern tree
3031 cxx_make_type (enum tree_code CXX_MEM_STAT_INFO);
3032
3033 extern tree
3034 build_cplus_array_type (tree, tree, int is_dep = -1);
3035
3036 extern bool is_byte_access_type (tree);
3037
3038 extern bool
3039 comptypes (tree, tree, int);
3040
3041 extern tree canonical_eh_spec (tree);
3042
3043 extern int cp_tree_operand_length (const_tree);
3044
3045 extern bool rs_tree_equal (tree, tree);
3046
3047 extern bool compparms (const_tree, const_tree);
3048
3049 extern tree
3050 rs_build_qualified_type_real (tree, int, tsubst_flags_t);
3051 #define rs_build_qualified_type(TYPE, QUALS) \
3052 rs_build_qualified_type_real ((TYPE), (QUALS), tf_warning_or_error)
3053 extern bool cv_qualified_p (const_tree);
3054
3055 extern bool similar_type_p (tree, tree);
3056
3057 extern bool rs_tree_equal (tree, tree);
3058
3059 extern bool
3060 vector_targets_convertible_p (const_tree t1, const_tree t2);
3061
3062 extern bool same_type_ignoring_top_level_qualifiers_p (tree, tree);
3063
3064 extern bool comp_ptr_ttypes_const (tree, tree, compare_bounds_t);
3065
3066 extern tree
3067 get_class_binding_direct (tree, tree, bool want_type = false);
3068
3069 extern tree skip_artificial_parms_for (const_tree, tree);
3070
3071 extern void
3072 lang_check_failed (const char *, int,
3073 const char *) ATTRIBUTE_NORETURN ATTRIBUTE_COLD;
3074
3075 extern tree default_init_uninitialized_part (tree);
3076
3077 extern bool type_has_non_user_provided_default_constructor (tree);
3078
3079 extern bool default_ctor_p (const_tree);
3080
3081 extern bool user_provided_p (tree);
3082
3083 extern bool sufficient_parms_p (const_tree);
3084
3085 extern tree next_initializable_field (tree);
3086
3087 extern tree in_class_defaulted_default_constructor (tree);
3088
3089 extern bool is_instantiation_of_constexpr (tree);
3090
3091 extern bool
3092 check_for_uninitialized_const_var (tree, bool, tsubst_flags_t);
3093
3094 extern bool reduced_constant_expression_p (tree);
3095
3096 extern tree cv_unqualified (tree);
3097
3098 extern tree cp_get_callee (tree);
3099 extern tree rs_get_callee_fndecl_nofold (tree);
3100
3101 extern bool is_nondependent_static_init_expression (tree);
3102
3103 extern tree build_nop (tree, tree);
3104
3105 extern bool scalarish_type_p (const_tree);
3106
3107 extern tree is_bitfield_expr_with_lowered_type (const_tree);
3108
3109 extern tree convert_bitfield_to_declared_type (tree);
3110
3111 extern tree
3112 cp_fold_maybe_rvalue (tree, bool);
3113
3114 extern tree maybe_undo_parenthesized_ref (tree);
3115
3116 extern tree
3117 fold_offsetof (tree, tree = size_type_node, tree_code ctx = ERROR_MARK);
3118
3119 extern tree cp_truthvalue_conversion (tree, tsubst_flags_t);
3120
3121 extern tree
3122 fold_non_dependent_expr (tree, tsubst_flags_t = tf_warning_or_error,
3123 bool = false, tree = NULL_TREE);
3124
3125 extern int char_type_p (tree);
3126
3127 extern bool instantiation_dependent_expression_p (tree);
3128
3129 extern bool type_has_nontrivial_copy_init (const_tree);
3130
3131 extern tree build_local_temp (tree);
3132
3133 extern bool is_normal_capture_proxy (tree);
3134
3135 extern bool reject_gcc_builtin (const_tree, location_t = UNKNOWN_LOCATION);
3136
3137 extern tree resolve_nondeduced_context (tree, tsubst_flags_t);
3138
3139 extern void cxx_incomplete_type_diagnostic (location_t, const_tree, const_tree,
3140 diagnostic_t);
3141
3142 extern void cxx_incomplete_type_error (location_t, const_tree, const_tree);
3143
3144 extern bool invalid_nonstatic_memfn_p (location_t, tree, tsubst_flags_t);
3145
3146 extern bool really_overloaded_fn (tree) ATTRIBUTE_PURE;
3147
3148 extern tree resolve_nondeduced_context_or_error (tree, tsubst_flags_t);
3149
3150 extern tree instantiate_non_dependent_or_null (tree);
3151
3152 extern void cxx_incomplete_type_inform (const_tree);
3153
3154 extern tree strip_top_quals (tree);
3155
3156 extern bool undeduced_auto_decl (tree);
3157
3158 extern bool require_deduced_type (tree, tsubst_flags_t = tf_warning_or_error);
3159
3160 extern bool decl_constant_var_p (tree);
3161
3162 extern tree build_new_constexpr_heap_type (tree, tree, tree);
3163
3164 extern bool is_empty_field (tree);
3165
3166 extern bool
3167 in_immediate_context ();
3168
3169 extern tree cp_get_callee_fndecl_nofold (tree);
3170
3171 extern bool
3172 cxx_mark_addressable (tree, bool = false);
3173
3174 extern tree fold_builtin_source_location (location_t);
3175
3176 extern tree build_address (tree);
3177
3178 extern bool bitfield_p (const_tree);
3179
3180 extern tree rvalue (tree);
3181
3182 extern bool glvalue_p (const_tree);
3183
3184 extern cp_lvalue_kind lvalue_kind (const_tree);
3185
3186 extern tree
3187 decl_constant_value (tree, bool);
3188
3189 extern tree lookup_enumerator (tree, tree);
3190
3191 extern int
3192 is_class_type (tree, int);
3193
3194 extern tree braced_lists_to_strings (tree, tree);
3195
3196 extern tree
3197 fold_builtin_is_pointer_inverconvertible_with_class (location_t, int, tree *);
3198
3199 extern bool layout_compatible_type_p (tree, tree);
3200
3201 extern tree finish_underlying_type (tree);
3202
3203 extern tree
3204 c_common_type_for_mode (machine_mode, int);
3205
3206 extern bool std_layout_type_p (const_tree);
3207
3208 extern tree complete_type (tree);
3209
3210 extern tree complete_type_or_else (tree, tree);
3211
3212 extern void note_failed_type_completion_for_satisfaction (tree);
3213
3214 extern tree complete_type_or_maybe_complain (tree, tree, tsubst_flags_t);
3215
3216 extern bool
3217 next_common_initial_seqence (tree &, tree &);
3218
3219 extern bool null_member_pointer_value_p (tree);
3220
3221 extern tree
3222 fold_builtin_is_corresponding_member (location_t, int, tree *);
3223
3224 extern tree cp_fold_rvalue (tree);
3225
3226 extern tree
3227 maybe_constant_value (tree, tree = NULL_TREE, bool = false);
3228
3229 extern tree lvalue_type (tree);
3230
3231 extern void lvalue_error (location_t, enum lvalue_use);
3232
3233 extern tree
3234 cp_fold_maybe_rvalue (tree, bool);
3235
3236 extern tree get_first_fn (tree) ATTRIBUTE_PURE;
3237
3238 extern void explain_non_literal_class (tree);
3239
3240 extern bool reference_related_p (tree, tree);
3241
3242 extern bool ordinary_char_type_p (tree);
3243
3244 extern bool array_string_literal_compatible_p (tree, tree);
3245
3246 // forked from gcc/cp/cp-tree.h
3247
3248 enum
3249 {
3250 ce_derived,
3251 ce_type,
3252 ce_normal,
3253 ce_exact
3254 };
3255
3256 extern tree
3257 rs_build_qualified_type_real (tree, int, tsubst_flags_t);
3258 #define rs_build_qualified_type(TYPE, QUALS) \
3259 rs_build_qualified_type_real ((TYPE), (QUALS), tf_warning_or_error)
3260
3261 extern tree
3262 rs_walk_subtrees (tree *, int *, walk_tree_fn, void *, hash_set<tree> *);
3263 #define rs_walk_tree(tp, func, data, pset) \
3264 walk_tree_1 (tp, func, data, pset, rs_walk_subtrees)
3265 #define rs_walk_tree_without_duplicates(tp, func, data) \
3266 walk_tree_without_duplicates_1 (tp, func, data, rs_walk_subtrees)
3267
3268 // forked from gcc/cp/cp-tree.h cp_expr_loc_or_loc
3269
3270 inline location_t
3271 rs_expr_loc_or_loc (const_tree t, location_t or_loc)
3272 {
3273 location_t loc = rs_expr_location (t);
3274 if (loc == UNKNOWN_LOCATION)
3275 loc = or_loc;
3276 return loc;
3277 }
3278
3279 // forked from gcc/cp/cp-tree.h cp_expr_loc_or_input_loc
3280
3281 inline location_t
3282 rs_expr_loc_or_input_loc (const_tree t)
3283 {
3284 return rs_expr_loc_or_loc (t, input_location);
3285 }
3286
3287 // forked from gcc/cp/cp-tree.h type_unknown_p
3288
3289 inline bool
3290 type_unknown_p (const_tree expr)
3291 {
3292 return TREE_TYPE (expr) == unknown_type_node;
3293 }
3294
3295 // forked from gcc/cp/cp-tree.h ovl_first
3296
3297 /* Inline bodies. */
3298
3299 inline tree
3300 ovl_first (tree node)
3301 {
3302 while (TREE_CODE (node) == OVERLOAD)
3303 node = OVL_FUNCTION (node);
3304 return node;
3305 }
3306
3307 // forked from gcc/cp/cp-tree.h type_of_this_parm
3308
3309 /* Return the type of the `this' parameter of FNTYPE. */
3310
3311 inline tree
3312 type_of_this_parm (const_tree fntype)
3313 {
3314 function_args_iterator iter;
3315 gcc_assert (TREE_CODE (fntype) == METHOD_TYPE);
3316 function_args_iter_init (&iter, fntype);
3317 return function_args_iter_cond (&iter);
3318 }
3319
3320 // forked from gcc/cp/cp-tree.h class_of_this_parm
3321
3322 /* Return the class of the `this' parameter of FNTYPE. */
3323
3324 inline tree
3325 class_of_this_parm (const_tree fntype)
3326 {
3327 return TREE_TYPE (type_of_this_parm (fntype));
3328 }
3329
3330 // forked from gcc/cp/cp-tree.h identifier_p
3331
3332 /* Return a typed pointer version of T if it designates a
3333 C++ front-end identifier. */
3334 inline lang_identifier *
3335 identifier_p (tree t)
3336 {
3337 if (TREE_CODE (t) == IDENTIFIER_NODE)
3338 return (lang_identifier *) t;
3339 return NULL;
3340 }
3341
3342 // forked from gcc/c-family/c-common.h gnu_vector_type_p
3343
3344 /* Return true if TYPE is a vector type that should be subject to the GNU
3345 vector extensions (as opposed to a vector type that is used only for
3346 the purposes of defining target-specific built-in functions). */
3347
3348 inline bool
3349 gnu_vector_type_p (const_tree type)
3350 {
3351 return TREE_CODE (type) == VECTOR_TYPE && !TYPE_INDIVISIBLE_P (type);
3352 }
3353
3354 extern vec<tree, va_gc> *
3355 make_tree_vector (void);
3356
3357 extern void
3358 release_tree_vector (vec<tree, va_gc> *);
3359
3360 /* Simplified unique_ptr clone to release a tree vec on exit. */
3361
3362 class releasing_vec
3363 {
3364 public:
3365 typedef vec<tree, va_gc> vec_t;
3366
3367 releasing_vec (vec_t *v) : v (v) {}
3368 releasing_vec () : v (make_tree_vector ()) {}
3369
3370 /* Copy ops are deliberately declared but not defined,
3371 copies must always be elided. */
3372 releasing_vec (const releasing_vec &);
3373 releasing_vec &operator= (const releasing_vec &);
3374
3375 vec_t &operator* () const { return *v; }
3376 vec_t *operator-> () const { return v; }
3377 vec_t *get () const { return v; }
3378 operator vec_t * () const { return v; }
3379 vec_t **operator& () { return &v; }
3380
3381 /* Breaks pointer/value consistency for convenience. This takes ptrdiff_t
3382 rather than unsigned to avoid ambiguity with the built-in operator[]
3383 (bootstrap/91828). */
3384 tree &operator[] (ptrdiff_t i) const { return (*v)[i]; }
3385
3386 tree *begin () { return ::begin (v); }
3387 tree *end () { return ::end (v); }
3388
3389 void release ()
3390 {
3391 release_tree_vector (v);
3392 v = NULL;
3393 }
3394
3395 ~releasing_vec () { release_tree_vector (v); }
3396
3397 private:
3398 vec_t *v;
3399 };
3400
3401 inline tree *
3402 vec_safe_push (releasing_vec &r, const tree &t CXX_MEM_STAT_INFO)
3403 {
3404 return vec_safe_push (*&r, t PASS_MEM_STAT);
3405 }
3406
3407 inline bool
3408 vec_safe_reserve (releasing_vec &r, unsigned n,
3409 bool e = false CXX_MEM_STAT_INFO)
3410 {
3411 return vec_safe_reserve (*&r, n, e PASS_MEM_STAT);
3412 }
3413 inline unsigned
3414 vec_safe_length (releasing_vec &r)
3415 {
3416 return r->length ();
3417 }
3418 inline void
3419 vec_safe_splice (releasing_vec &r, vec<tree, va_gc> *p CXX_MEM_STAT_INFO)
3420 {
3421 vec_safe_splice (*&r, p PASS_MEM_STAT);
3422 }
3423
3424 inline bool
3425 null_node_p (const_tree expr)
3426 {
3427 STRIP_ANY_LOCATION_WRAPPER (expr);
3428 return expr == null_node;
3429 }
3430
3431 inline void
3432 cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
3433 diagnostic_t diag_kind)
3434 {
3435 cxx_incomplete_type_diagnostic (rs_expr_loc_or_input_loc (value), value, type,
3436 diag_kind);
3437 }
3438
3439 inline void
3440 cxx_incomplete_type_error (const_tree value, const_tree type)
3441 {
3442 cxx_incomplete_type_diagnostic (value, type, DK_ERROR);
3443 }
3444
3445 extern location_t
3446 location_of (tree t);
3447
3448 /* Helpers for IMPLICIT_RVALUE_P to look through automatic dereference. */
3449
3450 inline bool
3451 implicit_rvalue_p (const_tree t)
3452 {
3453 if (REFERENCE_REF_P (t))
3454 t = TREE_OPERAND (t, 0);
3455 return ((TREE_CODE (t) == NON_LVALUE_EXPR) && IMPLICIT_RVALUE_P (t));
3456 }
3457 inline tree
3458 set_implicit_rvalue_p (tree ot)
3459 {
3460 tree t = ot;
3461 if (REFERENCE_REF_P (t))
3462 t = TREE_OPERAND (t, 0);
3463 IMPLICIT_RVALUE_P (t) = 1;
3464 return ot;
3465 }
3466
3467 namespace Compile {
3468 extern tree
3469 maybe_constant_init (tree, tree = NULL_TREE, bool = false);
3470
3471 extern void
3472 explain_invalid_constexpr_fn (tree fun);
3473
3474 extern bool potential_constant_expression (tree);
3475
3476 extern bool
3477 literal_type_p (tree t);
3478
3479 extern bool
3480 maybe_constexpr_fn (tree t);
3481
3482 extern tree
3483 fold_non_dependent_init (tree, tsubst_flags_t = tf_warning_or_error,
3484 bool = false, tree = NULL_TREE);
3485 } // namespace Compile
3486
3487 } // namespace Rust
3488
3489 #endif // RUST_TREE