c-tree.h revision 1.7
1247738Sbapt/* Definitions for C parsing and type checking.
2247738Sbapt   Copyright (C) 1987-2017 Free Software Foundation, Inc.
3247738Sbapt
4247738SbaptThis file is part of GCC.
5247738Sbapt
6247738SbaptGCC is free software; you can redistribute it and/or modify it under
7247738Sbaptthe terms of the GNU General Public License as published by the Free
8247738SbaptSoftware Foundation; either version 3, or (at your option) any later
9247738Sbaptversion.
10247738Sbapt
11247738SbaptGCC is distributed in the hope that it will be useful, but WITHOUT ANY
12247738SbaptWARRANTY; without even the implied warranty of MERCHANTABILITY or
13247738SbaptFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14247738Sbaptfor more details.
15247738Sbapt
16247738SbaptYou should have received a copy of the GNU General Public License
17247738Sbaptalong with GCC; see the file COPYING3.  If not see
18247738Sbapt<http://www.gnu.org/licenses/>.  */
19247738Sbapt
20247738Sbapt#ifndef GCC_C_TREE_H
21247738Sbapt#define GCC_C_TREE_H
22247738Sbapt
23247738Sbapt#include "c-family/c-common.h"
24247738Sbapt#include "diagnostic.h"
25247738Sbapt
26247738Sbapt/* struct lang_identifier is private to c-decl.c, but langhooks.c needs to
27247738Sbapt   know how big it is.  This is sanity-checked in c-decl.c.  */
28247738Sbapt#define C_SIZEOF_STRUCT_LANG_IDENTIFIER \
29247738Sbapt  (sizeof (struct c_common_identifier) + 3 * sizeof (void *))
30247738Sbapt
31247738Sbapt/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only.  */
32247738Sbapt#define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1 (TYPE)
33247738Sbapt
34247738Sbapt/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is volatile.  */
35247738Sbapt#define C_TYPE_FIELDS_VOLATILE(TYPE) TREE_LANG_FLAG_2 (TYPE)
36247738Sbapt
37247738Sbapt/* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE
38247738Sbapt   nonzero if the definition of the type has already started.  */
39247738Sbapt#define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE)
40247738Sbapt
41247738Sbapt/* In an incomplete RECORD_TYPE or UNION_TYPE, a list of variable
42247738Sbapt   declarations whose type would be completed by completing that type.  */
43247738Sbapt#define C_TYPE_INCOMPLETE_VARS(TYPE) TYPE_VFIELD (TYPE)
44247738Sbapt
45247738Sbapt/* In an IDENTIFIER_NODE, nonzero if this identifier is actually a
46247738Sbapt   keyword.  C_RID_CODE (node) is then the RID_* value of the keyword.  */
47247738Sbapt#define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID)
48247738Sbapt
49247738Sbapt/* Record whether a type or decl was written with nonconstant size.
50247738Sbapt   Note that TYPE_SIZE may have simplified to a constant.  */
51247738Sbapt#define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE)
52247738Sbapt#define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE)
53247738Sbapt
54247738Sbapt/* Record whether a type is defined inside a struct or union type.
55247738Sbapt   This is used for -Wc++-compat. */
56247738Sbapt#define C_TYPE_DEFINED_IN_STRUCT(TYPE) TYPE_LANG_FLAG_2 (TYPE)
57247738Sbapt
58247738Sbapt/* Record whether an "incomplete type" error was given for the type.  */
59247738Sbapt#define C_TYPE_ERROR_REPORTED(TYPE) TYPE_LANG_FLAG_3 (TYPE)
60247738Sbapt
61247738Sbapt/* Record whether a typedef for type `int' was actually `signed int'.  */
62247738Sbapt#define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
63247738Sbapt
64247738Sbapt/* For a FUNCTION_DECL, nonzero if it was defined without an explicit
65247738Sbapt   return type.  */
66247738Sbapt#define C_FUNCTION_IMPLICIT_INT(EXP) DECL_LANG_FLAG_1 (EXP)
67247738Sbapt
68247738Sbapt/* For a FUNCTION_DECL, nonzero if it was an implicit declaration.  */
69247738Sbapt#define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP)
70247738Sbapt
71247738Sbapt/* For a PARM_DECL, nonzero if it was declared as an array.  */
72247738Sbapt#define C_ARRAY_PARAMETER(NODE) DECL_LANG_FLAG_0 (NODE)
73247738Sbapt
74247738Sbapt/* For FUNCTION_DECLs, evaluates true if the decl is built-in but has
75247738Sbapt   been declared.  */
76247738Sbapt#define C_DECL_DECLARED_BUILTIN(EXP)		\
77247738Sbapt  DECL_LANG_FLAG_3 (FUNCTION_DECL_CHECK (EXP))
78247738Sbapt
79247738Sbapt/* For FUNCTION_DECLs, evaluates true if the decl is built-in, has a
80247738Sbapt   built-in prototype and does not have a non-built-in prototype.  */
81247738Sbapt#define C_DECL_BUILTIN_PROTOTYPE(EXP)		\
82247738Sbapt  DECL_LANG_FLAG_6 (FUNCTION_DECL_CHECK (EXP))
83247738Sbapt
84247738Sbapt/* Record whether a decl was declared register.  This is strictly a
85247738Sbapt   front-end flag, whereas DECL_REGISTER is used for code generation;
86247738Sbapt   they may differ for structures with volatile fields.  */
87247738Sbapt#define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4 (EXP)
88247738Sbapt
89247738Sbapt/* Record whether a decl was used in an expression anywhere except an
90247738Sbapt   unevaluated operand of sizeof / typeof / alignof.  This is only
91247738Sbapt   used for functions declared static but not defined, though outside
92247738Sbapt   sizeof and typeof it is set for other function decls as well.  */
93247738Sbapt#define C_DECL_USED(EXP) DECL_LANG_FLAG_5 (FUNCTION_DECL_CHECK (EXP))
94247738Sbapt
95247738Sbapt/* Record whether a variable has been declared threadprivate by
96247738Sbapt   #pragma omp threadprivate.  */
97247738Sbapt#define C_DECL_THREADPRIVATE_P(DECL) DECL_LANG_FLAG_3 (VAR_DECL_CHECK (DECL))
98247738Sbapt
99247738Sbapt/* Nonzero for a decl which either doesn't exist or isn't a prototype.
100247738Sbapt   N.B. Could be simplified if all built-in decls had complete prototypes
101247738Sbapt   (but this is presently difficult because some of them need FILE*).  */
102247738Sbapt#define C_DECL_ISNT_PROTOTYPE(EXP)			\
103247738Sbapt       (EXP == 0					\
104247738Sbapt	|| (!prototype_p (TREE_TYPE (EXP))	\
105247738Sbapt	    && !DECL_BUILT_IN (EXP)))
106247738Sbapt
107247738Sbapt/* For FUNCTION_TYPE, a hidden list of types of arguments.  The same as
108247738Sbapt   TYPE_ARG_TYPES for functions with prototypes, but created for functions
109247738Sbapt   without prototypes.  */
110247738Sbapt#define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_LANG_SLOT_1 (NODE)
111247738Sbapt
112247738Sbapt/* For a CONSTRUCTOR, whether some initializer contains a
113247738Sbapt   subexpression meaning it is not a constant expression.  */
114247738Sbapt#define CONSTRUCTOR_NON_CONST(EXPR) TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK (EXPR))
115247738Sbapt
116247738Sbapt/* Record parser information about an expression that is irrelevant
117247738Sbapt   for code generation alongside a tree representing its value.  */
118247738Sbaptstruct c_expr
119247738Sbapt{
120247738Sbapt  /* The value of the expression.  */
121247738Sbapt  tree value;
122247738Sbapt  /* Record the original unary/binary operator of an expression, which may
123247738Sbapt     have been changed by fold, STRING_CST for unparenthesized string
124247738Sbapt     constants, C_MAYBE_CONST_EXPR for __builtin_constant_p calls
125247738Sbapt     (even if parenthesized), for subexpressions, and for non-constant
126247738Sbapt     initializers, or ERROR_MARK for other expressions (including
127247738Sbapt     parenthesized expressions).  */
128247738Sbapt  enum tree_code original_code;
129247738Sbapt  /* If not NULL, the original type of an expression.  This will
130247738Sbapt     differ from the type of the value field for an enum constant.
131247738Sbapt     The type of an enum constant is a plain integer type, but this
132247738Sbapt     field will be the enum type.  */
133247738Sbapt  tree original_type;
134247738Sbapt
135247738Sbapt  /* The source range of this expression.  This is redundant
136247738Sbapt     for node values that have locations, but not all node kinds
137247738Sbapt     have locations (e.g. constants, and references to params, locals,
138247738Sbapt     etc), so we stash a copy here.  */
139247738Sbapt  source_range src_range;
140247738Sbapt
141247738Sbapt  /* Access to the first and last locations within the source spelling
142247738Sbapt     of this expression.  */
143247738Sbapt  location_t get_start () const { return src_range.m_start; }
144247738Sbapt  location_t get_finish () const { return src_range.m_finish; }
145247738Sbapt
146247738Sbapt  /* Set the value to error_mark_node whilst ensuring that src_range
147247738Sbapt     is initialized.  */
148247738Sbapt  void set_error ()
149247738Sbapt  {
150247738Sbapt    value = error_mark_node;
151247738Sbapt    src_range.m_start = UNKNOWN_LOCATION;
152247738Sbapt    src_range.m_finish = UNKNOWN_LOCATION;
153247738Sbapt  }
154247738Sbapt};
155247738Sbapt
156247738Sbapt/* Type alias for struct c_expr. This allows to use the structure
157247738Sbapt   inside the VEC types.  */
158247738Sbapttypedef struct c_expr c_expr_t;
159247738Sbapt
160247738Sbapt/* A kind of type specifier.  Note that this information is currently
161247738Sbapt   only used to distinguish tag definitions, tag references and typeof
162247738Sbapt   uses.  */
163247738Sbaptenum c_typespec_kind {
164247738Sbapt  /* No typespec.  This appears only in struct c_declspec.  */
165247738Sbapt  ctsk_none,
166247738Sbapt  /* A reserved keyword type specifier.  */
167247738Sbapt  ctsk_resword,
168247738Sbapt  /* A reference to a tag, previously declared, such as "struct foo".
169247738Sbapt     This includes where the previous declaration was as a different
170247738Sbapt     kind of tag, in which case this is only valid if shadowing that
171247738Sbapt     tag in an inner scope.  */
172247738Sbapt  ctsk_tagref,
173247738Sbapt  /* A reference to a tag, not previously declared in a visible
174247738Sbapt     scope.  */
175247738Sbapt  ctsk_tagfirstref,
176247738Sbapt  /* A definition of a tag such as "struct foo { int a; }".  */
177247738Sbapt  ctsk_tagdef,
178247738Sbapt  /* A typedef name.  */
179247738Sbapt  ctsk_typedef,
180247738Sbapt  /* An ObjC-specific kind of type specifier.  */
181247738Sbapt  ctsk_objc,
182247738Sbapt  /* A typeof specifier, or _Atomic ( type-name ).  */
183247738Sbapt  ctsk_typeof
184247738Sbapt};
185247738Sbapt
186247738Sbapt/* A type specifier: this structure is created in the parser and
187247738Sbapt   passed to declspecs_add_type only.  */
188247738Sbaptstruct c_typespec {
189247738Sbapt  /* What kind of type specifier this is.  */
190247738Sbapt  enum c_typespec_kind kind;
191247738Sbapt  /* Whether the expression has operands suitable for use in constant
192247738Sbapt     expressions.  */
193247738Sbapt  bool expr_const_operands;
194247738Sbapt  /* The specifier itself.  */
195247738Sbapt  tree spec;
196247738Sbapt  /* An expression to be evaluated before the type specifier, in the
197247738Sbapt     case of typeof specifiers, or NULL otherwise or if no such
198247738Sbapt     expression is required for a particular typeof specifier.  In
199247738Sbapt     particular, when typeof is applied to an expression of variably
200247738Sbapt     modified type, that expression must be evaluated in order to
201247738Sbapt     determine array sizes that form part of the type, but the
202247738Sbapt     expression itself (as opposed to the array sizes) forms no part
203247738Sbapt     of the type and so needs to be recorded separately.  */
204247738Sbapt  tree expr;
205247738Sbapt};
206247738Sbapt
207247738Sbapt/* A storage class specifier.  */
208247738Sbaptenum c_storage_class {
209247738Sbapt  csc_none,
210247738Sbapt  csc_auto,
211247738Sbapt  csc_extern,
212247738Sbapt  csc_register,
213247738Sbapt  csc_static,
214247738Sbapt  csc_typedef
215247738Sbapt};
216247738Sbapt
217247738Sbapt/* A type specifier keyword "void", "_Bool", "char", "int", "float",
218247738Sbapt   "double", "_Decimal32", "_Decimal64", "_Decimal128", "_Fract", "_Accum",
219247738Sbapt   or none of these.  */
220247738Sbaptenum c_typespec_keyword {
221247738Sbapt  cts_none,
222247738Sbapt  cts_void,
223247738Sbapt  cts_bool,
224247738Sbapt  cts_char,
225247738Sbapt  cts_int,
226247738Sbapt  cts_float,
227247738Sbapt  cts_int_n,
228247738Sbapt  cts_double,
229247738Sbapt  cts_dfloat32,
230247738Sbapt  cts_dfloat64,
231247738Sbapt  cts_dfloat128,
232247738Sbapt  cts_floatn_nx,
233247738Sbapt  cts_fract,
234247738Sbapt  cts_accum,
235247738Sbapt  cts_auto_type
236247738Sbapt};
237247738Sbapt
238247738Sbapt/* This enum lists all the possible declarator specifiers, storage
239247738Sbapt   class or attribute that a user can write.  There is at least one
240247738Sbapt   enumerator per possible declarator specifier in the struct
241247738Sbapt   c_declspecs below.
242247738Sbapt
243247738Sbapt   It is used to index the array of declspec locations in struct
244247738Sbapt   c_declspecs.  */
245247738Sbaptenum c_declspec_word {
246247738Sbapt  cdw_typespec /* A catch-all for a typespec.  */,
247247738Sbapt  cdw_storage_class  /* A catch-all for a storage class */,
248247738Sbapt  cdw_attributes,
249247738Sbapt  cdw_typedef,
250247738Sbapt  cdw_explicit_signed,
251247738Sbapt  cdw_deprecated,
252247738Sbapt  cdw_default_int,
253247738Sbapt  cdw_long,
254247738Sbapt  cdw_long_long,
255247738Sbapt  cdw_short,
256247738Sbapt  cdw_signed,
257247738Sbapt  cdw_unsigned,
258247738Sbapt  cdw_complex,
259247738Sbapt  cdw_inline,
260247738Sbapt  cdw_noreturn,
261247738Sbapt  cdw_thread,
262247738Sbapt  cdw_const,
263247738Sbapt  cdw_volatile,
264247738Sbapt  cdw_restrict,
265247738Sbapt  cdw_atomic,
266247738Sbapt  cdw_saturating,
267247738Sbapt  cdw_alignas,
268247738Sbapt  cdw_address_space,
269247738Sbapt  cdw_gimple,
270247738Sbapt  cdw_rtl,
271247738Sbapt  cdw_number_of_elements /* This one must always be the last
272247738Sbapt			    enumerator.  */
273247738Sbapt};
274247738Sbapt
275247738Sbapt/* A sequence of declaration specifiers in C.  When a new declaration
276247738Sbapt   specifier is added, please update the enum c_declspec_word above
277247738Sbapt   accordingly.  */
278247738Sbaptstruct c_declspecs {
279247738Sbapt  source_location locations[cdw_number_of_elements];
280247738Sbapt  /* The type specified, if a single type specifier such as a struct,
281247738Sbapt     union or enum specifier, typedef name or typeof specifies the
282247738Sbapt     whole type, or NULL_TREE if none or a keyword such as "void" or
283247738Sbapt     "char" is used.  Does not include qualifiers.  */
284247738Sbapt  tree type;
285247738Sbapt  /* Any expression to be evaluated before the type, from a typeof
286247738Sbapt     specifier.  */
287247738Sbapt  tree expr;
288247738Sbapt  /* The attributes from a typedef decl.  */
289247738Sbapt  tree decl_attr;
290247738Sbapt  /* When parsing, the attributes.  Outside the parser, this will be
291247738Sbapt     NULL; attributes (possibly from multiple lists) will be passed
292247738Sbapt     separately.  */
293247738Sbapt  tree attrs;
294247738Sbapt  /* The pass to start compiling a __GIMPLE or __RTL function with.  */
295247738Sbapt  char *gimple_or_rtl_pass;
296247738Sbapt  /* The base-2 log of the greatest alignment required by an _Alignas
297247738Sbapt     specifier, in bytes, or -1 if no such specifiers with nonzero
298247738Sbapt     alignment.  */
299247738Sbapt  int align_log;
300247738Sbapt  /* For the __intN declspec, this stores the index into the int_n_* arrays.  */
301247738Sbapt  int int_n_idx;
302247738Sbapt  /* For the _FloatN and _FloatNx declspec, this stores the index into
303247738Sbapt     the floatn_nx_types array.  */
304247738Sbapt  int floatn_nx_idx;
305247738Sbapt  /* The storage class specifier, or csc_none if none.  */
306247738Sbapt  enum c_storage_class storage_class;
307247738Sbapt  /* Any type specifier keyword used such as "int", not reflecting
308247738Sbapt     modifiers such as "short", or cts_none if none.  */
309247738Sbapt  ENUM_BITFIELD (c_typespec_keyword) typespec_word : 8;
310247738Sbapt  /* The kind of type specifier if one has been seen, ctsk_none
311247738Sbapt     otherwise.  */
312247738Sbapt  ENUM_BITFIELD (c_typespec_kind) typespec_kind : 3;
313247738Sbapt  /* Whether any expressions in typeof specifiers may appear in
314247738Sbapt     constant expressions.  */
315247738Sbapt  BOOL_BITFIELD expr_const_operands : 1;
316247738Sbapt  /* Whether any declaration specifiers have been seen at all.  */
317247738Sbapt  BOOL_BITFIELD declspecs_seen_p : 1;
318247738Sbapt  /* Whether something other than a storage class specifier or
319247738Sbapt     attribute has been seen.  This is used to warn for the
320247738Sbapt     obsolescent usage of storage class specifiers other than at the
321247738Sbapt     start of the list.  (Doing this properly would require function
322247738Sbapt     specifiers to be handled separately from storage class
323247738Sbapt     specifiers.)  */
324247738Sbapt  BOOL_BITFIELD non_sc_seen_p : 1;
325247738Sbapt  /* Whether the type is specified by a typedef or typeof name.  */
326247738Sbapt  BOOL_BITFIELD typedef_p : 1;
327247738Sbapt  /* Whether the type is explicitly "signed" or specified by a typedef
328247738Sbapt     whose type is explicitly "signed".  */
329247738Sbapt  BOOL_BITFIELD explicit_signed_p : 1;
330247738Sbapt  /* Whether the specifiers include a deprecated typedef.  */
331247738Sbapt  BOOL_BITFIELD deprecated_p : 1;
332247738Sbapt  /* Whether the type defaulted to "int" because there were no type
333247738Sbapt     specifiers.  */
334247738Sbapt  BOOL_BITFIELD default_int_p : 1;
335247738Sbapt  /* Whether "long" was specified.  */
336247738Sbapt  BOOL_BITFIELD long_p : 1;
337247738Sbapt  /* Whether "long" was specified more than once.  */
338247738Sbapt  BOOL_BITFIELD long_long_p : 1;
339247738Sbapt  /* Whether "short" was specified.  */
340247738Sbapt  BOOL_BITFIELD short_p : 1;
341247738Sbapt  /* Whether "signed" was specified.  */
342247738Sbapt  BOOL_BITFIELD signed_p : 1;
343247738Sbapt  /* Whether "unsigned" was specified.  */
344247738Sbapt  BOOL_BITFIELD unsigned_p : 1;
345247738Sbapt  /* Whether "complex" was specified.  */
346247738Sbapt  BOOL_BITFIELD complex_p : 1;
347247738Sbapt  /* Whether "inline" was specified.  */
348247738Sbapt  BOOL_BITFIELD inline_p : 1;
349247738Sbapt  /* Whether "_Noreturn" was speciied.  */
350247738Sbapt  BOOL_BITFIELD noreturn_p : 1;
351247738Sbapt  /* Whether "__thread" or "_Thread_local" was specified.  */
352247738Sbapt  BOOL_BITFIELD thread_p : 1;
353247738Sbapt  /* Whether "__thread" rather than "_Thread_local" was specified.  */
354247738Sbapt  BOOL_BITFIELD thread_gnu_p : 1;
355247738Sbapt  /* Whether "const" was specified.  */
356247738Sbapt  BOOL_BITFIELD const_p : 1;
357247738Sbapt  /* Whether "volatile" was specified.  */
358247738Sbapt  BOOL_BITFIELD volatile_p : 1;
359247738Sbapt  /* Whether "restrict" was specified.  */
360247738Sbapt  BOOL_BITFIELD restrict_p : 1;
361247738Sbapt  /* Whether "_Atomic" was specified.  */
362247738Sbapt  BOOL_BITFIELD atomic_p : 1;
363247738Sbapt  /* Whether "_Sat" was specified.  */
364247738Sbapt  BOOL_BITFIELD saturating_p : 1;
365247738Sbapt  /* Whether any alignment specifier (even with zero alignment) was
366247738Sbapt     specified.  */
367247738Sbapt  BOOL_BITFIELD alignas_p : 1;
368247738Sbapt  /* Whether any __GIMPLE specifier was specified.  */
369247738Sbapt  BOOL_BITFIELD gimple_p : 1;
370247738Sbapt  /* Whether any __RTL specifier was specified.  */
371247738Sbapt  BOOL_BITFIELD rtl_p : 1;
372247738Sbapt  /* The address space that the declaration belongs to.  */
373247738Sbapt  addr_space_t address_space;
374247738Sbapt};
375247738Sbapt
376247738Sbapt/* The various kinds of declarators in C.  */
377enum c_declarator_kind {
378  /* An identifier.  */
379  cdk_id,
380  /* A function.  */
381  cdk_function,
382  /* An array.  */
383  cdk_array,
384  /* A pointer.  */
385  cdk_pointer,
386  /* Parenthesized declarator with nested attributes.  */
387  cdk_attrs
388};
389
390struct c_arg_tag {
391  /* The argument name.  */
392  tree id;
393  /* The type of the argument.  */
394  tree type;
395};
396
397
398/* Information about the parameters in a function declarator.  */
399struct c_arg_info {
400  /* A list of parameter decls.  */
401  tree parms;
402  /* A list of structure, union and enum tags defined.  */
403  vec<c_arg_tag, va_gc> *tags;
404  /* A list of argument types to go in the FUNCTION_TYPE.  */
405  tree types;
406  /* A list of non-parameter decls (notably enumeration constants)
407     defined with the parameters.  */
408  tree others;
409  /* A compound expression of VLA sizes from the parameters, or NULL.
410     In a function definition, these are used to ensure that
411     side-effects in sizes of arrays converted to pointers (such as a
412     parameter int i[n++]) take place; otherwise, they are
413     ignored.  */
414  tree pending_sizes;
415  /* True when these arguments had [*].  */
416  BOOL_BITFIELD had_vla_unspec : 1;
417};
418
419/* A declarator.  */
420struct c_declarator {
421  /* The kind of declarator.  */
422  enum c_declarator_kind kind;
423  location_t id_loc; /* Currently only set for cdk_id, cdk_array. */
424  /* Except for cdk_id, the contained declarator.  For cdk_id, NULL.  */
425  struct c_declarator *declarator;
426  union {
427    /* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract
428       declarator.  */
429    tree id;
430    /* For functions.  */
431    struct c_arg_info *arg_info;
432    /* For arrays.  */
433    struct {
434      /* The array dimension, or NULL for [] and [*].  */
435      tree dimen;
436      /* The qualifiers inside [].  */
437      int quals;
438      /* The attributes (currently ignored) inside [].  */
439      tree attrs;
440      /* Whether [static] was used.  */
441      BOOL_BITFIELD static_p : 1;
442      /* Whether [*] was used.  */
443      BOOL_BITFIELD vla_unspec_p : 1;
444    } array;
445    /* For pointers, the qualifiers on the pointer type.  */
446    int pointer_quals;
447    /* For attributes.  */
448    tree attrs;
449  } u;
450};
451
452/* A type name.  */
453struct c_type_name {
454  /* The declaration specifiers.  */
455  struct c_declspecs *specs;
456  /* The declarator.  */
457  struct c_declarator *declarator;
458};
459
460/* A parameter.  */
461struct c_parm {
462  /* The declaration specifiers, minus any prefix attributes.  */
463  struct c_declspecs *specs;
464  /* The attributes.  */
465  tree attrs;
466  /* The declarator.  */
467  struct c_declarator *declarator;
468};
469
470/* Used when parsing an enum.  Initialized by start_enum.  */
471struct c_enum_contents
472{
473  /* While defining an enum type, this is 1 plus the last enumerator
474     constant value.  */
475  tree enum_next_value;
476
477  /* Nonzero means that there was overflow computing enum_next_value.  */
478  int enum_overflow;
479};
480
481/* A type of reference to a static identifier in an inline
482   function.  */
483enum c_inline_static_type {
484  /* Identifier with internal linkage used in function that may be an
485     inline definition (i.e., file-scope static).  */
486  csi_internal,
487  /* Modifiable object with static storage duration defined in
488     function that may be an inline definition (i.e., local
489     static).  */
490  csi_modifiable
491};
492
493
494/* in c-parser.c */
495extern void c_parse_init (void);
496extern bool c_keyword_starts_typename (enum rid keyword);
497
498/* in c-aux-info.c */
499extern void gen_aux_info_record (tree, int, int, int);
500
501/* in c-decl.c */
502struct c_spot_bindings;
503struct c_struct_parse_info;
504extern struct obstack parser_obstack;
505extern tree c_break_label;
506extern tree c_cont_label;
507
508extern bool global_bindings_p (void);
509extern void push_scope (void);
510extern tree pop_scope (void);
511extern void c_bindings_start_stmt_expr (struct c_spot_bindings *);
512extern void c_bindings_end_stmt_expr (struct c_spot_bindings *);
513
514extern void record_inline_static (location_t, tree, tree,
515				  enum c_inline_static_type);
516extern void c_init_decl_processing (void);
517extern void c_print_identifier (FILE *, tree, int);
518extern int quals_from_declspecs (const struct c_declspecs *);
519extern struct c_declarator *build_array_declarator (location_t, tree,
520    						    struct c_declspecs *,
521						    bool, bool);
522extern tree build_enumerator (location_t, location_t, struct c_enum_contents *,
523			      tree, tree);
524extern tree check_for_loop_decls (location_t, bool);
525extern void mark_forward_parm_decls (void);
526extern void declare_parm_level (void);
527extern void undeclared_variable (location_t, tree);
528extern tree lookup_label_for_goto (location_t, tree);
529extern tree declare_label (tree);
530extern tree define_label (location_t, tree);
531extern struct c_spot_bindings *c_get_switch_bindings (void);
532extern void c_release_switch_bindings (struct c_spot_bindings *);
533extern bool c_check_switch_jump_warnings (struct c_spot_bindings *,
534					  location_t, location_t);
535extern void finish_decl (tree, location_t, tree, tree, tree);
536extern tree finish_enum (tree, tree, tree);
537extern void finish_function (void);
538extern tree finish_struct (location_t, tree, tree, tree,
539			   struct c_struct_parse_info *);
540extern struct c_arg_info *build_arg_info (void);
541extern struct c_arg_info *get_parm_info (bool, tree);
542extern tree grokfield (location_t, struct c_declarator *,
543		       struct c_declspecs *, tree, tree *);
544extern tree groktypename (struct c_type_name *, tree *, bool *);
545extern tree grokparm (const struct c_parm *, tree *);
546extern tree implicitly_declare (location_t, tree);
547extern void keep_next_level (void);
548extern void pending_xref_error (void);
549extern void c_push_function_context (void);
550extern void c_pop_function_context (void);
551extern void push_parm_decl (const struct c_parm *, tree *);
552extern struct c_declarator *set_array_declarator_inner (struct c_declarator *,
553							struct c_declarator *);
554extern tree c_builtin_function (tree);
555extern tree c_builtin_function_ext_scope (tree);
556extern void shadow_tag (const struct c_declspecs *);
557extern void shadow_tag_warned (const struct c_declspecs *, int);
558extern tree start_enum (location_t, struct c_enum_contents *, tree);
559extern int  start_function (struct c_declspecs *, struct c_declarator *, tree);
560extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool,
561			tree);
562extern tree start_struct (location_t, enum tree_code, tree,
563			  struct c_struct_parse_info **);
564extern void store_parm_decls (void);
565extern void store_parm_decls_from (struct c_arg_info *);
566extern void temp_store_parm_decls (tree, tree);
567extern void temp_pop_parm_decls (void);
568extern tree xref_tag (enum tree_code, tree);
569extern struct c_typespec parser_xref_tag (location_t, enum tree_code, tree);
570extern struct c_parm *build_c_parm (struct c_declspecs *, tree,
571				    struct c_declarator *);
572extern struct c_declarator *build_attrs_declarator (tree,
573						    struct c_declarator *);
574extern struct c_declarator *build_function_declarator (struct c_arg_info *,
575						       struct c_declarator *);
576extern struct c_declarator *build_id_declarator (tree);
577extern struct c_declarator *make_pointer_declarator (struct c_declspecs *,
578						     struct c_declarator *);
579extern struct c_declspecs *build_null_declspecs (void);
580extern struct c_declspecs *declspecs_add_qual (source_location,
581					       struct c_declspecs *, tree);
582extern struct c_declspecs *declspecs_add_type (location_t,
583					       struct c_declspecs *,
584					       struct c_typespec);
585extern struct c_declspecs *declspecs_add_scspec (source_location,
586						 struct c_declspecs *, tree);
587extern struct c_declspecs *declspecs_add_attrs (source_location,
588						struct c_declspecs *, tree);
589extern struct c_declspecs *declspecs_add_addrspace (source_location,
590						    struct c_declspecs *,
591						    addr_space_t);
592extern struct c_declspecs *declspecs_add_alignas (source_location,
593						  struct c_declspecs *, tree);
594extern struct c_declspecs *finish_declspecs (struct c_declspecs *);
595
596/* in c-objc-common.c */
597extern bool c_objc_common_init (void);
598extern bool c_missing_noreturn_ok_p (tree);
599extern bool c_warn_unused_global_decl (const_tree);
600extern void c_initialize_diagnostics (diagnostic_context *);
601extern bool c_vla_unspec_p (tree x, tree fn);
602
603/* in c-typeck.c */
604extern int in_alignof;
605extern int in_sizeof;
606extern int in_typeof;
607
608extern tree c_last_sizeof_arg;
609
610extern struct c_switch *c_switch_stack;
611
612extern tree c_objc_common_truthvalue_conversion (location_t, tree);
613extern tree require_complete_type (location_t, tree);
614extern int same_translation_unit_p (const_tree, const_tree);
615extern int comptypes (tree, tree);
616extern int comptypes_check_different_types (tree, tree, bool *);
617extern bool c_vla_type_p (const_tree);
618extern bool c_mark_addressable (tree, bool = false);
619extern void c_incomplete_type_error (location_t, const_tree, const_tree);
620extern tree c_type_promotes_to (tree);
621extern struct c_expr default_function_array_conversion (location_t,
622							struct c_expr);
623extern struct c_expr default_function_array_read_conversion (location_t,
624							     struct c_expr);
625extern struct c_expr convert_lvalue_to_rvalue (location_t, struct c_expr,
626					       bool, bool);
627extern void mark_exp_read (tree);
628extern tree composite_type (tree, tree);
629extern tree build_component_ref (location_t, tree, tree, location_t);
630extern tree build_array_ref (location_t, tree, tree);
631extern tree build_external_ref (location_t, tree, int, tree *);
632extern void pop_maybe_used (bool);
633extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr);
634extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *);
635extern struct c_expr parser_build_unary_op (location_t, enum tree_code,
636    					    struct c_expr);
637extern struct c_expr parser_build_binary_op (location_t,
638    					     enum tree_code, struct c_expr,
639					     struct c_expr);
640extern tree build_conditional_expr (location_t, tree, bool, tree, tree,
641				    tree, tree);
642extern tree build_compound_expr (location_t, tree, tree);
643extern tree c_cast_expr (location_t, struct c_type_name *, tree);
644extern tree build_c_cast (location_t, tree, tree);
645extern void store_init_value (location_t, tree, tree, tree);
646extern void maybe_warn_string_init (location_t, tree, struct c_expr);
647extern void start_init (tree, tree, int, rich_location *);
648extern void finish_init (void);
649extern void really_start_incremental_init (tree);
650extern void finish_implicit_inits (location_t, struct obstack *);
651extern void push_init_level (location_t, int, struct obstack *);
652extern struct c_expr pop_init_level (location_t, int, struct obstack *,
653				     location_t);
654extern void set_init_index (location_t, tree, tree, struct obstack *);
655extern void set_init_label (location_t, tree, location_t, struct obstack *);
656extern void process_init_element (location_t, struct c_expr, bool,
657				  struct obstack *);
658extern tree build_compound_literal (location_t, tree, tree, bool);
659extern void check_compound_literal_type (location_t, struct c_type_name *);
660extern tree c_start_case (location_t, location_t, tree, bool);
661extern void c_finish_case (tree, tree);
662extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool,
663			    bool);
664extern tree build_asm_stmt (bool, tree);
665extern int c_types_compatible_p (tree, tree);
666extern tree c_begin_compound_stmt (bool);
667extern tree c_end_compound_stmt (location_t, tree, bool);
668extern void c_finish_if_stmt (location_t, tree, tree, tree);
669extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool);
670extern tree c_begin_stmt_expr (void);
671extern tree c_finish_stmt_expr (location_t, tree);
672extern tree c_process_expr_stmt (location_t, tree);
673extern tree c_finish_expr_stmt (location_t, tree);
674extern tree c_finish_return (location_t, tree, tree);
675extern tree c_finish_bc_stmt (location_t, tree *, bool);
676extern tree c_finish_goto_label (location_t, tree);
677extern tree c_finish_goto_ptr (location_t, tree);
678extern tree c_expr_to_decl (tree, bool *, bool *);
679extern tree c_finish_omp_construct (location_t, enum tree_code, tree, tree);
680extern tree c_finish_oacc_data (location_t, tree, tree);
681extern tree c_finish_oacc_host_data (location_t, tree, tree);
682extern tree c_begin_omp_parallel (void);
683extern tree c_finish_omp_parallel (location_t, tree, tree);
684extern tree c_begin_omp_task (void);
685extern tree c_finish_omp_task (location_t, tree, tree);
686extern void c_finish_omp_cancel (location_t, tree);
687extern void c_finish_omp_cancellation_point (location_t, tree);
688extern tree c_finish_omp_clauses (tree, enum c_omp_region_type);
689extern tree c_build_va_arg (location_t, tree, location_t, tree);
690extern tree c_finish_transaction (location_t, tree, int);
691extern bool c_tree_equal (tree, tree);
692extern tree c_build_function_call_vec (location_t, vec<location_t>, tree,
693				       vec<tree, va_gc> *, vec<tree, va_gc> *);
694extern tree c_omp_clause_copy_ctor (tree, tree, tree);
695
696/* Set to 0 at beginning of a function definition, set to 1 if
697   a return statement that specifies a return value is seen.  */
698
699extern int current_function_returns_value;
700
701/* Set to 0 at beginning of a function definition, set to 1 if
702   a return statement with no argument is seen.  */
703
704extern int current_function_returns_null;
705
706/* Set to 0 at beginning of a function definition, set to 1 if
707   a call to a noreturn function is seen.  */
708
709extern int current_function_returns_abnormally;
710
711/* In c-decl.c */
712
713/* Tell the binding oracle what kind of binding we are looking for.  */
714
715enum c_oracle_request
716{
717  C_ORACLE_SYMBOL,
718  C_ORACLE_TAG,
719  C_ORACLE_LABEL
720};
721
722/* If this is non-NULL, then it is a "binding oracle" which can lazily
723   create bindings when needed by the C compiler.  The oracle is told
724   the name and type of the binding to create.  It can call pushdecl
725   or the like to ensure the binding is visible; or do nothing,
726   leaving the binding untouched.  c-decl.c takes note of when the
727   oracle has been called and will not call it again if it fails to
728   create a given binding.  */
729
730typedef void c_binding_oracle_function (enum c_oracle_request, tree identifier);
731
732extern c_binding_oracle_function *c_binding_oracle;
733
734extern void c_finish_incomplete_decl (tree);
735extern tree c_omp_reduction_id (enum tree_code, tree);
736extern tree c_omp_reduction_decl (tree);
737extern tree c_omp_reduction_lookup (tree, tree);
738extern tree c_check_omp_declare_reduction_r (tree *, int *, void *);
739extern void c_pushtag (location_t, tree, tree);
740extern void c_bind (location_t, tree, bool);
741extern bool tag_exists_p (enum tree_code, tree);
742
743/* In c-errors.c */
744extern bool pedwarn_c90 (location_t, int opt, const char *, ...)
745    ATTRIBUTE_GCC_DIAG(3,4);
746extern bool pedwarn_c99 (location_t, int opt, const char *, ...)
747    ATTRIBUTE_GCC_DIAG(3,4);
748
749extern void
750set_c_expr_source_range (c_expr *expr,
751			 location_t start, location_t finish);
752
753extern void
754set_c_expr_source_range (c_expr *expr,
755			 source_range src_range);
756
757/* In c-fold.c */
758extern tree decl_constant_value_for_optimization (tree);
759
760extern vec<tree> incomplete_record_decls;
761
762#endif /* ! GCC_C_TREE_H */
763