| 1 | /* Definitions for -*- C++ -*- parsing and type checking. | 
| 2 |    Copyright (C) 1987-2025 Free Software Foundation, Inc. | 
| 3 |    Contributed by Michael Tiemann (tiemann@cygnus.com) | 
| 4 |  | 
| 5 | This file is part of GCC. | 
| 6 |  | 
| 7 | GCC is free software; you can redistribute it and/or modify | 
| 8 | it under the terms of the GNU General Public License as published by | 
| 9 | the Free Software Foundation; either version 3, or (at your option) | 
| 10 | any later version. | 
| 11 |  | 
| 12 | GCC is distributed in the hope that it will be useful, | 
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 15 | GNU General Public License for more details. | 
| 16 |  | 
| 17 | You should have received a copy of the GNU General Public License | 
| 18 | along with GCC; see the file COPYING3.  If not see | 
| 19 | <http://www.gnu.org/licenses/>.  */ | 
| 20 |  | 
| 21 | #ifndef GCC_CP_TREE_H | 
| 22 | #define GCC_CP_TREE_H | 
| 23 |  | 
| 24 | #include "tm.h" | 
| 25 | #include "hard-reg-set.h" | 
| 26 | #include "function.h" | 
| 27 | #include "tristate.h" | 
| 28 | #include "contracts.h" | 
| 29 |  | 
| 30 | /* In order for the format checking to accept the C++ front end | 
| 31 |    diagnostic framework extensions, you must include this file before | 
| 32 |    diagnostic-core.h, not after.  We override the definition of GCC_DIAG_STYLE | 
| 33 |    in c-common.h.  */ | 
| 34 | #undef GCC_DIAG_STYLE | 
| 35 | #define GCC_DIAG_STYLE __gcc_cxxdiag__ | 
| 36 | #if defined(GCC_DIAGNOSTIC_CORE_H) || defined (GCC_C_COMMON_H) | 
| 37 | #error \ | 
| 38 | In order for the format checking to accept the C++ front end diagnostic \ | 
| 39 | framework extensions, you must include this file before diagnostic-core.h and \ | 
| 40 | c-common.h, not after. | 
| 41 | #endif | 
| 42 | #include "c-family/c-common.h" | 
| 43 | #include "diagnostic.h" | 
| 44 |  | 
| 45 | /* A tree node, together with a location, so that we can track locations | 
| 46 |    (and ranges) during parsing. | 
| 47 |  | 
| 48 |    The location is redundant for node kinds that have locations, | 
| 49 |    but not all node kinds do (e.g. constants, and references to | 
| 50 |    params, locals, etc), so we stash a copy here.  */ | 
| 51 |  | 
| 52 | inline location_t cp_expr_location                (const_tree); | 
| 53 |  | 
| 54 | class cp_expr | 
| 55 | { | 
| 56 | public: | 
| 57 |   cp_expr () : | 
| 58 |     m_value (NULL), m_loc (UNKNOWN_LOCATION), | 
| 59 |     m_decimal (false) | 
| 60 |   {} | 
| 61 |  | 
| 62 |   cp_expr (tree value) : | 
| 63 |     m_value (value), m_loc (cp_expr_location (m_value)), | 
| 64 |     m_decimal (false) | 
| 65 |   {} | 
| 66 |  | 
| 67 |   cp_expr (tree value, location_t loc): | 
| 68 |     m_value (value), m_loc (loc), m_decimal (false) | 
| 69 |   { | 
| 70 |     protected_set_expr_location (value, loc); | 
| 71 |   } | 
| 72 |  | 
| 73 |   cp_expr (tree value, location_t loc, bool decimal): | 
| 74 |     m_value (value), m_loc (loc), m_decimal (decimal) | 
| 75 |   { | 
| 76 |     protected_set_expr_location (value, loc); | 
| 77 |   } | 
| 78 |  | 
| 79 |   /* Implicit conversions to tree.  */ | 
| 80 |   operator tree () const { return m_value; } | 
| 81 |   tree & operator* () { return m_value; } | 
| 82 |   tree operator* () const { return m_value; } | 
| 83 |   tree & operator-> () { return m_value; } | 
| 84 |   tree operator-> () const { return m_value; } | 
| 85 |  | 
| 86 |   tree get_value () const { return m_value; } | 
| 87 |   location_t get_location () const { return m_loc; } | 
| 88 |   location_t get_start () const | 
| 89 |   { | 
| 90 |     source_range src_range = get_range_from_loc (set: line_table, loc: m_loc); | 
| 91 |     return src_range.m_start; | 
| 92 |   } | 
| 93 |   location_t get_finish () const | 
| 94 |   { | 
| 95 |     source_range src_range = get_range_from_loc (set: line_table, loc: m_loc); | 
| 96 |     return src_range.m_finish; | 
| 97 |   } | 
| 98 |  | 
| 99 |   void set_location (location_t loc) | 
| 100 |   { | 
| 101 |     protected_set_expr_location (m_value, loc); | 
| 102 |     m_loc = loc; | 
| 103 |   } | 
| 104 |  | 
| 105 |   void set_range (location_t start, location_t finish) | 
| 106 |   { | 
| 107 |     set_location (make_location (caret: m_loc, start, finish)); | 
| 108 |   } | 
| 109 |  | 
| 110 |   cp_expr& maybe_add_location_wrapper () | 
| 111 |   { | 
| 112 |     m_value = maybe_wrap_with_location (m_value, m_loc); | 
| 113 |     return *this; | 
| 114 |   } | 
| 115 |  | 
| 116 |   bool decimal_p () const { return m_decimal; } | 
| 117 |  | 
| 118 |  private: | 
| 119 |   tree m_value; | 
| 120 |   location_t m_loc; | 
| 121 |   bool m_decimal : 1; | 
| 122 | }; | 
| 123 |  | 
| 124 | inline bool | 
| 125 | operator == (const cp_expr &lhs, tree rhs) | 
| 126 | { | 
| 127 |   return lhs.get_value () == rhs; | 
| 128 | } | 
| 129 |  | 
| 130 |  | 
| 131 | enum cp_tree_index | 
| 132 | { | 
| 133 |     CPTI_WCHAR_DECL, | 
| 134 |     CPTI_VTABLE_ENTRY_TYPE, | 
| 135 |     CPTI_DELTA_TYPE, | 
| 136 |     CPTI_VTABLE_INDEX_TYPE, | 
| 137 |     CPTI_CLEANUP_TYPE, | 
| 138 |     CPTI_VTT_PARM_TYPE, | 
| 139 |  | 
| 140 |     CPTI_CLASS_TYPE, | 
| 141 |     CPTI_UNKNOWN_TYPE, | 
| 142 |     CPTI_INIT_LIST_TYPE, | 
| 143 |     CPTI_EXPLICIT_VOID_LIST, | 
| 144 |     CPTI_VTBL_TYPE, | 
| 145 |     CPTI_VTBL_PTR_TYPE, | 
| 146 |     CPTI_GLOBAL, | 
| 147 |     CPTI_ABORT_FNDECL, | 
| 148 |     CPTI_AGGR_TAG, | 
| 149 |     CPTI_CONV_OP_MARKER, | 
| 150 |  | 
| 151 |     CPTI_CTOR_IDENTIFIER, | 
| 152 |     CPTI_COMPLETE_CTOR_IDENTIFIER, | 
| 153 |     CPTI_BASE_CTOR_IDENTIFIER, | 
| 154 |     CPTI_DTOR_IDENTIFIER, | 
| 155 |     CPTI_COMPLETE_DTOR_IDENTIFIER, | 
| 156 |     CPTI_BASE_DTOR_IDENTIFIER, | 
| 157 |     CPTI_DELETING_DTOR_IDENTIFIER, | 
| 158 |     CPTI_CONV_OP_IDENTIFIER, | 
| 159 |     CPTI_DELTA_IDENTIFIER, | 
| 160 |     CPTI_IN_CHARGE_IDENTIFIER, | 
| 161 |     CPTI_VTT_PARM_IDENTIFIER, | 
| 162 |     CPTI_AS_BASE_IDENTIFIER, | 
| 163 |     CPTI_THIS_IDENTIFIER, | 
| 164 |     CPTI_PFN_IDENTIFIER, | 
| 165 |     CPTI_VPTR_IDENTIFIER, | 
| 166 |     CPTI_GLOBAL_IDENTIFIER, | 
| 167 |     CPTI_ANON_IDENTIFIER, | 
| 168 |     CPTI_AUTO_IDENTIFIER, | 
| 169 |     CPTI_DECLTYPE_AUTO_IDENTIFIER, | 
| 170 |     CPTI_INIT_LIST_IDENTIFIER, | 
| 171 |     CPTI_FOR_RANGE__IDENTIFIER, | 
| 172 |     CPTI_FOR_BEGIN__IDENTIFIER, | 
| 173 |     CPTI_FOR_END__IDENTIFIER, | 
| 174 |     CPTI_FOR_RANGE_IDENTIFIER, | 
| 175 |     CPTI_FOR_BEGIN_IDENTIFIER, | 
| 176 |     CPTI_FOR_END_IDENTIFIER, | 
| 177 |     CPTI_ABI_TAG_IDENTIFIER, | 
| 178 |     CPTI_ALIGNED_IDENTIFIER, | 
| 179 |     CPTI_BEGIN_IDENTIFIER, | 
| 180 |     CPTI_END_IDENTIFIER, | 
| 181 |     CPTI_GET_IDENTIFIER, | 
| 182 |     CPTI_GNU_IDENTIFIER, | 
| 183 |     CPTI_TUPLE_ELEMENT_IDENTIFIER, | 
| 184 |     CPTI_TUPLE_SIZE_IDENTIFIER, | 
| 185 |     CPTI_TYPE_IDENTIFIER, | 
| 186 |     CPTI_VALUE_IDENTIFIER, | 
| 187 |     CPTI_FUN_IDENTIFIER, | 
| 188 |     CPTI_CLOSURE_IDENTIFIER, | 
| 189 |     CPTI_HEAP_UNINIT_IDENTIFIER, | 
| 190 |     CPTI_HEAP_IDENTIFIER, | 
| 191 |     CPTI_HEAP_DELETED_IDENTIFIER, | 
| 192 |     CPTI_HEAP_VEC_UNINIT_IDENTIFIER, | 
| 193 |     CPTI_HEAP_VEC_IDENTIFIER, | 
| 194 |     CPTI_OMP_IDENTIFIER, | 
| 195 |     CPTI_INTERNAL_IDENTIFIER, | 
| 196 |  | 
| 197 |     CPTI_LANG_NAME_C, | 
| 198 |     CPTI_LANG_NAME_CPLUSPLUS, | 
| 199 |  | 
| 200 |     CPTI_EMPTY_EXCEPT_SPEC, | 
| 201 |     CPTI_NOEXCEPT_TRUE_SPEC, | 
| 202 |     CPTI_NOEXCEPT_FALSE_SPEC, | 
| 203 |     CPTI_NOEXCEPT_DEFERRED_SPEC, | 
| 204 |  | 
| 205 |     CPTI_ANY_TARG, | 
| 206 |  | 
| 207 |     CPTI_MODULE_HWM, | 
| 208 |     /* Nodes after here change during compilation, or should not be in | 
| 209 |        the module's global tree table.  Such nodes must be locatable | 
| 210 |        via name lookup or type-construction, as those are the only | 
| 211 |        cross-TU matching capabilities remaining.  */ | 
| 212 |  | 
| 213 |     /* We must find these via the global namespace.  */ | 
| 214 |     CPTI_STD, | 
| 215 |     CPTI_ABI, | 
| 216 |  | 
| 217 |     /* These are created at init time, but the library/headers provide | 
| 218 |        definitions.  */ | 
| 219 |     CPTI_ALIGN_TYPE, | 
| 220 |     CPTI_TERMINATE_FN, | 
| 221 |     CPTI_CALL_TERMINATE_FN, | 
| 222 |     CPTI_CALL_UNEXPECTED_FN, | 
| 223 |  | 
| 224 |     /* These are lazily inited.  */ | 
| 225 |     CPTI_CONST_TYPE_INFO_TYPE, | 
| 226 |     CPTI_GET_EXCEPTION_PTR_FN, | 
| 227 |     CPTI_BEGIN_CATCH_FN, | 
| 228 |     CPTI_END_CATCH_FN, | 
| 229 |     CPTI_ALLOCATE_EXCEPTION_FN, | 
| 230 |     CPTI_FREE_EXCEPTION_FN, | 
| 231 |     CPTI_THROW_FN, | 
| 232 |     CPTI_RETHROW_FN, | 
| 233 |     CPTI_ATEXIT_FN_PTR_TYPE, | 
| 234 |     CPTI_ATEXIT, | 
| 235 |     CPTI_THREAD_ATEXIT, | 
| 236 |     CPTI_DSO_HANDLE, | 
| 237 |     CPTI_DCAST, | 
| 238 |  | 
| 239 |     CPTI_PSEUDO_CONTRACT_VIOLATION, | 
| 240 |  | 
| 241 |     CPTI_MAX | 
| 242 | }; | 
| 243 |  | 
| 244 | extern GTY(()) tree cp_global_trees[CPTI_MAX]; | 
| 245 |  | 
| 246 | #define wchar_decl_node                        cp_global_trees[CPTI_WCHAR_DECL] | 
| 247 | #define vtable_entry_type                cp_global_trees[CPTI_VTABLE_ENTRY_TYPE] | 
| 248 | /* The type used to represent an offset by which to adjust the `this' | 
| 249 |    pointer in pointer-to-member types.  */ | 
| 250 | #define delta_type_node                        cp_global_trees[CPTI_DELTA_TYPE] | 
| 251 | /* The type used to represent an index into the vtable.  */ | 
| 252 | #define vtable_index_type                cp_global_trees[CPTI_VTABLE_INDEX_TYPE] | 
| 253 |  | 
| 254 | #define class_type_node                        cp_global_trees[CPTI_CLASS_TYPE] | 
| 255 | #define unknown_type_node                cp_global_trees[CPTI_UNKNOWN_TYPE] | 
| 256 | #define init_list_type_node                cp_global_trees[CPTI_INIT_LIST_TYPE] | 
| 257 | #define explicit_void_list_node                cp_global_trees[CPTI_EXPLICIT_VOID_LIST] | 
| 258 | #define vtbl_type_node                        cp_global_trees[CPTI_VTBL_TYPE] | 
| 259 | #define vtbl_ptr_type_node                cp_global_trees[CPTI_VTBL_PTR_TYPE] | 
| 260 | #define std_node                        cp_global_trees[CPTI_STD] | 
| 261 | #define abi_node                        cp_global_trees[CPTI_ABI] | 
| 262 | #define global_namespace                cp_global_trees[CPTI_GLOBAL] | 
| 263 | #define const_type_info_type_node        cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE] | 
| 264 | #define conv_op_marker                        cp_global_trees[CPTI_CONV_OP_MARKER] | 
| 265 | #define abort_fndecl                        cp_global_trees[CPTI_ABORT_FNDECL] | 
| 266 | #define current_aggr                        cp_global_trees[CPTI_AGGR_TAG] | 
| 267 | /* std::align_val_t */ | 
| 268 | #define align_type_node                        cp_global_trees[CPTI_ALIGN_TYPE] | 
| 269 | #define pseudo_contract_violation_type        cp_global_trees[CPTI_PSEUDO_CONTRACT_VIOLATION] | 
| 270 |  | 
| 271 | /* We cache these tree nodes so as to call get_identifier less frequently. | 
| 272 |    For identifiers for functions, including special member functions such | 
| 273 |    as ctors and assignment operators, the nodes can be used (among other | 
| 274 |    things) to iterate over their overloads defined by/for a type.  For | 
| 275 |    example: | 
| 276 |  | 
| 277 |      tree ovlid = assign_op_identifier; | 
| 278 |      tree overloads = get_class_binding (type, ovlid); | 
| 279 |      for (ovl_iterator it (overloads); it; ++it) { ... } | 
| 280 |  | 
| 281 |    iterates over the set of implicitly and explicitly defined overloads | 
| 282 |    of the assignment operator for type (including the copy and move | 
| 283 |    assignment operators, whether deleted or not).  */ | 
| 284 |  | 
| 285 | /* The name of a constructor that takes an in-charge parameter to | 
| 286 |    decide whether or not to construct virtual base classes.  */ | 
| 287 | #define ctor_identifier                        cp_global_trees[CPTI_CTOR_IDENTIFIER] | 
| 288 | /* The name of a constructor that constructs virtual base classes.  */ | 
| 289 | #define complete_ctor_identifier        cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER] | 
| 290 | /* The name of a constructor that does not construct virtual base classes.  */ | 
| 291 | #define base_ctor_identifier                cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER] | 
| 292 | /* The name of a destructor that takes an in-charge parameter to | 
| 293 |    decide whether or not to destroy virtual base classes.  */ | 
| 294 | #define dtor_identifier                        cp_global_trees[CPTI_DTOR_IDENTIFIER] | 
| 295 | /* The name of a destructor that destroys virtual base classes.  */ | 
| 296 | #define complete_dtor_identifier        cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER] | 
| 297 | /* The name of a destructor that does not destroy virtual base | 
| 298 |    classes.  */ | 
| 299 | #define base_dtor_identifier                cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER] | 
| 300 | /* The name of a destructor that destroys virtual base classes, and | 
| 301 |    then deletes the entire object.  */ | 
| 302 | #define deleting_dtor_identifier        cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER] | 
| 303 |  | 
| 304 | /* The name used for conversion operators -- but note that actual | 
| 305 |    conversion functions use special identifiers outside the identifier | 
| 306 |    table.  */ | 
| 307 | #define conv_op_identifier                cp_global_trees[CPTI_CONV_OP_IDENTIFIER] | 
| 308 |  | 
| 309 | #define delta_identifier                cp_global_trees[CPTI_DELTA_IDENTIFIER] | 
| 310 | #define in_charge_identifier                cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER] | 
| 311 | /* The name of the parameter that contains a pointer to the VTT to use | 
| 312 |    for this subobject constructor or destructor.  */ | 
| 313 | #define vtt_parm_identifier                cp_global_trees[CPTI_VTT_PARM_IDENTIFIER] | 
| 314 | #define as_base_identifier                cp_global_trees[CPTI_AS_BASE_IDENTIFIER] | 
| 315 | #define this_identifier                        cp_global_trees[CPTI_THIS_IDENTIFIER] | 
| 316 | #define pfn_identifier                        cp_global_trees[CPTI_PFN_IDENTIFIER] | 
| 317 | #define vptr_identifier                        cp_global_trees[CPTI_VPTR_IDENTIFIER] | 
| 318 | /* The name of the ::, std & anon namespaces.  */ | 
| 319 | #define global_identifier                cp_global_trees[CPTI_GLOBAL_IDENTIFIER] | 
| 320 | #define anon_identifier                        cp_global_trees[CPTI_ANON_IDENTIFIER] | 
| 321 | /* auto and declspec(auto) identifiers.  */ | 
| 322 | #define auto_identifier                        cp_global_trees[CPTI_AUTO_IDENTIFIER] | 
| 323 | #define decltype_auto_identifier        cp_global_trees[CPTI_DECLTYPE_AUTO_IDENTIFIER] | 
| 324 | #define init_list_identifier                cp_global_trees[CPTI_INIT_LIST_IDENTIFIER] | 
| 325 | #define for_range__identifier                cp_global_trees[CPTI_FOR_RANGE__IDENTIFIER] | 
| 326 | #define for_begin__identifier                cp_global_trees[CPTI_FOR_BEGIN__IDENTIFIER] | 
| 327 | #define for_end__identifier                cp_global_trees[CPTI_FOR_END__IDENTIFIER] | 
| 328 | #define for_range_identifier                cp_global_trees[CPTI_FOR_RANGE_IDENTIFIER] | 
| 329 | #define for_begin_identifier                cp_global_trees[CPTI_FOR_BEGIN_IDENTIFIER] | 
| 330 | #define for_end_identifier                cp_global_trees[CPTI_FOR_END_IDENTIFIER] | 
| 331 | #define abi_tag_identifier                cp_global_trees[CPTI_ABI_TAG_IDENTIFIER] | 
| 332 | #define aligned_identifier                cp_global_trees[CPTI_ALIGNED_IDENTIFIER] | 
| 333 | #define begin_identifier                cp_global_trees[CPTI_BEGIN_IDENTIFIER] | 
| 334 | #define end_identifier                        cp_global_trees[CPTI_END_IDENTIFIER] | 
| 335 | #define get__identifier                        cp_global_trees[CPTI_GET_IDENTIFIER] | 
| 336 | #define gnu_identifier                        cp_global_trees[CPTI_GNU_IDENTIFIER] | 
| 337 | #define tuple_element_identifier        cp_global_trees[CPTI_TUPLE_ELEMENT_IDENTIFIER] | 
| 338 | #define tuple_size_identifier                cp_global_trees[CPTI_TUPLE_SIZE_IDENTIFIER] | 
| 339 | #define type_identifier                        cp_global_trees[CPTI_TYPE_IDENTIFIER] | 
| 340 | #define value_identifier                cp_global_trees[CPTI_VALUE_IDENTIFIER] | 
| 341 | #define fun_identifier                        cp_global_trees[CPTI_FUN_IDENTIFIER] | 
| 342 | #define closure_identifier                cp_global_trees[CPTI_CLOSURE_IDENTIFIER] | 
| 343 | #define heap_uninit_identifier                cp_global_trees[CPTI_HEAP_UNINIT_IDENTIFIER] | 
| 344 | #define heap_identifier                        cp_global_trees[CPTI_HEAP_IDENTIFIER] | 
| 345 | #define heap_deleted_identifier                cp_global_trees[CPTI_HEAP_DELETED_IDENTIFIER] | 
| 346 | #define heap_vec_uninit_identifier        cp_global_trees[CPTI_HEAP_VEC_UNINIT_IDENTIFIER] | 
| 347 | #define heap_vec_identifier                cp_global_trees[CPTI_HEAP_VEC_IDENTIFIER] | 
| 348 | #define omp_identifier                        cp_global_trees[CPTI_OMP_IDENTIFIER] | 
| 349 | #define internal_identifier                cp_global_trees[CPTI_INTERNAL_IDENTIFIER] | 
| 350 | #define lang_name_c                        cp_global_trees[CPTI_LANG_NAME_C] | 
| 351 | #define lang_name_cplusplus                cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS] | 
| 352 |  | 
| 353 | /* Exception specifiers used for throw(), noexcept(true), | 
| 354 |    noexcept(false) and deferred noexcept.  We rely on these being | 
| 355 |    uncloned.  */ | 
| 356 | #define empty_except_spec                cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC] | 
| 357 | #define noexcept_true_spec                cp_global_trees[CPTI_NOEXCEPT_TRUE_SPEC] | 
| 358 | #define noexcept_false_spec                cp_global_trees[CPTI_NOEXCEPT_FALSE_SPEC] | 
| 359 | #define noexcept_deferred_spec                cp_global_trees[CPTI_NOEXCEPT_DEFERRED_SPEC] | 
| 360 |  | 
| 361 | /* Exception handling function declarations.  */ | 
| 362 | #define terminate_fn                        cp_global_trees[CPTI_TERMINATE_FN] | 
| 363 | #define call_unexpected_fn                cp_global_trees[CPTI_CALL_UNEXPECTED_FN] | 
| 364 | #define call_terminate_fn                cp_global_trees[CPTI_CALL_TERMINATE_FN] | 
| 365 | #define get_exception_ptr_fn                cp_global_trees[CPTI_GET_EXCEPTION_PTR_FN] | 
| 366 | #define begin_catch_fn                        cp_global_trees[CPTI_BEGIN_CATCH_FN] | 
| 367 | #define end_catch_fn                        cp_global_trees[CPTI_END_CATCH_FN] | 
| 368 | #define allocate_exception_fn                cp_global_trees[CPTI_ALLOCATE_EXCEPTION_FN] | 
| 369 | #define free_exception_fn                cp_global_trees[CPTI_FREE_EXCEPTION_FN] | 
| 370 | #define throw_fn                        cp_global_trees[CPTI_THROW_FN] | 
| 371 | #define rethrow_fn                        cp_global_trees[CPTI_RETHROW_FN] | 
| 372 |  | 
| 373 | /* The type of the function-pointer argument to "std::atexit".  */ | 
| 374 | #define atexit_fn_ptr_type_node         cp_global_trees[CPTI_ATEXIT_FN_PTR_TYPE] | 
| 375 |  | 
| 376 | /* A pointer to `std::atexit'.  */ | 
| 377 | #define atexit_node                        cp_global_trees[CPTI_ATEXIT] | 
| 378 |  | 
| 379 | /* A pointer to `__cxa_thread_atexit'.  */ | 
| 380 | #define thread_atexit_node                cp_global_trees[CPTI_THREAD_ATEXIT] | 
| 381 |  | 
| 382 | /* A pointer to `__dso_handle'.  */ | 
| 383 | #define dso_handle_node                        cp_global_trees[CPTI_DSO_HANDLE] | 
| 384 |  | 
| 385 | /* The declaration of the dynamic_cast runtime.  */ | 
| 386 | #define dynamic_cast_node                cp_global_trees[CPTI_DCAST] | 
| 387 |  | 
| 388 | /* The type of a destructor, passed to __cxa_atexit, __cxa_thread_atexit | 
| 389 |    or __cxa_throw.  */ | 
| 390 | #define cleanup_type                        cp_global_trees[CPTI_CLEANUP_TYPE] | 
| 391 |  | 
| 392 | /* The type of the vtt parameter passed to subobject constructors and | 
| 393 |    destructors.  */ | 
| 394 | #define vtt_parm_type                        cp_global_trees[CPTI_VTT_PARM_TYPE] | 
| 395 |  | 
| 396 | /* A node which matches any template argument.  */ | 
| 397 | #define any_targ_node                        cp_global_trees[CPTI_ANY_TARG] | 
| 398 |  | 
| 399 | /* Node to indicate default access. This must be distinct from the | 
| 400 |    access nodes in tree.h.  */ | 
| 401 |  | 
| 402 | #define access_default_node                null_node | 
| 403 |  | 
| 404 | #include "name-lookup.h" | 
| 405 |  | 
| 406 | /* Usage of TREE_LANG_FLAG_?: | 
| 407 |    0: IDENTIFIER_KIND_BIT_0 (in IDENTIFIER_NODE) | 
| 408 |       NEW_EXPR_USE_GLOBAL (in NEW_EXPR). | 
| 409 |       COND_EXPR_IS_VEC_DELETE (in COND_EXPR). | 
| 410 |       DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR). | 
| 411 |       CLEANUP_P (in TRY_BLOCK) | 
| 412 |       AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR) | 
| 413 |       PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF, SCOPE_REF) | 
| 414 |       PAREN_STRING_LITERAL_P (in STRING_CST) | 
| 415 |       CP_DECL_THREAD_LOCAL_P (in VAR_DECL) | 
| 416 |       KOENIG_LOOKUP_P (in CALL_EXPR) | 
| 417 |       STATEMENT_LIST_NO_SCOPE (in STATEMENT_LIST). | 
| 418 |       EXPR_STMT_STMT_EXPR_RESULT (in EXPR_STMT) | 
| 419 |       STMT_EXPR_NO_SCOPE (in STMT_EXPR) | 
| 420 |       BIND_EXPR_TRY_BLOCK (in BIND_EXPR) | 
| 421 |       TYPENAME_IS_ENUM_P (in TYPENAME_TYPE) | 
| 422 |       OMP_FOR_GIMPLIFYING_P (in OMP_FOR, OMP_SIMD, OMP_DISTRIBUTE, | 
| 423 |                              and OMP_TASKLOOP) | 
| 424 |       BASELINK_QUALIFIED_P (in BASELINK) | 
| 425 |       TARGET_EXPR_IMPLICIT_P (in TARGET_EXPR) | 
| 426 |       TEMPLATE_PARM_PARAMETER_PACK (in TEMPLATE_PARM_INDEX) | 
| 427 |       ATTR_IS_DEPENDENT (in the TREE_LIST for an attribute) | 
| 428 |       ABI_TAG_IMPLICIT (in the TREE_LIST for the argument of abi_tag) | 
| 429 |       LAMBDA_CAPTURE_EXPLICIT_P (in a TREE_LIST in LAMBDA_EXPR_CAPTURE_LIST) | 
| 430 |       PARENTHESIZED_LIST_P (in the TREE_LIST for a parameter-declaration-list) | 
| 431 |       CONSTRUCTOR_IS_DIRECT_INIT (in CONSTRUCTOR) | 
| 432 |       DECLTYPE_FOR_LAMBDA_CAPTURE (in DECLTYPE_TYPE) | 
| 433 |       VEC_INIT_EXPR_IS_CONSTEXPR (in VEC_INIT_EXPR) | 
| 434 |       DECL_OVERRIDE_P (in FUNCTION_DECL) | 
| 435 |       IMPLICIT_CONV_EXPR_DIRECT_INIT (in IMPLICIT_CONV_EXPR) | 
| 436 |       TRANSACTION_EXPR_IS_STMT (in TRANSACTION_EXPR) | 
| 437 |       CONVERT_EXPR_VBASE_PATH (in CONVERT_EXPR) | 
| 438 |       PACK_EXPANSION_LOCAL_P (in *_PACK_EXPANSION) | 
| 439 |       TINFO_HAS_ACCESS_ERRORS (in TEMPLATE_INFO) | 
| 440 |       SIZEOF_EXPR_TYPE_P (in SIZEOF_EXPR) | 
| 441 |       COMPOUND_REQ_NOEXCEPT_P (in COMPOUND_REQ) | 
| 442 |       BLOCK_OUTER_CURLY_BRACE_P (in BLOCK) | 
| 443 |       FOLD_EXPR_MODIFY_P (*_FOLD_EXPR) | 
| 444 |       IF_STMT_CONSTEXPR_P (IF_STMT) | 
| 445 |       DECL_NAMESPACE_INLINE_P (in NAMESPACE_DECL) | 
| 446 |       SWITCH_STMT_ALL_CASES_P (in SWITCH_STMT) | 
| 447 |       REINTERPRET_CAST_P (in NOP_EXPR) | 
| 448 |       ALIGNOF_EXPR_STD_P (in ALIGNOF_EXPR) | 
| 449 |       OVL_DEDUP_P (in OVERLOAD) | 
| 450 |       INIT_EXPR_NRV_P (in INIT_EXPR) | 
| 451 |       ATOMIC_CONSTR_MAP_INSTANTIATED_P (in ATOMIC_CONSTR) | 
| 452 |       contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT) | 
| 453 |       RETURN_EXPR_LOCAL_ADDR_P (in RETURN_EXPR) | 
| 454 |       PACK_INDEX_PARENTHESIZED_P (in PACK_INDEX_*) | 
| 455 |    1: IDENTIFIER_KIND_BIT_1 (in IDENTIFIER_NODE) | 
| 456 |       TI_PENDING_TEMPLATE_FLAG. | 
| 457 |       TEMPLATE_PARMS_FOR_INLINE. | 
| 458 |       DELETE_EXPR_USE_VEC (in DELETE_EXPR). | 
| 459 |       ICS_ELLIPSIS_FLAG (in _CONV) | 
| 460 |       DECL_INITIALIZED_P (in VAR_DECL) | 
| 461 |       TYPENAME_IS_CLASS_P (in TYPENAME_TYPE) | 
| 462 |       STMT_IS_FULL_EXPR_P (in _STMT) | 
| 463 |       TARGET_EXPR_LIST_INIT_P (in TARGET_EXPR) | 
| 464 |       DECL_FINAL_P (in FUNCTION_DECL) | 
| 465 |       QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF) | 
| 466 |       CONSTRUCTOR_IS_DEPENDENT (in CONSTRUCTOR) | 
| 467 |       TINFO_USED_TEMPLATE_ID (in TEMPLATE_INFO) | 
| 468 |       PACK_EXPANSION_SIZEOF_P (in *_PACK_EXPANSION) | 
| 469 |       OVL_USING_P (in OVERLOAD) | 
| 470 |       IMPLICIT_CONV_EXPR_NONTYPE_ARG (in IMPLICIT_CONV_EXPR) | 
| 471 |       BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P (in BASELINK) | 
| 472 |       BIND_EXPR_VEC_DTOR (in BIND_EXPR) | 
| 473 |       ATOMIC_CONSTR_EXPR_FROM_CONCEPT_P (in ATOMIC_CONSTR) | 
| 474 |       STATIC_INIT_DECOMP_BASE_P (in the TREE_LIST for {static,tls}_aggregates) | 
| 475 |    2: IDENTIFIER_KIND_BIT_2 (in IDENTIFIER_NODE) | 
| 476 |       ICS_THIS_FLAG (in _CONV) | 
| 477 |       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL) | 
| 478 |       STATEMENT_LIST_TRY_BLOCK (in STATEMENT_LIST) | 
| 479 |       TYPENAME_IS_RESOLVING_P (in TYPENAME_TYPE) | 
| 480 |       TARGET_EXPR_DIRECT_INIT_P (in TARGET_EXPR) | 
| 481 |       FNDECL_USED_AUTO (in FUNCTION_DECL) | 
| 482 |       DECLTYPE_FOR_LAMBDA_PROXY (in DECLTYPE_TYPE) | 
| 483 |       REF_PARENTHESIZED_P (in COMPONENT_REF, INDIRECT_REF, SCOPE_REF, | 
| 484 |                            VIEW_CONVERT_EXPR, PAREN_EXPR) | 
| 485 |       AGGR_INIT_ZERO_FIRST (in AGGR_INIT_EXPR) | 
| 486 |       CONSTRUCTOR_MUTABLE_POISON (in CONSTRUCTOR) | 
| 487 |       OVL_HIDDEN_P (in OVERLOAD) | 
| 488 |       IF_STMT_CONSTEVAL_P (in IF_STMT) | 
| 489 |       SWITCH_STMT_NO_BREAK_P (in SWITCH_STMT) | 
| 490 |       LAMBDA_EXPR_CAPTURE_OPTIMIZED (in LAMBDA_EXPR) | 
| 491 |       IMPLICIT_CONV_EXPR_BRACED_INIT (in IMPLICIT_CONV_EXPR) | 
| 492 |       PACK_EXPANSION_AUTO_P (in *_PACK_EXPANSION) | 
| 493 |       contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT) | 
| 494 |       STATIC_INIT_DECOMP_NONBASE_P (in the TREE_LIST | 
| 495 |                                     for {static,tls}_aggregates) | 
| 496 |    3: IMPLICIT_RVALUE_P (in NON_LVALUE_EXPR or STATIC_CAST_EXPR) | 
| 497 |       ICS_BAD_FLAG (in _CONV) | 
| 498 |       FN_TRY_BLOCK_P (in TRY_BLOCK) | 
| 499 |       BIND_EXPR_BODY_BLOCK (in BIND_EXPR) | 
| 500 |       CALL_EXPR_ORDERED_ARGS (in CALL_EXPR, AGGR_INIT_EXPR) | 
| 501 |       DECLTYPE_FOR_REF_CAPTURE (in DECLTYPE_TYPE) | 
| 502 |       CONSTRUCTOR_C99_COMPOUND_LITERAL (in CONSTRUCTOR) | 
| 503 |       OVL_NESTED_P (in OVERLOAD) | 
| 504 |       DECL_MODULE_EXPORT_P (in _DECL) | 
| 505 |       PACK_EXPANSION_FORCE_EXTRA_ARGS_P (in *_PACK_EXPANSION) | 
| 506 |       LAMBDA_EXPR_STATIC_P (in LAMBDA_EXPR) | 
| 507 |       TARGET_EXPR_ELIDING_P (in TARGET_EXPR) | 
| 508 |       contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT) | 
| 509 |    4: IDENTIFIER_MARKED (IDENTIFIER_NODEs) | 
| 510 |       TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR, | 
| 511 |           CALL_EXPR, or FIELD_DECL). | 
| 512 |       DECL_TINFO_P (in VAR_DECL, TYPE_DECL) | 
| 513 |       FUNCTION_REF_QUALIFIED (in FUNCTION_TYPE, METHOD_TYPE) | 
| 514 |       OVL_LOOKUP_P (in OVERLOAD) | 
| 515 |       LOOKUP_FOUND_P (in RECORD_TYPE, UNION_TYPE, ENUMERAL_TYPE, NAMESPACE_DECL) | 
| 516 |       FNDECL_MANIFESTLY_CONST_EVALUATED (in FUNCTION_DECL) | 
| 517 |       TARGET_EXPR_INTERNAL_P (in TARGET_EXPR) | 
| 518 |    5: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE) | 
| 519 |       FUNCTION_RVALUE_QUALIFIED (in FUNCTION_TYPE, METHOD_TYPE) | 
| 520 |       CALL_EXPR_REVERSE_ARGS (in CALL_EXPR, AGGR_INIT_EXPR) | 
| 521 |       CONSTRUCTOR_PLACEHOLDER_BOUNDARY (in CONSTRUCTOR) | 
| 522 |       OVL_EXPORT_P (in OVERLOAD) | 
| 523 |       DECL_NTTP_OBJECT_P (in VAR_DECL) | 
| 524 |    6: TYPE_MARKED_P (in _TYPE) | 
| 525 |       DECL_NONTRIVIALLY_INITIALIZED_P (in VAR_DECL) | 
| 526 |       RANGE_FOR_IVDEP (in RANGE_FOR_STMT) | 
| 527 |       CALL_EXPR_OPERATOR_SYNTAX (in CALL_EXPR, AGGR_INIT_EXPR) | 
| 528 |       CONSTRUCTOR_IS_DESIGNATED_INIT (in CONSTRUCTOR) | 
| 529 |       OVL_NAME_INDEPENDENT_DECL_P (in OVERLOAD) | 
| 530 |  | 
| 531 |    Usage of TYPE_LANG_FLAG_?: | 
| 532 |    0: TYPE_DEPENDENT_P | 
| 533 |    1: TYPE_HAS_USER_CONSTRUCTOR. | 
| 534 |    2: TYPE_HAS_LATE_RETURN_TYPE (in FUNCTION_TYPE, METHOD_TYPE) | 
| 535 |       TYPE_PTRMEMFUNC_FLAG (in RECORD_TYPE) | 
| 536 |    4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR | 
| 537 |    5: CLASS_TYPE_P (in RECORD_TYPE and UNION_TYPE) | 
| 538 |       ENUM_FIXED_UNDERLYING_TYPE_P (in ENUMERAL_TYPE) | 
| 539 |       AUTO_IS_DECLTYPE (in TEMPLATE_TYPE_PARM) | 
| 540 |       TEMPLATE_TEMPLATE_PARM_SIMPLE_P (in TEMPLATE_TEMPLATE_PARM) | 
| 541 |    6: TYPE_DEPENDENT_P_VALID | 
| 542 |  | 
| 543 |    Usage of DECL_LANG_FLAG_?: | 
| 544 |    0: DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL) | 
| 545 |       DECL_LOCAL_DECL_P (in FUNCTION_DECL, VAR_DECL) | 
| 546 |       DECL_MUTABLE_P (in FIELD_DECL) | 
| 547 |       DECL_DEPENDENT_P (in USING_DECL) | 
| 548 |       LABEL_DECL_BREAK (in LABEL_DECL) | 
| 549 |    1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL). | 
| 550 |       DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL) | 
| 551 |       DECL_MEMBER_TEMPLATE_P (in TEMPLATE_DECL) | 
| 552 |       USING_DECL_TYPENAME_P (in USING_DECL) | 
| 553 |       DECL_VLA_CAPTURE_P (in FIELD_DECL) | 
| 554 |       DECL_ARRAY_PARAMETER_P (in PARM_DECL) | 
| 555 |       LABEL_DECL_CONTINUE (in LABEL_DECL) | 
| 556 |    2: DECL_THIS_EXTERN (in VAR_DECL, FUNCTION_DECL or PARM_DECL) | 
| 557 |       DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL) | 
| 558 |       DECL_CONSTRAINT_VAR_P (in a PARM_DECL) | 
| 559 |       DECL_INSTANTIATING_NSDMI_P (in a FIELD_DECL) | 
| 560 |       USING_DECL_UNRELATED_P (in USING_DECL) | 
| 561 |    3: DECL_IN_AGGR_P. | 
| 562 |    4: DECL_C_BIT_FIELD (in a FIELD_DECL) | 
| 563 |       DECL_ANON_UNION_VAR_P (in a VAR_DECL) | 
| 564 |       DECL_SELF_REFERENCE_P (in a TYPE_DECL) | 
| 565 |       DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL) | 
| 566 |       DECL_UNINSTANIATED_TEMPLATE_FRIEND_P (in TEMPLATE_DECL) | 
| 567 |    5: DECL_INTERFACE_KNOWN. | 
| 568 |    6: DECL_THIS_STATIC (in VAR_DECL, FUNCTION_DECL or PARM_DECL) | 
| 569 |       DECL_FIELD_IS_BASE (in FIELD_DECL) | 
| 570 |       TYPE_DECL_ALIAS_P (in TYPE_DECL) | 
| 571 |    7: DECL_THUNK_P (in a member FUNCTION_DECL) | 
| 572 |       DECL_NORMAL_CAPTURE_P (in FIELD_DECL) | 
| 573 |       DECL_DECLARED_CONSTINIT_P (in VAR_DECL) | 
| 574 |    8: DECL_DECLARED_CONSTEXPR_P (in VAR_DECL, FUNCTION_DECL) | 
| 575 |  | 
| 576 |    Usage of language-independent fields in a language-dependent manner: | 
| 577 |  | 
| 578 |    TYPE_ALIAS_SET | 
| 579 |      This field is used by TYPENAME_TYPEs, TEMPLATE_TYPE_PARMs, and so | 
| 580 |      forth as a substitute for the mark bits provided in `lang_type'. | 
| 581 |      At present, only the six low-order bits are used. | 
| 582 |  | 
| 583 |    TYPE_LANG_SLOT_1 | 
| 584 |      For a FUNCTION_TYPE or METHOD_TYPE, this is TYPE_RAISES_EXCEPTIONS. | 
| 585 |      For a POINTER_TYPE (to a METHOD_TYPE), this is TYPE_PTRMEMFUNC_TYPE. | 
| 586 |      For an ENUMERAL_TYPE, BOUND_TEMPLATE_TEMPLATE_PARM_TYPE, | 
| 587 |      RECORD_TYPE or UNION_TYPE this is TYPE_TEMPLATE_INFO, | 
| 588 |  | 
| 589 |   BINFO_VIRTUALS | 
| 590 |      For a binfo, this is a TREE_LIST.  There is an entry for each | 
| 591 |      virtual function declared either in BINFO or its direct and | 
| 592 |      indirect primary bases. | 
| 593 |  | 
| 594 |      The BV_DELTA of each node gives the amount by which to adjust the | 
| 595 |      `this' pointer when calling the function.  If the method is an | 
| 596 |      overridden version of a base class method, then it is assumed | 
| 597 |      that, prior to adjustment, the this pointer points to an object | 
| 598 |      of the base class. | 
| 599 |  | 
| 600 |      The BV_VCALL_INDEX of each node, if non-NULL, gives the vtable | 
| 601 |      index of the vcall offset for this entry. | 
| 602 |  | 
| 603 |      The BV_FN is the declaration for the virtual function itself. | 
| 604 |  | 
| 605 |      If BV_LOST_PRIMARY is set, it means that this entry is for a lost | 
| 606 |      primary virtual base and can be left null in the vtable. | 
| 607 |  | 
| 608 |    BINFO_VTABLE | 
| 609 |      This is an expression with POINTER_TYPE that gives the value | 
| 610 |      to which the vptr should be initialized.  Use get_vtbl_decl_for_binfo | 
| 611 |      to extract the VAR_DECL for the complete vtable. | 
| 612 |  | 
| 613 |    DECL_VINDEX | 
| 614 |      This field is NULL for a non-virtual function.  For a virtual | 
| 615 |      function, it is eventually set to an INTEGER_CST indicating the | 
| 616 |      index in the vtable at which this function can be found.  When | 
| 617 |      a virtual function is declared, but before it is known what | 
| 618 |      function is overridden, this field is the error_mark_node. | 
| 619 |  | 
| 620 |      Temporarily, it may be set to a TREE_LIST whose TREE_VALUE is | 
| 621 |      the virtual function this one overrides, and whose TREE_CHAIN is | 
| 622 |      the old DECL_VINDEX.  */ | 
| 623 |  | 
| 624 | /* Language-specific tree checkers.  */ | 
| 625 |  | 
| 626 | #define VAR_OR_FUNCTION_DECL_CHECK(NODE) \ | 
| 627 |   TREE_CHECK2(NODE,VAR_DECL,FUNCTION_DECL) | 
| 628 |  | 
| 629 | #define TYPE_FUNCTION_OR_TEMPLATE_DECL_CHECK(NODE) \ | 
| 630 |   TREE_CHECK3(NODE,TYPE_DECL,TEMPLATE_DECL,FUNCTION_DECL) | 
| 631 |  | 
| 632 | #define TYPE_FUNCTION_OR_TEMPLATE_DECL_P(NODE) \ | 
| 633 |   (TREE_CODE (NODE) == TYPE_DECL || TREE_CODE (NODE) == TEMPLATE_DECL \ | 
| 634 |    || TREE_CODE (NODE) == FUNCTION_DECL) | 
| 635 |  | 
| 636 | #define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \ | 
| 637 |   TREE_CHECK3(NODE,VAR_DECL,FUNCTION_DECL,PARM_DECL) | 
| 638 |  | 
| 639 | #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \ | 
| 640 |   TREE_CHECK4(NODE,VAR_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL) | 
| 641 |  | 
| 642 | #define VAR_TEMPL_TYPE_FIELD_OR_FUNCTION_DECL_CHECK(NODE) \ | 
| 643 |   TREE_CHECK5(NODE,VAR_DECL,FIELD_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL) | 
| 644 |  | 
| 645 | #define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \ | 
| 646 |   TREE_CHECK(NODE,BOUND_TEMPLATE_TEMPLATE_PARM) | 
| 647 |  | 
| 648 | #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) | 
| 649 |  | 
| 650 | /* Returns t iff the node can have a TEMPLATE_INFO field.  */ | 
| 651 |  | 
| 652 | inline tree | 
| 653 | template_info_decl_check (const_tree t, const char* f, int l, const char* fn) | 
| 654 | { | 
| 655 |   switch (TREE_CODE (t)) | 
| 656 |     { | 
| 657 |     case VAR_DECL: | 
| 658 |     case FUNCTION_DECL: | 
| 659 |     case FIELD_DECL: | 
| 660 |     case TYPE_DECL: | 
| 661 |     case CONCEPT_DECL: | 
| 662 |     case TEMPLATE_DECL: | 
| 663 |       return const_cast<tree>(t); | 
| 664 |     default: | 
| 665 |       break; | 
| 666 |     } | 
| 667 |   tree_check_failed (t, f, l, fn, | 
| 668 |                      VAR_DECL, FUNCTION_DECL, FIELD_DECL, TYPE_DECL, | 
| 669 |                      CONCEPT_DECL, TEMPLATE_DECL, 0); | 
| 670 |   gcc_unreachable (); | 
| 671 | } | 
| 672 |  | 
| 673 | #define TEMPLATE_INFO_DECL_CHECK(NODE) \ | 
| 674 |   template_info_decl_check ((NODE), __FILE__, __LINE__, __FUNCTION__) | 
| 675 |  | 
| 676 | #define THUNK_FUNCTION_CHECK(NODE) __extension__                        \ | 
| 677 | ({  __typeof (NODE) const __t = (NODE);                                        \ | 
| 678 |     if (TREE_CODE (__t) != FUNCTION_DECL || !__t->decl_common.lang_specific \ | 
| 679 |         || !__t->decl_common.lang_specific->u.fn.thunk_p)                \ | 
| 680 |       tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0);        \ | 
| 681 |      __t; }) | 
| 682 |  | 
| 683 | #define DECL_TEMPLATE_PARM_CHECK(NODE) \ | 
| 684 |   decl_template_parm_check ((NODE), __FILE__, __LINE__, __FUNCTION__) | 
| 685 |  | 
| 686 | #else /* ENABLE_TREE_CHECKING */ | 
| 687 |  | 
| 688 | #define TEMPLATE_INFO_DECL_CHECK(NODE) (NODE) | 
| 689 | #define THUNK_FUNCTION_CHECK(NODE) (NODE) | 
| 690 | #define DECL_TEMPLATE_PARM_CHECK(NODE) (NODE) | 
| 691 |  | 
| 692 | #endif /* ENABLE_TREE_CHECKING */ | 
| 693 |  | 
| 694 | /* Language-dependent contents of an identifier.  */ | 
| 695 |  | 
| 696 | struct GTY(()) lang_identifier { | 
| 697 |   struct c_common_identifier c_common; | 
| 698 |   cxx_binding *bindings; | 
| 699 | }; | 
| 700 |  | 
| 701 | /* Return a typed pointer version of T if it designates a | 
| 702 |    C++ front-end identifier.  */ | 
| 703 | inline lang_identifier* | 
| 704 | identifier_p (tree t) | 
| 705 | { | 
| 706 |   if (TREE_CODE (t) == IDENTIFIER_NODE) | 
| 707 |     return (lang_identifier*) t; | 
| 708 |   return NULL; | 
| 709 | } | 
| 710 |  | 
| 711 | #define LANG_IDENTIFIER_CAST(NODE) \ | 
| 712 |         ((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE)) | 
| 713 |  | 
| 714 | struct GTY(()) template_parm_index { | 
| 715 |   struct tree_common common; | 
| 716 |   int index; | 
| 717 |   int level; | 
| 718 |   int orig_level; | 
| 719 |   tree decl; | 
| 720 | }; | 
| 721 |  | 
| 722 | struct GTY(()) ptrmem_cst { | 
| 723 |   struct tree_typed typed; | 
| 724 |   tree member; | 
| 725 |   location_t locus; | 
| 726 | }; | 
| 727 | typedef struct ptrmem_cst * ptrmem_cst_t; | 
| 728 |  | 
| 729 | #define CLEANUP_P(NODE)                TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE)) | 
| 730 |  | 
| 731 | #define BIND_EXPR_TRY_BLOCK(NODE) \ | 
| 732 |   TREE_LANG_FLAG_0 (BIND_EXPR_CHECK (NODE)) | 
| 733 |  | 
| 734 | /* This BIND_EXPR is from build_vec_delete_1.  */ | 
| 735 | #define BIND_EXPR_VEC_DTOR(NODE) \ | 
| 736 |   TREE_LANG_FLAG_1 (BIND_EXPR_CHECK (NODE)) | 
| 737 |  | 
| 738 | /* Used to mark the block around the member initializers and cleanups.  */ | 
| 739 | #define BIND_EXPR_BODY_BLOCK(NODE) \ | 
| 740 |   TREE_LANG_FLAG_3 (BIND_EXPR_CHECK (NODE)) | 
| 741 | #define FUNCTION_NEEDS_BODY_BLOCK(NODE) \ | 
| 742 |   (DECL_CONSTRUCTOR_P (NODE) || DECL_DESTRUCTOR_P (NODE) \ | 
| 743 |    || LAMBDA_FUNCTION_P (NODE)) | 
| 744 |  | 
| 745 | #define STATEMENT_LIST_NO_SCOPE(NODE) \ | 
| 746 |   TREE_LANG_FLAG_0 (STATEMENT_LIST_CHECK (NODE)) | 
| 747 | #define STATEMENT_LIST_TRY_BLOCK(NODE) \ | 
| 748 |   TREE_LANG_FLAG_2 (STATEMENT_LIST_CHECK (NODE)) | 
| 749 |  | 
| 750 | /* Mark the outer curly brace BLOCK.  */ | 
| 751 | #define BLOCK_OUTER_CURLY_BRACE_P(NODE)        TREE_LANG_FLAG_0 (BLOCK_CHECK (NODE)) | 
| 752 |  | 
| 753 | /* Nonzero if this statement should be considered a full-expression, | 
| 754 |    i.e., if temporaries created during this statement should have | 
| 755 |    their destructors run at the end of this statement.  */ | 
| 756 | #define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE)) | 
| 757 |  | 
| 758 | /* Marks the result of a statement expression.  */ | 
| 759 | #define EXPR_STMT_STMT_EXPR_RESULT(NODE) \ | 
| 760 |   TREE_LANG_FLAG_0 (EXPR_STMT_CHECK (NODE)) | 
| 761 |  | 
| 762 | /* Nonzero if this statement-expression does not have an associated scope.  */ | 
| 763 | #define STMT_EXPR_NO_SCOPE(NODE) \ | 
| 764 |    TREE_LANG_FLAG_0 (STMT_EXPR_CHECK (NODE)) | 
| 765 |  | 
| 766 | #define COND_EXPR_IS_VEC_DELETE(NODE) \ | 
| 767 |   TREE_LANG_FLAG_0 (COND_EXPR_CHECK (NODE)) | 
| 768 |  | 
| 769 | /* Nonzero if this NOP_EXPR is a reinterpret_cast.  Such conversions | 
| 770 |    are not constexprs.  Other NOP_EXPRs are.  */ | 
| 771 | #define REINTERPRET_CAST_P(NODE)                \ | 
| 772 |   TREE_LANG_FLAG_0 (NOP_EXPR_CHECK (NODE)) | 
| 773 |  | 
| 774 | /* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual | 
| 775 |    sense of `same'.  */ | 
| 776 | #define same_type_p(TYPE1, TYPE2) \ | 
| 777 |   comptypes ((TYPE1), (TYPE2), COMPARE_STRICT) | 
| 778 |  | 
| 779 | /* Returns nonzero iff NODE is a declaration for the global function | 
| 780 |    `main'.  */ | 
| 781 | #define DECL_MAIN_ANY_P(NODE)                                \ | 
| 782 |    (DECL_EXTERN_C_FUNCTION_P (NODE)                        \ | 
| 783 |     && DECL_NAME (NODE) != NULL_TREE                        \ | 
| 784 |     && MAIN_NAME_P (DECL_NAME (NODE))) | 
| 785 |  | 
| 786 | /* Nonzero iff NODE is a declaration for `int main', or we are hosted.  */ | 
| 787 | #define DECL_MAIN_FREESTANDING_P(NODE)                                \ | 
| 788 |   (DECL_MAIN_ANY_P(NODE)                                        \ | 
| 789 |    && (flag_hosted                                                \ | 
| 790 |        || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (NODE)))        \ | 
| 791 |           == integer_type_node)) | 
| 792 |  | 
| 793 | /* Nonzero iff NODE is a declaration for `main', and we are hosted.  */ | 
| 794 | #define DECL_MAIN_P(NODE) (DECL_MAIN_ANY_P(NODE) && flag_hosted) | 
| 795 |  | 
| 796 | /* Lookup walker marking.  */ | 
| 797 | #define LOOKUP_SEEN_P(NODE) TREE_VISITED (NODE) | 
| 798 | #define LOOKUP_FOUND_P(NODE) \ | 
| 799 |   TREE_LANG_FLAG_4 (TREE_CHECK4 (NODE,RECORD_TYPE,UNION_TYPE,ENUMERAL_TYPE,\ | 
| 800 |                                  NAMESPACE_DECL)) | 
| 801 |  | 
| 802 | /* These two accessors should only be used by OVL manipulators. | 
| 803 |    Other users should use iterators and convenience functions.  */ | 
| 804 | #define OVL_FUNCTION(NODE) \ | 
| 805 |   (((struct tree_overload*)OVERLOAD_CHECK (NODE))->function) | 
| 806 | #define OVL_CHAIN(NODE) \ | 
| 807 |   (((struct tree_overload*)OVERLOAD_CHECK (NODE))->common.chain) | 
| 808 |  | 
| 809 | /* If set, this or a subsequent overload contains decls that need deduping.  */ | 
| 810 | #define OVL_DEDUP_P(NODE)        TREE_LANG_FLAG_0 (OVERLOAD_CHECK (NODE)) | 
| 811 | /* If set, this was imported in a using declaration.   */ | 
| 812 | #define OVL_USING_P(NODE)        TREE_LANG_FLAG_1 (OVERLOAD_CHECK (NODE)) | 
| 813 | /* If set, this overload is a hidden decl.  */ | 
| 814 | #define OVL_HIDDEN_P(NODE)        TREE_LANG_FLAG_2 (OVERLOAD_CHECK (NODE)) | 
| 815 | /* If set, this overload contains a nested overload.  */ | 
| 816 | #define OVL_NESTED_P(NODE)        TREE_LANG_FLAG_3 (OVERLOAD_CHECK (NODE)) | 
| 817 | /* If set, this overload was constructed during lookup.  */ | 
| 818 | #define OVL_LOOKUP_P(NODE)        TREE_LANG_FLAG_4 (OVERLOAD_CHECK (NODE)) | 
| 819 | /* If set, this OVL_USING_P overload is exported.  */ | 
| 820 | #define OVL_EXPORT_P(NODE)        TREE_LANG_FLAG_5 (OVERLOAD_CHECK (NODE)) | 
| 821 | /* If set, this OVL_USING_P overload is in the module purview.  */ | 
| 822 | #define OVL_PURVIEW_P(NODE)        (OVERLOAD_CHECK (NODE)->base.public_flag) | 
| 823 | /* If set, this overload includes name-independent declarations.  */ | 
| 824 | #define OVL_NAME_INDEPENDENT_DECL_P(NODE) \ | 
| 825 |   TREE_LANG_FLAG_6 (OVERLOAD_CHECK (NODE)) | 
| 826 |  | 
| 827 | /* The first decl of an overload.  */ | 
| 828 | #define OVL_FIRST(NODE)        ovl_first (NODE) | 
| 829 | /* The name of the overload set.  */ | 
| 830 | #define OVL_NAME(NODE) DECL_NAME (OVL_FIRST (NODE)) | 
| 831 |  | 
| 832 | /* Whether this is a set of overloaded functions.  TEMPLATE_DECLS are | 
| 833 |    always wrapped in an OVERLOAD, so we don't need to check them | 
| 834 |    here.  */ | 
| 835 | #define OVL_P(NODE) \ | 
| 836 |   (TREE_CODE (NODE) == FUNCTION_DECL || TREE_CODE (NODE) == OVERLOAD) | 
| 837 | /* Whether this is a single member overload.  */ | 
| 838 | #define OVL_SINGLE_P(NODE) \ | 
| 839 |   (TREE_CODE (NODE) != OVERLOAD || !OVL_CHAIN (NODE)) | 
| 840 |  | 
| 841 | /* OVL_HIDDEN_P nodes come before other nodes.  */ | 
| 842 |  | 
| 843 | struct GTY(()) tree_overload { | 
| 844 |   struct tree_common common; | 
| 845 |   tree function; | 
| 846 | }; | 
| 847 |  | 
| 848 | /* Iterator for a 1 dimensional overload.  Permits iterating over the | 
| 849 |    outer level of a 2-d overload when explicitly enabled.  */ | 
| 850 |  | 
| 851 | class ovl_iterator { | 
| 852 |   tree ovl; | 
| 853 |   const bool allow_inner; /* Only used when checking.  */ | 
| 854 |  | 
| 855 |  public: | 
| 856 |   explicit ovl_iterator (tree o, bool allow = false) | 
| 857 |     : ovl (o), allow_inner (allow) | 
| 858 |   { | 
| 859 |   } | 
| 860 |  | 
| 861 |  public: | 
| 862 |   operator bool () const | 
| 863 |   { | 
| 864 |     return ovl; | 
| 865 |   } | 
| 866 |   ovl_iterator &operator++ () | 
| 867 |   { | 
| 868 |     ovl = TREE_CODE (ovl) != OVERLOAD ? NULL_TREE : OVL_CHAIN (ovl); | 
| 869 |     return *this; | 
| 870 |   } | 
| 871 |   tree operator* () const | 
| 872 |   { | 
| 873 |     tree fn = TREE_CODE (ovl) != OVERLOAD ? ovl : OVL_FUNCTION (ovl); | 
| 874 |  | 
| 875 |     /* Check this is not an unexpected 2-dimensional overload.  */ | 
| 876 |     gcc_checking_assert (allow_inner || TREE_CODE (fn) != OVERLOAD); | 
| 877 |  | 
| 878 |     return fn; | 
| 879 |   } | 
| 880 |   bool operator== (const ovl_iterator &o) const | 
| 881 |   { | 
| 882 |     return ovl == o.ovl; | 
| 883 |   } | 
| 884 |   tree get_using () const | 
| 885 |   { | 
| 886 |     gcc_checking_assert (using_p ()); | 
| 887 |     return ovl; | 
| 888 |   } | 
| 889 |  | 
| 890 |  public: | 
| 891 |   /* Whether this overload was introduced by a using decl.  */ | 
| 892 |   bool using_p () const | 
| 893 |   { | 
| 894 |     return (TREE_CODE (ovl) == USING_DECL | 
| 895 |             || (TREE_CODE (ovl) == OVERLOAD && OVL_USING_P (ovl))); | 
| 896 |   } | 
| 897 |   bool hidden_p () const | 
| 898 |   { | 
| 899 |     return TREE_CODE (ovl) == OVERLOAD && OVL_HIDDEN_P (ovl); | 
| 900 |   } | 
| 901 |   bool purview_p () const; | 
| 902 |   bool exporting_p () const; | 
| 903 |  | 
| 904 |  public: | 
| 905 |   tree remove_node (tree head) | 
| 906 |   { | 
| 907 |     return remove_node (head, node: ovl); | 
| 908 |   } | 
| 909 |   tree reveal_node (tree head) | 
| 910 |   { | 
| 911 |     return reveal_node (ovl: head, node: ovl); | 
| 912 |   } | 
| 913 |  | 
| 914 |  protected: | 
| 915 |   /* If we have a nested overload, point at the inner overload and | 
| 916 |      return the next link on the outer one.  */ | 
| 917 |   tree maybe_push () | 
| 918 |   { | 
| 919 |     tree r = NULL_TREE; | 
| 920 |  | 
| 921 |     if (ovl && TREE_CODE (ovl) == OVERLOAD && OVL_NESTED_P (ovl)) | 
| 922 |       { | 
| 923 |         r = OVL_CHAIN (ovl); | 
| 924 |         ovl = OVL_FUNCTION (ovl); | 
| 925 |       } | 
| 926 |     return r; | 
| 927 |   } | 
| 928 |   /* Restore an outer nested overload.  */ | 
| 929 |   void pop (tree outer) | 
| 930 |   { | 
| 931 |     gcc_checking_assert (!ovl); | 
| 932 |     ovl = outer; | 
| 933 |   } | 
| 934 |  | 
| 935 |  private: | 
| 936 |   /* We make these static functions to avoid the address of the | 
| 937 |      iterator escaping the local context.  */ | 
| 938 |   static tree remove_node (tree head, tree node); | 
| 939 |   static tree reveal_node (tree ovl, tree node); | 
| 940 | }; | 
| 941 |  | 
| 942 | /* Treat a tree as a range of ovl_iterator, e.g. | 
| 943 |    for (tree f : ovl_range (fns)) { ... }  */ | 
| 944 |  | 
| 945 | class ovl_range | 
| 946 | { | 
| 947 |   tree t; | 
| 948 |   bool allow; | 
| 949 | public: | 
| 950 |   explicit ovl_range (tree t, bool allow = false): t(t), allow(allow) { } | 
| 951 |   ovl_iterator begin() { return ovl_iterator (t, allow); } | 
| 952 |   ovl_iterator end() { return ovl_iterator (NULL_TREE, allow); } | 
| 953 | }; | 
| 954 |  | 
| 955 | /* Iterator over a (potentially) 2 dimensional overload, which is | 
| 956 |    produced by name lookup.  */ | 
| 957 |  | 
| 958 | class lkp_iterator : public ovl_iterator { | 
| 959 |   typedef ovl_iterator parent; | 
| 960 |  | 
| 961 |   tree outer; | 
| 962 |  | 
| 963 |  public: | 
| 964 |   explicit lkp_iterator (tree o) | 
| 965 |     : parent (o, true), outer (maybe_push ()) | 
| 966 |   { | 
| 967 |   } | 
| 968 |  | 
| 969 |  public: | 
| 970 |   lkp_iterator &operator++ () | 
| 971 |   { | 
| 972 |     bool repush = !outer; | 
| 973 |  | 
| 974 |     if (!parent::operator++ () && !repush) | 
| 975 |       { | 
| 976 |         pop (outer); | 
| 977 |         repush = true; | 
| 978 |       } | 
| 979 |  | 
| 980 |     if (repush) | 
| 981 |       outer = maybe_push (); | 
| 982 |  | 
| 983 |     return *this; | 
| 984 |   } | 
| 985 | }; | 
| 986 |  | 
| 987 | /* Treat a tree as a range of lkp_iterator, e.g. | 
| 988 |    for (tree f : lkp_range (fns)) { ... }  */ | 
| 989 |  | 
| 990 | class lkp_range | 
| 991 | { | 
| 992 |   tree t; | 
| 993 | public: | 
| 994 |   lkp_range (tree t): t(t) { } | 
| 995 |   lkp_iterator begin() { return lkp_iterator (t); } | 
| 996 |   lkp_iterator end() { return lkp_iterator (NULL_TREE); } | 
| 997 | }; | 
| 998 |  | 
| 999 | /* Iterator for a RAW_DATA_CST.  */ | 
| 1000 |  | 
| 1001 | class raw_data_iterator { | 
| 1002 |   tree t; | 
| 1003 |   unsigned int n; | 
| 1004 |  | 
| 1005 |  public: | 
| 1006 |   explicit raw_data_iterator (tree t, unsigned int n) | 
| 1007 |     : t (t), n (n) | 
| 1008 |   { | 
| 1009 |   } | 
| 1010 |  | 
| 1011 |   operator bool () const | 
| 1012 |   { | 
| 1013 |     return n < (unsigned) RAW_DATA_LENGTH (t); | 
| 1014 |   } | 
| 1015 |  | 
| 1016 |   raw_data_iterator &operator++ () | 
| 1017 |   { | 
| 1018 |     ++n; | 
| 1019 |     return *this; | 
| 1020 |   } | 
| 1021 |  | 
| 1022 |   tree operator* () const | 
| 1023 |   { | 
| 1024 |     return build_int_cst (TREE_TYPE (t), RAW_DATA_UCHAR_ELT (t, n)); | 
| 1025 |   } | 
| 1026 |  | 
| 1027 |   bool operator== (const raw_data_iterator &o) const | 
| 1028 |   { | 
| 1029 |     return t == o.t && n == o.n; | 
| 1030 |   } | 
| 1031 | }; | 
| 1032 |  | 
| 1033 | /* Treat a tree as a range of raw_data_iterator, e.g. | 
| 1034 |    for (tree f : raw_data_range (d)) { ... }  */ | 
| 1035 |  | 
| 1036 | class raw_data_range | 
| 1037 | { | 
| 1038 |   tree t; | 
| 1039 | public: | 
| 1040 |   raw_data_range (tree t) : t (t) { } | 
| 1041 |   raw_data_iterator begin () { return raw_data_iterator (t, 0); } | 
| 1042 |   raw_data_iterator end () | 
| 1043 |   { return raw_data_iterator (t, RAW_DATA_LENGTH (t)); } | 
| 1044 | }; | 
| 1045 |  | 
| 1046 | /* hash traits for declarations.  Hashes potential overload sets via | 
| 1047 |    DECL_NAME.  */ | 
| 1048 |  | 
| 1049 | struct named_decl_hash : ggc_remove <tree> { | 
| 1050 |   typedef tree value_type; /* A DECL or OVERLOAD  */ | 
| 1051 |   typedef tree compare_type; /* An identifier.  */ | 
| 1052 |  | 
| 1053 |   inline static hashval_t hash (const value_type decl); | 
| 1054 |   inline static bool equal (const value_type existing, compare_type candidate); | 
| 1055 |  | 
| 1056 |   static const bool empty_zero_p = true; | 
| 1057 |   static inline void mark_empty (value_type &p) {p = NULL_TREE;} | 
| 1058 |   static inline bool is_empty (value_type p) {return !p;} | 
| 1059 |  | 
| 1060 |   /* Nothing is deletable.  Everything is insertable.  */ | 
| 1061 |   static bool is_deleted (value_type) { return false; } | 
| 1062 |   static void mark_deleted (value_type) { gcc_unreachable (); } | 
| 1063 | }; | 
| 1064 |  | 
| 1065 | /* Simplified unique_ptr clone to release a tree vec on exit.  */ | 
| 1066 |  | 
| 1067 | class releasing_vec | 
| 1068 | { | 
| 1069 | public: | 
| 1070 |   typedef vec<tree, va_gc> vec_t; | 
| 1071 |  | 
| 1072 |   releasing_vec (vec_t *v): v(v) { } | 
| 1073 |   releasing_vec (): v(make_tree_vector ()) { } | 
| 1074 |  | 
| 1075 |   /* Copy ops are deliberately declared but not defined, | 
| 1076 |      copies must always be elided.  */ | 
| 1077 |   releasing_vec (const releasing_vec &); | 
| 1078 |   releasing_vec &operator= (const releasing_vec &); | 
| 1079 |  | 
| 1080 |   vec_t &operator* () const { return *v; } | 
| 1081 |   vec_t *operator-> () const { return v; } | 
| 1082 |   vec_t *get() const { return v; } | 
| 1083 |   operator vec_t *() const { return v; } | 
| 1084 |   vec_t ** operator& () { return &v; } | 
| 1085 |  | 
| 1086 |   /* Breaks pointer/value consistency for convenience.  This takes ptrdiff_t | 
| 1087 |      rather than unsigned to avoid ambiguity with the built-in operator[] | 
| 1088 |      (bootstrap/91828).  */ | 
| 1089 |   tree& operator[] (ptrdiff_t i) const { return (*v)[i]; } | 
| 1090 |  | 
| 1091 |   tree *begin() { return ::begin (v); } | 
| 1092 |   tree *end() { return ::end (v); } | 
| 1093 |  | 
| 1094 |   void release () { release_tree_vector (v); v = NULL; } | 
| 1095 |  | 
| 1096 |   ~releasing_vec () { release_tree_vector (v); } | 
| 1097 | private: | 
| 1098 |   vec_t *v; | 
| 1099 | }; | 
| 1100 | /* Forwarding functions for vec_safe_* that might reallocate.  */ | 
| 1101 | inline tree* vec_safe_push (releasing_vec& r, const tree &t CXX_MEM_STAT_INFO) | 
| 1102 | { return vec_safe_push (v&: *&r, obj: t PASS_MEM_STAT); } | 
| 1103 | inline bool vec_safe_reserve (releasing_vec& r, unsigned n, bool e = false CXX_MEM_STAT_INFO) | 
| 1104 | { return vec_safe_reserve (v&: *&r, nelems: n, exact: e PASS_MEM_STAT); } | 
| 1105 | inline unsigned vec_safe_length (releasing_vec &r) | 
| 1106 | { return r->length(); } | 
| 1107 | inline void vec_safe_splice (releasing_vec &r, vec<tree, va_gc> *p CXX_MEM_STAT_INFO) | 
| 1108 | { vec_safe_splice (dst&: *&r, src: p PASS_MEM_STAT); } | 
| 1109 | void release_tree_vector (releasing_vec &); // cause link error | 
| 1110 |  | 
| 1111 | struct GTY(()) tree_template_decl { | 
| 1112 |   struct tree_decl_common common; | 
| 1113 |   tree arguments; | 
| 1114 |   tree result; | 
| 1115 | }; | 
| 1116 |  | 
| 1117 | /* Returns true iff NODE is a BASELINK.  */ | 
| 1118 | #define BASELINK_P(NODE) \ | 
| 1119 |   (TREE_CODE (NODE) == BASELINK) | 
| 1120 | /* The BINFO indicating the base in which lookup found the | 
| 1121 |    BASELINK_FUNCTIONS.  */ | 
| 1122 | #define BASELINK_BINFO(NODE) \ | 
| 1123 |   (((struct tree_baselink*) BASELINK_CHECK (NODE))->binfo) | 
| 1124 | /* The functions referred to by the BASELINK; either a FUNCTION_DECL, | 
| 1125 |    a TEMPLATE_DECL, an OVERLOAD, or a TEMPLATE_ID_EXPR.  */ | 
| 1126 | #define BASELINK_FUNCTIONS(NODE) \ | 
| 1127 |   (((struct tree_baselink*) BASELINK_CHECK (NODE))->functions) | 
| 1128 | /* If T is a BASELINK, grab the functions, otherwise just T, which is | 
| 1129 |    expected to already be a (list of) functions.  */ | 
| 1130 | #define MAYBE_BASELINK_FUNCTIONS(T) \ | 
| 1131 |   (BASELINK_P (T) ? BASELINK_FUNCTIONS (T) : T) | 
| 1132 | /* The BINFO in which the search for the functions indicated by this baselink | 
| 1133 |    began.  This base is used to determine the accessibility of functions | 
| 1134 |    selected by overload resolution.  */ | 
| 1135 | #define BASELINK_ACCESS_BINFO(NODE) \ | 
| 1136 |   (((struct tree_baselink*) BASELINK_CHECK (NODE))->access_binfo) | 
| 1137 | /* For a type-conversion operator, the BASELINK_OPTYPE indicates the type | 
| 1138 |    to which the conversion should occur.  This value is important if | 
| 1139 |    the BASELINK_FUNCTIONS include a template conversion operator -- | 
| 1140 |    the BASELINK_OPTYPE can be used to determine what type the user | 
| 1141 |    requested.  */ | 
| 1142 | #define BASELINK_OPTYPE(NODE) \ | 
| 1143 |   (TREE_CHAIN (BASELINK_CHECK (NODE))) | 
| 1144 | /* Nonzero if this baselink was from a qualified lookup.  */ | 
| 1145 | #define BASELINK_QUALIFIED_P(NODE) \ | 
| 1146 |   TREE_LANG_FLAG_0 (BASELINK_CHECK (NODE)) | 
| 1147 | /* Nonzero if the overload set for this baselink might be incomplete due | 
| 1148 |    to the lookup being performed from an incomplete-class context.  */ | 
| 1149 | #define BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P(NODE) \ | 
| 1150 |   TREE_LANG_FLAG_1 (BASELINK_CHECK (NODE)) | 
| 1151 |  | 
| 1152 | struct GTY(()) tree_baselink { | 
| 1153 |   struct tree_common common; | 
| 1154 |   tree binfo; | 
| 1155 |   tree functions; | 
| 1156 |   tree access_binfo; | 
| 1157 | }; | 
| 1158 |  | 
| 1159 | /* The different kinds of ids that we encounter.  */ | 
| 1160 |  | 
| 1161 | enum cp_id_kind | 
| 1162 | { | 
| 1163 |   /* Not an id at all.  */ | 
| 1164 |   CP_ID_KIND_NONE, | 
| 1165 |   /* An unqualified-id that is not a template-id.  */ | 
| 1166 |   CP_ID_KIND_UNQUALIFIED, | 
| 1167 |   /* An unqualified-id that is a dependent name.  */ | 
| 1168 |   CP_ID_KIND_UNQUALIFIED_DEPENDENT, | 
| 1169 |   /* An unqualified template-id.  */ | 
| 1170 |   CP_ID_KIND_TEMPLATE_ID, | 
| 1171 |   /* A qualified-id.  */ | 
| 1172 |   CP_ID_KIND_QUALIFIED | 
| 1173 | }; | 
| 1174 |  | 
| 1175 |  | 
| 1176 | /* The various kinds of C++0x warnings we encounter.  */ | 
| 1177 |  | 
| 1178 | enum cpp0x_warn_str | 
| 1179 | { | 
| 1180 |   /* extended initializer lists */ | 
| 1181 |   CPP0X_INITIALIZER_LISTS, | 
| 1182 |   /* explicit conversion operators */ | 
| 1183 |   CPP0X_EXPLICIT_CONVERSION, | 
| 1184 |   /* variadic templates */ | 
| 1185 |   CPP0X_VARIADIC_TEMPLATES, | 
| 1186 |   /* lambda expressions */ | 
| 1187 |   CPP0X_LAMBDA_EXPR, | 
| 1188 |   /* C++0x auto */ | 
| 1189 |   CPP0X_AUTO, | 
| 1190 |   /* scoped enums */ | 
| 1191 |   CPP0X_SCOPED_ENUMS, | 
| 1192 |   /* defaulted and deleted functions */ | 
| 1193 |   CPP0X_DEFAULTED_DELETED, | 
| 1194 |   /* inline namespaces */ | 
| 1195 |   CPP0X_INLINE_NAMESPACES, | 
| 1196 |   /* override controls, override/final */ | 
| 1197 |   CPP0X_OVERRIDE_CONTROLS, | 
| 1198 |   /* non-static data member initializers */ | 
| 1199 |   CPP0X_NSDMI, | 
| 1200 |   /* user defined literals */ | 
| 1201 |   CPP0X_USER_DEFINED_LITERALS, | 
| 1202 |   /* delegating constructors */ | 
| 1203 |   CPP0X_DELEGATING_CTORS, | 
| 1204 |   /* inheriting constructors */ | 
| 1205 |   CPP0X_INHERITING_CTORS, | 
| 1206 |   /* C++11 attributes */ | 
| 1207 |   CPP0X_ATTRIBUTES, | 
| 1208 |   /* ref-qualified member functions */ | 
| 1209 |   CPP0X_REF_QUALIFIER | 
| 1210 | }; | 
| 1211 |  | 
| 1212 | /* The various kinds of operation used by composite_pointer_type.  */ | 
| 1213 |  | 
| 1214 | enum composite_pointer_operation | 
| 1215 | { | 
| 1216 |   /* comparison */ | 
| 1217 |   CPO_COMPARISON, | 
| 1218 |   /* conversion */ | 
| 1219 |   CPO_CONVERSION, | 
| 1220 |   /* conditional expression */ | 
| 1221 |   CPO_CONDITIONAL_EXPR | 
| 1222 | }; | 
| 1223 |  | 
| 1224 | /* Possible cases of expression list used by | 
| 1225 |    build_x_compound_expr_from_list.  */ | 
| 1226 | enum expr_list_kind { | 
| 1227 |   ELK_INIT,                /* initializer */ | 
| 1228 |   ELK_MEM_INIT,                /* member initializer */ | 
| 1229 |   ELK_FUNC_CAST                /* functional cast */ | 
| 1230 | }; | 
| 1231 |  | 
| 1232 | /* Possible cases of implicit bad rhs conversions.  */ | 
| 1233 | enum impl_conv_rhs { | 
| 1234 |   ICR_DEFAULT_ARGUMENT, /* default argument */ | 
| 1235 |   ICR_CONVERTING,       /* converting */ | 
| 1236 |   ICR_INIT,             /* initialization */ | 
| 1237 |   ICR_ARGPASS,          /* argument passing */ | 
| 1238 |   ICR_RETURN,           /* return */ | 
| 1239 |   ICR_ASSIGN            /* assignment */ | 
| 1240 | }; | 
| 1241 |  | 
| 1242 | /* Possible cases of implicit or explicit bad conversions to void.  */ | 
| 1243 | enum impl_conv_void { | 
| 1244 |   ICV_CAST,            /* (explicit) conversion to void */ | 
| 1245 |   ICV_SECOND_OF_COND,  /* second operand of conditional expression */ | 
| 1246 |   ICV_THIRD_OF_COND,   /* third operand of conditional expression */ | 
| 1247 |   ICV_RIGHT_OF_COMMA,  /* right operand of comma operator */ | 
| 1248 |   ICV_LEFT_OF_COMMA,   /* left operand of comma operator */ | 
| 1249 |   ICV_STATEMENT,       /* statement */ | 
| 1250 |   ICV_THIRD_IN_FOR     /* for increment expression */ | 
| 1251 | }; | 
| 1252 |  | 
| 1253 | /* Possible invalid uses of an abstract class that might not have a | 
| 1254 |    specific associated declaration.  */ | 
| 1255 | enum GTY(()) abstract_class_use { | 
| 1256 |   ACU_UNKNOWN,                        /* unknown or decl provided */ | 
| 1257 |   ACU_CAST,                        /* cast to abstract class */ | 
| 1258 |   ACU_NEW,                        /* new-expression of abstract class */ | 
| 1259 |   ACU_THROW,                        /* throw-expression of abstract class */ | 
| 1260 |   ACU_CATCH,                        /* catch-parameter of abstract class */ | 
| 1261 |   ACU_ARRAY,                        /* array of abstract class */ | 
| 1262 |   ACU_RETURN,                        /* return type of abstract class */ | 
| 1263 |   ACU_PARM                        /* parameter type of abstract class */ | 
| 1264 | }; | 
| 1265 |  | 
| 1266 | /* Macros for access to language-specific slots in an identifier.  */ | 
| 1267 |  | 
| 1268 | /* Identifiers map directly to block or class-scope bindings. | 
| 1269 |    Namespace-scope bindings are held in hash tables on the respective | 
| 1270 |    namespaces.  The identifier bindings are the innermost active | 
| 1271 |    binding, from whence you can get the decl and/or implicit-typedef | 
| 1272 |    of an elaborated type.   When not bound to a local entity the | 
| 1273 |    values are NULL.  */ | 
| 1274 | #define IDENTIFIER_BINDING(NODE) \ | 
| 1275 |   (LANG_IDENTIFIER_CAST (NODE)->bindings) | 
| 1276 | #define REAL_IDENTIFIER_TYPE_VALUE(NODE) TREE_TYPE (NODE) | 
| 1277 | #define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = (TYPE)) | 
| 1278 |  | 
| 1279 | /* Kinds of identifiers.  Values are carefully chosen.  */ | 
| 1280 | enum cp_identifier_kind { | 
| 1281 |   cik_normal = 0,        /* Not a special identifier.  */ | 
| 1282 |   cik_keyword = 1,        /* A keyword.  */ | 
| 1283 |   cik_ctor = 2,                /* Constructor (in-chg, complete or base).  */ | 
| 1284 |   cik_dtor = 3,                /* Destructor (in-chg, deleting, complete or | 
| 1285 |                            base).  */ | 
| 1286 |   cik_simple_op = 4,        /* Non-assignment operator name.  */ | 
| 1287 |   cik_assign_op = 5,        /* An assignment operator name.  */ | 
| 1288 |   cik_conv_op = 6,        /* Conversion operator name.  */ | 
| 1289 |   cik_trait = 7,        /* Built-in trait name.  */ | 
| 1290 |   cik_max | 
| 1291 | }; | 
| 1292 |  | 
| 1293 | /* Kind bits.  */ | 
| 1294 | #define IDENTIFIER_KIND_BIT_0(NODE) \ | 
| 1295 |   TREE_LANG_FLAG_0 (IDENTIFIER_NODE_CHECK (NODE)) | 
| 1296 | #define IDENTIFIER_KIND_BIT_1(NODE) \ | 
| 1297 |   TREE_LANG_FLAG_1 (IDENTIFIER_NODE_CHECK (NODE)) | 
| 1298 | #define IDENTIFIER_KIND_BIT_2(NODE) \ | 
| 1299 |   TREE_LANG_FLAG_2 (IDENTIFIER_NODE_CHECK (NODE)) | 
| 1300 |  | 
| 1301 | /* Used by various search routines.  */ | 
| 1302 | #define IDENTIFIER_MARKED(NODE) \ | 
| 1303 |   TREE_LANG_FLAG_4 (IDENTIFIER_NODE_CHECK (NODE)) | 
| 1304 |  | 
| 1305 | /* Nonzero if this identifier is used as a virtual function name somewhere | 
| 1306 |    (optimizes searches).  */ | 
| 1307 | #define IDENTIFIER_VIRTUAL_P(NODE) \ | 
| 1308 |   TREE_LANG_FLAG_5 (IDENTIFIER_NODE_CHECK (NODE)) | 
| 1309 |  | 
| 1310 | /* Return the cp_identifier_kind of the given IDENTIFIER node ID.  */ | 
| 1311 |  | 
| 1312 | ATTRIBUTE_PURE inline cp_identifier_kind | 
| 1313 | get_identifier_kind (tree id) | 
| 1314 | { | 
| 1315 |   unsigned bit0 = IDENTIFIER_KIND_BIT_0 (id); | 
| 1316 |   unsigned bit1 = IDENTIFIER_KIND_BIT_1 (id); | 
| 1317 |   unsigned bit2 = IDENTIFIER_KIND_BIT_2 (id); | 
| 1318 |   return cp_identifier_kind ((bit2 << 2) | (bit1 << 1) | bit0); | 
| 1319 | } | 
| 1320 |  | 
| 1321 | /* True if this identifier is a reserved word.  C_RID_CODE (node) is | 
| 1322 |    then the RID_* value of the keyword.  Value 1.  */ | 
| 1323 | #define IDENTIFIER_KEYWORD_P(NODE)                \ | 
| 1324 |   (get_identifier_kind (NODE) == cik_keyword) | 
| 1325 |  | 
| 1326 | /* True if this identifier is the name of a constructor or | 
| 1327 |    destructor.  Value 2 or 3.  */ | 
| 1328 | #define IDENTIFIER_CDTOR_P(NODE)                \ | 
| 1329 |   (IDENTIFIER_CTOR_P (NODE) || IDENTIFIER_DTOR_P (NODE)) | 
| 1330 |  | 
| 1331 | /* True if this identifier is the name of a constructor.  Value 2.  */ | 
| 1332 | #define IDENTIFIER_CTOR_P(NODE)                        \ | 
| 1333 |   (get_identifier_kind (NODE) == cik_ctor) | 
| 1334 |  | 
| 1335 | /* True if this identifier is the name of a destructor.  Value 3.  */ | 
| 1336 | #define IDENTIFIER_DTOR_P(NODE)                        \ | 
| 1337 |   (get_identifier_kind (NODE) == cik_dtor) | 
| 1338 |  | 
| 1339 | /* True if this identifier is for any operator name (including | 
| 1340 |    conversions).  Value 4, 5, or 6.  */ | 
| 1341 | #define IDENTIFIER_ANY_OP_P(NODE)                \ | 
| 1342 |   (IDENTIFIER_OVL_OP_P (NODE) || IDENTIFIER_CONV_OP_P (NODE)) | 
| 1343 |  | 
| 1344 | /* True if this identifier is for an overloaded operator. Values 4, 5.  */ | 
| 1345 | #define IDENTIFIER_OVL_OP_P(NODE)                \ | 
| 1346 |   (get_identifier_kind (NODE) == cik_simple_op  \ | 
| 1347 |    || get_identifier_kind (NODE) == cik_assign_op) | 
| 1348 |  | 
| 1349 | /* True if this identifier is for any assignment. Values 5.  */ | 
| 1350 | #define IDENTIFIER_ASSIGN_OP_P(NODE)                \ | 
| 1351 |   (get_identifier_kind (NODE) == cik_assign_op) | 
| 1352 |  | 
| 1353 | /* True if this identifier is the name of a type-conversion | 
| 1354 |    operator.  Value 6.  */ | 
| 1355 | #define IDENTIFIER_CONV_OP_P(NODE)                \ | 
| 1356 |   (get_identifier_kind (NODE) == cik_conv_op) | 
| 1357 |  | 
| 1358 | /* True if this identifier is the name of a built-in trait.  */ | 
| 1359 | #define IDENTIFIER_TRAIT_P(NODE)                \ | 
| 1360 |   (get_identifier_kind (NODE) == cik_trait) | 
| 1361 |  | 
| 1362 | /* True if this identifier is a new or delete operator.  */ | 
| 1363 | #define IDENTIFIER_NEWDEL_OP_P(NODE)                \ | 
| 1364 |   (IDENTIFIER_OVL_OP_P (NODE)                        \ | 
| 1365 |    && IDENTIFIER_OVL_OP_FLAGS (NODE) & OVL_OP_FLAG_ALLOC) | 
| 1366 |  | 
| 1367 | /* True if this identifier is a new operator.  */ | 
| 1368 | #define IDENTIFIER_NEW_OP_P(NODE)                                        \ | 
| 1369 |   (IDENTIFIER_OVL_OP_P (NODE)                                                \ | 
| 1370 |    && (IDENTIFIER_OVL_OP_FLAGS (NODE)                                        \ | 
| 1371 |        & (OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE)) == OVL_OP_FLAG_ALLOC) | 
| 1372 |  | 
| 1373 | /* Access a C++-specific index for identifier NODE. | 
| 1374 |    Used to optimize operator mappings etc.  */ | 
| 1375 | #define IDENTIFIER_CP_INDEX(NODE)                \ | 
| 1376 |   (IDENTIFIER_NODE_CHECK(NODE)->base.u.bits.address_space) | 
| 1377 |  | 
| 1378 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only.  */ | 
| 1379 | #define C_TYPE_FIELDS_READONLY(TYPE) \ | 
| 1380 |   (LANG_TYPE_CLASS_CHECK (TYPE)->fields_readonly) | 
| 1381 |  | 
| 1382 | /* The tokens stored in the unparsed operand.  */ | 
| 1383 |  | 
| 1384 | #define DEFPARSE_TOKENS(NODE) \ | 
| 1385 |   (((struct tree_deferred_parse *)DEFERRED_PARSE_CHECK (NODE))->tokens) | 
| 1386 | #define DEFPARSE_INSTANTIATIONS(NODE) \ | 
| 1387 |   (((struct tree_deferred_parse *)DEFERRED_PARSE_CHECK (NODE))->instantiations) | 
| 1388 |  | 
| 1389 | struct GTY (()) tree_deferred_parse { | 
| 1390 |   struct tree_base base; | 
| 1391 |   struct cp_token_cache *tokens; | 
| 1392 |   vec<tree, va_gc> *instantiations; | 
| 1393 | }; | 
| 1394 |  | 
| 1395 |  | 
| 1396 | #define DEFERRED_NOEXCEPT_PATTERN(NODE) \ | 
| 1397 |   (((struct tree_deferred_noexcept *)DEFERRED_NOEXCEPT_CHECK (NODE))->pattern) | 
| 1398 | #define DEFERRED_NOEXCEPT_ARGS(NODE) \ | 
| 1399 |   (((struct tree_deferred_noexcept *)DEFERRED_NOEXCEPT_CHECK (NODE))->args) | 
| 1400 | #define DEFERRED_NOEXCEPT_SPEC_P(NODE)                                \ | 
| 1401 |   ((NODE) && (TREE_PURPOSE (NODE))                                \ | 
| 1402 |    && (TREE_CODE (TREE_PURPOSE (NODE)) == DEFERRED_NOEXCEPT)) | 
| 1403 | #define UNEVALUATED_NOEXCEPT_SPEC_P(NODE)                                \ | 
| 1404 |   (DEFERRED_NOEXCEPT_SPEC_P (NODE)                                        \ | 
| 1405 |    && DEFERRED_NOEXCEPT_PATTERN (TREE_PURPOSE (NODE)) == NULL_TREE) | 
| 1406 | #define UNPARSED_NOEXCEPT_SPEC_P(NODE) \ | 
| 1407 |   ((NODE) && (TREE_PURPOSE (NODE)) \ | 
| 1408 |    && (TREE_CODE (TREE_PURPOSE (NODE)) == DEFERRED_PARSE)) | 
| 1409 |  | 
| 1410 | struct GTY (()) tree_deferred_noexcept { | 
| 1411 |   struct tree_base base; | 
| 1412 |   tree pattern; | 
| 1413 |   tree args; | 
| 1414 | }; | 
| 1415 |  | 
| 1416 |  | 
| 1417 | /* The condition associated with the static assertion.  This must be | 
| 1418 |    an integral constant expression.  */ | 
| 1419 | #define STATIC_ASSERT_CONDITION(NODE) \ | 
| 1420 |   (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->condition) | 
| 1421 |  | 
| 1422 | /* The message associated with the static assertion.  This must be a | 
| 1423 |    string constant, which will be emitted as an error message when the | 
| 1424 |    static assert condition is false.  */ | 
| 1425 | #define STATIC_ASSERT_MESSAGE(NODE) \ | 
| 1426 |   (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->message) | 
| 1427 |  | 
| 1428 | /* Source location information for a static assertion.  */ | 
| 1429 | #define STATIC_ASSERT_SOURCE_LOCATION(NODE) \ | 
| 1430 |   (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->location) | 
| 1431 |  | 
| 1432 | struct GTY (()) tree_static_assert { | 
| 1433 |   struct tree_base base; | 
| 1434 |   tree condition; | 
| 1435 |   tree message; | 
| 1436 |   location_t location; | 
| 1437 | }; | 
| 1438 |  | 
| 1439 | struct GTY (()) tree_argument_pack_select { | 
| 1440 |   struct tree_base base; | 
| 1441 |   tree argument_pack; | 
| 1442 |   int index; | 
| 1443 | }; | 
| 1444 |  | 
| 1445 | /* The different kinds of traits that we encounter.  The size is limited to | 
| 1446 |    addr_space_t since a trait is looked up by IDENTIFIER_CP_INDEX.  */ | 
| 1447 | enum cp_trait_kind : addr_space_t { | 
| 1448 | #define DEFTRAIT(TCC, CODE, NAME, ARITY) \ | 
| 1449 |   CPTK_##CODE, | 
| 1450 | #include "cp-trait.def" | 
| 1451 | #undef DEFTRAIT | 
| 1452 | }; | 
| 1453 |  | 
| 1454 | /* The trait type.  */ | 
| 1455 | struct cp_trait { | 
| 1456 |   const char *name; | 
| 1457 |   cp_trait_kind kind; | 
| 1458 |   short arity; | 
| 1459 |   bool type; | 
| 1460 | }; | 
| 1461 |  | 
| 1462 | /* The trait table indexed by cp_trait_kind.  */ | 
| 1463 | extern const struct cp_trait cp_traits[]; | 
| 1464 |  | 
| 1465 | /* The types that we are processing.  */ | 
| 1466 | #define TRAIT_EXPR_TYPE1(NODE) \ | 
| 1467 |   (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type1) | 
| 1468 |  | 
| 1469 | #define TRAIT_EXPR_TYPE2(NODE) \ | 
| 1470 |   (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type2) | 
| 1471 |  | 
| 1472 | /* The specific trait that we are processing.  */ | 
| 1473 | #define TRAIT_EXPR_KIND(NODE) \ | 
| 1474 |   (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->kind) | 
| 1475 |  | 
| 1476 | #define TRAIT_EXPR_LOCATION(NODE) \ | 
| 1477 |   (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->locus) | 
| 1478 |  | 
| 1479 | struct GTY (()) tree_trait_expr { | 
| 1480 |   struct tree_typed typed; | 
| 1481 |   tree type1; | 
| 1482 |   tree type2; | 
| 1483 |   location_t locus; | 
| 1484 |   enum cp_trait_kind kind; | 
| 1485 | }; | 
| 1486 |  | 
| 1487 | /* An INTEGER_CST containing the kind of the trait type NODE.  */ | 
| 1488 | #define TRAIT_TYPE_KIND_RAW(NODE) \ | 
| 1489 |   TYPE_VALUES_RAW (TRAIT_TYPE_CHECK (NODE)) | 
| 1490 |  | 
| 1491 | /* The kind of the trait type NODE.  */ | 
| 1492 | #define TRAIT_TYPE_KIND(NODE) \ | 
| 1493 |   ((enum cp_trait_kind) TREE_INT_CST_LOW (TRAIT_TYPE_KIND_RAW (NODE))) | 
| 1494 |  | 
| 1495 | /* The first argument of the trait type NODE.  */ | 
| 1496 | #define TRAIT_TYPE_TYPE1(NODE) \ | 
| 1497 |   TYPE_MIN_VALUE_RAW (TRAIT_TYPE_CHECK (NODE)) | 
| 1498 |  | 
| 1499 | /* The rest of the arguments of the trait type NODE.  */ | 
| 1500 | #define TRAIT_TYPE_TYPE2(NODE) \ | 
| 1501 |   TYPE_MAX_VALUE_RAW (TRAIT_TYPE_CHECK (NODE)) | 
| 1502 |  | 
| 1503 | /* Identifiers used for lambda types are almost anonymous.  Use this | 
| 1504 |    spare flag to distinguish them (they also have the anonymous flag).  */ | 
| 1505 | #define IDENTIFIER_LAMBDA_P(NODE) \ | 
| 1506 |   (IDENTIFIER_NODE_CHECK(NODE)->base.protected_flag) | 
| 1507 |  | 
| 1508 | /* Based off of TYPE_UNNAMED_P.  */ | 
| 1509 | #define LAMBDA_TYPE_P(NODE)                                        \ | 
| 1510 |   (TREE_CODE (NODE) == RECORD_TYPE                                \ | 
| 1511 |    && TYPE_LINKAGE_IDENTIFIER (NODE)                                \ | 
| 1512 |    && IDENTIFIER_LAMBDA_P (TYPE_LINKAGE_IDENTIFIER (NODE))) | 
| 1513 |  | 
| 1514 | /* Test if FUNCTION_DECL is a lambda function.  */ | 
| 1515 | #define LAMBDA_FUNCTION_P(FNDECL)                                \ | 
| 1516 |   (DECL_DECLARES_FUNCTION_P (FNDECL)                                \ | 
| 1517 |    && DECL_OVERLOADED_OPERATOR_P (FNDECL)                        \ | 
| 1518 |    && DECL_OVERLOADED_OPERATOR_IS (FNDECL, CALL_EXPR)                \ | 
| 1519 |    && LAMBDA_TYPE_P (CP_DECL_CONTEXT (FNDECL))) | 
| 1520 |  | 
| 1521 | enum cp_lambda_default_capture_mode_type { | 
| 1522 |   CPLD_NONE, | 
| 1523 |   CPLD_COPY, | 
| 1524 |   CPLD_REFERENCE | 
| 1525 | }; | 
| 1526 |  | 
| 1527 | /* The method of default capture, if any.  */ | 
| 1528 | #define LAMBDA_EXPR_DEFAULT_CAPTURE_MODE(NODE) \ | 
| 1529 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->default_capture_mode) | 
| 1530 |  | 
| 1531 | /* The capture-list, including `this'.  Each capture is stored as a FIELD_DECL | 
| 1532 |  * so that the name, type, and field are all together, whether or not it has | 
| 1533 |  * been added to the lambda's class type. | 
| 1534 |    TREE_LIST: | 
| 1535 |      TREE_PURPOSE: The FIELD_DECL for this capture. | 
| 1536 |      TREE_VALUE: The initializer. This is part of a GNU extension.  */ | 
| 1537 | #define LAMBDA_EXPR_CAPTURE_LIST(NODE) \ | 
| 1538 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->capture_list) | 
| 1539 |  | 
| 1540 | /* During parsing of the lambda-introducer, the node in the capture-list | 
| 1541 |    that holds the 'this' capture.  During parsing of the body, the | 
| 1542 |    capture proxy for that node.  */ | 
| 1543 | #define LAMBDA_EXPR_THIS_CAPTURE(NODE) \ | 
| 1544 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->this_capture) | 
| 1545 |  | 
| 1546 | /* True iff uses of a const variable capture were optimized away.  */ | 
| 1547 | #define LAMBDA_EXPR_CAPTURE_OPTIMIZED(NODE) \ | 
| 1548 |   TREE_LANG_FLAG_2 (LAMBDA_EXPR_CHECK (NODE)) | 
| 1549 |  | 
| 1550 | /* Predicate tracking whether the lambda was declared 'static'.  */ | 
| 1551 | #define LAMBDA_EXPR_STATIC_P(NODE) \ | 
| 1552 |   TREE_LANG_FLAG_3 (LAMBDA_EXPR_CHECK (NODE)) | 
| 1553 |  | 
| 1554 | /* True if this TREE_LIST in LAMBDA_EXPR_CAPTURE_LIST is for an explicit | 
| 1555 |    capture.  */ | 
| 1556 | #define LAMBDA_CAPTURE_EXPLICIT_P(NODE) \ | 
| 1557 |   TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE)) | 
| 1558 |  | 
| 1559 | /* The source location of the lambda.  */ | 
| 1560 | #define LAMBDA_EXPR_LOCATION(NODE) \ | 
| 1561 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->locus) | 
| 1562 |  | 
| 1563 | /* The mangling scope for the lambda: FUNCTION_DECL, PARM_DECL, VAR_DECL, | 
| 1564 |    FIELD_DECL, TYPE_DECL, or NULL_TREE.  If this is NULL_TREE, we have no | 
| 1565 |    linkage.  */ | 
| 1566 | #define (NODE) \ | 
| 1567 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->extra_scope) | 
| 1568 |  | 
| 1569 | /* Lambdas in the same extra scope might need a discriminating count. | 
| 1570 |    For ABI 17, we have single per-scope count, for ABI 18, we have | 
| 1571 |    per-scope, per-signature numbering.  */ | 
| 1572 | #define LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR(NODE) \ | 
| 1573 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->discriminator_scope) | 
| 1574 | #define LAMBDA_EXPR_SCOPE_SIG_DISCRIMINATOR(NODE) \ | 
| 1575 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->discriminator_sig) | 
| 1576 |  | 
| 1577 | /* During parsing of the lambda, a vector of capture proxies which need | 
| 1578 |    to be pushed once we're done processing a nested lambda.  */ | 
| 1579 | #define LAMBDA_EXPR_PENDING_PROXIES(NODE) \ | 
| 1580 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->pending_proxies) | 
| 1581 |  | 
| 1582 | /* If NODE was regenerated via tsubst_lambda_expr, this is a TEMPLATE_INFO | 
| 1583 |    whose TI_TEMPLATE is the immediate LAMBDA_EXPR from which NODE was | 
| 1584 |    regenerated, and TI_ARGS is the full set of template arguments used | 
| 1585 |    to regenerate NODE from the most general lambda.  */ | 
| 1586 | #define LAMBDA_EXPR_REGEN_INFO(NODE) \ | 
| 1587 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->regen_info) | 
| 1588 |  | 
| 1589 | /* Like PACK_EXPANSION_EXTRA_ARGS, for lambda-expressions.  */ | 
| 1590 | #define (NODE) \ | 
| 1591 |   (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->extra_args) | 
| 1592 |  | 
| 1593 | /* The closure type of the lambda, which is also the type of the | 
| 1594 |    LAMBDA_EXPR.  */ | 
| 1595 | #define LAMBDA_EXPR_CLOSURE(NODE) \ | 
| 1596 |   (TREE_TYPE (LAMBDA_EXPR_CHECK (NODE))) | 
| 1597 |  | 
| 1598 | struct GTY (()) tree_lambda_expr | 
| 1599 | { | 
| 1600 |   struct tree_typed typed; | 
| 1601 |   tree capture_list; | 
| 1602 |   tree this_capture; | 
| 1603 |   tree ; | 
| 1604 |   tree regen_info; | 
| 1605 |   tree ; | 
| 1606 |   vec<tree, va_gc> *pending_proxies; | 
| 1607 |   location_t locus; | 
| 1608 |   enum cp_lambda_default_capture_mode_type default_capture_mode : 2; | 
| 1609 |   unsigned discriminator_scope : 15; // Per-scope discriminator | 
| 1610 |   unsigned discriminator_sig : 15; // Per-scope, per-signature discriminator | 
| 1611 | }; | 
| 1612 |  | 
| 1613 | /* Non-zero if this template specialization has access violations that | 
| 1614 |    should be rechecked when the function is instantiated outside argument | 
| 1615 |    deduction.  */ | 
| 1616 | #define TINFO_HAS_ACCESS_ERRORS(NODE) \ | 
| 1617 |   (TREE_LANG_FLAG_0 (TEMPLATE_INFO_CHECK (NODE))) | 
| 1618 | #define FNDECL_HAS_ACCESS_ERRORS(NODE) \ | 
| 1619 |   (TINFO_HAS_ACCESS_ERRORS (DECL_TEMPLATE_INFO (NODE))) | 
| 1620 |  | 
| 1621 | /* Non-zero if this variable template specialization was specified using a | 
| 1622 |    template-id, so it's a partial or full specialization and not a definition | 
| 1623 |    of the member template of a particular class specialization.  */ | 
| 1624 | #define TINFO_USED_TEMPLATE_ID(NODE) \ | 
| 1625 |   (TREE_LANG_FLAG_1 (TEMPLATE_INFO_CHECK (NODE))) | 
| 1626 |  | 
| 1627 | /* The representation of a deferred access check.  */ | 
| 1628 |  | 
| 1629 | struct GTY(()) deferred_access_check { | 
| 1630 |   /* The base class in which the declaration is referenced.  */ | 
| 1631 |   tree binfo; | 
| 1632 |   /* The declaration whose access must be checked.  */ | 
| 1633 |   tree decl; | 
| 1634 |   /* The declaration that should be used in the error message.  */ | 
| 1635 |   tree diag_decl; | 
| 1636 |   /* The location of this access.  */ | 
| 1637 |   location_t loc; | 
| 1638 | }; | 
| 1639 |  | 
| 1640 | struct GTY(()) tree_template_info { | 
| 1641 |   struct tree_base base; | 
| 1642 |   tree tmpl; | 
| 1643 |   tree args; | 
| 1644 |   tree partial; | 
| 1645 |   vec<deferred_access_check, va_gc> *deferred_access_checks; | 
| 1646 | }; | 
| 1647 |  | 
| 1648 | // Constraint information for a C++ declaration. Constraint information is | 
| 1649 | // comprised of: | 
| 1650 | // | 
| 1651 | // - a constraint expression introduced by the template header | 
| 1652 | // - a constraint expression introduced by a function declarator | 
| 1653 | // - the associated constraints, which are the conjunction of those, | 
| 1654 | //   and used for declaration matching | 
| 1655 | // | 
| 1656 | // The template and declarator requirements are kept to support pretty | 
| 1657 | // printing constrained declarations. | 
| 1658 | struct GTY(()) tree_constraint_info { | 
| 1659 |   struct tree_base base; | 
| 1660 |   tree template_reqs; | 
| 1661 |   tree declarator_reqs; | 
| 1662 |   tree associated_constr; | 
| 1663 | }; | 
| 1664 |  | 
| 1665 | // Require that pointer P is non-null before returning. | 
| 1666 | template<typename T> | 
| 1667 | inline T* | 
| 1668 | check_nonnull (T* p) | 
| 1669 | { | 
| 1670 |   gcc_assert (p); | 
| 1671 |   return p; | 
| 1672 | } | 
| 1673 |  | 
| 1674 | /* Returns true iff T is non-null and represents constraint info.  */ | 
| 1675 | inline tree_constraint_info * | 
| 1676 | check_constraint_info (tree t) | 
| 1677 | { | 
| 1678 |   if (t && TREE_CODE (t) == CONSTRAINT_INFO) | 
| 1679 |     return (tree_constraint_info *)t; | 
| 1680 |   return NULL; | 
| 1681 | } | 
| 1682 |  | 
| 1683 | /* Access the expression describing the template constraints. This may be | 
| 1684 |    null if no constraints were introduced in the template parameter list, | 
| 1685 |    a requirements clause after the template parameter list, or constraints | 
| 1686 |    through a constrained-type-specifier.  */ | 
| 1687 | #define CI_TEMPLATE_REQS(NODE) \ | 
| 1688 |   check_constraint_info (check_nonnull (NODE))->template_reqs | 
| 1689 |  | 
| 1690 | /* Access the expression describing the trailing constraints. This is non-null | 
| 1691 |    for any implicit instantiation of a constrained declaration. For a | 
| 1692 |    templated declaration it is non-null only when a trailing requires-clause | 
| 1693 |    was specified.  */ | 
| 1694 | #define CI_DECLARATOR_REQS(NODE) \ | 
| 1695 |   check_constraint_info (check_nonnull (NODE))->declarator_reqs | 
| 1696 |  | 
| 1697 | /* The computed associated constraint expression for a declaration.  */ | 
| 1698 | #define CI_ASSOCIATED_CONSTRAINTS(NODE) \ | 
| 1699 |   check_constraint_info (check_nonnull (NODE))->associated_constr | 
| 1700 |  | 
| 1701 | /* Access the constraint-expression introduced by the requires-clause | 
| 1702 |    associate the template parameter list NODE.  */ | 
| 1703 | #define TEMPLATE_PARMS_CONSTRAINTS(NODE) \ | 
| 1704 |   TREE_TYPE (TREE_LIST_CHECK (NODE)) | 
| 1705 |  | 
| 1706 | /* Access the logical constraints on the template parameter declaration | 
| 1707 |    indicated by NODE.  */ | 
| 1708 | #define TEMPLATE_PARM_CONSTRAINTS(NODE) \ | 
| 1709 |   TREE_TYPE (TREE_LIST_CHECK (NODE)) | 
| 1710 |  | 
| 1711 | /* Non-zero if the noexcept is present in a compound requirement.  */ | 
| 1712 | #define COMPOUND_REQ_NOEXCEPT_P(NODE) \ | 
| 1713 |   TREE_LANG_FLAG_0 (TREE_CHECK (NODE, COMPOUND_REQ)) | 
| 1714 |  | 
| 1715 | /* A TREE_LIST whose TREE_VALUE is the constraints on the 'auto' placeholder | 
| 1716 |    type NODE, used in an argument deduction constraint.  The TREE_PURPOSE | 
| 1717 |    holds the set of template parameters that were in-scope when this 'auto' | 
| 1718 |    was formed.  */ | 
| 1719 | #define PLACEHOLDER_TYPE_CONSTRAINTS_INFO(NODE) \ | 
| 1720 |   DECL_SIZE_UNIT (TYPE_NAME (TEMPLATE_TYPE_PARM_CHECK (NODE))) | 
| 1721 |  | 
| 1722 | /* The constraints on the 'auto' placeholder type NODE.  */ | 
| 1723 | #define PLACEHOLDER_TYPE_CONSTRAINTS(NODE)                   \ | 
| 1724 |   (PLACEHOLDER_TYPE_CONSTRAINTS_INFO (NODE)                   \ | 
| 1725 |    ? TREE_VALUE (PLACEHOLDER_TYPE_CONSTRAINTS_INFO (NODE)) \ | 
| 1726 |    : NULL_TREE) | 
| 1727 |  | 
| 1728 | /* True if NODE is a constraint.  */ | 
| 1729 | #define CONSTR_P(NODE)                  \ | 
| 1730 |   (TREE_CODE (NODE) == ATOMIC_CONSTR    \ | 
| 1731 |    || TREE_CODE (NODE) == CONJ_CONSTR   \ | 
| 1732 |    || TREE_CODE (NODE) == DISJ_CONSTR) | 
| 1733 |  | 
| 1734 | /* Valid for any normalized constraint.  */ | 
| 1735 | #define CONSTR_CHECK(NODE) \ | 
| 1736 |   TREE_CHECK3 (NODE, ATOMIC_CONSTR, CONJ_CONSTR, DISJ_CONSTR) | 
| 1737 |  | 
| 1738 | /* The CONSTR_INFO stores normalization data for a constraint. It refers to | 
| 1739 |    the original expression and the expression or declaration | 
| 1740 |    from which the constraint was normalized. | 
| 1741 |  | 
| 1742 |    This is TREE_LIST whose TREE_PURPOSE is the original expression and whose | 
| 1743 |    TREE_VALUE is a list of contexts.  */ | 
| 1744 | #define CONSTR_INFO(NODE) \ | 
| 1745 |   TREE_TYPE (CONSTR_CHECK (NODE)) | 
| 1746 |  | 
| 1747 | /* The expression evaluated by the constraint.  */ | 
| 1748 | #define CONSTR_EXPR(NODE) \ | 
| 1749 |   TREE_PURPOSE (CONSTR_INFO (NODE)) | 
| 1750 |  | 
| 1751 | /* The expression or declaration from which this constraint was normalized. | 
| 1752 |    This is a TREE_LIST whose TREE_VALUE is either a template-id expression | 
| 1753 |    denoting a concept check or the declaration introducing the constraint. | 
| 1754 |    These are chained to other context objects.  */ | 
| 1755 | #define CONSTR_CONTEXT(NODE) \ | 
| 1756 |   TREE_VALUE (CONSTR_INFO (NODE)) | 
| 1757 |  | 
| 1758 | /* The parameter mapping for an atomic constraint.  */ | 
| 1759 | #define ATOMIC_CONSTR_MAP(NODE) \ | 
| 1760 |   TREE_OPERAND (TREE_CHECK (NODE, ATOMIC_CONSTR), 0) | 
| 1761 |  | 
| 1762 | /* Whether the parameter mapping of this atomic constraint | 
| 1763 |    is already instantiated with concrete template arguments. | 
| 1764 |    Used only in satisfy_atom and in the satisfaction cache.  */ | 
| 1765 | #define ATOMIC_CONSTR_MAP_INSTANTIATED_P(NODE) \ | 
| 1766 |   TREE_LANG_FLAG_0 (ATOMIC_CONSTR_CHECK (NODE)) | 
| 1767 |  | 
| 1768 | /* Whether the expression for this atomic constraint belongs to a | 
| 1769 |    concept definition.  */ | 
| 1770 | #define ATOMIC_CONSTR_EXPR_FROM_CONCEPT_P(NODE) \ | 
| 1771 |   TREE_LANG_FLAG_1 (ATOMIC_CONSTR_CHECK (NODE)) | 
| 1772 |  | 
| 1773 | /* The expression of an atomic constraint.  */ | 
| 1774 | #define ATOMIC_CONSTR_EXPR(NODE) \ | 
| 1775 |   CONSTR_EXPR (ATOMIC_CONSTR_CHECK (NODE)) | 
| 1776 |  | 
| 1777 | /* Whether a PARM_DECL represents a local parameter in a | 
| 1778 |    requires-expression.  */ | 
| 1779 | #define CONSTRAINT_VAR_P(NODE) \ | 
| 1780 |   DECL_LANG_FLAG_2 (TREE_CHECK (NODE, PARM_DECL)) | 
| 1781 |  | 
| 1782 | /* The concept constraining this constrained template-parameter.  */ | 
| 1783 | #define CONSTRAINED_PARM_CONCEPT(NODE) \ | 
| 1784 |   DECL_SIZE_UNIT (TYPE_DECL_CHECK (NODE)) | 
| 1785 | /* Any extra template arguments specified for a constrained | 
| 1786 |    template-parameter.  */ | 
| 1787 | #define (NODE) \ | 
| 1788 |   DECL_SIZE (TYPE_DECL_CHECK (NODE)) | 
| 1789 | /* The first template parameter of CONSTRAINED_PARM_CONCEPT to be used as a | 
| 1790 |    prototype for the constrained parameter in finish_shorthand_constraint, | 
| 1791 |    attached for convenience.  */ | 
| 1792 | #define CONSTRAINED_PARM_PROTOTYPE(NODE) \ | 
| 1793 |   DECL_INITIAL (TYPE_DECL_CHECK (NODE)) | 
| 1794 |  | 
| 1795 | /* Module flags on FUNCTION,VAR,TYPE,CONCEPT or NAMESPACE | 
| 1796 |    A TEMPLATE_DECL holds them on the DECL_TEMPLATE_RESULT object -- | 
| 1797 |    it's just not practical to keep them consistent.  */ | 
| 1798 | #define DECL_MODULE_CHECK(NODE)                                                \ | 
| 1799 |   TREE_NOT_CHECK (NODE, TEMPLATE_DECL) | 
| 1800 |  | 
| 1801 | /* In the purview of a named module (or in the purview of the | 
| 1802 |    header-unit being compiled).  */ | 
| 1803 | #define DECL_MODULE_PURVIEW_P(N) \ | 
| 1804 |   (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (N))->u.base.module_purview_p) | 
| 1805 |  | 
| 1806 | /* Attached to the named module it is in the purview of.  Decls | 
| 1807 |    attached to the global module will have this false.  */ | 
| 1808 | #define DECL_MODULE_ATTACH_P(N) \ | 
| 1809 |   (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (N))->u.base.module_attach_p) | 
| 1810 |  | 
| 1811 | /* True if the live version of the decl was imported.  */ | 
| 1812 | #define DECL_MODULE_IMPORT_P(NODE) \ | 
| 1813 |   (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (NODE))->u.base.module_import_p) | 
| 1814 |  | 
| 1815 | /* True if this decl is in the entity hash & array.  This means that | 
| 1816 |    some variant was imported, even if DECL_MODULE_IMPORT_P is false.  */ | 
| 1817 | #define DECL_MODULE_ENTITY_P(NODE) \ | 
| 1818 |   (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (NODE))->u.base.module_entity_p) | 
| 1819 |  | 
| 1820 | /* DECL that has attached decls for ODR-relatedness.  */ | 
| 1821 | #define DECL_MODULE_KEYED_DECLS_P(NODE) \ | 
| 1822 |   (DECL_LANG_SPECIFIC (DECL_MODULE_CHECK (NODE))->u.base.module_keyed_decls_p) | 
| 1823 |  | 
| 1824 | /* Whether this is an exported DECL.  Held on any decl that can appear | 
| 1825 |    at namespace scope (function, var, type, template, const or | 
| 1826 |    namespace).  templates copy from their template_result, consts have | 
| 1827 |    it for unscoped enums.  */ | 
| 1828 | #define DECL_MODULE_EXPORT_P(NODE) TREE_LANG_FLAG_3 (NODE) | 
| 1829 |  | 
| 1830 | /* Represents a streamed-in translation-unit-local entity.  Any use of | 
| 1831 |    this node when instantiating a template should emit an error.  */ | 
| 1832 | struct GTY(()) tree_tu_local_entity { | 
| 1833 |   struct tree_base base; | 
| 1834 |   tree name; | 
| 1835 |   location_t loc; | 
| 1836 | }; | 
| 1837 |  | 
| 1838 | /* The name of a translation-unit-local entity.  */ | 
| 1839 | #define TU_LOCAL_ENTITY_NAME(NODE) \ | 
| 1840 |   (((struct tree_tu_local_entity *)TU_LOCAL_ENTITY_CHECK (NODE))->name) | 
| 1841 |  | 
| 1842 | /* The source location of the translation-unit-local entity.  */ | 
| 1843 | #define TU_LOCAL_ENTITY_LOCATION(NODE) \ | 
| 1844 |   (((struct tree_tu_local_entity *)TU_LOCAL_ENTITY_CHECK (NODE))->loc) | 
| 1845 |  | 
| 1846 |  | 
| 1847 | /* The list of local parameters introduced by this requires-expression, | 
| 1848 |    in the form of a chain of PARM_DECLs.  */ | 
| 1849 | #define REQUIRES_EXPR_PARMS(NODE) \ | 
| 1850 |   TREE_OPERAND (TREE_CHECK (NODE, REQUIRES_EXPR), 0) | 
| 1851 |  | 
| 1852 | /* A TREE_LIST of the requirements for this requires-expression. | 
| 1853 |    The requirements are stored in lexical order within the TREE_VALUE | 
| 1854 |    of each TREE_LIST node.  The TREE_PURPOSE of each node is unused.  */ | 
| 1855 | #define REQUIRES_EXPR_REQS(NODE) \ | 
| 1856 |   TREE_OPERAND (TREE_CHECK (NODE, REQUIRES_EXPR), 1) | 
| 1857 |  | 
| 1858 | /* Like PACK_EXPANSION_EXTRA_ARGS, for requires-expressions.  */ | 
| 1859 | #define (NODE) \ | 
| 1860 |   TREE_OPERAND (TREE_CHECK (NODE, REQUIRES_EXPR), 2) | 
| 1861 |  | 
| 1862 | enum cp_tree_node_structure_enum { | 
| 1863 |   TS_CP_GENERIC, | 
| 1864 |   TS_CP_IDENTIFIER, | 
| 1865 |   TS_CP_TPI, | 
| 1866 |   TS_CP_PTRMEM, | 
| 1867 |   TS_CP_OVERLOAD, | 
| 1868 |   TS_CP_BINDING_VECTOR, | 
| 1869 |   TS_CP_BASELINK, | 
| 1870 |   TS_CP_TEMPLATE_DECL, | 
| 1871 |   TS_CP_DEFERRED_PARSE, | 
| 1872 |   TS_CP_DEFERRED_NOEXCEPT, | 
| 1873 |   TS_CP_STATIC_ASSERT, | 
| 1874 |   TS_CP_ARGUMENT_PACK_SELECT, | 
| 1875 |   TS_CP_TRAIT_EXPR, | 
| 1876 |   TS_CP_LAMBDA_EXPR, | 
| 1877 |   TS_CP_TEMPLATE_INFO, | 
| 1878 |   TS_CP_CONSTRAINT_INFO, | 
| 1879 |   TS_CP_USERDEF_LITERAL, | 
| 1880 |   TS_CP_TU_LOCAL_ENTITY | 
| 1881 | }; | 
| 1882 |  | 
| 1883 | /* The resulting tree type.  */ | 
| 1884 | union GTY((desc ("cp_tree_node_structure (&%h)" ), | 
| 1885 |        chain_next ("(union lang_tree_node *) c_tree_chain_next (&%h.generic)" ))) lang_tree_node { | 
| 1886 |   union tree_node GTY ((tag ("TS_CP_GENERIC" ), | 
| 1887 |                         desc ("tree_node_structure (&%h)" ))) generic; | 
| 1888 |   struct template_parm_index GTY ((tag ("TS_CP_TPI" ))) tpi; | 
| 1889 |   struct ptrmem_cst GTY ((tag ("TS_CP_PTRMEM" ))) ptrmem; | 
| 1890 |   struct tree_overload GTY ((tag ("TS_CP_OVERLOAD" ))) overload; | 
| 1891 |   struct tree_binding_vec GTY ((tag ("TS_CP_BINDING_VECTOR" ))) binding_vec; | 
| 1892 |   struct tree_baselink GTY ((tag ("TS_CP_BASELINK" ))) baselink; | 
| 1893 |   struct tree_template_decl GTY ((tag ("TS_CP_TEMPLATE_DECL" ))) template_decl; | 
| 1894 |   struct tree_deferred_parse GTY ((tag ("TS_CP_DEFERRED_PARSE" ))) deferred_parse; | 
| 1895 |   struct tree_deferred_noexcept GTY ((tag ("TS_CP_DEFERRED_NOEXCEPT" ))) deferred_noexcept; | 
| 1896 |   struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER" ))) identifier; | 
| 1897 |   struct tree_static_assert GTY ((tag ("TS_CP_STATIC_ASSERT" ))) | 
| 1898 |     static_assertion; | 
| 1899 |   struct tree_argument_pack_select GTY ((tag ("TS_CP_ARGUMENT_PACK_SELECT" ))) | 
| 1900 |     argument_pack_select; | 
| 1901 |   struct tree_trait_expr GTY ((tag ("TS_CP_TRAIT_EXPR" ))) | 
| 1902 |     trait_expression; | 
| 1903 |   struct tree_lambda_expr GTY ((tag ("TS_CP_LAMBDA_EXPR" ))) | 
| 1904 |     lambda_expression; | 
| 1905 |   struct tree_template_info GTY ((tag ("TS_CP_TEMPLATE_INFO" ))) | 
| 1906 |     template_info; | 
| 1907 |   struct tree_constraint_info GTY ((tag ("TS_CP_CONSTRAINT_INFO" ))) | 
| 1908 |     constraint_info; | 
| 1909 |   struct tree_userdef_literal GTY ((tag ("TS_CP_USERDEF_LITERAL" ))) | 
| 1910 |     userdef_literal; | 
| 1911 |   struct tree_tu_local_entity GTY ((tag ("TS_CP_TU_LOCAL_ENTITY" ))) | 
| 1912 |     tu_local_entity; | 
| 1913 | }; | 
| 1914 |  | 
| 1915 |  | 
| 1916 | struct GTY(()) cp_omp_declare_target_attr { | 
| 1917 |   bool attr_syntax; | 
| 1918 |   int device_type; | 
| 1919 |   bool indirect; | 
| 1920 | }; | 
| 1921 |  | 
| 1922 | struct GTY(()) cp_omp_begin_assumes_data { | 
| 1923 |   bool attr_syntax; | 
| 1924 | }; | 
| 1925 |  | 
| 1926 | /* Global state.  */ | 
| 1927 |  | 
| 1928 | struct GTY(()) saved_scope { | 
| 1929 |   vec<cxx_saved_binding, va_gc> *old_bindings; | 
| 1930 |   tree old_namespace; | 
| 1931 |   vec<tree, va_gc> *decl_ns_list; | 
| 1932 |   tree class_name; | 
| 1933 |   tree class_type; | 
| 1934 |   tree access_specifier; | 
| 1935 |   tree function_decl; | 
| 1936 |   vec<tree, va_gc> *lang_base; | 
| 1937 |   tree lang_name; | 
| 1938 |   tree template_parms; | 
| 1939 |   cp_binding_level *x_previous_class_level; | 
| 1940 |   tree x_saved_tree; | 
| 1941 |  | 
| 1942 |   /* Only used for uses of this in trailing return type.  */ | 
| 1943 |   tree x_current_class_ptr; | 
| 1944 |   tree x_current_class_ref; | 
| 1945 |  | 
| 1946 |   int x_processing_template_decl; | 
| 1947 |   int x_processing_specialization; | 
| 1948 |   int x_processing_constraint; | 
| 1949 |   int x_processing_contract_condition; | 
| 1950 |   int suppress_location_wrappers; | 
| 1951 |   BOOL_BITFIELD x_processing_explicit_instantiation : 1; | 
| 1952 |   BOOL_BITFIELD need_pop_function_context : 1; | 
| 1953 |   BOOL_BITFIELD x_processing_omp_trait_property_expr : 1; | 
| 1954 |  | 
| 1955 |   /* Nonzero if we are parsing the discarded statement of a constexpr | 
| 1956 |      if-statement.  */ | 
| 1957 |   BOOL_BITFIELD discarded_stmt : 1; | 
| 1958 |   /* Nonzero if we are parsing or instantiating the compound-statement | 
| 1959 |      of consteval if statement.  Also set while processing an immediate | 
| 1960 |      invocation.  */ | 
| 1961 |   BOOL_BITFIELD consteval_if_p : 1; | 
| 1962 |  | 
| 1963 |   int unevaluated_operand; | 
| 1964 |   int inhibit_evaluation_warnings; | 
| 1965 |   int noexcept_operand; | 
| 1966 |   int ref_temp_count; | 
| 1967 |  | 
| 1968 |   struct stmt_tree_s x_stmt_tree; | 
| 1969 |  | 
| 1970 |   cp_binding_level *class_bindings; | 
| 1971 |   cp_binding_level *bindings; | 
| 1972 |  | 
| 1973 |   hash_map<tree, tree> *GTY((skip)) x_local_specializations; | 
| 1974 |   vec<cp_omp_declare_target_attr, va_gc> *omp_declare_target_attribute; | 
| 1975 |   vec<cp_omp_begin_assumes_data, va_gc> *omp_begin_assumes; | 
| 1976 |  | 
| 1977 |   struct saved_scope *prev; | 
| 1978 | }; | 
| 1979 |  | 
| 1980 | extern GTY(()) struct saved_scope *scope_chain; | 
| 1981 |  | 
| 1982 | /* The current open namespace.  */ | 
| 1983 |  | 
| 1984 | #define current_namespace scope_chain->old_namespace | 
| 1985 |  | 
| 1986 | /* The stack for namespaces of current declarations.  */ | 
| 1987 |  | 
| 1988 | #define decl_namespace_list scope_chain->decl_ns_list | 
| 1989 |  | 
| 1990 | /* IDENTIFIER_NODE: name of current class */ | 
| 1991 |  | 
| 1992 | #define current_class_name scope_chain->class_name | 
| 1993 |  | 
| 1994 | /* _TYPE: the type of the current class */ | 
| 1995 |  | 
| 1996 | #define current_class_type scope_chain->class_type | 
| 1997 |  | 
| 1998 | /* When parsing a class definition, the access specifier most recently | 
| 1999 |    given by the user, or, if no access specifier was given, the | 
| 2000 |    default value appropriate for the kind of class (i.e., struct, | 
| 2001 |    class, or union).  */ | 
| 2002 |  | 
| 2003 | #define current_access_specifier scope_chain->access_specifier | 
| 2004 |  | 
| 2005 | /* Pointer to the top of the language name stack.  */ | 
| 2006 |  | 
| 2007 | #define current_lang_base scope_chain->lang_base | 
| 2008 | #define current_lang_name scope_chain->lang_name | 
| 2009 |  | 
| 2010 | /* When parsing a template declaration, a TREE_LIST represents the | 
| 2011 |    active template parameters.  Each node in the list represents one | 
| 2012 |    level of template parameters.  The innermost level is first in the | 
| 2013 |    list.  The depth of each level is stored as an INTEGER_CST in the | 
| 2014 |    TREE_PURPOSE of each node.  The parameters for that level are | 
| 2015 |    stored in the TREE_VALUE.  */ | 
| 2016 |  | 
| 2017 | #define current_template_parms scope_chain->template_parms | 
| 2018 | #define current_template_depth \ | 
| 2019 |   (current_template_parms ? TMPL_PARMS_DEPTH (current_template_parms) : 0) | 
| 2020 | #define in_template_context (current_template_parms != NULL_TREE) | 
| 2021 |  | 
| 2022 | #define processing_template_decl scope_chain->x_processing_template_decl | 
| 2023 | #define processing_specialization scope_chain->x_processing_specialization | 
| 2024 | #define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation | 
| 2025 | #define processing_omp_trait_property_expr scope_chain->x_processing_omp_trait_property_expr | 
| 2026 |  | 
| 2027 | /* Nonzero if we are parsing the conditional expression of a contract | 
| 2028 |    condition. These expressions appear outside the parameter list (like a | 
| 2029 |    trailing return type), but are potentially evaluated.  */ | 
| 2030 |  | 
| 2031 | #define processing_contract_condition scope_chain->x_processing_contract_condition | 
| 2032 |  | 
| 2033 | #define in_discarded_stmt scope_chain->discarded_stmt | 
| 2034 | #define in_consteval_if_p scope_chain->consteval_if_p | 
| 2035 |  | 
| 2036 | #define current_ref_temp_count scope_chain->ref_temp_count | 
| 2037 |  | 
| 2038 | /* RAII sentinel to handle clearing processing_template_decl and restoring | 
| 2039 |    it when done.  */ | 
| 2040 |  | 
| 2041 | class processing_template_decl_sentinel | 
| 2042 | { | 
| 2043 | public: | 
| 2044 |   int saved; | 
| 2045 |   processing_template_decl_sentinel (bool reset = true) | 
| 2046 |     : saved (processing_template_decl) | 
| 2047 |   { | 
| 2048 |     if (reset) | 
| 2049 |       processing_template_decl = 0; | 
| 2050 |   } | 
| 2051 |   ~processing_template_decl_sentinel() | 
| 2052 |   { | 
| 2053 |     processing_template_decl = saved; | 
| 2054 |   } | 
| 2055 | }; | 
| 2056 |  | 
| 2057 | /* RAII sentinel to disable certain warnings during template substitution | 
| 2058 |    and elsewhere.  */ | 
| 2059 |  | 
| 2060 | class warning_sentinel | 
| 2061 | { | 
| 2062 | public: | 
| 2063 |   int &flag; | 
| 2064 |   int val; | 
| 2065 |   warning_sentinel(int& flag, bool suppress=true) | 
| 2066 |     : flag(flag), val(flag) { if (suppress) flag = 0; } | 
| 2067 |   ~warning_sentinel() { flag = val; } | 
| 2068 | }; | 
| 2069 |  | 
| 2070 | /* RAII sentinel to temporarily override input_location.  This will not set | 
| 2071 |    input_location to UNKNOWN_LOCATION or BUILTINS_LOCATION.  */ | 
| 2072 |  | 
| 2073 | class iloc_sentinel | 
| 2074 | { | 
| 2075 |   location_t saved_loc; | 
| 2076 | public: | 
| 2077 |   iloc_sentinel (location_t loc): saved_loc (input_location) | 
| 2078 |   { | 
| 2079 |     if (loc >= RESERVED_LOCATION_COUNT) | 
| 2080 |       input_location = loc; | 
| 2081 |   } | 
| 2082 |   ~iloc_sentinel () | 
| 2083 |   { | 
| 2084 |     input_location = saved_loc; | 
| 2085 |   } | 
| 2086 | }; | 
| 2087 |  | 
| 2088 | /* RAII sentinel that saves the value of a variable, optionally | 
| 2089 |    overrides it right away, and restores its value when the sentinel | 
| 2090 |    id destructed.  */ | 
| 2091 |  | 
| 2092 | template <typename T> | 
| 2093 | class temp_override | 
| 2094 | { | 
| 2095 |   T& overridden_variable; | 
| 2096 |   T saved_value; | 
| 2097 | public: | 
| 2098 |   temp_override(T& var) : overridden_variable (var), saved_value (var) {} | 
| 2099 |   temp_override(T& var, T overrider) | 
| 2100 |     : overridden_variable (var), saved_value (var) | 
| 2101 |   { | 
| 2102 |     overridden_variable = overrider; | 
| 2103 |   } | 
| 2104 |   ~temp_override() { overridden_variable = saved_value; } | 
| 2105 | }; | 
| 2106 |  | 
| 2107 | /* Wrapping a template parameter in type_identity_t hides it from template | 
| 2108 |    argument deduction.  */ | 
| 2109 | #if __cpp_lib_type_identity | 
| 2110 | using std::type_identity_t; | 
| 2111 | #else | 
| 2112 | template <typename T> | 
| 2113 | struct type_identity { typedef T type; }; | 
| 2114 | template <typename T> | 
| 2115 | using type_identity_t = typename type_identity<T>::type; | 
| 2116 | #endif | 
| 2117 |  | 
| 2118 | /* Object generator function for temp_override, so you don't need to write the | 
| 2119 |    type of the object as a template argument. | 
| 2120 |  | 
| 2121 |    Use as auto x = make_temp_override (flag); */ | 
| 2122 |  | 
| 2123 | template <typename T> | 
| 2124 | inline temp_override<T> | 
| 2125 | make_temp_override (T& var) | 
| 2126 | { | 
| 2127 |   return { var }; | 
| 2128 | } | 
| 2129 |  | 
| 2130 | /* Likewise, but use as auto x = make_temp_override (flag, value); */ | 
| 2131 |  | 
| 2132 | template <typename T> | 
| 2133 | inline temp_override<T> | 
| 2134 | make_temp_override (T& var, type_identity_t<T> overrider) | 
| 2135 | { | 
| 2136 |   return { var, overrider }; | 
| 2137 | } | 
| 2138 |  | 
| 2139 | /* temp_override for in_consteval_if_p, which can't use make_temp_override | 
| 2140 |    because it is a bitfield.  */ | 
| 2141 |  | 
| 2142 | struct in_consteval_if_p_temp_override { | 
| 2143 |   bool save_in_consteval_if_p; | 
| 2144 |   in_consteval_if_p_temp_override () | 
| 2145 |     : save_in_consteval_if_p (in_consteval_if_p) {} | 
| 2146 |   void reset () { in_consteval_if_p = save_in_consteval_if_p; } | 
| 2147 |   ~in_consteval_if_p_temp_override () | 
| 2148 |   { reset (); } | 
| 2149 | }; | 
| 2150 |  | 
| 2151 | /* The cached class binding level, from the most recently exited | 
| 2152 |    class, or NULL if none.  */ | 
| 2153 |  | 
| 2154 | #define previous_class_level scope_chain->x_previous_class_level | 
| 2155 |  | 
| 2156 | /* A map from local variable declarations in the body of the template | 
| 2157 |    presently being instantiated to the corresponding instantiated | 
| 2158 |    local variables.  */ | 
| 2159 |  | 
| 2160 | #define local_specializations scope_chain->x_local_specializations | 
| 2161 |  | 
| 2162 | /* Nonzero if we are parsing the operand of a noexcept operator.  */ | 
| 2163 |  | 
| 2164 | #define cp_noexcept_operand scope_chain->noexcept_operand | 
| 2165 |  | 
| 2166 | struct named_label_entry; /* Defined in decl.cc.  */ | 
| 2167 |  | 
| 2168 | struct named_label_hash : ggc_remove <named_label_entry *> | 
| 2169 | { | 
| 2170 |   typedef named_label_entry *value_type; | 
| 2171 |   typedef tree compare_type; /* An identifier.  */ | 
| 2172 |  | 
| 2173 |   inline static hashval_t hash (value_type); | 
| 2174 |   inline static bool equal (const value_type, compare_type); | 
| 2175 |  | 
| 2176 |   static const bool empty_zero_p = true; | 
| 2177 |   inline static void mark_empty (value_type &p) {p = NULL;} | 
| 2178 |   inline static bool is_empty (value_type p) {return !p;} | 
| 2179 |  | 
| 2180 |   /* Nothing is deletable.  Everything is insertable.  */ | 
| 2181 |   inline static bool is_deleted (value_type) { return false; } | 
| 2182 |   inline static void mark_deleted (value_type) { gcc_unreachable (); } | 
| 2183 | }; | 
| 2184 |  | 
| 2185 | /* Global state pertinent to the current function.  */ | 
| 2186 |  | 
| 2187 | struct GTY(()) language_function { | 
| 2188 |   struct c_language_function base; | 
| 2189 |  | 
| 2190 |   tree x_current_class_ptr; | 
| 2191 |   tree x_current_class_ref; | 
| 2192 |   tree x_eh_spec_block; | 
| 2193 |   tree x_in_charge_parm; | 
| 2194 |   tree x_vtt_parm; | 
| 2195 |   tree x_return_value; | 
| 2196 |  | 
| 2197 |   BOOL_BITFIELD returns_value : 1; | 
| 2198 |   BOOL_BITFIELD returns_null : 1; | 
| 2199 |   BOOL_BITFIELD returns_abnormally : 1; | 
| 2200 |   BOOL_BITFIELD infinite_loop: 1; | 
| 2201 |   BOOL_BITFIELD x_in_function_try_handler : 1; | 
| 2202 |   BOOL_BITFIELD x_in_base_initializer : 1; | 
| 2203 |  | 
| 2204 |   /* True if this function can throw an exception.  */ | 
| 2205 |   BOOL_BITFIELD can_throw : 1; | 
| 2206 |  | 
| 2207 |   BOOL_BITFIELD invalid_constexpr : 1; | 
| 2208 |   BOOL_BITFIELD throwing_cleanup : 1; | 
| 2209 |   /* True if we gave any errors in this function.  */ | 
| 2210 |   BOOL_BITFIELD erroneous : 1; | 
| 2211 |  | 
| 2212 |   hash_table<named_label_hash> *x_named_labels; | 
| 2213 |  | 
| 2214 |   cp_binding_level *bindings; | 
| 2215 |  | 
| 2216 |   /* Tracking possibly infinite loops.  This is a vec<tree> only because | 
| 2217 |      vec<bool> doesn't work with gtype.  */ | 
| 2218 |   vec<tree, va_gc> *infinite_loops; | 
| 2219 | }; | 
| 2220 |  | 
| 2221 | /* The current C++-specific per-function global variables.  */ | 
| 2222 |  | 
| 2223 | #define cp_function_chain (cfun->language) | 
| 2224 |  | 
| 2225 | /* When we're processing a member function, current_class_ptr is the | 
| 2226 |    PARM_DECL for the `this' pointer.  The current_class_ref is an | 
| 2227 |    expression for `*this'.  */ | 
| 2228 |  | 
| 2229 | #define current_class_ptr                        \ | 
| 2230 |   (*(cfun && cp_function_chain                        \ | 
| 2231 |      ? &cp_function_chain->x_current_class_ptr        \ | 
| 2232 |      : &scope_chain->x_current_class_ptr)) | 
| 2233 | #define current_class_ref                        \ | 
| 2234 |   (*(cfun && cp_function_chain                        \ | 
| 2235 |      ? &cp_function_chain->x_current_class_ref        \ | 
| 2236 |      : &scope_chain->x_current_class_ref)) | 
| 2237 |  | 
| 2238 | /* The EH_SPEC_BLOCK for the exception-specifiers for the current | 
| 2239 |    function, if any.  */ | 
| 2240 |  | 
| 2241 | #define current_eh_spec_block cp_function_chain->x_eh_spec_block | 
| 2242 |  | 
| 2243 | /* The `__in_chrg' parameter for the current function.  Only used for | 
| 2244 |    constructors and destructors.  */ | 
| 2245 |  | 
| 2246 | #define current_in_charge_parm cp_function_chain->x_in_charge_parm | 
| 2247 |  | 
| 2248 | /* The `__vtt_parm' parameter for the current function.  Only used for | 
| 2249 |    constructors and destructors.  */ | 
| 2250 |  | 
| 2251 | #define current_vtt_parm cp_function_chain->x_vtt_parm | 
| 2252 |  | 
| 2253 | /* A boolean flag to control whether we need to clean up the return value if a | 
| 2254 |    local destructor throws.  Only used in functions that return by value a | 
| 2255 |    class with a destructor.  Which 'tors don't, so we can use the same | 
| 2256 |    field as current_vtt_parm.  */ | 
| 2257 |  | 
| 2258 | #define current_retval_sentinel current_vtt_parm | 
| 2259 |  | 
| 2260 | /* Set to 0 at beginning of a function definition, set to 1 if | 
| 2261 |    a return statement that specifies a return value is seen.  */ | 
| 2262 |  | 
| 2263 | #define current_function_returns_value cp_function_chain->returns_value | 
| 2264 |  | 
| 2265 | /* Set to 0 at beginning of a function definition, set to 1 if | 
| 2266 |    a return statement with no argument is seen.  */ | 
| 2267 |  | 
| 2268 | #define current_function_returns_null cp_function_chain->returns_null | 
| 2269 |  | 
| 2270 | /* Set to 0 at beginning of a function definition, set to 1 if | 
| 2271 |    a call to a noreturn function is seen.  */ | 
| 2272 |  | 
| 2273 | #define current_function_returns_abnormally \ | 
| 2274 |   cp_function_chain->returns_abnormally | 
| 2275 |  | 
| 2276 | /* Set to 0 at beginning of a function definition, set to 1 if we see an | 
| 2277 |    obvious infinite loop.  This can have false positives and false | 
| 2278 |    negatives, so it should only be used as a heuristic.  */ | 
| 2279 |  | 
| 2280 | #define current_function_infinite_loop cp_function_chain->infinite_loop | 
| 2281 |  | 
| 2282 | /* Nonzero if we are processing a base initializer.  Zero elsewhere.  */ | 
| 2283 | #define in_base_initializer cp_function_chain->x_in_base_initializer | 
| 2284 |  | 
| 2285 | #define in_function_try_handler cp_function_chain->x_in_function_try_handler | 
| 2286 |  | 
| 2287 | /* Expression always returned from function, or error_mark_node | 
| 2288 |    otherwise, for use by the automatic named return value optimization.  */ | 
| 2289 |  | 
| 2290 | #define current_function_return_value \ | 
| 2291 |   (cp_function_chain->x_return_value) | 
| 2292 |  | 
| 2293 | /* In parser.cc.  */ | 
| 2294 | extern tree cp_literal_operator_id (const char *); | 
| 2295 |  | 
| 2296 | #define NON_ERROR(NODE) ((NODE) == error_mark_node ? NULL_TREE : (NODE)) | 
| 2297 |  | 
| 2298 | /* TRUE if a tree code represents a statement.  */ | 
| 2299 | extern bool statement_code_p[MAX_TREE_CODES]; | 
| 2300 |  | 
| 2301 | #define STATEMENT_CODE_P(CODE) statement_code_p[(int) (CODE)] | 
| 2302 |  | 
| 2303 | enum languages { lang_c, lang_cplusplus }; | 
| 2304 |  | 
| 2305 | /* Macros to make error reporting functions' lives easier.  */ | 
| 2306 | #define TYPE_LINKAGE_IDENTIFIER(NODE) \ | 
| 2307 |   (TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (NODE))) | 
| 2308 | #define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE))) | 
| 2309 | #define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE))) | 
| 2310 |  | 
| 2311 | /* Any kind of anonymous type.  */ | 
| 2312 | #define TYPE_ANON_P(NODE)                                        \ | 
| 2313 |   (TYPE_LINKAGE_IDENTIFIER (NODE)                                \ | 
| 2314 |    && IDENTIFIER_ANON_P (TYPE_LINKAGE_IDENTIFIER (NODE))) | 
| 2315 |  | 
| 2316 | /* Nonzero if NODE, a TYPE, has no name for linkage purposes.  */ | 
| 2317 | #define TYPE_UNNAMED_P(NODE)                                        \ | 
| 2318 |   (TYPE_ANON_P (NODE)                                                \ | 
| 2319 |    && !IDENTIFIER_LAMBDA_P (TYPE_LINKAGE_IDENTIFIER (NODE))) | 
| 2320 |  | 
| 2321 | /* The _DECL for this _TYPE.  */ | 
| 2322 | #define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE))) | 
| 2323 |  | 
| 2324 | /* Nonzero if T is a type that could resolve to any kind of concrete type | 
| 2325 |    at instantiation time.  */ | 
| 2326 | #define WILDCARD_TYPE_P(T)                                \ | 
| 2327 |   (TREE_CODE (T) == TEMPLATE_TYPE_PARM                        \ | 
| 2328 |    || TREE_CODE (T) == TYPENAME_TYPE                        \ | 
| 2329 |    || TREE_CODE (T) == TYPEOF_TYPE                        \ | 
| 2330 |    || TREE_CODE (T) == BOUND_TEMPLATE_TEMPLATE_PARM        \ | 
| 2331 |    || TREE_CODE (T) == UNBOUND_CLASS_TEMPLATE                \ | 
| 2332 |    || TREE_CODE (T) == DECLTYPE_TYPE                        \ | 
| 2333 |    || TREE_CODE (T) == TRAIT_TYPE                        \ | 
| 2334 |    || TREE_CODE (T) == DEPENDENT_OPERATOR_TYPE                \ | 
| 2335 |    || TREE_CODE (T) == PACK_INDEX_TYPE) | 
| 2336 |  | 
| 2337 | /* Nonzero if T is a class (or struct or union) type.  Also nonzero | 
| 2338 |    for template type parameters, typename types, and instantiated | 
| 2339 |    template template parameters.  Keep these checks in ascending code | 
| 2340 |    order.  */ | 
| 2341 | #define MAYBE_CLASS_TYPE_P(T) (WILDCARD_TYPE_P (T) || CLASS_TYPE_P (T)) | 
| 2342 |  | 
| 2343 | /* Set CLASS_TYPE_P for T to VAL.  T must be a class, struct, or | 
| 2344 |    union type.  */ | 
| 2345 | #define SET_CLASS_TYPE_P(T, VAL) \ | 
| 2346 |   (TYPE_LANG_FLAG_5 (RECORD_OR_UNION_CHECK (T)) = (VAL)) | 
| 2347 |  | 
| 2348 | /* Nonzero if T is a class type.  Zero for template type parameters, | 
| 2349 |    typename types, and so forth.  */ | 
| 2350 | #define CLASS_TYPE_P(T) \ | 
| 2351 |   (RECORD_OR_UNION_CODE_P (TREE_CODE (T)) && TYPE_LANG_FLAG_5 (T)) | 
| 2352 |  | 
| 2353 | /* Nonzero if T is a class type but not a union.  */ | 
| 2354 | #define NON_UNION_CLASS_TYPE_P(T) \ | 
| 2355 |   (TREE_CODE (T) == RECORD_TYPE && TYPE_LANG_FLAG_5 (T)) | 
| 2356 |  | 
| 2357 | /* Keep these checks in ascending code order.  */ | 
| 2358 | #define RECORD_OR_UNION_CODE_P(T)        \ | 
| 2359 |   ((T) == RECORD_TYPE || (T) == UNION_TYPE) | 
| 2360 | #define OVERLOAD_TYPE_P(T) \ | 
| 2361 |   (CLASS_TYPE_P (T) || TREE_CODE (T) == ENUMERAL_TYPE) | 
| 2362 |  | 
| 2363 | /* True if this type is dependent.  This predicate is only valid if | 
| 2364 |    TYPE_DEPENDENT_P_VALID is true.  */ | 
| 2365 | #define TYPE_DEPENDENT_P(NODE) TYPE_LANG_FLAG_0 (NODE) | 
| 2366 |  | 
| 2367 | /* True if dependent_type_p has been called for this type, with the | 
| 2368 |    result that TYPE_DEPENDENT_P is valid.  */ | 
| 2369 | #define TYPE_DEPENDENT_P_VALID(NODE) TYPE_LANG_FLAG_6(NODE) | 
| 2370 |  | 
| 2371 | /* Nonzero if this type is const-qualified.  */ | 
| 2372 | #define CP_TYPE_CONST_P(NODE)                                \ | 
| 2373 |   ((cp_type_quals (NODE) & TYPE_QUAL_CONST) != 0) | 
| 2374 |  | 
| 2375 | /* Nonzero if this type is volatile-qualified.  */ | 
| 2376 | #define CP_TYPE_VOLATILE_P(NODE)                        \ | 
| 2377 |   ((cp_type_quals (NODE) & TYPE_QUAL_VOLATILE) != 0) | 
| 2378 |  | 
| 2379 | /* Nonzero if this type is restrict-qualified.  */ | 
| 2380 | #define CP_TYPE_RESTRICT_P(NODE)                        \ | 
| 2381 |   ((cp_type_quals (NODE) & TYPE_QUAL_RESTRICT) != 0) | 
| 2382 |  | 
| 2383 | /* Nonzero if this type is const-qualified, but not | 
| 2384 |    volatile-qualified.  Other qualifiers are ignored.  This macro is | 
| 2385 |    used to test whether or not it is OK to bind an rvalue to a | 
| 2386 |    reference.  */ | 
| 2387 | #define CP_TYPE_CONST_NON_VOLATILE_P(NODE)                                \ | 
| 2388 |   ((cp_type_quals (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE))        \ | 
| 2389 |    == TYPE_QUAL_CONST) | 
| 2390 |  | 
| 2391 | #define FUNCTION_ARG_CHAIN(NODE) \ | 
| 2392 |   TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE))) | 
| 2393 |  | 
| 2394 | /* Given a FUNCTION_DECL, returns the first TREE_LIST out of TYPE_ARG_TYPES | 
| 2395 |    which refers to a user-written parameter.  */ | 
| 2396 | #define FUNCTION_FIRST_USER_PARMTYPE(NODE) \ | 
| 2397 |   skip_artificial_parms_for ((NODE), TYPE_ARG_TYPES (TREE_TYPE (NODE))) | 
| 2398 |  | 
| 2399 | /* Similarly, but for DECL_ARGUMENTS.  */ | 
| 2400 | #define FUNCTION_FIRST_USER_PARM(NODE) \ | 
| 2401 |   skip_artificial_parms_for ((NODE), DECL_ARGUMENTS (NODE)) | 
| 2402 |  | 
| 2403 | /* Nonzero iff TYPE is derived from PARENT. Ignores accessibility and | 
| 2404 |    ambiguity issues.  */ | 
| 2405 | #define DERIVED_FROM_P(PARENT, TYPE) \ | 
| 2406 |   (lookup_base ((TYPE), (PARENT), ba_any, NULL, tf_none) != NULL_TREE) | 
| 2407 |  | 
| 2408 | /* Gives the visibility specification for a class type.  */ | 
| 2409 | #define CLASSTYPE_VISIBILITY(TYPE)                \ | 
| 2410 |         DECL_VISIBILITY (TYPE_MAIN_DECL (TYPE)) | 
| 2411 | #define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE)        \ | 
| 2412 |         DECL_VISIBILITY_SPECIFIED (TYPE_MAIN_DECL (TYPE)) | 
| 2413 |  | 
| 2414 | struct GTY (()) tree_pair_s { | 
| 2415 |   tree purpose; | 
| 2416 |   tree value; | 
| 2417 | }; | 
| 2418 | typedef tree_pair_s *tree_pair_p; | 
| 2419 |  | 
| 2420 | /* This structure provides additional information above and beyond | 
| 2421 |    what is provide in the ordinary tree_type.  In the past, we used it | 
| 2422 |    for the types of class types, template parameters types, typename | 
| 2423 |    types, and so forth.  However, there can be many (tens to hundreds | 
| 2424 |    of thousands) of template parameter types in a compilation, and | 
| 2425 |    there's no need for this additional information in that case. | 
| 2426 |    Therefore, we now use this data structure only for class types. | 
| 2427 |  | 
| 2428 |    In the past, it was thought that there would be relatively few | 
| 2429 |    class types.  However, in the presence of heavy use of templates, | 
| 2430 |    many (i.e., thousands) of classes can easily be generated. | 
| 2431 |    Therefore, we should endeavor to keep the size of this structure to | 
| 2432 |    a minimum.  */ | 
| 2433 | struct GTY(()) lang_type { | 
| 2434 |   unsigned char align; | 
| 2435 |  | 
| 2436 |   unsigned has_type_conversion : 1; | 
| 2437 |   unsigned has_copy_ctor : 1; | 
| 2438 |   unsigned has_default_ctor : 1; | 
| 2439 |   unsigned const_needs_init : 1; | 
| 2440 |   unsigned ref_needs_init : 1; | 
| 2441 |   unsigned has_const_copy_assign : 1; | 
| 2442 |   unsigned use_template : 2; | 
| 2443 |  | 
| 2444 |   unsigned has_mutable : 1; | 
| 2445 |   unsigned com_interface : 1; | 
| 2446 |   unsigned non_pod_class : 1; | 
| 2447 |   unsigned nearly_empty_p : 1; | 
| 2448 |   unsigned user_align : 1; | 
| 2449 |   unsigned has_copy_assign : 1; | 
| 2450 |   unsigned has_new : 1; | 
| 2451 |   unsigned has_array_new : 1; | 
| 2452 |  | 
| 2453 |   unsigned gets_delete : 2; | 
| 2454 |   unsigned interface_only : 1; | 
| 2455 |   unsigned interface_unknown : 1; | 
| 2456 |   unsigned contains_empty_class_p : 1; | 
| 2457 |   unsigned anon_aggr : 1; | 
| 2458 |   unsigned non_zero_init : 1; | 
| 2459 |   unsigned empty_p : 1; | 
| 2460 |   /* 32 bits allocated.  */ | 
| 2461 |  | 
| 2462 |   unsigned vec_new_uses_cookie : 1; | 
| 2463 |   unsigned declared_class : 1; | 
| 2464 |   unsigned diamond_shaped : 1; | 
| 2465 |   unsigned repeated_base : 1; | 
| 2466 |   unsigned being_defined : 1; | 
| 2467 |   unsigned debug_requested : 1; | 
| 2468 |   unsigned fields_readonly : 1; | 
| 2469 |   unsigned ptrmemfunc_flag : 1; | 
| 2470 |  | 
| 2471 |   unsigned lazy_default_ctor : 1; | 
| 2472 |   unsigned lazy_copy_ctor : 1; | 
| 2473 |   unsigned lazy_copy_assign : 1; | 
| 2474 |   unsigned lazy_destructor : 1; | 
| 2475 |   unsigned has_const_copy_ctor : 1; | 
| 2476 |   unsigned has_complex_copy_ctor : 1; | 
| 2477 |   unsigned has_complex_copy_assign : 1; | 
| 2478 |   unsigned non_aggregate : 1; | 
| 2479 |  | 
| 2480 |   unsigned has_complex_dflt : 1; | 
| 2481 |   unsigned has_list_ctor : 1; | 
| 2482 |   unsigned non_std_layout : 1; | 
| 2483 |   unsigned is_literal : 1; | 
| 2484 |   unsigned lazy_move_ctor : 1; | 
| 2485 |   unsigned lazy_move_assign : 1; | 
| 2486 |   unsigned has_complex_move_ctor : 1; | 
| 2487 |   unsigned has_complex_move_assign : 1; | 
| 2488 |  | 
| 2489 |   unsigned has_constexpr_ctor : 1; | 
| 2490 |   unsigned unique_obj_representations : 1; | 
| 2491 |   unsigned unique_obj_representations_set : 1; | 
| 2492 |   bool erroneous : 1; | 
| 2493 |   bool non_pod_aggregate : 1; | 
| 2494 |   bool non_aggregate_pod : 1; | 
| 2495 |  | 
| 2496 |   /* When adding a flag here, consider whether or not it ought to | 
| 2497 |      apply to a template instance if it applies to the template.  If | 
| 2498 |      so, make sure to copy it in instantiate_class_template!  */ | 
| 2499 |  | 
| 2500 |   /* There are some bits left to fill out a 32-bit word.  Keep track | 
| 2501 |      of this by updating the size of this bitfield whenever you add or | 
| 2502 |      remove a flag.  */ | 
| 2503 |   unsigned dummy : 2; | 
| 2504 |  | 
| 2505 |   tree primary_base; | 
| 2506 |   vec<tree_pair_s, va_gc> *vcall_indices; | 
| 2507 |   tree vtables; | 
| 2508 |   tree typeinfo_var; | 
| 2509 |   vec<tree, va_gc> *vbases; | 
| 2510 |   tree as_base; | 
| 2511 |   vec<tree, va_gc> *pure_virtuals; | 
| 2512 |   tree friend_classes; | 
| 2513 |   vec<tree, va_gc> * GTY((reorder ("resort_type_member_vec" ))) members; | 
| 2514 |   tree key_method; | 
| 2515 |   tree decl_list; | 
| 2516 |   tree befriending_classes; | 
| 2517 |   /* In a RECORD_TYPE, information specific to Objective-C++, such | 
| 2518 |      as a list of adopted protocols or a pointer to a corresponding | 
| 2519 |      @interface.  See objc/objc-act.h for details.  */ | 
| 2520 |   tree objc_info; | 
| 2521 |   /* FIXME reuse another field?  */ | 
| 2522 |   tree lambda_expr; | 
| 2523 | }; | 
| 2524 |  | 
| 2525 | /* We used to have a variant type for lang_type.  Keep the name of the | 
| 2526 |    checking accessor for the sole survivor.  */ | 
| 2527 | #define LANG_TYPE_CLASS_CHECK(NODE) (TYPE_LANG_SPECIFIC (NODE)) | 
| 2528 |  | 
| 2529 | /* Nonzero for _CLASSTYPE means that operator delete is defined.  */ | 
| 2530 | #define TYPE_GETS_DELETE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->gets_delete) | 
| 2531 | #define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1) | 
| 2532 | #define TYPE_GETS_VEC_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 2) | 
| 2533 |  | 
| 2534 | /* Nonzero if `new NODE[x]' should cause the allocation of extra | 
| 2535 |    storage to indicate how many array elements are in use.  */ | 
| 2536 | #define TYPE_VEC_NEW_USES_COOKIE(NODE)                        \ | 
| 2537 |   (CLASS_TYPE_P (NODE)                                        \ | 
| 2538 |    && LANG_TYPE_CLASS_CHECK (NODE)->vec_new_uses_cookie) | 
| 2539 |  | 
| 2540 | /* Nonzero means that this _CLASSTYPE node defines ways of converting | 
| 2541 |    itself to other types.  */ | 
| 2542 | #define TYPE_HAS_CONVERSION(NODE) \ | 
| 2543 |   (LANG_TYPE_CLASS_CHECK (NODE)->has_type_conversion) | 
| 2544 |  | 
| 2545 | /* Nonzero means that NODE (a class type) has a default constructor -- | 
| 2546 |    but that it has not yet been declared.  */ | 
| 2547 | #define CLASSTYPE_LAZY_DEFAULT_CTOR(NODE) \ | 
| 2548 |   (LANG_TYPE_CLASS_CHECK (NODE)->lazy_default_ctor) | 
| 2549 |  | 
| 2550 | /* Nonzero means that NODE (a class type) has a copy constructor -- | 
| 2551 |    but that it has not yet been declared.  */ | 
| 2552 | #define CLASSTYPE_LAZY_COPY_CTOR(NODE) \ | 
| 2553 |   (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_ctor) | 
| 2554 |  | 
| 2555 | /* Nonzero means that NODE (a class type) has a move constructor -- | 
| 2556 |    but that it has not yet been declared.  */ | 
| 2557 | #define CLASSTYPE_LAZY_MOVE_CTOR(NODE) \ | 
| 2558 |   (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_ctor) | 
| 2559 |  | 
| 2560 | /* Nonzero means that NODE (a class type) has an assignment operator | 
| 2561 |    -- but that it has not yet been declared.  */ | 
| 2562 | #define CLASSTYPE_LAZY_COPY_ASSIGN(NODE) \ | 
| 2563 |   (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_assign) | 
| 2564 |  | 
| 2565 | /* Nonzero means that NODE (a class type) has an assignment operator | 
| 2566 |    -- but that it has not yet been declared.  */ | 
| 2567 | #define CLASSTYPE_LAZY_MOVE_ASSIGN(NODE) \ | 
| 2568 |   (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_assign) | 
| 2569 |  | 
| 2570 | /* Nonzero means that NODE (a class type) has a destructor -- but that | 
| 2571 |    it has not yet been declared.  */ | 
| 2572 | #define CLASSTYPE_LAZY_DESTRUCTOR(NODE) \ | 
| 2573 |   (LANG_TYPE_CLASS_CHECK (NODE)->lazy_destructor) | 
| 2574 |  | 
| 2575 | /* Nonzero means that NODE (a class type) is final */ | 
| 2576 | #define CLASSTYPE_FINAL(NODE) \ | 
| 2577 |   TYPE_FINAL_P (NODE) | 
| 2578 |  | 
| 2579 |  | 
| 2580 | /* Nonzero means that this _CLASSTYPE node overloads operator=(X&).  */ | 
| 2581 | #define TYPE_HAS_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_copy_assign) | 
| 2582 |  | 
| 2583 | /* True iff the class type NODE has an "operator =" whose parameter | 
| 2584 |    has a parameter of type "const X&".  */ | 
| 2585 | #define TYPE_HAS_CONST_COPY_ASSIGN(NODE) \ | 
| 2586 |   (LANG_TYPE_CLASS_CHECK (NODE)->has_const_copy_assign) | 
| 2587 |  | 
| 2588 | /* Nonzero means that this _CLASSTYPE node has an X(X&) constructor.  */ | 
| 2589 | #define TYPE_HAS_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_copy_ctor) | 
| 2590 | #define TYPE_HAS_CONST_COPY_CTOR(NODE) \ | 
| 2591 |   (LANG_TYPE_CLASS_CHECK (NODE)->has_const_copy_ctor) | 
| 2592 |  | 
| 2593 | /* Nonzero if this class has an X(initializer_list<T>) constructor.  */ | 
| 2594 | #define TYPE_HAS_LIST_CTOR(NODE) \ | 
| 2595 |   (LANG_TYPE_CLASS_CHECK (NODE)->has_list_ctor) | 
| 2596 |  | 
| 2597 | /* Nonzero if this class has a constexpr constructor other than a copy/move | 
| 2598 |    constructor.  Note that a class can have constexpr constructors for | 
| 2599 |    static initialization even if it isn't a literal class.  */ | 
| 2600 | #define TYPE_HAS_CONSTEXPR_CTOR(NODE) \ | 
| 2601 |   (LANG_TYPE_CLASS_CHECK (NODE)->has_constexpr_ctor) | 
| 2602 |  | 
| 2603 | /* Nonzero if this class defines an overloaded operator new.  (An | 
| 2604 |    operator new [] doesn't count.)  */ | 
| 2605 | #define TYPE_HAS_NEW_OPERATOR(NODE) \ | 
| 2606 |   (LANG_TYPE_CLASS_CHECK (NODE)->has_new) | 
| 2607 |  | 
| 2608 | /* Nonzero if this class defines an overloaded operator new[].  */ | 
| 2609 | #define TYPE_HAS_ARRAY_NEW_OPERATOR(NODE) \ | 
| 2610 |   (LANG_TYPE_CLASS_CHECK (NODE)->has_array_new) | 
| 2611 |  | 
| 2612 | /* Nonzero means that this type is being defined.  I.e., the left brace | 
| 2613 |    starting the definition of this type has been seen.  */ | 
| 2614 | #define TYPE_BEING_DEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->being_defined) | 
| 2615 |  | 
| 2616 | /* Nonzero means that this type is either complete or being defined, so we | 
| 2617 |    can do lookup in it.  */ | 
| 2618 | #define COMPLETE_OR_OPEN_TYPE_P(NODE) \ | 
| 2619 |   (COMPLETE_TYPE_P (NODE) || (CLASS_TYPE_P (NODE) && TYPE_BEING_DEFINED (NODE))) | 
| 2620 |  | 
| 2621 | /* Mark bits for repeated base checks.  */ | 
| 2622 | #define TYPE_MARKED_P(NODE) TREE_LANG_FLAG_6 (TYPE_CHECK (NODE)) | 
| 2623 |  | 
| 2624 | /* Nonzero if the class NODE has multiple paths to the same (virtual) | 
| 2625 |    base object.  */ | 
| 2626 | #define CLASSTYPE_DIAMOND_SHAPED_P(NODE) \ | 
| 2627 |   (LANG_TYPE_CLASS_CHECK(NODE)->diamond_shaped) | 
| 2628 |  | 
| 2629 | /* Nonzero if the class NODE has multiple instances of the same base | 
| 2630 |    type.  */ | 
| 2631 | #define CLASSTYPE_REPEATED_BASE_P(NODE) \ | 
| 2632 |   (LANG_TYPE_CLASS_CHECK(NODE)->repeated_base) | 
| 2633 |  | 
| 2634 | /* The member function with which the vtable will be emitted: | 
| 2635 |    the first noninline non-pure-virtual member function.  NULL_TREE | 
| 2636 |    if there is no key function or if this is a class template */ | 
| 2637 | #define CLASSTYPE_KEY_METHOD(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->key_method) | 
| 2638 |  | 
| 2639 | /* Vector of members.  During definition, it is unordered and only | 
| 2640 |    member functions are present.  After completion it is sorted and | 
| 2641 |    contains both member functions and non-functions.  STAT_HACK is | 
| 2642 |    involved to preserve oneslot per name invariant.  */ | 
| 2643 | #define CLASSTYPE_MEMBER_VEC(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->members) | 
| 2644 |  | 
| 2645 | /* For class templates, this is a TREE_LIST of all member data, | 
| 2646 |    functions, types, and friends in the order of declaration. | 
| 2647 |    The TREE_PURPOSE of each TREE_LIST is NULL_TREE for a friend, | 
| 2648 |    and the RECORD_TYPE for the class template otherwise.  */ | 
| 2649 | #define CLASSTYPE_DECL_LIST(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->decl_list) | 
| 2650 |  | 
| 2651 | /* A FUNCTION_DECL or OVERLOAD for the constructors for NODE.  These | 
| 2652 |    are the constructors that take an in-charge parameter.  */ | 
| 2653 | #define CLASSTYPE_CONSTRUCTORS(NODE) \ | 
| 2654 |   (get_class_binding_direct (NODE, ctor_identifier)) | 
| 2655 |  | 
| 2656 | /* A FUNCTION_DECL for the destructor for NODE.  This is the | 
| 2657 |    destructors that take an in-charge parameter.  If | 
| 2658 |    CLASSTYPE_LAZY_DESTRUCTOR is true, then this entry will be NULL | 
| 2659 |    until the destructor is created with lazily_declare_fn.  */ | 
| 2660 | #define CLASSTYPE_DESTRUCTOR(NODE) \ | 
| 2661 |   (get_class_binding_direct (NODE, dtor_identifier)) | 
| 2662 |  | 
| 2663 | /* Nonzero if NODE has a primary base class, i.e., a base class with | 
| 2664 |    which it shares the virtual function table pointer.  */ | 
| 2665 | #define CLASSTYPE_HAS_PRIMARY_BASE_P(NODE) \ | 
| 2666 |   (CLASSTYPE_PRIMARY_BINFO (NODE) != NULL_TREE) | 
| 2667 |  | 
| 2668 | /* If non-NULL, this is the binfo for the primary base class, i.e., | 
| 2669 |    the base class which contains the virtual function table pointer | 
| 2670 |    for this class.  */ | 
| 2671 | #define CLASSTYPE_PRIMARY_BINFO(NODE) \ | 
| 2672 |   (LANG_TYPE_CLASS_CHECK (NODE)->primary_base) | 
| 2673 |  | 
| 2674 | /* A vector of BINFOs for the direct and indirect virtual base classes | 
| 2675 |    that this type uses in a post-order depth-first left-to-right | 
| 2676 |    order.  (In other words, these bases appear in the order that they | 
| 2677 |    should be initialized.)  */ | 
| 2678 | #define CLASSTYPE_VBASECLASSES(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->vbases) | 
| 2679 |  | 
| 2680 | /* The type corresponding to NODE when NODE is used as a base class, | 
| 2681 |    i.e., NODE without virtual base classes or tail padding.  */ | 
| 2682 | #define CLASSTYPE_AS_BASE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->as_base) | 
| 2683 |  | 
| 2684 | /* True iff NODE is the CLASSTYPE_AS_BASE version of some type.  */ | 
| 2685 | #define IS_FAKE_BASE_TYPE(NODE)                                        \ | 
| 2686 |   (RECORD_OR_UNION_TYPE_P (NODE)                                \ | 
| 2687 |    && TYPE_CONTEXT (NODE) && CLASS_TYPE_P (TYPE_CONTEXT (NODE))        \ | 
| 2688 |    && CLASSTYPE_AS_BASE (TYPE_CONTEXT (NODE)) == (NODE)) | 
| 2689 |  | 
| 2690 | /* These are the size and alignment of the type without its virtual | 
| 2691 |    base classes, for when we use this type as a base itself.  */ | 
| 2692 | #define CLASSTYPE_SIZE(NODE) TYPE_SIZE (CLASSTYPE_AS_BASE (NODE)) | 
| 2693 | #define CLASSTYPE_SIZE_UNIT(NODE) TYPE_SIZE_UNIT (CLASSTYPE_AS_BASE (NODE)) | 
| 2694 | #define CLASSTYPE_ALIGN(NODE) TYPE_ALIGN (CLASSTYPE_AS_BASE (NODE)) | 
| 2695 | #define CLASSTYPE_USER_ALIGN(NODE) TYPE_USER_ALIGN (CLASSTYPE_AS_BASE (NODE)) | 
| 2696 |  | 
| 2697 | /* The alignment of NODE, without its virtual bases, in bytes.  */ | 
| 2698 | #define CLASSTYPE_ALIGN_UNIT(NODE) \ | 
| 2699 |   (CLASSTYPE_ALIGN (NODE) / BITS_PER_UNIT) | 
| 2700 |  | 
| 2701 | /* A vec<tree> of virtual functions which cannot be inherited by | 
| 2702 |    derived classes.  When deriving from this type, the derived | 
| 2703 |    class must provide its own definition for each of these functions.  */ | 
| 2704 | #define CLASSTYPE_PURE_VIRTUALS(NODE) \ | 
| 2705 |   (LANG_TYPE_CLASS_CHECK (NODE)->pure_virtuals) | 
| 2706 |  | 
| 2707 | /* Nonzero means that this type is an abstract class type.  */ | 
| 2708 | #define ABSTRACT_CLASS_TYPE_P(NODE) \ | 
| 2709 |   (CLASS_TYPE_P (NODE) && CLASSTYPE_PURE_VIRTUALS(NODE)) | 
| 2710 |  | 
| 2711 | /* Nonzero means that this type has an X() constructor.  */ | 
| 2712 | #define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) \ | 
| 2713 |   (LANG_TYPE_CLASS_CHECK (NODE)->has_default_ctor) | 
| 2714 |  | 
| 2715 | /* Nonzero means that this type contains a mutable member.  */ | 
| 2716 | #define CLASSTYPE_HAS_MUTABLE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_mutable) | 
| 2717 | #define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE)) | 
| 2718 |  | 
| 2719 | /* Nonzero means that this class type is not POD for the purpose of layout | 
| 2720 |    (as defined in the ABI).  This is different from the language's POD.  */ | 
| 2721 | #define CLASSTYPE_NON_LAYOUT_POD_P(NODE) \ | 
| 2722 |   (LANG_TYPE_CLASS_CHECK (NODE)->non_pod_class) | 
| 2723 |  | 
| 2724 | /* Nonzero means that this class type is a non-standard-layout class.  */ | 
| 2725 | #define CLASSTYPE_NON_STD_LAYOUT(NODE) \ | 
| 2726 |   (LANG_TYPE_CLASS_CHECK (NODE)->non_std_layout) | 
| 2727 |  | 
| 2728 | /* Nonzero means that this class type does have unique object | 
| 2729 |    representations.  */ | 
| 2730 | #define CLASSTYPE_UNIQUE_OBJ_REPRESENTATIONS(NODE) \ | 
| 2731 |   (LANG_TYPE_CLASS_CHECK (NODE)->unique_obj_representations) | 
| 2732 |  | 
| 2733 | /* Nonzero means that this class type has | 
| 2734 |    CLASSTYPE_UNIQUE_OBJ_REPRESENTATIONS computed.  */ | 
| 2735 | #define CLASSTYPE_UNIQUE_OBJ_REPRESENTATIONS_SET(NODE) \ | 
| 2736 |   (LANG_TYPE_CLASS_CHECK (NODE)->unique_obj_representations_set) | 
| 2737 |  | 
| 2738 | /* Nonzero means that this class contains pod types whose default | 
| 2739 |    initialization is not a zero initialization (namely, pointers to | 
| 2740 |    data members).  */ | 
| 2741 | #define CLASSTYPE_NON_ZERO_INIT_P(NODE) \ | 
| 2742 |   (LANG_TYPE_CLASS_CHECK (NODE)->non_zero_init) | 
| 2743 |  | 
| 2744 | /* Nonzero if this class is "empty" in the sense of the C++ ABI.  */ | 
| 2745 | #define CLASSTYPE_EMPTY_P(NODE) \ | 
| 2746 |   (LANG_TYPE_CLASS_CHECK (NODE)->empty_p) | 
| 2747 |  | 
| 2748 | /* Nonzero if this class is "nearly empty", i.e., contains only a | 
| 2749 |    virtual function table pointer.  */ | 
| 2750 | #define CLASSTYPE_NEARLY_EMPTY_P(NODE) \ | 
| 2751 |   (LANG_TYPE_CLASS_CHECK (NODE)->nearly_empty_p) | 
| 2752 |  | 
| 2753 | /* Nonzero if this class contains an empty subobject.  */ | 
| 2754 | #define CLASSTYPE_CONTAINS_EMPTY_CLASS_P(NODE) \ | 
| 2755 |   (LANG_TYPE_CLASS_CHECK (NODE)->contains_empty_class_p) | 
| 2756 |  | 
| 2757 | /* A list of class types of which this type is a friend.  The | 
| 2758 |    TREE_VALUE is normally a TYPE, but will be a TEMPLATE_DECL in the | 
| 2759 |    case of a template friend.  */ | 
| 2760 | #define CLASSTYPE_FRIEND_CLASSES(NODE) \ | 
| 2761 |   (LANG_TYPE_CLASS_CHECK (NODE)->friend_classes) | 
| 2762 |  | 
| 2763 | /* A list of the classes which grant friendship to this class.  */ | 
| 2764 | #define CLASSTYPE_BEFRIENDING_CLASSES(NODE) \ | 
| 2765 |   (LANG_TYPE_CLASS_CHECK (NODE)->befriending_classes) | 
| 2766 |  | 
| 2767 | /* The associated LAMBDA_EXPR that made this class.  */ | 
| 2768 | #define CLASSTYPE_LAMBDA_EXPR(NODE) \ | 
| 2769 |   (LANG_TYPE_CLASS_CHECK (NODE)->lambda_expr) | 
| 2770 | /* The extra mangling scope for this closure type.  */ | 
| 2771 | #define (NODE) \ | 
| 2772 |   (LAMBDA_EXPR_EXTRA_SCOPE (CLASSTYPE_LAMBDA_EXPR (NODE))) | 
| 2773 |  | 
| 2774 | /* Say whether this node was declared as a "class" or a "struct".  */ | 
| 2775 | #define CLASSTYPE_DECLARED_CLASS(NODE) \ | 
| 2776 |   (LANG_TYPE_CLASS_CHECK (NODE)->declared_class) | 
| 2777 |  | 
| 2778 | /* Nonzero if this class has const members | 
| 2779 |    which have no specified initialization.  */ | 
| 2780 | #define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE)        \ | 
| 2781 |   (TYPE_LANG_SPECIFIC (NODE)                                \ | 
| 2782 |    ? LANG_TYPE_CLASS_CHECK (NODE)->const_needs_init : 0) | 
| 2783 | #define SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE, VALUE) \ | 
| 2784 |   (LANG_TYPE_CLASS_CHECK (NODE)->const_needs_init = (VALUE)) | 
| 2785 |  | 
| 2786 | /* Nonzero if this class has ref members | 
| 2787 |    which have no specified initialization.  */ | 
| 2788 | #define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE)                \ | 
| 2789 |   (TYPE_LANG_SPECIFIC (NODE)                                \ | 
| 2790 |    ? LANG_TYPE_CLASS_CHECK (NODE)->ref_needs_init : 0) | 
| 2791 | #define SET_CLASSTYPE_REF_FIELDS_NEED_INIT(NODE, VALUE) \ | 
| 2792 |   (LANG_TYPE_CLASS_CHECK (NODE)->ref_needs_init = (VALUE)) | 
| 2793 |  | 
| 2794 | /* Nonzero if this class is included from a header file which employs | 
| 2795 |    `#pragma interface', and it is not included in its implementation file.  */ | 
| 2796 | #define CLASSTYPE_INTERFACE_ONLY(NODE) \ | 
| 2797 |   (LANG_TYPE_CLASS_CHECK (NODE)->interface_only) | 
| 2798 |  | 
| 2799 | /* True if we have already determined whether or not vtables, VTTs, | 
| 2800 |    typeinfo, and other similar per-class data should be emitted in | 
| 2801 |    this translation unit.  This flag does not indicate whether or not | 
| 2802 |    these items should be emitted; it only indicates that we know one | 
| 2803 |    way or the other.  */ | 
| 2804 | #define CLASSTYPE_INTERFACE_KNOWN(NODE) \ | 
| 2805 |   (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown == 0) | 
| 2806 | /* The opposite of CLASSTYPE_INTERFACE_KNOWN.  */ | 
| 2807 | #define CLASSTYPE_INTERFACE_UNKNOWN(NODE) \ | 
| 2808 |   (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown) | 
| 2809 |  | 
| 2810 | #define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) \ | 
| 2811 |   (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = !!(X)) | 
| 2812 | #define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) \ | 
| 2813 |   (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 1) | 
| 2814 | #define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) \ | 
| 2815 |   (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 0) | 
| 2816 |  | 
| 2817 | /* Nonzero if a _DECL node requires us to output debug info for this class.  */ | 
| 2818 | #define CLASSTYPE_DEBUG_REQUESTED(NODE) \ | 
| 2819 |   (LANG_TYPE_CLASS_CHECK (NODE)->debug_requested) | 
| 2820 |  | 
| 2821 | /* True if we saw errors while instantiating this class.  */ | 
| 2822 | #define CLASSTYPE_ERRONEOUS(NODE) \ | 
| 2823 |   (LANG_TYPE_CLASS_CHECK (NODE)->erroneous) | 
| 2824 |  | 
| 2825 | /* True if this class is non-layout-POD only because it was not an aggregate | 
| 2826 |    before C++14.  If we run out of bits in lang_type, this could be replaced | 
| 2827 |    with a hash_set only filled in when abi_version_crosses (17).  */ | 
| 2828 | #define CLASSTYPE_NON_POD_AGGREGATE(NODE) \ | 
| 2829 |   (LANG_TYPE_CLASS_CHECK (NODE)->non_pod_aggregate) | 
| 2830 |  | 
| 2831 | /* True if this class is layout-POD though it's not an aggregate in C++20 and | 
| 2832 |    above (c++/120012).  This could also be a hash_set.  */ | 
| 2833 | #define CLASSTYPE_NON_AGGREGATE_POD(NODE) \ | 
| 2834 |   (LANG_TYPE_CLASS_CHECK (NODE)->non_aggregate_pod) | 
| 2835 |  | 
| 2836 | /* Additional macros for inheritance information.  */ | 
| 2837 |  | 
| 2838 | /* Nonzero means that this class is on a path leading to a new vtable.  */ | 
| 2839 | #define BINFO_VTABLE_PATH_MARKED(NODE) BINFO_FLAG_1 (NODE) | 
| 2840 |  | 
| 2841 | /* Nonzero means B (a BINFO) has its own vtable.  Any copies will not | 
| 2842 |    have this flag set.  */ | 
| 2843 | #define BINFO_NEW_VTABLE_MARKED(B) (BINFO_FLAG_2 (B)) | 
| 2844 |  | 
| 2845 | /* Compare a BINFO_TYPE with another type for equality.  For a binfo, | 
| 2846 |    this is functionally equivalent to using same_type_p, but | 
| 2847 |    measurably faster.  At least one of the arguments must be a | 
| 2848 |    BINFO_TYPE.  The other can be a BINFO_TYPE or a regular type.  If | 
| 2849 |    BINFO_TYPE(T) ever stops being the main variant of the class the | 
| 2850 |    binfo is for, this macro must change.  */ | 
| 2851 | #define SAME_BINFO_TYPE_P(A, B) ((A) == (B)) | 
| 2852 |  | 
| 2853 | /* Any subobject that needs a new vtable must have a vptr and must not | 
| 2854 |    be a non-virtual primary base (since it would then use the vtable from a | 
| 2855 |    derived class and never become non-primary.)  */ | 
| 2856 | #define SET_BINFO_NEW_VTABLE_MARKED(B)                                         \ | 
| 2857 |   (BINFO_NEW_VTABLE_MARKED (B) = 1,                                         \ | 
| 2858 |    gcc_assert (!BINFO_PRIMARY_P (B) || BINFO_VIRTUAL_P (B)),                 \ | 
| 2859 |    gcc_assert (TYPE_VFIELD (BINFO_TYPE (B)))) | 
| 2860 |  | 
| 2861 | /* Nonzero if this binfo is for a dependent base - one that should not | 
| 2862 |    be searched.  */ | 
| 2863 | #define BINFO_DEPENDENT_BASE_P(NODE) BINFO_FLAG_3 (NODE) | 
| 2864 |  | 
| 2865 | /* Nonzero if this binfo has lost its primary base binfo (because that | 
| 2866 |    is a nearly-empty virtual base that has been taken by some other | 
| 2867 |    base in the complete hierarchy.  */ | 
| 2868 | #define BINFO_LOST_PRIMARY_P(NODE) BINFO_FLAG_4 (NODE) | 
| 2869 |  | 
| 2870 | /* Nonzero if this BINFO is a primary base class.  */ | 
| 2871 | #define BINFO_PRIMARY_P(NODE) BINFO_FLAG_5(NODE) | 
| 2872 |  | 
| 2873 | /* A vec<tree_pair_s> of the vcall indices associated with the class | 
| 2874 |    NODE.  The PURPOSE of each element is a FUNCTION_DECL for a virtual | 
| 2875 |    function.  The VALUE is the index into the virtual table where the | 
| 2876 |    vcall offset for that function is stored, when NODE is a virtual | 
| 2877 |    base.  */ | 
| 2878 | #define CLASSTYPE_VCALL_INDICES(NODE) \ | 
| 2879 |   (LANG_TYPE_CLASS_CHECK (NODE)->vcall_indices) | 
| 2880 |  | 
| 2881 | /* The various vtables for the class NODE.  The primary vtable will be | 
| 2882 |    first, followed by the construction vtables and VTT, if any.  */ | 
| 2883 | #define CLASSTYPE_VTABLES(NODE) \ | 
| 2884 |   (LANG_TYPE_CLASS_CHECK (NODE)->vtables) | 
| 2885 |  | 
| 2886 | /* The std::type_info variable representing this class, or NULL if no | 
| 2887 |    such variable has been created.  This field is only set for the | 
| 2888 |    TYPE_MAIN_VARIANT of the class.  */ | 
| 2889 | #define CLASSTYPE_TYPEINFO_VAR(NODE) \ | 
| 2890 |   (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var) | 
| 2891 |  | 
| 2892 | /* Accessor macros for the BINFO_VIRTUALS list.  */ | 
| 2893 |  | 
| 2894 | /* The number of bytes by which to adjust the `this' pointer when | 
| 2895 |    calling this virtual function.  Subtract this value from the this | 
| 2896 |    pointer. Always non-NULL, might be constant zero though.  */ | 
| 2897 | #define BV_DELTA(NODE) (TREE_PURPOSE (NODE)) | 
| 2898 |  | 
| 2899 | /* If non-NULL, the vtable index at which to find the vcall offset | 
| 2900 |    when calling this virtual function.  Add the value at that vtable | 
| 2901 |    index to the this pointer.  */ | 
| 2902 | #define BV_VCALL_INDEX(NODE) (TREE_TYPE (NODE)) | 
| 2903 |  | 
| 2904 | /* The function to call.  */ | 
| 2905 | #define BV_FN(NODE) (TREE_VALUE (NODE)) | 
| 2906 |  | 
| 2907 | /* Whether or not this entry is for a lost primary virtual base.  */ | 
| 2908 | #define BV_LOST_PRIMARY(NODE) (TREE_LANG_FLAG_0 (NODE)) | 
| 2909 |  | 
| 2910 | /* For FUNCTION_TYPE or METHOD_TYPE, a list of the exceptions that | 
| 2911 |    this type can raise.  Each TREE_VALUE is a _TYPE.  The TREE_VALUE | 
| 2912 |    will be NULL_TREE to indicate a throw specification of `()', or | 
| 2913 |    no exceptions allowed.  For a noexcept specification, TREE_VALUE | 
| 2914 |    is NULL_TREE and TREE_PURPOSE is the constant-expression.  For | 
| 2915 |    a deferred noexcept-specification, TREE_PURPOSE is a DEFERRED_NOEXCEPT | 
| 2916 |    (for templates) or an OVERLOAD list of functions (for implicitly | 
| 2917 |    declared functions).  */ | 
| 2918 | #define TYPE_RAISES_EXCEPTIONS(NODE) \ | 
| 2919 |   TYPE_LANG_SLOT_1 (FUNC_OR_METHOD_CHECK (NODE)) | 
| 2920 |  | 
| 2921 | /* For FUNCTION_TYPE or METHOD_TYPE, return 1 iff it is declared `throw()' | 
| 2922 |    or noexcept(true).  */ | 
| 2923 | #define TYPE_NOTHROW_P(NODE) nothrow_spec_p (TYPE_RAISES_EXCEPTIONS (NODE)) | 
| 2924 |  | 
| 2925 | /* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept.  This is the | 
| 2926 |    case for things declared noexcept(true) and, with -fnothrow-opt, for | 
| 2927 |    throw() functions.  */ | 
| 2928 | #define TYPE_NOEXCEPT_P(NODE) type_noexcept_p (NODE) | 
| 2929 |  | 
| 2930 | /* The binding level associated with the namespace.  */ | 
| 2931 | #define NAMESPACE_LEVEL(NODE) \ | 
| 2932 |   (LANG_DECL_NS_CHECK (NODE)->level) | 
| 2933 |  | 
| 2934 | /* Discriminator values for lang_decl.  */ | 
| 2935 |  | 
| 2936 | enum lang_decl_selector | 
| 2937 | { | 
| 2938 |   lds_min, | 
| 2939 |   lds_fn, | 
| 2940 |   lds_ns, | 
| 2941 |   lds_parm, | 
| 2942 |   lds_decomp | 
| 2943 | }; | 
| 2944 |  | 
| 2945 | /* Flags shared by all forms of DECL_LANG_SPECIFIC. | 
| 2946 |  | 
| 2947 |    Some of the flags live here only to make lang_decl_min/fn smaller.  Do | 
| 2948 |    not make this struct larger than 32 bits.  */ | 
| 2949 |  | 
| 2950 | struct GTY(()) lang_decl_base { | 
| 2951 |   ENUM_BITFIELD(lang_decl_selector) selector : 3; | 
| 2952 |   ENUM_BITFIELD(languages) language : 1; | 
| 2953 |   unsigned use_template : 2; | 
| 2954 |   unsigned not_really_extern : 1;           /* var or fn */ | 
| 2955 |   unsigned initialized_in_class : 1;           /* var or fn */ | 
| 2956 |  | 
| 2957 |   unsigned threadprivate_or_deleted_p : 1; /* var or fn */ | 
| 2958 |   /* anticipated_p is no longer used for anticipated_decls (fn, type | 
| 2959 |      or template).  It is used as DECL_OMP_PRIVATIZED_MEMBER in | 
| 2960 |      var.  */ | 
| 2961 |   unsigned anticipated_p : 1; | 
| 2962 |   unsigned friend_or_tls : 1;                   /* var, fn, type or template */ | 
| 2963 |   unsigned unknown_bound_p : 1;                   /* var */ | 
| 2964 |   unsigned odr_used : 1;                   /* var or fn */ | 
| 2965 |   unsigned concept_p : 1;                   /* applies to vars and functions */ | 
| 2966 |   unsigned var_declared_inline_p : 1;           /* var */ | 
| 2967 |   unsigned dependent_init_p : 1;           /* var */ | 
| 2968 |  | 
| 2969 |   /* The following four apply to VAR, FUNCTION, TYPE, CONCEPT, & NAMESPACE | 
| 2970 |      decls.  */ | 
| 2971 |   unsigned module_purview_p : 1;           /* in named-module purview */ | 
| 2972 |   unsigned module_attach_p : 1;                   /* attached to named module */ | 
| 2973 |   unsigned module_import_p : 1;                   /* from an import */ | 
| 2974 |   unsigned module_entity_p : 1;                   /* is in the entitity ary & hash */ | 
| 2975 |  | 
| 2976 |   unsigned module_keyed_decls_p : 1;           /* has keys, applies to all decls */ | 
| 2977 |  | 
| 2978 |   /* VAR_DECL being used to represent an OpenMP declared mapper.  */ | 
| 2979 |   unsigned omp_declare_mapper_p : 1; | 
| 2980 |  | 
| 2981 |   /* 10 spare bits.  */ | 
| 2982 | }; | 
| 2983 |  | 
| 2984 | /* True for DECL codes which have template info and access.  */ | 
| 2985 | #define LANG_DECL_HAS_MIN(NODE)                        \ | 
| 2986 |   (VAR_OR_FUNCTION_DECL_P (NODE)                \ | 
| 2987 |    || TREE_CODE (NODE) == FIELD_DECL                \ | 
| 2988 |    || TREE_CODE (NODE) == CONST_DECL                \ | 
| 2989 |    || TREE_CODE (NODE) == TYPE_DECL                \ | 
| 2990 |    || TREE_CODE (NODE) == TEMPLATE_DECL                \ | 
| 2991 |    || TREE_CODE (NODE) == USING_DECL            \ | 
| 2992 |    || TREE_CODE (NODE) == CONCEPT_DECL) | 
| 2993 |  | 
| 2994 | /* DECL_LANG_SPECIFIC for the above codes.  */ | 
| 2995 |  | 
| 2996 | struct GTY(()) lang_decl_min { | 
| 2997 |   struct lang_decl_base base; /* 32-bits.  */ | 
| 2998 |  | 
| 2999 |   /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is | 
| 3000 |      THUNK_ALIAS. | 
| 3001 |      In a FUNCTION_DECL for which DECL_THUNK_P does not hold, | 
| 3002 |      VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this is | 
| 3003 |      DECL_TEMPLATE_INFO.  */ | 
| 3004 |   tree template_info; | 
| 3005 |  | 
| 3006 |   /* In a DECL_THUNK_P FUNCTION_DECL, this is THUNK_VIRTUAL_OFFSET. | 
| 3007 |      In a lambda-capture proxy VAR_DECL, this is DECL_CAPTURED_VARIABLE. | 
| 3008 |      In a function-scope TREE_STATIC VAR_DECL or IMPLICIT_TYPEDEF_P TYPE_DECL, | 
| 3009 |      this is DECL_DISCRIMINATOR. | 
| 3010 |      In a DECL_LOCAL_DECL_P decl, this is the namespace decl it aliases. | 
| 3011 |      Otherwise, in a class-scope DECL, this is DECL_ACCESS.   */ | 
| 3012 |   tree access; | 
| 3013 | }; | 
| 3014 |  | 
| 3015 | /* Additional DECL_LANG_SPECIFIC information for functions.  */ | 
| 3016 |  | 
| 3017 | struct GTY(()) lang_decl_fn { | 
| 3018 |   struct lang_decl_min min; | 
| 3019 |  | 
| 3020 |   /* In a overloaded operator, this is the compressed operator code.  */ | 
| 3021 |   unsigned ovl_op_code : 6; | 
| 3022 |   unsigned global_ctor_p : 1; | 
| 3023 |   unsigned global_dtor_p : 1; | 
| 3024 |  | 
| 3025 |   unsigned static_function : 1; | 
| 3026 |   unsigned pure_virtual : 1; | 
| 3027 |   unsigned defaulted_p : 1; | 
| 3028 |   unsigned has_in_charge_parm_p : 1; | 
| 3029 |   unsigned has_vtt_parm_p : 1; | 
| 3030 |   unsigned pending_inline_p : 1; | 
| 3031 |   unsigned nonconverting : 1; | 
| 3032 |   unsigned thunk_p : 1; | 
| 3033 |  | 
| 3034 |   unsigned this_thunk_p : 1; | 
| 3035 |   unsigned omp_declare_reduction_p : 1; | 
| 3036 |   unsigned has_dependent_explicit_spec_p : 1; | 
| 3037 |   unsigned immediate_fn_p : 1; | 
| 3038 |   unsigned maybe_deleted : 1; | 
| 3039 |   unsigned coroutine_p : 1; | 
| 3040 |   unsigned implicit_constexpr : 1; | 
| 3041 |   unsigned escalated_p : 1; | 
| 3042 |   unsigned xobj_func : 1; | 
| 3043 |  | 
| 3044 |   unsigned spare : 7; | 
| 3045 |  | 
| 3046 |   /* 32-bits padding on 64-bit host.  */ | 
| 3047 |  | 
| 3048 |   /* For a non-thunk function decl, this is a tree list of | 
| 3049 |      friendly classes. For a thunk function decl, it is the | 
| 3050 |      thunked to function decl.  */ | 
| 3051 |   tree befriending_classes; | 
| 3052 |  | 
| 3053 |   /* For a virtual FUNCTION_DECL for which | 
| 3054 |      DECL_THIS_THUNK_P does not hold, this is DECL_THUNKS. Both | 
| 3055 |      this pointer and result pointer adjusting thunks are | 
| 3056 |      chained here.  This pointer thunks to return pointer thunks | 
| 3057 |      will be chained on the return pointer thunk. | 
| 3058 |      For a DECL_CONSTRUCTOR_P or deduction_guide_p FUNCTION_DECL, | 
| 3059 |      this is the base from whence we inherit. | 
| 3060 |      Otherwise, it is the class in which a (namespace-scope) friend | 
| 3061 |      is defined (if any).  */ | 
| 3062 |   tree context; | 
| 3063 |  | 
| 3064 |   union lang_decl_u5 | 
| 3065 |   { | 
| 3066 |     /* In a non-thunk FUNCTION_DECL, this is DECL_CLONED_FUNCTION.  */ | 
| 3067 |     tree GTY ((tag ("0" ))) cloned_function; | 
| 3068 |  | 
| 3069 |     /* In a FUNCTION_DECL for which THUNK_P holds this is the | 
| 3070 |        THUNK_FIXED_OFFSET.  */ | 
| 3071 |     HOST_WIDE_INT GTY ((tag ("1" ))) fixed_offset; | 
| 3072 |   } GTY ((desc ("%1.thunk_p" ))) u5; | 
| 3073 |  | 
| 3074 |   union lang_decl_u3 | 
| 3075 |   { | 
| 3076 |     struct cp_token_cache * GTY ((tag ("1" ))) pending_inline_info; | 
| 3077 |     tree GTY ((tag ("0" ))) saved_auto_return_type; | 
| 3078 |   } GTY ((desc ("%1.pending_inline_p" ))) u; | 
| 3079 |  | 
| 3080 | }; | 
| 3081 |  | 
| 3082 | /* DECL_LANG_SPECIFIC for namespaces.  */ | 
| 3083 |  | 
| 3084 | struct GTY(()) lang_decl_ns { | 
| 3085 |   struct lang_decl_base base; /* 32 bits.  */ | 
| 3086 |   cp_binding_level *level; | 
| 3087 |  | 
| 3088 |   /* Inline children.  Needs to be va_gc, because of PCH.  */ | 
| 3089 |   vec<tree, va_gc> *inlinees; | 
| 3090 |  | 
| 3091 |   /* Hash table of bound decls. It'd be nice to have this inline, but | 
| 3092 |      as the hash_map has a dtor, we can't then put this struct into a | 
| 3093 |      union (until moving to c++11).  */ | 
| 3094 |   hash_table<named_decl_hash> *bindings; | 
| 3095 | }; | 
| 3096 |  | 
| 3097 | /* DECL_LANG_SPECIFIC for parameters.  */ | 
| 3098 |  | 
| 3099 | struct GTY(()) lang_decl_parm { | 
| 3100 |   struct lang_decl_base base; /* 32 bits.  */ | 
| 3101 |   int level; | 
| 3102 |   int index; | 
| 3103 | }; | 
| 3104 |  | 
| 3105 | /* Additional DECL_LANG_SPECIFIC information for structured bindings.  */ | 
| 3106 |  | 
| 3107 | struct GTY(()) lang_decl_decomp { | 
| 3108 |   struct lang_decl_min min; | 
| 3109 |   /* The artificial underlying "e" variable of the structured binding | 
| 3110 |      variable.  */ | 
| 3111 |   tree base; | 
| 3112 | }; | 
| 3113 |  | 
| 3114 | /* DECL_LANG_SPECIFIC for all types.  It would be nice to just make this a | 
| 3115 |    union rather than a struct containing a union as its only field, but | 
| 3116 |    tree.h declares it as a struct.  */ | 
| 3117 |  | 
| 3118 | struct GTY(()) lang_decl { | 
| 3119 |   union GTY((desc ("%h.base.selector" ))) lang_decl_u { | 
| 3120 |      /* Nothing of only the base type exists.  */ | 
| 3121 |     struct lang_decl_base GTY ((default)) base; | 
| 3122 |     struct lang_decl_min GTY((tag ("lds_min" ))) min; | 
| 3123 |     struct lang_decl_fn GTY ((tag ("lds_fn" ))) fn; | 
| 3124 |     struct lang_decl_ns GTY((tag ("lds_ns" ))) ns; | 
| 3125 |     struct lang_decl_parm GTY((tag ("lds_parm" ))) parm; | 
| 3126 |     struct lang_decl_decomp GTY((tag ("lds_decomp" ))) decomp; | 
| 3127 |   } u; | 
| 3128 | }; | 
| 3129 |  | 
| 3130 | /* Looks through a template (if present) to find what it declares.  */ | 
| 3131 | #define STRIP_TEMPLATE(NODE) \ | 
| 3132 |   (TREE_CODE (NODE) == TEMPLATE_DECL ? DECL_TEMPLATE_RESULT (NODE) : NODE) | 
| 3133 |  | 
| 3134 | #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) | 
| 3135 |  | 
| 3136 | #define LANG_DECL_MIN_CHECK(NODE) __extension__                        \ | 
| 3137 | ({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE);                \ | 
| 3138 |    if (!LANG_DECL_HAS_MIN (NODE))                                \ | 
| 3139 |      lang_check_failed (__FILE__, __LINE__, __FUNCTION__);        \ | 
| 3140 |    <->u.min; }) | 
| 3141 |  | 
| 3142 | /* We want to be able to check DECL_CONSTRUCTOR_P and such on a function | 
| 3143 |    template, not just on a FUNCTION_DECL.  So when looking for things in | 
| 3144 |    lang_decl_fn, look down through a TEMPLATE_DECL into its result.  */ | 
| 3145 | #define LANG_DECL_FN_CHECK(NODE) __extension__                                \ | 
| 3146 | ({ struct lang_decl *lt = DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE));        \ | 
| 3147 |    if (!DECL_DECLARES_FUNCTION_P (NODE)                                        \ | 
| 3148 |        || lt->u.base.selector != lds_fn)                                \ | 
| 3149 |      lang_check_failed (__FILE__, __LINE__, __FUNCTION__);                \ | 
| 3150 |    <->u.fn; }) | 
| 3151 |  | 
| 3152 | #define LANG_DECL_NS_CHECK(NODE) __extension__                                \ | 
| 3153 | ({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE);                        \ | 
| 3154 |    if (TREE_CODE (NODE) != NAMESPACE_DECL                                \ | 
| 3155 |        || lt->u.base.selector != lds_ns)                                \ | 
| 3156 |      lang_check_failed (__FILE__, __LINE__, __FUNCTION__);                \ | 
| 3157 |    <->u.ns; }) | 
| 3158 |  | 
| 3159 | #define LANG_DECL_PARM_CHECK(NODE) __extension__                \ | 
| 3160 | ({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE);                \ | 
| 3161 |   if (TREE_CODE (NODE) != PARM_DECL                                \ | 
| 3162 |       || lt->u.base.selector != lds_parm)                        \ | 
| 3163 |     lang_check_failed (__FILE__, __LINE__, __FUNCTION__);        \ | 
| 3164 |   <->u.parm; }) | 
| 3165 |  | 
| 3166 | #define LANG_DECL_DECOMP_CHECK(NODE) __extension__                \ | 
| 3167 | ({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE);                \ | 
| 3168 |   if (!VAR_P (NODE)                                                \ | 
| 3169 |       || lt->u.base.selector != lds_decomp)                        \ | 
| 3170 |     lang_check_failed (__FILE__, __LINE__, __FUNCTION__);        \ | 
| 3171 |   <->u.decomp; }) | 
| 3172 |  | 
| 3173 | #else | 
| 3174 |  | 
| 3175 | #define LANG_DECL_MIN_CHECK(NODE) \ | 
| 3176 |   (&DECL_LANG_SPECIFIC (NODE)->u.min) | 
| 3177 |  | 
| 3178 | #define LANG_DECL_FN_CHECK(NODE) \ | 
| 3179 |   (&DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE))->u.fn) | 
| 3180 |  | 
| 3181 | #define LANG_DECL_NS_CHECK(NODE) \ | 
| 3182 |   (&DECL_LANG_SPECIFIC (NODE)->u.ns) | 
| 3183 |  | 
| 3184 | #define LANG_DECL_PARM_CHECK(NODE) \ | 
| 3185 |   (&DECL_LANG_SPECIFIC (NODE)->u.parm) | 
| 3186 |  | 
| 3187 | #define LANG_DECL_DECOMP_CHECK(NODE) \ | 
| 3188 |   (&DECL_LANG_SPECIFIC (NODE)->u.decomp) | 
| 3189 |  | 
| 3190 | #endif /* ENABLE_TREE_CHECKING */ | 
| 3191 |  | 
| 3192 | /* For a FUNCTION_DECL or a VAR_DECL, the language linkage for the | 
| 3193 |    declaration.  Some entities (like a member function in a local | 
| 3194 |    class, or a local variable) do not have linkage at all, and this | 
| 3195 |    macro should not be used in those cases. | 
| 3196 |  | 
| 3197 |    Implementation note: A FUNCTION_DECL without DECL_LANG_SPECIFIC was | 
| 3198 |    created by language-independent code, and has C linkage.  Most | 
| 3199 |    VAR_DECLs have C++ linkage, and do not have DECL_LANG_SPECIFIC, but | 
| 3200 |    we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage.  */ | 
| 3201 | #define DECL_LANGUAGE(NODE)                                \ | 
| 3202 |   (DECL_LANG_SPECIFIC (NODE)                                \ | 
| 3203 |    ? DECL_LANG_SPECIFIC (NODE)->u.base.language                \ | 
| 3204 |    : (TREE_CODE (NODE) == FUNCTION_DECL                        \ | 
| 3205 |       ? lang_c : lang_cplusplus)) | 
| 3206 |  | 
| 3207 | /* Set the language linkage for NODE to LANGUAGE.  */ | 
| 3208 | #define SET_DECL_LANGUAGE(NODE, LANGUAGE) \ | 
| 3209 |   (DECL_LANG_SPECIFIC (NODE)->u.base.language = (LANGUAGE)) | 
| 3210 |  | 
| 3211 | /* For FUNCTION_DECLs and TEMPLATE_DECLs: nonzero means that this function | 
| 3212 |    is a constructor.  */ | 
| 3213 | #define DECL_CONSTRUCTOR_P(NODE) \ | 
| 3214 |   DECL_CXX_CONSTRUCTOR_P (STRIP_TEMPLATE (NODE)) | 
| 3215 |  | 
| 3216 | /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete | 
| 3217 |    object.  */ | 
| 3218 | #define DECL_COMPLETE_CONSTRUCTOR_P(NODE)                \ | 
| 3219 |   (DECL_NAME (NODE) == complete_ctor_identifier) | 
| 3220 |  | 
| 3221 | /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a base | 
| 3222 |    object.  */ | 
| 3223 | #define DECL_BASE_CONSTRUCTOR_P(NODE)                \ | 
| 3224 |   (DECL_NAME (NODE) == base_ctor_identifier) | 
| 3225 |  | 
| 3226 | /* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the | 
| 3227 |    specialized in-charge constructor or the specialized not-in-charge | 
| 3228 |    constructor.  */ | 
| 3229 | #define DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P(NODE)                \ | 
| 3230 |   (DECL_NAME (NODE) == ctor_identifier) | 
| 3231 |  | 
| 3232 | /* Nonzero if NODE (a FUNCTION_DECL) is a copy constructor.  */ | 
| 3233 | #define DECL_COPY_CONSTRUCTOR_P(NODE) \ | 
| 3234 |   (DECL_CONSTRUCTOR_P (NODE) && copy_fn_p (NODE) > 0) | 
| 3235 |  | 
| 3236 | /* Nonzero if NODE (a FUNCTION_DECL) is a move constructor.  */ | 
| 3237 | #define DECL_MOVE_CONSTRUCTOR_P(NODE) \ | 
| 3238 |   (DECL_CONSTRUCTOR_P (NODE) && move_fn_p (NODE)) | 
| 3239 |  | 
| 3240 | /* Nonzero if NODE (a FUNCTION_DECL or TEMPLATE_DECL) | 
| 3241 |    is a destructor.  */ | 
| 3242 | #define DECL_DESTRUCTOR_P(NODE)                                \ | 
| 3243 |   DECL_CXX_DESTRUCTOR_P (STRIP_TEMPLATE (NODE)) | 
| 3244 |  | 
| 3245 | /* Nonzero if NODE (a FUNCTION_DECL) is a destructor, but not the | 
| 3246 |    specialized in-charge constructor, in-charge deleting constructor, | 
| 3247 |    or the base destructor.  */ | 
| 3248 | #define DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P(NODE)                        \ | 
| 3249 |   (DECL_NAME (NODE) == dtor_identifier) | 
| 3250 |  | 
| 3251 | /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete | 
| 3252 |    object.  */ | 
| 3253 | #define DECL_COMPLETE_DESTRUCTOR_P(NODE)                \ | 
| 3254 |   (DECL_NAME (NODE) == complete_dtor_identifier) | 
| 3255 |  | 
| 3256 | /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a base | 
| 3257 |    object.  */ | 
| 3258 | #define DECL_BASE_DESTRUCTOR_P(NODE)                \ | 
| 3259 |   (DECL_NAME (NODE) == base_dtor_identifier) | 
| 3260 |  | 
| 3261 | /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete | 
| 3262 |    object that deletes the object after it has been destroyed.  */ | 
| 3263 | #define DECL_DELETING_DESTRUCTOR_P(NODE)                \ | 
| 3264 |   (DECL_NAME (NODE) == deleting_dtor_identifier) | 
| 3265 |  | 
| 3266 | /* Nonzero if either DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P or | 
| 3267 |    DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P is true of NODE.  */ | 
| 3268 | #define DECL_MAYBE_IN_CHARGE_CDTOR_P(NODE)              \ | 
| 3269 |   (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (NODE)            \ | 
| 3270 |    || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (NODE)) | 
| 3271 |  | 
| 3272 | /* Nonzero if NODE (a _DECL) is a cloned constructor or | 
| 3273 |    destructor.  */ | 
| 3274 | #define DECL_CLONED_FUNCTION_P(NODE)                \ | 
| 3275 |   (DECL_NAME (NODE)                                \ | 
| 3276 |    && IDENTIFIER_CDTOR_P (DECL_NAME (NODE))        \ | 
| 3277 |    && !DECL_MAYBE_IN_CHARGE_CDTOR_P (NODE)) | 
| 3278 |  | 
| 3279 | /* If DECL_CLONED_FUNCTION_P holds, this is the function that was | 
| 3280 |    cloned.  */ | 
| 3281 | #define DECL_CLONED_FUNCTION(NODE)                \ | 
| 3282 |   (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE))->u.fn.u5.cloned_function) | 
| 3283 |  | 
| 3284 | /* Perform an action for each clone of FN, if FN is a function with | 
| 3285 |    clones.  This macro should be used like: | 
| 3286 |  | 
| 3287 |       FOR_EACH_CLONE (clone, fn) | 
| 3288 |         { ... } | 
| 3289 |  | 
| 3290 |   */ | 
| 3291 | #define FOR_EACH_CLONE(CLONE, FN)                        \ | 
| 3292 |   if (!(TREE_CODE (FN) == FUNCTION_DECL                        \ | 
| 3293 |         && DECL_MAYBE_IN_CHARGE_CDTOR_P (FN)))          \ | 
| 3294 |     ;                                                        \ | 
| 3295 |   else                                                        \ | 
| 3296 |     for (CLONE = DECL_CHAIN (FN);                        \ | 
| 3297 |          CLONE && DECL_CLONED_FUNCTION_P (CLONE);        \ | 
| 3298 |          CLONE = DECL_CHAIN (CLONE)) | 
| 3299 |  | 
| 3300 | /* Nonzero if NODE has DECL_DISCRIMINATOR and not DECL_ACCESS.  */ | 
| 3301 | #define DECL_DISCRIMINATOR_P(NODE)                                \ | 
| 3302 |   (((VAR_P (NODE) && TREE_STATIC (NODE))        \ | 
| 3303 |     || DECL_IMPLICIT_TYPEDEF_P (NODE))                                \ | 
| 3304 |    && DECL_FUNCTION_SCOPE_P (NODE)) | 
| 3305 |  | 
| 3306 | /* Discriminator for name mangling.  */ | 
| 3307 | #define DECL_DISCRIMINATOR(NODE) (LANG_DECL_MIN_CHECK (NODE)->access) | 
| 3308 |  | 
| 3309 | /* The index of a user-declared parameter in its function, starting at 1. | 
| 3310 |    All artificial parameters will have index 0.  */ | 
| 3311 | #define DECL_PARM_INDEX(NODE) \ | 
| 3312 |   (LANG_DECL_PARM_CHECK (NODE)->index) | 
| 3313 |  | 
| 3314 | /* The level of a user-declared parameter in its function, starting at 1. | 
| 3315 |    A parameter of the function will have level 1; a parameter of the first | 
| 3316 |    nested function declarator (i.e. t in void f (void (*p)(T t))) will have | 
| 3317 |    level 2.  */ | 
| 3318 | #define DECL_PARM_LEVEL(NODE) \ | 
| 3319 |   (LANG_DECL_PARM_CHECK (NODE)->level) | 
| 3320 |  | 
| 3321 | /* Nonzero if the VTT parm has been added to NODE.  */ | 
| 3322 | #define DECL_HAS_VTT_PARM_P(NODE) \ | 
| 3323 |   (LANG_DECL_FN_CHECK (NODE)->has_vtt_parm_p) | 
| 3324 |  | 
| 3325 | /* Nonzero if NODE is a user-defined conversion operator.  */ | 
| 3326 | #define DECL_CONV_FN_P(NODE) IDENTIFIER_CONV_OP_P (DECL_NAME (NODE)) | 
| 3327 |  | 
| 3328 | /* The type to which conversion operator FN converts to.   */ | 
| 3329 | #define DECL_CONV_FN_TYPE(FN) \ | 
| 3330 |   TREE_TYPE ((gcc_checking_assert (DECL_CONV_FN_P (FN)), DECL_NAME (FN))) | 
| 3331 |  | 
| 3332 | /* Nonzero if NODE, a templated variable, was declared as an | 
| 3333 |    array of unknown bound.  */ | 
| 3334 | #define VAR_HAD_UNKNOWN_BOUND(NODE)                        \ | 
| 3335 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))                \ | 
| 3336 |    ? DECL_LANG_SPECIFIC (NODE)->u.base.unknown_bound_p        \ | 
| 3337 |    : false) | 
| 3338 | #define SET_VAR_HAD_UNKNOWN_BOUND(NODE) \ | 
| 3339 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.unknown_bound_p = true) | 
| 3340 |  | 
| 3341 | /* True iff decl NODE is for an overloaded operator.  */ | 
| 3342 | #define DECL_OVERLOADED_OPERATOR_P(NODE)                \ | 
| 3343 |   IDENTIFIER_ANY_OP_P (DECL_NAME (NODE)) | 
| 3344 |  | 
| 3345 | /* Nonzero if NODE is an assignment operator (including += and such).  */ | 
| 3346 | #define DECL_ASSIGNMENT_OPERATOR_P(NODE)                 \ | 
| 3347 |   IDENTIFIER_ASSIGN_OP_P (DECL_NAME (NODE)) | 
| 3348 |  | 
| 3349 | /* NODE is a function_decl for an overloaded operator.  Return its | 
| 3350 |    compressed (raw) operator code.  Note that this is not a TREE_CODE.  */ | 
| 3351 | #define DECL_OVERLOADED_OPERATOR_CODE_RAW(NODE)                \ | 
| 3352 |   (LANG_DECL_FN_CHECK (NODE)->ovl_op_code) | 
| 3353 |  | 
| 3354 | /* DECL is an overloaded operator.  Test whether it is for TREE_CODE | 
| 3355 |    (a literal constant).  */ | 
| 3356 | #define DECL_OVERLOADED_OPERATOR_IS(DECL, CODE)                        \ | 
| 3357 |   (DECL_OVERLOADED_OPERATOR_CODE_RAW (DECL) == OVL_OP_##CODE) | 
| 3358 |  | 
| 3359 | /* For FUNCTION_DECLs: nonzero means that this function is a | 
| 3360 |    constructor or a destructor with an extra in-charge parameter to | 
| 3361 |    control whether or not virtual bases are constructed.  */ | 
| 3362 | #define DECL_HAS_IN_CHARGE_PARM_P(NODE) \ | 
| 3363 |   (LANG_DECL_FN_CHECK (NODE)->has_in_charge_parm_p) | 
| 3364 |  | 
| 3365 | /* Nonzero if DECL is a declaration of __builtin_constant_p.  */ | 
| 3366 | #define DECL_IS_BUILTIN_CONSTANT_P(NODE)                \ | 
| 3367 |  (TREE_CODE (NODE) == FUNCTION_DECL                        \ | 
| 3368 |   && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL        \ | 
| 3369 |   && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P) | 
| 3370 |  | 
| 3371 | /* Nonzero for _DECL means that this decl appears in (or will appear | 
| 3372 |    in) as a member in a RECORD_TYPE or UNION_TYPE node.  It is also for | 
| 3373 |    detecting circularity in case members are multiply defined.  In the | 
| 3374 |    case of a VAR_DECL, it means that no definition has been seen, even | 
| 3375 |    if an initializer has been.  */ | 
| 3376 | #define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3 (NODE)) | 
| 3377 |  | 
| 3378 | /* Nonzero for a VAR_DECL means that the variable's initialization (if | 
| 3379 |    any) has been processed.  (In general, DECL_INITIALIZED_P is | 
| 3380 |    !DECL_EXTERNAL, but static data members may be initialized even if | 
| 3381 |    not defined.)  */ | 
| 3382 | #define DECL_INITIALIZED_P(NODE) \ | 
| 3383 |    (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE))) | 
| 3384 |  | 
| 3385 | /* Nonzero for a VAR_DECL iff an explicit initializer was provided | 
| 3386 |    or a non-trivial constructor is called.  */ | 
| 3387 | #define DECL_NONTRIVIALLY_INITIALIZED_P(NODE)        \ | 
| 3388 |    (TREE_LANG_FLAG_6 (VAR_DECL_CHECK (NODE))) | 
| 3389 |  | 
| 3390 | /* Nonzero for a VAR_DECL that was initialized with a | 
| 3391 |    constant-expression.  */ | 
| 3392 | #define DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P(NODE) \ | 
| 3393 |   (TREE_LANG_FLAG_2 (VAR_DECL_CHECK (NODE))) | 
| 3394 |  | 
| 3395 | /* Nonzero if the DECL was initialized in the class definition itself, | 
| 3396 |    rather than outside the class.  This is used for both static member | 
| 3397 |    VAR_DECLS, and FUNCTION_DECLS that are defined in the class.  */ | 
| 3398 | #define DECL_INITIALIZED_IN_CLASS_P(DECL) \ | 
| 3399 |   (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \ | 
| 3400 |    ->u.base.initialized_in_class) | 
| 3401 |  | 
| 3402 | /* Nonzero if the DECL is used in the sense of 3.2 [basic.def.odr]. | 
| 3403 |    Only available for decls with DECL_LANG_SPECIFIC.  */ | 
| 3404 | #define DECL_ODR_USED(DECL) \ | 
| 3405 |   (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \ | 
| 3406 |    ->u.base.odr_used) | 
| 3407 |  | 
| 3408 | /* Nonzero for FUNCTION_DECL means that this is a friend that is | 
| 3409 |    either not pushed into a namespace/looked up in a class (because it | 
| 3410 |    is a dependent type, in an uninstantiated template), or it has | 
| 3411 |    /only/ been subject to hidden friend injection from one or more | 
| 3412 |    befriending classes.  Once another decl matches, the flag is | 
| 3413 |    cleared.  There are requirements on its default parms.  */ | 
| 3414 | #define DECL_UNIQUE_FRIEND_P(NODE) \ | 
| 3415 |   (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE)) \ | 
| 3416 |    ->u.base.friend_or_tls) | 
| 3417 |  | 
| 3418 | /* True of a TEMPLATE_DECL that is a template class friend.  Such | 
| 3419 |    decls are not pushed until instantiated (as they may depend on | 
| 3420 |    parameters of the befriending class).  DECL_CHAIN is the | 
| 3421 |    befriending class.  */ | 
| 3422 | #define DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P(NODE) \ | 
| 3423 |   (DECL_LANG_FLAG_4 (TEMPLATE_DECL_CHECK (NODE))) | 
| 3424 |  | 
| 3425 | /* Nonzero if the thread-local variable was declared with __thread as | 
| 3426 |    opposed to thread_local.  */ | 
| 3427 | #define DECL_GNU_TLS_P(NODE)                                \ | 
| 3428 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))                \ | 
| 3429 |    && DECL_LANG_SPECIFIC (NODE)->u.base.friend_or_tls) | 
| 3430 | #define SET_DECL_GNU_TLS_P(NODE)                                \ | 
| 3431 |   (retrofit_lang_decl (VAR_DECL_CHECK (NODE)),                        \ | 
| 3432 |    DECL_LANG_SPECIFIC (NODE)->u.base.friend_or_tls = true) | 
| 3433 |  | 
| 3434 | /* A TREE_LIST of the types which have befriended this FUNCTION_DECL.  */ | 
| 3435 | #define DECL_BEFRIENDING_CLASSES(NODE) \ | 
| 3436 |   (LANG_DECL_FN_CHECK (NODE)->befriending_classes) | 
| 3437 |  | 
| 3438 | /* Nonzero for FUNCTION_DECL means that this decl is a static | 
| 3439 |    member function.  */ | 
| 3440 | #define DECL_STATIC_FUNCTION_P(NODE) \ | 
| 3441 |   (LANG_DECL_FN_CHECK (NODE)->static_function) | 
| 3442 |  | 
| 3443 | /* Nonzero for FUNCTION_DECL means that this decl is a non-static member | 
| 3444 |    function.  C++23 explicit object member functions are also considered | 
| 3445 |    non-static, but most former uses of this macro meant implicit object member | 
| 3446 |    function.  Instead of this macro, use DECL_IOBJ_MEMBER_FUNCTION_P or | 
| 3447 |    DECL_OBJECT_MEMBER_FUNCTION_P.  */ | 
| 3448 | #define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) did_you_mean_object_or_iobj | 
| 3449 |  | 
| 3450 | /* Nonzero for FUNCTION_DECL means that this decl is an implicit object | 
| 3451 |    member function.  */ | 
| 3452 | #define DECL_IOBJ_MEMBER_FUNCTION_P(NODE) \ | 
| 3453 |   (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE) | 
| 3454 |  | 
| 3455 | /* Simple member access, only valid for FUNCTION_DECL nodes.  */ | 
| 3456 | #define DECL_FUNCTION_XOBJ_FLAG(NODE)        \ | 
| 3457 |   (LANG_DECL_FN_CHECK (NODE)->xobj_func) | 
| 3458 |  | 
| 3459 | /* Nonzero if NODE is an xobj member function, | 
| 3460 |    safely evaluates to false for all non FUNCTION_DECL nodes.  */ | 
| 3461 | #define DECL_XOBJ_MEMBER_FUNCTION_P(NODE)                \ | 
| 3462 |   (TREE_CODE (STRIP_TEMPLATE (NODE)) == FUNCTION_DECL        \ | 
| 3463 |    && DECL_FUNCTION_XOBJ_FLAG (NODE) == 1) | 
| 3464 |  | 
| 3465 | /* Nonzero if NODE is a member function with an object argument, | 
| 3466 |    in other words, a non-static member function.  */ | 
| 3467 | #define DECL_OBJECT_MEMBER_FUNCTION_P(NODE) \ | 
| 3468 |   (DECL_IOBJ_MEMBER_FUNCTION_P (NODE) || DECL_XOBJ_MEMBER_FUNCTION_P (NODE)) | 
| 3469 |  | 
| 3470 | /* Nonzero for FUNCTION_DECL means that this decl is a member function | 
| 3471 |    (static or non-static).  */ | 
| 3472 | #define DECL_FUNCTION_MEMBER_P(NODE) \ | 
| 3473 |   (DECL_OBJECT_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE)) \ | 
| 3474 |  | 
| 3475 | /* Nonzero for FUNCTION_DECL means that this member function | 
| 3476 |    has `this' as const X *const.  */ | 
| 3477 | #define DECL_CONST_MEMFUNC_P(NODE)                                         \ | 
| 3478 |   (DECL_IOBJ_MEMBER_FUNCTION_P (NODE)                                 \ | 
| 3479 |    && CP_TYPE_CONST_P (TREE_TYPE (TREE_VALUE                                 \ | 
| 3480 |                                   (TYPE_ARG_TYPES (TREE_TYPE (NODE)))))) | 
| 3481 |  | 
| 3482 | /* Nonzero for FUNCTION_DECL means that this member function | 
| 3483 |    has `this' as volatile X *const.  */ | 
| 3484 | #define DECL_VOLATILE_MEMFUNC_P(NODE)                                         \ | 
| 3485 |   (DECL_IOBJ_MEMBER_FUNCTION_P (NODE)                                 \ | 
| 3486 |    && CP_TYPE_VOLATILE_P (TREE_TYPE (TREE_VALUE                                 \ | 
| 3487 |                                   (TYPE_ARG_TYPES (TREE_TYPE (NODE)))))) | 
| 3488 |  | 
| 3489 | /* Nonzero for a DECL means that this member is a non-static member.  */ | 
| 3490 | #define DECL_NONSTATIC_MEMBER_P(NODE)                \ | 
| 3491 |   (DECL_OBJECT_MEMBER_FUNCTION_P (NODE)        \ | 
| 3492 |    || TREE_CODE (NODE) == FIELD_DECL) | 
| 3493 |  | 
| 3494 | /* Nonzero for a FIELD_DECL means that this member object type | 
| 3495 |    is mutable.  */ | 
| 3496 | #define DECL_MUTABLE_P(NODE) (DECL_LANG_FLAG_0 (FIELD_DECL_CHECK (NODE))) | 
| 3497 |  | 
| 3498 | /* Nonzero for _DECL means that this constructor or conversion function is | 
| 3499 |    non-converting.  */ | 
| 3500 | #define DECL_NONCONVERTING_P(NODE) \ | 
| 3501 |   (LANG_DECL_FN_CHECK (NODE)->nonconverting) | 
| 3502 |  | 
| 3503 | /* Nonzero for FUNCTION_DECL means that this member function is a pure | 
| 3504 |    virtual function.  */ | 
| 3505 | #define DECL_PURE_VIRTUAL_P(NODE) \ | 
| 3506 |   (LANG_DECL_FN_CHECK (NODE)->pure_virtual) | 
| 3507 |  | 
| 3508 | /* Nonzero for FUNCTION_DECL means that this member function (either | 
| 3509 |    a constructor or a conversion function) has an explicit specifier | 
| 3510 |    with a value-dependent expression.  */ | 
| 3511 | #define DECL_HAS_DEPENDENT_EXPLICIT_SPEC_P(NODE) \ | 
| 3512 |   (LANG_DECL_FN_CHECK (NODE)->has_dependent_explicit_spec_p) | 
| 3513 |  | 
| 3514 | /* Nonzero for a defaulted FUNCTION_DECL for which we haven't decided yet if | 
| 3515 |    it's deleted; we will decide in synthesize_method.  */ | 
| 3516 | #define DECL_MAYBE_DELETED(NODE) \ | 
| 3517 |   (LANG_DECL_FN_CHECK (NODE)->maybe_deleted) | 
| 3518 |  | 
| 3519 | /* Nonzero for FUNCTION_DECL means that this function's body has been | 
| 3520 |    checked for immediate-escalating expressions and maybe promoted.  It | 
| 3521 |    does *not* mean the function is consteval.  It must not be set in | 
| 3522 |    a function that was marked consteval by the user, so that we can | 
| 3523 |    distinguish between explicitly consteval functions and promoted consteval | 
| 3524 |    functions.  */ | 
| 3525 | #define DECL_ESCALATION_CHECKED_P(NODE) (LANG_DECL_FN_CHECK (NODE)->escalated_p) | 
| 3526 |  | 
| 3527 | /* True (in a FUNCTION_DECL) if NODE is a virtual function that is an | 
| 3528 |    invalid overrider for a function from a base class.  Once we have | 
| 3529 |    complained about an invalid overrider we avoid complaining about it | 
| 3530 |    again.  */ | 
| 3531 | #define DECL_INVALID_OVERRIDER_P(NODE) \ | 
| 3532 |   (DECL_LANG_FLAG_4 (NODE)) | 
| 3533 |  | 
| 3534 | /* True (in a FUNCTION_DECL) if NODE is a function declared with | 
| 3535 |    an override virt-specifier */ | 
| 3536 | #define DECL_OVERRIDE_P(NODE) (TREE_LANG_FLAG_0 (NODE)) | 
| 3537 |  | 
| 3538 | /* The thunks associated with NODE, a FUNCTION_DECL.  */ | 
| 3539 | #define DECL_THUNKS(NODE) \ | 
| 3540 |   (DECL_VIRTUAL_P (NODE) ? LANG_DECL_FN_CHECK (NODE)->context : NULL_TREE) | 
| 3541 |  | 
| 3542 | /* Set DECL_THUNKS.  */ | 
| 3543 | #define SET_DECL_THUNKS(NODE,THUNKS) \ | 
| 3544 |   (LANG_DECL_FN_CHECK (NODE)->context = (THUNKS)) | 
| 3545 |  | 
| 3546 | /* If NODE, a FUNCTION_DECL, is a C++11 inheriting constructor, then this | 
| 3547 |    is the constructor it inherits from.  */ | 
| 3548 | #define DECL_INHERITED_CTOR(NODE) \ | 
| 3549 |   (DECL_DECLARES_FUNCTION_P (NODE) && DECL_CONSTRUCTOR_P (NODE) \ | 
| 3550 |    ? LANG_DECL_FN_CHECK (NODE)->context : NULL_TREE) | 
| 3551 |  | 
| 3552 | /* And this is the base that constructor comes from.  */ | 
| 3553 | #define DECL_INHERITED_CTOR_BASE(NODE)                        \ | 
| 3554 |   (DECL_INHERITED_CTOR (NODE)                                \ | 
| 3555 |    ? DECL_CONTEXT (flag_new_inheriting_ctors                \ | 
| 3556 |                    ? strip_inheriting_ctors (NODE)        \ | 
| 3557 |                    : DECL_INHERITED_CTOR (NODE))        \ | 
| 3558 |    : NULL_TREE) | 
| 3559 |  | 
| 3560 | /* Set the inherited base.  */ | 
| 3561 | #define SET_DECL_INHERITED_CTOR(NODE,INH) \ | 
| 3562 |   (LANG_DECL_FN_CHECK (NODE)->context = (INH)) | 
| 3563 |  | 
| 3564 | /* Nonzero if NODE is a thunk, rather than an ordinary function.  */ | 
| 3565 | #define DECL_THUNK_P(NODE)                        \ | 
| 3566 |   (TREE_CODE (NODE) == FUNCTION_DECL                \ | 
| 3567 |    && DECL_LANG_SPECIFIC (NODE)                        \ | 
| 3568 |    && LANG_DECL_FN_CHECK (NODE)->thunk_p) | 
| 3569 |  | 
| 3570 | /* Set DECL_THUNK_P for node.  */ | 
| 3571 | #define SET_DECL_THUNK_P(NODE, THIS_ADJUSTING)                        \ | 
| 3572 |   (LANG_DECL_FN_CHECK (NODE)->thunk_p = 1,                        \ | 
| 3573 |    LANG_DECL_FN_CHECK (NODE)->this_thunk_p = (THIS_ADJUSTING)) | 
| 3574 |  | 
| 3575 | /* Nonzero if NODE is a this pointer adjusting thunk.  */ | 
| 3576 | #define DECL_THIS_THUNK_P(NODE)                        \ | 
| 3577 |   (DECL_THUNK_P (NODE) && LANG_DECL_FN_CHECK (NODE)->this_thunk_p) | 
| 3578 |  | 
| 3579 | /* Nonzero if NODE is a result pointer adjusting thunk.  */ | 
| 3580 | #define DECL_RESULT_THUNK_P(NODE)                        \ | 
| 3581 |   (DECL_THUNK_P (NODE) && !LANG_DECL_FN_CHECK (NODE)->this_thunk_p) | 
| 3582 |  | 
| 3583 | /* Nonzero if NODE is a FUNCTION_DECL, but not a thunk.  */ | 
| 3584 | #define DECL_NON_THUNK_FUNCTION_P(NODE)                                \ | 
| 3585 |   (TREE_CODE (NODE) == FUNCTION_DECL && !DECL_THUNK_P (NODE)) | 
| 3586 |  | 
| 3587 | /* Nonzero if NODE is `extern "C"'.  */ | 
| 3588 | #define DECL_EXTERN_C_P(NODE) \ | 
| 3589 |   (DECL_LANGUAGE (NODE) == lang_c) | 
| 3590 |  | 
| 3591 | /* Nonzero if NODE is an `extern "C"' function.  */ | 
| 3592 | #define DECL_EXTERN_C_FUNCTION_P(NODE) \ | 
| 3593 |   (DECL_NON_THUNK_FUNCTION_P (NODE) && DECL_EXTERN_C_P (NODE)) | 
| 3594 |  | 
| 3595 | /* Non-zero if this variable is declared `constinit' specifier.  */ | 
| 3596 | #define DECL_DECLARED_CONSTINIT_P(NODE)                \ | 
| 3597 |   (DECL_LANG_FLAG_7 (VAR_DECL_CHECK (NODE))) | 
| 3598 |  | 
| 3599 | /* True if DECL is declared 'constexpr'.  */ | 
| 3600 | #define DECL_DECLARED_CONSTEXPR_P(DECL) \ | 
| 3601 |   DECL_LANG_FLAG_8 (VAR_OR_FUNCTION_DECL_CHECK (STRIP_TEMPLATE (DECL))) | 
| 3602 |  | 
| 3603 | /* True if FNDECL is an immediate function.  */ | 
| 3604 | #define DECL_IMMEDIATE_FUNCTION_P(NODE) \ | 
| 3605 |   (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (STRIP_TEMPLATE (NODE)))        \ | 
| 3606 |    ? LANG_DECL_FN_CHECK (NODE)->immediate_fn_p                                \ | 
| 3607 |    : false) | 
| 3608 | #define SET_DECL_IMMEDIATE_FUNCTION_P(NODE) \ | 
| 3609 |   (retrofit_lang_decl (FUNCTION_DECL_CHECK (NODE)),                        \ | 
| 3610 |    LANG_DECL_FN_CHECK (NODE)->immediate_fn_p = true) | 
| 3611 |  | 
| 3612 | /* Nonzero if this DECL is the __PRETTY_FUNCTION__ variable in a | 
| 3613 |    template function.  */ | 
| 3614 | #define DECL_PRETTY_FUNCTION_P(NODE) \ | 
| 3615 |   (DECL_NAME (NODE) \ | 
| 3616 |    && id_equal (DECL_NAME (NODE), "__PRETTY_FUNCTION__")) | 
| 3617 |  | 
| 3618 | /* For a DECL, true if it is __func__ or similar.  */ | 
| 3619 | #define DECL_FNAME_P(NODE)                                        \ | 
| 3620 |   (VAR_P (NODE) && DECL_NAME (NODE) && DECL_ARTIFICIAL (NODE)        \ | 
| 3621 |    && DECL_HAS_VALUE_EXPR_P (NODE)                                \ | 
| 3622 |    && (id_equal (DECL_NAME (NODE), "__PRETTY_FUNCTION__")        \ | 
| 3623 |        || id_equal (DECL_NAME (NODE), "__FUNCTION__")                \ | 
| 3624 |        || id_equal (DECL_NAME (NODE), "__func__"))) | 
| 3625 |  | 
| 3626 | /* Nonzero if the variable was declared to be thread-local. | 
| 3627 |    We need a special C++ version of this test because the middle-end | 
| 3628 |    DECL_THREAD_LOCAL_P uses the symtab, so we can't use it for | 
| 3629 |    templates.  */ | 
| 3630 | #define CP_DECL_THREAD_LOCAL_P(NODE) \ | 
| 3631 |   (TREE_LANG_FLAG_0 (VAR_DECL_CHECK (NODE))) | 
| 3632 |  | 
| 3633 | /* The _TYPE context in which this _DECL appears.  This field holds the | 
| 3634 |    class where a virtual function instance is actually defined.  */ | 
| 3635 | #define DECL_CLASS_CONTEXT(NODE) \ | 
| 3636 |   (DECL_CLASS_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : NULL_TREE) | 
| 3637 |  | 
| 3638 | /* For a non-member friend function, the class (if any) in which this | 
| 3639 |    friend was defined.  For example, given: | 
| 3640 |  | 
| 3641 |      struct S { friend void f () { ... } }; | 
| 3642 |  | 
| 3643 |    the DECL_FRIEND_CONTEXT for `f' will be `S'.  */ | 
| 3644 | #define DECL_FRIEND_CONTEXT(NODE)                                \ | 
| 3645 |   ((DECL_DECLARES_FUNCTION_P (NODE) && !DECL_VIRTUAL_P (NODE)        \ | 
| 3646 |     && !DECL_CONSTRUCTOR_P (NODE)                                \ | 
| 3647 |     && (cxx_dialect < cxx23 || !deduction_guide_p (NODE)))        \ | 
| 3648 |    ? LANG_DECL_FN_CHECK (NODE)->context                                \ | 
| 3649 |    : NULL_TREE) | 
| 3650 |  | 
| 3651 | /* Set the DECL_FRIEND_CONTEXT for NODE to CONTEXT.  */ | 
| 3652 | #define SET_DECL_FRIEND_CONTEXT(NODE, CONTEXT) \ | 
| 3653 |   (LANG_DECL_FN_CHECK (NODE)->context = (CONTEXT)) | 
| 3654 |  | 
| 3655 | #define CP_DECL_CONTEXT(NODE) \ | 
| 3656 |   (!DECL_FILE_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : global_namespace) | 
| 3657 | #define CP_TYPE_CONTEXT(NODE) \ | 
| 3658 |   (!TYPE_FILE_SCOPE_P (NODE) ? TYPE_CONTEXT (NODE) : global_namespace) | 
| 3659 | #define FROB_CONTEXT(NODE) \ | 
| 3660 |   ((NODE) == global_namespace ? DECL_CONTEXT (NODE) : (NODE)) | 
| 3661 |  | 
| 3662 | /* 1 iff NODE has namespace scope, including the global namespace.  */ | 
| 3663 | #define DECL_NAMESPACE_SCOPE_P(NODE)                                \ | 
| 3664 |   (!DECL_TEMPLATE_PARM_P (NODE)                                        \ | 
| 3665 |    && TREE_CODE (CP_DECL_CONTEXT (NODE)) == NAMESPACE_DECL) | 
| 3666 |  | 
| 3667 | #define TYPE_NAMESPACE_SCOPE_P(NODE) \ | 
| 3668 |   (TREE_CODE (CP_TYPE_CONTEXT (NODE)) == NAMESPACE_DECL) | 
| 3669 |  | 
| 3670 | #define NAMESPACE_SCOPE_P(NODE) \ | 
| 3671 |   ((DECL_P (NODE) && DECL_NAMESPACE_SCOPE_P (NODE)) \ | 
| 3672 |    || (TYPE_P (NODE) && TYPE_NAMESPACE_SCOPE_P (NODE))) | 
| 3673 |  | 
| 3674 | /* 1 iff NODE is a class member.  */ | 
| 3675 | #define DECL_CLASS_SCOPE_P(NODE) \ | 
| 3676 |   (DECL_CONTEXT (NODE) && TYPE_P (DECL_CONTEXT (NODE))) | 
| 3677 |  | 
| 3678 | #define TYPE_CLASS_SCOPE_P(NODE) \ | 
| 3679 |   (TYPE_CONTEXT (NODE) && TYPE_P (TYPE_CONTEXT (NODE))) | 
| 3680 |  | 
| 3681 | /* 1 iff NODE is function-local.  */ | 
| 3682 | #define DECL_FUNCTION_SCOPE_P(NODE) \ | 
| 3683 |   (DECL_CONTEXT (NODE) \ | 
| 3684 |    && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL) | 
| 3685 |  | 
| 3686 | #define TYPE_FUNCTION_SCOPE_P(NODE) \ | 
| 3687 |   (TYPE_CONTEXT (NODE) && TREE_CODE (TYPE_CONTEXT (NODE)) == FUNCTION_DECL) | 
| 3688 |  | 
| 3689 | /* 1 iff VAR_DECL node NODE is a type-info decl.  This flag is set for | 
| 3690 |    both the primary typeinfo object and the associated NTBS name.  */ | 
| 3691 | #define DECL_TINFO_P(NODE)                        \ | 
| 3692 |   TREE_LANG_FLAG_4 (TREE_CHECK2 (NODE,VAR_DECL,TYPE_DECL)) | 
| 3693 |  | 
| 3694 | /* true iff VAR_DECL node NODE is a NTTP object decl.  */ | 
| 3695 | #define DECL_NTTP_OBJECT_P(NODE)                        \ | 
| 3696 |   TREE_LANG_FLAG_5 (TREE_CHECK (NODE,VAR_DECL)) | 
| 3697 |  | 
| 3698 | /* 1 iff VAR_DECL node NODE is virtual table or VTT.  We forward to | 
| 3699 |    DECL_VIRTUAL_P from the common code, as that has the semantics we | 
| 3700 |    need.  But we want a more descriptive name.  */ | 
| 3701 | #define DECL_VTABLE_OR_VTT_P(NODE) DECL_VIRTUAL_P (VAR_DECL_CHECK (NODE)) | 
| 3702 |  | 
| 3703 | /* 1 iff a _DECL for a template parameter came from | 
| 3704 |    synthesize_implicit_template_parm.  */ | 
| 3705 | #define DECL_IMPLICIT_TEMPLATE_PARM_P(NODE) \ | 
| 3706 |   DECL_VIRTUAL_P (DECL_TEMPLATE_PARM_CHECK (NODE)) | 
| 3707 |  | 
| 3708 | /* 1 iff FUNCTION_TYPE or METHOD_TYPE has a ref-qualifier (either & or &&).  */ | 
| 3709 | #define FUNCTION_REF_QUALIFIED(NODE) \ | 
| 3710 |   TREE_LANG_FLAG_4 (FUNC_OR_METHOD_CHECK (NODE)) | 
| 3711 |  | 
| 3712 | /* 1 iff FUNCTION_TYPE or METHOD_TYPE has &&-ref-qualifier.  */ | 
| 3713 | #define FUNCTION_RVALUE_QUALIFIED(NODE) \ | 
| 3714 |   TREE_LANG_FLAG_5 (FUNC_OR_METHOD_CHECK (NODE)) | 
| 3715 |  | 
| 3716 | /* 1 iff NODE is function-local, but for types.  */ | 
| 3717 | #define LOCAL_CLASS_P(NODE)                                \ | 
| 3718 |   (decl_function_context (TYPE_MAIN_DECL (NODE)) != NULL_TREE) | 
| 3719 |  | 
| 3720 | /* The nesting depth of namespace, class or function.  Makes is_ancestor much | 
| 3721 |    simpler.  Only 8 bits available.  */ | 
| 3722 | #define SCOPE_DEPTH(NODE) \ | 
| 3723 |   (NAMESPACE_DECL_CHECK (NODE)->base.u.bits.address_space) | 
| 3724 |  | 
| 3725 | /* Whether the namepace is an inline namespace.  */ | 
| 3726 | #define DECL_NAMESPACE_INLINE_P(NODE) \ | 
| 3727 |   TREE_LANG_FLAG_0 (NAMESPACE_DECL_CHECK (NODE)) | 
| 3728 |  | 
| 3729 | /* In a NAMESPACE_DECL, a vector of inline namespaces.  */ | 
| 3730 | #define DECL_NAMESPACE_INLINEES(NODE) \ | 
| 3731 |    (LANG_DECL_NS_CHECK (NODE)->inlinees) | 
| 3732 |  | 
| 3733 | /* Pointer to hash_map from IDENTIFIERS to DECLS  */ | 
| 3734 | #define DECL_NAMESPACE_BINDINGS(NODE) \ | 
| 3735 |    (LANG_DECL_NS_CHECK (NODE)->bindings) | 
| 3736 |  | 
| 3737 | /* In a NAMESPACE_DECL, points to the original namespace if this is | 
| 3738 |    a namespace alias.  */ | 
| 3739 | #define DECL_NAMESPACE_ALIAS(NODE) \ | 
| 3740 |         DECL_ABSTRACT_ORIGIN (NAMESPACE_DECL_CHECK (NODE)) | 
| 3741 | #define ORIGINAL_NAMESPACE(NODE)  \ | 
| 3742 |   (DECL_NAMESPACE_ALIAS (NODE) ? DECL_NAMESPACE_ALIAS (NODE) : (NODE)) | 
| 3743 |  | 
| 3744 | /* Nonzero if NODE is the std namespace.  */ | 
| 3745 | #define DECL_NAMESPACE_STD_P(NODE)                        \ | 
| 3746 |   ((NODE) == std_node) | 
| 3747 |  | 
| 3748 | /* In a TREE_LIST in an attribute list, indicates that the attribute | 
| 3749 |    must be applied at instantiation time.  */ | 
| 3750 | #define ATTR_IS_DEPENDENT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE)) | 
| 3751 |  | 
| 3752 | /* In a TREE_LIST in the argument of attribute abi_tag, indicates that the tag | 
| 3753 |    was inherited from a template parameter, not explicitly indicated.  */ | 
| 3754 | #define ABI_TAG_IMPLICIT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE)) | 
| 3755 |  | 
| 3756 | /* In a TREE_LIST for a parameter-declaration-list, indicates that all the | 
| 3757 |    parameters in the list have declarators enclosed in ().  */ | 
| 3758 | #define PARENTHESIZED_LIST_P(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE)) | 
| 3759 |  | 
| 3760 | /* Non zero if this is a using decl for a dependent scope.  */ | 
| 3761 | #define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE)) | 
| 3762 |  | 
| 3763 | /* The scope named in a using decl.  */ | 
| 3764 | #define USING_DECL_SCOPE(NODE) DECL_RESULT_FLD (USING_DECL_CHECK (NODE)) | 
| 3765 |  | 
| 3766 | /* The decls named by a using decl.  */ | 
| 3767 | #define USING_DECL_DECLS(NODE) DECL_INITIAL (USING_DECL_CHECK (NODE)) | 
| 3768 |  | 
| 3769 | /* Non zero if the using decl refers to a dependent type.  */ | 
| 3770 | #define USING_DECL_TYPENAME_P(NODE) DECL_LANG_FLAG_1 (USING_DECL_CHECK (NODE)) | 
| 3771 |  | 
| 3772 | /* True if member using decl NODE refers to a non-inherited NODE.  */ | 
| 3773 | #define USING_DECL_UNRELATED_P(NODE) DECL_LANG_FLAG_2 (USING_DECL_CHECK (NODE)) | 
| 3774 |  | 
| 3775 | /* True iff the CONST_DECL is a class-scope clone from C++20 using enum, | 
| 3776 |    created by handle_using_decl.  */ | 
| 3777 | #define CONST_DECL_USING_P(NODE)                        \ | 
| 3778 |   (TREE_CODE (NODE) == CONST_DECL                        \ | 
| 3779 |    && TREE_TYPE (NODE)                                        \ | 
| 3780 |    && TREE_CODE (TREE_TYPE (NODE)) == ENUMERAL_TYPE        \ | 
| 3781 |    && DECL_CONTEXT (NODE) != TREE_TYPE (NODE)) | 
| 3782 |  | 
| 3783 | /* In a FUNCTION_DECL, this is nonzero if this function was defined in | 
| 3784 |    the class definition.  We have saved away the text of the function, | 
| 3785 |    but have not yet processed it.  */ | 
| 3786 | #define DECL_PENDING_INLINE_P(NODE) \ | 
| 3787 |   (LANG_DECL_FN_CHECK (NODE)->pending_inline_p) | 
| 3788 |  | 
| 3789 | /* If DECL_PENDING_INLINE_P holds, this is the saved text of the | 
| 3790 |    function.  */ | 
| 3791 | #define DECL_PENDING_INLINE_INFO(NODE) \ | 
| 3792 |   (LANG_DECL_FN_CHECK (NODE)->u.pending_inline_info) | 
| 3793 |  | 
| 3794 | /* Nonzero for TYPE_DECL means that it was written 'using name = type'.  */ | 
| 3795 | #define TYPE_DECL_ALIAS_P(NODE) \ | 
| 3796 |   DECL_LANG_FLAG_6 (TYPE_DECL_CHECK (NODE)) | 
| 3797 |  | 
| 3798 | /* Nonzero for a type which is an alias for another type; i.e, a type | 
| 3799 |    which declaration was written 'using name-of-type = | 
| 3800 |    another-type'.  */ | 
| 3801 | #define TYPE_ALIAS_P(NODE)                        \ | 
| 3802 |   (TYPE_P (NODE)                                \ | 
| 3803 |    && TYPE_NAME (NODE)                                \ | 
| 3804 |    && TREE_CODE (TYPE_NAME (NODE)) == TYPE_DECL        \ | 
| 3805 |    && TYPE_DECL_ALIAS_P (TYPE_NAME (NODE))) | 
| 3806 |  | 
| 3807 | /* If non-NULL for a VAR_DECL, FUNCTION_DECL, TYPE_DECL, TEMPLATE_DECL, | 
| 3808 |    or CONCEPT_DECL, the entity is either a template specialization (if | 
| 3809 |    DECL_USE_TEMPLATE is nonzero) or the abstract instance of the | 
| 3810 |    template itself. | 
| 3811 |  | 
| 3812 |    In either case, DECL_TEMPLATE_INFO is a TEMPLATE_INFO, whose | 
| 3813 |    TI_TEMPLATE is the TEMPLATE_DECL of which this entity is a | 
| 3814 |    specialization or abstract instance.  The TI_ARGS is the | 
| 3815 |    template arguments used to specialize the template. | 
| 3816 |  | 
| 3817 |    Consider: | 
| 3818 |  | 
| 3819 |       template <typename T> struct S { friend void f(T) {} }; | 
| 3820 |  | 
| 3821 |    In this case, S<int>::f is, from the point of view of the compiler, | 
| 3822 |    an instantiation of a template -- but, from the point of view of | 
| 3823 |    the language, each instantiation of S results in a wholly unrelated | 
| 3824 |    global function f.  In this case, DECL_TEMPLATE_INFO for S<int>::f | 
| 3825 |    will be non-NULL, but DECL_USE_TEMPLATE will be zero. | 
| 3826 |  | 
| 3827 |    In a friend declaration, TI_TEMPLATE can be an overload set, or | 
| 3828 |    identifier.  */ | 
| 3829 | #define DECL_TEMPLATE_INFO(NODE) \ | 
| 3830 |   (DECL_LANG_SPECIFIC (TEMPLATE_INFO_DECL_CHECK (NODE)) \ | 
| 3831 |    ->u.min.template_info) | 
| 3832 |  | 
| 3833 | /* For a lambda capture proxy, its captured variable.  */ | 
| 3834 | #define DECL_CAPTURED_VARIABLE(NODE) \ | 
| 3835 |   (LANG_DECL_MIN_CHECK (NODE)->access) | 
| 3836 |  | 
| 3837 | /* For a VAR_DECL, indicates that the variable is actually a | 
| 3838 |    non-static data member of anonymous union that has been promoted to | 
| 3839 |    variable status.  */ | 
| 3840 | #define DECL_ANON_UNION_VAR_P(NODE) \ | 
| 3841 |   (DECL_LANG_FLAG_4 (VAR_DECL_CHECK (NODE))) | 
| 3842 |  | 
| 3843 | /* Template information for a RECORD_TYPE or UNION_TYPE.  */ | 
| 3844 | #define CLASSTYPE_TEMPLATE_INFO(NODE) \ | 
| 3845 |   (TYPE_LANG_SLOT_1 (RECORD_OR_UNION_CHECK (NODE))) | 
| 3846 |  | 
| 3847 | /* Template information for a template template parameter.  */ | 
| 3848 | #define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) \ | 
| 3849 |   (TYPE_LANG_SLOT_1 (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK (NODE))) | 
| 3850 |  | 
| 3851 | /* Template information for an ENUMERAL_, RECORD_, UNION_TYPE, or | 
| 3852 |    BOUND_TEMPLATE_TEMPLATE_PARM type.  This ignores any alias | 
| 3853 |    templateness of NODE.  It'd be nice if this could unconditionally | 
| 3854 |    access the slot, rather than return NULL if given a | 
| 3855 |    non-templatable type.  */ | 
| 3856 | #define TYPE_TEMPLATE_INFO(NODE)                                        \ | 
| 3857 |   (TREE_CODE (NODE) == ENUMERAL_TYPE                                        \ | 
| 3858 |    || TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM                        \ | 
| 3859 |    || RECORD_OR_UNION_TYPE_P (NODE)                                        \ | 
| 3860 |    ? TYPE_LANG_SLOT_1 (NODE) : NULL_TREE) | 
| 3861 |  | 
| 3862 | /* Template information (if any) for an alias type.  */ | 
| 3863 | #define TYPE_ALIAS_TEMPLATE_INFO(NODE)                                        \ | 
| 3864 |   (DECL_LANG_SPECIFIC (TYPE_NAME (NODE))                                \ | 
| 3865 |    ? DECL_TEMPLATE_INFO (TYPE_NAME (NODE))                                \ | 
| 3866 |    : NULL_TREE) | 
| 3867 |  | 
| 3868 | /* If NODE is a type alias, this accessor returns the template info | 
| 3869 |    for the alias template (if any).  Otherwise behave as | 
| 3870 |    TYPE_TEMPLATE_INFO.  */ | 
| 3871 | #define TYPE_TEMPLATE_INFO_MAYBE_ALIAS(NODE)                                \ | 
| 3872 |   (typedef_variant_p (NODE)                                                \ | 
| 3873 |    ? TYPE_ALIAS_TEMPLATE_INFO (NODE)                                        \ | 
| 3874 |    : TYPE_TEMPLATE_INFO (NODE)) | 
| 3875 |  | 
| 3876 | /* Set the template information for a non-alias n ENUMERAL_, RECORD_, | 
| 3877 |    or UNION_TYPE to VAL.  ALIAS's are dealt with separately.  */ | 
| 3878 | #define SET_TYPE_TEMPLATE_INFO(NODE, VAL)                                \ | 
| 3879 |   (TREE_CODE (NODE) == ENUMERAL_TYPE                \ | 
| 3880 |    || (CLASS_TYPE_P (NODE) && !TYPE_ALIAS_P (NODE))                        \ | 
| 3881 |    ? (TYPE_LANG_SLOT_1 (NODE) = (VAL))                                        \ | 
| 3882 |    : (DECL_TEMPLATE_INFO (TYPE_NAME (NODE)) = (VAL)))                        \ | 
| 3883 |  | 
| 3884 | #define TI_TEMPLATE(NODE) \ | 
| 3885 |   ((struct tree_template_info*)TEMPLATE_INFO_CHECK (NODE))->tmpl | 
| 3886 | #define TI_ARGS(NODE) \ | 
| 3887 |   ((struct tree_template_info*)TEMPLATE_INFO_CHECK (NODE))->args | 
| 3888 | #define TI_PENDING_TEMPLATE_FLAG(NODE) \ | 
| 3889 |   TREE_LANG_FLAG_1 (TEMPLATE_INFO_CHECK (NODE)) | 
| 3890 |  | 
| 3891 | /* For a class or variable template specialization, this contains the | 
| 3892 |    TEMPLATE_INFO result of most_specialized_partial_spec, i.e. the selected | 
| 3893 |    partial template specialization and arguments relative to it.  */ | 
| 3894 | #define TI_PARTIAL_INFO(NODE) \ | 
| 3895 |   (gcc_checking_assert (PRIMARY_TEMPLATE_P (TI_TEMPLATE (NODE))), \ | 
| 3896 |    ((struct tree_template_info*)NODE)->partial) | 
| 3897 |  | 
| 3898 | /* For a given TREE_VEC containing a template argument list, | 
| 3899 |    this property contains the number of arguments that are not | 
| 3900 |    defaulted.  */ | 
| 3901 | #define NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \ | 
| 3902 |   TREE_CHAIN (TREE_VEC_CHECK (NODE)) | 
| 3903 |  | 
| 3904 | /* Below are the setter and getter of the NON_DEFAULT_TEMPLATE_ARGS_COUNT | 
| 3905 |    property.  */ | 
| 3906 | #define SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE, INT_VALUE) \ | 
| 3907 |   NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) = build_int_cst (NULL_TREE, INT_VALUE) | 
| 3908 | #if CHECKING_P | 
| 3909 | #define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \ | 
| 3910 |     int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE)) | 
| 3911 | #else | 
| 3912 | #define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \ | 
| 3913 |   NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE) \ | 
| 3914 |   ? int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE)) \ | 
| 3915 |   : TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (NODE)) | 
| 3916 | #endif | 
| 3917 |  | 
| 3918 | /* True iff NODE represents the template args for a type-constraint, | 
| 3919 |    in which case the first one represents the constrained type. | 
| 3920 |    Currently only set during mangling.  */ | 
| 3921 | #define TEMPLATE_ARGS_TYPE_CONSTRAINT_P(NODE) \ | 
| 3922 |   TREE_PRIVATE (TREE_VEC_CHECK (NODE)) | 
| 3923 |  | 
| 3924 | /* The list of access checks that were deferred during parsing | 
| 3925 |    which need to be performed at template instantiation time. | 
| 3926 |  | 
| 3927 |    FIXME this should be associated with the TEMPLATE_DECL, not the | 
| 3928 |    TEMPLATE_INFO.  */ | 
| 3929 | #define TI_DEFERRED_ACCESS_CHECKS(NODE) \ | 
| 3930 |   ((struct tree_template_info*)TEMPLATE_INFO_CHECK \ | 
| 3931 |      (NODE))->deferred_access_checks | 
| 3932 |  | 
| 3933 | /* We use TREE_VECs to hold template arguments.  If there is only one | 
| 3934 |    level of template arguments, then the TREE_VEC contains the | 
| 3935 |    arguments directly.  If there is more than one level of template | 
| 3936 |    arguments, then each entry in the TREE_VEC is itself a TREE_VEC, | 
| 3937 |    containing the template arguments for a single level.  The first | 
| 3938 |    entry in the outer TREE_VEC is the outermost level of template | 
| 3939 |    parameters; the last is the innermost. | 
| 3940 |  | 
| 3941 |    It is incorrect to ever form a template argument vector containing | 
| 3942 |    only one level of arguments, but which is a TREE_VEC containing as | 
| 3943 |    its only entry the TREE_VEC for that level. | 
| 3944 |  | 
| 3945 |    For each TREE_VEC containing the template arguments for a single | 
| 3946 |    level, it's possible to get or set the number of non defaulted | 
| 3947 |    template arguments by using the accessor macros | 
| 3948 |    GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT or | 
| 3949 |    SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT.  */ | 
| 3950 |  | 
| 3951 | /* Nonzero if the template arguments is actually a vector of vectors, | 
| 3952 |    rather than just a vector.  */ | 
| 3953 | #define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE)                     \ | 
| 3954 |   (NODE && TREE_VEC_LENGTH (NODE) && TREE_VEC_ELT (NODE, 0)  \ | 
| 3955 |    && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC) | 
| 3956 |  | 
| 3957 | /* The depth of a template argument vector.  When called directly by | 
| 3958 |    the parser, we use a TREE_LIST rather than a TREE_VEC to represent | 
| 3959 |    template arguments.  In that case, there is only one level of template | 
| 3960 |    arguments.  We may even see NULL_TREE if there are 0 levels of | 
| 3961 |    template arguments, as in cp_parser_requires_expression.   */ | 
| 3962 | #define TMPL_ARGS_DEPTH(NODE)                                                \ | 
| 3963 |   ((NODE) == NULL_TREE ? 0                                                \ | 
| 3964 |    : TMPL_ARGS_HAVE_MULTIPLE_LEVELS (NODE) ? TREE_VEC_LENGTH (NODE)        \ | 
| 3965 |    : 1) | 
| 3966 |  | 
| 3967 | /* The LEVELth level of the template ARGS.  The outermost level of | 
| 3968 |    args is level 1, not level 0.  */ | 
| 3969 | #define TMPL_ARGS_LEVEL(ARGS, LEVEL)                \ | 
| 3970 |   (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (ARGS)        \ | 
| 3971 |    ? TREE_VEC_ELT (ARGS, (LEVEL) - 1)                \ | 
| 3972 |    : (gcc_checking_assert ((LEVEL) == 1), (ARGS))) | 
| 3973 |  | 
| 3974 | /* Set the LEVELth level of the template ARGS to VAL.  This macro does | 
| 3975 |    not work with single-level argument vectors.  */ | 
| 3976 | #define SET_TMPL_ARGS_LEVEL(ARGS, LEVEL, VAL)        \ | 
| 3977 |   (TREE_VEC_ELT (ARGS, (LEVEL) - 1) = (VAL)) | 
| 3978 |  | 
| 3979 | /* Accesses the IDXth parameter in the LEVELth level of the ARGS.  */ | 
| 3980 | #define TMPL_ARG(ARGS, LEVEL, IDX)                                \ | 
| 3981 |   (TREE_VEC_ELT (TMPL_ARGS_LEVEL (ARGS, LEVEL), IDX)) | 
| 3982 |  | 
| 3983 | /* Given a single level of template arguments in NODE, return the | 
| 3984 |    number of arguments.  */ | 
| 3985 | #define NUM_TMPL_ARGS(NODE)                                \ | 
| 3986 |   (TREE_VEC_LENGTH (NODE)) | 
| 3987 |  | 
| 3988 | /* Returns the innermost level of template arguments in ARGS.  */ | 
| 3989 | #define INNERMOST_TEMPLATE_ARGS(NODE) \ | 
| 3990 |   (get_innermost_template_args ((NODE), 1)) | 
| 3991 |  | 
| 3992 | /* The number of levels of template parameters given by NODE.  */ | 
| 3993 | #define TMPL_PARMS_DEPTH(NODE) \ | 
| 3994 |   ((HOST_WIDE_INT) TREE_INT_CST_LOW (TREE_PURPOSE (NODE))) | 
| 3995 |  | 
| 3996 | /* The TEMPLATE_DECL instantiated or specialized by NODE.  This | 
| 3997 |    TEMPLATE_DECL will be the immediate parent, not the most general | 
| 3998 |    template.  For example, in: | 
| 3999 |  | 
| 4000 |       template <class T> struct S { template <class U> void f(U); } | 
| 4001 |  | 
| 4002 |    the FUNCTION_DECL for S<int>::f<double> will have, as its | 
| 4003 |    DECL_TI_TEMPLATE, `template <class U> S<int>::f<U>'. | 
| 4004 |  | 
| 4005 |    As a special case, for a member friend template of a template | 
| 4006 |    class, this value will not be a TEMPLATE_DECL, but rather an | 
| 4007 |    IDENTIFIER_NODE or OVERLOAD indicating the name of the template and | 
| 4008 |    any explicit template arguments provided.  For example, in: | 
| 4009 |  | 
| 4010 |      template <class T> struct S { friend void f<int>(int, double); } | 
| 4011 |  | 
| 4012 |    the DECL_TI_TEMPLATE will be an IDENTIFIER_NODE for `f' and the | 
| 4013 |    DECL_TI_ARGS will be {int}. | 
| 4014 |  | 
| 4015 |    For a FIELD_DECL with a non-static data member initializer, this value | 
| 4016 |    is the FIELD_DECL it was instantiated from.  */ | 
| 4017 | #define DECL_TI_TEMPLATE(NODE)      TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE)) | 
| 4018 |  | 
| 4019 | /* The template arguments used to obtain this decl from the most | 
| 4020 |    general form of DECL_TI_TEMPLATE.  For the example given for | 
| 4021 |    DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}.  These | 
| 4022 |    are always the full set of arguments required to instantiate this | 
| 4023 |    declaration from the most general template specialized here.  */ | 
| 4024 | #define DECL_TI_ARGS(NODE)            TI_ARGS (DECL_TEMPLATE_INFO (NODE)) | 
| 4025 |  | 
| 4026 | /* The TEMPLATE_DECL associated with NODE, a class type.  Even if NODE | 
| 4027 |    will be generated from a partial specialization, the TEMPLATE_DECL | 
| 4028 |    referred to here will be the original template.  For example, | 
| 4029 |    given: | 
| 4030 |  | 
| 4031 |       template <typename T> struct S {}; | 
| 4032 |       template <typename T> struct S<T*> {}; | 
| 4033 |  | 
| 4034 |    the CLASSTYPE_TI_TEMPLATE for S<int*> will be S, not the S<T*>. | 
| 4035 |  | 
| 4036 |    For a member class template, CLASSTYPE_TI_TEMPLATE always refers to the | 
| 4037 |    partial instantiation rather than the primary template.  CLASSTYPE_TI_ARGS | 
| 4038 |    are for the primary template if the partial instantiation isn't | 
| 4039 |    specialized, or for the explicit specialization if it is, e.g. | 
| 4040 |  | 
| 4041 |       template <class T> class C { template <class U> class D; } | 
| 4042 |       template <> template <class U> class C<int>::D;  */ | 
| 4043 | #define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE)) | 
| 4044 | #define CLASSTYPE_TI_ARGS(NODE)     TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE)) | 
| 4045 |  | 
| 4046 | /* For a template instantiation TYPE, returns the TYPE corresponding | 
| 4047 |    to the primary template.  Otherwise returns TYPE itself.  */ | 
| 4048 | #define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE)                                \ | 
| 4049 |   ((CLASSTYPE_USE_TEMPLATE ((TYPE))                                        \ | 
| 4050 |     && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE)))                        \ | 
| 4051 |    ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE                \ | 
| 4052 |                                       (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \ | 
| 4053 |    : (TYPE)) | 
| 4054 |  | 
| 4055 | /* Like CLASS_TI_TEMPLATE, but also works for ENUMERAL_TYPEs.  */ | 
| 4056 | #define TYPE_TI_TEMPLATE(NODE)                        \ | 
| 4057 |   (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE))) | 
| 4058 |  | 
| 4059 | /* Like DECL_TI_ARGS, but for an ENUMERAL_, RECORD_, or UNION_TYPE.  */ | 
| 4060 | #define TYPE_TI_ARGS(NODE)                        \ | 
| 4061 |   (TI_ARGS (TYPE_TEMPLATE_INFO (NODE))) | 
| 4062 |  | 
| 4063 | #define INNERMOST_TEMPLATE_PARMS(NODE)  TREE_VALUE (NODE) | 
| 4064 |  | 
| 4065 | /* Nonzero if NODE (a TEMPLATE_DECL) is a member template, in the | 
| 4066 |    sense of [temp.mem].  */ | 
| 4067 | #define DECL_MEMBER_TEMPLATE_P(NODE) \ | 
| 4068 |   (DECL_LANG_FLAG_1 (TEMPLATE_DECL_CHECK (NODE))) | 
| 4069 |  | 
| 4070 | /* Nonzero if the NODE corresponds to the template parameters for a | 
| 4071 |    member template, whose inline definition is being processed after | 
| 4072 |    the class definition is complete.  */ | 
| 4073 | #define TEMPLATE_PARMS_FOR_INLINE(NODE) TREE_LANG_FLAG_1 (NODE) | 
| 4074 |  | 
| 4075 | /* Determine if a declaration (PARM_DECL or FIELD_DECL) is a pack.  */ | 
| 4076 | #define DECL_PACK_P(NODE) \ | 
| 4077 |   (DECL_P (NODE) && PACK_EXPANSION_P (TREE_TYPE (NODE))) | 
| 4078 |  | 
| 4079 | /* Determines if NODE is an expansion of one or more parameter packs, | 
| 4080 |    e.g., a TYPE_PACK_EXPANSION or EXPR_PACK_EXPANSION.  */ | 
| 4081 | #define PACK_EXPANSION_P(NODE)                 \ | 
| 4082 |   (TREE_CODE (NODE) == TYPE_PACK_EXPANSION     \ | 
| 4083 |    || TREE_CODE (NODE) == EXPR_PACK_EXPANSION) | 
| 4084 |  | 
| 4085 | #define PACK_EXPANSION_CHECK(NODE) \ | 
| 4086 |   TREE_CHECK2 (NODE, TYPE_PACK_EXPANSION, EXPR_PACK_EXPANSION) | 
| 4087 |  | 
| 4088 | #define PACK_INDEX_CHECK(NODE) \ | 
| 4089 |   TREE_CHECK2 (NODE, PACK_INDEX_TYPE, PACK_INDEX_EXPR) | 
| 4090 |  | 
| 4091 | /* Extracts the type or expression pattern from a TYPE_PACK_EXPANSION or | 
| 4092 |    EXPR_PACK_EXPANSION.  */ | 
| 4093 | #define PACK_EXPANSION_PATTERN(NODE)                            \ | 
| 4094 |   (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \ | 
| 4095 |    ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0)) | 
| 4096 |  | 
| 4097 | /* The list of parameter packs used in the PACK_EXPANSION_* node. The | 
| 4098 |    TREE_VALUE of each TREE_LIST contains the parameter packs.  */ | 
| 4099 | #define PACK_EXPANSION_PARAMETER_PACKS(NODE)                \ | 
| 4100 |   *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == EXPR_PACK_EXPANSION \ | 
| 4101 |     ? &TREE_OPERAND (NODE, 1)                                \ | 
| 4102 |     : &TYPE_MIN_VALUE_RAW (TYPE_PACK_EXPANSION_CHECK (NODE))) | 
| 4103 |  | 
| 4104 | /* Any additional template args to be applied when substituting into | 
| 4105 |    the pattern, set by tsubst_pack_expansion for partial instantiations. | 
| 4106 |    If this is a TREE_LIST, the TREE_VALUE of the first element is the | 
| 4107 |    usual template argument TREE_VEC, and the TREE_PURPOSE of later elements | 
| 4108 |    are enclosing functions that provided function parameter packs we'll need | 
| 4109 |    to map appropriately.  */ | 
| 4110 | #define (NODE)                \ | 
| 4111 |   *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \ | 
| 4112 |     ? &TYPE_MAX_VALUE_RAW (NODE)                        \ | 
| 4113 |     : &TREE_OPERAND ((NODE), 2)) | 
| 4114 |  | 
| 4115 | /* True if NODE is a pack index.  */ | 
| 4116 | #define PACK_INDEX_P(NODE)                 \ | 
| 4117 |   (TREE_CODE (NODE) == PACK_INDEX_TYPE     \ | 
| 4118 |    || TREE_CODE (NODE) == PACK_INDEX_EXPR) | 
| 4119 |  | 
| 4120 | /* For a pack index T...[N], the pack expansion 'T...'.  */ | 
| 4121 | #define PACK_INDEX_PACK(NODE) \ | 
| 4122 |   (TREE_CODE (PACK_INDEX_CHECK (NODE)) == PACK_INDEX_TYPE \ | 
| 4123 |    ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0)) | 
| 4124 |  | 
| 4125 | /* For a pack index T...[N], the index N.  */ | 
| 4126 | #define PACK_INDEX_INDEX(NODE) \ | 
| 4127 |   *(TREE_CODE (PACK_INDEX_CHECK (NODE)) == PACK_INDEX_TYPE \ | 
| 4128 |     ? &TYPE_MAX_VALUE_RAW (NODE)                        \ | 
| 4129 |     : &TREE_OPERAND ((NODE), 1)) | 
| 4130 |  | 
| 4131 | /* True iff this pack expansion is within a function context.  */ | 
| 4132 | #define PACK_EXPANSION_LOCAL_P(NODE) \ | 
| 4133 |   TREE_LANG_FLAG_0 (PACK_EXPANSION_CHECK (NODE)) | 
| 4134 |  | 
| 4135 | /* True iff this pack expansion is for sizeof....  */ | 
| 4136 | #define PACK_EXPANSION_SIZEOF_P(NODE) \ | 
| 4137 |   TREE_LANG_FLAG_1 (PACK_EXPANSION_CHECK (NODE)) | 
| 4138 |  | 
| 4139 | /* True iff this pack expansion is for auto... in lambda init-capture.  */ | 
| 4140 | #define PACK_EXPANSION_AUTO_P(NODE) \ | 
| 4141 |   TREE_LANG_FLAG_2 (PACK_EXPANSION_CHECK (NODE)) | 
| 4142 |  | 
| 4143 | /* True if we must use PACK_EXPANSION_EXTRA_ARGS and avoid partial | 
| 4144 |    instantiation of this pack expansion.  */ | 
| 4145 | #define (NODE) \ | 
| 4146 |   TREE_LANG_FLAG_3 (PACK_EXPANSION_CHECK (NODE)) | 
| 4147 |  | 
| 4148 | /* Indicates whether a pack expansion has been parenthesized.  Used for | 
| 4149 |    a pack expansion in a decltype.  */ | 
| 4150 | #define PACK_INDEX_PARENTHESIZED_P(NODE) \ | 
| 4151 |   TREE_LANG_FLAG_1 (TREE_CHECK (NODE, PACK_INDEX_EXPR)) | 
| 4152 |  | 
| 4153 | /* Determine if this is an argument pack.  */ | 
| 4154 | #define ARGUMENT_PACK_P(NODE)                          \ | 
| 4155 |   (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK              \ | 
| 4156 |    || TREE_CODE (NODE) == NONTYPE_ARGUMENT_PACK) | 
| 4157 |  | 
| 4158 | #define ARGUMENT_PACK_CHECK(NODE) \ | 
| 4159 |   TREE_CHECK2 (NODE, TYPE_ARGUMENT_PACK, NONTYPE_ARGUMENT_PACK) | 
| 4160 |  | 
| 4161 | /* The arguments stored in an argument pack. Arguments are stored in a | 
| 4162 |    TREE_VEC, which may have length zero.  */ | 
| 4163 | #define ARGUMENT_PACK_ARGS(NODE)                               \ | 
| 4164 |   (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK \ | 
| 4165 |    ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0)) | 
| 4166 |  | 
| 4167 | /* Whether the argument pack is "incomplete", meaning that more | 
| 4168 |    arguments can still be deduced. Incomplete argument packs are only | 
| 4169 |    used when the user has provided an explicit template argument list | 
| 4170 |    for a variadic function template. Some of the explicit template | 
| 4171 |    arguments will be placed into the beginning of the argument pack, | 
| 4172 |    but additional arguments might still be deduced.  */ | 
| 4173 | #define ARGUMENT_PACK_INCOMPLETE_P(NODE)        \ | 
| 4174 |   TREE_ADDRESSABLE (ARGUMENT_PACK_ARGS (NODE)) | 
| 4175 |  | 
| 4176 | /* When ARGUMENT_PACK_INCOMPLETE_P, stores the explicit template | 
| 4177 |    arguments used to fill this pack.  */ | 
| 4178 | #define ARGUMENT_PACK_EXPLICIT_ARGS(NODE)       \ | 
| 4179 |   TREE_TYPE (ARGUMENT_PACK_ARGS (NODE)) | 
| 4180 |  | 
| 4181 | /* In an ARGUMENT_PACK_SELECT, the argument pack from which an | 
| 4182 |    argument will be selected.  */ | 
| 4183 | #define ARGUMENT_PACK_SELECT_FROM_PACK(NODE)                                \ | 
| 4184 |   (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->argument_pack) | 
| 4185 |  | 
| 4186 | /* In an ARGUMENT_PACK_SELECT, the index of the argument we want to | 
| 4187 |    select.  */ | 
| 4188 | #define ARGUMENT_PACK_SELECT_INDEX(NODE)                                \ | 
| 4189 |   (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->index) | 
| 4190 |  | 
| 4191 | #define FOLD_EXPR_CHECK(NODE)                                                \ | 
| 4192 |   TREE_CHECK4 (NODE, UNARY_LEFT_FOLD_EXPR, UNARY_RIGHT_FOLD_EXPR,        \ | 
| 4193 |                BINARY_LEFT_FOLD_EXPR, BINARY_RIGHT_FOLD_EXPR) | 
| 4194 |  | 
| 4195 | #define BINARY_FOLD_EXPR_CHECK(NODE) \ | 
| 4196 |   TREE_CHECK2 (NODE, BINARY_LEFT_FOLD_EXPR, BINARY_RIGHT_FOLD_EXPR) | 
| 4197 |  | 
| 4198 | /* True if NODE is UNARY_FOLD_EXPR or a BINARY_FOLD_EXPR */ | 
| 4199 | #define FOLD_EXPR_P(NODE)                                \ | 
| 4200 |   (TREE_CODE (NODE) == UNARY_LEFT_FOLD_EXPR                \ | 
| 4201 |    || TREE_CODE (NODE) == UNARY_RIGHT_FOLD_EXPR                \ | 
| 4202 |    || TREE_CODE (NODE) == BINARY_LEFT_FOLD_EXPR                \ | 
| 4203 |    || TREE_CODE (NODE) == BINARY_RIGHT_FOLD_EXPR) | 
| 4204 |  | 
| 4205 | /* True when NODE is a fold over a compound assignment operator.  */ | 
| 4206 | #define FOLD_EXPR_MODIFY_P(NODE) \ | 
| 4207 |   TREE_LANG_FLAG_0 (FOLD_EXPR_CHECK (NODE)) | 
| 4208 |  | 
| 4209 | /* An INTEGER_CST containing the tree code of the folded operator.  */ | 
| 4210 | #define FOLD_EXPR_OP_RAW(NODE) \ | 
| 4211 |   TREE_OPERAND (FOLD_EXPR_CHECK (NODE), 0) | 
| 4212 |  | 
| 4213 | /* The tree code of the folded operator.  */ | 
| 4214 | #define FOLD_EXPR_OP(NODE) \ | 
| 4215 |   ((enum tree_code) TREE_INT_CST_LOW (FOLD_EXPR_OP_RAW (NODE))) | 
| 4216 |  | 
| 4217 | /* The expression containing an unexpanded parameter pack.  */ | 
| 4218 | #define FOLD_EXPR_PACK(NODE) \ | 
| 4219 |   TREE_OPERAND (FOLD_EXPR_CHECK (NODE), 1) | 
| 4220 |  | 
| 4221 | /* In a binary fold expression, the argument with no unexpanded | 
| 4222 |    parameter packs.  */ | 
| 4223 | #define FOLD_EXPR_INIT(NODE) \ | 
| 4224 |   TREE_OPERAND (BINARY_FOLD_EXPR_CHECK (NODE), 2) | 
| 4225 |  | 
| 4226 | /* In a FUNCTION_DECL, the saved auto-return pattern.  */ | 
| 4227 | #define DECL_SAVED_AUTO_RETURN_TYPE(NODE)                \ | 
| 4228 |   (LANG_DECL_FN_CHECK (FUNCTION_DECL_CHECK (NODE))        \ | 
| 4229 |    ->u.saved_auto_return_type) | 
| 4230 |  | 
| 4231 | /* In a RETURN_EXPR, whether the expression refers to the address | 
| 4232 |    of a local variable.  */ | 
| 4233 | #define RETURN_EXPR_LOCAL_ADDR_P(NODE) \ | 
| 4234 |   TREE_LANG_FLAG_0 (RETURN_EXPR_CHECK (NODE)) | 
| 4235 |  | 
| 4236 | /* True if NODE is an implicit INDIRECT_REF from convert_from_reference.  */ | 
| 4237 | #define REFERENCE_REF_P(NODE)                                \ | 
| 4238 |   (INDIRECT_REF_P (NODE)                                \ | 
| 4239 |    && TREE_TYPE (TREE_OPERAND (NODE, 0))                \ | 
| 4240 |    && TYPE_REF_P (TREE_TYPE (TREE_OPERAND ((NODE), 0)))) | 
| 4241 |  | 
| 4242 | /* Look through an implicit INDIRECT_REF from convert_from_reference.  */ | 
| 4243 | #define STRIP_REFERENCE_REF(NODE)                        \ | 
| 4244 |   (REFERENCE_REF_P (NODE) ? TREE_OPERAND (NODE, 0) : NODE) | 
| 4245 |  | 
| 4246 | /* True iff this represents an lvalue being treated as an rvalue during return | 
| 4247 |    or throw as per [class.copy.elision].  */ | 
| 4248 | #define IMPLICIT_RVALUE_P(NODE) \ | 
| 4249 |   TREE_LANG_FLAG_3 (TREE_CHECK2 ((NODE), NON_LVALUE_EXPR, STATIC_CAST_EXPR)) | 
| 4250 |  | 
| 4251 | #define NEW_EXPR_USE_GLOBAL(NODE) \ | 
| 4252 |   TREE_LANG_FLAG_0 (NEW_EXPR_CHECK (NODE)) | 
| 4253 | #define DELETE_EXPR_USE_GLOBAL(NODE) \ | 
| 4254 |   TREE_LANG_FLAG_0 (DELETE_EXPR_CHECK (NODE)) | 
| 4255 | #define DELETE_EXPR_USE_VEC(NODE) \ | 
| 4256 |   TREE_LANG_FLAG_1 (DELETE_EXPR_CHECK (NODE)) | 
| 4257 |  | 
| 4258 | /* True iff this represents returning a potential named return value.  */ | 
| 4259 | #define INIT_EXPR_NRV_P(NODE) \ | 
| 4260 |   TREE_LANG_FLAG_0 (INIT_EXPR_CHECK (NODE)) | 
| 4261 |  | 
| 4262 | #define CALL_OR_AGGR_INIT_CHECK(NODE) \ | 
| 4263 |   TREE_CHECK2 ((NODE), CALL_EXPR, AGGR_INIT_EXPR) | 
| 4264 |  | 
| 4265 | /* In a CALL_EXPR appearing in a template, true if Koenig lookup | 
| 4266 |    should be performed at instantiation time.  */ | 
| 4267 | #define KOENIG_LOOKUP_P(NODE) TREE_LANG_FLAG_0 (CALL_EXPR_CHECK (NODE)) | 
| 4268 |  | 
| 4269 | /* True if the arguments to NODE should be evaluated in left-to-right | 
| 4270 |    order regardless of PUSH_ARGS_REVERSED.  */ | 
| 4271 | #define CALL_EXPR_ORDERED_ARGS(NODE) \ | 
| 4272 |   TREE_LANG_FLAG_3 (CALL_OR_AGGR_INIT_CHECK (NODE)) | 
| 4273 |  | 
| 4274 | /* True if the arguments to NODE should be evaluated in right-to-left | 
| 4275 |    order regardless of PUSH_ARGS_REVERSED.  */ | 
| 4276 | #define CALL_EXPR_REVERSE_ARGS(NODE) \ | 
| 4277 |   TREE_LANG_FLAG_5 (CALL_OR_AGGR_INIT_CHECK (NODE)) | 
| 4278 |  | 
| 4279 | /* True if CALL_EXPR was written as an operator expression, not a function | 
| 4280 |    call.  */ | 
| 4281 | #define CALL_EXPR_OPERATOR_SYNTAX(NODE) \ | 
| 4282 |   TREE_LANG_FLAG_6 (CALL_OR_AGGR_INIT_CHECK (NODE)) | 
| 4283 |  | 
| 4284 | /* A TREE_LIST containing the result of phase 1 name lookup of the operator | 
| 4285 |    overloads that are pertinent to the dependent operator expression whose | 
| 4286 |    type is NODE.  Each TREE_PURPOSE is an IDENTIFIER_NODE and TREE_VALUE is | 
| 4287 |    the corresponding (possibly empty) lookup result.  The TREE_TYPE of the | 
| 4288 |    first TREE_LIST node points back to NODE.  */ | 
| 4289 | #define DEPENDENT_OPERATOR_TYPE_SAVED_LOOKUPS(NODE) \ | 
| 4290 |   TYPE_VALUES_RAW (DEPENDENT_OPERATOR_TYPE_CHECK (NODE)) | 
| 4291 |  | 
| 4292 | /* Guarded helper for the above accessor macro that takes a (templated) | 
| 4293 |    operator expression instead of the type thereof.  */ | 
| 4294 | inline tree | 
| 4295 | templated_operator_saved_lookups (tree t) | 
| 4296 | { | 
| 4297 |   tree type = TREE_TYPE (EXPR_CHECK (t)); | 
| 4298 |   if (type && TREE_CODE (type) == DEPENDENT_OPERATOR_TYPE) | 
| 4299 |     return DEPENDENT_OPERATOR_TYPE_SAVED_LOOKUPS (type); | 
| 4300 |   else | 
| 4301 |     return NULL_TREE; | 
| 4302 | } | 
| 4303 |  | 
| 4304 | /* Indicates whether a string literal has been parenthesized. Such | 
| 4305 |    usages are disallowed in certain circumstances.  */ | 
| 4306 |  | 
| 4307 | #define PAREN_STRING_LITERAL_P(NODE) \ | 
| 4308 |   TREE_LANG_FLAG_0 (STRING_CST_CHECK (NODE)) | 
| 4309 |  | 
| 4310 | /* Indicates whether a COMPONENT_REF or a SCOPE_REF has been parenthesized, an | 
| 4311 |    INDIRECT_REF comes from parenthesizing a _DECL, or a PAREN_EXPR identifies a | 
| 4312 |    parenthesized initializer relevant for decltype(auto).  Currently only set | 
| 4313 |    some of the time in C++14 mode.  */ | 
| 4314 |  | 
| 4315 | #define REF_PARENTHESIZED_P(NODE) \ | 
| 4316 |   TREE_LANG_FLAG_2 (TREE_CHECK5 ((NODE), COMPONENT_REF, INDIRECT_REF, SCOPE_REF, VIEW_CONVERT_EXPR, PAREN_EXPR)) | 
| 4317 |  | 
| 4318 | /* Nonzero if this AGGR_INIT_EXPR provides for initialization via a | 
| 4319 |    constructor call, rather than an ordinary function call.  */ | 
| 4320 | #define AGGR_INIT_VIA_CTOR_P(NODE) \ | 
| 4321 |   TREE_LANG_FLAG_0 (AGGR_INIT_EXPR_CHECK (NODE)) | 
| 4322 |  | 
| 4323 | /* Nonzero if expanding this AGGR_INIT_EXPR should first zero-initialize | 
| 4324 |    the object.  */ | 
| 4325 | #define AGGR_INIT_ZERO_FIRST(NODE) \ | 
| 4326 |   TREE_LANG_FLAG_2 (AGGR_INIT_EXPR_CHECK (NODE)) | 
| 4327 |  | 
| 4328 | /* Nonzero means that the call is the jump from a thunk to the | 
| 4329 |    thunked-to function.  */ | 
| 4330 | #define AGGR_INIT_FROM_THUNK_P(NODE) \ | 
| 4331 |   (AGGR_INIT_EXPR_CHECK (NODE)->base.protected_flag) | 
| 4332 |  | 
| 4333 | /* Nonzero means that the call was marked musttail.  */ | 
| 4334 | #define AGGR_INIT_EXPR_MUST_TAIL(NODE) \ | 
| 4335 |   (AGGR_INIT_EXPR_CHECK (NODE)->base.static_flag) | 
| 4336 |  | 
| 4337 | /* AGGR_INIT_EXPR accessors.  These are equivalent to the CALL_EXPR | 
| 4338 |    accessors, except for AGGR_INIT_EXPR_SLOT (which takes the place of | 
| 4339 |    CALL_EXPR_STATIC_CHAIN).  */ | 
| 4340 |  | 
| 4341 | #define AGGR_INIT_EXPR_FN(NODE) TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 1) | 
| 4342 | #define AGGR_INIT_EXPR_SLOT(NODE) \ | 
| 4343 |   TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 2) | 
| 4344 | #define AGGR_INIT_EXPR_ARG(NODE, I) \ | 
| 4345 |   TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), (I) + 3) | 
| 4346 | #define aggr_init_expr_nargs(NODE) (VL_EXP_OPERAND_LENGTH(NODE) - 3) | 
| 4347 |  | 
| 4348 | /* AGGR_INIT_EXPR_ARGP returns a pointer to the argument vector for NODE. | 
| 4349 |    We can't use &AGGR_INIT_EXPR_ARG (NODE, 0) because that will complain if | 
| 4350 |    the argument count is zero when checking is enabled.  Instead, do | 
| 4351 |    the pointer arithmetic to advance past the 3 fixed operands in a | 
| 4352 |    AGGR_INIT_EXPR.  That produces a valid pointer to just past the end of | 
| 4353 |    the operand array, even if it's not valid to dereference it.  */ | 
| 4354 | #define AGGR_INIT_EXPR_ARGP(NODE) \ | 
| 4355 |   (&(TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 0)) + 3) | 
| 4356 |  | 
| 4357 | /* Abstract iterators for AGGR_INIT_EXPRs.  */ | 
| 4358 |  | 
| 4359 | /* Structure containing iterator state.  */ | 
| 4360 | struct aggr_init_expr_arg_iterator { | 
| 4361 |   tree t;        /* the aggr_init_expr */ | 
| 4362 |   int n;        /* argument count */ | 
| 4363 |   int i;        /* next argument index */ | 
| 4364 | }; | 
| 4365 |  | 
| 4366 | /* Initialize the abstract argument list iterator object ITER with the | 
| 4367 |    arguments from AGGR_INIT_EXPR node EXP.  */ | 
| 4368 | inline void | 
| 4369 | init_aggr_init_expr_arg_iterator (tree exp, | 
| 4370 |                                        aggr_init_expr_arg_iterator *iter) | 
| 4371 | { | 
| 4372 |   iter->t = exp; | 
| 4373 |   iter->n = aggr_init_expr_nargs (exp); | 
| 4374 |   iter->i = 0; | 
| 4375 | } | 
| 4376 |  | 
| 4377 | /* Return the next argument from abstract argument list iterator object ITER, | 
| 4378 |    and advance its state.  Return NULL_TREE if there are no more arguments.  */ | 
| 4379 | inline tree | 
| 4380 | next_aggr_init_expr_arg (aggr_init_expr_arg_iterator *iter) | 
| 4381 | { | 
| 4382 |   tree result; | 
| 4383 |   if (iter->i >= iter->n) | 
| 4384 |     return NULL_TREE; | 
| 4385 |   result = AGGR_INIT_EXPR_ARG (iter->t, iter->i); | 
| 4386 |   iter->i++; | 
| 4387 |   return result; | 
| 4388 | } | 
| 4389 |  | 
| 4390 | /* Initialize the abstract argument list iterator object ITER, then advance | 
| 4391 |    past and return the first argument.  Useful in for expressions, e.g. | 
| 4392 |      for (arg = first_aggr_init_expr_arg (exp, &iter); arg; | 
| 4393 |           arg = next_aggr_init_expr_arg (&iter))   */ | 
| 4394 | inline tree | 
| 4395 | first_aggr_init_expr_arg (tree exp, aggr_init_expr_arg_iterator *iter) | 
| 4396 | { | 
| 4397 |   init_aggr_init_expr_arg_iterator (exp, iter); | 
| 4398 |   return next_aggr_init_expr_arg (iter); | 
| 4399 | } | 
| 4400 |  | 
| 4401 | /* Test whether there are more arguments in abstract argument list iterator | 
| 4402 |    ITER, without changing its state.  */ | 
| 4403 | inline bool | 
| 4404 | more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) | 
| 4405 | { | 
| 4406 |   return (iter->i < iter->n); | 
| 4407 | } | 
| 4408 |  | 
| 4409 | /* Iterate through each argument ARG of AGGR_INIT_EXPR CALL, using variable | 
| 4410 |    ITER (of type aggr_init_expr_arg_iterator) to hold the iteration state.  */ | 
| 4411 | #define FOR_EACH_AGGR_INIT_EXPR_ARG(arg, iter, call)                        \ | 
| 4412 |   for ((arg) = first_aggr_init_expr_arg ((call), &(iter)); (arg);        \ | 
| 4413 |        (arg) = next_aggr_init_expr_arg (&(iter))) | 
| 4414 |  | 
| 4415 | /* We have an expression tree T that represents a call, either CALL_EXPR | 
| 4416 |    or AGGR_INIT_EXPR.  Return a reference to the Nth argument.  */ | 
| 4417 |  | 
| 4418 | inline tree& | 
| 4419 | get_nth_callarg (tree t, int n) | 
| 4420 | { | 
| 4421 |   switch (TREE_CODE (t)) | 
| 4422 |     { | 
| 4423 |     case CALL_EXPR: | 
| 4424 |       return CALL_EXPR_ARG (t, n); | 
| 4425 |  | 
| 4426 |     case AGGR_INIT_EXPR: | 
| 4427 |       return AGGR_INIT_EXPR_ARG (t, n); | 
| 4428 |  | 
| 4429 |     default: | 
| 4430 |       gcc_unreachable (); | 
| 4431 |     } | 
| 4432 | } | 
| 4433 |  | 
| 4434 | /* VEC_INIT_EXPR accessors.  */ | 
| 4435 | #define VEC_INIT_EXPR_SLOT(NODE) TREE_OPERAND (VEC_INIT_EXPR_CHECK (NODE), 0) | 
| 4436 | #define VEC_INIT_EXPR_INIT(NODE) TREE_OPERAND (VEC_INIT_EXPR_CHECK (NODE), 1) | 
| 4437 |  | 
| 4438 | /* Indicates that a VEC_INIT_EXPR is a potential constant expression. | 
| 4439 |    Only set when the current function is constexpr.  */ | 
| 4440 | #define VEC_INIT_EXPR_IS_CONSTEXPR(NODE) \ | 
| 4441 |   TREE_LANG_FLAG_0 (VEC_INIT_EXPR_CHECK (NODE)) | 
| 4442 |  | 
| 4443 | /* Indicates that a VEC_INIT_EXPR is expressing value-initialization.  */ | 
| 4444 | #define VEC_INIT_EXPR_VALUE_INIT(NODE) \ | 
| 4445 |   TREE_LANG_FLAG_1 (VEC_INIT_EXPR_CHECK (NODE)) | 
| 4446 |  | 
| 4447 | /* If T is a VEC_INIT_EXPR, return it, possibly stripping a TARGET_EXPR | 
| 4448 |    wrapper.  Otherwise, return null.  */ | 
| 4449 | inline tree | 
| 4450 | get_vec_init_expr (tree t) | 
| 4451 | { | 
| 4452 |   if (t && TREE_CODE (t) == TARGET_EXPR) | 
| 4453 |     t = TARGET_EXPR_INITIAL (t); | 
| 4454 |   if (t && TREE_CODE (t) == VEC_INIT_EXPR) | 
| 4455 |     return t; | 
| 4456 |   return NULL_TREE; | 
| 4457 | } | 
| 4458 |  | 
| 4459 | /* The condition under which this MUST_NOT_THROW_EXPR actually blocks | 
| 4460 |    exceptions.  NULL_TREE means 'true'.  */ | 
| 4461 | #define MUST_NOT_THROW_COND(NODE) \ | 
| 4462 |   TREE_OPERAND (MUST_NOT_THROW_EXPR_CHECK (NODE), 1) | 
| 4463 |  | 
| 4464 | /* The TYPE_MAIN_DECL for a class template type is a TYPE_DECL, not a | 
| 4465 |    TEMPLATE_DECL.  This macro determines whether or not a given class | 
| 4466 |    type is really a template type, as opposed to an instantiation or | 
| 4467 |    specialization of one.  */ | 
| 4468 | #define CLASSTYPE_IS_TEMPLATE(NODE)  \ | 
| 4469 |   (CLASSTYPE_TEMPLATE_INFO (NODE)    \ | 
| 4470 |    && !CLASSTYPE_USE_TEMPLATE (NODE) \ | 
| 4471 |    && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))) | 
| 4472 |  | 
| 4473 | /* The name used by the user to name the typename type.  Typically, | 
| 4474 |    this is an IDENTIFIER_NODE, and the same as the DECL_NAME on the | 
| 4475 |    corresponding TYPE_DECL.  However, this may also be a | 
| 4476 |    TEMPLATE_ID_EXPR if we had something like `typename X::Y<T>'.  */ | 
| 4477 | #define TYPENAME_TYPE_FULLNAME(NODE) \ | 
| 4478 |   (TYPE_VALUES_RAW (TYPENAME_TYPE_CHECK (NODE))) | 
| 4479 |  | 
| 4480 | /* True if a TYPENAME_TYPE was declared as an "enum".  */ | 
| 4481 | #define TYPENAME_IS_ENUM_P(NODE) \ | 
| 4482 |   (TREE_LANG_FLAG_0 (TYPENAME_TYPE_CHECK (NODE))) | 
| 4483 |  | 
| 4484 | /* True if a TYPENAME_TYPE was declared as a "class", "struct", or | 
| 4485 |    "union".  */ | 
| 4486 | #define TYPENAME_IS_CLASS_P(NODE) \ | 
| 4487 |   (TREE_LANG_FLAG_1 (TYPENAME_TYPE_CHECK (NODE))) | 
| 4488 |  | 
| 4489 | /* True if a TYPENAME_TYPE is in the process of being resolved.  */ | 
| 4490 | #define TYPENAME_IS_RESOLVING_P(NODE) \ | 
| 4491 |   (TREE_LANG_FLAG_2 (TYPENAME_TYPE_CHECK (NODE))) | 
| 4492 |  | 
| 4493 | /* [class.virtual] | 
| 4494 |  | 
| 4495 |    A class that declares or inherits a virtual function is called a | 
| 4496 |    polymorphic class.  */ | 
| 4497 | #define TYPE_POLYMORPHIC_P(NODE) (TREE_LANG_FLAG_2 (NODE)) | 
| 4498 |  | 
| 4499 | /* Nonzero if this class has a virtual function table pointer.  */ | 
| 4500 | #define TYPE_CONTAINS_VPTR_P(NODE)                \ | 
| 4501 |   (TYPE_POLYMORPHIC_P (NODE) || CLASSTYPE_VBASECLASSES (NODE)) | 
| 4502 |  | 
| 4503 | /* Nonzero if NODE is a FUNCTION_DECL or VARIABLE_DECL (for a decl | 
| 4504 |    with namespace scope) declared in a local scope.  */ | 
| 4505 | #define DECL_LOCAL_DECL_P(NODE) \ | 
| 4506 |   DECL_LANG_FLAG_0 (VAR_OR_FUNCTION_DECL_CHECK (NODE)) | 
| 4507 |  | 
| 4508 | /* The namespace-scope decl a DECL_LOCAL_DECL_P aliases.  */ | 
| 4509 | #define DECL_LOCAL_DECL_ALIAS(NODE)                        \ | 
| 4510 |   DECL_ACCESS ((gcc_checking_assert (DECL_LOCAL_DECL_P (NODE)), NODE)) | 
| 4511 |  | 
| 4512 | /* True if NODE was declared with auto in its return type, but it has | 
| 4513 |    started compilation and so the return type might have been changed by | 
| 4514 |    return type deduction; its declared return type should be found in | 
| 4515 |    DECL_SAVED_AUTO_RETURN_TYPE (NODE).   */ | 
| 4516 | #define FNDECL_USED_AUTO(NODE) \ | 
| 4517 |   TREE_LANG_FLAG_2 (FUNCTION_DECL_CHECK (NODE)) | 
| 4518 |  | 
| 4519 | /* True if NODE is needed for a manifestly constant-evaluated expression. | 
| 4520 |    This doesn't especially need to be a flag, since currently it's only | 
| 4521 |    used for error recovery; if we run out of function flags it could move | 
| 4522 |    to an attribute.  */ | 
| 4523 | #define FNDECL_MANIFESTLY_CONST_EVALUATED(NODE) \ | 
| 4524 |   TREE_LANG_FLAG_4 (FUNCTION_DECL_CHECK (NODE)) | 
| 4525 |  | 
| 4526 | /* True for artificial decls added for OpenMP privatized non-static | 
| 4527 |    data members.  */ | 
| 4528 | #define DECL_OMP_PRIVATIZED_MEMBER(NODE) \ | 
| 4529 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.anticipated_p) | 
| 4530 |  | 
| 4531 | /* Nonzero if NODE is an artificial FUNCTION_DECL for | 
| 4532 |    #pragma omp declare reduction.  */ | 
| 4533 | #define DECL_OMP_DECLARE_REDUCTION_P(NODE) \ | 
| 4534 |   (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->omp_declare_reduction_p) | 
| 4535 |  | 
| 4536 | /* Nonzero if NODE is an artificial FUNCTION_DECL for | 
| 4537 |    #pragma omp declare mapper.  */ | 
| 4538 | #define DECL_OMP_DECLARE_MAPPER_P(NODE) \ | 
| 4539 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.omp_declare_mapper_p) | 
| 4540 |  | 
| 4541 | /* Nonzero if DECL has been declared threadprivate by | 
| 4542 |    #pragma omp threadprivate.  */ | 
| 4543 | #define CP_DECL_THREADPRIVATE_P(DECL) \ | 
| 4544 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (DECL))->u.base.threadprivate_or_deleted_p) | 
| 4545 |  | 
| 4546 | /* Nonzero if NODE is a VAR_DECL which has been declared inline.  */ | 
| 4547 | #define DECL_VAR_DECLARED_INLINE_P(NODE) \ | 
| 4548 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))                        \ | 
| 4549 |    ? DECL_LANG_SPECIFIC (NODE)->u.base.var_declared_inline_p        \ | 
| 4550 |    : false) | 
| 4551 | #define SET_DECL_VAR_DECLARED_INLINE_P(NODE) \ | 
| 4552 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.var_declared_inline_p \ | 
| 4553 |    = true) | 
| 4554 |  | 
| 4555 | /* True if NODE is a constant variable with a value-dependent initializer.  */ | 
| 4556 | #define DECL_DEPENDENT_INIT_P(NODE)                                \ | 
| 4557 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))                        \ | 
| 4558 |    && DECL_LANG_SPECIFIC (NODE)->u.base.dependent_init_p) | 
| 4559 | #define SET_DECL_DEPENDENT_INIT_P(NODE, X) \ | 
| 4560 |   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.dependent_init_p = (X)) | 
| 4561 |  | 
| 4562 | /* Nonzero if NODE is an artificial VAR_DECL for a C++17 structured binding | 
| 4563 |    declaration or one of VAR_DECLs for the user identifiers in it.  */ | 
| 4564 | #define DECL_DECOMPOSITION_P(NODE) \ | 
| 4565 |   (VAR_P (NODE) && DECL_LANG_SPECIFIC (NODE)                        \ | 
| 4566 |    ? DECL_LANG_SPECIFIC (NODE)->u.base.selector == lds_decomp                \ | 
| 4567 |    : false) | 
| 4568 |  | 
| 4569 | /* The underlying artificial VAR_DECL for structured binding.  On the | 
| 4570 |    artificial base VAR_DECL this can be NULL, or integer_{zero,one}_node | 
| 4571 |    for structured binding used in if/while/for resp. switch conditions, | 
| 4572 |    or a TARGET_EXPR with the condition value after cp_finish_decomp in | 
| 4573 |    those cases.  */ | 
| 4574 | #define DECL_DECOMP_BASE(NODE) \ | 
| 4575 |   (LANG_DECL_DECOMP_CHECK (NODE)->base) | 
| 4576 |  | 
| 4577 | /* True for the artificial VAR_DECL for structured binding.  */ | 
| 4578 | #define DECL_DECOMP_IS_BASE(NODE) \ | 
| 4579 |   (!DECL_DECOMP_BASE (NODE) || !VAR_P (DECL_DECOMP_BASE (NODE))) | 
| 4580 |  | 
| 4581 | /* Nonzero if NODE is an inline VAR_DECL.  In C++17, static data members | 
| 4582 |    declared with constexpr specifier are implicitly inline variables.  */ | 
| 4583 | #define DECL_INLINE_VAR_P(NODE) \ | 
| 4584 |   (DECL_VAR_DECLARED_INLINE_P (NODE)                                \ | 
| 4585 |    || (cxx_dialect >= cxx17                                        \ | 
| 4586 |        && DECL_DECLARED_CONSTEXPR_P (NODE)                        \ | 
| 4587 |        && DECL_CLASS_SCOPE_P (NODE))) | 
| 4588 |  | 
| 4589 | /* Nonzero if DECL was declared with '= delete'. | 
| 4590 |    = delete("reason") is represented in addition to this flag by DECL_INITIAL | 
| 4591 |    being STRING_CST with the reason and TREE_TYPE of the STRING_CST the | 
| 4592 |    RID_DELETE IDENTIFIER_NODE.  */ | 
| 4593 | #define DECL_DELETED_FN(DECL) \ | 
| 4594 |   (LANG_DECL_FN_CHECK (DECL)->min.base.threadprivate_or_deleted_p) | 
| 4595 |  | 
| 4596 | /* Nonzero if DECL was declared with '= default' (maybe implicitly).  */ | 
| 4597 | #define DECL_DEFAULTED_FN(DECL) \ | 
| 4598 |   (LANG_DECL_FN_CHECK (DECL)->defaulted_p) | 
| 4599 |  | 
| 4600 | /* Nonzero if DECL is explicitly defaulted in the class body.  */ | 
| 4601 | #define DECL_DEFAULTED_IN_CLASS_P(DECL)                                        \ | 
| 4602 |   (DECL_DEFAULTED_FN (DECL) && DECL_INITIALIZED_IN_CLASS_P (DECL)) | 
| 4603 | /* Nonzero if DECL was defaulted outside the class body.  */ | 
| 4604 | #define DECL_DEFAULTED_OUTSIDE_CLASS_P(DECL)                                \ | 
| 4605 |   (DECL_DEFAULTED_FN (DECL)                                                \ | 
| 4606 |    && !(DECL_ARTIFICIAL (DECL) || DECL_INITIALIZED_IN_CLASS_P (DECL))) | 
| 4607 |  | 
| 4608 | /* Record whether a typedef for type `int' was actually `signed int'.  */ | 
| 4609 | #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP) | 
| 4610 |  | 
| 4611 | /* Returns nonzero if DECL has external linkage, as specified by the | 
| 4612 |    language standard.  (This predicate may hold even when the | 
| 4613 |    corresponding entity is not actually given external linkage in the | 
| 4614 |    object file; see decl_linkage for details.)  */ | 
| 4615 | #define DECL_EXTERNAL_LINKAGE_P(DECL) \ | 
| 4616 |   (decl_linkage (DECL) == lk_external) | 
| 4617 |  | 
| 4618 | /* Keep these codes in ascending code order.  */ | 
| 4619 |  | 
| 4620 | #define INTEGRAL_CODE_P(CODE)        \ | 
| 4621 |   ((CODE) == ENUMERAL_TYPE        \ | 
| 4622 |    || (CODE) == BOOLEAN_TYPE        \ | 
| 4623 |    || (CODE) == INTEGER_TYPE) | 
| 4624 |  | 
| 4625 | /* [basic.fundamental] | 
| 4626 |  | 
| 4627 |    Types  bool, char, wchar_t, and the signed and unsigned integer types | 
| 4628 |    are collectively called integral types. | 
| 4629 |  | 
| 4630 |    Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration | 
| 4631 |    types as well, which is incorrect in C++.  Keep these checks in | 
| 4632 |    ascending code order.  */ | 
| 4633 | #define CP_INTEGRAL_TYPE_P(TYPE)                \ | 
| 4634 |   (TREE_CODE (TYPE) == BOOLEAN_TYPE                \ | 
| 4635 |    || TREE_CODE (TYPE) == INTEGER_TYPE) | 
| 4636 |  | 
| 4637 | /* Returns true if TYPE is an integral or enumeration name.  Keep | 
| 4638 |    these checks in ascending code order.  */ | 
| 4639 | #define INTEGRAL_OR_ENUMERATION_TYPE_P(TYPE) \ | 
| 4640 |    (TREE_CODE (TYPE) == ENUMERAL_TYPE || CP_INTEGRAL_TYPE_P (TYPE)) | 
| 4641 |  | 
| 4642 | /* Returns true if TYPE is an integral or unscoped enumeration type.  */ | 
| 4643 | #define INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P(TYPE) \ | 
| 4644 |    (UNSCOPED_ENUM_P (TYPE) || CP_INTEGRAL_TYPE_P (TYPE)) | 
| 4645 |  | 
| 4646 | /* True if the class type TYPE is a literal type.  */ | 
| 4647 | #define CLASSTYPE_LITERAL_P(TYPE)              \ | 
| 4648 |    (LANG_TYPE_CLASS_CHECK (TYPE)->is_literal) | 
| 4649 |  | 
| 4650 | /* [basic.fundamental] | 
| 4651 |  | 
| 4652 |    Integral and floating types are collectively called arithmetic | 
| 4653 |    types. | 
| 4654 |  | 
| 4655 |    As a GNU extension, we also accept complex types. | 
| 4656 |  | 
| 4657 |    Keep these checks in ascending code order.  */ | 
| 4658 | #define ARITHMETIC_TYPE_P(TYPE) \ | 
| 4659 |   (CP_INTEGRAL_TYPE_P (TYPE) \ | 
| 4660 |    || SCALAR_FLOAT_TYPE_P (TYPE) \ | 
| 4661 |    || TREE_CODE (TYPE) == COMPLEX_TYPE) | 
| 4662 |  | 
| 4663 | /* [basic.types] | 
| 4664 |  | 
| 4665 |    Arithmetic types, enumeration types, pointer types, | 
| 4666 |    pointer-to-member types, and std::nullptr_t are collectively called | 
| 4667 |    scalar types. | 
| 4668 |  | 
| 4669 |    Keep these checks in ascending code order.  */ | 
| 4670 | #define SCALAR_TYPE_P(TYPE)                        \ | 
| 4671 |   (TYPE_PTRDATAMEM_P (TYPE)                        \ | 
| 4672 |    || TREE_CODE (TYPE) == ENUMERAL_TYPE                \ | 
| 4673 |    || ARITHMETIC_TYPE_P (TYPE)                        \ | 
| 4674 |    || TYPE_PTR_P (TYPE)                                \ | 
| 4675 |    || TYPE_PTRMEMFUNC_P (TYPE)                  \ | 
| 4676 |    || NULLPTR_TYPE_P (TYPE)) | 
| 4677 |  | 
| 4678 | /* Determines whether this type is a C++0x scoped enumeration | 
| 4679 |    type. Scoped enumerations types are introduced via "enum class" or | 
| 4680 |    "enum struct", e.g., | 
| 4681 |  | 
| 4682 |      enum class Color { | 
| 4683 |        Red, Green, Blue | 
| 4684 |      }; | 
| 4685 |  | 
| 4686 |    Scoped enumeration types are different from normal (unscoped) | 
| 4687 |    enumeration types in several ways: | 
| 4688 |  | 
| 4689 |      - The enumerators of a scoped enumeration type are only available | 
| 4690 |        within the scope of the enumeration type and not in the | 
| 4691 |        enclosing scope. For example, the Red color can be referred to | 
| 4692 |        with "Color::Red" but not "Red". | 
| 4693 |  | 
| 4694 |      - Scoped enumerators and enumerations do not implicitly convert | 
| 4695 |        to integers or 'bool'. | 
| 4696 |  | 
| 4697 |      - The underlying type of the enum is well-defined.  */ | 
| 4698 | #define SCOPED_ENUM_P(TYPE)                                             \ | 
| 4699 |   (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_SCOPED (TYPE)) | 
| 4700 |  | 
| 4701 | /* Determine whether this is an unscoped enumeration type.  */ | 
| 4702 | #define UNSCOPED_ENUM_P(TYPE)                                           \ | 
| 4703 |   (TREE_CODE (TYPE) == ENUMERAL_TYPE && !ENUM_IS_SCOPED (TYPE)) | 
| 4704 |  | 
| 4705 | /* Set the flag indicating whether an ENUMERAL_TYPE is a C++0x scoped | 
| 4706 |    enumeration type (1) or a normal (unscoped) enumeration type | 
| 4707 |    (0).  */ | 
| 4708 | #define SET_SCOPED_ENUM_P(TYPE, VAL)                    \ | 
| 4709 |   (ENUM_IS_SCOPED (TYPE) = (VAL)) | 
| 4710 |  | 
| 4711 | #define SET_OPAQUE_ENUM_P(TYPE, VAL)                    \ | 
| 4712 |   (ENUM_IS_OPAQUE (TYPE) = (VAL)) | 
| 4713 |  | 
| 4714 | #define OPAQUE_ENUM_P(TYPE)                                \ | 
| 4715 |   (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_OPAQUE (TYPE)) | 
| 4716 |  | 
| 4717 | /* [dcl.init.aggr] | 
| 4718 |  | 
| 4719 |    An aggregate is an array or a class with no user-provided | 
| 4720 |    constructors, no brace-or-equal-initializers for non-static data | 
| 4721 |    members, no private or protected non-static data members, no | 
| 4722 |    base classes, and no virtual functions. | 
| 4723 |  | 
| 4724 |    As an extension, we also treat vectors as aggregates.  Keep these | 
| 4725 |    checks in ascending code order.  */ | 
| 4726 | #define CP_AGGREGATE_TYPE_P(TYPE)                                \ | 
| 4727 |   (gnu_vector_type_p (TYPE)                                        \ | 
| 4728 |    || TREE_CODE (TYPE) == ARRAY_TYPE                                \ | 
| 4729 |    || (CLASS_TYPE_P (TYPE) && COMPLETE_TYPE_P (TYPE) && !CLASSTYPE_NON_AGGREGATE (TYPE))) | 
| 4730 |  | 
| 4731 | /* Nonzero for a class type means that the class type has a | 
| 4732 |    user-declared constructor.  */ | 
| 4733 | #define TYPE_HAS_USER_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1 (NODE)) | 
| 4734 |  | 
| 4735 | /* Nonzero means that the FUNCTION_TYPE or METHOD_TYPE has a | 
| 4736 |    late-specified return type.  */ | 
| 4737 | #define TYPE_HAS_LATE_RETURN_TYPE(NODE) \ | 
| 4738 |   (TYPE_LANG_FLAG_2 (FUNC_OR_METHOD_CHECK (NODE))) | 
| 4739 |  | 
| 4740 | /* When appearing in an INDIRECT_REF, it means that the tree structure | 
| 4741 |    underneath is actually a call to a constructor.  This is needed | 
| 4742 |    when the constructor must initialize local storage (which can | 
| 4743 |    be automatically destroyed), rather than allowing it to allocate | 
| 4744 |    space from the heap. | 
| 4745 |  | 
| 4746 |    When appearing in a SAVE_EXPR, it means that underneath | 
| 4747 |    is a call to a constructor. | 
| 4748 |  | 
| 4749 |    When appearing in a CONSTRUCTOR, the expression is an unconverted | 
| 4750 |    compound literal. | 
| 4751 |  | 
| 4752 |    When appearing in a CALL_EXPR, it means that it is a call to | 
| 4753 |    a constructor. | 
| 4754 |  | 
| 4755 |    When appearing in a FIELD_DECL, it means that this field | 
| 4756 |    has been duly initialized in its constructor.  */ | 
| 4757 | #define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4 (NODE)) | 
| 4758 |  | 
| 4759 | /* True if NODE is a brace-enclosed initializer.  */ | 
| 4760 | #define BRACE_ENCLOSED_INITIALIZER_P(NODE) \ | 
| 4761 |   (TREE_CODE (NODE) == CONSTRUCTOR && TREE_TYPE (NODE) == init_list_type_node) | 
| 4762 |  | 
| 4763 | /* True if NODE is a compound-literal, i.e., a brace-enclosed | 
| 4764 |    initializer cast to a particular type.  This is mostly only set during | 
| 4765 |    template parsing; once the initializer has been digested into an actual | 
| 4766 |    value of the type, the expression is represented by a TARGET_EXPR.  */ | 
| 4767 | #define COMPOUND_LITERAL_P(NODE) \ | 
| 4768 |   (TREE_CODE (NODE) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (NODE)) | 
| 4769 |  | 
| 4770 | #define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \ | 
| 4771 |                                    && vec_safe_is_empty(CONSTRUCTOR_ELTS(NODE))\ | 
| 4772 |                                    && !TREE_HAS_CONSTRUCTOR (NODE)) | 
| 4773 |  | 
| 4774 | /* True if NODE is a init-list used as a direct-initializer, i.e. | 
| 4775 |    B b{1,2}, not B b({1,2}) or B b = {1,2}.  */ | 
| 4776 | #define CONSTRUCTOR_IS_DIRECT_INIT(NODE) (TREE_LANG_FLAG_0 (CONSTRUCTOR_CHECK (NODE))) | 
| 4777 |  | 
| 4778 | /* True if this CONSTRUCTOR is instantiation-dependent and needs to be | 
| 4779 |    substituted.  */ | 
| 4780 | #define CONSTRUCTOR_IS_DEPENDENT(NODE) \ | 
| 4781 |   (TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK (NODE))) | 
| 4782 |  | 
| 4783 | /* True if this CONSTRUCTOR should not be used as a variable initializer | 
| 4784 |    because it was loaded from a constexpr variable with mutable fields.  */ | 
| 4785 | #define CONSTRUCTOR_MUTABLE_POISON(NODE) \ | 
| 4786 |   (TREE_LANG_FLAG_2 (CONSTRUCTOR_CHECK (NODE))) | 
| 4787 |  | 
| 4788 | /* True if this typed CONSTRUCTOR represents C99 compound-literal syntax rather | 
| 4789 |    than C++11 functional cast syntax.  */ | 
| 4790 | #define CONSTRUCTOR_C99_COMPOUND_LITERAL(NODE) \ | 
| 4791 |   (TREE_LANG_FLAG_3 (CONSTRUCTOR_CHECK (NODE))) | 
| 4792 |  | 
| 4793 | /* True if this CONSTRUCTOR contains PLACEHOLDER_EXPRs referencing the | 
| 4794 |    CONSTRUCTOR's type not nested inside another CONSTRUCTOR marked with | 
| 4795 |    CONSTRUCTOR_PLACEHOLDER_BOUNDARY.  */ | 
| 4796 | #define CONSTRUCTOR_PLACEHOLDER_BOUNDARY(NODE) \ | 
| 4797 |   (TREE_LANG_FLAG_5 (CONSTRUCTOR_CHECK (NODE))) | 
| 4798 |  | 
| 4799 | #define DIRECT_LIST_INIT_P(NODE) \ | 
| 4800 |    (BRACE_ENCLOSED_INITIALIZER_P (NODE) && CONSTRUCTOR_IS_DIRECT_INIT (NODE)) | 
| 4801 |  | 
| 4802 | /* True if this is a designated initializer (when we allow initializer-clauses | 
| 4803 |    mixed with designated-initializer-clauses set whenever there is at least | 
| 4804 |    one designated-initializer-clause), or a C99 designator.  */ | 
| 4805 | #define CONSTRUCTOR_IS_DESIGNATED_INIT(NODE) \ | 
| 4806 |   (TREE_LANG_FLAG_6 (CONSTRUCTOR_CHECK (NODE))) | 
| 4807 |  | 
| 4808 | /* True if this CONSTRUCTOR comes from a parenthesized list of values, e.g. | 
| 4809 |    A(1, 2, 3).  */ | 
| 4810 | #define CONSTRUCTOR_IS_PAREN_INIT(NODE) \ | 
| 4811 |   (CONSTRUCTOR_CHECK(NODE)->base.private_flag) | 
| 4812 |  | 
| 4813 | /* True if reshape_init built this sub-CONSTRUCTOR to undo the brace elision | 
| 4814 |    of the original CONSTRUCTOR.  This flag is used during C++20 aggregate | 
| 4815 |    CTAD.  */ | 
| 4816 | #define CONSTRUCTOR_BRACES_ELIDED_P(NODE) \ | 
| 4817 |   (CONSTRUCTOR_CHECK (NODE)->base.protected_flag) | 
| 4818 |  | 
| 4819 | /* True if NODE represents a conversion for direct-initialization in a | 
| 4820 |    template.  Set by perform_implicit_conversion_flags.  */ | 
| 4821 | #define IMPLICIT_CONV_EXPR_DIRECT_INIT(NODE) \ | 
| 4822 |   (TREE_LANG_FLAG_0 (IMPLICIT_CONV_EXPR_CHECK (NODE))) | 
| 4823 |  | 
| 4824 | /* True if NODE represents a dependent conversion of a non-type template | 
| 4825 |    argument.  Set by maybe_convert_nontype_argument.  */ | 
| 4826 | #define IMPLICIT_CONV_EXPR_NONTYPE_ARG(NODE) \ | 
| 4827 |   (TREE_LANG_FLAG_1 (IMPLICIT_CONV_EXPR_CHECK (NODE))) | 
| 4828 |  | 
| 4829 | /* True if NODE represents a conversion for braced-init-list in a | 
| 4830 |    template.  Set by perform_implicit_conversion_flags.  */ | 
| 4831 | #define IMPLICIT_CONV_EXPR_BRACED_INIT(NODE) \ | 
| 4832 |   (TREE_LANG_FLAG_2 (IMPLICIT_CONV_EXPR_CHECK (NODE))) | 
| 4833 |  | 
| 4834 | /* True if NODE represents a conversion forced to be represented in | 
| 4835 |    maybe_convert_nontype_argument, i.e. for an alias template.  */ | 
| 4836 | #define IMPLICIT_CONV_EXPR_FORCED(NODE) \ | 
| 4837 |   (TREE_LANG_FLAG_3 (IMPLICIT_CONV_EXPR_CHECK (NODE))) | 
| 4838 |  | 
| 4839 | /* Nonzero means that an object of this type cannot be initialized using | 
| 4840 |    an initializer list.  */ | 
| 4841 | #define CLASSTYPE_NON_AGGREGATE(NODE) \ | 
| 4842 |   (LANG_TYPE_CLASS_CHECK (NODE)->non_aggregate) | 
| 4843 | #define TYPE_NON_AGGREGATE_CLASS(NODE) \ | 
| 4844 |   (CLASS_TYPE_P (NODE) && CLASSTYPE_NON_AGGREGATE (NODE)) | 
| 4845 |  | 
| 4846 | /* Nonzero if there is a non-trivial X::op=(cv X&) for this class.  */ | 
| 4847 | #define TYPE_HAS_COMPLEX_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_assign) | 
| 4848 |  | 
| 4849 | /* Nonzero if there is a non-trivial X::X(cv X&) for this class.  */ | 
| 4850 | #define TYPE_HAS_COMPLEX_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_ctor) | 
| 4851 |  | 
| 4852 | /* Nonzero if there is a non-trivial X::op=(X&&) for this class.  */ | 
| 4853 | #define TYPE_HAS_COMPLEX_MOVE_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_assign) | 
| 4854 |  | 
| 4855 | /* Nonzero if there is a non-trivial X::X(X&&) for this class.  */ | 
| 4856 | #define TYPE_HAS_COMPLEX_MOVE_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_ctor) | 
| 4857 |  | 
| 4858 | /* Nonzero if there is no trivial default constructor for this class.  */ | 
| 4859 | #define TYPE_HAS_COMPLEX_DFLT(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_dflt) | 
| 4860 |  | 
| 4861 | /* Nonzero if TYPE has a trivial destructor.  From [class.dtor]: | 
| 4862 |  | 
| 4863 |      A destructor is trivial if it is an implicitly declared | 
| 4864 |      destructor and if: | 
| 4865 |  | 
| 4866 |        - all of the direct base classes of its class have trivial | 
| 4867 |          destructors, | 
| 4868 |  | 
| 4869 |        - for all of the non-static data members of its class that are | 
| 4870 |          of class type (or array thereof), each such class has a | 
| 4871 |          trivial destructor.  */ | 
| 4872 | #define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \ | 
| 4873 |   (!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE)) | 
| 4874 |  | 
| 4875 | /* Nonzero for _TYPE node means that this type does not have a trivial | 
| 4876 |    destructor.  Therefore, destroying an object of this type will | 
| 4877 |    involve a call to a destructor.  This can apply to objects of | 
| 4878 |    ARRAY_TYPE if the type of the elements needs a destructor.  */ | 
| 4879 | #define TYPE_HAS_NONTRIVIAL_DESTRUCTOR(NODE) \ | 
| 4880 |   (TYPE_LANG_FLAG_4 (NODE)) | 
| 4881 |  | 
| 4882 | /* Nonzero for class type means that the default constructor is trivial.  */ | 
| 4883 | #define TYPE_HAS_TRIVIAL_DFLT(NODE) \ | 
| 4884 |   (TYPE_HAS_DEFAULT_CONSTRUCTOR (NODE) && ! TYPE_HAS_COMPLEX_DFLT (NODE)) | 
| 4885 |  | 
| 4886 | /* Nonzero for class type means that copy initialization of this type can use | 
| 4887 |    a bitwise copy.  */ | 
| 4888 | #define TYPE_HAS_TRIVIAL_COPY_CTOR(NODE) \ | 
| 4889 |   (TYPE_HAS_COPY_CTOR (NODE) && ! TYPE_HAS_COMPLEX_COPY_CTOR (NODE)) | 
| 4890 |  | 
| 4891 | /* Nonzero for class type means that assignment of this type can use | 
| 4892 |    a bitwise copy.  */ | 
| 4893 | #define TYPE_HAS_TRIVIAL_COPY_ASSIGN(NODE) \ | 
| 4894 |   (TYPE_HAS_COPY_ASSIGN (NODE) && ! TYPE_HAS_COMPLEX_COPY_ASSIGN (NODE)) | 
| 4895 |  | 
| 4896 | /* Returns true if NODE is a pointer-to-data-member.  */ | 
| 4897 | #define TYPE_PTRDATAMEM_P(NODE)                        \ | 
| 4898 |   (TREE_CODE (NODE) == OFFSET_TYPE) | 
| 4899 |  | 
| 4900 | /* Returns true if NODE is a pointer.  */ | 
| 4901 | #define TYPE_PTR_P(NODE)                        \ | 
| 4902 |   (TREE_CODE (NODE) == POINTER_TYPE) | 
| 4903 |  | 
| 4904 | /* Returns true if NODE is a reference.  */ | 
| 4905 | #define TYPE_REF_P(NODE)                        \ | 
| 4906 |   (TREE_CODE (NODE) == REFERENCE_TYPE) | 
| 4907 |  | 
| 4908 | /* Returns true if NODE is a pointer or a reference.  */ | 
| 4909 | #define INDIRECT_TYPE_P(NODE)                        \ | 
| 4910 |   (TYPE_PTR_P (NODE) || TYPE_REF_P (NODE)) | 
| 4911 |  | 
| 4912 | /* Returns true if NODE is an object type: | 
| 4913 |  | 
| 4914 |      [basic.types] | 
| 4915 |  | 
| 4916 |      An object type is a (possibly cv-qualified) type that is not a | 
| 4917 |      function type, not a reference type, and not a void type. | 
| 4918 |  | 
| 4919 |    Keep these checks in ascending order, for speed.  */ | 
| 4920 | #define TYPE_OBJ_P(NODE)                        \ | 
| 4921 |   (!TYPE_REF_P (NODE)                                \ | 
| 4922 |    && !VOID_TYPE_P (NODE)                          \ | 
| 4923 |    && !FUNC_OR_METHOD_TYPE_P (NODE)) | 
| 4924 |  | 
| 4925 | /* Returns true if NODE is a pointer to an object.  Keep these checks | 
| 4926 |    in ascending tree code order.  */ | 
| 4927 | #define TYPE_PTROB_P(NODE)                                        \ | 
| 4928 |   (TYPE_PTR_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE))) | 
| 4929 |  | 
| 4930 | /* Returns true if NODE is a reference to an object.  Keep these checks | 
| 4931 |    in ascending tree code order.  */ | 
| 4932 | #define TYPE_REF_OBJ_P(NODE)                                        \ | 
| 4933 |   (TYPE_REF_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE))) | 
| 4934 |  | 
| 4935 | /* Returns true if NODE is a pointer to an object, or a pointer to | 
| 4936 |    void.  Keep these checks in ascending tree code order.  */ | 
| 4937 | #define TYPE_PTROBV_P(NODE)                                        \ | 
| 4938 |   (TYPE_PTR_P (NODE)                                                \ | 
| 4939 |    && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (NODE))) | 
| 4940 |  | 
| 4941 | /* Returns true if NODE is a pointer to function type.  */ | 
| 4942 | #define TYPE_PTRFN_P(NODE)                                \ | 
| 4943 |   (TYPE_PTR_P (NODE)                                        \ | 
| 4944 |    && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE) | 
| 4945 |  | 
| 4946 | /* Returns true if NODE is a reference to function type.  */ | 
| 4947 | #define TYPE_REFFN_P(NODE)                                \ | 
| 4948 |   (TYPE_REF_P (NODE)                                        \ | 
| 4949 |    && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE) | 
| 4950 |  | 
| 4951 | /* Returns true if NODE is a pointer to member function type.  */ | 
| 4952 | #define TYPE_PTRMEMFUNC_P(NODE)                \ | 
| 4953 |   (TREE_CODE (NODE) == RECORD_TYPE        \ | 
| 4954 |    && TYPE_PTRMEMFUNC_FLAG (NODE)) | 
| 4955 |  | 
| 4956 | #define TYPE_PTRMEMFUNC_FLAG(NODE) \ | 
| 4957 |   (TYPE_LANG_FLAG_2 (RECORD_TYPE_CHECK (NODE))) | 
| 4958 |  | 
| 4959 | /* Returns true if NODE is a pointer-to-member.  */ | 
| 4960 | #define TYPE_PTRMEM_P(NODE) \ | 
| 4961 |   (TYPE_PTRDATAMEM_P (NODE) || TYPE_PTRMEMFUNC_P (NODE)) | 
| 4962 |  | 
| 4963 | /* Returns true if NODE is a pointer or a pointer-to-member.  */ | 
| 4964 | #define TYPE_PTR_OR_PTRMEM_P(NODE) \ | 
| 4965 |   (TYPE_PTR_P (NODE) || TYPE_PTRMEM_P (NODE)) | 
| 4966 |  | 
| 4967 | /* Indicates when overload resolution may resolve to a pointer to | 
| 4968 |    member function. [expr.unary.op]/3 */ | 
| 4969 | #define PTRMEM_OK_P(NODE) \ | 
| 4970 |   TREE_LANG_FLAG_0 (TREE_CHECK3 ((NODE), ADDR_EXPR, OFFSET_REF, SCOPE_REF)) | 
| 4971 |  | 
| 4972 | /* True if this ADDR_EXPR denotes a function call; that is, it's | 
| 4973 |    fn() rather than &fn.  */ | 
| 4974 | #define ADDR_EXPR_DENOTES_CALL_P(NODE) \ | 
| 4975 |   (ADDR_EXPR_CHECK(NODE)->base.protected_flag) | 
| 4976 |  | 
| 4977 | /* Get the POINTER_TYPE to the METHOD_TYPE associated with this | 
| 4978 |    pointer to member function.  TYPE_PTRMEMFUNC_P _must_ be true, | 
| 4979 |    before using this macro.  */ | 
| 4980 | #define TYPE_PTRMEMFUNC_FN_TYPE(NODE) \ | 
| 4981 |   (cp_build_qualified_type (TREE_TYPE (TYPE_FIELDS (NODE)),\ | 
| 4982 |                             cp_type_quals (NODE))) | 
| 4983 |  | 
| 4984 | /* As above, but can be used in places that want an lvalue at the expense | 
| 4985 |    of not necessarily having the correct cv-qualifiers.  */ | 
| 4986 | #define TYPE_PTRMEMFUNC_FN_TYPE_RAW(NODE) \ | 
| 4987 |   (TREE_TYPE (TYPE_FIELDS (NODE))) | 
| 4988 |  | 
| 4989 | /* Returns `A' for a type like `int (A::*)(double)' */ | 
| 4990 | #define TYPE_PTRMEMFUNC_OBJECT_TYPE(NODE) \ | 
| 4991 |   TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE))) | 
| 4992 |  | 
| 4993 | /* The canonical internal RECORD_TYPE from the POINTER_TYPE to | 
| 4994 |    METHOD_TYPE.  */ | 
| 4995 | #define TYPE_PTRMEMFUNC_TYPE(NODE) \ | 
| 4996 |   TYPE_LANG_SLOT_1 (NODE) | 
| 4997 |  | 
| 4998 | /* For a pointer-to-member type of the form `T X::*', this is `X'. | 
| 4999 |    For a type like `void (X::*)() const', this type is `X', not `const | 
| 5000 |    X'.  To get at the `const X' you have to look at the | 
| 5001 |    TYPE_PTRMEM_POINTED_TO_TYPE; there, the first parameter will have | 
| 5002 |    type `const X*'.  */ | 
| 5003 | #define TYPE_PTRMEM_CLASS_TYPE(NODE)                        \ | 
| 5004 |   (TYPE_PTRDATAMEM_P (NODE)                                        \ | 
| 5005 |    ? TYPE_OFFSET_BASETYPE (NODE)                \ | 
| 5006 |    : TYPE_PTRMEMFUNC_OBJECT_TYPE (NODE)) | 
| 5007 |  | 
| 5008 | /* For a pointer-to-member type of the form `T X::*', this is `T'.  */ | 
| 5009 | #define TYPE_PTRMEM_POINTED_TO_TYPE(NODE)                \ | 
| 5010 |    (TYPE_PTRDATAMEM_P (NODE)                                \ | 
| 5011 |     ? TREE_TYPE (NODE)                                        \ | 
| 5012 |     : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE))) | 
| 5013 |  | 
| 5014 | /* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for | 
| 5015 |    `X'.  */ | 
| 5016 | #define PTRMEM_CST_CLASS(NODE) \ | 
| 5017 |   TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (PTRMEM_CST_CHECK (NODE))) | 
| 5018 |  | 
| 5019 | /* For a pointer-to-member constant `X::Y' this is the _DECL for | 
| 5020 |    `Y'.  */ | 
| 5021 | #define PTRMEM_CST_MEMBER(NODE) \ | 
| 5022 |   (((ptrmem_cst_t)PTRMEM_CST_CHECK (NODE))->member) | 
| 5023 |  | 
| 5024 | /* For a pointer-to-member constant `X::Y' this is a location where | 
| 5025 |    the address of the member has been taken.  */ | 
| 5026 | #define PTRMEM_CST_LOCATION(NODE) \ | 
| 5027 |   (((ptrmem_cst_t)PTRMEM_CST_CHECK (NODE))->locus) | 
| 5028 |  | 
| 5029 | /* The expression in question for a TYPEOF_TYPE.  */ | 
| 5030 | #define TYPEOF_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (TYPEOF_TYPE_CHECK (NODE))) | 
| 5031 |  | 
| 5032 | /* The type in question for an UNDERLYING_TYPE.  */ | 
| 5033 | #define UNDERLYING_TYPE_TYPE(NODE) \ | 
| 5034 |   (TYPE_VALUES_RAW (UNDERLYING_TYPE_CHECK (NODE))) | 
| 5035 |  | 
| 5036 | /* The type in question for BASES.  */ | 
| 5037 | #define BASES_TYPE(NODE) \ | 
| 5038 |   (TYPE_VALUES_RAW (BASES_CHECK (NODE))) | 
| 5039 |  | 
| 5040 | #define BASES_DIRECT(NODE) \ | 
| 5041 |   TREE_LANG_FLAG_0 (BASES_CHECK (NODE)) | 
| 5042 |  | 
| 5043 | /* The expression in question for a DECLTYPE_TYPE.  */ | 
| 5044 | #define DECLTYPE_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (DECLTYPE_TYPE_CHECK (NODE))) | 
| 5045 |  | 
| 5046 | /* Whether the DECLTYPE_TYPE_EXPR of NODE was originally parsed as an | 
| 5047 |    id-expression or a member-access expression. When false, it was | 
| 5048 |    parsed as a full expression.  */ | 
| 5049 | #define DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P(NODE) \ | 
| 5050 |   (DECLTYPE_TYPE_CHECK (NODE))->type_common.string_flag | 
| 5051 |  | 
| 5052 | /* These flags indicate that we want different semantics from normal | 
| 5053 |    decltype: lambda capture just drops references, | 
| 5054 |    lambda proxies look through implicit dereference.  */ | 
| 5055 | #define DECLTYPE_FOR_LAMBDA_CAPTURE(NODE) \ | 
| 5056 |   TREE_LANG_FLAG_0 (DECLTYPE_TYPE_CHECK (NODE)) | 
| 5057 | #define DECLTYPE_FOR_LAMBDA_PROXY(NODE) \ | 
| 5058 |   TREE_LANG_FLAG_2 (DECLTYPE_TYPE_CHECK (NODE)) | 
| 5059 | #define DECLTYPE_FOR_REF_CAPTURE(NODE) \ | 
| 5060 |   TREE_LANG_FLAG_3 (DECLTYPE_TYPE_CHECK (NODE)) | 
| 5061 |  | 
| 5062 | /* Nonzero for VAR_DECL and FUNCTION_DECL node means that `extern' was | 
| 5063 |    specified in its declaration.  This can also be set for an | 
| 5064 |    erroneously declared PARM_DECL.  */ | 
| 5065 | #define DECL_THIS_EXTERN(NODE) \ | 
| 5066 |   DECL_LANG_FLAG_2 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE)) | 
| 5067 |  | 
| 5068 | /* Nonzero for VAR_DECL and FUNCTION_DECL node means that `static' was | 
| 5069 |    specified in its declaration.  This can also be set for an | 
| 5070 |    erroneously declared PARM_DECL.  */ | 
| 5071 | #define DECL_THIS_STATIC(NODE) \ | 
| 5072 |   DECL_LANG_FLAG_6 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE)) | 
| 5073 |  | 
| 5074 | /* Nonzero for FIELD_DECL node means that this field is a lambda capture | 
| 5075 |    field for an array of runtime bound.  */ | 
| 5076 | #define DECL_VLA_CAPTURE_P(NODE) \ | 
| 5077 |   DECL_LANG_FLAG_1 (FIELD_DECL_CHECK (NODE)) | 
| 5078 |  | 
| 5079 | /* Nonzero for PARM_DECL node means that this is an array function | 
| 5080 |    parameter, i.e, a[] rather than *a.  */ | 
| 5081 | #define DECL_ARRAY_PARAMETER_P(NODE) \ | 
| 5082 |   DECL_LANG_FLAG_1 (PARM_DECL_CHECK (NODE)) | 
| 5083 |  | 
| 5084 | /* Nonzero for a FIELD_DECL who's NSMDI is currently being | 
| 5085 |    instantiated.  */ | 
| 5086 | #define DECL_INSTANTIATING_NSDMI_P(NODE) \ | 
| 5087 |   DECL_LANG_FLAG_2 (FIELD_DECL_CHECK (NODE)) | 
| 5088 |  | 
| 5089 | /* Nonzero for FIELD_DECL node means that this field is a base class | 
| 5090 |    of the parent object, as opposed to a member field.  */ | 
| 5091 | #define DECL_FIELD_IS_BASE(NODE) \ | 
| 5092 |   DECL_LANG_FLAG_6 (FIELD_DECL_CHECK (NODE)) | 
| 5093 |  | 
| 5094 | /* Nonzero for FIELD_DECL node means that this field is a simple (no | 
| 5095 |    explicit initializer) lambda capture field, making it invisible to | 
| 5096 |    name lookup in unevaluated contexts.  */ | 
| 5097 | #define DECL_NORMAL_CAPTURE_P(NODE) \ | 
| 5098 |   DECL_LANG_FLAG_7 (FIELD_DECL_CHECK (NODE)) | 
| 5099 |  | 
| 5100 | /* Nonzero if TYPE is an anonymous union or struct type.  We have to use a | 
| 5101 |    flag for this because "A union for which objects or pointers are | 
| 5102 |    declared is not an anonymous union" [class.union].  */ | 
| 5103 | #define ANON_AGGR_TYPE_P(NODE)                                \ | 
| 5104 |   (CLASS_TYPE_P (NODE) && LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr) | 
| 5105 | #define SET_ANON_AGGR_TYPE_P(NODE)                        \ | 
| 5106 |   (LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr = 1) | 
| 5107 |  | 
| 5108 | /* Nonzero if TYPE is an anonymous union type.  */ | 
| 5109 | #define ANON_UNION_TYPE_P(NODE) \ | 
| 5110 |   (TREE_CODE (NODE) == UNION_TYPE && ANON_AGGR_TYPE_P (NODE)) | 
| 5111 |  | 
| 5112 | /* For an ANON_AGGR_TYPE_P the single FIELD_DECL it is used with.  */ | 
| 5113 | #define ANON_AGGR_TYPE_FIELD(NODE) \ | 
| 5114 |   (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var) | 
| 5115 |  | 
| 5116 | /* Define fields and accessors for nodes representing declared names.  */ | 
| 5117 |  | 
| 5118 | /* True if TYPE is an unnamed structured type with a typedef for | 
| 5119 |    linkage purposes.  In that case TYPE_NAME and TYPE_STUB_DECL of the | 
| 5120 |    MAIN-VARIANT are different.  */ | 
| 5121 | #define TYPE_WAS_UNNAMED(NODE)                                \ | 
| 5122 |   (TYPE_NAME (TYPE_MAIN_VARIANT (NODE))                        \ | 
| 5123 |    != TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE))) | 
| 5124 |  | 
| 5125 | /* C++: all of these are overloaded!  These apply only to TYPE_DECLs.  */ | 
| 5126 |  | 
| 5127 | /* The format of each node in the DECL_FRIENDLIST is as follows: | 
| 5128 |  | 
| 5129 |    The TREE_PURPOSE will be the name of a function, i.e., an | 
| 5130 |    IDENTIFIER_NODE.  The TREE_VALUE will be itself a TREE_LIST, whose | 
| 5131 |    TREE_VALUEs are friends with the given name.  */ | 
| 5132 | #define DECL_FRIENDLIST(NODE)                (DECL_INITIAL (NODE)) | 
| 5133 | #define FRIEND_NAME(LIST) (TREE_PURPOSE (LIST)) | 
| 5134 | #define FRIEND_DECLS(LIST) (TREE_VALUE (LIST)) | 
| 5135 |  | 
| 5136 | /* The DECL_ACCESS, if non-NULL, is a TREE_LIST.  The TREE_PURPOSE of | 
| 5137 |    each node is a type; the TREE_VALUE is the access granted for this | 
| 5138 |    DECL in that type.  The DECL_ACCESS is set by access declarations. | 
| 5139 |    For example, if a member that would normally be public in a | 
| 5140 |    derived class is made protected, then the derived class and the | 
| 5141 |    protected_access_node will appear in the DECL_ACCESS for the node.  */ | 
| 5142 | #define DECL_ACCESS(NODE) (LANG_DECL_MIN_CHECK (NODE)->access) | 
| 5143 |  | 
| 5144 | /* Nonzero if the FUNCTION_DECL is a global constructor.  */ | 
| 5145 | #define DECL_GLOBAL_CTOR_P(NODE) \ | 
| 5146 |   (LANG_DECL_FN_CHECK (NODE)->global_ctor_p) | 
| 5147 |  | 
| 5148 | /* Nonzero if the FUNCTION_DECL is a global destructor.  */ | 
| 5149 | #define DECL_GLOBAL_DTOR_P(NODE) \ | 
| 5150 |   (LANG_DECL_FN_CHECK (NODE)->global_dtor_p) | 
| 5151 |  | 
| 5152 | /* Accessor macros for C++ template decl nodes.  */ | 
| 5153 |  | 
| 5154 | /* The DECL_TEMPLATE_PARMS are a list.  The TREE_PURPOSE of each node | 
| 5155 |    is a INT_CST whose TREE_INT_CST_LOW indicates the level of the | 
| 5156 |    template parameters, with 1 being the outermost set of template | 
| 5157 |    parameters.  The TREE_TYPE is TEMPLATE_PARMS_CONSTRAINTS. | 
| 5158 |    The TREE_VALUE is a vector, whose elements are the | 
| 5159 |    template parameters at each level.  Each element in the vector is a | 
| 5160 |    TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a | 
| 5161 |    non-type parameter), or a TYPE_DECL (if the parameter is a type | 
| 5162 |    parameter) or a TEMPLATE_DECL (if the parameter is a template | 
| 5163 |    parameter).  The TREE_PURPOSE is the default value, if any. | 
| 5164 |    The TREE_TYPE is TEMPLATE_PARM_CONSTRAINTS.  The | 
| 5165 |    TEMPLATE_PARM_INDEX for the parameter is available as the | 
| 5166 |    DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a | 
| 5167 |    TYPE_DECL). | 
| 5168 |  | 
| 5169 |    FIXME: CONST_CAST_TREE is a hack that hopefully will go away after | 
| 5170 |    tree is converted to C++ class hiearchy.  */ | 
| 5171 | #define DECL_TEMPLATE_PARMS(NODE)       \ | 
| 5172 |    ((struct tree_template_decl *)CONST_CAST_TREE (TEMPLATE_DECL_CHECK (NODE)))->arguments | 
| 5173 | #define DECL_INNERMOST_TEMPLATE_PARMS(NODE) \ | 
| 5174 |    INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (NODE)) | 
| 5175 | #define DECL_NTPARMS(NODE) \ | 
| 5176 |    TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (NODE)) | 
| 5177 | /* For function, method, class-data templates. | 
| 5178 |  | 
| 5179 |    FIXME: CONST_CAST_TREE is a hack that hopefully will go away after | 
| 5180 |    tree is converted to C++ class hiearchy.  */ | 
| 5181 | #define DECL_TEMPLATE_RESULT(NODE)      \ | 
| 5182 |    ((struct tree_template_decl *)CONST_CAST_TREE(TEMPLATE_DECL_CHECK (NODE)))->result | 
| 5183 | /* For a forward-declared function template at namespace scope, or for any | 
| 5184 |    function template in an exporting module, DECL_TEMPLATE_INSTANTIATIONS lists | 
| 5185 |    all instantiations and specializations of the function so that | 
| 5186 |    tsubst_friend_function can reassign them to another template if we find that | 
| 5187 |    the namespace-scope template is really a partial instantiation of a friend | 
| 5188 |    template. | 
| 5189 |  | 
| 5190 |    For a class or variable template the DECL_TEMPLATE_INSTANTIATIONS lists | 
| 5191 |    holds all instantiations and specializations, including partial | 
| 5192 |    instantiations and partial specializations, so that if we explicitly | 
| 5193 |    specialize a partial instantiation we can walk the list in | 
| 5194 |    maybe_process_partial_specialization and reassign them or complain as | 
| 5195 |    appropriate. | 
| 5196 |  | 
| 5197 |    In both cases, the TREE_PURPOSE of each node contains the arguments | 
| 5198 |    used; the TREE_VALUE contains the generated variable.  The template | 
| 5199 |    arguments are always complete.  For example, given: | 
| 5200 |  | 
| 5201 |       template <class T> struct S1 { | 
| 5202 |         template <class U> struct S2 {}; | 
| 5203 |         template <class U> struct S2<U*> {}; | 
| 5204 |       }; | 
| 5205 |  | 
| 5206 |    the record for the partial specialization will contain, as its | 
| 5207 |    argument list, { {T}, {U*} }, and will be on the | 
| 5208 |    DECL_TEMPLATE_INSTANTIATIONS list for `template <class T> template | 
| 5209 |    <class U> struct S1<T>::S2'. | 
| 5210 |  | 
| 5211 |    This list is not used for other templates.  */ | 
| 5212 | #define DECL_TEMPLATE_INSTANTIATIONS(NODE) \ | 
| 5213 |   DECL_SIZE_UNIT (TEMPLATE_DECL_CHECK (NODE)) | 
| 5214 |  | 
| 5215 | /* For a class template, this list contains the partial | 
| 5216 |    specializations of this template.  (Full specializations are not | 
| 5217 |    recorded on this list.)  The TREE_PURPOSE holds the arguments used | 
| 5218 |    in the partial specialization (e.g., for `template <class T> struct | 
| 5219 |    S<T*, int>' this will be `T*, int'.)  The arguments will also include | 
| 5220 |    any outer template arguments.  The TREE_VALUE holds the TEMPLATE_DECL | 
| 5221 |    for the partial specialization.  The TREE_TYPE is the _TYPE node for | 
| 5222 |    the partial specialization. | 
| 5223 |  | 
| 5224 |    This list is not used for other templates.  */ | 
| 5225 | #define DECL_TEMPLATE_SPECIALIZATIONS(NODE)     \ | 
| 5226 |   DECL_SIZE (TEMPLATE_DECL_CHECK (NODE)) | 
| 5227 |  | 
| 5228 | /* Nonzero for a DECL which is actually a template parameter.  Keep | 
| 5229 |    these checks in ascending tree code order.   */ | 
| 5230 | #define DECL_TEMPLATE_PARM_P(NODE)                \ | 
| 5231 |   (DECL_LANG_FLAG_0 (NODE)                        \ | 
| 5232 |    && (TREE_CODE (NODE) == CONST_DECL                \ | 
| 5233 |        || TREE_CODE (NODE) == PARM_DECL                \ | 
| 5234 |        || TREE_CODE (NODE) == TYPE_DECL                \ | 
| 5235 |        || TREE_CODE (NODE) == TEMPLATE_DECL)) | 
| 5236 |  | 
| 5237 | #if ENABLE_TREE_CHECKING | 
| 5238 | inline tree | 
| 5239 | decl_template_parm_check (const_tree t, const char *f, int l, const char *fn) | 
| 5240 | { | 
| 5241 |   if (!DECL_TEMPLATE_PARM_P (t)) | 
| 5242 |     tree_check_failed (t, f, l, fn, 0); | 
| 5243 |   return const_cast<tree>(t); | 
| 5244 | } | 
| 5245 | #endif | 
| 5246 |  | 
| 5247 | /* Nonzero for a raw template parameter node.  */ | 
| 5248 | #define TEMPLATE_PARM_P(NODE)                                        \ | 
| 5249 |   (TREE_CODE (NODE) == TEMPLATE_TYPE_PARM                        \ | 
| 5250 |    || TREE_CODE (NODE) == TEMPLATE_TEMPLATE_PARM                \ | 
| 5251 |    || TREE_CODE (NODE) == TEMPLATE_PARM_INDEX) | 
| 5252 |  | 
| 5253 | /* Mark NODE as a template parameter.  */ | 
| 5254 | #define SET_DECL_TEMPLATE_PARM_P(NODE) \ | 
| 5255 |   (DECL_LANG_FLAG_0 (NODE) = 1) | 
| 5256 |  | 
| 5257 | /* Nonzero if NODE is a template template parameter.  */ | 
| 5258 | #define DECL_TEMPLATE_TEMPLATE_PARM_P(NODE) \ | 
| 5259 |   (TREE_CODE (NODE) == TEMPLATE_DECL && DECL_TEMPLATE_PARM_P (NODE)) | 
| 5260 |  | 
| 5261 | /* Nonzero for a DECL that represents a function template.  */ | 
| 5262 | #define DECL_FUNCTION_TEMPLATE_P(NODE)                          \ | 
| 5263 |   (TREE_CODE (NODE) == TEMPLATE_DECL                            \ | 
| 5264 |    && DECL_TEMPLATE_RESULT (NODE) != NULL_TREE                        \ | 
| 5265 |    && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == FUNCTION_DECL) | 
| 5266 |  | 
| 5267 | /* Nonzero for a DECL that represents a class template or alias | 
| 5268 |    template.  */ | 
| 5269 | #define DECL_TYPE_TEMPLATE_P(NODE)                                \ | 
| 5270 |   (TREE_CODE (NODE) == TEMPLATE_DECL                                \ | 
| 5271 |    && DECL_TEMPLATE_RESULT (NODE) != NULL_TREE                        \ | 
| 5272 |    && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == TYPE_DECL) | 
| 5273 |  | 
| 5274 | /* Nonzero for a DECL that represents a class template.  */ | 
| 5275 | #define DECL_CLASS_TEMPLATE_P(NODE)                                \ | 
| 5276 |   (DECL_TYPE_TEMPLATE_P (NODE)                                        \ | 
| 5277 |    && DECL_IMPLICIT_TYPEDEF_P (DECL_TEMPLATE_RESULT (NODE))) | 
| 5278 |  | 
| 5279 | /* Nonzero for a TEMPLATE_DECL that represents an alias template.  */ | 
| 5280 | #define DECL_ALIAS_TEMPLATE_P(NODE)                        \ | 
| 5281 |   (DECL_TYPE_TEMPLATE_P (NODE)                                \ | 
| 5282 |    && !DECL_ARTIFICIAL (DECL_TEMPLATE_RESULT (NODE))) | 
| 5283 |  | 
| 5284 | /* Nonzero for a NODE which declares a type.  */ | 
| 5285 | #define DECL_DECLARES_TYPE_P(NODE) \ | 
| 5286 |   (TREE_CODE (NODE) == TYPE_DECL || DECL_TYPE_TEMPLATE_P (NODE)) | 
| 5287 |  | 
| 5288 | /* Nonzero if NODE declares a function.  */ | 
| 5289 | #define DECL_DECLARES_FUNCTION_P(NODE) \ | 
| 5290 |   (TREE_CODE (NODE) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (NODE)) | 
| 5291 |  | 
| 5292 | /* Nonzero if NODE is the typedef implicitly generated for a type when | 
| 5293 |    the type is declared.  In C++, `struct S {};' is roughly | 
| 5294 |    equivalent to `struct S {}; typedef struct S S;' in C. | 
| 5295 |    DECL_IMPLICIT_TYPEDEF_P will hold for the typedef indicated in this | 
| 5296 |    example.  In C++, there is a second implicit typedef for each | 
| 5297 |    class, called the injected-class-name, in the scope of `S' itself, so that | 
| 5298 |    you can say `S::S'.  DECL_SELF_REFERENCE_P will hold for that typedef.  */ | 
| 5299 | #define DECL_IMPLICIT_TYPEDEF_P(NODE) \ | 
| 5300 |   (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_2 (NODE)) | 
| 5301 | #define SET_DECL_IMPLICIT_TYPEDEF_P(NODE) \ | 
| 5302 |   (DECL_LANG_FLAG_2 (NODE) = 1) | 
| 5303 | #define DECL_SELF_REFERENCE_P(NODE) \ | 
| 5304 |   (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_4 (NODE)) | 
| 5305 | #define SET_DECL_SELF_REFERENCE_P(NODE) \ | 
| 5306 |   (DECL_LANG_FLAG_4 (NODE) = 1) | 
| 5307 |  | 
| 5308 | /* A `primary' template is one that has its own template header and is not | 
| 5309 |    a partial specialization.  A member function of a class template is a | 
| 5310 |    template, but not primary.  A member template is primary.  Friend | 
| 5311 |    templates are primary, too.  */ | 
| 5312 |  | 
| 5313 | /* Returns the primary template corresponding to these parameters.  */ | 
| 5314 | #define TPARMS_PRIMARY_TEMPLATE(NODE) (TREE_TYPE (TREE_VEC_CHECK (NODE))) | 
| 5315 |  | 
| 5316 | #define DECL_PRIMARY_TEMPLATE(NODE) \ | 
| 5317 |   (TPARMS_PRIMARY_TEMPLATE (DECL_INNERMOST_TEMPLATE_PARMS (NODE))) | 
| 5318 |  | 
| 5319 | /* Returns nonzero if NODE is a primary template.  */ | 
| 5320 | #define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == (NODE)) | 
| 5321 |  | 
| 5322 | /* Nonzero iff NODE is a specialization of a template.  The value | 
| 5323 |    indicates the type of specializations: | 
| 5324 |  | 
| 5325 |      1=implicit instantiation | 
| 5326 |  | 
| 5327 |      2=partial or explicit specialization, e.g.: | 
| 5328 |  | 
| 5329 |         template <> int min<int> (int, int), | 
| 5330 |  | 
| 5331 |      3=explicit instantiation, e.g.: | 
| 5332 |  | 
| 5333 |         template int min<int> (int, int); | 
| 5334 |  | 
| 5335 |    Note that NODE will be marked as a specialization even if the | 
| 5336 |    template it is instantiating is not a primary template.  For | 
| 5337 |    example, given: | 
| 5338 |  | 
| 5339 |      template <typename T> struct O { | 
| 5340 |        void f(); | 
| 5341 |        struct I {}; | 
| 5342 |      }; | 
| 5343 |  | 
| 5344 |    both O<int>::f and O<int>::I will be marked as instantiations. | 
| 5345 |  | 
| 5346 |    If DECL_USE_TEMPLATE is nonzero, then DECL_TEMPLATE_INFO will also | 
| 5347 |    be non-NULL.  */ | 
| 5348 | #define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC (NODE)->u.base.use_template) | 
| 5349 |  | 
| 5350 | /* Like DECL_USE_TEMPLATE, but for class types.  */ | 
| 5351 | #define CLASSTYPE_USE_TEMPLATE(NODE) \ | 
| 5352 |   (LANG_TYPE_CLASS_CHECK (NODE)->use_template) | 
| 5353 |  | 
| 5354 | /* True if NODE is a specialization of a primary template.  */ | 
| 5355 | #define CLASSTYPE_SPECIALIZATION_OF_PRIMARY_TEMPLATE_P(NODE)        \ | 
| 5356 |   (CLASS_TYPE_P (NODE)                                                \ | 
| 5357 |    && CLASSTYPE_USE_TEMPLATE (NODE)                                \ | 
| 5358 |    && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))) | 
| 5359 |  | 
| 5360 | #define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1) | 
| 5361 | #define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \ | 
| 5362 |   (CLASSTYPE_USE_TEMPLATE (NODE) & 1) | 
| 5363 |  | 
| 5364 | #define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2) | 
| 5365 | #define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2) | 
| 5366 |  | 
| 5367 | /* Returns true for an explicit or partial specialization of a class | 
| 5368 |    template.  */ | 
| 5369 | #define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \ | 
| 5370 |   (CLASSTYPE_USE_TEMPLATE (NODE) == 2) | 
| 5371 | #define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \ | 
| 5372 |   (CLASSTYPE_USE_TEMPLATE (NODE) = 2) | 
| 5373 |  | 
| 5374 | #define DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 1) | 
| 5375 | #define SET_DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 1) | 
| 5376 | #define CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \ | 
| 5377 |   (CLASSTYPE_USE_TEMPLATE (NODE) == 1) | 
| 5378 | #define SET_CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \ | 
| 5379 |   (CLASSTYPE_USE_TEMPLATE (NODE) = 1) | 
| 5380 |  | 
| 5381 | #define DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 3) | 
| 5382 | #define SET_DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 3) | 
| 5383 | #define CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \ | 
| 5384 |   (CLASSTYPE_USE_TEMPLATE (NODE) == 3) | 
| 5385 | #define SET_CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \ | 
| 5386 |   (CLASSTYPE_USE_TEMPLATE (NODE) = 3) | 
| 5387 |  | 
| 5388 | /* Nonzero if DECL is a friend function which is an instantiation | 
| 5389 |    from the point of view of the compiler, but not from the point of | 
| 5390 |    view of the language.  For example given: | 
| 5391 |       template <class T> struct S { friend void f(T) {}; }; | 
| 5392 |    the declaration of `void f(int)' generated when S<int> is | 
| 5393 |    instantiated will not be a DECL_TEMPLATE_INSTANTIATION, but will be | 
| 5394 |    a DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION.  */ | 
| 5395 | #define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \ | 
| 5396 |   (DECL_LANG_SPECIFIC (DECL) && DECL_TEMPLATE_INFO (DECL) \ | 
| 5397 |    && !DECL_USE_TEMPLATE (DECL)) | 
| 5398 |  | 
| 5399 | /* Nonzero if DECL is a function generated from a function 'temploid', | 
| 5400 |    i.e. template, member of class template, or dependent friend.  */ | 
| 5401 | #define DECL_TEMPLOID_INSTANTIATION(DECL)                \ | 
| 5402 |   (DECL_TEMPLATE_INSTANTIATION (DECL)                        \ | 
| 5403 |    || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (DECL)) | 
| 5404 |  | 
| 5405 | /* Nonzero if DECL is either defined implicitly by the compiler or | 
| 5406 |    generated from a temploid.  */ | 
| 5407 | #define DECL_GENERATED_P(DECL) \ | 
| 5408 |   (DECL_TEMPLOID_INSTANTIATION (DECL) || DECL_DEFAULTED_FN (DECL)) | 
| 5409 |  | 
| 5410 | /* Nonzero iff we are currently processing a declaration for an | 
| 5411 |    entity with its own template parameter list, and which is not a | 
| 5412 |    full specialization.  */ | 
| 5413 | #define PROCESSING_REAL_TEMPLATE_DECL_P() \ | 
| 5414 |   (!processing_template_parmlist \ | 
| 5415 |    && current_template_depth > template_class_depth (current_scope ())) | 
| 5416 |  | 
| 5417 | /* Nonzero if this VAR_DECL or FUNCTION_DECL has already been | 
| 5418 |    instantiated, i.e. its definition has been generated from the | 
| 5419 |    pattern given in the template.  */ | 
| 5420 | #define DECL_TEMPLATE_INSTANTIATED(NODE) \ | 
| 5421 |   DECL_LANG_FLAG_1 (VAR_OR_FUNCTION_DECL_CHECK (NODE)) | 
| 5422 |  | 
| 5423 | /* We know what we're doing with this decl now.  */ | 
| 5424 | #define DECL_INTERFACE_KNOWN(NODE) DECL_LANG_FLAG_5 (NODE) | 
| 5425 |  | 
| 5426 | /* DECL_EXTERNAL must be set on a decl until the decl is actually emitted, | 
| 5427 |    so that assemble_external will work properly.  So we have this flag to | 
| 5428 |    tell us whether the decl is really not external. | 
| 5429 |  | 
| 5430 |    This flag does not indicate whether or not the decl is defined in the | 
| 5431 |    current translation unit; it indicates whether or not we should emit the | 
| 5432 |    decl at the end of compilation if it is defined and needed.  */ | 
| 5433 | #define DECL_NOT_REALLY_EXTERN(NODE) \ | 
| 5434 |   (DECL_LANG_SPECIFIC (NODE)->u.base.not_really_extern) | 
| 5435 |  | 
| 5436 | #define DECL_REALLY_EXTERN(NODE) \ | 
| 5437 |   (DECL_EXTERNAL (NODE)                                \ | 
| 5438 |    && (!DECL_LANG_SPECIFIC (NODE) || !DECL_NOT_REALLY_EXTERN (NODE))) | 
| 5439 |  | 
| 5440 | /* A thunk is a stub function. | 
| 5441 |  | 
| 5442 |    A thunk is an alternate entry point for an ordinary FUNCTION_DECL. | 
| 5443 |    The address of the ordinary FUNCTION_DECL is given by the | 
| 5444 |    DECL_INITIAL, which is always an ADDR_EXPR whose operand is a | 
| 5445 |    FUNCTION_DECL.  The job of the thunk is to either adjust the this | 
| 5446 |    pointer before transferring control to the FUNCTION_DECL, or call | 
| 5447 |    FUNCTION_DECL and then adjust the result value. Note, the result | 
| 5448 |    pointer adjusting thunk must perform a call to the thunked | 
| 5449 |    function, (or be implemented via passing some invisible parameter | 
| 5450 |    to the thunked function, which is modified to perform the | 
| 5451 |    adjustment just before returning). | 
| 5452 |  | 
| 5453 |    A thunk may perform either, or both, of the following operations: | 
| 5454 |  | 
| 5455 |    o Adjust the this or result pointer by a constant offset. | 
| 5456 |    o Adjust the this or result pointer by looking up a vcall or vbase offset | 
| 5457 |      in the vtable. | 
| 5458 |  | 
| 5459 |    A this pointer adjusting thunk converts from a base to a derived | 
| 5460 |    class, and hence adds the offsets. A result pointer adjusting thunk | 
| 5461 |    converts from a derived class to a base, and hence subtracts the | 
| 5462 |    offsets.  If both operations are performed, then the constant | 
| 5463 |    adjustment is performed first for this pointer adjustment and last | 
| 5464 |    for the result pointer adjustment. | 
| 5465 |  | 
| 5466 |    The constant adjustment is given by THUNK_FIXED_OFFSET.  If the | 
| 5467 |    vcall or vbase offset is required, THUNK_VIRTUAL_OFFSET is | 
| 5468 |    used. For this pointer adjusting thunks, it is the vcall offset | 
| 5469 |    into the vtable.  For result pointer adjusting thunks it is the | 
| 5470 |    binfo of the virtual base to convert to.  Use that binfo's vbase | 
| 5471 |    offset. | 
| 5472 |  | 
| 5473 |    It is possible to have equivalent covariant thunks.  These are | 
| 5474 |    distinct virtual covariant thunks whose vbase offsets happen to | 
| 5475 |    have the same value.  THUNK_ALIAS is used to pick one as the | 
| 5476 |    canonical thunk, which will get all the this pointer adjusting | 
| 5477 |    thunks attached to it.  */ | 
| 5478 |  | 
| 5479 | /* An integer indicating how many bytes should be subtracted from the | 
| 5480 |    this or result pointer when this function is called.  */ | 
| 5481 | #define THUNK_FIXED_OFFSET(DECL) \ | 
| 5482 |   (DECL_LANG_SPECIFIC (THUNK_FUNCTION_CHECK (DECL))->u.fn.u5.fixed_offset) | 
| 5483 |  | 
| 5484 | /* A tree indicating how to perform the virtual adjustment. For a this | 
| 5485 |    adjusting thunk it is the number of bytes to be added to the vtable | 
| 5486 |    to find the vcall offset. For a result adjusting thunk, it is the | 
| 5487 |    binfo of the relevant virtual base.  If NULL, then there is no | 
| 5488 |    virtual adjust.  (The vptr is always located at offset zero from | 
| 5489 |    the this or result pointer.)  (If the covariant type is within the | 
| 5490 |    class hierarchy being laid out, the vbase index is not yet known | 
| 5491 |    at the point we need to create the thunks, hence the need to use | 
| 5492 |    binfos.)  */ | 
| 5493 |  | 
| 5494 | #define THUNK_VIRTUAL_OFFSET(DECL) \ | 
| 5495 |   (LANG_DECL_MIN_CHECK (FUNCTION_DECL_CHECK (DECL))->access) | 
| 5496 |  | 
| 5497 | /* A thunk which is equivalent to another thunk.  */ | 
| 5498 | #define THUNK_ALIAS(DECL) \ | 
| 5499 |   (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->u.min.template_info) | 
| 5500 |  | 
| 5501 | /* For thunk NODE, this is the FUNCTION_DECL thunked to.  It is | 
| 5502 |    possible for the target to be a thunk too.  */ | 
| 5503 | #define THUNK_TARGET(NODE)                                \ | 
| 5504 |   (LANG_DECL_FN_CHECK (NODE)->befriending_classes) | 
| 5505 |  | 
| 5506 | /* True for a SCOPE_REF iff the "template" keyword was used to | 
| 5507 |    indicate that the qualified name denotes a template.  */ | 
| 5508 | #define QUALIFIED_NAME_IS_TEMPLATE(NODE) \ | 
| 5509 |   (TREE_LANG_FLAG_1 (SCOPE_REF_CHECK (NODE))) | 
| 5510 |  | 
| 5511 | /* [coroutines] | 
| 5512 | */ | 
| 5513 |  | 
| 5514 | /* True if NODE is a co-routine FUNCTION_DECL.  */ | 
| 5515 | #define DECL_COROUTINE_P(NODE) \ | 
| 5516 |   (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->coroutine_p) | 
| 5517 |  | 
| 5518 | /* For a FUNCTION_DECL of a coroutine, this holds the ACTOR helper function | 
| 5519 |    decl.  */ | 
| 5520 | #define DECL_ACTOR_FN(NODE) \ | 
| 5521 |   (coro_get_actor_function ((NODE))) | 
| 5522 |  | 
| 5523 | /* For a FUNCTION_DECL of a coroutine, this holds the DESTROY helper function | 
| 5524 |   decl.  */ | 
| 5525 | #define DECL_DESTROY_FN(NODE) \ | 
| 5526 |   (coro_get_destroy_function ((NODE))) | 
| 5527 |  | 
| 5528 | /* For a FUNCTION_DECL of a coroutine helper (ACTOR or DESTROY), this points | 
| 5529 |    back to the original (ramp) function.  */ | 
| 5530 | #define DECL_RAMP_FN(NODE) \ | 
| 5531 |   (coro_get_ramp_function (NODE)) | 
| 5532 |  | 
| 5533 | /* For a FUNCTION_DECL this is true if it is a coroutine ramp.  */ | 
| 5534 | #define DECL_RAMP_P(NODE) \ | 
| 5535 |   DECL_COROUTINE_P (NODE) && !DECL_RAMP_FN (NODE) | 
| 5536 |  | 
| 5537 | /* True for an OMP_ATOMIC that has dependent parameters.  These are stored | 
| 5538 |    as an expr in operand 1, and integer_zero_node or clauses in operand 0.  */ | 
| 5539 | #define OMP_ATOMIC_DEPENDENT_P(NODE) \ | 
| 5540 |   (TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == INTEGER_CST \ | 
| 5541 |    || TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == OMP_CLAUSE) | 
| 5542 |  | 
| 5543 | /* Used while gimplifying continue statements bound to OMP_FOR nodes.  */ | 
| 5544 | #define OMP_FOR_GIMPLIFYING_P(NODE) \ | 
| 5545 |   (TREE_LANG_FLAG_0 (OMP_LOOPING_CHECK (NODE))) | 
| 5546 |  | 
| 5547 | /* A language-specific token attached to the OpenMP data clauses to | 
| 5548 |    hold code (or code fragments) related to ctors, dtors, and op=. | 
| 5549 |    See semantics.cc for details.  */ | 
| 5550 | #define CP_OMP_CLAUSE_INFO(NODE) \ | 
| 5551 |   TREE_TYPE (OMP_CLAUSE_RANGE_CHECK (NODE, OMP_CLAUSE_PRIVATE, \ | 
| 5552 |                                      OMP_CLAUSE__CONDTEMP_)) | 
| 5553 |  | 
| 5554 | /* Nonzero if this transaction expression's body contains statements.  */ | 
| 5555 | #define TRANSACTION_EXPR_IS_STMT(NODE) \ | 
| 5556 |    TREE_LANG_FLAG_0 (TRANSACTION_EXPR_CHECK (NODE)) | 
| 5557 |  | 
| 5558 | /* These macros provide convenient access to the various _STMT nodes | 
| 5559 |    created when parsing template declarations.  */ | 
| 5560 | #define TRY_STMTS(NODE)                TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0) | 
| 5561 | #define TRY_HANDLERS(NODE)        TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1) | 
| 5562 |  | 
| 5563 | #define EH_SPEC_STMTS(NODE)        TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0) | 
| 5564 | #define EH_SPEC_RAISES(NODE)        TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1) | 
| 5565 |  | 
| 5566 | #define USING_STMT_NAMESPACE(NODE) TREE_OPERAND (USING_STMT_CHECK (NODE), 0) | 
| 5567 |  | 
| 5568 | /* Nonzero if this try block is a function try block.  */ | 
| 5569 | #define FN_TRY_BLOCK_P(NODE)        TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE)) | 
| 5570 | #define HANDLER_PARMS(NODE)        TREE_OPERAND (HANDLER_CHECK (NODE), 0) | 
| 5571 | #define HANDLER_BODY(NODE)        TREE_OPERAND (HANDLER_CHECK (NODE), 1) | 
| 5572 | #define HANDLER_TYPE(NODE)        TREE_TYPE (HANDLER_CHECK (NODE)) | 
| 5573 |  | 
| 5574 | /* CLEANUP_STMT accessors.  The statement(s) covered, the cleanup to run | 
| 5575 |    and the VAR_DECL for which this cleanup exists.  */ | 
| 5576 | #define CLEANUP_BODY(NODE)        TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0) | 
| 5577 | #define CLEANUP_EXPR(NODE)        TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1) | 
| 5578 | #define CLEANUP_DECL(NODE)        TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 2) | 
| 5579 |  | 
| 5580 | /* IF_STMT accessors. These give access to the condition of the if | 
| 5581 |    statement, the then block of the if statement, and the else block | 
| 5582 |    of the if statement if it exists.  */ | 
| 5583 | #define IF_COND(NODE)                TREE_OPERAND (IF_STMT_CHECK (NODE), 0) | 
| 5584 | #define THEN_CLAUSE(NODE)        TREE_OPERAND (IF_STMT_CHECK (NODE), 1) | 
| 5585 | #define ELSE_CLAUSE(NODE)        TREE_OPERAND (IF_STMT_CHECK (NODE), 2) | 
| 5586 | #define IF_SCOPE(NODE)                TREE_OPERAND (IF_STMT_CHECK (NODE), 3) | 
| 5587 | #define IF_STMT_CONSTEXPR_P(NODE) TREE_LANG_FLAG_0 (IF_STMT_CHECK (NODE)) | 
| 5588 | #define IF_STMT_CONSTEVAL_P(NODE) TREE_LANG_FLAG_2 (IF_STMT_CHECK (NODE)) | 
| 5589 |  | 
| 5590 | /* Like PACK_EXPANSION_EXTRA_ARGS, for constexpr if.  IF_SCOPE is used while | 
| 5591 |    building an IF_STMT; IF_STMT_EXTRA_ARGS is used after it is complete.  */ | 
| 5592 | #define (NODE) IF_SCOPE (NODE) | 
| 5593 |  | 
| 5594 | /* RANGE_FOR_STMT accessors. These give access to the declarator, | 
| 5595 |    expression, body, and scope of the statement, respectively.  */ | 
| 5596 | #define RANGE_FOR_DECL(NODE)        TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 0) | 
| 5597 | #define RANGE_FOR_EXPR(NODE)        TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 1) | 
| 5598 | #define RANGE_FOR_BODY(NODE)        TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 2) | 
| 5599 | #define RANGE_FOR_SCOPE(NODE)        TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 3) | 
| 5600 | #define RANGE_FOR_UNROLL(NODE)        TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 4) | 
| 5601 | #define RANGE_FOR_INIT_STMT(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 5) | 
| 5602 | #define RANGE_FOR_IVDEP(NODE)        TREE_LANG_FLAG_6 (RANGE_FOR_STMT_CHECK (NODE)) | 
| 5603 | #define RANGE_FOR_NOVECTOR(NODE) TREE_LANG_FLAG_5 (RANGE_FOR_STMT_CHECK (NODE)) | 
| 5604 |  | 
| 5605 | /* STMT_EXPR accessor.  */ | 
| 5606 | #define STMT_EXPR_STMT(NODE)        TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0) | 
| 5607 |  | 
| 5608 | /* EXPR_STMT accessor. This gives the expression associated with an | 
| 5609 |    expression statement.  */ | 
| 5610 | #define EXPR_STMT_EXPR(NODE)        TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0) | 
| 5611 |  | 
| 5612 | /* True if this TARGET_EXPR was created by build_cplus_new, and so we can | 
| 5613 |    discard it if it isn't useful.  */ | 
| 5614 | #define TARGET_EXPR_IMPLICIT_P(NODE) \ | 
| 5615 |   TREE_LANG_FLAG_0 (TARGET_EXPR_CHECK (NODE)) | 
| 5616 |  | 
| 5617 | /* True if this TARGET_EXPR is the result of list-initialization of a | 
| 5618 |    temporary.  */ | 
| 5619 | #define TARGET_EXPR_LIST_INIT_P(NODE) \ | 
| 5620 |   TREE_LANG_FLAG_1 (TARGET_EXPR_CHECK (NODE)) | 
| 5621 |  | 
| 5622 | /* True if this TARGET_EXPR expresses direct-initialization of an object | 
| 5623 |    to be named later.  */ | 
| 5624 | #define TARGET_EXPR_DIRECT_INIT_P(NODE) \ | 
| 5625 |   TREE_LANG_FLAG_2 (TARGET_EXPR_CHECK (NODE)) | 
| 5626 |  | 
| 5627 | /* True if we expect this TARGET_EXPR to be used as an initializer, not to | 
| 5628 |    materialize as a temporary.  */ | 
| 5629 | #define TARGET_EXPR_ELIDING_P(NODE) \ | 
| 5630 |   TREE_LANG_FLAG_3 (TARGET_EXPR_CHECK (NODE)) | 
| 5631 |  | 
| 5632 | /* True if this TARGET_EXPR is for holding an implementation detail like a | 
| 5633 |    cleanup flag or loop index, and should be ignored by extend_all_temps.  */ | 
| 5634 | #define TARGET_EXPR_INTERNAL_P(NODE) \ | 
| 5635 |   TREE_LANG_FLAG_4 (TARGET_EXPR_CHECK (NODE)) | 
| 5636 |  | 
| 5637 | /* True if NODE is a TARGET_EXPR that just expresses a copy of its INITIAL; if | 
| 5638 |    the initializer has void type, it's doing something more complicated.  */ | 
| 5639 | #define SIMPLE_TARGET_EXPR_P(NODE)                                \ | 
| 5640 |   (TREE_CODE (NODE) == TARGET_EXPR                                \ | 
| 5641 |    && TARGET_EXPR_INITIAL (NODE)                                \ | 
| 5642 |    && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (NODE)))) | 
| 5643 |  | 
| 5644 | /* True if T is a TARGET_EXPR for which we'll need to replace_decl to use it as | 
| 5645 |    an initializer.  */ | 
| 5646 | inline bool | 
| 5647 | target_expr_needs_replace (tree t) | 
| 5648 | { | 
| 5649 |   if (!t || TREE_CODE (t) != TARGET_EXPR) | 
| 5650 |     return false; | 
| 5651 |   tree init = TARGET_EXPR_INITIAL (t); | 
| 5652 |   if (!init || !VOID_TYPE_P (TREE_TYPE (init))) | 
| 5653 |     return false; | 
| 5654 |   while (TREE_CODE (init) == COMPOUND_EXPR) | 
| 5655 |     init = TREE_OPERAND (init, 1); | 
| 5656 |   return (TREE_CODE (init) != AGGR_INIT_EXPR | 
| 5657 |           && TREE_CODE (init) != VEC_INIT_EXPR); | 
| 5658 | } | 
| 5659 |  | 
| 5660 | /* True if EXPR expresses direct-initialization of a TYPE.  */ | 
| 5661 | #define DIRECT_INIT_EXPR_P(TYPE,EXPR)                                        \ | 
| 5662 |   (TREE_CODE (EXPR) == TARGET_EXPR && TREE_LANG_FLAG_2 (EXPR)                \ | 
| 5663 |    && same_type_ignoring_top_level_qualifiers_p (TYPE, TREE_TYPE (EXPR))) | 
| 5664 |  | 
| 5665 | /* True if this CONVERT_EXPR is for a conversion to virtual base in | 
| 5666 |    an NSDMI, and should be re-evaluated when used in a constructor.  */ | 
| 5667 | #define CONVERT_EXPR_VBASE_PATH(NODE) \ | 
| 5668 |   TREE_LANG_FLAG_0 (CONVERT_EXPR_CHECK (NODE)) | 
| 5669 |  | 
| 5670 | /* True if SIZEOF_EXPR argument is type.  */ | 
| 5671 | #define SIZEOF_EXPR_TYPE_P(NODE) \ | 
| 5672 |   TREE_LANG_FLAG_0 (SIZEOF_EXPR_CHECK (NODE)) | 
| 5673 |  | 
| 5674 | /* True if the ALIGNOF_EXPR was spelled "alignof".  */ | 
| 5675 | #define ALIGNOF_EXPR_STD_P(NODE) \ | 
| 5676 |   TREE_LANG_FLAG_0 (ALIGNOF_EXPR_CHECK (NODE)) | 
| 5677 |  | 
| 5678 | /* OMP_DEPOBJ accessors. These give access to the depobj expression of the | 
| 5679 |    #pragma omp depobj directive and the clauses, respectively.  If | 
| 5680 |    OMP_DEPOBJ_CLAUSES is INTEGER_CST, it is instead the update clause kind | 
| 5681 |    or OMP_CLAUSE_DEPEND_LAST for destroy clause.  */ | 
| 5682 | #define OMP_DEPOBJ_DEPOBJ(NODE)         TREE_OPERAND (OMP_DEPOBJ_CHECK (NODE), 0) | 
| 5683 | #define OMP_DEPOBJ_CLAUSES(NODE) TREE_OPERAND (OMP_DEPOBJ_CHECK (NODE), 1) | 
| 5684 |  | 
| 5685 | /* An enumeration of the kind of tags that C++ accepts.  */ | 
| 5686 | enum tag_types { | 
| 5687 |   none_type = 0, /* Not a tag type.  */ | 
| 5688 |   record_type,   /* "struct" types.  */ | 
| 5689 |   class_type,    /* "class" types.  */ | 
| 5690 |   union_type,    /* "union" types.  */ | 
| 5691 |   enum_type,     /* "enum" types.  */ | 
| 5692 |   typename_type, /* "typename" types.  */ | 
| 5693 |   scope_type         /* namespace or tagged type name followed by :: */ | 
| 5694 | }; | 
| 5695 |  | 
| 5696 | /* The various kinds of lvalues we distinguish.  */ | 
| 5697 | enum cp_lvalue_kind_flags { | 
| 5698 |   clk_none = 0,     /* Things that are not an lvalue.  */ | 
| 5699 |   clk_ordinary = 1, /* An ordinary lvalue.  */ | 
| 5700 |   clk_rvalueref = 2,/* An xvalue (rvalue formed using an rvalue reference) */ | 
| 5701 |   clk_class = 4,    /* A prvalue of class or array type.  */ | 
| 5702 |   clk_bitfield = 8, /* An lvalue for a bit-field.  */ | 
| 5703 |   clk_packed = 16,  /* An lvalue for a packed field.  */ | 
| 5704 |   clk_implicit_rval = 1<<5, /* An lvalue being treated as an xvalue.  */ | 
| 5705 |   clk_mergeable = 1<<6 | 
| 5706 | }; | 
| 5707 |  | 
| 5708 | /* This type is used for parameters and variables which hold | 
| 5709 |    combinations of the flags in enum cp_lvalue_kind_flags.  */ | 
| 5710 | typedef int cp_lvalue_kind; | 
| 5711 |  | 
| 5712 | /* Various kinds of template specialization, instantiation, etc.  */ | 
| 5713 | enum tmpl_spec_kind { | 
| 5714 |   tsk_none,                   /* Not a template at all.  */ | 
| 5715 |   tsk_invalid_member_spec, /* An explicit member template | 
| 5716 |                               specialization, but the enclosing | 
| 5717 |                               classes have not all been explicitly | 
| 5718 |                               specialized.  */ | 
| 5719 |   tsk_invalid_expl_inst,   /* An explicit instantiation containing | 
| 5720 |                               template parameter lists.  */ | 
| 5721 |   tsk_excessive_parms,           /* A template declaration with too many | 
| 5722 |                               template parameter lists.  */ | 
| 5723 |   tsk_insufficient_parms,  /* A template declaration with too few | 
| 5724 |                               parameter lists.  */ | 
| 5725 |   tsk_template,                   /* A template declaration.  */ | 
| 5726 |   tsk_expl_spec,           /* An explicit specialization.  */ | 
| 5727 |   tsk_expl_inst                   /* An explicit instantiation.  */ | 
| 5728 | }; | 
| 5729 |  | 
| 5730 | /* The various kinds of access.  BINFO_ACCESS depends on these being | 
| 5731 |    two bit quantities.  The numerical values are important; they are | 
| 5732 |    used to initialize RTTI data structures, so changing them changes | 
| 5733 |    the ABI.  */ | 
| 5734 | enum access_kind { | 
| 5735 |   ak_none = 0,                   /* Inaccessible.  */ | 
| 5736 |   ak_public = 1,           /* Accessible, as a `public' thing.  */ | 
| 5737 |   ak_protected = 2,           /* Accessible, as a `protected' thing.  */ | 
| 5738 |   ak_private = 3           /* Accessible, as a `private' thing.  */ | 
| 5739 | }; | 
| 5740 |  | 
| 5741 | /* The various kinds of special functions.  If you add to this list, | 
| 5742 |    you should update special_function_p as well.  */ | 
| 5743 | enum special_function_kind { | 
| 5744 |   sfk_none = 0,                   /* Not a special function.  This enumeral | 
| 5745 |                               must have value zero; see | 
| 5746 |                               special_function_p.  */ | 
| 5747 |   /* The following are ordered, for use by member synthesis fns.  */ | 
| 5748 |   sfk_destructor,           /* A destructor.  */ | 
| 5749 |   sfk_constructor,           /* A constructor.  */ | 
| 5750 |   sfk_inheriting_constructor, /* An inheriting constructor */ | 
| 5751 |   sfk_copy_constructor,    /* A copy constructor.  */ | 
| 5752 |   sfk_move_constructor,    /* A move constructor.  */ | 
| 5753 |   sfk_copy_assignment,     /* A copy assignment operator.  */ | 
| 5754 |   sfk_move_assignment,     /* A move assignment operator.  */ | 
| 5755 |   /* The following are unordered.  */ | 
| 5756 |   sfk_complete_destructor, /* A destructor for complete objects.  */ | 
| 5757 |   sfk_base_destructor,     /* A destructor for base subobjects.  */ | 
| 5758 |   sfk_deleting_destructor, /* A destructor for complete objects that | 
| 5759 |                               deletes the object after it has been | 
| 5760 |                               destroyed.  */ | 
| 5761 |   sfk_conversion,           /* A conversion operator.  */ | 
| 5762 |   sfk_deduction_guide,           /* A class template deduction guide.  */ | 
| 5763 |   sfk_comparison,           /* A comparison operator (e.g. ==, <, <=>).  */ | 
| 5764 |   sfk_virtual_destructor   /* Used by member synthesis fns.  */ | 
| 5765 | }; | 
| 5766 |  | 
| 5767 | /* The various kinds of linkage.  From [basic.link], | 
| 5768 |  | 
| 5769 |       A name is said to have linkage when it might denote the same | 
| 5770 |       object, reference, function, type, template, namespace or value | 
| 5771 |       as a name introduced in another scope: | 
| 5772 |  | 
| 5773 |       -- When a name has external linkage, the entity it denotes can | 
| 5774 |          be referred to from scopes of other translation units or from | 
| 5775 |          other scopes of the same translation unit. | 
| 5776 |  | 
| 5777 |       -- When a name has internal linkage, the entity it denotes can | 
| 5778 |          be referred to by names from other scopes in the same | 
| 5779 |          translation unit. | 
| 5780 |  | 
| 5781 |       -- When a name has no linkage, the entity it denotes cannot be | 
| 5782 |          referred to by names from other scopes.  */ | 
| 5783 |  | 
| 5784 | enum linkage_kind { | 
| 5785 |   lk_none,                        /* No linkage.  */ | 
| 5786 |   lk_internal,                        /* Internal linkage.  */ | 
| 5787 |   lk_external                        /* External linkage.  */ | 
| 5788 | }; | 
| 5789 |  | 
| 5790 | enum duration_kind { | 
| 5791 |   dk_static, | 
| 5792 |   dk_thread, | 
| 5793 |   dk_auto, | 
| 5794 |   dk_dynamic | 
| 5795 | }; | 
| 5796 |  | 
| 5797 | /* Bitmask flags to control type substitution.  */ | 
| 5798 | enum tsubst_flags { | 
| 5799 |   tf_none = 0,                         /* nothing special */ | 
| 5800 |   tf_error = 1 << 0,                 /* give error messages  */ | 
| 5801 |   tf_warning = 1 << 1,                  /* give warnings too  */ | 
| 5802 |   tf_ignore_bad_quals = 1 << 2,         /* ignore bad cvr qualifiers */ | 
| 5803 |   tf_keep_type_decl = 1 << 3,         /* retain typedef type decls | 
| 5804 |                                     (make_typename_type use) */ | 
| 5805 |   tf_ptrmem_ok = 1 << 4,         /* pointers to member ok (internal | 
| 5806 |                                     instantiate_type use) */ | 
| 5807 |   tf_user = 1 << 5,                 /* found template must be a user template | 
| 5808 |                                     (lookup_template_class use) */ | 
| 5809 |   tf_conv = 1 << 6,                 /* We are determining what kind of | 
| 5810 |                                     conversion might be permissible, | 
| 5811 |                                     not actually performing the | 
| 5812 |                                     conversion.  */ | 
| 5813 |   tf_decltype = 1 << 7,          /* We are the operand of decltype. | 
| 5814 |                                     Used to implement the special rules | 
| 5815 |                                     for calls in decltype (5.2.2/11).  */ | 
| 5816 |   tf_partial = 1 << 8,                 /* Doing initial explicit argument | 
| 5817 |                                     substitution in fn_type_unification.  */ | 
| 5818 |   tf_fndecl_type = 1 << 9,   /* Substituting the type of a function | 
| 5819 |                                 declaration.  */ | 
| 5820 |   tf_no_cleanup = 1 << 10,   /* Do not build a cleanup | 
| 5821 |                                 (build_target_expr and friends) */ | 
| 5822 |   /* 1 << 11 is available.  */ | 
| 5823 |   tf_tst_ok = 1 << 12,                 /* Allow a typename-specifier to name | 
| 5824 |                                     a template (C++17 or later).  */ | 
| 5825 |   tf_dguide = 1 << 13,                /* Building a deduction guide from a ctor.  */ | 
| 5826 |   tf_qualifying_scope = 1 << 14, /* Substituting the LHS of the :: operator. | 
| 5827 |                                     Affects TYPENAME_TYPE resolution from | 
| 5828 |                                     make_typename_type.  */ | 
| 5829 |   tf_no_name_lookup = 1 << 15, /* Don't look up the terminal name of an | 
| 5830 |                                   outermost id-expression, or resolve its | 
| 5831 |                                   constituent template-ids or qualified-ids.  */ | 
| 5832 |   /* Convenient substitution flags combinations.  */ | 
| 5833 |   tf_warning_or_error = tf_warning | tf_error | 
| 5834 | }; | 
| 5835 |  | 
| 5836 | /* This type is used for parameters and variables which hold | 
| 5837 |    combinations of the flags in enum tsubst_flags.  */ | 
| 5838 | typedef int tsubst_flags_t; | 
| 5839 |  | 
| 5840 | /* The kind of checking we can do looking in a class hierarchy.  */ | 
| 5841 | enum base_access_flags { | 
| 5842 |   ba_any = 0,  /* Do not check access, allow an ambiguous base, | 
| 5843 |                       prefer a non-virtual base */ | 
| 5844 |   ba_unique = 1 << 0,  /* Must be a unique base.  */ | 
| 5845 |   ba_check_bit = 1 << 1,   /* Check access.  */ | 
| 5846 |   ba_check = ba_unique | ba_check_bit, | 
| 5847 |   ba_ignore_scope = 1 << 2, /* Ignore access allowed by local scope.  */ | 
| 5848 |   ba_require_virtual = 1 << 3 /* Require a virtual base.  */ | 
| 5849 | }; | 
| 5850 |  | 
| 5851 | /* This type is used for parameters and variables which hold | 
| 5852 |    combinations of the flags in enum base_access_flags.  */ | 
| 5853 | typedef int base_access; | 
| 5854 |  | 
| 5855 | /* The various kinds of access check during parsing.  */ | 
| 5856 | enum deferring_kind { | 
| 5857 |   dk_no_deferred = 0, /* Check access immediately */ | 
| 5858 |   dk_deferred = 1,    /* Deferred check */ | 
| 5859 |   dk_no_check = 2     /* No access check */ | 
| 5860 | }; | 
| 5861 |  | 
| 5862 | /* The kind of base we can find, looking in a class hierarchy. | 
| 5863 |    Values <0 indicate we failed.  */ | 
| 5864 | enum base_kind { | 
| 5865 |   bk_inaccessible = -3,   /* The base is inaccessible */ | 
| 5866 |   bk_ambig = -2,          /* The base is ambiguous */ | 
| 5867 |   bk_not_base = -1,          /* It is not a base */ | 
| 5868 |   bk_same_type = 0,          /* It is the same type */ | 
| 5869 |   bk_proper_base = 1,          /* It is a proper base */ | 
| 5870 |   bk_via_virtual = 2          /* It is a proper base, but via a virtual | 
| 5871 |                              path. This might not be the canonical | 
| 5872 |                              binfo.  */ | 
| 5873 | }; | 
| 5874 |  | 
| 5875 | /* Node for "pointer to (virtual) function". | 
| 5876 |    This may be distinct from ptr_type_node so gdb can distinguish them.  */ | 
| 5877 | #define vfunc_ptr_type_node  vtable_entry_type | 
| 5878 |  | 
| 5879 |  | 
| 5880 | /* For building calls to `delete'.  */ | 
| 5881 | extern GTY(()) tree integer_two_node; | 
| 5882 |  | 
| 5883 | /* The number of function bodies which we are currently processing. | 
| 5884 |    (Zero if we are at namespace scope, one inside the body of a | 
| 5885 |    function, two inside the body of a function in a local class, etc.)  */ | 
| 5886 | extern int function_depth; | 
| 5887 |  | 
| 5888 | /* Nonzero if we are inside spec_hasher::equal, which affects | 
| 5889 |    comparison of PARM_DECLs in cp_tree_equal.  */ | 
| 5890 | extern int comparing_specializations; | 
| 5891 |  | 
| 5892 | /* Nonzero if we want different dependent aliases to compare as unequal. | 
| 5893 |    FIXME we should always do this except during deduction/ordering.  */ | 
| 5894 | extern int comparing_dependent_aliases; | 
| 5895 |  | 
| 5896 | /* Nonzero if we want to consider different member expressions to compare | 
| 5897 |    equal if they designate the same entity. This is set when comparing | 
| 5898 |    contract conditions of overrides.  */ | 
| 5899 | extern bool comparing_override_contracts; | 
| 5900 |  | 
| 5901 | /* In parser.cc.  */ | 
| 5902 |  | 
| 5903 | /* Nonzero if we are parsing an unevaluated operand: an operand to | 
| 5904 |    sizeof, typeof, or alignof.  This is a count since operands to | 
| 5905 |    sizeof can be nested.  */ | 
| 5906 |  | 
| 5907 | extern int cp_unevaluated_operand; | 
| 5908 |  | 
| 5909 | /* RAII class used to inhibit the evaluation of operands during parsing | 
| 5910 |    and template instantiation.  Evaluation warnings are also inhibited.  */ | 
| 5911 |  | 
| 5912 | class cp_unevaluated | 
| 5913 | { | 
| 5914 | public: | 
| 5915 |   cp_unevaluated (); | 
| 5916 |   ~cp_unevaluated (); | 
| 5917 | }; | 
| 5918 |  | 
| 5919 | /* The reverse: an RAII class used for nested contexts that are evaluated even | 
| 5920 |    if the enclosing context is not.  */ | 
| 5921 |  | 
| 5922 | class cp_evaluated | 
| 5923 | { | 
| 5924 | public: | 
| 5925 |   int uneval; | 
| 5926 |   int inhibit; | 
| 5927 |   cp_evaluated (bool reset = true) | 
| 5928 |     : uneval(cp_unevaluated_operand), inhibit(c_inhibit_evaluation_warnings) | 
| 5929 |   { if (reset) | 
| 5930 |       cp_unevaluated_operand = c_inhibit_evaluation_warnings = 0; } | 
| 5931 |   ~cp_evaluated () | 
| 5932 |   { cp_unevaluated_operand = uneval; | 
| 5933 |     c_inhibit_evaluation_warnings = inhibit; } | 
| 5934 | }; | 
| 5935 |  | 
| 5936 | /* in pt.cc  */ | 
| 5937 |  | 
| 5938 | /* These values are used for the `STRICT' parameter to type_unification and | 
| 5939 |    fn_type_unification.  Their meanings are described with the | 
| 5940 |    documentation for fn_type_unification.  */ | 
| 5941 |  | 
| 5942 | enum unification_kind_t { | 
| 5943 |   DEDUCE_CALL, | 
| 5944 |   DEDUCE_CONV, | 
| 5945 |   DEDUCE_EXACT | 
| 5946 | }; | 
| 5947 |  | 
| 5948 | // An RAII class used to create a new pointer map for local | 
| 5949 | // specializations. When the stack goes out of scope, the | 
| 5950 | // previous pointer map is restored. | 
| 5951 | enum lss_policy { lss_blank, lss_copy, lss_nop }; | 
| 5952 | class local_specialization_stack | 
| 5953 | { | 
| 5954 | public: | 
| 5955 |   local_specialization_stack (lss_policy = lss_blank); | 
| 5956 |   ~local_specialization_stack (); | 
| 5957 |  | 
| 5958 |   hash_map<tree, tree> *saved; | 
| 5959 | }; | 
| 5960 |  | 
| 5961 | /* Entry in the specialization hash table.  */ | 
| 5962 | struct GTY((for_user)) spec_entry | 
| 5963 | { | 
| 5964 |   /* The general template this is a specialization of.  */ | 
| 5965 |   tree tmpl; | 
| 5966 |   /* The args for this (maybe-partial) specialization.  */ | 
| 5967 |   tree args; | 
| 5968 |   /* The specialization itself.  */ | 
| 5969 |   tree spec = NULL_TREE; | 
| 5970 |   /* The cached result of hash_tmpl_and_args (tmpl, args).  */ | 
| 5971 |   hashval_t hash = 0; | 
| 5972 | }; | 
| 5973 |  | 
| 5974 | /* in class.cc */ | 
| 5975 |  | 
| 5976 | extern int current_class_depth; | 
| 5977 |  | 
| 5978 | /* in decl.cc */ | 
| 5979 |  | 
| 5980 | /* An array of static vars & fns.  */ | 
| 5981 | extern GTY(()) vec<tree, va_gc> *static_decls; | 
| 5982 |  | 
| 5983 | /* An array of vtable-needing types that have no key function, or have | 
| 5984 |    an emitted key function.  */ | 
| 5985 | extern GTY(()) vec<tree, va_gc> *keyed_classes; | 
| 5986 |  | 
| 5987 | /* Here's where we control how name mangling takes place.  */ | 
| 5988 |  | 
| 5989 | /* Cannot use '$' up front, because this confuses gdb | 
| 5990 |    (names beginning with '$' are gdb-local identifiers). | 
| 5991 |  | 
| 5992 |    Note that all forms in which the '$' is significant are long enough | 
| 5993 |    for direct indexing (meaning that if we know there is a '$' | 
| 5994 |    at a particular location, we can index into the string at | 
| 5995 |    any other location that provides distinguishing characters).  */ | 
| 5996 |  | 
| 5997 | /* Define NO_DOT_IN_LABEL in your favorite tm file if your assembler | 
| 5998 |    doesn't allow '.' in symbol names.  */ | 
| 5999 | #ifndef NO_DOT_IN_LABEL | 
| 6000 |  | 
| 6001 | #define JOINER '.' | 
| 6002 | #define JOIN_STR "." | 
| 6003 |  | 
| 6004 | #define AUTO_TEMP_NAME "_.tmp_" | 
| 6005 | #define VFIELD_BASE ".vf" | 
| 6006 | #define VFIELD_NAME "_vptr." | 
| 6007 | #define VFIELD_NAME_FORMAT "_vptr.%s" | 
| 6008 |  | 
| 6009 | #else /* NO_DOT_IN_LABEL */ | 
| 6010 |  | 
| 6011 | #ifndef NO_DOLLAR_IN_LABEL | 
| 6012 |  | 
| 6013 | #define JOINER '$' | 
| 6014 | #define JOIN_STR "$" | 
| 6015 |  | 
| 6016 | #define AUTO_TEMP_NAME "_$tmp_" | 
| 6017 | #define VFIELD_BASE "$vf" | 
| 6018 | #define VFIELD_NAME "_vptr$" | 
| 6019 | #define VFIELD_NAME_FORMAT "_vptr$%s" | 
| 6020 |  | 
| 6021 | #else /* NO_DOLLAR_IN_LABEL */ | 
| 6022 |  | 
| 6023 | #define JOIN_STR "_" | 
| 6024 |  | 
| 6025 | #define VTABLE_NAME "__vt_" | 
| 6026 | #define VTABLE_NAME_P(ID_NODE) \ | 
| 6027 |   (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \ | 
| 6028 |              sizeof (VTABLE_NAME) - 1)) | 
| 6029 | #define VFIELD_BASE "__vfb" | 
| 6030 | #define VFIELD_NAME "__vptr_" | 
| 6031 | #define VFIELD_NAME_P(ID_NODE) \ | 
| 6032 |   (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \ | 
| 6033 |             sizeof (VFIELD_NAME) - 1)) | 
| 6034 | #define VFIELD_NAME_FORMAT "__vptr_%s" | 
| 6035 |  | 
| 6036 | #endif        /* NO_DOLLAR_IN_LABEL */ | 
| 6037 | #endif        /* NO_DOT_IN_LABEL */ | 
| 6038 |  | 
| 6039 | #define UDLIT_OP_ANSI_PREFIX "operator\"\"" | 
| 6040 | #define UDLIT_OP_ANSI_FORMAT UDLIT_OP_ANSI_PREFIX "%s" | 
| 6041 | #define UDLIT_OP_MANGLED_PREFIX "li" | 
| 6042 | #define UDLIT_OP_MANGLED_FORMAT UDLIT_OP_MANGLED_PREFIX "%s" | 
| 6043 | #define UDLIT_OPER_P(ID_NODE) \ | 
| 6044 |   (!strncmp (IDENTIFIER_POINTER (ID_NODE), \ | 
| 6045 |              UDLIT_OP_ANSI_PREFIX, \ | 
| 6046 |              sizeof (UDLIT_OP_ANSI_PREFIX) - 1)) | 
| 6047 | #define UDLIT_OP_SUFFIX(ID_NODE) \ | 
| 6048 |   (IDENTIFIER_POINTER (ID_NODE) + sizeof (UDLIT_OP_ANSI_PREFIX) - 1) | 
| 6049 |  | 
| 6050 | #if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) | 
| 6051 |  | 
| 6052 | #define VTABLE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \ | 
| 6053 |   && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \ | 
| 6054 |   && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER) | 
| 6055 |  | 
| 6056 | #define VFIELD_NAME_P(ID_NODE) \ | 
| 6057 |   (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1)) | 
| 6058 |  | 
| 6059 | #endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */ | 
| 6060 |  | 
| 6061 |  | 
| 6062 | /* Nonzero if we're done parsing and into end-of-file activities. | 
| 6063 |    2 if all templates have been instantiated. | 
| 6064 |    3 if we're done with front-end processing.  */ | 
| 6065 |  | 
| 6066 | extern int at_eof; | 
| 6067 |  | 
| 6068 | /* True if note_mangling_alias should enqueue mangling aliases for | 
| 6069 |    later generation, rather than emitting them right away.  */ | 
| 6070 |  | 
| 6071 | extern bool defer_mangling_aliases; | 
| 6072 |  | 
| 6073 | /* True if noexcept is part of the type (i.e. in C++17).  */ | 
| 6074 |  | 
| 6075 | extern bool flag_noexcept_type; | 
| 6076 |  | 
| 6077 | /* True if this TREE_LIST in {static,tls}_aggregates is a for dynamic | 
| 6078 |    initialization of namespace scope structured binding base or related | 
| 6079 |    extended ref init temps.  Temporaries from the initialization of | 
| 6080 |    STATIC_INIT_DECOMP_BASE_P dynamic initializers should be destroyed only | 
| 6081 |    after the last STATIC_INIT_DECOMP_NONBASE_P dynamic initializer following | 
| 6082 |    it.  */ | 
| 6083 | #define STATIC_INIT_DECOMP_BASE_P(NODE) \ | 
| 6084 |   TREE_LANG_FLAG_1 (TREE_LIST_CHECK (NODE)) | 
| 6085 |  | 
| 6086 | /* True if this TREE_LIST in {static,tls}_aggregates is a for dynamic | 
| 6087 |    initialization of namespace scope structured binding non-base | 
| 6088 |    variable using get.  */ | 
| 6089 | #define STATIC_INIT_DECOMP_NONBASE_P(NODE) \ | 
| 6090 |   TREE_LANG_FLAG_2 (TREE_LIST_CHECK (NODE)) | 
| 6091 |  | 
| 6092 | /* A list of namespace-scope objects which have constructors or | 
| 6093 |    destructors which reside in the global scope.  The decl is stored | 
| 6094 |    in the TREE_VALUE slot and the initializer is stored in the | 
| 6095 |    TREE_PURPOSE slot.  */ | 
| 6096 | extern GTY(()) tree static_aggregates; | 
| 6097 | /* Likewise, for thread local storage.  */ | 
| 6098 | extern GTY(()) tree tls_aggregates; | 
| 6099 |  | 
| 6100 | /* A hash-map mapping from variable decls to the dynamic initializer for | 
| 6101 |    the decl.  This is currently only used by OpenMP.  */ | 
| 6102 | extern GTY(()) decl_tree_map *dynamic_initializers; | 
| 6103 |  | 
| 6104 | enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG }; | 
| 6105 |  | 
| 6106 | /* These are uses as bits in flags passed to various functions to | 
| 6107 |    control their behavior.  Despite the LOOKUP_ prefix, many of these | 
| 6108 |    do not control name lookup.  ??? Functions using these flags should | 
| 6109 |    probably be modified to accept explicit boolean flags for the | 
| 6110 |    behaviors relevant to them.  */ | 
| 6111 | /* Check for access violations.  */ | 
| 6112 | #define LOOKUP_PROTECT (1 << 0) | 
| 6113 | #define LOOKUP_NORMAL (LOOKUP_PROTECT) | 
| 6114 | /* Even if the function found by lookup is a virtual function, it | 
| 6115 |    should be called directly.  */ | 
| 6116 | #define LOOKUP_NONVIRTUAL (1 << 1) | 
| 6117 | /* Non-converting (i.e., "explicit") constructors are not tried.  This flag | 
| 6118 |    indicates that we are not performing direct-initialization.  */ | 
| 6119 | #define LOOKUP_ONLYCONVERTING (1 << 2) | 
| 6120 | #define LOOKUP_IMPLICIT (LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING) | 
| 6121 | /* If a temporary is created, it should be created so that it lives | 
| 6122 |    as long as the current variable bindings; otherwise it only lives | 
| 6123 |    until the end of the complete-expression.  It also forces | 
| 6124 |    direct-initialization in cases where other parts of the compiler | 
| 6125 |    have already generated a temporary, such as reference | 
| 6126 |    initialization and the catch parameter.  */ | 
| 6127 | #define DIRECT_BIND (1 << 3) | 
| 6128 | /* We're performing a user-defined conversion, so more user-defined | 
| 6129 |    conversions are not permitted (only built-in conversions).  */ | 
| 6130 | #define LOOKUP_NO_CONVERSION (1 << 4) | 
| 6131 | /* The user has explicitly called a destructor.  (Therefore, we do | 
| 6132 |    not need to check that the object is non-NULL before calling the | 
| 6133 |    destructor.)  */ | 
| 6134 | #define LOOKUP_DESTRUCTOR (1 << 5) | 
| 6135 | /* Do not permit references to bind to temporaries.  */ | 
| 6136 | #define LOOKUP_NO_TEMP_BIND (1 << 6) | 
| 6137 | /* We're inside an init-list, so narrowing conversions are ill-formed.  */ | 
| 6138 | #define LOOKUP_NO_NARROWING (LOOKUP_NO_TEMP_BIND << 1) | 
| 6139 | /* We're looking up a constructor for list-initialization.  */ | 
| 6140 | #define LOOKUP_LIST_INIT_CTOR (LOOKUP_NO_NARROWING << 1) | 
| 6141 | /* This is the first parameter of a copy constructor.  */ | 
| 6142 | #define LOOKUP_COPY_PARM (LOOKUP_LIST_INIT_CTOR << 1) | 
| 6143 | /* We only want to consider list constructors.  */ | 
| 6144 | #define LOOKUP_LIST_ONLY (LOOKUP_COPY_PARM << 1) | 
| 6145 | /* Return after determining which function to call and checking access. | 
| 6146 |    Used by sythesized_method_walk to determine which functions will | 
| 6147 |    be called to initialize subobjects, in order to determine exception | 
| 6148 |    specification and possible implicit delete. | 
| 6149 |    This is kind of a hack, but exiting early avoids problems with trying | 
| 6150 |    to perform argument conversions when the class isn't complete yet.  */ | 
| 6151 | #define LOOKUP_SPECULATIVE (LOOKUP_LIST_ONLY << 1) | 
| 6152 | /* Used by calls from defaulted functions to limit the overload set to avoid | 
| 6153 |    cycles trying to declare them (core issue 1092).  */ | 
| 6154 | #define LOOKUP_DEFAULTED (LOOKUP_SPECULATIVE << 1) | 
| 6155 | /* Used in calls to store_init_value to suppress its usual call to | 
| 6156 |    digest_init.  */ | 
| 6157 | #define LOOKUP_ALREADY_DIGESTED (LOOKUP_DEFAULTED << 1) | 
| 6158 | /* Like LOOKUP_NO_TEMP_BIND, but also prevent binding to xvalues.  */ | 
| 6159 | #define LOOKUP_NO_RVAL_BIND (LOOKUP_ALREADY_DIGESTED << 1) | 
| 6160 | /* Used by case_conversion to disregard non-integral conversions.  */ | 
| 6161 | #define LOOKUP_NO_NON_INTEGRAL (LOOKUP_NO_RVAL_BIND << 1) | 
| 6162 | /* Used for delegating constructors in order to diagnose self-delegation.  */ | 
| 6163 | #define LOOKUP_DELEGATING_CONS (LOOKUP_NO_NON_INTEGRAL << 1) | 
| 6164 | /* Allow initialization of a flexible array members.  */ | 
| 6165 | #define LOOKUP_ALLOW_FLEXARRAY_INIT (LOOKUP_DELEGATING_CONS << 1) | 
| 6166 | /* We're looking for either a rewritten comparison operator candidate or the | 
| 6167 |    operator to use on the former's result.  We distinguish between the two by | 
| 6168 |    knowing that comparisons other than == and <=> must be the latter, as must | 
| 6169 |    a <=> expression trying to rewrite to <=> without reversing.  */ | 
| 6170 | #define LOOKUP_REWRITTEN (LOOKUP_ALLOW_FLEXARRAY_INIT << 1) | 
| 6171 | /* Reverse the order of the two arguments for comparison rewriting.  First we | 
| 6172 |    swap the arguments in add_operator_candidates, then we swap the conversions | 
| 6173 |    in add_candidate (so that they correspond to the original order of the | 
| 6174 |    args), then we swap the conversions back in build_new_op_1 (so they | 
| 6175 |    correspond to the order of the args in the candidate).  */ | 
| 6176 | #define LOOKUP_REVERSED (LOOKUP_REWRITTEN << 1) | 
| 6177 | /* We're initializing an aggregate from a parenthesized list of values.  */ | 
| 6178 | #define LOOKUP_AGGREGATE_PAREN_INIT (LOOKUP_REVERSED << 1) | 
| 6179 | /* We're computing conversions as part of a first pass of overload resolution | 
| 6180 |    wherein we don't try to distinguish an unviable candidate from a | 
| 6181 |    non-strictly viable candidate and thus can avoid computing unnecessary | 
| 6182 |    bad conversions.  */ | 
| 6183 | #define LOOKUP_SHORTCUT_BAD_CONVS (LOOKUP_AGGREGATE_PAREN_INIT << 1) | 
| 6184 |  | 
| 6185 | /* These flags are used by the conversion code. | 
| 6186 |    CONV_IMPLICIT   :  Perform implicit conversions (standard and user-defined). | 
| 6187 |    CONV_STATIC     :  Perform the explicit conversions for static_cast. | 
| 6188 |    CONV_CONST      :  Perform the explicit conversions for const_cast. | 
| 6189 |    CONV_REINTERPRET:  Perform the explicit conversions for reinterpret_cast. | 
| 6190 |    CONV_PRIVATE    :  Perform upcasts to private bases. | 
| 6191 |    CONV_FORCE_TEMP :  Require a new temporary when converting to the same | 
| 6192 |                       aggregate type.  */ | 
| 6193 |  | 
| 6194 | #define CONV_IMPLICIT    1 | 
| 6195 | #define CONV_STATIC      2 | 
| 6196 | #define CONV_CONST       4 | 
| 6197 | #define CONV_REINTERPRET 8 | 
| 6198 | #define CONV_PRIVATE         16 | 
| 6199 | #define CONV_FORCE_TEMP  32 | 
| 6200 | #define CONV_FOLD         64 | 
| 6201 | #define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \ | 
| 6202 |                           | CONV_REINTERPRET) | 
| 6203 | #define CONV_C_CAST      (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \ | 
| 6204 |                           | CONV_REINTERPRET | CONV_PRIVATE | CONV_FORCE_TEMP) | 
| 6205 | #define CONV_BACKEND_CONVERT (CONV_OLD_CONVERT | CONV_FOLD) | 
| 6206 |  | 
| 6207 | /* Used by build_expr_type_conversion to indicate which types are | 
| 6208 |    acceptable as arguments to the expression under consideration.  */ | 
| 6209 |  | 
| 6210 | #define WANT_INT        1 /* integer types, including bool */ | 
| 6211 | #define WANT_FLOAT        2 /* floating point types */ | 
| 6212 | #define WANT_ENUM        4 /* enumerated types */ | 
| 6213 | #define WANT_POINTER        8 /* pointer types */ | 
| 6214 | #define WANT_NULL      16 /* null pointer constant */ | 
| 6215 | #define WANT_VECTOR_OR_COMPLEX 32 /* vector or complex types */ | 
| 6216 | #define WANT_ARITH        (WANT_INT | WANT_FLOAT | WANT_VECTOR_OR_COMPLEX) | 
| 6217 |  | 
| 6218 | /* Used with comptypes, and related functions, to guide type | 
| 6219 |    comparison.  */ | 
| 6220 |  | 
| 6221 | #define COMPARE_STRICT              0 /* Just check if the types are the | 
| 6222 |                                    same.  */ | 
| 6223 | #define COMPARE_BASE              1 /* Check to see if the second type is | 
| 6224 |                                    derived from the first.  */ | 
| 6225 | #define COMPARE_DERIVED              2 /* Like COMPARE_BASE, but in | 
| 6226 |                                    reverse.  */ | 
| 6227 | #define COMPARE_REDECLARATION 4 /* The comparison is being done when | 
| 6228 |                                    another declaration of an existing | 
| 6229 |                                    entity is seen.  */ | 
| 6230 | #define COMPARE_STRUCTURAL    8 /* The comparison is intended to be | 
| 6231 |                                    structural. The actual comparison | 
| 6232 |                                    will be identical to | 
| 6233 |                                    COMPARE_STRICT.  */ | 
| 6234 |  | 
| 6235 | /* Used with start function.  */ | 
| 6236 | #define SF_DEFAULT             0  /* No flags.  */ | 
| 6237 | #define SF_PRE_PARSED             1  /* The function declaration has | 
| 6238 |                                    already been parsed.  */ | 
| 6239 | #define SF_INCLASS_INLINE    2  /* The function is an inline, defined | 
| 6240 |                                    in the class body.  */ | 
| 6241 |  | 
| 6242 | /* Used with start_decl's initialized parameter.  */ | 
| 6243 | #define SD_UNINITIALIZED     0 | 
| 6244 | #define SD_INITIALIZED       1 | 
| 6245 | /* Like SD_INITIALIZED, but also mark the new decl as DECL_DECOMPOSITION_P.  */ | 
| 6246 | #define SD_DECOMPOSITION     2 | 
| 6247 | #define SD_DEFAULTED         3 | 
| 6248 | #define SD_DELETED           4 | 
| 6249 |  | 
| 6250 | /* Returns nonzero iff TYPE1 and TYPE2 are the same type, or if TYPE2 | 
| 6251 |    is derived from TYPE1, or if TYPE2 is a pointer (reference) to a | 
| 6252 |    class derived from the type pointed to (referred to) by TYPE1.  */ | 
| 6253 | #define same_or_base_type_p(TYPE1, TYPE2) \ | 
| 6254 |   comptypes ((TYPE1), (TYPE2), COMPARE_BASE) | 
| 6255 |  | 
| 6256 | /* These macros are used to access a TEMPLATE_PARM_INDEX.  */ | 
| 6257 | #define TEMPLATE_PARM_INDEX_CAST(NODE) \ | 
| 6258 |         ((template_parm_index*)TEMPLATE_PARM_INDEX_CHECK (NODE)) | 
| 6259 | #define TEMPLATE_PARM_IDX(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->index) | 
| 6260 | #define TEMPLATE_PARM_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->level) | 
| 6261 | #define TEMPLATE_PARM_DESCENDANTS(NODE) (TREE_CHAIN (TEMPLATE_PARM_INDEX_CHECK (NODE))) | 
| 6262 | #define TEMPLATE_PARM_ORIG_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->orig_level) | 
| 6263 | #define TEMPLATE_PARM_DECL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->decl) | 
| 6264 | #define TEMPLATE_PARM_PARAMETER_PACK(NODE) \ | 
| 6265 |   (TREE_LANG_FLAG_0 (TEMPLATE_PARM_INDEX_CHECK (NODE))) | 
| 6266 |  | 
| 6267 | /* These macros are for accessing the fields of TEMPLATE_TYPE_PARM, | 
| 6268 |    TEMPLATE_TEMPLATE_PARM and BOUND_TEMPLATE_TEMPLATE_PARM nodes.  */ | 
| 6269 | #define TEMPLATE_TYPE_PARM_INDEX(NODE)                                        \ | 
| 6270 |   (TYPE_VALUES_RAW (TREE_CHECK3 ((NODE), TEMPLATE_TYPE_PARM,                \ | 
| 6271 |                                  TEMPLATE_TEMPLATE_PARM,                \ | 
| 6272 |                                  BOUND_TEMPLATE_TEMPLATE_PARM))) | 
| 6273 | #define TEMPLATE_TYPE_IDX(NODE) \ | 
| 6274 |   (TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (NODE))) | 
| 6275 | #define TEMPLATE_TYPE_LEVEL(NODE) \ | 
| 6276 |   (TEMPLATE_PARM_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE))) | 
| 6277 | #define TEMPLATE_TYPE_ORIG_LEVEL(NODE) \ | 
| 6278 |   (TEMPLATE_PARM_ORIG_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE))) | 
| 6279 | #define TEMPLATE_TYPE_DESCENDANTS(NODE) \ | 
| 6280 |   (TEMPLATE_PARM_DESCENDANTS (TEMPLATE_TYPE_PARM_INDEX (NODE))) | 
| 6281 | #define TEMPLATE_TYPE_DECL(NODE) \ | 
| 6282 |   (TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (NODE))) | 
| 6283 | #define TEMPLATE_TYPE_PARAMETER_PACK(NODE) \ | 
| 6284 |   (TEMPLATE_PARM_PARAMETER_PACK (TEMPLATE_TYPE_PARM_INDEX (NODE))) | 
| 6285 |  | 
| 6286 | /* For a C++17 class deduction placeholder, the template it represents.  */ | 
| 6287 | #define CLASS_PLACEHOLDER_TEMPLATE(NODE) \ | 
| 6288 |   (DECL_INITIAL (TYPE_NAME (TEMPLATE_TYPE_PARM_CHECK (NODE)))) | 
| 6289 |  | 
| 6290 | /* True iff the template parameters of this TEMPLATE_TEMPLATE_PARM don't | 
| 6291 |    use any outer template parameters.  */ | 
| 6292 | #define TEMPLATE_TEMPLATE_PARM_SIMPLE_P(NODE) \ | 
| 6293 |   (TYPE_LANG_FLAG_5 (TEMPLATE_TEMPLATE_PARM_CHECK (NODE))) | 
| 6294 |  | 
| 6295 | /* Contexts in which auto deduction occurs. These flags are | 
| 6296 |    used to control diagnostics in do_auto_deduction.  */ | 
| 6297 |  | 
| 6298 | enum auto_deduction_context | 
| 6299 | { | 
| 6300 |   adc_unspecified,   /* Not given */ | 
| 6301 |   adc_variable_type, /* Variable initializer deduction */ | 
| 6302 |   adc_return_type,   /* Return type deduction */ | 
| 6303 |   adc_unify,         /* Template argument deduction */ | 
| 6304 |   adc_requirement,   /* Argument deduction constraint */ | 
| 6305 |   adc_decomp_type    /* Decomposition declaration initializer deduction */ | 
| 6306 | }; | 
| 6307 |  | 
| 6308 | /* True iff this TEMPLATE_TYPE_PARM represents decltype(auto).  */ | 
| 6309 | #define AUTO_IS_DECLTYPE(NODE) \ | 
| 6310 |   (TYPE_LANG_FLAG_5 (TEMPLATE_TYPE_PARM_CHECK (NODE))) | 
| 6311 |  | 
| 6312 | /* These constants can used as bit flags in the process of tree formatting. | 
| 6313 |  | 
| 6314 |    TFF_PLAIN_IDENTIFIER: unqualified part of a name. | 
| 6315 |    TFF_SCOPE: include the class and namespace scope of the name. | 
| 6316 |    TFF_CHASE_TYPEDEF: print the original type-id instead of the typedef-name. | 
| 6317 |    TFF_DECL_SPECIFIERS: print decl-specifiers. | 
| 6318 |    TFF_CLASS_KEY_OR_ENUM: precede a class-type name (resp. enum name) with | 
| 6319 |        a class-key (resp. `enum'). | 
| 6320 |    TFF_RETURN_TYPE: include function return type. | 
| 6321 |    TFF_FUNCTION_DEFAULT_ARGUMENTS: include function default parameter values. | 
| 6322 |    TFF_EXCEPTION_SPECIFICATION: show function exception specification. | 
| 6323 |    TFF_TEMPLATE_HEADER: show the template<...> header in a | 
| 6324 |        template-declaration. | 
| 6325 |    TFF_TEMPLATE_NAME: show only template-name. | 
| 6326 |    TFF_EXPR_IN_PARENS: parenthesize expressions. | 
| 6327 |    TFF_NO_FUNCTION_ARGUMENTS: don't show function arguments. | 
| 6328 |    TFF_UNQUALIFIED_NAME: do not print the qualifying scope of the | 
| 6329 |        top-level entity. | 
| 6330 |    TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments | 
| 6331 |        identical to their defaults. | 
| 6332 |    TFF_NO_TEMPLATE_BINDINGS: do not print information about the template | 
| 6333 |        arguments for a function template specialization. | 
| 6334 |    TFF_POINTER: we are printing a pointer type. | 
| 6335 |    TFF_XOBJ_FUNC: we are printing an explicit object member function's | 
| 6336 |        parameters.  */ | 
| 6337 |  | 
| 6338 | #define TFF_PLAIN_IDENTIFIER                        (0) | 
| 6339 | #define TFF_SCOPE                                (1) | 
| 6340 | #define TFF_CHASE_TYPEDEF                        (1 << 1) | 
| 6341 | #define TFF_DECL_SPECIFIERS                        (1 << 2) | 
| 6342 | #define TFF_CLASS_KEY_OR_ENUM                        (1 << 3) | 
| 6343 | #define TFF_RETURN_TYPE                                (1 << 4) | 
| 6344 | #define TFF_FUNCTION_DEFAULT_ARGUMENTS                (1 << 5) | 
| 6345 | #define TFF_EXCEPTION_SPECIFICATION                (1 << 6) | 
| 6346 | #define                         (1 << 7) | 
| 6347 | #define TFF_TEMPLATE_NAME                        (1 << 8) | 
| 6348 | #define TFF_EXPR_IN_PARENS                        (1 << 9) | 
| 6349 | #define TFF_NO_FUNCTION_ARGUMENTS                (1 << 10) | 
| 6350 | #define TFF_UNQUALIFIED_NAME                        (1 << 11) | 
| 6351 | #define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS        (1 << 12) | 
| 6352 | #define TFF_NO_TEMPLATE_BINDINGS                (1 << 13) | 
| 6353 | #define TFF_POINTER                                (1 << 14) | 
| 6354 | #define TFF_XOBJ_FUNC                                (1 << 15) | 
| 6355 |  | 
| 6356 | /* These constants can be used as bit flags to control strip_typedefs. | 
| 6357 |  | 
| 6358 |    STF_USER_VISIBLE: use heuristics to try to avoid stripping user-facing | 
| 6359 |        aliases of internal details.  This is intended for diagnostics, | 
| 6360 |        where it should (for example) give more useful "aka" types. | 
| 6361 |  | 
| 6362 |    STF_STRIP_DEPENDENT: allow the stripping of aliases with dependent | 
| 6363 |        template parameters, relying on code elsewhere to report any | 
| 6364 |        appropriate diagnostics. | 
| 6365 |  | 
| 6366 |    STF_KEEP_INJ_CLASS_NAME: don't strip injected-class-name typedefs | 
| 6367 |        because we're dealing with a non-coerced template argument. | 
| 6368 | */ | 
| 6369 | const unsigned int STF_USER_VISIBLE = 1U; | 
| 6370 | const unsigned int STF_STRIP_DEPENDENT = 1U << 1; | 
| 6371 | const unsigned int STF_KEEP_INJ_CLASS_NAME = 1U << 2; | 
| 6372 |  | 
| 6373 | /* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM | 
| 6374 |    node.  */ | 
| 6375 | #define TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL(NODE)        \ | 
| 6376 |   ((TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM)        \ | 
| 6377 |    ? TYPE_TI_TEMPLATE (NODE)                                \ | 
| 6378 |    : TYPE_NAME (TEMPLATE_TEMPLATE_PARM_CHECK (NODE))) | 
| 6379 |  | 
| 6380 | /* in lex.cc  */ | 
| 6381 |  | 
| 6382 | extern void init_reswords (void); | 
| 6383 |  | 
| 6384 | /* Various flags for the overloaded operator information.  */ | 
| 6385 | enum ovl_op_flags { | 
| 6386 |   OVL_OP_FLAG_NONE = 0,        /* Don't care.  */ | 
| 6387 |   OVL_OP_FLAG_UNARY = 1,        /* Is unary.  */ | 
| 6388 |   OVL_OP_FLAG_BINARY = 2,        /* Is binary.  */ | 
| 6389 |   OVL_OP_FLAG_AMBIARY = 3,        /* May be unary or binary.  */ | 
| 6390 |   OVL_OP_FLAG_ALLOC = 4,          /* operator new or delete.  */ | 
| 6391 |   OVL_OP_FLAG_DELETE = 1,        /* operator delete.  */ | 
| 6392 |   OVL_OP_FLAG_VEC = 2                /* vector new or delete.  */ | 
| 6393 | }; | 
| 6394 |  | 
| 6395 | /* Compressed operator codes.  Order is determined by operators.def | 
| 6396 |    and does not match that of tree_codes.  */ | 
| 6397 | enum ovl_op_code { | 
| 6398 |   OVL_OP_ERROR_MARK, | 
| 6399 |   OVL_OP_NOP_EXPR, | 
| 6400 | #define DEF_OPERATOR(NAME, CODE, MANGLING, FLAGS) OVL_OP_##CODE, | 
| 6401 | #define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING) /* NOTHING */ | 
| 6402 | #include "operators.def" | 
| 6403 |   OVL_OP_MAX | 
| 6404 | }; | 
| 6405 |  | 
| 6406 | /* Make sure it fits in lang_decl_fn::ovl_op_code.  */ | 
| 6407 | STATIC_ASSERT (OVL_OP_MAX < (1 << 6)); | 
| 6408 |  | 
| 6409 | struct GTY(()) ovl_op_info_t { | 
| 6410 |   /* The IDENTIFIER_NODE for the operator.  */ | 
| 6411 |   tree identifier; | 
| 6412 |   /* The name of the operator.  */ | 
| 6413 |   const char *name; | 
| 6414 |   /* The mangled name of the operator.  */ | 
| 6415 |   const char *mangled_name; | 
| 6416 |   /* The (regular) tree code.  */ | 
| 6417 |   enum tree_code tree_code : 16; | 
| 6418 |   /* The (compressed) operator code.  */ | 
| 6419 |   enum ovl_op_code ovl_op_code : 8; | 
| 6420 |   /* The ovl_op_flags of the operator */ | 
| 6421 |   unsigned flags : 8; | 
| 6422 | }; | 
| 6423 |  | 
| 6424 | /* Overloaded operator info indexed by ass_op_p & ovl_op_code.  */ | 
| 6425 | extern GTY(()) ovl_op_info_t ovl_op_info[2][OVL_OP_MAX]; | 
| 6426 | /* Mapping from tree_codes to ovl_op_codes.  */ | 
| 6427 | extern GTY(()) unsigned char ovl_op_mapping[MAX_TREE_CODES]; | 
| 6428 | /* Mapping for ambi-ary operators from the binary to the unary.  */ | 
| 6429 | extern GTY(()) unsigned char ovl_op_alternate[OVL_OP_MAX]; | 
| 6430 |  | 
| 6431 | /* Given an ass_op_p boolean and a tree code, return a pointer to its | 
| 6432 |    overloaded operator info.  Tree codes for non-overloaded operators | 
| 6433 |    map to the error-operator.  */ | 
| 6434 | #define OVL_OP_INFO(IS_ASS_P, TREE_CODE)                        \ | 
| 6435 |   (&ovl_op_info[(IS_ASS_P) != 0][ovl_op_mapping[(TREE_CODE)]]) | 
| 6436 | /* Overloaded operator info for an identifier for which | 
| 6437 |    IDENTIFIER_OVL_OP_P is true.  */ | 
| 6438 | #define IDENTIFIER_OVL_OP_INFO(NODE) \ | 
| 6439 |   (&ovl_op_info[IDENTIFIER_KIND_BIT_0 (NODE)][IDENTIFIER_CP_INDEX (NODE)]) | 
| 6440 | #define IDENTIFIER_OVL_OP_FLAGS(NODE) \ | 
| 6441 |   (IDENTIFIER_OVL_OP_INFO (NODE)->flags) | 
| 6442 |  | 
| 6443 | inline tree ovl_op_identifier (bool isass, tree_code code) | 
| 6444 | { return OVL_OP_INFO(isass, code)->identifier; } | 
| 6445 | inline tree ovl_op_identifier (tree_code code) { return ovl_op_identifier (isass: false, code); } | 
| 6446 | #define assign_op_identifier (ovl_op_info[true][OVL_OP_NOP_EXPR].identifier) | 
| 6447 | #define call_op_identifier (ovl_op_info[false][OVL_OP_CALL_EXPR].identifier) | 
| 6448 |  | 
| 6449 | /* A type-qualifier, or bitmask therefore, using the TYPE_QUAL | 
| 6450 |    constants.  */ | 
| 6451 |  | 
| 6452 | typedef int cp_cv_quals; | 
| 6453 |  | 
| 6454 | /* Non-static member functions have an optional virt-specifier-seq. | 
| 6455 |    There is a VIRT_SPEC value for each virt-specifier. | 
| 6456 |    They can be combined by bitwise-or to form the complete set of | 
| 6457 |    virt-specifiers for a member function.  */ | 
| 6458 | enum virt_specifier | 
| 6459 |   { | 
| 6460 |     VIRT_SPEC_UNSPECIFIED = 0x0, | 
| 6461 |     VIRT_SPEC_FINAL       = 0x1, | 
| 6462 |     VIRT_SPEC_OVERRIDE    = 0x2 | 
| 6463 |   }; | 
| 6464 |  | 
| 6465 | /* A type-qualifier, or bitmask therefore, using the VIRT_SPEC | 
| 6466 |    constants.  */ | 
| 6467 |  | 
| 6468 | typedef int cp_virt_specifiers; | 
| 6469 |  | 
| 6470 | /* Wherever there is a function-cv-qual, there could also be a ref-qualifier: | 
| 6471 |  | 
| 6472 |    [dcl.fct] | 
| 6473 |    The return type, the parameter-type-list, the ref-qualifier, and | 
| 6474 |    the cv-qualifier-seq, but not the default arguments or the exception | 
| 6475 |    specification, are part of the function type. | 
| 6476 |  | 
| 6477 |    REF_QUAL_NONE    Ordinary member function with no ref-qualifier | 
| 6478 |    REF_QUAL_LVALUE  Member function with the &-ref-qualifier | 
| 6479 |    REF_QUAL_RVALUE  Member function with the &&-ref-qualifier */ | 
| 6480 |  | 
| 6481 | enum cp_ref_qualifier { | 
| 6482 |   REF_QUAL_NONE = 0, | 
| 6483 |   REF_QUAL_LVALUE = 1, | 
| 6484 |   REF_QUAL_RVALUE = 2 | 
| 6485 | }; | 
| 6486 |  | 
| 6487 | /* A storage class.  */ | 
| 6488 |  | 
| 6489 | enum cp_storage_class { | 
| 6490 |   /* sc_none must be zero so that zeroing a cp_decl_specifier_seq | 
| 6491 |      sets the storage_class field to sc_none.  */ | 
| 6492 |   sc_none = 0, | 
| 6493 |   sc_auto, | 
| 6494 |   sc_register, | 
| 6495 |   sc_static, | 
| 6496 |   sc_extern, | 
| 6497 |   sc_mutable | 
| 6498 | }; | 
| 6499 |  | 
| 6500 | /* An individual decl-specifier.  This is used to index the array of | 
| 6501 |    locations for the declspecs in struct cp_decl_specifier_seq | 
| 6502 |    below. | 
| 6503 |    A subset of these enums also corresponds to elements of | 
| 6504 |    cp_parser_set_decl_spec_type:decl_spec_names in parser.cc.  */ | 
| 6505 |  | 
| 6506 | enum cp_decl_spec { | 
| 6507 |   ds_first, | 
| 6508 |   ds_signed = ds_first, /* Index of first element of decl_spec_names.  */ | 
| 6509 |   ds_unsigned, | 
| 6510 |   ds_short, | 
| 6511 |   ds_long, | 
| 6512 |   ds_const, | 
| 6513 |   ds_volatile, | 
| 6514 |   ds_restrict, | 
| 6515 |   ds_inline, | 
| 6516 |   ds_virtual, | 
| 6517 |   ds_explicit, | 
| 6518 |   ds_friend, | 
| 6519 |   ds_typedef, | 
| 6520 |   ds_alias, | 
| 6521 |   ds_constexpr, | 
| 6522 |   ds_complex, | 
| 6523 |   ds_constinit, | 
| 6524 |   ds_consteval, | 
| 6525 |   ds_this, /* Index of last element of decl_spec_names.  */ | 
| 6526 |   ds_thread, | 
| 6527 |   ds_type_spec, | 
| 6528 |   ds_redefined_builtin_type_spec, | 
| 6529 |   ds_attribute, | 
| 6530 |   ds_std_attribute, | 
| 6531 |   ds_storage_class, | 
| 6532 |   ds_long_long, | 
| 6533 |   ds_concept, | 
| 6534 |   ds_last /* This enumerator must always be the last one.  */ | 
| 6535 | }; | 
| 6536 |  | 
| 6537 | /* A decl-specifier-seq.  */ | 
| 6538 |  | 
| 6539 | struct cp_decl_specifier_seq { | 
| 6540 |   /* An array of locations for the declaration sepecifiers, indexed by | 
| 6541 |      enum cp_decl_spec_word.  */ | 
| 6542 |   location_t locations[ds_last]; | 
| 6543 |   /* The primary type, if any, given by the decl-specifier-seq. | 
| 6544 |      Modifiers, like "short", "const", and "unsigned" are not | 
| 6545 |      reflected here.  This field will be a TYPE, unless a typedef-name | 
| 6546 |      was used, in which case it will be a TYPE_DECL.  */ | 
| 6547 |   tree type; | 
| 6548 |   /* The attributes, if any, provided with the specifier sequence.  */ | 
| 6549 |   tree attributes; | 
| 6550 |   /* The c++11 attributes that follows the type specifier.  */ | 
| 6551 |   tree std_attributes; | 
| 6552 |   /* If non-NULL, a built-in type that the user attempted to redefine | 
| 6553 |      to some other type.  */ | 
| 6554 |   tree redefined_builtin_type; | 
| 6555 |   /* The explicit-specifier, if any.  */ | 
| 6556 |   tree explicit_specifier; | 
| 6557 |   /* The storage class specified -- or sc_none if no storage class was | 
| 6558 |      explicitly specified.  */ | 
| 6559 |   cp_storage_class storage_class; | 
| 6560 |   /* For the __intN declspec, this stores the index into the int_n_* arrays.  */ | 
| 6561 |   int int_n_idx; | 
| 6562 |   /* True iff TYPE_SPEC defines a class or enum.  */ | 
| 6563 |   BOOL_BITFIELD type_definition_p : 1; | 
| 6564 |   /* True iff multiple types were (erroneously) specified for this | 
| 6565 |      decl-specifier-seq.  */ | 
| 6566 |   BOOL_BITFIELD multiple_types_p : 1; | 
| 6567 |   /* True iff multiple storage classes were (erroneously) specified | 
| 6568 |      for this decl-specifier-seq or a combination of a storage class | 
| 6569 |      with a typedef specifier.  */ | 
| 6570 |   BOOL_BITFIELD conflicting_specifiers_p : 1; | 
| 6571 |   /* True iff at least one decl-specifier was found.  */ | 
| 6572 |   BOOL_BITFIELD any_specifiers_p : 1; | 
| 6573 |   /* True iff at least one type-specifier was found.  */ | 
| 6574 |   BOOL_BITFIELD any_type_specifiers_p : 1; | 
| 6575 |   /* True iff "int" was explicitly provided.  */ | 
| 6576 |   BOOL_BITFIELD explicit_int_p : 1; | 
| 6577 |   /* True iff "__intN" was explicitly provided.  */ | 
| 6578 |   BOOL_BITFIELD explicit_intN_p : 1; | 
| 6579 |   /* True iff "char" was explicitly provided.  */ | 
| 6580 |   BOOL_BITFIELD explicit_char_p : 1; | 
| 6581 |   /* True iff ds_thread is set for __thread, not thread_local.  */ | 
| 6582 |   BOOL_BITFIELD gnu_thread_keyword_p : 1; | 
| 6583 |   /* True iff the type is a decltype.  */ | 
| 6584 |   BOOL_BITFIELD decltype_p : 1; | 
| 6585 |   /* True iff the alternate "__intN__" form of the __intN type has been | 
| 6586 |      used.  */ | 
| 6587 |   BOOL_BITFIELD int_n_alt: 1; | 
| 6588 | }; | 
| 6589 |  | 
| 6590 | /* The various kinds of declarators.  */ | 
| 6591 |  | 
| 6592 | enum cp_declarator_kind { | 
| 6593 |   cdk_id, | 
| 6594 |   cdk_function, | 
| 6595 |   cdk_array, | 
| 6596 |   cdk_pointer, | 
| 6597 |   cdk_reference, | 
| 6598 |   cdk_ptrmem, | 
| 6599 |   cdk_decomp, | 
| 6600 |   cdk_error | 
| 6601 | }; | 
| 6602 |  | 
| 6603 | /* A declarator.  */ | 
| 6604 |  | 
| 6605 | typedef struct cp_declarator cp_declarator; | 
| 6606 |  | 
| 6607 | typedef struct cp_parameter_declarator cp_parameter_declarator; | 
| 6608 |  | 
| 6609 | /* A parameter, before it has been semantically analyzed.  */ | 
| 6610 | struct cp_parameter_declarator { | 
| 6611 |   /* The next parameter, or NULL_TREE if none.  */ | 
| 6612 |   cp_parameter_declarator *next; | 
| 6613 |   /* The decl-specifiers-seq for the parameter.  */ | 
| 6614 |   cp_decl_specifier_seq decl_specifiers; | 
| 6615 |   /* The declarator for the parameter.  */ | 
| 6616 |   cp_declarator *declarator; | 
| 6617 |   /* The default-argument expression, or NULL_TREE, if none.  */ | 
| 6618 |   tree default_argument; | 
| 6619 |   /* True iff this is a template parameter pack.  */ | 
| 6620 |   bool template_parameter_pack_p; | 
| 6621 |   /* Location within source.  */ | 
| 6622 |   location_t loc; | 
| 6623 | }; | 
| 6624 |  | 
| 6625 | /* A declarator.  */ | 
| 6626 | struct cp_declarator { | 
| 6627 |   /* The kind of declarator.  */ | 
| 6628 |   ENUM_BITFIELD (cp_declarator_kind) kind : 4; | 
| 6629 |   /* Whether we parsed an ellipsis (`...') just before the declarator, | 
| 6630 |      to indicate this is a parameter pack.  */ | 
| 6631 |   BOOL_BITFIELD parameter_pack_p : 1; | 
| 6632 |   /* If this declarator is parenthesized, this the open-paren.  It is | 
| 6633 |      UNKNOWN_LOCATION when not parenthesized.  */ | 
| 6634 |   location_t parenthesized; | 
| 6635 |   /* Currently only set for cdk_id, cdk_decomp and cdk_function.  */ | 
| 6636 |   location_t id_loc; | 
| 6637 |   /* If this declarator is part of an init-declarator, the location of the | 
| 6638 |      initializer.  */ | 
| 6639 |   location_t init_loc; | 
| 6640 |   /* GNU Attributes that apply to this declarator.  If the declarator | 
| 6641 |      is a pointer or a reference, these attribute apply to the type | 
| 6642 |      pointed to.  */ | 
| 6643 |   tree attributes; | 
| 6644 |   /* Standard C++11 attributes that apply to this declarator.  If the | 
| 6645 |      declarator is a pointer or a reference, these attributes apply | 
| 6646 |      to the pointer, rather than to the type pointed to.  */ | 
| 6647 |   tree std_attributes; | 
| 6648 |   /* For all but cdk_id, cdk_decomp and cdk_error, the contained declarator. | 
| 6649 |      For cdk_id, cdk_decomp and cdk_error, guaranteed to be NULL.  */ | 
| 6650 |   cp_declarator *declarator; | 
| 6651 |   union { | 
| 6652 |     /* For identifiers.  */ | 
| 6653 |     struct { | 
| 6654 |       /* If non-NULL, the qualifying scope (a NAMESPACE_DECL or | 
| 6655 |          *_TYPE) for this identifier.  */ | 
| 6656 |       tree qualifying_scope; | 
| 6657 |       /* The unqualified name of the entity -- an IDENTIFIER_NODE, | 
| 6658 |          BIT_NOT_EXPR, or TEMPLATE_ID_EXPR.  */ | 
| 6659 |       tree unqualified_name; | 
| 6660 |       /* If this is the name of a function, what kind of special | 
| 6661 |          function (if any).  */ | 
| 6662 |       special_function_kind sfk; | 
| 6663 |     } id; | 
| 6664 |     /* For functions.  */ | 
| 6665 |     struct { | 
| 6666 |       /* The parameters to the function as a TREE_LIST of decl/default.  */ | 
| 6667 |       tree parameters; | 
| 6668 |       /* The cv-qualifiers for the function.  */ | 
| 6669 |       cp_cv_quals qualifiers; | 
| 6670 |       /* The virt-specifiers for the function.  */ | 
| 6671 |       cp_virt_specifiers virt_specifiers; | 
| 6672 |       /* The ref-qualifier for the function.  */ | 
| 6673 |       cp_ref_qualifier ref_qualifier; | 
| 6674 |       /* The transaction-safety qualifier for the function.  */ | 
| 6675 |       tree tx_qualifier; | 
| 6676 |       /* The exception-specification for the function.  */ | 
| 6677 |       tree exception_specification; | 
| 6678 |       /* The late-specified return type, if any.  */ | 
| 6679 |       tree late_return_type; | 
| 6680 |       /* The trailing requires-clause, if any.  */ | 
| 6681 |       tree requires_clause; | 
| 6682 |       location_t parens_loc; | 
| 6683 |     } function; | 
| 6684 |     /* For arrays.  */ | 
| 6685 |     struct { | 
| 6686 |       /* The bounds to the array.  */ | 
| 6687 |       tree bounds; | 
| 6688 |     } array; | 
| 6689 |     /* For cdk_pointer and cdk_ptrmem.  */ | 
| 6690 |     struct { | 
| 6691 |       /* The cv-qualifiers for the pointer.  */ | 
| 6692 |       cp_cv_quals qualifiers; | 
| 6693 |       /* For cdk_ptrmem, the class type containing the member.  */ | 
| 6694 |       tree class_type; | 
| 6695 |     } pointer; | 
| 6696 |     /* For cdk_reference */ | 
| 6697 |     struct { | 
| 6698 |       /* The cv-qualifiers for the reference.  These qualifiers are | 
| 6699 |          only used to diagnose ill-formed code.  */ | 
| 6700 |       cp_cv_quals qualifiers; | 
| 6701 |       /* Whether this is an rvalue reference */ | 
| 6702 |       bool rvalue_ref; | 
| 6703 |     } reference; | 
| 6704 |   } u; | 
| 6705 | }; | 
| 6706 |  | 
| 6707 | /* A level of template instantiation.  */ | 
| 6708 | struct GTY((chain_next ("%h.next" ))) tinst_level { | 
| 6709 |   /* The immediately deeper level in the chain.  */ | 
| 6710 |   struct tinst_level *next; | 
| 6711 |  | 
| 6712 |   /* The original node.  TLDCL can be a DECL (for a function or static | 
| 6713 |      data member), a TYPE (for a class), depending on what we were | 
| 6714 |      asked to instantiate, or a TREE_LIST with the template as PURPOSE | 
| 6715 |      and the template args as VALUE, if we are substituting for | 
| 6716 |      overload resolution.  In all these cases, TARGS is NULL. | 
| 6717 |      However, to avoid creating TREE_LIST objects for substitutions if | 
| 6718 |      we can help, we store PURPOSE and VALUE in TLDCL and TARGS, | 
| 6719 |      respectively.  So TLDCL stands for TREE_LIST or DECL (the | 
| 6720 |      template is a DECL too), whereas TARGS stands for the template | 
| 6721 |      arguments.  */ | 
| 6722 |   tree tldcl, targs; | 
| 6723 |  | 
| 6724 |   /* For modules we need to know (a) the modules on the path of | 
| 6725 |      instantiation and (b) the transitive imports along that path. | 
| 6726 |      Note that these two bitmaps may be inherited from NEXT, if this | 
| 6727 |      decl is in the same module as NEXT (or has no new information).  */ | 
| 6728 |   bitmap path; | 
| 6729 |   bitmap visible; | 
| 6730 |  | 
| 6731 |  private: | 
| 6732 |   /* Return TRUE iff the original node is a split list.  */ | 
| 6733 |   bool split_list_p () const { return targs; } | 
| 6734 |  | 
| 6735 |   /* Return TRUE iff the original node is a TREE_LIST object.  */ | 
| 6736 |   bool tree_list_p () const | 
| 6737 |   { | 
| 6738 |     return !split_list_p () && TREE_CODE (tldcl) == TREE_LIST; | 
| 6739 |   } | 
| 6740 |  | 
| 6741 |   /* Return TRUE iff the original node is not a list, split or not.  */ | 
| 6742 |   bool not_list_p () const | 
| 6743 |   { | 
| 6744 |     return !split_list_p () && !tree_list_p (); | 
| 6745 |   } | 
| 6746 |  | 
| 6747 |   /* Convert (in place) the original node from a split list to a | 
| 6748 |      TREE_LIST.  */ | 
| 6749 |   tree to_list (); | 
| 6750 |  | 
| 6751 |  public: | 
| 6752 |   /* Release storage for OBJ and node, if it's a TREE_LIST.  */ | 
| 6753 |   static void free (tinst_level *obj); | 
| 6754 |  | 
| 6755 |   /* Return TRUE iff the original node is a list, split or not.  */ | 
| 6756 |   bool list_p () const { return !not_list_p (); } | 
| 6757 |  | 
| 6758 |   /* Return the original node; if it's a split list, make it a | 
| 6759 |      TREE_LIST first, so that it can be returned as a single tree | 
| 6760 |      object.  */ | 
| 6761 |   tree get_node () { | 
| 6762 |     if (!split_list_p ()) return tldcl; | 
| 6763 |     else return to_list (); | 
| 6764 |   } | 
| 6765 |  | 
| 6766 |   /* Return the original node if it's a DECL or a TREE_LIST, but do | 
| 6767 |      NOT convert a split list to a TREE_LIST: return NULL instead.  */ | 
| 6768 |   tree maybe_get_node () const { | 
| 6769 |     if (!split_list_p ()) return tldcl; | 
| 6770 |     else return NULL_TREE; | 
| 6771 |   } | 
| 6772 |  | 
| 6773 |   /* The location where the template is instantiated.  */ | 
| 6774 |   location_t locus; | 
| 6775 |  | 
| 6776 |   /* errorcount + sorrycount when we pushed this level.  If the value | 
| 6777 |      overflows, it will always seem like we currently have more errors, so we | 
| 6778 |      will limit template recursion even from non-erroneous templates.  In a TU | 
| 6779 |      with over 32k errors, that's fine.  */ | 
| 6780 |   unsigned short errors : 15; | 
| 6781 |  | 
| 6782 |   /* set in pop_tinst_level if there have been errors since we pushed.  */ | 
| 6783 |   bool had_errors : 1; | 
| 6784 |  | 
| 6785 |   /* Count references to this object.  If refcount reaches | 
| 6786 |      refcount_infinity value, we don't increment or decrement the | 
| 6787 |      refcount anymore, as the refcount isn't accurate anymore. | 
| 6788 |      The object can be still garbage collected if unreferenced from | 
| 6789 |      anywhere, which might keep referenced objects referenced longer than | 
| 6790 |      otherwise necessary.  Hitting the infinity is rare though.  */ | 
| 6791 |   unsigned short refcount; | 
| 6792 |  | 
| 6793 |   /* Infinity value for the above refcount.  */ | 
| 6794 |   static const unsigned short refcount_infinity = (unsigned short) ~0; | 
| 6795 | }; | 
| 6796 |  | 
| 6797 | /* BUILT_IN_FRONTEND function codes.  */ | 
| 6798 | enum cp_built_in_function { | 
| 6799 |   CP_BUILT_IN_IS_CONSTANT_EVALUATED, | 
| 6800 |   CP_BUILT_IN_INTEGER_PACK, | 
| 6801 |   CP_BUILT_IN_IS_CORRESPONDING_MEMBER, | 
| 6802 |   CP_BUILT_IN_IS_POINTER_INTERCONVERTIBLE_WITH_CLASS, | 
| 6803 |   CP_BUILT_IN_SOURCE_LOCATION, | 
| 6804 |   CP_BUILT_IN_LAST | 
| 6805 | }; | 
| 6806 |  | 
| 6807 | bool decl_spec_seq_has_spec_p (const cp_decl_specifier_seq *, cp_decl_spec); | 
| 6808 |  | 
| 6809 | /* Return the type of the `this' parameter of FNTYPE.  */ | 
| 6810 |  | 
| 6811 | inline tree | 
| 6812 | type_of_this_parm (const_tree fntype) | 
| 6813 | { | 
| 6814 |   function_args_iterator iter; | 
| 6815 |   gcc_assert (TREE_CODE (fntype) == METHOD_TYPE); | 
| 6816 |   function_args_iter_init (i: &iter, fntype); | 
| 6817 |   return function_args_iter_cond (i: &iter); | 
| 6818 | } | 
| 6819 |  | 
| 6820 | /* Return the class of the `this' parameter of FNTYPE.  */ | 
| 6821 |  | 
| 6822 | inline tree | 
| 6823 | class_of_this_parm (const_tree fntype) | 
| 6824 | { | 
| 6825 |   return TREE_TYPE (type_of_this_parm (fntype)); | 
| 6826 | } | 
| 6827 |  | 
| 6828 | /* A parameter list indicating for a function with no parameters, | 
| 6829 |    e.g  "int f(void)".  */ | 
| 6830 | extern cp_parameter_declarator *no_parameters; | 
| 6831 |  | 
| 6832 | /* Various dump ids.  */ | 
| 6833 | extern int class_dump_id; | 
| 6834 | extern int module_dump_id; | 
| 6835 | extern int raw_dump_id; | 
| 6836 | extern int coro_dump_id; | 
| 6837 | extern int tinst_dump_id; | 
| 6838 |  | 
| 6839 | /* Whether the current context is manifestly constant-evaluated. | 
| 6840 |    Used by the constexpr machinery to control folding of | 
| 6841 |    __builtin_is_constant_evaluated.  */ | 
| 6842 |  | 
| 6843 | enum class mce_value | 
| 6844 | { | 
| 6845 |   /* Unknown, so treat __builtin_is_constant_evaluated as non-constant.  */ | 
| 6846 |   mce_unknown = 0, | 
| 6847 |   /* Fold it to true.  */ | 
| 6848 |   mce_true = 1, | 
| 6849 |   /* Fold it to false.  Primarily used during cp_fold_function and | 
| 6850 |      cp_fully_fold_init.  */ | 
| 6851 |   mce_false = -1, | 
| 6852 | }; | 
| 6853 | constexpr mce_value mce_unknown = mce_value::mce_unknown; | 
| 6854 | constexpr mce_value mce_true = mce_value::mce_true; | 
| 6855 | constexpr mce_value mce_false = mce_value::mce_false; | 
| 6856 |  | 
| 6857 | /* in call.cc */ | 
| 6858 | extern bool check_dtor_name                        (tree, tree); | 
| 6859 | int magic_varargs_p                                (tree); | 
| 6860 |  | 
| 6861 | extern tree build_conditional_expr                (const op_location_t &, | 
| 6862 |                                                  tree, tree, tree, | 
| 6863 |                                                  tsubst_flags_t); | 
| 6864 | extern tree build_addr_func                        (tree, tsubst_flags_t); | 
| 6865 | extern void set_flags_from_callee                (tree); | 
| 6866 | extern tree build_call_a                        (tree, int, tree*); | 
| 6867 | extern tree build_call_n                        (tree, int, ...); | 
| 6868 | extern bool null_ptr_cst_p                        (tree); | 
| 6869 | extern bool null_member_pointer_value_p                (tree); | 
| 6870 | extern bool sufficient_parms_p                        (const_tree); | 
| 6871 | extern tree type_decays_to                        (tree); | 
| 6872 | extern tree                         (tree); | 
| 6873 | extern tree build_trivial_dtor_call                (tree, bool = false); | 
| 6874 | extern tristate ref_conv_binds_to_temporary        (tree, tree, bool = false); | 
| 6875 | extern unsigned HOST_WIDE_INT count_ctor_elements (tree); | 
| 6876 | extern tree build_user_type_conversion                (tree, tree, int, | 
| 6877 |                                                  tsubst_flags_t); | 
| 6878 | extern tree build_new_function_call                (tree, vec<tree, va_gc> **, | 
| 6879 |                                                  tsubst_flags_t); | 
| 6880 | extern tree build_operator_new_call                (tree, vec<tree, va_gc> **, | 
| 6881 |                                                  tree *, tree *, tree, tree, | 
| 6882 |                                                  tree *, tsubst_flags_t); | 
| 6883 | extern tree build_new_method_call                (tree, tree, | 
| 6884 |                                                  vec<tree, va_gc> **, tree, | 
| 6885 |                                                  int, tree *, tsubst_flags_t); | 
| 6886 | extern tree build_special_member_call                (tree, tree, | 
| 6887 |                                                  vec<tree, va_gc> **, | 
| 6888 |                                                  tree, int, tsubst_flags_t); | 
| 6889 | extern tree build_new_op                        (const op_location_t &, | 
| 6890 |                                                  enum tree_code, | 
| 6891 |                                                  int, tree, tree, tree, tree, | 
| 6892 |                                                  tree *, tsubst_flags_t); | 
| 6893 | /* Wrapper that leaves out the usually-null op3 and overload parms.  */ | 
| 6894 | inline tree build_new_op (const op_location_t &loc, enum tree_code code, | 
| 6895 |                           int flags, tree arg1, tree arg2, | 
| 6896 |                           tsubst_flags_t complain) | 
| 6897 | { | 
| 6898 |   return build_new_op (loc, code, flags, arg1, arg2, NULL_TREE, NULL_TREE, | 
| 6899 |                        NULL, complain); | 
| 6900 | } | 
| 6901 | extern tree keep_unused_object_arg                (tree, tree, tree); | 
| 6902 | extern tree build_op_call                        (tree, vec<tree, va_gc> **, | 
| 6903 |                                                  tsubst_flags_t); | 
| 6904 | extern tree build_op_subscript                        (const op_location_t &, tree, | 
| 6905 |                                                  vec<tree, va_gc> **, tree *, | 
| 6906 |                                                  tsubst_flags_t); | 
| 6907 | extern bool aligned_allocation_fn_p                (tree); | 
| 6908 | extern tree destroying_delete_p                        (tree); | 
| 6909 | extern bool usual_deallocation_fn_p                (tree); | 
| 6910 | extern tree build_op_delete_call                (enum tree_code, tree, tree, | 
| 6911 |                                                  bool, tree, tree, | 
| 6912 |                                                  tsubst_flags_t); | 
| 6913 | extern tree build_coroutine_op_delete_call        (enum tree_code, tree, tree, | 
| 6914 |                                                  bool, tree, tree, | 
| 6915 |                                                  tsubst_flags_t complain); | 
| 6916 | extern bool can_convert                                (tree, tree, tsubst_flags_t); | 
| 6917 | extern bool can_convert_standard                (tree, tree, tsubst_flags_t); | 
| 6918 | extern bool can_convert_arg                        (tree, tree, tree, int, | 
| 6919 |                                                  tsubst_flags_t); | 
| 6920 | extern bool can_convert_arg_bad                        (tree, tree, tree, int, | 
| 6921 |                                                  tsubst_flags_t); | 
| 6922 | extern int conv_flags                                (int, int, tree, tree, int); | 
| 6923 | extern struct conversion * good_conversion        (tree, tree, tree, int, tsubst_flags_t); | 
| 6924 | extern location_t get_fndecl_argument_location  (tree, int); | 
| 6925 | extern void complain_about_bad_argument        (location_t arg_loc, | 
| 6926 |                                                  tree from_type, tree to_type, | 
| 6927 |                                                  tree fndecl, int parmnum); | 
| 6928 | extern void maybe_inform_about_fndecl_for_bogus_argument_init (tree, int, | 
| 6929 |                                                                const char * = nullptr); | 
| 6930 | extern tree perform_dguide_overload_resolution        (tree, const vec<tree, va_gc> *, | 
| 6931 |                                                  tsubst_flags_t); | 
| 6932 |  | 
| 6933 |  | 
| 6934 | /* A class for recording information about access failures (e.g. private | 
| 6935 |    fields), so that we can potentially supply a fix-it hint about | 
| 6936 |    an accessor (from a context in which the constness of the object | 
| 6937 |    is known).  */ | 
| 6938 |  | 
| 6939 | class access_failure_info | 
| 6940 | { | 
| 6941 |  public: | 
| 6942 |   access_failure_info () : m_was_inaccessible (false), | 
| 6943 |     m_basetype_path (NULL_TREE), | 
| 6944 |     m_decl (NULL_TREE), m_diag_decl (NULL_TREE) {} | 
| 6945 |  | 
| 6946 |   void record_access_failure (tree basetype_path, tree decl, tree diag_decl); | 
| 6947 |  | 
| 6948 |   bool was_inaccessible_p () const { return m_was_inaccessible; } | 
| 6949 |   tree get_decl () const { return m_decl; } | 
| 6950 |   tree get_diag_decl () const { return m_diag_decl; } | 
| 6951 |   tree get_any_accessor (bool const_p) const; | 
| 6952 |   void maybe_suggest_accessor (bool const_p) const; | 
| 6953 |   static void add_fixit_hint (rich_location *richloc, tree accessor); | 
| 6954 |  | 
| 6955 |  private: | 
| 6956 |   bool m_was_inaccessible; | 
| 6957 |   tree m_basetype_path; | 
| 6958 |   tree m_decl; | 
| 6959 |   tree m_diag_decl; | 
| 6960 | }; | 
| 6961 |  | 
| 6962 | extern void complain_about_access                (tree, tree, tree, bool, | 
| 6963 |                                                  access_kind); | 
| 6964 | extern void push_defarg_context                        (tree); | 
| 6965 | extern void pop_defarg_context                        (void); | 
| 6966 | extern tree convert_default_arg                        (tree, tree, tree, int, | 
| 6967 |                                                  tsubst_flags_t); | 
| 6968 | extern tree convert_arg_to_ellipsis                (tree, tsubst_flags_t); | 
| 6969 | extern tree build_x_va_arg                        (location_t, tree, tree); | 
| 6970 | extern tree cxx_type_promotes_to                (tree); | 
| 6971 | extern tree type_passed_as                        (tree); | 
| 6972 | extern tree convert_for_arg_passing                (tree, tree, tsubst_flags_t); | 
| 6973 | extern bool is_properly_derived_from                (tree, tree); | 
| 6974 | extern tree initialize_reference                (tree, tree, int, | 
| 6975 |                                                  tsubst_flags_t); | 
| 6976 | extern tree extend_ref_init_temps                (tree, tree, | 
| 6977 |                                                  vec<tree, va_gc>**, | 
| 6978 |                                                  tree * = NULL); | 
| 6979 | extern tree make_temporary_var_for_ref_to_temp        (tree, tree); | 
| 6980 | extern bool type_has_extended_temps                (tree); | 
| 6981 | extern tree strip_top_quals                        (tree); | 
| 6982 | extern bool reference_related_p                        (tree, tree); | 
| 6983 | extern bool reference_compatible_p                (tree, tree); | 
| 6984 | extern int remaining_arguments                        (tree); | 
| 6985 | extern tree build_implicit_conv_flags                (tree, tree, int); | 
| 6986 | extern tree perform_implicit_conversion                (tree, tree, tsubst_flags_t); | 
| 6987 | extern tree perform_implicit_conversion_flags        (tree, tree, tsubst_flags_t, int); | 
| 6988 | extern tree build_converted_constant_expr        (tree, tree, tsubst_flags_t); | 
| 6989 | extern tree build_converted_constant_bool_expr        (tree, tsubst_flags_t); | 
| 6990 | extern tree perform_direct_initialization_if_possible (tree, tree, bool, | 
| 6991 |                                                        tsubst_flags_t); | 
| 6992 | extern vec<tree,va_gc> *resolve_args (vec<tree,va_gc>*, tsubst_flags_t); | 
| 6993 | extern tree in_charge_arg_for_name                (tree); | 
| 6994 | extern bool in_immediate_context                (); | 
| 6995 | extern bool immediate_invocation_p                (tree); | 
| 6996 | extern tree build_cxx_call                        (tree, int, tree *, | 
| 6997 |                                                  tsubst_flags_t, | 
| 6998 |                                                  tree = NULL_TREE); | 
| 6999 | extern bool is_std_init_list                        (tree); | 
| 7000 | extern bool is_list_ctor                        (tree); | 
| 7001 | extern void validate_conversion_obstack                (void); | 
| 7002 | extern void mark_versions_used                        (tree); | 
| 7003 | extern int unsafe_return_slot_p                        (tree); | 
| 7004 | extern bool unsafe_copy_elision_p                (tree, tree); | 
| 7005 | extern bool make_safe_copy_elision                (tree, tree); | 
| 7006 | extern bool cp_handle_deprecated_or_unavailable (tree, tsubst_flags_t = tf_warning_or_error); | 
| 7007 | extern void cp_warn_deprecated_use_scopes        (tree); | 
| 7008 | extern tree get_function_version_dispatcher        (tree); | 
| 7009 | extern bool any_template_arguments_need_structural_equality_p (tree); | 
| 7010 | extern void maybe_show_nonconverting_candidate        (tree, tree, tree, int); | 
| 7011 | extern bool conv_binds_to_reference_parm_p        (tree, tree); | 
| 7012 |  | 
| 7013 | /* in class.cc */ | 
| 7014 | extern tree build_vfield_ref                        (tree, tree); | 
| 7015 | extern tree build_if_in_charge                        (tree true_stmt, tree false_stmt = void_node); | 
| 7016 | extern tree build_base_path                        (enum tree_code, tree, | 
| 7017 |                                                  tree, int, tsubst_flags_t); | 
| 7018 | extern tree convert_to_base                        (tree, tree, bool, bool, | 
| 7019 |                                                  tsubst_flags_t); | 
| 7020 | extern tree convert_to_base_statically                (tree, tree); | 
| 7021 | extern bool is_empty_base_ref                        (tree); | 
| 7022 | extern tree build_vtbl_ref                        (tree, tree); | 
| 7023 | extern tree build_vfn_ref                        (tree, tree); | 
| 7024 | extern tree get_vtable_decl                        (tree, int); | 
| 7025 | extern bool object_parms_correspond                (tree, tree, tree); | 
| 7026 | extern bool iobj_parm_corresponds_to                (tree, tree, tree); | 
| 7027 | extern bool add_method                                (tree, tree, bool); | 
| 7028 | extern tree declared_access                        (tree); | 
| 7029 | extern bool maybe_push_used_methods                (tree); | 
| 7030 | extern tree currently_open_class                (tree); | 
| 7031 | extern tree currently_open_derived_class        (tree); | 
| 7032 | extern tree outermost_open_class                (void); | 
| 7033 | extern tree current_nonlambda_class_type        (void); | 
| 7034 | extern tree finish_struct                        (tree, tree); | 
| 7035 | extern void finish_struct_1                        (tree); | 
| 7036 | extern int resolves_to_fixed_type_p                (tree, int * = NULL); | 
| 7037 | extern void init_class_processing                (void); | 
| 7038 | extern int is_empty_class                        (tree); | 
| 7039 | extern bool is_really_empty_class                (tree, bool); | 
| 7040 | extern void pushclass                                (tree); | 
| 7041 | extern void popclass                                (void); | 
| 7042 | extern void push_nested_class                        (tree); | 
| 7043 | extern void pop_nested_class                        (void); | 
| 7044 | extern int current_lang_depth                        (void); | 
| 7045 | extern void push_lang_context                        (tree); | 
| 7046 | extern void pop_lang_context                        (void); | 
| 7047 | extern tree instantiate_type                        (tree, tree, tsubst_flags_t); | 
| 7048 | extern void build_self_reference                (void); | 
| 7049 | extern int same_signature_p                        (const_tree, const_tree); | 
| 7050 | extern tree lookup_vfn_in_binfo                        (tree, tree); | 
| 7051 | extern void maybe_add_class_template_decl_list        (tree, tree, int); | 
| 7052 | extern void unreverse_member_declarations        (tree); | 
| 7053 | extern bool is_empty_field                        (tree); | 
| 7054 | extern void invalidate_class_lookup_cache        (void); | 
| 7055 | extern void maybe_note_name_used_in_class        (tree, tree); | 
| 7056 | extern void note_name_declared_in_class                (tree, tree); | 
| 7057 | extern tree get_vtbl_decl_for_binfo                (tree); | 
| 7058 | extern bool vptr_via_virtual_p                        (tree); | 
| 7059 | extern void debug_class                                (tree); | 
| 7060 | extern void debug_thunks                        (tree); | 
| 7061 | extern void set_linkage_according_to_type        (tree, tree); | 
| 7062 | extern void determine_key_method                (tree); | 
| 7063 | extern void check_for_override                        (tree, tree); | 
| 7064 | extern void push_class_stack                        (void); | 
| 7065 | extern void pop_class_stack                        (void); | 
| 7066 | extern bool default_ctor_p                        (const_tree); | 
| 7067 | extern bool type_has_user_nondefault_constructor (tree); | 
| 7068 | extern tree in_class_defaulted_default_constructor (tree); | 
| 7069 | extern bool user_provided_p                        (tree); | 
| 7070 | extern bool type_has_user_provided_constructor  (tree); | 
| 7071 | extern bool type_has_non_user_provided_default_constructor (tree); | 
| 7072 | extern bool type_has_converting_constructor        (tree); | 
| 7073 | extern bool vbase_has_user_provided_move_assign (tree); | 
| 7074 | extern tree default_init_uninitialized_part (tree); | 
| 7075 | extern bool trivial_default_constructor_is_constexpr (tree); | 
| 7076 | extern bool type_has_constexpr_default_constructor (tree); | 
| 7077 | extern bool type_has_constexpr_destructor        (tree); | 
| 7078 | extern bool type_has_virtual_destructor                (tree); | 
| 7079 | extern bool type_has_non_deleted_trivial_default_ctor (tree); | 
| 7080 | extern bool classtype_has_move_assign_or_move_ctor_p (tree, bool user_declared); | 
| 7081 | extern bool classtype_has_non_deleted_move_ctor (tree); | 
| 7082 | extern tree classtype_has_depr_implicit_copy        (tree); | 
| 7083 | extern bool classtype_has_op (tree, tree_code); | 
| 7084 | extern tree classtype_has_defaulted_op (tree, tree_code); | 
| 7085 | extern bool type_build_ctor_call                (tree); | 
| 7086 | extern bool type_build_dtor_call                (tree); | 
| 7087 | extern void explain_non_literal_class                (tree); | 
| 7088 | extern void inherit_targ_abi_tags                (tree); | 
| 7089 | extern void maybe_delete_defaulted_fn                (tree, tree); | 
| 7090 | extern void defaulted_late_check                (tree, tristate = tristate::unknown ()); | 
| 7091 | extern bool defaultable_fn_check                (tree); | 
| 7092 | extern void check_abi_tags                        (tree); | 
| 7093 | extern tree missing_abi_tags                        (tree); | 
| 7094 | extern void fixup_type_variants                        (tree); | 
| 7095 | extern void fixup_attribute_variants                (tree); | 
| 7096 | extern void build_cdtor_clones                         (tree, bool, bool, bool); | 
| 7097 | extern void clone_cdtor                                (tree, bool); | 
| 7098 | extern tree copy_operator_fn                        (tree, tree_code code); | 
| 7099 | extern void adjust_clone_args                        (tree); | 
| 7100 | extern void deduce_noexcept_on_destructor       (tree); | 
| 7101 | extern bool uniquely_derived_from_p             (tree, tree); | 
| 7102 | extern bool publicly_uniquely_derived_p         (tree, tree); | 
| 7103 | extern tree common_enclosing_class                (tree, tree); | 
| 7104 |  | 
| 7105 | /* in cvt.cc */ | 
| 7106 | extern tree convert_to_reference                (tree, tree, int, int, tree, | 
| 7107 |                                                  tsubst_flags_t); | 
| 7108 | extern tree convert_from_reference                (tree); | 
| 7109 | extern tree force_rvalue                        (tree, tsubst_flags_t); | 
| 7110 | extern tree force_lvalue                        (tree, tsubst_flags_t); | 
| 7111 | extern tree ocp_convert                                (tree, tree, int, int, | 
| 7112 |                                                  tsubst_flags_t); | 
| 7113 | extern tree cp_convert                                (tree, tree, tsubst_flags_t); | 
| 7114 | extern tree cp_convert_and_check                (tree, tree, tsubst_flags_t); | 
| 7115 | extern tree cp_fold_convert                        (tree, tree); | 
| 7116 | extern tree cp_get_callee                        (tree); | 
| 7117 | extern tree cp_get_callee_fndecl                (tree); | 
| 7118 | extern tree cp_get_callee_fndecl_nofold                (tree); | 
| 7119 | extern tree cp_get_fndecl_from_callee                (tree, bool fold = true); | 
| 7120 | extern tree convert_to_void                        (tree, impl_conv_void, | 
| 7121 |                                                   tsubst_flags_t); | 
| 7122 | extern tree convert_force                        (tree, tree, int, | 
| 7123 |                                                  tsubst_flags_t); | 
| 7124 | extern tree build_expr_type_conversion                (int, tree, bool); | 
| 7125 | extern tree type_promotes_to                        (tree); | 
| 7126 | extern bool can_convert_qual                        (tree, tree); | 
| 7127 | extern tree perform_qualification_conversions        (tree, tree); | 
| 7128 | extern bool tx_safe_fn_type_p                        (tree); | 
| 7129 | extern tree tx_unsafe_fn_variant                (tree); | 
| 7130 | extern bool fnptr_conv_p                        (tree, tree); | 
| 7131 | extern tree strip_fnptr_conv                        (tree); | 
| 7132 |  | 
| 7133 | /* in name-lookup.cc */ | 
| 7134 | extern void maybe_push_cleanup_level                (tree); | 
| 7135 | extern tree maybe_push_decl                        (tree); | 
| 7136 | extern tree current_decl_namespace                (void); | 
| 7137 |  | 
| 7138 | /* decl.cc */ | 
| 7139 | extern tree poplevel                                (int, int, int); | 
| 7140 | extern void cxx_init_decl_processing                (void); | 
| 7141 | enum cp_tree_node_structure_enum cp_tree_node_structure | 
| 7142 |                                                 (union lang_tree_node *); | 
| 7143 | extern void finish_scope                        (void); | 
| 7144 | extern void push_switch                                (tree); | 
| 7145 | extern void pop_switch                                (void); | 
| 7146 | extern void note_break_stmt                        (void); | 
| 7147 | extern bool note_iteration_stmt_body_start        (void); | 
| 7148 | extern void note_iteration_stmt_body_end        (bool); | 
| 7149 | extern void determine_local_discriminator        (tree, tree = NULL_TREE); | 
| 7150 | extern bool member_like_constrained_friend_p        (tree); | 
| 7151 | extern bool fns_correspond                        (tree, tree); | 
| 7152 | extern int decls_match                                (tree, tree, bool = true); | 
| 7153 | extern bool maybe_version_functions                (tree, tree, bool); | 
| 7154 | extern bool validate_constexpr_redeclaration        (tree, tree); | 
| 7155 | extern bool merge_default_template_args                (tree, tree, bool); | 
| 7156 | extern tree duplicate_decls                        (tree, tree, | 
| 7157 |                                                  bool hiding = false, | 
| 7158 |                                                  bool was_hidden = false); | 
| 7159 | extern void mark_label_addressed                (tree); | 
| 7160 | extern tree declare_local_label                        (tree); | 
| 7161 | extern tree define_label                        (location_t, tree); | 
| 7162 | extern void check_goto                                (tree); | 
| 7163 | extern bool check_omp_return                        (void); | 
| 7164 | extern tree make_typename_type                        (tree, tree, enum tag_types, tsubst_flags_t); | 
| 7165 | extern tree build_typename_type                        (tree, tree, tree, tag_types); | 
| 7166 | extern tree make_unbound_class_template                (tree, tree, tree, tsubst_flags_t); | 
| 7167 | extern tree make_unbound_class_template_raw        (tree, tree, tree); | 
| 7168 | extern unsigned push_abi_namespace                (tree node = abi_node); | 
| 7169 | extern void pop_abi_namespace                        (unsigned flags, | 
| 7170 |                                                  tree node = abi_node); | 
| 7171 | extern tree build_library_fn_ptr                (const char *, tree, int); | 
| 7172 | extern tree build_cp_library_fn_ptr                (const char *, tree, int); | 
| 7173 | extern tree push_library_fn                        (tree, tree, tree, int); | 
| 7174 | extern tree push_throw_library_fn                (tree, tree); | 
| 7175 | extern void warn_misplaced_attr_for_class_type  (location_t location, | 
| 7176 |                                                  tree class_type); | 
| 7177 | extern tree check_tag_decl                        (cp_decl_specifier_seq *, bool); | 
| 7178 | extern tree shadow_tag                                (cp_decl_specifier_seq *); | 
| 7179 | extern tree groktypename                        (cp_decl_specifier_seq *, const cp_declarator *, bool); | 
| 7180 | extern tree start_decl                                (const cp_declarator *, cp_decl_specifier_seq *, int, tree, tree, tree *); | 
| 7181 | extern void start_decl_1                        (tree, bool); | 
| 7182 | extern bool check_array_initializer                (tree, tree, tree); | 
| 7183 | extern void omp_declare_variant_finalize        (tree, tree); | 
| 7184 | struct cp_decomp { tree decl; unsigned int count; }; | 
| 7185 | extern void cp_finish_decl                        (tree, tree, bool, tree, int, cp_decomp * = nullptr); | 
| 7186 | extern tree lookup_decomp_type                        (tree); | 
| 7187 | extern bool cp_finish_decomp                        (tree, cp_decomp *, bool = false); | 
| 7188 | extern int cp_complete_array_type                (tree *, tree, bool); | 
| 7189 | extern int cp_complete_array_type_or_error        (tree *, tree, bool, tsubst_flags_t); | 
| 7190 | extern tree build_ptrmemfunc_type                (tree); | 
| 7191 | extern tree build_ptrmem_type                        (tree, tree); | 
| 7192 | /* the grokdeclarator prototype is in decl.h */ | 
| 7193 | extern tree build_this_parm                        (tree, tree, cp_cv_quals); | 
| 7194 | extern tree grokparms                                (tree, tree *); | 
| 7195 | extern int copy_fn_p                                (const_tree); | 
| 7196 | extern bool move_fn_p                           (const_tree); | 
| 7197 | extern bool move_signature_fn_p                 (const_tree); | 
| 7198 | extern tree get_scope_of_declarator                (const cp_declarator *); | 
| 7199 | extern void grok_special_member_properties        (tree); | 
| 7200 | extern bool grok_ctor_properties                (const_tree, const_tree); | 
| 7201 | extern bool grok_op_properties                        (tree, bool); | 
| 7202 | extern tree xref_tag                                (tag_types, tree, | 
| 7203 |                                                  TAG_how = TAG_how::CURRENT_ONLY, | 
| 7204 |                                                  bool  = false); | 
| 7205 | extern void xref_basetypes                        (tree, tree); | 
| 7206 | extern tree start_enum                                (tree, tree, tree, tree, bool, bool *); | 
| 7207 | extern void finish_enum_value_list                (tree); | 
| 7208 | extern void finish_enum                                (tree); | 
| 7209 | extern tree build_enumerator                        (tree, tree, tree, tree, location_t); | 
| 7210 | extern tree lookup_enumerator                        (tree, tree); | 
| 7211 | extern bool start_preparsed_function                (tree, tree, int); | 
| 7212 | extern bool start_function                        (cp_decl_specifier_seq *, | 
| 7213 |                                                  const cp_declarator *, tree); | 
| 7214 | extern tree maybe_prepare_return_this                (tree); | 
| 7215 | extern void maybe_return_this                        (void); | 
| 7216 | extern tree begin_function_body                        (void); | 
| 7217 | extern void finish_function_body                (tree); | 
| 7218 | extern tree outer_curly_brace_block                (tree); | 
| 7219 | extern tree finish_function                        (bool); | 
| 7220 | extern tree grokmethod                                (cp_decl_specifier_seq *, const cp_declarator *, tree); | 
| 7221 | extern void maybe_register_incomplete_var        (tree); | 
| 7222 | extern void maybe_commonize_var                        (tree); | 
| 7223 | extern void complete_vars                        (tree); | 
| 7224 | extern tree static_fn_type                        (tree); | 
| 7225 | extern void revert_static_member_fn                (tree); | 
| 7226 | extern void fixup_anonymous_aggr                (tree); | 
| 7227 | extern tree compute_array_index_type                (tree, tree, tsubst_flags_t); | 
| 7228 | extern tree check_default_argument                (tree, tree, tsubst_flags_t); | 
| 7229 | extern int wrapup_namespace_globals                (); | 
| 7230 | extern tree create_implicit_typedef                (tree, tree); | 
| 7231 | extern int local_variable_p                        (const_tree); | 
| 7232 | extern tree get_cxa_atexit_fn_ptr_type                (); | 
| 7233 | extern tree register_dtor_fn                        (tree, bool = false); | 
| 7234 | extern tmpl_spec_kind current_tmpl_spec_kind        (int); | 
| 7235 | extern tree cxx_builtin_function                (tree decl); | 
| 7236 | extern tree cxx_builtin_function_ext_scope        (tree decl); | 
| 7237 | extern tree cxx_simulate_builtin_function_decl        (tree); | 
| 7238 | extern tree check_elaborated_type_specifier        (enum tag_types, tree, bool); | 
| 7239 | extern void warn_extern_redeclared_static        (tree, tree); | 
| 7240 | extern tree cxx_comdat_group                        (tree); | 
| 7241 | extern bool cp_missing_noreturn_ok_p                (tree); | 
| 7242 | extern bool is_direct_enum_init                        (tree, tree); | 
| 7243 | extern void initialize_artificial_var                (tree, vec<constructor_elt, va_gc> *); | 
| 7244 | extern tree check_var_type                        (tree, tree, location_t); | 
| 7245 | extern tree reshape_init                        (tree, tree, tsubst_flags_t); | 
| 7246 | extern tree next_aggregate_field                (tree); | 
| 7247 | extern tree next_subobject_field                (tree); | 
| 7248 | extern tree first_field                                (const_tree); | 
| 7249 | extern tree fndecl_declared_return_type                (tree); | 
| 7250 | extern bool undeduced_auto_decl                        (tree); | 
| 7251 | extern bool require_deduced_type                (tree, tsubst_flags_t = tf_warning_or_error); | 
| 7252 |  | 
| 7253 | extern tree finish_case_label                        (location_t, tree, tree); | 
| 7254 | extern tree cxx_maybe_build_cleanup                (tree, tsubst_flags_t); | 
| 7255 | extern bool check_array_designated_initializer  (constructor_elt *, | 
| 7256 |                                                  unsigned HOST_WIDE_INT); | 
| 7257 | extern bool check_for_uninitialized_const_var   (tree, bool, tsubst_flags_t); | 
| 7258 | extern tree build_explicit_specifier                (tree, tsubst_flags_t); | 
| 7259 | extern bool use_eh_spec_block                        (tree); | 
| 7260 | extern void do_push_parm_decls                        (tree, tree, tree *); | 
| 7261 | extern tree do_aggregate_paren_init                (tree, tree); | 
| 7262 |  | 
| 7263 | /* in decl2.cc */ | 
| 7264 | extern void record_mangling                        (tree, bool); | 
| 7265 | extern void overwrite_mangling                        (tree, tree); | 
| 7266 | extern void note_mangling_alias                        (tree, tree); | 
| 7267 | extern void generate_mangling_aliases                (void); | 
| 7268 | extern tree build_memfn_type                        (tree, tree, cp_cv_quals, cp_ref_qualifier); | 
| 7269 | extern tree build_pointer_ptrmemfn_type        (tree); | 
| 7270 | extern tree change_return_type                        (tree, tree); | 
| 7271 | extern void maybe_retrofit_in_chrg                (tree); | 
| 7272 | extern void maybe_make_one_only                        (tree); | 
| 7273 | extern bool vague_linkage_p                        (tree); | 
| 7274 | extern void grokclassfn                                (tree, tree, | 
| 7275 |                                                  enum overload_flags); | 
| 7276 | extern tree grok_array_decl                        (location_t, tree, tree, | 
| 7277 |                                                  vec<tree, va_gc> **, tsubst_flags_t); | 
| 7278 | extern tree grok_omp_array_section                (location_t, tree, tree, tree); | 
| 7279 | extern tree delete_sanity                        (location_t, tree, tree, bool, | 
| 7280 |                                                  int, tsubst_flags_t); | 
| 7281 | extern tree check_classfn                        (tree, tree, tree); | 
| 7282 | extern void check_member_template                (tree); | 
| 7283 | extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *, | 
| 7284 |                        tree, bool, tree, tree); | 
| 7285 | extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *, | 
| 7286 |                           tree, tree, tree); | 
| 7287 | extern tree start_initialized_static_member        (const cp_declarator *, | 
| 7288 |                                                  cp_decl_specifier_seq *, tree); | 
| 7289 | extern bool is_static_data_member_initialized_in_class (tree decl); | 
| 7290 | extern void finish_initialized_static_member        (tree, tree, tree); | 
| 7291 | extern tree splice_template_attributes                (tree *, tree); | 
| 7292 | extern bool any_dependent_type_attributes_p        (tree); | 
| 7293 | extern tree cp_reconstruct_complex_type                (tree, tree); | 
| 7294 | extern bool attributes_naming_typedef_ok        (tree); | 
| 7295 | extern void cplus_decl_attributes                (tree *, tree, int); | 
| 7296 | extern void finish_anon_union                        (tree); | 
| 7297 | extern void cxx_post_compilation_parsing_cleanups (void); | 
| 7298 | extern tree coerce_new_type                        (tree, location_t); | 
| 7299 | extern void coerce_delete_type                        (tree, location_t); | 
| 7300 | extern void comdat_linkage                        (tree); | 
| 7301 | extern void determine_visibility                (tree); | 
| 7302 | extern void constrain_class_visibility                (tree); | 
| 7303 | extern void reset_type_linkage                        (tree); | 
| 7304 | extern void tentative_decl_linkage                (tree); | 
| 7305 | extern void import_export_decl                        (tree); | 
| 7306 | extern tree build_cleanup                        (tree); | 
| 7307 | extern tree build_offset_ref_call_from_tree        (tree, vec<tree, va_gc> **, | 
| 7308 |                                                  tsubst_flags_t); | 
| 7309 | extern bool decl_defined_p                        (tree); | 
| 7310 | extern bool decl_constant_var_p                        (tree); | 
| 7311 | extern bool decl_maybe_constant_var_p                (tree); | 
| 7312 | extern void no_linkage_error                        (tree); | 
| 7313 | extern void check_default_args                        (tree); | 
| 7314 | extern bool mark_used                                (tree, | 
| 7315 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 7316 | extern bool mark_single_function                (tree, tsubst_flags_t); | 
| 7317 | extern void finish_static_data_member_decl        (tree, tree, bool, tree, int); | 
| 7318 | extern tree cp_build_parm_decl                        (tree, tree, tree); | 
| 7319 | extern void copy_linkage                        (tree, tree); | 
| 7320 | extern tree get_guard                                (tree); | 
| 7321 | extern tree get_guard_cond                        (tree, bool); | 
| 7322 | extern tree set_guard                                (tree); | 
| 7323 | extern bool var_needs_tls_wrapper                (tree); | 
| 7324 | extern tree maybe_get_tls_wrapper_call                (tree); | 
| 7325 | extern void mark_needed                                (tree); | 
| 7326 | extern bool decl_needed_p                        (tree); | 
| 7327 | extern void note_vague_linkage_fn                (tree); | 
| 7328 | extern void note_vague_linkage_variable                (tree); | 
| 7329 | extern tree build_artificial_parm                (tree, tree, tree); | 
| 7330 | extern bool possibly_inlined_p                        (tree); | 
| 7331 | extern int parm_index                           (tree); | 
| 7332 | extern tree vtv_start_verification_constructor_init_function (void); | 
| 7333 | extern tree vtv_finish_verification_constructor_init_function (tree); | 
| 7334 | extern void cp_check_const_attributes (tree); | 
| 7335 | extern void maybe_propagate_warmth_attributes (tree, tree); | 
| 7336 |  | 
| 7337 | /* in error.cc */ | 
| 7338 | /* A class for pretty-printing to -flang-dump-XXX files.  Used like | 
| 7339 |  | 
| 7340 |    if (cxx_dump_pretty_printer pp {foo_dump_id}) | 
| 7341 |      { | 
| 7342 |        pp_printf (&pp, ...); | 
| 7343 |      } | 
| 7344 |  | 
| 7345 |    If the dump is enabled, the pretty printer will open the dump file and | 
| 7346 |    attach to it, and flush and close the file on destruction.  */ | 
| 7347 |  | 
| 7348 | class cxx_dump_pretty_printer: public pretty_printer | 
| 7349 | { | 
| 7350 |   int phase; | 
| 7351 |   FILE *outf; | 
| 7352 |   dump_flags_t flags; | 
| 7353 |  | 
| 7354 | public: | 
| 7355 |   cxx_dump_pretty_printer (int phase); | 
| 7356 |   operator bool() { return outf != nullptr; } | 
| 7357 |   bool has_flag (dump_flags_t f) { return (flags & f); } | 
| 7358 |   ~cxx_dump_pretty_printer (); | 
| 7359 | }; | 
| 7360 |  | 
| 7361 | extern const char *type_as_string                (tree, int); | 
| 7362 | extern const char *type_as_string_translate        (tree, int); | 
| 7363 | extern const char *decl_as_string                (tree, int); | 
| 7364 | extern const char *decl_as_string_translate        (tree, int); | 
| 7365 | extern const char *decl_as_dwarf_string                (tree, int); | 
| 7366 | extern const char *expr_as_string                (tree, int); | 
| 7367 | extern const char *expr_to_string                (tree); | 
| 7368 | extern const char *lang_decl_name                (tree, int, bool); | 
| 7369 | extern const char *lang_decl_dwarf_name                (tree, int, bool); | 
| 7370 | extern const char *language_to_string                (enum languages); | 
| 7371 | extern const char *class_key_or_enum_as_string        (tree); | 
| 7372 | extern void maybe_warn_variadic_templates       (void); | 
| 7373 | extern void maybe_warn_cpp0x                        (cpp0x_warn_str str, | 
| 7374 |                                                  location_t = input_location); | 
| 7375 | extern bool pedwarn_cxx98                       (location_t, | 
| 7376 |                                                  diagnostic_option_id option_id, | 
| 7377 |                                                  const char *, ...) ATTRIBUTE_GCC_DIAG(3,4); | 
| 7378 | extern location_t location_of                   (tree); | 
| 7379 | extern void qualified_name_lookup_error                (tree, tree, tree, | 
| 7380 |                                                  location_t); | 
| 7381 |  | 
| 7382 | struct decl_location_traits | 
| 7383 |   : simple_cache_map_traits<tree_decl_hash, location_t> { }; | 
| 7384 | typedef hash_map<tree, location_t, decl_location_traits> erroneous_templates_t; | 
| 7385 | extern GTY((cache)) erroneous_templates_t *erroneous_templates; | 
| 7386 |  | 
| 7387 | extern bool cp_seen_error (); | 
| 7388 | #define seen_error() cp_seen_error () | 
| 7389 |  | 
| 7390 | /* in except.cc */ | 
| 7391 | extern void init_terminate_fn                        (void); | 
| 7392 | extern void init_exception_processing                (void); | 
| 7393 | extern tree expand_start_catch_block                (tree); | 
| 7394 | extern void expand_end_catch_block                (void); | 
| 7395 | extern tree build_exc_ptr                        (void); | 
| 7396 | extern tree build_throw                                (location_t, tree, | 
| 7397 |                                                  tsubst_flags_t); | 
| 7398 | extern int nothrow_libfn_p                        (const_tree); | 
| 7399 | extern void check_handlers                        (tree); | 
| 7400 | extern tree finish_noexcept_expr                (tree, tsubst_flags_t); | 
| 7401 | extern bool expr_noexcept_p                        (tree, tsubst_flags_t); | 
| 7402 | extern void perform_deferred_noexcept_checks        (void); | 
| 7403 | extern bool nothrow_spec_p                        (const_tree); | 
| 7404 | extern bool type_noexcept_p                        (const_tree); | 
| 7405 | extern bool type_throw_all_p                        (const_tree); | 
| 7406 | extern tree build_noexcept_spec                        (tree, tsubst_flags_t); | 
| 7407 | extern void choose_personality_routine                (enum languages); | 
| 7408 | extern tree build_must_not_throw_expr                (tree,tree); | 
| 7409 | extern tree eh_type_info                        (tree); | 
| 7410 | extern tree begin_eh_spec_block                        (void); | 
| 7411 | extern void finish_eh_spec_block                (tree, tree); | 
| 7412 | extern tree build_eh_type_type                        (tree); | 
| 7413 | extern tree cp_protect_cleanup_actions                (void); | 
| 7414 | extern void maybe_splice_retval_cleanup                (tree, bool); | 
| 7415 | extern tree maybe_set_retval_sentinel                (void); | 
| 7416 |  | 
| 7417 | extern tree template_parms_to_args                (tree); | 
| 7418 | extern tree template_parms_level_to_args        (tree); | 
| 7419 | extern tree generic_targs_for                        (tree); | 
| 7420 | extern tree outer_template_args                        (const_tree); | 
| 7421 |  | 
| 7422 | /* in expr.cc */ | 
| 7423 | extern tree cplus_expand_constant                (tree); | 
| 7424 | extern tree mark_use (tree expr, bool rvalue_p, bool read_p, | 
| 7425 |                       location_t = UNKNOWN_LOCATION, | 
| 7426 |                       bool reject_builtin = true); | 
| 7427 | extern tree mark_rvalue_use                        (tree, | 
| 7428 |                                                  location_t = UNKNOWN_LOCATION, | 
| 7429 |                                                  bool reject_builtin = true); | 
| 7430 | extern tree mark_lvalue_use                        (tree); | 
| 7431 | extern tree mark_lvalue_use_nonread                (tree); | 
| 7432 | extern tree mark_type_use                        (tree); | 
| 7433 | extern tree mark_discarded_use                        (tree); | 
| 7434 | extern void mark_exp_read                        (tree); | 
| 7435 |  | 
| 7436 | /* friend.cc */ | 
| 7437 | extern int is_friend                                (tree, tree); | 
| 7438 | extern void make_friend_class                        (tree, tree, bool); | 
| 7439 | extern void add_friend                                (tree, tree, bool); | 
| 7440 | extern tree do_friend                                (tree, tree, tree, | 
| 7441 |                                                  enum overload_flags, bool); | 
| 7442 |  | 
| 7443 | extern void set_global_friend                        (tree); | 
| 7444 | extern bool is_global_friend                        (tree); | 
| 7445 |  | 
| 7446 | /* in init.cc */ | 
| 7447 | extern tree find_temps_r                        (tree *, int *, void *); | 
| 7448 | extern tree expand_member_init                        (tree); | 
| 7449 | extern void emit_mem_initializers                (tree); | 
| 7450 | extern tree build_aggr_init                        (tree, tree, int, | 
| 7451 |                                                  tsubst_flags_t); | 
| 7452 | extern int is_class_type                        (tree, int); | 
| 7453 | extern bool is_copy_initialization                (tree); | 
| 7454 | extern tree build_zero_init                        (tree, tree, bool); | 
| 7455 | extern tree build_value_init                        (tree, tsubst_flags_t); | 
| 7456 | extern tree build_value_init_noctor                (tree, tsubst_flags_t); | 
| 7457 | extern tree maybe_instantiate_nsdmi_init        (tree, tsubst_flags_t); | 
| 7458 | extern tree get_nsdmi                                (tree, bool, tsubst_flags_t); | 
| 7459 | extern tree build_offset_ref                        (tree, tree, bool, | 
| 7460 |                                                  tsubst_flags_t); | 
| 7461 | extern tree throw_bad_array_new_length                (void); | 
| 7462 | extern bool type_has_new_extended_alignment        (tree); | 
| 7463 | extern unsigned malloc_alignment                (void); | 
| 7464 | extern bool std_placement_new_fn_p                (tree); | 
| 7465 | extern tree build_new_constexpr_heap_type        (tree, tree, tree); | 
| 7466 | extern tree build_new                                (location_t, | 
| 7467 |                                                  vec<tree, va_gc> **, tree, | 
| 7468 |                                                  tree, vec<tree, va_gc> **, | 
| 7469 |                                                  int, tsubst_flags_t); | 
| 7470 | extern tree get_temp_regvar                        (tree, tree); | 
| 7471 | extern tree build_vec_init                        (tree, tree, tree, bool, int, | 
| 7472 |                                                  tsubst_flags_t, | 
| 7473 |                                                  vec<tree, va_gc> ** = nullptr); | 
| 7474 | extern tree build_delete                        (location_t, tree, tree, | 
| 7475 |                                                  special_function_kind, | 
| 7476 |                                                  int, int, tsubst_flags_t); | 
| 7477 | extern void push_base_cleanups                        (void); | 
| 7478 | extern tree build_vec_delete                        (location_t, tree, tree, | 
| 7479 |                                                  special_function_kind, int, | 
| 7480 |                                                  tsubst_flags_t); | 
| 7481 | extern tree create_temporary_var                (tree); | 
| 7482 | extern void initialize_vtbl_ptrs                (tree); | 
| 7483 | extern tree scalar_constant_value                (tree); | 
| 7484 | extern tree decl_constant_value                        (tree, bool); | 
| 7485 | extern tree decl_really_constant_value                (tree, bool = true); | 
| 7486 | extern int diagnose_uninitialized_cst_or_ref_member (tree, bool, bool); | 
| 7487 | extern tree build_vtbl_address                  (tree); | 
| 7488 | extern bool maybe_reject_flexarray_init                (tree, tree); | 
| 7489 |  | 
| 7490 | /* in lex.cc */ | 
| 7491 | extern void cxx_dup_lang_specific_decl                (tree); | 
| 7492 | extern tree unqualified_name_lookup_error        (tree, | 
| 7493 |                                                  location_t = UNKNOWN_LOCATION); | 
| 7494 | extern tree unqualified_fn_lookup_error                (cp_expr); | 
| 7495 | extern tree make_conv_op_name                        (tree); | 
| 7496 | extern tree build_lang_decl                        (enum tree_code, tree, tree); | 
| 7497 | extern tree build_lang_decl_loc                        (location_t, enum tree_code, tree, tree); | 
| 7498 | extern bool maybe_add_lang_decl_raw                (tree, bool decomp_p); | 
| 7499 | extern bool maybe_add_lang_type_raw                (tree); | 
| 7500 | extern void retrofit_lang_decl                        (tree); | 
| 7501 | extern void fit_decomposition_lang_decl                (tree, tree); | 
| 7502 | extern tree copy_decl                                (tree CXX_MEM_STAT_INFO); | 
| 7503 | extern tree copy_type                                (tree CXX_MEM_STAT_INFO); | 
| 7504 | extern tree cxx_make_type                        (enum tree_code CXX_MEM_STAT_INFO); | 
| 7505 | extern tree make_class_type                        (enum tree_code CXX_MEM_STAT_INFO); | 
| 7506 | extern const char *get_identifier_kind_name        (tree); | 
| 7507 | extern void set_identifier_kind                        (tree, cp_identifier_kind); | 
| 7508 | extern bool cxx_init                                (void); | 
| 7509 | extern void cxx_finish                                (void); | 
| 7510 | extern bool in_main_input_context                (void); | 
| 7511 | extern uintptr_t module_token_pre (cpp_reader *, const cpp_token *, uintptr_t); | 
| 7512 | extern uintptr_t module_token_cdtor (cpp_reader *, uintptr_t); | 
| 7513 | extern uintptr_t module_token_lang (int type, int keyword, tree value, | 
| 7514 |                                     location_t, uintptr_t); | 
| 7515 |  | 
| 7516 | /* in method.cc */ | 
| 7517 | extern void init_method                                (void); | 
| 7518 | extern tree make_thunk                                (tree, bool, tree, tree); | 
| 7519 | extern void finish_thunk                        (tree); | 
| 7520 | extern void use_thunk                                (tree, bool); | 
| 7521 | extern bool trivial_fn_p                        (tree); | 
| 7522 | extern tree forward_parm                        (tree); | 
| 7523 | extern bool is_trivially_xible                        (enum tree_code, tree, tree); | 
| 7524 | extern bool is_nothrow_xible                        (enum tree_code, tree, tree); | 
| 7525 | extern bool is_xible                                (enum tree_code, tree, tree); | 
| 7526 | extern bool is_convertible                        (tree, tree); | 
| 7527 | extern bool is_nothrow_convertible                (tree, tree); | 
| 7528 | extern bool ref_xes_from_temporary                (tree, tree, bool); | 
| 7529 | extern tree get_defaulted_eh_spec                (tree, tsubst_flags_t = tf_warning_or_error); | 
| 7530 | extern bool maybe_explain_implicit_delete        (tree); | 
| 7531 | extern void explain_implicit_non_constexpr        (tree); | 
| 7532 | extern bool deduce_inheriting_ctor                (tree); | 
| 7533 | extern bool decl_remember_implicit_trigger_p        (tree); | 
| 7534 | extern void synthesize_method                        (tree); | 
| 7535 | extern void maybe_synthesize_method                (tree); | 
| 7536 | extern tree lazily_declare_fn                        (special_function_kind, | 
| 7537 |                                                  tree); | 
| 7538 | extern tree skip_artificial_parms_for                (const_tree, tree); | 
| 7539 | extern int num_artificial_parms_for                (const_tree); | 
| 7540 | extern tree make_alias_for                        (tree, tree); | 
| 7541 | extern tree get_copy_ctor                        (tree, tsubst_flags_t); | 
| 7542 | extern tree get_copy_assign                        (tree); | 
| 7543 | extern tree get_default_ctor                        (tree); | 
| 7544 | extern tree get_dtor                                (tree, tsubst_flags_t); | 
| 7545 | extern tree build_stub_object                        (tree); | 
| 7546 | extern bool is_stub_object                        (tree); | 
| 7547 | extern tree build_invoke                        (tree, const_tree, | 
| 7548 |                                                  tsubst_flags_t); | 
| 7549 | extern tree strip_inheriting_ctors                (tree); | 
| 7550 | extern tree inherited_ctor_binfo                (tree); | 
| 7551 | extern bool base_ctor_omit_inherited_parms        (tree); | 
| 7552 | extern bool ctor_omit_inherited_parms                (tree); | 
| 7553 | extern tree locate_ctor                                (tree); | 
| 7554 | extern tree implicitly_declare_fn               (special_function_kind, tree, | 
| 7555 |                                                  bool, tree, tree); | 
| 7556 | /* In module.cc  */ | 
| 7557 | class module_state; /* Forward declare.  */ | 
| 7558 | inline bool modules_p () { return flag_modules != 0; } | 
| 7559 |  | 
| 7560 | /* The kind of module or part thereof that we're in.  */ | 
| 7561 | enum module_kind_bits | 
| 7562 | { | 
| 7563 |   MK_NAMED = 1 << 0,        // TU is a named module | 
| 7564 |    = 1 << 1,        // TU is a header unit | 
| 7565 |   MK_INTERFACE = 1 << 2,  // TU is an interface | 
| 7566 |   MK_PARTITION = 1 << 3,  // TU is a partition | 
| 7567 |  | 
| 7568 |   MK_PURVIEW = 1 << 4,        // In purview of current module | 
| 7569 |   MK_ATTACH = 1 << 5,        // Attaching to named module | 
| 7570 |  | 
| 7571 |   MK_EXPORTING = 1 << 6,  /* We are in an export region.  */ | 
| 7572 | }; | 
| 7573 |  | 
| 7574 | /* We do lots of bit-manipulation, so an unsigned is easier.  */ | 
| 7575 | extern unsigned module_kind; | 
| 7576 |  | 
| 7577 | inline bool module_p () | 
| 7578 | { return module_kind & (MK_NAMED | MK_HEADER); } | 
| 7579 | inline bool named_module_p () | 
| 7580 | { return module_kind & MK_NAMED; } | 
| 7581 | inline bool  () | 
| 7582 | { return module_kind & MK_HEADER; } | 
| 7583 | inline bool module_interface_p () | 
| 7584 | { return module_kind & MK_INTERFACE; } | 
| 7585 | inline bool module_partition_p () | 
| 7586 | { return module_kind & MK_PARTITION; } | 
| 7587 | inline bool module_has_cmi_p () | 
| 7588 | { return module_kind & (MK_INTERFACE | MK_PARTITION | MK_HEADER); } | 
| 7589 |  | 
| 7590 | inline bool module_purview_p () | 
| 7591 | { return module_kind & MK_PURVIEW; } | 
| 7592 | inline bool module_attach_p () | 
| 7593 | { return module_kind & MK_ATTACH; } | 
| 7594 |  | 
| 7595 | inline bool named_module_purview_p () | 
| 7596 | { return named_module_p () && module_purview_p (); } | 
| 7597 | inline bool named_module_attach_p () | 
| 7598 | { return named_module_p () && module_attach_p (); } | 
| 7599 |  | 
| 7600 | /* Like module_has_cmi_p, but tentatively assumes that this TU may have a | 
| 7601 |    CMI if we haven't seen the module-declaration yet.  */ | 
| 7602 | inline bool module_maybe_has_cmi_p () | 
| 7603 | { return module_has_cmi_p () || (named_module_p () && !module_purview_p ()); } | 
| 7604 |  | 
| 7605 | /* We're currently exporting declarations.  */ | 
| 7606 | inline bool module_exporting_p () | 
| 7607 | { return module_kind & MK_EXPORTING; } | 
| 7608 |  | 
| 7609 | extern module_state *get_module (tree name, module_state *parent = NULL, | 
| 7610 |                                  bool partition = false); | 
| 7611 | extern bool module_may_redeclare (tree olddecl, tree newdecl = NULL); | 
| 7612 |  | 
| 7613 | extern bool module_global_init_needed (); | 
| 7614 | extern bool module_determine_import_inits (); | 
| 7615 | extern void module_add_import_initializers (); | 
| 7616 |  | 
| 7617 | /* Where the namespace-scope decl was originally declared.  */ | 
| 7618 | extern void set_originating_module (tree, bool friend_p = false); | 
| 7619 | extern tree get_originating_module_decl (tree) ATTRIBUTE_PURE; | 
| 7620 | extern int get_originating_module (tree, bool for_mangle = false) ATTRIBUTE_PURE; | 
| 7621 | extern unsigned get_importing_module (tree, bool = false) ATTRIBUTE_PURE; | 
| 7622 | extern void check_module_decl_linkage (tree); | 
| 7623 |  | 
| 7624 | /* Where current instance of the decl got declared/defined/instantiated.  */ | 
| 7625 | extern void set_instantiating_module (tree); | 
| 7626 | extern void set_defining_module (tree); | 
| 7627 | extern void set_defining_module_for_partial_spec (tree); | 
| 7628 | extern void maybe_key_decl (tree ctx, tree decl); | 
| 7629 | extern void propagate_defining_module (tree decl, tree orig); | 
| 7630 | extern void remove_defining_module (tree decl); | 
| 7631 |  | 
| 7632 | extern void mangle_module (int m, bool include_partition); | 
| 7633 | extern void mangle_module_fini (); | 
| 7634 | extern void lazy_load_binding (unsigned mod, tree ns, tree id, | 
| 7635 |                                binding_slot *bslot); | 
| 7636 | extern void lazy_load_pendings (tree decl); | 
| 7637 | extern module_state *preprocess_module (module_state *, location_t, | 
| 7638 |                                         bool in_purview, | 
| 7639 |                                         bool is_import, bool export_p, | 
| 7640 |                                         cpp_reader *reader); | 
| 7641 | extern void preprocessed_module (cpp_reader *reader); | 
| 7642 | extern void import_module (module_state *, location_t, bool export_p, | 
| 7643 |                            tree attr, cpp_reader *); | 
| 7644 | extern void declare_module (module_state *, location_t, bool export_p, | 
| 7645 |                             tree attr, cpp_reader *); | 
| 7646 | extern void init_modules (cpp_reader *); | 
| 7647 | extern void fini_modules (cpp_reader *, void *cookie, bool); | 
| 7648 | extern void maybe_check_all_macros (cpp_reader *); | 
| 7649 | extern void *finish_module_processing (cpp_reader *); | 
| 7650 | extern char const *module_name (unsigned, bool ); | 
| 7651 | extern bitmap get_import_bitmap (); | 
| 7652 | extern bitmap visible_instantiation_path (bitmap *); | 
| 7653 | extern void module_begin_main_file (cpp_reader *, line_maps *, | 
| 7654 |                                     const line_map_ordinary *); | 
| 7655 | extern void module_preprocess_options (cpp_reader *); | 
| 7656 | extern bool handle_module_option (unsigned opt, const char *arg, int value); | 
| 7657 |  | 
| 7658 | /* In optimize.cc */ | 
| 7659 | extern tree clone_attrs                                (tree); | 
| 7660 | extern bool maybe_clone_body                        (tree); | 
| 7661 |  | 
| 7662 | /* In parser.cc */ | 
| 7663 | extern tree cp_convert_range_for (tree, tree, tree, cp_decomp *, bool, | 
| 7664 |                                   tree, bool); | 
| 7665 | extern void cp_convert_omp_range_for (tree &, tree &, tree &, | 
| 7666 |                                       tree &, tree &, tree &, tree &, tree &, | 
| 7667 |                                       bool); | 
| 7668 | extern void cp_finish_omp_range_for (tree, tree); | 
| 7669 | extern bool cp_maybe_parse_omp_decl (tree, tree); | 
| 7670 | extern bool parsing_nsdmi (void); | 
| 7671 | extern bool parsing_function_declarator (); | 
| 7672 | extern void inject_this_parameter (tree, cp_cv_quals); | 
| 7673 | extern location_t defparse_location (tree); | 
| 7674 | extern void maybe_show_extern_c_location (void); | 
| 7675 | extern bool literal_integer_zerop (const_tree); | 
| 7676 | extern tree attr_chainon (tree, tree); | 
| 7677 |  | 
| 7678 | /* in pt.cc */ | 
| 7679 | extern tree canonical_type_parameter                (tree); | 
| 7680 | extern void push_access_scope                        (tree); | 
| 7681 | extern void pop_access_scope                        (tree); | 
| 7682 | extern bool check_template_shadow                (tree); | 
| 7683 | extern tree get_innermost_template_args                (tree, int); | 
| 7684 | extern void maybe_begin_member_template_processing (tree); | 
| 7685 | extern void maybe_end_member_template_processing (void); | 
| 7686 | extern tree finish_member_template_decl                (tree); | 
| 7687 | extern void begin_template_parm_list                (void); | 
| 7688 | extern bool begin_specialization                (void); | 
| 7689 | extern void reset_specialization                (void); | 
| 7690 | extern void end_specialization                        (void); | 
| 7691 | extern void begin_explicit_instantiation        (void); | 
| 7692 | extern void end_explicit_instantiation                (void); | 
| 7693 | extern void check_unqualified_spec_or_inst        (tree, location_t); | 
| 7694 | extern tree check_explicit_specialization        (tree, tree, int, int, | 
| 7695 |                                                  tree = NULL_TREE); | 
| 7696 | extern int         (tree); | 
| 7697 | extern void check_template_variable                (tree); | 
| 7698 | extern tree make_auto                                (void); | 
| 7699 | extern tree make_decltype_auto                        (void); | 
| 7700 | extern tree make_constrained_auto                (tree, tree); | 
| 7701 | extern tree make_constrained_decltype_auto        (tree, tree); | 
| 7702 | extern tree make_template_placeholder                (tree); | 
| 7703 | extern tree make_cast_auto                        (void); | 
| 7704 | extern bool template_placeholder_p                (tree); | 
| 7705 | extern bool ctad_template_p                        (tree); | 
| 7706 | extern bool unparenthesized_id_or_class_member_access_p (tree); | 
| 7707 | extern tree do_auto_deduction                   (tree, tree, tree, | 
| 7708 |                                                  tsubst_flags_t | 
| 7709 |                                                  = tf_warning_or_error, | 
| 7710 |                                                  auto_deduction_context | 
| 7711 |                                                  = adc_unspecified, | 
| 7712 |                                                  tree = NULL_TREE, | 
| 7713 |                                                  int = LOOKUP_NORMAL, | 
| 7714 |                                                  tree = NULL_TREE); | 
| 7715 | extern tree type_uses_auto                        (tree); | 
| 7716 | extern tree convert_generic_types_to_packs        (tree, int, int); | 
| 7717 | extern tree splice_late_return_type                (tree, tree); | 
| 7718 | extern bool is_auto                                (const_tree); | 
| 7719 | extern tree process_template_parm                (tree, location_t, tree, | 
| 7720 |                                                  bool, bool); | 
| 7721 | extern tree end_template_parm_list                (tree); | 
| 7722 | extern void end_template_parm_list                (void); | 
| 7723 | extern void end_template_decl                        (void); | 
| 7724 | extern tree maybe_update_decl_type                (tree, tree); | 
| 7725 | extern bool check_default_tmpl_args             (tree, tree, bool, bool, int); | 
| 7726 | extern tree push_template_decl                        (tree, bool is_friend = false); | 
| 7727 | extern tree add_inherited_template_parms        (tree, tree); | 
| 7728 | extern void template_parm_level_and_index        (tree, int*, int*); | 
| 7729 | extern bool redeclare_class_template                (tree, tree, tree); | 
| 7730 | extern tree adjust_type_for_entering_scope        (tree); | 
| 7731 | extern tree lookup_template_class                (tree, tree, tree, tree, | 
| 7732 |                                                  tsubst_flags_t); | 
| 7733 | extern tree lookup_template_function                (tree, tree); | 
| 7734 | extern tree lookup_template_variable                (tree, tree, tsubst_flags_t); | 
| 7735 | extern bool uses_template_parms                        (tree); | 
| 7736 | extern bool uses_template_parms_level                (tree, int); | 
| 7737 | extern bool uses_outer_template_parms_in_constraints (tree, tree = NULL_TREE); | 
| 7738 | extern bool need_generic_capture                (void); | 
| 7739 | extern tree instantiate_class_template                (tree); | 
| 7740 | extern tree instantiate_template                (tree, tree, tsubst_flags_t); | 
| 7741 | extern tree fn_type_unification                        (tree, tree, tree, | 
| 7742 |                                                  const tree *, unsigned int, | 
| 7743 |                                                  tree, unification_kind_t, int, | 
| 7744 |                                                  struct conversion **, | 
| 7745 |                                                  bool, bool); | 
| 7746 | extern void setup_explicit_instantiation_definition_linkage (tree); | 
| 7747 | extern void mark_decl_instantiated                (tree, int); | 
| 7748 | extern int more_specialized_fn                        (tree, tree, int); | 
| 7749 | extern tree type_targs_deducible_from                (tree, tree); | 
| 7750 | extern void do_decl_instantiation                (tree, tree); | 
| 7751 | extern void do_type_instantiation                (tree, tree, tsubst_flags_t); | 
| 7752 | extern bool always_instantiate_p                (tree); | 
| 7753 | extern bool maybe_instantiate_noexcept                (tree, tsubst_flags_t = tf_warning_or_error); | 
| 7754 | extern tree instantiate_decl                        (tree, bool, bool); | 
| 7755 | extern void maybe_instantiate_decl                (tree); | 
| 7756 | extern int comp_template_parms                        (const_tree, const_tree); | 
| 7757 | extern bool template_heads_equivalent_p                (const_tree, const_tree); | 
| 7758 | extern bool builtin_pack_fn_p                        (tree); | 
| 7759 | extern tree uses_parameter_packs                (tree); | 
| 7760 | extern bool template_parameter_pack_p           (const_tree); | 
| 7761 | extern bool function_parameter_pack_p                (const_tree); | 
| 7762 | extern bool function_parameter_expanded_from_pack_p (tree, tree); | 
| 7763 | extern tree make_pack_expansion                 (tree, tsubst_flags_t = tf_warning_or_error); | 
| 7764 | extern tree make_pack_index                        (tree, tree); | 
| 7765 | extern bool check_for_bare_parameter_packs      (tree, location_t = UNKNOWN_LOCATION); | 
| 7766 | extern tree build_template_info                        (tree, tree); | 
| 7767 | extern tree get_template_info                        (const_tree); | 
| 7768 | extern int template_class_depth                        (tree); | 
| 7769 | extern int is_specialization_of                        (tree, tree); | 
| 7770 | extern bool is_specialization_of_friend                (tree, tree); | 
| 7771 | extern bool comp_template_args                        (tree, tree, tree * = NULL, | 
| 7772 |                                                  tree * = NULL); | 
| 7773 | extern int template_args_equal                  (tree, tree); | 
| 7774 | extern tree maybe_process_partial_specialization (tree); | 
| 7775 | extern tree most_specialized_instantiation        (tree); | 
| 7776 | extern tree most_specialized_partial_spec       (tree, tsubst_flags_t, bool = false); | 
| 7777 | extern tree most_constrained_function                (tree); | 
| 7778 | extern void print_candidates                        (tree); | 
| 7779 | extern void instantiate_pending_templates        (int); | 
| 7780 | extern tree tsubst_default_argument                (tree, int, tree, tree, | 
| 7781 |                                                  tsubst_flags_t); | 
| 7782 | extern tree tsubst (tree, tree, tsubst_flags_t, tree); | 
| 7783 | extern tree tsubst_expr                         (tree, tree, tsubst_flags_t, tree); | 
| 7784 | extern tree tsubst_pack_expansion                (tree, tree, tsubst_flags_t, tree); | 
| 7785 | extern tree tsubst_argument_pack                (tree, tree, tsubst_flags_t, tree); | 
| 7786 | extern tree tsubst_template_args                (tree, tree, tsubst_flags_t, tree); | 
| 7787 | extern tree tsubst_template_arg                        (tree, tree, tsubst_flags_t, tree); | 
| 7788 | extern tree tsubst_function_parms                (tree, tree, tsubst_flags_t, tree); | 
| 7789 | extern tree most_general_template                (const_tree); | 
| 7790 | extern tree get_mostly_instantiated_function_type (tree); | 
| 7791 | extern bool problematic_instantiation_changed        (void); | 
| 7792 | extern void record_last_problematic_instantiation (void); | 
| 7793 | extern struct tinst_level *current_instantiation(void); | 
| 7794 | extern bool instantiating_current_function_p    (void); | 
| 7795 | extern tree maybe_get_template_decl_from_type_decl (tree); | 
| 7796 | extern int processing_template_parmlist; | 
| 7797 | extern bool dependent_type_p                        (tree); | 
| 7798 | extern bool dependent_scope_p                        (tree); | 
| 7799 | extern bool dependentish_scope_p                (tree); | 
| 7800 | extern bool any_dependent_template_arguments_p  (const_tree); | 
| 7801 | extern bool any_erroneous_template_args_p       (const_tree); | 
| 7802 | extern bool dependent_template_p                (tree); | 
| 7803 | extern bool dependent_template_id_p                (tree, tree); | 
| 7804 | extern bool type_dependent_expression_p                (tree); | 
| 7805 | extern bool type_dependent_object_expression_p        (tree); | 
| 7806 | extern bool any_type_dependent_arguments_p      (const vec<tree, va_gc> *); | 
| 7807 | extern bool any_type_dependent_elements_p       (const_tree); | 
| 7808 | extern bool type_dependent_expression_p_push        (tree); | 
| 7809 | extern bool value_dependent_expression_p        (tree); | 
| 7810 | extern bool instantiation_dependent_uneval_expression_p (tree); | 
| 7811 | extern bool any_value_dependent_elements_p      (const_tree); | 
| 7812 | extern bool dependent_omp_for_p                        (tree, tree, tree, tree, tree); | 
| 7813 | extern tree resolve_typename_type                (tree, bool); | 
| 7814 | extern tree template_for_substitution                (tree); | 
| 7815 | extern bool reregister_specialization                (tree, tree, tree); | 
| 7816 | extern tree instantiate_non_dependent_expr        (tree, tsubst_flags_t = tf_error); | 
| 7817 | extern tree instantiate_non_dependent_expr_internal (tree, tsubst_flags_t); | 
| 7818 | extern tree instantiate_non_dependent_or_null   (tree); | 
| 7819 | extern bool variable_template_specialization_p  (tree); | 
| 7820 | extern bool alias_type_or_template_p            (tree); | 
| 7821 | enum { nt_opaque = false, nt_transparent = true }; | 
| 7822 | extern tree alias_template_specialization_p     (const_tree, bool); | 
| 7823 | extern tree dependent_alias_template_spec_p     (const_tree, bool); | 
| 7824 | extern bool dependent_opaque_alias_p            (const_tree); | 
| 7825 | extern tree get_template_parm_object                (tree expr, tree mangle, | 
| 7826 |                                                  bool check_init = true); | 
| 7827 | extern tree tparm_object_argument                (tree); | 
| 7828 | extern bool explicit_class_specialization_p     (tree); | 
| 7829 | extern bool push_tinst_level                    (tree); | 
| 7830 | extern bool push_tinst_level                    (tree, tree); | 
| 7831 | extern bool push_tinst_level_loc                (tree, location_t); | 
| 7832 | extern bool push_tinst_level_loc                (tree, tree, location_t); | 
| 7833 | extern void pop_tinst_level                     (void); | 
| 7834 | extern struct tinst_level *outermost_tinst_level(void); | 
| 7835 | extern bool non_templated_friend_p                (tree); | 
| 7836 | extern void init_template_processing                (void); | 
| 7837 | extern void print_template_statistics                (void); | 
| 7838 | bool template_template_parameter_p                (const_tree); | 
| 7839 | bool template_type_parameter_p                  (const_tree); | 
| 7840 | extern bool primary_template_specialization_p   (const_tree); | 
| 7841 | extern tree get_primary_template_innermost_parameters        (const_tree); | 
| 7842 | extern tree get_template_innermost_arguments        (const_tree); | 
| 7843 | extern tree get_template_argument_pack_elems        (const_tree); | 
| 7844 | extern tree get_function_template_decl                (const_tree); | 
| 7845 | extern tree resolve_nondeduced_context                (tree, tsubst_flags_t); | 
| 7846 | extern tree resolve_nondeduced_context_or_error        (tree, tsubst_flags_t); | 
| 7847 | extern hashval_t iterative_hash_template_arg        (tree arg, hashval_t val); | 
| 7848 | extern tree coerce_template_parms                (tree, tree, tree, tsubst_flags_t, | 
| 7849 |                                                  bool = true); | 
| 7850 | extern tree canonicalize_type_argument                (tree, tsubst_flags_t); | 
| 7851 | extern void register_local_identity                (tree); | 
| 7852 | extern void register_local_specialization       (tree, tree); | 
| 7853 | extern tree retrieve_local_specialization       (tree); | 
| 7854 | extern void register_parameter_specializations        (tree, tree); | 
| 7855 | extern tree                  (tree, tree *); | 
| 7856 | extern tree template_parm_to_arg                (tree); | 
| 7857 | extern tree dguide_name                                (tree); | 
| 7858 | extern bool dguide_name_p                        (tree); | 
| 7859 | extern bool deduction_guide_p                        (const_tree); | 
| 7860 | extern bool copy_guide_p                        (const_tree); | 
| 7861 | extern bool template_guide_p                        (const_tree); | 
| 7862 | extern bool builtin_guide_p                        (const_tree); | 
| 7863 | extern bool inherited_guide_p                        (const_tree); | 
| 7864 | extern void store_explicit_specifier                (tree, tree); | 
| 7865 | extern tree lookup_explicit_specifier                (tree); | 
| 7866 | extern tree lookup_imported_hidden_friend        (tree); | 
| 7867 | extern void walk_specializations                (bool, | 
| 7868 |                                                  void (*)(bool, spec_entry *, | 
| 7869 |                                                           void *), | 
| 7870 |                                                  void *); | 
| 7871 | extern tree match_mergeable_specialization        (bool is_decl, spec_entry *); | 
| 7872 | extern unsigned get_mergeable_specialization_flags (bool is_decl, tree tmpl, | 
| 7873 |                                                     tree spec); | 
| 7874 | extern void add_mergeable_specialization        (bool is_decl, spec_entry *, | 
| 7875 |                                                  tree outer, unsigned); | 
| 7876 | extern tree add_to_template_args                (tree, tree); | 
| 7877 | extern tree add_outermost_template_args                (tree, tree); | 
| 7878 | extern tree                         (tree, tree, tsubst_flags_t, tree); | 
| 7879 | extern tree                         (tree, tree, tsubst_flags_t); | 
| 7880 |  | 
| 7881 | /* in rtti.cc */ | 
| 7882 | /* A vector of all tinfo decls that haven't been emitted yet.  */ | 
| 7883 | extern GTY(()) vec<tree, va_gc> *unemitted_tinfo_decls; | 
| 7884 |  | 
| 7885 | extern void init_rtti_processing                (void); | 
| 7886 | extern tree build_typeid                        (tree, tsubst_flags_t); | 
| 7887 | extern tree get_tinfo_decl_direct                (tree, tree, int); | 
| 7888 | extern tree get_tinfo_decl                        (tree); | 
| 7889 | extern tree get_typeid                                (tree, tsubst_flags_t); | 
| 7890 | extern tree build_headof                        (tree); | 
| 7891 | extern tree build_dynamic_cast                        (location_t, tree, tree, | 
| 7892 |                                                  tsubst_flags_t); | 
| 7893 | extern void emit_support_tinfos                        (void); | 
| 7894 | extern bool emit_tinfo_decl                        (tree); | 
| 7895 | extern unsigned get_pseudo_tinfo_index                (tree); | 
| 7896 | extern tree get_pseudo_tinfo_type                (unsigned); | 
| 7897 | extern tree build_if_nonnull                        (tree, tree, tsubst_flags_t); | 
| 7898 |  | 
| 7899 | /* in search.cc */ | 
| 7900 | extern tree get_parent_with_private_access         (tree decl, tree binfo); | 
| 7901 | extern bool accessible_base_p                        (tree, tree, bool); | 
| 7902 | extern tree lookup_base                         (tree, tree, base_access, | 
| 7903 |                                                  base_kind *, tsubst_flags_t, | 
| 7904 |                                                  HOST_WIDE_INT = -1); | 
| 7905 | extern tree dcast_base_hint                        (tree, tree); | 
| 7906 | extern int accessible_p                                (tree, tree, bool); | 
| 7907 | extern int accessible_in_template_p                (tree, tree); | 
| 7908 | extern tree lookup_field                        (tree, tree, int, bool); | 
| 7909 | extern tree lookup_fnfields                        (tree, tree, int, tsubst_flags_t); | 
| 7910 | extern tree lookup_member                        (tree, tree, int, bool, | 
| 7911 |                                                  tsubst_flags_t, | 
| 7912 |                                                  access_failure_info *afi = NULL); | 
| 7913 | extern tree lookup_member_fuzzy                        (tree, tree, bool); | 
| 7914 | extern tree locate_field_accessor                (tree, tree, bool); | 
| 7915 | extern int look_for_overrides                        (tree, tree); | 
| 7916 | extern void get_pure_virtuals                        (tree); | 
| 7917 | extern void maybe_suppress_debug_info                (tree); | 
| 7918 | extern void note_debug_info_needed                (tree); | 
| 7919 | extern tree current_scope                        (void); | 
| 7920 | extern int at_function_scope_p                        (void); | 
| 7921 | extern bool at_class_scope_p                        (void); | 
| 7922 | extern bool at_namespace_scope_p                (void); | 
| 7923 | extern tree context_for_name_lookup                (tree); | 
| 7924 | extern tree type_context_for_name_lookup        (tree); | 
| 7925 | extern tree lookup_conversions                        (tree); | 
| 7926 | extern tree binfo_from_vbase                        (tree); | 
| 7927 | extern tree binfo_for_vbase                        (tree, tree); | 
| 7928 | extern tree look_for_overrides_here                (tree, tree); | 
| 7929 | #define dfs_skip_bases ((tree)1) | 
| 7930 | extern tree dfs_walk_all (tree, tree (*) (tree, void *), | 
| 7931 |                           tree (*) (tree, void *), void *); | 
| 7932 | extern tree dfs_walk_once (tree, tree (*) (tree, void *), | 
| 7933 |                            tree (*) (tree, void *), void *); | 
| 7934 | extern tree binfo_via_virtual                        (tree, tree); | 
| 7935 | extern bool binfo_direct_p                        (tree); | 
| 7936 | extern tree build_baselink                        (tree, tree, tree, tree); | 
| 7937 | extern tree adjust_result_of_qualified_name_lookup | 
| 7938 |                                                 (tree, tree, tree); | 
| 7939 | extern tree copied_binfo                        (tree, tree); | 
| 7940 | extern tree original_binfo                        (tree, tree); | 
| 7941 | extern bool shared_member_p                        (tree); | 
| 7942 | extern bool any_dependent_bases_p (tree = current_nonlambda_class_type ()); | 
| 7943 | extern bool maybe_check_overriding_exception_spec (tree, tree); | 
| 7944 |  | 
| 7945 | /* in semantics.cc */ | 
| 7946 | extern void push_deferring_access_checks        (deferring_kind); | 
| 7947 | extern void resume_deferring_access_checks        (void); | 
| 7948 | extern void stop_deferring_access_checks        (void); | 
| 7949 | extern void pop_deferring_access_checks                (void); | 
| 7950 | extern vec<deferred_access_check, va_gc> *get_deferred_access_checks (void); | 
| 7951 | extern void reopen_deferring_access_checks (vec<deferred_access_check, va_gc> *); | 
| 7952 | extern void pop_to_parent_deferring_access_checks (void); | 
| 7953 | extern bool perform_access_checks (vec<deferred_access_check, va_gc> *, | 
| 7954 |                                    tsubst_flags_t); | 
| 7955 | extern bool perform_deferred_access_checks        (tsubst_flags_t); | 
| 7956 | extern bool perform_or_defer_access_check        (tree, tree, tree, | 
| 7957 |                                                  tsubst_flags_t, | 
| 7958 |                                                  access_failure_info *afi = NULL); | 
| 7959 | extern tree maybe_convert_cond (tree); | 
| 7960 |  | 
| 7961 | /* RAII sentinel to ensures that deferred access checks are popped before | 
| 7962 |   a function returns.  */ | 
| 7963 |  | 
| 7964 | class deferring_access_check_sentinel | 
| 7965 | { | 
| 7966 | public: | 
| 7967 |   deferring_access_check_sentinel (enum deferring_kind kind = dk_deferred) | 
| 7968 |   { | 
| 7969 |     push_deferring_access_checks (kind); | 
| 7970 |   } | 
| 7971 |   ~deferring_access_check_sentinel () | 
| 7972 |   { | 
| 7973 |     pop_deferring_access_checks (); | 
| 7974 |   } | 
| 7975 | }; | 
| 7976 |  | 
| 7977 | extern int stmts_are_full_exprs_p                (void); | 
| 7978 | extern void init_cp_semantics                        (void); | 
| 7979 | extern tree do_poplevel                                (tree); | 
| 7980 | extern void break_maybe_infinite_loop                (void); | 
| 7981 | extern void add_decl_expr                        (tree); | 
| 7982 | extern tree maybe_cleanup_point_expr_void        (tree); | 
| 7983 | extern tree finish_expr_stmt                        (tree); | 
| 7984 | extern tree begin_if_stmt                        (void); | 
| 7985 | extern tree finish_if_stmt_cond                        (tree, tree); | 
| 7986 | extern tree finish_then_clause                        (tree); | 
| 7987 | extern void begin_else_clause                        (tree); | 
| 7988 | extern void finish_else_clause                        (tree); | 
| 7989 | extern void finish_if_stmt                        (tree); | 
| 7990 | extern tree begin_while_stmt                        (void); | 
| 7991 | extern void finish_while_stmt_cond        (tree, tree, bool, tree, bool); | 
| 7992 | extern void finish_while_stmt                        (tree); | 
| 7993 | extern tree begin_do_stmt                        (void); | 
| 7994 | extern void finish_do_body                        (tree); | 
| 7995 | extern void finish_do_stmt                (tree, tree, bool, tree, bool); | 
| 7996 | extern tree finish_return_stmt                        (tree); | 
| 7997 | extern tree begin_for_scope                        (tree *); | 
| 7998 | extern tree begin_for_stmt                        (tree, tree); | 
| 7999 | extern void finish_init_stmt                        (tree); | 
| 8000 | extern void finish_for_cond                (tree, tree, bool, tree, bool); | 
| 8001 | extern void finish_for_expr                        (tree, tree); | 
| 8002 | extern void find_range_for_decls                (tree[3]); | 
| 8003 | extern void finish_for_stmt                        (tree); | 
| 8004 | extern tree begin_range_for_stmt                (tree, tree); | 
| 8005 | extern void finish_range_for_decl                (tree, tree, tree); | 
| 8006 | extern void finish_range_for_stmt                (tree); | 
| 8007 | extern tree finish_break_stmt                        (void); | 
| 8008 | extern tree finish_continue_stmt                (void); | 
| 8009 | extern tree begin_switch_stmt                        (void); | 
| 8010 | extern void finish_switch_cond                        (tree, tree); | 
| 8011 | extern void finish_switch_stmt                        (tree); | 
| 8012 | extern tree finish_goto_stmt                        (tree); | 
| 8013 | extern tree begin_try_block                        (void); | 
| 8014 | extern void finish_try_block                        (tree); | 
| 8015 | extern void finish_handler_sequence                (tree); | 
| 8016 | extern tree begin_function_try_block                (tree *); | 
| 8017 | extern void finish_function_try_block                (tree); | 
| 8018 | extern void finish_function_handler_sequence    (tree, tree); | 
| 8019 | extern void finish_cleanup_try_block                (tree); | 
| 8020 | extern tree begin_handler                        (void); | 
| 8021 | extern void finish_handler_parms                (tree, tree); | 
| 8022 | extern void finish_handler                        (tree); | 
| 8023 | extern void finish_cleanup                        (tree, tree); | 
| 8024 | extern bool is_this_parameter                   (tree); | 
| 8025 | extern bool is_object_parameter                 (tree); | 
| 8026 |  | 
| 8027 | enum { | 
| 8028 |   BCS_NORMAL = 0, | 
| 8029 |   BCS_NO_SCOPE = 1, | 
| 8030 |   BCS_TRY_BLOCK = 2, | 
| 8031 |   BCS_FN_BODY = 4, | 
| 8032 |   BCS_TRANSACTION = 8, | 
| 8033 |   BCS_STMT_EXPR = 16 | 
| 8034 | }; | 
| 8035 | extern tree begin_compound_stmt                        (unsigned int); | 
| 8036 |  | 
| 8037 | extern void finish_compound_stmt                (tree); | 
| 8038 | extern tree finish_asm_string_expression        (location_t, tree); | 
| 8039 | extern tree finish_asm_stmt                        (location_t, int, tree, tree, | 
| 8040 |                                                  tree, tree, tree, bool, bool); | 
| 8041 | extern tree finish_label_stmt                        (tree); | 
| 8042 | extern void finish_label_decl                        (tree); | 
| 8043 | extern cp_expr finish_parenthesized_expr        (cp_expr); | 
| 8044 | extern tree force_paren_expr                        (tree, bool = false); | 
| 8045 | inline tree force_paren_expr_uneval                 (tree t) | 
| 8046 | { return force_paren_expr (t, true); } | 
| 8047 | extern tree maybe_undo_parenthesized_ref        (tree); | 
| 8048 | extern tree finish_non_static_data_member       (tree, tree, tree, | 
| 8049 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 8050 | extern tree begin_stmt_expr                        (void); | 
| 8051 | extern tree finish_stmt_expr_expr                (tree, tree); | 
| 8052 | extern tree finish_stmt_expr                        (tree, bool); | 
| 8053 | extern tree stmt_expr_value_expr                (tree); | 
| 8054 | bool empty_expr_stmt_p                                (tree); | 
| 8055 | extern cp_expr perform_koenig_lookup                (cp_expr, vec<tree, va_gc> *, | 
| 8056 |                                                  tsubst_flags_t); | 
| 8057 | extern tree finish_call_expr                        (tree, vec<tree, va_gc> **, bool, | 
| 8058 |                                                  bool, tsubst_flags_t); | 
| 8059 | extern tree lookup_and_finish_template_variable (tree, tree, tsubst_flags_t = tf_warning_or_error); | 
| 8060 | extern tree finish_template_variable                (tree, tsubst_flags_t = tf_warning_or_error); | 
| 8061 | extern cp_expr finish_increment_expr                (cp_expr, enum tree_code); | 
| 8062 | extern tree finish_this_expr                        (void); | 
| 8063 | extern tree finish_pseudo_destructor_expr       (tree, tree, tree, location_t, tsubst_flags_t); | 
| 8064 | extern cp_expr finish_unary_op_expr                (location_t, enum tree_code, cp_expr, | 
| 8065 |                                                  tsubst_flags_t); | 
| 8066 | /* Whether this call to finish_compound_literal represents a C++11 functional | 
| 8067 |    cast or a C99 compound literal.  */ | 
| 8068 | enum fcl_t { fcl_functional, fcl_c99 }; | 
| 8069 | extern tree finish_compound_literal                (tree, tree, tsubst_flags_t, fcl_t = fcl_functional); | 
| 8070 | extern tree finish_fname                        (tree); | 
| 8071 | extern void finish_translation_unit                (void); | 
| 8072 | extern tree finish_template_type_parm                (tree, tree); | 
| 8073 | extern tree finish_template_template_parm       (tree, tree); | 
| 8074 | extern tree begin_class_definition                (tree); | 
| 8075 | extern void finish_template_decl                (tree); | 
| 8076 | extern tree finish_template_type                (tree, tree, int); | 
| 8077 | extern tree finish_base_specifier                (tree, tree, bool); | 
| 8078 | extern void finish_member_declaration                (tree); | 
| 8079 | extern bool outer_automatic_var_p                (tree); | 
| 8080 | extern tree process_outer_var_ref                (tree, tsubst_flags_t, bool force_use = false); | 
| 8081 | extern cp_expr finish_id_expression                (tree, tree, tree, | 
| 8082 |                                                  cp_id_kind *, | 
| 8083 |                                                  bool, bool, bool *, | 
| 8084 |                                                  bool, bool, bool, bool, | 
| 8085 |                                                  const char **, | 
| 8086 |                                                  location_t); | 
| 8087 | extern tree finish_typeof                        (tree); | 
| 8088 | extern tree finish_underlying_type                (tree); | 
| 8089 | extern tree calculate_bases                     (tree, tsubst_flags_t); | 
| 8090 | extern tree finish_bases                        (tree, bool); | 
| 8091 | extern tree calculate_direct_bases              (tree, tsubst_flags_t); | 
| 8092 | extern tree pack_index_element                        (tree, tree, bool, | 
| 8093 |                                                  tsubst_flags_t); | 
| 8094 | extern tree finish_offsetof                        (tree, tree, location_t); | 
| 8095 | extern void finish_decl_cleanup                        (tree, tree); | 
| 8096 | extern void finish_eh_cleanup                        (tree); | 
| 8097 | extern void emit_associated_thunks                (tree); | 
| 8098 | extern void finish_mem_initializers                (tree); | 
| 8099 | extern tree check_template_template_default_arg (tree); | 
| 8100 | extern bool expand_or_defer_fn_1                (tree); | 
| 8101 | extern void expand_or_defer_fn                        (tree); | 
| 8102 | extern bool check_accessibility_of_qualified_id (tree, tree, tree, tsubst_flags_t); | 
| 8103 | extern tree finish_qualified_id_expr                (tree, tree, bool, bool, | 
| 8104 |                                                  bool, bool, tsubst_flags_t); | 
| 8105 | extern void simplify_aggr_init_expr                (tree *); | 
| 8106 | extern void finalize_nrv                        (tree, tree); | 
| 8107 | extern tree omp_reduction_id                        (enum tree_code, tree, tree); | 
| 8108 | extern tree omp_mapper_id                        (tree, tree); | 
| 8109 | extern tree cp_remove_omp_priv_cleanup_stmt        (tree *, int *, void *); | 
| 8110 | extern bool cp_check_omp_declare_reduction        (tree); | 
| 8111 | extern bool cp_check_omp_declare_mapper                (tree); | 
| 8112 | extern void finish_omp_declare_simd_methods        (tree); | 
| 8113 | extern tree cp_finish_omp_init_prefer_type        (tree); | 
| 8114 | extern tree finish_omp_clauses                        (tree, enum c_omp_region_type); | 
| 8115 | extern tree omp_instantiate_mappers                (tree); | 
| 8116 | extern tree push_omp_privatization_clauses        (bool); | 
| 8117 | extern void pop_omp_privatization_clauses        (tree); | 
| 8118 | extern void save_omp_privatization_clauses        (vec<tree> &); | 
| 8119 | extern void restore_omp_privatization_clauses        (vec<tree> &); | 
| 8120 | extern void finish_omp_threadprivate                (tree); | 
| 8121 | extern tree begin_omp_structured_block                (void); | 
| 8122 | extern tree finish_omp_structured_block                (tree); | 
| 8123 | extern tree finish_oacc_data                        (tree, tree); | 
| 8124 | extern tree finish_oacc_host_data                (tree, tree); | 
| 8125 | extern tree finish_omp_construct                (enum tree_code, tree, tree); | 
| 8126 | extern tree begin_omp_parallel                        (void); | 
| 8127 | extern tree finish_omp_parallel                        (tree, tree); | 
| 8128 | extern tree begin_omp_task                        (void); | 
| 8129 | extern tree finish_omp_task                        (tree, tree); | 
| 8130 | extern tree finish_omp_for                        (location_t, enum tree_code, | 
| 8131 |                                                  tree, tree, tree, tree, tree, | 
| 8132 |                                                  tree, tree, vec<tree> *, tree); | 
| 8133 | extern tree finish_omp_for_block                (tree, tree); | 
| 8134 | extern void finish_omp_atomic                        (location_t, enum tree_code, | 
| 8135 |                                                  enum tree_code, tree, tree, | 
| 8136 |                                                  tree, tree, tree, tree, tree, | 
| 8137 |                                                  enum omp_memory_order, bool); | 
| 8138 | extern void finish_omp_barrier                        (void); | 
| 8139 | extern void finish_omp_depobj                        (location_t, tree, | 
| 8140 |                                                  enum omp_clause_depend_kind, | 
| 8141 |                                                  tree); | 
| 8142 | extern void finish_omp_flush                        (int); | 
| 8143 | extern void finish_omp_taskwait                        (void); | 
| 8144 | extern void finish_omp_taskyield                (void); | 
| 8145 | extern void finish_omp_cancel                        (tree); | 
| 8146 | extern void finish_omp_cancellation_point        (tree); | 
| 8147 | extern tree omp_privatize_field                        (tree, bool); | 
| 8148 | extern tree begin_transaction_stmt                (location_t, tree *, int); | 
| 8149 | extern void finish_transaction_stmt                (tree, tree, int, tree); | 
| 8150 | extern tree build_transaction_expr                (location_t, tree, int, tree); | 
| 8151 | extern bool cxx_omp_create_clause_info                (tree, tree, bool, bool, | 
| 8152 |                                                  bool, bool); | 
| 8153 | extern tree baselink_for_fns                    (tree); | 
| 8154 | extern void finish_static_assert                (tree, tree, location_t, | 
| 8155 |                                                  bool, bool); | 
| 8156 | extern tree finish_decltype_type                (tree, bool, tsubst_flags_t); | 
| 8157 | extern tree fold_builtin_is_corresponding_member (location_t, int, tree *); | 
| 8158 | extern tree fold_builtin_is_pointer_inverconvertible_with_class (location_t, int, tree *); | 
| 8159 | extern tree finish_trait_expr                        (location_t, enum cp_trait_kind, tree, tree); | 
| 8160 | extern tree finish_trait_type                        (enum cp_trait_kind, tree, tree, tsubst_flags_t); | 
| 8161 | extern tree build_lambda_expr                   (void); | 
| 8162 | extern tree build_lambda_object                        (tree); | 
| 8163 | extern tree begin_lambda_type                   (tree); | 
| 8164 | extern tree lambda_capture_field_type                (tree, bool, bool); | 
| 8165 | extern tree lambda_proxy_type                        (tree); | 
| 8166 | extern tree lambda_function                        (tree); | 
| 8167 | extern void apply_deduced_return_type           (tree, tree); | 
| 8168 | extern tree add_capture                         (tree, tree, tree, bool, bool, unsigned *); | 
| 8169 | extern tree add_default_capture                 (tree, tree, tree); | 
| 8170 | extern void insert_capture_proxy                (tree); | 
| 8171 | extern void insert_pending_capture_proxies        (void); | 
| 8172 | extern bool is_capture_proxy                        (tree); | 
| 8173 | extern bool is_normal_capture_proxy             (tree); | 
| 8174 | extern tree strip_normal_capture_proxy                (tree); | 
| 8175 | extern bool is_constant_capture_proxy           (tree); | 
| 8176 | extern void register_capture_members                (tree); | 
| 8177 | extern tree lambda_expr_this_capture            (tree, int); | 
| 8178 | extern void maybe_generic_this_capture                (tree, tree); | 
| 8179 | extern tree maybe_resolve_dummy                        (tree, bool); | 
| 8180 | extern tree current_nonlambda_function                (void); | 
| 8181 | extern tree nonlambda_method_basetype                (void); | 
| 8182 | extern tree current_nonlambda_scope                (bool = false); | 
| 8183 | extern tree current_lambda_expr                        (void); | 
| 8184 | extern bool generic_lambda_fn_p                        (tree); | 
| 8185 | extern tree do_dependent_capture                (tree, bool = false); | 
| 8186 | extern bool lambda_fn_in_template_p                (tree); | 
| 8187 | extern void maybe_add_lambda_conv_op            (tree); | 
| 8188 | extern bool is_lambda_ignored_entity            (tree); | 
| 8189 | extern bool lambda_static_thunk_p                (tree); | 
| 8190 | extern bool call_from_lambda_thunk_p                (tree); | 
| 8191 | extern tree finish_builtin_launder                (location_t, tree, | 
| 8192 |                                                  tsubst_flags_t); | 
| 8193 | extern tree cp_build_vec_convert                (tree, location_t, tree, | 
| 8194 |                                                  tsubst_flags_t); | 
| 8195 | extern tree cp_build_bit_cast                        (location_t, tree, tree, | 
| 8196 |                                                  tsubst_flags_t); | 
| 8197 | extern void start_lambda_scope                        (tree decl); | 
| 8198 | extern void finish_lambda_scope                        (void); | 
| 8199 | extern void record_lambda_scope                        (tree lambda); | 
| 8200 | extern void record_lambda_scope_discriminator        (tree lambda); | 
| 8201 | extern void record_lambda_scope_sig_discriminator (tree lambda, tree fn); | 
| 8202 | extern tree start_lambda_function                (tree fn, tree lambda_expr); | 
| 8203 | extern void finish_lambda_function                (tree body); | 
| 8204 | extern bool regenerated_lambda_fn_p                (tree); | 
| 8205 | extern tree lambda_regenerating_args                (tree); | 
| 8206 | extern tree most_general_lambda                        (tree); | 
| 8207 | extern tree finish_omp_target                        (location_t, tree, tree, bool); | 
| 8208 | extern void finish_omp_target_clauses                (location_t, tree, tree *); | 
| 8209 | extern void maybe_warn_unparenthesized_assignment (tree, bool, tsubst_flags_t); | 
| 8210 | extern tree cp_check_pragma_unroll                (location_t, tree); | 
| 8211 |  | 
| 8212 | /* in tree.cc */ | 
| 8213 | extern int cp_tree_operand_length                (const_tree); | 
| 8214 | extern int cp_tree_code_length                        (enum tree_code); | 
| 8215 | extern void cp_free_lang_data                         (tree t); | 
| 8216 | extern tree force_target_expr                        (tree, tree, tsubst_flags_t); | 
| 8217 | extern tree build_target_expr_with_type                (tree, tree, tsubst_flags_t); | 
| 8218 | extern void lang_check_failed                        (const char *, int, | 
| 8219 |                                                  const char *) ATTRIBUTE_NORETURN | 
| 8220 |                                                  ATTRIBUTE_COLD; | 
| 8221 | extern tree stabilize_expr                        (tree, tree *); | 
| 8222 | extern void stabilize_call                        (tree, tree *); | 
| 8223 | extern bool stabilize_init                        (tree, tree *); | 
| 8224 | extern tree add_stmt_to_compound                (tree, tree); | 
| 8225 | extern void init_tree                                (void); | 
| 8226 | extern bool pod_type_p                                (const_tree); | 
| 8227 | extern bool layout_pod_type_p                        (const_tree); | 
| 8228 | extern bool std_layout_type_p                        (const_tree); | 
| 8229 | extern bool trivial_type_p                        (const_tree); | 
| 8230 | extern bool trivially_copyable_p                (const_tree); | 
| 8231 | extern bool type_has_unique_obj_representations (const_tree); | 
| 8232 | extern bool scalarish_type_p                        (const_tree); | 
| 8233 | extern bool structural_type_p                        (tree, bool = false); | 
| 8234 | extern bool type_has_nontrivial_default_init        (const_tree); | 
| 8235 | extern bool type_has_nontrivial_copy_init        (const_tree); | 
| 8236 | extern void maybe_warn_parm_abi                        (tree, location_t); | 
| 8237 | extern bool class_tmpl_impl_spec_p                (const_tree); | 
| 8238 | extern int zero_init_p                                (const_tree); | 
| 8239 | extern bool zero_init_expr_p                        (tree); | 
| 8240 | extern bool check_abi_tag_redeclaration                (const_tree, const_tree, | 
| 8241 |                                                  const_tree); | 
| 8242 | extern bool check_abi_tag_args                        (tree, tree); | 
| 8243 | extern tree strip_typedefs                        (tree, bool * = NULL, | 
| 8244 |                                                  unsigned int = 0); | 
| 8245 | extern tree strip_typedefs_expr                        (tree, bool * = NULL, | 
| 8246 |                                                  unsigned int = 0); | 
| 8247 | extern tree copy_binfo                                (tree, tree, tree, | 
| 8248 |                                                  tree *, int); | 
| 8249 | extern int member_p                                (const_tree); | 
| 8250 | extern cp_lvalue_kind real_lvalue_p                (const_tree); | 
| 8251 | extern cp_lvalue_kind lvalue_kind                (const_tree); | 
| 8252 | extern bool glvalue_p                                (const_tree); | 
| 8253 | extern bool obvalue_p                                (const_tree); | 
| 8254 | extern bool xvalue_p                                (const_tree); | 
| 8255 | extern bool bitfield_p                                (const_tree); | 
| 8256 | extern bool non_mergeable_glvalue_p                (const_tree); | 
| 8257 | extern tree cp_stabilize_reference                (tree); | 
| 8258 | extern bool builtin_valid_in_constant_expr_p    (const_tree); | 
| 8259 | extern tree build_min                                (enum tree_code, tree, ...); | 
| 8260 | extern tree build_min_nt_loc                        (location_t, enum tree_code, | 
| 8261 |                                                  ...); | 
| 8262 | extern tree build_min_non_dep                        (enum tree_code, tree, ...); | 
| 8263 | extern tree build_min_non_dep_op_overload        (enum tree_code, tree, tree, ...); | 
| 8264 | extern tree build_min_non_dep_op_overload        (tree, tree, tree, | 
| 8265 |                                                  vec<tree, va_gc> *); | 
| 8266 | extern tree build_min_nt_call_vec (tree, vec<tree, va_gc> *); | 
| 8267 | extern tree build_min_non_dep_call_vec                (tree, tree, vec<tree, va_gc> *); | 
| 8268 | extern vec<tree, va_gc>* vec_copy_and_insert    (vec<tree, va_gc>*, tree, unsigned); | 
| 8269 | extern tree build_cplus_new                        (tree, tree, tsubst_flags_t); | 
| 8270 | extern tree build_local_temp                        (tree); | 
| 8271 | extern bool is_local_temp                        (tree); | 
| 8272 | extern tree build_aggr_init_expr                (tree, tree); | 
| 8273 | extern tree get_target_expr                        (tree, | 
| 8274 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 8275 | extern tree get_internal_target_expr                (tree); | 
| 8276 | extern tree build_cplus_array_type                (tree, tree, int is_dep = -1); | 
| 8277 | extern tree build_array_of_n_type                (tree, unsigned HOST_WIDE_INT); | 
| 8278 | extern bool array_of_runtime_bound_p                (tree); | 
| 8279 | extern bool vla_type_p                                (tree); | 
| 8280 | extern tree build_array_copy                        (tree); | 
| 8281 | extern tree build_vec_init_expr                        (tree, tree, tsubst_flags_t); | 
| 8282 | extern tree expand_vec_init_expr                (tree, tree, tsubst_flags_t, | 
| 8283 |                                                  vec<tree,va_gc>** = nullptr); | 
| 8284 | extern void diagnose_non_constexpr_vec_init        (tree); | 
| 8285 | extern tree hash_tree_cons                        (tree, tree, tree); | 
| 8286 | extern tree hash_tree_chain                        (tree, tree); | 
| 8287 | extern tree build_qualified_name                (tree, tree, tree, bool); | 
| 8288 | extern tree build_ref_qualified_type                (tree, cp_ref_qualifier); | 
| 8289 | extern tree make_binding_vec                        (tree, unsigned clusters CXX_MEM_STAT_INFO); | 
| 8290 | inline tree ovl_first                                (tree) ATTRIBUTE_PURE; | 
| 8291 | extern tree ovl_make                                (tree fn, | 
| 8292 |                                                  tree next = NULL_TREE); | 
| 8293 | extern tree ovl_insert                                (tree fn, tree maybe_ovl, | 
| 8294 |                                                  int using_or_hidden = 0); | 
| 8295 | extern tree ovl_skip_hidden                        (tree) ATTRIBUTE_PURE; | 
| 8296 | extern void lookup_mark                                (tree lookup, bool val); | 
| 8297 | extern tree lookup_add                                (tree fns, tree lookup); | 
| 8298 | extern tree lookup_maybe_add                        (tree fns, tree lookup, | 
| 8299 |                                                  bool deduping); | 
| 8300 | extern int is_overloaded_fn                        (tree) ATTRIBUTE_PURE; | 
| 8301 | extern bool really_overloaded_fn                (tree) ATTRIBUTE_PURE; | 
| 8302 | extern tree dependent_name                        (tree); | 
| 8303 | extern tree call_expr_dependent_name                (tree); | 
| 8304 | extern tree maybe_get_fns                        (tree) ATTRIBUTE_PURE; | 
| 8305 | extern tree get_fns                                (tree) ATTRIBUTE_PURE; | 
| 8306 | extern tree get_first_fn                        (tree) ATTRIBUTE_PURE; | 
| 8307 | extern tree ovl_scope                                (tree); | 
| 8308 | extern const char *cxx_printable_name                (tree, int); | 
| 8309 | extern const char *cxx_printable_name_translate        (tree, int); | 
| 8310 | extern tree canonical_eh_spec                        (tree); | 
| 8311 | extern tree build_cp_fntype_variant                (tree, cp_ref_qualifier, tree, bool); | 
| 8312 | extern tree build_exception_variant                (tree, tree); | 
| 8313 | extern void fixup_deferred_exception_variants   (tree, tree); | 
| 8314 | extern tree bind_template_template_parm                (tree, tree); | 
| 8315 | extern tree array_type_nelts_total                (tree); | 
| 8316 | extern bool array_of_unknown_bound_p                (const_tree); | 
| 8317 | extern tree break_out_target_exprs                (tree, bool = false); | 
| 8318 | extern tree build_ctor_subob_ref                (tree, tree, tree); | 
| 8319 | extern tree replace_placeholders                (tree, tree, bool * = NULL); | 
| 8320 | extern bool find_placeholders                        (tree); | 
| 8321 | extern tree get_type_decl                        (tree); | 
| 8322 | extern tree decl_namespace_context                (tree); | 
| 8323 | extern bool decl_anon_ns_mem_p                        (tree); | 
| 8324 | extern bool decl_internal_context_p                (const_tree); | 
| 8325 | extern tree lvalue_type                                (tree); | 
| 8326 | extern tree error_type                                (tree); | 
| 8327 | extern int varargs_function_p                        (const_tree); | 
| 8328 | extern bool cp_tree_equal                        (tree, tree); | 
| 8329 | extern tree no_linkage_check                        (tree, bool); | 
| 8330 | extern void debug_binfo                                (tree); | 
| 8331 | extern tree build_dummy_object                        (tree); | 
| 8332 | extern tree maybe_dummy_object                        (tree, tree *); | 
| 8333 | extern bool is_dummy_object                        (const_tree); | 
| 8334 | extern bool is_byte_access_type                        (tree); | 
| 8335 | extern bool is_byte_access_type_not_plain_char        (tree); | 
| 8336 | extern const struct scoped_attribute_specs cxx_gnu_attribute_table; | 
| 8337 | extern const struct scoped_attribute_specs std_attribute_table; | 
| 8338 | extern const struct scoped_attribute_specs internal_attribute_table; | 
| 8339 | extern tree make_ptrmem_cst                        (tree, tree); | 
| 8340 | extern tree cp_build_type_attribute_variant     (tree, tree); | 
| 8341 | extern tree cp_build_reference_type                (tree, bool); | 
| 8342 | extern tree move                                (tree); | 
| 8343 | extern tree cp_build_qualified_type                (tree, int, | 
| 8344 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 8345 | extern bool cv_qualified_p                        (const_tree); | 
| 8346 | extern tree cv_unqualified                        (tree); | 
| 8347 | extern special_function_kind special_function_p (const_tree); | 
| 8348 | extern special_function_kind special_memfn_p        (const_tree); | 
| 8349 | extern int count_trees                                (tree); | 
| 8350 | extern int char_type_p                                (tree); | 
| 8351 | extern void verify_stmt_tree                        (tree); | 
| 8352 | extern linkage_kind decl_linkage                (tree); | 
| 8353 | extern duration_kind decl_storage_duration        (tree); | 
| 8354 | extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn, | 
| 8355 |                               void*, hash_set<tree> *); | 
| 8356 | #define cp_walk_tree(tp,func,data,pset) \ | 
| 8357 |         walk_tree_1 (tp, func, data, pset, cp_walk_subtrees) | 
| 8358 | #define cp_walk_tree_without_duplicates(tp,func,data) \ | 
| 8359 |         walk_tree_without_duplicates_1 (tp, func, data, cp_walk_subtrees) | 
| 8360 | extern tree rvalue                                (tree); | 
| 8361 | extern tree convert_bitfield_to_declared_type   (tree); | 
| 8362 | extern tree cp_save_expr                        (tree); | 
| 8363 | extern bool cast_valid_in_integral_constant_expression_p (tree); | 
| 8364 | extern bool cxx_type_hash_eq                        (const_tree, const_tree); | 
| 8365 | extern tree cxx_copy_lang_qualifiers                (const_tree, const_tree); | 
| 8366 |  | 
| 8367 | extern void cxx_print_statistics                (void); | 
| 8368 | extern bool maybe_warn_zero_as_null_pointer_constant (tree, location_t); | 
| 8369 |  | 
| 8370 | /* in ptree.cc */ | 
| 8371 | extern void cxx_print_xnode                        (FILE *, tree, int); | 
| 8372 | extern void cxx_print_decl                        (FILE *, tree, int); | 
| 8373 | extern void cxx_print_type                        (FILE *, tree, int); | 
| 8374 | extern void cxx_print_identifier                (FILE *, tree, int); | 
| 8375 | extern void cxx_print_error_function                (diagnostic_text_output_format &, | 
| 8376 |                                                  const char *, | 
| 8377 |                                                  const diagnostic_info *); | 
| 8378 |  | 
| 8379 | /* in typeck.cc */ | 
| 8380 | /* Says how we should behave when comparing two arrays one of which | 
| 8381 |    has unknown bounds.  */ | 
| 8382 | enum compare_bounds_t { bounds_none, bounds_either, bounds_first }; | 
| 8383 |  | 
| 8384 | extern bool cxx_mark_addressable                (tree, bool = false); | 
| 8385 | extern int string_conv_p                        (const_tree, const_tree, int); | 
| 8386 | extern tree cp_truthvalue_conversion                (tree, tsubst_flags_t); | 
| 8387 | extern tree contextual_conv_bool                (tree, tsubst_flags_t); | 
| 8388 | extern tree condition_conversion                (tree); | 
| 8389 | extern tree require_complete_type                (tree, | 
| 8390 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 8391 | extern tree complete_type                        (tree); | 
| 8392 | extern tree complete_type_or_else                (tree, tree); | 
| 8393 | extern tree complete_type_or_maybe_complain        (tree, tree, tsubst_flags_t); | 
| 8394 | extern int cp_compare_floating_point_conversion_ranks (tree, tree); | 
| 8395 | inline bool type_unknown_p                        (const_tree); | 
| 8396 | enum { ce_derived, ce_type, ce_normal, ce_exact }; | 
| 8397 | extern bool comp_except_specs                        (const_tree, const_tree, int); | 
| 8398 | extern bool comptypes                                (tree, tree, int); | 
| 8399 | extern bool same_type_ignoring_top_level_qualifiers_p (tree, tree); | 
| 8400 | extern bool similar_type_p                        (tree, tree); | 
| 8401 | extern bool cp_comp_parm_types                        (tree, tree); | 
| 8402 | extern bool next_common_initial_sequence        (tree &, tree &); | 
| 8403 | extern bool layout_compatible_type_p                (tree, tree); | 
| 8404 | extern bool compparms                                (const_tree, const_tree); | 
| 8405 | extern int comp_cv_qualification                (const_tree, const_tree); | 
| 8406 | extern int comp_cv_qualification                (int, int); | 
| 8407 | extern int comp_cv_qual_signature                (tree, tree); | 
| 8408 | extern tree cxx_sizeof_or_alignof_expr                (location_t, tree, | 
| 8409 |                                                  enum tree_code, bool, bool); | 
| 8410 | extern tree cxx_sizeof_or_alignof_type                (location_t, tree, | 
| 8411 |                                                  enum tree_code, bool, bool); | 
| 8412 | extern tree cxx_alignas_expr                    (tree); | 
| 8413 | extern tree cxx_sizeof_nowarn                   (tree); | 
| 8414 | extern tree is_bitfield_expr_with_lowered_type  (const_tree); | 
| 8415 | extern tree unlowered_expr_type                 (const_tree); | 
| 8416 | extern tree decay_conversion                        (tree, | 
| 8417 |                                                  tsubst_flags_t, | 
| 8418 |                                                  bool = true); | 
| 8419 | extern tree build_class_member_access_expr      (cp_expr, tree, tree, bool, | 
| 8420 |                                                  tsubst_flags_t); | 
| 8421 | extern tree finish_class_member_access_expr     (cp_expr, tree, bool, | 
| 8422 |                                                  tsubst_flags_t); | 
| 8423 | extern tree lookup_destructor                        (tree, tree, tree, tsubst_flags_t); | 
| 8424 | extern tree build_dependent_operator_type        (tree, enum tree_code, bool); | 
| 8425 | extern tree build_x_indirect_ref                (location_t, tree, | 
| 8426 |                                                  ref_operator, tree, | 
| 8427 |                                                  tsubst_flags_t); | 
| 8428 | extern tree cp_build_indirect_ref                (location_t, tree, | 
| 8429 |                                                  ref_operator, | 
| 8430 |                                                  tsubst_flags_t); | 
| 8431 | extern tree cp_build_fold_indirect_ref                (tree); | 
| 8432 | extern tree build_array_ref                        (location_t, tree, tree); | 
| 8433 | extern tree cp_build_array_ref                        (location_t, tree, tree, | 
| 8434 |                                                  tsubst_flags_t); | 
| 8435 | extern tree get_member_function_from_ptrfunc        (tree *, tree, tsubst_flags_t); | 
| 8436 | extern tree cp_build_function_call_nary         (tree, tsubst_flags_t, ...) | 
| 8437 |                                                 ATTRIBUTE_SENTINEL; | 
| 8438 | extern tree cp_build_function_call_vec                (tree, vec<tree, va_gc> **, | 
| 8439 |                                                  tsubst_flags_t, | 
| 8440 |                                                  tree = NULL_TREE); | 
| 8441 | extern tree build_x_binary_op                        (const op_location_t &, | 
| 8442 |                                                  enum tree_code, tree, | 
| 8443 |                                                  enum tree_code, tree, | 
| 8444 |                                                  enum tree_code, tree, | 
| 8445 |                                                  tree *, tsubst_flags_t); | 
| 8446 | inline tree build_x_binary_op (const op_location_t &loc, | 
| 8447 |                                enum tree_code code, tree arg1, tree arg2, | 
| 8448 |                                tsubst_flags_t complain) | 
| 8449 | { | 
| 8450 |   return build_x_binary_op (loc, code, arg1, TREE_CODE (arg1), arg2, | 
| 8451 |                             TREE_CODE (arg2), NULL_TREE, NULL, complain); | 
| 8452 | } | 
| 8453 | extern tree build_x_array_ref                        (location_t, tree, tree, | 
| 8454 |                                                  tsubst_flags_t); | 
| 8455 | extern tree build_omp_array_section                (location_t, tree, tree, tree); | 
| 8456 | extern tree build_x_unary_op                        (location_t, | 
| 8457 |                                                  enum tree_code, cp_expr, | 
| 8458 |                                                  tree, tsubst_flags_t); | 
| 8459 | extern tree cp_build_addressof                        (location_t, tree, | 
| 8460 |                                                  tsubst_flags_t); | 
| 8461 | extern tree cp_build_addr_expr                        (tree, tsubst_flags_t); | 
| 8462 | extern tree cp_build_unary_op                   (enum tree_code, tree, bool, | 
| 8463 |                                                  tsubst_flags_t); | 
| 8464 | extern tree genericize_compound_lvalue                (tree); | 
| 8465 | extern tree unary_complex_lvalue                (enum tree_code, tree); | 
| 8466 | extern tree build_x_conditional_expr                (location_t, tree, tree, tree, | 
| 8467 |                                                  tsubst_flags_t); | 
| 8468 | extern tree build_x_compound_expr_from_list        (tree, expr_list_kind, | 
| 8469 |                                                  tsubst_flags_t); | 
| 8470 | extern tree build_x_compound_expr_from_vec        (vec<tree, va_gc> *, | 
| 8471 |                                                  const char *, tsubst_flags_t); | 
| 8472 | extern tree build_x_compound_expr                (location_t, tree, tree, | 
| 8473 |                                                  tree, tsubst_flags_t); | 
| 8474 | extern tree build_compound_expr                 (location_t, tree, tree); | 
| 8475 | extern tree cp_build_compound_expr                (tree, tree, tsubst_flags_t); | 
| 8476 | extern tree build_static_cast                        (location_t, tree, tree, | 
| 8477 |                                                  tsubst_flags_t); | 
| 8478 | extern tree build_reinterpret_cast                (location_t, tree, tree, | 
| 8479 |                                                  tsubst_flags_t); | 
| 8480 | extern tree build_const_cast                        (location_t, tree, tree, | 
| 8481 |                                                  tsubst_flags_t); | 
| 8482 | extern tree build_c_cast                        (location_t, tree, tree); | 
| 8483 | extern cp_expr build_c_cast                        (location_t loc, tree type, | 
| 8484 |                                                  cp_expr expr); | 
| 8485 | extern tree cp_build_c_cast                        (location_t, tree, tree, | 
| 8486 |                                                  tsubst_flags_t); | 
| 8487 | extern bool maybe_warn_self_move                (location_t, tree, tree); | 
| 8488 | extern cp_expr build_x_modify_expr                (location_t, tree, | 
| 8489 |                                                  enum tree_code, tree, | 
| 8490 |                                                  tree, tsubst_flags_t); | 
| 8491 | extern tree cp_build_modify_expr                (location_t, tree, | 
| 8492 |                                                  enum tree_code, tree, | 
| 8493 |                                                  tsubst_flags_t); | 
| 8494 | extern tree convert_for_initialization                (tree, tree, tree, int, | 
| 8495 |                                                  impl_conv_rhs, tree, int, | 
| 8496 |                                                  tsubst_flags_t); | 
| 8497 | extern int comp_ptr_ttypes                        (tree, tree); | 
| 8498 | extern bool comp_ptr_ttypes_const                (tree, tree, compare_bounds_t); | 
| 8499 | extern bool error_type_p                        (const_tree); | 
| 8500 | extern bool ptr_reasonably_similar                (const_tree, const_tree); | 
| 8501 | extern tree build_ptrmemfunc                        (tree, tree, int, bool, | 
| 8502 |                                                  tsubst_flags_t); | 
| 8503 | extern int cp_type_quals                        (const_tree); | 
| 8504 | extern int type_memfn_quals                        (const_tree); | 
| 8505 | extern cp_ref_qualifier type_memfn_rqual        (const_tree); | 
| 8506 | extern tree apply_memfn_quals                        (tree, cp_cv_quals, | 
| 8507 |                                                  cp_ref_qualifier = REF_QUAL_NONE); | 
| 8508 | extern bool cp_has_mutable_p                        (const_tree); | 
| 8509 | extern bool at_least_as_qualified_p                (const_tree, const_tree); | 
| 8510 | extern void cp_apply_type_quals_to_decl                (int, tree); | 
| 8511 | extern tree build_ptrmemfunc1                        (tree, tree, tree); | 
| 8512 | extern void expand_ptrmemfunc_cst                (tree, tree *, tree *); | 
| 8513 | extern tree type_after_usual_arithmetic_conversions (tree, tree); | 
| 8514 | extern tree common_pointer_type                 (tree, tree); | 
| 8515 | extern tree composite_pointer_type                (const op_location_t &, | 
| 8516 |                                                  tree, tree, tree, tree, | 
| 8517 |                                                  composite_pointer_operation, | 
| 8518 |                                                  tsubst_flags_t); | 
| 8519 | extern tree merge_types                                (tree, tree); | 
| 8520 | extern tree strip_array_domain                        (tree); | 
| 8521 | extern tree check_return_expr                        (tree, bool *, bool *); | 
| 8522 | extern tree spaceship_type                        (tree, tsubst_flags_t = tf_warning_or_error); | 
| 8523 | extern tree genericize_spaceship                (location_t, tree, tree, tree); | 
| 8524 | extern tree cp_build_binary_op                  (const op_location_t &, | 
| 8525 |                                                  enum tree_code, tree, tree, | 
| 8526 |                                                  tsubst_flags_t); | 
| 8527 | extern tree build_x_vec_perm_expr               (location_t, | 
| 8528 |                                                  tree, tree, tree, | 
| 8529 |                                                  tsubst_flags_t); | 
| 8530 | extern tree build_x_shufflevector               (location_t, | 
| 8531 |                                                  vec<tree, va_gc> *, | 
| 8532 |                                                  tsubst_flags_t); | 
| 8533 | #define cxx_sizeof(T)  cxx_sizeof_or_alignof_type (input_location, T, SIZEOF_EXPR, false, true) | 
| 8534 | extern tree build_simple_component_ref                (tree, tree); | 
| 8535 | extern tree build_ptrmemfunc_access_expr        (tree, tree); | 
| 8536 | extern tree build_address                        (tree); | 
| 8537 | extern tree build_nop                                (tree, tree CXX_MEM_STAT_INFO); | 
| 8538 | extern tree non_reference                        (tree); | 
| 8539 | extern tree lookup_anon_field                        (tree, tree); | 
| 8540 | extern bool invalid_nonstatic_memfn_p                (location_t, tree, | 
| 8541 |                                                  tsubst_flags_t); | 
| 8542 | extern tree convert_member_func_to_ptr                (tree, tree, tsubst_flags_t); | 
| 8543 | extern tree convert_ptrmem                        (tree, tree, bool, bool, | 
| 8544 |                                                  tsubst_flags_t); | 
| 8545 | extern int lvalue_or_else                        (tree, enum lvalue_use, | 
| 8546 |                                                  tsubst_flags_t); | 
| 8547 | extern void check_template_keyword                (tree); | 
| 8548 | extern bool check_raw_literal_operator                (const_tree decl); | 
| 8549 | extern bool check_literal_operator_args                (const_tree, bool *, bool *); | 
| 8550 | extern void maybe_warn_about_useless_cast       (location_t, tree, tree, | 
| 8551 |                                                  tsubst_flags_t); | 
| 8552 | extern tree cp_perform_integral_promotions      (tree, tsubst_flags_t); | 
| 8553 |  | 
| 8554 | extern tree finish_left_unary_fold_expr      (location_t, tree, int); | 
| 8555 | extern tree finish_right_unary_fold_expr     (location_t, tree, int); | 
| 8556 | extern tree finish_binary_fold_expr          (location_t, tree, tree, int); | 
| 8557 | extern tree treat_lvalue_as_rvalue_p             (tree, bool); | 
| 8558 | extern bool decl_in_std_namespace_p             (tree); | 
| 8559 | extern void maybe_warn_pessimizing_move             (tree, tree, bool); | 
| 8560 |  | 
| 8561 | /* in typeck2.cc */ | 
| 8562 | extern void require_complete_eh_spec_types        (tree, tree); | 
| 8563 | extern bool cxx_incomplete_type_diagnostic        (location_t, const_tree, | 
| 8564 |                                                  const_tree, diagnostic_t); | 
| 8565 | inline location_t | 
| 8566 | loc_or_input_loc (location_t loc) | 
| 8567 | { | 
| 8568 |   return loc == UNKNOWN_LOCATION ? input_location : loc; | 
| 8569 | } | 
| 8570 |  | 
| 8571 | /* Like EXPR_LOCATION, but also handle some tcc_exceptional that have | 
| 8572 |    locations.  */ | 
| 8573 |  | 
| 8574 | inline location_t | 
| 8575 | cp_expr_location (const_tree t_) | 
| 8576 | { | 
| 8577 |   tree t = CONST_CAST_TREE (t_); | 
| 8578 |   if (t == NULL_TREE) | 
| 8579 |     return UNKNOWN_LOCATION; | 
| 8580 |   switch (TREE_CODE (t)) | 
| 8581 |     { | 
| 8582 |     case LAMBDA_EXPR: | 
| 8583 |       return LAMBDA_EXPR_LOCATION (t); | 
| 8584 |     case STATIC_ASSERT: | 
| 8585 |       return STATIC_ASSERT_SOURCE_LOCATION (t); | 
| 8586 |     case TRAIT_EXPR: | 
| 8587 |       return TRAIT_EXPR_LOCATION (t); | 
| 8588 |     case PTRMEM_CST: | 
| 8589 |       return PTRMEM_CST_LOCATION (t); | 
| 8590 |     default: | 
| 8591 |       return EXPR_LOCATION (t); | 
| 8592 |     } | 
| 8593 | } | 
| 8594 |  | 
| 8595 | inline location_t | 
| 8596 | cp_expr_loc_or_loc (const_tree t, location_t or_loc) | 
| 8597 | { | 
| 8598 |   location_t loc = cp_expr_location (t_: t); | 
| 8599 |   if (loc == UNKNOWN_LOCATION) | 
| 8600 |     loc = or_loc; | 
| 8601 |   return loc; | 
| 8602 | } | 
| 8603 |  | 
| 8604 | inline location_t | 
| 8605 | cp_expr_loc_or_input_loc (const_tree t) | 
| 8606 | { | 
| 8607 |   return cp_expr_loc_or_loc (t, or_loc: input_location); | 
| 8608 | } | 
| 8609 |  | 
| 8610 | inline bool | 
| 8611 | cxx_incomplete_type_diagnostic (const_tree value, const_tree type, | 
| 8612 |                                 diagnostic_t diag_kind) | 
| 8613 | { | 
| 8614 |   return cxx_incomplete_type_diagnostic (cp_expr_loc_or_input_loc (t: value), | 
| 8615 |                                          value, type, diag_kind); | 
| 8616 | } | 
| 8617 |  | 
| 8618 | extern void cxx_incomplete_type_error                (location_t, const_tree, | 
| 8619 |                                                  const_tree); | 
| 8620 | inline void | 
| 8621 | cxx_incomplete_type_error (const_tree value, const_tree type) | 
| 8622 | { | 
| 8623 |   cxx_incomplete_type_diagnostic (value, type, diag_kind: DK_ERROR); | 
| 8624 | } | 
| 8625 |  | 
| 8626 | extern void cxx_incomplete_type_inform                 (const_tree); | 
| 8627 | extern tree error_not_base_type                        (tree, tree); | 
| 8628 | extern tree binfo_or_else                        (tree, tree); | 
| 8629 | extern void cxx_readonly_error                        (location_t, tree, | 
| 8630 |                                                  enum lvalue_use); | 
| 8631 | extern void complete_type_check_abstract        (tree); | 
| 8632 | extern int abstract_virtuals_error                (tree, tree, | 
| 8633 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 8634 | extern int abstract_virtuals_error                (abstract_class_use, tree, | 
| 8635 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 8636 |  | 
| 8637 | extern tree store_init_value                        (tree, tree, vec<tree, va_gc>**, int); | 
| 8638 | extern tree build_disable_temp_cleanup                (tree); | 
| 8639 | extern tree split_nonconstant_init                (tree, tree); | 
| 8640 | extern bool check_narrowing                        (tree, tree, tsubst_flags_t, | 
| 8641 |                                                  bool = false); | 
| 8642 | extern bool ordinary_char_type_p                (tree); | 
| 8643 | extern bool array_string_literal_compatible_p        (tree, tree); | 
| 8644 | extern tree digest_init                                (tree, tree, tsubst_flags_t); | 
| 8645 | extern tree digest_init_flags                        (tree, tree, int, tsubst_flags_t); | 
| 8646 | extern tree digest_nsdmi_init                        (tree, tree, tsubst_flags_t); | 
| 8647 | extern tree build_scoped_ref                        (tree, tree, tree *); | 
| 8648 | extern tree build_x_arrow                        (location_t, tree, | 
| 8649 |                                                  tsubst_flags_t); | 
| 8650 | extern tree build_m_component_ref                (tree, tree, tsubst_flags_t); | 
| 8651 | extern tree build_functional_cast                (location_t, tree, tree, | 
| 8652 |                                                  tsubst_flags_t); | 
| 8653 | extern tree add_exception_specifier                (tree, tree, tsubst_flags_t); | 
| 8654 | extern tree merge_exception_specifiers                (tree, tree); | 
| 8655 | extern void set_target_expr_eliding                (tree); | 
| 8656 | extern tree cp_build_init_expr                        (location_t, tree, tree); | 
| 8657 | inline tree cp_build_init_expr (tree t, tree i) | 
| 8658 | { return cp_build_init_expr (input_location, t, i); } | 
| 8659 |  | 
| 8660 | /* in mangle.cc */ | 
| 8661 | extern void init_mangle                                (void); | 
| 8662 | extern void mangle_decl                                (tree); | 
| 8663 | extern const char *mangle_type_string                (tree); | 
| 8664 | extern tree mangle_typeinfo_for_type                (tree); | 
| 8665 | extern tree mangle_typeinfo_string_for_type        (tree); | 
| 8666 | extern tree mangle_vtbl_for_type                (tree); | 
| 8667 | extern tree mangle_vtt_for_type                        (tree); | 
| 8668 | extern tree mangle_ctor_vtbl_for_type                (tree, tree); | 
| 8669 | extern tree mangle_thunk                        (tree, int, tree, tree, tree); | 
| 8670 | extern tree mangle_guard_variable                (tree); | 
| 8671 | extern tree mangle_tls_init_fn                        (tree); | 
| 8672 | extern tree mangle_tls_wrapper_fn                (tree); | 
| 8673 | extern bool decl_tls_wrapper_p                        (tree); | 
| 8674 | extern tree mangle_ref_init_variable                (tree); | 
| 8675 | extern tree mangle_template_parm_object                (tree); | 
| 8676 | extern char *get_mangled_vtable_map_var_name    (tree); | 
| 8677 | extern bool mangle_return_type_p                (tree); | 
| 8678 | extern tree mangle_decomp                        (tree, vec<tree> &); | 
| 8679 | extern void mangle_module_substitution                (int); | 
| 8680 | extern int mangle_module_component                (tree id, bool partition); | 
| 8681 | extern tree mangle_module_global_init                (int); | 
| 8682 | extern unsigned HOST_WIDE_INT range_expr_nelts        (tree); | 
| 8683 | extern bool equal_abi_tags                        (tree, tree); | 
| 8684 |  | 
| 8685 | /* in dump.cc */ | 
| 8686 | extern bool cp_dump_tree                        (void *, tree); | 
| 8687 |  | 
| 8688 | /* In cp/cp-objcp-common.cc.  */ | 
| 8689 |  | 
| 8690 | extern alias_set_type cxx_get_alias_set                (tree); | 
| 8691 | extern bool cxx_warn_unused_global_decl                (const_tree); | 
| 8692 | extern size_t cp_tree_size                        (enum tree_code); | 
| 8693 | extern bool cp_var_mod_type_p                        (tree, tree); | 
| 8694 | extern void cxx_initialize_diagnostics                (diagnostic_context *); | 
| 8695 | extern int cxx_types_compatible_p                (tree, tree); | 
| 8696 | extern bool cxx_block_may_fallthru                (const_tree); | 
| 8697 |  | 
| 8698 | /* in cp-gimplify.cc */ | 
| 8699 | extern int cp_gimplify_expr                        (tree *, gimple_seq *, | 
| 8700 |                                                  gimple_seq *); | 
| 8701 | extern void cp_genericize                        (tree); | 
| 8702 | extern bool cxx_omp_const_qual_no_mutable        (tree); | 
| 8703 | extern enum omp_clause_default_kind cxx_omp_predetermined_sharing_1 (tree); | 
| 8704 | extern enum omp_clause_default_kind cxx_omp_predetermined_sharing (tree); | 
| 8705 | extern enum omp_clause_defaultmap_kind cxx_omp_predetermined_mapping (tree); | 
| 8706 | extern tree cxx_omp_clause_default_ctor                (tree, tree, tree); | 
| 8707 | extern tree cxx_omp_clause_copy_ctor                (tree, tree, tree); | 
| 8708 | extern tree cxx_omp_clause_assign_op                (tree, tree, tree); | 
| 8709 | extern tree cxx_omp_clause_dtor                        (tree, tree); | 
| 8710 | extern void cxx_omp_finish_clause                (tree, gimple_seq *, bool); | 
| 8711 | extern tree cxx_omp_finish_mapper_clauses        (tree); | 
| 8712 | extern tree cxx_omp_mapper_lookup                (tree, tree); | 
| 8713 | extern tree         (tree); | 
| 8714 | extern tree cxx_omp_map_array_section                (location_t, tree); | 
| 8715 | extern bool cxx_omp_privatize_by_reference        (const_tree); | 
| 8716 | extern bool cxx_omp_disregard_value_expr        (tree, bool); | 
| 8717 | extern void cp_fold_function                        (tree); | 
| 8718 | extern tree cp_fold_maybe_rvalue                (tree, bool); | 
| 8719 | extern tree cp_fold_rvalue                        (tree); | 
| 8720 | extern tree cp_fully_fold                        (tree); | 
| 8721 | extern tree cp_fully_fold_init                        (tree); | 
| 8722 | extern tree predeclare_vla                        (tree); | 
| 8723 | extern void clear_fold_cache                        (void); | 
| 8724 | extern tree lookup_hotness_attribute                (tree); | 
| 8725 | extern tree process_stmt_hotness_attribute        (tree, location_t); | 
| 8726 | extern tree build_assume_call                        (location_t, tree); | 
| 8727 | extern tree process_stmt_assume_attribute        (tree, tree, location_t); | 
| 8728 | extern bool simple_empty_class_p                (tree, tree, tree_code); | 
| 8729 | extern tree fold_builtin_source_location        (const_tree); | 
| 8730 | extern tree get_source_location_impl_type        (); | 
| 8731 | extern tree cp_fold_immediate                        (tree *, mce_value, | 
| 8732 |                                                  tree = current_function_decl); | 
| 8733 | extern void process_and_check_pending_immediate_escalating_fns (); | 
| 8734 |  | 
| 8735 | /* in name-lookup.cc */ | 
| 8736 | extern tree strip_using_decl                    (tree); | 
| 8737 | extern void diagnose_name_conflict                (tree, tree); | 
| 8738 | extern bool dependent_local_decl_p                (tree); | 
| 8739 |  | 
| 8740 | /* Tell the binding oracle what kind of binding we are looking for.  */ | 
| 8741 |  | 
| 8742 | enum cp_oracle_request | 
| 8743 | { | 
| 8744 |   CP_ORACLE_IDENTIFIER | 
| 8745 | }; | 
| 8746 |  | 
| 8747 | /* If this is non-NULL, then it is a "binding oracle" which can lazily | 
| 8748 |    create bindings when needed by the C compiler.  The oracle is told | 
| 8749 |    the name and type of the binding to create.  It can call pushdecl | 
| 8750 |    or the like to ensure the binding is visible; or do nothing, | 
| 8751 |    leaving the binding untouched.  c-decl.cc takes note of when the | 
| 8752 |    oracle has been called and will not call it again if it fails to | 
| 8753 |    create a given binding.  */ | 
| 8754 |  | 
| 8755 | typedef void cp_binding_oracle_function (enum cp_oracle_request, tree identifier); | 
| 8756 |  | 
| 8757 | extern cp_binding_oracle_function *cp_binding_oracle; | 
| 8758 |  | 
| 8759 | /* Set during diagnostics to record the failed constraint. This is a | 
| 8760 |    TREE_LIST whose VALUE is the constraint and whose PURPOSE are the | 
| 8761 |    instantiation arguments Defined in pt.cc.  */ | 
| 8762 |  | 
| 8763 | extern tree current_failed_constraint; | 
| 8764 |  | 
| 8765 | /* An RAII class to manage the failed constraint.  */ | 
| 8766 |  | 
| 8767 | struct diagnosing_failed_constraint | 
| 8768 | { | 
| 8769 |   diagnosing_failed_constraint (tree, tree, bool); | 
| 8770 |   ~diagnosing_failed_constraint (); | 
| 8771 |   static bool replay_errors_p (); | 
| 8772 |  | 
| 8773 |   bool diagnosing_error; | 
| 8774 | }; | 
| 8775 |  | 
| 8776 | /* in constraint.cc */ | 
| 8777 |  | 
| 8778 | extern cp_expr finish_constraint_or_expr        (location_t, cp_expr, cp_expr); | 
| 8779 | extern cp_expr finish_constraint_and_expr        (location_t, cp_expr, cp_expr); | 
| 8780 | extern cp_expr finish_constraint_primary_expr        (cp_expr); | 
| 8781 | extern tree start_concept_definition                (cp_expr); | 
| 8782 | extern tree finish_concept_definition                (tree, tree, tree); | 
| 8783 | extern tree combine_constraint_expressions      (tree, tree); | 
| 8784 | extern tree append_constraint                        (tree, tree); | 
| 8785 | extern tree get_constraints                     (const_tree); | 
| 8786 | extern void set_constraints                     (tree, tree); | 
| 8787 | extern void remove_constraints                  (tree); | 
| 8788 | extern tree current_template_constraints        (void); | 
| 8789 | extern tree associate_classtype_constraints     (tree); | 
| 8790 | extern tree build_constraints                   (tree, tree); | 
| 8791 | extern tree maybe_substitute_reqs_for                (tree, const_tree); | 
| 8792 | extern tree get_trailing_function_requirements        (tree); | 
| 8793 | extern tree get_shorthand_constraints           (tree); | 
| 8794 |  | 
| 8795 | extern tree build_concept_id                        (tree); | 
| 8796 | extern tree build_type_constraint                (tree, tree, tsubst_flags_t); | 
| 8797 | extern tree build_concept_check                 (tree, tree, tsubst_flags_t); | 
| 8798 | extern tree build_concept_check                 (tree, tree, tree, tsubst_flags_t); | 
| 8799 |  | 
| 8800 | extern tree build_constrained_parameter         (tree, tree, tree = NULL_TREE); | 
| 8801 | extern bool equivalent_placeholder_constraints  (tree, tree); | 
| 8802 | extern hashval_t iterative_hash_placeholder_constraint        (tree, hashval_t); | 
| 8803 | extern tree finish_shorthand_constraint         (tree, tree); | 
| 8804 | extern tree finish_requires_expr                (location_t, tree, tree); | 
| 8805 | extern tree finish_simple_requirement           (location_t, tree); | 
| 8806 | extern tree finish_type_requirement             (location_t, tree); | 
| 8807 | extern tree finish_compound_requirement         (location_t, tree, tree, bool); | 
| 8808 | extern tree finish_nested_requirement           (location_t, tree); | 
| 8809 | extern tree tsubst_requires_expr                (tree, tree, tsubst_flags_t, tree); | 
| 8810 | extern tree evaluate_requires_expr                (tree); | 
| 8811 | extern tree tsubst_constraint                   (tree, tree, tsubst_flags_t, tree); | 
| 8812 | extern tree tsubst_constraint_info              (tree, tree, tsubst_flags_t, tree); | 
| 8813 | extern tree tsubst_parameter_mapping                (tree, tree, tsubst_flags_t, tree); | 
| 8814 |  | 
| 8815 | struct processing_constraint_expression_sentinel | 
| 8816 | { | 
| 8817 |   processing_constraint_expression_sentinel (); | 
| 8818 |   ~processing_constraint_expression_sentinel (); | 
| 8819 | }; | 
| 8820 |  | 
| 8821 | extern bool processing_constraint_expression_p        (); | 
| 8822 |  | 
| 8823 | extern tree get_concept_check_template                (tree); | 
| 8824 | extern tree evaluate_concept_check              (tree); | 
| 8825 | extern bool constraints_satisfied_p                (tree, tree = NULL_TREE); | 
| 8826 | extern bool* lookup_subsumption_result          (tree, tree); | 
| 8827 | extern bool save_subsumption_result             (tree, tree, bool); | 
| 8828 | extern tree find_template_parameters                (tree, tree); | 
| 8829 | extern bool equivalent_constraints              (tree, tree); | 
| 8830 | extern bool equivalently_constrained            (tree, tree); | 
| 8831 | extern bool strictly_subsumes                        (tree, tree); | 
| 8832 | extern bool ttp_subsumes                        (tree, tree); | 
| 8833 | extern int more_constrained                     (tree, tree); | 
| 8834 | extern bool at_least_as_constrained             (tree, tree); | 
| 8835 | extern bool constraints_equivalent_p            (tree, tree); | 
| 8836 | extern bool atomic_constraints_identical_p        (tree, tree); | 
| 8837 | extern hashval_t iterative_hash_constraint      (tree, hashval_t); | 
| 8838 | extern hashval_t hash_atomic_constraint         (tree); | 
| 8839 | extern void diagnose_constraints                (location_t, tree, tree); | 
| 8840 |  | 
| 8841 | extern void note_failed_type_completion_for_satisfaction (tree); | 
| 8842 |  | 
| 8843 | /* in logic.cc */ | 
| 8844 | extern bool subsumes                            (tree, tree); | 
| 8845 |  | 
| 8846 | /* In class.cc */ | 
| 8847 | extern void set_current_access_from_decl (tree); | 
| 8848 | extern void cp_finish_injected_record_type (tree); | 
| 8849 |  | 
| 8850 | /* in vtable-class-hierarchy.cc */ | 
| 8851 | extern void vtv_compute_class_hierarchy_transitive_closure (void); | 
| 8852 | extern void vtv_generate_init_routine           (void); | 
| 8853 | extern void vtv_save_class_info                 (tree); | 
| 8854 | extern void vtv_recover_class_info              (void); | 
| 8855 | extern void vtv_build_vtable_verify_fndecl      (void); | 
| 8856 |  | 
| 8857 | /* In constexpr.cc */ | 
| 8858 | /* Representation of entries in the constexpr function definition table.  */ | 
| 8859 |  | 
| 8860 | struct GTY((for_user)) constexpr_fundef { | 
| 8861 |   tree decl; | 
| 8862 |   tree body; | 
| 8863 |   tree parms; | 
| 8864 |   tree result; | 
| 8865 | }; | 
| 8866 |  | 
| 8867 | extern void fini_constexpr                        (void); | 
| 8868 | extern bool literal_type_p                      (tree); | 
| 8869 | extern void maybe_save_constexpr_fundef                (tree); | 
| 8870 | extern void register_constexpr_fundef                (const constexpr_fundef &); | 
| 8871 | extern constexpr_fundef *retrieve_constexpr_fundef        (tree); | 
| 8872 | extern bool is_valid_constexpr_fn                (tree, bool); | 
| 8873 | extern bool check_constexpr_ctor_body           (tree, tree, bool); | 
| 8874 | extern tree constexpr_fn_retval                (tree); | 
| 8875 | extern tree ensure_literal_type_for_constexpr_object (tree); | 
| 8876 | extern bool potential_constant_expression       (tree); | 
| 8877 | extern bool is_constant_expression (tree); | 
| 8878 | extern bool is_rvalue_constant_expression (tree); | 
| 8879 | extern bool is_nondependent_constant_expression (tree); | 
| 8880 | extern bool is_nondependent_static_init_expression (tree); | 
| 8881 | extern bool is_static_init_expression    (tree); | 
| 8882 | extern bool is_std_class (tree, const char *); | 
| 8883 | extern bool is_std_allocator (tree); | 
| 8884 | extern bool potential_rvalue_constant_expression (tree); | 
| 8885 | extern bool require_potential_constant_expression (tree); | 
| 8886 | extern bool require_constant_expression (tree); | 
| 8887 | extern bool require_rvalue_constant_expression (tree); | 
| 8888 | extern bool require_potential_rvalue_constant_expression (tree); | 
| 8889 | extern bool require_potential_rvalue_constant_expression_fncheck (tree); | 
| 8890 | extern tree cxx_constant_value                        (tree, tree = NULL_TREE, | 
| 8891 |                                                  tsubst_flags_t = tf_error); | 
| 8892 | inline tree cxx_constant_value (tree t, tsubst_flags_t complain) | 
| 8893 | { return cxx_constant_value (t, NULL_TREE, complain); } | 
| 8894 | extern void cxx_constant_dtor                        (tree, tree); | 
| 8895 | extern tree cxx_constant_init                        (tree, tree = NULL_TREE); | 
| 8896 | extern tree maybe_constant_value                (tree, tree = NULL_TREE, mce_value = mce_unknown); | 
| 8897 | extern tree maybe_constant_init                        (tree, tree = NULL_TREE, bool = false); | 
| 8898 | extern tree maybe_constant_init                        (tree, tree, mce_value); | 
| 8899 | extern tree fold_non_dependent_expr                (tree, | 
| 8900 |                                                  tsubst_flags_t = tf_warning_or_error, | 
| 8901 |                                                  bool = false, tree = NULL_TREE); | 
| 8902 | extern tree maybe_fold_non_dependent_expr        (tree, | 
| 8903 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 8904 | extern tree fold_non_dependent_init                (tree, | 
| 8905 |                                                  tsubst_flags_t = tf_warning_or_error, | 
| 8906 |                                                  bool = false, tree = NULL_TREE); | 
| 8907 | extern tree fold_simple                                (tree); | 
| 8908 | extern tree fold_to_constant                        (tree); | 
| 8909 | extern bool reduced_constant_expression_p       (tree); | 
| 8910 | extern bool is_instantiation_of_constexpr       (tree); | 
| 8911 | extern bool var_in_constexpr_fn                 (tree); | 
| 8912 | extern bool var_in_maybe_constexpr_fn           (tree); | 
| 8913 | extern bool maybe_constexpr_fn                        (tree); | 
| 8914 | extern void explain_invalid_constexpr_fn        (tree); | 
| 8915 | extern vec<tree> cx_error_context               (void); | 
| 8916 | extern tree fold_sizeof_expr                        (tree); | 
| 8917 | extern void clear_cv_and_fold_caches                (void); | 
| 8918 | extern tree unshare_constructor                        (tree CXX_MEM_STAT_INFO); | 
| 8919 | extern bool decl_implicit_constexpr_p                (tree); | 
| 8920 | struct constexpr_ctx; | 
| 8921 | extern tree find_failing_clause                        (const constexpr_ctx *ctx, tree); | 
| 8922 | extern void diagnose_failing_condition                (tree, location_t, bool, | 
| 8923 |                                                  const constexpr_ctx * = nullptr); | 
| 8924 | extern bool replace_decl                        (tree *, tree, tree); | 
| 8925 |  | 
| 8926 | /* An RAII sentinel used to restrict constexpr evaluation so that it | 
| 8927 |    doesn't do anything that causes extra DECL_UID generation.  */ | 
| 8928 |  | 
| 8929 | struct uid_sensitive_constexpr_evaluation_sentinel | 
| 8930 | { | 
| 8931 |   temp_override<bool> ovr; | 
| 8932 |   uid_sensitive_constexpr_evaluation_sentinel (); | 
| 8933 | }; | 
| 8934 |  | 
| 8935 | /* Used to determine whether uid_sensitive_constexpr_evaluation_p was | 
| 8936 |    called and returned true, indicating that we've restricted constexpr | 
| 8937 |    evaluation in order to avoid UID generation.  We use this to control | 
| 8938 |    updates to the fold_cache and cv_cache.  */ | 
| 8939 |  | 
| 8940 | struct uid_sensitive_constexpr_evaluation_checker | 
| 8941 | { | 
| 8942 |   const unsigned saved_counter; | 
| 8943 |   uid_sensitive_constexpr_evaluation_checker (); | 
| 8944 |   bool evaluation_restricted_p () const; | 
| 8945 | }; | 
| 8946 |  | 
| 8947 | void cp_tree_c_finish_parsing (); | 
| 8948 |  | 
| 8949 | /* In cp-ubsan.cc */ | 
| 8950 | extern void cp_ubsan_maybe_instrument_member_call (tree); | 
| 8951 | extern void cp_ubsan_instrument_member_accesses (tree *); | 
| 8952 | extern tree cp_ubsan_maybe_instrument_downcast        (location_t, tree, tree, tree); | 
| 8953 | extern tree cp_ubsan_maybe_instrument_cast_to_vbase (location_t, tree, tree); | 
| 8954 | extern void cp_ubsan_maybe_initialize_vtbl_ptrs (tree); | 
| 8955 |  | 
| 8956 | /* In coroutines.cc */ | 
| 8957 | extern tree finish_co_return_stmt                (location_t, tree); | 
| 8958 | extern tree finish_co_await_expr                (location_t, tree); | 
| 8959 | extern tree finish_co_yield_expr                (location_t, tree); | 
| 8960 | extern tree coro_validate_builtin_call                (tree, | 
| 8961 |                                                  tsubst_flags_t = tf_warning_or_error); | 
| 8962 | extern tree coro_get_actor_function                (tree); | 
| 8963 | extern tree coro_get_destroy_function                (tree); | 
| 8964 | extern tree coro_get_ramp_function                (tree); | 
| 8965 |  | 
| 8966 | extern tree co_await_get_resume_call                (tree await_expr); | 
| 8967 |  | 
| 8968 |  | 
| 8969 | /* contracts.cc */ | 
| 8970 | extern tree make_postcondition_variable                (cp_expr); | 
| 8971 | extern tree make_postcondition_variable                (cp_expr, tree); | 
| 8972 | extern tree grok_contract                        (tree, tree, tree, cp_expr, location_t); | 
| 8973 | extern tree finish_contract_condition                (cp_expr); | 
| 8974 |  | 
| 8975 | /* Return the first contract in ATTRS, or NULL_TREE if there are none.  */ | 
| 8976 |  | 
| 8977 | inline tree | 
| 8978 | find_contract (tree attrs) | 
| 8979 | { | 
| 8980 |   while (attrs && !cxx_contract_attribute_p (attrs)) | 
| 8981 |     attrs = TREE_CHAIN (attrs); | 
| 8982 |   return attrs; | 
| 8983 | } | 
| 8984 |  | 
| 8985 | inline void | 
| 8986 | set_decl_contracts (tree decl, tree contract_attrs) | 
| 8987 | { | 
| 8988 |   remove_contract_attributes (decl); | 
| 8989 |   DECL_ATTRIBUTES (decl) = chainon (DECL_ATTRIBUTES (decl), contract_attrs); | 
| 8990 | } | 
| 8991 |  | 
| 8992 | /* Returns the computed semantic of the node.  */ | 
| 8993 |  | 
| 8994 | inline contract_semantic | 
| 8995 | get_contract_semantic (const_tree t) | 
| 8996 | { | 
| 8997 |   return (contract_semantic) (TREE_LANG_FLAG_3 (CONTRACT_CHECK (t)) | 
| 8998 |       | (TREE_LANG_FLAG_2 (t) << 1) | 
| 8999 |       | (TREE_LANG_FLAG_0 ((t)) << 2)); | 
| 9000 | } | 
| 9001 |  | 
| 9002 | /* Sets the computed semantic of the node.  */ | 
| 9003 |  | 
| 9004 | inline void | 
| 9005 | set_contract_semantic (tree t, contract_semantic semantic) | 
| 9006 | { | 
| 9007 |   TREE_LANG_FLAG_3 (CONTRACT_CHECK (t)) = semantic & 0x01; | 
| 9008 |   TREE_LANG_FLAG_2 (t) = (semantic & 0x02) >> 1; | 
| 9009 |   TREE_LANG_FLAG_0 (t) = (semantic & 0x04) >> 2; | 
| 9010 | } | 
| 9011 |  | 
| 9012 | /* Inline bodies.  */ | 
| 9013 |  | 
| 9014 | inline tree | 
| 9015 | ovl_first (tree node) | 
| 9016 | { | 
| 9017 |   while (TREE_CODE (node) == OVERLOAD) | 
| 9018 |     node = OVL_FUNCTION (node); | 
| 9019 |   return node; | 
| 9020 | } | 
| 9021 |  | 
| 9022 | inline bool | 
| 9023 | type_unknown_p (const_tree expr) | 
| 9024 | { | 
| 9025 |   return TREE_TYPE (expr) == unknown_type_node; | 
| 9026 | } | 
| 9027 |  | 
| 9028 | inline hashval_t | 
| 9029 | named_decl_hash::hash (const value_type decl) | 
| 9030 | { | 
| 9031 |   tree name = (TREE_CODE (decl) == BINDING_VECTOR | 
| 9032 |                ? BINDING_VECTOR_NAME (decl) : OVL_NAME (decl)); | 
| 9033 |   return name ? IDENTIFIER_HASH_VALUE (name) : 0; | 
| 9034 | } | 
| 9035 |  | 
| 9036 | inline bool | 
| 9037 | named_decl_hash::equal (const value_type existing, compare_type candidate) | 
| 9038 | { | 
| 9039 |   tree name = (TREE_CODE (existing) == BINDING_VECTOR | 
| 9040 |                ? BINDING_VECTOR_NAME (existing) : OVL_NAME (existing)); | 
| 9041 |   return candidate == name; | 
| 9042 | } | 
| 9043 |  | 
| 9044 | inline bool | 
| 9045 | null_node_p (const_tree expr) | 
| 9046 | { | 
| 9047 |   STRIP_ANY_LOCATION_WRAPPER (expr); | 
| 9048 |   return expr == null_node; | 
| 9049 | } | 
| 9050 |  | 
| 9051 | /* True iff T is a variable template declaration.  */ | 
| 9052 | inline bool | 
| 9053 | variable_template_p (tree t) | 
| 9054 | { | 
| 9055 |   if (TREE_CODE (t) != TEMPLATE_DECL) | 
| 9056 |     return false; | 
| 9057 |   if (!PRIMARY_TEMPLATE_P (t)) | 
| 9058 |     return false; | 
| 9059 |   if (tree r = DECL_TEMPLATE_RESULT (t)) | 
| 9060 |     return VAR_P (r); | 
| 9061 |   return false; | 
| 9062 | } | 
| 9063 |  | 
| 9064 | /* True iff T is a concept.  */ | 
| 9065 |  | 
| 9066 | inline bool | 
| 9067 | concept_definition_p (const_tree t) | 
| 9068 | { | 
| 9069 |   return TREE_CODE (STRIP_TEMPLATE (t)) == CONCEPT_DECL; | 
| 9070 | } | 
| 9071 |  | 
| 9072 | /* True if t is an expression that checks a concept.  */ | 
| 9073 |  | 
| 9074 | inline bool | 
| 9075 | concept_check_p (const_tree t) | 
| 9076 | { | 
| 9077 |   if (t && TREE_CODE (t) == TEMPLATE_ID_EXPR) | 
| 9078 |     return concept_definition_p (TREE_OPERAND (t, 0)); | 
| 9079 |   return false; | 
| 9080 | } | 
| 9081 |  | 
| 9082 | /* Return the prototype parameter of the concept T, | 
| 9083 |    i.e. its first declared template parameter.  */ | 
| 9084 |  | 
| 9085 | inline tree | 
| 9086 | concept_prototype_parameter (const_tree t) | 
| 9087 | { | 
| 9088 |   gcc_checking_assert (concept_definition_p (t)); | 
| 9089 |   if (TREE_CODE (t) == CONCEPT_DECL) | 
| 9090 |     t = DECL_TI_TEMPLATE (t); | 
| 9091 |   tree parms = DECL_INNERMOST_TEMPLATE_PARMS (t); | 
| 9092 |   return TREE_VALUE (TREE_VEC_ELT (parms, 0)); | 
| 9093 | } | 
| 9094 |  | 
| 9095 | /* Helpers for IMPLICIT_RVALUE_P to look through automatic dereference.  */ | 
| 9096 |  | 
| 9097 | inline bool | 
| 9098 | implicit_rvalue_p (const_tree t) | 
| 9099 | { | 
| 9100 |   if (REFERENCE_REF_P (t)) | 
| 9101 |     t = TREE_OPERAND (t, 0); | 
| 9102 |   return ((TREE_CODE (t) == NON_LVALUE_EXPR | 
| 9103 |            || TREE_CODE (t) == STATIC_CAST_EXPR) | 
| 9104 |           && IMPLICIT_RVALUE_P (t)); | 
| 9105 | } | 
| 9106 | inline tree | 
| 9107 | set_implicit_rvalue_p (tree ot) | 
| 9108 | { | 
| 9109 |   tree t = ot; | 
| 9110 |   if (REFERENCE_REF_P (t)) | 
| 9111 |     t = TREE_OPERAND (t, 0); | 
| 9112 |   IMPLICIT_RVALUE_P (t) = 1; | 
| 9113 |   return ot; | 
| 9114 | } | 
| 9115 |  | 
| 9116 | /* True if t is a "constrained auto" type-specifier.  */ | 
| 9117 |  | 
| 9118 | inline bool | 
| 9119 | is_constrained_auto (const_tree t) | 
| 9120 | { | 
| 9121 |   return is_auto (t) && PLACEHOLDER_TYPE_CONSTRAINTS_INFO (t); | 
| 9122 | } | 
| 9123 |  | 
| 9124 | /* True if CODE, a tree code, denotes a tree whose operand is not evaluated | 
| 9125 |    as per [expr.context], i.e., an operand to sizeof, typeof, decltype, or | 
| 9126 |    alignof.  */ | 
| 9127 |  | 
| 9128 | inline bool | 
| 9129 | unevaluated_p (tree_code code) | 
| 9130 | { | 
| 9131 |   return (code == DECLTYPE_TYPE | 
| 9132 |           || code == ALIGNOF_EXPR | 
| 9133 |           || code == SIZEOF_EXPR | 
| 9134 |           || code == NOEXCEPT_EXPR | 
| 9135 |           || code == REQUIRES_EXPR); | 
| 9136 | } | 
| 9137 |  | 
| 9138 | /* RAII class to push/pop the access scope for T.  */ | 
| 9139 |  | 
| 9140 | struct push_access_scope_guard | 
| 9141 | { | 
| 9142 |   tree decl; | 
| 9143 |   push_access_scope_guard (tree t) | 
| 9144 |     : decl (t) | 
| 9145 |   { | 
| 9146 |     if (VAR_OR_FUNCTION_DECL_P (decl) | 
| 9147 |         || TREE_CODE (decl) == TYPE_DECL) | 
| 9148 |       push_access_scope (decl); | 
| 9149 |     else | 
| 9150 |       decl = NULL_TREE; | 
| 9151 |   } | 
| 9152 |   ~push_access_scope_guard () | 
| 9153 |   { | 
| 9154 |     if (decl) | 
| 9155 |       pop_access_scope (decl); | 
| 9156 |   } | 
| 9157 | }; | 
| 9158 |  | 
| 9159 | /* Extracting strings from constexpr.  */ | 
| 9160 |  | 
| 9161 | class cexpr_str | 
| 9162 | { | 
| 9163 | public: | 
| 9164 |   cexpr_str (tree message) : message (message) {} | 
| 9165 |   cexpr_str (const cexpr_str &) = delete; | 
| 9166 |   ~cexpr_str () { XDELETEVEC (buf); } | 
| 9167 |  | 
| 9168 |   bool type_check (location_t location); | 
| 9169 |   bool  (location_t location, const char * & msg, int &len); | 
| 9170 |   bool  (location_t location, tree &str); | 
| 9171 |   tree message; | 
| 9172 | private: | 
| 9173 |   tree message_data = NULL_TREE; | 
| 9174 |   tree message_sz = NULL_TREE; | 
| 9175 |   char *buf = nullptr; | 
| 9176 | }; | 
| 9177 |  | 
| 9178 | /* True if TYPE is an extended floating-point type.  */ | 
| 9179 |  | 
| 9180 | inline bool | 
| 9181 | extended_float_type_p (tree type) | 
| 9182 | { | 
| 9183 |   type = TYPE_MAIN_VARIANT (type); | 
| 9184 |   for (int i = 0; i < NUM_FLOATN_NX_TYPES; ++i) | 
| 9185 |     if (type == FLOATN_TYPE_NODE (i)) | 
| 9186 |       return true; | 
| 9187 |   if (type == bfloat16_type_node) | 
| 9188 |     return true; | 
| 9189 |   return false; | 
| 9190 | } | 
| 9191 |  | 
| 9192 | /* True if DECL is name-independent declaration.  */ | 
| 9193 |  | 
| 9194 | inline bool | 
| 9195 | name_independent_decl_p (tree decl) | 
| 9196 | { | 
| 9197 |   return ((VAR_P (decl) || TREE_CODE (decl) == FIELD_DECL) | 
| 9198 |           && DECL_NAME (decl) | 
| 9199 |           && id_equal (DECL_NAME (decl), str: "_" ) | 
| 9200 |           && !TREE_STATIC (decl) | 
| 9201 |           && !DECL_EXTERNAL (decl)); | 
| 9202 | } | 
| 9203 |  | 
| 9204 | namespace highlight_colors { | 
| 9205 |  | 
| 9206 | /* Color names for highlighting "%qH" vs "%qI" values, | 
| 9207 |    and ranges corresponding to them.  */ | 
| 9208 | extern const char *const percent_h; | 
| 9209 | extern const char *const percent_i; | 
| 9210 |  | 
| 9211 | } // namespace highlight_colors | 
| 9212 |  | 
| 9213 | #if CHECKING_P | 
| 9214 | namespace selftest { | 
| 9215 |   extern void run_cp_tests (void); | 
| 9216 |  | 
| 9217 |   /* Declarations for specific families of tests within cp, | 
| 9218 |      by source file, in alphabetical order.  */ | 
| 9219 |   extern void cp_pt_cc_tests (); | 
| 9220 |   extern void cp_tree_cc_tests (void); | 
| 9221 | } // namespace selftest | 
| 9222 | #endif /* #if CHECKING_P */ | 
| 9223 |  | 
| 9224 | /* -- end of C++ */ | 
| 9225 |  | 
| 9226 | #endif /* ! GCC_CP_TREE_H */ | 
| 9227 |  |