]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c/c-tree.h
Make-lang.in (C_AND_OBJC_OBJS): Add gimple-parser.o.
[thirdparty/gcc.git] / gcc / c / c-tree.h
CommitLineData
40754343 1/* Definitions for C parsing and type checking.
818ab71a 2 Copyright (C) 1987-2016 Free Software Foundation, Inc.
40754343 3
1322177d 4This file is part of GCC.
40754343 5
1322177d
LB
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
1322177d 9version.
40754343 10
1322177d
LB
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
40754343
RS
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along 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. */
119struct 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. */
159typedef 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. */
164enum 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. */
189struct 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. */
209enum 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
221enum 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. */
246enum 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 278struct 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. */
375enum 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 388struct 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. */
397struct 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. */
418struct 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. */
451struct 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. */
459struct 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. */
469struct 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. */
481enum 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 493extern void c_parse_init (void);
1a4f11c8 494extern bool c_keyword_starts_typename (enum rid keyword);
1526a060 495
7c57c798 496/* in c-aux-info.c */
2f6e4e97 497extern void gen_aux_info_record (tree, int, int, int);
40754343 498
7c57c798 499/* in c-decl.c */
e1b7793c 500struct c_spot_bindings;
dc491a25 501struct c_struct_parse_info;
bc4b653b 502extern struct obstack parser_obstack;
506e2710
RH
503extern tree c_break_label;
504extern tree c_cont_label;
cfe79ecf 505
c99c0026 506extern bool global_bindings_p (void);
f75fbaf7
ZW
507extern void push_scope (void);
508extern tree pop_scope (void);
e1b7793c
ILT
509extern void c_bindings_start_stmt_expr (struct c_spot_bindings *);
510extern void c_bindings_end_stmt_expr (struct c_spot_bindings *);
2f6e4e97 511
991d6621
JM
512extern void record_inline_static (location_t, tree, tree,
513 enum c_inline_static_type);
2f6e4e97 514extern void c_init_decl_processing (void);
2f6e4e97 515extern void c_print_identifier (FILE *, tree, int);
3b53cddc 516extern int quals_from_declspecs (const struct c_declspecs *);
c2255bc4
AH
517extern struct c_declarator *build_array_declarator (location_t, tree,
518 struct c_declspecs *,
deb176fa 519 bool, bool);
7370e0da
AC
520extern tree build_enumerator (location_t, location_t, struct c_enum_contents *,
521 tree, tree);
f05b9d93 522extern tree check_for_loop_decls (location_t, bool);
55d54003 523extern void mark_forward_parm_decls (void);
eb1dfbb2 524extern void declare_parm_level (void);
c2255bc4 525extern void undeclared_variable (location_t, tree);
e1b7793c 526extern tree lookup_label_for_goto (location_t, tree);
14e33ee8 527extern tree declare_label (tree);
5b030314 528extern tree define_label (location_t, tree);
e1b7793c
ILT
529extern struct c_spot_bindings *c_get_switch_bindings (void);
530extern void c_release_switch_bindings (struct c_spot_bindings *);
531extern bool c_check_switch_jump_warnings (struct c_spot_bindings *,
532 location_t, location_t);
c2255bc4 533extern void finish_decl (tree, location_t, tree, tree, tree);
2f6e4e97 534extern tree finish_enum (tree, tree, tree);
4a46cbfb 535extern void finish_function (void);
dc491a25
ILT
536extern tree finish_struct (location_t, tree, tree, tree,
537 struct c_struct_parse_info *);
b3399d18 538extern struct c_arg_info *build_arg_info (void);
a04a722b 539extern struct c_arg_info *get_parm_info (bool, tree);
3d10ed6c
AH
540extern tree grokfield (location_t, struct c_declarator *,
541 struct c_declspecs *, tree, tree *);
928c19bb 542extern tree groktypename (struct c_type_name *, tree *, bool *);
a04a722b 543extern tree grokparm (const struct c_parm *, tree *);
c2255bc4 544extern tree implicitly_declare (location_t, tree);
2f6e4e97 545extern void keep_next_level (void);
2f6e4e97 546extern void pending_xref_error (void);
d2784db4
PB
547extern void c_push_function_context (void);
548extern void c_pop_function_context (void);
a04a722b 549extern void push_parm_decl (const struct c_parm *, tree *);
f8893e47 550extern struct c_declarator *set_array_declarator_inner (struct c_declarator *,
6ac0194d 551 struct c_declarator *);
c79efc4d 552extern tree c_builtin_function (tree);
5779e713 553extern tree c_builtin_function_ext_scope (tree);
deb176fa
JM
554extern void shadow_tag (const struct c_declspecs *);
555extern void shadow_tag_warned (const struct c_declspecs *, int);
c2255bc4 556extern tree start_enum (location_t, struct c_enum_contents *, tree);
deb176fa
JM
557extern int start_function (struct c_declspecs *, struct c_declarator *, tree);
558extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool,
559 tree);
dc491a25
ILT
560extern tree start_struct (location_t, enum tree_code, tree,
561 struct c_struct_parse_info **);
2f6e4e97 562extern void store_parm_decls (void);
f8893e47 563extern void store_parm_decls_from (struct c_arg_info *);
acf0174b
JJ
564extern void temp_store_parm_decls (tree, tree);
565extern void temp_pop_parm_decls (void);
2f6e4e97 566extern tree xref_tag (enum tree_code, tree);
c2255bc4 567extern struct c_typespec parser_xref_tag (location_t, enum tree_code, tree);
deb176fa
JM
568extern struct c_parm *build_c_parm (struct c_declspecs *, tree,
569 struct c_declarator *);
f8893e47
JM
570extern struct c_declarator *build_attrs_declarator (tree,
571 struct c_declarator *);
572extern struct c_declarator *build_function_declarator (struct c_arg_info *,
573 struct c_declarator *);
574extern struct c_declarator *build_id_declarator (tree);
deb176fa 575extern struct c_declarator *make_pointer_declarator (struct c_declspecs *,
f8893e47 576 struct c_declarator *);
deb176fa 577extern struct c_declspecs *build_null_declspecs (void);
0b2c4be5
DS
578extern struct c_declspecs *declspecs_add_qual (source_location,
579 struct c_declspecs *, tree);
dc491a25
ILT
580extern struct c_declspecs *declspecs_add_type (location_t,
581 struct c_declspecs *,
81da229b 582 struct c_typespec);
0b2c4be5
DS
583extern struct c_declspecs *declspecs_add_scspec (source_location,
584 struct c_declspecs *, tree);
585extern struct c_declspecs *declspecs_add_attrs (source_location,
586 struct c_declspecs *, tree);
587extern struct c_declspecs *declspecs_add_addrspace (source_location,
588 struct c_declspecs *,
36c5e70a 589 addr_space_t);
0b2c4be5
DS
590extern struct c_declspecs *declspecs_add_alignas (source_location,
591 struct c_declspecs *, tree);
98c3a782 592extern struct c_declspecs *finish_declspecs (struct c_declspecs *);
f797f486
NP
593
594/* in c-objc-common.c */
2f6e4e97 595extern bool c_objc_common_init (void);
6de9cd9a 596extern bool c_missing_noreturn_ok_p (tree);
ac7d7749 597extern bool c_warn_unused_global_decl (const_tree);
ede1a387 598extern void c_initialize_diagnostics (diagnostic_context *);
52ffd86e 599extern bool c_vla_unspec_p (tree x, tree fn);
f797f486 600
7c57c798 601/* in c-typeck.c */
bc4b653b
JM
602extern int in_alignof;
603extern int in_sizeof;
604extern int in_typeof;
605
1a4049e7
JJ
606extern tree c_last_sizeof_arg;
607
506e2710 608extern struct c_switch *c_switch_stack;
d1bd0ded 609
ba47d38d 610extern tree c_objc_common_truthvalue_conversion (location_t, tree);
4f2e1536 611extern tree require_complete_type (location_t, tree);
58f9752a 612extern int same_translation_unit_p (const_tree, const_tree);
132da1a5 613extern int comptypes (tree, tree);
dc5027f4 614extern int comptypes_check_different_types (tree, tree, bool *);
ac7d7749 615extern bool c_vla_type_p (const_tree);
2f6e4e97 616extern bool c_mark_addressable (tree);
4f2e1536 617extern void c_incomplete_type_error (location_t, const_tree, const_tree);
2f6e4e97 618extern tree c_type_promotes_to (tree);
c2255bc4 619extern struct c_expr default_function_array_conversion (location_t,
ebfbbdc5
JJ
620 struct c_expr);
621extern struct c_expr default_function_array_read_conversion (location_t,
622 struct c_expr);
267bac10
JM
623extern struct c_expr convert_lvalue_to_rvalue (location_t, struct c_expr,
624 bool, bool);
ebfbbdc5 625extern void mark_exp_read (tree);
10bc1b1b 626extern tree composite_type (tree, tree);
6ffd47b7 627extern tree build_component_ref (location_t, tree, tree, location_t);
c2255bc4
AH
628extern tree build_array_ref (location_t, tree, tree);
629extern tree build_external_ref (location_t, tree, int, tree *);
bc4b653b 630extern void pop_maybe_used (bool);
c2255bc4
AH
631extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr);
632extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *);
633extern struct c_expr parser_build_unary_op (location_t, enum tree_code,
634 struct c_expr);
b8698a0f 635extern struct c_expr parser_build_binary_op (location_t,
ba47d38d 636 enum tree_code, struct c_expr,
487a92fe 637 struct c_expr);
d130ae11
ILT
638extern tree build_conditional_expr (location_t, tree, bool, tree, tree,
639 tree, tree);
c2255bc4
AH
640extern tree build_compound_expr (location_t, tree, tree);
641extern tree c_cast_expr (location_t, struct c_type_name *, tree);
642extern tree build_c_cast (location_t, tree, tree);
643extern void store_init_value (location_t, tree, tree, tree);
d033409e 644extern void maybe_warn_string_init (location_t, tree, struct c_expr);
2f6e4e97
AJ
645extern void start_init (tree, tree, int);
646extern void finish_init (void);
647extern void really_start_incremental_init (tree);
16595a1f 648extern void finish_implicit_inits (location_t, struct obstack *);
ea58ef42
MP
649extern void push_init_level (location_t, int, struct obstack *);
650extern struct c_expr pop_init_level (location_t, int, struct obstack *);
651extern void set_init_index (location_t, tree, tree, struct obstack *);
f7e4f2e3 652extern void set_init_label (location_t, tree, location_t, struct obstack *);
34cf811f
MP
653extern void process_init_element (location_t, struct c_expr, bool,
654 struct obstack *);
c2255bc4
AH
655extern tree build_compound_literal (location_t, tree, tree, bool);
656extern void check_compound_literal_type (location_t, struct c_type_name *);
fedfecef 657extern tree c_start_case (location_t, location_t, tree, bool);
083e891e 658extern void c_finish_case (tree, tree);
1c384bf1 659extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool);
9f0e2d86 660extern tree build_asm_stmt (tree, tree);
6de9cd9a 661extern int c_types_compatible_p (tree, tree);
325c3691 662extern tree c_begin_compound_stmt (bool);
c2255bc4 663extern tree c_end_compound_stmt (location_t, tree, bool);
99cd9857 664extern void c_finish_if_stmt (location_t, tree, tree, tree);
506e2710 665extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool);
325c3691 666extern tree c_begin_stmt_expr (void);
c2255bc4
AH
667extern tree c_finish_stmt_expr (location_t, tree);
668extern tree c_process_expr_stmt (location_t, tree);
669extern tree c_finish_expr_stmt (location_t, tree);
670extern tree c_finish_return (location_t, tree, tree);
671extern tree c_finish_bc_stmt (location_t, tree *, bool);
672extern tree c_finish_goto_label (location_t, tree);
673extern tree c_finish_goto_ptr (location_t, tree);
51eed280 674extern tree c_expr_to_decl (tree, bool *, bool *);
88bae6f4 675extern tree c_finish_omp_construct (location_t, enum tree_code, tree, tree);
41dbbb37 676extern tree c_finish_oacc_data (location_t, tree, tree);
37d5ad46 677extern tree c_finish_oacc_host_data (location_t, tree, tree);
953ff289 678extern tree c_begin_omp_parallel (void);
c2255bc4 679extern tree c_finish_omp_parallel (location_t, tree, tree);
a68ab351 680extern tree c_begin_omp_task (void);
c2255bc4 681extern tree c_finish_omp_task (location_t, tree, tree);
acf0174b
JJ
682extern void c_finish_omp_cancel (location_t, tree);
683extern void c_finish_omp_cancellation_point (location_t, tree);
77886428 684extern tree c_finish_omp_clauses (tree, enum c_omp_region_type);
f187980b 685extern tree c_build_va_arg (location_t, tree, location_t, tree);
0a35513e 686extern tree c_finish_transaction (location_t, tree, int);
acf0174b 687extern bool c_tree_equal (tree, tree);
8edbfaa6
JJ
688extern tree c_build_function_call_vec (location_t, vec<location_t>, tree,
689 vec<tree, va_gc> *, vec<tree, va_gc> *);
9dc5773f 690extern 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
695extern 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
700extern 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
705extern 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
711enum 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
726typedef void c_binding_oracle_function (enum c_oracle_request, tree identifier);
727
728extern c_binding_oracle_function *c_binding_oracle;
729
2f6e4e97 730extern void c_finish_incomplete_decl (tree);
acf0174b
JJ
731extern tree c_omp_reduction_id (enum tree_code, tree);
732extern tree c_omp_reduction_decl (tree);
733extern tree c_omp_reduction_lookup (tree, tree);
734extern tree c_check_omp_declare_reduction_r (tree *, int *, void *);
ddc8de03
PM
735extern void c_pushtag (location_t, tree, tree);
736extern void c_bind (location_t, tree, bool);
0e36f5c7 737extern bool tag_exists_p (enum tree_code, tree);
0bb0a00b 738
59cc9210 739/* In c-errors.c */
d6e83a8d 740extern bool pedwarn_c90 (location_t, int opt, const char *, ...)
f3bede71 741 ATTRIBUTE_GCC_DIAG(3,4);
35aff4fb 742extern bool pedwarn_c99 (location_t, int opt, const char *, ...)
f3bede71 743 ATTRIBUTE_GCC_DIAG(3,4);
148e4216 744
ebedc9a3
DM
745extern void
746set_c_expr_source_range (c_expr *expr,
747 location_t start, location_t finish);
748
749extern void
750set_c_expr_source_range (c_expr *expr,
751 source_range src_range);
752
4250754e
JM
753/* In c-fold.c */
754extern tree decl_constant_value_for_optimization (tree);
755
d25c7690
PK
756extern vec<tree> incomplete_record_decls;
757
88657302 758#endif /* ! GCC_C_TREE_H */