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