Branch data Line data Source code
1 : : /* Definitions for C parsing and type checking.
2 : : Copyright (C) 1987-2024 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify it under
7 : : the terms of the GNU General Public License as published by the Free
8 : : Software Foundation; either version 3, or (at your option) any later
9 : : version.
10 : :
11 : : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 : : WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 : : for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : #ifndef GCC_C_TREE_H
21 : : #define GCC_C_TREE_H
22 : :
23 : : #include "c-family/c-common.h"
24 : : #include "diagnostic.h"
25 : :
26 : : /* struct lang_identifier is private to c-decl.cc, but langhooks.cc needs to
27 : : know how big it is. This is sanity-checked in c-decl.cc. */
28 : : #define C_SIZEOF_STRUCT_LANG_IDENTIFIER \
29 : : (sizeof (struct c_common_identifier) + 3 * sizeof (void *))
30 : :
31 : : /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */
32 : : #define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1 (TYPE)
33 : :
34 : : /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is volatile. */
35 : : #define C_TYPE_FIELDS_VOLATILE(TYPE) TREE_LANG_FLAG_2 (TYPE)
36 : :
37 : : /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is
38 : : volatile, restrict-qualified or atomic; that is, has a type not
39 : : permitted for a constexpr object. */
40 : : #define C_TYPE_FIELDS_NON_CONSTEXPR(TYPE) TREE_LANG_FLAG_4 (TYPE)
41 : :
42 : : /* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE
43 : : nonzero if the definition of the type has already started. */
44 : : #define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE)
45 : :
46 : : /* In an incomplete RECORD_TYPE, UNION_TYPE or ENUMERAL_TYPE, a list of
47 : : variable declarations whose type would be completed by completing
48 : : that type. */
49 : : #define C_TYPE_INCOMPLETE_VARS(TYPE) \
50 : : TYPE_LANG_SLOT_1 (TREE_CHECK4 (TYPE, RECORD_TYPE, UNION_TYPE, \
51 : : QUAL_UNION_TYPE, ENUMERAL_TYPE))
52 : :
53 : : /* In an IDENTIFIER_NODE, nonzero if this identifier is actually a
54 : : keyword. C_RID_CODE (node) is then the RID_* value of the keyword. */
55 : : #define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID)
56 : :
57 : : /* Record whether a type or decl was written with nonconstant size.
58 : : Note that TYPE_SIZE may have simplified to a constant. */
59 : : #define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE)
60 : : #define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE)
61 : :
62 : : /* Record whether a type is variably modified. */
63 : : #define C_TYPE_VARIABLY_MODIFIED(TYPE) TYPE_LANG_FLAG_6 (TYPE)
64 : :
65 : :
66 : : /* Record whether a type is defined inside a struct or union type.
67 : : This is used for -Wc++-compat. */
68 : : #define C_TYPE_DEFINED_IN_STRUCT(TYPE) TYPE_LANG_FLAG_2 (TYPE)
69 : :
70 : : /* Record whether a typedef for type `int' was actually `signed int'. */
71 : : #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
72 : :
73 : : /* For a FUNCTION_DECL, nonzero if it was defined without an explicit
74 : : return type. */
75 : : #define C_FUNCTION_IMPLICIT_INT(EXP) DECL_LANG_FLAG_1 (EXP)
76 : :
77 : : /* For a FUNCTION_DECL, nonzero if it was an implicit declaration. */
78 : : #define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP)
79 : :
80 : : /* For a PARM_DECL, nonzero if it was declared as an array. */
81 : : #define C_ARRAY_PARAMETER(NODE) DECL_LANG_FLAG_0 (NODE)
82 : :
83 : : /* For FUNCTION_DECLs, evaluates true if the decl is built-in but has
84 : : been declared. */
85 : : #define C_DECL_DECLARED_BUILTIN(EXP) \
86 : : DECL_LANG_FLAG_3 (FUNCTION_DECL_CHECK (EXP))
87 : :
88 : : /* For FUNCTION_DECLs, evaluates true if the decl is built-in, has a
89 : : built-in prototype and does not have a non-built-in prototype. */
90 : : #define C_DECL_BUILTIN_PROTOTYPE(EXP) \
91 : : DECL_LANG_FLAG_6 (FUNCTION_DECL_CHECK (EXP))
92 : :
93 : : /* Record whether a decl was declared register. This is strictly a
94 : : front-end flag, whereas DECL_REGISTER is used for code generation;
95 : : they may differ for structures with volatile fields. */
96 : : #define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4 (EXP)
97 : :
98 : : /* Record whether a decl was used in an expression anywhere except an
99 : : unevaluated operand of sizeof / typeof / alignof. This is only
100 : : used for functions declared static but not defined, though outside
101 : : sizeof and typeof it is set for other function decls as well. */
102 : : #define C_DECL_USED(EXP) DECL_LANG_FLAG_5 (FUNCTION_DECL_CHECK (EXP))
103 : :
104 : : /* Record whether a variable has been declared threadprivate by
105 : : #pragma omp threadprivate. */
106 : : #define C_DECL_THREADPRIVATE_P(DECL) DECL_LANG_FLAG_3 (VAR_DECL_CHECK (DECL))
107 : :
108 : : /* Set on VAR_DECLs for compound literals. */
109 : : #define C_DECL_COMPOUND_LITERAL_P(DECL) \
110 : : DECL_LANG_FLAG_5 (VAR_DECL_CHECK (DECL))
111 : :
112 : : /* Set on decls used as placeholders for a C23 underspecified object
113 : : definition. */
114 : : #define C_DECL_UNDERSPECIFIED(DECL) DECL_LANG_FLAG_7 (DECL)
115 : :
116 : : /* Set on VAR_DECLs declared as 'constexpr'. */
117 : : #define C_DECL_DECLARED_CONSTEXPR(DECL) \
118 : : DECL_LANG_FLAG_8 (VAR_DECL_CHECK (DECL))
119 : :
120 : : /* Nonzero for a decl which either doesn't exist or isn't a prototype.
121 : : N.B. Could be simplified if all built-in decls had complete prototypes
122 : : (but this is presently difficult because some of them need FILE*). */
123 : : #define C_DECL_ISNT_PROTOTYPE(EXP) \
124 : : (EXP == 0 \
125 : : || (!prototype_p (TREE_TYPE (EXP)) \
126 : : && !fndecl_built_in_p (EXP)))
127 : :
128 : : /* For FUNCTION_TYPE, a hidden list of types of arguments. The same as
129 : : TYPE_ARG_TYPES for functions with prototypes, but created for functions
130 : : without prototypes. */
131 : : #define TYPE_ACTUAL_ARG_TYPES(NODE) \
132 : : TYPE_LANG_SLOT_1 (FUNCTION_TYPE_CHECK (NODE))
133 : :
134 : : /* For a CONSTRUCTOR, whether some initializer contains a
135 : : subexpression meaning it is not a constant expression. */
136 : : #define CONSTRUCTOR_NON_CONST(EXPR) TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK (EXPR))
137 : :
138 : : /* For a SAVE_EXPR, nonzero if the operand of the SAVE_EXPR has already
139 : : been folded. */
140 : : #define SAVE_EXPR_FOLDED_P(EXP) TREE_LANG_FLAG_1 (SAVE_EXPR_CHECK (EXP))
141 : :
142 : : /* Whether a type has boolean semantics: either a boolean type or an
143 : : enumeration type with a boolean type as its underlying type. */
144 : : #define C_BOOLEAN_TYPE_P(TYPE) \
145 : : (TREE_CODE (TYPE) == BOOLEAN_TYPE \
146 : : || (TREE_CODE (TYPE) == ENUMERAL_TYPE \
147 : : && ENUM_UNDERLYING_TYPE (TYPE) != NULL_TREE \
148 : : && TREE_CODE (ENUM_UNDERLYING_TYPE (TYPE)) == BOOLEAN_TYPE))
149 : :
150 : : /* Record parser information about an expression that is irrelevant
151 : : for code generation alongside a tree representing its value. */
152 : : struct c_expr
153 : : {
154 : : /* The value of the expression. */
155 : : tree value;
156 : : /* Record the original unary/binary operator of an expression, which may
157 : : have been changed by fold, STRING_CST for unparenthesized string
158 : : constants, C_MAYBE_CONST_EXPR for __builtin_constant_p calls
159 : : (even if parenthesized), for subexpressions, and for non-constant
160 : : initializers, or ERROR_MARK for other expressions (including
161 : : parenthesized expressions). */
162 : : enum tree_code original_code;
163 : : /* If not NULL, the original type of an expression. This will
164 : : differ from the type of the value field for an enum constant.
165 : : The type of an enum constant is a plain integer type, but this
166 : : field will be the enum type. */
167 : : tree original_type;
168 : :
169 : : /* The source range of this expression. This is redundant
170 : : for node values that have locations, but not all node kinds
171 : : have locations (e.g. constants, and references to params, locals,
172 : : etc), so we stash a copy here. */
173 : : source_range src_range;
174 : :
175 : : /* True if this was directly from a decimal constant token. */
176 : : bool m_decimal : 1;
177 : :
178 : : /* Access to the first and last locations within the source spelling
179 : : of this expression. */
180 : 50112178 : location_t get_start () const { return src_range.m_start; }
181 : 124411018 : location_t get_finish () const { return src_range.m_finish; }
182 : :
183 : 221963045 : location_t get_location () const
184 : : {
185 : 221963045 : if (EXPR_HAS_LOCATION (value))
186 : 141531144 : return EXPR_LOCATION (value);
187 : : else
188 : 80431901 : return make_location (get_start (), get_start (), get_finish ());
189 : : }
190 : :
191 : : /* Set the value to error_mark_node whilst ensuring that src_range
192 : : and m_decimal are initialized. */
193 : 9664 : void set_error ()
194 : : {
195 : 9664 : value = error_mark_node;
196 : 9664 : src_range.m_start = UNKNOWN_LOCATION;
197 : 9664 : src_range.m_finish = UNKNOWN_LOCATION;
198 : 9649 : m_decimal = 0;
199 : 1012 : }
200 : : };
201 : :
202 : : /* Type alias for struct c_expr. This allows to use the structure
203 : : inside the VEC types. */
204 : : typedef struct c_expr c_expr_t;
205 : :
206 : : /* A kind of type specifier. Note that this information is currently
207 : : only used to distinguish tag definitions, tag references and typeof
208 : : uses. */
209 : : enum c_typespec_kind {
210 : : /* No typespec. This appears only in struct c_declspec. */
211 : : ctsk_none,
212 : : /* A reserved keyword type specifier. */
213 : : ctsk_resword,
214 : : /* A reference to a tag, previously declared, such as "struct foo".
215 : : This includes where the previous declaration was as a different
216 : : kind of tag, in which case this is only valid if shadowing that
217 : : tag in an inner scope. */
218 : : ctsk_tagref,
219 : : /* Likewise, with standard attributes present in the reference. */
220 : : ctsk_tagref_attrs,
221 : : /* A reference to a tag, not previously declared in a visible
222 : : scope. */
223 : : ctsk_tagfirstref,
224 : : /* Likewise, with standard attributes present in the reference. */
225 : : ctsk_tagfirstref_attrs,
226 : : /* A definition of a tag such as "struct foo { int a; }". */
227 : : ctsk_tagdef,
228 : : /* A typedef name. */
229 : : ctsk_typedef,
230 : : /* An ObjC-specific kind of type specifier. */
231 : : ctsk_objc,
232 : : /* A typeof specifier, or _Atomic ( type-name ). */
233 : : ctsk_typeof
234 : : };
235 : :
236 : : /* A type specifier: this structure is created in the parser and
237 : : passed to declspecs_add_type only. */
238 : : struct c_typespec {
239 : : /* What kind of type specifier this is. */
240 : : enum c_typespec_kind kind;
241 : : /* Whether the expression has operands suitable for use in constant
242 : : expressions. */
243 : : bool expr_const_operands;
244 : : /* Whether the type specifier includes an enum type specifier (that
245 : : is, ": specifier-qualifier-list" in a declaration using
246 : : "enum"). */
247 : : bool has_enum_type_specifier;
248 : : /* The specifier itself. */
249 : : tree spec;
250 : : /* An expression to be evaluated before the type specifier, in the
251 : : case of typeof specifiers, or NULL otherwise or if no such
252 : : expression is required for a particular typeof specifier. In
253 : : particular, when typeof is applied to an expression of variably
254 : : modified type, that expression must be evaluated in order to
255 : : determine array sizes that form part of the type, but the
256 : : expression itself (as opposed to the array sizes) forms no part
257 : : of the type and so needs to be recorded separately. */
258 : : tree expr;
259 : : };
260 : :
261 : : /* A storage class specifier. */
262 : : enum c_storage_class {
263 : : csc_none,
264 : : csc_auto,
265 : : csc_extern,
266 : : csc_register,
267 : : csc_static,
268 : : csc_typedef
269 : : };
270 : :
271 : : /* A type specifier keyword "void", "_Bool", "char", "int", "float",
272 : : "double", "_Decimal32", "_Decimal64", "_Decimal128", "_Fract", "_Accum",
273 : : "_BitInt", or none of these. */
274 : : enum c_typespec_keyword {
275 : : cts_none,
276 : : cts_void,
277 : : cts_bool,
278 : : cts_char,
279 : : cts_int,
280 : : cts_float,
281 : : cts_int_n,
282 : : cts_double,
283 : : cts_dfloat32,
284 : : cts_dfloat64,
285 : : cts_dfloat128,
286 : : cts_floatn_nx,
287 : : cts_fract,
288 : : cts_accum,
289 : : cts_bitint,
290 : : cts_auto_type
291 : : };
292 : :
293 : : /* This enum lists all the possible declarator specifiers, storage
294 : : class or attribute that a user can write. There is at least one
295 : : enumerator per possible declarator specifier in the struct
296 : : c_declspecs below.
297 : :
298 : : It is used to index the array of declspec locations in struct
299 : : c_declspecs. */
300 : : enum c_declspec_word {
301 : : cdw_typespec /* A catch-all for a typespec. */,
302 : : cdw_storage_class /* A catch-all for a storage class */,
303 : : cdw_attributes,
304 : : cdw_typedef,
305 : : cdw_explicit_signed,
306 : : cdw_deprecated,
307 : : cdw_default_int,
308 : : cdw_long,
309 : : cdw_long_long,
310 : : cdw_short,
311 : : cdw_signed,
312 : : cdw_unsigned,
313 : : cdw_complex,
314 : : cdw_inline,
315 : : cdw_noreturn,
316 : : cdw_thread,
317 : : cdw_const,
318 : : cdw_volatile,
319 : : cdw_restrict,
320 : : cdw_atomic,
321 : : cdw_saturating,
322 : : cdw_alignas,
323 : : cdw_address_space,
324 : : cdw_gimple,
325 : : cdw_rtl,
326 : : cdw_number_of_elements /* This one must always be the last
327 : : enumerator. */
328 : : };
329 : :
330 : : enum c_declspec_il {
331 : : cdil_none,
332 : : cdil_gimple, /* __GIMPLE */
333 : : cdil_gimple_cfg, /* __GIMPLE(cfg) */
334 : : cdil_gimple_ssa, /* __GIMPLE(ssa) */
335 : : cdil_rtl /* __RTL */
336 : : };
337 : :
338 : : /* A sequence of declaration specifiers in C. When a new declaration
339 : : specifier is added, please update the enum c_declspec_word above
340 : : accordingly. */
341 : : struct c_declspecs {
342 : : location_t locations[cdw_number_of_elements];
343 : : /* The type specified, if a single type specifier such as a struct,
344 : : union or enum specifier, typedef name or typeof specifies the
345 : : whole type, or NULL_TREE if none or a keyword such as "void" or
346 : : "char" is used. Does not include qualifiers. */
347 : : tree type;
348 : : /* Any expression to be evaluated before the type, from a typeof
349 : : specifier. */
350 : : tree expr;
351 : : /* The attributes from a typedef decl. */
352 : : tree decl_attr;
353 : : /* When parsing, the GNU attributes and prefix standard attributes.
354 : : Outside the parser, this will be NULL; attributes (possibly from
355 : : multiple lists) will be passed separately. */
356 : : tree attrs;
357 : : /* When parsing, postfix standard attributes (which appertain to the
358 : : type specified by the preceding declaration specifiers, unlike
359 : : prefix standard attributes which appertain to the declaration or
360 : : declarations as a whole). */
361 : : tree postfix_attrs;
362 : : /* The pass to start compiling a __GIMPLE or __RTL function with. */
363 : : char *gimple_or_rtl_pass;
364 : : /* ENTRY BB count. */
365 : : profile_count entry_bb_count;
366 : : /* The base-2 log of the greatest alignment required by an _Alignas
367 : : specifier, in bytes, or -1 if no such specifiers with nonzero
368 : : alignment. */
369 : : int align_log;
370 : : union {
371 : : /* For the __intN declspec, this stores the index into the int_n_*
372 : : arrays. */
373 : : int int_n_idx;
374 : : /* For the _FloatN and _FloatNx declspec, this stores the index into
375 : : the floatn_nx_types array. */
376 : : int floatn_nx_idx;
377 : : /* For _BitInt(N) this stores the N. */
378 : : int bitint_prec;
379 : : } u;
380 : : /* The storage class specifier, or csc_none if none. */
381 : : enum c_storage_class storage_class;
382 : : /* Any type specifier keyword used such as "int", not reflecting
383 : : modifiers such as "short", or cts_none if none. */
384 : : ENUM_BITFIELD (c_typespec_keyword) typespec_word : 8;
385 : : /* The kind of type specifier if one has been seen, ctsk_none
386 : : otherwise. */
387 : : ENUM_BITFIELD (c_typespec_kind) typespec_kind : 4;
388 : : ENUM_BITFIELD (c_declspec_il) declspec_il : 3;
389 : : /* Whether any expressions in typeof specifiers may appear in
390 : : constant expressions. */
391 : : BOOL_BITFIELD expr_const_operands : 1;
392 : : /* Whether any declaration specifiers have been seen at all. */
393 : : BOOL_BITFIELD declspecs_seen_p : 1;
394 : : /* Whether any declaration specifiers other than standard attributes
395 : : have been seen at all. If only standard attributes have been
396 : : seen, this is an attribute-declaration. */
397 : : BOOL_BITFIELD non_std_attrs_seen_p : 1;
398 : : /* Whether something other than a storage class specifier or
399 : : attribute has been seen. This is used to warn for the
400 : : obsolescent usage of storage class specifiers other than at the
401 : : start of the list. (Doing this properly would require function
402 : : specifiers to be handled separately from storage class
403 : : specifiers.) */
404 : : BOOL_BITFIELD non_sc_seen_p : 1;
405 : : /* Whether the type is specified by a typedef or typeof name. */
406 : : BOOL_BITFIELD typedef_p : 1;
407 : : /* Whether the type is explicitly "signed" or specified by a typedef
408 : : whose type is explicitly "signed". */
409 : : BOOL_BITFIELD explicit_signed_p : 1;
410 : : /* Whether the specifiers include a deprecated typedef. */
411 : : BOOL_BITFIELD deprecated_p : 1;
412 : : /* Whether the specifiers include an unavailable typedef. */
413 : : BOOL_BITFIELD unavailable_p : 1;
414 : : /* Whether the type defaulted to "int" because there were no type
415 : : specifiers. */
416 : : BOOL_BITFIELD default_int_p : 1;
417 : : /* Whether "long" was specified. */
418 : : BOOL_BITFIELD long_p : 1;
419 : : /* Whether "long" was specified more than once. */
420 : : BOOL_BITFIELD long_long_p : 1;
421 : : /* Whether "short" was specified. */
422 : : BOOL_BITFIELD short_p : 1;
423 : : /* Whether "signed" was specified. */
424 : : BOOL_BITFIELD signed_p : 1;
425 : : /* Whether "unsigned" was specified. */
426 : : BOOL_BITFIELD unsigned_p : 1;
427 : : /* Whether "complex" was specified. */
428 : : BOOL_BITFIELD complex_p : 1;
429 : : /* Whether "inline" was specified. */
430 : : BOOL_BITFIELD inline_p : 1;
431 : : /* Whether "_Noreturn" was speciied. */
432 : : BOOL_BITFIELD noreturn_p : 1;
433 : : /* Whether "__thread" or "_Thread_local" was specified. */
434 : : BOOL_BITFIELD thread_p : 1;
435 : : /* Whether "__thread" rather than "_Thread_local" was specified. */
436 : : BOOL_BITFIELD thread_gnu_p : 1;
437 : : /* Whether "const" was specified. */
438 : : BOOL_BITFIELD const_p : 1;
439 : : /* Whether "volatile" was specified. */
440 : : BOOL_BITFIELD volatile_p : 1;
441 : : /* Whether "restrict" was specified. */
442 : : BOOL_BITFIELD restrict_p : 1;
443 : : /* Whether "_Atomic" was specified. */
444 : : BOOL_BITFIELD atomic_p : 1;
445 : : /* Whether "_Sat" was specified. */
446 : : BOOL_BITFIELD saturating_p : 1;
447 : : /* Whether any alignment specifier (even with zero alignment) was
448 : : specified. */
449 : : BOOL_BITFIELD alignas_p : 1;
450 : : /* Whether an enum type specifier (": specifier-qualifier-list") was
451 : : specified other than in a definition of that enum (if so, this is
452 : : invalid unless it is an empty declaration "enum identifier
453 : : enum-type-specifier;", but such an empty declaration is valid in
454 : : C23 when "enum identifier;" would not be). */
455 : : BOOL_BITFIELD enum_type_specifier_ref_p : 1;
456 : : /* Whether "auto" was specified in C23 (or later) mode and means the
457 : : type is to be deduced from an initializer, or would mean that if
458 : : no type specifier appears later in these declaration
459 : : specifiers. */
460 : : BOOL_BITFIELD c23_auto_p : 1;
461 : : /* Whether "constexpr" was specified. */
462 : : BOOL_BITFIELD constexpr_p : 1;
463 : : /* The address space that the declaration belongs to. */
464 : : addr_space_t address_space;
465 : : };
466 : :
467 : : /* The various kinds of declarators in C. */
468 : : enum c_declarator_kind {
469 : : /* An identifier. */
470 : : cdk_id,
471 : : /* A function. */
472 : : cdk_function,
473 : : /* An array. */
474 : : cdk_array,
475 : : /* A pointer. */
476 : : cdk_pointer,
477 : : /* Parenthesized declarator with nested attributes. */
478 : : cdk_attrs
479 : : };
480 : :
481 : : struct c_arg_tag {
482 : : /* The argument name. */
483 : : tree id;
484 : : /* The type of the argument. */
485 : : tree type;
486 : : };
487 : :
488 : :
489 : : /* Information about the parameters in a function declarator. */
490 : : struct c_arg_info {
491 : : /* A list of parameter decls. */
492 : : tree parms;
493 : : /* A list of structure, union and enum tags defined. */
494 : : vec<c_arg_tag, va_gc> *tags;
495 : : /* A list of argument types to go in the FUNCTION_TYPE. */
496 : : tree types;
497 : : /* A list of non-parameter decls (notably enumeration constants)
498 : : defined with the parameters. */
499 : : tree others;
500 : : /* A compound expression of VLA sizes from the parameters, or NULL.
501 : : In a function definition, these are used to ensure that
502 : : side-effects in sizes of arrays converted to pointers (such as a
503 : : parameter int i[n++]) take place; otherwise, they are
504 : : ignored. */
505 : : tree pending_sizes;
506 : : /* True when these arguments had [*]. */
507 : : BOOL_BITFIELD had_vla_unspec : 1;
508 : : /* True when the arguments are a (...) prototype. */
509 : : BOOL_BITFIELD no_named_args_stdarg_p : 1;
510 : : };
511 : :
512 : : /* A declarator. */
513 : : struct c_declarator {
514 : : /* The kind of declarator. */
515 : : enum c_declarator_kind kind;
516 : : location_t id_loc; /* Currently only set for cdk_id, cdk_array. */
517 : : /* Except for cdk_id, the contained declarator. For cdk_id, NULL. */
518 : : struct c_declarator *declarator;
519 : : union {
520 : : /* For identifiers. */
521 : : struct {
522 : : /* An IDENTIFIER_NODE, or NULL_TREE if an abstract
523 : : declarator. */
524 : : tree id;
525 : : /* Any attributes (which apply to the declaration rather than to
526 : : the type described by the outer declarators). */
527 : : tree attrs;
528 : : } id;
529 : : /* For functions. */
530 : : struct c_arg_info *arg_info;
531 : : /* For arrays. */
532 : : struct {
533 : : /* The array dimension, or NULL for [] and [*]. */
534 : : tree dimen;
535 : : /* The qualifiers inside []. */
536 : : int quals;
537 : : /* The attributes (currently ignored) inside []. */
538 : : tree attrs;
539 : : /* Whether [static] was used. */
540 : : BOOL_BITFIELD static_p : 1;
541 : : /* Whether [*] was used. */
542 : : BOOL_BITFIELD vla_unspec_p : 1;
543 : : } array;
544 : : /* For pointers, the qualifiers on the pointer type. */
545 : : int pointer_quals;
546 : : /* For attributes. */
547 : : tree attrs;
548 : : } u;
549 : : };
550 : :
551 : : /* A type name. */
552 : : struct c_type_name {
553 : : /* The declaration specifiers. */
554 : : struct c_declspecs *specs;
555 : : /* The declarator. */
556 : : struct c_declarator *declarator;
557 : : };
558 : :
559 : : /* A parameter. */
560 : : struct c_parm {
561 : : /* The declaration specifiers, minus any prefix attributes. */
562 : : struct c_declspecs *specs;
563 : : /* The attributes. */
564 : : tree attrs;
565 : : /* The declarator. */
566 : : struct c_declarator *declarator;
567 : : /* The location of the parameter. */
568 : : location_t loc;
569 : : };
570 : :
571 : : /* Used when parsing an enum. Initialized by start_enum. */
572 : : struct c_enum_contents
573 : : {
574 : : /* While defining an enum type, this is 1 plus the last enumerator
575 : : constant value. */
576 : : tree enum_next_value;
577 : :
578 : : /* The enumeration type itself. */
579 : : tree enum_type;
580 : :
581 : : /* Nonzero means that there was overflow computing enum_next_value. */
582 : : int enum_overflow;
583 : : };
584 : :
585 : : /* A type of reference to a static identifier in an inline
586 : : function. */
587 : : enum c_inline_static_type {
588 : : /* Identifier with internal linkage used in function that may be an
589 : : inline definition (i.e., file-scope static). */
590 : : csi_internal,
591 : : /* Modifiable object with static storage duration defined in
592 : : function that may be an inline definition (i.e., local
593 : : static). */
594 : : csi_modifiable
595 : : };
596 : :
597 : :
598 : : /* in c-parser.cc */
599 : : struct c_tree_token_vec;
600 : : extern void c_parse_init (void);
601 : : extern bool c_keyword_starts_typename (enum rid keyword);
602 : :
603 : : /* in c-aux-info.cc */
604 : : extern void gen_aux_info_record (tree, int, int, int);
605 : :
606 : : /* in c-decl.cc */
607 : : struct c_spot_bindings;
608 : : class c_struct_parse_info;
609 : : extern struct obstack parser_obstack;
610 : : /* Set to IN_ITERATION_STMT if parsing an iteration-statement,
611 : : to IN_OMP_BLOCK if parsing OpenMP structured block and
612 : : IN_OMP_FOR if parsing OpenMP loop. If parsing a switch statement,
613 : : this is bitwise ORed with IN_SWITCH_STMT, unless parsing an
614 : : iteration-statement, OpenMP block or loop within that switch. */
615 : : #define IN_SWITCH_STMT 1
616 : : #define IN_ITERATION_STMT 2
617 : : #define IN_OMP_BLOCK 4
618 : : #define IN_OMP_FOR 8
619 : : #define IN_OBJC_FOREACH 16
620 : : extern unsigned char in_statement;
621 : :
622 : : extern bool switch_statement_break_seen_p;
623 : :
624 : : extern bool global_bindings_p (void);
625 : : extern tree pushdecl (tree);
626 : : extern unsigned int start_underspecified_init (location_t, tree);
627 : : extern void finish_underspecified_init (tree, unsigned int);
628 : : extern void push_scope (void);
629 : : extern tree pop_scope (void);
630 : : extern void c_mark_decl_jump_unsafe_in_current_scope ();
631 : : extern void c_bindings_start_stmt_expr (struct c_spot_bindings *);
632 : : extern void c_bindings_end_stmt_expr (struct c_spot_bindings *);
633 : :
634 : : extern void record_inline_static (location_t, tree, tree,
635 : : enum c_inline_static_type);
636 : : extern void c_init_decl_processing (void);
637 : : extern void c_print_identifier (FILE *, tree, int);
638 : : extern int quals_from_declspecs (const struct c_declspecs *);
639 : : extern struct c_declarator *build_array_declarator (location_t, tree,
640 : : struct c_declspecs *,
641 : : bool, bool);
642 : : extern tree build_enumerator (location_t, location_t, struct c_enum_contents *,
643 : : tree, tree);
644 : : extern tree check_for_loop_decls (location_t, bool);
645 : : extern void mark_forward_parm_decls (void);
646 : : extern void declare_parm_level (void);
647 : : extern void undeclared_variable (location_t, tree);
648 : : extern tree lookup_label_for_goto (location_t, tree);
649 : : extern tree declare_label (tree);
650 : : extern tree define_label (location_t, tree);
651 : : extern struct c_spot_bindings *c_get_switch_bindings (void);
652 : : extern void c_release_switch_bindings (struct c_spot_bindings *);
653 : : extern bool c_check_switch_jump_warnings (struct c_spot_bindings *,
654 : : location_t, location_t);
655 : : extern void finish_decl (tree, location_t, tree, tree, tree);
656 : : extern tree finish_enum (tree, tree, tree);
657 : : extern void finish_function (location_t = input_location);
658 : : extern tree finish_struct (location_t, tree, tree, tree,
659 : : class c_struct_parse_info *,
660 : : tree *expr = NULL);
661 : : extern tree c_simulate_enum_decl (location_t, const char *,
662 : : vec<string_int_pair> *);
663 : : extern tree c_simulate_record_decl (location_t, const char *,
664 : : array_slice<const tree>);
665 : : extern struct c_arg_info *build_arg_info (void);
666 : : extern struct c_arg_info *get_parm_info (bool, tree);
667 : : extern tree grokfield (location_t, struct c_declarator *,
668 : : struct c_declspecs *, tree, tree *, tree *);
669 : : extern tree groktypename (struct c_type_name *, tree *, bool *);
670 : : extern tree grokparm (const struct c_parm *, tree *);
671 : : extern tree implicitly_declare (location_t, tree);
672 : : extern void keep_next_level (void);
673 : : extern void pending_xref_error (void);
674 : : extern void c_push_function_context (void);
675 : : extern void c_pop_function_context (void);
676 : : extern void push_parm_decl (const struct c_parm *, tree *);
677 : : extern struct c_declarator *set_array_declarator_inner (struct c_declarator *,
678 : : struct c_declarator *);
679 : : extern tree c_builtin_function (tree);
680 : : extern tree c_builtin_function_ext_scope (tree);
681 : : extern tree c_simulate_builtin_function_decl (tree);
682 : : extern void c_warn_unused_attributes (tree);
683 : : extern tree c_warn_type_attributes (tree);
684 : : extern void shadow_tag (const struct c_declspecs *);
685 : : extern void shadow_tag_warned (const struct c_declspecs *, int);
686 : : extern tree start_enum (location_t, struct c_enum_contents *, tree, tree,
687 : : bool potential_nesting_p);
688 : : extern bool start_function (struct c_declspecs *, struct c_declarator *, tree);
689 : : extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool,
690 : : tree, bool = true, location_t * = NULL);
691 : : extern tree start_struct (location_t, enum tree_code, tree,
692 : : class c_struct_parse_info **);
693 : : extern void store_parm_decls (void);
694 : : extern void store_parm_decls_from (struct c_arg_info *);
695 : : extern void temp_store_parm_decls (tree, tree);
696 : : extern void temp_pop_parm_decls (void);
697 : : extern tree xref_tag (enum tree_code, tree);
698 : : extern struct c_typespec parser_xref_tag (location_t, enum tree_code, tree,
699 : : bool, tree, bool);
700 : : extern struct c_parm *build_c_parm (struct c_declspecs *, tree,
701 : : struct c_declarator *, location_t);
702 : : extern struct c_declarator *build_attrs_declarator (tree,
703 : : struct c_declarator *);
704 : : extern struct c_declarator *build_function_declarator (struct c_arg_info *,
705 : : struct c_declarator *);
706 : : extern struct c_declarator *build_id_declarator (tree);
707 : : extern struct c_declarator *make_pointer_declarator (struct c_declspecs *,
708 : : struct c_declarator *);
709 : : extern struct c_declspecs *build_null_declspecs (void);
710 : : extern struct c_declspecs *declspecs_add_qual (location_t,
711 : : struct c_declspecs *, tree);
712 : : extern struct c_declspecs *declspecs_add_type (location_t,
713 : : struct c_declspecs *,
714 : : struct c_typespec);
715 : : extern struct c_declspecs *declspecs_add_scspec (location_t,
716 : : struct c_declspecs *, tree);
717 : : extern struct c_declspecs *declspecs_add_attrs (location_t,
718 : : struct c_declspecs *, tree);
719 : : extern struct c_declspecs *declspecs_add_addrspace (location_t,
720 : : struct c_declspecs *,
721 : : addr_space_t);
722 : : extern struct c_declspecs *declspecs_add_alignas (location_t,
723 : : struct c_declspecs *, tree);
724 : : extern struct c_declspecs *finish_declspecs (struct c_declspecs *);
725 : : extern size_t c_tree_size (enum tree_code);
726 : :
727 : : /* in c-objc-common.cc */
728 : : extern bool c_objc_common_init (void);
729 : : extern bool c_missing_noreturn_ok_p (tree);
730 : : extern bool c_warn_unused_global_decl (const_tree);
731 : : extern void c_initialize_diagnostics (diagnostic_context *);
732 : : extern bool c_var_mod_p (tree x, tree fn);
733 : : extern alias_set_type c_get_alias_set (tree);
734 : : extern int c_type_dwarf_attribute (const_tree, int);
735 : :
736 : : /* in c-typeck.cc */
737 : : extern int in_alignof;
738 : : extern int in_sizeof;
739 : : extern int in_typeof;
740 : : extern bool c_in_omp_for;
741 : : extern bool c_omp_array_section_p;
742 : :
743 : : extern tree c_last_sizeof_arg;
744 : : extern location_t c_last_sizeof_loc;
745 : :
746 : : extern struct c_switch *c_switch_stack;
747 : :
748 : : extern bool null_pointer_constant_p (const_tree);
749 : :
750 : :
751 : : inline
752 : 119957167 : bool c_type_variably_modified_p (tree t)
753 : : {
754 : 119957167 : return error_mark_node != t && C_TYPE_VARIABLY_MODIFIED (t);
755 : : }
756 : :
757 : :
758 : : extern bool char_type_p (tree);
759 : : extern tree c_objc_common_truthvalue_conversion (location_t, tree,
760 : : tree = integer_type_node);
761 : : extern tree require_complete_type (location_t, tree);
762 : : extern bool same_translation_unit_p (const_tree, const_tree);
763 : : extern int comptypes (tree, tree);
764 : : extern bool comptypes_same_p (tree, tree);
765 : : extern bool comptypes_equiv_p (tree, tree);
766 : : extern int comptypes_check_different_types (tree, tree, bool *);
767 : : extern int comptypes_check_enum_int (tree, tree, bool *);
768 : : extern bool c_mark_addressable (tree, bool = false);
769 : : extern void c_incomplete_type_error (location_t, const_tree, const_tree);
770 : : extern tree c_type_promotes_to (tree);
771 : : extern struct c_expr default_function_array_conversion (location_t,
772 : : struct c_expr);
773 : : extern struct c_expr default_function_array_read_conversion (location_t,
774 : : struct c_expr);
775 : : extern struct c_expr convert_lvalue_to_rvalue (location_t, struct c_expr,
776 : : bool, bool, bool = false);
777 : : extern tree decl_constant_value_1 (tree, bool);
778 : : extern void mark_exp_read (tree);
779 : : extern tree composite_type (tree, tree);
780 : : extern tree build_component_ref (location_t, tree, tree, location_t,
781 : : location_t);
782 : : extern tree build_array_ref (location_t, tree, tree);
783 : : extern tree build_omp_array_section (location_t, tree, tree, tree);
784 : : extern tree build_external_ref (location_t, tree, bool, tree *);
785 : : extern void pop_maybe_used (bool);
786 : : extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr);
787 : : extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *);
788 : : extern struct c_expr parser_build_unary_op (location_t, enum tree_code,
789 : : struct c_expr);
790 : : extern struct c_expr parser_build_binary_op (location_t,
791 : : enum tree_code, struct c_expr,
792 : : struct c_expr);
793 : : extern tree build_conditional_expr (location_t, tree, bool, tree, tree,
794 : : location_t, tree, tree, location_t);
795 : : extern tree build_compound_expr (location_t, tree, tree);
796 : : extern tree c_cast_expr (location_t, struct c_type_name *, tree);
797 : : extern tree build_c_cast (location_t, tree, tree);
798 : : extern void store_init_value (location_t, tree, tree, tree);
799 : : extern void maybe_warn_string_init (location_t, tree, struct c_expr);
800 : : extern void start_init (tree, tree, bool, bool, rich_location *);
801 : : extern void finish_init (void);
802 : : extern void really_start_incremental_init (tree);
803 : : extern void finish_implicit_inits (location_t, struct obstack *);
804 : : extern void push_init_level (location_t, int, struct obstack *);
805 : : extern struct c_expr pop_init_level (location_t, int, struct obstack *,
806 : : location_t);
807 : : extern void set_init_index (location_t, tree, tree, struct obstack *);
808 : : extern void set_init_label (location_t, tree, location_t, struct obstack *);
809 : : extern void process_init_element (location_t, struct c_expr, bool,
810 : : struct obstack *);
811 : : extern tree build_compound_literal (location_t, tree, tree, bool,
812 : : unsigned int, struct c_declspecs *);
813 : : extern void check_compound_literal_type (location_t, struct c_type_name *);
814 : : extern tree c_start_switch (location_t, location_t, tree, bool);
815 : : extern void c_finish_switch (tree, tree);
816 : : extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool,
817 : : bool);
818 : : extern tree build_asm_stmt (bool, tree);
819 : : extern int c_types_compatible_p (tree, tree);
820 : : extern tree c_begin_compound_stmt (bool);
821 : : extern tree c_end_compound_stmt (location_t, tree, bool);
822 : : extern void c_finish_if_stmt (location_t, tree, tree, tree);
823 : : extern void c_finish_loop (location_t, location_t, tree, location_t, tree,
824 : : tree, tree, tree, bool);
825 : : extern tree c_begin_stmt_expr (void);
826 : : extern tree c_finish_stmt_expr (location_t, tree);
827 : : extern tree c_process_expr_stmt (location_t, tree);
828 : : extern tree c_finish_expr_stmt (location_t, tree);
829 : : extern tree c_finish_return (location_t, tree, tree);
830 : : extern tree c_finish_bc_stmt (location_t, tree, bool);
831 : : extern tree c_finish_goto_label (location_t, tree);
832 : : extern tree c_finish_goto_ptr (location_t, c_expr val);
833 : : extern tree c_expr_to_decl (tree, bool *, bool *);
834 : : extern tree c_finish_omp_construct (location_t, enum tree_code, tree, tree);
835 : : extern tree c_finish_oacc_data (location_t, tree, tree);
836 : : extern tree c_finish_oacc_host_data (location_t, tree, tree);
837 : : extern tree c_begin_omp_parallel (void);
838 : : extern tree c_finish_omp_parallel (location_t, tree, tree);
839 : : extern tree c_begin_omp_task (void);
840 : : extern tree c_finish_omp_task (location_t, tree, tree);
841 : : extern void c_finish_omp_cancel (location_t, tree);
842 : : extern void c_finish_omp_cancellation_point (location_t, tree);
843 : : extern tree c_finish_omp_clauses (tree, enum c_omp_region_type);
844 : : extern tree c_build_va_arg (location_t, tree, location_t, tree);
845 : : extern tree c_finish_transaction (location_t, tree, int);
846 : : extern bool c_tree_equal (tree, tree);
847 : : extern tree c_build_function_call_vec (location_t, const vec<location_t>&,
848 : : tree, vec<tree, va_gc> *,
849 : : vec<tree, va_gc> *);
850 : : extern tree c_omp_clause_copy_ctor (tree, tree, tree);
851 : :
852 : : /* Set to 0 at beginning of a function definition, set to 1 if
853 : : a return statement that specifies a return value is seen. */
854 : :
855 : : extern int current_function_returns_value;
856 : :
857 : : /* Set to 0 at beginning of a function definition, set to 1 if
858 : : a return statement with no argument is seen. */
859 : :
860 : : extern int current_function_returns_null;
861 : :
862 : : /* Set to 0 at beginning of a function definition, set to 1 if
863 : : a call to a noreturn function is seen. */
864 : :
865 : : extern int current_function_returns_abnormally;
866 : :
867 : : /* In c-decl.cc */
868 : :
869 : : /* Tell the binding oracle what kind of binding we are looking for. */
870 : :
871 : : enum c_oracle_request
872 : : {
873 : : C_ORACLE_SYMBOL,
874 : : C_ORACLE_TAG,
875 : : C_ORACLE_LABEL
876 : : };
877 : :
878 : : /* If this is non-NULL, then it is a "binding oracle" which can lazily
879 : : create bindings when needed by the C compiler. The oracle is told
880 : : the name and type of the binding to create. It can call pushdecl
881 : : or the like to ensure the binding is visible; or do nothing,
882 : : leaving the binding untouched. c-decl.cc takes note of when the
883 : : oracle has been called and will not call it again if it fails to
884 : : create a given binding. */
885 : :
886 : : typedef void c_binding_oracle_function (enum c_oracle_request, tree identifier);
887 : :
888 : : extern c_binding_oracle_function *c_binding_oracle;
889 : :
890 : : extern void c_finish_incomplete_decl (tree);
891 : : extern tree c_omp_reduction_id (enum tree_code, tree);
892 : : extern tree c_omp_reduction_decl (tree);
893 : : extern tree c_omp_reduction_lookup (tree, tree);
894 : : extern tree c_check_omp_declare_reduction_r (tree *, int *, void *);
895 : : extern bool c_check_in_current_scope (tree);
896 : : extern void c_pushtag (location_t, tree, tree);
897 : : extern void c_bind (location_t, tree, bool);
898 : : extern bool tag_exists_p (enum tree_code, tree);
899 : :
900 : : /* In c-errors.cc */
901 : : extern bool pedwarn_c90 (location_t, int opt, const char *, ...)
902 : : ATTRIBUTE_GCC_DIAG(3,4);
903 : : extern bool pedwarn_c99 (location_t, int opt, const char *, ...)
904 : : ATTRIBUTE_GCC_DIAG(3,4);
905 : : extern bool pedwarn_c11 (location_t, int opt, const char *, ...)
906 : : ATTRIBUTE_GCC_DIAG(3,4);
907 : :
908 : : extern void
909 : : set_c_expr_source_range (c_expr *expr,
910 : : location_t start, location_t finish);
911 : :
912 : : extern void
913 : : set_c_expr_source_range (c_expr *expr,
914 : : source_range src_range);
915 : :
916 : : /* In c-fold.cc */
917 : : extern vec<tree> incomplete_record_decls;
918 : :
919 : : extern const char *c_get_sarif_source_language (const char *filename);
920 : :
921 : : extern const struct scoped_attribute_specs std_attribute_table;
922 : :
923 : : #if CHECKING_P
924 : : namespace selftest {
925 : : extern void run_c_tests (void);
926 : : } // namespace selftest
927 : : #endif /* #if CHECKING_P */
928 : :
929 : :
930 : : #endif /* ! GCC_C_TREE_H */
|