]>
Commit | Line | Data |
---|---|---|
40754343 | 1 | /* Definitions for C parsing and type checking. |
818ab71a | 2 | Copyright (C) 1987-2016 Free Software Foundation, Inc. |
40754343 | 3 | |
1322177d | 4 | This file is part of GCC. |
40754343 | 5 | |
1322177d LB |
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 | |
9dcd6f09 | 8 | Software Foundation; either version 3, or (at your option) any later |
1322177d | 9 | version. |
40754343 | 10 | |
1322177d LB |
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. | |
40754343 RS |
15 | |
16 | You should have received a copy of the GNU General Public License | |
9dcd6f09 NC |
17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ | |
40754343 | 19 | |
88657302 RH |
20 | #ifndef GCC_C_TREE_H |
21 | #define GCC_C_TREE_H | |
cf1c49cb | 22 | |
39dabefd | 23 | #include "c-family/c-common.h" |
ede1a387 | 24 | #include "diagnostic.h" |
7f4edbcb | 25 | |
18d5f982 ZW |
26 | /* struct lang_identifier is private to c-decl.c, but langhooks.c needs to |
27 | know how big it is. This is sanity-checked in c-decl.c. */ | |
28 | #define C_SIZEOF_STRUCT_LANG_IDENTIFIER \ | |
29 | (sizeof (struct c_common_identifier) + 3 * sizeof (void *)) | |
40754343 | 30 | |
40754343 | 31 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ |
a8086abf | 32 | #define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1 (TYPE) |
40754343 RS |
33 | |
34 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is volatile. */ | |
a8086abf | 35 | #define C_TYPE_FIELDS_VOLATILE(TYPE) TREE_LANG_FLAG_2 (TYPE) |
40754343 RS |
36 | |
37 | /* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE | |
38 | nonzero if the definition of the type has already started. */ | |
a8086abf | 39 | #define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE) |
bf7a697f ZW |
40 | |
41 | /* In an incomplete RECORD_TYPE or UNION_TYPE, a list of variable | |
42 | declarations whose type would be completed by completing that type. */ | |
43 | #define C_TYPE_INCOMPLETE_VARS(TYPE) TYPE_VFIELD (TYPE) | |
40754343 | 44 | |
0e5921e8 ZW |
45 | /* In an IDENTIFIER_NODE, nonzero if this identifier is actually a |
46 | keyword. C_RID_CODE (node) is then the RID_* value of the keyword, | |
47 | and C_RID_YYCODE is the token number wanted by Yacc. */ | |
a8086abf | 48 | #define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID) |
0e5921e8 | 49 | |
40754343 RS |
50 | /* Record whether a type or decl was written with nonconstant size. |
51 | Note that TYPE_SIZE may have simplified to a constant. */ | |
a8086abf GS |
52 | #define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE) |
53 | #define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE) | |
40754343 | 54 | |
24b97832 ILT |
55 | /* Record whether a type is defined inside a struct or union type. |
56 | This is used for -Wc++-compat. */ | |
57 | #define C_TYPE_DEFINED_IN_STRUCT(TYPE) TYPE_LANG_FLAG_2 (TYPE) | |
58 | ||
d9b7be2e MP |
59 | /* Record whether an "incomplete type" error was given for the type. */ |
60 | #define C_TYPE_ERROR_REPORTED(TYPE) TYPE_LANG_FLAG_3 (TYPE) | |
61 | ||
40754343 | 62 | /* Record whether a typedef for type `int' was actually `signed int'. */ |
a8086abf | 63 | #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP) |
40754343 | 64 | |
5ce89b2e JM |
65 | /* For a FUNCTION_DECL, nonzero if it was defined without an explicit |
66 | return type. */ | |
67 | #define C_FUNCTION_IMPLICIT_INT(EXP) DECL_LANG_FLAG_1 (EXP) | |
68 | ||
339a28b9 ZW |
69 | /* For a FUNCTION_DECL, nonzero if it was an implicit declaration. */ |
70 | #define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP) | |
71 | ||
773ec47f MP |
72 | /* For a PARM_DECL, nonzero if it was declared as an array. */ |
73 | #define C_ARRAY_PARAMETER(NODE) DECL_LANG_FLAG_0 (NODE) | |
74 | ||
f75fbaf7 ZW |
75 | /* For FUNCTION_DECLs, evaluates true if the decl is built-in but has |
76 | been declared. */ | |
187230a7 JM |
77 | #define C_DECL_DECLARED_BUILTIN(EXP) \ |
78 | DECL_LANG_FLAG_3 (FUNCTION_DECL_CHECK (EXP)) | |
339a28b9 | 79 | |
6fb58bba JM |
80 | /* For FUNCTION_DECLs, evaluates true if the decl is built-in, has a |
81 | built-in prototype and does not have a non-built-in prototype. */ | |
82 | #define C_DECL_BUILTIN_PROTOTYPE(EXP) \ | |
83 | DECL_LANG_FLAG_6 (FUNCTION_DECL_CHECK (EXP)) | |
84 | ||
5baeaac0 JM |
85 | /* Record whether a decl was declared register. This is strictly a |
86 | front-end flag, whereas DECL_REGISTER is used for code generation; | |
87 | they may differ for structures with volatile fields. */ | |
9aaabf8a | 88 | #define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4 (EXP) |
5baeaac0 | 89 | |
bc4b653b JM |
90 | /* Record whether a decl was used in an expression anywhere except an |
91 | unevaluated operand of sizeof / typeof / alignof. This is only | |
92 | used for functions declared static but not defined, though outside | |
93 | sizeof and typeof it is set for other function decls as well. */ | |
187230a7 | 94 | #define C_DECL_USED(EXP) DECL_LANG_FLAG_5 (FUNCTION_DECL_CHECK (EXP)) |
bc4b653b | 95 | |
953ff289 DN |
96 | /* Record whether a variable has been declared threadprivate by |
97 | #pragma omp threadprivate. */ | |
98 | #define C_DECL_THREADPRIVATE_P(DECL) DECL_LANG_FLAG_3 (VAR_DECL_CHECK (DECL)) | |
99 | ||
339a28b9 ZW |
100 | /* Nonzero for a decl which either doesn't exist or isn't a prototype. |
101 | N.B. Could be simplified if all built-in decls had complete prototypes | |
102 | (but this is presently difficult because some of them need FILE*). */ | |
103 | #define C_DECL_ISNT_PROTOTYPE(EXP) \ | |
104 | (EXP == 0 \ | |
f4da8dce | 105 | || (!prototype_p (TREE_TYPE (EXP)) \ |
339a28b9 | 106 | && !DECL_BUILT_IN (EXP))) |
96735c06 | 107 | |
40754343 RS |
108 | /* For FUNCTION_TYPE, a hidden list of types of arguments. The same as |
109 | TYPE_ARG_TYPES for functions with prototypes, but created for functions | |
110 | without prototypes. */ | |
95b4aca6 | 111 | #define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_LANG_SLOT_1 (NODE) |
4e28fa00 | 112 | |
928c19bb JM |
113 | /* For a CONSTRUCTOR, whether some initializer contains a |
114 | subexpression meaning it is not a constant expression. */ | |
115 | #define CONSTRUCTOR_NON_CONST(EXPR) TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK (EXPR)) | |
116 | ||
487a92fe JM |
117 | /* Record parser information about an expression that is irrelevant |
118 | for code generation alongside a tree representing its value. */ | |
119 | struct c_expr | |
120 | { | |
121 | /* The value of the expression. */ | |
122 | tree value; | |
100d537d | 123 | /* Record the original unary/binary operator of an expression, which may |
647eea9d | 124 | have been changed by fold, STRING_CST for unparenthesized string |
928c19bb JM |
125 | constants, C_MAYBE_CONST_EXPR for __builtin_constant_p calls |
126 | (even if parenthesized), for subexpressions, and for non-constant | |
127 | initializers, or ERROR_MARK for other expressions (including | |
916c5919 | 128 | parenthesized expressions). */ |
487a92fe | 129 | enum tree_code original_code; |
6866c6e8 ILT |
130 | /* If not NULL, the original type of an expression. This will |
131 | differ from the type of the value field for an enum constant. | |
132 | The type of an enum constant is a plain integer type, but this | |
133 | field will be the enum type. */ | |
134 | tree original_type; | |
ebedc9a3 DM |
135 | |
136 | /* The source range of this expression. This is redundant | |
137 | for node values that have locations, but not all node kinds | |
138 | have locations (e.g. constants, and references to params, locals, | |
139 | etc), so we stash a copy here. */ | |
140 | source_range src_range; | |
141 | ||
142 | /* Access to the first and last locations within the source spelling | |
143 | of this expression. */ | |
144 | location_t get_start () const { return src_range.m_start; } | |
145 | location_t get_finish () const { return src_range.m_finish; } | |
8a40fef3 DM |
146 | |
147 | /* Set the value to error_mark_node whilst ensuring that src_range | |
148 | is initialized. */ | |
149 | void set_error () | |
150 | { | |
151 | value = error_mark_node; | |
152 | src_range.m_start = UNKNOWN_LOCATION; | |
153 | src_range.m_finish = UNKNOWN_LOCATION; | |
154 | } | |
487a92fe JM |
155 | }; |
156 | ||
86785830 AS |
157 | /* Type alias for struct c_expr. This allows to use the structure |
158 | inside the VEC types. */ | |
159 | typedef struct c_expr c_expr_t; | |
160 | ||
81da229b JM |
161 | /* A kind of type specifier. Note that this information is currently |
162 | only used to distinguish tag definitions, tag references and typeof | |
163 | uses. */ | |
164 | enum c_typespec_kind { | |
9e5b2115 PB |
165 | /* No typespec. This appears only in struct c_declspec. */ |
166 | ctsk_none, | |
81da229b JM |
167 | /* A reserved keyword type specifier. */ |
168 | ctsk_resword, | |
169 | /* A reference to a tag, previously declared, such as "struct foo". | |
170 | This includes where the previous declaration was as a different | |
171 | kind of tag, in which case this is only valid if shadowing that | |
172 | tag in an inner scope. */ | |
173 | ctsk_tagref, | |
174 | /* A reference to a tag, not previously declared in a visible | |
175 | scope. */ | |
176 | ctsk_tagfirstref, | |
177 | /* A definition of a tag such as "struct foo { int a; }". */ | |
178 | ctsk_tagdef, | |
179 | /* A typedef name. */ | |
180 | ctsk_typedef, | |
181 | /* An ObjC-specific kind of type specifier. */ | |
182 | ctsk_objc, | |
267bac10 | 183 | /* A typeof specifier, or _Atomic ( type-name ). */ |
81da229b JM |
184 | ctsk_typeof |
185 | }; | |
186 | ||
187 | /* A type specifier: this structure is created in the parser and | |
188 | passed to declspecs_add_type only. */ | |
189 | struct c_typespec { | |
190 | /* What kind of type specifier this is. */ | |
191 | enum c_typespec_kind kind; | |
8415f317 NF |
192 | /* Whether the expression has operands suitable for use in constant |
193 | expressions. */ | |
194 | bool expr_const_operands; | |
81da229b JM |
195 | /* The specifier itself. */ |
196 | tree spec; | |
928c19bb JM |
197 | /* An expression to be evaluated before the type specifier, in the |
198 | case of typeof specifiers, or NULL otherwise or if no such | |
199 | expression is required for a particular typeof specifier. In | |
200 | particular, when typeof is applied to an expression of variably | |
201 | modified type, that expression must be evaluated in order to | |
202 | determine array sizes that form part of the type, but the | |
203 | expression itself (as opposed to the array sizes) forms no part | |
204 | of the type and so needs to be recorded separately. */ | |
205 | tree expr; | |
81da229b JM |
206 | }; |
207 | ||
d6a1dfd9 JM |
208 | /* A storage class specifier. */ |
209 | enum c_storage_class { | |
210 | csc_none, | |
211 | csc_auto, | |
212 | csc_extern, | |
213 | csc_register, | |
214 | csc_static, | |
215 | csc_typedef | |
216 | }; | |
217 | ||
98c3a782 | 218 | /* A type specifier keyword "void", "_Bool", "char", "int", "float", |
ab22c1fa CF |
219 | "double", "_Decimal32", "_Decimal64", "_Decimal128", "_Fract", "_Accum", |
220 | or none of these. */ | |
98c3a782 JM |
221 | enum c_typespec_keyword { |
222 | cts_none, | |
223 | cts_void, | |
224 | cts_bool, | |
225 | cts_char, | |
226 | cts_int, | |
227 | cts_float, | |
78a7c317 | 228 | cts_int_n, |
9a8ce21f JG |
229 | cts_double, |
230 | cts_dfloat32, | |
231 | cts_dfloat64, | |
ab22c1fa | 232 | cts_dfloat128, |
c65699ef | 233 | cts_floatn_nx, |
ab22c1fa | 234 | cts_fract, |
38b7bc7f JM |
235 | cts_accum, |
236 | cts_auto_type | |
98c3a782 JM |
237 | }; |
238 | ||
0b2c4be5 DS |
239 | /* This enum lists all the possible declarator specifiers, storage |
240 | class or attribute that a user can write. There is at least one | |
241 | enumerator per possible declarator specifier in the struct | |
242 | c_declspecs below. | |
243 | ||
244 | It is used to index the array of declspec locations in struct | |
245 | c_declspecs. */ | |
246 | enum c_declspec_word { | |
247 | cdw_typespec /* A catch-all for a typespec. */, | |
248 | cdw_storage_class /* A catch-all for a storage class */, | |
249 | cdw_attributes, | |
250 | cdw_typedef, | |
251 | cdw_explicit_signed, | |
252 | cdw_deprecated, | |
253 | cdw_default_int, | |
254 | cdw_long, | |
255 | cdw_long_long, | |
256 | cdw_short, | |
257 | cdw_signed, | |
258 | cdw_unsigned, | |
259 | cdw_complex, | |
260 | cdw_inline, | |
261 | cdw_noreturn, | |
262 | cdw_thread, | |
263 | cdw_const, | |
264 | cdw_volatile, | |
265 | cdw_restrict, | |
d6e83a8d | 266 | cdw_atomic, |
0b2c4be5 DS |
267 | cdw_saturating, |
268 | cdw_alignas, | |
269 | cdw_address_space, | |
1ee62b92 | 270 | cdw_gimple, |
0b2c4be5 DS |
271 | cdw_number_of_elements /* This one must always be the last |
272 | enumerator. */ | |
273 | }; | |
274 | ||
275 | /* A sequence of declaration specifiers in C. When a new declaration | |
276 | specifier is added, please update the enum c_declspec_word above | |
277 | accordingly. */ | |
deb176fa | 278 | struct c_declspecs { |
0b2c4be5 | 279 | source_location locations[cdw_number_of_elements]; |
98c3a782 JM |
280 | /* The type specified, if a single type specifier such as a struct, |
281 | union or enum specifier, typedef name or typeof specifies the | |
282 | whole type, or NULL_TREE if none or a keyword such as "void" or | |
283 | "char" is used. Does not include qualifiers. */ | |
deb176fa | 284 | tree type; |
928c19bb JM |
285 | /* Any expression to be evaluated before the type, from a typeof |
286 | specifier. */ | |
287 | tree expr; | |
deb176fa JM |
288 | /* The attributes from a typedef decl. */ |
289 | tree decl_attr; | |
290 | /* When parsing, the attributes. Outside the parser, this will be | |
291 | NULL; attributes (possibly from multiple lists) will be passed | |
292 | separately. */ | |
293 | tree attrs; | |
1ee62b92 PG |
294 | /* The pass to start compiling a __GIMPLE function with. */ |
295 | char *gimple_pass; | |
d19fa6b5 JM |
296 | /* The base-2 log of the greatest alignment required by an _Alignas |
297 | specifier, in bytes, or -1 if no such specifiers with nonzero | |
298 | alignment. */ | |
299 | int align_log; | |
78a7c317 DD |
300 | /* For the __intN declspec, this stores the index into the int_n_* arrays. */ |
301 | int int_n_idx; | |
c65699ef JM |
302 | /* For the _FloatN and _FloatNx declspec, this stores the index into |
303 | the floatn_nx_types array. */ | |
304 | int floatn_nx_idx; | |
d6a1dfd9 JM |
305 | /* The storage class specifier, or csc_none if none. */ |
306 | enum c_storage_class storage_class; | |
8415f317 NF |
307 | /* Any type specifier keyword used such as "int", not reflecting |
308 | modifiers such as "short", or cts_none if none. */ | |
309 | ENUM_BITFIELD (c_typespec_keyword) typespec_word : 8; | |
9e5b2115 PB |
310 | /* The kind of type specifier if one has been seen, ctsk_none |
311 | otherwise. */ | |
312 | ENUM_BITFIELD (c_typespec_kind) typespec_kind : 3; | |
928c19bb JM |
313 | /* Whether any expressions in typeof specifiers may appear in |
314 | constant expressions. */ | |
315 | BOOL_BITFIELD expr_const_operands : 1; | |
27bf414c JM |
316 | /* Whether any declaration specifiers have been seen at all. */ |
317 | BOOL_BITFIELD declspecs_seen_p : 1; | |
deb176fa JM |
318 | /* Whether something other than a storage class specifier or |
319 | attribute has been seen. This is used to warn for the | |
320 | obsolescent usage of storage class specifiers other than at the | |
321 | start of the list. (Doing this properly would require function | |
322 | specifiers to be handled separately from storage class | |
323 | specifiers.) */ | |
324 | BOOL_BITFIELD non_sc_seen_p : 1; | |
81da229b | 325 | /* Whether the type is specified by a typedef or typeof name. */ |
616aeba2 | 326 | BOOL_BITFIELD typedef_p : 1; |
98c3a782 JM |
327 | /* Whether the type is explicitly "signed" or specified by a typedef |
328 | whose type is explicitly "signed". */ | |
329 | BOOL_BITFIELD explicit_signed_p : 1; | |
deb176fa JM |
330 | /* Whether the specifiers include a deprecated typedef. */ |
331 | BOOL_BITFIELD deprecated_p : 1; | |
98c3a782 JM |
332 | /* Whether the type defaulted to "int" because there were no type |
333 | specifiers. */ | |
8415f317 | 334 | BOOL_BITFIELD default_int_p : 1; |
98c3a782 JM |
335 | /* Whether "long" was specified. */ |
336 | BOOL_BITFIELD long_p : 1; | |
deb176fa JM |
337 | /* Whether "long" was specified more than once. */ |
338 | BOOL_BITFIELD long_long_p : 1; | |
98c3a782 JM |
339 | /* Whether "short" was specified. */ |
340 | BOOL_BITFIELD short_p : 1; | |
341 | /* Whether "signed" was specified. */ | |
342 | BOOL_BITFIELD signed_p : 1; | |
343 | /* Whether "unsigned" was specified. */ | |
344 | BOOL_BITFIELD unsigned_p : 1; | |
345 | /* Whether "complex" was specified. */ | |
346 | BOOL_BITFIELD complex_p : 1; | |
d6a1dfd9 JM |
347 | /* Whether "inline" was specified. */ |
348 | BOOL_BITFIELD inline_p : 1; | |
bbceee64 JM |
349 | /* Whether "_Noreturn" was speciied. */ |
350 | BOOL_BITFIELD noreturn_p : 1; | |
582d9b50 | 351 | /* Whether "__thread" or "_Thread_local" was specified. */ |
d6a1dfd9 | 352 | BOOL_BITFIELD thread_p : 1; |
582d9b50 JM |
353 | /* Whether "__thread" rather than "_Thread_local" was specified. */ |
354 | BOOL_BITFIELD thread_gnu_p : 1; | |
3b53cddc JM |
355 | /* Whether "const" was specified. */ |
356 | BOOL_BITFIELD const_p : 1; | |
357 | /* Whether "volatile" was specified. */ | |
358 | BOOL_BITFIELD volatile_p : 1; | |
359 | /* Whether "restrict" was specified. */ | |
360 | BOOL_BITFIELD restrict_p : 1; | |
267bac10 JM |
361 | /* Whether "_Atomic" was specified. */ |
362 | BOOL_BITFIELD atomic_p : 1; | |
ab22c1fa CF |
363 | /* Whether "_Sat" was specified. */ |
364 | BOOL_BITFIELD saturating_p : 1; | |
d19fa6b5 JM |
365 | /* Whether any alignment specifier (even with zero alignment) was |
366 | specified. */ | |
367 | BOOL_BITFIELD alignas_p : 1; | |
1ee62b92 PG |
368 | /* Whether any __GIMPLE specifier was specified. */ |
369 | BOOL_BITFIELD gimple_p : 1; | |
36c5e70a BE |
370 | /* The address space that the declaration belongs to. */ |
371 | addr_space_t address_space; | |
deb176fa JM |
372 | }; |
373 | ||
f8893e47 JM |
374 | /* The various kinds of declarators in C. */ |
375 | enum c_declarator_kind { | |
376 | /* An identifier. */ | |
377 | cdk_id, | |
378 | /* A function. */ | |
379 | cdk_function, | |
380 | /* An array. */ | |
381 | cdk_array, | |
382 | /* A pointer. */ | |
383 | cdk_pointer, | |
384 | /* Parenthesized declarator with nested attributes. */ | |
385 | cdk_attrs | |
386 | }; | |
387 | ||
a79683d5 | 388 | struct c_arg_tag { |
e60bf9d4 NF |
389 | /* The argument name. */ |
390 | tree id; | |
391 | /* The type of the argument. */ | |
392 | tree type; | |
a79683d5 | 393 | }; |
e60bf9d4 | 394 | |
e60bf9d4 | 395 | |
f8893e47 JM |
396 | /* Information about the parameters in a function declarator. */ |
397 | struct c_arg_info { | |
398 | /* A list of parameter decls. */ | |
399 | tree parms; | |
400 | /* A list of structure, union and enum tags defined. */ | |
9771b263 | 401 | vec<c_arg_tag, va_gc> *tags; |
f8893e47 JM |
402 | /* A list of argument types to go in the FUNCTION_TYPE. */ |
403 | tree types; | |
404 | /* A list of non-parameter decls (notably enumeration constants) | |
405 | defined with the parameters. */ | |
406 | tree others; | |
a04a722b JM |
407 | /* A compound expression of VLA sizes from the parameters, or NULL. |
408 | In a function definition, these are used to ensure that | |
409 | side-effects in sizes of arrays converted to pointers (such as a | |
410 | parameter int i[n++]) take place; otherwise, they are | |
411 | ignored. */ | |
412 | tree pending_sizes; | |
52ffd86e MS |
413 | /* True when these arguments had [*]. */ |
414 | BOOL_BITFIELD had_vla_unspec : 1; | |
f8893e47 JM |
415 | }; |
416 | ||
417 | /* A declarator. */ | |
418 | struct c_declarator { | |
419 | /* The kind of declarator. */ | |
420 | enum c_declarator_kind kind; | |
8415f317 | 421 | location_t id_loc; /* Currently only set for cdk_id, cdk_array. */ |
f8893e47 JM |
422 | /* Except for cdk_id, the contained declarator. For cdk_id, NULL. */ |
423 | struct c_declarator *declarator; | |
424 | union { | |
425 | /* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract | |
426 | declarator. */ | |
427 | tree id; | |
428 | /* For functions. */ | |
429 | struct c_arg_info *arg_info; | |
430 | /* For arrays. */ | |
431 | struct { | |
432 | /* The array dimension, or NULL for [] and [*]. */ | |
433 | tree dimen; | |
3b53cddc JM |
434 | /* The qualifiers inside []. */ |
435 | int quals; | |
436 | /* The attributes (currently ignored) inside []. */ | |
437 | tree attrs; | |
f8893e47 JM |
438 | /* Whether [static] was used. */ |
439 | BOOL_BITFIELD static_p : 1; | |
440 | /* Whether [*] was used. */ | |
441 | BOOL_BITFIELD vla_unspec_p : 1; | |
442 | } array; | |
443 | /* For pointers, the qualifiers on the pointer type. */ | |
3b53cddc | 444 | int pointer_quals; |
f8893e47 JM |
445 | /* For attributes. */ |
446 | tree attrs; | |
447 | } u; | |
448 | }; | |
449 | ||
450 | /* A type name. */ | |
451 | struct c_type_name { | |
452 | /* The declaration specifiers. */ | |
deb176fa | 453 | struct c_declspecs *specs; |
f8893e47 JM |
454 | /* The declarator. */ |
455 | struct c_declarator *declarator; | |
456 | }; | |
457 | ||
458 | /* A parameter. */ | |
459 | struct c_parm { | |
460 | /* The declaration specifiers, minus any prefix attributes. */ | |
deb176fa | 461 | struct c_declspecs *specs; |
f8893e47 JM |
462 | /* The attributes. */ |
463 | tree attrs; | |
464 | /* The declarator. */ | |
465 | struct c_declarator *declarator; | |
466 | }; | |
467 | ||
7114359f TT |
468 | /* Used when parsing an enum. Initialized by start_enum. */ |
469 | struct c_enum_contents | |
470 | { | |
471 | /* While defining an enum type, this is 1 plus the last enumerator | |
472 | constant value. */ | |
473 | tree enum_next_value; | |
474 | ||
475 | /* Nonzero means that there was overflow computing enum_next_value. */ | |
476 | int enum_overflow; | |
477 | }; | |
478 | ||
991d6621 JM |
479 | /* A type of reference to a static identifier in an inline |
480 | function. */ | |
481 | enum c_inline_static_type { | |
482 | /* Identifier with internal linkage used in function that may be an | |
483 | inline definition (i.e., file-scope static). */ | |
484 | csi_internal, | |
485 | /* Modifiable object with static storage duration defined in | |
486 | function that may be an inline definition (i.e., local | |
487 | static). */ | |
488 | csi_modifiable | |
489 | }; | |
490 | ||
7c57c798 | 491 | \f |
27bf414c | 492 | /* in c-parser.c */ |
2f6e4e97 | 493 | extern void c_parse_init (void); |
1a4f11c8 | 494 | extern bool c_keyword_starts_typename (enum rid keyword); |
1526a060 | 495 | |
7c57c798 | 496 | /* in c-aux-info.c */ |
2f6e4e97 | 497 | extern void gen_aux_info_record (tree, int, int, int); |
40754343 | 498 | |
7c57c798 | 499 | /* in c-decl.c */ |
e1b7793c | 500 | struct c_spot_bindings; |
dc491a25 | 501 | struct c_struct_parse_info; |
bc4b653b | 502 | extern struct obstack parser_obstack; |
506e2710 RH |
503 | extern tree c_break_label; |
504 | extern tree c_cont_label; | |
cfe79ecf | 505 | |
c99c0026 | 506 | extern bool global_bindings_p (void); |
f75fbaf7 ZW |
507 | extern void push_scope (void); |
508 | extern tree pop_scope (void); | |
e1b7793c ILT |
509 | extern void c_bindings_start_stmt_expr (struct c_spot_bindings *); |
510 | extern void c_bindings_end_stmt_expr (struct c_spot_bindings *); | |
2f6e4e97 | 511 | |
991d6621 JM |
512 | extern void record_inline_static (location_t, tree, tree, |
513 | enum c_inline_static_type); | |
2f6e4e97 | 514 | extern void c_init_decl_processing (void); |
2f6e4e97 | 515 | extern void c_print_identifier (FILE *, tree, int); |
3b53cddc | 516 | extern int quals_from_declspecs (const struct c_declspecs *); |
c2255bc4 AH |
517 | extern struct c_declarator *build_array_declarator (location_t, tree, |
518 | struct c_declspecs *, | |
deb176fa | 519 | bool, bool); |
7370e0da AC |
520 | extern tree build_enumerator (location_t, location_t, struct c_enum_contents *, |
521 | tree, tree); | |
f05b9d93 | 522 | extern tree check_for_loop_decls (location_t, bool); |
55d54003 | 523 | extern void mark_forward_parm_decls (void); |
eb1dfbb2 | 524 | extern void declare_parm_level (void); |
c2255bc4 | 525 | extern void undeclared_variable (location_t, tree); |
e1b7793c | 526 | extern tree lookup_label_for_goto (location_t, tree); |
14e33ee8 | 527 | extern tree declare_label (tree); |
5b030314 | 528 | extern tree define_label (location_t, tree); |
e1b7793c ILT |
529 | extern struct c_spot_bindings *c_get_switch_bindings (void); |
530 | extern void c_release_switch_bindings (struct c_spot_bindings *); | |
531 | extern bool c_check_switch_jump_warnings (struct c_spot_bindings *, | |
532 | location_t, location_t); | |
c2255bc4 | 533 | extern void finish_decl (tree, location_t, tree, tree, tree); |
2f6e4e97 | 534 | extern tree finish_enum (tree, tree, tree); |
4a46cbfb | 535 | extern void finish_function (void); |
dc491a25 ILT |
536 | extern tree finish_struct (location_t, tree, tree, tree, |
537 | struct c_struct_parse_info *); | |
b3399d18 | 538 | extern struct c_arg_info *build_arg_info (void); |
a04a722b | 539 | extern struct c_arg_info *get_parm_info (bool, tree); |
3d10ed6c AH |
540 | extern tree grokfield (location_t, struct c_declarator *, |
541 | struct c_declspecs *, tree, tree *); | |
928c19bb | 542 | extern tree groktypename (struct c_type_name *, tree *, bool *); |
a04a722b | 543 | extern tree grokparm (const struct c_parm *, tree *); |
c2255bc4 | 544 | extern tree implicitly_declare (location_t, tree); |
2f6e4e97 | 545 | extern void keep_next_level (void); |
2f6e4e97 | 546 | extern void pending_xref_error (void); |
d2784db4 PB |
547 | extern void c_push_function_context (void); |
548 | extern void c_pop_function_context (void); | |
a04a722b | 549 | extern void push_parm_decl (const struct c_parm *, tree *); |
f8893e47 | 550 | extern struct c_declarator *set_array_declarator_inner (struct c_declarator *, |
6ac0194d | 551 | struct c_declarator *); |
c79efc4d | 552 | extern tree c_builtin_function (tree); |
5779e713 | 553 | extern tree c_builtin_function_ext_scope (tree); |
deb176fa JM |
554 | extern void shadow_tag (const struct c_declspecs *); |
555 | extern void shadow_tag_warned (const struct c_declspecs *, int); | |
c2255bc4 | 556 | extern tree start_enum (location_t, struct c_enum_contents *, tree); |
deb176fa JM |
557 | extern int start_function (struct c_declspecs *, struct c_declarator *, tree); |
558 | extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool, | |
559 | tree); | |
dc491a25 ILT |
560 | extern tree start_struct (location_t, enum tree_code, tree, |
561 | struct c_struct_parse_info **); | |
2f6e4e97 | 562 | extern void store_parm_decls (void); |
f8893e47 | 563 | extern void store_parm_decls_from (struct c_arg_info *); |
acf0174b JJ |
564 | extern void temp_store_parm_decls (tree, tree); |
565 | extern void temp_pop_parm_decls (void); | |
2f6e4e97 | 566 | extern tree xref_tag (enum tree_code, tree); |
c2255bc4 | 567 | extern struct c_typespec parser_xref_tag (location_t, enum tree_code, tree); |
deb176fa JM |
568 | extern struct c_parm *build_c_parm (struct c_declspecs *, tree, |
569 | struct c_declarator *); | |
f8893e47 JM |
570 | extern struct c_declarator *build_attrs_declarator (tree, |
571 | struct c_declarator *); | |
572 | extern struct c_declarator *build_function_declarator (struct c_arg_info *, | |
573 | struct c_declarator *); | |
574 | extern struct c_declarator *build_id_declarator (tree); | |
deb176fa | 575 | extern struct c_declarator *make_pointer_declarator (struct c_declspecs *, |
f8893e47 | 576 | struct c_declarator *); |
deb176fa | 577 | extern struct c_declspecs *build_null_declspecs (void); |
0b2c4be5 DS |
578 | extern struct c_declspecs *declspecs_add_qual (source_location, |
579 | struct c_declspecs *, tree); | |
dc491a25 ILT |
580 | extern struct c_declspecs *declspecs_add_type (location_t, |
581 | struct c_declspecs *, | |
81da229b | 582 | struct c_typespec); |
0b2c4be5 DS |
583 | extern struct c_declspecs *declspecs_add_scspec (source_location, |
584 | struct c_declspecs *, tree); | |
585 | extern struct c_declspecs *declspecs_add_attrs (source_location, | |
586 | struct c_declspecs *, tree); | |
587 | extern struct c_declspecs *declspecs_add_addrspace (source_location, | |
588 | struct c_declspecs *, | |
36c5e70a | 589 | addr_space_t); |
0b2c4be5 DS |
590 | extern struct c_declspecs *declspecs_add_alignas (source_location, |
591 | struct c_declspecs *, tree); | |
98c3a782 | 592 | extern struct c_declspecs *finish_declspecs (struct c_declspecs *); |
f797f486 NP |
593 | |
594 | /* in c-objc-common.c */ | |
2f6e4e97 | 595 | extern bool c_objc_common_init (void); |
6de9cd9a | 596 | extern bool c_missing_noreturn_ok_p (tree); |
ac7d7749 | 597 | extern bool c_warn_unused_global_decl (const_tree); |
ede1a387 | 598 | extern void c_initialize_diagnostics (diagnostic_context *); |
52ffd86e | 599 | extern bool c_vla_unspec_p (tree x, tree fn); |
f797f486 | 600 | |
7c57c798 | 601 | /* in c-typeck.c */ |
bc4b653b JM |
602 | extern int in_alignof; |
603 | extern int in_sizeof; | |
604 | extern int in_typeof; | |
605 | ||
1a4049e7 JJ |
606 | extern tree c_last_sizeof_arg; |
607 | ||
506e2710 | 608 | extern struct c_switch *c_switch_stack; |
d1bd0ded | 609 | |
ba47d38d | 610 | extern tree c_objc_common_truthvalue_conversion (location_t, tree); |
4f2e1536 | 611 | extern tree require_complete_type (location_t, tree); |
58f9752a | 612 | extern int same_translation_unit_p (const_tree, const_tree); |
132da1a5 | 613 | extern int comptypes (tree, tree); |
dc5027f4 | 614 | extern int comptypes_check_different_types (tree, tree, bool *); |
ac7d7749 | 615 | extern bool c_vla_type_p (const_tree); |
2f6e4e97 | 616 | extern bool c_mark_addressable (tree); |
4f2e1536 | 617 | extern void c_incomplete_type_error (location_t, const_tree, const_tree); |
2f6e4e97 | 618 | extern tree c_type_promotes_to (tree); |
c2255bc4 | 619 | extern struct c_expr default_function_array_conversion (location_t, |
ebfbbdc5 JJ |
620 | struct c_expr); |
621 | extern struct c_expr default_function_array_read_conversion (location_t, | |
622 | struct c_expr); | |
267bac10 JM |
623 | extern struct c_expr convert_lvalue_to_rvalue (location_t, struct c_expr, |
624 | bool, bool); | |
ebfbbdc5 | 625 | extern void mark_exp_read (tree); |
10bc1b1b | 626 | extern tree composite_type (tree, tree); |
6ffd47b7 | 627 | extern tree build_component_ref (location_t, tree, tree, location_t); |
c2255bc4 AH |
628 | extern tree build_array_ref (location_t, tree, tree); |
629 | extern tree build_external_ref (location_t, tree, int, tree *); | |
bc4b653b | 630 | extern void pop_maybe_used (bool); |
c2255bc4 AH |
631 | extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr); |
632 | extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *); | |
633 | extern struct c_expr parser_build_unary_op (location_t, enum tree_code, | |
634 | struct c_expr); | |
b8698a0f | 635 | extern struct c_expr parser_build_binary_op (location_t, |
ba47d38d | 636 | enum tree_code, struct c_expr, |
487a92fe | 637 | struct c_expr); |
d130ae11 ILT |
638 | extern tree build_conditional_expr (location_t, tree, bool, tree, tree, |
639 | tree, tree); | |
c2255bc4 AH |
640 | extern tree build_compound_expr (location_t, tree, tree); |
641 | extern tree c_cast_expr (location_t, struct c_type_name *, tree); | |
642 | extern tree build_c_cast (location_t, tree, tree); | |
643 | extern void store_init_value (location_t, tree, tree, tree); | |
d033409e | 644 | extern void maybe_warn_string_init (location_t, tree, struct c_expr); |
2f6e4e97 AJ |
645 | extern void start_init (tree, tree, int); |
646 | extern void finish_init (void); | |
647 | extern void really_start_incremental_init (tree); | |
16595a1f | 648 | extern void finish_implicit_inits (location_t, struct obstack *); |
ea58ef42 MP |
649 | extern void push_init_level (location_t, int, struct obstack *); |
650 | extern struct c_expr pop_init_level (location_t, int, struct obstack *); | |
651 | extern void set_init_index (location_t, tree, tree, struct obstack *); | |
f7e4f2e3 | 652 | extern void set_init_label (location_t, tree, location_t, struct obstack *); |
34cf811f MP |
653 | extern void process_init_element (location_t, struct c_expr, bool, |
654 | struct obstack *); | |
c2255bc4 AH |
655 | extern tree build_compound_literal (location_t, tree, tree, bool); |
656 | extern void check_compound_literal_type (location_t, struct c_type_name *); | |
fedfecef | 657 | extern tree c_start_case (location_t, location_t, tree, bool); |
083e891e | 658 | extern void c_finish_case (tree, tree); |
1c384bf1 | 659 | extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool); |
9f0e2d86 | 660 | extern tree build_asm_stmt (tree, tree); |
6de9cd9a | 661 | extern int c_types_compatible_p (tree, tree); |
325c3691 | 662 | extern tree c_begin_compound_stmt (bool); |
c2255bc4 | 663 | extern tree c_end_compound_stmt (location_t, tree, bool); |
99cd9857 | 664 | extern void c_finish_if_stmt (location_t, tree, tree, tree); |
506e2710 | 665 | extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool); |
325c3691 | 666 | extern tree c_begin_stmt_expr (void); |
c2255bc4 AH |
667 | extern tree c_finish_stmt_expr (location_t, tree); |
668 | extern tree c_process_expr_stmt (location_t, tree); | |
669 | extern tree c_finish_expr_stmt (location_t, tree); | |
670 | extern tree c_finish_return (location_t, tree, tree); | |
671 | extern tree c_finish_bc_stmt (location_t, tree *, bool); | |
672 | extern tree c_finish_goto_label (location_t, tree); | |
673 | extern tree c_finish_goto_ptr (location_t, tree); | |
51eed280 | 674 | extern tree c_expr_to_decl (tree, bool *, bool *); |
88bae6f4 | 675 | extern tree c_finish_omp_construct (location_t, enum tree_code, tree, tree); |
41dbbb37 | 676 | extern tree c_finish_oacc_data (location_t, tree, tree); |
37d5ad46 | 677 | extern tree c_finish_oacc_host_data (location_t, tree, tree); |
953ff289 | 678 | extern tree c_begin_omp_parallel (void); |
c2255bc4 | 679 | extern tree c_finish_omp_parallel (location_t, tree, tree); |
a68ab351 | 680 | extern tree c_begin_omp_task (void); |
c2255bc4 | 681 | extern tree c_finish_omp_task (location_t, tree, tree); |
acf0174b JJ |
682 | extern void c_finish_omp_cancel (location_t, tree); |
683 | extern void c_finish_omp_cancellation_point (location_t, tree); | |
77886428 | 684 | extern tree c_finish_omp_clauses (tree, enum c_omp_region_type); |
f187980b | 685 | extern tree c_build_va_arg (location_t, tree, location_t, tree); |
0a35513e | 686 | extern tree c_finish_transaction (location_t, tree, int); |
acf0174b | 687 | extern bool c_tree_equal (tree, tree); |
8edbfaa6 JJ |
688 | extern tree c_build_function_call_vec (location_t, vec<location_t>, tree, |
689 | vec<tree, va_gc> *, vec<tree, va_gc> *); | |
9dc5773f | 690 | extern tree c_omp_clause_copy_ctor (tree, tree, tree); |
40754343 RS |
691 | |
692 | /* Set to 0 at beginning of a function definition, set to 1 if | |
693 | a return statement that specifies a return value is seen. */ | |
694 | ||
695 | extern int current_function_returns_value; | |
696 | ||
697 | /* Set to 0 at beginning of a function definition, set to 1 if | |
698 | a return statement with no argument is seen. */ | |
699 | ||
700 | extern int current_function_returns_null; | |
701 | ||
5ce89b2e JM |
702 | /* Set to 0 at beginning of a function definition, set to 1 if |
703 | a call to a noreturn function is seen. */ | |
704 | ||
705 | extern int current_function_returns_abnormally; | |
706 | ||
0bb0a00b | 707 | /* In c-decl.c */ |
ddc8de03 PM |
708 | |
709 | /* Tell the binding oracle what kind of binding we are looking for. */ | |
710 | ||
711 | enum c_oracle_request | |
712 | { | |
713 | C_ORACLE_SYMBOL, | |
714 | C_ORACLE_TAG, | |
715 | C_ORACLE_LABEL | |
716 | }; | |
717 | ||
718 | /* If this is non-NULL, then it is a "binding oracle" which can lazily | |
719 | create bindings when needed by the C compiler. The oracle is told | |
720 | the name and type of the binding to create. It can call pushdecl | |
721 | or the like to ensure the binding is visible; or do nothing, | |
722 | leaving the binding untouched. c-decl.c takes note of when the | |
723 | oracle has been called and will not call it again if it fails to | |
724 | create a given binding. */ | |
725 | ||
726 | typedef void c_binding_oracle_function (enum c_oracle_request, tree identifier); | |
727 | ||
728 | extern c_binding_oracle_function *c_binding_oracle; | |
729 | ||
2f6e4e97 | 730 | extern void c_finish_incomplete_decl (tree); |
acf0174b JJ |
731 | extern tree c_omp_reduction_id (enum tree_code, tree); |
732 | extern tree c_omp_reduction_decl (tree); | |
733 | extern tree c_omp_reduction_lookup (tree, tree); | |
734 | extern tree c_check_omp_declare_reduction_r (tree *, int *, void *); | |
ddc8de03 PM |
735 | extern void c_pushtag (location_t, tree, tree); |
736 | extern void c_bind (location_t, tree, bool); | |
0e36f5c7 | 737 | extern bool tag_exists_p (enum tree_code, tree); |
0bb0a00b | 738 | |
59cc9210 | 739 | /* In c-errors.c */ |
d6e83a8d | 740 | extern bool pedwarn_c90 (location_t, int opt, const char *, ...) |
f3bede71 | 741 | ATTRIBUTE_GCC_DIAG(3,4); |
35aff4fb | 742 | extern bool pedwarn_c99 (location_t, int opt, const char *, ...) |
f3bede71 | 743 | ATTRIBUTE_GCC_DIAG(3,4); |
148e4216 | 744 | |
ebedc9a3 DM |
745 | extern void |
746 | set_c_expr_source_range (c_expr *expr, | |
747 | location_t start, location_t finish); | |
748 | ||
749 | extern void | |
750 | set_c_expr_source_range (c_expr *expr, | |
751 | source_range src_range); | |
752 | ||
4250754e JM |
753 | /* In c-fold.c */ |
754 | extern tree decl_constant_value_for_optimization (tree); | |
755 | ||
d25c7690 PK |
756 | extern vec<tree> incomplete_record_decls; |
757 | ||
88657302 | 758 | #endif /* ! GCC_C_TREE_H */ |