]>
Commit | Line | Data |
---|---|---|
907a24a1 | 1 | /* Definitions for C parsing and type checking. |
d353bf18 | 2 | Copyright (C) 1987-2015 Free Software Foundation, Inc. |
907a24a1 | 3 | |
f12b58b3 | 4 | This file is part of GCC. |
907a24a1 | 5 | |
f12b58b3 | 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 | |
8c4c00c1 | 8 | Software Foundation; either version 3, or (at your option) any later |
f12b58b3 | 9 | version. |
907a24a1 | 10 | |
f12b58b3 | 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. | |
907a24a1 | 15 | |
16 | You should have received a copy of the GNU General Public License | |
8c4c00c1 | 17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ | |
907a24a1 | 19 | |
2a281353 | 20 | #ifndef GCC_C_TREE_H |
21 | #define GCC_C_TREE_H | |
7ba2cd99 | 22 | |
7bedc3a0 | 23 | #include "c-family/c-common.h" |
31266980 | 24 | #include "diagnostic.h" |
72040e7e | 25 | |
56533c31 | 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 *)) | |
907a24a1 | 30 | |
907a24a1 | 31 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ |
163d43d8 | 32 | #define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1 (TYPE) |
907a24a1 | 33 | |
34 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is volatile. */ | |
163d43d8 | 35 | #define C_TYPE_FIELDS_VOLATILE(TYPE) TREE_LANG_FLAG_2 (TYPE) |
907a24a1 | 36 | |
37 | /* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE | |
38 | nonzero if the definition of the type has already started. */ | |
163d43d8 | 39 | #define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE) |
3e0a85c2 | 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) | |
907a24a1 | 44 | |
518796ad | 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. */ | |
163d43d8 | 48 | #define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID) |
518796ad | 49 | |
907a24a1 | 50 | /* Record whether a type or decl was written with nonconstant size. |
51 | Note that TYPE_SIZE may have simplified to a constant. */ | |
163d43d8 | 52 | #define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE) |
53 | #define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE) | |
907a24a1 | 54 | |
0b09525f | 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 | ||
d9c77450 | 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 | ||
907a24a1 | 62 | /* Record whether a typedef for type `int' was actually `signed int'. */ |
163d43d8 | 63 | #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP) |
907a24a1 | 64 | |
af857942 | 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 | ||
31ddae9f | 69 | /* For a FUNCTION_DECL, nonzero if it was an implicit declaration. */ |
70 | #define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP) | |
71 | ||
87d59e72 | 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 | ||
393b349a | 75 | /* For FUNCTION_DECLs, evaluates true if the decl is built-in but has |
76 | been declared. */ | |
f5d156fd | 77 | #define C_DECL_DECLARED_BUILTIN(EXP) \ |
78 | DECL_LANG_FLAG_3 (FUNCTION_DECL_CHECK (EXP)) | |
31ddae9f | 79 | |
3eafcdb5 | 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 | ||
7746224a | 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. */ | |
4194491a | 88 | #define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4 (EXP) |
7746224a | 89 | |
9823d3a9 | 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. */ | |
f5d156fd | 94 | #define C_DECL_USED(EXP) DECL_LANG_FLAG_5 (FUNCTION_DECL_CHECK (EXP)) |
9823d3a9 | 95 | |
1e8e9920 | 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 | ||
31ddae9f | 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 \ | |
a36cf284 | 105 | || (!prototype_p (TREE_TYPE (EXP)) \ |
31ddae9f | 106 | && !DECL_BUILT_IN (EXP))) |
20f91811 | 107 | |
907a24a1 | 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. */ | |
3cb98335 | 111 | #define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_LANG_SLOT_1 (NODE) |
ad9afbbd | 112 | |
a75b1c71 | 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 | ||
066f26bf | 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; | |
82012ffe | 123 | /* Record the original unary/binary operator of an expression, which may |
2fb89879 | 124 | have been changed by fold, STRING_CST for unparenthesized string |
a75b1c71 | 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 | |
3ad5f027 | 128 | parenthesized expressions). */ |
066f26bf | 129 | enum tree_code original_code; |
841fdaa6 | 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; | |
066f26bf | 135 | }; |
136 | ||
a11dda8e | 137 | /* Type alias for struct c_expr. This allows to use the structure |
138 | inside the VEC types. */ | |
139 | typedef struct c_expr c_expr_t; | |
140 | ||
19702c1d | 141 | /* A kind of type specifier. Note that this information is currently |
142 | only used to distinguish tag definitions, tag references and typeof | |
143 | uses. */ | |
144 | enum c_typespec_kind { | |
ae5ead32 | 145 | /* No typespec. This appears only in struct c_declspec. */ |
146 | ctsk_none, | |
19702c1d | 147 | /* A reserved keyword type specifier. */ |
148 | ctsk_resword, | |
149 | /* A reference to a tag, previously declared, such as "struct foo". | |
150 | This includes where the previous declaration was as a different | |
151 | kind of tag, in which case this is only valid if shadowing that | |
152 | tag in an inner scope. */ | |
153 | ctsk_tagref, | |
154 | /* A reference to a tag, not previously declared in a visible | |
155 | scope. */ | |
156 | ctsk_tagfirstref, | |
157 | /* A definition of a tag such as "struct foo { int a; }". */ | |
158 | ctsk_tagdef, | |
159 | /* A typedef name. */ | |
160 | ctsk_typedef, | |
161 | /* An ObjC-specific kind of type specifier. */ | |
162 | ctsk_objc, | |
b560fabd | 163 | /* A typeof specifier, or _Atomic ( type-name ). */ |
19702c1d | 164 | ctsk_typeof |
165 | }; | |
166 | ||
167 | /* A type specifier: this structure is created in the parser and | |
168 | passed to declspecs_add_type only. */ | |
169 | struct c_typespec { | |
170 | /* What kind of type specifier this is. */ | |
171 | enum c_typespec_kind kind; | |
561ba0aa | 172 | /* Whether the expression has operands suitable for use in constant |
173 | expressions. */ | |
174 | bool expr_const_operands; | |
19702c1d | 175 | /* The specifier itself. */ |
176 | tree spec; | |
a75b1c71 | 177 | /* An expression to be evaluated before the type specifier, in the |
178 | case of typeof specifiers, or NULL otherwise or if no such | |
179 | expression is required for a particular typeof specifier. In | |
180 | particular, when typeof is applied to an expression of variably | |
181 | modified type, that expression must be evaluated in order to | |
182 | determine array sizes that form part of the type, but the | |
183 | expression itself (as opposed to the array sizes) forms no part | |
184 | of the type and so needs to be recorded separately. */ | |
185 | tree expr; | |
19702c1d | 186 | }; |
187 | ||
9c08427a | 188 | /* A storage class specifier. */ |
189 | enum c_storage_class { | |
190 | csc_none, | |
191 | csc_auto, | |
192 | csc_extern, | |
193 | csc_register, | |
194 | csc_static, | |
195 | csc_typedef | |
196 | }; | |
197 | ||
70dd11f7 | 198 | /* A type specifier keyword "void", "_Bool", "char", "int", "float", |
9421ebb9 | 199 | "double", "_Decimal32", "_Decimal64", "_Decimal128", "_Fract", "_Accum", |
200 | or none of these. */ | |
70dd11f7 | 201 | enum c_typespec_keyword { |
202 | cts_none, | |
203 | cts_void, | |
204 | cts_bool, | |
205 | cts_char, | |
206 | cts_int, | |
207 | cts_float, | |
9f75f026 | 208 | cts_int_n, |
c4503c0a | 209 | cts_double, |
210 | cts_dfloat32, | |
211 | cts_dfloat64, | |
9421ebb9 | 212 | cts_dfloat128, |
213 | cts_fract, | |
4fba5eb9 | 214 | cts_accum, |
215 | cts_auto_type | |
70dd11f7 | 216 | }; |
217 | ||
a60f3e81 | 218 | /* This enum lists all the possible declarator specifiers, storage |
219 | class or attribute that a user can write. There is at least one | |
220 | enumerator per possible declarator specifier in the struct | |
221 | c_declspecs below. | |
222 | ||
223 | It is used to index the array of declspec locations in struct | |
224 | c_declspecs. */ | |
225 | enum c_declspec_word { | |
226 | cdw_typespec /* A catch-all for a typespec. */, | |
227 | cdw_storage_class /* A catch-all for a storage class */, | |
228 | cdw_attributes, | |
229 | cdw_typedef, | |
230 | cdw_explicit_signed, | |
231 | cdw_deprecated, | |
232 | cdw_default_int, | |
233 | cdw_long, | |
234 | cdw_long_long, | |
235 | cdw_short, | |
236 | cdw_signed, | |
237 | cdw_unsigned, | |
238 | cdw_complex, | |
239 | cdw_inline, | |
240 | cdw_noreturn, | |
241 | cdw_thread, | |
242 | cdw_const, | |
243 | cdw_volatile, | |
244 | cdw_restrict, | |
245 | cdw_saturating, | |
246 | cdw_alignas, | |
247 | cdw_address_space, | |
248 | cdw_number_of_elements /* This one must always be the last | |
249 | enumerator. */ | |
250 | }; | |
251 | ||
252 | /* A sequence of declaration specifiers in C. When a new declaration | |
253 | specifier is added, please update the enum c_declspec_word above | |
254 | accordingly. */ | |
9553111d | 255 | struct c_declspecs { |
a60f3e81 | 256 | source_location locations[cdw_number_of_elements]; |
70dd11f7 | 257 | /* The type specified, if a single type specifier such as a struct, |
258 | union or enum specifier, typedef name or typeof specifies the | |
259 | whole type, or NULL_TREE if none or a keyword such as "void" or | |
260 | "char" is used. Does not include qualifiers. */ | |
9553111d | 261 | tree type; |
a75b1c71 | 262 | /* Any expression to be evaluated before the type, from a typeof |
263 | specifier. */ | |
264 | tree expr; | |
9553111d | 265 | /* The attributes from a typedef decl. */ |
266 | tree decl_attr; | |
267 | /* When parsing, the attributes. Outside the parser, this will be | |
268 | NULL; attributes (possibly from multiple lists) will be passed | |
269 | separately. */ | |
270 | tree attrs; | |
83e25171 | 271 | /* The base-2 log of the greatest alignment required by an _Alignas |
272 | specifier, in bytes, or -1 if no such specifiers with nonzero | |
273 | alignment. */ | |
274 | int align_log; | |
9f75f026 | 275 | /* For the __intN declspec, this stores the index into the int_n_* arrays. */ |
276 | int int_n_idx; | |
9c08427a | 277 | /* The storage class specifier, or csc_none if none. */ |
278 | enum c_storage_class storage_class; | |
561ba0aa | 279 | /* Any type specifier keyword used such as "int", not reflecting |
280 | modifiers such as "short", or cts_none if none. */ | |
281 | ENUM_BITFIELD (c_typespec_keyword) typespec_word : 8; | |
ae5ead32 | 282 | /* The kind of type specifier if one has been seen, ctsk_none |
283 | otherwise. */ | |
284 | ENUM_BITFIELD (c_typespec_kind) typespec_kind : 3; | |
a75b1c71 | 285 | /* Whether any expressions in typeof specifiers may appear in |
286 | constant expressions. */ | |
287 | BOOL_BITFIELD expr_const_operands : 1; | |
1576dec7 | 288 | /* Whether any declaration specifiers have been seen at all. */ |
289 | BOOL_BITFIELD declspecs_seen_p : 1; | |
9553111d | 290 | /* Whether something other than a storage class specifier or |
291 | attribute has been seen. This is used to warn for the | |
292 | obsolescent usage of storage class specifiers other than at the | |
293 | start of the list. (Doing this properly would require function | |
294 | specifiers to be handled separately from storage class | |
295 | specifiers.) */ | |
296 | BOOL_BITFIELD non_sc_seen_p : 1; | |
19702c1d | 297 | /* Whether the type is specified by a typedef or typeof name. */ |
490eec42 | 298 | BOOL_BITFIELD typedef_p : 1; |
70dd11f7 | 299 | /* Whether the type is explicitly "signed" or specified by a typedef |
300 | whose type is explicitly "signed". */ | |
301 | BOOL_BITFIELD explicit_signed_p : 1; | |
9553111d | 302 | /* Whether the specifiers include a deprecated typedef. */ |
303 | BOOL_BITFIELD deprecated_p : 1; | |
70dd11f7 | 304 | /* Whether the type defaulted to "int" because there were no type |
305 | specifiers. */ | |
561ba0aa | 306 | BOOL_BITFIELD default_int_p : 1; |
70dd11f7 | 307 | /* Whether "long" was specified. */ |
308 | BOOL_BITFIELD long_p : 1; | |
9553111d | 309 | /* Whether "long" was specified more than once. */ |
310 | BOOL_BITFIELD long_long_p : 1; | |
70dd11f7 | 311 | /* Whether "short" was specified. */ |
312 | BOOL_BITFIELD short_p : 1; | |
313 | /* Whether "signed" was specified. */ | |
314 | BOOL_BITFIELD signed_p : 1; | |
315 | /* Whether "unsigned" was specified. */ | |
316 | BOOL_BITFIELD unsigned_p : 1; | |
317 | /* Whether "complex" was specified. */ | |
318 | BOOL_BITFIELD complex_p : 1; | |
9c08427a | 319 | /* Whether "inline" was specified. */ |
320 | BOOL_BITFIELD inline_p : 1; | |
985c6e3a | 321 | /* Whether "_Noreturn" was speciied. */ |
322 | BOOL_BITFIELD noreturn_p : 1; | |
d184e0c0 | 323 | /* Whether "__thread" or "_Thread_local" was specified. */ |
9c08427a | 324 | BOOL_BITFIELD thread_p : 1; |
d184e0c0 | 325 | /* Whether "__thread" rather than "_Thread_local" was specified. */ |
326 | BOOL_BITFIELD thread_gnu_p : 1; | |
bb476216 | 327 | /* Whether "const" was specified. */ |
328 | BOOL_BITFIELD const_p : 1; | |
329 | /* Whether "volatile" was specified. */ | |
330 | BOOL_BITFIELD volatile_p : 1; | |
331 | /* Whether "restrict" was specified. */ | |
332 | BOOL_BITFIELD restrict_p : 1; | |
b560fabd | 333 | /* Whether "_Atomic" was specified. */ |
334 | BOOL_BITFIELD atomic_p : 1; | |
9421ebb9 | 335 | /* Whether "_Sat" was specified. */ |
336 | BOOL_BITFIELD saturating_p : 1; | |
83e25171 | 337 | /* Whether any alignment specifier (even with zero alignment) was |
338 | specified. */ | |
339 | BOOL_BITFIELD alignas_p : 1; | |
6d5d708e | 340 | /* The address space that the declaration belongs to. */ |
341 | addr_space_t address_space; | |
9553111d | 342 | }; |
343 | ||
ac206aff | 344 | /* The various kinds of declarators in C. */ |
345 | enum c_declarator_kind { | |
346 | /* An identifier. */ | |
347 | cdk_id, | |
348 | /* A function. */ | |
349 | cdk_function, | |
350 | /* An array. */ | |
351 | cdk_array, | |
352 | /* A pointer. */ | |
353 | cdk_pointer, | |
354 | /* Parenthesized declarator with nested attributes. */ | |
355 | cdk_attrs | |
356 | }; | |
357 | ||
6dc50383 | 358 | struct c_arg_tag { |
9d61f04b | 359 | /* The argument name. */ |
360 | tree id; | |
361 | /* The type of the argument. */ | |
362 | tree type; | |
6dc50383 | 363 | }; |
9d61f04b | 364 | |
9d61f04b | 365 | |
ac206aff | 366 | /* Information about the parameters in a function declarator. */ |
367 | struct c_arg_info { | |
368 | /* A list of parameter decls. */ | |
369 | tree parms; | |
370 | /* A list of structure, union and enum tags defined. */ | |
f1f41a6c | 371 | vec<c_arg_tag, va_gc> *tags; |
ac206aff | 372 | /* A list of argument types to go in the FUNCTION_TYPE. */ |
373 | tree types; | |
374 | /* A list of non-parameter decls (notably enumeration constants) | |
375 | defined with the parameters. */ | |
376 | tree others; | |
4232a958 | 377 | /* A compound expression of VLA sizes from the parameters, or NULL. |
378 | In a function definition, these are used to ensure that | |
379 | side-effects in sizes of arrays converted to pointers (such as a | |
380 | parameter int i[n++]) take place; otherwise, they are | |
381 | ignored. */ | |
382 | tree pending_sizes; | |
32d33ab2 | 383 | /* True when these arguments had [*]. */ |
384 | BOOL_BITFIELD had_vla_unspec : 1; | |
ac206aff | 385 | }; |
386 | ||
387 | /* A declarator. */ | |
388 | struct c_declarator { | |
389 | /* The kind of declarator. */ | |
390 | enum c_declarator_kind kind; | |
561ba0aa | 391 | location_t id_loc; /* Currently only set for cdk_id, cdk_array. */ |
ac206aff | 392 | /* Except for cdk_id, the contained declarator. For cdk_id, NULL. */ |
393 | struct c_declarator *declarator; | |
394 | union { | |
395 | /* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract | |
396 | declarator. */ | |
397 | tree id; | |
398 | /* For functions. */ | |
399 | struct c_arg_info *arg_info; | |
400 | /* For arrays. */ | |
401 | struct { | |
402 | /* The array dimension, or NULL for [] and [*]. */ | |
403 | tree dimen; | |
bb476216 | 404 | /* The qualifiers inside []. */ |
405 | int quals; | |
406 | /* The attributes (currently ignored) inside []. */ | |
407 | tree attrs; | |
ac206aff | 408 | /* Whether [static] was used. */ |
409 | BOOL_BITFIELD static_p : 1; | |
410 | /* Whether [*] was used. */ | |
411 | BOOL_BITFIELD vla_unspec_p : 1; | |
412 | } array; | |
413 | /* For pointers, the qualifiers on the pointer type. */ | |
bb476216 | 414 | int pointer_quals; |
ac206aff | 415 | /* For attributes. */ |
416 | tree attrs; | |
417 | } u; | |
418 | }; | |
419 | ||
420 | /* A type name. */ | |
421 | struct c_type_name { | |
422 | /* The declaration specifiers. */ | |
9553111d | 423 | struct c_declspecs *specs; |
ac206aff | 424 | /* The declarator. */ |
425 | struct c_declarator *declarator; | |
426 | }; | |
427 | ||
428 | /* A parameter. */ | |
429 | struct c_parm { | |
430 | /* The declaration specifiers, minus any prefix attributes. */ | |
9553111d | 431 | struct c_declspecs *specs; |
ac206aff | 432 | /* The attributes. */ |
433 | tree attrs; | |
434 | /* The declarator. */ | |
435 | struct c_declarator *declarator; | |
436 | }; | |
437 | ||
13c7079e | 438 | /* Used when parsing an enum. Initialized by start_enum. */ |
439 | struct c_enum_contents | |
440 | { | |
441 | /* While defining an enum type, this is 1 plus the last enumerator | |
442 | constant value. */ | |
443 | tree enum_next_value; | |
444 | ||
445 | /* Nonzero means that there was overflow computing enum_next_value. */ | |
446 | int enum_overflow; | |
447 | }; | |
448 | ||
551ed71a | 449 | /* A type of reference to a static identifier in an inline |
450 | function. */ | |
451 | enum c_inline_static_type { | |
452 | /* Identifier with internal linkage used in function that may be an | |
453 | inline definition (i.e., file-scope static). */ | |
454 | csi_internal, | |
455 | /* Modifiable object with static storage duration defined in | |
456 | function that may be an inline definition (i.e., local | |
457 | static). */ | |
458 | csi_modifiable | |
459 | }; | |
460 | ||
96526206 | 461 | \f |
1576dec7 | 462 | /* in c-parser.c */ |
2b30d46c | 463 | extern void c_parse_init (void); |
dc12af01 | 464 | |
96526206 | 465 | /* in c-aux-info.c */ |
2b30d46c | 466 | extern void gen_aux_info_record (tree, int, int, int); |
907a24a1 | 467 | |
96526206 | 468 | /* in c-decl.c */ |
f805d53d | 469 | struct c_spot_bindings; |
843bd2fa | 470 | struct c_struct_parse_info; |
9823d3a9 | 471 | extern struct obstack parser_obstack; |
0375a275 | 472 | extern tree c_break_label; |
473 | extern tree c_cont_label; | |
2bbf1d92 | 474 | |
1d2bb655 | 475 | extern bool global_bindings_p (void); |
393b349a | 476 | extern void push_scope (void); |
477 | extern tree pop_scope (void); | |
f805d53d | 478 | extern void c_bindings_start_stmt_expr (struct c_spot_bindings *); |
479 | extern void c_bindings_end_stmt_expr (struct c_spot_bindings *); | |
2b30d46c | 480 | |
551ed71a | 481 | extern void record_inline_static (location_t, tree, tree, |
482 | enum c_inline_static_type); | |
2b30d46c | 483 | extern void c_init_decl_processing (void); |
2b30d46c | 484 | extern void c_print_identifier (FILE *, tree, int); |
bb476216 | 485 | extern int quals_from_declspecs (const struct c_declspecs *); |
e60a6f7b | 486 | extern struct c_declarator *build_array_declarator (location_t, tree, |
487 | struct c_declspecs *, | |
9553111d | 488 | bool, bool); |
5a7ce2ec | 489 | extern tree build_enumerator (location_t, location_t, struct c_enum_contents *, |
490 | tree, tree); | |
0a65c3bb | 491 | extern tree check_for_loop_decls (location_t, bool); |
f74be9a1 | 492 | extern void mark_forward_parm_decls (void); |
2b652cf3 | 493 | extern void declare_parm_level (void); |
e60a6f7b | 494 | extern void undeclared_variable (location_t, tree); |
f805d53d | 495 | extern tree lookup_label_for_goto (location_t, tree); |
bdc33d98 | 496 | extern tree declare_label (tree); |
92ddaf90 | 497 | extern tree define_label (location_t, tree); |
f805d53d | 498 | extern struct c_spot_bindings *c_get_switch_bindings (void); |
499 | extern void c_release_switch_bindings (struct c_spot_bindings *); | |
500 | extern bool c_check_switch_jump_warnings (struct c_spot_bindings *, | |
501 | location_t, location_t); | |
e60a6f7b | 502 | extern void finish_decl (tree, location_t, tree, tree, tree); |
2b30d46c | 503 | extern tree finish_enum (tree, tree, tree); |
2ff66ee0 | 504 | extern void finish_function (void); |
843bd2fa | 505 | extern tree finish_struct (location_t, tree, tree, tree, |
506 | struct c_struct_parse_info *); | |
cfbfcd0b | 507 | extern struct c_arg_info *build_arg_info (void); |
4232a958 | 508 | extern struct c_arg_info *get_parm_info (bool, tree); |
d520c1f2 | 509 | extern tree grokfield (location_t, struct c_declarator *, |
510 | struct c_declspecs *, tree, tree *); | |
a75b1c71 | 511 | extern tree groktypename (struct c_type_name *, tree *, bool *); |
4232a958 | 512 | extern tree grokparm (const struct c_parm *, tree *); |
e60a6f7b | 513 | extern tree implicitly_declare (location_t, tree); |
2b30d46c | 514 | extern void keep_next_level (void); |
2b30d46c | 515 | extern void pending_xref_error (void); |
d2764e2d | 516 | extern void c_push_function_context (void); |
517 | extern void c_pop_function_context (void); | |
4232a958 | 518 | extern void push_parm_decl (const struct c_parm *, tree *); |
ac206aff | 519 | extern struct c_declarator *set_array_declarator_inner (struct c_declarator *, |
e6c172ed | 520 | struct c_declarator *); |
54be5d7e | 521 | extern tree c_builtin_function (tree); |
24470055 | 522 | extern tree c_builtin_function_ext_scope (tree); |
9553111d | 523 | extern void shadow_tag (const struct c_declspecs *); |
524 | extern void shadow_tag_warned (const struct c_declspecs *, int); | |
e60a6f7b | 525 | extern tree start_enum (location_t, struct c_enum_contents *, tree); |
9553111d | 526 | extern int start_function (struct c_declspecs *, struct c_declarator *, tree); |
527 | extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool, | |
528 | tree); | |
843bd2fa | 529 | extern tree start_struct (location_t, enum tree_code, tree, |
530 | struct c_struct_parse_info **); | |
2b30d46c | 531 | extern void store_parm_decls (void); |
ac206aff | 532 | extern void store_parm_decls_from (struct c_arg_info *); |
bc7bff74 | 533 | extern void temp_store_parm_decls (tree, tree); |
534 | extern void temp_pop_parm_decls (void); | |
2b30d46c | 535 | extern tree xref_tag (enum tree_code, tree); |
e60a6f7b | 536 | extern struct c_typespec parser_xref_tag (location_t, enum tree_code, tree); |
9553111d | 537 | extern struct c_parm *build_c_parm (struct c_declspecs *, tree, |
538 | struct c_declarator *); | |
ac206aff | 539 | extern struct c_declarator *build_attrs_declarator (tree, |
540 | struct c_declarator *); | |
541 | extern struct c_declarator *build_function_declarator (struct c_arg_info *, | |
542 | struct c_declarator *); | |
543 | extern struct c_declarator *build_id_declarator (tree); | |
9553111d | 544 | extern struct c_declarator *make_pointer_declarator (struct c_declspecs *, |
ac206aff | 545 | struct c_declarator *); |
9553111d | 546 | extern struct c_declspecs *build_null_declspecs (void); |
a60f3e81 | 547 | extern struct c_declspecs *declspecs_add_qual (source_location, |
548 | struct c_declspecs *, tree); | |
843bd2fa | 549 | extern struct c_declspecs *declspecs_add_type (location_t, |
550 | struct c_declspecs *, | |
19702c1d | 551 | struct c_typespec); |
a60f3e81 | 552 | extern struct c_declspecs *declspecs_add_scspec (source_location, |
553 | struct c_declspecs *, tree); | |
554 | extern struct c_declspecs *declspecs_add_attrs (source_location, | |
555 | struct c_declspecs *, tree); | |
556 | extern struct c_declspecs *declspecs_add_addrspace (source_location, | |
557 | struct c_declspecs *, | |
6d5d708e | 558 | addr_space_t); |
a60f3e81 | 559 | extern struct c_declspecs *declspecs_add_alignas (source_location, |
560 | struct c_declspecs *, tree); | |
70dd11f7 | 561 | extern struct c_declspecs *finish_declspecs (struct c_declspecs *); |
aaa4d7e7 | 562 | |
563 | /* in c-objc-common.c */ | |
2b30d46c | 564 | extern bool c_objc_common_init (void); |
4ee9c684 | 565 | extern bool c_missing_noreturn_ok_p (tree); |
f8fd23c0 | 566 | extern bool c_warn_unused_global_decl (const_tree); |
31266980 | 567 | extern void c_initialize_diagnostics (diagnostic_context *); |
32d33ab2 | 568 | extern bool c_vla_unspec_p (tree x, tree fn); |
aaa4d7e7 | 569 | |
96526206 | 570 | /* in c-typeck.c */ |
9823d3a9 | 571 | extern int in_alignof; |
572 | extern int in_sizeof; | |
573 | extern int in_typeof; | |
574 | ||
f003f5dc | 575 | extern tree c_last_sizeof_arg; |
576 | ||
0375a275 | 577 | extern struct c_switch *c_switch_stack; |
40109983 | 578 | |
8e70fb09 | 579 | extern tree c_objc_common_truthvalue_conversion (location_t, tree); |
2b30d46c | 580 | extern tree require_complete_type (tree); |
9f627b1a | 581 | extern int same_translation_unit_p (const_tree, const_tree); |
3ed275a6 | 582 | extern int comptypes (tree, tree); |
ce3765bf | 583 | extern int comptypes_check_different_types (tree, tree, bool *); |
f8fd23c0 | 584 | extern bool c_vla_type_p (const_tree); |
2b30d46c | 585 | extern bool c_mark_addressable (tree); |
f8fd23c0 | 586 | extern void c_incomplete_type_error (const_tree, const_tree); |
2b30d46c | 587 | extern tree c_type_promotes_to (tree); |
e60a6f7b | 588 | extern struct c_expr default_function_array_conversion (location_t, |
abc6c64f | 589 | struct c_expr); |
590 | extern struct c_expr default_function_array_read_conversion (location_t, | |
591 | struct c_expr); | |
b560fabd | 592 | extern struct c_expr convert_lvalue_to_rvalue (location_t, struct c_expr, |
593 | bool, bool); | |
abc6c64f | 594 | extern void mark_exp_read (tree); |
1ea7fa60 | 595 | extern tree composite_type (tree, tree); |
e60a6f7b | 596 | extern tree build_component_ref (location_t, tree, tree); |
597 | extern tree build_array_ref (location_t, tree, tree); | |
598 | extern tree build_external_ref (location_t, tree, int, tree *); | |
9823d3a9 | 599 | extern void pop_maybe_used (bool); |
e60a6f7b | 600 | extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr); |
601 | extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *); | |
602 | extern struct c_expr parser_build_unary_op (location_t, enum tree_code, | |
603 | struct c_expr); | |
48e1416a | 604 | extern struct c_expr parser_build_binary_op (location_t, |
8e70fb09 | 605 | enum tree_code, struct c_expr, |
066f26bf | 606 | struct c_expr); |
6163a125 | 607 | extern tree build_conditional_expr (location_t, tree, bool, tree, tree, |
608 | tree, tree); | |
e60a6f7b | 609 | extern tree build_compound_expr (location_t, tree, tree); |
610 | extern tree c_cast_expr (location_t, struct c_type_name *, tree); | |
611 | extern tree build_c_cast (location_t, tree, tree); | |
612 | extern void store_init_value (location_t, tree, tree, tree); | |
c9e51d25 | 613 | extern void maybe_warn_string_init (location_t, tree, struct c_expr); |
2b30d46c | 614 | extern void start_init (tree, tree, int); |
615 | extern void finish_init (void); | |
616 | extern void really_start_incremental_init (tree); | |
53de1631 | 617 | extern void push_init_level (location_t, int, struct obstack *); |
618 | extern struct c_expr pop_init_level (location_t, int, struct obstack *); | |
619 | extern void set_init_index (location_t, tree, tree, struct obstack *); | |
620 | extern void set_init_label (location_t, tree, struct obstack *); | |
adc93f31 | 621 | extern void process_init_element (location_t, struct c_expr, bool, |
622 | struct obstack *); | |
e60a6f7b | 623 | extern tree build_compound_literal (location_t, tree, tree, bool); |
624 | extern void check_compound_literal_type (location_t, struct c_type_name *); | |
c69ec07d | 625 | extern tree c_start_case (location_t, location_t, tree, bool); |
5213d6c9 | 626 | extern void c_finish_case (tree, tree); |
78f55ca8 | 627 | extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool); |
fae5a040 | 628 | extern tree build_asm_stmt (tree, tree); |
4ee9c684 | 629 | extern int c_types_compatible_p (tree, tree); |
2363ef00 | 630 | extern tree c_begin_compound_stmt (bool); |
e60a6f7b | 631 | extern tree c_end_compound_stmt (location_t, tree, bool); |
0375a275 | 632 | extern void c_finish_if_stmt (location_t, tree, tree, tree, bool); |
633 | extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool); | |
2363ef00 | 634 | extern tree c_begin_stmt_expr (void); |
e60a6f7b | 635 | extern tree c_finish_stmt_expr (location_t, tree); |
636 | extern tree c_process_expr_stmt (location_t, tree); | |
637 | extern tree c_finish_expr_stmt (location_t, tree); | |
638 | extern tree c_finish_return (location_t, tree, tree); | |
639 | extern tree c_finish_bc_stmt (location_t, tree *, bool); | |
640 | extern tree c_finish_goto_label (location_t, tree); | |
641 | extern tree c_finish_goto_ptr (location_t, tree); | |
c7d4e749 | 642 | extern tree c_expr_to_decl (tree, bool *, bool *); |
ca4c3545 | 643 | extern tree c_finish_oacc_parallel (location_t, tree, tree); |
644 | extern tree c_finish_oacc_kernels (location_t, tree, tree); | |
645 | extern tree c_finish_oacc_data (location_t, tree, tree); | |
1e8e9920 | 646 | extern tree c_begin_omp_parallel (void); |
e60a6f7b | 647 | extern tree c_finish_omp_parallel (location_t, tree, tree); |
fd6481cf | 648 | extern tree c_begin_omp_task (void); |
e60a6f7b | 649 | extern tree c_finish_omp_task (location_t, tree, tree); |
bc7bff74 | 650 | extern void c_finish_omp_cancel (location_t, tree); |
651 | extern void c_finish_omp_cancellation_point (location_t, tree); | |
43895be5 | 652 | extern tree c_finish_omp_clauses (tree, bool, bool = false); |
e60a6f7b | 653 | extern tree c_build_va_arg (location_t, tree, tree); |
4c0315d0 | 654 | extern tree c_finish_transaction (location_t, tree, int); |
bc7bff74 | 655 | extern bool c_tree_equal (tree, tree); |
5a672e62 | 656 | extern tree c_build_function_call_vec (location_t, vec<location_t>, tree, |
657 | vec<tree, va_gc> *, vec<tree, va_gc> *); | |
907a24a1 | 658 | |
659 | /* Set to 0 at beginning of a function definition, set to 1 if | |
660 | a return statement that specifies a return value is seen. */ | |
661 | ||
662 | extern int current_function_returns_value; | |
663 | ||
664 | /* Set to 0 at beginning of a function definition, set to 1 if | |
665 | a return statement with no argument is seen. */ | |
666 | ||
667 | extern int current_function_returns_null; | |
668 | ||
af857942 | 669 | /* Set to 0 at beginning of a function definition, set to 1 if |
670 | a call to a noreturn function is seen. */ | |
671 | ||
672 | extern int current_function_returns_abnormally; | |
673 | ||
eea57b92 | 674 | /* In c-decl.c */ |
ab103e33 | 675 | |
676 | /* Tell the binding oracle what kind of binding we are looking for. */ | |
677 | ||
678 | enum c_oracle_request | |
679 | { | |
680 | C_ORACLE_SYMBOL, | |
681 | C_ORACLE_TAG, | |
682 | C_ORACLE_LABEL | |
683 | }; | |
684 | ||
685 | /* If this is non-NULL, then it is a "binding oracle" which can lazily | |
686 | create bindings when needed by the C compiler. The oracle is told | |
687 | the name and type of the binding to create. It can call pushdecl | |
688 | or the like to ensure the binding is visible; or do nothing, | |
689 | leaving the binding untouched. c-decl.c takes note of when the | |
690 | oracle has been called and will not call it again if it fails to | |
691 | create a given binding. */ | |
692 | ||
693 | typedef void c_binding_oracle_function (enum c_oracle_request, tree identifier); | |
694 | ||
695 | extern c_binding_oracle_function *c_binding_oracle; | |
696 | ||
2b30d46c | 697 | extern void c_finish_incomplete_decl (tree); |
bc7bff74 | 698 | extern tree c_omp_reduction_id (enum tree_code, tree); |
699 | extern tree c_omp_reduction_decl (tree); | |
700 | extern tree c_omp_reduction_lookup (tree, tree); | |
701 | extern tree c_check_omp_declare_reduction_r (tree *, int *, void *); | |
ab103e33 | 702 | extern void c_pushtag (location_t, tree, tree); |
703 | extern void c_bind (location_t, tree, bool); | |
03e8b174 | 704 | extern bool tag_exists_p (enum tree_code, tree); |
eea57b92 | 705 | |
9f19e0f9 | 706 | /* In c-errors.c */ |
890c2e2f | 707 | extern void pedwarn_c90 (location_t, int opt, const char *, ...) |
708 | ATTRIBUTE_GCC_DIAG(3,4); | |
508ea33a | 709 | extern bool pedwarn_c99 (location_t, int opt, const char *, ...) |
890c2e2f | 710 | ATTRIBUTE_GCC_DIAG(3,4); |
7f5f3953 | 711 | |
2a281353 | 712 | #endif /* ! GCC_C_TREE_H */ |