LCOV - code coverage report
Current view: top level - gcc/c-family - c-common.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 16 16 100.0 %
Date: 2023-07-19 08:18:47 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* Definitions for c-common.cc.
       2             :    Copyright (C) 1987-2023 Free Software Foundation, Inc.
       3             : 
       4             : This file is part of GCC.
       5             : 
       6             : GCC is free software; you can redistribute it and/or modify it under
       7             : the terms of the GNU General Public License as published by the Free
       8             : Software Foundation; either version 3, or (at your option) any later
       9             : version.
      10             : 
      11             : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14             : for more details.
      15             : 
      16             : You should have received a copy of the GNU General Public License
      17             : along with GCC; see the file COPYING3.  If not see
      18             : <http://www.gnu.org/licenses/>.  */
      19             : 
      20             : #ifndef GCC_C_COMMON_H
      21             : #define GCC_C_COMMON_H
      22             : 
      23             : #include "splay-tree.h"
      24             : #include "cpplib.h"
      25             : #include "alias.h"
      26             : #include "tree.h"
      27             : #include "fold-const.h"
      28             : #include "wide-int-bitmask.h"
      29             : 
      30             : /* In order for the format checking to accept the C frontend
      31             :    diagnostic framework extensions, you must include this file before
      32             :    diagnostic-core.h, not after.  The C front end formats are a subset of those
      33             :    for C++, so they are the appropriate set to use in common code;
      34             :    cp-tree.h overrides this for C++.  */
      35             : #if defined(GCC_DIAGNOSTIC_CORE_H)
      36             : #error \
      37             : In order for the format checking to accept the C front end diagnostic \
      38             : framework extensions, you must include this file before diagnostic-core.h \
      39             : never after.
      40             : #endif
      41             : #ifndef GCC_DIAG_STYLE
      42             : #define GCC_DIAG_STYLE __gcc_cdiag__
      43             : #endif
      44             : #include "diagnostic-core.h"
      45             : 
      46             : /* Usage of TREE_LANG_FLAG_?:
      47             :    0: IDENTIFIER_MARKED (used by search routines).
      48             :       C_MAYBE_CONST_EXPR_INT_OPERANDS (in C_MAYBE_CONST_EXPR, for C)
      49             :    1: C_DECLARED_LABEL_FLAG (in LABEL_DECL)
      50             :       STATEMENT_LIST_STMT_EXPR (in STATEMENT_LIST)
      51             :       C_MAYBE_CONST_EXPR_NON_CONST (in C_MAYBE_CONST_EXPR, for C)
      52             :    2: unused
      53             :    3: STATEMENT_LIST_HAS_LABEL (in STATEMENT_LIST)
      54             :    4: unused
      55             : */
      56             : 
      57             : /* Reserved identifiers.  This is the union of all the keywords for C,
      58             :    C++, and Objective-C.  All the type modifiers have to be in one
      59             :    block at the beginning, because they are used as mask bits.  There
      60             :    are 28 type modifiers; if we add many more we will have to redesign
      61             :    the mask mechanism.  */
      62             : 
      63             : enum rid
      64             : {
      65             :   /* Modifiers: */
      66             :   /* C, in empirical order of frequency.  */
      67             :   RID_STATIC = 0,
      68             :   RID_UNSIGNED, RID_LONG,    RID_CONST, RID_EXTERN,
      69             :   RID_REGISTER, RID_TYPEDEF, RID_SHORT, RID_INLINE,
      70             :   RID_VOLATILE, RID_SIGNED,  RID_AUTO,  RID_RESTRICT,
      71             :   RID_NORETURN, RID_ATOMIC,
      72             : 
      73             :   /* C extensions */
      74             :   RID_COMPLEX, RID_THREAD, RID_SAT,
      75             : 
      76             :   /* C++ */
      77             :   RID_FRIEND, RID_VIRTUAL, RID_EXPLICIT, RID_EXPORT, RID_MUTABLE,
      78             : 
      79             :   /* ObjC ("PQ" reserved words - they do not appear after a '@' and
      80             :      are keywords only in specific contexts)  */
      81             :   RID_IN, RID_OUT, RID_INOUT, RID_BYCOPY, RID_BYREF, RID_ONEWAY,
      82             : 
      83             :   /* ObjC ("PATTR" reserved words - they do not appear after a '@' 
      84             :      and are keywords only as property attributes)  */
      85             :   RID_GETTER, RID_SETTER,
      86             :   RID_READONLY, RID_READWRITE,
      87             :   RID_ASSIGN, RID_RETAIN, RID_COPY,
      88             :   RID_PROPATOMIC, RID_NONATOMIC,
      89             : 
      90             :   /* ObjC nullability support keywords that also can appear in the
      91             :      property attribute context.  These values should remain contiguous
      92             :      with the other property attributes.  */
      93             :   RID_NULL_UNSPECIFIED, RID_NULLABLE, RID_NONNULL, RID_NULL_RESETTABLE,
      94             : 
      95             :   /* C (reserved and imaginary types not implemented, so any use is a
      96             :      syntax error) */
      97             :   RID_IMAGINARY,
      98             : 
      99             :   /* C */
     100             :   RID_INT,     RID_CHAR,   RID_FLOAT,    RID_DOUBLE, RID_VOID,
     101             :   RID_ENUM,    RID_STRUCT, RID_UNION,    RID_IF,     RID_ELSE,
     102             :   RID_WHILE,   RID_DO,     RID_FOR,      RID_SWITCH, RID_CASE,
     103             :   RID_DEFAULT, RID_BREAK,  RID_CONTINUE, RID_RETURN, RID_GOTO,
     104             :   RID_SIZEOF,
     105             : 
     106             :   /* C extensions */
     107             :   RID_ASM,       RID_TYPEOF,   RID_TYPEOF_UNQUAL, RID_ALIGNOF,  RID_ATTRIBUTE,
     108             :   RID_VA_ARG,
     109             :   RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL,      RID_CHOOSE_EXPR,
     110             :   RID_TYPES_COMPATIBLE_P,      RID_BUILTIN_COMPLEX,          RID_BUILTIN_SHUFFLE,
     111             :   RID_BUILTIN_SHUFFLEVECTOR,   RID_BUILTIN_CONVERTVECTOR,   RID_BUILTIN_TGMATH,
     112             :   RID_BUILTIN_HAS_ATTRIBUTE,   RID_BUILTIN_ASSOC_BARRIER,
     113             :   RID_DFLOAT32, RID_DFLOAT64, RID_DFLOAT128,
     114             : 
     115             :   /* TS 18661-3 keywords, in the same sequence as the TI_* values.  */
     116             :   RID_FLOAT16,
     117             :   RID_FLOATN_NX_FIRST = RID_FLOAT16,
     118             :   RID_FLOAT32,
     119             :   RID_FLOAT64,
     120             :   RID_FLOAT128,
     121             :   RID_FLOAT32X,
     122             :   RID_FLOAT64X,
     123             :   RID_FLOAT128X,
     124             : #define CASE_RID_FLOATN_NX                                              \
     125             :   case RID_FLOAT16: case RID_FLOAT32: case RID_FLOAT64: case RID_FLOAT128: \
     126             :   case RID_FLOAT32X: case RID_FLOAT64X: case RID_FLOAT128X
     127             : 
     128             :   RID_FRACT, RID_ACCUM, RID_AUTO_TYPE, RID_BUILTIN_CALL_WITH_STATIC_CHAIN,
     129             : 
     130             :   /* "__GIMPLE", for the GIMPLE-parsing extension to the C frontend. */
     131             :   RID_GIMPLE,
     132             : 
     133             :   /* "__PHI", for parsing PHI function in GIMPLE FE.  */
     134             :   RID_PHI,
     135             : 
     136             :   /* "__RTL", for the RTL-parsing extension to the C frontend.  */
     137             :   RID_RTL,
     138             : 
     139             :   /* C11 */
     140             :   RID_ALIGNAS, RID_GENERIC,
     141             : 
     142             :   /* This means to warn that this is a C++ keyword, and then treat it
     143             :      as a normal identifier.  */
     144             :   RID_CXX_COMPAT_WARN,
     145             : 
     146             :   /* GNU transactional memory extension */
     147             :   RID_TRANSACTION_ATOMIC, RID_TRANSACTION_RELAXED, RID_TRANSACTION_CANCEL,
     148             : 
     149             :   /* Too many ways of getting the name of a function as a string */
     150             :   RID_FUNCTION_NAME, RID_PRETTY_FUNCTION_NAME, RID_C99_FUNCTION_NAME,
     151             : 
     152             :   /* C++ (some of these are keywords in Objective-C as well, but only
     153             :      if they appear after a '@') */
     154             :   RID_BOOL,     RID_WCHAR,    RID_CLASS,
     155             :   RID_PUBLIC,   RID_PRIVATE,  RID_PROTECTED,
     156             :   RID_TEMPLATE, RID_NULL,     RID_CATCH,
     157             :   RID_DELETE,   RID_FALSE,    RID_NAMESPACE,
     158             :   RID_NEW,      RID_OFFSETOF, RID_OPERATOR,
     159             :   RID_THIS,     RID_THROW,    RID_TRUE,
     160             :   RID_TRY,      RID_TYPENAME, RID_TYPEID,
     161             :   RID_USING,    RID_CHAR16,   RID_CHAR32,
     162             : 
     163             :   /* casts */
     164             :   RID_CONSTCAST, RID_DYNCAST, RID_REINTCAST, RID_STATCAST,
     165             : 
     166             :   /* C++ extensions */
     167             :   RID_ADDRESSOF,
     168             :   RID_BUILTIN_LAUNDER,
     169             :   RID_BUILTIN_BIT_CAST,
     170             : 
     171             : #define DEFTRAIT(TCC, CODE, NAME, ARITY) \
     172             :   RID_##CODE,
     173             : #include "cp/cp-trait.def"
     174             : #undef DEFTRAIT
     175             : 
     176             :   /* C++11 */
     177             :   RID_CONSTEXPR, RID_DECLTYPE, RID_NOEXCEPT, RID_NULLPTR, RID_STATIC_ASSERT,
     178             : 
     179             :   /* C++20 */
     180             :   RID_CONSTINIT, RID_CONSTEVAL,
     181             : 
     182             :   /* char8_t */
     183             :   RID_CHAR8,
     184             : 
     185             :   /* C++ concepts */
     186             :   RID_CONCEPT, RID_REQUIRES,
     187             : 
     188             :   /* C++ modules.  */
     189             :   RID__MODULE, RID__IMPORT, RID__EXPORT, /* Internal tokens.  */
     190             : 
     191             :   /* C++ coroutines */
     192             :   RID_CO_AWAIT, RID_CO_YIELD, RID_CO_RETURN,
     193             : 
     194             :   /* C++ transactional memory.  */
     195             :   RID_ATOMIC_NOEXCEPT, RID_ATOMIC_CANCEL, RID_SYNCHRONIZED,
     196             : 
     197             :   /* Objective-C ("AT" reserved words - they are only keywords when
     198             :      they follow '@')  */
     199             :   RID_AT_ENCODE,   RID_AT_END,
     200             :   RID_AT_CLASS,    RID_AT_ALIAS,     RID_AT_DEFS,
     201             :   RID_AT_PRIVATE,  RID_AT_PROTECTED, RID_AT_PUBLIC,  RID_AT_PACKAGE,
     202             :   RID_AT_PROTOCOL, RID_AT_SELECTOR,
     203             :   RID_AT_THROW,    RID_AT_TRY,       RID_AT_CATCH,
     204             :   RID_AT_FINALLY,  RID_AT_SYNCHRONIZED, 
     205             :   RID_AT_OPTIONAL, RID_AT_REQUIRED, RID_AT_PROPERTY,
     206             :   RID_AT_SYNTHESIZE, RID_AT_DYNAMIC,
     207             :   RID_AT_INTERFACE,
     208             :   RID_AT_IMPLEMENTATION,
     209             : 
     210             :   /* OpenMP */
     211             :   RID_OMP_ALL_MEMORY,
     212             : 
     213             :   /* Named address support, mapping the keyword to a particular named address
     214             :      number.  Named address space 0 is reserved for the generic address.  If
     215             :      there are more than 254 named addresses, the addr_space_t type will need
     216             :      to be grown from an unsigned char to unsigned short.  */
     217             :   RID_ADDR_SPACE_0,             /* generic address */
     218             :   RID_ADDR_SPACE_1,
     219             :   RID_ADDR_SPACE_2,
     220             :   RID_ADDR_SPACE_3,
     221             :   RID_ADDR_SPACE_4,
     222             :   RID_ADDR_SPACE_5,
     223             :   RID_ADDR_SPACE_6,
     224             :   RID_ADDR_SPACE_7,
     225             :   RID_ADDR_SPACE_8,
     226             :   RID_ADDR_SPACE_9,
     227             :   RID_ADDR_SPACE_10,
     228             :   RID_ADDR_SPACE_11,
     229             :   RID_ADDR_SPACE_12,
     230             :   RID_ADDR_SPACE_13,
     231             :   RID_ADDR_SPACE_14,
     232             :   RID_ADDR_SPACE_15,
     233             : 
     234             :   RID_FIRST_ADDR_SPACE = RID_ADDR_SPACE_0,
     235             :   RID_LAST_ADDR_SPACE = RID_ADDR_SPACE_15,
     236             : 
     237             :   /* __intN keywords.  The _N_M here doesn't correspond to the intN
     238             :      in the keyword; use the bitsize in int_n_t_data_t[M] for that.
     239             :      For example, if int_n_t_data_t[0].bitsize is 13, then RID_INT_N_0
     240             :      is for __int13.  */
     241             : 
     242             :   /* Note that the range to use is RID_FIRST_INT_N through
     243             :      RID_FIRST_INT_N + NUM_INT_N_ENTS - 1 and c-parser.cc has a list of
     244             :      all RID_INT_N_* in a case statement.  */
     245             : 
     246             :   RID_INT_N_0,
     247             :   RID_INT_N_1,
     248             :   RID_INT_N_2,
     249             :   RID_INT_N_3,
     250             : 
     251             :   RID_FIRST_INT_N = RID_INT_N_0,
     252             :   RID_LAST_INT_N = RID_INT_N_3,
     253             : 
     254             :   RID_MAX,
     255             : 
     256             :   RID_FIRST_MODIFIER = RID_STATIC,
     257             :   RID_LAST_MODIFIER = RID_ONEWAY,
     258             : 
     259             :   RID_FIRST_CXX11 = RID_CONSTEXPR,
     260             :   RID_LAST_CXX11 = RID_STATIC_ASSERT,
     261             :   RID_FIRST_CXX20 = RID_CONSTINIT,
     262             :   RID_LAST_CXX20 = RID_CO_RETURN,
     263             :   RID_FIRST_AT = RID_AT_ENCODE,
     264             :   RID_LAST_AT = RID_AT_IMPLEMENTATION,
     265             :   RID_FIRST_PQ = RID_IN,
     266             :   RID_LAST_PQ = RID_ONEWAY,
     267             :   RID_FIRST_PATTR = RID_GETTER,
     268             :   RID_LAST_PATTR = RID_NULL_RESETTABLE
     269             : };
     270             : 
     271             : #define OBJC_IS_AT_KEYWORD(rid) \
     272             :   ((unsigned int) (rid) >= (unsigned int) RID_FIRST_AT && \
     273             :    (unsigned int) (rid) <= (unsigned int) RID_LAST_AT)
     274             : 
     275             : #define OBJC_IS_PQ_KEYWORD(rid) \
     276             :   ((unsigned int) (rid) >= (unsigned int) RID_FIRST_PQ && \
     277             :    (unsigned int) (rid) <= (unsigned int) RID_LAST_PQ)
     278             : 
     279             : /* Keywords permitted in an @property attribute context.  */
     280             : #define OBJC_IS_PATTR_KEYWORD(rid) \
     281             :   ((((unsigned int) (rid) >= (unsigned int) RID_FIRST_PATTR && \
     282             :      (unsigned int) (rid) <= (unsigned int) RID_LAST_PATTR)) \
     283             :    || rid == RID_CLASS)
     284             : 
     285             : /* OBJC_IS_CXX_KEYWORD recognizes the 'CXX_OBJC' keywords (such as
     286             :    'class') which are shared in a subtle way between Objective-C and
     287             :    C++.  When the lexer is lexing in Objective-C/Objective-C++, if it
     288             :    finds '@' followed by one of these identifiers (eg, '@class'), it
     289             :    recognizes the whole as an Objective-C keyword.  If the identifier
     290             :    is found elsewhere, it follows the rules of the C/C++ language.
     291             :  */
     292             : #define OBJC_IS_CXX_KEYWORD(rid) \
     293             :   (rid == RID_CLASS || rid == RID_SYNCHRONIZED                  \
     294             :    || rid == RID_PUBLIC || rid == RID_PROTECTED || rid == RID_PRIVATE   \
     295             :    || rid == RID_TRY || rid == RID_THROW || rid == RID_CATCH)
     296             : 
     297             : /* The elements of `ridpointers' are identifier nodes for the reserved
     298             :    type names and storage classes.  It is indexed by a RID_... value.  */
     299             : extern GTY ((length ("(int) RID_MAX"))) tree *ridpointers;
     300             : 
     301             : /* Standard named or nameless data types of the C compiler.  */
     302             : 
     303             : enum c_tree_index
     304             : {
     305             :     CTI_CHAR8_TYPE,
     306             :     CTI_CHAR16_TYPE,
     307             :     CTI_CHAR32_TYPE,
     308             :     CTI_WCHAR_TYPE,
     309             :     CTI_UNDERLYING_WCHAR_TYPE,
     310             :     CTI_WINT_TYPE,
     311             :     CTI_SIGNED_SIZE_TYPE, /* For format checking only.  */
     312             :     CTI_UNSIGNED_PTRDIFF_TYPE, /* For format checking only.  */
     313             :     CTI_INTMAX_TYPE,
     314             :     CTI_UINTMAX_TYPE,
     315             :     CTI_WIDEST_INT_LIT_TYPE,
     316             :     CTI_WIDEST_UINT_LIT_TYPE,
     317             : 
     318             :     /* Types for <stdint.h>, that may not be defined on all
     319             :        targets.  */
     320             :     CTI_SIG_ATOMIC_TYPE,
     321             :     CTI_INT8_TYPE,
     322             :     CTI_INT16_TYPE,
     323             :     CTI_INT32_TYPE,
     324             :     CTI_INT64_TYPE,
     325             :     CTI_UINT8_TYPE,
     326             :     CTI_UINT16_TYPE,
     327             :     CTI_UINT32_TYPE,
     328             :     CTI_UINT64_TYPE,
     329             :     CTI_INT_LEAST8_TYPE,
     330             :     CTI_INT_LEAST16_TYPE,
     331             :     CTI_INT_LEAST32_TYPE,
     332             :     CTI_INT_LEAST64_TYPE,
     333             :     CTI_UINT_LEAST8_TYPE,
     334             :     CTI_UINT_LEAST16_TYPE,
     335             :     CTI_UINT_LEAST32_TYPE,
     336             :     CTI_UINT_LEAST64_TYPE,
     337             :     CTI_INT_FAST8_TYPE,
     338             :     CTI_INT_FAST16_TYPE,
     339             :     CTI_INT_FAST32_TYPE,
     340             :     CTI_INT_FAST64_TYPE,
     341             :     CTI_UINT_FAST8_TYPE,
     342             :     CTI_UINT_FAST16_TYPE,
     343             :     CTI_UINT_FAST32_TYPE,
     344             :     CTI_UINT_FAST64_TYPE,
     345             :     CTI_INTPTR_TYPE,
     346             :     CTI_UINTPTR_TYPE,
     347             : 
     348             :     CTI_CHAR_ARRAY_TYPE,
     349             :     CTI_CHAR8_ARRAY_TYPE,
     350             :     CTI_CHAR16_ARRAY_TYPE,
     351             :     CTI_CHAR32_ARRAY_TYPE,
     352             :     CTI_WCHAR_ARRAY_TYPE,
     353             :     CTI_STRING_TYPE,
     354             :     CTI_CONST_STRING_TYPE,
     355             : 
     356             :     /* Type for boolean expressions (bool in C++, int in C).  */
     357             :     CTI_TRUTHVALUE_TYPE,
     358             :     CTI_TRUTHVALUE_TRUE,
     359             :     CTI_TRUTHVALUE_FALSE,
     360             : 
     361             :     CTI_DEFAULT_FUNCTION_TYPE,
     362             : 
     363             :     CTI_NULL,
     364             :     CTI_NULLPTR,
     365             :     CTI_NULLPTR_TYPE,
     366             : 
     367             :     /* These are not types, but we have to look them up all the time.  */
     368             :     CTI_FUNCTION_NAME_DECL,
     369             :     CTI_PRETTY_FUNCTION_NAME_DECL,
     370             :     CTI_C99_FUNCTION_NAME_DECL,
     371             : 
     372             :     CTI_MODULE_HWM,
     373             :     /* Below here entities change during compilation.  */
     374             : 
     375             :     CTI_SAVED_FUNCTION_NAME_DECLS,
     376             : 
     377             :     CTI_MAX
     378             : };
     379             : 
     380             : #define C_CPP_HASHNODE(id) \
     381             :   (&(((struct c_common_identifier *) (id))->node))
     382             : #define C_RID_CODE(id) \
     383             :   ((enum rid) (((struct c_common_identifier *) (id))->node.rid_code))
     384             : #define C_SET_RID_CODE(id, code) \
     385             :   (((struct c_common_identifier *) (id))->node.rid_code = (unsigned char) code)
     386             : 
     387             : /* Identifier part common to the C front ends.  Inherits from
     388             :    tree_identifier, despite appearances.  */
     389             : struct GTY(()) c_common_identifier {
     390             :   struct tree_common common;
     391             :   struct cpp_hashnode node;
     392             : };
     393             : 
     394             : /* An entry in the reserved keyword table.  */
     395             : 
     396             : struct c_common_resword
     397             : {
     398             :   const char *const word;
     399             :   ENUM_BITFIELD(rid) const rid : 16;
     400             :   const unsigned int disable   : 32;
     401             : };
     402             : 
     403             : /* Mode used to build pointers (VOIDmode means ptr_mode).  */
     404             : 
     405             : extern machine_mode c_default_pointer_mode;
     406             : 
     407             : /* Extra cpp_ttype values for C++.  */
     408             : 
     409             : /* A token type for template-ids.  If a template-id is processed while
     410             :    parsing tentatively, it is replaced with a CPP_TEMPLATE_ID token;
     411             :    the value of the CPP_TEMPLATE_ID is whatever was returned by
     412             :    cp_parser_template_id.  */
     413             : #define CPP_TEMPLATE_ID ((enum cpp_ttype) (CPP_KEYWORD + 1))
     414             : 
     415             : /* A token type for nested-name-specifiers.  If a
     416             :    nested-name-specifier is processed while parsing tentatively, it is
     417             :    replaced with a CPP_NESTED_NAME_SPECIFIER token; the value of the
     418             :    CPP_NESTED_NAME_SPECIFIER is whatever was returned by
     419             :    cp_parser_nested_name_specifier_opt.  */
     420             : #define CPP_NESTED_NAME_SPECIFIER ((enum cpp_ttype) (CPP_TEMPLATE_ID + 1))
     421             : 
     422             : /* A token type for pre-parsed C++0x decltype.  */
     423             : #define CPP_DECLTYPE ((enum cpp_ttype) (CPP_NESTED_NAME_SPECIFIER + 1))
     424             : 
     425             : /* A token type for pre-parsed primary-expression (lambda- or statement-).  */
     426             : #define CPP_PREPARSED_EXPR ((enum cpp_ttype) (CPP_DECLTYPE + 1))
     427             : 
     428             : /* The number of token types, including C++-specific ones.  */
     429             : #define N_CP_TTYPES ((int) (CPP_PREPARSED_EXPR + 1))
     430             : 
     431             : /* Disable mask.  Keywords are disabled if (reswords[i].disable &
     432             :    mask) is _true_.  Thus for keywords which are present in all
     433             :    languages the disable field is zero.  */
     434             : 
     435             : #define D_CONLY         0x0001  /* C only (not in C++).  */
     436             : #define D_CXXONLY       0x0002  /* C++ only (not in C).  */
     437             : #define D_C99           0x0004  /* In C, C99 only.  */
     438             : #define D_C2X           0x0008  /* In C, C2X only.  */
     439             : #define D_CXX11         0x0010  /* In C++, C++11 only.  */
     440             : #define D_EXT           0x0020  /* GCC extension.  */
     441             : #define D_EXT89         0x0040  /* GCC extension incorporated in C99.  */
     442             : #define D_EXT11         0x0080  /* GCC extension incorporated in C2X.  */
     443             : #define D_ASM           0x0100  /* Disabled by -fno-asm.  */
     444             : #define D_OBJC          0x0200  /* In Objective C and neither C nor C++.  */
     445             : #define D_CXX_OBJC      0x0400  /* In Objective C, and C++, but not C.  */
     446             : #define D_CXXWARN       0x0800  /* In C warn with -Wcxx-compat.  */
     447             : #define D_CXX_CONCEPTS  0x1000  /* In C++, only with concepts.  */
     448             : #define D_TRANSMEM      0x2000  /* C++ transactional memory TS.  */
     449             : #define D_CXX_CHAR8_T   0x4000  /* In C++, only with -fchar8_t.  */
     450             : #define D_CXX20         0x8000  /* In C++, C++20 only.  */
     451             : #define D_CXX_COROUTINES 0x10000  /* In C++, only with coroutines.  */
     452             : #define D_CXX_MODULES   0x20000  /* In C++, only with modules.  */
     453             : 
     454             : #define D_CXX_CONCEPTS_FLAGS D_CXXONLY | D_CXX_CONCEPTS
     455             : #define D_CXX_CHAR8_T_FLAGS D_CXXONLY | D_CXX_CHAR8_T
     456             : #define D_CXX_MODULES_FLAGS (D_CXXONLY | D_CXX_MODULES)
     457             : #define D_CXX_COROUTINES_FLAGS (D_CXXONLY | D_CXX_COROUTINES)
     458             : 
     459             : /* The reserved keyword table.  */
     460             : extern const struct c_common_resword c_common_reswords[];
     461             : 
     462             : /* The number of items in the reserved keyword table.  */
     463             : extern const unsigned int num_c_common_reswords;
     464             : 
     465             : #define char8_type_node                 c_global_trees[CTI_CHAR8_TYPE]
     466             : #define char16_type_node                c_global_trees[CTI_CHAR16_TYPE]
     467             : #define char32_type_node                c_global_trees[CTI_CHAR32_TYPE]
     468             : #define wchar_type_node                 c_global_trees[CTI_WCHAR_TYPE]
     469             : #define underlying_wchar_type_node      c_global_trees[CTI_UNDERLYING_WCHAR_TYPE]
     470             : #define wint_type_node                  c_global_trees[CTI_WINT_TYPE]
     471             : #define signed_size_type_node           c_global_trees[CTI_SIGNED_SIZE_TYPE]
     472             : #define unsigned_ptrdiff_type_node      c_global_trees[CTI_UNSIGNED_PTRDIFF_TYPE]
     473             : #define intmax_type_node                c_global_trees[CTI_INTMAX_TYPE]
     474             : #define uintmax_type_node               c_global_trees[CTI_UINTMAX_TYPE]
     475             : #define widest_integer_literal_type_node c_global_trees[CTI_WIDEST_INT_LIT_TYPE]
     476             : #define widest_unsigned_literal_type_node c_global_trees[CTI_WIDEST_UINT_LIT_TYPE]
     477             : 
     478             : #define sig_atomic_type_node            c_global_trees[CTI_SIG_ATOMIC_TYPE]
     479             : #define int8_type_node                  c_global_trees[CTI_INT8_TYPE]
     480             : #define int16_type_node                 c_global_trees[CTI_INT16_TYPE]
     481             : #define int32_type_node                 c_global_trees[CTI_INT32_TYPE]
     482             : #define int64_type_node                 c_global_trees[CTI_INT64_TYPE]
     483             : #define uint8_type_node                 c_global_trees[CTI_UINT8_TYPE]
     484             : #define c_uint16_type_node              c_global_trees[CTI_UINT16_TYPE]
     485             : #define c_uint32_type_node              c_global_trees[CTI_UINT32_TYPE]
     486             : #define c_uint64_type_node              c_global_trees[CTI_UINT64_TYPE]
     487             : #define int_least8_type_node            c_global_trees[CTI_INT_LEAST8_TYPE]
     488             : #define int_least16_type_node           c_global_trees[CTI_INT_LEAST16_TYPE]
     489             : #define int_least32_type_node           c_global_trees[CTI_INT_LEAST32_TYPE]
     490             : #define int_least64_type_node           c_global_trees[CTI_INT_LEAST64_TYPE]
     491             : #define uint_least8_type_node           c_global_trees[CTI_UINT_LEAST8_TYPE]
     492             : #define uint_least16_type_node          c_global_trees[CTI_UINT_LEAST16_TYPE]
     493             : #define uint_least32_type_node          c_global_trees[CTI_UINT_LEAST32_TYPE]
     494             : #define uint_least64_type_node          c_global_trees[CTI_UINT_LEAST64_TYPE]
     495             : #define int_fast8_type_node             c_global_trees[CTI_INT_FAST8_TYPE]
     496             : #define int_fast16_type_node            c_global_trees[CTI_INT_FAST16_TYPE]
     497             : #define int_fast32_type_node            c_global_trees[CTI_INT_FAST32_TYPE]
     498             : #define int_fast64_type_node            c_global_trees[CTI_INT_FAST64_TYPE]
     499             : #define uint_fast8_type_node            c_global_trees[CTI_UINT_FAST8_TYPE]
     500             : #define uint_fast16_type_node           c_global_trees[CTI_UINT_FAST16_TYPE]
     501             : #define uint_fast32_type_node           c_global_trees[CTI_UINT_FAST32_TYPE]
     502             : #define uint_fast64_type_node           c_global_trees[CTI_UINT_FAST64_TYPE]
     503             : #define intptr_type_node                c_global_trees[CTI_INTPTR_TYPE]
     504             : #define uintptr_type_node               c_global_trees[CTI_UINTPTR_TYPE]
     505             : 
     506             : #define truthvalue_type_node            c_global_trees[CTI_TRUTHVALUE_TYPE]
     507             : #define truthvalue_true_node            c_global_trees[CTI_TRUTHVALUE_TRUE]
     508             : #define truthvalue_false_node           c_global_trees[CTI_TRUTHVALUE_FALSE]
     509             : 
     510             : #define char_array_type_node            c_global_trees[CTI_CHAR_ARRAY_TYPE]
     511             : #define char8_array_type_node           c_global_trees[CTI_CHAR8_ARRAY_TYPE]
     512             : #define char16_array_type_node          c_global_trees[CTI_CHAR16_ARRAY_TYPE]
     513             : #define char32_array_type_node          c_global_trees[CTI_CHAR32_ARRAY_TYPE]
     514             : #define wchar_array_type_node           c_global_trees[CTI_WCHAR_ARRAY_TYPE]
     515             : #define string_type_node                c_global_trees[CTI_STRING_TYPE]
     516             : #define const_string_type_node          c_global_trees[CTI_CONST_STRING_TYPE]
     517             : 
     518             : #define default_function_type           c_global_trees[CTI_DEFAULT_FUNCTION_TYPE]
     519             : 
     520             : #define function_name_decl_node         c_global_trees[CTI_FUNCTION_NAME_DECL]
     521             : #define pretty_function_name_decl_node  c_global_trees[CTI_PRETTY_FUNCTION_NAME_DECL]
     522             : #define c99_function_name_decl_node             c_global_trees[CTI_C99_FUNCTION_NAME_DECL]
     523             : #define saved_function_name_decls       c_global_trees[CTI_SAVED_FUNCTION_NAME_DECLS]
     524             : 
     525             : /* The node for C++ `__null'.  */
     526             : #define null_node                       c_global_trees[CTI_NULL]
     527             : /* The nodes for `nullptr'.  */
     528             : #define nullptr_node                    c_global_trees[CTI_NULLPTR]
     529             : #define nullptr_type_node               c_global_trees[CTI_NULLPTR_TYPE]
     530             : 
     531             : extern GTY(()) tree c_global_trees[CTI_MAX];
     532             : 
     533             : /* Mark which labels are explicitly declared.
     534             :    These may be shadowed, and may be referenced from nested functions.  */
     535             : #define C_DECLARED_LABEL_FLAG(label) TREE_LANG_FLAG_1 (label)
     536             : 
     537             : enum c_language_kind
     538             : {
     539             :   clk_c         = 0,            /* C90, C94, C99, C11 or C2X */
     540             :   clk_objc      = 1,            /* clk_c with ObjC features.  */
     541             :   clk_cxx       = 2,            /* ANSI/ISO C++ */
     542             :   clk_objcxx    = 3             /* clk_cxx with ObjC features.  */
     543             : };
     544             : 
     545             : /* To test for a specific language use c_language, defined by each
     546             :    front end.  For "ObjC features" or "not C++" use the macros.  */
     547             : extern c_language_kind c_language;
     548             : 
     549             : #define c_dialect_cxx()         ((c_language & clk_cxx) != 0)
     550             : #define c_dialect_objc()        ((c_language & clk_objc) != 0)
     551             : 
     552             : /* The various name of operator that appears in error messages. */
     553             : enum ref_operator {
     554             :   /* NULL */
     555             :   RO_NULL,
     556             :   /* array indexing */
     557             :   RO_ARRAY_INDEXING,
     558             :   /* unary * */
     559             :   RO_UNARY_STAR,
     560             :   /* -> */
     561             :   RO_ARROW,
     562             :   /* implicit conversion */
     563             :   RO_IMPLICIT_CONVERSION,
     564             :   /* ->* */
     565             :   RO_ARROW_STAR
     566             : };
     567             : 
     568             : /* Information about a statement tree.  */
     569             : 
     570             : struct GTY(()) stmt_tree_s {
     571             :   /* A stack of statement lists being collected.  */
     572             :   vec<tree, va_gc> *x_cur_stmt_list;
     573             : 
     574             :   /* In C++, Nonzero if we should treat statements as full
     575             :      expressions.  In particular, this variable is non-zero if at the
     576             :      end of a statement we should destroy any temporaries created
     577             :      during that statement.  Similarly, if, at the end of a block, we
     578             :      should destroy any local variables in this block.  Normally, this
     579             :      variable is nonzero, since those are the normal semantics of
     580             :      C++.
     581             : 
     582             :      This flag has no effect in C.  */
     583             :   int stmts_are_full_exprs_p;
     584             : };
     585             : 
     586             : typedef struct stmt_tree_s *stmt_tree;
     587             : 
     588             : /* Global state pertinent to the current function.  Some C dialects
     589             :    extend this structure with additional fields.  */
     590             : 
     591             : struct GTY(()) c_language_function {
     592             :   /* While we are parsing the function, this contains information
     593             :      about the statement-tree that we are building.  */
     594             :   struct stmt_tree_s x_stmt_tree;
     595             : 
     596             :   /* Vector of locally defined typedefs, for
     597             :      -Wunused-local-typedefs.  */
     598             :   vec<tree, va_gc> *local_typedefs;
     599             : };
     600             : 
     601             : #define stmt_list_stack (current_stmt_tree ()->x_cur_stmt_list)
     602             : 
     603             : /* When building a statement-tree, this is the current statement list
     604             :    being collected.  */
     605             : #define cur_stmt_list   (stmt_list_stack->last ())
     606             : 
     607             : #define building_stmt_list_p() (stmt_list_stack && !stmt_list_stack->is_empty())
     608             : 
     609             : /* Language-specific hooks.  */
     610             : 
     611             : /* If non-NULL, this function is called after a precompile header file
     612             :    is loaded.  */
     613             : extern void (*lang_post_pch_load) (void);
     614             : 
     615             : extern void push_file_scope (void);
     616             : extern void pop_file_scope (void);
     617             : extern stmt_tree current_stmt_tree (void);
     618             : extern tree push_stmt_list (void);
     619             : extern tree pop_stmt_list (tree);
     620             : extern tree add_stmt (tree);
     621             : extern void push_cleanup (tree, tree, bool);
     622             : 
     623             : extern tree build_modify_expr (location_t, tree, tree, enum tree_code,
     624             :                                location_t, tree, tree);
     625             : extern tree build_indirect_ref (location_t, tree, ref_operator);
     626             : 
     627             : extern bool has_c_linkage (const_tree decl);
     628             : extern bool c_decl_implicit (const_tree);
     629             : 
     630             : /* Switches common to the C front ends.  */
     631             : 
     632             : /* Nonzero means don't output line number information.  */
     633             : 
     634             : extern char flag_no_line_commands;
     635             : 
     636             : /* Nonzero causes -E output not to be done, but directives such as
     637             :    #define that have side effects are still obeyed.  */
     638             : 
     639             : extern char flag_no_output;
     640             : 
     641             : /* Nonzero means dump macros in some fashion; contains the 'D', 'M',
     642             :    'N' or 'U' of the command line switch.  */
     643             : 
     644             : extern char flag_dump_macros;
     645             : 
     646             : /* Nonzero means pass #include lines through to the output.  */
     647             : 
     648             : extern char flag_dump_includes;
     649             : 
     650             : /* Nonzero means process PCH files while preprocessing.  */
     651             : 
     652             : extern bool flag_pch_preprocess;
     653             : 
     654             : /* The file name to which we should write a precompiled header, or
     655             :    NULL if no header will be written in this compile.  */
     656             : 
     657             : extern const char *pch_file;
     658             : 
     659             : /* Nonzero if an ISO standard was selected.  It rejects macros in the
     660             :    user's namespace.  */
     661             : 
     662             : extern int flag_iso;
     663             : 
     664             : /* C/ObjC language option variables.  */
     665             : 
     666             : 
     667             : /* Nonzero means allow type mismatches in conditional expressions;
     668             :    just make their values `void'.  */
     669             : 
     670             : extern int flag_cond_mismatch;
     671             : 
     672             : /* Nonzero means enable C89 Amendment 1 features.  */
     673             : 
     674             : extern int flag_isoc94;
     675             : 
     676             : /* Nonzero means use the ISO C99 (or later) dialect of C.  */
     677             : 
     678             : extern int flag_isoc99;
     679             : 
     680             : /* Nonzero means use the ISO C11 (or later) dialect of C.  */
     681             : 
     682             : extern int flag_isoc11;
     683             : 
     684             : /* Nonzero means use the ISO C2X dialect of C.  */
     685             : 
     686             : extern int flag_isoc2x;
     687             : 
     688             : /* Nonzero means that we have builtin functions, and main is an int.  */
     689             : 
     690             : extern int flag_hosted;
     691             : 
     692             : /* ObjC language option variables.  */
     693             : 
     694             : 
     695             : /* Tells the compiler that this is a special run.  Do not perform any
     696             :    compiling, instead we are to test some platform dependent features
     697             :    and output a C header file with appropriate definitions.  */
     698             : 
     699             : extern int print_struct_values;
     700             : 
     701             : /* Tells the compiler what is the constant string class for ObjC.  */
     702             : 
     703             : extern const char *constant_string_class_name;
     704             : 
     705             : 
     706             : /* C++ language option variables.  */
     707             : 
     708             : /* The reference version of the ABI for -Wabi.  */
     709             : 
     710             : extern int warn_abi_version;
     711             : 
     712             : /* Return TRUE if one of {flag_abi_version,flag_abi_compat_version} is
     713             :    less than N and the other is at least N.  */
     714             : #define abi_compat_version_crosses(N)           \
     715             :   (abi_version_at_least(N)                      \
     716             :    != (flag_abi_compat_version == 0             \
     717             :        || flag_abi_compat_version >= (N)))
     718             : 
     719             : /* Return TRUE if one of {flag_abi_version,warn_abi_version} is
     720             :    less than N and the other is at least N, for use by -Wabi.  */
     721             : #define abi_version_crosses(N)                  \
     722             :   (abi_version_at_least(N)                      \
     723             :    != (warn_abi_version == 0                    \
     724             :        || warn_abi_version >= (N)))
     725             : 
     726             : /* The supported C++ dialects.  */
     727             : 
     728             : enum cxx_dialect {
     729             :   cxx_unset,
     730             :   /* C++98 with TC1  */
     731             :   cxx98,
     732             :   cxx03 = cxx98,
     733             :   /* C++11  */
     734             :   cxx0x,
     735             :   cxx11 = cxx0x,
     736             :   /* C++14 */
     737             :   cxx14,
     738             :   /* C++17 */
     739             :   cxx17,
     740             :   /* C++20 */
     741             :   cxx20,
     742             :   /* C++23 */
     743             :   cxx23,
     744             :   /* C++26 */
     745             :   cxx26
     746             : };
     747             : 
     748             : /* The C++ dialect being used. C++98 is the default.  */
     749             : extern enum cxx_dialect cxx_dialect;
     750             : 
     751             : /* Maximum template instantiation depth.  This limit is rather
     752             :    arbitrary, but it exists to limit the time it takes to notice
     753             :    excessively recursive template instantiations.  */
     754             : 
     755             : extern int max_tinst_depth;
     756             : 
     757             : /* Nonzero means that we should not issue warnings about problems that
     758             :    occur when the code is executed, because the code being processed
     759             :    is not expected to be executed.  This is set during parsing.  This
     760             :    is used for cases like sizeof() and "0 ? a : b".  This is a count,
     761             :    not a bool, because unexecuted expressions can nest.  */
     762             : 
     763             : extern int c_inhibit_evaluation_warnings;
     764             : 
     765             : /* Depending on which phase of processing we are in, we may need
     766             :    to prefer input_location to libcpp's locations.  (Specifically,
     767             :    after the C++ lexer is done lexing tokens, but prior to calling
     768             :    cpp_finish (), we need to do so.  */
     769             : 
     770             : extern bool override_libcpp_locations;
     771             : 
     772             : /* C types are partitioned into three subsets: object, function, and
     773             :    incomplete types.  */
     774             : #define C_TYPE_OBJECT_P(type) \
     775             :   (TREE_CODE (type) != FUNCTION_TYPE && TYPE_SIZE (type))
     776             : 
     777             : #define C_TYPE_INCOMPLETE_P(type) \
     778             :   (TREE_CODE (type) != FUNCTION_TYPE && TYPE_SIZE (type) == 0)
     779             : 
     780             : #define C_TYPE_FUNCTION_P(type) \
     781             :   (TREE_CODE (type) == FUNCTION_TYPE)
     782             : 
     783             : /* For convenience we define a single macro to identify the class of
     784             :    object or incomplete types.  */
     785             : #define C_TYPE_OBJECT_OR_INCOMPLETE_P(type) \
     786             :   (!C_TYPE_FUNCTION_P (type))
     787             : 
     788             : /* Return true if TYPE is a vector type that should be subject to the GNU
     789             :    vector extensions (as opposed to a vector type that is used only for
     790             :    the purposes of defining target-specific built-in functions).  */
     791             : 
     792             : inline bool
     793   250618793 : gnu_vector_type_p (const_tree type)
     794             : {
     795   250618793 :   return VECTOR_TYPE_P (type) && !TYPE_INDIVISIBLE_P (type);
     796             : }
     797             : 
     798             : struct visibility_flags
     799             : {
     800             :   unsigned inpragma : 1;        /* True when in #pragma GCC visibility.  */
     801             :   unsigned inlines_hidden : 1;  /* True when -finlineshidden in effect.  */
     802             : };
     803             : 
     804             : /* These enumerators are possible types of unsafe conversions.  */
     805             : enum conversion_safety {
     806             :   /* The conversion is safe.  */
     807             :   SAFE_CONVERSION = 0,
     808             :   /* Another type of conversion with problems.  */
     809             :   UNSAFE_OTHER,
     810             :   /* Conversion between signed and unsigned integers.  */
     811             :   UNSAFE_SIGN,
     812             :   /* Conversions that reduce the precision of reals including conversions
     813             :      from reals to integers.  */
     814             :   UNSAFE_REAL,
     815             :   /* Conversions from complex to reals or integers, that discard imaginary
     816             :      component.  */
     817             :   UNSAFE_IMAGINARY
     818             : };
     819             : 
     820             : /* Global visibility options.  */
     821             : extern struct visibility_flags visibility_options;
     822             : 
     823             : /* Attribute table common to the C front ends.  */
     824             : extern const struct attribute_spec c_common_attribute_table[];
     825             : extern const struct attribute_spec c_common_format_attribute_table[];
     826             : 
     827             : /* Pointer to function to lazily generate the VAR_DECL for __FUNCTION__ etc.
     828             :    ID is the identifier to use, NAME is the string.
     829             :    TYPE_DEP indicates whether it depends on type of the function or not
     830             :    (i.e. __PRETTY_FUNCTION__).  */
     831             : 
     832             : extern tree (*make_fname_decl) (location_t, tree, int);
     833             : 
     834             : /* In c-decl.cc and cp/tree.cc.  FIXME.  */
     835             : extern void c_register_addr_space (const char *str, addr_space_t as);
     836             : 
     837             : /* In c-common.cc.  */
     838             : extern bool in_late_binary_op;
     839             : extern const char *c_addr_space_name (addr_space_t as);
     840             : extern tree identifier_global_value (tree);
     841             : extern tree identifier_global_tag (tree);
     842             : extern bool names_builtin_p (const char *);
     843             : extern tree c_linkage_bindings (tree);
     844             : extern void record_builtin_type (enum rid, const char *, tree);
     845             : extern void start_fname_decls (void);
     846             : extern void finish_fname_decls (void);
     847             : extern const char *fname_as_string (int);
     848             : extern tree fname_decl (location_t, unsigned, tree);
     849             : 
     850             : extern int check_user_alignment (const_tree, bool, bool);
     851             : extern bool check_function_arguments (location_t loc, const_tree, const_tree,
     852             :                                       int, tree *, vec<location_t> *);
     853             : extern void check_function_arguments_recurse (void (*)
     854             :                                               (void *, tree,
     855             :                                                unsigned HOST_WIDE_INT),
     856             :                                               void *, tree,
     857             :                                               unsigned HOST_WIDE_INT,
     858             :                                               opt_code);
     859             : extern bool check_builtin_function_arguments (location_t, vec<location_t>,
     860             :                                               tree, tree, int, tree *);
     861             : extern void check_function_format (const_tree, tree, int, tree *,
     862             :                                    vec<location_t> *);
     863             : extern bool attribute_fallthrough_p (tree);
     864             : extern tree handle_format_attribute (tree *, tree, tree, int, bool *);
     865             : extern tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
     866             : extern bool c_common_handle_option (size_t, const char *, HOST_WIDE_INT, int,
     867             :                                     location_t,
     868             :                                     const struct cl_option_handlers *);
     869             : extern bool default_handle_c_option (size_t, const char *, int);
     870             : extern tree c_common_type_for_mode (machine_mode, int);
     871             : extern tree c_common_type_for_size (unsigned int, int);
     872             : extern tree c_common_fixed_point_type_for_size (unsigned int, unsigned int,
     873             :                                                 int, int);
     874             : extern tree c_common_unsigned_type (tree);
     875             : extern tree c_common_signed_type (tree);
     876             : extern tree c_common_signed_or_unsigned_type (int, tree);
     877             : extern void c_common_init_ts (void);
     878             : extern tree c_build_bitfield_integer_type (unsigned HOST_WIDE_INT, int);
     879             : extern enum conversion_safety unsafe_conversion_p (tree, tree, tree, bool);
     880             : extern bool decl_with_nonnull_addr_p (const_tree);
     881             : extern tree c_fully_fold (tree, bool, bool *, bool = false);
     882             : extern tree c_wrap_maybe_const (tree, bool);
     883             : extern tree c_common_truthvalue_conversion (location_t, tree);
     884             : extern void c_apply_type_quals_to_decl (int, tree);
     885             : extern tree c_sizeof_or_alignof_type (location_t, tree, bool, bool, int);
     886             : extern tree c_alignof_expr (location_t, tree);
     887             : /* Print an error message for invalid operands to arith operation CODE.
     888             :    NOP_EXPR is used as a special case (see truthvalue_conversion).  */
     889             : extern void binary_op_error (rich_location *, enum tree_code, tree, tree);
     890             : extern tree fix_string_type (tree);
     891             : extern tree convert_and_check (location_t, tree, tree, bool = false);
     892             : extern bool c_determine_visibility (tree);
     893             : extern bool vector_types_compatible_elements_p (tree, tree);
     894             : extern void mark_valid_location_for_stdc_pragma (bool);
     895             : extern bool valid_location_for_stdc_pragma_p (void);
     896             : extern void set_float_const_decimal64 (void);
     897             : extern void clear_float_const_decimal64 (void);
     898             : extern bool float_const_decimal64_p (void);
     899             : 
     900             : extern bool keyword_begins_type_specifier (enum rid);
     901             : extern bool keyword_is_storage_class_specifier (enum rid);
     902             : extern bool keyword_is_type_qualifier (enum rid);
     903             : extern bool keyword_is_decl_specifier (enum rid);
     904             : extern unsigned max_align_t_align (void);
     905             : extern bool cxx_fundamental_alignment_p (unsigned);
     906             : extern bool pointer_to_zero_sized_aggr_p (tree);
     907             : extern bool bool_promoted_to_int_p (tree);
     908             : extern tree fold_for_warn (tree);
     909             : extern tree c_common_get_narrower (tree, int *);
     910             : extern bool get_attribute_operand (tree, unsigned HOST_WIDE_INT *);
     911             : extern void c_common_finalize_early_debug (void);
     912             : extern unsigned int c_strict_flex_array_level_of (tree);
     913             : extern bool c_option_is_from_cpp_diagnostics (int);
     914             : 
     915             : /* Used by convert_and_check; in front ends.  */
     916             : extern tree convert_init (tree, tree);
     917             : 
     918             : #define c_sizeof(LOC, T)  c_sizeof_or_alignof_type (LOC, T, true, false, 1)
     919             : #define c_alignof(LOC, T) c_sizeof_or_alignof_type (LOC, T, false, false, 1)
     920             : 
     921             : /* Subroutine of build_binary_op, used for certain operations.  */
     922             : extern tree shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwise);
     923             : 
     924             : /* Return true if division or modulo op0 / op1 or op0 % op1 may be shortened.
     925             :    We can shorten only if we can guarantee that op0 is not signed integral
     926             :    minimum or op1 is not -1, because e.g. (long long) INT_MIN / -1 is
     927             :    well defined INT_MAX + 1LL if long long is wider than int, but INT_MIN / -1
     928             :    is UB.  */
     929             : inline bool
     930     2299575 : may_shorten_divmod (tree op0, tree op1)
     931             : {
     932     2299575 :   tree type0 = TREE_TYPE (op0);
     933     2299575 :   if (TYPE_UNSIGNED (type0))
     934             :     return true;
     935             :   /* A cast from narrower unsigned won't be signed integral minimum,
     936             :      but cast from same or wider precision unsigned could be.  */
     937      921383 :   if (TREE_CODE (op0) == NOP_EXPR
     938      272345 :       && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
     939      272345 :       && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0)))
     940      922037 :       && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))
     941         654 :           < TYPE_PRECISION (type0)))
     942             :     return true;
     943      921267 :   if (TREE_CODE (op1) == INTEGER_CST && !integer_all_onesp (op1))
     944             :     return true;
     945             :   return false;
     946             : }
     947             : 
     948             : /* Subroutine of build_binary_op, used for comparison operations.
     949             :    See if the operands have both been converted from subword integer types
     950             :    and, if so, perhaps change them both back to their original type.  */
     951             : extern tree shorten_compare (location_t, tree *, tree *, tree *,
     952             :                              enum tree_code *);
     953             : 
     954             : extern tree pointer_int_sum (location_t, enum tree_code, tree, tree,
     955             :                              bool = true);
     956             : 
     957             : /* Add qualifiers to a type, in the fashion for C.  */
     958             : extern tree c_build_qualified_type (tree, int, tree = NULL_TREE, size_t = 0);
     959             : 
     960             : /* Build tree nodes and builtin functions common to both C and C++ language
     961             :    frontends.  */
     962             : extern void c_common_nodes_and_builtins (void);
     963             : 
     964             : extern void disable_builtin_function (const char *);
     965             : 
     966             : extern void set_compound_literal_name (tree decl);
     967             : 
     968             : extern tree build_va_arg (location_t, tree, tree);
     969             : 
     970             : extern const unsigned int c_family_lang_mask;
     971             : extern unsigned int c_common_option_lang_mask (void);
     972             : extern void c_common_diagnostics_set_defaults (diagnostic_context *);
     973             : extern bool c_common_complain_wrong_lang_p (const struct cl_option *);
     974             : extern void c_common_init_options_struct (struct gcc_options *);
     975             : extern void c_common_init_options (unsigned int, struct cl_decoded_option *);
     976             : extern bool c_common_post_options (const char **);
     977             : extern bool c_common_init (void);
     978             : extern void c_common_finish (void);
     979             : extern void c_common_parse_file (void);
     980             : extern alias_set_type c_common_get_alias_set (tree);
     981             : extern void c_register_builtin_type (tree, const char*);
     982             : extern bool c_promoting_integer_type_p (const_tree);
     983             : extern bool self_promoting_args_p (const_tree);
     984             : extern tree strip_pointer_operator (tree);
     985             : extern tree strip_pointer_or_array_types (tree);
     986             : extern HOST_WIDE_INT c_common_to_target_charset (HOST_WIDE_INT);
     987             : 
     988             : /* This is the basic parsing function.  */
     989             : extern void c_parse_file (void);
     990             : 
     991             : extern void c_parse_final_cleanups (void);
     992             : 
     993             : /* These macros provide convenient access to the various _STMT nodes.  */
     994             : 
     995             : /* Nonzero if a given STATEMENT_LIST represents the outermost binding
     996             :    if a statement expression.  */
     997             : #define STATEMENT_LIST_STMT_EXPR(NODE) \
     998             :   TREE_LANG_FLAG_1 (STATEMENT_LIST_CHECK (NODE))
     999             : 
    1000             : /* Nonzero if a label has been added to the statement list.  */
    1001             : #define STATEMENT_LIST_HAS_LABEL(NODE) \
    1002             :   TREE_LANG_FLAG_3 (STATEMENT_LIST_CHECK (NODE))
    1003             : 
    1004             : /* C_MAYBE_CONST_EXPR accessors.  */
    1005             : #define C_MAYBE_CONST_EXPR_PRE(NODE)                    \
    1006             :   TREE_OPERAND (C_MAYBE_CONST_EXPR_CHECK (NODE), 0)
    1007             : #define C_MAYBE_CONST_EXPR_EXPR(NODE)                   \
    1008             :   TREE_OPERAND (C_MAYBE_CONST_EXPR_CHECK (NODE), 1)
    1009             : #define C_MAYBE_CONST_EXPR_INT_OPERANDS(NODE)           \
    1010             :   TREE_LANG_FLAG_0 (C_MAYBE_CONST_EXPR_CHECK (NODE))
    1011             : #define C_MAYBE_CONST_EXPR_NON_CONST(NODE)              \
    1012             :   TREE_LANG_FLAG_1 (C_MAYBE_CONST_EXPR_CHECK (NODE))
    1013             : #define EXPR_INT_CONST_OPERANDS(EXPR)                   \
    1014             :   (INTEGRAL_TYPE_P (TREE_TYPE (EXPR))                   \
    1015             :    && (TREE_CODE (EXPR) == INTEGER_CST                  \
    1016             :        || (TREE_CODE (EXPR) == C_MAYBE_CONST_EXPR       \
    1017             :            && C_MAYBE_CONST_EXPR_INT_OPERANDS (EXPR))))
    1018             : 
    1019             : /* In a FIELD_DECL, nonzero if the decl was originally a bitfield.  */
    1020             : #define DECL_C_BIT_FIELD(NODE) \
    1021             :   (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) == 1)
    1022             : #define SET_DECL_C_BIT_FIELD(NODE) \
    1023             :   (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 1)
    1024             : #define CLEAR_DECL_C_BIT_FIELD(NODE) \
    1025             :   (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 0)
    1026             : 
    1027             : /* True if the decl was an unnamed bitfield.  */
    1028             : #define DECL_UNNAMED_BIT_FIELD(NODE) \
    1029             :   (DECL_C_BIT_FIELD (NODE) && !DECL_NAME (NODE))
    1030             : 
    1031             : /* True iff TYPE is cv decltype(nullptr).  */
    1032             : #define NULLPTR_TYPE_P(TYPE) (TREE_CODE (TYPE) == NULLPTR_TYPE)
    1033             : 
    1034             : /* Returns the underlying type of the given enumeration type. The
    1035             :    underlying type is determined in different ways, depending on the
    1036             :    properties of the enum:
    1037             : 
    1038             :      - In C++0x or C2x, the underlying type can be explicitly specified, e.g.,
    1039             : 
    1040             :          enum E1 : char { ... } // underlying type is char
    1041             : 
    1042             :      - In a C++0x scoped enumeration, the underlying type is int
    1043             :        unless otherwises specified:
    1044             : 
    1045             :          enum class E2 { ... } // underlying type is int
    1046             : 
    1047             :      - Otherwise, the underlying type is determined based on the
    1048             :        values of the enumerators. In this case, the
    1049             :        ENUM_UNDERLYING_TYPE will not be set until after the definition
    1050             :        of the enumeration is completed by finish_enum.  */
    1051             : #define ENUM_UNDERLYING_TYPE(TYPE) \
    1052             :   TREE_TYPE (ENUMERAL_TYPE_CHECK (TYPE))
    1053             : 
    1054             : /* Determines whether an ENUMERAL_TYPE has an explicit
    1055             :    underlying type.  */
    1056             : #define ENUM_FIXED_UNDERLYING_TYPE_P(NODE) (TYPE_LANG_FLAG_5 (NODE))
    1057             : 
    1058             : extern tree do_case (location_t, tree, tree, tree);
    1059             : extern tree build_stmt (location_t, enum tree_code, ...);
    1060             : extern tree build_real_imag_expr (location_t, enum tree_code, tree);
    1061             : 
    1062             : /* These functions must be defined by each front-end which implements
    1063             :    a variant of the C language.  They are used in c-common.cc.  */
    1064             : 
    1065             : extern tree build_unary_op (location_t, enum tree_code, tree, bool);
    1066             : extern tree build_binary_op (location_t, enum tree_code, tree, tree, bool);
    1067             : extern tree perform_integral_promotions (tree);
    1068             : 
    1069             : /* These functions must be defined by each front-end which implements
    1070             :    a variant of the C language.  They are used by port files.  */
    1071             : 
    1072             : extern tree default_conversion (tree);
    1073             : 
    1074             : /* Given two integer or real types, return the type for their sum.
    1075             :    Given two compatible ANSI C types, returns the merged type.  */
    1076             : 
    1077             : extern tree common_type (tree, tree);
    1078             : 
    1079             : extern tree decl_constant_value (tree);
    1080             : 
    1081             : /* Handle increment and decrement of boolean types.  */
    1082             : extern tree boolean_increment (enum tree_code, tree);
    1083             : 
    1084             : extern int case_compare (splay_tree_key, splay_tree_key);
    1085             : 
    1086             : extern tree c_add_case_label (location_t, splay_tree, tree, tree, tree,
    1087             :                               tree = NULL_TREE);
    1088             : extern bool c_switch_covers_all_cases_p (splay_tree, tree);
    1089             : extern bool c_block_may_fallthru (const_tree);
    1090             : 
    1091             : extern tree build_function_call (location_t, tree, tree);
    1092             : 
    1093             : extern tree build_function_call_vec (location_t, vec<location_t>, tree,
    1094             :                                      vec<tree, va_gc> *, vec<tree, va_gc> *,
    1095             :                                      tree = NULL_TREE);
    1096             : 
    1097             : extern tree resolve_overloaded_builtin (location_t, tree, vec<tree, va_gc> *);
    1098             : 
    1099             : extern tree finish_label_address_expr (tree, location_t);
    1100             : 
    1101             : /* Same function prototype, but the C and C++ front ends have
    1102             :    different implementations.  Used in c-common.cc.  */
    1103             : extern tree lookup_label (tree);
    1104             : extern tree lookup_name (tree);
    1105             : extern bool lvalue_p (const_tree);
    1106             : extern int maybe_adjust_arg_pos_for_attribute (const_tree);
    1107             : extern bool instantiation_dependent_expression_p (tree);
    1108             : 
    1109             : extern bool vector_targets_convertible_p (const_tree t1, const_tree t2);
    1110             : extern bool vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note);
    1111             : extern tree c_build_vec_perm_expr (location_t, tree, tree, tree, bool = true);
    1112             : extern tree c_build_shufflevector (location_t, tree, tree,
    1113             :                                    const vec<tree> &, bool = true);
    1114             : extern tree c_build_vec_convert (location_t, tree, location_t, tree, bool = true);
    1115             : 
    1116             : extern void init_c_lex (void);
    1117             : 
    1118             : extern void c_cpp_builtins (cpp_reader *);
    1119             : extern void c_cpp_builtins_optimize_pragma (cpp_reader *, tree, tree);
    1120             : extern bool c_cpp_diagnostic (cpp_reader *, enum cpp_diagnostic_level,
    1121             :                               enum cpp_warning_reason, rich_location *,
    1122             :                               const char *, va_list *)
    1123             :      ATTRIBUTE_GCC_DIAG(5,0);
    1124             : extern int c_common_has_attribute (cpp_reader *, bool);
    1125             : extern int c_common_has_builtin (cpp_reader *);
    1126             : 
    1127             : extern bool parse_optimize_options (tree, bool);
    1128             : 
    1129             : /* Positive if an implicit `extern "C"' scope has just been entered;
    1130             :    negative if such a scope has just been exited.  */
    1131             : extern GTY(()) int pending_lang_change;
    1132             : 
    1133             : /* Information recorded about each file examined during compilation.  */
    1134             : 
    1135             : struct c_fileinfo
    1136             : {
    1137             :   int time;     /* Time spent in the file.  */
    1138             : 
    1139             :   /* Flags used only by C++.
    1140             :      INTERFACE_ONLY nonzero means that we are in an "interface" section
    1141             :      of the compiler.  INTERFACE_UNKNOWN nonzero means we cannot trust
    1142             :      the value of INTERFACE_ONLY.  If INTERFACE_UNKNOWN is zero and
    1143             :      INTERFACE_ONLY is zero, it means that we are responsible for
    1144             :      exporting definitions that others might need.  */
    1145             :   short interface_only;
    1146             :   short interface_unknown;
    1147             : };
    1148             : 
    1149             : struct c_fileinfo *get_fileinfo (const char *);
    1150             : extern void dump_time_statistics (void);
    1151             : 
    1152             : extern bool c_dump_tree (void *, tree);
    1153             : 
    1154             : extern void verify_sequence_points (tree);
    1155             : 
    1156             : extern tree fold_offsetof (tree, tree = size_type_node,
    1157             :                            tree_code ctx = ERROR_MARK);
    1158             : 
    1159             : extern int complete_array_type (tree *, tree, bool);
    1160             : extern void complete_flexible_array_elts (tree);
    1161             : 
    1162             : extern tree builtin_type_for_size (int, bool);
    1163             : 
    1164             : extern void c_common_mark_addressable_vec (tree);
    1165             : 
    1166             : extern void set_underlying_type (tree);
    1167             : extern bool user_facing_original_type_p (const_tree);
    1168             : extern void record_types_used_by_current_var_decl (tree);
    1169             : extern vec<tree, va_gc> *make_tree_vector (void);
    1170             : extern void release_tree_vector (vec<tree, va_gc> *);
    1171             : extern vec<tree, va_gc> *make_tree_vector_single (tree);
    1172             : extern vec<tree, va_gc> *make_tree_vector_from_list (tree);
    1173             : extern vec<tree, va_gc> *make_tree_vector_from_ctor (tree);
    1174             : extern vec<tree, va_gc> *make_tree_vector_copy (const vec<tree, va_gc> *);
    1175             : 
    1176             : /* Used for communication between c_common_type_for_mode and
    1177             :    c_register_builtin_type.  */
    1178             : extern GTY(()) tree registered_builtin_types;
    1179             : 
    1180             : /* Read SOURCE_DATE_EPOCH from environment to have a deterministic
    1181             :    timestamp to replace embedded current dates to get reproducible
    1182             :    results.  Returns -1 if SOURCE_DATE_EPOCH is not defined.  */
    1183             : extern time_t cb_get_source_date_epoch (cpp_reader *pfile);
    1184             : 
    1185             : /* The value (as a unix timestamp) corresponds to date
    1186             :    "Dec 31 9999 23:59:59 UTC", which is the latest date that __DATE__ and
    1187             :    __TIME__ can store.  */
    1188             : #define MAX_SOURCE_DATE_EPOCH HOST_WIDE_INT_C (253402300799)
    1189             : 
    1190             : /* Callback for libcpp for offering spelling suggestions for misspelled
    1191             :    directives.  */
    1192             : extern const char *cb_get_suggestion (cpp_reader *, const char *,
    1193             :                                       const char *const *);
    1194             : 
    1195             : extern GTY(()) string_concat_db *g_string_concat_db;
    1196             : 
    1197             : class substring_loc;
    1198             : extern const char *c_get_substring_location (const substring_loc &substr_loc,
    1199             :                                              location_t *out_loc);
    1200             : 
    1201             : /* In c-gimplify.cc.  */
    1202             : typedef struct bc_state
    1203             : {
    1204             :   tree bc_label[2];
    1205             : } bc_state_t;
    1206             : extern void save_bc_state (bc_state_t *);
    1207             : extern void restore_bc_state (bc_state_t *);
    1208             : extern tree c_genericize_control_stmt (tree *, int *, void *,
    1209             :                                        walk_tree_fn, walk_tree_lh);
    1210             : extern void c_genericize (tree);
    1211             : extern int c_gimplify_expr (tree *, gimple_seq *, gimple_seq *);
    1212             : extern tree c_build_bind_expr (location_t, tree, tree);
    1213             : 
    1214             : /* In c-lex.cc.  */
    1215             : extern enum cpp_ttype
    1216             : conflict_marker_get_final_tok_kind (enum cpp_ttype tok1_kind);
    1217             : 
    1218             : /* In c-pch.cc  */
    1219             : extern void pch_init (void);
    1220             : extern void pch_cpp_save_state (void);
    1221             : extern int c_common_valid_pch (cpp_reader *pfile, const char *name, int fd);
    1222             : extern void c_common_read_pch (cpp_reader *pfile, const char *name, int fd,
    1223             :                                const char *orig);
    1224             : extern void c_common_write_pch (void);
    1225             : extern void c_common_no_more_pch (void);
    1226             : extern void c_common_pch_pragma (cpp_reader *pfile, const char *);
    1227             : 
    1228             : /* In *-checksum.c */
    1229             : extern const unsigned char executable_checksum[16];
    1230             : 
    1231             : /* In c-cppbuiltin.cc  */
    1232             : extern void builtin_define_std (const char *macro);
    1233             : extern void builtin_define_with_value (const char *, const char *, int);
    1234             : extern void builtin_define_with_int_value (const char *, HOST_WIDE_INT);
    1235             : extern void builtin_define_type_sizeof (const char *, tree);
    1236             : extern void c_stddef_cpp_builtins (void);
    1237             : extern void fe_file_change (const line_map_ordinary *);
    1238             : extern void c_parse_error (const char *, enum cpp_ttype, tree, unsigned char,
    1239             :                            rich_location *richloc);
    1240             : 
    1241             : /* In c-ppoutput.cc  */
    1242             : extern void init_pp_output (FILE *);
    1243             : extern void preprocess_file (cpp_reader *);
    1244             : extern void pp_file_change (const line_map_ordinary *);
    1245             : extern void pp_dir_change (cpp_reader *, const char *);
    1246             : extern bool check_missing_format_attribute (tree, tree);
    1247             : extern void c_pp_stream_token (cpp_reader *, const cpp_token *, location_t loc);
    1248             : 
    1249             : /* In c-omp.cc  */
    1250             : typedef wide_int_bitmask omp_clause_mask;
    1251             : 
    1252             : #define OMP_CLAUSE_MASK_1 omp_clause_mask (1)
    1253             : 
    1254             : enum c_omp_clause_split
    1255             : {
    1256             :   C_OMP_CLAUSE_SPLIT_TARGET = 0,
    1257             :   C_OMP_CLAUSE_SPLIT_TEAMS,
    1258             :   C_OMP_CLAUSE_SPLIT_DISTRIBUTE,
    1259             :   C_OMP_CLAUSE_SPLIT_PARALLEL,
    1260             :   C_OMP_CLAUSE_SPLIT_FOR,
    1261             :   C_OMP_CLAUSE_SPLIT_SIMD,
    1262             :   C_OMP_CLAUSE_SPLIT_COUNT,
    1263             :   C_OMP_CLAUSE_SPLIT_SECTIONS = C_OMP_CLAUSE_SPLIT_FOR,
    1264             :   C_OMP_CLAUSE_SPLIT_TASKLOOP = C_OMP_CLAUSE_SPLIT_FOR,
    1265             :   C_OMP_CLAUSE_SPLIT_LOOP = C_OMP_CLAUSE_SPLIT_FOR,
    1266             :   C_OMP_CLAUSE_SPLIT_MASKED = C_OMP_CLAUSE_SPLIT_DISTRIBUTE
    1267             : };
    1268             : 
    1269             : enum c_omp_region_type
    1270             : {
    1271             :   C_ORT_OMP                     = 1 << 0,
    1272             :   C_ORT_ACC                     = 1 << 1,
    1273             :   C_ORT_DECLARE_SIMD            = 1 << 2,
    1274             :   C_ORT_TARGET                  = 1 << 3,
    1275             :   C_ORT_OMP_DECLARE_SIMD        = C_ORT_OMP | C_ORT_DECLARE_SIMD,
    1276             :   C_ORT_OMP_TARGET              = C_ORT_OMP | C_ORT_TARGET
    1277             : };
    1278             : 
    1279             : extern tree c_finish_omp_master (location_t, tree);
    1280             : extern tree c_finish_omp_masked (location_t, tree, tree);
    1281             : extern tree c_finish_omp_taskgroup (location_t, tree, tree);
    1282             : extern tree c_finish_omp_critical (location_t, tree, tree, tree);
    1283             : extern tree c_finish_omp_ordered (location_t, tree, tree);
    1284             : extern void c_finish_omp_barrier (location_t);
    1285             : extern tree c_finish_omp_atomic (location_t, enum tree_code, enum tree_code,
    1286             :                                  tree, tree, tree, tree, tree, tree, bool,
    1287             :                                  enum omp_memory_order, bool, bool = false);
    1288             : extern bool c_omp_depend_t_p (tree);
    1289             : extern void c_finish_omp_depobj (location_t, tree, enum omp_clause_depend_kind,
    1290             :                                  tree);
    1291             : extern void c_finish_omp_flush (location_t, int);
    1292             : extern void c_finish_omp_taskwait (location_t);
    1293             : extern void c_finish_omp_taskyield (location_t);
    1294             : extern tree c_finish_omp_for (location_t, enum tree_code, tree, tree, tree,
    1295             :                               tree, tree, tree, tree, bool);
    1296             : extern bool c_omp_check_loop_iv (tree, tree, walk_tree_lh);
    1297             : extern bool c_omp_check_loop_iv_exprs (location_t, enum tree_code, tree, int,
    1298             :                                        tree, tree, tree, walk_tree_lh);
    1299             : extern tree c_finish_oacc_wait (location_t, tree, tree);
    1300             : extern tree c_oacc_split_loop_clauses (tree, tree *, bool);
    1301             : extern void c_omp_split_clauses (location_t, enum tree_code, omp_clause_mask,
    1302             :                                  tree, tree *);
    1303             : extern tree c_omp_declare_simd_clauses_to_numbers (tree, tree);
    1304             : extern void c_omp_declare_simd_clauses_to_decls (tree, tree);
    1305             : extern bool c_omp_predefined_variable (tree);
    1306             : extern enum omp_clause_default_kind c_omp_predetermined_sharing (tree);
    1307             : extern enum omp_clause_defaultmap_kind c_omp_predetermined_mapping (tree);
    1308             : extern tree c_omp_check_context_selector (location_t, tree);
    1309             : extern void c_omp_mark_declare_variant (location_t, tree, tree);
    1310             : extern void c_omp_adjust_map_clauses (tree, bool);
    1311             : 
    1312             : enum c_omp_directive_kind {
    1313             :   C_OMP_DIR_STANDALONE,
    1314             :   C_OMP_DIR_CONSTRUCT,
    1315             :   C_OMP_DIR_DECLARATIVE,
    1316             :   C_OMP_DIR_UTILITY,
    1317             :   C_OMP_DIR_INFORMATIONAL
    1318             : };
    1319             : 
    1320             : struct c_omp_directive {
    1321             :   const char *first, *second, *third;
    1322             :   unsigned int id;
    1323             :   enum c_omp_directive_kind kind;
    1324             :   bool simd;
    1325             : };
    1326             : 
    1327             : extern const struct c_omp_directive c_omp_directives[];
    1328             : extern const struct c_omp_directive *c_omp_categorize_directive (const char *,
    1329             :                                                                  const char *,
    1330             :                                                                  const char *);
    1331             : 
    1332             : /* Return next tree in the chain for chain_next walking of tree nodes.  */
    1333             : inline tree
    1334 44032341562 : c_tree_chain_next (tree t)
    1335             : {
    1336             :   /* TREE_CHAIN of a type is TYPE_STUB_DECL, which is different
    1337             :      kind of object, never a long chain of nodes.  Prefer
    1338             :      TYPE_NEXT_VARIANT for types.  */
    1339 44032341562 :   if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPE_COMMON))
    1340  5743376884 :     return TYPE_NEXT_VARIANT (t);
    1341             :   /* Otherwise, if there is TREE_CHAIN, return it.  */
    1342 38288964678 :   if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_COMMON))
    1343 24663249418 :     return TREE_CHAIN (t);
    1344             :   return NULL;
    1345             : }
    1346             : 
    1347             : /* Mask used by tm_stmt_attr.  */
    1348             : #define TM_STMT_ATTR_OUTER      2
    1349             : #define TM_STMT_ATTR_ATOMIC     4
    1350             : #define TM_STMT_ATTR_RELAXED    8
    1351             : 
    1352             : /* Mask used by tm_attr_to_mask and tm_mask_to_attr.  Note that these
    1353             :    are ordered specifically such that more restrictive attributes are
    1354             :    at lower bit positions.  This fact is known by the C++ tm attribute
    1355             :    inheritance code such that least bit extraction (mask & -mask) results
    1356             :    in the most restrictive attribute.  */
    1357             : #define TM_ATTR_SAFE                    1
    1358             : #define TM_ATTR_CALLABLE                2
    1359             : #define TM_ATTR_PURE                    4
    1360             : #define TM_ATTR_IRREVOCABLE             8
    1361             : #define TM_ATTR_MAY_CANCEL_OUTER        16
    1362             : 
    1363             : /* A suffix-identifier value doublet that represents user-defined literals
    1364             :    for C++-0x.  */
    1365             : enum overflow_type {
    1366             :   OT_UNDERFLOW = -1,
    1367             :   OT_NONE,
    1368             :   OT_OVERFLOW
    1369             : };
    1370             : 
    1371             : struct GTY(()) tree_userdef_literal {
    1372             :   struct tree_base base;
    1373             :   tree suffix_id;
    1374             :   tree value;
    1375             :   tree num_string;
    1376             :   enum overflow_type overflow;
    1377             : };
    1378             : 
    1379             : #define USERDEF_LITERAL_SUFFIX_ID(NODE) \
    1380             :   (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->suffix_id)
    1381             : 
    1382             : #define USERDEF_LITERAL_VALUE(NODE) \
    1383             :   (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->value)
    1384             : 
    1385             : #define USERDEF_LITERAL_OVERFLOW(NODE) \
    1386             :   (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->overflow)
    1387             : 
    1388             : #define USERDEF_LITERAL_NUM_STRING(NODE) \
    1389             :   (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->num_string)
    1390             : 
    1391             : #define USERDEF_LITERAL_TYPE(NODE) \
    1392             :   (TREE_TYPE (USERDEF_LITERAL_VALUE (NODE)))
    1393             : 
    1394             : extern tree build_userdef_literal (tree suffix_id, tree value,
    1395             :                                    enum overflow_type overflow,
    1396             :                                    tree num_string);
    1397             : 
    1398             : 
    1399             : /* WHILE_STMT accessors. These give access to the condition of the
    1400             :    while statement and the body of the while statement, respectively.  */
    1401             : #define WHILE_COND(NODE)        TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0)
    1402             : #define WHILE_BODY(NODE)        TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1)
    1403             : 
    1404             : /* DO_STMT accessors. These give access to the condition of the do
    1405             :    statement and the body of the do statement, respectively.  */
    1406             : #define DO_COND(NODE)           TREE_OPERAND (DO_STMT_CHECK (NODE), 0)
    1407             : #define DO_BODY(NODE)           TREE_OPERAND (DO_STMT_CHECK (NODE), 1)
    1408             : 
    1409             : /* FOR_STMT accessors. These give access to the init statement,
    1410             :    condition, update expression, and body of the for statement,
    1411             :    respectively.  */
    1412             : #define FOR_INIT_STMT(NODE)     TREE_OPERAND (FOR_STMT_CHECK (NODE), 0)
    1413             : #define FOR_COND(NODE)          TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
    1414             : #define FOR_EXPR(NODE)          TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
    1415             : #define FOR_BODY(NODE)          TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
    1416             : #define FOR_SCOPE(NODE)         TREE_OPERAND (FOR_STMT_CHECK (NODE), 4)
    1417             : 
    1418             : #define SWITCH_STMT_COND(NODE)  TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
    1419             : #define SWITCH_STMT_BODY(NODE)  TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
    1420             : #define SWITCH_STMT_TYPE(NODE)  TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2)
    1421             : #define SWITCH_STMT_SCOPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 3)
    1422             : /* True if there are case labels for all possible values of switch cond, either
    1423             :    because there is a default: case label or because the case label ranges cover
    1424             :    all values.  */
    1425             : #define SWITCH_STMT_ALL_CASES_P(NODE) \
    1426             :   TREE_LANG_FLAG_0 (SWITCH_STMT_CHECK (NODE))
    1427             : /* True if the body of a switch stmt contains no BREAK_STMTs.  */
    1428             : #define SWITCH_STMT_NO_BREAK_P(NODE) \
    1429             :   TREE_LANG_FLAG_2 (SWITCH_STMT_CHECK (NODE))
    1430             : 
    1431             : 
    1432             : /* Nonzero if NODE is the target for genericization of 'break' stmts.  */
    1433             : #define LABEL_DECL_BREAK(NODE) \
    1434             :   DECL_LANG_FLAG_0 (LABEL_DECL_CHECK (NODE))
    1435             : 
    1436             : /* Nonzero if NODE is the target for genericization of 'continue' stmts.  */
    1437             : #define LABEL_DECL_CONTINUE(NODE) \
    1438             :   DECL_LANG_FLAG_1 (LABEL_DECL_CHECK (NODE))
    1439             : 
    1440             : extern bool convert_vector_to_array_for_subscript (location_t, tree *, tree);
    1441             : 
    1442             : /* Possibe cases of scalar_to_vector conversion.  */
    1443             : enum stv_conv {
    1444             :   stv_error,        /* Error occurred.  */
    1445             :   stv_nothing,      /* Nothing happened.  */
    1446             :   stv_firstarg,     /* First argument must be expanded.  */
    1447             :   stv_secondarg     /* Second argument must be expanded.  */
    1448             : };
    1449             : 
    1450             : extern enum stv_conv scalar_to_vector (location_t loc, enum tree_code code,
    1451             :                                        tree op0, tree op1, bool);
    1452             : 
    1453             : extern tree find_inv_trees (tree *, int *, void *);
    1454             : extern tree replace_inv_trees (tree *, int *, void *);
    1455             : 
    1456             : extern bool reject_gcc_builtin (const_tree, location_t = UNKNOWN_LOCATION);
    1457             : extern bool valid_array_size_p (location_t, const_tree, tree, bool = true);
    1458             : extern void invalid_array_size_error (location_t, cst_size_error,
    1459             :                                       const_tree, const_tree);
    1460             : 
    1461             : /* In c-warn.cc.  */
    1462             : extern void constant_expression_warning (tree);
    1463             : extern void constant_expression_error (tree);
    1464             : extern void overflow_warning (location_t, tree, tree = NULL_TREE);
    1465             : extern void warn_logical_operator (location_t, enum tree_code, tree,
    1466             :                                    enum tree_code, tree, enum tree_code, tree);
    1467             : extern void warn_tautological_cmp (const op_location_t &, enum tree_code,
    1468             :                                    tree, tree);
    1469             : extern void warn_logical_not_parentheses (location_t, enum tree_code, tree,
    1470             :                                           tree);
    1471             : extern bool warn_if_unused_value (const_tree, location_t, bool = false);
    1472             : extern bool strict_aliasing_warning (location_t, tree, tree);
    1473             : extern void sizeof_pointer_memaccess_warning (location_t *, tree,
    1474             :                                               vec<tree, va_gc> *, tree *,
    1475             :                                               bool (*) (tree, tree));
    1476             : extern void check_main_parameter_types (tree decl);
    1477             : extern void warnings_for_convert_and_check (location_t, tree, tree, tree);
    1478             : extern void c_do_switch_warnings (splay_tree, location_t, tree, tree, bool);
    1479             : extern void warn_for_omitted_condop (location_t, tree);
    1480             : extern bool warn_for_restrict (unsigned, tree *, unsigned);
    1481             : extern void warn_for_address_or_pointer_of_packed_member (tree, tree);
    1482             : extern void warn_parm_array_mismatch (location_t, tree, tree);
    1483             : extern void maybe_warn_sizeof_array_div (location_t, tree, tree, tree, tree);
    1484             : extern void do_warn_array_compare (location_t, tree_code, tree, tree);
    1485             : 
    1486             : /* Places where an lvalue, or modifiable lvalue, may be required.
    1487             :    Used to select diagnostic messages in lvalue_error and
    1488             :    readonly_error.  */
    1489             : enum lvalue_use {
    1490             :   lv_assign,
    1491             :   lv_increment,
    1492             :   lv_decrement,
    1493             :   lv_addressof,
    1494             :   lv_asm
    1495             : };
    1496             : 
    1497             : extern void lvalue_error (location_t, enum lvalue_use);
    1498             : extern void invalid_indirection_error (location_t, tree, ref_operator);
    1499             : extern void readonly_error (location_t, tree, enum lvalue_use);
    1500             : extern void warn_array_subscript_with_type_char (location_t, tree);
    1501             : extern void warn_about_parentheses (location_t,
    1502             :                                     enum tree_code,
    1503             :                                     enum tree_code, tree,
    1504             :                                     enum tree_code, tree);
    1505             : extern void warn_for_unused_label (tree label);
    1506             : extern void warn_for_div_by_zero (location_t, tree divisor);
    1507             : extern void warn_for_memset (location_t, tree, tree, int);
    1508             : extern void warn_for_sign_compare (location_t,
    1509             :                                    tree orig_op0, tree orig_op1,
    1510             :                                    tree op0, tree op1,
    1511             :                                    tree result_type,
    1512             :                                    enum tree_code resultcode);
    1513             : extern void do_warn_double_promotion (tree, tree, tree, const char *,
    1514             :                                       location_t);
    1515             : extern void do_warn_unused_parameter (tree);
    1516             : extern void record_locally_defined_typedef (tree);
    1517             : extern void maybe_record_typedef_use (tree);
    1518             : extern void maybe_warn_unused_local_typedefs (void);
    1519             : extern void maybe_warn_bool_compare (location_t, enum tree_code, tree, tree);
    1520             : extern bool maybe_warn_shift_overflow (location_t, tree, tree);
    1521             : extern void warn_duplicated_cond_add_or_warn (location_t, tree, vec<tree> **);
    1522             : extern bool diagnose_mismatched_attributes (tree, tree);
    1523             : extern tree do_warn_duplicated_branches_r (tree *, int *, void *);
    1524             : extern void warn_for_multistatement_macros (location_t, location_t,
    1525             :                                             location_t, enum rid);
    1526             : 
    1527             : extern void check_for_xor_used_as_pow (location_t lhs_loc, tree lhs_val,
    1528             :                                        location_t operator_loc,
    1529             :                                        location_t rhs_loc, tree rhs_val);
    1530             : 
    1531             : /* In c-attribs.cc.  */
    1532             : extern bool attribute_takes_identifier_p (const_tree);
    1533             : extern tree handle_deprecated_attribute (tree *, tree, tree, int, bool *);
    1534             : extern tree handle_unused_attribute (tree *, tree, tree, int, bool *);
    1535             : extern tree handle_fallthrough_attribute (tree *, tree, tree, int, bool *);
    1536             : extern int parse_tm_stmt_attr (tree, int);
    1537             : extern int tm_attr_to_mask (tree);
    1538             : extern tree tm_mask_to_attr (int);
    1539             : extern tree find_tm_attribute (tree);
    1540             : extern const struct attribute_spec::exclusions attr_cold_hot_exclusions[];
    1541             : extern const struct attribute_spec::exclusions attr_noreturn_exclusions[];
    1542             : extern tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
    1543             : extern bool has_attribute (location_t, tree, tree, tree (*)(tree));
    1544             : extern tree build_attr_access_from_parms (tree, bool);
    1545             : 
    1546             : /* In c-format.cc.  */
    1547             : extern bool valid_format_string_type_p (tree);
    1548             : 
    1549             : /* A bitmap of flags to positional_argument.  */
    1550             : enum posargflags {
    1551             :   /* Consider positional attribute argument value zero valid.  */
    1552             :   POSARG_ZERO = 1,
    1553             :   /* Consider positional attribute argument value valid if it refers
    1554             :      to the ellipsis (i.e., beyond the last typed argument).  */
    1555             :   POSARG_ELLIPSIS = 2
    1556             : };
    1557             : 
    1558             : extern tree positional_argument (const_tree, const_tree, tree &, tree_code,
    1559             :                                  int = 0, int = posargflags ());
    1560             : 
    1561             : extern enum flt_eval_method
    1562             : excess_precision_mode_join (enum flt_eval_method, enum flt_eval_method);
    1563             : 
    1564             : extern int c_flt_eval_method (bool ts18661_p);
    1565             : extern void add_no_sanitize_value (tree node, unsigned int flags);
    1566             : 
    1567             : extern void maybe_add_include_fixit (rich_location *, const char *, bool);
    1568             : extern void maybe_suggest_missing_token_insertion (rich_location *richloc,
    1569             :                                                    enum cpp_ttype token_type,
    1570             :                                                    location_t prev_token_loc);
    1571             : extern tree braced_lists_to_strings (tree, tree);
    1572             : 
    1573             : #if CHECKING_P
    1574             : namespace selftest {
    1575             :   /* Declarations for specific families of tests within c-family,
    1576             :      by source file, in alphabetical order.  */
    1577             :   extern void c_diagnostic_cc_tests (void);
    1578             :   extern void c_format_cc_tests (void);
    1579             :   extern void c_indentation_cc_tests (void);
    1580             :   extern void c_opt_problem_cc_tests (void);
    1581             :   extern void c_pretty_print_cc_tests (void);
    1582             :   extern void c_spellcheck_cc_tests (void);
    1583             : 
    1584             :   /* The entrypoint for running all of the above tests.  */
    1585             :   extern void c_family_tests (void);
    1586             : } // namespace selftest
    1587             : #endif /* #if CHECKING_P */
    1588             : 
    1589             : #endif /* ! GCC_C_COMMON_H */

Generated by: LCOV version 1.16