xref: /dflybsd-src/contrib/gcc-4.7/gcc/c-tree.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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