1*e4b17023SJohn Marino /* Definitions for C parsing and type checking. 2*e4b17023SJohn Marino Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998, 3*e4b17023SJohn Marino 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 4*e4b17023SJohn Marino Free Software Foundation, Inc. 5*e4b17023SJohn Marino 6*e4b17023SJohn Marino This file is part of GCC. 7*e4b17023SJohn Marino 8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under 9*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free 10*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later 11*e4b17023SJohn Marino version. 12*e4b17023SJohn Marino 13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or 15*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16*e4b17023SJohn Marino for more details. 17*e4b17023SJohn Marino 18*e4b17023SJohn Marino You should have received a copy of the GNU General Public License 19*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see 20*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */ 21*e4b17023SJohn Marino 22*e4b17023SJohn Marino #ifndef GCC_C_TREE_H 23*e4b17023SJohn Marino #define GCC_C_TREE_H 24*e4b17023SJohn Marino 25*e4b17023SJohn Marino #include "c-family/c-common.h" 26*e4b17023SJohn Marino #include "diagnostic.h" 27*e4b17023SJohn Marino 28*e4b17023SJohn Marino /* struct lang_identifier is private to c-decl.c, but langhooks.c needs to 29*e4b17023SJohn Marino know how big it is. This is sanity-checked in c-decl.c. */ 30*e4b17023SJohn Marino #define C_SIZEOF_STRUCT_LANG_IDENTIFIER \ 31*e4b17023SJohn Marino (sizeof (struct c_common_identifier) + 3 * sizeof (void *)) 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ 34*e4b17023SJohn Marino #define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1 (TYPE) 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is volatile. */ 37*e4b17023SJohn Marino #define C_TYPE_FIELDS_VOLATILE(TYPE) TREE_LANG_FLAG_2 (TYPE) 38*e4b17023SJohn Marino 39*e4b17023SJohn Marino /* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE 40*e4b17023SJohn Marino nonzero if the definition of the type has already started. */ 41*e4b17023SJohn Marino #define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE) 42*e4b17023SJohn Marino 43*e4b17023SJohn Marino /* In an incomplete RECORD_TYPE or UNION_TYPE, a list of variable 44*e4b17023SJohn Marino declarations whose type would be completed by completing that type. */ 45*e4b17023SJohn Marino #define C_TYPE_INCOMPLETE_VARS(TYPE) TYPE_VFIELD (TYPE) 46*e4b17023SJohn Marino 47*e4b17023SJohn Marino /* In an IDENTIFIER_NODE, nonzero if this identifier is actually a 48*e4b17023SJohn Marino keyword. C_RID_CODE (node) is then the RID_* value of the keyword, 49*e4b17023SJohn Marino and C_RID_YYCODE is the token number wanted by Yacc. */ 50*e4b17023SJohn Marino #define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID) 51*e4b17023SJohn Marino 52*e4b17023SJohn Marino /* Record whether a type or decl was written with nonconstant size. 53*e4b17023SJohn Marino Note that TYPE_SIZE may have simplified to a constant. */ 54*e4b17023SJohn Marino #define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE) 55*e4b17023SJohn Marino #define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE) 56*e4b17023SJohn Marino 57*e4b17023SJohn Marino /* Record whether a type is defined inside a struct or union type. 58*e4b17023SJohn Marino This is used for -Wc++-compat. */ 59*e4b17023SJohn Marino #define C_TYPE_DEFINED_IN_STRUCT(TYPE) TYPE_LANG_FLAG_2 (TYPE) 60*e4b17023SJohn Marino 61*e4b17023SJohn Marino /* Record whether a typedef for type `int' was actually `signed int'. */ 62*e4b17023SJohn Marino #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP) 63*e4b17023SJohn Marino 64*e4b17023SJohn Marino /* For a FUNCTION_DECL, nonzero if it was defined without an explicit 65*e4b17023SJohn Marino return type. */ 66*e4b17023SJohn Marino #define C_FUNCTION_IMPLICIT_INT(EXP) DECL_LANG_FLAG_1 (EXP) 67*e4b17023SJohn Marino 68*e4b17023SJohn Marino /* For a FUNCTION_DECL, nonzero if it was an implicit declaration. */ 69*e4b17023SJohn Marino #define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP) 70*e4b17023SJohn Marino 71*e4b17023SJohn Marino /* For FUNCTION_DECLs, evaluates true if the decl is built-in but has 72*e4b17023SJohn Marino been declared. */ 73*e4b17023SJohn Marino #define C_DECL_DECLARED_BUILTIN(EXP) \ 74*e4b17023SJohn Marino DECL_LANG_FLAG_3 (FUNCTION_DECL_CHECK (EXP)) 75*e4b17023SJohn Marino 76*e4b17023SJohn Marino /* For FUNCTION_DECLs, evaluates true if the decl is built-in, has a 77*e4b17023SJohn Marino built-in prototype and does not have a non-built-in prototype. */ 78*e4b17023SJohn Marino #define C_DECL_BUILTIN_PROTOTYPE(EXP) \ 79*e4b17023SJohn Marino DECL_LANG_FLAG_6 (FUNCTION_DECL_CHECK (EXP)) 80*e4b17023SJohn Marino 81*e4b17023SJohn Marino /* Record whether a decl was declared register. This is strictly a 82*e4b17023SJohn Marino front-end flag, whereas DECL_REGISTER is used for code generation; 83*e4b17023SJohn Marino they may differ for structures with volatile fields. */ 84*e4b17023SJohn Marino #define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4 (EXP) 85*e4b17023SJohn Marino 86*e4b17023SJohn Marino /* Record whether a decl was used in an expression anywhere except an 87*e4b17023SJohn Marino unevaluated operand of sizeof / typeof / alignof. This is only 88*e4b17023SJohn Marino used for functions declared static but not defined, though outside 89*e4b17023SJohn Marino sizeof and typeof it is set for other function decls as well. */ 90*e4b17023SJohn Marino #define C_DECL_USED(EXP) DECL_LANG_FLAG_5 (FUNCTION_DECL_CHECK (EXP)) 91*e4b17023SJohn Marino 92*e4b17023SJohn Marino /* Record whether a variable has been declared threadprivate by 93*e4b17023SJohn Marino #pragma omp threadprivate. */ 94*e4b17023SJohn Marino #define C_DECL_THREADPRIVATE_P(DECL) DECL_LANG_FLAG_3 (VAR_DECL_CHECK (DECL)) 95*e4b17023SJohn Marino 96*e4b17023SJohn Marino /* Nonzero for a decl which either doesn't exist or isn't a prototype. 97*e4b17023SJohn Marino N.B. Could be simplified if all built-in decls had complete prototypes 98*e4b17023SJohn Marino (but this is presently difficult because some of them need FILE*). */ 99*e4b17023SJohn Marino #define C_DECL_ISNT_PROTOTYPE(EXP) \ 100*e4b17023SJohn Marino (EXP == 0 \ 101*e4b17023SJohn Marino || (!prototype_p (TREE_TYPE (EXP)) \ 102*e4b17023SJohn Marino && !DECL_BUILT_IN (EXP))) 103*e4b17023SJohn Marino 104*e4b17023SJohn Marino /* For FUNCTION_TYPE, a hidden list of types of arguments. The same as 105*e4b17023SJohn Marino TYPE_ARG_TYPES for functions with prototypes, but created for functions 106*e4b17023SJohn Marino without prototypes. */ 107*e4b17023SJohn Marino #define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_LANG_SLOT_1 (NODE) 108*e4b17023SJohn Marino 109*e4b17023SJohn Marino /* For a CONSTRUCTOR, whether some initializer contains a 110*e4b17023SJohn Marino subexpression meaning it is not a constant expression. */ 111*e4b17023SJohn Marino #define CONSTRUCTOR_NON_CONST(EXPR) TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK (EXPR)) 112*e4b17023SJohn Marino 113*e4b17023SJohn Marino /* Record parser information about an expression that is irrelevant 114*e4b17023SJohn Marino for code generation alongside a tree representing its value. */ 115*e4b17023SJohn Marino struct c_expr 116*e4b17023SJohn Marino { 117*e4b17023SJohn Marino /* The value of the expression. */ 118*e4b17023SJohn Marino tree value; 119*e4b17023SJohn Marino /* Record the original unary/binary operator of an expression, which may 120*e4b17023SJohn Marino have been changed by fold, STRING_CST for unparenthesized string 121*e4b17023SJohn Marino constants, C_MAYBE_CONST_EXPR for __builtin_constant_p calls 122*e4b17023SJohn Marino (even if parenthesized), for subexpressions, and for non-constant 123*e4b17023SJohn Marino initializers, or ERROR_MARK for other expressions (including 124*e4b17023SJohn Marino parenthesized expressions). */ 125*e4b17023SJohn Marino enum tree_code original_code; 126*e4b17023SJohn Marino /* If not NULL, the original type of an expression. This will 127*e4b17023SJohn Marino differ from the type of the value field for an enum constant. 128*e4b17023SJohn Marino The type of an enum constant is a plain integer type, but this 129*e4b17023SJohn Marino field will be the enum type. */ 130*e4b17023SJohn Marino tree original_type; 131*e4b17023SJohn Marino }; 132*e4b17023SJohn Marino 133*e4b17023SJohn Marino /* Type alias for struct c_expr. This allows to use the structure 134*e4b17023SJohn Marino inside the VEC types. */ 135*e4b17023SJohn Marino typedef struct c_expr c_expr_t; 136*e4b17023SJohn Marino 137*e4b17023SJohn Marino /* A varray of c_expr_t. */ 138*e4b17023SJohn Marino DEF_VEC_O (c_expr_t); 139*e4b17023SJohn Marino DEF_VEC_ALLOC_O (c_expr_t, gc); 140*e4b17023SJohn Marino DEF_VEC_ALLOC_O (c_expr_t, heap); 141*e4b17023SJohn Marino 142*e4b17023SJohn Marino /* Append a new c_expr_t element to V. */ 143*e4b17023SJohn Marino #define C_EXPR_APPEND(V, ELEM) \ 144*e4b17023SJohn Marino do { \ 145*e4b17023SJohn Marino c_expr_t *__elem_p = VEC_safe_push (c_expr_t, gc, V, NULL); \ 146*e4b17023SJohn Marino *__elem_p = (ELEM); \ 147*e4b17023SJohn Marino } while (0) 148*e4b17023SJohn Marino 149*e4b17023SJohn Marino /* A kind of type specifier. Note that this information is currently 150*e4b17023SJohn Marino only used to distinguish tag definitions, tag references and typeof 151*e4b17023SJohn Marino uses. */ 152*e4b17023SJohn Marino enum c_typespec_kind { 153*e4b17023SJohn Marino /* No typespec. This appears only in struct c_declspec. */ 154*e4b17023SJohn Marino ctsk_none, 155*e4b17023SJohn Marino /* A reserved keyword type specifier. */ 156*e4b17023SJohn Marino ctsk_resword, 157*e4b17023SJohn Marino /* A reference to a tag, previously declared, such as "struct foo". 158*e4b17023SJohn Marino This includes where the previous declaration was as a different 159*e4b17023SJohn Marino kind of tag, in which case this is only valid if shadowing that 160*e4b17023SJohn Marino tag in an inner scope. */ 161*e4b17023SJohn Marino ctsk_tagref, 162*e4b17023SJohn Marino /* A reference to a tag, not previously declared in a visible 163*e4b17023SJohn Marino scope. */ 164*e4b17023SJohn Marino ctsk_tagfirstref, 165*e4b17023SJohn Marino /* A definition of a tag such as "struct foo { int a; }". */ 166*e4b17023SJohn Marino ctsk_tagdef, 167*e4b17023SJohn Marino /* A typedef name. */ 168*e4b17023SJohn Marino ctsk_typedef, 169*e4b17023SJohn Marino /* An ObjC-specific kind of type specifier. */ 170*e4b17023SJohn Marino ctsk_objc, 171*e4b17023SJohn Marino /* A typeof specifier. */ 172*e4b17023SJohn Marino ctsk_typeof 173*e4b17023SJohn Marino }; 174*e4b17023SJohn Marino 175*e4b17023SJohn Marino /* A type specifier: this structure is created in the parser and 176*e4b17023SJohn Marino passed to declspecs_add_type only. */ 177*e4b17023SJohn Marino struct c_typespec { 178*e4b17023SJohn Marino /* What kind of type specifier this is. */ 179*e4b17023SJohn Marino enum c_typespec_kind kind; 180*e4b17023SJohn Marino /* Whether the expression has operands suitable for use in constant 181*e4b17023SJohn Marino expressions. */ 182*e4b17023SJohn Marino bool expr_const_operands; 183*e4b17023SJohn Marino /* The specifier itself. */ 184*e4b17023SJohn Marino tree spec; 185*e4b17023SJohn Marino /* An expression to be evaluated before the type specifier, in the 186*e4b17023SJohn Marino case of typeof specifiers, or NULL otherwise or if no such 187*e4b17023SJohn Marino expression is required for a particular typeof specifier. In 188*e4b17023SJohn Marino particular, when typeof is applied to an expression of variably 189*e4b17023SJohn Marino modified type, that expression must be evaluated in order to 190*e4b17023SJohn Marino determine array sizes that form part of the type, but the 191*e4b17023SJohn Marino expression itself (as opposed to the array sizes) forms no part 192*e4b17023SJohn Marino of the type and so needs to be recorded separately. */ 193*e4b17023SJohn Marino tree expr; 194*e4b17023SJohn Marino }; 195*e4b17023SJohn Marino 196*e4b17023SJohn Marino /* A storage class specifier. */ 197*e4b17023SJohn Marino enum c_storage_class { 198*e4b17023SJohn Marino csc_none, 199*e4b17023SJohn Marino csc_auto, 200*e4b17023SJohn Marino csc_extern, 201*e4b17023SJohn Marino csc_register, 202*e4b17023SJohn Marino csc_static, 203*e4b17023SJohn Marino csc_typedef 204*e4b17023SJohn Marino }; 205*e4b17023SJohn Marino 206*e4b17023SJohn Marino /* A type specifier keyword "void", "_Bool", "char", "int", "float", 207*e4b17023SJohn Marino "double", "_Decimal32", "_Decimal64", "_Decimal128", "_Fract", "_Accum", 208*e4b17023SJohn Marino or none of these. */ 209*e4b17023SJohn Marino enum c_typespec_keyword { 210*e4b17023SJohn Marino cts_none, 211*e4b17023SJohn Marino cts_void, 212*e4b17023SJohn Marino cts_bool, 213*e4b17023SJohn Marino cts_char, 214*e4b17023SJohn Marino cts_int, 215*e4b17023SJohn Marino cts_float, 216*e4b17023SJohn Marino cts_int128, 217*e4b17023SJohn Marino cts_double, 218*e4b17023SJohn Marino cts_dfloat32, 219*e4b17023SJohn Marino cts_dfloat64, 220*e4b17023SJohn Marino cts_dfloat128, 221*e4b17023SJohn Marino cts_fract, 222*e4b17023SJohn Marino cts_accum 223*e4b17023SJohn Marino }; 224*e4b17023SJohn Marino 225*e4b17023SJohn Marino /* A sequence of declaration specifiers in C. */ 226*e4b17023SJohn Marino struct c_declspecs { 227*e4b17023SJohn Marino /* The type specified, if a single type specifier such as a struct, 228*e4b17023SJohn Marino union or enum specifier, typedef name or typeof specifies the 229*e4b17023SJohn Marino whole type, or NULL_TREE if none or a keyword such as "void" or 230*e4b17023SJohn Marino "char" is used. Does not include qualifiers. */ 231*e4b17023SJohn Marino tree type; 232*e4b17023SJohn Marino /* Any expression to be evaluated before the type, from a typeof 233*e4b17023SJohn Marino specifier. */ 234*e4b17023SJohn Marino tree expr; 235*e4b17023SJohn Marino /* The attributes from a typedef decl. */ 236*e4b17023SJohn Marino tree decl_attr; 237*e4b17023SJohn Marino /* When parsing, the attributes. Outside the parser, this will be 238*e4b17023SJohn Marino NULL; attributes (possibly from multiple lists) will be passed 239*e4b17023SJohn Marino separately. */ 240*e4b17023SJohn Marino tree attrs; 241*e4b17023SJohn Marino /* The base-2 log of the greatest alignment required by an _Alignas 242*e4b17023SJohn Marino specifier, in bytes, or -1 if no such specifiers with nonzero 243*e4b17023SJohn Marino alignment. */ 244*e4b17023SJohn Marino int align_log; 245*e4b17023SJohn Marino /* The storage class specifier, or csc_none if none. */ 246*e4b17023SJohn Marino enum c_storage_class storage_class; 247*e4b17023SJohn Marino /* Any type specifier keyword used such as "int", not reflecting 248*e4b17023SJohn Marino modifiers such as "short", or cts_none if none. */ 249*e4b17023SJohn Marino ENUM_BITFIELD (c_typespec_keyword) typespec_word : 8; 250*e4b17023SJohn Marino /* The kind of type specifier if one has been seen, ctsk_none 251*e4b17023SJohn Marino otherwise. */ 252*e4b17023SJohn Marino ENUM_BITFIELD (c_typespec_kind) typespec_kind : 3; 253*e4b17023SJohn Marino /* Whether any expressions in typeof specifiers may appear in 254*e4b17023SJohn Marino constant expressions. */ 255*e4b17023SJohn Marino BOOL_BITFIELD expr_const_operands : 1; 256*e4b17023SJohn Marino /* Whether any declaration specifiers have been seen at all. */ 257*e4b17023SJohn Marino BOOL_BITFIELD declspecs_seen_p : 1; 258*e4b17023SJohn Marino /* Whether something other than a storage class specifier or 259*e4b17023SJohn Marino attribute has been seen. This is used to warn for the 260*e4b17023SJohn Marino obsolescent usage of storage class specifiers other than at the 261*e4b17023SJohn Marino start of the list. (Doing this properly would require function 262*e4b17023SJohn Marino specifiers to be handled separately from storage class 263*e4b17023SJohn Marino specifiers.) */ 264*e4b17023SJohn Marino BOOL_BITFIELD non_sc_seen_p : 1; 265*e4b17023SJohn Marino /* Whether the type is specified by a typedef or typeof name. */ 266*e4b17023SJohn Marino BOOL_BITFIELD typedef_p : 1; 267*e4b17023SJohn Marino /* Whether the type is explicitly "signed" or specified by a typedef 268*e4b17023SJohn Marino whose type is explicitly "signed". */ 269*e4b17023SJohn Marino BOOL_BITFIELD explicit_signed_p : 1; 270*e4b17023SJohn Marino /* Whether the specifiers include a deprecated typedef. */ 271*e4b17023SJohn Marino BOOL_BITFIELD deprecated_p : 1; 272*e4b17023SJohn Marino /* Whether the type defaulted to "int" because there were no type 273*e4b17023SJohn Marino specifiers. */ 274*e4b17023SJohn Marino BOOL_BITFIELD default_int_p : 1; 275*e4b17023SJohn Marino /* Whether "long" was specified. */ 276*e4b17023SJohn Marino BOOL_BITFIELD long_p : 1; 277*e4b17023SJohn Marino /* Whether "long" was specified more than once. */ 278*e4b17023SJohn Marino BOOL_BITFIELD long_long_p : 1; 279*e4b17023SJohn Marino /* Whether "short" was specified. */ 280*e4b17023SJohn Marino BOOL_BITFIELD short_p : 1; 281*e4b17023SJohn Marino /* Whether "signed" was specified. */ 282*e4b17023SJohn Marino BOOL_BITFIELD signed_p : 1; 283*e4b17023SJohn Marino /* Whether "unsigned" was specified. */ 284*e4b17023SJohn Marino BOOL_BITFIELD unsigned_p : 1; 285*e4b17023SJohn Marino /* Whether "complex" was specified. */ 286*e4b17023SJohn Marino BOOL_BITFIELD complex_p : 1; 287*e4b17023SJohn Marino /* Whether "inline" was specified. */ 288*e4b17023SJohn Marino BOOL_BITFIELD inline_p : 1; 289*e4b17023SJohn Marino /* Whether "_Noreturn" was speciied. */ 290*e4b17023SJohn Marino BOOL_BITFIELD noreturn_p : 1; 291*e4b17023SJohn Marino /* Whether "__thread" was specified. */ 292*e4b17023SJohn Marino BOOL_BITFIELD thread_p : 1; 293*e4b17023SJohn Marino /* Whether "const" was specified. */ 294*e4b17023SJohn Marino BOOL_BITFIELD const_p : 1; 295*e4b17023SJohn Marino /* Whether "volatile" was specified. */ 296*e4b17023SJohn Marino BOOL_BITFIELD volatile_p : 1; 297*e4b17023SJohn Marino /* Whether "restrict" was specified. */ 298*e4b17023SJohn Marino BOOL_BITFIELD restrict_p : 1; 299*e4b17023SJohn Marino /* Whether "_Sat" was specified. */ 300*e4b17023SJohn Marino BOOL_BITFIELD saturating_p : 1; 301*e4b17023SJohn Marino /* Whether any alignment specifier (even with zero alignment) was 302*e4b17023SJohn Marino specified. */ 303*e4b17023SJohn Marino BOOL_BITFIELD alignas_p : 1; 304*e4b17023SJohn Marino /* The address space that the declaration belongs to. */ 305*e4b17023SJohn Marino addr_space_t address_space; 306*e4b17023SJohn Marino }; 307*e4b17023SJohn Marino 308*e4b17023SJohn Marino /* The various kinds of declarators in C. */ 309*e4b17023SJohn Marino enum c_declarator_kind { 310*e4b17023SJohn Marino /* An identifier. */ 311*e4b17023SJohn Marino cdk_id, 312*e4b17023SJohn Marino /* A function. */ 313*e4b17023SJohn Marino cdk_function, 314*e4b17023SJohn Marino /* An array. */ 315*e4b17023SJohn Marino cdk_array, 316*e4b17023SJohn Marino /* A pointer. */ 317*e4b17023SJohn Marino cdk_pointer, 318*e4b17023SJohn Marino /* Parenthesized declarator with nested attributes. */ 319*e4b17023SJohn Marino cdk_attrs 320*e4b17023SJohn Marino }; 321*e4b17023SJohn Marino 322*e4b17023SJohn Marino typedef struct c_arg_tag_d { 323*e4b17023SJohn Marino /* The argument name. */ 324*e4b17023SJohn Marino tree id; 325*e4b17023SJohn Marino /* The type of the argument. */ 326*e4b17023SJohn Marino tree type; 327*e4b17023SJohn Marino } c_arg_tag; 328*e4b17023SJohn Marino 329*e4b17023SJohn Marino DEF_VEC_O(c_arg_tag); 330*e4b17023SJohn Marino DEF_VEC_ALLOC_O(c_arg_tag,gc); 331*e4b17023SJohn Marino 332*e4b17023SJohn Marino /* Information about the parameters in a function declarator. */ 333*e4b17023SJohn Marino struct c_arg_info { 334*e4b17023SJohn Marino /* A list of parameter decls. */ 335*e4b17023SJohn Marino tree parms; 336*e4b17023SJohn Marino /* A list of structure, union and enum tags defined. */ 337*e4b17023SJohn Marino VEC(c_arg_tag,gc) *tags; 338*e4b17023SJohn Marino /* A list of argument types to go in the FUNCTION_TYPE. */ 339*e4b17023SJohn Marino tree types; 340*e4b17023SJohn Marino /* A list of non-parameter decls (notably enumeration constants) 341*e4b17023SJohn Marino defined with the parameters. */ 342*e4b17023SJohn Marino tree others; 343*e4b17023SJohn Marino /* A compound expression of VLA sizes from the parameters, or NULL. 344*e4b17023SJohn Marino In a function definition, these are used to ensure that 345*e4b17023SJohn Marino side-effects in sizes of arrays converted to pointers (such as a 346*e4b17023SJohn Marino parameter int i[n++]) take place; otherwise, they are 347*e4b17023SJohn Marino ignored. */ 348*e4b17023SJohn Marino tree pending_sizes; 349*e4b17023SJohn Marino /* True when these arguments had [*]. */ 350*e4b17023SJohn Marino BOOL_BITFIELD had_vla_unspec : 1; 351*e4b17023SJohn Marino }; 352*e4b17023SJohn Marino 353*e4b17023SJohn Marino /* A declarator. */ 354*e4b17023SJohn Marino struct c_declarator { 355*e4b17023SJohn Marino /* The kind of declarator. */ 356*e4b17023SJohn Marino enum c_declarator_kind kind; 357*e4b17023SJohn Marino location_t id_loc; /* Currently only set for cdk_id, cdk_array. */ 358*e4b17023SJohn Marino /* Except for cdk_id, the contained declarator. For cdk_id, NULL. */ 359*e4b17023SJohn Marino struct c_declarator *declarator; 360*e4b17023SJohn Marino union { 361*e4b17023SJohn Marino /* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract 362*e4b17023SJohn Marino declarator. */ 363*e4b17023SJohn Marino tree id; 364*e4b17023SJohn Marino /* For functions. */ 365*e4b17023SJohn Marino struct c_arg_info *arg_info; 366*e4b17023SJohn Marino /* For arrays. */ 367*e4b17023SJohn Marino struct { 368*e4b17023SJohn Marino /* The array dimension, or NULL for [] and [*]. */ 369*e4b17023SJohn Marino tree dimen; 370*e4b17023SJohn Marino /* The qualifiers inside []. */ 371*e4b17023SJohn Marino int quals; 372*e4b17023SJohn Marino /* The attributes (currently ignored) inside []. */ 373*e4b17023SJohn Marino tree attrs; 374*e4b17023SJohn Marino /* Whether [static] was used. */ 375*e4b17023SJohn Marino BOOL_BITFIELD static_p : 1; 376*e4b17023SJohn Marino /* Whether [*] was used. */ 377*e4b17023SJohn Marino BOOL_BITFIELD vla_unspec_p : 1; 378*e4b17023SJohn Marino } array; 379*e4b17023SJohn Marino /* For pointers, the qualifiers on the pointer type. */ 380*e4b17023SJohn Marino int pointer_quals; 381*e4b17023SJohn Marino /* For attributes. */ 382*e4b17023SJohn Marino tree attrs; 383*e4b17023SJohn Marino } u; 384*e4b17023SJohn Marino }; 385*e4b17023SJohn Marino 386*e4b17023SJohn Marino /* A type name. */ 387*e4b17023SJohn Marino struct c_type_name { 388*e4b17023SJohn Marino /* The declaration specifiers. */ 389*e4b17023SJohn Marino struct c_declspecs *specs; 390*e4b17023SJohn Marino /* The declarator. */ 391*e4b17023SJohn Marino struct c_declarator *declarator; 392*e4b17023SJohn Marino }; 393*e4b17023SJohn Marino 394*e4b17023SJohn Marino /* A parameter. */ 395*e4b17023SJohn Marino struct c_parm { 396*e4b17023SJohn Marino /* The declaration specifiers, minus any prefix attributes. */ 397*e4b17023SJohn Marino struct c_declspecs *specs; 398*e4b17023SJohn Marino /* The attributes. */ 399*e4b17023SJohn Marino tree attrs; 400*e4b17023SJohn Marino /* The declarator. */ 401*e4b17023SJohn Marino struct c_declarator *declarator; 402*e4b17023SJohn Marino }; 403*e4b17023SJohn Marino 404*e4b17023SJohn Marino /* Used when parsing an enum. Initialized by start_enum. */ 405*e4b17023SJohn Marino struct c_enum_contents 406*e4b17023SJohn Marino { 407*e4b17023SJohn Marino /* While defining an enum type, this is 1 plus the last enumerator 408*e4b17023SJohn Marino constant value. */ 409*e4b17023SJohn Marino tree enum_next_value; 410*e4b17023SJohn Marino 411*e4b17023SJohn Marino /* Nonzero means that there was overflow computing enum_next_value. */ 412*e4b17023SJohn Marino int enum_overflow; 413*e4b17023SJohn Marino }; 414*e4b17023SJohn Marino 415*e4b17023SJohn Marino /* A type of reference to a static identifier in an inline 416*e4b17023SJohn Marino function. */ 417*e4b17023SJohn Marino enum c_inline_static_type { 418*e4b17023SJohn Marino /* Identifier with internal linkage used in function that may be an 419*e4b17023SJohn Marino inline definition (i.e., file-scope static). */ 420*e4b17023SJohn Marino csi_internal, 421*e4b17023SJohn Marino /* Modifiable object with static storage duration defined in 422*e4b17023SJohn Marino function that may be an inline definition (i.e., local 423*e4b17023SJohn Marino static). */ 424*e4b17023SJohn Marino csi_modifiable 425*e4b17023SJohn Marino }; 426*e4b17023SJohn Marino 427*e4b17023SJohn Marino 428*e4b17023SJohn Marino /* in c-parser.c */ 429*e4b17023SJohn Marino extern void c_parse_init (void); 430*e4b17023SJohn Marino 431*e4b17023SJohn Marino /* in c-aux-info.c */ 432*e4b17023SJohn Marino extern void gen_aux_info_record (tree, int, int, int); 433*e4b17023SJohn Marino 434*e4b17023SJohn Marino /* in c-decl.c */ 435*e4b17023SJohn Marino struct c_spot_bindings; 436*e4b17023SJohn Marino struct c_struct_parse_info; 437*e4b17023SJohn Marino extern struct obstack parser_obstack; 438*e4b17023SJohn Marino extern tree c_break_label; 439*e4b17023SJohn Marino extern tree c_cont_label; 440*e4b17023SJohn Marino 441*e4b17023SJohn Marino extern bool global_bindings_p (void); 442*e4b17023SJohn Marino extern void push_scope (void); 443*e4b17023SJohn Marino extern tree pop_scope (void); 444*e4b17023SJohn Marino extern void c_bindings_start_stmt_expr (struct c_spot_bindings *); 445*e4b17023SJohn Marino extern void c_bindings_end_stmt_expr (struct c_spot_bindings *); 446*e4b17023SJohn Marino 447*e4b17023SJohn Marino extern void record_inline_static (location_t, tree, tree, 448*e4b17023SJohn Marino enum c_inline_static_type); 449*e4b17023SJohn Marino extern void c_init_decl_processing (void); 450*e4b17023SJohn Marino extern void c_print_identifier (FILE *, tree, int); 451*e4b17023SJohn Marino extern int quals_from_declspecs (const struct c_declspecs *); 452*e4b17023SJohn Marino extern struct c_declarator *build_array_declarator (location_t, tree, 453*e4b17023SJohn Marino struct c_declspecs *, 454*e4b17023SJohn Marino bool, bool); 455*e4b17023SJohn Marino extern tree build_enumerator (location_t, location_t, struct c_enum_contents *, 456*e4b17023SJohn Marino tree, tree); 457*e4b17023SJohn Marino extern tree check_for_loop_decls (location_t, bool); 458*e4b17023SJohn Marino extern void mark_forward_parm_decls (void); 459*e4b17023SJohn Marino extern void declare_parm_level (void); 460*e4b17023SJohn Marino extern void undeclared_variable (location_t, tree); 461*e4b17023SJohn Marino extern tree lookup_label_for_goto (location_t, tree); 462*e4b17023SJohn Marino extern tree declare_label (tree); 463*e4b17023SJohn Marino extern tree define_label (location_t, tree); 464*e4b17023SJohn Marino extern struct c_spot_bindings *c_get_switch_bindings (void); 465*e4b17023SJohn Marino extern void c_release_switch_bindings (struct c_spot_bindings *); 466*e4b17023SJohn Marino extern bool c_check_switch_jump_warnings (struct c_spot_bindings *, 467*e4b17023SJohn Marino location_t, location_t); 468*e4b17023SJohn Marino extern void finish_decl (tree, location_t, tree, tree, tree); 469*e4b17023SJohn Marino extern tree finish_enum (tree, tree, tree); 470*e4b17023SJohn Marino extern void finish_function (void); 471*e4b17023SJohn Marino extern tree finish_struct (location_t, tree, tree, tree, 472*e4b17023SJohn Marino struct c_struct_parse_info *); 473*e4b17023SJohn Marino extern struct c_arg_info *build_arg_info (void); 474*e4b17023SJohn Marino extern struct c_arg_info *get_parm_info (bool, tree); 475*e4b17023SJohn Marino extern tree grokfield (location_t, struct c_declarator *, 476*e4b17023SJohn Marino struct c_declspecs *, tree, tree *); 477*e4b17023SJohn Marino extern tree groktypename (struct c_type_name *, tree *, bool *); 478*e4b17023SJohn Marino extern tree grokparm (const struct c_parm *, tree *); 479*e4b17023SJohn Marino extern tree implicitly_declare (location_t, tree); 480*e4b17023SJohn Marino extern void keep_next_level (void); 481*e4b17023SJohn Marino extern void pending_xref_error (void); 482*e4b17023SJohn Marino extern void c_push_function_context (void); 483*e4b17023SJohn Marino extern void c_pop_function_context (void); 484*e4b17023SJohn Marino extern void push_parm_decl (const struct c_parm *, tree *); 485*e4b17023SJohn Marino extern struct c_declarator *set_array_declarator_inner (struct c_declarator *, 486*e4b17023SJohn Marino struct c_declarator *); 487*e4b17023SJohn Marino extern tree c_builtin_function (tree); 488*e4b17023SJohn Marino extern tree c_builtin_function_ext_scope (tree); 489*e4b17023SJohn Marino extern void shadow_tag (const struct c_declspecs *); 490*e4b17023SJohn Marino extern void shadow_tag_warned (const struct c_declspecs *, int); 491*e4b17023SJohn Marino extern tree start_enum (location_t, struct c_enum_contents *, tree); 492*e4b17023SJohn Marino extern int start_function (struct c_declspecs *, struct c_declarator *, tree); 493*e4b17023SJohn Marino extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool, 494*e4b17023SJohn Marino tree); 495*e4b17023SJohn Marino extern tree start_struct (location_t, enum tree_code, tree, 496*e4b17023SJohn Marino struct c_struct_parse_info **); 497*e4b17023SJohn Marino extern void store_parm_decls (void); 498*e4b17023SJohn Marino extern void store_parm_decls_from (struct c_arg_info *); 499*e4b17023SJohn Marino extern tree xref_tag (enum tree_code, tree); 500*e4b17023SJohn Marino extern struct c_typespec parser_xref_tag (location_t, enum tree_code, tree); 501*e4b17023SJohn Marino extern int c_expand_decl (tree); 502*e4b17023SJohn Marino extern struct c_parm *build_c_parm (struct c_declspecs *, tree, 503*e4b17023SJohn Marino struct c_declarator *); 504*e4b17023SJohn Marino extern struct c_declarator *build_attrs_declarator (tree, 505*e4b17023SJohn Marino struct c_declarator *); 506*e4b17023SJohn Marino extern struct c_declarator *build_function_declarator (struct c_arg_info *, 507*e4b17023SJohn Marino struct c_declarator *); 508*e4b17023SJohn Marino extern struct c_declarator *build_id_declarator (tree); 509*e4b17023SJohn Marino extern struct c_declarator *make_pointer_declarator (struct c_declspecs *, 510*e4b17023SJohn Marino struct c_declarator *); 511*e4b17023SJohn Marino extern struct c_declspecs *build_null_declspecs (void); 512*e4b17023SJohn Marino extern struct c_declspecs *declspecs_add_qual (struct c_declspecs *, tree); 513*e4b17023SJohn Marino extern struct c_declspecs *declspecs_add_type (location_t, 514*e4b17023SJohn Marino struct c_declspecs *, 515*e4b17023SJohn Marino struct c_typespec); 516*e4b17023SJohn Marino extern struct c_declspecs *declspecs_add_scspec (struct c_declspecs *, tree); 517*e4b17023SJohn Marino extern struct c_declspecs *declspecs_add_attrs (struct c_declspecs *, tree); 518*e4b17023SJohn Marino extern struct c_declspecs *declspecs_add_addrspace (struct c_declspecs *, 519*e4b17023SJohn Marino addr_space_t); 520*e4b17023SJohn Marino extern struct c_declspecs *declspecs_add_alignas (struct c_declspecs *, tree); 521*e4b17023SJohn Marino extern struct c_declspecs *finish_declspecs (struct c_declspecs *); 522*e4b17023SJohn Marino 523*e4b17023SJohn Marino /* in c-objc-common.c */ 524*e4b17023SJohn Marino extern bool c_objc_common_init (void); 525*e4b17023SJohn Marino extern bool c_missing_noreturn_ok_p (tree); 526*e4b17023SJohn Marino extern bool c_warn_unused_global_decl (const_tree); 527*e4b17023SJohn Marino extern void c_initialize_diagnostics (diagnostic_context *); 528*e4b17023SJohn Marino extern bool c_vla_unspec_p (tree x, tree fn); 529*e4b17023SJohn Marino 530*e4b17023SJohn Marino /* in c-typeck.c */ 531*e4b17023SJohn Marino extern int in_alignof; 532*e4b17023SJohn Marino extern int in_sizeof; 533*e4b17023SJohn Marino extern int in_typeof; 534*e4b17023SJohn Marino 535*e4b17023SJohn Marino extern struct c_switch *c_switch_stack; 536*e4b17023SJohn Marino 537*e4b17023SJohn Marino extern tree c_objc_common_truthvalue_conversion (location_t, tree); 538*e4b17023SJohn Marino extern tree require_complete_type (tree); 539*e4b17023SJohn Marino extern int same_translation_unit_p (const_tree, const_tree); 540*e4b17023SJohn Marino extern int comptypes (tree, tree); 541*e4b17023SJohn Marino extern int comptypes_check_different_types (tree, tree, bool *); 542*e4b17023SJohn Marino extern bool c_vla_type_p (const_tree); 543*e4b17023SJohn Marino extern bool c_mark_addressable (tree); 544*e4b17023SJohn Marino extern void c_incomplete_type_error (const_tree, const_tree); 545*e4b17023SJohn Marino extern tree c_type_promotes_to (tree); 546*e4b17023SJohn Marino extern struct c_expr default_function_array_conversion (location_t, 547*e4b17023SJohn Marino struct c_expr); 548*e4b17023SJohn Marino extern struct c_expr default_function_array_read_conversion (location_t, 549*e4b17023SJohn Marino struct c_expr); 550*e4b17023SJohn Marino extern void mark_exp_read (tree); 551*e4b17023SJohn Marino extern tree composite_type (tree, tree); 552*e4b17023SJohn Marino extern tree build_component_ref (location_t, tree, tree); 553*e4b17023SJohn Marino extern tree build_array_ref (location_t, tree, tree); 554*e4b17023SJohn Marino extern tree build_external_ref (location_t, tree, int, tree *); 555*e4b17023SJohn Marino extern void pop_maybe_used (bool); 556*e4b17023SJohn Marino extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr); 557*e4b17023SJohn Marino extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *); 558*e4b17023SJohn Marino extern struct c_expr parser_build_unary_op (location_t, enum tree_code, 559*e4b17023SJohn Marino struct c_expr); 560*e4b17023SJohn Marino extern struct c_expr parser_build_binary_op (location_t, 561*e4b17023SJohn Marino enum tree_code, struct c_expr, 562*e4b17023SJohn Marino struct c_expr); 563*e4b17023SJohn Marino extern tree build_conditional_expr (location_t, tree, bool, tree, tree, 564*e4b17023SJohn Marino tree, tree); 565*e4b17023SJohn Marino extern tree build_compound_expr (location_t, tree, tree); 566*e4b17023SJohn Marino extern tree c_cast_expr (location_t, struct c_type_name *, tree); 567*e4b17023SJohn Marino extern tree build_c_cast (location_t, tree, tree); 568*e4b17023SJohn Marino extern void store_init_value (location_t, tree, tree, tree); 569*e4b17023SJohn Marino extern void error_init (const char *); 570*e4b17023SJohn Marino extern void pedwarn_init (location_t, int opt, const char *); 571*e4b17023SJohn Marino extern void maybe_warn_string_init (tree, struct c_expr); 572*e4b17023SJohn Marino extern void start_init (tree, tree, int); 573*e4b17023SJohn Marino extern void finish_init (void); 574*e4b17023SJohn Marino extern void really_start_incremental_init (tree); 575*e4b17023SJohn Marino extern void push_init_level (int, struct obstack *); 576*e4b17023SJohn Marino extern struct c_expr pop_init_level (int, struct obstack *); 577*e4b17023SJohn Marino extern void set_init_index (tree, tree, struct obstack *); 578*e4b17023SJohn Marino extern void set_init_label (tree, struct obstack *); 579*e4b17023SJohn Marino extern void process_init_element (struct c_expr, bool, struct obstack *); 580*e4b17023SJohn Marino extern tree build_compound_literal (location_t, tree, tree, bool); 581*e4b17023SJohn Marino extern void check_compound_literal_type (location_t, struct c_type_name *); 582*e4b17023SJohn Marino extern tree c_start_case (location_t, location_t, tree); 583*e4b17023SJohn Marino extern void c_finish_case (tree); 584*e4b17023SJohn Marino extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool); 585*e4b17023SJohn Marino extern tree build_asm_stmt (tree, tree); 586*e4b17023SJohn Marino extern int c_types_compatible_p (tree, tree); 587*e4b17023SJohn Marino extern tree c_begin_compound_stmt (bool); 588*e4b17023SJohn Marino extern tree c_end_compound_stmt (location_t, tree, bool); 589*e4b17023SJohn Marino extern void c_finish_if_stmt (location_t, tree, tree, tree, bool); 590*e4b17023SJohn Marino extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool); 591*e4b17023SJohn Marino extern tree c_begin_stmt_expr (void); 592*e4b17023SJohn Marino extern tree c_finish_stmt_expr (location_t, tree); 593*e4b17023SJohn Marino extern tree c_process_expr_stmt (location_t, tree); 594*e4b17023SJohn Marino extern tree c_finish_expr_stmt (location_t, tree); 595*e4b17023SJohn Marino extern tree c_finish_return (location_t, tree, tree); 596*e4b17023SJohn Marino extern tree c_finish_bc_stmt (location_t, tree *, bool); 597*e4b17023SJohn Marino extern tree c_finish_goto_label (location_t, tree); 598*e4b17023SJohn Marino extern tree c_finish_goto_ptr (location_t, tree); 599*e4b17023SJohn Marino extern tree c_expr_to_decl (tree, bool *, bool *); 600*e4b17023SJohn Marino extern tree c_begin_omp_parallel (void); 601*e4b17023SJohn Marino extern tree c_finish_omp_parallel (location_t, tree, tree); 602*e4b17023SJohn Marino extern tree c_begin_omp_task (void); 603*e4b17023SJohn Marino extern tree c_finish_omp_task (location_t, tree, tree); 604*e4b17023SJohn Marino extern tree c_finish_omp_clauses (tree); 605*e4b17023SJohn Marino extern tree c_build_va_arg (location_t, tree, tree); 606*e4b17023SJohn Marino extern tree c_finish_transaction (location_t, tree, int); 607*e4b17023SJohn Marino extern tree c_build_vec_perm_expr (location_t, tree, tree, tree); 608*e4b17023SJohn Marino 609*e4b17023SJohn Marino /* Set to 0 at beginning of a function definition, set to 1 if 610*e4b17023SJohn Marino a return statement that specifies a return value is seen. */ 611*e4b17023SJohn Marino 612*e4b17023SJohn Marino extern int current_function_returns_value; 613*e4b17023SJohn Marino 614*e4b17023SJohn Marino /* Set to 0 at beginning of a function definition, set to 1 if 615*e4b17023SJohn Marino a return statement with no argument is seen. */ 616*e4b17023SJohn Marino 617*e4b17023SJohn Marino extern int current_function_returns_null; 618*e4b17023SJohn Marino 619*e4b17023SJohn Marino /* Set to 0 at beginning of a function definition, set to 1 if 620*e4b17023SJohn Marino a call to a noreturn function is seen. */ 621*e4b17023SJohn Marino 622*e4b17023SJohn Marino extern int current_function_returns_abnormally; 623*e4b17023SJohn Marino 624*e4b17023SJohn Marino /* Nonzero means we are reading code that came from a system header file. */ 625*e4b17023SJohn Marino 626*e4b17023SJohn Marino extern int system_header_p; 627*e4b17023SJohn Marino 628*e4b17023SJohn Marino /* In c-decl.c */ 629*e4b17023SJohn Marino extern void c_finish_incomplete_decl (tree); 630*e4b17023SJohn Marino extern void c_write_global_declarations (void); 631*e4b17023SJohn Marino 632*e4b17023SJohn Marino /* In c-errors.c */ 633*e4b17023SJohn Marino extern void pedwarn_c90 (location_t, int opt, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4); 634*e4b17023SJohn Marino extern void pedwarn_c99 (location_t, int opt, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4); 635*e4b17023SJohn Marino 636*e4b17023SJohn Marino #endif /* ! GCC_C_TREE_H */ 637