/* Definitions for c-common.c. Copyright (C) 1987-2018 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ #ifndef GCC_C_COMMON_H #define GCC_C_COMMON_H #include "splay-tree.h" #include "cpplib.h" #include "alias.h" #include "tree.h" #include "fold-const.h" #include "wide-int-bitmask.h" /* In order for the format checking to accept the C frontend diagnostic framework extensions, you must include this file before diagnostic-core.h, not after. The C front end formats are a subset of those for C++, so they are the appropriate set to use in common code; cp-tree.h overrides this for C++. */ #if defined(GCC_DIAGNOSTIC_CORE_H) #error \ In order for the format checking to accept the C front end diagnostic \ framework extensions, you must include this file before diagnostic-core.h \ never after. #endif #ifndef GCC_DIAG_STYLE #define GCC_DIAG_STYLE __gcc_cdiag__ #endif #include "diagnostic-core.h" /* Usage of TREE_LANG_FLAG_?: 0: IDENTIFIER_MARKED (used by search routines). C_MAYBE_CONST_EXPR_INT_OPERANDS (in C_MAYBE_CONST_EXPR, for C) 1: C_DECLARED_LABEL_FLAG (in LABEL_DECL) STATEMENT_LIST_STMT_EXPR (in STATEMENT_LIST) C_MAYBE_CONST_EXPR_NON_CONST (in C_MAYBE_CONST_EXPR, for C) 2: unused 3: STATEMENT_LIST_HAS_LABEL (in STATEMENT_LIST) 4: unused */ /* Reserved identifiers. This is the union of all the keywords for C, C++, and Objective-C. All the type modifiers have to be in one block at the beginning, because they are used as mask bits. There are 28 type modifiers; if we add many more we will have to redesign the mask mechanism. */ enum rid { /* Modifiers: */ /* C, in empirical order of frequency. */ RID_STATIC = 0, RID_UNSIGNED, RID_LONG, RID_CONST, RID_EXTERN, RID_REGISTER, RID_TYPEDEF, RID_SHORT, RID_INLINE, RID_VOLATILE, RID_SIGNED, RID_AUTO, RID_RESTRICT, RID_NORETURN, RID_ATOMIC, /* C extensions */ RID_COMPLEX, RID_THREAD, RID_SAT, /* C++ */ RID_FRIEND, RID_VIRTUAL, RID_EXPLICIT, RID_EXPORT, RID_MUTABLE, /* ObjC ("PQ" reserved words - they do not appear after a '@' and are keywords only in specific contexts) */ RID_IN, RID_OUT, RID_INOUT, RID_BYCOPY, RID_BYREF, RID_ONEWAY, /* ObjC ("PATTR" reserved words - they do not appear after a '@' and are keywords only as property attributes) */ RID_GETTER, RID_SETTER, RID_READONLY, RID_READWRITE, RID_ASSIGN, RID_RETAIN, RID_COPY, RID_NONATOMIC, /* C (reserved and imaginary types not implemented, so any use is a syntax error) */ RID_IMAGINARY, /* C */ RID_INT, RID_CHAR, RID_FLOAT, RID_DOUBLE, RID_VOID, RID_ENUM, RID_STRUCT, RID_UNION, RID_IF, RID_ELSE, RID_WHILE, RID_DO, RID_FOR, RID_SWITCH, RID_CASE, RID_DEFAULT, RID_BREAK, RID_CONTINUE, RID_RETURN, RID_GOTO, RID_SIZEOF, /* C extensions */ RID_ASM, RID_TYPEOF, RID_ALIGNOF, RID_ATTRIBUTE, RID_VA_ARG, RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL, RID_CHOOSE_EXPR, RID_TYPES_COMPATIBLE_P, RID_BUILTIN_COMPLEX, RID_BUILTIN_SHUFFLE, RID_BUILTIN_TGMATH, RID_DFLOAT32, RID_DFLOAT64, RID_DFLOAT128, /* TS 18661-3 keywords, in the same sequence as the TI_* values. */ RID_FLOAT16, RID_FLOATN_NX_FIRST = RID_FLOAT16, RID_FLOAT32, RID_FLOAT64, RID_FLOAT128, RID_FLOAT32X, RID_FLOAT64X, RID_FLOAT128X, #define CASE_RID_FLOATN_NX \ case RID_FLOAT16: case RID_FLOAT32: case RID_FLOAT64: case RID_FLOAT128: \ case RID_FLOAT32X: case RID_FLOAT64X: case RID_FLOAT128X RID_FRACT, RID_ACCUM, RID_AUTO_TYPE, RID_BUILTIN_CALL_WITH_STATIC_CHAIN, /* "__GIMPLE", for the GIMPLE-parsing extension to the C frontend. */ RID_GIMPLE, /* "__PHI", for parsing PHI function in GIMPLE FE. */ RID_PHI, /* "__RTL", for the RTL-parsing extension to the C frontend. */ RID_RTL, /* C11 */ RID_ALIGNAS, RID_GENERIC, /* This means to warn that this is a C++ keyword, and then treat it as a normal identifier. */ RID_CXX_COMPAT_WARN, /* GNU transactional memory extension */ RID_TRANSACTION_ATOMIC, RID_TRANSACTION_RELAXED, RID_TRANSACTION_CANCEL, /* Too many ways of getting the name of a function as a string */ RID_FUNCTION_NAME, RID_PRETTY_FUNCTION_NAME, RID_C99_FUNCTION_NAME, /* C++ (some of these are keywords in Objective-C as well, but only if they appear after a '@') */ RID_BOOL, RID_WCHAR, RID_CLASS, RID_PUBLIC, RID_PRIVATE, RID_PROTECTED, RID_TEMPLATE, RID_NULL, RID_CATCH, RID_DELETE, RID_FALSE, RID_NAMESPACE, RID_NEW, RID_OFFSETOF, RID_OPERATOR, RID_THIS, RID_THROW, RID_TRUE, RID_TRY, RID_TYPENAME, RID_TYPEID, RID_USING, RID_CHAR16, RID_CHAR32, /* casts */ RID_CONSTCAST, RID_DYNCAST, RID_REINTCAST, RID_STATCAST, /* C++ extensions */ RID_ADDRESSOF, RID_BASES, RID_BUILTIN_LAUNDER, RID_DIRECT_BASES, RID_HAS_NOTHROW_ASSIGN, RID_HAS_NOTHROW_CONSTRUCTOR, RID_HAS_NOTHROW_COPY, RID_HAS_TRIVIAL_ASSIGN, RID_HAS_TRIVIAL_CONSTRUCTOR, RID_HAS_TRIVIAL_COPY, RID_HAS_TRIVIAL_DESTRUCTOR, RID_HAS_UNIQUE_OBJ_REPRESENTATIONS, RID_HAS_VIRTUAL_DESTRUCTOR, RID_IS_ABSTRACT, RID_IS_AGGREGATE, RID_IS_BASE_OF, RID_IS_CLASS, RID_IS_EMPTY, RID_IS_ENUM, RID_IS_FINAL, RID_IS_LITERAL_TYPE, RID_IS_POD, RID_IS_POLYMORPHIC, RID_IS_SAME_AS, RID_IS_STD_LAYOUT, RID_IS_TRIVIAL, RID_IS_TRIVIALLY_ASSIGNABLE, RID_IS_TRIVIALLY_CONSTRUCTIBLE, RID_IS_TRIVIALLY_COPYABLE, RID_IS_UNION, RID_UNDERLYING_TYPE, RID_IS_ASSIGNABLE, RID_IS_CONSTRUCTIBLE, /* C++11 */ RID_CONSTEXPR, RID_DECLTYPE, RID_NOEXCEPT, RID_NULLPTR, RID_STATIC_ASSERT, /* C++ concepts */ RID_CONCEPT, RID_REQUIRES, /* C++ transactional memory. */ RID_ATOMIC_NOEXCEPT, RID_ATOMIC_CANCEL, RID_SYNCHRONIZED, /* Objective-C ("AT" reserved words - they are only keywords when they follow '@') */ RID_AT_ENCODE, RID_AT_END, RID_AT_CLASS, RID_AT_ALIAS, RID_AT_DEFS, RID_AT_PRIVATE, RID_AT_PROTECTED, RID_AT_PUBLIC, RID_AT_PACKAGE, RID_AT_PROTOCOL, RID_AT_SELECTOR, RID_AT_THROW, RID_AT_TRY, RID_AT_CATCH, RID_AT_FINALLY, RID_AT_SYNCHRONIZED, RID_AT_OPTIONAL, RID_AT_REQUIRED, RID_AT_PROPERTY, RID_AT_SYNTHESIZE, RID_AT_DYNAMIC, RID_AT_INTERFACE, RID_AT_IMPLEMENTATION, /* Named address support, mapping the keyword to a particular named address number. Named address space 0 is reserved for the generic address. If there are more than 254 named addresses, the addr_space_t type will need to be grown from an unsigned char to unsigned short. */ RID_ADDR_SPACE_0, /* generic address */ RID_ADDR_SPACE_1, RID_ADDR_SPACE_2, RID_ADDR_SPACE_3, RID_ADDR_SPACE_4, RID_ADDR_SPACE_5, RID_ADDR_SPACE_6, RID_ADDR_SPACE_7, RID_ADDR_SPACE_8, RID_ADDR_SPACE_9, RID_ADDR_SPACE_10, RID_ADDR_SPACE_11, RID_ADDR_SPACE_12, RID_ADDR_SPACE_13, RID_ADDR_SPACE_14, RID_ADDR_SPACE_15, RID_FIRST_ADDR_SPACE = RID_ADDR_SPACE_0, RID_LAST_ADDR_SPACE = RID_ADDR_SPACE_15, /* __intN keywords. The _N_M here doesn't correspond to the intN in the keyword; use the bitsize in int_n_t_data_t[M] for that. For example, if int_n_t_data_t[0].bitsize is 13, then RID_INT_N_0 is for __int13. */ /* Note that the range to use is RID_FIRST_INT_N through RID_FIRST_INT_N + NUM_INT_N_ENTS - 1 and c-parser.c has a list of all RID_INT_N_* in a case statement. */ RID_INT_N_0, RID_INT_N_1, RID_INT_N_2, RID_INT_N_3, RID_FIRST_INT_N = RID_INT_N_0, RID_LAST_INT_N = RID_INT_N_3, RID_MAX, RID_FIRST_MODIFIER = RID_STATIC, RID_LAST_MODIFIER = RID_ONEWAY, RID_FIRST_CXX11 = RID_CONSTEXPR, RID_LAST_CXX11 = RID_STATIC_ASSERT, RID_FIRST_AT = RID_AT_ENCODE, RID_LAST_AT = RID_AT_IMPLEMENTATION, RID_FIRST_PQ = RID_IN, RID_LAST_PQ = RID_ONEWAY, RID_FIRST_PATTR = RID_GETTER, RID_LAST_PATTR = RID_NONATOMIC }; #define OBJC_IS_AT_KEYWORD(rid) \ ((unsigned int) (rid) >= (unsigned int) RID_FIRST_AT && \ (unsigned int) (rid) <= (unsigned int) RID_LAST_AT) #define OBJC_IS_PQ_KEYWORD(rid) \ ((unsigned int) (rid) >= (unsigned int) RID_FIRST_PQ && \ (unsigned int) (rid) <= (unsigned int) RID_LAST_PQ) #define OBJC_IS_PATTR_KEYWORD(rid) \ ((unsigned int) (rid) >= (unsigned int) RID_FIRST_PATTR && \ (unsigned int) (rid) <= (unsigned int) RID_LAST_PATTR) /* OBJC_IS_CXX_KEYWORD recognizes the 'CXX_OBJC' keywords (such as 'class') which are shared in a subtle way between Objective-C and C++. When the lexer is lexing in Objective-C/Objective-C++, if it finds '@' followed by one of these identifiers (eg, '@class'), it recognizes the whole as an Objective-C keyword. If the identifier is found elsewhere, it follows the rules of the C/C++ language. */ #define OBJC_IS_CXX_KEYWORD(rid) \ (rid == RID_CLASS || rid == RID_SYNCHRONIZED \ || rid == RID_PUBLIC || rid == RID_PROTECTED || rid == RID_PRIVATE \ || rid == RID_TRY || rid == RID_THROW || rid == RID_CATCH) /* The elements of `ridpointers' are identifier nodes for the reserved type names and storage classes. It is indexed by a RID_... value. */ extern GTY ((length ("(int) RID_MAX"))) tree *ridpointers; /* Standard named or nameless data types of the C compiler. */ enum c_tree_index { CTI_CHAR16_TYPE, CTI_CHAR32_TYPE, CTI_WCHAR_TYPE, CTI_UNDERLYING_WCHAR_TYPE, CTI_WINT_TYPE, CTI_SIGNED_SIZE_TYPE, /* For format checking only. */ CTI_UNSIGNED_PTRDIFF_TYPE, /* For format checking only. */ CTI_INTMAX_TYPE, CTI_UINTMAX_TYPE, CTI_WIDEST_INT_LIT_TYPE, CTI_WIDEST_UINT_LIT_TYPE, /* Types for , that may not be defined on all targets. */ CTI_SIG_ATOMIC_TYPE, CTI_INT8_TYPE, CTI_INT16_TYPE, CTI_INT32_TYPE, CTI_INT64_TYPE, CTI_UINT8_TYPE, CTI_UINT16_TYPE, CTI_UINT32_TYPE, CTI_UINT64_TYPE, CTI_INT_LEAST8_TYPE, CTI_INT_LEAST16_TYPE, CTI_INT_LEAST32_TYPE, CTI_INT_LEAST64_TYPE, CTI_UINT_LEAST8_TYPE, CTI_UINT_LEAST16_TYPE, CTI_UINT_LEAST32_TYPE, CTI_UINT_LEAST64_TYPE, CTI_INT_FAST8_TYPE, CTI_INT_FAST16_TYPE, CTI_INT_FAST32_TYPE, CTI_INT_FAST64_TYPE, CTI_UINT_FAST8_TYPE, CTI_UINT_FAST16_TYPE, CTI_UINT_FAST32_TYPE, CTI_UINT_FAST64_TYPE, CTI_INTPTR_TYPE, CTI_UINTPTR_TYPE, CTI_CHAR_ARRAY_TYPE, CTI_CHAR16_ARRAY_TYPE, CTI_CHAR32_ARRAY_TYPE, CTI_WCHAR_ARRAY_TYPE, CTI_STRING_TYPE, CTI_CONST_STRING_TYPE, /* Type for boolean expressions (bool in C++, int in C). */ CTI_TRUTHVALUE_TYPE, CTI_TRUTHVALUE_TRUE, CTI_TRUTHVALUE_FALSE, CTI_DEFAULT_FUNCTION_TYPE, /* These are not types, but we have to look them up all the time. */ CTI_FUNCTION_NAME_DECL, CTI_PRETTY_FUNCTION_NAME_DECL, CTI_C99_FUNCTION_NAME_DECL, CTI_SAVED_FUNCTION_NAME_DECLS, CTI_NULL, CTI_MAX }; #define C_CPP_HASHNODE(id) \ (&(((struct c_common_identifier *) (id))->node)) #define C_RID_CODE(id) \ ((enum rid) (((struct c_common_identifier *) (id))->node.rid_code)) #define C_SET_RID_CODE(id, code) \ (((struct c_common_identifier *) (id))->node.rid_code = (unsigned char) code) /* Identifier part common to the C front ends. Inherits from tree_identifier, despite appearances. */ struct GTY(()) c_common_identifier { struct tree_common common; struct cpp_hashnode node; }; /* An entry in the reserved keyword table. */ struct c_common_resword { const char *const word; ENUM_BITFIELD(rid) const rid : 16; const unsigned int disable : 16; }; /* Mode used to build pointers (VOIDmode means ptr_mode). */ extern machine_mode c_default_pointer_mode; /* Extra cpp_ttype values for C++. */ /* A token type for template-ids. If a template-id is processed while parsing tentatively, it is replaced with a CPP_TEMPLATE_ID token; the value of the CPP_TEMPLATE_ID is whatever was returned by cp_parser_template_id. */ #define CPP_TEMPLATE_ID ((enum cpp_ttype) (CPP_KEYWORD + 1)) /* A token type for nested-name-specifiers. If a nested-name-specifier is processed while parsing tentatively, it is replaced with a CPP_NESTED_NAME_SPECIFIER token; the value of the CPP_NESTED_NAME_SPECIFIER is whatever was returned by cp_parser_nested_name_specifier_opt. */ #define CPP_NESTED_NAME_SPECIFIER ((enum cpp_ttype) (CPP_TEMPLATE_ID + 1)) /* A token type for pre-parsed C++0x decltype. */ #define CPP_DECLTYPE ((enum cpp_ttype) (CPP_NESTED_NAME_SPECIFIER + 1)) /* A token type for pre-parsed primary-expression (lambda- or statement-). */ #define CPP_PREPARSED_EXPR ((enum cpp_ttype) (CPP_DECLTYPE + 1)) /* The number of token types, including C++-specific ones. */ #define N_CP_TTYPES ((int) (CPP_PREPARSED_EXPR + 1)) /* Disable mask. Keywords are disabled if (reswords[i].disable & mask) is _true_. Thus for keywords which are present in all languages the disable field is zero. */ #define D_CONLY 0x001 /* C only (not in C++). */ #define D_CXXONLY 0x002 /* C++ only (not in C). */ #define D_C99 0x004 /* In C, C99 only. */ #define D_CXX11 0x008 /* In C++, C++11 only. */ #define D_EXT 0x010 /* GCC extension. */ #define D_EXT89 0x020 /* GCC extension incorporated in C99. */ #define D_ASM 0x040 /* Disabled by -fno-asm. */ #define D_OBJC 0x080 /* In Objective C and neither C nor C++. */ #define D_CXX_OBJC 0x100 /* In Objective C, and C++, but not C. */ #define D_CXXWARN 0x200 /* In C warn with -Wcxx-compat. */ #define D_CXX_CONCEPTS 0x400 /* In C++, only with concepts. */ #define D_TRANSMEM 0X800 /* C++ transactional memory TS. */ #define D_CXX_CONCEPTS_FLAGS D_CXXONLY | D_CXX_CONCEPTS /* The reserved keyword table. */ extern const struct c_common_resword c_common_reswords[]; /* The number of items in the reserved keyword table. */ extern const unsigned int num_c_common_reswords; #define char16_type_node c_global_trees[CTI_CHAR16_TYPE] #define char32_type_node c_global_trees[CTI_CHAR32_TYPE] #define wchar_type_node c_global_trees[CTI_WCHAR_TYPE] #define underlying_wchar_type_node c_global_trees[CTI_UNDERLYING_WCHAR_TYPE] #define wint_type_node c_global_trees[CTI_WINT_TYPE] #define signed_size_type_node c_global_trees[CTI_SIGNED_SIZE_TYPE] #define unsigned_ptrdiff_type_node c_global_trees[CTI_UNSIGNED_PTRDIFF_TYPE] #define intmax_type_node c_global_trees[CTI_INTMAX_TYPE] #define uintmax_type_node c_global_trees[CTI_UINTMAX_TYPE] #define widest_integer_literal_type_node c_global_trees[CTI_WIDEST_INT_LIT_TYPE] #define widest_unsigned_literal_type_node c_global_trees[CTI_WIDEST_UINT_LIT_TYPE] #define sig_atomic_type_node c_global_trees[CTI_SIG_ATOMIC_TYPE] #define int8_type_node c_global_trees[CTI_INT8_TYPE] #define int16_type_node c_global_trees[CTI_INT16_TYPE] #define int32_type_node c_global_trees[CTI_INT32_TYPE] #define int64_type_node c_global_trees[CTI_INT64_TYPE] #define uint8_type_node c_global_trees[CTI_UINT8_TYPE] #define c_uint16_type_node c_global_trees[CTI_UINT16_TYPE] #define c_uint32_type_node c_global_trees[CTI_UINT32_TYPE] #define c_uint64_type_node c_global_trees[CTI_UINT64_TYPE] #define int_least8_type_node c_global_trees[CTI_INT_LEAST8_TYPE] #define int_least16_type_node c_global_trees[CTI_INT_LEAST16_TYPE] #define int_least32_type_node c_global_trees[CTI_INT_LEAST32_TYPE] #define int_least64_type_node c_global_trees[CTI_INT_LEAST64_TYPE] #define uint_least8_type_node c_global_trees[CTI_UINT_LEAST8_TYPE] #define uint_least16_type_node c_global_trees[CTI_UINT_LEAST16_TYPE] #define uint_least32_type_node c_global_trees[CTI_UINT_LEAST32_TYPE] #define uint_least64_type_node c_global_trees[CTI_UINT_LEAST64_TYPE] #define int_fast8_type_node c_global_trees[CTI_INT_FAST8_TYPE] #define int_fast16_type_node c_global_trees[CTI_INT_FAST16_TYPE] #define int_fast32_type_node c_global_trees[CTI_INT_FAST32_TYPE] #define int_fast64_type_node c_global_trees[CTI_INT_FAST64_TYPE] #define uint_fast8_type_node c_global_trees[CTI_UINT_FAST8_TYPE] #define uint_fast16_type_node c_global_trees[CTI_UINT_FAST16_TYPE] #define uint_fast32_type_node c_global_trees[CTI_UINT_FAST32_TYPE] #define uint_fast64_type_node c_global_trees[CTI_UINT_FAST64_TYPE] #define intptr_type_node c_global_trees[CTI_INTPTR_TYPE] #define uintptr_type_node c_global_trees[CTI_UINTPTR_TYPE] #define truthvalue_type_node c_global_trees[CTI_TRUTHVALUE_TYPE] #define truthvalue_true_node c_global_trees[CTI_TRUTHVALUE_TRUE] #define truthvalue_false_node c_global_trees[CTI_TRUTHVALUE_FALSE] #define char_array_type_node c_global_trees[CTI_CHAR_ARRAY_TYPE] #define char16_array_type_node c_global_trees[CTI_CHAR16_ARRAY_TYPE] #define char32_array_type_node c_global_trees[CTI_CHAR32_ARRAY_TYPE] #define wchar_array_type_node c_global_trees[CTI_WCHAR_ARRAY_TYPE] #define string_type_node c_global_trees[CTI_STRING_TYPE] #define const_string_type_node c_global_trees[CTI_CONST_STRING_TYPE] #define default_function_type c_global_trees[CTI_DEFAULT_FUNCTION_TYPE] #define function_name_decl_node c_global_trees[CTI_FUNCTION_NAME_DECL] #define pretty_function_name_decl_node c_global_trees[CTI_PRETTY_FUNCTION_NAME_DECL] #define c99_function_name_decl_node c_global_trees[CTI_C99_FUNCTION_NAME_DECL] #define saved_function_name_decls c_global_trees[CTI_SAVED_FUNCTION_NAME_DECLS] /* The node for C++ `__null'. */ #define null_node c_global_trees[CTI_NULL] extern GTY(()) tree c_global_trees[CTI_MAX]; /* Mark which labels are explicitly declared. These may be shadowed, and may be referenced from nested functions. */ #define C_DECLARED_LABEL_FLAG(label) TREE_LANG_FLAG_1 (label) enum c_language_kind { clk_c = 0, /* C90, C94, C99 or C11 */ clk_objc = 1, /* clk_c with ObjC features. */ clk_cxx = 2, /* ANSI/ISO C++ */ clk_objcxx = 3 /* clk_cxx with ObjC features. */ }; /* To test for a specific language use c_language, defined by each front end. For "ObjC features" or "not C++" use the macros. */ extern c_language_kind c_language; #define c_dialect_cxx() ((c_language & clk_cxx) != 0) #define c_dialect_objc() ((c_language & clk_objc) != 0) /* The various name of operator that appears in error messages. */ enum ref_operator { /* NULL */ RO_NULL, /* array indexing */ RO_ARRAY_INDEXING, /* unary * */ RO_UNARY_STAR, /* -> */ RO_ARROW, /* implicit conversion */ RO_IMPLICIT_CONVERSION, /* ->* */ RO_ARROW_STAR }; /* Information about a statement tree. */ struct GTY(()) stmt_tree_s { /* A stack of statement lists being collected. */ vec *x_cur_stmt_list; /* In C++, Nonzero if we should treat statements as full expressions. In particular, this variable is non-zero if at the end of a statement we should destroy any temporaries created during that statement. Similarly, if, at the end of a block, we should destroy any local variables in this block. Normally, this variable is nonzero, since those are the normal semantics of C++. This flag has no effect in C. */ int stmts_are_full_exprs_p; }; typedef struct stmt_tree_s *stmt_tree; /* Global state pertinent to the current function. Some C dialects extend this structure with additional fields. */ struct GTY(()) c_language_function { /* While we are parsing the function, this contains information about the statement-tree that we are building. */ struct stmt_tree_s x_stmt_tree; /* Vector of locally defined typedefs, for -Wunused-local-typedefs. */ vec *local_typedefs; }; #define stmt_list_stack (current_stmt_tree ()->x_cur_stmt_list) /* When building a statement-tree, this is the current statement list being collected. */ #define cur_stmt_list (stmt_list_stack->last ()) #define building_stmt_list_p() (stmt_list_stack && !stmt_list_stack->is_empty()) /* Language-specific hooks. */ /* If non-NULL, this function is called after a precompile header file is loaded. */ extern void (*lang_post_pch_load) (void); extern void push_file_scope (void); extern void pop_file_scope (void); extern stmt_tree current_stmt_tree (void); extern tree push_stmt_list (void); extern tree pop_stmt_list (tree); extern tree add_stmt (tree); extern void push_cleanup (tree, tree, bool); extern tree build_modify_expr (location_t, tree, tree, enum tree_code, location_t, tree, tree); extern tree build_indirect_ref (location_t, tree, ref_operator); extern bool has_c_linkage (const_tree decl); extern bool c_decl_implicit (const_tree);