LCOV - code coverage report
Current view: top level - gcc/rust/backend - rust-tree.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 14.3 % 63 9
Test Date: 2024-04-20 14:03:02 Functions: 0.0 % 7 0
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

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

Generated by: LCOV version 2.1-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.